Merge upstream kernel changes into 'C/H/S support' branch of libata.
authorJeff Garzik <jgarzik@pretzel.yyz.us>
Wed, 22 Jun 2005 17:07:28 +0000 (13:07 -0400)
committerJeff Garzik <jgarzik@pobox.com>
Wed, 22 Jun 2005 17:07:28 +0000 (13:07 -0400)
1822 files changed:
CREDITS
Documentation/DocBook/Makefile
Documentation/DocBook/kernel-api.tmpl
Documentation/DocBook/libata.tmpl
Documentation/DocBook/scsidrivers.tmpl [deleted file]
Documentation/SubmittingPatches
Documentation/cpu-freq/cpufreq-stats.txt [new file with mode: 0644]
Documentation/cpusets.txt
Documentation/driver-model/device.txt
Documentation/driver-model/driver.txt
Documentation/dvb/README.flexcop [new file with mode: 0644]
Documentation/dvb/bt8xx.txt
Documentation/dvb/ci.txt [new file with mode: 0644]
Documentation/dvb/get_dvb_firmware
Documentation/fb/intelfb.txt [new file with mode: 0644]
Documentation/feature-removal-schedule.txt
Documentation/filesystems/isofs.txt
Documentation/filesystems/sysfs-pci.txt
Documentation/filesystems/sysfs.txt
Documentation/filesystems/tmpfs.txt
Documentation/networking/generic-hdlc.txt
Documentation/networking/multicast.txt
Documentation/networking/net-modules.txt
Documentation/networking/vortex.txt
Documentation/power/devices.txt
Documentation/powerpc/hvcs.txt
Documentation/s390/CommonIO
Documentation/scsi/ChangeLog.megaraid
Documentation/scsi/scsi-changer.txt [new file with mode: 0644]
Documentation/scsi/scsi_mid_low_api.txt
Documentation/sgi-ioc4.txt [new file with mode: 0644]
Documentation/x86_64/boot-options.txt
MAINTAINERS
Makefile
arch/alpha/kernel/osf_sys.c
arch/arm/Kconfig
arch/arm/Makefile
arch/arm/boot/compressed/head-xscale.S
arch/arm/common/amba.c
arch/arm/common/dmabounce.c
arch/arm/common/sharpsl_param.c
arch/arm/configs/badge4_defconfig
arch/arm/configs/enp2611_defconfig
arch/arm/configs/h3600_defconfig
arch/arm/configs/hackkit_defconfig
arch/arm/configs/ixdp2400_defconfig
arch/arm/configs/ixdp2401_defconfig
arch/arm/configs/ixdp2800_defconfig
arch/arm/configs/ixdp2801_defconfig
arch/arm/kernel/Makefile
arch/arm/kernel/arch.c [deleted file]
arch/arm/kernel/ecard.c
arch/arm/kernel/entry-armv.S
arch/arm/kernel/entry-header.S
arch/arm/kernel/head.S
arch/arm/kernel/setup.c
arch/arm/kernel/smp.c
arch/arm/kernel/traps.c
arch/arm/lib/ashldi3.c
arch/arm/lib/ashrdi3.c
arch/arm/lib/gcclib.h
arch/arm/lib/io-writesw-armv4.S
arch/arm/lib/longlong.h
arch/arm/lib/lshrdi3.c
arch/arm/lib/muldi3.c
arch/arm/lib/ucmpdi2.c
arch/arm/lib/udivdi3.c
arch/arm/mach-aaec2000/Kconfig [new file with mode: 0644]
arch/arm/mach-aaec2000/Makefile [new file with mode: 0644]
arch/arm/mach-aaec2000/aaed2000.c [new file with mode: 0644]
arch/arm/mach-aaec2000/core.c [new file with mode: 0644]
arch/arm/mach-aaec2000/core.h [new file with mode: 0644]
arch/arm/mach-integrator/Makefile
arch/arm/mach-integrator/core.c
arch/arm/mach-integrator/headsmp.S [new file with mode: 0644]
arch/arm/mach-integrator/integrator_cp.c
arch/arm/mach-integrator/leds.c
arch/arm/mach-integrator/platsmp.c [new file with mode: 0644]
arch/arm/mach-ixp2000/core.c
arch/arm/mach-pxa/lubbock.c
arch/arm/mach-pxa/mainstone.c
arch/arm/mach-pxa/pm.c
arch/arm/mach-pxa/pxa25x.c
arch/arm/mach-pxa/pxa27x.c
arch/arm/mach-s3c2410/clock.c
arch/arm/mach-s3c2410/dma.c
arch/arm/mach-s3c2410/s3c2440.c
arch/arm/mach-sa1100/Kconfig
arch/arm/mach-sa1100/pm.c
arch/arm/mach-versatile/Makefile
arch/arm/mach-versatile/core.c
arch/arm/mach-versatile/pci.c [new file with mode: 0644]
arch/arm/mm/Kconfig
arch/arm/mm/Makefile
arch/arm/mm/copypage-v4mc.S [deleted file]
arch/arm/mm/copypage-v4mc.c [new file with mode: 0644]
arch/arm/mm/copypage-v6.c
arch/arm/mm/copypage-xscale.S [deleted file]
arch/arm/mm/copypage-xscale.c [new file with mode: 0644]
arch/arm/mm/fault-armv.c
arch/arm/mm/flush.c
arch/arm/mm/ioremap.c
arch/arm/mm/minicache.c [deleted file]
arch/arm/mm/mm-armv.c
arch/arm/mm/mmap.c
arch/arm26/kernel/ecard.c
arch/frv/mm/init.c
arch/h8300/kernel/process.c
arch/i386/Kconfig
arch/i386/boot/Makefile
arch/i386/kernel/Makefile
arch/i386/kernel/apm.c
arch/i386/kernel/cpu/amd.c
arch/i386/kernel/cpu/common.c
arch/i386/kernel/cpu/cpufreq/Kconfig
arch/i386/kernel/cpu/cpufreq/Makefile
arch/i386/kernel/cpu/cpufreq/longhaul.c
arch/i386/kernel/cpu/cpufreq/powernow-k7.c
arch/i386/kernel/cpu/cpufreq/powernow-k8.c
arch/i386/kernel/cpu/cpufreq/powernow-k8.h
arch/i386/kernel/cpu/cpufreq/sc520_freq.c [new file with mode: 0644]
arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
arch/i386/kernel/cpu/cpufreq/speedstep-lib.c
arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
arch/i386/kernel/cpu/intel_cacheinfo.c
arch/i386/kernel/cpuid.c
arch/i386/kernel/msr.c
arch/i386/kernel/setup.c
arch/i386/kernel/smpboot.c
arch/i386/kernel/syscall_table.S
arch/i386/kernel/timers/common.c
arch/i386/kernel/timers/timer_tsc.c
arch/i386/kernel/traps.c
arch/i386/lib/delay.c
arch/i386/mach-voyager/voyager_smp.c
arch/i386/mm/hugetlbpage.c
arch/i386/mm/init.c
arch/i386/mm/ioremap.c
arch/i386/pci/fixup.c
arch/i386/pci/irq.c
arch/ia64/Kconfig
arch/ia64/configs/sn2_defconfig
arch/ia64/defconfig
arch/ia64/ia32/ia32_ioctl.c
arch/ia64/ia32/sys_ia32.c
arch/ia64/kernel/Makefile
arch/ia64/kernel/efi.c
arch/ia64/kernel/entry.S
arch/ia64/kernel/fsys.S
arch/ia64/kernel/mca.c
arch/ia64/kernel/minstate.h
arch/ia64/kernel/module.c
arch/ia64/kernel/perfmon.c
arch/ia64/kernel/ptrace.c
arch/ia64/kernel/setup.c
arch/ia64/kernel/smpboot.c
arch/ia64/kernel/sys_ia64.c
arch/ia64/kernel/traps.c
arch/ia64/kernel/uncached.c [new file with mode: 0644]
arch/ia64/mm/hugetlbpage.c
arch/ia64/mm/init.c
arch/ia64/sn/kernel/setup.c
arch/ia64/sn/kernel/tiocx.c
arch/ia64/sn/kernel/xpc_partition.c
arch/m32r/Kconfig
arch/m32r/boot/compressed/m32r_sio.c
arch/m32r/defconfig
arch/m32r/kernel/Makefile
arch/m32r/kernel/io_m32700ut.c
arch/m32r/kernel/io_mappi.c
arch/m32r/kernel/io_mappi2.c
arch/m32r/kernel/io_mappi3.c [new file with mode: 0644]
arch/m32r/kernel/io_oaks32r.c
arch/m32r/kernel/io_opsput.c
arch/m32r/kernel/io_usrv.c
arch/m32r/kernel/setup.c
arch/m32r/kernel/setup_m32700ut.c
arch/m32r/kernel/setup_mappi.c
arch/m32r/kernel/setup_mappi2.c
arch/m32r/kernel/setup_mappi3.c [new file with mode: 0644]
arch/m32r/kernel/setup_oaks32r.c
arch/m32r/kernel/setup_opsput.c
arch/m32r/kernel/setup_usrv.c
arch/m32r/m32700ut/defconfig.m32700ut.smp
arch/m32r/m32700ut/defconfig.m32700ut.up
arch/m32r/mappi/defconfig.nommu
arch/m32r/mappi/defconfig.smp
arch/m32r/mappi/defconfig.up
arch/m32r/mappi2/defconfig.vdec2
arch/m32r/mappi3/defconfig.smp [new file with mode: 0644]
arch/m32r/mappi3/dot.gdbinit [new file with mode: 0644]
arch/m32r/mm/extable.c
arch/m32r/oaks32r/defconfig.nommu
arch/m32r/opsput/defconfig.opsput
arch/m68k/configs/amiga_defconfig
arch/m68k/configs/apollo_defconfig
arch/m68k/configs/atari_defconfig
arch/m68k/configs/bvme6000_defconfig
arch/m68k/configs/hp300_defconfig
arch/m68k/configs/mac_defconfig
arch/m68k/configs/mvme147_defconfig
arch/m68k/configs/mvme16x_defconfig
arch/m68k/configs/q40_defconfig
arch/m68k/configs/sun3_defconfig
arch/m68k/configs/sun3x_defconfig
arch/m68k/defconfig
arch/m68knommu/kernel/process.c
arch/mips/mm/init.c
arch/mips/vr41xx/common/pmu.c
arch/parisc/kernel/drivers.c
arch/ppc/Kconfig
arch/ppc/boot/images/Makefile
arch/ppc/boot/ld.script
arch/ppc/boot/openfirmware/Makefile
arch/ppc/boot/openfirmware/common.c
arch/ppc/boot/simple/Makefile
arch/ppc/boot/utils/addSystemMap.c [deleted file]
arch/ppc/configs/mpc8548_cds_defconfig [new file with mode: 0644]
arch/ppc/configs/mpc8555_cds_defconfig
arch/ppc/kernel/cputable.c
arch/ppc/kernel/entry.S
arch/ppc/kernel/head_44x.S
arch/ppc/kernel/head_4xx.S
arch/ppc/kernel/head_booke.h
arch/ppc/kernel/head_fsl_booke.S
arch/ppc/kernel/misc.S
arch/ppc/kernel/pci.c
arch/ppc/kernel/ppc_ksyms.c
arch/ppc/kernel/ptrace.c
arch/ppc/kernel/setup.c
arch/ppc/kernel/traps.c
arch/ppc/lib/locks.c
arch/ppc/lib/string.S
arch/ppc/mm/fsl_booke_mmu.c
arch/ppc/mm/init.c
arch/ppc/mm/mmu_decl.h
arch/ppc/mm/pgtable.c
arch/ppc/platforms/83xx/mpc834x_sys.c
arch/ppc/platforms/83xx/mpc834x_sys.h
arch/ppc/platforms/85xx/Kconfig
arch/ppc/platforms/85xx/Makefile
arch/ppc/platforms/85xx/mpc8540_ads.c
arch/ppc/platforms/85xx/mpc8560_ads.c
arch/ppc/platforms/85xx/mpc85xx_ads_common.c
arch/ppc/platforms/85xx/mpc85xx_cds_common.c
arch/ppc/platforms/85xx/mpc85xx_cds_common.h
arch/ppc/platforms/85xx/sbc8560.c
arch/ppc/platforms/85xx/sbc85xx.c
arch/ppc/platforms/85xx/stx_gp3.c
arch/ppc/platforms/pmac_cpufreq.c
arch/ppc/platforms/pq2ads.h
arch/ppc/platforms/sandpoint.c
arch/ppc/syslib/Makefile
arch/ppc/syslib/ipic.c
arch/ppc/syslib/m8260_pci.c [deleted file]
arch/ppc/syslib/m8260_pci.h [deleted file]
arch/ppc/syslib/m8260_pci_erratum9.c
arch/ppc/syslib/m8260_setup.c
arch/ppc/syslib/m82xx_pci.c [new file with mode: 0644]
arch/ppc/syslib/m82xx_pci.h [new file with mode: 0644]
arch/ppc/syslib/mpc10x_common.c
arch/ppc/syslib/mpc83xx_devices.c
arch/ppc/syslib/mpc85xx_devices.c
arch/ppc/syslib/mpc85xx_sys.c
arch/ppc/syslib/ocp.c
arch/ppc/syslib/of_device.c
arch/ppc/syslib/open_pic.c
arch/ppc/syslib/open_pic2.c
arch/ppc/syslib/ppc4xx_kgdb.c [deleted file]
arch/ppc/syslib/ppc83xx_setup.c
arch/ppc/syslib/ppc85xx_setup.c
arch/ppc/syslib/prom_init.c
arch/ppc/xmon/xmon.c
arch/ppc64/Kconfig
arch/ppc64/Makefile
arch/ppc64/boot/prom.c
arch/ppc64/configs/g5_defconfig
arch/ppc64/configs/iSeries_defconfig
arch/ppc64/configs/maple_defconfig
arch/ppc64/configs/pSeries_defconfig
arch/ppc64/defconfig
arch/ppc64/kernel/HvLpEvent.c
arch/ppc64/kernel/ItLpQueue.c
arch/ppc64/kernel/Makefile
arch/ppc64/kernel/XmPciLpEvent.c [deleted file]
arch/ppc64/kernel/asm-offsets.c
arch/ppc64/kernel/dma.c
arch/ppc64/kernel/eeh.c
arch/ppc64/kernel/entry.S
arch/ppc64/kernel/head.S
arch/ppc64/kernel/iSeries_VpdInfo.c
arch/ppc64/kernel/iSeries_iommu.c
arch/ppc64/kernel/iSeries_irq.c
arch/ppc64/kernel/iSeries_pci.c
arch/ppc64/kernel/iSeries_pci_reset.c [deleted file]
arch/ppc64/kernel/iSeries_proc.c
arch/ppc64/kernel/iSeries_setup.c
arch/ppc64/kernel/iSeries_smp.c
arch/ppc64/kernel/idle.c
arch/ppc64/kernel/iommu.c
arch/ppc64/kernel/irq.c
arch/ppc64/kernel/kprobes.c
arch/ppc64/kernel/lparcfg.c
arch/ppc64/kernel/mf.c
arch/ppc64/kernel/misc.S
arch/ppc64/kernel/of_device.c
arch/ppc64/kernel/pSeries_reconfig.c
arch/ppc64/kernel/pSeries_smp.c
arch/ppc64/kernel/pci.c
arch/ppc64/kernel/pmac_smp.c
arch/ppc64/kernel/process.c
arch/ppc64/kernel/prom.c
arch/ppc64/kernel/prom_init.c
arch/ppc64/kernel/ras.c
arch/ppc64/kernel/rtasd.c
arch/ppc64/kernel/rtc.c
arch/ppc64/kernel/setup.c
arch/ppc64/kernel/smp.c
arch/ppc64/kernel/sys_ppc32.c
arch/ppc64/kernel/syscalls.c
arch/ppc64/kernel/sysfs.c
arch/ppc64/kernel/time.c
arch/ppc64/kernel/vio.c
arch/ppc64/kernel/viopath.c
arch/ppc64/lib/Makefile
arch/ppc64/mm/hash_utils.c
arch/ppc64/mm/hugetlbpage.c
arch/ppc64/mm/imalloc.c
arch/ppc64/mm/init.c
arch/ppc64/xmon/xmon.c
arch/s390/appldata/appldata_base.c
arch/s390/appldata/appldata_mem.c
arch/s390/appldata/appldata_net_sum.c
arch/s390/appldata/appldata_os.c
arch/s390/kernel/compat_ioctl.c
arch/s390/kernel/head.S
arch/s390/kernel/head64.S
arch/s390/kernel/ptrace.c
arch/s390/kernel/traps.c
arch/s390/mm/cmm.c
arch/s390/mm/fault.c
arch/sh/kernel/sys_sh.c
arch/sh/lib/delay.c
arch/sh/mm/hugetlbpage.c
arch/sh64/mm/hugetlbpage.c
arch/sparc/mm/init.c
arch/sparc64/kernel/pci_iommu.c
arch/sparc64/kernel/pci_psycho.c
arch/sparc64/kernel/pci_sabre.c
arch/sparc64/kernel/pci_schizo.c
arch/sparc64/kernel/sbus.c
arch/sparc64/kernel/setup.c
arch/sparc64/kernel/smp.c
arch/sparc64/kernel/sys_sparc.c
arch/sparc64/kernel/traps.c
arch/sparc64/lib/delay.c
arch/sparc64/mm/hugetlbpage.c
arch/sparc64/solaris/socket.c
arch/um/Kconfig
arch/um/Kconfig.debug
arch/um/Kconfig_char
arch/um/Kconfig_x86_64
arch/um/Makefile
arch/um/drivers/Makefile
arch/um/drivers/chan_kern.c
arch/um/drivers/chan_user.c
arch/um/drivers/line.c
arch/um/drivers/mcast_kern.c
arch/um/drivers/mcast_user.c
arch/um/drivers/mmapper_kern.c
arch/um/drivers/net_kern.c
arch/um/drivers/net_user.c
arch/um/drivers/port_kern.c
arch/um/drivers/random.c
arch/um/drivers/slip.h
arch/um/drivers/slip_common.c [new file with mode: 0644]
arch/um/drivers/slip_common.h [new file with mode: 0644]
arch/um/drivers/slip_kern.c
arch/um/drivers/slip_proto.h [deleted file]
arch/um/drivers/slip_user.c
arch/um/drivers/slirp.h
arch/um/drivers/slirp_kern.c
arch/um/drivers/slirp_user.c
arch/um/drivers/ssl.c
arch/um/drivers/stderr_console.c
arch/um/drivers/stdio_console.c
arch/um/drivers/ubd_kern.c
arch/um/drivers/xterm_kern.c
arch/um/include/2_5compat.h [deleted file]
arch/um/include/mconsole.h
arch/um/include/net_user.h
arch/um/include/os.h
arch/um/include/sysdep-i386/ptrace.h
arch/um/include/sysdep-x86_64/checksum.h
arch/um/include/sysdep-x86_64/ptrace.h
arch/um/include/sysrq.h
arch/um/include/user_util.h
arch/um/kernel/Makefile
arch/um/kernel/checksum.c [deleted file]
arch/um/kernel/exec_kern.c
arch/um/kernel/initrd.c [new file with mode: 0644]
arch/um/kernel/initrd_kern.c [deleted file]
arch/um/kernel/initrd_user.c [deleted file]
arch/um/kernel/irq.c
arch/um/kernel/irq_user.c
arch/um/kernel/ksyms.c
arch/um/kernel/main.c
arch/um/kernel/mem.c
arch/um/kernel/process.c
arch/um/kernel/process_kern.c
arch/um/kernel/ptrace.c
arch/um/kernel/skas/process_kern.c
arch/um/kernel/sysrq.c
arch/um/kernel/trap_kern.c
arch/um/kernel/tt/Makefile
arch/um/kernel/tt/ksyms.c
arch/um/kernel/tt/process_kern.c
arch/um/kernel/tt/unmap.c [deleted file]
arch/um/kernel/um_arch.c
arch/um/kernel/uml.lds.S
arch/um/os-Linux/elf_aux.c
arch/um/os-Linux/file.c
arch/um/scripts/Makefile.rules
arch/um/scripts/Makefile.unmap [new file with mode: 0644]
arch/um/sys-i386/Makefile
arch/um/sys-i386/delay.c
arch/um/sys-i386/sysrq.c
arch/um/sys-i386/unmap.c [new file with mode: 0644]
arch/um/sys-ppc/sysrq.c
arch/um/sys-x86_64/Makefile
arch/um/sys-x86_64/delay.c
arch/um/sys-x86_64/ksyms.c
arch/um/sys-x86_64/ptrace.c
arch/um/sys-x86_64/syscalls.c
arch/um/sys-x86_64/sysrq.c
arch/um/sys-x86_64/unmap.c [new file with mode: 0644]
arch/um/sys-x86_64/user-offsets.c
arch/x86_64/Kconfig
arch/x86_64/defconfig
arch/x86_64/ia32/ia32_aout.c
arch/x86_64/ia32/ia32_binfmt.c
arch/x86_64/kernel/Makefile
arch/x86_64/kernel/aperture.c
arch/x86_64/kernel/apic.c
arch/x86_64/kernel/entry.S
arch/x86_64/kernel/io_apic.c
arch/x86_64/kernel/mpparse.c
arch/x86_64/kernel/nmi.c
arch/x86_64/kernel/pmtimer.c [new file with mode: 0644]
arch/x86_64/kernel/process.c
arch/x86_64/kernel/ptrace.c
arch/x86_64/kernel/setup.c
arch/x86_64/kernel/signal.c
arch/x86_64/kernel/smpboot.c
arch/x86_64/kernel/sys_x86_64.c
arch/x86_64/kernel/time.c
arch/x86_64/kernel/traps.c
arch/x86_64/kernel/vsyscall.c
arch/x86_64/kernel/x8664_ksyms.c
arch/x86_64/lib/delay.c
arch/x86_64/mm/fault.c
arch/x86_64/mm/ioremap.c
crypto/crypto_null.c
crypto/internal.h
drivers/Kconfig
drivers/Makefile
drivers/acpi/Kconfig
drivers/acpi/pci_irq.c
drivers/acpi/processor_idle.c
drivers/acpi/scan.c
drivers/atm/Makefile
drivers/atm/fore200e.c
drivers/atm/he.c
drivers/atm/nicstar.c
drivers/atm/zatm.c
drivers/base/Makefile
drivers/base/base.h
drivers/base/bus.c
drivers/base/class.c
drivers/base/class_simple.c [deleted file]
drivers/base/core.c
drivers/base/dd.c [new file with mode: 0644]
drivers/base/dmapool.c
drivers/base/driver.c
drivers/base/interface.c [deleted file]
drivers/base/node.c
drivers/base/power/power.h
drivers/base/power/resume.c
drivers/base/power/shutdown.c
drivers/base/power/suspend.c
drivers/base/power/sysfs.c
drivers/base/sys.c
drivers/block/aoe/aoechr.c
drivers/block/as-iosched.c
drivers/block/cciss.c
drivers/block/cfq-iosched.c
drivers/block/deadline-iosched.c
drivers/block/elevator.c
drivers/block/genhd.c
drivers/block/ioctl.c
drivers/block/ll_rw_blk.c
drivers/block/paride/pd.c
drivers/block/paride/pg.c
drivers/block/paride/pt.c
drivers/block/pktcdvd.c
drivers/block/sx8.c
drivers/block/ub.c
drivers/cdrom/viocd.c
drivers/char/Kconfig
drivers/char/Makefile
drivers/char/agp/agp.h
drivers/char/agp/ali-agp.c
drivers/char/agp/amd-k7-agp.c
drivers/char/agp/amd64-agp.c
drivers/char/agp/ati-agp.c
drivers/char/agp/backend.c
drivers/char/agp/efficeon-agp.c
drivers/char/agp/generic.c
drivers/char/agp/hp-agp.c
drivers/char/agp/i460-agp.c
drivers/char/agp/intel-agp.c
drivers/char/agp/sgi-agp.c
drivers/char/agp/sworks-agp.c
drivers/char/agp/uninorth-agp.c
drivers/char/drm/drm_pciids.h
drivers/char/drm/radeon_irq.c
drivers/char/dsp56k.c
drivers/char/ftape/zftape/zftape-init.c
drivers/char/hvcs.c
drivers/char/ip2main.c
drivers/char/ipmi/ipmi_devintf.c
drivers/char/ipmi/ipmi_msghandler.c
drivers/char/istallion.c
drivers/char/lp.c
drivers/char/mbcs.c
drivers/char/mem.c
drivers/char/misc.c
drivers/char/mwave/mwavedd.c
drivers/char/mxser.c
drivers/char/ppdev.c
drivers/char/raw.c
drivers/char/snsc.c
drivers/char/stallion.c
drivers/char/tipar.c
drivers/char/tpm/tpm.c
drivers/char/tty_io.c
drivers/char/vc_screen.c
drivers/char/viotape.c
drivers/char/vr41xx_giu.c [new file with mode: 0644]
drivers/char/vt.c
drivers/char/watchdog/i8xx_tco.c
drivers/char/watchdog/ixp2000_wdt.c
drivers/cpufreq/Kconfig
drivers/cpufreq/Makefile
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq_conservative.c [new file with mode: 0644]
drivers/cpufreq/cpufreq_ondemand.c
drivers/cpufreq/cpufreq_stats.c
drivers/dio/dio-sysfs.c
drivers/eisa/eisa-bus.c
drivers/fc4/fc.c
drivers/fc4/fc_syms.c
drivers/fc4/fcp_impl.h
drivers/firmware/edd.c
drivers/firmware/efivars.c
drivers/firmware/pcdp.c
drivers/i2c/busses/i2c-ali1563.c
drivers/i2c/busses/i2c-keywest.c
drivers/i2c/chips/adm1021.c
drivers/i2c/chips/adm1025.c
drivers/i2c/chips/adm1026.c
drivers/i2c/chips/adm1031.c
drivers/i2c/chips/asb100.c
drivers/i2c/chips/ds1621.c
drivers/i2c/chips/fscher.c
drivers/i2c/chips/fscpos.c
drivers/i2c/chips/gl518sm.c
drivers/i2c/chips/gl520sm.c
drivers/i2c/chips/it87.c
drivers/i2c/chips/lm63.c
drivers/i2c/chips/lm75.c
drivers/i2c/chips/lm77.c
drivers/i2c/chips/lm78.c
drivers/i2c/chips/lm80.c
drivers/i2c/chips/lm83.c
drivers/i2c/chips/lm85.c
drivers/i2c/chips/lm87.c
drivers/i2c/chips/lm90.c
drivers/i2c/chips/lm92.c
drivers/i2c/chips/max1619.c
drivers/i2c/chips/pc87360.c
drivers/i2c/chips/pcf8574.c
drivers/i2c/chips/pcf8591.c
drivers/i2c/chips/sis5595.c
drivers/i2c/chips/smsc47b397.c
drivers/i2c/chips/smsc47m1.c
drivers/i2c/chips/via686a.c
drivers/i2c/chips/w83627hf.c
drivers/i2c/chips/w83781d.c
drivers/i2c/chips/w83l785ts.c
drivers/i2c/i2c-core.c
drivers/ide/Kconfig
drivers/ide/ide-cd.c
drivers/ide/ide-disk.c
drivers/ide/ide-floppy.c
drivers/ide/ide-probe.c
drivers/ide/ide-proc.c
drivers/ide/ide-tape.c
drivers/ide/ide.c
drivers/ide/pci/amd74xx.c
drivers/ide/pci/sgiioc4.c
drivers/ieee1394/Kconfig
drivers/ieee1394/dv1394.c
drivers/ieee1394/ieee1394_core.c
drivers/ieee1394/ieee1394_core.h
drivers/ieee1394/ieee1394_transactions.c
drivers/ieee1394/ieee1394_transactions.h
drivers/ieee1394/nodemgr.c
drivers/ieee1394/ohci1394.c
drivers/ieee1394/ohci1394.h
drivers/ieee1394/pcilynx.c
drivers/ieee1394/pcilynx.h
drivers/ieee1394/raw1394.c
drivers/ieee1394/sbp2.c
drivers/ieee1394/sbp2.h
drivers/ieee1394/video1394.c
drivers/infiniband/core/sa_query.c
drivers/infiniband/core/sysfs.c
drivers/infiniband/core/user_mad.c
drivers/infiniband/include/ib_sa.h
drivers/input/evdev.c
drivers/input/gameport/Kconfig
drivers/input/gameport/gameport.c
drivers/input/input.c
drivers/input/joydev.c
drivers/input/keyboard/atkbd.c
drivers/input/mouse/alps.c
drivers/input/mouse/psmouse-base.c
drivers/input/mouse/psmouse.h
drivers/input/mouse/synaptics.c
drivers/input/mousedev.c
drivers/input/serio/i8042-x86ia64io.h
drivers/input/serio/i8042.c
drivers/input/serio/serio.c
drivers/input/serio/serport.c
drivers/input/touchscreen/gunze.c
drivers/input/tsdev.c
drivers/isdn/capi/capi.c
drivers/macintosh/adb.c
drivers/macintosh/therm_adt746x.c
drivers/macintosh/therm_pm72.c
drivers/macintosh/therm_windtunnel.c
drivers/macintosh/via-pmu.c
drivers/mca/mca-bus.c
drivers/md/Makefile
drivers/md/bitmap.c [new file with mode: 0644]
drivers/md/dm-crypt.c
drivers/md/dm-mpath.c
drivers/md/linear.c
drivers/md/md.c
drivers/md/multipath.c
drivers/md/raid0.c
drivers/md/raid1.c
drivers/md/raid10.c
drivers/md/raid5.c
drivers/md/raid6main.c
drivers/media/common/saa7146_core.c
drivers/media/dvb/Kconfig
drivers/media/dvb/b2c2/Kconfig
drivers/media/dvb/b2c2/Makefile
drivers/media/dvb/b2c2/b2c2-common.c [deleted file]
drivers/media/dvb/b2c2/b2c2-usb-core.c [deleted file]
drivers/media/dvb/b2c2/flexcop-common.h [new file with mode: 0644]
drivers/media/dvb/b2c2/flexcop-dma.c [new file with mode: 0644]
drivers/media/dvb/b2c2/flexcop-eeprom.c [new file with mode: 0644]
drivers/media/dvb/b2c2/flexcop-fe-tuner.c [new file with mode: 0644]
drivers/media/dvb/b2c2/flexcop-hw-filter.c [new file with mode: 0644]
drivers/media/dvb/b2c2/flexcop-i2c.c [new file with mode: 0644]
drivers/media/dvb/b2c2/flexcop-misc.c [new file with mode: 0644]
drivers/media/dvb/b2c2/flexcop-pci.c [new file with mode: 0644]
drivers/media/dvb/b2c2/flexcop-reg.h [new file with mode: 0644]
drivers/media/dvb/b2c2/flexcop-sram.c [new file with mode: 0644]
drivers/media/dvb/b2c2/flexcop-usb.c [new file with mode: 0644]
drivers/media/dvb/b2c2/flexcop-usb.h [new file with mode: 0644]
drivers/media/dvb/b2c2/flexcop.c [new file with mode: 0644]
drivers/media/dvb/b2c2/flexcop.h [new file with mode: 0644]
drivers/media/dvb/b2c2/skystar2.c
drivers/media/dvb/bt8xx/Kconfig
drivers/media/dvb/bt8xx/Makefile
drivers/media/dvb/bt8xx/bt878.c
drivers/media/dvb/bt8xx/bt878.h
drivers/media/dvb/bt8xx/dst.c
drivers/media/dvb/bt8xx/dst.h [deleted file]
drivers/media/dvb/bt8xx/dst_ca.c [new file with mode: 0644]
drivers/media/dvb/bt8xx/dst_ca.h [new file with mode: 0644]
drivers/media/dvb/bt8xx/dst_common.h [new file with mode: 0644]
drivers/media/dvb/bt8xx/dst_priv.h
drivers/media/dvb/bt8xx/dvb-bt8xx.c
drivers/media/dvb/bt8xx/dvb-bt8xx.h
drivers/media/dvb/cinergyT2/cinergyT2.c
drivers/media/dvb/dibusb/dvb-dibusb-dvb.c
drivers/media/dvb/dibusb/dvb-dibusb-fe-i2c.c
drivers/media/dvb/dibusb/dvb-dibusb.h
drivers/media/dvb/dvb-core/dmxdev.c
drivers/media/dvb/dvb-core/dvb_ca_en50221.c
drivers/media/dvb/dvb-core/dvb_frontend.c
drivers/media/dvb/dvb-core/dvb_net.c
drivers/media/dvb/dvb-core/dvbdev.c
drivers/media/dvb/dvb-core/dvbdev.h
drivers/media/dvb/frontends/Kconfig
drivers/media/dvb/frontends/at76c651.c
drivers/media/dvb/frontends/cx22700.c
drivers/media/dvb/frontends/cx22702.c
drivers/media/dvb/frontends/cx24110.c
drivers/media/dvb/frontends/dib3000mb.c
drivers/media/dvb/frontends/dib3000mc.c
drivers/media/dvb/frontends/dvb-pll.h
drivers/media/dvb/frontends/dvb_dummy_fe.c
drivers/media/dvb/frontends/l64781.c
drivers/media/dvb/frontends/mt312.c
drivers/media/dvb/frontends/mt352.c
drivers/media/dvb/frontends/mt352.h
drivers/media/dvb/frontends/nxt2002.c
drivers/media/dvb/frontends/nxt6000.c
drivers/media/dvb/frontends/nxt6000_priv.h
drivers/media/dvb/frontends/or51132.c
drivers/media/dvb/frontends/sp8870.c
drivers/media/dvb/frontends/sp887x.c
drivers/media/dvb/frontends/stv0297.c
drivers/media/dvb/frontends/stv0299.c
drivers/media/dvb/frontends/tda10021.c
drivers/media/dvb/frontends/tda1004x.c
drivers/media/dvb/frontends/tda1004x.h
drivers/media/dvb/frontends/tda8083.c
drivers/media/dvb/frontends/tda80xx.c
drivers/media/dvb/frontends/ves1820.c
drivers/media/dvb/frontends/ves1x93.c
drivers/media/dvb/ttpci/av7110.c
drivers/media/dvb/ttpci/av7110.h
drivers/media/dvb/ttpci/av7110_av.c
drivers/media/dvb/ttpci/av7110_ca.c
drivers/media/dvb/ttpci/av7110_hw.c
drivers/media/dvb/ttpci/av7110_hw.h
drivers/media/dvb/ttpci/av7110_ir.c
drivers/media/dvb/ttpci/av7110_v4l.c
drivers/media/dvb/ttpci/budget-av.c
drivers/media/dvb/ttpci/budget-ci.c
drivers/media/dvb/ttpci/budget-core.c
drivers/media/dvb/ttpci/budget-patch.c
drivers/media/dvb/ttpci/budget.c
drivers/media/dvb/ttpci/budget.h
drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
drivers/media/dvb/ttusb-dec/ttusb_dec.c
drivers/media/video/Kconfig
drivers/media/video/bttv-cards.c
drivers/media/video/bttv-i2c.c
drivers/media/video/saa7134/saa6752hs.c
drivers/media/video/video-buf-dvb.c
drivers/message/fusion/Kconfig
drivers/message/fusion/Makefile
drivers/message/fusion/lsi/mpi.h
drivers/message/fusion/lsi/mpi_cnfg.h
drivers/message/fusion/lsi/mpi_fc.h
drivers/message/fusion/lsi/mpi_history.txt
drivers/message/fusion/lsi/mpi_inb.h
drivers/message/fusion/lsi/mpi_init.h
drivers/message/fusion/lsi/mpi_ioc.h
drivers/message/fusion/lsi/mpi_lan.h
drivers/message/fusion/lsi/mpi_raid.h
drivers/message/fusion/lsi/mpi_sas.h
drivers/message/fusion/lsi/mpi_targ.h
drivers/message/fusion/lsi/mpi_tool.h
drivers/message/fusion/lsi/mpi_type.h
drivers/message/fusion/mptbase.c
drivers/message/fusion/mptbase.h
drivers/message/fusion/mptctl.c
drivers/message/fusion/mptctl.h
drivers/message/fusion/mptfc.c [new file with mode: 0644]
drivers/message/fusion/mptlan.c
drivers/message/fusion/mptlan.h
drivers/message/fusion/mptscsih.c
drivers/message/fusion/mptscsih.h
drivers/message/fusion/mptspi.c [new file with mode: 0644]
drivers/message/i2o/i2o_block.c
drivers/misc/ibmasm/command.c
drivers/misc/ibmasm/dot_command.c
drivers/misc/ibmasm/event.c
drivers/misc/ibmasm/heartbeat.c
drivers/misc/ibmasm/ibmasm.h
drivers/misc/ibmasm/ibmasmfs.c
drivers/misc/ibmasm/lowlevel.c
drivers/misc/ibmasm/module.c
drivers/misc/ibmasm/r_heartbeat.c
drivers/misc/ibmasm/remote.c
drivers/misc/ibmasm/remote.h
drivers/mmc/Kconfig
drivers/mmc/mmc_block.c
drivers/mmc/mmc_sysfs.c
drivers/mmc/wbsd.c
drivers/mmc/wbsd.h
drivers/net/3c59x.c
drivers/net/8139cp.c
drivers/net/8139too.c
drivers/net/8390.c
drivers/net/Kconfig
drivers/net/Makefile
drivers/net/Space.c
drivers/net/amd8111e.c
drivers/net/arm/etherh.c
drivers/net/au1000_eth.c
drivers/net/bmac.c
drivers/net/bnx2.c [new file with mode: 0644]
drivers/net/bnx2.h [new file with mode: 0644]
drivers/net/bnx2_fw.h [new file with mode: 0644]
drivers/net/bonding/bond_main.c
drivers/net/dm9000.c [new file with mode: 0644]
drivers/net/dm9000.h [new file with mode: 0644]
drivers/net/e100.c
drivers/net/e1000/e1000.h
drivers/net/e1000/e1000_ethtool.c
drivers/net/e1000/e1000_hw.c
drivers/net/e1000/e1000_hw.h
drivers/net/e1000/e1000_main.c
drivers/net/e1000/e1000_osdep.h
drivers/net/e1000/e1000_param.c
drivers/net/fmv18x.c [deleted file]
drivers/net/forcedeth.c
drivers/net/hamradio/baycom_epp.c
drivers/net/ibm_emac/ibm_emac_core.c
drivers/net/irda/Kconfig
drivers/net/iseries_veth.c
drivers/net/ixgb/ixgb.h
drivers/net/ixgb/ixgb_ee.c
drivers/net/ixgb/ixgb_ethtool.c
drivers/net/ixgb/ixgb_main.c
drivers/net/ixgb/ixgb_osdep.h
drivers/net/natsemi.c
drivers/net/ns83820.c
drivers/net/pcmcia/3c574_cs.c
drivers/net/pcmcia/pcnet_cs.c
drivers/net/pcnet32.c
drivers/net/ppp_generic.c
drivers/net/r8169.c
drivers/net/shaper.c
drivers/net/sis900.c
drivers/net/sk98lin/skge.c
drivers/net/sk_g16.c [deleted file]
drivers/net/sk_g16.h [deleted file]
drivers/net/skge.c [new file with mode: 0644]
drivers/net/skge.h [new file with mode: 0644]
drivers/net/smc91x.c
drivers/net/smc91x.h
drivers/net/starfire.c
drivers/net/starfire_firmware.h [new file with mode: 0644]
drivers/net/tg3.c
drivers/net/tg3.h
drivers/net/tlan.c
drivers/net/tokenring/ibmtr.c
drivers/net/tulip/media.c
drivers/net/tulip/tulip_core.c
drivers/net/wan/cosa.c
drivers/net/wan/hdlc_fr.c
drivers/net/wan/hdlc_generic.c
drivers/net/wan/lmc/lmc_main.c
drivers/net/wireless/Kconfig
drivers/net/wireless/airo.c
drivers/net/wireless/atmel_cs.c
drivers/net/wireless/orinoco.c
drivers/net/wireless/orinoco.h
drivers/oprofile/buffer_sync.c
drivers/pci/hotplug.c
drivers/pci/hotplug/cpci_hotplug.h
drivers/pci/hotplug/cpci_hotplug_core.c
drivers/pci/hotplug/cpci_hotplug_pci.c
drivers/pci/hotplug/cpqphp_sysfs.c
drivers/pci/hotplug/pci_hotplug_core.c
drivers/pci/hotplug/pciehp.h
drivers/pci/hotplug/pciehp_core.c
drivers/pci/hotplug/pciehp_hpc.c
drivers/pci/hotplug/rpadlpar_sysfs.c
drivers/pci/hotplug/shpchp_core.c
drivers/pci/hotplug/shpchp_ctrl.c
drivers/pci/hotplug/shpchp_sysfs.c
drivers/pci/hotplug/shpchprm_acpi.c
drivers/pci/pci-driver.c
drivers/pci/pci-sysfs.c
drivers/pci/pci.h
drivers/pci/pci.ids
drivers/pci/pcie/portdrv_bus.c
drivers/pci/pcie/portdrv_core.c
drivers/pci/probe.c
drivers/pci/quirks.c
drivers/pcmcia/Kconfig
drivers/pcmcia/ds.c
drivers/pcmcia/m32r_cfc.c
drivers/pcmcia/m32r_cfc.h
drivers/pnp/card.c
drivers/pnp/driver.c
drivers/pnp/interface.c
drivers/s390/block/dasd.c
drivers/s390/block/dasd_devmap.c
drivers/s390/block/dcssblk.c
drivers/s390/char/raw3270.c
drivers/s390/char/tape_class.c
drivers/s390/char/tape_core.c
drivers/s390/char/vmlogrdr.c
drivers/s390/cio/blacklist.c
drivers/s390/cio/ccwgroup.c
drivers/s390/cio/chsc.c
drivers/s390/cio/cmf.c
drivers/s390/cio/device.c
drivers/s390/net/Makefile
drivers/s390/net/claw.c
drivers/s390/net/ctcdbug.h
drivers/s390/net/ctcmain.c
drivers/s390/net/ctcmain.h [new file with mode: 0644]
drivers/s390/net/ctctty.c
drivers/s390/net/cu3088.c
drivers/s390/net/cu3088.h
drivers/s390/net/iucv.c
drivers/s390/net/lcs.c
drivers/s390/net/netiucv.c
drivers/s390/net/qeth.h
drivers/s390/net/qeth_eddp.c
drivers/s390/net/qeth_main.c
drivers/s390/net/qeth_sys.c
drivers/s390/net/qeth_tso.c [deleted file]
drivers/s390/net/qeth_tso.h
drivers/s390/scsi/zfcp_aux.c
drivers/s390/scsi/zfcp_def.h
drivers/s390/scsi/zfcp_erp.c
drivers/s390/scsi/zfcp_ext.h
drivers/s390/scsi/zfcp_fsf.c
drivers/s390/scsi/zfcp_qdio.c
drivers/s390/scsi/zfcp_scsi.c
drivers/s390/scsi/zfcp_sysfs_adapter.c
drivers/s390/scsi/zfcp_sysfs_port.c
drivers/s390/scsi/zfcp_sysfs_unit.c
drivers/sbus/char/aurora.c
drivers/scsi/3w-9xxx.c
drivers/scsi/3w-xxxx.c
drivers/scsi/53c700.c
drivers/scsi/BusLogic.c
drivers/scsi/FlashPoint.c
drivers/scsi/Kconfig
drivers/scsi/Makefile
drivers/scsi/NCR5380.c
drivers/scsi/NCR5380.h
drivers/scsi/NCR53C9x.c
drivers/scsi/NCR53c406a.c
drivers/scsi/a2091.c
drivers/scsi/a3000.c
drivers/scsi/aacraid/aachba.c
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/commctrl.c
drivers/scsi/aacraid/comminit.c
drivers/scsi/aacraid/commsup.c
drivers/scsi/aacraid/dpcsup.c
drivers/scsi/aacraid/linit.c
drivers/scsi/aacraid/rkt.c
drivers/scsi/aacraid/rx.c
drivers/scsi/aacraid/sa.c
drivers/scsi/aha152x.c
drivers/scsi/aha1542.c
drivers/scsi/aha1542.h
drivers/scsi/ahci.c
drivers/scsi/aic7xxx/aic7770_osm.c
drivers/scsi/aic7xxx/aic79xx_osm.c
drivers/scsi/aic7xxx/aic79xx_osm.h
drivers/scsi/aic7xxx/aic7xxx.h
drivers/scsi/aic7xxx/aic7xxx_core.c
drivers/scsi/aic7xxx/aic7xxx_osm.c
drivers/scsi/aic7xxx/aic7xxx_osm.h
drivers/scsi/aic7xxx/aic7xxx_osm_pci.c
drivers/scsi/aic7xxx/aic7xxx_proc.c
drivers/scsi/aic7xxx/aiclib.c
drivers/scsi/aic7xxx_old.c
drivers/scsi/arm/cumana_1.c
drivers/scsi/arm/ecoscsi.c
drivers/scsi/arm/eesox.c
drivers/scsi/arm/fas216.c
drivers/scsi/arm/oak.c
drivers/scsi/arm/powertec.c
drivers/scsi/ata_piix.c
drivers/scsi/atp870u.c
drivers/scsi/ch.c [new file with mode: 0644]
drivers/scsi/dc395x.c
drivers/scsi/dmx3191d.c
drivers/scsi/dpt_i2o.c
drivers/scsi/dpti.h
drivers/scsi/dtc.c
drivers/scsi/dtc.h
drivers/scsi/eata.c
drivers/scsi/eata_pio.c
drivers/scsi/fcal.c
drivers/scsi/fd_mcs.c
drivers/scsi/fdomain.c
drivers/scsi/g_NCR5380.c
drivers/scsi/g_NCR5380.h
drivers/scsi/gdth.c
drivers/scsi/gvp11.c
drivers/scsi/ibmmca.c
drivers/scsi/ibmvscsi/ibmvscsi.c
drivers/scsi/ide-scsi.c
drivers/scsi/imm.c
drivers/scsi/in2000.c
drivers/scsi/in2000.h
drivers/scsi/initio.c
drivers/scsi/ipr.c
drivers/scsi/ipr.h
drivers/scsi/ips.c
drivers/scsi/libata-core.c
drivers/scsi/libata-scsi.c
drivers/scsi/libata.h
drivers/scsi/lpfc/lpfc_scsi.c
drivers/scsi/mac53c94.c
drivers/scsi/mac_scsi.c
drivers/scsi/mac_scsi.h
drivers/scsi/megaraid.c
drivers/scsi/megaraid/mega_common.h
drivers/scsi/megaraid/megaraid_mbox.c
drivers/scsi/megaraid/megaraid_mbox.h
drivers/scsi/megaraid/megaraid_mm.c
drivers/scsi/megaraid/megaraid_mm.h
drivers/scsi/mesh.c
drivers/scsi/mvme147.c
drivers/scsi/nsp32.c
drivers/scsi/osst.c
drivers/scsi/pas16.c
drivers/scsi/pas16.h
drivers/scsi/pci2000.c [deleted file]
drivers/scsi/pci2220i.c [deleted file]
drivers/scsi/pci2220i.h [deleted file]
drivers/scsi/pcmcia/nsp_cs.c
drivers/scsi/pcmcia/qlogic_stub.c
drivers/scsi/pcmcia/sym53c500_cs.c
drivers/scsi/pluto.c
drivers/scsi/ppa.c
drivers/scsi/psi_dale.h [deleted file]
drivers/scsi/psi_roy.h [deleted file]
drivers/scsi/ql1040_fw.h
drivers/scsi/ql12160_fw.h
drivers/scsi/ql1280_fw.h
drivers/scsi/qla1280.c
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_gbl.h
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_iocb.c
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_mbx.c
drivers/scsi/qla2xxx/qla_os.c
drivers/scsi/qlogicfas.c
drivers/scsi/qlogicfas408.c
drivers/scsi/qlogicfas408.h
drivers/scsi/sata_nv.c
drivers/scsi/sata_promise.c
drivers/scsi/sata_qstor.c
drivers/scsi/sata_sil.c
drivers/scsi/sata_sis.c
drivers/scsi/sata_svw.c
drivers/scsi/sata_sx4.c
drivers/scsi/sata_uli.c
drivers/scsi/sata_via.c
drivers/scsi/sata_vsc.c
drivers/scsi/scsi.c
drivers/scsi/scsi_error.c
drivers/scsi/scsi_lib.c
drivers/scsi/scsi_scan.c
drivers/scsi/scsi_sysfs.c
drivers/scsi/scsi_transport_spi.c
drivers/scsi/sd.c
drivers/scsi/seagate.c
drivers/scsi/seagate.h
drivers/scsi/sg.c
drivers/scsi/sgiwd93.c
drivers/scsi/st.c
drivers/scsi/sun3x_esp.c
drivers/scsi/sym53c416.c
drivers/scsi/sym53c416.h
drivers/scsi/sym53c8xx_2/sym_defs.h
drivers/scsi/sym53c8xx_2/sym_glue.c
drivers/scsi/sym53c8xx_2/sym_glue.h
drivers/scsi/sym53c8xx_2/sym_hipd.c
drivers/scsi/sym53c8xx_2/sym_hipd.h
drivers/scsi/sym53c8xx_2/sym_nvram.c
drivers/scsi/t128.c
drivers/scsi/t128.h
drivers/scsi/tmscsim.c
drivers/scsi/u14-34f.c
drivers/scsi/ultrastor.c
drivers/scsi/wd7000.c
drivers/serial/21285.c
drivers/serial/8250.c
drivers/serial/Kconfig
drivers/serial/Makefile
drivers/serial/amba-pl010.c
drivers/serial/amba-pl011.c
drivers/serial/clps711x.c
drivers/serial/cpm_uart/cpm_uart_cpm2.c
drivers/serial/ioc4_serial.c
drivers/serial/pxa.c
drivers/serial/s3c2410.c
drivers/serial/sa1100.c
drivers/serial/serial_cs.c
drivers/serial/serial_lh7a40x.c
drivers/serial/serial_txx9.c
drivers/serial/sunsab.c
drivers/serial/sunsab.h
drivers/serial/vr41xx_siu.c
drivers/sh/superhyway/superhyway-sysfs.c
drivers/sn/Kconfig [new file with mode: 0644]
drivers/sn/Makefile
drivers/sn/ioc4.c
drivers/usb/atm/speedtch.c
drivers/usb/core/devices.c
drivers/usb/core/file.c
drivers/usb/core/hcd.c
drivers/usb/core/sysfs.c
drivers/usb/core/usb.c
drivers/usb/gadget/dummy_hcd.c
drivers/usb/gadget/file_storage.c
drivers/usb/gadget/net2280.c
drivers/usb/gadget/pxa2xx_udc.c
drivers/usb/host/Kconfig
drivers/usb/host/Makefile
drivers/usb/host/ehci-dbg.c
drivers/usb/host/ehci-hub.c
drivers/usb/host/ohci-dbg.c
drivers/usb/host/sl811-hcd.c
drivers/usb/host/sl811_cs.c [new file with mode: 0644]
drivers/usb/input/aiptek.c
drivers/usb/input/hid-core.c
drivers/usb/media/pwc/ChangeLog [deleted file]
drivers/usb/media/pwc/Makefile
drivers/usb/media/pwc/pwc-ctrl.c
drivers/usb/media/pwc/pwc-dec1.c [deleted file]
drivers/usb/media/pwc/pwc-dec1.h [deleted file]
drivers/usb/media/pwc/pwc-dec23.c [deleted file]
drivers/usb/media/pwc/pwc-dec23.h [deleted file]
drivers/usb/media/pwc/pwc-if.c
drivers/usb/media/pwc/pwc-kiara.c
drivers/usb/media/pwc/pwc-timon.c
drivers/usb/media/pwc/pwc-uncompress.c
drivers/usb/misc/cytherm.c
drivers/usb/misc/phidgetkit.c
drivers/usb/misc/phidgetservo.c
drivers/usb/misc/usbled.c
drivers/usb/net/Kconfig
drivers/usb/net/kaweth.c
drivers/usb/net/usbnet.c
drivers/usb/serial/Kconfig
drivers/usb/serial/Makefile
drivers/usb/serial/cp2101.c
drivers/usb/serial/cypress_m8.c
drivers/usb/serial/cypress_m8.h
drivers/usb/serial/ftdi_sio.c
drivers/usb/serial/ftdi_sio.h
drivers/usb/serial/option.c [new file with mode: 0644]
drivers/usb/serial/usb-serial.c
drivers/usb/storage/scsiglue.c
drivers/usb/storage/unusual_devs.h
drivers/video/Kconfig
drivers/video/Makefile
drivers/video/arcfb.c [new file with mode: 0644]
drivers/video/aty/radeon_base.c
drivers/video/chipsfb.c
drivers/video/console/Kconfig
drivers/video/console/Makefile
drivers/video/console/bitblit.c
drivers/video/console/font_10x18.c [new file with mode: 0644]
drivers/video/console/font_7x14.c [new file with mode: 0644]
drivers/video/console/font_sun12x22.c
drivers/video/console/fonts.c
drivers/video/console/vgacon.c
drivers/video/fbmem.c
drivers/video/fbsysfs.c
drivers/video/gbefb.c
drivers/video/i810/i810_main.c
drivers/video/intelfb/intelfbdrv.c
drivers/video/macmodes.c
drivers/video/nvidia/nvidia.c
drivers/video/pm3fb.c
drivers/video/riva/fbdev.c
drivers/video/s1d13xxxfb.c
drivers/video/savage/savagefb_driver.c
drivers/video/softcursor.c
drivers/video/vesafb.c
drivers/video/w100fb.c
drivers/w1/w1.c
drivers/w1/w1_family.h
drivers/w1/w1_smem.c
drivers/w1/w1_therm.c
drivers/zorro/zorro-sysfs.c
fs/Kconfig
fs/autofs4/autofs_i.h
fs/autofs4/expire.c
fs/autofs4/root.c
fs/autofs4/waitq.c
fs/binfmt_aout.c
fs/binfmt_elf.c
fs/binfmt_flat.c
fs/buffer.c
fs/cifs/CHANGES
fs/cifs/README
fs/cifs/cifsfs.h
fs/cifs/cifsproto.h
fs/cifs/cifssmb.c
fs/cifs/dir.c
fs/cifs/file.c
fs/cifs/inode.c
fs/cifs/misc.c
fs/coda/psdev.c
fs/debugfs/file.c
fs/exec.c
fs/ext3/super.c
fs/hostfs/hostfs_kern.c
fs/hugetlbfs/inode.c
fs/isofs/dir.c
fs/isofs/inode.c
fs/isofs/isofs.h
fs/isofs/namei.c
fs/isofs/rock.c
fs/isofs/rock.h
fs/jbd/checkpoint.c
fs/jfs/acl.c
fs/jfs/file.c
fs/jfs/inode.c
fs/jfs/jfs_debug.c
fs/jfs/jfs_debug.h
fs/jfs/jfs_dmap.c
fs/jfs/jfs_dtree.c
fs/jfs/jfs_extent.c
fs/jfs/jfs_imap.c
fs/jfs/jfs_inode.c
fs/jfs/jfs_inode.h
fs/jfs/jfs_logmgr.c
fs/jfs/jfs_logmgr.h
fs/jfs/jfs_metapage.c
fs/jfs/jfs_metapage.h
fs/jfs/jfs_superblock.h
fs/jfs/jfs_txnmgr.c
fs/jfs/jfs_txnmgr.h
fs/jfs/namei.c
fs/jfs/super.c
fs/jfs/symlink.c
fs/jfs/xattr.c
fs/libfs.c
fs/mpage.c
fs/namei.c
fs/nfs/dir.c
fs/nfs/file.c
fs/proc/mmu.c
fs/proc/proc_devtree.c
fs/proc/proc_misc.c
fs/reiserfs/stree.c
fs/reiserfs/super.c
fs/super.c
fs/sysfs/bin.c
fs/sysfs/dir.c
fs/sysfs/file.c
fs/sysfs/inode.c
fs/sysfs/mount.c
fs/sysfs/symlink.c
fs/sysfs/sysfs.h
fs/udf/udftime.c
fs/xfs/linux-2.6/xfs_aops.c
fs/xfs/linux-2.6/xfs_buf.c
fs/xfs/linux-2.6/xfs_buf.h
fs/xfs/linux-2.6/xfs_file.c
fs/xfs/linux-2.6/xfs_ioctl.c
fs/xfs/linux-2.6/xfs_ioctl32.c
fs/xfs/linux-2.6/xfs_ioctl32.h
fs/xfs/linux-2.6/xfs_linux.h
fs/xfs/linux-2.6/xfs_lrw.c
fs/xfs/linux-2.6/xfs_lrw.h
fs/xfs/linux-2.6/xfs_super.c
fs/xfs/linux-2.6/xfs_vfs.h
fs/xfs/linux-2.6/xfs_vnode.c
fs/xfs/linux-2.6/xfs_vnode.h
fs/xfs/quota/xfs_dquot.c
fs/xfs/quota/xfs_dquot.h
fs/xfs/quota/xfs_dquot_item.c
fs/xfs/quota/xfs_qm.c
fs/xfs/quota/xfs_qm.h
fs/xfs/quota/xfs_qm_bhv.c
fs/xfs/quota/xfs_qm_syscalls.c
fs/xfs/quota/xfs_quota_priv.h
fs/xfs/quota/xfs_trans_dquot.c
fs/xfs/support/debug.c
fs/xfs/support/debug.h
fs/xfs/xfs_alloc.c
fs/xfs/xfs_attr.c
fs/xfs/xfs_attr.h
fs/xfs/xfs_attr_leaf.c
fs/xfs/xfs_attr_leaf.h
fs/xfs/xfs_bit.c
fs/xfs/xfs_bmap.c
fs/xfs/xfs_bmap.h
fs/xfs/xfs_bmap_btree.c
fs/xfs/xfs_bmap_btree.h
fs/xfs/xfs_btree.c
fs/xfs/xfs_btree.h
fs/xfs/xfs_buf_item.c
fs/xfs/xfs_buf_item.h
fs/xfs/xfs_da_btree.c
fs/xfs/xfs_da_btree.h
fs/xfs/xfs_dfrag.c
fs/xfs/xfs_dir2_data.c
fs/xfs/xfs_dir2_data.h
fs/xfs/xfs_dir2_leaf.c
fs/xfs/xfs_dir2_leaf.h
fs/xfs/xfs_dir_leaf.c
fs/xfs/xfs_dir_leaf.h
fs/xfs/xfs_dmapi.h
fs/xfs/xfs_error.c
fs/xfs/xfs_error.h
fs/xfs/xfs_extfree_item.c
fs/xfs/xfs_extfree_item.h
fs/xfs/xfs_fs.h
fs/xfs/xfs_fsops.c
fs/xfs/xfs_ialloc_btree.h
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode.h
fs/xfs/xfs_inode_item.c
fs/xfs/xfs_iomap.c
fs/xfs/xfs_log.c
fs/xfs/xfs_log_priv.h
fs/xfs/xfs_log_recover.c
fs/xfs/xfs_macros.c
fs/xfs/xfs_mount.c
fs/xfs/xfs_mount.h
fs/xfs/xfs_quota.h
fs/xfs/xfs_rename.c
fs/xfs/xfs_trans.c
fs/xfs/xfs_trans.h
fs/xfs/xfs_trans_buf.c
fs/xfs/xfs_trans_inode.c
fs/xfs/xfs_types.h
fs/xfs/xfs_utils.c
fs/xfs/xfs_vfsops.c
fs/xfs/xfs_vnodeops.c
include/asm-alpha/agp.h
include/asm-alpha/smp.h
include/asm-arm/arch-aaec2000/aaec2000.h [new file with mode: 0644]
include/asm-arm/arch-aaec2000/debug-macro.S [new file with mode: 0644]
include/asm-arm/arch-aaec2000/dma.h [new file with mode: 0644]
include/asm-arm/arch-aaec2000/entry-macro.S [new file with mode: 0644]
include/asm-arm/arch-aaec2000/hardware.h [new file with mode: 0644]
include/asm-arm/arch-aaec2000/io.h [new file with mode: 0644]
include/asm-arm/arch-aaec2000/irqs.h [new file with mode: 0644]
include/asm-arm/arch-aaec2000/memory.h [new file with mode: 0644]
include/asm-arm/arch-aaec2000/param.h [new file with mode: 0644]
include/asm-arm/arch-aaec2000/system.h [new file with mode: 0644]
include/asm-arm/arch-aaec2000/timex.h [new file with mode: 0644]
include/asm-arm/arch-aaec2000/uncompress.h [new file with mode: 0644]
include/asm-arm/arch-aaec2000/vmalloc.h [new file with mode: 0644]
include/asm-arm/arch-imx/imx-regs.h
include/asm-arm/arch-integrator/platform.h
include/asm-arm/arch-integrator/smp.h [new file with mode: 0644]
include/asm-arm/arch-ixp2000/io.h
include/asm-arm/arch-ixp2000/ixp2000-regs.h
include/asm-arm/arch-pxa/pxa-regs.h
include/asm-arm/arch-s3c2410/regs-nand.h
include/asm-arm/arch-versatile/hardware.h
include/asm-arm/arch-versatile/io.h
include/asm-arm/arch-versatile/platform.h
include/asm-arm/cacheflush.h
include/asm-arm/elf.h
include/asm-arm/io.h
include/asm-arm/page.h
include/asm-arm/smp.h
include/asm-arm/system.h
include/asm-arm26/elf.h
include/asm-arm26/signal.h
include/asm-generic/pgtable.h
include/asm-h8300/kmap_types.h
include/asm-h8300/mman.h
include/asm-i386/agp.h
include/asm-i386/linkage.h
include/asm-i386/mach-numaq/mach_ipi.h
include/asm-i386/page.h
include/asm-i386/pgtable.h
include/asm-i386/smp.h
include/asm-i386/timer.h
include/asm-i386/unistd.h
include/asm-ia64/agp.h
include/asm-ia64/ioctl32.h [deleted file]
include/asm-ia64/mmzone.h
include/asm-ia64/perfmon.h
include/asm-ia64/pgtable.h
include/asm-ia64/processor.h
include/asm-ia64/smp.h
include/asm-ia64/sn/mspec.h [new file with mode: 0644]
include/asm-ia64/sn/sn_sal.h
include/asm-ia64/uncached.h [new file with mode: 0644]
include/asm-ia64/unistd.h
include/asm-m32r/div64.h
include/asm-m32r/ide.h
include/asm-m32r/m32102.h
include/asm-m32r/m32102peri.h [deleted file]
include/asm-m32r/m32r.h
include/asm-m32r/mappi3/mappi3_pld.h [new file with mode: 0644]
include/asm-m32r/smp.h
include/asm-mips/smp.h
include/asm-mips/vr41xx/giu.h [new file with mode: 0644]
include/asm-mips/vr41xx/vr41xx.h
include/asm-parisc/smp.h
include/asm-ppc/agp.h
include/asm-ppc/cpm2.h
include/asm-ppc/irq.h
include/asm-ppc/m8260_pci.h
include/asm-ppc/mpc10x.h
include/asm-ppc/mpc8260.h
include/asm-ppc/mpc85xx.h
include/asm-ppc/ocp.h
include/asm-ppc/pgtable.h
include/asm-ppc/ppc_sys.h
include/asm-ppc/seccomp.h [new file with mode: 0644]
include/asm-ppc/sigcontext.h
include/asm-ppc/smp.h
include/asm-ppc/thread_info.h
include/asm-ppc64/agp.h
include/asm-ppc64/dma.h
include/asm-ppc64/elf.h
include/asm-ppc64/iSeries/HvCall.h
include/asm-ppc64/iSeries/HvCallCfg.h [deleted file]
include/asm-ppc64/iSeries/HvCallEvent.h
include/asm-ppc64/iSeries/HvCallHpt.h
include/asm-ppc64/iSeries/HvCallPci.h
include/asm-ppc64/iSeries/HvCallSc.h
include/asm-ppc64/iSeries/HvCallSm.h
include/asm-ppc64/iSeries/HvCallXm.h
include/asm-ppc64/iSeries/HvLpConfig.h
include/asm-ppc64/iSeries/HvLpEvent.h
include/asm-ppc64/iSeries/HvReleaseData.h
include/asm-ppc64/iSeries/HvTypes.h
include/asm-ppc64/iSeries/IoHriMainStore.h
include/asm-ppc64/iSeries/IoHriProcessorVpd.h
include/asm-ppc64/iSeries/ItExtVpdPanel.h
include/asm-ppc64/iSeries/ItIplParmsReal.h
include/asm-ppc64/iSeries/ItLpNaca.h
include/asm-ppc64/iSeries/ItLpQueue.h
include/asm-ppc64/iSeries/ItLpRegSave.h
include/asm-ppc64/iSeries/ItSpCommArea.h
include/asm-ppc64/iSeries/ItVpdAreas.h
include/asm-ppc64/iSeries/LparData.h [deleted file]
include/asm-ppc64/iSeries/LparMap.h
include/asm-ppc64/iSeries/XmPciLpEvent.h [deleted file]
include/asm-ppc64/iSeries/iSeries_io.h
include/asm-ppc64/iSeries/iSeries_irq.h
include/asm-ppc64/iSeries/iSeries_pci.h
include/asm-ppc64/iSeries/iSeries_proc.h [deleted file]
include/asm-ppc64/iSeries/mf.h
include/asm-ppc64/iSeries/vio.h
include/asm-ppc64/imalloc.h
include/asm-ppc64/iommu.h
include/asm-ppc64/paca.h
include/asm-ppc64/page.h
include/asm-ppc64/pgtable.h
include/asm-ppc64/processor.h
include/asm-ppc64/prom.h
include/asm-ppc64/smp.h
include/asm-ppc64/thread_info.h
include/asm-s390/smp.h
include/asm-s390/user.h
include/asm-sh/page.h
include/asm-sh/pgtable.h
include/asm-sh/smp.h
include/asm-sh/thread_info.h
include/asm-sh64/page.h
include/asm-sh64/pgtable.h
include/asm-sh64/thread_info.h
include/asm-sparc/smp.h
include/asm-sparc/uaccess.h
include/asm-sparc64/agp.h
include/asm-sparc64/iommu.h
include/asm-sparc64/page.h
include/asm-sparc64/pbm.h
include/asm-sparc64/pgtable.h
include/asm-sparc64/processor.h
include/asm-sparc64/smp.h
include/asm-sparc64/spitfire.h
include/asm-um/arch-signal-i386.h [deleted file]
include/asm-um/elf-i386.h
include/asm-um/elf-x86_64.h
include/asm-um/elf.h [deleted file]
include/asm-um/page.h
include/asm-um/pgtable.h
include/asm-um/smp.h
include/asm-um/thread_info.h
include/asm-x86_64/a.out.h
include/asm-x86_64/agp.h
include/asm-x86_64/apicdef.h
include/asm-x86_64/bug.h
include/asm-x86_64/io_apic.h
include/asm-x86_64/ioctl32.h [deleted file]
include/asm-x86_64/nmi.h
include/asm-x86_64/page.h
include/asm-x86_64/pgtable.h
include/asm-x86_64/processor.h
include/asm-x86_64/proto.h
include/asm-x86_64/smp.h
include/asm-x86_64/vsyscall.h
include/linux/acpi.h
include/linux/arcfb.h [new file with mode: 0644]
include/linux/ata.h
include/linux/atalk.h
include/linux/audit.h
include/linux/auto_fs4.h
include/linux/blkdev.h
include/linux/chio.h [new file with mode: 0644]
include/linux/cpufreq.h
include/linux/device.h
include/linux/dm9000.h [new file with mode: 0644]
include/linux/dma-mapping.h
include/linux/err.h
include/linux/etherdevice.h
include/linux/ethtool.h
include/linux/fb.h
include/linux/font.h
include/linux/fs.h
include/linux/fsl_devices.h
include/linux/gameport.h
include/linux/genalloc.h [new file with mode: 0644]
include/linux/gfp.h
include/linux/hardirq.h
include/linux/hdlc.h
include/linux/hugetlb.h
include/linux/i2c-sysfs.h [new file with mode: 0644]
include/linux/ide.h
include/linux/if.h
include/linux/if_shaper.h
include/linux/if_tr.h
include/linux/inetdevice.h
include/linux/input.h
include/linux/ioc4.h [new file with mode: 0644]
include/linux/ioc4_common.h [deleted file]
include/linux/ip.h
include/linux/ipv6.h
include/linux/irq.h
include/linux/klist.h [new file with mode: 0644]
include/linux/kobject.h
include/linux/libata.h
include/linux/major.h
include/linux/mii.h
include/linux/mm.h
include/linux/mmc/protocol.h
include/linux/mmzone.h
include/linux/net.h
include/linux/netdevice.h
include/linux/netfilter_ipv4.h
include/linux/netfilter_ipv4/ip_conntrack_core.h
include/linux/netfilter_ipv4/ip_nat.h
include/linux/netfilter_ipv4/listhelp.h
include/linux/netfilter_ipv4/lockhelp.h [deleted file]
include/linux/netlink.h
include/linux/node.h
include/linux/notifier.h
include/linux/page-flags.h
include/linux/pagemap.h
include/linux/pci_ids.h
include/linux/pfkeyv2.h
include/linux/pkt_sched.h
include/linux/raid/bitmap.h [new file with mode: 0644]
include/linux/raid/md.h
include/linux/raid/md_k.h
include/linux/raid/md_p.h
include/linux/raid/md_u.h
include/linux/raid/raid1.h
include/linux/rtnetlink.h
include/linux/sched.h
include/linux/serial_core.h
include/linux/signal.h
include/linux/skbuff.h
include/linux/slab.h
include/linux/smp.h
include/linux/spinlock.h
include/linux/swap.h
include/linux/sysctl.h
include/linux/sysfs.h
include/linux/tc_ematch/tc_em_meta.h
include/linux/tcp.h
include/linux/usb.h
include/linux/vmalloc.h
include/linux/wait.h
include/linux/wireless.h
include/linux/xfrm.h
include/media/video-buf-dvb.h
include/net/act_generic.h
include/net/ax25.h
include/net/ip.h
include/net/ip6_fib.h
include/net/ip6_route.h
include/net/ip_fib.h
include/net/neighbour.h
include/net/request_sock.h [new file with mode: 0644]
include/net/route.h
include/net/sch_generic.h
include/net/sctp/command.h
include/net/sctp/constants.h
include/net/sctp/sctp.h
include/net/sctp/sm.h
include/net/sctp/structs.h
include/net/sctp/user.h
include/net/snmp.h
include/net/sock.h
include/net/tcp.h
include/net/tcp_ecn.h
include/net/xfrm.h
include/scsi/scsi.h
include/scsi/scsi_device.h
include/scsi/scsi_host.h
include/scsi/scsi_transport.h
include/scsi/scsi_transport_spi.h
init/Kconfig
init/main.c
kernel/audit.c
kernel/auditsc.c
kernel/cpuset.c
kernel/exit.c
kernel/fork.c
kernel/irq/handle.c
kernel/irq/manage.c
kernel/module.c
kernel/params.c
kernel/posix-timers.c
kernel/power/main.c
kernel/power/smp.c
kernel/printk.c
kernel/profile.c
kernel/sched.c
kernel/signal.c
kernel/spinlock.c
kernel/stop_machine.c
kernel/sys_ni.c
lib/Kconfig
lib/Kconfig.debug
lib/Makefile
lib/genalloc.c [new file with mode: 0644]
lib/idr.c
lib/kernel_lock.c
lib/klist.c [new file with mode: 0644]
lib/kobject.c
lib/kobject_uevent.c
lib/smp_processor_id.c [new file with mode: 0644]
mm/filemap.c
mm/hugetlb.c
mm/madvise.c
mm/memory.c
mm/mempolicy.c
mm/mmap.c
mm/mremap.c
mm/msync.c
mm/nommu.c
mm/oom_kill.c
mm/page_alloc.c
mm/rmap.c
mm/shmem.c
mm/slab.c
mm/swapfile.c
mm/vmalloc.c
mm/vmscan.c
net/802/tr.c
net/appletalk/aarp.c
net/appletalk/ddp.c
net/bridge/br_device.c
net/bridge/br_forward.c
net/bridge/br_if.c
net/bridge/br_input.c
net/bridge/br_netfilter.c
net/bridge/br_notify.c
net/bridge/br_private.h
net/bridge/br_stp_bpdu.c
net/core/Makefile
net/core/dev.c
net/core/ethtool.c
net/core/neighbour.c
net/core/net-sysfs.c
net/core/netfilter.c
net/core/request_sock.c [new file with mode: 0644]
net/core/rtnetlink.c
net/core/skbuff.c
net/core/sock.c
net/core/wireless.c
net/decnet/dn_dev.c
net/decnet/dn_neigh.c
net/decnet/dn_route.c
net/decnet/dn_rules.c
net/decnet/dn_table.c
net/ipv4/Kconfig
net/ipv4/Makefile
net/ipv4/af_inet.c
net/ipv4/ah4.c
net/ipv4/devinet.c
net/ipv4/esp4.c
net/ipv4/fib_frontend.c
net/ipv4/fib_hash.c
net/ipv4/fib_lookup.h
net/ipv4/fib_rules.c
net/ipv4/fib_semantics.c
net/ipv4/fib_trie.c [new file with mode: 0644]
net/ipv4/icmp.c
net/ipv4/ip_input.c
net/ipv4/ip_output.c
net/ipv4/ip_sockglue.c
net/ipv4/ipcomp.c
net/ipv4/ipmr.c
net/ipv4/ipvs/Makefile
net/ipv4/ipvs/ip_vs_proto.c
net/ipv4/ipvs/ip_vs_proto_icmp.c [deleted file]
net/ipv4/ipvs/ip_vs_xmit.c
net/ipv4/multipath_drr.c
net/ipv4/multipath_random.c
net/ipv4/multipath_rr.c
net/ipv4/multipath_wrandom.c
net/ipv4/netfilter/arp_tables.c
net/ipv4/netfilter/ip_conntrack_amanda.c
net/ipv4/netfilter/ip_conntrack_core.c
net/ipv4/netfilter/ip_conntrack_ftp.c
net/ipv4/netfilter/ip_conntrack_irc.c
net/ipv4/netfilter/ip_conntrack_proto_sctp.c
net/ipv4/netfilter/ip_conntrack_proto_tcp.c
net/ipv4/netfilter/ip_conntrack_proto_udp.c
net/ipv4/netfilter/ip_conntrack_standalone.c
net/ipv4/netfilter/ip_nat_core.c
net/ipv4/netfilter/ip_nat_helper.c
net/ipv4/netfilter/ip_nat_rule.c
net/ipv4/netfilter/ip_nat_standalone.c
net/ipv4/netfilter/ip_queue.c
net/ipv4/netfilter/ip_tables.c
net/ipv4/netfilter/ipt_CLUSTERIP.c
net/ipv4/netfilter/ipt_MASQUERADE.c
net/ipv4/netfilter/ipt_REJECT.c
net/ipv4/netfilter/ipt_ULOG.c
net/ipv4/netfilter/ipt_hashlimit.c
net/ipv4/netfilter/ipt_helper.c
net/ipv4/netfilter/ipt_recent.c
net/ipv4/raw.c
net/ipv4/route.c
net/ipv4/syncookies.c
net/ipv4/sysctl_net_ipv4.c
net/ipv4/tcp.c
net/ipv4/tcp_diag.c
net/ipv4/tcp_input.c
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_minisocks.c
net/ipv4/tcp_output.c
net/ipv4/tcp_timer.c
net/ipv4/udp.c
net/ipv4/xfrm4_output.c
net/ipv4/xfrm4_state.c
net/ipv4/xfrm4_tunnel.c
net/ipv6/addrconf.c
net/ipv6/ah6.c
net/ipv6/anycast.c
net/ipv6/datagram.c
net/ipv6/esp6.c
net/ipv6/icmp.c
net/ipv6/ip6_fib.c
net/ipv6/ip6_flowlabel.c
net/ipv6/ip6_output.c
net/ipv6/ip6_tunnel.c
net/ipv6/ipcomp6.c
net/ipv6/ipv6_sockglue.c
net/ipv6/ipv6_syms.c
net/ipv6/mcast.c
net/ipv6/ndisc.c
net/ipv6/netfilter/ip6_tables.c
net/ipv6/netfilter/ip6t_LOG.c
net/ipv6/netfilter/ip6table_raw.c
net/ipv6/raw.c
net/ipv6/route.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/ipv6/xfrm6_output.c
net/ipv6/xfrm6_policy.c
net/ipv6/xfrm6_tunnel.c
net/key/af_key.c
net/netlink/af_netlink.c
net/sched/Kconfig
net/sched/act_api.c
net/sched/cls_api.c
net/sched/cls_basic.c
net/sched/em_meta.c
net/sched/sch_api.c
net/sched/sch_dsmark.c
net/sched/sch_fifo.c
net/sched/sch_generic.c
net/sched/sch_netem.c
net/sctp/associola.c
net/sctp/endpointola.c
net/sctp/input.c
net/sctp/ipv6.c
net/sctp/outqueue.c
net/sctp/proc.c
net/sctp/protocol.c
net/sctp/sm_make_chunk.c
net/sctp/sm_sideeffect.c
net/sctp/sm_statefuns.c
net/sctp/sm_statetable.c
net/sctp/socket.c
net/sctp/transport.c
net/socket.c
net/unix/af_unix.c
net/xfrm/xfrm_algo.c
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_state.c
net/xfrm/xfrm_user.c
security/seclvl.c
security/selinux/avc.c
security/selinux/hooks.c
security/selinux/nlmsgtab.c
security/selinux/ss/services.c
sound/core/sound.c
sound/oss/Kconfig
sound/oss/rme96xx.c
sound/oss/soundcard.c
sound/ppc/pmac.c
sound/sound_core.c
sound/usb/usbaudio.c
sound/usb/usx2y/usbusx2y.c

diff --git a/CREDITS b/CREDITS
index 3b9e160d6f7efe52898700a41b923df2c5581413..2993348ce6ce425cd8c9a48d266d4a8b80977a3b 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -882,13 +882,12 @@ S: Blacksburg, Virginia 24061
 S: USA
 
 N: Randy Dunlap
-E: rddunlap@osdl.org
+E: rdunlap@xenotime.net
 W: http://www.xenotime.net/linux/linux.html
 W: http://www.linux-usb.org
 D: Linux-USB subsystem, USB core/UHCI/printer/storage drivers
 D: x86 SMP, ACPI, bootflag hacking
-S: 12725 SW Millikan Way, Suite 400
-S: Beaverton, Oregon 97005
+S: (ask for current address)
 S: USA
 
 N: Bob Dunlop
@@ -1881,6 +1880,13 @@ S: Schlehenweg 9
 S: D-91080 Uttenreuth
 S: Germany
 
+N: Jaya Kumar
+E: jayalk@intworks.biz
+W: http://www.intworks.biz
+D: Arc monochrome LCD framebuffer driver, x86 reboot fixups
+S: Gurgaon, India
+S: Kuala Lumpur, Malaysia
+
 N: Gabor Kuti
 M: seasons@falcon.sch.bme.hu
 M: seasons@makosteszta.sote.hu
@@ -2476,13 +2482,9 @@ S: Potsdam, New York 13676
 S: USA
 
 N: Dave Neuer
-E: dneuer@innovation-charter.com
-E: mr_fred_smoothie@yahoo.com
+E: dave.neuer@pobox.com
 D: Helped implement support for Compaq's H31xx series iPAQs
 D: Other mostly minor tweaks & bugfixes
-S: 325 E. Main St., Suite 3
-S: Carnegie, PA 15105
-S: USA
 
 N: Michael Neuffer
 E: mike@i-Connect.Net
index e69b3d2e788436b0db1ecfb38245aeb4aeed0f60..87da3478fada4298d0b2d9c396904e2e3e7fa8f0 100644 (file)
@@ -8,7 +8,7 @@
 
 DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
            kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
-           procfs-guide.xml writing_usb_driver.xml scsidrivers.xml \
+           procfs-guide.xml writing_usb_driver.xml \
            sis900.xml kernel-api.xml journal-api.xml lsm.xml usb.xml \
            gadget.xml libata.xml mtdnand.xml librs.xml
 
index 757cef8f84918165b68a8ee67a763fb21fd342b3..bb6a0106be1100951a7b99696f9e8176bd862e7e 100644 (file)
@@ -338,7 +338,6 @@ X!Earch/i386/kernel/mca.c
 X!Iinclude/linux/device.h
 -->
 !Edrivers/base/driver.c
-!Edrivers/base/class_simple.c
 !Edrivers/base/core.c
 !Edrivers/base/firmware_class.c
 !Edrivers/base/transport_class.c
index cf2fce7707da202e7f408f40929dde7255cf742e..6df1dfd18b651fce1224fe0e127cf7e777981d34 100644 (file)
@@ -14,7 +14,7 @@
   </authorgroup>
 
   <copyright>
-   <year>2003</year>
+   <year>2003-2005</year>
    <holder>Jeff Garzik</holder>
   </copyright>
 
 
 <toc></toc>
 
-  <chapter id="libataThanks">
-     <title>Thanks</title>
+  <chapter id="libataIntroduction">
+     <title>Introduction</title>
   <para>
-  The bulk of the ATA knowledge comes thanks to long conversations with
-  Andre Hedrick (www.linux-ide.org).
+  libATA is a library used inside the Linux kernel to support ATA host
+  controllers and devices.  libATA provides an ATA driver API, class
+  transports for ATA and ATAPI devices, and SCSI&lt;-&gt;ATA translation
+  for ATA devices according to the T10 SAT specification.
   </para>
   <para>
-  Thanks to Alan Cox for pointing out similarities 
-  between SATA and SCSI, and in general for motivation to hack on
-  libata.
-  </para>
-  <para>
-  libata's device detection
-  method, ata_pio_devchk, and in general all the early probing was
-  based on extensive study of Hale Landis's probe/reset code in his
-  ATADRVR driver (www.ata-atapi.com).
+  This Guide documents the libATA driver API, library functions, library
+  internals, and a couple sample ATA low-level drivers.
   </para>
   </chapter>
 
   <chapter id="libataDriverApi">
      <title>libata Driver API</title>
+     <para>
+     struct ata_port_operations is defined for every low-level libata
+     hardware driver, and it controls how the low-level driver
+     interfaces with the ATA and SCSI layers.
+     </para>
+     <para>
+     FIS-based drivers will hook into the system with ->qc_prep() and
+     ->qc_issue() high-level hooks.  Hardware which behaves in a manner
+     similar to PCI IDE hardware may utilize several generic helpers,
+     defining at a bare minimum the bus I/O addresses of the ATA shadow
+     register blocks.
+     </para>
      <sect1>
         <title>struct ata_port_operations</title>
 
+       <sect2><title>Disable ATA port</title>
        <programlisting>
 void (*port_disable) (struct ata_port *);
        </programlisting>
@@ -78,6 +86,9 @@ void (*port_disable) (struct ata_port *);
        unplug).
        </para>
 
+       </sect2>
+
+       <sect2><title>Post-IDENTIFY device configuration</title>
        <programlisting>
 void (*dev_config) (struct ata_port *, struct ata_device *);
        </programlisting>
@@ -88,6 +99,9 @@ void (*dev_config) (struct ata_port *, struct ata_device *);
        issue of SET FEATURES - XFER MODE, and prior to operation.
        </para>
 
+       </sect2>
+
+       <sect2><title>Set PIO/DMA mode</title>
        <programlisting>
 void (*set_piomode) (struct ata_port *, struct ata_device *);
 void (*set_dmamode) (struct ata_port *, struct ata_device *);
@@ -108,6 +122,9 @@ void (*post_set_mode) (struct ata_port *ap);
        ->set_dma_mode() is only called if DMA is possible.
        </para>
 
+       </sect2>
+
+       <sect2><title>Taskfile read/write</title>
        <programlisting>
 void (*tf_load) (struct ata_port *ap, struct ata_taskfile *tf);
 void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf);
@@ -120,6 +137,9 @@ void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf);
        taskfile register values.
        </para>
 
+       </sect2>
+
+       <sect2><title>ATA command execute</title>
        <programlisting>
 void (*exec_command)(struct ata_port *ap, struct ata_taskfile *tf);
        </programlisting>
@@ -129,17 +149,37 @@ void (*exec_command)(struct ata_port *ap, struct ata_taskfile *tf);
        ->tf_load(), to be initiated in hardware.
        </para>
 
+       </sect2>
+
+       <sect2><title>Per-cmd ATAPI DMA capabilities filter</title>
+       <programlisting>
+int (*check_atapi_dma) (struct ata_queued_cmd *qc);
+       </programlisting>
+
+       <para>
+Allow low-level driver to filter ATA PACKET commands, returning a status
+indicating whether or not it is OK to use DMA for the supplied PACKET
+command.
+       </para>
+
+       </sect2>
+
+       <sect2><title>Read specific ATA shadow registers</title>
        <programlisting>
 u8   (*check_status)(struct ata_port *ap);
-void (*dev_select)(struct ata_port *ap, unsigned int device);
+u8   (*check_altstatus)(struct ata_port *ap);
+u8   (*check_err)(struct ata_port *ap);
        </programlisting>
 
        <para>
-       Reads the Status ATA shadow register from hardware.  On some
-       hardware, this has the side effect of clearing the interrupt
-       condition.
+       Reads the Status/AltStatus/Error ATA shadow register from
+       hardware.  On some hardware, reading the Status register has
+       the side effect of clearing the interrupt condition.
        </para>
 
+       </sect2>
+
+       <sect2><title>Select ATA device on bus</title>
        <programlisting>
 void (*dev_select)(struct ata_port *ap, unsigned int device);
        </programlisting>
@@ -147,9 +187,13 @@ void (*dev_select)(struct ata_port *ap, unsigned int device);
        <para>
        Issues the low-level hardware command(s) that causes one of N
        hardware devices to be considered 'selected' (active and
-       available for use) on the ATA bus.
+       available for use) on the ATA bus.  This generally has no
+meaning on FIS-based devices.
        </para>
 
+       </sect2>
+
+       <sect2><title>Reset ATA bus</title>
        <programlisting>
 void (*phy_reset) (struct ata_port *ap);
        </programlisting>
@@ -162,17 +206,31 @@ void (*phy_reset) (struct ata_port *ap);
        functions ata_bus_reset() or sata_phy_reset() for this hook.
        </para>
 
+       </sect2>
+
+       <sect2><title>Control PCI IDE BMDMA engine</title>
        <programlisting>
 void (*bmdma_setup) (struct ata_queued_cmd *qc);
 void (*bmdma_start) (struct ata_queued_cmd *qc);
+void (*bmdma_stop) (struct ata_port *ap);
+u8   (*bmdma_status) (struct ata_port *ap);
        </programlisting>
 
        <para>
-       When setting up an IDE BMDMA transaction, these hooks arm
-       (->bmdma_setup) and fire (->bmdma_start) the hardware's DMA
-       engine.
+When setting up an IDE BMDMA transaction, these hooks arm
+(->bmdma_setup), fire (->bmdma_start), and halt (->bmdma_stop)
+the hardware's DMA engine.  ->bmdma_status is used to read the standard
+PCI IDE DMA Status register.
        </para>
 
+       <para>
+These hooks are typically either no-ops, or simply not implemented, in
+FIS-based drivers.
+       </para>
+
+       </sect2>
+
+       <sect2><title>High-level taskfile hooks</title>
        <programlisting>
 void (*qc_prep) (struct ata_queued_cmd *qc);
 int (*qc_issue) (struct ata_queued_cmd *qc);
@@ -190,20 +248,26 @@ int (*qc_issue) (struct ata_queued_cmd *qc);
        ->qc_issue is used to make a command active, once the hardware
        and S/G tables have been prepared.  IDE BMDMA drivers use the
        helper function ata_qc_issue_prot() for taskfile protocol-based
-       dispatch.  More advanced drivers roll their own ->qc_issue
-       implementation, using this as the "issue new ATA command to
-       hardware" hook.
+       dispatch.  More advanced drivers implement their own ->qc_issue.
        </para>
 
+       </sect2>
+
+       <sect2><title>Timeout (error) handling</title>
        <programlisting>
 void (*eng_timeout) (struct ata_port *ap);
        </programlisting>
 
        <para>
-       This is a high level error handling function, called from the
-       error handling thread, when a command times out.
+This is a high level error handling function, called from the
+error handling thread, when a command times out.  Most newer
+hardware will implement its own error handling code here.  IDE BMDMA
+drivers may use the helper function ata_eng_timeout().
        </para>
 
+       </sect2>
+
+       <sect2><title>Hardware interrupt handling</title>
        <programlisting>
 irqreturn_t (*irq_handler)(int, void *, struct pt_regs *);
 void (*irq_clear) (struct ata_port *);
@@ -216,6 +280,9 @@ void (*irq_clear) (struct ata_port *);
        is quiet.
        </para>
 
+       </sect2>
+
+       <sect2><title>SATA phy read/write</title>
        <programlisting>
 u32 (*scr_read) (struct ata_port *ap, unsigned int sc_reg);
 void (*scr_write) (struct ata_port *ap, unsigned int sc_reg,
@@ -227,6 +294,9 @@ void (*scr_write) (struct ata_port *ap, unsigned int sc_reg,
        if ->phy_reset hook called the sata_phy_reset() helper function.
        </para>
 
+       </sect2>
+
+       <sect2><title>Init and shutdown</title>
        <programlisting>
 int (*port_start) (struct ata_port *ap);
 void (*port_stop) (struct ata_port *ap);
@@ -240,15 +310,17 @@ void (*host_stop) (struct ata_host_set *host_set);
        tasks.  
        </para>
        <para>
-       ->host_stop() is called when the rmmod or hot unplug process
-       begins.  The hook must stop all hardware interrupts, DMA
-       engines, etc.
-       </para>
-       <para>
        ->port_stop() is called after ->host_stop().  It's sole function
        is to release DMA/memory resources, now that they are no longer
        actively being used.
        </para>
+       <para>
+       ->host_stop() is called after all ->port_stop() calls
+have completed.  The hook must finalize hardware shutdown, release DMA
+and other resources, etc.
+       </para>
+
+       </sect2>
 
      </sect1>
   </chapter>
@@ -279,4 +351,24 @@ void (*host_stop) (struct ata_host_set *host_set);
 !Idrivers/scsi/sata_sil.c
   </chapter>
 
+  <chapter id="libataThanks">
+     <title>Thanks</title>
+  <para>
+  The bulk of the ATA knowledge comes thanks to long conversations with
+  Andre Hedrick (www.linux-ide.org), and long hours pondering the ATA
+  and SCSI specifications.
+  </para>
+  <para>
+  Thanks to Alan Cox for pointing out similarities 
+  between SATA and SCSI, and in general for motivation to hack on
+  libata.
+  </para>
+  <para>
+  libata's device detection
+  method, ata_pio_devchk, and in general all the early probing was
+  based on extensive study of Hale Landis's probe/reset code in his
+  ATADRVR driver (www.ata-atapi.com).
+  </para>
+  </chapter>
+
 </book>
diff --git a/Documentation/DocBook/scsidrivers.tmpl b/Documentation/DocBook/scsidrivers.tmpl
deleted file mode 100644 (file)
index d058e65..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
-       "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
-
-<book id="scsidrivers">
- <bookinfo>
-  <title>SCSI Subsystem Interfaces</title>
-  
-  <authorgroup>
-   <author>
-    <firstname>Douglas</firstname>
-    <surname>Gilbert</surname>
-    <affiliation>
-     <address>
-      <email>dgilbert@interlog.com</email>
-     </address>
-    </affiliation>
-   </author>
-  </authorgroup>
-  <pubdate>2003-08-11</pubdate>
-
-  <copyright>
-   <year>2002</year>
-   <year>2003</year>
-   <holder>Douglas Gilbert</holder>
-  </copyright>
-
-  <legalnotice>
-   <para>
-     This documentation 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.
-   </para>
-      
-   <para>
-     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.
-   </para>
-      
-   <para>
-     You should have received a copy of the GNU General Public
-     License along with this program; if not, write to the Free
-     Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-     MA 02111-1307 USA
-   </para>
-      
-   <para>
-     For more details see the file COPYING in the source
-     distribution of Linux.
-   </para>
-  </legalnotice>
-
- </bookinfo>
-
-<toc></toc>
-
-  <chapter id="intro">
-      <title>Introduction</title>
-  <para>
-This document outlines the interface between the Linux scsi mid level
-and lower level drivers. Lower level drivers are variously called HBA
-(host bus adapter) drivers, host drivers (HD) or pseudo adapter drivers.
-The latter alludes to the fact that a lower level driver may be a
-bridge to another IO subsystem (and the "ide-scsi" driver is an example
-of this). There can be many lower level drivers active in a running
-system, but only one per hardware type. For example, the aic7xxx driver
-controls adaptec controllers based on the 7xxx chip series. Most lower
-level drivers can control one or more scsi hosts (a.k.a. scsi initiators).
-  </para>
-<para>
-This document can been found in an ASCII text file in the linux kernel 
-source: <filename>Documentation/scsi/scsi_mid_low_api.txt</filename> .
-It currently hold a little more information than this document. The
-<filename>drivers/scsi/hosts.h</filename> and <filename>
-drivers/scsi/scsi.h</filename> headers contain descriptions of members
-of important structures for the scsi subsystem.
-</para>
-  </chapter>
-
-  <chapter id="driver-struct">
-      <title>Driver structure</title>
-  <para>
-Traditionally a lower level driver for the scsi subsystem has been
-at least two files in the drivers/scsi directory. For example, a
-driver called "xyz" has a header file "xyz.h" and a source file
-"xyz.c". [Actually there is no good reason why this couldn't all
-be in one file.] Some drivers that have been ported to several operating
-systems (e.g. aic7xxx which has separate  files for generic and
-OS-specific code) have more than two files. Such drivers tend to have
-their own directory under the drivers/scsi directory.
-  </para>
-  <para>
-scsi_module.c is normally included at the end of a lower
-level driver. For it to work a declaration like this is needed before
-it is included:
-<programlisting>
-    static Scsi_Host_Template driver_template = DRIVER_TEMPLATE;
-    /* DRIVER_TEMPLATE should contain pointers to supported interface
-       functions. Scsi_Host_Template is defined hosts.h */
-    #include "scsi_module.c"
-</programlisting>
-  </para>
-  <para>
-The scsi_module.c assumes the name "driver_template" is appropriately
-defined. It contains 2 functions:
-<orderedlist>
-<listitem><para>
-     init_this_scsi_driver() called during builtin and module driver
-     initialization: invokes mid level's scsi_register_host()
-</para></listitem>
-<listitem><para>
-     exit_this_scsi_driver() called during closedown: invokes
-     mid level's scsi_unregister_host()
-</para></listitem>
-</orderedlist>
-  </para>
-<para>
-When a new, lower level driver is being added to Linux, the following 
-files (all found in the drivers/scsi directory) will need some attention: 
-Makefile, Config.help and Config.in . It is probably best to look at what 
-an existing lower level driver does in this regard.
-</para>
-  </chapter>
-
-  <chapter id="intfunctions">
-     <title>Interface Functions</title>
-!EDocumentation/scsi/scsi_mid_low_api.txt
-  </chapter>
-
-  <chapter id="locks">
-     <title>Locks</title>
-<para>
-Each Scsi_Host instance has a spin_lock called Scsi_Host::default_lock
-which is initialized in scsi_register() [found in hosts.c]. Within the
-same function the Scsi_Host::host_lock pointer is initialized to point
-at default_lock with the scsi_assign_lock() function. Thereafter
-lock and unlock operations performed by the mid level use the
-Scsi_Host::host_lock pointer.
-</para>
-<para>
-Lower level drivers can override the use of Scsi_Host::default_lock by
-using scsi_assign_lock(). The earliest opportunity to do this would
-be in the detect() function after it has invoked scsi_register(). It
-could be replaced by a coarser grain lock (e.g. per driver) or a
-lock of equal granularity (i.e. per host). Using finer grain locks
-(e.g. per scsi device) may be possible by juggling locks in
-queuecommand().
-</para>
-  </chapter>
-
-  <chapter id="changes">
-     <title>Changes since lk 2.4 series</title>
-<para>
-io_request_lock has been replaced by several finer grained locks. The lock
-relevant to lower level drivers is Scsi_Host::host_lock and there is one
-per scsi host.
-</para>
-<para>
-The older error handling mechanism has been removed. This means the
-lower level interface functions abort() and reset() have been removed.
-</para>
-<para>
-In the 2.4 series the scsi subsystem configuration descriptions were
-aggregated with the configuration descriptions from all other Linux
-subsystems in the Documentation/Configure.help file. In the 2.5 series,
-the scsi subsystem now has its own (much smaller) drivers/scsi/Config.help
-file.
-</para>
-  </chapter>
-
-  <chapter id="credits">
-     <title>Credits</title>
-<para>
-The following people have contributed to this document:
-<orderedlist>
-<listitem><para>
-Mike Anderson <email>andmike@us.ibm.com</email>
-</para></listitem>
-<listitem><para>
-James Bottomley <email>James.Bottomley@steeleye.com</email>
-</para></listitem>
-<listitem><para>
-Patrick Mansfield <email>patmans@us.ibm.com</email>
-</para></listitem>
-</orderedlist>
-</para>
-  </chapter>
-
-</book>
index 9838d32b2fe70ac6cff1f1b6cd03785af00cab3b..4d35562b1cf976d7f63f7f555440686e44ae5db4 100644 (file)
@@ -271,7 +271,7 @@ patch, which certifies that you wrote it or otherwise have the right to
 pass it on as a open-source patch.  The rules are pretty simple: if you
 can certify the below:
 
-        Developer's Certificate of Origin 1.0
+        Developer's Certificate of Origin 1.1
 
         By making a contribution to this project, I certify that:
 
@@ -291,6 +291,12 @@ can certify the below:
             person who certified (a), (b) or (c) and I have not modified
             it.
 
+       (d) I understand and agree that this project and the contribution
+           are public and that a record of the contribution (including all
+           personal information I submit with it, including my sign-off) is
+           maintained indefinitely and may be redistributed consistent with
+           this project or the open source license(s) involved.
+
 then you just add a line saying
 
        Signed-off-by: Random J Developer <random@developer.org>
diff --git a/Documentation/cpu-freq/cpufreq-stats.txt b/Documentation/cpu-freq/cpufreq-stats.txt
new file mode 100644 (file)
index 0000000..e2d1e76
--- /dev/null
@@ -0,0 +1,128 @@
+
+     CPU frequency and voltage scaling statictics in the Linux(TM) kernel
+
+
+             L i n u x    c p u f r e q - s t a t s   d r i v e r
+
+                       - information for users -
+
+
+             Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
+
+Contents
+1. Introduction
+2. Statistics Provided (with example)
+3. Configuring cpufreq-stats
+
+
+1. Introduction
+
+cpufreq-stats is a driver that provices CPU frequency statistics for each CPU.
+This statistics is provided in /sysfs as a bunch of read_only interfaces. This
+interface (when configured) will appear in a seperate directory under cpufreq
+in /sysfs (<sysfs root>/devices/system/cpu/cpuX/cpufreq/stats/) for each CPU.
+Various statistics will form read_only files under this directory.
+
+This driver is designed to be independent of any particular cpufreq_driver
+that may be running on your CPU. So, it will work with any cpufreq_driver.
+
+
+2. Statistics Provided (with example)
+
+cpufreq stats provides following statistics (explained in detail below).
+-  time_in_state
+-  total_trans
+-  trans_table
+
+All the statistics will be from the time the stats driver has been inserted 
+to the time when a read of a particular statistic is done. Obviously, stats 
+driver will not have any information about the the frequcny transitions before
+the stats driver insertion.
+
+--------------------------------------------------------------------------------
+<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # ls -l
+total 0
+drwxr-xr-x  2 root root    0 May 14 16:06 .
+drwxr-xr-x  3 root root    0 May 14 15:58 ..
+-r--r--r--  1 root root 4096 May 14 16:06 time_in_state
+-r--r--r--  1 root root 4096 May 14 16:06 total_trans
+-r--r--r--  1 root root 4096 May 14 16:06 trans_table
+--------------------------------------------------------------------------------
+
+-  time_in_state
+This gives the amount of time spent in each of the frequencies supported by
+this CPU. The cat output will have "<frequency> <time>" pair in each line, which
+will mean this CPU spent <time> usertime units of time at <frequency>. Output
+will have one line for each of the supported freuencies. usertime units here 
+is 10mS (similar to other time exported in /proc).
+
+--------------------------------------------------------------------------------
+<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat time_in_state 
+3600000 2089
+3400000 136
+3200000 34
+3000000 67
+2800000 172488
+--------------------------------------------------------------------------------
+
+
+-  total_trans
+This gives the total number of frequency transitions on this CPU. The cat 
+output will have a single count which is the total number of frequency
+transitions.
+
+--------------------------------------------------------------------------------
+<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat total_trans
+20
+--------------------------------------------------------------------------------
+
+-  trans_table
+This will give a fine grained information about all the CPU frequency
+transitions. The cat output here is a two dimensional matrix, where an entry
+<i,j> (row i, column j) represents the count of number of transitions from 
+Freq_i to Freq_j. Freq_i is in descending order with increasing rows and 
+Freq_j is in descending order with increasing columns. The output here also 
+contains the actual freq values for each row and column for better readability.
+
+--------------------------------------------------------------------------------
+<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat trans_table
+   From  :    To
+         :   3600000   3400000   3200000   3000000   2800000 
+  3600000:         0         5         0         0         0 
+  3400000:         4         0         2         0         0 
+  3200000:         0         1         0         2         0 
+  3000000:         0         0         1         0         3 
+  2800000:         0         0         0         2         0 
+--------------------------------------------------------------------------------
+
+
+3. Configuring cpufreq-stats
+
+To configure cpufreq-stats in your kernel
+Config Main Menu
+       Power management options (ACPI, APM)  --->
+               CPU Frequency scaling  --->
+                       [*] CPU Frequency scaling
+                       <*>   CPU frequency translation statistics 
+                       [*]     CPU frequency translation statistics details
+
+
+"CPU Frequency scaling" (CONFIG_CPU_FREQ) should be enabled to configure
+cpufreq-stats.
+
+"CPU frequency translation statistics" (CONFIG_CPU_FREQ_STAT) provides the
+basic statistics which includes time_in_state and total_trans.
+
+"CPU frequency translation statistics details" (CONFIG_CPU_FREQ_STAT_DETAILS)
+provides fine grained cpufreq stats by trans_table. The reason for having a
+seperate config option for trans_table is:
+- trans_table goes against the traditional /sysfs rule of one value per
+  interface. It provides a whole bunch of value in a 2 dimensional matrix
+  form.
+
+Once these two options are enabled and your CPU supports cpufrequency, you
+will be able to see the CPU frequency statistics in /sysfs.
+
+
+
+
index 1ad26d2c20ae61e0fabafefdee24ef5bb35b50e0..2f8f24eaefd9ac746f8a1e98b6e2c99abcc23b58 100644 (file)
@@ -252,8 +252,7 @@ in a tasks processor placement.
 There is an exception to the above.  If hotplug funtionality is used
 to remove all the CPUs that are currently assigned to a cpuset,
 then the kernel will automatically update the cpus_allowed of all
-tasks attached to CPUs in that cpuset with the online CPUs of the
-nearest parent cpuset that still has some CPUs online.  When memory
+tasks attached to CPUs in that cpuset to allow all CPUs.  When memory
 hotplug functionality for removing Memory Nodes is available, a
 similar exception is expected to apply there as well.  In general,
 the kernel prefers to violate cpuset placement, over starving a task
index 58cc5dc8fd3eac2f8851674db7909d0f56c32f79..a05ec50f8004dd65f29c87579612389f93660187 100644 (file)
@@ -76,6 +76,14 @@ driver_data:   Driver-specific data.
 
 platform_data: Platform data specific to the device.
 
+              Example:  for devices on custom boards, as typical of embedded
+              and SOC based hardware, Linux often uses platform_data to point
+              to board-specific structures describing devices and how they
+              are wired.  That can include what ports are available, chip
+              variants, which GPIO pins act in what additional roles, and so
+              on.  This shrinks the "Board Support Packages" (BSPs) and
+              minimizes board-specific #ifdefs in drivers.
+
 current_state: Current power state of the device.
 
 saved_state:   Pointer to saved state of the device. This is usable by
index 6031a68dd3f5c249ea5daf391948d058fda44fef..fabaca1ab1b0b0f56980a4802b81b7a11e1aa241 100644 (file)
@@ -5,21 +5,17 @@ struct device_driver {
         char                    * name;
         struct bus_type         * bus;
 
-        rwlock_t                lock;
-        atomic_t                refcount;
-
-        list_t                  bus_list;
+        struct completion      unloaded;
+        struct kobject         kobj;
         list_t                  devices;
 
-        struct driver_dir_entry dir;
+        struct module          *owner;
 
         int     (*probe)        (struct device * dev);
         int     (*remove)       (struct device * dev);
 
         int     (*suspend)      (struct device * dev, pm_message_t state, u32 level);
         int     (*resume)       (struct device * dev, u32 level);
-
-        void    (*release)      (struct device_driver * drv);
 };
 
 
@@ -51,7 +47,6 @@ being converted completely to the new model.
 static struct device_driver eepro100_driver = {
        .name           = "eepro100",
        .bus            = &pci_bus_type,
-       .devclass       = &ethernet_devclass,   /* when it's implemented */
        
        .probe          = eepro100_probe,
        .remove         = eepro100_remove,
@@ -85,7 +80,6 @@ static struct pci_driver eepro100_driver = {
        .driver        = {
                .name           = "eepro100",
                .bus            = &pci_bus_type,
-               .devclass       = &ethernet_devclass,   /* when it's implemented */
                .probe          = eepro100_probe,
                .remove         = eepro100_remove,
                .suspend        = eepro100_suspend,
@@ -166,27 +160,32 @@ Callbacks
 
        int     (*probe)        (struct device * dev);
 
-probe is called to verify the existence of a certain type of
-hardware. This is called during the driver binding process, after the
-bus has verified that the device ID of a device matches one of the
-device IDs supported by the driver. 
-
-This callback only verifies that there actually is supported hardware
-present. It may allocate a driver-specific structure, but it should
-not do any initialization of the hardware itself. The device-specific
-structure may be stored in the device's driver_data field. 
-
-       int     (*init)         (struct device * dev);
-
-init is called during the binding stage. It is called after probe has
-successfully returned and the device has been registered with its
-class. It is responsible for initializing the hardware.
+The probe() entry is called in task context, with the bus's rwsem locked
+and the driver partially bound to the device.  Drivers commonly use
+container_of() to convert "dev" to a bus-specific type, both in probe()
+and other routines.  That type often provides device resource data, such
+as pci_dev.resource[] or platform_device.resources, which is used in
+addition to dev->platform_data to initialize the driver.
+
+This callback holds the driver-specific logic to bind the driver to a
+given device.  That includes verifying that the device is present, that
+it's a version the driver can handle, that driver data structures can
+be allocated and initialized, and that any hardware can be initialized.
+Drivers often store a pointer to their state with dev_set_drvdata().
+When the driver has successfully bound itself to that device, then probe()
+returns zero and the driver model code will finish its part of binding
+the driver to that device.
+
+A driver's probe() may return a negative errno value to indicate that
+the driver did not bind to this device, in which case it should have
+released all reasources it allocated.
 
        int     (*remove)       (struct device * dev);
 
-remove is called to dissociate a driver with a device. This may be
+remove is called to unbind a driver from a device. This may be
 called if a device is physically removed from the system, if the
-driver module is being unloaded, or during a reboot sequence. 
+driver module is being unloaded, during a reboot sequence, or
+in other cases.
 
 It is up to the driver to determine if the device is present or
 not. It should free any resources allocated specifically for the
diff --git a/Documentation/dvb/README.flexcop b/Documentation/dvb/README.flexcop
new file mode 100644 (file)
index 0000000..a50c70f
--- /dev/null
@@ -0,0 +1,205 @@
+This README escorted the skystar2-driver rewriting procedure. It describes the
+state of the new flexcop-driver set and some internals are written down here
+too.
+
+This document hopefully describes things about the flexcop and its
+device-offsprings. Goal was to write an easy-to-write and easy-to-read set of
+drivers based on the skystar2.c and other information.
+
+Remark: flexcop-pci.c was a copy of skystar2.c, but every line has been
+touched and rewritten.
+
+History & News
+==============
+  2005-04-01 - correct USB ISOC transfers (thanks to Vadim Catana)
+
+
+
+
+General coding processing
+=========================
+
+We should proceed as follows (as long as no one complains):
+
+0) Think before start writing code!
+
+1) rewriting the skystar2.c with the help of the flexcop register descriptions
+and splitting up the files to a pci-bus-part and a flexcop-part.
+The new driver will be called b2c2-flexcop-pci.ko/b2c2-flexcop-usb.ko for the
+device-specific part and b2c2-flexcop.ko for the common flexcop-functions.
+
+2) Search for errors in the leftover of flexcop-pci.c (compare with pluto2.c
+and other pci drivers)
+
+3) make some beautification (see 'Improvements when rewriting (refactoring) is
+done')
+
+4) Testing the new driver and maybe substitute the skystar2.c with it, to reach
+a wider tester audience.
+
+5) creating an usb-bus-part using the already written flexcop code for the pci
+card.
+
+Idea: create a kernel-object for the flexcop and export all important
+functions. This option saves kernel-memory, but maybe a lot of functions have
+to be exported to kernel namespace.
+
+
+Current situation
+=================
+
+0) Done :)
+1) Done (some minor issues left)
+2) Done
+3) Not ready yet, more information is necessary
+4) next to be done (see the table below)
+5) USB driver is working (yes, there are some minor issues)
+
+What seems to be ready?
+-----------------------
+
+1) Rewriting
+1a) i2c is cut off from the flexcop-pci.c and seems to work
+1b) moved tuner and demod stuff from flexcop-pci.c to flexcop-tuner-fe.c
+1c) moved lnb and diseqc stuff from flexcop-pci.c to flexcop-tuner-fe.c
+1e) eeprom (reading MAC address)
+1d) sram (no dynamic sll size detection (commented out) (using default as JJ told me))
+1f) misc. register accesses for reading parameters (e.g. resetting, revision)
+1g) pid/mac filter (flexcop-hw-filter.c)
+1i) dvb-stuff initialization in flexcop.c (done)
+1h) dma stuff (now just using the size-irq, instead of all-together, to be done)
+1j) remove flexcop initialization from flexcop-pci.c completely (done)
+1l) use a well working dma IRQ method (done, see 'Known bugs and problems and TODO')
+1k) cleanup flexcop-files (remove unused EXPORT_SYMBOLs, make static from
+non-static where possible, moved code to proper places)
+
+2) Search for errors in the leftover of flexcop-pci.c (partially done)
+5a) add MAC address reading
+5c) feeding of ISOC data to the software demux (format of the isochronous data
+and speed optimization, no real error) (thanks to Vadim Catana)
+
+What to do in the near future?
+--------------------------------------
+(no special order here)
+
+5) USB driver
+5b) optimize isoc-transfer (submitting/killing isoc URBs when transfer is starting)
+
+Testing changes
+---------------
+
+O             = item is working
+P             = item is partially working
+X             = item is not working
+N             = item does not apply here
+<empty field> = item need to be examined
+
+       | PCI                               | USB
+item   | mt352 | nxt2002 | stv0299 | mt312 | mt352 | nxt2002 | stv0299 | mt312
+-------+-------+---------+---------+-------+-------+---------+---------+-------
+1a)    | O     |         |         |       | N     | N       | N       | N
+1b)    | O     |         |         |       |       |         | O       |
+1c)    | N     | N       |         |       | N     | N       | O       |
+1d)    |                 O                 |                 O
+1e)    |                 O                 |                 O
+1f)    |                                   P
+1g)    |                                   O
+1h)    |                 P                 |
+1i)    |                 O                 |                 N
+1j)    |                 O                 |                 N
+1l)    |                 O                 |                 N
+2)     |                 O                 |                 N
+5a)    |                 N                 |                 O
+5b)*   |                 N                 |
+5c)    |                 N                 |                 O
+
+* - not done yet
+
+Known bugs and problems and TODO
+--------------------------------
+
+1g/h/l) when pid filtering is enabled on the pci card
+
+DMA usage currently:
+  The DMA is splitted in 2 equal-sized subbuffers. The Flexcop writes to first
+  address and triggers an IRQ when it's full and starts writing to the second
+  address. When the second address is full, the IRQ is triggered again, and
+  the flexcop writes to first address again, and so on.
+  The buffersize of each address is currently 640*188 bytes.
+
+  Problem is, when using hw-pid-filtering and doing some low-bandwidth
+  operation (like scanning) the buffers won't be filled enough to trigger
+  the IRQ. That's why:
+
+  When PID filtering is activated, the timer IRQ is used. Every 1.97 ms the IRQ
+  is triggered.  Is the current write address of DMA1 different to the one
+  during the last IRQ, then the data is passed to the demuxer.
+
+  There is an additional DMA-IRQ-method: packet count IRQ. This isn't
+  implemented correctly yet.
+
+  The solution is to disable HW PID filtering, but I don't know how the DVB
+  API software demux behaves on slow systems with 45MBit/s TS.
+
+Solved bugs :)
+--------------
+1g) pid-filtering (somehow pid index 4 and 5 (EMM_PID and ECM_PID) aren't
+working)
+SOLUTION: also index 0 was affected, because net_translation is done for
+these indexes by default
+
+5b) isochronous transfer does only work in the first attempt (for the Sky2PC
+USB, Air2PC is working) SOLUTION: the flexcop was going asleep and never really
+woke up again (don't know if this need fixes, see
+flexcop-fe-tuner.c:flexcop_sleep)
+
+NEWS: when the driver is loaded and unloaded and loaded again (w/o doing
+anything in the while the driver is loaded the first time), no transfers take
+place anymore.
+
+Improvements when rewriting (refactoring) is done
+=================================================
+
+- split sleeping of the flexcop (misc_204.ACPI3_sig = 1;) from lnb_control
+  (enable sleeping for other demods than dvb-s)
+- add support for CableStar (stv0297 Microtune 203x/ALPS) (almost done, incompatibilities with the Nexus-CA)
+
+Debugging
+---------
+- add verbose debugging to skystar2.c (dump the reg_dw_data) and compare it
+  with this flexcop, this is important, because i2c is now using the
+  flexcop_ibi_value union from flexcop-reg.h (do you have a better idea for
+  that, please tell us so).
+
+Everything which is identical in the following table, can be put into a common
+flexcop-module.
+
+                  PCI                  USB
+-------------------------------------------------------------------------------
+Different:
+Register access:  accessing IO memory  USB control message
+I2C bus:          I2C bus of the FC    USB control message
+Data transfer:    DMA                  isochronous transfer
+EEPROM transfer:  through i2c bus      not clear yet
+
+Identical:
+Streaming:                 accessing registers
+PID Filtering:             accessing registers
+Sram destinations:         accessing registers
+Tuner/Demod:                     I2C bus
+DVB-stuff:            can be written for common use
+
+Acknowledgements (just for the rewriting part)
+================
+
+Bjarne Steinsbo thought a lot in the first place of the pci part for this code
+sharing idea.
+
+Andreas Oberritter for providing a recent PCI initialization template
+(pluto2.c).
+
+Boleslaw Ciesielski for pointing out a problem with firmware loader.
+
+Vadim Catana for correcting the USB transfer.
+
+comments, critics and ideas to linux-dvb@linuxtv.org.
index e3cacf4f2345e48258317bc23925e66a757a4a53..d64430bf4bb6ec5d681c2f7c30cc71905a72bd67 100644 (file)
@@ -17,74 +17,53 @@ Because of this, you need to enable
 "Device drivers" => "Multimedia devices"
   => "Video For Linux" => "BT848 Video For Linux"
 
+Furthermore you need to enable
+"Device drivers" => "Multimedia devices" => "Digital Video Broadcasting Devices"
+  => "DVB for Linux" "DVB Core Support" "Nebula/Pinnacle PCTV/TwinHan PCI Cards"
+
 2) Loading Modules
 ==================
 
 In general you need to load the bttv driver, which will handle the gpio and
-i2c communication for us. Next you need the common dvb-bt8xx device driver
-and one frontend driver.
-
-The bttv driver will HANG YOUR SYSTEM IF YOU DO NOT SPECIFY THE CORRECT 
-CARD ID!
-
-(If you don't get your card running and you suspect that the card id you're
-using is wrong, have a look at "bttv-cards.c" for a list of possible card
-ids.)
-
-Pay attention to failures when you load the frontend drivers
-(e.g. dmesg, /var/log/messages).
+i2c communication for us, plus the common dvb-bt8xx device driver.
+The frontends for Nebula (nxt6000), Pinnacle PCTV (cx24110) and
+TwinHan (dst) are loaded automatically by the dvb-bt8xx device driver.
 
 3a) Nebula / Pinnacle PCTV
 --------------------------
 
-   $ modprobe bttv i2c_hw=1 card=0x68
-   $ modprobe dvb-bt8xx
-   
-For Nebula cards use the "nxt6000" frontend driver:
-   $ modprobe nxt6000
+   $ modprobe bttv (normally bttv is being loaded automatically by kmod)
+   $ modprobe dvb-bt8xx (or just place dvb-bt8xx in /etc/modules for automatic loading)
 
-For Pinnacle PCTV cards use the "cx24110" frontend driver:
-   $ modprobe cx24110
 
-3b) TwinHan
------------
+3b) TwinHan and Clones
+--------------------------
 
    $ modprobe bttv i2c_hw=1 card=0x71
    $ modprobe dvb-bt8xx
    $ modprobe dst
 
-The value 0x71 will override the PCI type detection for dvb-bt8xx, which 
-is necessary for TwinHan cards.#
+The value 0x71 will override the PCI type detection for dvb-bt8xx,
+which  is necessary for TwinHan cards.
 
-If you're having an older card (blue color circuit) and card=0x71 locks your
-machine, try using 0x68, too. If that does not work, ask on the DVB mailing list.
+If you're having an older card (blue color circuit) and card=0x71 locks
+your machine, try using 0x68, too. If that does not work, ask on the
+mailing list.
 
-The DST module takes a couple of useful parameters, in case the
-dst drivers fails to detect your type of card correctly.
+The DST module takes a couple of useful parameters.
 
-dst_type takes values 0 (satellite), 1 (terrestial TV), 2 (cable).
+verbose takes values 0 to 5. These values control the verbosity level.
 
-dst_type_flags takes bit combined values:
-1 = new tuner type packets. You can use this if your card is detected
-    and you have debug and you continually see the tuner packets not
-    working (make sure not a basic problem like dish alignment etc.)
+debug takes values 0 and 1. You can either disable or enable debugging.
 
-2 = TS 204. If your card tunes OK, but the picture is terrible, seemingly
-    breaking up in one half continually, and crc fails a lot, then
-    this is worth a try (or trying to turn off)
+dst_addons takes values 0 and 0x20. A value of 0 means it is a FTA card.
+0x20 means it has a Conditional Access slot.
 
-4 = has symdiv. Some cards, mostly without new tuner packets, require
-    a symbol division algorithm. Doesn't apply to terrestial TV.
-
-You can also specify a value to have the autodetected values turned off
-(e.g. 0). The autodected values are determined bythe cards 'response
+The autodected values are determined bythe cards 'response
 string' which you can see in your logs e.g.
 
-dst_check_ci: recognize DST-MOT
-
-or 
+dst_get_device_id: Recognise [DSTMCI]
 
-dst_check_ci: unable to recognize DSTXCI or STXCI
 
 --
-Authors: Richard Walker, Jamie Honan, Michael Hunold
+Authors: Richard Walker, Jamie Honan, Michael Hunold, Manu Abraham
diff --git a/Documentation/dvb/ci.txt b/Documentation/dvb/ci.txt
new file mode 100644 (file)
index 0000000..62e0701
--- /dev/null
@@ -0,0 +1,219 @@
+* For the user
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+NOTE: This document describes the usage of the high level CI API as
+in accordance to the Linux DVB API. This is a not a documentation for the,
+existing low level CI API.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To utilize the High Level CI capabilities,
+
+(1*) This point is valid only for the Twinhan/clones
+  For the Twinhan/Twinhan clones, the dst_ca module handles the CI
+  hardware handling.This module is loaded automatically if a CI
+  (Common Interface, that holds the CAM (Conditional Access Module)
+  is detected.
+
+(2) one requires a userspace application, ca_zap. This small userland
+  application is in charge of sending the descrambling related information
+  to the CAM.
+
+This application requires the following to function properly as of now.
+
+       (a) Tune to a valid channel, with szap.
+         eg: $ szap -c channels.conf -r "TMC" -x
+
+       (b) a channels.conf containing a valid PMT PID
+
+         eg: TMC:11996:h:0:27500:278:512:650:321
+
+         here 278 is a valid PMT PID. the rest of the values are the
+         same ones that szap uses.
+
+       (c) after running a szap, you have to run ca_zap, for the
+         descrambler to function,
+
+         eg: $ ca_zap patched_channels.conf "TMC"
+
+         The patched means a patch to apply to scan, such that scan can
+         generate a channels.conf_with pmt, which has this PMT PID info
+         (NOTE: szap cannot use this channels.conf with the PMT_PID)
+
+
+       (d) Hopeflly Enjoy your favourite subscribed channel as you do with
+         a FTA card.
+
+(3) Currently ca_zap, and dst_test, both are meant for demonstration
+  purposes only, they can become full fledged applications if necessary.
+
+
+* Cards that fall in this category
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+At present the cards that fall in this category are the Twinhan and it's
+clones, these cards are available as VVMER, Tomato, Hercules, Orange and
+so on.
+
+* CI modules that are supported
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The CI module support is largely dependant upon the firmware on the cards
+Some cards do support almost all of the available CI modules. There is
+nothing much that can be done in order to make additional CI modules
+working with these cards.
+
+Modules that have been tested by this driver at present are
+
+(1) Irdeto 1 and 2 from SCM
+(2) Viaccess from SCM
+(3) Dragoncam
+
+* The High level CI API
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+* For the programmer
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+With the High Level CI approach any new card with almost any random
+architecture can be implemented with this style, the definitions
+insidethe switch statement can be easily adapted for any card, thereby
+eliminating the need for any additional ioctls.
+
+The disadvantage is that the driver/hardware has to manage the rest. For
+the application programmer it would be as simple as sending/receiving an
+array to/from the CI ioctls as defined in the Linux DVB API. No changes
+have been made in the API to accomodate this feature.
+
+
+* Why the need for another CI interface ?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+This is one of the most commonly asked question. Well a nice question.
+Strictly speaking this is not a new interface.
+
+The CI interface is defined in the DVB API in ca.h as
+
+typedef struct ca_slot_info {
+       int num;               /* slot number */
+
+       int type;              /* CA interface this slot supports */
+#define CA_CI            1     /* CI high level interface */
+#define CA_CI_LINK       2     /* CI link layer level interface */
+#define CA_CI_PHYS       4     /* CI physical layer level interface */
+#define CA_DESCR         8     /* built-in descrambler */
+#define CA_SC          128     /* simple smart card interface */
+
+       unsigned int flags;
+#define CA_CI_MODULE_PRESENT 1 /* module (or card) inserted */
+#define CA_CI_MODULE_READY   2
+} ca_slot_info_t;
+
+
+
+This CI interface follows the CI high level interface, which is not
+implemented by most applications. Hence this area is revisited.
+
+This CI interface is quite different in the case that it tries to
+accomodate all other CI based devices, that fall into the other categories
+
+This means that this CI interface handles the EN50221 style tags in the
+Application layer only and no session management is taken care of by the
+application. The driver/hardware will take care of all that.
+
+This interface is purely an EN50221 interface exchanging APDU's. This
+means that no session management, link layer or a transport layer do
+exist in this case in the application to driver communication. It is
+as simple as that. The driver/hardware has to take care of that.
+
+
+With this High Level CI interface, the interface can be defined with the
+regular ioctls.
+
+All these ioctls are also valid for the High level CI interface
+
+#define CA_RESET          _IO('o', 128)
+#define CA_GET_CAP        _IOR('o', 129, ca_caps_t)
+#define CA_GET_SLOT_INFO  _IOR('o', 130, ca_slot_info_t)
+#define CA_GET_DESCR_INFO _IOR('o', 131, ca_descr_info_t)
+#define CA_GET_MSG        _IOR('o', 132, ca_msg_t)
+#define CA_SEND_MSG       _IOW('o', 133, ca_msg_t)
+#define CA_SET_DESCR      _IOW('o', 134, ca_descr_t)
+#define CA_SET_PID        _IOW('o', 135, ca_pid_t)
+
+
+On querying the device, the device yields information thus
+
+CA_GET_SLOT_INFO
+----------------------------
+Command = [info]
+APP: Number=[1]
+APP: Type=[1]
+APP: flags=[1]
+APP: CI High level interface
+APP: CA/CI Module Present
+
+CA_GET_CAP
+----------------------------
+Command = [caps]
+APP: Slots=[1]
+APP: Type=[1]
+APP: Descrambler keys=[16]
+APP: Type=[1]
+
+CA_SEND_MSG
+----------------------------
+Descriptors(Program Level)=[ 09 06 06 04 05 50 ff f1]
+Found CA descriptor @ program level
+
+(20) ES type=[2] ES pid=[201]  ES length =[0 (0x0)]
+(25) ES type=[4] ES pid=[301]  ES length =[0 (0x0)]
+ca_message length is 25 (0x19) bytes
+EN50221 CA MSG=[ 9f 80 32 19 03 01 2d d1 f0 08 01 09 06 06 04 05 50 ff f1 02 e0 c9 00 00 04 e1 2d 00 00]
+
+
+Not all ioctl's are implemented in the driver from the API, the other
+features of the hardware that cannot be implemented by the API are achieved
+using the CA_GET_MSG and CA_SEND_MSG ioctls. An EN50221 style wrapper is
+used to exchange the data to maintain compatibility with other hardware.
+
+
+/* a message to/from a CI-CAM */
+typedef struct ca_msg {
+       unsigned int index;
+       unsigned int type;
+       unsigned int length;
+       unsigned char msg[256];
+} ca_msg_t;
+
+
+The flow of data can be described thus,
+
+
+
+
+
+       App (User)
+       -----
+       parse
+         |
+         |
+         v
+       en50221 APDU (package)
+   --------------------------------------
+   |     |                             | High Level CI driver
+   |     |                             |
+   |     v                             |
+   |   en50221 APDU (unpackage)        |
+   |     |                             |
+   |     |                             |
+   |     v                             |
+   |   sanity checks                   |
+   |     |                             |
+   |     |                             |
+   |     v                             |
+   |   do (H/W dep)                    |
+   --------------------------------------
+         |    Hardware
+         |
+         v
+
+
+
+
+The High Level CI interface uses the EN50221 DVB standard, following a
+standard ensures futureproofness.
index 3ffdcb394299f43b65f50c7df3898281504fd32c..a750f0101d9de7d15f47a13e0cc7240b3299ba1f 100644 (file)
@@ -107,7 +107,7 @@ sub tda10045 {
 sub tda10046 {
     my $sourcefile = "tt_budget_217g.zip";
     my $url = "http://www.technotrend.de/new/217g/$sourcefile";
-    my $hash = "a25b579e37109af60f4a36c37893957c";
+    my $hash = "6a7e1e2f2644b162ff0502367553c72d";
     my $outfile = "dvb-fe-tda10046.fw";
     my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
 
@@ -115,7 +115,7 @@ sub tda10046 {
 
     wgetfile($sourcefile, $url);
     unzip($sourcefile, $tmpdir);
-    extract("$tmpdir/software/OEM/PCI/App/ttlcdacc.dll", 0x3f731, 24479, "$tmpdir/fwtmp");
+    extract("$tmpdir/software/OEM/PCI/App/ttlcdacc.dll", 0x3f731, 24478, "$tmpdir/fwtmp");
     verify("$tmpdir/fwtmp", $hash);
     copy("$tmpdir/fwtmp", $outfile);
 
diff --git a/Documentation/fb/intelfb.txt b/Documentation/fb/intelfb.txt
new file mode 100644 (file)
index 0000000..c12d39a
--- /dev/null
@@ -0,0 +1,135 @@
+Intel 830M/845G/852GM/855GM/865G/915G Framebuffer driver
+================================================================
+
+A. Introduction
+       This is a framebuffer driver for various Intel 810/815 compatible
+graphics devices.  These would include:
+
+       Intel 830M
+       Intel 810E845G
+       Intel 852GM
+       Intel 855GM
+       Intel 865G
+       Intel 915G
+
+B.  List of available options
+
+   a. "video=intelfb"
+       enables the intelfb driver
+
+       Recommendation: required
+
+   b. "mode=<xres>x<yres>[-<bpp>][@<refresh>]"
+       select mode
+
+       Recommendation: user preference
+       (default = 1024x768-32@70)
+
+   c. "vram=<value>"
+       select amount of system RAM in MB to allocate for the video memory
+       if not enough RAM was already allocated by the BIOS.
+
+       Recommendation: 1 - 4 MB.
+       (default = 4 MB)
+
+   d. "voffset=<value>"
+        select at what offset in MB of the logical memory to allocate the
+       framebuffer memory.  The intent is to avoid the memory blocks
+       used by standard graphics applications (XFree86). Depending on your
+        usage, adjust the value up or down, (0 for maximum usage, 63/127 MB
+        for the least amount).  Note, an arbitrary setting may conflict
+        with XFree86.
+
+       Recommendation: do not set
+       (default = 48 MB)
+
+   e. "accel"
+       enable text acceleration.  This can be enabled/reenabled anytime
+       by using 'fbset -accel true/false'.
+
+       Recommendation: enable
+       (default = set)
+
+   f. "hwcursor"
+       enable cursor acceleration.
+
+       Recommendation: enable
+       (default = set)
+
+   g. "mtrr"
+       enable MTRR.  This allows data transfers to the framebuffer memory
+       to occur in bursts which can significantly increase performance.
+       Not very helpful with the intel chips because of 'shared memory'.
+
+       Recommendation: set
+       (default = set)
+
+   h. "fixed"
+       disable mode switching.
+
+       Recommendation: do not set
+       (default = not set)
+
+   The binary parameters can be unset with a "no" prefix, example "noaccel".
+   The default parameter (not named) is the mode.
+
+C. Kernel booting
+
+Separate each option/option-pair by commas (,) and the option from its value
+with an equals sign (=) as in the following:
+
+video=i810fb:option1,option2=value2
+
+Sample Usage
+------------
+
+In /etc/lilo.conf, add the line:
+
+append="video=intelfb:800x600-32@75,accel,hwcursor,vram=8"
+
+This will initialize the framebuffer to 800x600 at 32bpp and 75Hz. The
+framebuffer will use 8 MB of System RAM. hw acceleration of text and cursor
+will be enabled.
+
+D.  Module options
+
+       The module parameters are essentially similar to the kernel
+parameters. The main difference is that you need to include a Boolean value
+(1 for TRUE, and 0 for FALSE) for those options which don't need a value.
+
+Example, to enable MTRR, include "mtrr=1".
+
+Sample Usage
+------------
+
+Using the same setup as described above, load the module like this:
+
+       modprobe intelfb mode=800x600-32@75 vram=8 accel=1 hwcursor=1
+
+Or just add the following to /etc/modprobe.conf
+
+       options intelfb mode=800x600-32@75 vram=8 accel=1 hwcursor=1
+
+and just do a
+
+       modprobe intelfb
+
+
+E.  Acknowledgment:
+
+       1.  Geert Uytterhoeven - his excellent howto and the virtual
+                                 framebuffer driver code made this possible.
+
+       2.  Jeff Hartmann for his agpgart code.
+
+       3.  David Dawes for his original kernel 2.4 code.
+
+       4.  The X developers.  Insights were provided just by reading the
+           XFree86 source code.
+
+       5.  Antonino A. Daplas for his inspiring i810fb driver.
+
+       6.  Andrew Morton for his kernel patches maintenance.
+
+###########################
+Sylvain
index d3c52dd24a2ae6f5a39d35d788c8831aa52f4b9c..b9eb209318ab7d737ba7e6be2a0587ce9e8a9d25 100644 (file)
@@ -63,3 +63,23 @@ Why: Outside of Linux, the only implementations of anything even
        people, who might be using implementations that I am not aware
        of, to adjust to this upcoming change.
 Who:   Paul E. McKenney <paulmck@us.ibm.com>
+
+---------------------------
+
+What:  IEEE1394 Audio and Music Data Transmission Protocol driver,
+       Connection Management Procedures driver
+When:  November 2005
+Files: drivers/ieee1394/{amdtp,cmp}*
+Why:   These are incomplete, have never worked, and are better implemented
+       in userland via raw1394 (see http://freebob.sourceforge.net/ for
+       example.)
+Who:   Jody McIntyre <scjody@steamballoon.com>
+
+---------------------------
+
+What:  raw1394: requests of type RAW1394_REQ_ISO_SEND, RAW1394_REQ_ISO_LISTEN
+When:  November 2005
+Why:   Deprecated in favour of the new ioctl-based rawiso interface, which is
+       more efficient.  You should really be using libraw1394 for raw1394
+       access anyway.
+Who:   Jody McIntyre <scjody@steamballoon.com>
index f64a10506689124943a5bdd9d1b43271d62b387c..424585ff6ea1c18daf7b9f47da97edd72b72dba1 100644 (file)
@@ -26,7 +26,11 @@ Mount options unique to the isofs filesystem.
   mode=xxx      Sets the permissions on files to xxx
   nojoliet      Ignore Joliet extensions if they are present.
   norock        Ignore Rock Ridge extensions if they are present.
-  unhide        Show hidden files.
+  hide         Completely strip hidden files from the file system.
+  showassoc    Show files marked with the 'associated' bit
+  unhide       Deprecated; showing hidden files is now default;
+               If given, it is a synonym for 'showassoc' which will
+               recreate previous unhide behavior
   session=x     Select number of session on multisession CD
   sbsector=xxx  Session begins from sector xxx
 
index e97d024eae77e5fa9f1ac338074a24baf42680e5..988a62fae11f883b8b2ba14ba95d83490a3fc5a1 100644 (file)
@@ -7,7 +7,6 @@ that support it.  For example, a given bus might look like this:
      |-- 0000:17:00.0
      |   |-- class
      |   |-- config
-     |   |-- detach_state
      |   |-- device
      |   |-- irq
      |   |-- local_cpus
@@ -19,7 +18,7 @@ that support it.  For example, a given bus might look like this:
      |   |-- subsystem_device
      |   |-- subsystem_vendor
      |   `-- vendor
-     `-- detach_state
+     `-- ...
 
 The topmost element describes the PCI domain and bus number.  In this case,
 the domain number is 0000 and the bus number is 17 (both values are in hex).
@@ -31,7 +30,6 @@ files, each with their own function.
        ----               --------
        class              PCI class (ascii, ro)
        config             PCI config space (binary, rw)
-       detach_state       connection status (bool, rw)
        device             PCI device (ascii, ro)
        irq                IRQ number (ascii, ro)
        local_cpus         nearby CPU mask (cpumask, ro)
@@ -85,4 +83,4 @@ useful return codes should be provided.
 
 Legacy resources are protected by the HAVE_PCI_LEGACY define.  Platforms
 wishing to support legacy functionality should define it and provide
-pci_legacy_read, pci_legacy_write and pci_mmap_legacy_page_range functions.
\ No newline at end of file
+pci_legacy_read, pci_legacy_write and pci_mmap_legacy_page_range functions.
index 60f6c2c4d477968e2966eb152183fe1c71bc689b..dc276598a65a3784c4dd7d41470c41f288db9529 100644 (file)
@@ -214,7 +214,7 @@ Other notes:
 
 A very simple (and naive) implementation of a device attribute is:
 
-static ssize_t show_name(struct device * dev, char * buf)
+static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf)
 {
         return sprintf(buf,"%s\n",dev->name);
 }
index 417e3095fe39a65f054ece975d01e68d99d0c018..0d783c504eade32e666e7a19b6fa89f85bfb9416 100644 (file)
@@ -71,8 +71,8 @@ can be changed on remount.  The size parameter also accepts a suffix %
 to limit this tmpfs instance to that percentage of your physical RAM:
 the default, when neither size nor nr_blocks is specified, is size=50%
 
-If both nr_blocks (or size) and nr_inodes are set to 0, neither blocks
-nor inodes will be limited in that instance.  It is generally unwise to
+If nr_blocks=0 (or size=0), blocks will not be limited in that instance;
+if nr_inodes=0, inodes will not be limited.  It is generally unwise to
 mount with such options, since it allows any user with write access to
 use up all the memory on the machine; but enhances the scalability of
 that instance in a system with many cpus making intensive use of it.
@@ -97,4 +97,4 @@ RAM/SWAP in 10240 inodes and it is only accessible by root.
 Author:
    Christoph Rohland <cr@sap.com>, 1.12.01
 Updated:
-   Hugh Dickins <hugh@veritas.com>, 01 September 2004
+   Hugh Dickins <hugh@veritas.com>, 13 March 2005
index 7d1dc6b884f3eeb70581820e9eeace45deb45d48..31bc8b759b755e03875426f3678e92e86a022b33 100644 (file)
@@ -1,21 +1,21 @@
 Generic HDLC layer
 Krzysztof Halasa <khc@pm.waw.pl>
-January, 2003
 
 
 Generic HDLC layer currently supports:
-- Frame Relay (ANSI, CCITT and no LMI), with ARP support (no InARP).
-  Normal (routed) and Ethernet-bridged (Ethernet device emulation)
-  interfaces can share a single PVC.
-- raw HDLC - either IP (IPv4) interface or Ethernet device emulation.
-- Cisco HDLC,
-- PPP (uses syncppp.c),
-- X.25 (uses X.25 routines).
-
-There are hardware drivers for the following cards:
-- C101 by Moxa Technologies Co., Ltd.
-- RISCom/N2 by SDL Communications Inc.
-- and others, some not in the official kernel.
+1. Frame Relay (ANSI, CCITT, Cisco and no LMI).
+   - Normal (routed) and Ethernet-bridged (Ethernet device emulation)
+     interfaces can share a single PVC.
+   - ARP support (no InARP support in the kernel - there is an
+     experimental InARP user-space daemon available on:
+     http://www.kernel.org/pub/linux/utils/net/hdlc/).
+2. raw HDLC - either IP (IPv4) interface or Ethernet device emulation.
+3. Cisco HDLC.
+4. PPP (uses syncppp.c).
+5. X.25 (uses X.25 routines).
+
+Generic HDLC is a protocol driver only - it needs a low-level driver
+for your particular hardware.
 
 Ethernet device emulation (using HDLC or Frame-Relay PVC) is compatible
 with IEEE 802.1Q (VLANs) and 802.1D (Ethernet bridging).
@@ -24,7 +24,7 @@ with IEEE 802.1Q (VLANs) and 802.1D (Ethernet bridging).
 Make sure the hdlc.o and the hardware driver are loaded. It should
 create a number of "hdlc" (hdlc0 etc) network devices, one for each
 WAN port. You'll need the "sethdlc" utility, get it from:
-       http://hq.pm.waw.pl/hdlc/
+       http://www.kernel.org/pub/linux/utils/net/hdlc/
 
 Compile sethdlc.c utility:
        gcc -O2 -Wall -o sethdlc sethdlc.c
@@ -52,12 +52,12 @@ Setting interface:
 * v35 | rs232 | x21 | t1 | e1 - sets physical interface for a given port
                                 if the card has software-selectable interfaces
   loopback - activate hardware loopback (for testing only)
-* clock ext - external clock (uses DTE RX and TX clock)
-* clock int - internal clock (provides clock signal on DCE clock output)
-* clock txint - TX internal, RX external (provides TX clock on DCE output)
-* clock txfromrx - TX clock derived from RX clock (TX clock on DCE output)
-* rate - sets clock rate in bps (not required for external clock or
-                                 for txfromrx)
+* clock ext - both RX clock and TX clock external
+* clock int - both RX clock and TX clock internal
+* clock txint - RX clock external, TX clock internal
+* clock txfromrx - RX clock external, TX clock derived from RX clock
+* rate - sets clock rate in bps (for "int" or "txint" clock only)
+
 
 Setting protocol:
 
@@ -79,7 +79,7 @@ Setting protocol:
 * x25 - sets X.25 mode
 
 * fr - Frame Relay mode
-  lmi ansi / ccitt / none - LMI (link management) type
+  lmi ansi / ccitt / cisco / none - LMI (link management) type
   dce - Frame Relay DCE (network) side LMI instead of default DTE (user).
   It has nothing to do with clocks!
   t391 - link integrity verification polling timer (in seconds) - user
@@ -119,13 +119,14 @@ or
 
 
 
-If you have a problem with N2 or C101 card, you can issue the "private"
-command to see port's packet descriptor rings (in kernel logs):
+If you have a problem with N2, C101 or PLX200SYN card, you can issue the
+"private" command to see port's packet descriptor rings (in kernel logs):
 
        sethdlc hdlc0 private
 
-The hardware driver has to be build with CONFIG_HDLC_DEBUG_RINGS.
+The hardware driver has to be build with #define DEBUG_RINGS.
 Attaching this info to bug reports would be helpful. Anyway, let me know
 if you have problems using this.
 
-For patches and other info look at http://hq.pm.waw.pl/hdlc/
+For patches and other info look at:
+<http://www.kernel.org/pub/linux/utils/net/hdlc/>.
index 5049a64313d148c13a8704f4dde49e9aa24f58b7..b06c8c69266ff78f87d05940df5fd5526bedd5a6 100644 (file)
@@ -47,7 +47,6 @@ ni52          <------------------ Buggy ------------------>
 ni65           YES             YES             YES             Software(#)
 seeq           NO              NO              NO              N/A
 sgiseek                <------------------ Buggy ------------------>
-sk_g16         NO              NO              YES             N/A
 smc-ultra      YES             YES             YES             Hardware
 sunlance       YES             YES             YES             Hardware
 tulip          YES             YES             YES             Hardware
index 3830a83513d20d9d752aa0c378d8157f48f74d15..0b27863f155c49bac2f810ec5ae9a09f6497e2e4 100644 (file)
@@ -284,9 +284,6 @@ ppp.c:
 seeq8005.c: *Not modularized*
        (Probes ports: 0x300, 0x320, 0x340, 0x360)
 
-sk_g16.c: *Not modularized*
-       (Probes ports: 0x100, 0x180, 0x208, 0x220m 0x288, 0x320, 0x328, 0x390)
-
 skeleton.c: *Skeleton*
 
 slhc.c:
index fa12a9e4abdd2a4f23075c48ba8652c21cea27d1..80e1cb19609f552e958f7bd2259279e1a678e1cd 100644 (file)
@@ -12,7 +12,7 @@ Don is no longer the prime maintainer of this version of the driver.
 Please report problems to one or more of:
 
   Andrew Morton <andrewm@uow.edu.au>
-  Netdev mailing list <netdev@oss.sgi.com>
+  Netdev mailing list <netdev@vger.kernel.org>
   Linux kernel mailing list <linux-kernel@vger.kernel.org>
 
 Please note the 'Reporting and Diagnosing Problems' section at the end
index 5d4ae9a39f1d5df7ffa644d39d0235a71b22c125..f987afe43e28e1327ee76ab4f3fdb617abfe0829 100644 (file)
@@ -207,27 +207,6 @@ SYSTEM_SHUTDOWN, I do not understand this one too much. probably event
 #READY_AFTER_RESUME
 #
 
-Driver Detach Power Management
-
-The kernel now supports the ability to place a device in a low-power
-state when it is detached from its driver, which happens when its
-module is removed. 
-
-Each device contains a 'detach_state' file in its sysfs directory
-which can be used to control this state. Reading from this file
-displays what the current detach state is set to. This is 0 (On) by
-default. A user may write a positive integer value to this file in the
-range of 1-4 inclusive. 
-
-A value of 1-3 will indicate the device should be placed in that
-low-power state, which will cause ->suspend() to be called for that
-device. A value of 4 indicates that the device should be shutdown, so
-->shutdown() will be called for that device. 
-
-The driver is responsible for reinitializing the device when the
-module is re-inserted during it's ->probe() (or equivalent) method. 
-The driver core will not call any extra functions when binding the
-device to the driver. 
 
 pm_message_t meaning
 
index c0a62e116e6e969e2e6e6cbe7b354a1e16a42fdc..dca75cbda6f8abc144afb9efcdea77b7b5f21eac 100644 (file)
@@ -347,8 +347,8 @@ address that is created by firmware.  An example vty-server sysfs entry
 looks like the following:
 
        Pow5:/sys/bus/vio/drivers/hvcs/30000004 # ls
-       .   current_vty   devspec  name          partner_vtys
-       ..  detach_state  index    partner_clcs  vterm_state
+       .   current_vty   devspec       name          partner_vtys
+       ..  index         partner_clcs  vterm_state
 
 Each entry is provided, by default with a "name" attribute.  Reading the
 "name" attribute will reveal the device type as shown in the following
index a831d9ae5a5ef0ce6272fe08fe0d8e63e7c46ada..59d1166d41eeebc095528a84a24fa584ea0c953d 100644 (file)
@@ -30,7 +30,7 @@ Command line parameters
   device numbers (0xabcd or abcd, for 2.4 backward compatibility).
   You can use the 'all' keyword to ignore all devices.
   The '!' operator will cause the I/O-layer to _not_ ignore a device.
-  The order on the command line is not important.
+  The command line is parsed from left to right.
 
   For example, 
        cio_ignore=0.0.0023-0.0.0042,0.0.4711
@@ -72,13 +72,14 @@ Command line parameters
   /proc/cio_ignore; "add <device range>, <device range>, ..." will ignore the
   specified devices.
 
-  Note: Already known devices cannot be ignored.
+  Note: While already known devices can be added to the list of devices to be
+        ignored, there will be no effect on then. However, if such a device
+        disappears and then reappeares, it will then be ignored.
 
-  For example, if device 0.0.abcd is already known and all other devices
-  0.0.a000-0.0.afff are not known,
+  For example,
        "echo add 0.0.a000-0.0.accc, 0.0.af00-0.0.afff > /proc/cio_ignore"
-  will add 0.0.a000-0.0.abcc, 0.0.abce-0.0.accc and 0.0.af00-0.0.afff to the
-  list of ignored devices and skip 0.0.abcd.
+  will add 0.0.a000-0.0.accc and 0.0.af00-0.0.afff to the list of ignored
+  devices.
 
   The devices can be specified either by bus id (0.0.abcd) or, for 2.4 backward
   compatibilty, by the device number in hexadecimal (0xabcd or abcd).
@@ -98,7 +99,8 @@ Command line parameters
 
   - /proc/s390dbf/cio_trace/hex_ascii
     Logs the calling of functions in the common I/O-layer and, if applicable, 
-    which subchannel they were called for.
+    which subchannel they were called for, as well as dumps of some data
+    structures (like irb in an error case).
 
   The level of logging can be changed to be more or less verbose by piping to 
   /proc/s390dbf/cio_*/level a number between 0 and 6; see the documentation on
index a9356c63b800f0a2a1ce8589fe6bf533e4e6acbc..5331d91432c76cb7d598165ee89db51236f27e75 100644 (file)
@@ -1,3 +1,69 @@
+Release Date   : Mon Mar 07 12:27:22 EST 2005 - Seokmann Ju <sju@lsil.com>
+Current Version : 2.20.4.6 (scsi module), 2.20.2.6 (cmm module)
+Older Version  : 2.20.4.5 (scsi module), 2.20.2.5 (cmm module)
+
+1.     Added IOCTL backward compatibility.
+       Convert megaraid_mm driver to new compat_ioctl entry points.
+       I don't have easy access to hardware, so only compile tested.
+               - Signed-off-by:Andi Kleen <ak@muc.de>
+
+2.     megaraid_mbox fix: wrong order of arguments in memset()
+       That, BTW, shows why cross-builds are useful-the only indication of
+       problem had been a new warning showing up in sparse output on alpha
+       build (number of exceeding 256 got truncated).
+               - Signed-off-by: Al Viro
+               <viro@parcelfarce.linux.theplanet.co.uk>
+
+3.     Convert pci_module_init to pci_register_driver
+       Convert from pci_module_init to pci_register_driver
+       (from:http://kerneljanitors.org/TODO)
+               - Signed-off-by: Domen Puncer <domen@coderock.org>
+
+4.     Use the pre defined DMA mask constants from dma-mapping.h
+       Use the DMA_{64,32}BIT_MASK constants from dma-mapping.h when calling
+       pci_set_dma_mask() or pci_set_consistend_dma_mask(). See
+       http://marc.theaimsgroup.com/?t=108001993000001&r=1&w=2 for more
+       details.
+               Signed-off-by: Tobias Klauser <tklauser@nuerscht.ch>
+               Signed-off-by: Domen Puncer <domen@coderock.org>
+
+5.     Remove SSID checking for Dobson, Lindsay, and Verde based products.
+       Checking the SSVID/SSID for controllers which have Dobson, Lindsay,
+       and Verde is unnecessary because device ID has been assigned by LSI
+       and it is unique value. So, all controllers with these IOPs have to be
+       supported by the driver regardless SSVID/SSID.
+
+6.     Date Thu, 27 Jan 2005 04:31:09 +0100 
+       From Herbert Poetzl <> 
+       Subject RFC: assert_spin_locked() for 2.6 
+
+       Greetings!
+
+       overcautious programming will kill your kernel ;)
+       ever thought about checking a spin_lock or even
+       asserting that it must be held (maybe just for
+       spinlock debugging?) ...
+
+       there are several checks present in the kernel
+       where somebody does a variation on the following:
+
+         BUG_ON(!spin_is_locked(&some_lock));
+
+       so what's wrong about that? nothing, unless you
+       compile the code with CONFIG_DEBUG_SPINLOCK but 
+       without CONFIG_SMP ... in which case the BUG()
+       will kill your kernel ...
+
+       maybe it's not advised to make such assertions, 
+       but here is a solution which works for me ...
+       (compile tested for sh, x86_64 and x86, boot/run
+       tested for x86 only)
+
+       best,
+       Herbert
+
+               - Herbert Poetzl <herbert@13thfloor.at>, Thu, 27 Jan 2005
+
 Release Date   : Thu Feb 03 12:27:22 EST 2005 - Seokmann Ju <sju@lsil.com>
 Current Version        : 2.20.4.5 (scsi module), 2.20.2.5 (cmm module)
 Older Version  : 2.20.4.4 (scsi module), 2.20.2.4 (cmm module)
diff --git a/Documentation/scsi/scsi-changer.txt b/Documentation/scsi/scsi-changer.txt
new file mode 100644 (file)
index 0000000..c132687
--- /dev/null
@@ -0,0 +1,180 @@
+
+README for the SCSI media changer driver
+========================================
+
+This is a driver for SCSI Medium Changer devices, which are listed
+with "Type: Medium Changer" in /proc/scsi/scsi.
+
+This is for *real* Jukeboxes.  It is *not* supported to work with
+common small CD-ROM changers, neither one-lun-per-slot SCSI changers
+nor IDE drives.
+
+Userland tools available from here:
+       http://linux.bytesex.org/misc/changer.html
+
+
+General Information
+-------------------
+
+First some words about how changers work: A changer has 2 (possibly
+more) SCSI ID's. One for the changer device which controls the robot,
+and one for the device which actually reads and writes the data. The
+later may be anything, a MOD, a CD-ROM, a tape or whatever. For the
+changer device this is a "don't care", he *only* shuffles around the
+media, nothing else.
+
+
+The SCSI changer model is complex, compared to - for example - IDE-CD
+changers. But it allows to handle nearly all possible cases. It knows
+4 different types of changer elements:
+
+  media transport - this one shuffles around the media, i.e. the
+                    transport arm.  Also known as "picker".
+  storage         - a slot which can hold a media.
+  import/export   - the same as above, but is accessable from outside,
+                    i.e. there the operator (you !) can use this to
+                    fill in and remove media from the changer.
+                   Sometimes named "mailslot".
+  data transfer   - this is the device which reads/writes, i.e. the
+                   CD-ROM / Tape / whatever drive.
+
+None of these is limited to one: A huge Jukebox could have slots for
+123 CD-ROM's, 5 CD-ROM readers (and therefore 6 SCSI ID's: the changer
+and each CD-ROM) and 2 transport arms. No problem to handle.
+
+
+How it is implemented
+---------------------
+
+I implemented the driver as character device driver with a NetBSD-like
+ioctl interface. Just grabbed NetBSD's header file and one of the
+other linux SCSI device drivers as starting point. The interface
+should be source code compatible with NetBSD. So if there is any
+software (anybody knows ???) which supports a BSDish changer driver,
+it should work with this driver too.
+
+Over time a few more ioctls where added, volume tag support for example
+wasn't covered by the NetBSD ioctl API.
+
+
+Current State
+-------------
+
+Support for more than one transport arm is not implemented yet (and
+nobody asked for it so far...).
+
+I test and use the driver myself with a 35 slot cdrom jukebox from
+Grundig.  I got some reports telling it works ok with tape autoloaders
+(Exabyte, HP and DEC).  Some People use this driver with amanda.  It
+works fine with small (11 slots) and a huge (4 MOs, 88 slots)
+magneto-optical Jukebox.  Probably with lots of other changers too, most
+(but not all :-) people mail me only if it does *not* work...
+
+I don't have any device lists, neither black-list nor white-list.  Thus
+it is quite useless to ask me whenever a specific device is supported or
+not.  In theory every changer device which supports the SCSI-2 media
+changer command set should work out-of-the-box with this driver.  If it
+doesn't, it is a bug.  Either within the driver or within the firmware
+of the changer device.
+
+
+Using it
+--------
+
+This is a character device with major number is 86, so use
+"mknod /dev/sch0 c 86 0" to create the special file for the driver.
+
+If the module finds the changer, it prints some messages about the
+device [ try "dmesg" if you don't see anything ] and should show up in
+/proc/devices. If not....  some changers use ID ? / LUN 0 for the
+device and ID ? / LUN 1 for the robot mechanism. But Linux does *not*
+look for LUN's other than 0 as default, becauce there are to many
+broken devices. So you can try:
+
+  1) echo "scsi add-single-device 0 0 ID 1" > /proc/scsi/scsi
+     (replace ID with the SCSI-ID of the device)
+  2) boot the kernel with "max_scsi_luns=1" on the command line
+     (append="max_scsi_luns=1" in lilo.conf should do the trick)
+
+
+Trouble?
+--------
+
+If you insmod the driver with "insmod debug=1", it will be verbose and
+prints a lot of stuff to the syslog.  Compiling the kernel with
+CONFIG_SCSI_CONSTANTS=y improves the quality of the error messages alot
+because the kernel will translate the error codes into human-readable
+strings then.
+
+You can display these messages with the dmesg command (or check the
+logfiles).  If you email me some question becauce of a problem with the
+driver, please include these messages.
+
+
+Insmod options
+--------------
+
+debug=0/1
+       Enable debug messages (see above, default: 0).
+
+verbose=0/1
+       Be verbose (default: 1).
+
+init=0/1
+       Send INITIALIZE ELEMENT STATUS command to the changer
+       at insmod time (default: 1).
+
+timeout_init=<seconds>
+       timeout for the INITIALIZE ELEMENT STATUS command
+       (default: 3600).
+
+timeout_move=<seconds>
+       timeout for all other commands (default: 120).
+
+dt_id=<id1>,<id2>,...
+dt_lun=<lun1>,<lun2>,...
+       These two allow to specify the SCSI ID and LUN for the data
+       transfer elements.  You likely don't need this as the jukebox
+       should provide this information.  But some devices don't ...
+
+vendor_firsts=
+vendor_counts=
+vendor_labels=
+       These insmod options can be used to tell the driver that there
+       are some vendor-specific element types.  Grundig for example
+       does this.  Some jukeboxes have a printer to label fresh burned
+       CDs, which is addressed as element 0xc000 (type 5).  To tell the
+       driver about this vendor-specific element, use this:
+               $ insmod ch                     \
+                       vendor_firsts=0xc000    \
+                       vendor_counts=1         \
+                       vendor_labels=printer
+       All three insmod options accept up to four comma-separated
+       values, this way you can configure the element types 5-8.
+       You likely need the SCSI specs for the device in question to
+       find the correct values as they are not covered by the SCSI-2
+       standard.
+
+
+Credits
+-------
+
+I wrote this driver using the famous mailing-patches-around-the-world
+method.  With (more or less) help from:
+
+       Daniel Moehwald <moehwald@hdg.de>
+       Dane Jasper <dane@sonic.net>
+       R. Scott Bailey <sbailey@dsddi.eds.com>
+       Jonathan Corbet <corbet@lwn.net>
+
+Special thanks go to
+       Martin Kuehne <martin.kuehne@bnbt.de>
+for a old, second-hand (but full functional) cdrom jukebox which I use
+to develop/test driver and tools now.
+
+Have fun,
+
+   Gerd
+
+-- 
+Gerd Knorr <kraxel@bytesex.org>
index e41703d7d24d3f0579acccdc0b28a56da2621ff1..da176c95d0fb62618ff5c3684f5768a935f9dd0f 100644 (file)
@@ -936,8 +936,7 @@ Details:
  *
  *      Returns SUCCESS if command aborted else FAILED
  *
- *      Locks: struct Scsi_Host::host_lock held (with irqsave) on entry 
- *      and assumed to be held on return.
+ *      Locks: None held
  *
  *      Calling context: kernel thread
  *
@@ -955,8 +954,7 @@ Details:
  *
  *      Returns SUCCESS if command aborted else FAILED
  *
- *      Locks: struct Scsi_Host::host_lock held (with irqsave) on entry 
- *      and assumed to be held on return.
+ *      Locks: None held
  *
  *      Calling context: kernel thread
  *
@@ -974,8 +972,7 @@ Details:
  *
  *      Returns SUCCESS if command aborted else FAILED
  *
- *      Locks: struct Scsi_Host::host_lock held (with irqsave) on entry
- *      and assumed to be held on return.
+ *      Locks: None held
  *
  *      Calling context: kernel thread
  *
@@ -993,8 +990,7 @@ Details:
  *
  *      Returns SUCCESS if command aborted else FAILED
  *
- *      Locks: struct Scsi_Host::host_lock held (with irqsave) on entry
- *      and assumed to be held on return.
+ *      Locks: None held
  *
  *      Calling context: kernel thread
  *
diff --git a/Documentation/sgi-ioc4.txt b/Documentation/sgi-ioc4.txt
new file mode 100644 (file)
index 0000000..876c96a
--- /dev/null
@@ -0,0 +1,45 @@
+The SGI IOC4 PCI device is a bit of a strange beast, so some notes on
+it are in order.
+
+First, even though the IOC4 performs multiple functions, such as an
+IDE controller, a serial controller, a PS/2 keyboard/mouse controller,
+and an external interrupt mechanism, it's not implemented as a
+multifunction device.  The consequence of this from a software
+standpoint is that all these functions share a single IRQ, and
+they can't all register to own the same PCI device ID.  To make
+matters a bit worse, some of the register blocks (and even registers
+themselves) present in IOC4 are mixed-purpose between these several
+functions, meaning that there's no clear "owning" device driver.
+
+The solution is to organize the IOC4 driver into several independent
+drivers, "ioc4", "sgiioc4", and "ioc4_serial".  Note that there is no
+PS/2 controller driver as this functionality has never been wired up
+on a shipping IO card.
+
+ioc4
+====
+This is the core (or shim) driver for IOC4.  It is responsible for
+initializing the basic functionality of the chip, and allocating
+the PCI resources that are shared between the IOC4 functions.
+
+This driver also provides registration functions that the other
+IOC4 drivers can call to make their presence known.  Each driver
+needs to provide a probe and remove function, which are invoked
+by the core driver at appropriate times.  The interface of these
+IOC4 function probe and remove operations isn't precisely the same
+as PCI device probe and remove operations, but is logically the
+same operation.
+
+sgiioc4
+=======
+This is the IDE driver for IOC4.  Its name isn't very descriptive
+simply for historical reasons (it used to be the only IOC4 driver
+component).  There's not much to say about it other than it hooks
+up to the ioc4 driver via the appropriate registration, probe, and
+remove functions.
+
+ioc4_serial
+===========
+This is the serial driver for IOC4.  There's not much to say about it
+other than it hooks up to the ioc4 driver via the appropriate registration,
+probe, and remove functions.
index 44b6eea60ecec18a090a426a3c5cbef7920b5e82..b9e6be00cadfbc1f2e767076c467ccb6f6ad28e6 100644 (file)
@@ -25,6 +25,9 @@ APICs
 
    noapictimer  Don't set up the APIC timer
 
+   no_timer_check Don't check the IO-APIC timer. This can work around
+                problems with incorrect timer initialization on some boards.
+
 Early Console
 
    syntax: earlyprintk=vga
index 5b8483334de1eb0e30b83dc825f8867294bc4e0c..0f88a70a15d80c52c42237ebc858cc11daac3aa5 100644 (file)
@@ -73,7 +73,7 @@ S: Status, one of the following:
 3C359 NETWORK DRIVER
 P:     Mike Phillips
 M:     mikep@linuxtr.net
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 L:     linux-tr@linuxtr.net
 W:     http://www.linuxtr.net
 S:     Maintained
@@ -81,13 +81,13 @@ S:  Maintained
 3C505 NETWORK DRIVER
 P:     Philip Blundell
 M:     philb@gnu.org
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 3CR990 NETWORK DRIVER
 P:     David Dillow
 M:     dave@thedillows.org
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 3W-XXXX ATA-RAID CONTROLLER DRIVER
@@ -130,7 +130,7 @@ S:  Maintained
 8169 10/100/1000 GIGABIT ETHERNET DRIVER
 P:     Francois Romieu
 M:     romieu@fr.zoreil.com
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 8250/16?50 (AND CLONE UARTS) SERIAL DRIVER
@@ -143,7 +143,7 @@ S:  Maintained
 8390 NETWORK DRIVERS [WD80x3/SMC-ELITE, SMC-ULTRA, NE2000, 3C503, etc.]
 P:     Paul Gortmaker
 M:     p_gortmaker@yahoo.com
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 A2232 SERIAL BOARD DRIVER
@@ -239,6 +239,12 @@ L: linux-usb-devel@lists.sourceforge.net
 W:     http://www.linux-usb.org/SpeedTouch/
 S:     Maintained
 
+ALI1563 I2C DRIVER
+P:     Rudolf Marek
+M:     r.marek@sh.cvut.cz
+L:     sensors@stimpy.netroedge.com
+S:     Maintained
+
 ALPHA PORT
 P:     Richard Henderson
 M:     rth@twiddle.net
@@ -259,6 +265,11 @@ P: Arnaldo Carvalho de Melo
 M:     acme@conectiva.com.br
 S:     Maintained
 
+ARC FRAMEBUFFER DRIVER
+P:     Jaya Kumar
+M:     jayalk@intworks.biz
+S:     Maintained
+
 ARM26 ARCHITECTURE
 P:     Ian Molton
 M:     spyro@f2s.com
@@ -326,7 +337,7 @@ S:  Maintained
 
 ARPD SUPPORT
 P:     Jonathan Layes
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 ASUS ACPI EXTRAS DRIVER
@@ -700,7 +711,7 @@ S:  Orphaned
 
 DIGI RIGHTSWITCH NETWORK DRIVER
 P:     Rick Richardson
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 W:     http://www.digi.com
 S:     Orphaned
 
@@ -730,6 +741,11 @@ M: tori@unhappy.mine.nu
 L:     linux-kernel@vger.kernel.org
 S:     Maintained
 
+DOCBOOK FOR DOCUMENTATION
+P:     Martin Waitz
+M:     tali@admingilde.org
+S:     Maintained
+
 DOUBLETALK DRIVER
 P:     James R. Van Zandt
 M:     jrv@vanzandt.mv.com
@@ -806,7 +822,7 @@ S:  Maintained
 ETHEREXPRESS-16 NETWORK DRIVER
 P:     Philip Blundell
 M:     philb@gnu.org
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 ETHERNET BRIDGE
@@ -869,7 +885,7 @@ S:  Maintained
 FRAME RELAY DLCI/FRAD (Sangoma drivers too)
 P:     Mike McLagan
 M:     mike.mclagan@linux.org
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 FREEVXFS FILESYSTEM
@@ -1023,8 +1039,8 @@ W:        http://www.ia64-linux.org/
 S:     Maintained
 
 SN-IA64 (Itanium) SUB-PLATFORM
-P:     Jesse Barnes
-M:     jbarnes@sgi.com
+P:     Greg Edwards
+M:     edwardsg@sgi.com
 L:     linux-altix@sgi.com
 L:     linux-ia64@vger.kernel.org
 W:     http://www.sgi.com/altix
@@ -1209,7 +1225,7 @@ S:        Maintained
 IPX NETWORK LAYER
 P:     Arnaldo Carvalho de Melo
 M:     acme@conectiva.com.br
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 IRDA SUBSYSTEM
@@ -1476,7 +1492,7 @@ MARVELL MV64340 ETHERNET DRIVER
 P:     Manish Lachwani
 M:     Manish_Lachwani@pmc-sierra.com
 L:     linux-mips@linux-mips.org
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Supported
 
 MATROX FRAMEBUFFER DRIVER
@@ -1586,13 +1602,13 @@ P:      Andrew Morton
 M:     akpm@osdl.org
 P:     Jeff Garzik
 M:     jgarzik@pobox.com
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 NETWORKING [GENERAL]
 P:     Networking Team
-M:     netdev@oss.sgi.com
-L:     netdev@oss.sgi.com
+M:     netdev@vger.kernel.org
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 NETWORKING [IPv4/IPv6]
@@ -1608,7 +1624,7 @@ P:        Hideaki YOSHIFUJI
 M:     yoshfuji@linux-ipv6.org
 P:     Patrick McHardy
 M:     kaber@coreworks.de
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 IPVS
@@ -1628,7 +1644,7 @@ NI5010 NETWORK DRIVER
 P:     Jan-Pascal van Best and Andreas Mohr
 M:     Jan-Pascal van Best <jvbest@qv3pluto.leidenuniv.nl>
 M:     Andreas Mohr <100.30936@germany.net>
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 NINJA SCSI-3 / NINJA SCSI-32Bi (16bit/CardBus) PCMCIA SCSI HOST ADAPTER DRIVER
@@ -1670,7 +1686,7 @@ P:        Peter De Shrijver
 M:     p2@ace.ulyssis.student.kuleuven.ac.be
 P:     Mike Phillips
 M:     mikep@linuxtr.net 
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 L:     linux-tr@linuxtr.net
 W:     http://www.linuxtr.net
 S:     Maintained
@@ -1777,7 +1793,7 @@ S:        Unmaintained
 PCNET32 NETWORK DRIVER
 P:     Thomas Bogendörfer
 M:     tsbogend@alpha.franken.de
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 PHRAM MTD DRIVER
@@ -1789,7 +1805,7 @@ S:        Maintained
 POSIX CLOCKS and TIMERS
 P:     George Anzinger
 M:     george@mvista.com
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Supported
 
 PNP SUPPORT
@@ -1824,7 +1840,7 @@ S:        Supported
 PRISM54 WIRELESS DRIVER
 P:     Prism54 Development Team
 M:     prism54-private@prism54.org
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 W:     http://prism54.org
 S:     Maintained
 
@@ -2041,7 +2057,7 @@ SIS 900/7016 FAST ETHERNET DRIVER
 P:     Daniele Venzano
 M:     venza@brownhat.org
 W:     http://www.brownhat.org/sis900.html
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 SIS FRAMEBUFFER DRIVER
@@ -2100,7 +2116,7 @@ S:        Maintained
 SONIC NETWORK DRIVER
 P:     Thomas Bogendoerfer
 M:     tsbogend@alpha.franken.de
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Maintained
 
 SONY VAIO CONTROL DEVICE DRIVER
@@ -2157,7 +2173,7 @@ S:        Supported
 SPX NETWORK LAYER
 P:     Jay Schulist
 M:     jschlst@samba.org
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 S:     Supported
 
 SRM (Alpha) environment access
@@ -2236,7 +2252,7 @@ S:        Maintained
 TOKEN-RING NETWORK DRIVER
 P:     Mike Phillips
 M:     mikep@linuxtr.net
-L:     netdev@oss.sgi.com
+L:     netdev@vger.kernel.org
 L:     linux-tr@linuxtr.net
 W:     http://www.linuxtr.net
 S:     Maintained
index bddcb861b49bbb90bc5646a7da5c55833f4689b5..0d1e74d50067dbce4bd3dc9bcbd7954460b5da61 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 12
-EXTRAVERSION =-rc4
+EXTRAVERSION =
 NAME=Woozy Numbat
 
 # *DOCUMENTATION*
@@ -530,7 +530,7 @@ endif
 include $(srctree)/arch/$(ARCH)/Makefile
 
 # arch Makefile may override CC so keep this after arch Makefile is included
-NOSTDINC_FLAGS := -nostdinc -isystem $(shell $(CC) -print-file-name=include)
+NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
 CHECKFLAGS     += $(NOSTDINC_FLAGS)
 
 # warn about C99 declaration after statement
index 64e450dddb49d55c3ddea43bb35371958f52369a..167fd89f8707aeb1b0ad59190e9fa352718d5900 100644 (file)
@@ -1150,16 +1150,13 @@ osf_usleep_thread(struct timeval32 __user *sleep, struct timeval32 __user *remai
        if (get_tv32(&tmp, sleep))
                goto fault;
 
-       ticks = tmp.tv_usec;
-       ticks = (ticks + (1000000 / HZ) - 1) / (1000000 / HZ);
-       ticks += tmp.tv_sec * HZ;
+       ticks = timeval_to_jiffies(&tmp);
 
        current->state = TASK_INTERRUPTIBLE;
        ticks = schedule_timeout(ticks);
 
        if (remain) {
-               tmp.tv_sec = ticks / HZ;
-               tmp.tv_usec = ticks % HZ;
+               jiffies_to_timeval(ticks, &tmp);
                if (put_tv32(remain, &tmp))
                        goto fault;
        }
index bf397a9f8ac29bf0438234817963075149af7d39..ee8a9ad7bbd95343f46cd20e9467e062eaf848f2 100644 (file)
@@ -67,10 +67,6 @@ config GENERIC_BUST_SPINLOCK
 config GENERIC_ISA_DMA
        bool
 
-config GENERIC_IOMAP
-       bool
-       default y
-
 config FIQ
        bool
 
@@ -202,6 +198,11 @@ config ARCH_H720X
        help
          This enables support for systems based on the Hynix HMS720x
 
+config ARCH_AAEC2000
+       bool "Agilent AAEC-2000 based"
+       help
+         This enables support for systems based on the Agilent AAEC-2000
+
 endchoice
 
 source "arch/arm/mach-clps711x/Kconfig"
@@ -234,6 +235,8 @@ source "arch/arm/mach-h720x/Kconfig"
 
 source "arch/arm/mach-versatile/Kconfig"
 
+source "arch/arm/mach-aaec2000/Kconfig"
+
 # Definitions to make life easier
 config ARCH_ACORN
        bool
@@ -277,7 +280,7 @@ config ISA_DMA_API
        default y
 
 config PCI
-       bool "PCI support" if ARCH_INTEGRATOR_AP
+       bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB
        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
@@ -497,7 +500,7 @@ source "drivers/cpufreq/Kconfig"
 
 config CPU_FREQ_SA1100
        bool
-       depends on CPU_FREQ && (SA1100_LART || SA1100_PLEB)
+       depends on CPU_FREQ && (SA1100_H3100 || SA1100_H3600 || SA1100_H3800 || SA1100_LART || SA1100_PLEB || SA1100_BADGE4 || SA1100_HACKKIT)
        default y
 
 config CPU_FREQ_SA1110
@@ -689,7 +692,9 @@ source "drivers/block/Kconfig"
 
 source "drivers/acorn/block/Kconfig"
 
-if ARCH_CLPS7500 || ARCH_IOP3XX || ARCH_IXP4XX || ARCH_L7200 || ARCH_LH7A40X || ARCH_PXA || ARCH_RPC || ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE
+if PCMCIA || ARCH_CLPS7500 || ARCH_IOP3XX || ARCH_IXP4XX \
+       || ARCH_L7200 || ARCH_LH7A40X || ARCH_PXA || ARCH_RPC \
+       || ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE
 source "drivers/ide/Kconfig"
 endif
 
index 2277e3d179cc79ea84e12fc72e0676cbb9e6f46d..8330495e2448bc33f2ad7236b4fb5e4a45ebb2a1 100644 (file)
@@ -97,6 +97,7 @@ textaddr-$(CONFIG_ARCH_FORTUNET)   := 0xc0008000
  machine-$(CONFIG_ARCH_VERSATILE)  := versatile
  machine-$(CONFIG_ARCH_IMX)       := imx
  machine-$(CONFIG_ARCH_H720X)     := h720x
+ machine-$(CONFIG_ARCH_AAEC2000)   := aaec2000
 
 ifeq ($(CONFIG_ARCH_EBSA110),y)
 # This is what happens if you forget the IOCS16 line.
index 665bd2c2074303d44b7c3593125c7659cc5258f8..d3fe2533907ec1af9c812362eb91802a8af713f4 100644 (file)
@@ -47,3 +47,10 @@ __XScale_start:
                orr     r7, r7, #(MACH_TYPE_GTWX5715 & 0xff00)
 #endif
 
+#ifdef CONFIG_ARCH_IXP2000
+               mov     r1, #-1
+               mov     r0, #0xd6000000
+               str     r1, [r0, #0x14]
+               str     r1, [r0, #0x18]
+#endif
+
index a0507f8c33fe815838a825a6abf069e035eeaef1..c6beb751f2a93b4057a49df188d8522e1809dcdc 100644 (file)
@@ -169,7 +169,7 @@ static void amba_device_release(struct device *dev)
 }
 
 #define amba_attr(name,fmt,arg...)                             \
-static ssize_t show_##name(struct device *_dev, char *buf)     \
+static ssize_t show_##name(struct device *_dev, struct device_attribute *attr, char *buf)      \
 {                                                              \
        struct amba_device *dev = to_amba_device(_dev);         \
        return sprintf(buf, fmt, arg);                          \
index 5797b1b100a1bc707031a3d7f169658261f4fe36..9d63a01214ebce2941a7033f41d49a059825a0fc 100644 (file)
@@ -30,6 +30,8 @@
 #include <linux/dmapool.h>
 #include <linux/list.h>
 
+#include <asm/cacheflush.h>
+
 #undef DEBUG
 
 #undef STATS
@@ -302,12 +304,24 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
 
                DO_STATS ( device_info->bounce_count++ );
 
-               if ((dir == DMA_FROM_DEVICE) ||
-                   (dir == DMA_BIDIRECTIONAL)) {
+               if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) {
+                       unsigned long ptr;
+
                        dev_dbg(dev,
                                "%s: copy back safe %p to unsafe %p size %d\n",
                                __func__, buf->safe, buf->ptr, size);
                        memcpy(buf->ptr, buf->safe, size);
+
+                       /*
+                        * DMA buffers must have the same cache properties
+                        * as if they were really used for DMA - which means
+                        * data must be written back to RAM.  Note that
+                        * we don't use dmac_flush_range() here for the
+                        * bidirectional case because we know the cache
+                        * lines will be coherent with the data written.
+                        */
+                       ptr = (unsigned long)buf->ptr;
+                       dmac_clean_range(ptr, ptr + size);
                }
                free_safe_buffer(device_info, buf);
        }
index c2c557a224c2af0b7c558263e920f42868795cf0..c94864c5b1af568ae3fb796f6790d4f4850de283 100644 (file)
@@ -22,7 +22,7 @@
  * them early in the boot process, then pass them to the appropriate drivers.
  * Not all devices use all paramaters but the format is common to all.
  */
-#ifdef ARCH_SA1100
+#ifdef CONFIG_ARCH_SA1100
 #define PARAM_BASE     0xe8ffc000
 #else
 #define PARAM_BASE     0xa0000a00
index 2b4059d2f8e457c05af2cba17f060b7dcf252388..5d92af975d870ae59b162d33e7ca49e56cca924d 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc1-bk2
-# Sat Mar 26 21:32:26 2005
+# Linux kernel version: 2.6.12-rc6-git3
+# Thu Jun  9 19:00:50 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -16,6 +16,7 @@ CONFIG_GENERIC_IOMAP=y
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -34,6 +35,8 @@ CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -109,7 +112,6 @@ CONFIG_CPU_ABRT_EV4=y
 CONFIG_CPU_CACHE_V4WB=y
 CONFIG_CPU_CACHE_VIVT=y
 CONFIG_CPU_TLB_V4WB=y
-CONFIG_CPU_MINICACHE=y
 
 #
 # Processor Features
@@ -122,6 +124,7 @@ CONFIG_FORCE_MAX_ZONEORDER=9
 # Bus support
 #
 CONFIG_ISA=y
+CONFIG_ISA_DMA_API=y
 
 #
 # PCCARD (PCMCIA/CardBus) support
@@ -131,6 +134,7 @@ CONFIG_ISA=y
 #
 # Kernel Features
 #
+# CONFIG_SMP is not set
 # CONFIG_PREEMPT is not set
 CONFIG_DISCONTIGMEM=y
 # CONFIG_LEDS is not set
@@ -152,12 +156,14 @@ CONFIG_CPU_FREQ_TABLE=y
 # CONFIG_CPU_FREQ_DEBUG is not set
 CONFIG_CPU_FREQ_STAT=y
 # CONFIG_CPU_FREQ_STAT_DETAILS is not set
-CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
-# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
 CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
 # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
-# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
 # CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_SA1100=y
 
 #
 # Floating point emulation
@@ -294,7 +300,6 @@ CONFIG_PARPORT_NOT_PC=y
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_DEV_XD is not set
 # CONFIG_PARIDE is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
@@ -428,7 +433,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -526,6 +530,7 @@ CONFIG_IRDA_ULTRA=y
 # CONFIG_SMC_IRCC_FIR is not set
 # CONFIG_ALI_FIR is not set
 CONFIG_SA1100_FIR=y
+# CONFIG_VIA_FIR is not set
 CONFIG_BT=m
 CONFIG_BT_L2CAP=m
 # CONFIG_BT_SCO is not set
@@ -618,7 +623,6 @@ CONFIG_NET_WIRELESS=y
 #
 # CONFIG_SERIO is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
@@ -687,7 +691,6 @@ CONFIG_RTC=m
 #
 # TPM devices
 #
-# CONFIG_TCG_TPM is not set
 
 #
 # I2C support
@@ -736,6 +739,7 @@ CONFIG_I2C_ELEKTOR=m
 # CONFIG_SENSORS_LM85 is not set
 # CONFIG_SENSORS_LM87 is not set
 # CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
 # CONFIG_SENSORS_MAX1619 is not set
 # CONFIG_SENSORS_PC87360 is not set
 # CONFIG_SENSORS_SMSC47B397 is not set
@@ -747,6 +751,7 @@ CONFIG_I2C_ELEKTOR=m
 #
 # Other I2C Chip support
 #
+# CONFIG_SENSORS_DS1337 is not set
 # CONFIG_SENSORS_EEPROM is not set
 # CONFIG_SENSORS_PCF8574 is not set
 # CONFIG_SENSORS_PCF8591 is not set
@@ -871,7 +876,6 @@ CONFIG_USB_PRINTER=m
 #
 CONFIG_USB_STORAGE=y
 CONFIG_USB_STORAGE_DEBUG=y
-# CONFIG_USB_STORAGE_RW_DETECT is not set
 # CONFIG_USB_STORAGE_DATAFAB is not set
 # CONFIG_USB_STORAGE_FREECOM is not set
 # CONFIG_USB_STORAGE_ISD200 is not set
@@ -954,9 +958,11 @@ CONFIG_USB_USS720=m
 #
 CONFIG_USB_SERIAL=m
 CONFIG_USB_SERIAL_GENERIC=y
+# CONFIG_USB_SERIAL_AIRPRIME is not set
 CONFIG_USB_SERIAL_BELKIN=m
 CONFIG_USB_SERIAL_WHITEHEAT=m
 CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+# CONFIG_USB_SERIAL_CP2101 is not set
 # CONFIG_USB_SERIAL_CYPRESS_M8 is not set
 CONFIG_USB_SERIAL_EMPEG=m
 CONFIG_USB_SERIAL_FTDI_SIO=m
@@ -985,6 +991,7 @@ CONFIG_USB_SERIAL_KEYSPAN=m
 # CONFIG_USB_SERIAL_KOBIL_SCT is not set
 CONFIG_USB_SERIAL_MCT_U232=m
 CONFIG_USB_SERIAL_PL2303=m
+# CONFIG_USB_SERIAL_HP4X is not set
 # CONFIG_USB_SERIAL_SAFE is not set
 # CONFIG_USB_SERIAL_TI is not set
 CONFIG_USB_SERIAL_CYBERJACK=m
index e8f9fccffe84a02809fd5f40306ac712d4da09bf..06fae4b62774659a1b6389db4a1a5d56f5a088c2 100644 (file)
@@ -50,7 +50,13 @@ CONFIG_BASE_SMALL=0
 #
 # Loadable module support
 #
-# CONFIG_MODULES is not set
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
 
 #
 # System Type
index b4e297dd54b2286374dfa6814018fb65f03bf2cd..b9de07de80feac1f708039d39940864c5192c94b 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc1-bk2
-# Mon Mar 28 00:02:26 2005
+# Linux kernel version: 2.6.12-rc4
+# Thu Jun  9 01:59:03 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -16,6 +16,7 @@ CONFIG_GENERIC_IOMAP=y
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -33,6 +34,8 @@ CONFIG_KOBJECT_UEVENT=y
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -120,6 +123,7 @@ CONFIG_CPU_MINICACHE=y
 # Bus support
 #
 CONFIG_ISA=y
+CONFIG_ISA_DMA_API=y
 
 #
 # PCCARD (PCMCIA/CardBus) support
@@ -138,6 +142,7 @@ CONFIG_PCMCIA_SA1100=y
 #
 # Kernel Features
 #
+# CONFIG_SMP is not set
 # CONFIG_PREEMPT is not set
 CONFIG_DISCONTIGMEM=y
 # CONFIG_LEDS is not set
@@ -159,12 +164,13 @@ CONFIG_CPU_FREQ_TABLE=y
 # CONFIG_CPU_FREQ_DEBUG is not set
 CONFIG_CPU_FREQ_STAT=y
 # CONFIG_CPU_FREQ_STAT_DETAILS is not set
-CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
-# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
-CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
+# CONFIG_CPU_FREQ_GOV_PERFORMANCE is not set
 # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
-# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
 # CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
+CONFIG_CPU_FREQ_SA1100=y
 
 #
 # Floating point emulation
@@ -298,7 +304,6 @@ CONFIG_MTD_SA1100=y
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_DEV_XD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=m
@@ -379,7 +384,6 @@ CONFIG_NET=y
 # Networking options
 #
 # CONFIG_PACKET is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -476,6 +480,7 @@ CONFIG_IRCOMM=m
 # CONFIG_SMC_IRCC_FIR is not set
 # CONFIG_ALI_FIR is not set
 CONFIG_SA1100_FIR=m
+# CONFIG_VIA_FIR is not set
 # CONFIG_BT is not set
 CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
@@ -647,7 +652,6 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
-# CONFIG_TCG_TPM is not set
 
 #
 # I2C support
@@ -676,9 +680,11 @@ CONFIG_FB_CFB_FILLRECT=y
 CONFIG_FB_CFB_COPYAREA=y
 CONFIG_FB_CFB_IMAGEBLIT=y
 CONFIG_FB_SOFT_CURSOR=y
+# CONFIG_FB_MACMODES is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
 CONFIG_FB_SA1100=y
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
index 6987c8c5ddb4ac3fe28f2285f3d7b4e7f235d03f..fb41a36a5a68fe42ce39f08a3367b9abf984ac6b 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc1-bk2
-# Mon Mar 28 00:22:34 2005
+# Linux kernel version: 2.6.12-rc6-git3
+# Thu Jun  9 20:58:58 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -16,6 +16,7 @@ CONFIG_GENERIC_IOMAP=y
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -34,6 +35,8 @@ CONFIG_KOBJECT_UEVENT=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -109,7 +112,6 @@ CONFIG_CPU_ABRT_EV4=y
 CONFIG_CPU_CACHE_V4WB=y
 CONFIG_CPU_CACHE_VIVT=y
 CONFIG_CPU_TLB_V4WB=y
-CONFIG_CPU_MINICACHE=y
 
 #
 # Processor Features
@@ -119,6 +121,7 @@ CONFIG_CPU_MINICACHE=y
 # Bus support
 #
 CONFIG_ISA=y
+CONFIG_ISA_DMA_API=y
 
 #
 # PCCARD (PCMCIA/CardBus) support
@@ -128,6 +131,7 @@ CONFIG_ISA=y
 #
 # Kernel Features
 #
+# CONFIG_SMP is not set
 # CONFIG_PREEMPT is not set
 CONFIG_DISCONTIGMEM=y
 CONFIG_LEDS=y
@@ -151,12 +155,14 @@ CONFIG_CPU_FREQ_TABLE=y
 # CONFIG_CPU_FREQ_DEBUG is not set
 CONFIG_CPU_FREQ_STAT=y
 # CONFIG_CPU_FREQ_STAT_DETAILS is not set
-CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
-# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
 CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
 # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
-# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
 # CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_SA1100=y
 
 #
 # Floating point emulation
@@ -280,7 +286,6 @@ CONFIG_MTD_CFI_UTIL=y
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_DEV_XD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 # CONFIG_BLK_DEV_LOOP is not set
@@ -338,7 +343,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -484,7 +488,6 @@ CONFIG_SERIO=y
 CONFIG_SERIO_SERPORT=y
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
@@ -533,7 +536,6 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
-# CONFIG_TCG_TPM is not set
 
 #
 # I2C support
index 4fd663ecbe39085376bfdefeea608723cee85e5d..810a450a55d22a4c1dbcc139688f937aafab9db8 100644 (file)
@@ -50,7 +50,13 @@ CONFIG_BASE_SMALL=0
 #
 # Loadable module support
 #
-# CONFIG_MODULES is not set
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
 
 #
 # System Type
index 6f51c98084a3500727de6283825cbf7c58a7efbe..72e1b940e975b858769ac25ce0556dee0b0d0c62 100644 (file)
@@ -50,7 +50,13 @@ CONFIG_BASE_SMALL=0
 #
 # Loadable module support
 #
-# CONFIG_MODULES is not set
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
 
 #
 # System Type
index 7be3521f91fc85e27053fd4fb922021dc058e45d..1592e45f027839e7967ef26c17e79bdc44bd1f64 100644 (file)
@@ -50,7 +50,13 @@ CONFIG_BASE_SMALL=0
 #
 # Loadable module support
 #
-# CONFIG_MODULES is not set
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
 
 #
 # System Type
index cd84a20f30f1e79b327466410d9b75b77802e551..f1afe3d09ec66c5797ed553f1de4d1c1138396ed 100644 (file)
@@ -50,7 +50,13 @@ CONFIG_BASE_SMALL=0
 #
 # Loadable module support
 #
-# CONFIG_MODULES is not set
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
 
 #
 # System Type
index 4a2af55e134bcdc2cb07f01fc45d85458c673d94..3e1b0327e4d7a3a9bc25920eb98f6c5ab43c4b81 100644 (file)
@@ -6,7 +6,7 @@ AFLAGS_head.o := -DTEXTADDR=$(TEXTADDR) -DDATAADDR=$(DATAADDR)
 
 # Object file lists.
 
-obj-y          := arch.o compat.o dma.o entry-armv.o entry-common.o irq.o   \
+obj-y          := compat.o dma.o entry-armv.o entry-common.o irq.o \
                   process.o ptrace.o semaphore.o setup.o signal.o sys_arm.o \
                   time.o traps.o
 
diff --git a/arch/arm/kernel/arch.c b/arch/arm/kernel/arch.c
deleted file mode 100644 (file)
index 4e02fbe..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  linux/arch/arm/kernel/arch.c
- *
- *  Architecture specific fixups.
- */
-#include <linux/config.h>
-#include <linux/init.h>
-#include <linux/types.h>
-
-#include <asm/elf.h>
-#include <asm/page.h>
-#include <asm/setup.h>
-#include <asm/mach/arch.h>
-
-unsigned int vram_size;
-
-#ifdef CONFIG_ARCH_ACORN
-
-unsigned int memc_ctrl_reg;
-unsigned int number_mfm_drives;
-
-static int __init parse_tag_acorn(const struct tag *tag)
-{
-       memc_ctrl_reg = tag->u.acorn.memc_control_reg;
-       number_mfm_drives = tag->u.acorn.adfsdrives;
-
-       switch (tag->u.acorn.vram_pages) {
-       case 512:
-               vram_size += PAGE_SIZE * 256;
-       case 256:
-               vram_size += PAGE_SIZE * 256;
-       default:
-               break;
-       }
-#if 0
-       if (vram_size) {
-               desc->video_start = 0x02000000;
-               desc->video_end   = 0x02000000 + vram_size;
-       }
-#endif
-       return 0;
-}
-
-__tagtable(ATAG_ACORN, parse_tag_acorn);
-
-#endif
index 3dc15b131f532e4494e0dffa5ba4ed99fa703688..6540db6913381f4474d12594c6a84376d53724dd 100644 (file)
@@ -866,19 +866,19 @@ static struct expansion_card *__init ecard_alloc_card(int type, int slot)
        return ec;
 }
 
-static ssize_t ecard_show_irq(struct device *dev, char *buf)
+static ssize_t ecard_show_irq(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        return sprintf(buf, "%u\n", ec->irq);
 }
 
-static ssize_t ecard_show_dma(struct device *dev, char *buf)
+static ssize_t ecard_show_dma(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        return sprintf(buf, "%u\n", ec->dma);
 }
 
-static ssize_t ecard_show_resources(struct device *dev, char *buf)
+static ssize_t ecard_show_resources(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        char *str = buf;
@@ -893,19 +893,19 @@ static ssize_t ecard_show_resources(struct device *dev, char *buf)
        return str - buf;
 }
 
-static ssize_t ecard_show_vendor(struct device *dev, char *buf)
+static ssize_t ecard_show_vendor(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        return sprintf(buf, "%u\n", ec->cid.manufacturer);
 }
 
-static ssize_t ecard_show_device(struct device *dev, char *buf)
+static ssize_t ecard_show_device(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        return sprintf(buf, "%u\n", ec->cid.product);
 }
 
-static ssize_t ecard_show_type(struct device *dev, char *buf)
+static ssize_t ecard_show_type(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        return sprintf(buf, "%s\n", ec->type == ECARD_EASI ? "EASI" : "IOC");
index 4eb36155dc93fa169b8853a75cd746566a31da49..39a6c1b0b9a32db8f578bab2d9f4156acc5d4054 100644 (file)
 
 #include "entry-header.S"
 
+/*
+ * Interrupt handling.  Preserves r7, r8, r9
+ */
+       .macro  irq_handler
+1:     get_irqnr_and_base r0, r6, r5, lr
+       movne   r1, sp
+       @
+       @ routine called with r0 = irq number, r1 = struct pt_regs *
+       @
+       adrne   lr, 1b
+       bne     asm_do_IRQ
+
+#ifdef CONFIG_SMP
+       /*
+        * XXX
+        *
+        * this macro assumes that irqstat (r6) and base (r5) are
+        * preserved from get_irqnr_and_base above
+        */
+       test_for_ipi r0, r6, r5, lr
+       movne   r0, sp
+       adrne   lr, 1b
+       bne     do_IPI
+#endif
+
+       .endm
+
 /*
  * Invalid mode handlers
  */
-       .macro  inv_entry, sym, reason
-       sub     sp, sp, #S_FRAME_SIZE           @ Allocate frame size in one go
-       stmia   sp, {r0 - lr}                   @ Save XXX r0 - lr
-       ldr     r4, .LC\sym
+       .macro  inv_entry, reason
+       sub     sp, sp, #S_FRAME_SIZE
+       stmib   sp, {r1 - lr}
        mov     r1, #\reason
        .endm
 
 __pabt_invalid:
-       inv_entry abt, BAD_PREFETCH
-       b       1f
+       inv_entry BAD_PREFETCH
+       b       common_invalid
 
 __dabt_invalid:
-       inv_entry abt, BAD_DATA
-       b       1f
+       inv_entry BAD_DATA
+       b       common_invalid
 
 __irq_invalid:
-       inv_entry irq, BAD_IRQ
-       b       1f
+       inv_entry BAD_IRQ
+       b       common_invalid
 
 __und_invalid:
-       inv_entry und, BAD_UNDEFINSTR
+       inv_entry BAD_UNDEFINSTR
+
+       @
+       @ XXX fall through to common_invalid
+       @
+
+@
+@ common_invalid - generic code for failed exception (re-entrant version of handlers)
+@
+common_invalid:
+       zero_fp
+
+       ldmia   r0, {r4 - r6}
+       add     r0, sp, #S_PC           @ here for interlock avoidance
+       mov     r7, #-1                 @  ""   ""    ""        ""
+       str     r4, [sp]                @ save preserved r0
+       stmia   r0, {r5 - r7}           @ lr_<exception>,
+                                       @ cpsr_<exception>, "old_r0"
 
-1:     zero_fp
-       ldmia   r4, {r5 - r7}                   @ Get XXX pc, cpsr, old_r0
-       add     r4, sp, #S_PC
-       stmia   r4, {r5 - r7}                   @ Save XXX pc, cpsr, old_r0
        mov     r0, sp
-       and     r2, r6, #31                     @ int mode
+       and     r2, r6, #0x1f
        b       bad_mode
 
 /*
  * SVC mode handlers
  */
-       .macro  svc_entry, sym
+       .macro  svc_entry
        sub     sp, sp, #S_FRAME_SIZE
-       stmia   sp, {r0 - r12}                  @ save r0 - r12
-       ldr     r2, .LC\sym
-       add     r0, sp, #S_FRAME_SIZE
-       ldmia   r2, {r2 - r4}                   @ get pc, cpsr
-       add     r5, sp, #S_SP
+       stmib   sp, {r1 - r12}
+
+       ldmia   r0, {r1 - r3}
+       add     r5, sp, #S_SP           @ here for interlock avoidance
+       mov     r4, #-1                 @  ""  ""      ""       ""
+       add     r0, sp, #S_FRAME_SIZE   @  ""  ""      ""       ""
+       str     r1, [sp]                @ save the "real" r0 copied
+                                       @ from the exception stack
+
        mov     r1, lr
 
        @
@@ -82,7 +125,7 @@ __und_invalid:
 
        .align  5
 __dabt_svc:
-       svc_entry abt
+       svc_entry
 
        @
        @ get ready to re-enable interrupts if appropriate
@@ -129,28 +172,24 @@ __dabt_svc:
 
        .align  5
 __irq_svc:
-       svc_entry irq
+       svc_entry
+
 #ifdef CONFIG_PREEMPT
-       get_thread_info r8
-       ldr     r9, [r8, #TI_PREEMPT]           @ get preempt count
-       add     r7, r9, #1                      @ increment it
-       str     r7, [r8, #TI_PREEMPT]
+       get_thread_info tsk
+       ldr     r8, [tsk, #TI_PREEMPT]          @ get preempt count
+       add     r7, r8, #1                      @ increment it
+       str     r7, [tsk, #TI_PREEMPT]
 #endif
-1:     get_irqnr_and_base r0, r6, r5, lr
-       movne   r1, sp
-       @
-       @ routine called with r0 = irq number, r1 = struct pt_regs *
-       @
-       adrne   lr, 1b
-       bne     asm_do_IRQ
+
+       irq_handler
 #ifdef CONFIG_PREEMPT
-       ldr     r0, [r8, #TI_FLAGS]             @ get flags
+       ldr     r0, [tsk, #TI_FLAGS]            @ get flags
        tst     r0, #_TIF_NEED_RESCHED
        blne    svc_preempt
 preempt_return:
-       ldr     r0, [r8, #TI_PREEMPT]           @ read preempt value
+       ldr     r0, [tsk, #TI_PREEMPT]          @ read preempt value
+       str     r8, [tsk, #TI_PREEMPT]          @ restore preempt count
        teq     r0, r7
-       str     r9, [r8, #TI_PREEMPT]           @ restore preempt count
        strne   r0, [r0, -r0]                   @ bug()
 #endif
        ldr     r0, [sp, #S_PSR]                @ irqs are already disabled
@@ -161,7 +200,7 @@ preempt_return:
 
 #ifdef CONFIG_PREEMPT
 svc_preempt:
-       teq     r9, #0                          @ was preempt count = 0
+       teq     r8, #0                          @ was preempt count = 0
        ldreq   r6, .LCirq_stat
        movne   pc, lr                          @ no
        ldr     r0, [r6, #4]                    @ local_irq_count
@@ -169,9 +208,9 @@ svc_preempt:
        adds    r0, r0, r1
        movne   pc, lr
        mov     r7, #0                          @ preempt_schedule_irq
-       str     r7, [r8, #TI_PREEMPT]           @ expects preempt_count == 0
+       str     r7, [tsk, #TI_PREEMPT]          @ expects preempt_count == 0
 1:     bl      preempt_schedule_irq            @ irq en/disable is done inside
-       ldr     r0, [r8, #TI_FLAGS]             @ get new tasks TI_FLAGS
+       ldr     r0, [tsk, #TI_FLAGS]            @ get new tasks TI_FLAGS
        tst     r0, #_TIF_NEED_RESCHED
        beq     preempt_return                  @ go again
        b       1b
@@ -179,7 +218,7 @@ svc_preempt:
 
        .align  5
 __und_svc:
-       svc_entry und
+       svc_entry
 
        @
        @ call emulation code, which returns using r9 if it has emulated
@@ -209,7 +248,7 @@ __und_svc:
 
        .align  5
 __pabt_svc:
-       svc_entry abt
+       svc_entry
 
        @
        @ re-enable interrupts if appropriate
@@ -242,12 +281,8 @@ __pabt_svc:
        ldmia   sp, {r0 - pc}^                  @ load r0 - pc, cpsr
 
        .align  5
-.LCirq:
-       .word   __temp_irq
-.LCund:
-       .word   __temp_und
-.LCabt:
-       .word   __temp_abt
+.LCcralign:
+       .word   cr_alignment
 #ifdef MULTI_ABORT
 .LCprocfns:
        .word   processor
@@ -262,14 +297,18 @@ __pabt_svc:
 /*
  * User mode handlers
  */
-       .macro  usr_entry, sym
-       sub     sp, sp, #S_FRAME_SIZE           @ Allocate frame size in one go
-       stmia   sp, {r0 - r12}                  @ save r0 - r12
-       ldr     r7, .LC\sym
-       add     r5, sp, #S_PC
-       ldmia   r7, {r2 - r4}                   @ Get USR pc, cpsr
-
-#if __LINUX_ARM_ARCH__ < 6
+       .macro  usr_entry
+       sub     sp, sp, #S_FRAME_SIZE
+       stmib   sp, {r1 - r12}
+
+       ldmia   r0, {r1 - r3}
+       add     r0, sp, #S_PC           @ here for interlock avoidance
+       mov     r4, #-1                 @  ""  ""     ""        ""
+
+       str     r1, [sp]                @ save the "real" r0 copied
+                                       @ from the exception stack
+
+#if __LINUX_ARM_ARCH__ < 6 && !defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG)
        @ make sure our user space atomic helper is aborted
        cmp     r2, #VIRT_OFFSET
        bichs   r3, r3, #PSR_Z_BIT
@@ -284,13 +323,13 @@ __pabt_svc:
        @
        @ Also, separately save sp_usr and lr_usr
        @
-       stmia   r5, {r2 - r4}
-       stmdb   r5, {sp, lr}^
+       stmia   r0, {r2 - r4}
+       stmdb   r0, {sp, lr}^
 
        @
        @ Enable the alignment trap while in kernel mode
        @
-       alignment_trap r7, r0, __temp_\sym
+       alignment_trap r0
 
        @
        @ Clear FP to mark the first stack frame
@@ -300,7 +339,7 @@ __pabt_svc:
 
        .align  5
 __dabt_usr:
-       usr_entry abt
+       usr_entry
 
        @
        @ Call the processor-specific abort handler:
@@ -329,30 +368,23 @@ __dabt_usr:
 
        .align  5
 __irq_usr:
-       usr_entry irq
+       usr_entry
 
+       get_thread_info tsk
 #ifdef CONFIG_PREEMPT
-       get_thread_info r8
-       ldr     r9, [r8, #TI_PREEMPT]           @ get preempt count
-       add     r7, r9, #1                      @ increment it
-       str     r7, [r8, #TI_PREEMPT]
+       ldr     r8, [tsk, #TI_PREEMPT]          @ get preempt count
+       add     r7, r8, #1                      @ increment it
+       str     r7, [tsk, #TI_PREEMPT]
 #endif
-1:     get_irqnr_and_base r0, r6, r5, lr
-       movne   r1, sp
-       adrne   lr, 1b
-       @
-       @ routine called with r0 = irq number, r1 = struct pt_regs *
-       @
-       bne     asm_do_IRQ
+
+       irq_handler
 #ifdef CONFIG_PREEMPT
-       ldr     r0, [r8, #TI_PREEMPT]
+       ldr     r0, [tsk, #TI_PREEMPT]
+       str     r8, [tsk, #TI_PREEMPT]
        teq     r0, r7
-       str     r9, [r8, #TI_PREEMPT]
        strne   r0, [r0, -r0]
-       mov     tsk, r8
-#else
-       get_thread_info tsk
 #endif
+
        mov     why, #0
        b       ret_to_user
 
@@ -360,7 +392,7 @@ __irq_usr:
 
        .align  5
 __und_usr:
-       usr_entry und
+       usr_entry
 
        tst     r3, #PSR_T_BIT                  @ Thumb mode?
        bne     fpundefinstr                    @ ignore FP
@@ -476,7 +508,7 @@ fpundefinstr:
 
        .align  5
 __pabt_usr:
-       usr_entry abt
+       usr_entry
 
        enable_irq                              @ Enable interrupts
        mov     r0, r2                          @ address (pc)
@@ -616,11 +648,17 @@ __kuser_helper_start:
 
 __kuser_cmpxchg:                               @ 0xffff0fc0
 
-#if __LINUX_ARM_ARCH__ < 6
+#if defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG)
 
-#ifdef CONFIG_SMP  /* sanity check */
-#error "CONFIG_SMP on a machine supporting pre-ARMv6 processors?"
-#endif
+       /*
+        * Poor you.  No fast solution possible...
+        * The kernel itself must perform the operation.
+        * A special ghost syscall is used for that (see traps.c).
+        */
+       swi     #0x9ffff0
+       mov     pc, lr
+
+#elif __LINUX_ARM_ARCH__ < 6
 
        /*
         * Theory of operation:
@@ -735,29 +773,41 @@ __kuser_helper_end:
  *
  * Common stub entry macro:
  *   Enter in IRQ mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
+ *
+ * SP points to a minimal amount of processor-private memory, the address
+ * of which is copied into r0 for the mode specific abort handler.
  */
-       .macro  vector_stub, name, sym, correction=0
+       .macro  vector_stub, name, correction=0
        .align  5
 
 vector_\name:
-       ldr     r13, .LCs\sym
        .if \correction
        sub     lr, lr, #\correction
        .endif
-       str     lr, [r13]                       @ save lr_IRQ
+
+       @
+       @ Save r0, lr_<exception> (parent PC) and spsr_<exception>
+       @ (parent CPSR)
+       @
+       stmia   sp, {r0, lr}            @ save r0, lr
        mrs     lr, spsr
-       str     lr, [r13, #4]                   @ save spsr_IRQ
+       str     lr, [sp, #8]            @ save spsr
+
        @
-       @ now branch to the relevant MODE handling routine
+       @ Prepare for SVC32 mode.  IRQs remain disabled.
        @
-       mrs     r13, cpsr
-       bic     r13, r13, #MODE_MASK
-       orr     r13, r13, #SVC_MODE
-       msr     spsr_cxsf, r13                  @ switch to SVC_32 mode
+       mrs     r0, cpsr
+       bic     r0, r0, #MODE_MASK
+       orr     r0, r0, #SVC_MODE
+       msr     spsr_cxsf, r0
 
-       and     lr, lr, #15
+       @
+       @ the branch table must immediately follow this code
+       @
+       mov     r0, sp
+       and     lr, lr, #0x0f
        ldr     lr, [pc, lr, lsl #2]
-       movs    pc, lr                          @ Changes mode and branches
+       movs    pc, lr                  @ branch to handler in SVC mode
        .endm
 
        .globl  __stubs_start
@@ -765,7 +815,7 @@ __stubs_start:
 /*
  * Interrupt dispatcher
  */
-       vector_stub     irq, irq, 4
+       vector_stub     irq, 4
 
        .long   __irq_usr                       @  0  (USR_26 / USR_32)
        .long   __irq_invalid                   @  1  (FIQ_26 / FIQ_32)
@@ -788,7 +838,7 @@ __stubs_start:
  * Data abort dispatcher
  * Enter in ABT mode, spsr = USR CPSR, lr = USR PC
  */
-       vector_stub     dabt, abt, 8
+       vector_stub     dabt, 8
 
        .long   __dabt_usr                      @  0  (USR_26 / USR_32)
        .long   __dabt_invalid                  @  1  (FIQ_26 / FIQ_32)
@@ -811,7 +861,7 @@ __stubs_start:
  * Prefetch abort dispatcher
  * Enter in ABT mode, spsr = USR CPSR, lr = USR PC
  */
-       vector_stub     pabt, abt, 4
+       vector_stub     pabt, 4
 
        .long   __pabt_usr                      @  0 (USR_26 / USR_32)
        .long   __pabt_invalid                  @  1 (FIQ_26 / FIQ_32)
@@ -834,7 +884,7 @@ __stubs_start:
  * Undef instr entry dispatcher
  * Enter in UND mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
  */
-       vector_stub     und, und
+       vector_stub     und
 
        .long   __und_usr                       @  0 (USR_26 / USR_32)
        .long   __und_invalid                   @  1 (FIQ_26 / FIQ_32)
@@ -888,13 +938,6 @@ vector_addrexcptn:
 .LCvswi:
        .word   vector_swi
 
-.LCsirq:
-       .word   __temp_irq
-.LCsund:
-       .word   __temp_und
-.LCsabt:
-       .word   __temp_abt
-
        .globl  __stubs_end
 __stubs_end:
 
@@ -916,23 +959,6 @@ __vectors_end:
 
        .data
 
-/*
- * Do not reorder these, and do not insert extra data between...
- */
-
-__temp_irq:
-       .word   0                               @ saved lr_irq
-       .word   0                               @ saved spsr_irq
-       .word   -1                              @ old_r0
-__temp_und:
-       .word   0                               @ Saved lr_und
-       .word   0                               @ Saved spsr_und
-       .word   -1                              @ old_r0
-__temp_abt:
-       .word   0                               @ Saved lr_abt
-       .word   0                               @ Saved spsr_abt
-       .word   -1                              @ old_r0
-
        .globl  cr_alignment
        .globl  cr_no_alignment
 cr_alignment:
index a3d40a0e2b0479032a6d2f7126d64fb2ea626215..afef21273963a6599fde7330e555f52f302faf60 100644 (file)
        mov     \rd, \rd, lsl #13
        .endm
 
-       .macro  alignment_trap, rbase, rtemp, sym
+       .macro  alignment_trap, rtemp
 #ifdef CONFIG_ALIGNMENT_TRAP
-#define OFF_CR_ALIGNMENT(x)    cr_alignment - x
-
-       ldr     \rtemp, [\rbase, #OFF_CR_ALIGNMENT(\sym)]
+       ldr     \rtemp, .LCcralign
+       ldr     \rtemp, [\rtemp]
        mcr     p15, 0, \rtemp, c1, c0
 #endif
        .endm
index 4733877296d41209f6e0b0dd6c5c66cf6a0f3762..bd4823c74645f0899f91d61199f000a5342be40d 100644 (file)
@@ -2,6 +2,8 @@
  *  linux/arch/arm/kernel/head.S
  *
  *  Copyright (C) 1994-2002 Russell King
+ *  Copyright (c) 2003 ARM Limited
+ *  All Rights Reserved
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -165,6 +167,48 @@ __mmap_switched:
        stmia   r6, {r0, r4}                    @ Save control register values
        b       start_kernel
 
+#if defined(CONFIG_SMP)
+       .type   secondary_startup, #function
+ENTRY(secondary_startup)
+       /*
+        * Common entry point for secondary CPUs.
+        *
+        * Ensure that we're in SVC mode, and IRQs are disabled.  Lookup
+        * the processor type - there is no need to check the machine type
+        * as it has already been validated by the primary processor.
+        */
+       msr     cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC
+       bl      __lookup_processor_type
+       movs    r10, r5                         @ invalid processor?
+       moveq   r0, #'p'                        @ yes, error 'p'
+       beq     __error
+
+       /*
+        * Use the page tables supplied from  __cpu_up.
+        */
+       adr     r4, __secondary_data
+       ldmia   r4, {r5, r6, r13}               @ address to jump to after
+       sub     r4, r4, r5                      @ mmu has been enabled
+       ldr     r4, [r6, r4]                    @ get secondary_data.pgdir
+       adr     lr, __enable_mmu                @ return address
+       add     pc, r10, #12                    @ initialise processor
+                                               @ (return control reg)
+
+       /*
+        * r6  = &secondary_data
+        */
+ENTRY(__secondary_switched)
+       ldr     sp, [r6, #4]                    @ get secondary_data.stack
+       mov     fp, #0
+       b       secondary_start_kernel
+
+       .type   __secondary_data, %object
+__secondary_data:
+       .long   .
+       .long   secondary_data
+       .long   __secondary_switched
+#endif /* defined(CONFIG_SMP) */
+
 
 
 /*
index c2a7da3ac0f1fff7b310c8760984abfa70939299..9fed5fa194d9022830e4ecc83b206f03a15a832d 100644 (file)
@@ -92,6 +92,14 @@ struct cpu_user_fns cpu_user;
 struct cpu_cache_fns cpu_cache;
 #endif
 
+struct stack {
+       u32 irq[3];
+       u32 abt[3];
+       u32 und[3];
+} ____cacheline_aligned;
+
+static struct stack stacks[NR_CPUS];
+
 char elf_platform[ELF_PLATFORM_SIZE];
 EXPORT_SYMBOL(elf_platform);
 
@@ -307,8 +315,6 @@ static void __init setup_processor(void)
               cpu_name, processor_id, (int)processor_id & 15,
               proc_arch[cpu_architecture()]);
 
-       dump_cpu_info(smp_processor_id());
-
        sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS);
        sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS);
        elf_hwcap = list->elf_hwcap;
@@ -316,6 +322,46 @@ static void __init setup_processor(void)
        cpu_proc_init();
 }
 
+/*
+ * cpu_init - initialise one CPU.
+ *
+ * cpu_init dumps the cache information, initialises SMP specific
+ * information, and sets up the per-CPU stacks.
+ */
+void cpu_init(void)
+{
+       unsigned int cpu = smp_processor_id();
+       struct stack *stk = &stacks[cpu];
+
+       if (cpu >= NR_CPUS) {
+               printk(KERN_CRIT "CPU%u: bad primary CPU number\n", cpu);
+               BUG();
+       }
+
+       dump_cpu_info(cpu);
+
+       /*
+        * setup stacks for re-entrant exception handlers
+        */
+       __asm__ (
+       "msr    cpsr_c, %1\n\t"
+       "add    sp, %0, %2\n\t"
+       "msr    cpsr_c, %3\n\t"
+       "add    sp, %0, %4\n\t"
+       "msr    cpsr_c, %5\n\t"
+       "add    sp, %0, %6\n\t"
+       "msr    cpsr_c, %7"
+           :
+           : "r" (stk),
+             "I" (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),
+             "I" (offsetof(struct stack, irq[0])),
+             "I" (PSR_F_BIT | PSR_I_BIT | ABT_MODE),
+             "I" (offsetof(struct stack, abt[0])),
+             "I" (PSR_F_BIT | PSR_I_BIT | UND_MODE),
+             "I" (offsetof(struct stack, und[0])),
+             "I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE));
+}
+
 static struct machine_desc * __init setup_machine(unsigned int nr)
 {
        struct machine_desc *list;
@@ -715,6 +761,8 @@ void __init setup_arch(char **cmdline_p)
        paging_init(&meminfo, mdesc);
        request_standard_resources(&meminfo, mdesc);
 
+       cpu_init();
+
        /*
         * Set up various architecture-specific pointers
         */
index ecc8c3332408a1c7ed394b6badcd3b608baf156c..34892758f098c485f0b47e97083daf699a399878 100644 (file)
@@ -24,6 +24,9 @@
 #include <asm/atomic.h>
 #include <asm/cacheflush.h>
 #include <asm/cpu.h>
+#include <asm/mmu_context.h>
+#include <asm/pgtable.h>
+#include <asm/pgalloc.h>
 #include <asm/processor.h>
 #include <asm/tlbflush.h>
 #include <asm/ptrace.h>
 cpumask_t cpu_present_mask;
 cpumask_t cpu_online_map;
 
+/*
+ * as from 2.5, kernels no longer have an init_tasks structure
+ * so we need some other way of telling a new secondary core
+ * where to place its SVC stack
+ */
+struct secondary_data secondary_data;
+
 /*
  * structures for inter-processor calls
  * - A collection of single bit ipi messages.
@@ -71,6 +81,8 @@ static DEFINE_SPINLOCK(smp_call_function_lock);
 int __init __cpu_up(unsigned int cpu)
 {
        struct task_struct *idle;
+       pgd_t *pgd;
+       pmd_t *pmd;
        int ret;
 
        /*
@@ -83,12 +95,58 @@ int __init __cpu_up(unsigned int cpu)
                return PTR_ERR(idle);
        }
 
+       /*
+        * Allocate initial page tables to allow the new CPU to
+        * enable the MMU safely.  This essentially means a set
+        * of our "standard" page tables, with the addition of
+        * a 1:1 mapping for the physical address of the kernel.
+        */
+       pgd = pgd_alloc(&init_mm);
+       pmd = pmd_offset(pgd, PHYS_OFFSET);
+       *pmd = __pmd((PHYS_OFFSET & PGDIR_MASK) |
+                    PMD_TYPE_SECT | PMD_SECT_AP_WRITE);
+
+       /*
+        * We need to tell the secondary core where to find
+        * its stack and the page tables.
+        */
+       secondary_data.stack = (void *)idle->thread_info + THREAD_SIZE - 8;
+       secondary_data.pgdir = virt_to_phys(pgd);
+       wmb();
+
        /*
         * Now bring the CPU into our world.
         */
        ret = boot_secondary(cpu, idle);
+       if (ret == 0) {
+               unsigned long timeout;
+
+               /*
+                * CPU was successfully started, wait for it
+                * to come online or time out.
+                */
+               timeout = jiffies + HZ;
+               while (time_before(jiffies, timeout)) {
+                       if (cpu_online(cpu))
+                               break;
+
+                       udelay(10);
+                       barrier();
+               }
+
+               if (!cpu_online(cpu))
+                       ret = -EIO;
+       }
+
+       secondary_data.stack = 0;
+       secondary_data.pgdir = 0;
+
+       *pmd_offset(pgd, PHYS_OFFSET) = __pmd(0);
+       pgd_free(pgd);
+
        if (ret) {
-               printk(KERN_CRIT "cpu_up: processor %d failed to boot\n", cpu);
+               printk(KERN_CRIT "CPU%u: processor failed to boot\n", cpu);
+
                /*
                 * FIXME: We need to clean up the new idle thread. --rmk
                 */
@@ -97,6 +155,56 @@ int __init __cpu_up(unsigned int cpu)
        return ret;
 }
 
+/*
+ * This is the secondary CPU boot entry.  We're using this CPUs
+ * idle thread stack, but a set of temporary page tables.
+ */
+asmlinkage void __init secondary_start_kernel(void)
+{
+       struct mm_struct *mm = &init_mm;
+       unsigned int cpu = smp_processor_id();
+
+       printk("CPU%u: Booted secondary processor\n", cpu);
+
+       /*
+        * All kernel threads share the same mm context; grab a
+        * reference and switch to it.
+        */
+       atomic_inc(&mm->mm_users);
+       atomic_inc(&mm->mm_count);
+       current->active_mm = mm;
+       cpu_set(cpu, mm->cpu_vm_mask);
+       cpu_switch_mm(mm->pgd, mm);
+       enter_lazy_tlb(mm, current);
+
+       cpu_init();
+
+       /*
+        * Give the platform a chance to do its own initialisation.
+        */
+       platform_secondary_init(cpu);
+
+       /*
+        * Enable local interrupts.
+        */
+       local_irq_enable();
+       local_fiq_enable();
+
+       calibrate_delay();
+
+       smp_store_cpu_info(cpu);
+
+       /*
+        * OK, now it's safe to let the boot CPU continue
+        */
+       cpu_set(cpu, cpu_online_map);
+
+       /*
+        * OK, it's off to the idle thread for us
+        */
+       cpu_idle();
+}
+
 /*
  * Called by both boot and secondaries to move global data into
  * per-processor storage.
index 14df16b983f4ca5c1c08c804ceb3df3659bec34c..45d2a032d8900f4f4f4d12c97ed0da021a4aa233 100644 (file)
@@ -464,6 +464,55 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
 #endif
                return 0;
 
+#ifdef CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG
+       /*
+        * Atomically store r1 in *r2 if *r2 is equal to r0 for user space.
+        * Return zero in r0 if *MEM was changed or non-zero if no exchange
+        * happened.  Also set the user C flag accordingly.
+        * If access permissions have to be fixed up then non-zero is
+        * returned and the operation has to be re-attempted.
+        *
+        * *NOTE*: This is a ghost syscall private to the kernel.  Only the
+        * __kuser_cmpxchg code in entry-armv.S should be aware of its
+        * existence.  Don't ever use this from user code.
+        */
+       case 0xfff0:
+       {
+               extern void do_DataAbort(unsigned long addr, unsigned int fsr,
+                                        struct pt_regs *regs);
+               unsigned long val;
+               unsigned long addr = regs->ARM_r2;
+               struct mm_struct *mm = current->mm;
+               pgd_t *pgd; pmd_t *pmd; pte_t *pte;
+
+               regs->ARM_cpsr &= ~PSR_C_BIT;
+               spin_lock(&mm->page_table_lock);
+               pgd = pgd_offset(mm, addr);
+               if (!pgd_present(*pgd))
+                       goto bad_access;
+               pmd = pmd_offset(pgd, addr);
+               if (!pmd_present(*pmd))
+                       goto bad_access;
+               pte = pte_offset_map(pmd, addr);
+               if (!pte_present(*pte) || !pte_write(*pte))
+                       goto bad_access;
+               val = *(unsigned long *)addr;
+               val -= regs->ARM_r0;
+               if (val == 0) {
+                       *(unsigned long *)addr = regs->ARM_r1;
+                       regs->ARM_cpsr |= PSR_C_BIT;
+               }
+               spin_unlock(&mm->page_table_lock);
+               return val;
+
+               bad_access:
+               spin_unlock(&mm->page_table_lock);
+               /* simulate a read access fault */
+               do_DataAbort(addr, 15 + (1 << 11), regs);
+               return -1;
+       }
+#endif
+
        default:
                /* Calls 9f00xx..9f07ff are defined to return -ENOSYS
                   if not implemented, rather than raising SIGILL.  This
index 130f5a8396695b758180c0856b336a0d7814ac18..b62875cfd8f842fdc85c4e32ee9769b93fef920c 100644 (file)
@@ -31,31 +31,26 @@ Boston, MA 02111-1307, USA.  */
 
 #include "gcclib.h"
 
-DItype
-__ashldi3 (DItype u, word_type b)
+s64 __ashldi3(s64 u, int b)
 {
-  DIunion w;
-  word_type bm;
-  DIunion uu;
-
-  if (b == 0)
-    return u;
-
-  uu.ll = u;
-
-  bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
-  if (bm <= 0)
-    {
-      w.s.low = 0;
-      w.s.high = (USItype)uu.s.low << -bm;
-    }
-  else
-    {
-      USItype carries = (USItype)uu.s.low >> bm;
-      w.s.low = (USItype)uu.s.low << b;
-      w.s.high = ((USItype)uu.s.high << b) | carries;
-    }
-
-  return w.ll;
+       DIunion w;
+       int bm;
+       DIunion uu;
+
+       if (b == 0)
+               return u;
+
+       uu.ll = u;
+
+       bm = (sizeof(s32) * BITS_PER_UNIT) - b;
+       if (bm <= 0) {
+               w.s.low = 0;
+               w.s.high = (u32) uu.s.low << -bm;
+       } else {
+               u32 carries = (u32) uu.s.low >> bm;
+               w.s.low = (u32) uu.s.low << b;
+               w.s.high = ((u32) uu.s.high << b) | carries;
+       }
+
+       return w.ll;
 }
-
index 71625d218f8d391266c2fd8b421e87838f2c6f33..9a8600a7543faf8159d029bf5b2dce40c8802852 100644 (file)
@@ -31,31 +31,27 @@ Boston, MA 02111-1307, USA.  */
 
 #include "gcclib.h"
 
-DItype
-__ashrdi3 (DItype u, word_type b)
+s64 __ashrdi3(s64 u, int b)
 {
-  DIunion w;
-  word_type bm;
-  DIunion uu;
-
-  if (b == 0)
-    return u;
-
-  uu.ll = u;
-
-  bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
-  if (bm <= 0)
-    {
-      /* w.s.high = 1..1 or 0..0 */
-      w.s.high = uu.s.high >> (sizeof (SItype) * BITS_PER_UNIT - 1);
-      w.s.low = uu.s.high >> -bm;
-    }
-  else
-    {
-      USItype carries = (USItype)uu.s.high << bm;
-      w.s.high = uu.s.high >> b;
-      w.s.low = ((USItype)uu.s.low >> b) | carries;
-    }
-
-  return w.ll;
+       DIunion w;
+       int bm;
+       DIunion uu;
+
+       if (b == 0)
+               return u;
+
+       uu.ll = u;
+
+       bm = (sizeof(s32) * BITS_PER_UNIT) - b;
+       if (bm <= 0) {
+               /* w.s.high = 1..1 or 0..0 */
+               w.s.high = uu.s.high >> (sizeof(s32) * BITS_PER_UNIT - 1);
+               w.s.low = uu.s.high >> -bm;
+       } else {
+               u32 carries = (u32) uu.s.high << bm;
+               w.s.high = uu.s.high >> b;
+               w.s.low = ((u32) uu.s.low >> b) | carries;
+       }
+
+       return w.ll;
 }
index 65314a3d9e273e932be1e1a3316b25f278d9f05f..8b6dcc656de779c3b2d030f0577238fe59e41954 100644 (file)
@@ -1,25 +1,22 @@
 /* gcclib.h -- definitions for various functions 'borrowed' from gcc-2.95.3 */
 /* I Molton     29/07/01 */
 
-#define BITS_PER_UNIT  8
-#define SI_TYPE_SIZE (sizeof (SItype) * BITS_PER_UNIT)
+#include <linux/types.h>
 
-typedef unsigned int UQItype    __attribute__ ((mode (QI)));
-typedef          int SItype     __attribute__ ((mode (SI)));
-typedef unsigned int USItype    __attribute__ ((mode (SI)));
-typedef          int DItype     __attribute__ ((mode (DI)));
-typedef          int word_type         __attribute__ ((mode (__word__)));
-typedef unsigned int UDItype    __attribute__ ((mode (DI)));
+#define BITS_PER_UNIT  8
+#define SI_TYPE_SIZE   (sizeof(s32) * BITS_PER_UNIT)
 
 #ifdef __ARMEB__
-  struct DIstruct {SItype high, low;};
+struct DIstruct {
+       s32 high, low;
+};
 #else
-  struct DIstruct {SItype low, high;};
+struct DIstruct {
+       s32 low, high;
+};
 #endif
 
-typedef union
-{
-  struct DIstruct s;
-  DItype ll;
+typedef union {
+       struct DIstruct s;
+       s64 ll;
 } DIunion;
-
index 6d1d7c27806e407f6c2efaf0c1f7fcbc16927614..5e240e452af6af66b2d9d18321009fddea82c73e 100644 (file)
@@ -87,9 +87,9 @@ ENTRY(__raw_writesw)
                subs    r2, r2, #2
                orr     ip, ip, r3, push_hbyte1
                strh    ip, [r0]
-               bpl     2b
+               bpl     1b
 
-3:             tst     r2, #1
-2:             movne   ip, r3, lsr #8
+               tst     r2, #1
+3:             movne   ip, r3, lsr #8
                strneh  ip, [r0]
                mov     pc, lr
index 179eea4edc35cc3a1180214cad63ca7e2ef807de..90ae647e4d76dadf575c4395e87affce807f0e19 100644 (file)
 
 #define __BITS4 (SI_TYPE_SIZE / 4)
 #define __ll_B (1L << (SI_TYPE_SIZE / 2))
-#define __ll_lowpart(t) ((USItype) (t) % __ll_B)
-#define __ll_highpart(t) ((USItype) (t) / __ll_B)
+#define __ll_lowpart(t) ((u32) (t) % __ll_B)
+#define __ll_highpart(t) ((u32) (t) / __ll_B)
 
 /* Define auxiliary asm macros.
 
    1) umul_ppmm(high_prod, low_prod, multipler, multiplicand)
-   multiplies two USItype integers MULTIPLER and MULTIPLICAND,
-   and generates a two-part USItype product in HIGH_PROD and
+   multiplies two u32 integers MULTIPLER and MULTIPLICAND,
+   and generates a two-part u32 product in HIGH_PROD and
    LOW_PROD.
 
-   2) __umulsidi3(a,b) multiplies two USItype integers A and B,
-   and returns a UDItype product.  This is just a variant of umul_ppmm.
+   2) __umulsidi3(a,b) multiplies two u32 integers A and B,
+   and returns a u64 product.  This is just a variant of umul_ppmm.
 
    3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
    denominator) divides a two-word unsigned integer, composed by the
 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   __asm__ ("adds       %1, %4, %5                                      \n\
        adc     %0, %2, %3"                                             \
-          : "=r" ((USItype) (sh)),                                     \
-            "=&r" ((USItype) (sl))                                     \
-          : "%r" ((USItype) (ah)),                                     \
-            "rI" ((USItype) (bh)),                                     \
-            "%r" ((USItype) (al)),                                     \
-            "rI" ((USItype) (bl)))
+          : "=r" ((u32) (sh)),                                 \
+            "=&r" ((u32) (sl))                                 \
+          : "%r" ((u32) (ah)),                                 \
+            "rI" ((u32) (bh)),                                 \
+            "%r" ((u32) (al)),                                 \
+            "rI" ((u32) (bl)))
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   __asm__ ("subs       %1, %4, %5                                      \n\
        sbc     %0, %2, %3"                                             \
-          : "=r" ((USItype) (sh)),                                     \
-            "=&r" ((USItype) (sl))                                     \
-          : "r" ((USItype) (ah)),                                      \
-            "rI" ((USItype) (bh)),                                     \
-            "r" ((USItype) (al)),                                      \
-            "rI" ((USItype) (bl)))
+          : "=r" ((u32) (sh)),                                 \
+            "=&r" ((u32) (sl))                                 \
+          : "r" ((u32) (ah)),                                  \
+            "rI" ((u32) (bh)),                                 \
+            "r" ((u32) (al)),                                  \
+            "rI" ((u32) (bl)))
 #define umul_ppmm(xh, xl, a, b) \
-{register USItype __t0, __t1, __t2;                                    \
+{register u32 __t0, __t1, __t2;                                        \
   __asm__ ("%@ Inlined umul_ppmm                                       \n\
        mov     %2, %5, lsr #16                                         \n\
        mov     %0, %6, lsr #16                                         \n\
        addcs   %0, %0, #65536                                          \n\
        adds    %1, %1, %3, lsl #16                                     \n\
        adc     %0, %0, %3, lsr #16"                                    \
-          : "=&r" ((USItype) (xh)),                                    \
-            "=r" ((USItype) (xl)),                                     \
+          : "=&r" ((u32) (xh)),                                        \
+            "=r" ((u32) (xl)),                                 \
             "=&r" (__t0), "=&r" (__t1), "=r" (__t2)                    \
-          : "r" ((USItype) (a)),                                       \
-            "r" ((USItype) (b)));}
+          : "r" ((u32) (a)),                                   \
+            "r" ((u32) (b)));}
 #define UMUL_TIME 20
 #define UDIV_TIME 100
-#endif /* __arm__ */
+#endif                         /* __arm__ */
 
 #define __umulsidi3(u, v) \
   ({DIunion __w;                                                       \
 
 #define __udiv_qrnnd_c(q, r, n1, n0, d) \
   do {                                                                 \
-    USItype __d1, __d0, __q1, __q0;                                    \
-    USItype __r1, __r0, __m;                                           \
+    u32 __d1, __d0, __q1, __q0;                                        \
+    u32 __r1, __r0, __m;                                               \
     __d1 = __ll_highpart (d);                                          \
     __d0 = __ll_lowpart (d);                                           \
                                                                        \
     __r1 = (n1) % __d1;                                                        \
     __q1 = (n1) / __d1;                                                        \
-    __m = (USItype) __q1 * __d0;                                       \
+    __m = (u32) __q1 * __d0;                                   \
     __r1 = __r1 * __ll_B | __ll_highpart (n0);                         \
     if (__r1 < __m)                                                    \
       {                                                                        \
                                                                        \
     __r0 = __r1 % __d1;                                                        \
     __q0 = __r1 / __d1;                                                        \
-    __m = (USItype) __q0 * __d0;                                       \
+    __m = (u32) __q0 * __d0;                                   \
     __r0 = __r0 * __ll_B | __ll_lowpart (n0);                          \
     if (__r0 < __m)                                                    \
       {                                                                        \
       }                                                                        \
     __r0 -= __m;                                                       \
                                                                        \
-    (q) = (USItype) __q1 * __ll_B | __q0;                              \
+    (q) = (u32) __q1 * __ll_B | __q0;                          \
     (r) = __r0;                                                                \
   } while (0)
 
 
 #define count_leading_zeros(count, x) \
   do {                                                                 \
-    USItype __xr = (x);                                                        \
-    USItype __a;                                                       \
+    u32 __xr = (x);                                                    \
+    u32 __a;                                                   \
                                                                        \
     if (SI_TYPE_SIZE <= 32)                                            \
       {                                                                        \
-       __a = __xr < ((USItype)1<<2*__BITS4)                            \
-         ? (__xr < ((USItype)1<<__BITS4) ? 0 : __BITS4)                \
-         : (__xr < ((USItype)1<<3*__BITS4) ?  2*__BITS4 : 3*__BITS4);  \
+       __a = __xr < ((u32)1<<2*__BITS4)                                \
+         ? (__xr < ((u32)1<<__BITS4) ? 0 : __BITS4)            \
+         : (__xr < ((u32)1<<3*__BITS4) ?  2*__BITS4 : 3*__BITS4);      \
       }                                                                        \
     else                                                               \
       {                                                                        \
index b666f1bad451047adcdf348ab2fd105d482b496f..3681f49d2b6e24c43c3d4b1670e57f2f50ebb1dd 100644 (file)
@@ -31,31 +31,26 @@ Boston, MA 02111-1307, USA.  */
 
 #include "gcclib.h"
 
-DItype
-__lshrdi3 (DItype u, word_type b)
+s64 __lshrdi3(s64 u, int b)
 {
-  DIunion w;
-  word_type bm;
-  DIunion uu;
-
-  if (b == 0)
-    return u;
-
-  uu.ll = u;
-
-  bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
-  if (bm <= 0)
-    {
-      w.s.high = 0;
-      w.s.low = (USItype)uu.s.high >> -bm;
-    }
-  else
-    {
-      USItype carries = (USItype)uu.s.high << bm;
-      w.s.high = (USItype)uu.s.high >> b;
-      w.s.low = ((USItype)uu.s.low >> b) | carries;
-    }
-
-  return w.ll;
+       DIunion w;
+       int bm;
+       DIunion uu;
+
+       if (b == 0)
+               return u;
+
+       uu.ll = u;
+
+       bm = (sizeof(s32) * BITS_PER_UNIT) - b;
+       if (bm <= 0) {
+               w.s.high = 0;
+               w.s.low = (u32) uu.s.high >> -bm;
+       } else {
+               u32 carries = (u32) uu.s.high << bm;
+               w.s.high = (u32) uu.s.high >> b;
+               w.s.low = ((u32) uu.s.low >> b) | carries;
+       }
+
+       return w.ll;
 }
-
index 44d611b1cfdbda4fcfdd5b17d0586109b249bb4a..0a3b93313f1831b24ef778f595a9d9bca0571a93 100644 (file)
@@ -32,7 +32,7 @@ Boston, MA 02111-1307, USA.  */
 #include "gcclib.h"
 
 #define umul_ppmm(xh, xl, a, b) \
-{register USItype __t0, __t1, __t2;                                     \
+{register u32 __t0, __t1, __t2;                                     \
   __asm__ ("%@ Inlined umul_ppmm                                       \n\
         mov     %2, %5, lsr #16                                                \n\
         mov     %0, %6, lsr #16                                                \n\
@@ -46,32 +46,27 @@ Boston, MA 02111-1307, USA.  */
         addcs   %0, %0, #65536                                         \n\
         adds    %1, %1, %3, lsl #16                                    \n\
         adc     %0, %0, %3, lsr #16"                                    \
-           : "=&r" ((USItype) (xh)),                                    \
-             "=r" ((USItype) (xl)),                                     \
+           : "=&r" ((u32) (xh)),                                    \
+             "=r" ((u32) (xl)),                                     \
              "=&r" (__t0), "=&r" (__t1), "=r" (__t2)                    \
-           : "r" ((USItype) (a)),                                       \
-             "r" ((USItype) (b)));}
-
+           : "r" ((u32) (a)),                                       \
+             "r" ((u32) (b)));}
 
 #define __umulsidi3(u, v) \
   ({DIunion __w;                                                        \
     umul_ppmm (__w.s.high, __w.s.low, u, v);                            \
     __w.ll; })
 
-
-DItype
-__muldi3 (DItype u, DItype v)
+s64 __muldi3(s64 u, s64 v)
 {
-  DIunion w;
-  DIunion uu, vv;
+       DIunion w;
+       DIunion uu, vv;
 
-  uu.ll = u,
-  vv.ll = v;
+       uu.ll = u, vv.ll = v;
 
-  w.ll = __umulsidi3 (uu.s.low, vv.s.low);
-  w.s.high += ((USItype) uu.s.low * (USItype) vv.s.high
-               + (USItype) uu.s.high * (USItype) vv.s.low);
+       w.ll = __umulsidi3(uu.s.low, vv.s.low);
+       w.s.high += ((u32) uu.s.low * (u32) vv.s.high
+                    + (u32) uu.s.high * (u32) vv.s.low);
 
-  return w.ll;
+       return w.ll;
 }
-
index 6c6ae63efa0254cb75476231d83cffc0ad34d7ef..57f3f2df3850147286d89f870912cf40486d2d66 100644 (file)
@@ -31,21 +31,19 @@ Boston, MA 02111-1307, USA.  */
 
 #include "gcclib.h"
 
-word_type
-__ucmpdi2 (DItype a, DItype b)
+int __ucmpdi2(s64 a, s64 b)
 {
-  DIunion au, bu;
-
-  au.ll = a, bu.ll = b;
-
-  if ((USItype) au.s.high < (USItype) bu.s.high)
-    return 0;
-  else if ((USItype) au.s.high > (USItype) bu.s.high)
-    return 2;
-  if ((USItype) au.s.low < (USItype) bu.s.low)
-    return 0;
-  else if ((USItype) au.s.low > (USItype) bu.s.low)
-    return 2;
-  return 1;
+       DIunion au, bu;
+
+       au.ll = a, bu.ll = b;
+
+       if ((u32) au.s.high < (u32) bu.s.high)
+               return 0;
+       else if ((u32) au.s.high > (u32) bu.s.high)
+               return 2;
+       if ((u32) au.s.low < (u32) bu.s.low)
+               return 0;
+       else if ((u32) au.s.low > (u32) bu.s.low)
+               return 2;
+       return 1;
 }
-
index d25195f673f465074a96cbb1ec30f1af6f65d1b3..e343be4c66421c9b6d2524f11e7858b02db369f9 100644 (file)
@@ -32,211 +32,191 @@ Boston, MA 02111-1307, USA.  */
 #include "gcclib.h"
 #include "longlong.h"
 
-static const UQItype __clz_tab[] =
-{
-  0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
-  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
-  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
-  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
-  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
-  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+static const u8 __clz_tab[] = {
+       0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
+           5, 5, 5, 5, 5, 5, 5, 5,
+       6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+           6, 6, 6, 6, 6, 6, 6, 6,
+       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+           7, 7, 7, 7, 7, 7, 7, 7,
+       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+           7, 7, 7, 7, 7, 7, 7, 7,
+       8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+           8, 8, 8, 8, 8, 8, 8, 8,
+       8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+           8, 8, 8, 8, 8, 8, 8, 8,
+       8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+           8, 8, 8, 8, 8, 8, 8, 8,
+       8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+           8, 8, 8, 8, 8, 8, 8, 8,
 };
 
-UDItype
-__udivmoddi4 (UDItype n, UDItype d, UDItype *rp)
+u64 __udivmoddi4(u64 n, u64 d, u64 * rp)
 {
-  DIunion ww;
-  DIunion nn, dd;
-  DIunion rr;
-  USItype d0, d1, n0, n1, n2;
-  USItype q0, q1;
-  USItype b, bm;
-
-  nn.ll = n;
-  dd.ll = d;
-
-  d0 = dd.s.low;
-  d1 = dd.s.high;
-  n0 = nn.s.low;
-  n1 = nn.s.high;
-
-  if (d1 == 0)
-    {
-      if (d0 > n1)
-        {
-          /* 0q = nn / 0D */
-
-          count_leading_zeros (bm, d0);
-
-          if (bm != 0)
-            {
-              /* Normalize, i.e. make the most significant bit of the
-                 denominator set.  */
-
-              d0 = d0 << bm;
-              n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm));
-              n0 = n0 << bm;
-            }
-
-          udiv_qrnnd (q0, n0, n1, n0, d0);
-          q1 = 0;
-
-          /* Remainder in n0 >> bm.  */
-        }
-      else
-        {
-          /* qq = NN / 0d */
-
-          if (d0 == 0)
-            d0 = 1 / d0;        /* Divide intentionally by zero.  */
-
-          count_leading_zeros (bm, d0);
-
-          if (bm == 0)
-            {
-              /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
-                 conclude (the most significant bit of n1 is set) /\ (the
-                 leading quotient digit q1 = 1).
-
-                 This special case is necessary, not an optimization.
-                 (Shifts counts of SI_TYPE_SIZE are undefined.)  */
-
-              n1 -= d0;
-              q1 = 1;
-            }
-          else
-            {
-              /* Normalize.  */
-
-              b = SI_TYPE_SIZE - bm;
-
-              d0 = d0 << bm;
-              n2 = n1 >> b;
-              n1 = (n1 << bm) | (n0 >> b);
-              n0 = n0 << bm;
-
-              udiv_qrnnd (q1, n1, n2, n1, d0);
-            }
-
-          /* n1 != d0...  */
-
-          udiv_qrnnd (q0, n0, n1, n0, d0);
-
-          /* Remainder in n0 >> bm.  */
-        }
-
-      if (rp != 0)
-        {
-          rr.s.low = n0 >> bm;
-          rr.s.high = 0;
-          *rp = rr.ll;
-        }
-    }
-  else
-    {
-      if (d1 > n1)
-        {
-          /* 00 = nn / DD */
-
-          q0 = 0;
-          q1 = 0;
-
-          /* Remainder in n1n0.  */
-          if (rp != 0)
-            {
-              rr.s.low = n0;
-              rr.s.high = n1;
-              *rp = rr.ll;
-            }
-        }
-      else
-        {
-          /* 0q = NN / dd */
-
-          count_leading_zeros (bm, d1);
-          if (bm == 0)
-            {
-              /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
-                 conclude (the most significant bit of n1 is set) /\ (the
-                 quotient digit q0 = 0 or 1).
-
-                 This special case is necessary, not an optimization.  */
-
-              /* The condition on the next line takes advantage of that
-                 n1 >= d1 (true due to program flow).  */
-              if (n1 > d1 || n0 >= d0)
-                {
-                  q0 = 1;
-                  sub_ddmmss (n1, n0, n1, n0, d1, d0);
-                }
-              else
-                q0 = 0;
-
-              q1 = 0;
-
-              if (rp != 0)
-                {
-                  rr.s.low = n0;
-                  rr.s.high = n1;
-                  *rp = rr.ll;
-                }
-            }
-          else
-            {
-              USItype m1, m0;
-              /* Normalize.  */
-
-              b = SI_TYPE_SIZE - bm;
-
-              d1 = (d1 << bm) | (d0 >> b);
-              d0 = d0 << bm;
-              n2 = n1 >> b;
-              n1 = (n1 << bm) | (n0 >> b);
-              n0 = n0 << bm;
-
-              udiv_qrnnd (q0, n1, n2, n1, d1);
-              umul_ppmm (m1, m0, q0, d0);
-
-              if (m1 > n1 || (m1 == n1 && m0 > n0))
-                {
-                  q0--;
-                  sub_ddmmss (m1, m0, m1, m0, d1, d0);
-                }
-
-              q1 = 0;
-
-              /* Remainder in (n1n0 - m1m0) >> bm.  */
-              if (rp != 0)
-                {
-                  sub_ddmmss (n1, n0, n1, n0, m1, m0);
-                  rr.s.low = (n1 << b) | (n0 >> bm);
-                  rr.s.high = n1 >> bm;
-                  *rp = rr.ll;
-                }
-            }
-        }
-    }
-
-  ww.s.low = q0;
-  ww.s.high = q1;
-  return ww.ll;
+       DIunion ww;
+       DIunion nn, dd;
+       DIunion rr;
+       u32 d0, d1, n0, n1, n2;
+       u32 q0, q1;
+       u32 b, bm;
+
+       nn.ll = n;
+       dd.ll = d;
+
+       d0 = dd.s.low;
+       d1 = dd.s.high;
+       n0 = nn.s.low;
+       n1 = nn.s.high;
+
+       if (d1 == 0) {
+               if (d0 > n1) {
+                       /* 0q = nn / 0D */
+
+                       count_leading_zeros(bm, d0);
+
+                       if (bm != 0) {
+                               /* Normalize, i.e. make the most significant bit of the
+                                  denominator set.  */
+
+                               d0 = d0 << bm;
+                               n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm));
+                               n0 = n0 << bm;
+                       }
+
+                       udiv_qrnnd(q0, n0, n1, n0, d0);
+                       q1 = 0;
+
+                       /* Remainder in n0 >> bm.  */
+               } else {
+                       /* qq = NN / 0d */
+
+                       if (d0 == 0)
+                               d0 = 1 / d0;    /* Divide intentionally by zero.  */
+
+                       count_leading_zeros(bm, d0);
+
+                       if (bm == 0) {
+                               /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
+                                  conclude (the most significant bit of n1 is set) /\ (the
+                                  leading quotient digit q1 = 1).
+
+                                  This special case is necessary, not an optimization.
+                                  (Shifts counts of SI_TYPE_SIZE are undefined.)  */
+
+                               n1 -= d0;
+                               q1 = 1;
+                       } else {
+                               /* Normalize.  */
+
+                               b = SI_TYPE_SIZE - bm;
+
+                               d0 = d0 << bm;
+                               n2 = n1 >> b;
+                               n1 = (n1 << bm) | (n0 >> b);
+                               n0 = n0 << bm;
+
+                               udiv_qrnnd(q1, n1, n2, n1, d0);
+                       }
+
+                       /* n1 != d0...  */
+
+                       udiv_qrnnd(q0, n0, n1, n0, d0);
+
+                       /* Remainder in n0 >> bm.  */
+               }
+
+               if (rp != 0) {
+                       rr.s.low = n0 >> bm;
+                       rr.s.high = 0;
+                       *rp = rr.ll;
+               }
+       } else {
+               if (d1 > n1) {
+                       /* 00 = nn / DD */
+
+                       q0 = 0;
+                       q1 = 0;
+
+                       /* Remainder in n1n0.  */
+                       if (rp != 0) {
+                               rr.s.low = n0;
+                               rr.s.high = n1;
+                               *rp = rr.ll;
+                       }
+               } else {
+                       /* 0q = NN / dd */
+
+                       count_leading_zeros(bm, d1);
+                       if (bm == 0) {
+                               /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
+                                  conclude (the most significant bit of n1 is set) /\ (the
+                                  quotient digit q0 = 0 or 1).
+
+                                  This special case is necessary, not an optimization.  */
+
+                               /* The condition on the next line takes advantage of that
+                                  n1 >= d1 (true due to program flow).  */
+                               if (n1 > d1 || n0 >= d0) {
+                                       q0 = 1;
+                                       sub_ddmmss(n1, n0, n1, n0, d1, d0);
+                               } else
+                                       q0 = 0;
+
+                               q1 = 0;
+
+                               if (rp != 0) {
+                                       rr.s.low = n0;
+                                       rr.s.high = n1;
+                                       *rp = rr.ll;
+                               }
+                       } else {
+                               u32 m1, m0;
+                               /* Normalize.  */
+
+                               b = SI_TYPE_SIZE - bm;
+
+                               d1 = (d1 << bm) | (d0 >> b);
+                               d0 = d0 << bm;
+                               n2 = n1 >> b;
+                               n1 = (n1 << bm) | (n0 >> b);
+                               n0 = n0 << bm;
+
+                               udiv_qrnnd(q0, n1, n2, n1, d1);
+                               umul_ppmm(m1, m0, q0, d0);
+
+                               if (m1 > n1 || (m1 == n1 && m0 > n0)) {
+                                       q0--;
+                                       sub_ddmmss(m1, m0, m1, m0, d1, d0);
+                               }
+
+                               q1 = 0;
+
+                               /* Remainder in (n1n0 - m1m0) >> bm.  */
+                               if (rp != 0) {
+                                       sub_ddmmss(n1, n0, n1, n0, m1, m0);
+                                       rr.s.low = (n1 << b) | (n0 >> bm);
+                                       rr.s.high = n1 >> bm;
+                                       *rp = rr.ll;
+                               }
+                       }
+               }
+       }
+
+       ww.s.low = q0;
+       ww.s.high = q1;
+       return ww.ll;
 }
 
-UDItype
-__udivdi3 (UDItype n, UDItype d)
+u64 __udivdi3(u64 n, u64 d)
 {
-  return __udivmoddi4 (n, d, (UDItype *) 0);
+       return __udivmoddi4(n, d, (u64 *) 0);
 }
 
-UDItype
-__umoddi3 (UDItype u, UDItype v)
+u64 __umoddi3(u64 u, u64 v)
 {
-  UDItype w;
+       u64 w;
 
-  (void) __udivmoddi4 (u ,v, &w);
+       (void)__udivmoddi4(u, v, &w);
 
-  return w;
+       return w;
 }
-
diff --git a/arch/arm/mach-aaec2000/Kconfig b/arch/arm/mach-aaec2000/Kconfig
new file mode 100644 (file)
index 0000000..5e4bef9
--- /dev/null
@@ -0,0 +1,11 @@
+if ARCH_AAEC2000
+
+menu "Agilent AAEC-2000 Implementations"
+
+config MACH_AAED2000
+       bool "Agilent AAED-2000 Development Platform"
+       select CPU_ARM920T
+
+endmenu
+
+endif
diff --git a/arch/arm/mach-aaec2000/Makefile b/arch/arm/mach-aaec2000/Makefile
new file mode 100644 (file)
index 0000000..20ec838
--- /dev/null
@@ -0,0 +1,9 @@
+#
+# Makefile for the linux kernel.
+#
+
+# Common support (must be linked before board specific support)
+obj-y += core.o
+
+# Specific board support
+obj-$(CONFIG_MACH_AAED2000) += aaed2000.o
diff --git a/arch/arm/mach-aaec2000/aaed2000.c b/arch/arm/mach-aaec2000/aaed2000.c
new file mode 100644 (file)
index 0000000..5417ca3
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ *  linux/arch/arm/mach-aaec2000/aaed2000.c
+ *
+ *  Support for the Agilent AAED-2000 Development Platform.
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ */
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/major.h>
+#include <linux/interrupt.h>
+
+#include <asm/setup.h>
+#include <asm/memory.h>
+#include <asm/mach-types.h>
+#include <asm/hardware.h>
+#include <asm/irq.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include "core.h"
+
+static void __init aaed2000_init_irq(void)
+{
+       aaec2000_init_irq();
+}
+
+static void __init aaed2000_map_io(void)
+{
+       aaec2000_map_io();
+}
+
+MACHINE_START(AAED2000, "Agilent AAED-2000 Development Platform")
+       MAINTAINER("Nicolas Bellido Y Ortega")
+       BOOT_MEM(0xf0000000, PIO_BASE, VIO_BASE)
+       MAPIO(aaed2000_map_io)
+       INITIRQ(aaed2000_init_irq)
+       .timer          = &aaec2000_timer,
+MACHINE_END
diff --git a/arch/arm/mach-aaec2000/core.c b/arch/arm/mach-aaec2000/core.c
new file mode 100644 (file)
index 0000000..fc145b3
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ *  linux/arch/arm/mach-aaec2000/core.c
+ *
+ *  Code common to all AAEC-2000 machines
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/list.h>
+#include <linux/errno.h>
+#include <linux/interrupt.h>
+#include <linux/timex.h>
+#include <linux/signal.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+
+#include <asm/mach/irq.h>
+#include <asm/mach/time.h>
+#include <asm/mach/map.h>
+
+/*
+ * Common I/O mapping:
+ *
+ * Static virtual address mappings are as follow:
+ *
+ * 0xf8000000-0xf8001ffff: Devices connected to APB bus
+ * 0xf8002000-0xf8003ffff: Devices connected to AHB bus
+ *
+ * Below 0xe8000000 is reserved for vm allocation.
+ *
+ * The machine specific code must provide the extra mapping beside the
+ * default mapping provided here.
+ */
+static struct map_desc standard_io_desc[] __initdata = {
+ /* virtual         physical       length           type */
+  { VIO_APB_BASE,   PIO_APB_BASE,  IO_APB_LENGTH,   MT_DEVICE },
+  { VIO_AHB_BASE,   PIO_AHB_BASE,  IO_AHB_LENGTH,   MT_DEVICE }
+};
+
+void __init aaec2000_map_io(void)
+{
+       iotable_init(standard_io_desc, ARRAY_SIZE(standard_io_desc));
+}
+
+/*
+ * Interrupt handling routines
+ */
+static void aaec2000_int_ack(unsigned int irq)
+{
+       IRQ_INTSR = 1 << irq;
+}
+
+static void aaec2000_int_mask(unsigned int irq)
+{
+       IRQ_INTENC |= (1 << irq);
+}
+
+static void aaec2000_int_unmask(unsigned int irq)
+{
+       IRQ_INTENS |= (1 << irq);
+}
+
+static struct irqchip aaec2000_irq_chip = {
+       .ack    = aaec2000_int_ack,
+       .mask   = aaec2000_int_mask,
+       .unmask = aaec2000_int_unmask,
+};
+
+void __init aaec2000_init_irq(void)
+{
+       unsigned int i;
+
+       for (i = 0; i < NR_IRQS; i++) {
+               set_irq_handler(i, do_level_IRQ);
+               set_irq_chip(i, &aaec2000_irq_chip);
+               set_irq_flags(i, IRQF_VALID);
+       }
+
+       /* Disable all interrupts */
+       IRQ_INTENC = 0xffffffff;
+
+       /* Clear any pending interrupts */
+       IRQ_INTSR = IRQ_INTSR;
+}
+
+/*
+ * Time keeping
+ */
+/* IRQs are disabled before entering here from do_gettimeofday() */
+static unsigned long aaec2000_gettimeoffset(void)
+{
+       unsigned long ticks_to_match, elapsed, usec;
+
+       /* Get ticks before next timer match */
+       ticks_to_match = TIMER1_LOAD - TIMER1_VAL;
+
+       /* We need elapsed ticks since last match */
+       elapsed = LATCH - ticks_to_match;
+
+       /* Now, convert them to usec */
+       usec = (unsigned long)(elapsed * (tick_nsec / 1000))/LATCH;
+
+       return usec;
+}
+
+/* We enter here with IRQs enabled */
+static irqreturn_t
+aaec2000_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+       /* TODO: Check timer accuracy */
+       write_seqlock(&xtime_lock);
+
+       timer_tick(regs);
+       TIMER1_CLEAR = 1;
+
+       write_sequnlock(&xtime_lock);
+
+       return IRQ_HANDLED;
+}
+
+static struct irqaction aaec2000_timer_irq = {
+       .name           = "AAEC-2000 Timer Tick",
+       .flags          = SA_INTERRUPT,
+       .handler        = aaec2000_timer_interrupt
+};
+
+static void __init aaec2000_timer_init(void)
+{
+       /* Disable timer 1 */
+       TIMER1_CTRL = 0;
+
+       /* We have somehow to generate a 100Hz clock.
+        * We then use the 508KHz timer in periodic mode.
+        */
+       TIMER1_LOAD = LATCH;
+       TIMER1_CLEAR = 1; /* Clear interrupt */
+
+       setup_irq(INT_TMR1_OFL, &aaec2000_timer_irq);
+
+       TIMER1_CTRL = TIMER_CTRL_ENABLE |
+                       TIMER_CTRL_PERIODIC |
+                       TIMER_CTRL_CLKSEL_508K;
+}
+
+struct sys_timer aaec2000_timer = {
+       .init           = aaec2000_timer_init,
+       .offset         = aaec2000_gettimeoffset,
+};
+
diff --git a/arch/arm/mach-aaec2000/core.h b/arch/arm/mach-aaec2000/core.h
new file mode 100644 (file)
index 0000000..91893d8
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ *  linux/arch/arm/mach-aaec2000/core.h
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ */
+
+struct sys_timer;
+
+extern struct sys_timer aaec2000_timer;
+extern void __init aaec2000_map_io(void);
+extern void __init aaec2000_init_irq(void);
index 158daaf9e3b03ec1eb8a53aba1b2c73bc57776ec..ebb255bdce8aa7ed6c85f25b95a639e30b6e551c 100644 (file)
@@ -12,3 +12,4 @@ obj-$(CONFIG_LEDS)                    += leds.o
 obj-$(CONFIG_PCI)                      += pci_v3.o pci.o
 obj-$(CONFIG_CPU_FREQ_INTEGRATOR)      += cpu.o
 obj-$(CONFIG_INTEGRATOR_IMPD1)         += impd1.o
+obj-$(CONFIG_SMP)                      += platsmp.o headsmp.o
index bd17b5154311f4a1a8540f0dc105ba9996eec862..bd1e5e3c9d34b2e055f6d12763e2735b3994daf4 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/spinlock.h>
 #include <linux/interrupt.h>
 #include <linux/sched.h>
+#include <linux/smp.h>
 
 #include <asm/hardware.h>
 #include <asm/irq.h>
@@ -221,7 +222,23 @@ integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
         */
        timer1->TimerClear = 1;
 
-       timer_tick(regs);
+       /*
+        * the clock tick routines are only processed on the
+        * primary CPU
+        */
+       if (hard_smp_processor_id() == 0) {
+               timer_tick(regs);
+#ifdef CONFIG_SMP
+               smp_send_timer();
+#endif
+       }
+
+#ifdef CONFIG_SMP
+       /*
+        * this is the ARM equivalent of the APIC timer interrupt
+        */
+       update_process_times(user_mode(regs));
+#endif /* CONFIG_SMP */
 
        write_sequnlock(&xtime_lock);
 
diff --git a/arch/arm/mach-integrator/headsmp.S b/arch/arm/mach-integrator/headsmp.S
new file mode 100644 (file)
index 0000000..ceaa88e
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ *  linux/arch/arm/mach-integrator/headsmp.S
+ *
+ *  Copyright (c) 2003 ARM Limited
+ *  All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/linkage.h>
+#include <linux/init.h>
+
+       __INIT
+
+/*
+ * Integrator specific entry point for secondary CPUs.  This provides
+ * a "holding pen" into which all secondary cores are held until we're
+ * ready for them to initialise.
+ */
+ENTRY(integrator_secondary_startup)
+       adr     r4, 1f
+       ldmia   r4, {r5, r6}
+       sub     r4, r4, r5
+       ldr     r6, [r6, r4]
+pen:   ldr     r7, [r6]
+       cmp     r7, r0
+       bne     pen
+
+       /*
+        * we've been released from the holding pen: secondary_stack
+        * should now contain the SVC stack for this core
+        */
+       b       secondary_startup
+
+1:     .long   .
+       .long   phys_pen_release
index 3b948e8c27513f7896263a87a99123ad5394b860..e0a01eef099345efc0dd202b443867db6312cef1 100644 (file)
@@ -83,7 +83,6 @@ static struct map_desc intcp_io_desc[] __initdata = {
  { IO_ADDRESS(INTEGRATOR_UART1_BASE), INTEGRATOR_UART1_BASE, SZ_4K,  MT_DEVICE },
  { IO_ADDRESS(INTEGRATOR_DBG_BASE),   INTEGRATOR_DBG_BASE,   SZ_4K,  MT_DEVICE },
  { IO_ADDRESS(INTEGRATOR_GPIO_BASE),  INTEGRATOR_GPIO_BASE,  SZ_4K,  MT_DEVICE },
- { 0xfc900000, 0xc9000000, SZ_4K, MT_DEVICE },
  { 0xfca00000, 0xca000000, SZ_4K, MT_DEVICE },
  { 0xfcb00000, 0xcb000000, SZ_4K, MT_DEVICE },
 };
index d2c0ab21150c1cbedd3397d4b3b9854b258f2aaf..f1436e683b493f380b73814e433f5460ac1bea0f 100644 (file)
@@ -22,6 +22,8 @@
  */
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/smp.h>
+#include <linux/spinlock.h>
 
 #include <asm/hardware.h>
 #include <asm/io.h>
@@ -85,4 +87,4 @@ static int __init leds_init(void)
        return 0;
 }
 
-__initcall(leds_init);
+core_initcall(leds_init);
diff --git a/arch/arm/mach-integrator/platsmp.c b/arch/arm/mach-integrator/platsmp.c
new file mode 100644 (file)
index 0000000..ead15df
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+ *  linux/arch/arm/mach-cintegrator/platsmp.c
+ *
+ *  Copyright (C) 2002 ARM Ltd.
+ *  All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <linux/mm.h>
+
+#include <asm/atomic.h>
+#include <asm/delay.h>
+#include <asm/mmu_context.h>
+#include <asm/procinfo.h>
+#include <asm/ptrace.h>
+#include <asm/smp.h>
+
+extern void integrator_secondary_startup(void);
+
+/*
+ * control for which core is the next to come out of the secondary
+ * boot "holding pen"
+ */
+volatile int __initdata pen_release = -1;
+unsigned long __initdata phys_pen_release = 0;
+
+static DEFINE_SPINLOCK(boot_lock);
+
+void __init platform_secondary_init(unsigned int cpu)
+{
+       /*
+        * the primary core may have used a "cross call" soft interrupt
+        * to get this processor out of WFI in the BootMonitor - make
+        * sure that we are no longer being sent this soft interrupt
+        */
+       smp_cross_call_done(cpumask_of_cpu(cpu));
+
+       /*
+        * if any interrupts are already enabled for the primary
+        * core (e.g. timer irq), then they will not have been enabled
+        * for us: do so
+        */
+       secondary_scan_irqs();
+
+       /*
+        * let the primary processor know we're out of the
+        * pen, then head off into the C entry point
+        */
+       pen_release = -1;
+
+       /*
+        * Synchronise with the boot thread.
+        */
+       spin_lock(&boot_lock);
+       spin_unlock(&boot_lock);
+}
+
+int __init boot_secondary(unsigned int cpu, struct task_struct *idle)
+{
+       unsigned long timeout;
+
+       /*
+        * set synchronisation state between this boot processor
+        * and the secondary one
+        */
+       spin_lock(&boot_lock);
+
+       /*
+        * The secondary processor is waiting to be released from
+        * the holding pen - release it, then wait for it to flag
+        * that it has been released by resetting pen_release.
+        *
+        * Note that "pen_release" is the hardware CPU ID, whereas
+        * "cpu" is Linux's internal ID.
+        */
+       pen_release = cpu;
+
+       /*
+        * XXX
+        *
+        * This is a later addition to the booting protocol: the
+        * bootMonitor now puts secondary cores into WFI, so
+        * poke_milo() no longer gets the cores moving; we need
+        * to send a soft interrupt to wake the secondary core.
+        * Use smp_cross_call() for this, since there's little
+        * point duplicating the code here
+        */
+       smp_cross_call(cpumask_of_cpu(cpu));
+
+       timeout = jiffies + (1 * HZ);
+       while (time_before(jiffies, timeout)) {
+               if (pen_release == -1)
+                       break;
+
+               udelay(10);
+       }
+
+       /*
+        * now the secondary core is starting up let it run its
+        * calibrations, then wait for it to finish
+        */
+       spin_unlock(&boot_lock);
+
+       return pen_release != -1 ? -ENOSYS : 0;
+}
+
+static void __init poke_milo(void)
+{
+       extern void secondary_startup(void);
+
+       /* nobody is to be released from the pen yet */
+       pen_release = -1;
+
+       phys_pen_release = virt_to_phys(&pen_release);
+
+       /*
+        * write the address of secondary startup into the system-wide
+        * flags register, then clear the bottom two bits, which is what
+        * BootMonitor is waiting for
+        */
+#if 1
+#define CINTEGRATOR_HDR_FLAGSS_OFFSET 0x30
+       __raw_writel(virt_to_phys(integrator_secondary_startup),
+                    (IO_ADDRESS(INTEGRATOR_HDR_BASE) +
+                     CINTEGRATOR_HDR_FLAGSS_OFFSET));
+#define CINTEGRATOR_HDR_FLAGSC_OFFSET 0x34
+       __raw_writel(3,
+                    (IO_ADDRESS(INTEGRATOR_HDR_BASE) +
+                     CINTEGRATOR_HDR_FLAGSC_OFFSET));
+#endif
+
+       mb();
+}
+
+void __init smp_prepare_cpus(unsigned int max_cpus)
+{
+       unsigned int ncores = get_core_count();
+       unsigned int cpu = smp_processor_id();
+       int i;
+
+       /* sanity check */
+       if (ncores == 0) {
+               printk(KERN_ERR
+                      "Integrator/CP: strange CM count of 0? Default to 1\n");
+
+               ncores = 1;
+       }
+
+       if (ncores > NR_CPUS) {
+               printk(KERN_WARNING
+                      "Integrator/CP: no. of cores (%d) greater than configured "
+                      "maximum of %d - clipping\n",
+                      ncores, NR_CPUS);
+               ncores = NR_CPUS;
+       }
+
+       /*
+        * start with some more config for the Boot CPU, now that
+        * the world is a bit more alive (which was not the case
+        * when smp_prepare_boot_cpu() was called)
+        */
+       smp_store_cpu_info(cpu);
+
+       /*
+        * are we trying to boot more cores than exist?
+        */
+       if (max_cpus > ncores)
+               max_cpus = ncores;
+
+       /*
+        * Initialise the present mask - this tells us which CPUs should
+        * be present.
+        */
+       for (i = 0; i < max_cpus; i++) {
+               cpu_set(i, cpu_present_mask);
+       }
+
+       /*
+        * Do we need any more CPUs? If so, then let them know where
+        * to start. Note that, on modern versions of MILO, the "poke"
+        * doesn't actually do anything until each individual core is
+        * sent a soft interrupt to get it out of WFI
+        */
+       if (max_cpus > 1)
+               poke_milo();
+}
index 4f3c3d5c781cae9790bdede88e260853f10d7f90..fc0555596d6d70c82a0c3cefb603efc9e574d2e7 100644 (file)
@@ -162,12 +162,13 @@ void __init ixp2000_map_io(void)
 static unsigned ticks_per_jiffy;
 static unsigned ticks_per_usec;
 static unsigned next_jiffy_time;
+static volatile unsigned long *missing_jiffy_timer_csr;
 
 unsigned long ixp2000_gettimeoffset (void)
 {
        unsigned long offset;
 
-       offset = next_jiffy_time - *IXP2000_T4_CSR;
+       offset = next_jiffy_time - *missing_jiffy_timer_csr;
 
        return offset / ticks_per_usec;
 }
@@ -179,7 +180,7 @@ static int ixp2000_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        /* clear timer 1 */
        ixp2000_reg_write(IXP2000_T1_CLR, 1);
        
-       while ((next_jiffy_time - *IXP2000_T4_CSR) > ticks_per_jiffy) {
+       while ((next_jiffy_time - *missing_jiffy_timer_csr) > ticks_per_jiffy) {
                timer_tick(regs);
                next_jiffy_time -= ticks_per_jiffy;
        }
@@ -197,20 +198,37 @@ static struct irqaction ixp2000_timer_irq = {
 
 void __init ixp2000_init_time(unsigned long tick_rate)
 {
-       ixp2000_reg_write(IXP2000_T1_CLR, 0);
-       ixp2000_reg_write(IXP2000_T4_CLR, 0);
-
        ticks_per_jiffy = (tick_rate + HZ/2) / HZ;
        ticks_per_usec = tick_rate / 1000000;
 
+       /*
+        * We use timer 1 as our timer interrupt.
+        */
+       ixp2000_reg_write(IXP2000_T1_CLR, 0);
        ixp2000_reg_write(IXP2000_T1_CLD, ticks_per_jiffy - 1);
        ixp2000_reg_write(IXP2000_T1_CTL, (1 << 7));
 
        /*
-        * We use T4 as a monotonic counter to track missed jiffies
+        * We use a second timer as a monotonic counter for tracking
+        * missed jiffies.  The IXP2000 has four timers, but if we're
+        * on an A-step IXP2800, timer 2 and 3 don't work, so on those
+        * chips we use timer 4.  Timer 4 is the only timer that can
+        * be used for the watchdog, so we use timer 2 if we're on a
+        * non-buggy chip.
         */
-       ixp2000_reg_write(IXP2000_T4_CLD, -1);
-       ixp2000_reg_write(IXP2000_T4_CTL, (1 << 7));
+       if ((*IXP2000_PRODUCT_ID & 0x001ffef0) == 0x00000000) {
+               printk(KERN_INFO "Enabling IXP2800 erratum #25 workaround\n");
+
+               ixp2000_reg_write(IXP2000_T4_CLR, 0);
+               ixp2000_reg_write(IXP2000_T4_CLD, -1);
+               ixp2000_reg_write(IXP2000_T4_CTL, (1 << 7));
+               missing_jiffy_timer_csr = IXP2000_T4_CSR;
+       } else {
+               ixp2000_reg_write(IXP2000_T2_CLR, 0);
+               ixp2000_reg_write(IXP2000_T2_CLD, -1);
+               ixp2000_reg_write(IXP2000_T2_CTL, (1 << 7));
+               missing_jiffy_timer_csr = IXP2000_T2_CSR;
+       }
        next_jiffy_time = 0xffffffff;
 
        /* register for interrupt */
index dd012d6e2f5caecabc6792b3a7cee8e08b7994d3..f2c9e0d2b24b64517efb8c69391603d4ead0c58f 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/device.h>
+#include <linux/sysdev.h>
 #include <linux/major.h>
 #include <linux/fb.h>
 #include <linux/interrupt.h>
@@ -106,6 +107,35 @@ static void __init lubbock_init_irq(void)
        set_irq_type(IRQ_GPIO(0), IRQT_FALLING);
 }
 
+#ifdef CONFIG_PM
+
+static int lubbock_irq_resume(struct sys_device *dev)
+{
+       LUB_IRQ_MASK_EN = lubbock_irq_enabled;
+       return 0;
+}
+
+static struct sysdev_class lubbock_irq_sysclass = {
+       set_kset_name("cpld_irq"),
+       .resume = lubbock_irq_resume,
+};
+
+static struct sys_device lubbock_irq_device = {
+       .cls = &lubbock_irq_sysclass,
+};
+
+static int __init lubbock_irq_device_init(void)
+{
+       int ret = sysdev_class_register(&lubbock_irq_sysclass);
+       if (ret == 0)
+               ret = sysdev_register(&lubbock_irq_device);
+       return ret;
+}
+
+device_initcall(lubbock_irq_device_init);
+
+#endif
+
 static int lubbock_udc_is_connected(void)
 {
        return (LUB_MISC_RD & (1 << 9)) == 0;
index 3f952237ae3ddd185410bb2af9b1a9bf9bb981ad..9896afca751fc580bb6692a946d014919713a1c4 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <linux/init.h>
 #include <linux/device.h>
+#include <linux/sysdev.h>
 #include <linux/interrupt.h>
 #include <linux/sched.h>
 #include <linux/bitops.h>
@@ -62,7 +63,6 @@ static struct irqchip mainstone_irq_chip = {
        .unmask         = mainstone_unmask_irq,
 };
 
-
 static void mainstone_irq_handler(unsigned int irq, struct irqdesc *desc,
                                  struct pt_regs *regs)
 {
@@ -100,6 +100,35 @@ static void __init mainstone_init_irq(void)
        set_irq_type(IRQ_GPIO(0), IRQT_FALLING);
 }
 
+#ifdef CONFIG_PM
+
+static int mainstone_irq_resume(struct sys_device *dev)
+{
+       MST_INTMSKENA = mainstone_irq_enabled;
+       return 0;
+}
+
+static struct sysdev_class mainstone_irq_sysclass = {
+       set_kset_name("cpld_irq"),
+       .resume = mainstone_irq_resume,
+};
+
+static struct sys_device mainstone_irq_device = {
+       .cls = &mainstone_irq_sysclass,
+};
+
+static int __init mainstone_irq_device_init(void)
+{
+       int ret = sysdev_class_register(&mainstone_irq_sysclass);
+       if (ret == 0)
+               ret = sysdev_register(&mainstone_irq_device);
+       return ret;
+}
+
+device_initcall(mainstone_irq_device_init);
+
+#endif
+
 
 static struct resource smc91x_resources[] = {
        [0] = {
@@ -304,6 +333,15 @@ static void __init mainstone_map_io(void)
        PWER  = 0xC0000002;
        PRER  = 0x00000002;
        PFER  = 0x00000002;
+       /*      for use I SRAM as framebuffer.  */
+       PSLR |= 0xF04;
+       PCFR = 0x66;
+       /*      For Keypad wakeup.      */
+       KPC &=~KPC_ASACT;
+       KPC |=KPC_AS;
+       PKWR  = 0x000FD000;
+       /*      Need read PKWR back after set it.       */
+       PKWR;
 }
 
 MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)")
index 82a4bf34c251c338cc735679a559eef2ecf4e46e..ac4dd4336160bc2d202f7059e639d83836f52bda 100644 (file)
@@ -29,9 +29,6 @@
  */
 #undef DEBUG
 
-extern void pxa_cpu_suspend(void);
-extern void pxa_cpu_resume(void);
-
 #define SAVE(x)                sleep_save[SLEEP_SAVE_##x] = x
 #define RESTORE(x)     x = sleep_save[SLEEP_SAVE_##x]
 
@@ -63,6 +60,12 @@ enum {       SLEEP_SAVE_START = 0,
        SLEEP_SAVE_ICMR,
        SLEEP_SAVE_CKEN,
 
+#ifdef CONFIG_PXA27x
+       SLEEP_SAVE_MDREFR,
+       SLEEP_SAVE_PWER, SLEEP_SAVE_PCFR, SLEEP_SAVE_PRER,
+       SLEEP_SAVE_PFER, SLEEP_SAVE_PKWR,
+#endif
+
        SLEEP_SAVE_CKSUM,
 
        SLEEP_SAVE_SIZE
@@ -75,9 +78,7 @@ static int pxa_pm_enter(suspend_state_t state)
        unsigned long checksum = 0;
        struct timespec delta, rtc;
        int i;
-
-       if (state != PM_SUSPEND_MEM)
-               return -EINVAL;
+       extern void pxa_cpu_pm_enter(suspend_state_t state);
 
 #ifdef CONFIG_IWMMXT
        /* force any iWMMXt context to ram **/
@@ -100,16 +101,17 @@ static int pxa_pm_enter(suspend_state_t state)
        SAVE(GAFR2_L); SAVE(GAFR2_U);
 
 #ifdef CONFIG_PXA27x
+       SAVE(MDREFR);
        SAVE(GPLR3); SAVE(GPDR3); SAVE(GRER3); SAVE(GFER3); SAVE(PGSR3);
        SAVE(GAFR3_L); SAVE(GAFR3_U);
+       SAVE(PWER); SAVE(PCFR); SAVE(PRER);
+       SAVE(PFER); SAVE(PKWR);
 #endif
 
        SAVE(ICMR);
        ICMR = 0;
 
        SAVE(CKEN);
-       CKEN = 0;
-
        SAVE(PSTR);
 
        /* Note: wake up source are set up in each machine specific files */
@@ -123,16 +125,15 @@ static int pxa_pm_enter(suspend_state_t state)
        /* Clear sleep reset status */
        RCSR = RCSR_SMR;
 
-       /* set resume return address */
-       PSPR = virt_to_phys(pxa_cpu_resume);
-
        /* before sleeping, calculate and save a checksum */
        for (i = 0; i < SLEEP_SAVE_SIZE - 1; i++)
                checksum += sleep_save[i];
        sleep_save[SLEEP_SAVE_CKSUM] = checksum;
 
        /* *** go zzz *** */
-       pxa_cpu_suspend();
+       pxa_cpu_pm_enter(state);
+
+       cpu_init();
 
        /* after sleeping, validate the checksum */
        checksum = 0;
@@ -145,7 +146,7 @@ static int pxa_pm_enter(suspend_state_t state)
                LUB_HEXLED = 0xbadbadc5;
 #endif
                while (1)
-                       pxa_cpu_suspend();
+                       pxa_cpu_pm_enter(state);
        }
 
        /* ensure not to come back here if it wasn't intended */
@@ -162,8 +163,11 @@ static int pxa_pm_enter(suspend_state_t state)
        RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2);
 
 #ifdef CONFIG_PXA27x
+       RESTORE(MDREFR);
        RESTORE(GAFR3_L); RESTORE(GAFR3_U); RESTORE_GPLEVEL(3);
        RESTORE(GPDR3); RESTORE(GRER3); RESTORE(GFER3); RESTORE(PGSR3);
+       RESTORE(PWER); RESTORE(PCFR); RESTORE(PRER);
+       RESTORE(PFER); RESTORE(PKWR);
 #endif
 
        PSSR = PSSR_RDH | PSSR_PH;
@@ -197,7 +201,9 @@ unsigned long sleep_phys_sp(void *sp)
  */
 static int pxa_pm_prepare(suspend_state_t state)
 {
-       return 0;
+       extern int pxa_cpu_pm_prepare(suspend_state_t state);
+
+       return pxa_cpu_pm_prepare(state);
 }
 
 /*
index e887b7175ef33b8c547c04a14d6117deaf19ec49..7869c3b4e62f0447eee5737dc855b0b99afe5d10 100644 (file)
@@ -16,6 +16,7 @@
  * initialization stuff for PXA machines which can be overridden later if
  * need be.
  */
+#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
@@ -102,3 +103,35 @@ unsigned int get_lcdclk_frequency_10khz(void)
 }
 
 EXPORT_SYMBOL(get_lcdclk_frequency_10khz);
+
+#ifdef CONFIG_PM
+
+int pxa_cpu_pm_prepare(suspend_state_t state)
+{
+       switch (state) {
+       case PM_SUSPEND_MEM:
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+void pxa_cpu_pm_enter(suspend_state_t state)
+{
+       extern void pxa_cpu_suspend(unsigned int);
+       extern void pxa_cpu_resume(void);
+
+       CKEN = 0;
+
+       switch (state) {
+       case PM_SUSPEND_MEM:
+               /* set resume return address */
+               PSPR = virt_to_phys(pxa_cpu_resume);
+               pxa_cpu_suspend(3);
+               break;
+       }
+}
+
+#endif
index 7e863afefb531e5a9fe6c20d22e6e1355fb3b41d..893964fb9659bbabed5ed818377f430315915ef2 100644 (file)
@@ -120,6 +120,42 @@ EXPORT_SYMBOL(get_clk_frequency_khz);
 EXPORT_SYMBOL(get_memclk_frequency_10khz);
 EXPORT_SYMBOL(get_lcdclk_frequency_10khz);
 
+#ifdef CONFIG_PM
+
+int pxa_cpu_pm_prepare(suspend_state_t state)
+{
+       switch (state) {
+       case PM_SUSPEND_MEM:
+               return 0;
+       default:
+               return -EINVAL;
+       }
+}
+
+void pxa_cpu_pm_enter(suspend_state_t state)
+{
+       extern void pxa_cpu_standby(void);
+       extern void pxa_cpu_suspend(unsigned int);
+       extern void pxa_cpu_resume(void);
+
+       CKEN = CKEN22_MEMC | CKEN9_OSTIMER;
+
+       /* ensure voltage-change sequencer not initiated, which hangs */
+       PCFR &= ~PCFR_FVC;
+
+       /* Clear edge-detect status register. */
+       PEDR = 0xDF12FE1B;
+
+       switch (state) {
+       case PM_SUSPEND_MEM:
+               /* set resume return address */
+               PSPR = virt_to_phys(pxa_cpu_resume);
+               pxa_cpu_suspend(3);
+               break;
+       }
+}
+
+#endif
 
 /*
  * device registration specific to PXA27x.
index e23f534d4e1d1696ff7343ad29f1ecad893f9cc1..8d986b8401c2474f3948bb3a4301c26a9784b7f1 100644 (file)
@@ -478,7 +478,7 @@ static int s3c2440_clk_add(struct sys_device *sysdev)
 {
        unsigned long upllcon = __raw_readl(S3C2410_UPLLCON);
 
-       s3c2440_clk_upll.rate = s3c2410_get_pll(upllcon, clk_xtal.rate) * 2;
+       s3c2440_clk_upll.rate = s3c2410_get_pll(upllcon, clk_xtal.rate);
 
        printk("S3C2440: Clock Support, UPLL %ld.%03ld MHz\n",
               print_mhz(s3c2440_clk_upll.rate));
index bc229fab86d44644fc4d3d5bc1793035f58ec4f9..c7c28890d406c25356b2643400360cb661ee1586 100644 (file)
@@ -785,6 +785,10 @@ int s3c2410_dma_free(dmach_t channel, s3c2410_dma_client_t *client)
        chan->client = NULL;
        chan->in_use = 0;
 
+       if (chan->irq_claimed)
+               free_irq(chan->irq, (void *)chan);
+       chan->irq_claimed = 0;
+
        local_irq_restore(flags);
 
        return 0;
index 9a8cc5ae225566e5d6d17de94df3fe79dbfe9a2c..d4c8281b55f64a5c3a7a4f2d4fef2c6433215d25 100644 (file)
@@ -192,9 +192,11 @@ void __init s3c2440_map_io(struct map_desc *mach_desc, int size)
 
        iotable_init(s3c2440_iodesc, ARRAY_SIZE(s3c2440_iodesc));
        iotable_init(mach_desc, size);
+
        /* rename any peripherals used differing from the s3c2410 */
 
-       s3c_device_i2c.name = "s3c2440-i2c";
+       s3c_device_i2c.name  = "s3c2440-i2c";
+       s3c_device_nand.name = "s3c2440-nand";
 
        /* change irq for watchdog */
 
@@ -225,7 +227,7 @@ void __init s3c2440_init_clocks(int xtal)
                break;
 
        case S3C2440_CLKDIVN_HDIVN_2:
-               hdiv = 1;
+               hdiv = 2;
                break;
 
        case S3C2440_CLKDIVN_HDIVN_4_8:
index 50cde576dadfc9cf9ebe06917c43e2e054976ed9..6923316b3d0df043f4140648bdbfd58aa0691c7e 100644 (file)
@@ -150,7 +150,7 @@ config SA1100_SSP
 
 config H3600_SLEEVE
        tristate "Compaq iPAQ Handheld sleeve support"
-       depends on SA1100_H3600
+       depends on SA1100_H3100 || SA1100_H3600
        help
          Choose this option to enable support for extension packs (sleeves)
          for the Compaq iPAQ H3XXX series of handheld computers.  This option
index 379ea5e3950f7de6794ef990a91ef89f58352e3c..59c7964cfe11d0a9b68193f5efb369c592ab1a7e 100644 (file)
@@ -88,6 +88,8 @@ static int sa11x0_pm_enter(suspend_state_t state)
        /* go zzz */
        sa1100_cpu_suspend();
 
+       cpu_init();
+
        /*
         * Ensure not to come back here if it wasn't intended
         */
index 5d608837757a8247a9cbb11ed781102b8e166b5a..ba81e70ed813ac633ab18fb305cfde4680ed2848 100644 (file)
@@ -5,3 +5,4 @@
 obj-y                                  := core.o clock.o
 obj-$(CONFIG_ARCH_VERSATILE_PB)                += versatile_pb.o
 obj-$(CONFIG_MACH_VERSATILE_AB)                += versatile_ab.o
+obj-$(CONFIG_PCI)                      += pci.o
index 554e1bd30d6e631ce2959f0ccac136f4d1b325f0..6a7cbea5e098d4acf62a3966217a643656848a3b 100644 (file)
@@ -196,11 +196,15 @@ static struct map_desc versatile_io_desc[] __initdata = {
 #ifdef CONFIG_DEBUG_LL
  { IO_ADDRESS(VERSATILE_UART0_BASE), VERSATILE_UART0_BASE, SZ_4K,      MT_DEVICE },
 #endif
-#ifdef FIXME
- { PCI_MEMORY_VADDR,                PHYS_PCI_MEM_BASE,    SZ_16M,     MT_DEVICE },
- { PCI_CONFIG_VADDR,                PHYS_PCI_CONFIG_BASE, SZ_16M,     MT_DEVICE },
- { PCI_V3_VADDR,                    PHYS_PCI_V3_BASE,     SZ_512K,    MT_DEVICE },
- { PCI_IO_VADDR,                    PHYS_PCI_IO_BASE,     SZ_64K,     MT_DEVICE },
+#ifdef CONFIG_PCI
+ { IO_ADDRESS(VERSATILE_PCI_CORE_BASE), VERSATILE_PCI_CORE_BASE, SZ_4K, MT_DEVICE },
+ { VERSATILE_PCI_VIRT_BASE,          VERSATILE_PCI_BASE,   VERSATILE_PCI_BASE_SIZE, MT_DEVICE },
+ { VERSATILE_PCI_CFG_VIRT_BASE,      VERSATILE_PCI_CFG_BASE, VERSATILE_PCI_CFG_BASE_SIZE, MT_DEVICE },
+#if 0
+ { VERSATILE_PCI_VIRT_MEM_BASE0,     VERSATILE_PCI_MEM_BASE0, SZ_16M,  MT_DEVICE },
+ { VERSATILE_PCI_VIRT_MEM_BASE1,     VERSATILE_PCI_MEM_BASE1, SZ_16M,  MT_DEVICE },
+ { VERSATILE_PCI_VIRT_MEM_BASE2,     VERSATILE_PCI_MEM_BASE2, SZ_16M,  MT_DEVICE },
+#endif
 #endif
 };
 
@@ -543,7 +547,7 @@ static void versatile_clcd_enable(struct clcd_fb *fb)
                val |= SYS_CLCD_MODE_5551;
                break;
        case 6:
-               val |= SYS_CLCD_MODE_565_BLSB;
+               val |= SYS_CLCD_MODE_565_RLSB;
                break;
        case 8:
                val |= SYS_CLCD_MODE_888;
diff --git a/arch/arm/mach-versatile/pci.c b/arch/arm/mach-versatile/pci.c
new file mode 100644 (file)
index 0000000..d1565e8
--- /dev/null
@@ -0,0 +1,360 @@
+/*
+ *  linux/arch/arm/mach-versatile/pci.c
+ *
+ * (C) Copyright Koninklijke Philips Electronics NV 2004. All rights reserved.
+ * You can redistribute and/or modify this software under the terms of version 2
+ * of the GNU General Public License as published by the Free Software Foundation.
+ * THIS SOFTWARE IS PROVIDED "AS IS" 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.
+ * Koninklijke Philips Electronics nor its subsidiaries is obligated to provide any support for this software.
+ *
+ * ARM Versatile PCI driver.
+ *
+ * 14/04/2005 Initial version, colin.king@philips.com
+ *
+ */
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/ptrace.h>
+#include <linux/slab.h>
+#include <linux/ioport.h>
+#include <linux/interrupt.h>
+#include <linux/spinlock.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/system.h>
+#include <asm/mach/pci.h>
+#include <asm/mach-types.h>
+
+/*
+ * these spaces are mapped using the following base registers:
+ *
+ * Usage Local Bus Memory         Base/Map registers used
+ *
+ * Mem   50000000 - 5FFFFFFF      LB_BASE0/LB_MAP0,  non prefetch
+ * Mem   60000000 - 6FFFFFFF      LB_BASE1/LB_MAP1,  prefetch
+ * IO    44000000 - 4FFFFFFF      LB_BASE2/LB_MAP2,  IO
+ * Cfg   42000000 - 42FFFFFF     PCI config
+ *
+ */
+#define SYS_PCICTL                     IO_ADDRESS(VERSATILE_SYS_PCICTL)
+#define PCI_IMAP0                      IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x0)
+#define PCI_IMAP1                      IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x4)
+#define PCI_IMAP2                      IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x8)
+#define PCI_SMAP0                      IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x10)
+#define PCI_SMAP1                      IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x14)
+#define PCI_SMAP2                      IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x18)
+#define PCI_SELFID                     IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0xc)
+
+#define DEVICE_ID_OFFSET               0x00
+#define CSR_OFFSET                     0x04
+#define CLASS_ID_OFFSET                        0x08
+
+#define VP_PCI_DEVICE_ID               0x030010ee
+#define VP_PCI_CLASS_ID                        0x0b400000
+
+static unsigned long pci_slot_ignore = 0;
+
+static int __init versatile_pci_slot_ignore(char *str)
+{
+       int retval;
+       int slot;
+
+       while ((retval = get_option(&str,&slot))) {
+               if ((slot < 0) || (slot > 31)) {
+                       printk("Illegal slot value: %d\n",slot);
+               } else {
+                       pci_slot_ignore |= (1 << slot);
+               }
+       }
+       return 1;
+}
+
+__setup("pci_slot_ignore=", versatile_pci_slot_ignore);
+
+
+static unsigned long __pci_addr(struct pci_bus *bus,
+                               unsigned int devfn, int offset)
+{
+       unsigned int busnr = bus->number;
+
+       /*
+        * Trap out illegal values
+        */
+       if (offset > 255)
+               BUG();
+       if (busnr > 255)
+               BUG();
+       if (devfn > 255)
+               BUG();
+
+       return (VERSATILE_PCI_CFG_VIRT_BASE | (busnr << 16) |
+               (PCI_SLOT(devfn) << 11) | (PCI_FUNC(devfn) << 8) | offset);
+}
+
+static int versatile_read_config(struct pci_bus *bus, unsigned int devfn, int where,
+                                int size, u32 *val)
+{
+       unsigned long addr = __pci_addr(bus, devfn, where);
+       u32 v;
+       int slot = PCI_SLOT(devfn);
+
+       if (pci_slot_ignore & (1 << slot)) {
+               /* Ignore this slot */
+               switch (size) {
+               case 1:
+                       v = 0xff;
+                       break;
+               case 2:
+                       v = 0xffff;
+                       break;
+               default:
+                       v = 0xffffffff;
+               }
+       } else {
+               switch (size) {
+               case 1:
+                       addr &= ~3;
+                       v = __raw_readb(addr);
+                       break;
+
+               case 2:
+                       v = __raw_readl(addr & ~3);
+                       if (addr & 2) v >>= 16;
+                       v &= 0xffff;
+                       break;
+
+               default:
+                       addr &= ~3;
+                       v = __raw_readl(addr);
+                       break;
+               }
+       }
+
+       *val = v;
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int versatile_write_config(struct pci_bus *bus, unsigned int devfn, int where,
+                                 int size, u32 val)
+{
+       unsigned long addr = __pci_addr(bus, devfn, where);
+       int slot = PCI_SLOT(devfn);
+
+       if (pci_slot_ignore & (1 << slot)) {
+               return PCIBIOS_SUCCESSFUL;
+       }
+
+       switch (size) {
+       case 1:
+               __raw_writeb((u8)val, addr);
+               break;
+
+       case 2:
+               __raw_writew((u16)val, addr);
+               break;
+
+       case 4:
+               __raw_writel(val, addr);
+               break;
+       }
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static struct pci_ops pci_versatile_ops = {
+       .read   = versatile_read_config,
+       .write  = versatile_write_config,
+};
+
+static struct resource io_mem = {
+       .name   = "PCI I/O space",
+       .start  = VERSATILE_PCI_MEM_BASE0,
+       .end    = VERSATILE_PCI_MEM_BASE0+VERSATILE_PCI_MEM_BASE0_SIZE-1,
+       .flags  = IORESOURCE_IO,
+};
+
+static struct resource non_mem = {
+       .name   = "PCI non-prefetchable",
+       .start  = VERSATILE_PCI_MEM_BASE1,
+       .end    = VERSATILE_PCI_MEM_BASE1+VERSATILE_PCI_MEM_BASE1_SIZE-1,
+       .flags  = IORESOURCE_MEM,
+};
+
+static struct resource pre_mem = {
+       .name   = "PCI prefetchable",
+       .start  = VERSATILE_PCI_MEM_BASE2,
+       .end    = VERSATILE_PCI_MEM_BASE2+VERSATILE_PCI_MEM_BASE2_SIZE-1,
+       .flags  = IORESOURCE_MEM | IORESOURCE_PREFETCH,
+};
+
+static int __init pci_versatile_setup_resources(struct resource **resource)
+{
+       int ret = 0;
+
+       ret = request_resource(&iomem_resource, &io_mem);
+       if (ret) {
+               printk(KERN_ERR "PCI: unable to allocate I/O "
+                      "memory region (%d)\n", ret);
+               goto out;
+       }
+       ret = request_resource(&iomem_resource, &non_mem);
+       if (ret) {
+               printk(KERN_ERR "PCI: unable to allocate non-prefetchable "
+                      "memory region (%d)\n", ret);
+               goto release_io_mem;
+       }
+       ret = request_resource(&iomem_resource, &pre_mem);
+       if (ret) {
+               printk(KERN_ERR "PCI: unable to allocate prefetchable "
+                      "memory region (%d)\n", ret);
+               goto release_non_mem;
+       }
+
+       /*
+        * bus->resource[0] is the IO resource for this bus
+        * bus->resource[1] is the mem resource for this bus
+        * bus->resource[2] is the prefetch mem resource for this bus
+        */
+       resource[0] = &io_mem;
+       resource[1] = &non_mem;
+       resource[2] = &pre_mem;
+
+       goto out;
+
+ release_non_mem:
+       release_resource(&non_mem);
+ release_io_mem:
+       release_resource(&io_mem);
+ out:
+       return ret;
+}
+
+int __init pci_versatile_setup(int nr, struct pci_sys_data *sys)
+{
+       int ret = 0;
+        int i;
+        int myslot = -1;
+       unsigned long val;
+
+       if (nr == 0) {
+               sys->mem_offset = 0;
+               ret = pci_versatile_setup_resources(sys->resource);
+               if (ret < 0) {
+                       printk("pci_versatile_setup: resources... oops?\n");
+                       goto out;
+               }
+       } else {
+               printk("pci_versatile_setup: resources... nr == 0??\n");
+               goto out;
+       }
+
+       __raw_writel(VERSATILE_PCI_MEM_BASE0 >> 28,PCI_IMAP0);
+       __raw_writel(VERSATILE_PCI_MEM_BASE1 >> 28,PCI_IMAP1);
+       __raw_writel(VERSATILE_PCI_MEM_BASE2 >> 28,PCI_IMAP2);
+
+       __raw_writel(1, SYS_PCICTL);
+
+       val = __raw_readl(SYS_PCICTL);
+       if (!(val & 1)) {
+               printk("Not plugged into PCI backplane!\n");
+               ret = -EIO;
+               goto out;
+       }
+
+       /*
+        *  We need to discover the PCI core first to configure itself
+        *  before the main PCI probing is performed
+        */
+       for (i=0; i<32; i++) {
+               if ((__raw_readl(VERSATILE_PCI_VIRT_BASE+(i<<11)+DEVICE_ID_OFFSET) == VP_PCI_DEVICE_ID) &&
+                   (__raw_readl(VERSATILE_PCI_VIRT_BASE+(i<<11)+CLASS_ID_OFFSET) == VP_PCI_CLASS_ID)) {
+                       myslot = i;
+
+                       __raw_writel(myslot, PCI_SELFID);
+                       val = __raw_readl(VERSATILE_PCI_CFG_VIRT_BASE+(myslot<<11)+CSR_OFFSET);
+                       val |= (1<<2);
+                       __raw_writel(val, VERSATILE_PCI_CFG_VIRT_BASE+(myslot<<11)+CSR_OFFSET);
+                       break;
+               }
+       }
+
+       if (myslot == -1) {
+               printk("Cannot find PCI core!\n");
+               ret = -EIO;
+       } else {
+               printk("PCI core found (slot %d)\n",myslot);
+               /* Do not to map Versatile FPGA PCI device
+                  into memory space as we are short of
+                  mappable memory */
+               pci_slot_ignore |= (1 << myslot);
+               ret = 1;
+       }
+
+ out:
+       return ret;
+}
+
+
+struct pci_bus *pci_versatile_scan_bus(int nr, struct pci_sys_data *sys)
+{
+       return pci_scan_bus(sys->busnr, &pci_versatile_ops, sys);
+}
+
+/*
+ * V3_LB_BASE? - local bus address
+ * V3_LB_MAP?  - pci bus address
+ */
+void __init pci_versatile_preinit(void)
+{
+}
+
+void __init pci_versatile_postinit(void)
+{
+}
+
+
+/*
+ * map the specified device/slot/pin to an IRQ.   Different backplanes may need to modify this.
+ */
+static int __init versatile_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
+{
+       int irq;
+       int devslot = PCI_SLOT(dev->devfn);
+
+       /* slot,  pin,  irq
+           24    1     27
+           25    1     28      untested
+           26    1     29
+           27    1     30      untested
+       */
+
+       irq = 27 + ((slot + pin + 2) % 3);      /* Fudged */
+
+       printk("map irq: slot %d, pin %d, devslot %d, irq: %d\n",slot,pin,devslot,irq);
+
+       return irq;
+}
+
+static struct hw_pci versatile_pci __initdata = {
+       .swizzle                = NULL,
+       .map_irq                = versatile_map_irq,
+       .nr_controllers         = 1,
+       .setup                  = pci_versatile_setup,
+       .scan                   = pci_versatile_scan_bus,
+       .preinit                = pci_versatile_preinit,
+       .postinit               = pci_versatile_postinit,
+};
+
+static int __init versatile_pci_init(void)
+{
+       pci_common_init(&versatile_pci);
+       return 0;
+}
+
+subsys_initcall(versatile_pci_init);
index c4fc6be629deeee971c6635b5130d7e329970a63..95606b4a3ba67942ae16563a21c783d35cc9753b 100644 (file)
@@ -62,7 +62,7 @@ config CPU_ARM720T
 # ARM920T
 config CPU_ARM920T
        bool "Support ARM920T processor" if !ARCH_S3C2410
-       depends on ARCH_INTEGRATOR || ARCH_S3C2410 || ARCH_IMX
+       depends on ARCH_INTEGRATOR || ARCH_S3C2410 || ARCH_IMX || ARCH_AAEC2000
        default y if ARCH_S3C2410
        select CPU_32v4
        select CPU_ABRT_EV4T
@@ -228,7 +228,6 @@ config CPU_SA1100
        select CPU_CACHE_V4WB
        select CPU_CACHE_VIVT
        select CPU_TLB_V4WB
-       select CPU_MINICACHE
 
 # XScale
 config CPU_XSCALE
@@ -239,7 +238,6 @@ config CPU_XSCALE
        select CPU_ABRT_EV5T
        select CPU_CACHE_VIVT
        select CPU_TLB_V4WBI
-       select CPU_MINICACHE
 
 # ARMv6
 config CPU_V6
@@ -345,11 +343,6 @@ config CPU_TLB_V4WBI
 config CPU_TLB_V6
        bool
 
-config CPU_MINICACHE
-       bool
-       help
-         Processor has a minicache.
-
 comment "Processor Features"
 
 config ARM_THUMB
@@ -412,21 +405,28 @@ config CPU_BPREDICT_DISABLE
 
 config TLS_REG_EMUL
        bool
-       default y if (SMP || CPU_32v6) && (CPU_32v5 || CPU_32v4 || CPU_32v3)
+       default y if SMP && (CPU_32v5 || CPU_32v4 || CPU_32v3)
        help
-         We might be running on an ARMv6+ processor which should have the TLS
-         register but for some reason we can't use it, or maybe an SMP system
-         using a pre-ARMv6 processor (there are apparently a few prototypes
-         like that in existence) and therefore access to that register must
-         be emulated.
+         An SMP system using a pre-ARMv6 processor (there are apparently
+         a few prototypes like that in existence) and therefore access to
+         that required register must be emulated.
 
 config HAS_TLS_REG
        bool
-       depends on CPU_32v6
-       default y if !TLS_REG_EMUL
+       depends on !TLS_REG_EMUL
+       default y if SMP || CPU_32v7
        help
          This selects support for the CP15 thread register.
-         It is defined to be available on ARMv6 or later.  If a particular
-         ARMv6 or later CPU doesn't support it then it must omc;ide "select
-         TLS_REG_EMUL" along with its other caracteristics.
+         It is defined to be available on some ARMv6 processors (including
+         all SMP capable ARMv6's) or later processors.  User space may
+         assume directly accessing that register and always obtain the
+         expected value only on ARMv7 and above.
+
+config NEEDS_SYSCALL_FOR_CMPXCHG
+       bool
+       default y if SMP && (CPU_32v5 || CPU_32v4 || CPU_32v3)
+       help
+         SMP on a pre-ARMv6 processor?  Well OK then.
+         Forget about fast user space cmpxchg support.
+         It is just not possible.
 
index ccf316c11e02523f65b3cd21e3c13fe2afd71e59..59f47d4c2dfe6edf22560b861d6a3d554104dbf1 100644 (file)
@@ -31,8 +31,6 @@ obj-$(CONFIG_CPU_COPY_V6)     += copypage-v6.o mmu.o
 obj-$(CONFIG_CPU_SA1100)       += copypage-v4mc.o
 obj-$(CONFIG_CPU_XSCALE)       += copypage-xscale.o
 
-obj-$(CONFIG_CPU_MINICACHE)    += minicache.o
-
 obj-$(CONFIG_CPU_TLB_V3)       += tlb-v3.o
 obj-$(CONFIG_CPU_TLB_V4WT)     += tlb-v4.o
 obj-$(CONFIG_CPU_TLB_V4WB)     += tlb-v4wb.o
diff --git a/arch/arm/mm/copypage-v4mc.S b/arch/arm/mm/copypage-v4mc.S
deleted file mode 100644 (file)
index 305af3d..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  linux/arch/arm/lib/copy_page-armv4mc.S
- *
- *  Copyright (C) 1995-2001 Russell King
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- *  ASM optimised string functions
- */
-#include <linux/linkage.h>
-#include <linux/init.h>
-#include <asm/constants.h>
-
-       .text
-       .align  5
-/*
- * ARMv4 mini-dcache optimised copy_user_page
- *
- * We flush the destination cache lines just before we write the data into the
- * corresponding address.  Since the Dcache is read-allocate, this removes the
- * Dcache aliasing issue.  The writes will be forwarded to the write buffer,
- * and merged as appropriate.
- *
- * Note: We rely on all ARMv4 processors implementing the "invalidate D line"
- * instruction.  If your processor does not supply this, you have to write your
- * own copy_user_page that does the right thing.
- */
-ENTRY(v4_mc_copy_user_page)
-       stmfd   sp!, {r4, lr}                   @ 2
-       mov     r4, r0
-       mov     r0, r1
-       bl      map_page_minicache
-       mov     r1, #PAGE_SZ/64                 @ 1
-       ldmia   r0!, {r2, r3, ip, lr}           @ 4
-1:     mcr     p15, 0, r4, c7, c6, 1           @ 1   invalidate D line
-       stmia   r4!, {r2, r3, ip, lr}           @ 4
-       ldmia   r0!, {r2, r3, ip, lr}           @ 4+1
-       stmia   r4!, {r2, r3, ip, lr}           @ 4
-       ldmia   r0!, {r2, r3, ip, lr}           @ 4
-       mcr     p15, 0, r4, c7, c6, 1           @ 1   invalidate D line
-       stmia   r4!, {r2, r3, ip, lr}           @ 4
-       ldmia   r0!, {r2, r3, ip, lr}           @ 4
-       subs    r1, r1, #1                      @ 1
-       stmia   r4!, {r2, r3, ip, lr}           @ 4
-       ldmneia r0!, {r2, r3, ip, lr}           @ 4
-       bne     1b                              @ 1
-       ldmfd   sp!, {r4, pc}                   @ 3
-
-       .align  5
-/*
- * ARMv4 optimised clear_user_page
- *
- * Same story as above.
- */
-ENTRY(v4_mc_clear_user_page)
-       str     lr, [sp, #-4]!
-       mov     r1, #PAGE_SZ/64                 @ 1
-       mov     r2, #0                          @ 1
-       mov     r3, #0                          @ 1
-       mov     ip, #0                          @ 1
-       mov     lr, #0                          @ 1
-1:     mcr     p15, 0, r0, c7, c6, 1           @ 1   invalidate D line
-       stmia   r0!, {r2, r3, ip, lr}           @ 4
-       stmia   r0!, {r2, r3, ip, lr}           @ 4
-       mcr     p15, 0, r0, c7, c6, 1           @ 1   invalidate D line
-       stmia   r0!, {r2, r3, ip, lr}           @ 4
-       stmia   r0!, {r2, r3, ip, lr}           @ 4
-       subs    r1, r1, #1                      @ 1
-       bne     1b                              @ 1
-       ldr     pc, [sp], #4
-
-       __INITDATA
-
-       .type   v4_mc_user_fns, #object
-ENTRY(v4_mc_user_fns)
-       .long   v4_mc_clear_user_page
-       .long   v4_mc_copy_user_page
-       .size   v4_mc_user_fns, . - v4_mc_user_fns
diff --git a/arch/arm/mm/copypage-v4mc.c b/arch/arm/mm/copypage-v4mc.c
new file mode 100644 (file)
index 0000000..fc69dcc
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ *  linux/arch/arm/lib/copypage-armv4mc.S
+ *
+ *  Copyright (C) 1995-2005 Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This handles the mini data cache, as found on SA11x0 and XScale
+ * processors.  When we copy a user page page, we map it in such a way
+ * that accesses to this page will not touch the main data cache, but
+ * will be cached in the mini data cache.  This prevents us thrashing
+ * the main data cache on page faults.
+ */
+#include <linux/init.h>
+#include <linux/mm.h>
+
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/tlbflush.h>
+
+/*
+ * 0xffff8000 to 0xffffffff is reserved for any ARM architecture
+ * specific hacks for copying pages efficiently.
+ */
+#define minicache_pgprot __pgprot(L_PTE_PRESENT | L_PTE_YOUNG | \
+                                 L_PTE_CACHEABLE)
+
+#define TOP_PTE(x)     pte_offset_kernel(top_pmd, x)
+
+static DEFINE_SPINLOCK(minicache_lock);
+
+/*
+ * ARMv4 mini-dcache optimised copy_user_page
+ *
+ * We flush the destination cache lines just before we write the data into the
+ * corresponding address.  Since the Dcache is read-allocate, this removes the
+ * Dcache aliasing issue.  The writes will be forwarded to the write buffer,
+ * and merged as appropriate.
+ *
+ * Note: We rely on all ARMv4 processors implementing the "invalidate D line"
+ * instruction.  If your processor does not supply this, you have to write your
+ * own copy_user_page that does the right thing.
+ */
+static void __attribute__((naked))
+mc_copy_user_page(void *from, void *to)
+{
+       asm volatile(
+       "stmfd  sp!, {r4, lr}                   @ 2\n\
+       mov     r4, %2                          @ 1\n\
+       ldmia   %0!, {r2, r3, ip, lr}           @ 4\n\
+1:     mcr     p15, 0, %1, c7, c6, 1           @ 1   invalidate D line\n\
+       stmia   %1!, {r2, r3, ip, lr}           @ 4\n\
+       ldmia   %0!, {r2, r3, ip, lr}           @ 4+1\n\
+       stmia   %1!, {r2, r3, ip, lr}           @ 4\n\
+       ldmia   %0!, {r2, r3, ip, lr}           @ 4\n\
+       mcr     p15, 0, %1, c7, c6, 1           @ 1   invalidate D line\n\
+       stmia   %1!, {r2, r3, ip, lr}           @ 4\n\
+       ldmia   %0!, {r2, r3, ip, lr}           @ 4\n\
+       subs    r4, r4, #1                      @ 1\n\
+       stmia   %1!, {r2, r3, ip, lr}           @ 4\n\
+       ldmneia %0!, {r2, r3, ip, lr}           @ 4\n\
+       bne     1b                              @ 1\n\
+       ldmfd   sp!, {r4, pc}                   @ 3"
+       :
+       : "r" (from), "r" (to), "I" (PAGE_SIZE / 64));
+}
+
+void v4_mc_copy_user_page(void *kto, const void *kfrom, unsigned long vaddr)
+{
+       spin_lock(&minicache_lock);
+
+       set_pte(TOP_PTE(0xffff8000), pfn_pte(__pa(kfrom) >> PAGE_SHIFT, minicache_pgprot));
+       flush_tlb_kernel_page(0xffff8000);
+
+       mc_copy_user_page((void *)0xffff8000, kto);
+
+       spin_unlock(&minicache_lock);
+}
+
+/*
+ * ARMv4 optimised clear_user_page
+ */
+void __attribute__((naked))
+v4_mc_clear_user_page(void *kaddr, unsigned long vaddr)
+{
+       asm volatile(
+       "str    lr, [sp, #-4]!\n\
+       mov     r1, %0                          @ 1\n\
+       mov     r2, #0                          @ 1\n\
+       mov     r3, #0                          @ 1\n\
+       mov     ip, #0                          @ 1\n\
+       mov     lr, #0                          @ 1\n\
+1:     mcr     p15, 0, r0, c7, c6, 1           @ 1   invalidate D line\n\
+       stmia   r0!, {r2, r3, ip, lr}           @ 4\n\
+       stmia   r0!, {r2, r3, ip, lr}           @ 4\n\
+       mcr     p15, 0, r0, c7, c6, 1           @ 1   invalidate D line\n\
+       stmia   r0!, {r2, r3, ip, lr}           @ 4\n\
+       stmia   r0!, {r2, r3, ip, lr}           @ 4\n\
+       subs    r1, r1, #1                      @ 1\n\
+       bne     1b                              @ 1\n\
+       ldr     pc, [sp], #4"
+       :
+       : "I" (PAGE_SIZE / 64));
+}
+
+struct cpu_user_fns v4_mc_user_fns __initdata = {
+       .cpu_clear_user_page    = v4_mc_clear_user_page, 
+       .cpu_copy_user_page     = v4_mc_copy_user_page,
+};
index 694ac8208858a9c54475f8f3173b71cca7787d4e..27d041574ea7891ab91bd9c1917ba1ee7e2be58f 100644 (file)
 #define to_address     (0xffffc000)
 #define to_pgprot      PAGE_KERNEL
 
-static pte_t *from_pte;
-static pte_t *to_pte;
-static DEFINE_SPINLOCK(v6_lock);
+#define TOP_PTE(x)     pte_offset_kernel(top_pmd, x)
 
-#define DCACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT)
+static DEFINE_SPINLOCK(v6_lock);
 
 /*
  * Copy the user page.  No aliasing to deal with so we can just
@@ -55,7 +53,7 @@ void v6_clear_user_page_nonaliasing(void *kaddr, unsigned long vaddr)
  */
 void v6_copy_user_page_aliasing(void *kto, const void *kfrom, unsigned long vaddr)
 {
-       unsigned int offset = DCACHE_COLOUR(vaddr);
+       unsigned int offset = CACHE_COLOUR(vaddr);
        unsigned long from, to;
 
        /*
@@ -74,8 +72,8 @@ void v6_copy_user_page_aliasing(void *kto, const void *kfrom, unsigned long vadd
         */
        spin_lock(&v6_lock);
 
-       set_pte(from_pte + offset, pfn_pte(__pa(kfrom) >> PAGE_SHIFT, from_pgprot));
-       set_pte(to_pte + offset, pfn_pte(__pa(kto) >> PAGE_SHIFT, to_pgprot));
+       set_pte(TOP_PTE(from_address) + offset, pfn_pte(__pa(kfrom) >> PAGE_SHIFT, from_pgprot));
+       set_pte(TOP_PTE(to_address) + offset, pfn_pte(__pa(kto) >> PAGE_SHIFT, to_pgprot));
 
        from = from_address + (offset << PAGE_SHIFT);
        to   = to_address + (offset << PAGE_SHIFT);
@@ -95,7 +93,7 @@ void v6_copy_user_page_aliasing(void *kto, const void *kfrom, unsigned long vadd
  */
 void v6_clear_user_page_aliasing(void *kaddr, unsigned long vaddr)
 {
-       unsigned int offset = DCACHE_COLOUR(vaddr);
+       unsigned int offset = CACHE_COLOUR(vaddr);
        unsigned long to = to_address + (offset << PAGE_SHIFT);
 
        /*
@@ -114,7 +112,7 @@ void v6_clear_user_page_aliasing(void *kaddr, unsigned long vaddr)
         */
        spin_lock(&v6_lock);
 
-       set_pte(to_pte + offset, pfn_pte(__pa(kaddr) >> PAGE_SHIFT, to_pgprot));
+       set_pte(TOP_PTE(to_address) + offset, pfn_pte(__pa(kaddr) >> PAGE_SHIFT, to_pgprot));
        flush_tlb_kernel_page(to);
        clear_page((void *)to);
 
@@ -129,21 +127,6 @@ struct cpu_user_fns v6_user_fns __initdata = {
 static int __init v6_userpage_init(void)
 {
        if (cache_is_vipt_aliasing()) {
-               pgd_t *pgd;
-               pmd_t *pmd;
-
-               pgd = pgd_offset_k(from_address);
-               pmd = pmd_alloc(&init_mm, pgd, from_address);
-               if (!pmd)
-                       BUG();
-               from_pte = pte_alloc_kernel(&init_mm, pmd, from_address);
-               if (!from_pte)
-                       BUG();
-
-               to_pte = pte_alloc_kernel(&init_mm, pmd, to_address);
-               if (!to_pte)
-                       BUG();
-
                cpu_user.cpu_clear_user_page = v6_clear_user_page_aliasing;
                cpu_user.cpu_copy_user_page = v6_copy_user_page_aliasing;
        }
@@ -151,5 +134,4 @@ static int __init v6_userpage_init(void)
        return 0;
 }
 
-__initcall(v6_userpage_init);
-
+core_initcall(v6_userpage_init);
diff --git a/arch/arm/mm/copypage-xscale.S b/arch/arm/mm/copypage-xscale.S
deleted file mode 100644 (file)
index bb27731..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  linux/arch/arm/lib/copypage-xscale.S
- *
- *  Copyright (C) 2001 Russell King
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#include <linux/linkage.h>
-#include <linux/init.h>
-#include <asm/constants.h>
-
-/*
- * General note:
- *  We don't really want write-allocate cache behaviour for these functions
- *  since that will just eat through 8K of the cache.
- */
-
-       .text
-       .align  5
-/*
- * XScale optimised copy_user_page
- *  r0 = destination
- *  r1 = source
- *  r2 = virtual user address of ultimate destination page
- *
- * The source page may have some clean entries in the cache already, but we
- * can safely ignore them - break_cow() will flush them out of the cache
- * if we eventually end up using our copied page.
- *
- * What we could do is use the mini-cache to buffer reads from the source
- * page.  We rely on the mini-cache being smaller than one page, so we'll
- * cycle through the complete cache anyway.
- */
-ENTRY(xscale_mc_copy_user_page)
-       stmfd   sp!, {r4, r5, lr}
-       mov     r5, r0
-       mov     r0, r1
-       bl      map_page_minicache
-       mov     r1, r5
-       mov     lr, #PAGE_SZ/64-1
-
-       /*
-        * Strangely enough, best performance is achieved
-        * when prefetching destination as well.  (NP)
-        */
-       pld     [r0, #0]
-       pld     [r0, #32]
-       pld     [r1, #0]
-       pld     [r1, #32]
-
-1:     pld     [r0, #64]
-       pld     [r0, #96]
-       pld     [r1, #64]
-       pld     [r1, #96]
-
-2:     ldrd    r2, [r0], #8
-       ldrd    r4, [r0], #8
-       mov     ip, r1
-       strd    r2, [r1], #8
-       ldrd    r2, [r0], #8
-       strd    r4, [r1], #8
-       ldrd    r4, [r0], #8
-       strd    r2, [r1], #8
-       strd    r4, [r1], #8
-       mcr     p15, 0, ip, c7, c10, 1          @ clean D line
-       ldrd    r2, [r0], #8
-       mcr     p15, 0, ip, c7, c6, 1           @ invalidate D line
-       ldrd    r4, [r0], #8
-       mov     ip, r1
-       strd    r2, [r1], #8
-       ldrd    r2, [r0], #8
-       strd    r4, [r1], #8
-       ldrd    r4, [r0], #8
-       strd    r2, [r1], #8
-       strd    r4, [r1], #8
-       mcr     p15, 0, ip, c7, c10, 1          @ clean D line
-       subs    lr, lr, #1
-       mcr     p15, 0, ip, c7, c6, 1           @ invalidate D line
-       bgt     1b
-       beq     2b
-
-       ldmfd   sp!, {r4, r5, pc}
-
-       .align  5
-/*
- * XScale optimised clear_user_page
- *  r0 = destination
- *  r1 = virtual user address of ultimate destination page
- */
-ENTRY(xscale_mc_clear_user_page)
-       mov     r1, #PAGE_SZ/32
-       mov     r2, #0
-       mov     r3, #0
-1:     mov     ip, r0
-       strd    r2, [r0], #8
-       strd    r2, [r0], #8
-       strd    r2, [r0], #8
-       strd    r2, [r0], #8
-       mcr     p15, 0, ip, c7, c10, 1          @ clean D line
-       subs    r1, r1, #1
-       mcr     p15, 0, ip, c7, c6, 1           @ invalidate D line
-       bne     1b
-       mov     pc, lr
-
-       __INITDATA
-
-       .type   xscale_mc_user_fns, #object
-ENTRY(xscale_mc_user_fns)
-       .long   xscale_mc_clear_user_page
-       .long   xscale_mc_copy_user_page
-       .size   xscale_mc_user_fns, . - xscale_mc_user_fns
diff --git a/arch/arm/mm/copypage-xscale.c b/arch/arm/mm/copypage-xscale.c
new file mode 100644 (file)
index 0000000..42a6ee2
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ *  linux/arch/arm/lib/copypage-xscale.S
+ *
+ *  Copyright (C) 1995-2005 Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This handles the mini data cache, as found on SA11x0 and XScale
+ * processors.  When we copy a user page page, we map it in such a way
+ * that accesses to this page will not touch the main data cache, but
+ * will be cached in the mini data cache.  This prevents us thrashing
+ * the main data cache on page faults.
+ */
+#include <linux/init.h>
+#include <linux/mm.h>
+
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/tlbflush.h>
+
+/*
+ * 0xffff8000 to 0xffffffff is reserved for any ARM architecture
+ * specific hacks for copying pages efficiently.
+ */
+#define COPYPAGE_MINICACHE     0xffff8000
+
+#define minicache_pgprot __pgprot(L_PTE_PRESENT | L_PTE_YOUNG | \
+                                 L_PTE_CACHEABLE)
+
+#define TOP_PTE(x)     pte_offset_kernel(top_pmd, x)
+
+static DEFINE_SPINLOCK(minicache_lock);
+
+/*
+ * XScale mini-dcache optimised copy_user_page
+ *
+ * We flush the destination cache lines just before we write the data into the
+ * corresponding address.  Since the Dcache is read-allocate, this removes the
+ * Dcache aliasing issue.  The writes will be forwarded to the write buffer,
+ * and merged as appropriate.
+ */
+static void __attribute__((naked))
+mc_copy_user_page(void *from, void *to)
+{
+       /*
+        * Strangely enough, best performance is achieved
+        * when prefetching destination as well.  (NP)
+        */
+       asm volatile(
+       "stmfd  sp!, {r4, r5, lr}               \n\
+       mov     lr, %2                          \n\
+       pld     [r0, #0]                        \n\
+       pld     [r0, #32]                       \n\
+       pld     [r1, #0]                        \n\
+       pld     [r1, #32]                       \n\
+1:     pld     [r0, #64]                       \n\
+       pld     [r0, #96]                       \n\
+       pld     [r1, #64]                       \n\
+       pld     [r1, #96]                       \n\
+2:     ldrd    r2, [r0], #8                    \n\
+       ldrd    r4, [r0], #8                    \n\
+       mov     ip, r1                          \n\
+       strd    r2, [r1], #8                    \n\
+       ldrd    r2, [r0], #8                    \n\
+       strd    r4, [r1], #8                    \n\
+       ldrd    r4, [r0], #8                    \n\
+       strd    r2, [r1], #8                    \n\
+       strd    r4, [r1], #8                    \n\
+       mcr     p15, 0, ip, c7, c10, 1          @ clean D line\n\
+       ldrd    r2, [r0], #8                    \n\
+       mcr     p15, 0, ip, c7, c6, 1           @ invalidate D line\n\
+       ldrd    r4, [r0], #8                    \n\
+       mov     ip, r1                          \n\
+       strd    r2, [r1], #8                    \n\
+       ldrd    r2, [r0], #8                    \n\
+       strd    r4, [r1], #8                    \n\
+       ldrd    r4, [r0], #8                    \n\
+       strd    r2, [r1], #8                    \n\
+       strd    r4, [r1], #8                    \n\
+       mcr     p15, 0, ip, c7, c10, 1          @ clean D line\n\
+       subs    lr, lr, #1                      \n\
+       mcr     p15, 0, ip, c7, c6, 1           @ invalidate D line\n\
+       bgt     1b                              \n\
+       beq     2b                              \n\
+       ldmfd   sp!, {r4, r5, pc}               "
+       :
+       : "r" (from), "r" (to), "I" (PAGE_SIZE / 64 - 1));
+}
+
+void xscale_mc_copy_user_page(void *kto, const void *kfrom, unsigned long vaddr)
+{
+       spin_lock(&minicache_lock);
+
+       set_pte(TOP_PTE(COPYPAGE_MINICACHE), pfn_pte(__pa(kfrom) >> PAGE_SHIFT, minicache_pgprot));
+       flush_tlb_kernel_page(COPYPAGE_MINICACHE);
+
+       mc_copy_user_page((void *)COPYPAGE_MINICACHE, kto);
+
+       spin_unlock(&minicache_lock);
+}
+
+/*
+ * XScale optimised clear_user_page
+ */
+void __attribute__((naked))
+xscale_mc_clear_user_page(void *kaddr, unsigned long vaddr)
+{
+       asm volatile(
+       "mov    r1, %0                          \n\
+       mov     r2, #0                          \n\
+       mov     r3, #0                          \n\
+1:     mov     ip, r0                          \n\
+       strd    r2, [r0], #8                    \n\
+       strd    r2, [r0], #8                    \n\
+       strd    r2, [r0], #8                    \n\
+       strd    r2, [r0], #8                    \n\
+       mcr     p15, 0, ip, c7, c10, 1          @ clean D line\n\
+       subs    r1, r1, #1                      \n\
+       mcr     p15, 0, ip, c7, c6, 1           @ invalidate D line\n\
+       bne     1b                              \n\
+       mov     pc, lr"
+       :
+       : "I" (PAGE_SIZE / 32));
+}
+
+struct cpu_user_fns xscale_mc_user_fns __initdata = {
+       .cpu_clear_user_page    = xscale_mc_clear_user_page, 
+       .cpu_copy_user_page     = xscale_mc_copy_user_page,
+};
index 01967ddeef53df2cb72bda5d600419e63c392f82..be4ab3d73c91965448f064448136f7c078d9fb30 100644 (file)
@@ -77,9 +77,8 @@ no_pmd:
 }
 
 static void
-make_coherent(struct vm_area_struct *vma, unsigned long addr, struct page *page, int dirty)
+make_coherent(struct address_space *mapping, struct vm_area_struct *vma, unsigned long addr, unsigned long pfn)
 {
-       struct address_space *mapping = page_mapping(page);
        struct mm_struct *mm = vma->vm_mm;
        struct vm_area_struct *mpnt;
        struct prio_tree_iter iter;
@@ -87,9 +86,6 @@ make_coherent(struct vm_area_struct *vma, unsigned long addr, struct page *page,
        pgoff_t pgoff;
        int aliases = 0;
 
-       if (!mapping)
-               return;
-
        pgoff = vma->vm_pgoff + ((addr - vma->vm_start) >> PAGE_SHIFT);
 
        /*
@@ -115,9 +111,11 @@ make_coherent(struct vm_area_struct *vma, unsigned long addr, struct page *page,
        if (aliases)
                adjust_pte(vma, addr);
        else
-               flush_cache_page(vma, addr, page_to_pfn(page));
+               flush_cache_page(vma, addr, pfn);
 }
 
+void __flush_dcache_page(struct address_space *mapping, struct page *page);
+
 /*
  * Take care of architecture specific things when placing a new PTE into
  * a page table, or changing an existing PTE.  Basically, there are two
@@ -134,29 +132,22 @@ make_coherent(struct vm_area_struct *vma, unsigned long addr, struct page *page,
 void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr, pte_t pte)
 {
        unsigned long pfn = pte_pfn(pte);
+       struct address_space *mapping;
        struct page *page;
 
        if (!pfn_valid(pfn))
                return;
+
        page = pfn_to_page(pfn);
-       if (page_mapping(page)) {
+       mapping = page_mapping(page);
+       if (mapping) {
                int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags);
 
-               if (dirty) {
-                       /*
-                        * This is our first userspace mapping of this page.
-                        * Ensure that the physical page is coherent with
-                        * the kernel mapping.
-                        *
-                        * FIXME: only need to do this on VIVT and aliasing
-                        *        VIPT cache architectures.  We can do that
-                        *        by choosing whether to set this bit...
-                        */
-                       __cpuc_flush_dcache_page(page_address(page));
-               }
+               if (dirty)
+                       __flush_dcache_page(mapping, page);
 
                if (cache_is_vivt())
-                       make_coherent(vma, addr, page, dirty);
+                       make_coherent(mapping, vma, addr, pfn);
        }
 }
 
index c6de48d895032de8d615ee0f1ae8d8b31e13a716..191788fb18d13a4f3adad73afd92a649c0c7ff21 100644 (file)
 
 #include <asm/cacheflush.h>
 #include <asm/system.h>
+#include <asm/tlbflush.h>
 
-static void __flush_dcache_page(struct address_space *mapping, struct page *page)
+#ifdef CONFIG_CPU_CACHE_VIPT
+#define ALIAS_FLUSH_START      0xffff4000
+
+#define TOP_PTE(x)     pte_offset_kernel(top_pmd, x)
+
+static void flush_pfn_alias(unsigned long pfn, unsigned long vaddr)
 {
-       struct mm_struct *mm = current->active_mm;
-       struct vm_area_struct *mpnt;
-       struct prio_tree_iter iter;
-       pgoff_t pgoff;
+       unsigned long to = ALIAS_FLUSH_START + (CACHE_COLOUR(vaddr) << PAGE_SHIFT);
+
+       set_pte(TOP_PTE(to), pfn_pte(pfn, PAGE_KERNEL));
+       flush_tlb_kernel_page(to);
 
+       asm(    "mcrr   p15, 0, %1, %0, c14\n"
+       "       mcrr    p15, 0, %1, %0, c5\n"
+           :
+           : "r" (to), "r" (to + PAGE_SIZE - L1_CACHE_BYTES)
+           : "cc");
+}
+#else
+#define flush_pfn_alias(pfn,vaddr)     do { } while (0)
+#endif
+
+void __flush_dcache_page(struct address_space *mapping, struct page *page)
+{
        /*
         * Writeback any data associated with the kernel mapping of this
         * page.  This ensures that data in the physical page is mutually
@@ -29,12 +47,21 @@ static void __flush_dcache_page(struct address_space *mapping, struct page *page
        __cpuc_flush_dcache_page(page_address(page));
 
        /*
-        * If there's no mapping pointer here, then this page isn't
-        * visible to userspace yet, so there are no cache lines
-        * associated with any other aliases.
+        * If this is a page cache page, and we have an aliasing VIPT cache,
+        * we only need to do one flush - which would be at the relevant
+        * userspace colour, which is congruent with page->index.
         */
-       if (!mapping)
-               return;
+       if (mapping && cache_is_vipt_aliasing())
+               flush_pfn_alias(page_to_pfn(page),
+                               page->index << PAGE_CACHE_SHIFT);
+}
+
+static void __flush_dcache_aliases(struct address_space *mapping, struct page *page)
+{
+       struct mm_struct *mm = current->active_mm;
+       struct vm_area_struct *mpnt;
+       struct prio_tree_iter iter;
+       pgoff_t pgoff;
 
        /*
         * There are possible user space mappings of this page:
@@ -57,8 +84,6 @@ static void __flush_dcache_page(struct address_space *mapping, struct page *page
                        continue;
                offset = (pgoff - mpnt->vm_pgoff) << PAGE_SHIFT;
                flush_cache_page(mpnt, mpnt->vm_start + offset, page_to_pfn(page));
-               if (cache_is_vipt())
-                       break;
        }
        flush_dcache_mmap_unlock(mapping);
 }
@@ -83,12 +108,12 @@ void flush_dcache_page(struct page *page)
 {
        struct address_space *mapping = page_mapping(page);
 
-       if (cache_is_vipt_nonaliasing())
-               return;
-
        if (mapping && !mapping_mapped(mapping))
                set_bit(PG_dcache_dirty, &page->flags);
-       else
+       else {
                __flush_dcache_page(mapping, page);
+               if (mapping && cache_is_vivt())
+                       __flush_dcache_aliases(mapping, page);
+       }
 }
 EXPORT_SYMBOL(flush_dcache_page);
index 00bb8fd37a59f1bcfdb92c0f60bb314c9b710f8a..7110e54182b1e146ce6d26254965436cb971d6d4 100644 (file)
@@ -170,3 +170,50 @@ void __iounmap(void __iomem *addr)
        vfree((void *) (PAGE_MASK & (unsigned long) addr));
 }
 EXPORT_SYMBOL(__iounmap);
+
+#ifdef __io
+void __iomem *ioport_map(unsigned long port, unsigned int nr)
+{
+       return __io(port);
+}
+EXPORT_SYMBOL(ioport_map);
+
+void ioport_unmap(void __iomem *addr)
+{
+}
+EXPORT_SYMBOL(ioport_unmap);
+#endif
+
+#ifdef CONFIG_PCI
+#include <linux/pci.h>
+#include <linux/ioport.h>
+
+void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
+{
+       unsigned long start = pci_resource_start(dev, bar);
+       unsigned long len   = pci_resource_len(dev, bar);
+       unsigned long flags = pci_resource_flags(dev, bar);
+
+       if (!len || !start)
+               return NULL;
+       if (maxlen && len > maxlen)
+               len = maxlen;
+       if (flags & IORESOURCE_IO)
+               return ioport_map(start, len);
+       if (flags & IORESOURCE_MEM) {
+               if (flags & IORESOURCE_CACHEABLE)
+                       return ioremap(start, len);
+               return ioremap_nocache(start, len);
+       }
+       return NULL;
+}
+EXPORT_SYMBOL(pci_iomap);
+
+void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
+{
+       if ((unsigned long)addr >= VMALLOC_START &&
+           (unsigned long)addr < VMALLOC_END)
+               iounmap(addr);
+}
+EXPORT_SYMBOL(pci_iounmap);
+#endif
diff --git a/arch/arm/mm/minicache.c b/arch/arm/mm/minicache.c
deleted file mode 100644 (file)
index dedf2ab..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  linux/arch/arm/mm/minicache.c
- *
- *  Copyright (C) 2001 Russell King
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This handles the mini data cache, as found on SA11x0 and XScale
- * processors.  When we copy a user page page, we map it in such a way
- * that accesses to this page will not touch the main data cache, but
- * will be cached in the mini data cache.  This prevents us thrashing
- * the main data cache on page faults.
- */
-#include <linux/init.h>
-#include <linux/mm.h>
-
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/tlbflush.h>
-
-/*
- * 0xffff8000 to 0xffffffff is reserved for any ARM architecture
- * specific hacks for copying pages efficiently.
- */
-#define minicache_address (0xffff8000)
-#define minicache_pgprot __pgprot(L_PTE_PRESENT | L_PTE_YOUNG | \
-                                 L_PTE_CACHEABLE)
-
-static pte_t *minicache_pte;
-
-/*
- * Note that this is intended to be called only from the copy_user_page
- * asm code; anything else will require special locking to prevent the
- * mini-cache space being re-used.  (Note: probably preempt unsafe).
- *
- * We rely on the fact that the minicache is 2K, and we'll be pushing
- * 4K of data through it, so we don't actually have to specifically
- * flush the minicache when we change the mapping.
- *
- * Note also: assert(PAGE_OFFSET <= virt < high_memory).
- * Unsafe: preempt, kmap.
- */
-unsigned long map_page_minicache(unsigned long virt)
-{
-       set_pte(minicache_pte, pfn_pte(__pa(virt) >> PAGE_SHIFT, minicache_pgprot));
-       flush_tlb_kernel_page(minicache_address);
-
-       return minicache_address;
-}
-
-static int __init minicache_init(void)
-{
-       pgd_t *pgd;
-       pmd_t *pmd;
-
-       spin_lock(&init_mm.page_table_lock);
-
-       pgd = pgd_offset_k(minicache_address);
-       pmd = pmd_alloc(&init_mm, pgd, minicache_address);
-       if (!pmd)
-               BUG();
-       minicache_pte = pte_alloc_kernel(&init_mm, pmd, minicache_address);
-       if (!minicache_pte)
-               BUG();
-
-       spin_unlock(&init_mm.page_table_lock);
-
-       return 0;
-}
-
-core_initcall(minicache_init);
index 585dfb8e20b96a7526b519d85afe8dc67226c562..2c2b93d77d433248dba64b6a1dd525eae51277fc 100644 (file)
@@ -37,6 +37,8 @@ pgprot_t pgprot_kernel;
 
 EXPORT_SYMBOL(pgprot_kernel);
 
+pmd_t *top_pmd;
+
 struct cachepolicy {
        const char      policy[16];
        unsigned int    cr_mask;
@@ -142,6 +144,16 @@ __setup("noalign", noalign_setup);
 
 #define FIRST_KERNEL_PGD_NR    (FIRST_USER_PGD_NR + USER_PTRS_PER_PGD)
 
+static inline pmd_t *pmd_off(pgd_t *pgd, unsigned long virt)
+{
+       return pmd_offset(pgd, virt);
+}
+
+static inline pmd_t *pmd_off_k(unsigned long virt)
+{
+       return pmd_off(pgd_offset_k(virt), virt);
+}
+
 /*
  * need to get a 16k page for level 1
  */
@@ -220,7 +232,7 @@ void free_pgd_slow(pgd_t *pgd)
                return;
 
        /* pgd is always present and good */
-       pmd = (pmd_t *)pgd;
+       pmd = pmd_off(pgd, 0);
        if (pmd_none(*pmd))
                goto free;
        if (pmd_bad(*pmd)) {
@@ -246,9 +258,8 @@ free:
 static inline void
 alloc_init_section(unsigned long virt, unsigned long phys, int prot)
 {
-       pmd_t *pmdp;
+       pmd_t *pmdp = pmd_off_k(virt);
 
-       pmdp = pmd_offset(pgd_offset_k(virt), virt);
        if (virt & (1 << 20))
                pmdp++;
 
@@ -283,11 +294,9 @@ alloc_init_supersection(unsigned long virt, unsigned long phys, int prot)
 static inline void
 alloc_init_page(unsigned long virt, unsigned long phys, unsigned int prot_l1, pgprot_t prot)
 {
-       pmd_t *pmdp;
+       pmd_t *pmdp = pmd_off_k(virt);
        pte_t *ptep;
 
-       pmdp = pmd_offset(pgd_offset_k(virt), virt);
-
        if (pmd_none(*pmdp)) {
                unsigned long pmdval;
                ptep = alloc_bootmem_low_pages(2 * PTRS_PER_PTE *
@@ -310,7 +319,7 @@ alloc_init_page(unsigned long virt, unsigned long phys, unsigned int prot_l1, pg
  */
 static inline void clear_mapping(unsigned long virt)
 {
-       pmd_clear(pmd_offset(pgd_offset_k(virt), virt));
+       pmd_clear(pmd_off_k(virt));
 }
 
 struct mem_types {
@@ -578,7 +587,7 @@ void setup_mm_for_reboot(char mode)
                         PMD_TYPE_SECT;
                if (cpu_arch <= CPU_ARCH_ARMv5)
                        pmdval |= PMD_BIT4;
-               pmd = pmd_offset(pgd + i, i << PGDIR_SHIFT);
+               pmd = pmd_off(pgd, i << PGDIR_SHIFT);
                pmd[0] = __pmd(pmdval);
                pmd[1] = __pmd(pmdval + (1 << (PGDIR_SHIFT - 1)));
                flush_pmd_entry(pmd);
@@ -675,6 +684,8 @@ void __init memtable_init(struct meminfo *mi)
 
        flush_cache_all();
        flush_tlb_all();
+
+       top_pmd = pmd_off_k(0xffff0000);
 }
 
 /*
index 32c4b0e35b37768f7d75fa01194f1f9c3d0baac8..3de7f84b53c25e3cdd5f8d44da252336fb55645a 100644 (file)
@@ -73,7 +73,12 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
                    (!vma || addr + len <= vma->vm_start))
                        return addr;
        }
-       start_addr = addr = mm->free_area_cache;
+       if (len > mm->cached_hole_size) {
+               start_addr = addr = mm->free_area_cache;
+       } else {
+               start_addr = addr = TASK_UNMAPPED_BASE;
+               mm->cached_hole_size = 0;
+       }
 
 full_search:
        if (do_align)
@@ -90,6 +95,7 @@ full_search:
                         */
                        if (start_addr != TASK_UNMAPPED_BASE) {
                                start_addr = addr = TASK_UNMAPPED_BASE;
+                               mm->cached_hole_size = 0;
                                goto full_search;
                        }
                        return -ENOMEM;
@@ -101,6 +107,8 @@ full_search:
                        mm->free_area_cache = addr + len;
                        return addr;
                }
+               if (addr + mm->cached_hole_size < vma->vm_start)
+                       mm->cached_hole_size = vma->vm_start - addr;
                addr = vma->vm_end;
                if (do_align)
                        addr = COLOUR_ALIGN(addr, pgoff);
index 824c6b571ad933614ab04a41ad4ad3bac446307a..f2278aadac8a28638312039ff3f6cd05cd4db640 100644 (file)
@@ -562,31 +562,31 @@ static void __init ecard_init_resources(struct expansion_card *ec)
        }
 }
 
-static ssize_t ecard_show_irq(struct device *dev, char *buf)
+static ssize_t ecard_show_irq(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        return sprintf(buf, "%u\n", ec->irq);
 }
 
-static ssize_t ecard_show_vendor(struct device *dev, char *buf)
+static ssize_t ecard_show_vendor(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        return sprintf(buf, "%u\n", ec->cid.manufacturer);
 }
 
-static ssize_t ecard_show_device(struct device *dev, char *buf)
+static ssize_t ecard_show_device(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        return sprintf(buf, "%u\n", ec->cid.product);
 }
 
-static ssize_t ecard_show_dma(struct device *dev, char *buf)
+static ssize_t ecard_show_dma(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        return sprintf(buf, "%u\n", ec->dma);
 }
 
-static ssize_t ecard_show_resources(struct device *dev, char *buf)
+static ssize_t ecard_show_resources(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        char *str = buf;
index 41958f57c83864c4a8f62becaac334ea1173833e..79433159b5f05a7bbb3022c5a89b6555247f3090 100644 (file)
@@ -169,7 +169,6 @@ void __init mem_init(void)
                struct page *page = &mem_map[pfn];
 
                ClearPageReserved(page);
-               set_bit(PG_highmem, &page->flags);
                set_page_count(page, 1);
                __free_page(page);
                totalram_pages++;
index 134aec1c6d199d259a5207a2c0ea427bc487843a..b5f83e9f04db63eb1013267b65f94a891432e375 100644 (file)
@@ -54,7 +54,7 @@ asmlinkage void ret_from_fork(void);
 void default_idle(void)
 {
        while(1) {
-               if (need_resched()) {
+               if (!need_resched()) {
                        local_irq_enable();
                        __asm__("sleep");
                        local_irq_disable();
index e382f32d435e71ea6302a167aead210a4fb39491..dfd904f6883b29820a19c5793240ac0e10103755 100644 (file)
@@ -1163,7 +1163,7 @@ config PCI_DIRECT
 
 config PCI_MMCONFIG
        bool
-       depends on PCI && (PCI_GOMMCONFIG || (PCI_GOANY && ACPI))
+       depends on PCI && ACPI && (PCI_GOMMCONFIG || PCI_GOANY)
        select ACPI_BOOT
        default y
 
index aa7064a75ee64d9c7b4feeb13514a224156cf3a3..43cd6220ee4905c2375cfb1cece6767c0d8fa28f 100644 (file)
@@ -48,7 +48,7 @@ cmd_image = $(obj)/tools/build $(BUILDFLAGS) $(obj)/bootsect $(obj)/setup \
 $(obj)/zImage $(obj)/bzImage: $(obj)/bootsect $(obj)/setup \
                              $(obj)/vmlinux.bin $(obj)/tools/build FORCE
        $(call if_changed,image)
-       @echo 'Kernel: $@ is ready'
+       @echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
 
 $(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
        $(call if_changed,objcopy)
index 0fbcfe00dd8d1514b33bd6aeff1b6cc01eebb4ac..51ecd512603da25153cbf194dcda57d724a8edd8 100644 (file)
@@ -43,7 +43,7 @@ obj-$(CONFIG_SCx200)          += scx200.o
 # Note: kbuild does not track this dependency due to usage of .incbin
 $(obj)/vsyscall.o: $(obj)/vsyscall-int80.so $(obj)/vsyscall-sysenter.so
 targets += $(foreach F,int80 sysenter,vsyscall-$F.o vsyscall-$F.so)
-targets += vsyscall.lds
+targets += vsyscall-note.o vsyscall.lds
 
 # The DSO images are built using a special linker script.
 quiet_cmd_syscall = SYSCALL $@
index 45641a87255009968c6882b4d04fcd4dbf52df90..0ff65abcd56c3c1139b4849a80228f555785c655 100644 (file)
@@ -1222,6 +1222,7 @@ static int suspend(int vetoable)
 
        save_processor_state();
        err = set_system_power_state(APM_STATE_SUSPEND);
+       ignore_normal_resume = 1;
        restore_processor_state();
 
        local_irq_disable();
@@ -1229,7 +1230,6 @@ static int suspend(int vetoable)
        spin_lock(&i8253_lock);
        reinit_timer();
        set_time();
-       ignore_normal_resume = 1;
 
        spin_unlock(&i8253_lock);
        write_sequnlock(&xtime_lock);
index 16dbc4151be43b8e671869b2a52220f47ec0b6ac..73aeaf5a9d4e493f7e2be65ac67a285d966e062c 100644 (file)
@@ -24,9 +24,6 @@ __asm__(".align 4\nvide: ret");
 
 static void __init init_amd(struct cpuinfo_x86 *c)
 {
-#ifdef CONFIG_X86_SMP
-       int cpu = c == &boot_cpu_data ? 0 : c - cpu_data;
-#endif
        u32 l, h;
        int mbytes = num_physpages >> (20-PAGE_SHIFT);
        int r;
@@ -198,14 +195,19 @@ static void __init init_amd(struct cpuinfo_x86 *c)
                        c->x86_num_cores = 1;
        }
 
-#ifdef CONFIG_X86_SMP
+#ifdef CONFIG_X86_HT
        /*
         * On a AMD dual core setup the lower bits of the APIC id
         * distingush the cores.  Assumes number of cores is a power
         * of two.
         */
        if (c->x86_num_cores > 1) {
-               cpu_core_id[cpu] = cpu >> hweight32(c->x86_num_cores - 1);
+               int cpu = smp_processor_id();
+               unsigned bits = 0;
+               while ((1 << bits) < c->x86_num_cores)
+                       bits++;
+               cpu_core_id[cpu] = phys_proc_id[cpu] & ((1<<bits)-1);
+               phys_proc_id[cpu] >>= bits;
                printk(KERN_INFO "CPU %d(%d) -> Core %d\n",
                       cpu, c->x86_num_cores, cpu_core_id[cpu]);
        }
index 6be0310e3cd3a15fc70bcf4782228cf73d7e161a..d199e525680aeabb7e6d5fc88ce895a217d92a1e 100644 (file)
@@ -243,6 +243,10 @@ static void __init early_cpu_detect(void)
        }
 
        early_intel_workaround(c);
+
+#ifdef CONFIG_X86_HT
+       phys_proc_id[smp_processor_id()] = (cpuid_ebx(1) >> 24) & 0xff;
+#endif
 }
 
 void __init generic_identify(struct cpuinfo_x86 * c)
index f25ffd74235caa330985b4cbaa6d5ece01b78b67..0f1eb507233b701c6bb7b158104e0e5cfd9e4d85 100644 (file)
@@ -23,7 +23,7 @@ config X86_ACPI_CPUFREQ
          If in doubt, say N.
 
 config ELAN_CPUFREQ
-       tristate "AMD Elan"
+       tristate "AMD Elan SC400 and SC410"
        select CPU_FREQ_TABLE
        depends on X86_ELAN
        ---help---
@@ -38,6 +38,18 @@ config ELAN_CPUFREQ
 
          If in doubt, say N.
 
+config SC520_CPUFREQ
+       tristate "AMD Elan SC520"
+       select CPU_FREQ_TABLE
+       depends on X86_ELAN
+       ---help---
+         This adds the CPUFreq driver for AMD Elan SC520 processor.
+
+         For details, take a look at <file:Documentation/cpu-freq/>.
+
+         If in doubt, say N.
+
+
 config X86_POWERNOW_K6
        tristate "AMD Mobile K6-2/K6-3 PowerNow!"
        select CPU_FREQ_TABLE
index a922e97aeedd5ee7283441a72e613504ef566086..2e894f1c89103f69f51e9c7da8748060d3019790 100644 (file)
@@ -3,6 +3,7 @@ obj-$(CONFIG_X86_POWERNOW_K7)           += powernow-k7.o
 obj-$(CONFIG_X86_POWERNOW_K8)          += powernow-k8.o
 obj-$(CONFIG_X86_LONGHAUL)             += longhaul.o
 obj-$(CONFIG_ELAN_CPUFREQ)             += elanfreq.o
+obj-$(CONFIG_SC520_CPUFREQ)            += sc520_freq.o
 obj-$(CONFIG_X86_LONGRUN)              += longrun.o  
 obj-$(CONFIG_X86_GX_SUSPMOD)           += gx-suspmod.o
 obj-$(CONFIG_X86_SPEEDSTEP_ICH)                += speedstep-ich.o
index ab0f9f5aac1168075b02b36cf2fdeda1dc23cf2f..04e3563da4fea19e2a7f0c2c0e0053855cda67f1 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/cpufreq.h>
 #include <linux/slab.h>
 #include <linux/string.h>
+#include <linux/pci.h>
 
 #include <asm/msr.h>
 #include <asm/timex.h>
@@ -119,7 +120,13 @@ static int longhaul_get_cpu_mult(void)
 static void do_powersaver(union msr_longhaul *longhaul,
                        unsigned int clock_ratio_index)
 {
+       struct pci_dev *dev;
+       unsigned long flags;
+       unsigned int tmp_mask;
        int version;
+       int i;
+       u16 pci_cmd;
+       u16 cmd_state[64];
 
        switch (cpu_model) {
        case CPU_EZRA_T:
@@ -137,17 +144,58 @@ static void do_powersaver(union msr_longhaul *longhaul,
        longhaul->bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4;
        longhaul->bits.EnableSoftBusRatio = 1;
        longhaul->bits.RevisionKey = 0;
-       local_irq_disable();
-       wrmsrl(MSR_VIA_LONGHAUL, longhaul->val);
+
+       preempt_disable();
+       local_irq_save(flags);
+
+       /*
+        * get current pci bus master state for all devices
+        * and clear bus master bit
+        */
+       dev = NULL;
+       i = 0;
+       do {
+               dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev);
+               if (dev != NULL) {
+                       pci_read_config_word(dev, PCI_COMMAND, &pci_cmd);
+                       cmd_state[i++] = pci_cmd;
+                       pci_cmd &= ~PCI_COMMAND_MASTER;
+                       pci_write_config_word(dev, PCI_COMMAND, pci_cmd);
+               }
+       } while (dev != NULL);
+
+       tmp_mask=inb(0x21);     /* works on C3. save mask. */
+       outb(0xFE,0x21);        /* TMR0 only */
+       outb(0xFF,0x80);        /* delay */
+
        local_irq_enable();
+
+       __hlt();
+       wrmsrl(MSR_VIA_LONGHAUL, longhaul->val);
        __hlt();
 
+       local_irq_disable();
+
+       outb(tmp_mask,0x21);    /* restore mask */
+
+       /* restore pci bus master state for all devices */
+       dev = NULL;
+       i = 0;
+       do {
+               dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev);
+               if (dev != NULL) {
+                       pci_cmd = cmd_state[i++];
+                       pci_write_config_byte(dev, PCI_COMMAND, pci_cmd);
+               }
+       } while (dev != NULL);
+       local_irq_restore(flags);
+       preempt_enable();
+
+       /* disable bus ratio bit */
        rdmsrl(MSR_VIA_LONGHAUL, longhaul->val);
        longhaul->bits.EnableSoftBusRatio = 0;
        longhaul->bits.RevisionKey = version;
-       local_irq_disable();
        wrmsrl(MSR_VIA_LONGHAUL, longhaul->val);
-       local_irq_enable();
 }
 
 /**
@@ -578,7 +626,7 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
                longhaul_setup_voltagescaling();
 
        policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
-       policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
+       policy->cpuinfo.transition_latency = 200000;    /* nsec */
        policy->cur = calc_speed(longhaul_get_cpu_mult());
 
        ret = cpufreq_frequency_table_cpuinfo(policy, longhaul_table);
index 913f652623d91f780d0c4a5492f57c6e3afebaee..5c530064eb74bf963a8f43ea4265b96d6042ac65 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/dmi.h>
 
 #include <asm/msr.h>
+#include <asm/timer.h>
 #include <asm/timex.h>
 #include <asm/io.h>
 #include <asm/system.h>
@@ -586,13 +587,17 @@ static int __init powernow_cpu_init (struct cpufreq_policy *policy)
 
        rdmsrl (MSR_K7_FID_VID_STATUS, fidvidstatus.val);
 
-       /* A K7 with powernow technology is set to max frequency by BIOS */
-       fsb = (10 * cpu_khz) / fid_codes[fidvidstatus.bits.MFID];
+       /* recalibrate cpu_khz */
+       result = recalibrate_cpu_khz();
+       if (result)
+               return result;
+
+       fsb = (10 * cpu_khz) / fid_codes[fidvidstatus.bits.CFID];
        if (!fsb) {
                printk(KERN_WARNING PFX "can not determine bus frequency\n");
                return -EINVAL;
        }
-       dprintk("FSB: %3d.%03d MHz\n", fsb/1000, fsb%1000);
+       dprintk("FSB: %3dMHz\n", fsb/1000);
 
        if (dmi_check_system(powernow_dmi_table) || acpi_force) {
                printk (KERN_INFO PFX "PSB/PST known to be broken.  Trying ACPI instead\n");
index a65ff7e32e5d09417279a06de1db0f003c77671a..10cc096c0adead9961f48bd79a865f317ce8f27a 100644 (file)
@@ -4,7 +4,7 @@
  *  GNU general public license version 2. See "COPYING" or
  *  http://www.gnu.org/licenses/gpl.html
  *
- *  Support : paul.devriendt@amd.com
+ *  Support : mark.langsdorf@amd.com
  *
  *  Based on the powernow-k7.c module written by Dave Jones.
  *  (C) 2003 Dave Jones <davej@codemonkey.org.uk> on behalf of SuSE Labs
  *
  *  Valuable input gratefully received from Dave Jones, Pavel Machek,
  *  Dominik Brodowski, and others.
+ *  Originally developed by Paul Devriendt.
  *  Processor information obtained from Chapter 9 (Power and Thermal Management)
  *  of the "BIOS and Kernel Developer's Guide for the AMD Athlon 64 and AMD
  *  Opteron Processors" available for download from www.amd.com
  *
  *  Tables for specific CPUs can be infrerred from
- *     http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/30430.pdf
+ *     http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/30430.pdf
  */
 
 #include <linux/kernel.h>
@@ -30,6 +31,7 @@
 #include <linux/cpufreq.h>
 #include <linux/slab.h>
 #include <linux/string.h>
+#include <linux/cpumask.h>
 
 #include <asm/msr.h>
 #include <asm/io.h>
@@ -42,7 +44,7 @@
 
 #define PFX "powernow-k8: "
 #define BFX PFX "BIOS error: "
-#define VERSION "version 1.00.09e"
+#define VERSION "version 1.40.2"
 #include "powernow-k8.h"
 
 /* serialize freq changes  */
@@ -50,6 +52,10 @@ static DECLARE_MUTEX(fidvid_sem);
 
 static struct powernow_k8_data *powernow_data[NR_CPUS];
 
+#ifndef CONFIG_SMP
+static cpumask_t cpu_core_map[1];
+#endif
+
 /* Return a frequency in MHz, given an input fid */
 static u32 find_freq_from_fid(u32 fid)
 {
@@ -274,11 +280,18 @@ static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid
 {
        u32 rvosteps = data->rvo;
        u32 savefid = data->currfid;
+       u32 maxvid, lo;
 
        dprintk("ph1 (cpu%d): start, currfid 0x%x, currvid 0x%x, reqvid 0x%x, rvo 0x%x\n",
                smp_processor_id(),
                data->currfid, data->currvid, reqvid, data->rvo);
 
+       rdmsr(MSR_FIDVID_STATUS, lo, maxvid);
+       maxvid = 0x1f & (maxvid >> 16);
+       dprintk("ph1 maxvid=0x%x\n", maxvid);
+       if (reqvid < maxvid) /* lower numbers are higher voltages */
+               reqvid = maxvid;
+
        while (data->currvid > reqvid) {
                dprintk("ph1: curr 0x%x, req vid 0x%x\n",
                        data->currvid, reqvid);
@@ -286,8 +299,8 @@ static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid
                        return 1;
        }
 
-       while ((rvosteps > 0)  && ((data->rvo + data->currvid) > reqvid)) {
-               if (data->currvid == 0) {
+       while ((rvosteps > 0) && ((data->rvo + data->currvid) > reqvid)) {
+               if (data->currvid == maxvid) {
                        rvosteps = 0;
                } else {
                        dprintk("ph1: changing vid for rvo, req 0x%x\n",
@@ -671,7 +684,7 @@ static int find_psb_table(struct powernow_k8_data *data)
         * BIOS and Kernel Developer's Guide, which is available on
         * www.amd.com
         */
-       printk(KERN_ERR PFX "BIOS error - no PSB\n");
+       printk(KERN_INFO PFX "BIOS error - no PSB or ACPI _PSS objects\n");
        return -ENODEV;
 }
 
@@ -695,7 +708,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
        struct cpufreq_frequency_table *powernow_table;
 
        if (acpi_processor_register_performance(&data->acpi_data, data->cpu)) {
-               dprintk("register performance failed\n");
+               dprintk("register performance failed: bad ACPI data\n");
                return -EIO;
        }
 
@@ -746,22 +759,23 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
                        continue;
                }
 
-               if (fid < HI_FID_TABLE_BOTTOM) {
-                       if (cntlofreq) {
-                               /* if both entries are the same, ignore this
-                                * one... 
-                                */
-                               if ((powernow_table[i].frequency != powernow_table[cntlofreq].frequency) ||
-                                   (powernow_table[i].index != powernow_table[cntlofreq].index)) {
-                                       printk(KERN_ERR PFX "Too many lo freq table entries\n");
-                                       goto err_out_mem;
-                               }
-                               
-                               dprintk("double low frequency table entry, ignoring it.\n");
-                               powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
-                               continue;
-                       } else
-                               cntlofreq = i;
+               /* verify only 1 entry from the lo frequency table */
+               if (fid < HI_FID_TABLE_BOTTOM) {
+                       if (cntlofreq) {
+                               /* if both entries are the same, ignore this
+                                * one... 
+                                */
+                               if ((powernow_table[i].frequency != powernow_table[cntlofreq].frequency) ||
+                                   (powernow_table[i].index != powernow_table[cntlofreq].index)) {
+                                       printk(KERN_ERR PFX "Too many lo freq table entries\n");
+                                       goto err_out_mem;
+                               }
+
+                               dprintk("double low frequency table entry, ignoring it.\n");
+                               powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
+                               continue;
+                       } else
+                               cntlofreq = i;
                }
 
                if (powernow_table[i].frequency != (data->acpi_data.states[i].core_frequency * 1000)) {
@@ -816,7 +830,7 @@ static int transition_frequency(struct powernow_k8_data *data, unsigned int inde
 {
        u32 fid;
        u32 vid;
-       int res;
+       int res, i;
        struct cpufreq_freqs freqs;
 
        dprintk("cpu %d transition to index %u\n", smp_processor_id(), index);
@@ -841,7 +855,8 @@ static int transition_frequency(struct powernow_k8_data *data, unsigned int inde
        }
 
        if ((fid < HI_FID_TABLE_BOTTOM) && (data->currfid < HI_FID_TABLE_BOTTOM)) {
-               printk("ignoring illegal change in lo freq table-%x to 0x%x\n",
+               printk(KERN_ERR PFX
+                      "ignoring illegal change in lo freq table-%x to 0x%x\n",
                       data->currfid, fid);
                return 1;
        }
@@ -850,18 +865,20 @@ static int transition_frequency(struct powernow_k8_data *data, unsigned int inde
                smp_processor_id(), fid, vid);
 
        freqs.cpu = data->cpu;
-
        freqs.old = find_khz_freq_from_fid(data->currfid);
        freqs.new = find_khz_freq_from_fid(fid);
-       cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
+       for_each_cpu_mask(i, cpu_core_map[data->cpu]) {
+               freqs.cpu = i;
+               cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
+       }
 
-       down(&fidvid_sem);
        res = transition_fid_vid(data, fid, vid);
-       up(&fidvid_sem);
 
        freqs.new = find_khz_freq_from_fid(data->currfid);
-       cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
-
+       for_each_cpu_mask(i, cpu_core_map[data->cpu]) {
+               freqs.cpu = i;
+               cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
+        }
        return res;
 }
 
@@ -874,6 +891,7 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
        u32 checkvid = data->currvid;
        unsigned int newstate;
        int ret = -EIO;
+       int i;
 
        /* only run on specific CPU from here on */
        oldmask = current->cpus_allowed;
@@ -902,22 +920,41 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
                data->currfid, data->currvid);
 
        if ((checkvid != data->currvid) || (checkfid != data->currfid)) {
-               printk(KERN_ERR PFX
-                      "error - out of sync, fid 0x%x 0x%x, vid 0x%x 0x%x\n",
-                      checkfid, data->currfid, checkvid, data->currvid);
+               printk(KERN_INFO PFX
+                       "error - out of sync, fix 0x%x 0x%x, vid 0x%x 0x%x\n",
+                       checkfid, data->currfid, checkvid, data->currvid);
        }
 
        if (cpufreq_frequency_table_target(pol, data->powernow_table, targfreq, relation, &newstate))
                goto err_out;
 
+       down(&fidvid_sem);
+
+       for_each_cpu_mask(i, cpu_core_map[pol->cpu]) {
+               /* make sure the sibling is initialized */
+               if (!powernow_data[i]) {
+                        ret = 0;
+                        up(&fidvid_sem);
+                        goto err_out;
+                }
+       }
+
        powernow_k8_acpi_pst_values(data, newstate);
 
        if (transition_frequency(data, newstate)) {
                printk(KERN_ERR PFX "transition frequency failed\n");
                ret = 1;
+               up(&fidvid_sem);
                goto err_out;
        }
 
+       /* Update all the fid/vids of our siblings */
+       for_each_cpu_mask(i, cpu_core_map[pol->cpu]) {
+               powernow_data[i]->currvid = data->currvid;
+               powernow_data[i]->currfid = data->currfid;
+       }       
+       up(&fidvid_sem);
+
        pol->cur = find_khz_freq_from_fid(data->currfid);
        ret = 0;
 
@@ -962,7 +999,7 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
                 */
 
                if ((num_online_cpus() != 1) || (num_possible_cpus() != 1)) {
-                       printk(KERN_INFO PFX "MP systems not supported by PSB BIOS structure\n");
+                       printk(KERN_ERR PFX "MP systems not supported by PSB BIOS structure\n");
                        kfree(data);
                        return -ENODEV;
                }
@@ -1003,6 +1040,7 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
        schedule();
 
        pol->governor = CPUFREQ_DEFAULT_GOVERNOR;
+       pol->cpus = cpu_core_map[pol->cpu];
 
        /* Take a crude guess here. 
         * That guess was in microseconds, so multiply with 1000 */
@@ -1069,7 +1107,7 @@ static unsigned int powernowk8_get (unsigned int cpu)
                return 0;
        }
        preempt_disable();
-
+       
        if (query_current_values_with_pending_wait(data))
                goto out;
 
@@ -1127,9 +1165,10 @@ static void __exit powernowk8_exit(void)
        cpufreq_unregister_driver(&cpufreq_amd64_driver);
 }
 
-MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com>");
+MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com> and Mark Langsdorf <mark.langsdorf@amd.com.");
 MODULE_DESCRIPTION("AMD Athlon 64 and Opteron processor frequency driver.");
 MODULE_LICENSE("GPL");
 
 late_initcall(powernowk8_init);
 module_exit(powernowk8_exit);
+
index 63ebc8470f5249e29b64731851a0fcf932e13629..9ed5bf221cb7971fc365de5cde7c50d53024f08d 100644 (file)
@@ -174,3 +174,18 @@ static int core_voltage_post_transition(struct powernow_k8_data *data, u32 reqvi
 static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid);
 
 static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index);
+
+#ifndef for_each_cpu_mask
+#define for_each_cpu_mask(i,mask) for (i=0;i<1;i++)
+#endif
+                                                                                
+#ifdef CONFIG_SMP
+static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[])
+{
+}
+#else
+static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[])
+{
+       cpu_set(0, cpu_sharedcore_mask[0]);
+}
+#endif
diff --git a/arch/i386/kernel/cpu/cpufreq/sc520_freq.c b/arch/i386/kernel/cpu/cpufreq/sc520_freq.c
new file mode 100644 (file)
index 0000000..ef457d5
--- /dev/null
@@ -0,0 +1,186 @@
+/*
+ *     sc520_freq.c: cpufreq driver for the AMD Elan sc520
+ *
+ *     Copyright (C) 2005 Sean Young <sean@mess.org>
+ *
+ *     This program is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License
+ *     as published by the Free Software Foundation; either version
+ *     2 of the License, or (at your option) any later version.
+ *
+ *     Based on elanfreq.c
+ *
+ *     2005-03-30: - initial revision
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+
+#include <linux/delay.h>
+#include <linux/cpufreq.h>
+
+#include <asm/msr.h>
+#include <asm/timex.h>
+#include <asm/io.h>
+
+#define MMCR_BASE      0xfffef000      /* The default base address */
+#define OFFS_CPUCTL    0x2   /* CPU Control Register */
+
+static __u8 __iomem *cpuctl;
+
+#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "sc520_freq", msg)
+
+static struct cpufreq_frequency_table sc520_freq_table[] = {
+       {0x01,  100000},
+       {0x02,  133000},
+       {0,     CPUFREQ_TABLE_END},
+};
+
+static unsigned int sc520_freq_get_cpu_frequency(unsigned int cpu)
+{
+       u8 clockspeed_reg = *cpuctl;
+
+       switch (clockspeed_reg & 0x03) {
+       default:
+               printk(KERN_ERR "sc520_freq: error: cpuctl register has unexpected value %02x\n", clockspeed_reg);
+       case 0x01:
+               return 100000;
+       case 0x02:
+               return 133000;
+       }
+}
+
+static void sc520_freq_set_cpu_state (unsigned int state)
+{
+
+       struct cpufreq_freqs    freqs;
+       u8 clockspeed_reg;
+
+       freqs.old = sc520_freq_get_cpu_frequency(0);
+       freqs.new = sc520_freq_table[state].frequency;
+       freqs.cpu = 0; /* AMD Elan is UP */
+
+       cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
+
+       dprintk("attempting to set frequency to %i kHz\n",
+                       sc520_freq_table[state].frequency);
+
+       local_irq_disable();
+
+       clockspeed_reg = *cpuctl & ~0x03;
+       *cpuctl = clockspeed_reg | sc520_freq_table[state].index;
+
+       local_irq_enable();
+
+       cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
+};
+
+static int sc520_freq_verify (struct cpufreq_policy *policy)
+{
+       return cpufreq_frequency_table_verify(policy, &sc520_freq_table[0]);
+}
+
+static int sc520_freq_target (struct cpufreq_policy *policy,
+                           unsigned int target_freq,
+                           unsigned int relation)
+{
+       unsigned int newstate = 0;
+
+       if (cpufreq_frequency_table_target(policy, sc520_freq_table, target_freq, relation, &newstate))
+               return -EINVAL;
+
+       sc520_freq_set_cpu_state(newstate);
+
+       return 0;
+}
+
+
+/*
+ *     Module init and exit code
+ */
+
+static int sc520_freq_cpu_init(struct cpufreq_policy *policy)
+{
+       struct cpuinfo_x86 *c = cpu_data;
+       int result;
+
+       /* capability check */
+       if (c->x86_vendor != X86_VENDOR_AMD ||
+           c->x86 != 4 || c->x86_model != 9)
+               return -ENODEV;
+
+       /* cpuinfo and default policy values */
+       policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
+       policy->cpuinfo.transition_latency = 1000000; /* 1ms */
+       policy->cur = sc520_freq_get_cpu_frequency(0);
+
+       result = cpufreq_frequency_table_cpuinfo(policy, sc520_freq_table);
+       if (result)
+               return (result);
+
+       cpufreq_frequency_table_get_attr(sc520_freq_table, policy->cpu);
+
+       return 0;
+}
+
+
+static int sc520_freq_cpu_exit(struct cpufreq_policy *policy)
+{
+       cpufreq_frequency_table_put_attr(policy->cpu);
+       return 0;
+}
+
+
+static struct freq_attr* sc520_freq_attr[] = {
+       &cpufreq_freq_attr_scaling_available_freqs,
+       NULL,
+};
+
+
+static struct cpufreq_driver sc520_freq_driver = {
+       .get    = sc520_freq_get_cpu_frequency,
+       .verify = sc520_freq_verify,
+       .target = sc520_freq_target,
+       .init   = sc520_freq_cpu_init,
+       .exit   = sc520_freq_cpu_exit,
+       .name   = "sc520_freq",
+       .owner  = THIS_MODULE,
+       .attr   = sc520_freq_attr,
+};
+
+
+static int __init sc520_freq_init(void)
+{
+       struct cpuinfo_x86 *c = cpu_data;
+
+       /* Test if we have the right hardware */
+       if(c->x86_vendor != X86_VENDOR_AMD ||
+                               c->x86 != 4 || c->x86_model != 9) {
+               dprintk("no Elan SC520 processor found!\n");
+               return -ENODEV;
+       }
+       cpuctl = ioremap((unsigned long)(MMCR_BASE + OFFS_CPUCTL), 1);
+       if(!cpuctl) {
+               printk(KERN_ERR "sc520_freq: error: failed to remap memory\n");
+               return -ENOMEM;
+       }
+
+       return cpufreq_register_driver(&sc520_freq_driver);
+}
+
+
+static void __exit sc520_freq_exit(void)
+{
+       cpufreq_unregister_driver(&sc520_freq_driver);
+       iounmap(cpuctl);
+}
+
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Sean Young <sean@mess.org>");
+MODULE_DESCRIPTION("cpufreq driver for AMD's Elan sc520 CPU");
+
+module_init(sc520_freq_init);
+module_exit(sc520_freq_exit);
+
index 07d5612dc00f4f534e8926f669ca45bae2995609..7dcbf70fc16f52afaaf355aa1f4f1c7aae0ca1d5 100644 (file)
@@ -54,6 +54,8 @@ enum {
        CPU_DOTHAN_A1,
        CPU_DOTHAN_A2,
        CPU_DOTHAN_B0,
+       CPU_MP4HT_D0,
+       CPU_MP4HT_E0,
 };
 
 static const struct cpu_id cpu_ids[] = {
@@ -61,6 +63,8 @@ static const struct cpu_id cpu_ids[] = {
        [CPU_DOTHAN_A1] = { 6, 13, 1 },
        [CPU_DOTHAN_A2] = { 6, 13, 2 },
        [CPU_DOTHAN_B0] = { 6, 13, 6 },
+       [CPU_MP4HT_D0]  = {15,  3, 4 },
+       [CPU_MP4HT_E0]  = {15,  4, 1 },
 };
 #define N_IDS  (sizeof(cpu_ids)/sizeof(cpu_ids[0]))
 
@@ -226,6 +230,8 @@ static struct cpu_model models[] =
        { &cpu_ids[CPU_DOTHAN_A1], NULL, 0, NULL },
        { &cpu_ids[CPU_DOTHAN_A2], NULL, 0, NULL },
        { &cpu_ids[CPU_DOTHAN_B0], NULL, 0, NULL },
+       { &cpu_ids[CPU_MP4HT_D0], NULL, 0, NULL },
+       { &cpu_ids[CPU_MP4HT_E0], NULL, 0, NULL },
 
        { NULL, }
 };
index 8ba430a9c3a21a0db5d6522128d5e5e6b2406c0c..d368b3f5fce85397e9e139eb4f5b0314ac15c178 100644 (file)
@@ -336,7 +336,7 @@ unsigned int speedstep_get_freqs(unsigned int processor,
        if (!prev_speed)
                return -EIO;
 
-       dprintk("previous seped is %u\n", prev_speed);
+       dprintk("previous speed is %u\n", prev_speed);
        
        local_irq_save(flags);
 
@@ -348,7 +348,7 @@ unsigned int speedstep_get_freqs(unsigned int processor,
                goto out;
        }
 
-       dprintk("low seped is %u\n", *low_speed);
+       dprintk("low speed is %u\n", *low_speed);
 
        /* switch to high state */
        set_state(SPEEDSTEP_HIGH);
@@ -358,7 +358,7 @@ unsigned int speedstep_get_freqs(unsigned int processor,
                goto out;
        }
 
-       dprintk("high seped is %u\n", *high_speed);
+       dprintk("high speed is %u\n", *high_speed);
 
        if (*low_speed == *high_speed) {
                ret = -ENODEV;
index 79440b3f087ec9beeca123de97b9da6b572bd171..b25fb6b635ae85e8595454e7c304a864d10c353c 100644 (file)
@@ -357,6 +357,9 @@ static int __init speedstep_init(void)
        case SPEEDSTEP_PROCESSOR_PIII_C:
        case SPEEDSTEP_PROCESSOR_PIII_C_EARLY:
                break;
+       case SPEEDSTEP_PROCESSOR_P4M:
+               printk(KERN_INFO "speedstep-smi: you're trying to use this cpufreq driver on a Pentium 4-based CPU. Most likely it will not work.\n");
+               break;
        default:
                speedstep_processor = 0;
        }
index aeb5b4ef8c8b52e095159551bcaaaded2442aaee..a710dc4eb20e33354cc446f6a74549f0e6a6e895 100644 (file)
@@ -118,7 +118,7 @@ struct _cpuid4_info {
 };
 
 #define MAX_CACHE_LEAVES               4
-static unsigned short __devinitdata    num_cache_leaves;
+static unsigned short                  num_cache_leaves;
 
 static int __devinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf)
 {
index 2e2756345bb23964f763ff747e284c7e89050678..4647db4ad6de9a8bd7bc9ab9bb32a4f3d594dd5c 100644 (file)
@@ -45,7 +45,7 @@
 #include <asm/uaccess.h>
 #include <asm/system.h>
 
-static struct class_simple *cpuid_class;
+static struct class *cpuid_class;
 
 #ifdef CONFIG_SMP
 
@@ -158,12 +158,12 @@ static struct file_operations cpuid_fops = {
        .open = cpuid_open,
 };
 
-static int cpuid_class_simple_device_add(int i) 
+static int cpuid_class_device_create(int i)
 {
        int err = 0;
        struct class_device *class_err;
 
-       class_err = class_simple_device_add(cpuid_class, MKDEV(CPUID_MAJOR, i), NULL, "cpu%d",i);
+       class_err = class_device_create(cpuid_class, MKDEV(CPUID_MAJOR, i), NULL, "cpu%d",i);
        if (IS_ERR(class_err))
                err = PTR_ERR(class_err);
        return err;
@@ -175,10 +175,10 @@ static int __devinit cpuid_class_cpu_callback(struct notifier_block *nfb, unsign
 
        switch (action) {
        case CPU_ONLINE:
-               cpuid_class_simple_device_add(cpu);
+               cpuid_class_device_create(cpu);
                break;
        case CPU_DEAD:
-               class_simple_device_remove(MKDEV(CPUID_MAJOR, cpu));
+               class_device_destroy(cpuid_class, MKDEV(CPUID_MAJOR, cpu));
                break;
        }
        return NOTIFY_OK;
@@ -200,13 +200,13 @@ static int __init cpuid_init(void)
                err = -EBUSY;
                goto out;
        }
-       cpuid_class = class_simple_create(THIS_MODULE, "cpuid");
+       cpuid_class = class_create(THIS_MODULE, "cpuid");
        if (IS_ERR(cpuid_class)) {
                err = PTR_ERR(cpuid_class);
                goto out_chrdev;
        }
        for_each_online_cpu(i) {
-               err = cpuid_class_simple_device_add(i);
+               err = cpuid_class_device_create(i);
                if (err != 0) 
                        goto out_class;
        }
@@ -218,9 +218,9 @@ static int __init cpuid_init(void)
 out_class:
        i = 0;
        for_each_online_cpu(i) {
-               class_simple_device_remove(MKDEV(CPUID_MAJOR, i));
+               class_device_destroy(cpuid_class, MKDEV(CPUID_MAJOR, i));
        }
-       class_simple_destroy(cpuid_class);
+       class_destroy(cpuid_class);
 out_chrdev:
        unregister_chrdev(CPUID_MAJOR, "cpu/cpuid");    
 out:
@@ -232,8 +232,8 @@ static void __exit cpuid_exit(void)
        int cpu = 0;
 
        for_each_online_cpu(cpu)
-               class_simple_device_remove(MKDEV(CPUID_MAJOR, cpu));
-       class_simple_destroy(cpuid_class);
+               class_device_destroy(cpuid_class, MKDEV(CPUID_MAJOR, cpu));
+       class_destroy(cpuid_class);
        unregister_chrdev(CPUID_MAJOR, "cpu/cpuid");
        unregister_cpu_notifier(&cpuid_class_cpu_notifier);
 }
index 05d9f8f363a695dc330f69d5550de0f43e774fff..b2f03c39a6fed5eebcd381776ae0948e3f280d4a 100644 (file)
@@ -44,7 +44,7 @@
 #include <asm/uaccess.h>
 #include <asm/system.h>
 
-static struct class_simple *msr_class;
+static struct class *msr_class;
 
 /* Note: "err" is handled in a funny way below.  Otherwise one version
    of gcc or another breaks. */
@@ -260,12 +260,12 @@ static struct file_operations msr_fops = {
        .open = msr_open,
 };
 
-static int msr_class_simple_device_add(int i)
+static int msr_class_device_create(int i)
 {
        int err = 0;
        struct class_device *class_err;
 
-       class_err = class_simple_device_add(msr_class, MKDEV(MSR_MAJOR, i), NULL, "msr%d",i);
+       class_err = class_device_create(msr_class, MKDEV(MSR_MAJOR, i), NULL, "msr%d",i);
        if (IS_ERR(class_err)) 
                err = PTR_ERR(class_err);
        return err;
@@ -277,10 +277,10 @@ static int __devinit msr_class_cpu_callback(struct notifier_block *nfb, unsigned
 
        switch (action) {
        case CPU_ONLINE:
-               msr_class_simple_device_add(cpu);
+               msr_class_device_create(cpu);
                break;
        case CPU_DEAD:
-               class_simple_device_remove(MKDEV(MSR_MAJOR, cpu));      
+               class_device_destroy(msr_class, MKDEV(MSR_MAJOR, cpu));
                break;
        }
        return NOTIFY_OK;
@@ -302,13 +302,13 @@ static int __init msr_init(void)
                err = -EBUSY;
                goto out;
        }
-       msr_class = class_simple_create(THIS_MODULE, "msr");
+       msr_class = class_create(THIS_MODULE, "msr");
        if (IS_ERR(msr_class)) {
                err = PTR_ERR(msr_class);
                goto out_chrdev;
        }
        for_each_online_cpu(i) {
-               err = msr_class_simple_device_add(i);
+               err = msr_class_device_create(i);
                if (err != 0)
                        goto out_class;
        }
@@ -320,8 +320,8 @@ static int __init msr_init(void)
 out_class:
        i = 0;
        for_each_online_cpu(i)
-               class_simple_device_remove(MKDEV(MSR_MAJOR, i));
-       class_simple_destroy(msr_class);
+               class_device_destroy(msr_class, MKDEV(MSR_MAJOR, i));
+       class_destroy(msr_class);
 out_chrdev:
        unregister_chrdev(MSR_MAJOR, "cpu/msr");
 out:
@@ -332,8 +332,8 @@ static void __exit msr_exit(void)
 {
        int cpu = 0;
        for_each_online_cpu(cpu)
-               class_simple_device_remove(MKDEV(MSR_MAJOR, cpu));
-       class_simple_destroy(msr_class);
+               class_device_destroy(msr_class, MKDEV(MSR_MAJOR, cpu));
+       class_destroy(msr_class);
        unregister_chrdev(MSR_MAJOR, "cpu/msr");
        unregister_cpu_notifier(&msr_class_cpu_notifier);
 }
index 945ec73163c8c7ed1ff3297fe4530d4316293e6e..2bfbddebdbf80b65642f47663dba8f5042876a05 100644 (file)
@@ -1502,11 +1502,13 @@ void __init setup_arch(char **cmdline_p)
        if (efi_enabled)
                efi_map_memmap();
 
+#ifdef CONFIG_ACPI_BOOT
        /*
         * Parse the ACPI tables for possible boot-time SMP configuration.
         */
        acpi_boot_table_init();
        acpi_boot_init();
+#endif
 
 #ifdef CONFIG_X86_LOCAL_APIC
        if (smp_found_config)
index cbea7ac582e57a09fe919e4cc444c53a6a525ba4..bc1bb6919e6ae68e56d0f2dea2b963cd7f99410d 100644 (file)
@@ -888,6 +888,7 @@ void *xquad_portio;
 
 cpumask_t cpu_sibling_map[NR_CPUS] __cacheline_aligned;
 cpumask_t cpu_core_map[NR_CPUS] __cacheline_aligned;
+EXPORT_SYMBOL(cpu_core_map);
 
 static void __init smp_boot_cpus(unsigned int max_cpus)
 {
@@ -1073,8 +1074,10 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
                        cpu_set(cpu, cpu_sibling_map[cpu]);
                }
 
-               if (siblings != smp_num_siblings)
+               if (siblings != smp_num_siblings) {
                        printk(KERN_WARNING "WARNING: %d siblings found for CPU%d, should be %d\n", siblings, cpu, smp_num_siblings);
+                       smp_num_siblings = siblings;
+               }
 
                if (c->x86_num_cores > 1) {
                        for (i = 0; i < NR_CPUS; i++) {
index 6cd1ed311f02b87aeccce917954624f7e28dd675..d408afaf6495918b3591bbcda5dbcd5a95a34a36 100644 (file)
@@ -251,7 +251,7 @@ ENTRY(sys_call_table)
        .long sys_io_submit
        .long sys_io_cancel
        .long sys_fadvise64     /* 250 */
-       .long sys_ni_syscall
+       .long sys_set_zone_reclaim
        .long sys_exit_group
        .long sys_lookup_dcookie
        .long sys_epoll_create
index f7f90005e22e352ffedf7a19347ae0da92fe728b..8e201219f5253f53a84d1254b922ab7a7ff1a519 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/timex.h>
 #include <linux/errno.h>
 #include <linux/jiffies.h>
+#include <linux/module.h>
 
 #include <asm/io.h>
 #include <asm/timer.h>
@@ -24,7 +25,7 @@
 
 #define CALIBRATE_TIME (5 * 1000020/HZ)
 
-unsigned long __init calibrate_tsc(void)
+unsigned long calibrate_tsc(void)
 {
        mach_prepare_counter();
 
@@ -139,7 +140,7 @@ bad_calibration:
 #endif
 
 /* calculate cpu_khz */
-void __init init_cpu_khz(void)
+void init_cpu_khz(void)
 {
        if (cpu_has_tsc) {
                unsigned long tsc_quotient = calibrate_tsc();
@@ -158,3 +159,4 @@ void __init init_cpu_khz(void)
                }
        }
 }
+
index 7926d967be00ddf89718a4c43c4e866b17f09cfc..180444d87824e4299979a68b8f726da94ec50725 100644 (file)
@@ -320,6 +320,26 @@ core_initcall(cpufreq_tsc);
 static inline void cpufreq_delayed_get(void) { return; }
 #endif 
 
+int recalibrate_cpu_khz(void)
+{
+#ifndef CONFIG_SMP
+       unsigned long cpu_khz_old = cpu_khz;
+
+       if (cpu_has_tsc) {
+               init_cpu_khz();
+               cpu_data[0].loops_per_jiffy =
+                   cpufreq_scale(cpu_data[0].loops_per_jiffy,
+                                 cpu_khz_old,
+                                 cpu_khz);
+               return 0;
+       } else
+               return -ENODEV;
+#else
+       return -ENODEV;
+#endif
+}
+EXPORT_SYMBOL(recalibrate_cpu_khz);
+
 static void mark_offset_tsc(void)
 {
        unsigned long lost,delay;
index 00c63419c06f80f0af9ce17f4b7f78e18dd25df2..83c579e82a8137f24a6952efc461b4e434eb6158 100644 (file)
@@ -306,7 +306,7 @@ void die(const char * str, struct pt_regs * regs, long err)
        };
        static int die_counter;
 
-       if (die.lock_owner != _smp_processor_id()) {
+       if (die.lock_owner != raw_smp_processor_id()) {
                console_verbose();
                spin_lock_irq(&die.lock);
                die.lock_owner = smp_processor_id();
index 080639f262b1364479476e5f88065080388c2fa2..eb0cdfe9280fe11414239a640f9557279cfa2b23 100644 (file)
@@ -34,7 +34,7 @@ inline void __const_udelay(unsigned long xloops)
        xloops *= 4;
        __asm__("mull %0"
                :"=d" (xloops), "=&a" (d0)
-               :"1" (xloops),"0" (cpu_data[_smp_processor_id()].loops_per_jiffy * (HZ/4)));
+               :"1" (xloops),"0" (cpu_data[raw_smp_processor_id()].loops_per_jiffy * (HZ/4)));
         __delay(++xloops);
 }
 
index 903d739ca74ae1543c0e6ddb79c4a3518b86ec91..a6e0ddd65bd0df08dbe59cd23c7f2592d1307dc2 100644 (file)
@@ -97,7 +97,6 @@ static void ack_vic_irq(unsigned int irq);
 static void vic_enable_cpi(void);
 static void do_boot_cpu(__u8 cpuid);
 static void do_quad_bootstrap(void);
-static inline void wrapper_smp_local_timer_interrupt(struct pt_regs *);
 
 int hard_smp_processor_id(void);
 
@@ -125,6 +124,14 @@ send_QIC_CPI(__u32 cpuset, __u8 cpi)
        }
 }
 
+static inline void
+wrapper_smp_local_timer_interrupt(struct pt_regs *regs)
+{
+       irq_enter();
+       smp_local_timer_interrupt(regs);
+       irq_exit();
+}
+
 static inline void
 send_one_CPI(__u8 cpu, __u8 cpi)
 {
@@ -1249,14 +1256,6 @@ smp_vic_timer_interrupt(struct pt_regs *regs)
        smp_local_timer_interrupt(regs);
 }
 
-static inline void
-wrapper_smp_local_timer_interrupt(struct pt_regs *regs)
-{
-       irq_enter();
-       smp_local_timer_interrupt(regs);
-       irq_exit();
-}
-
 /* local (per CPU) timer interrupt.  It does both profiling and
  * process statistics/rescheduling.
  *
index 171fc925e1e4e7c699c6222b229914b320c987c3..3b099f32b9487a054db420509ad25591ea0d06eb 100644 (file)
@@ -18,7 +18,7 @@
 #include <asm/tlb.h>
 #include <asm/tlbflush.h>
 
-static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
+pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
 {
        pgd_t *pgd;
        pud_t *pud;
@@ -30,7 +30,7 @@ static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
        return (pte_t *) pmd;
 }
 
-static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
+pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
 {
        pgd_t *pgd;
        pud_t *pud;
@@ -42,21 +42,6 @@ static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
        return (pte_t *) pmd;
 }
 
-static void set_huge_pte(struct mm_struct *mm, struct vm_area_struct *vma, struct page *page, pte_t * page_table, int write_access)
-{
-       pte_t entry;
-
-       add_mm_counter(mm, rss, HPAGE_SIZE / PAGE_SIZE);
-       if (write_access) {
-               entry =
-                   pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
-       } else
-               entry = pte_wrprotect(mk_pte(page, vma->vm_page_prot));
-       entry = pte_mkyoung(entry);
-       mk_pte_huge(entry);
-       set_pte(page_table, entry);
-}
-
 /*
  * This function checks for proper alignment of input addr and len parameters.
  */
@@ -69,77 +54,6 @@ int is_aligned_hugepage_range(unsigned long addr, unsigned long len)
        return 0;
 }
 
-int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
-                       struct vm_area_struct *vma)
-{
-       pte_t *src_pte, *dst_pte, entry;
-       struct page *ptepage;
-       unsigned long addr = vma->vm_start;
-       unsigned long end = vma->vm_end;
-
-       while (addr < end) {
-               dst_pte = huge_pte_alloc(dst, addr);
-               if (!dst_pte)
-                       goto nomem;
-               src_pte = huge_pte_offset(src, addr);
-               entry = *src_pte;
-               ptepage = pte_page(entry);
-               get_page(ptepage);
-               set_pte(dst_pte, entry);
-               add_mm_counter(dst, rss, HPAGE_SIZE / PAGE_SIZE);
-               addr += HPAGE_SIZE;
-       }
-       return 0;
-
-nomem:
-       return -ENOMEM;
-}
-
-int
-follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma,
-                   struct page **pages, struct vm_area_struct **vmas,
-                   unsigned long *position, int *length, int i)
-{
-       unsigned long vpfn, vaddr = *position;
-       int remainder = *length;
-
-       WARN_ON(!is_vm_hugetlb_page(vma));
-
-       vpfn = vaddr/PAGE_SIZE;
-       while (vaddr < vma->vm_end && remainder) {
-
-               if (pages) {
-                       pte_t *pte;
-                       struct page *page;
-
-                       pte = huge_pte_offset(mm, vaddr);
-
-                       /* hugetlb should be locked, and hence, prefaulted */
-                       WARN_ON(!pte || pte_none(*pte));
-
-                       page = &pte_page(*pte)[vpfn % (HPAGE_SIZE/PAGE_SIZE)];
-
-                       WARN_ON(!PageCompound(page));
-
-                       get_page(page);
-                       pages[i] = page;
-               }
-
-               if (vmas)
-                       vmas[i] = vma;
-
-               vaddr += PAGE_SIZE;
-               ++vpfn;
-               --remainder;
-               ++i;
-       }
-
-       *length = remainder;
-       *position = vaddr;
-
-       return i;
-}
-
 #if 0  /* This is just for testing */
 struct page *
 follow_huge_addr(struct mm_struct *mm, unsigned long address, int write)
@@ -204,83 +118,15 @@ follow_huge_pmd(struct mm_struct *mm, unsigned long address,
 }
 #endif
 
-void unmap_hugepage_range(struct vm_area_struct *vma,
-               unsigned long start, unsigned long end)
+void hugetlb_clean_stale_pgtable(pte_t *pte)
 {
-       struct mm_struct *mm = vma->vm_mm;
-       unsigned long address;
-       pte_t pte, *ptep;
+       pmd_t *pmd = (pmd_t *) pte;
        struct page *page;
 
-       BUG_ON(start & (HPAGE_SIZE - 1));
-       BUG_ON(end & (HPAGE_SIZE - 1));
-
-       for (address = start; address < end; address += HPAGE_SIZE) {
-               ptep = huge_pte_offset(mm, address);
-               if (!ptep)
-                       continue;
-               pte = ptep_get_and_clear(mm, address, ptep);
-               if (pte_none(pte))
-                       continue;
-               page = pte_page(pte);
-               put_page(page);
-       }
-       add_mm_counter(mm ,rss, -((end - start) >> PAGE_SHIFT));
-       flush_tlb_range(vma, start, end);
-}
-
-int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
-{
-       struct mm_struct *mm = current->mm;
-       unsigned long addr;
-       int ret = 0;
-
-       BUG_ON(vma->vm_start & ~HPAGE_MASK);
-       BUG_ON(vma->vm_end & ~HPAGE_MASK);
-
-       spin_lock(&mm->page_table_lock);
-       for (addr = vma->vm_start; addr < vma->vm_end; addr += HPAGE_SIZE) {
-               unsigned long idx;
-               pte_t *pte = huge_pte_alloc(mm, addr);
-               struct page *page;
-
-               if (!pte) {
-                       ret = -ENOMEM;
-                       goto out;
-               }
-
-               if (!pte_none(*pte))
-                       continue;
-
-               idx = ((addr - vma->vm_start) >> HPAGE_SHIFT)
-                       + (vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT));
-               page = find_get_page(mapping, idx);
-               if (!page) {
-                       /* charge the fs quota first */
-                       if (hugetlb_get_quota(mapping)) {
-                               ret = -ENOMEM;
-                               goto out;
-                       }
-                       page = alloc_huge_page();
-                       if (!page) {
-                               hugetlb_put_quota(mapping);
-                               ret = -ENOMEM;
-                               goto out;
-                       }
-                       ret = add_to_page_cache(page, mapping, idx, GFP_ATOMIC);
-                       if (! ret) {
-                               unlock_page(page);
-                       } else {
-                               hugetlb_put_quota(mapping);
-                               free_huge_page(page);
-                               goto out;
-                       }
-               }
-               set_huge_pte(mm, vma, page, pte, vma->vm_flags & VM_WRITE);
-       }
-out:
-       spin_unlock(&mm->page_table_lock);
-       return ret;
+       page = pmd_page(*pmd);
+       pmd_clear(pmd);
+       dec_page_state(nr_page_table_pages);
+       page_cache_release(page);
 }
 
 /* x86_64 also uses this file */
@@ -294,7 +140,12 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file,
        struct vm_area_struct *vma;
        unsigned long start_addr;
 
-       start_addr = mm->free_area_cache;
+       if (len > mm->cached_hole_size) {
+               start_addr = mm->free_area_cache;
+       } else {
+               start_addr = TASK_UNMAPPED_BASE;
+               mm->cached_hole_size = 0;
+       }
 
 full_search:
        addr = ALIGN(start_addr, HPAGE_SIZE);
@@ -308,6 +159,7 @@ full_search:
                         */
                        if (start_addr != TASK_UNMAPPED_BASE) {
                                start_addr = TASK_UNMAPPED_BASE;
+                               mm->cached_hole_size = 0;
                                goto full_search;
                        }
                        return -ENOMEM;
@@ -316,6 +168,8 @@ full_search:
                        mm->free_area_cache = addr + len;
                        return addr;
                }
+               if (addr + mm->cached_hole_size < vma->vm_start)
+                       mm->cached_hole_size = vma->vm_start - addr;
                addr = ALIGN(vma->vm_end, HPAGE_SIZE);
        }
 }
@@ -327,12 +181,17 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,
        struct mm_struct *mm = current->mm;
        struct vm_area_struct *vma, *prev_vma;
        unsigned long base = mm->mmap_base, addr = addr0;
+       unsigned long largest_hole = mm->cached_hole_size;
        int first_time = 1;
 
        /* don't allow allocations above current base */
        if (mm->free_area_cache > base)
                mm->free_area_cache = base;
 
+       if (len <= largest_hole) {
+               largest_hole = 0;
+               mm->free_area_cache  = base;
+       }
 try_again:
        /* make sure it can fit in the remaining address space */
        if (mm->free_area_cache < len)
@@ -353,13 +212,21 @@ try_again:
                 * vma->vm_start, use it:
                 */
                if (addr + len <= vma->vm_start &&
-                               (!prev_vma || (addr >= prev_vma->vm_end)))
+                           (!prev_vma || (addr >= prev_vma->vm_end))) {
                        /* remember the address as a hint for next time */
-                       return (mm->free_area_cache = addr);
-               else
+                       mm->cached_hole_size = largest_hole;
+                       return (mm->free_area_cache = addr);
+               } else {
                        /* pull free_area_cache down to the first hole */
-                       if (mm->free_area_cache == vma->vm_end)
+                       if (mm->free_area_cache == vma->vm_end) {
                                mm->free_area_cache = vma->vm_start;
+                               mm->cached_hole_size = largest_hole;
+                       }
+               }
+
+               /* remember the largest hole we saw so far */
+               if (addr + largest_hole < vma->vm_start)
+                       largest_hole = vma->vm_start - addr;
 
                /* try just below the current vma->vm_start */
                addr = (vma->vm_start - len) & HPAGE_MASK;
@@ -372,6 +239,7 @@ fail:
         */
        if (first_time) {
                mm->free_area_cache = base;
+               largest_hole = 0;
                first_time = 0;
                goto try_again;
        }
@@ -382,6 +250,7 @@ fail:
         * allocations.
         */
        mm->free_area_cache = TASK_UNMAPPED_BASE;
+       mm->cached_hole_size = ~0UL;
        addr = hugetlb_get_unmapped_area_bottomup(file, addr0,
                        len, pgoff, flags);
 
@@ -389,6 +258,7 @@ fail:
         * Restore the topdown base:
         */
        mm->free_area_cache = base;
+       mm->cached_hole_size = ~0UL;
 
        return addr;
 }
index 7a7ea3737265284eceafdcdc82000f3c87d06690..8766c771bb45371ab1f67e94112616ba86521a9e 100644 (file)
@@ -269,7 +269,6 @@ void __init one_highpage_init(struct page *page, int pfn, int bad_ppro)
 {
        if (page_is_ram(pfn) && !(bad_ppro && page_kills_ppro(pfn))) {
                ClearPageReserved(page);
-               set_bit(PG_highmem, &page->flags);
                set_page_count(page, 1);
                __free_page(page);
                totalhigh_pages++;
index db06f7399913f7da8a3b42d110f0dc24b41272cb..ab542792b27bbab0aa9be9fdf29d865b00e319e5 100644 (file)
@@ -238,19 +238,21 @@ void iounmap(volatile void __iomem *addr)
                        addr < phys_to_virt(ISA_END_ADDRESS))
                return;
 
-       p = remove_vm_area((void *) (PAGE_MASK & (unsigned long __force) addr));
+       write_lock(&vmlist_lock);
+       p = __remove_vm_area((void *) (PAGE_MASK & (unsigned long __force) addr));
        if (!p) { 
-               printk("__iounmap: bad address %p\n", addr);
-               return;
+               printk("iounmap: bad address %p\n", addr);
+               goto out_unlock;
        }
 
        if ((p->flags >> 20) && p->phys_addr < virt_to_phys(high_memory) - 1) {
-               /* p->size includes the guard page, but cpa doesn't like that */
                change_page_attr(virt_to_page(__va(p->phys_addr)),
                                 p->size >> PAGE_SHIFT,
                                 PAGE_KERNEL);
                global_flush_tlb();
        } 
+out_unlock:
+       write_unlock(&vmlist_lock);
        kfree(p); 
 }
 
index be52c5ac4e054692478d845505b654adf5d869b6..8e8e895e1b5a62749a1a1bf233fdf25dfaf782da 100644 (file)
@@ -253,7 +253,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2, pci
 #define MAX_PCIEROOT   6
 static int quirk_aspm_offset[MAX_PCIEROOT << 3];
 
-#define GET_INDEX(a, b) (((a - PCI_DEVICE_ID_INTEL_MCH_PA) << 3) + b)
+#define GET_INDEX(a, b) ((((a) - PCI_DEVICE_ID_INTEL_MCH_PA) << 3) + ((b) & 7))
 
 static int quirk_pcie_aspm_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value)
 {
index d6598da4b67bbc6fc1dde2ad121c692471813175..da21b1d07c15529e954a21ab8b48a0c48bd0df6b 100644 (file)
@@ -1029,7 +1029,6 @@ void pcibios_penalize_isa_irq(int irq)
 static int pirq_enable_irq(struct pci_dev *dev)
 {
        u8 pin;
-       extern int via_interrupt_line_quirk;
        struct pci_dev *temp_dev;
 
        pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
@@ -1084,10 +1083,6 @@ static int pirq_enable_irq(struct pci_dev *dev)
                printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of device %s.%s\n",
                       'A' + pin, pci_name(dev), msg);
        }
-       /* VIA bridges use interrupt line for apic/pci steering across
-          the V-Link */
-       else if (via_interrupt_line_quirk)
-               pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq & 15);
        return 0;
 }
 
index 3ad2c4af099cf67fa5bff6016347021913d76aee..34e603cc17161a141cd3f0047b333c708bc002be 100644 (file)
@@ -50,6 +50,10 @@ config SCHED_NO_NO_OMIT_FRAME_POINTER
        bool
        default y
 
+config IA64_UNCACHED_ALLOCATOR
+       bool
+       select GENERIC_ALLOCATOR
+
 choice
        prompt "System type"
        default IA64_GENERIC
@@ -223,7 +227,7 @@ config IA64_SGI_SN_SIM
 
 config IA64_SGI_SN_XP
        tristate "Support communication between SGI SSIs"
-       depends on MSPEC
+       select IA64_UNCACHED_ALLOCATOR
        help
          An SGI machine can be divided into multiple Single System
          Images which act independently of each other and have
index 6ff7107fee4d6ecca4d5f32ae3cf9018abb5057b..a01bb02d074df7cd4ac60efea1985990d739747a 100644 (file)
@@ -588,6 +588,7 @@ CONFIG_SGI_MBCS=m
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_SERIAL_SGI_L1_CONSOLE=y
+CONFIG_SERIAL_SGI_IOC4=y
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -787,6 +788,11 @@ CONFIG_INFINIBAND_MTHCA=m
 CONFIG_INFINIBAND_IPOIB=m
 # CONFIG_INFINIBAND_IPOIB_DEBUG is not set
 
+#
+# SN Devices
+#
+CONFIG_SGI_IOC4=y
+
 #
 # File systems
 #
index 7539e83bf054c7350d2af710ada1b2ce95e9a19b..9997ef45ab237b19a09238fee673ba17b4388950 100644 (file)
@@ -638,6 +638,7 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_SERIAL_SGI_L1_CONSOLE=y
+CONFIG_SERIAL_SGI_IOC4=y
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -942,6 +943,11 @@ CONFIG_INFINIBAND_MTHCA=m
 CONFIG_INFINIBAND_IPOIB=m
 # CONFIG_INFINIBAND_IPOIB_DEBUG is not set
 
+#
+# SN Devices
+#
+CONFIG_SGI_IOC4=y
+
 #
 # File systems
 #
index 9845dabe2613ae91bf456607b59d48400fe5689d..164b211f417474db5e566c4bab14024b10a3077c 100644 (file)
@@ -13,7 +13,6 @@
   
 #define        INCLUDES
 #include "compat_ioctl.c"
-#include <asm/ioctl32.h>
 
 #define IOCTL_NR(a)    ((a) & ~(_IOC_SIZEMASK << _IOC_SIZESHIFT))
 
index 247a21c64aea33bb41ad5aa591323abcfb81aaaf..c1e20d65dd6cb4688391f928f43445aea644b66b 100644 (file)
@@ -2427,7 +2427,7 @@ sys32_epoll_wait(int epfd, struct epoll_event32 __user * events, int maxevents,
 {
        struct epoll_event *events64 = NULL;
        mm_segment_t old_fs = get_fs();
-       int error, numevents, size;
+       int numevents, size;
        int evt_idx;
        int do_free_pages = 0;
 
index c1a02bbc252c7b0409d339460b2c25ea34dfcaee..4c73d8ba2e3df14b91db0eab8806c57408d4b4de 100644 (file)
@@ -20,6 +20,7 @@ obj-$(CONFIG_SMP)             += smp.o smpboot.o domain.o
 obj-$(CONFIG_PERFMON)          += perfmon_default_smpl.o
 obj-$(CONFIG_IA64_CYCLONE)     += cyclone.o
 obj-$(CONFIG_IA64_MCA_RECOVERY)        += mca_recovery.o
+obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR)  += uncached.o
 mca_recovery-y                 += mca_drv.o mca_drv_asm.o
 
 # The gate DSO image is built using a special linker script.
index 4a3b1aac43e737e4082d36eb5eee0846628fc73a..179f230816edf52dd57a990a188465455d1f73fa 100644 (file)
@@ -409,6 +409,38 @@ efi_memmap_walk (efi_freemem_callback_t callback, void *arg)
        }
 }
 
+/*
+ * Walk the EFI memory map to pull out leftover pages in the lower
+ * memory regions which do not end up in the regular memory map and
+ * stick them into the uncached allocator
+ *
+ * The regular walk function is significantly more complex than the
+ * uncached walk which means it really doesn't make sense to try and
+ * marge the two.
+ */
+void __init
+efi_memmap_walk_uc (efi_freemem_callback_t callback)
+{
+       void *efi_map_start, *efi_map_end, *p;
+       efi_memory_desc_t *md;
+       u64 efi_desc_size, start, end;
+
+       efi_map_start = __va(ia64_boot_param->efi_memmap);
+       efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size;
+       efi_desc_size = ia64_boot_param->efi_memdesc_size;
+
+       for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
+               md = p;
+               if (md->attribute == EFI_MEMORY_UC) {
+                       start = PAGE_ALIGN(md->phys_addr);
+                       end = PAGE_ALIGN((md->phys_addr+(md->num_pages << EFI_PAGE_SHIFT)) & PAGE_MASK);
+                       if ((*callback)(start, end, NULL) < 0)
+                               return;
+               }
+       }
+}
+
+
 /*
  * Look for the PAL_CODE region reported by EFI and maps it using an
  * ITR to enable safe PAL calls in virtual mode.  See IA-64 Processor
index 81c45d44739430f5754b89117a15333f2ffa4d1f..b1d5d3d5276c8424a41f96f2c1009f7d0d31cfab 100644 (file)
@@ -1182,7 +1182,7 @@ ENTRY(notify_resume_user)
        ;;
 (pNonSys) mov out2=0                           // out2==0 => not a syscall
        .fframe 16
-       .spillpsp ar.unat, 16                   // (note that offset is relative to psp+0x10!)
+       .spillsp ar.unat, 16
        st8 [sp]=r9,-16                         // allocate space for ar.unat and save it
        st8 [out1]=loc1,-8                      // save ar.pfs, out1=&sigscratch
        .body
@@ -1208,7 +1208,7 @@ GLOBAL_ENTRY(sys_rt_sigsuspend)
        adds out2=8,sp                          // out2=&sigscratch->ar_pfs
        ;;
        .fframe 16
-       .spillpsp ar.unat, 16                   // (note that offset is relative to psp+0x10!)
+       .spillsp ar.unat, 16
        st8 [sp]=r9,-16                         // allocate space for ar.unat and save it
        st8 [out2]=loc1,-8                      // save ar.pfs, out2=&sigscratch
        .body
@@ -1579,7 +1579,7 @@ sys_call_table:
        data8 sys_keyctl
        data8 sys_ni_syscall
        data8 sys_ni_syscall                    // 1275
-       data8 sys_ni_syscall
+       data8 sys_set_zone_reclaim
        data8 sys_ni_syscall
        data8 sys_ni_syscall
        data8 sys_ni_syscall
index 4f3cdef75797ccb4bf9949e6e0da43b1284eed17..962b6c4e32b5b92f8182ff0b600350d37b35242c 100644 (file)
@@ -460,9 +460,9 @@ EX(.fail_efault, ld8 r14=[r33])                     // r14 <- *set
        ;;
 
        st8 [r2]=r14                            // update current->blocked with new mask
-       cmpxchg4.acq r14=[r9],r18,ar.ccv        // current->thread_info->flags <- r18
+       cmpxchg4.acq r8=[r9],r18,ar.ccv         // current->thread_info->flags <- r18
        ;;
-       cmp.ne p6,p0=r17,r14                    // update failed?
+       cmp.ne p6,p0=r17,r                    // update failed?
 (p6)   br.cond.spnt.few 1b                     // yes -> retry
 
 #ifdef CONFIG_SMP
index 4d6c7b8f667bc6207dc20230c453560e276da516..736e328b5e612865d1173d84ff054dc21bbbfde9 100644 (file)
@@ -1103,8 +1103,6 @@ ia64_mca_cpe_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs)
        return IRQ_HANDLED;
 }
 
-#endif /* CONFIG_ACPI */
-
 /*
  *  ia64_mca_cpe_poll
  *
@@ -1122,6 +1120,8 @@ ia64_mca_cpe_poll (unsigned long dummy)
        platform_send_ipi(first_cpu(cpu_online_map), IA64_CPEP_VECTOR, IA64_IPI_DM_INT, 0);
 }
 
+#endif /* CONFIG_ACPI */
+
 /*
  * C portion of the OS INIT handler
  *
@@ -1390,8 +1390,7 @@ ia64_mca_init(void)
        register_percpu_irq(IA64_MCA_WAKEUP_VECTOR, &mca_wkup_irqaction);
 
 #ifdef CONFIG_ACPI
-       /* Setup the CPEI/P vector and handler */
-       cpe_vector = acpi_request_vector(ACPI_INTERRUPT_CPEI);
+       /* Setup the CPEI/P handler */
        register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction);
 #endif
 
@@ -1436,6 +1435,7 @@ ia64_mca_late_init(void)
 
 #ifdef CONFIG_ACPI
        /* Setup the CPEI/P vector and handler */
+       cpe_vector = acpi_request_vector(ACPI_INTERRUPT_CPEI);
        init_timer(&cpe_poll_timer);
        cpe_poll_timer.function = ia64_mca_cpe_poll;
 
index 1dbc7b2497c90d4b3c0a8cef4c7afb94e7abc315..f6d8a010d99beacb04dc2d3a9cf8af2e14237a3e 100644 (file)
@@ -41,7 +41,7 @@
 (pKStk) addl r3=THIS_CPU(ia64_mca_data),r3;;                                                   \
 (pKStk) ld8 r3 = [r3];;                                                                                \
 (pKStk) addl r3=IA64_MCA_CPU_INIT_STACK_OFFSET,r3;;                                            \
-(pKStk) addl sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r3;                                          \
+(pKStk) addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r3;                                          \
 (pUStk)        mov ar.rsc=0;           /* set enforced lazy mode, pl 0, little-endian, loadrs=0 */     \
 (pUStk)        addl r22=IA64_RBS_OFFSET,r1;            /* compute base of register backing store */    \
        ;;                                                                                      \
@@ -50,7 +50,6 @@
 (pUStk)        mov r23=ar.bspstore;                            /* save ar.bspstore */                  \
 (pUStk)        dep r22=-1,r22,61,3;                    /* compute kernel virtual addr of RBS */        \
        ;;                                                                                      \
-(pKStk) addl r1=-IA64_PT_REGS_SIZE,r1;         /* if in kernel mode, use sp (r12) */           \
 (pUStk)        mov ar.bspstore=r22;                    /* switch to kernel RBS */                      \
        ;;                                                                                      \
 (pUStk)        mov r18=ar.bsp;                                                                         \
index febc091c2f02d318cd4bfa72346a10b536f08d5f..f1aca7cffd120879e446e703a8783f93c36f6654 100644 (file)
@@ -825,14 +825,16 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind
                 * XXX Should have an arch-hook for running this after final section
                 *     addresses have been selected...
                 */
-               /* See if gp can cover the entire core module:  */
-               uint64_t gp = (uint64_t) mod->module_core + MAX_LTOFF / 2;
-               if (mod->core_size >= MAX_LTOFF)
+               uint64_t gp;
+               if (mod->core_size > MAX_LTOFF)
                        /*
                         * This takes advantage of fact that SHF_ARCH_SMALL gets allocated
                         * at the end of the module.
                         */
-                       gp = (uint64_t) mod->module_core + mod->core_size - MAX_LTOFF / 2;
+                       gp = mod->core_size - MAX_LTOFF / 2;
+               else
+                       gp = mod->core_size / 2;
+               gp = (uint64_t) mod->module_core + ((gp + 7) & -8);
                mod->arch.gp = gp;
                DEBUGP("%s: placing gp at 0x%lx\n", __FUNCTION__, gp);
        }
index 71c101601e3ef060a33d416904c57021d1501c01..6407bff6bfd7540cb02322b093b7bf860a7e2321 100644 (file)
@@ -11,7 +11,7 @@
  * Version Perfmon-2.x is a rewrite of perfmon-1.x
  * by Stephane Eranian, Hewlett Packard Co.
  *
- * Copyright (C) 1999-2003, 2005  Hewlett Packard Co
+ * Copyright (C) 1999-2005  Hewlett Packard Co
  *               Stephane Eranian <eranian@hpl.hp.com>
  *               David Mosberger-Tang <davidm@hpl.hp.com>
  *
@@ -497,6 +497,9 @@ typedef struct {
 static pfm_stats_t             pfm_stats[NR_CPUS];
 static pfm_session_t           pfm_sessions;   /* global sessions information */
 
+static spinlock_t pfm_alt_install_check = SPIN_LOCK_UNLOCKED;
+static pfm_intr_handler_desc_t  *pfm_alt_intr_handler;
+
 static struct proc_dir_entry   *perfmon_dir;
 static pfm_uuid_t              pfm_null_uuid = {0,};
 
@@ -606,6 +609,7 @@ DEFINE_PER_CPU(unsigned long, pfm_syst_info);
 DEFINE_PER_CPU(struct task_struct *, pmu_owner);
 DEFINE_PER_CPU(pfm_context_t  *, pmu_ctx);
 DEFINE_PER_CPU(unsigned long, pmu_activation_number);
+EXPORT_PER_CPU_SYMBOL_GPL(pfm_syst_info);
 
 
 /* forward declaration */
@@ -1325,7 +1329,7 @@ pfm_reserve_session(struct task_struct *task, int is_syswide, unsigned int cpu)
 error_conflict:
        DPRINT(("system wide not possible, conflicting session [%d] on CPU%d\n",
                pfm_sessions.pfs_sys_session[cpu]->pid,
-               smp_processor_id()));
+               cpu));
 abort:
        UNLOCK_PFS(flags);
 
@@ -5555,26 +5559,32 @@ pfm_interrupt_handler(int irq, void *arg, struct pt_regs *regs)
        int ret;
 
        this_cpu = get_cpu();
-       min      = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_min;
-       max      = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_max;
+       if (likely(!pfm_alt_intr_handler)) {
+               min = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_min;
+               max = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_max;
 
-       start_cycles = ia64_get_itc();
+               start_cycles = ia64_get_itc();
 
-       ret = pfm_do_interrupt_handler(irq, arg, regs);
+               ret = pfm_do_interrupt_handler(irq, arg, regs);
 
-       total_cycles = ia64_get_itc();
+               total_cycles = ia64_get_itc();
 
-       /*
-        * don't measure spurious interrupts
-        */
-       if (likely(ret == 0)) {
-               total_cycles -= start_cycles;
+               /*
+                * don't measure spurious interrupts
+                */
+               if (likely(ret == 0)) {
+                       total_cycles -= start_cycles;
 
-               if (total_cycles < min) pfm_stats[this_cpu].pfm_ovfl_intr_cycles_min = total_cycles;
-               if (total_cycles > max) pfm_stats[this_cpu].pfm_ovfl_intr_cycles_max = total_cycles;
+                       if (total_cycles < min) pfm_stats[this_cpu].pfm_ovfl_intr_cycles_min = total_cycles;
+                       if (total_cycles > max) pfm_stats[this_cpu].pfm_ovfl_intr_cycles_max = total_cycles;
 
-               pfm_stats[this_cpu].pfm_ovfl_intr_cycles += total_cycles;
+                       pfm_stats[this_cpu].pfm_ovfl_intr_cycles += total_cycles;
+               }
+       }
+       else {
+               (*pfm_alt_intr_handler->handler)(irq, arg, regs);
        }
+
        put_cpu_no_resched();
        return IRQ_HANDLED;
 }
@@ -6425,6 +6435,141 @@ static struct irqaction perfmon_irqaction = {
        .name    = "perfmon"
 };
 
+static void
+pfm_alt_save_pmu_state(void *data)
+{
+       struct pt_regs *regs;
+
+       regs = ia64_task_regs(current);
+
+       DPRINT(("called\n"));
+
+       /*
+        * should not be necessary but
+        * let's take not risk
+        */
+       pfm_clear_psr_up();
+       pfm_clear_psr_pp();
+       ia64_psr(regs)->pp = 0;
+
+       /*
+        * This call is required
+        * May cause a spurious interrupt on some processors
+        */
+       pfm_freeze_pmu();
+
+       ia64_srlz_d();
+}
+
+void
+pfm_alt_restore_pmu_state(void *data)
+{
+       struct pt_regs *regs;
+
+       regs = ia64_task_regs(current);
+
+       DPRINT(("called\n"));
+
+       /*
+        * put PMU back in state expected
+        * by perfmon
+        */
+       pfm_clear_psr_up();
+       pfm_clear_psr_pp();
+       ia64_psr(regs)->pp = 0;
+
+       /*
+        * perfmon runs with PMU unfrozen at all times
+        */
+       pfm_unfreeze_pmu();
+
+       ia64_srlz_d();
+}
+
+int
+pfm_install_alt_pmu_interrupt(pfm_intr_handler_desc_t *hdl)
+{
+       int ret, i;
+       int reserve_cpu;
+
+       /* some sanity checks */
+       if (hdl == NULL || hdl->handler == NULL) return -EINVAL;
+
+       /* do the easy test first */
+       if (pfm_alt_intr_handler) return -EBUSY;
+
+       /* one at a time in the install or remove, just fail the others */
+       if (!spin_trylock(&pfm_alt_install_check)) {
+               return -EBUSY;
+       }
+
+       /* reserve our session */
+       for_each_online_cpu(reserve_cpu) {
+               ret = pfm_reserve_session(NULL, 1, reserve_cpu);
+               if (ret) goto cleanup_reserve;
+       }
+
+       /* save the current system wide pmu states */
+       ret = on_each_cpu(pfm_alt_save_pmu_state, NULL, 0, 1);
+       if (ret) {
+               DPRINT(("on_each_cpu() failed: %d\n", ret));
+               goto cleanup_reserve;
+       }
+
+       /* officially change to the alternate interrupt handler */
+       pfm_alt_intr_handler = hdl;
+
+       spin_unlock(&pfm_alt_install_check);
+
+       return 0;
+
+cleanup_reserve:
+       for_each_online_cpu(i) {
+               /* don't unreserve more than we reserved */
+               if (i >= reserve_cpu) break;
+
+               pfm_unreserve_session(NULL, 1, i);
+       }
+
+       spin_unlock(&pfm_alt_install_check);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(pfm_install_alt_pmu_interrupt);
+
+int
+pfm_remove_alt_pmu_interrupt(pfm_intr_handler_desc_t *hdl)
+{
+       int i;
+       int ret;
+
+       if (hdl == NULL) return -EINVAL;
+
+       /* cannot remove someone else's handler! */
+       if (pfm_alt_intr_handler != hdl) return -EINVAL;
+
+       /* one at a time in the install or remove, just fail the others */
+       if (!spin_trylock(&pfm_alt_install_check)) {
+               return -EBUSY;
+       }
+
+       pfm_alt_intr_handler = NULL;
+
+       ret = on_each_cpu(pfm_alt_restore_pmu_state, NULL, 0, 1);
+       if (ret) {
+               DPRINT(("on_each_cpu() failed: %d\n", ret));
+       }
+
+       for_each_online_cpu(i) {
+               pfm_unreserve_session(NULL, 1, i);
+       }
+
+       spin_unlock(&pfm_alt_install_check);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(pfm_remove_alt_pmu_interrupt);
+
 /*
  * perfmon initialization routine, called from the initcall() table
  */
index 907464ee7273221468afa4c59cc811042ed2fd11..575a8f657b3129bacc8ec2979470ecc84c9b7b3f 100644 (file)
@@ -635,11 +635,17 @@ ia64_flush_fph (struct task_struct *task)
 {
        struct ia64_psr *psr = ia64_psr(ia64_task_regs(task));
 
+       /*
+        * Prevent migrating this task while
+        * we're fiddling with the FPU state
+        */
+       preempt_disable();
        if (ia64_is_local_fpu_owner(task) && psr->mfh) {
                psr->mfh = 0;
                task->thread.flags |= IA64_THREAD_FPH_VALID;
                ia64_save_fpu(&task->thread.fph[0]);
        }
+       preempt_enable();
 }
 
 /*
@@ -692,16 +698,30 @@ convert_to_non_syscall (struct task_struct *child, struct pt_regs  *pt,
                        unsigned long cfm)
 {
        struct unw_frame_info info, prev_info;
-       unsigned long ip, pr;
+       unsigned long ip, sp, pr;
 
        unw_init_from_blocked_task(&info, child);
        while (1) {
                prev_info = info;
                if (unw_unwind(&info) < 0)
                        return;
-               if (unw_get_rp(&info, &ip) < 0)
+
+               unw_get_sp(&info, &sp);
+               if ((long)((unsigned long)child + IA64_STK_OFFSET - sp)
+                   < IA64_PT_REGS_SIZE) {
+                       dprintk("ptrace.%s: ran off the top of the kernel "
+                               "stack\n", __FUNCTION__);
+                       return;
+               }
+               if (unw_get_pr (&prev_info, &pr) < 0) {
+                       unw_get_rp(&prev_info, &ip);
+                       dprintk("ptrace.%s: failed to read "
+                               "predicate register (ip=0x%lx)\n",
+                               __FUNCTION__, ip);
                        return;
-               if (ip < FIXADDR_USER_END)
+               }
+               if (unw_is_intr_frame(&info)
+                   && (pr & (1UL << PRED_USER_STACK)))
                        break;
        }
 
index b7e6b4cb374b89302f5ba58612bce333f7b8a1cd..d14692e0920acc5c6f0350b9b14bddc801b07221 100644 (file)
@@ -720,7 +720,8 @@ cpu_init (void)
        ia64_set_kr(IA64_KR_PT_BASE, __pa(ia64_imva(empty_zero_page)));
 
        /*
-        * Initialize default control register to defer all speculative faults.  The
+        * Initialize default control register to defer speculative faults except
+        * for those arising from TLB misses, which are not deferred.  The
         * kernel MUST NOT depend on a particular setting of these bits (in other words,
         * the kernel must have recovery code for all speculative accesses).  Turn on
         * dcr.lc as per recommendation by the architecture team.  Most IA-32 apps
index 0d5ee57c9865ce10128cdf89a05d0af48d8d7020..3865f088ffa26d9c7db30c932098a09db0762ba0 100644 (file)
@@ -624,7 +624,7 @@ static struct {
        __u16   thread_id;
        __u16   proc_fixed_addr;
        __u8    valid;
-}mt_info[NR_CPUS] __devinit;
+} mt_info[NR_CPUS] __devinitdata;
 
 #ifdef CONFIG_HOTPLUG_CPU
 static inline void
index a8cf6d8a509cb07c780ccde59b8a71a30c437b46..770fab37928ee9e4c3870b8875473f7a53d1213b 100644 (file)
@@ -182,13 +182,6 @@ do_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, un
                }
        }
 
-       /*
-        * A zero mmap always succeeds in Linux, independent of whether or not the
-        * remaining arguments are valid.
-        */
-       if (len == 0)
-               goto out;
-
        /* Careful about overflows.. */
        len = PAGE_ALIGN(len);
        if (!len || len > TASK_SIZE) {
index e82ad78081b38724e5f80c2cbe8d107e0fbcb871..1861173bd4f6a7be2d76edeb008e7b83a3231856 100644 (file)
@@ -111,6 +111,24 @@ ia64_bad_break (unsigned long break_num, struct pt_regs *regs)
        siginfo_t siginfo;
        int sig, code;
 
+       /* break.b always sets cr.iim to 0, which causes problems for
+        * debuggers.  Get the real break number from the original instruction,
+        * but only for kernel code.  User space break.b is left alone, to
+        * preserve the existing behaviour.  All break codings have the same
+        * format, so there is no need to check the slot type.
+        */
+       if (break_num == 0 && !user_mode(regs)) {
+               struct ia64_psr *ipsr = ia64_psr(regs);
+               unsigned long *bundle = (unsigned long *)regs->cr_iip;
+               unsigned long slot;
+               switch (ipsr->ri) {
+                     case 0:  slot = (bundle[0] >>  5); break;
+                     case 1:  slot = (bundle[0] >> 46) | (bundle[1] << 18); break;
+                     default: slot = (bundle[1] >> 23); break;
+               }
+               break_num = ((slot >> 36 & 1) << 20) | (slot >> 6 & 0xfffff);
+       }
+
        /* SIGILL, SIGFPE, SIGSEGV, and SIGBUS want these field initialized: */
        siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri);
        siginfo.si_imm = break_num;
@@ -202,13 +220,21 @@ disabled_fph_fault (struct pt_regs *regs)
 
        /* first, grant user-level access to fph partition: */
        psr->dfh = 0;
+
+       /*
+        * Make sure that no other task gets in on this processor
+        * while we're claiming the FPU
+        */
+       preempt_disable();
 #ifndef CONFIG_SMP
        {
                struct task_struct *fpu_owner
                        = (struct task_struct *)ia64_get_kr(IA64_KR_FPU_OWNER);
 
-               if (ia64_is_local_fpu_owner(current))
+               if (ia64_is_local_fpu_owner(current)) {
+                       preempt_enable_no_resched();
                        return;
+               }
 
                if (fpu_owner)
                        ia64_flush_fph(fpu_owner);
@@ -226,6 +252,7 @@ disabled_fph_fault (struct pt_regs *regs)
                 */
                psr->mfh = 1;
        }
+       preempt_enable_no_resched();
 }
 
 static inline int
diff --git a/arch/ia64/kernel/uncached.c b/arch/ia64/kernel/uncached.c
new file mode 100644 (file)
index 0000000..490dfc9
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2001-2005 Silicon Graphics, Inc.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * A simple uncached page allocator using the generic allocator. This
+ * allocator first utilizes the spare (spill) pages found in the EFI
+ * memmap and will then start converting cached pages to uncached ones
+ * at a granule at a time. Node awareness is implemented by having a
+ * pool of pages per node.
+ */
+
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/slab.h>
+#include <linux/efi.h>
+#include <linux/genalloc.h>
+#include <asm/page.h>
+#include <asm/pal.h>
+#include <asm/system.h>
+#include <asm/pgtable.h>
+#include <asm/atomic.h>
+#include <asm/tlbflush.h>
+#include <asm/sn/arch.h>
+
+#define DEBUG  0
+
+#if DEBUG
+#define dprintk                        printk
+#else
+#define dprintk(x...)          do { } while (0)
+#endif
+
+void __init efi_memmap_walk_uc (efi_freemem_callback_t callback);
+
+#define MAX_UNCACHED_GRANULES  5
+static int allocated_granules;
+
+struct gen_pool *uncached_pool[MAX_NUMNODES];
+
+
+static void uncached_ipi_visibility(void *data)
+{
+       int status;
+
+       status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL);
+       if ((status != PAL_VISIBILITY_OK) &&
+           (status != PAL_VISIBILITY_OK_REMOTE_NEEDED))
+               printk(KERN_DEBUG "pal_prefetch_visibility() returns %i on "
+                      "CPU %i\n", status, get_cpu());
+}
+
+
+static void uncached_ipi_mc_drain(void *data)
+{
+       int status;
+       status = ia64_pal_mc_drain();
+       if (status)
+               printk(KERN_WARNING "ia64_pal_mc_drain() failed with %i on "
+                      "CPU %i\n", status, get_cpu());
+}
+
+
+static unsigned long
+uncached_get_new_chunk(struct gen_pool *poolp)
+{
+       struct page *page;
+       void *tmp;
+       int status, i;
+       unsigned long addr, node;
+
+       if (allocated_granules >= MAX_UNCACHED_GRANULES)
+               return 0;
+
+       node = poolp->private;
+       page = alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO,
+                               IA64_GRANULE_SHIFT-PAGE_SHIFT);
+
+       dprintk(KERN_INFO "get_new_chunk page %p, addr %lx\n",
+               page, (unsigned long)(page-vmem_map) << PAGE_SHIFT);
+
+       /*
+        * Do magic if no mem on local node! XXX
+        */
+       if (!page)
+               return 0;
+       tmp = page_address(page);
+
+       /*
+        * There's a small race here where it's possible for someone to
+        * access the page through /dev/mem halfway through the conversion
+        * to uncached - not sure it's really worth bothering about
+        */
+       for (i = 0; i < (IA64_GRANULE_SIZE / PAGE_SIZE); i++)
+               SetPageUncached(&page[i]);
+
+       flush_tlb_kernel_range(tmp, tmp + IA64_GRANULE_SIZE);
+
+       status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL);
+
+       dprintk(KERN_INFO "pal_prefetch_visibility() returns %i on cpu %i\n",
+               status, get_cpu());
+
+       if (!status) {
+               status = smp_call_function(uncached_ipi_visibility, NULL, 0, 1);
+               if (status)
+                       printk(KERN_WARNING "smp_call_function failed for "
+                              "uncached_ipi_visibility! (%i)\n", status);
+       }
+
+       if (ia64_platform_is("sn2"))
+               sn_flush_all_caches((unsigned long)tmp, IA64_GRANULE_SIZE);
+       else
+               flush_icache_range((unsigned long)tmp,
+                                  (unsigned long)tmp+IA64_GRANULE_SIZE);
+
+       ia64_pal_mc_drain();
+       status = smp_call_function(uncached_ipi_mc_drain, NULL, 0, 1);
+       if (status)
+               printk(KERN_WARNING "smp_call_function failed for "
+                      "uncached_ipi_mc_drain! (%i)\n", status);
+
+       addr = (unsigned long)tmp - PAGE_OFFSET + __IA64_UNCACHED_OFFSET;
+
+       allocated_granules++;
+       return addr;
+}
+
+
+/*
+ * uncached_alloc_page
+ *
+ * Allocate 1 uncached page. Allocates on the requested node. If no
+ * uncached pages are available on the requested node, roundrobin starting
+ * with higher nodes.
+ */
+unsigned long
+uncached_alloc_page(int nid)
+{
+       unsigned long maddr;
+
+       maddr = gen_pool_alloc(uncached_pool[nid], PAGE_SIZE);
+
+       dprintk(KERN_DEBUG "uncached_alloc_page returns %lx on node %i\n",
+               maddr, nid);
+
+       /*
+        * If no memory is availble on our local node, try the
+        * remaining nodes in the system.
+        */
+       if (!maddr) {
+               int i;
+
+               for (i = MAX_NUMNODES - 1; i >= 0; i--) {
+                       if (i == nid || !node_online(i))
+                               continue;
+                       maddr = gen_pool_alloc(uncached_pool[i], PAGE_SIZE);
+                       dprintk(KERN_DEBUG "uncached_alloc_page alternate search "
+                               "returns %lx on node %i\n", maddr, i);
+                       if (maddr) {
+                               break;
+                       }
+               }
+       }
+
+       return maddr;
+}
+EXPORT_SYMBOL(uncached_alloc_page);
+
+
+/*
+ * uncached_free_page
+ *
+ * Free a single uncached page.
+ */
+void
+uncached_free_page(unsigned long maddr)
+{
+       int node;
+
+       node = nasid_to_cnodeid(NASID_GET(maddr));
+
+       dprintk(KERN_DEBUG "uncached_free_page(%lx) on node %i\n", maddr, node);
+
+       if ((maddr & (0XFUL << 60)) != __IA64_UNCACHED_OFFSET)
+               panic("uncached_free_page invalid address %lx\n", maddr);
+
+       gen_pool_free(uncached_pool[node], maddr, PAGE_SIZE);
+}
+EXPORT_SYMBOL(uncached_free_page);
+
+
+/*
+ * uncached_build_memmap,
+ *
+ * Called at boot time to build a map of pages that can be used for
+ * memory special operations.
+ */
+static int __init
+uncached_build_memmap(unsigned long start, unsigned long end, void *arg)
+{
+       long length;
+       unsigned long vstart, vend;
+       int node;
+
+       length = end - start;
+       vstart = start + __IA64_UNCACHED_OFFSET;
+       vend = end + __IA64_UNCACHED_OFFSET;
+
+       dprintk(KERN_ERR "uncached_build_memmap(%lx %lx)\n", start, end);
+
+       memset((char *)vstart, 0, length);
+
+       node = nasid_to_cnodeid(NASID_GET(start));
+
+       for (; vstart < vend ; vstart += PAGE_SIZE) {
+               dprintk(KERN_INFO "sticking %lx into the pool!\n", vstart);
+               gen_pool_free(uncached_pool[node], vstart, PAGE_SIZE);
+       }
+
+       return 0;
+}
+
+
+static int __init uncached_init(void) {
+       int i;
+
+       for (i = 0; i < MAX_NUMNODES; i++) {
+               if (!node_online(i))
+                       continue;
+               uncached_pool[i] = gen_pool_create(0, IA64_GRANULE_SHIFT,
+                                                  &uncached_get_new_chunk, i);
+       }
+
+       efi_memmap_walk_uc(uncached_build_memmap);
+
+       return 0;
+}
+
+__initcall(uncached_init);
index df08ae7634b61d2efadf065e246c4bfb7f342b2c..e0a776a3044c89f5614de6e2284c6a338cda6170 100644 (file)
@@ -24,7 +24,7 @@
 
 unsigned int hpage_shift=HPAGE_SHIFT_DEFAULT;
 
-static pte_t *
+pte_t *
 huge_pte_alloc (struct mm_struct *mm, unsigned long addr)
 {
        unsigned long taddr = htlbpage_to_page(addr);
@@ -43,7 +43,7 @@ huge_pte_alloc (struct mm_struct *mm, unsigned long addr)
        return pte;
 }
 
-static pte_t *
+pte_t *
 huge_pte_offset (struct mm_struct *mm, unsigned long addr)
 {
        unsigned long taddr = htlbpage_to_page(addr);
@@ -67,23 +67,6 @@ huge_pte_offset (struct mm_struct *mm, unsigned long addr)
 
 #define mk_pte_huge(entry) { pte_val(entry) |= _PAGE_P; }
 
-static void
-set_huge_pte (struct mm_struct *mm, struct vm_area_struct *vma,
-             struct page *page, pte_t * page_table, int write_access)
-{
-       pte_t entry;
-
-       add_mm_counter(mm, rss, HPAGE_SIZE / PAGE_SIZE);
-       if (write_access) {
-               entry =
-                   pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
-       } else
-               entry = pte_wrprotect(mk_pte(page, vma->vm_page_prot));
-       entry = pte_mkyoung(entry);
-       mk_pte_huge(entry);
-       set_pte(page_table, entry);
-       return;
-}
 /*
  * This function checks for proper alignment of input addr and len parameters.
  */
@@ -99,68 +82,6 @@ int is_aligned_hugepage_range(unsigned long addr, unsigned long len)
        return 0;
 }
 
-int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
-                       struct vm_area_struct *vma)
-{
-       pte_t *src_pte, *dst_pte, entry;
-       struct page *ptepage;
-       unsigned long addr = vma->vm_start;
-       unsigned long end = vma->vm_end;
-
-       while (addr < end) {
-               dst_pte = huge_pte_alloc(dst, addr);
-               if (!dst_pte)
-                       goto nomem;
-               src_pte = huge_pte_offset(src, addr);
-               entry = *src_pte;
-               ptepage = pte_page(entry);
-               get_page(ptepage);
-               set_pte(dst_pte, entry);
-               add_mm_counter(dst, rss, HPAGE_SIZE / PAGE_SIZE);
-               addr += HPAGE_SIZE;
-       }
-       return 0;
-nomem:
-       return -ENOMEM;
-}
-
-int
-follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma,
-                   struct page **pages, struct vm_area_struct **vmas,
-                   unsigned long *st, int *length, int i)
-{
-       pte_t *ptep, pte;
-       unsigned long start = *st;
-       unsigned long pstart;
-       int len = *length;
-       struct page *page;
-
-       do {
-               pstart = start & HPAGE_MASK;
-               ptep = huge_pte_offset(mm, start);
-               pte = *ptep;
-
-back1:
-               page = pte_page(pte);
-               if (pages) {
-                       page += ((start & ~HPAGE_MASK) >> PAGE_SHIFT);
-                       get_page(page);
-                       pages[i] = page;
-               }
-               if (vmas)
-                       vmas[i] = vma;
-               i++;
-               len--;
-               start += PAGE_SIZE;
-               if (((start & HPAGE_MASK) == pstart) && len &&
-                               (start < vma->vm_end))
-                       goto back1;
-       } while (len && start < vma->vm_end);
-       *length = len;
-       *st = start;
-       return i;
-}
-
 struct page *follow_huge_addr(struct mm_struct *mm, unsigned long addr, int write)
 {
        struct page *page;
@@ -212,81 +133,6 @@ void hugetlb_free_pgd_range(struct mmu_gather **tlb,
        free_pgd_range(tlb, addr, end, floor, ceiling);
 }
 
-void unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
-{
-       struct mm_struct *mm = vma->vm_mm;
-       unsigned long address;
-       pte_t *pte;
-       struct page *page;
-
-       BUG_ON(start & (HPAGE_SIZE - 1));
-       BUG_ON(end & (HPAGE_SIZE - 1));
-
-       for (address = start; address < end; address += HPAGE_SIZE) {
-               pte = huge_pte_offset(mm, address);
-               if (pte_none(*pte))
-                       continue;
-               page = pte_page(*pte);
-               put_page(page);
-               pte_clear(mm, address, pte);
-       }
-       add_mm_counter(mm, rss, - ((end - start) >> PAGE_SHIFT));
-       flush_tlb_range(vma, start, end);
-}
-
-int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
-{
-       struct mm_struct *mm = current->mm;
-       unsigned long addr;
-       int ret = 0;
-
-       BUG_ON(vma->vm_start & ~HPAGE_MASK);
-       BUG_ON(vma->vm_end & ~HPAGE_MASK);
-
-       spin_lock(&mm->page_table_lock);
-       for (addr = vma->vm_start; addr < vma->vm_end; addr += HPAGE_SIZE) {
-               unsigned long idx;
-               pte_t *pte = huge_pte_alloc(mm, addr);
-               struct page *page;
-
-               if (!pte) {
-                       ret = -ENOMEM;
-                       goto out;
-               }
-               if (!pte_none(*pte))
-                       continue;
-
-               idx = ((addr - vma->vm_start) >> HPAGE_SHIFT)
-                       + (vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT));
-               page = find_get_page(mapping, idx);
-               if (!page) {
-                       /* charge the fs quota first */
-                       if (hugetlb_get_quota(mapping)) {
-                               ret = -ENOMEM;
-                               goto out;
-                       }
-                       page = alloc_huge_page();
-                       if (!page) {
-                               hugetlb_put_quota(mapping);
-                               ret = -ENOMEM;
-                               goto out;
-                       }
-                       ret = add_to_page_cache(page, mapping, idx, GFP_ATOMIC);
-                       if (! ret) {
-                               unlock_page(page);
-                       } else {
-                               hugetlb_put_quota(mapping);
-                               page_cache_release(page);
-                               goto out;
-                       }
-               }
-               set_huge_pte(mm, vma, page, pte, vma->vm_flags & VM_WRITE);
-       }
-out:
-       spin_unlock(&mm->page_table_lock);
-       return ret;
-}
-
 unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
                unsigned long pgoff, unsigned long flags)
 {
index 547785e3cba2fb3e63a7a9c7dbd10931caf47bba..4eb2f52b87a16b436007740a56abaf79574d51fa 100644 (file)
@@ -305,8 +305,9 @@ setup_gate (void)
        struct page *page;
 
        /*
-        * Map the gate page twice: once read-only to export the ELF headers etc. and once
-        * execute-only page to enable privilege-promotion via "epc":
+        * Map the gate page twice: once read-only to export the ELF
+        * headers etc. and once execute-only page to enable
+        * privilege-promotion via "epc":
         */
        page = virt_to_page(ia64_imva(__start_gate_section));
        put_kernel_page(page, GATE_ADDR, PAGE_READONLY);
@@ -315,6 +316,20 @@ setup_gate (void)
        put_kernel_page(page, GATE_ADDR + PAGE_SIZE, PAGE_GATE);
 #else
        put_kernel_page(page, GATE_ADDR + PERCPU_PAGE_SIZE, PAGE_GATE);
+       /* Fill in the holes (if any) with read-only zero pages: */
+       {
+               unsigned long addr;
+
+               for (addr = GATE_ADDR + PAGE_SIZE;
+                    addr < GATE_ADDR + PERCPU_PAGE_SIZE;
+                    addr += PAGE_SIZE)
+               {
+                       put_kernel_page(ZERO_PAGE(0), addr,
+                                       PAGE_READONLY);
+                       put_kernel_page(ZERO_PAGE(0), addr + PERCPU_PAGE_SIZE,
+                                       PAGE_READONLY);
+               }
+       }
 #endif
        ia64_patch_gate();
 }
index 4fb44984afe61198a5f3c4c62795a6ced91eb265..44bfc7f318cbd611752fcede5459ee3182807191 100644 (file)
@@ -222,7 +222,7 @@ void __init early_sn_setup(void)
 
 extern int platform_intr_list[];
 extern nasid_t master_nasid;
-static int shub_1_1_found __initdata;
+static int __initdata shub_1_1_found = 0;
 
 /*
  * sn_check_for_wars
@@ -251,7 +251,7 @@ static void __init sn_check_for_wars(void)
        } else {
                for_each_online_node(cnode) {
                        if (is_shub_1_1(cnodeid_to_nasid(cnode)))
-                               sn_hub_info->shub_1_1_found = 1;
+                               shub_1_1_found = 1;
                }
        }
 }
@@ -271,6 +271,8 @@ void __init sn_setup(char **cmdline_p)
        int major = sn_sal_rev_major(), minor = sn_sal_rev_minor();
        extern void sn_cpu_init(void);
 
+       ia64_sn_plat_set_error_handling_features();
+
        /*
         * If the generic code has enabled vga console support - lets
         * get rid of it again. This is a kludge for the fact that ACPI
index ab9b5f35c2a72ba9bf6a398029e888dbeed3d129..a087b274847e52a265f94f473d707baa6d26fc89 100644 (file)
@@ -432,7 +432,7 @@ static int tiocx_reload(struct cx_dev *cx_dev)
        return cx_device_reload(cx_dev);
 }
 
-static ssize_t show_cxdev_control(struct device *dev, char *buf)
+static ssize_t show_cxdev_control(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct cx_dev *cx_dev = to_cx_dev(dev);
 
@@ -442,7 +442,7 @@ static ssize_t show_cxdev_control(struct device *dev, char *buf)
                       tiocx_btchar_get(cx_dev->cx_id.nasid));
 }
 
-static ssize_t store_cxdev_control(struct device *dev, const char *buf,
+static ssize_t store_cxdev_control(struct device *dev, struct device_attribute *attr, const char *buf,
                                   size_t count)
 {
        int n;
@@ -518,25 +518,22 @@ static int __init tiocx_init(void)
        return 0;
 }
 
-static void __exit tiocx_exit(void)
+static int cx_remove_device(struct device * dev, void * data)
 {
-       struct device *dev;
-       struct device *tdev;
+       struct cx_dev *cx_dev = to_cx_dev(dev);
+       device_remove_file(dev, &dev_attr_cxdev_control);
+       cx_device_unregister(cx_dev);
+       return 0;
+}
 
+static void __exit tiocx_exit(void)
+{
        DBG("tiocx_exit\n");
 
        /*
         * Unregister devices.
         */
-       list_for_each_entry_safe(dev, tdev, &tiocx_bus_type.devices.list,
-                                bus_list) {
-               if (dev) {
-                       struct cx_dev *cx_dev = to_cx_dev(dev);
-                       device_remove_file(dev, &dev_attr_cxdev_control);
-                       cx_device_unregister(cx_dev);
-               }
-       }
-
+       bus_for_each_dev(&tiocx_bus_type, NULL, NULL, cx_remove_device);
        bus_unregister(&tiocx_bus_type);
 }
 
index 2c3c4a8af553d181e5e772242e6df9442842f53a..cd7ed73f0e7ab73a87b37ea4d567810b511ecee9 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/cache.h>
 #include <linux/mmzone.h>
 #include <linux/nodemask.h>
+#include <asm/uncached.h>
 #include <asm/sn/bte.h>
 #include <asm/sn/intr.h>
 #include <asm/sn/sn_sal.h>
@@ -183,7 +184,7 @@ xpc_rsvd_page_init(void)
         * memory protections are never restricted.
         */
        if ((amos_page = xpc_vars->amos_page) == NULL) {
-               amos_page = (AMO_t *) mspec_kalloc_page(0);
+               amos_page = (AMO_t *) TO_AMO(uncached_alloc_page(0));
                if (amos_page == NULL) {
                        dev_err(xpc_part, "can't allocate page of AMOs\n");
                        return NULL;
@@ -200,7 +201,8 @@ xpc_rsvd_page_init(void)
                        if (ret != 0) {
                                dev_err(xpc_part, "can't change memory "
                                        "protections\n");
-                               mspec_kfree_page((unsigned long) amos_page);
+                               uncached_free_page(__IA64_UNCACHED_OFFSET |
+                                                  TO_PHYS((u64) amos_page));
                                return NULL;
                        }
                }
index 0d90ea58a0cb91223b611096ba99cfd444241511..64c133344afef7e90d6aefbdf6856f18c0760e36 100644 (file)
@@ -78,6 +78,9 @@ config PLAT_OAKS32R
 config PLAT_MAPPI2
        bool "Mappi-II(M3A-ZA36/M3A-ZA52)"
 
+config PLAT_MAPPI3
+       bool "Mappi-III(M3A-2170)"
+
 endchoice
 
 choice
@@ -134,6 +137,7 @@ config BUS_CLOCK
        int "Bus Clock [Hz] (integer)"
        default "70000000" if PLAT_MAPPI
        default "25000000" if PLAT_USRV
+       default "50000000" if PLAT_MAPPI3
        default "50000000" if PLAT_M32700UT
        default "50000000" if PLAT_OPSPUT
        default "33333333" if PLAT_OAKS32R
@@ -149,7 +153,7 @@ config CPU_LITTLE_ENDIAN
 
 config MEMORY_START
        hex "Physical memory start address (hex)"
-       default "08000000" if PLAT_MAPPI || PLAT_MAPPI2
+       default "08000000" if PLAT_MAPPI || PLAT_MAPPI2 || PLAT_MAPPI3
        default "08000000" if PLAT_USRV
        default "08000000" if PLAT_M32700UT
        default "08000000" if PLAT_OPSPUT
@@ -157,6 +161,7 @@ config MEMORY_START
 
 config MEMORY_SIZE
        hex "Physical memory size (hex)"
+       default "08000000" if PLAT_MAPPI3
        default "04000000" if PLAT_MAPPI || PLAT_MAPPI2
        default "02000000" if PLAT_USRV
        default "01000000" if PLAT_M32700UT
index bad5475eff90c17320b27aaad83f17dd3389ff81..8f9a57271f8345cfd61e43ec5968bdd086f6600a 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <linux/config.h>
+#include <asm/processor.h>
 
 static void putc(char c);
 
@@ -38,16 +39,17 @@ static int puts(const char *s)
 
 static void putc(char c)
 {
-
-       while ((*BOOT_SIO0STS & 0x3) != 0x3) ;
+       while ((*BOOT_SIO0STS & 0x3) != 0x3)
+               cpu_relax();
        if (c == '\n') {
                *BOOT_SIO0TXB = '\r';
-               while ((*BOOT_SIO0STS & 0x3) != 0x3) ;
+               while ((*BOOT_SIO0STS & 0x3) != 0x3)
+                       cpu_relax();
        }
        *BOOT_SIO0TXB = c;
 }
-#else /* defined(CONFIG_PLAT_M32700UT_Alpha) || defined(CONFIG_PLAT_M32700UT) */
-#ifdef CONFIG_MMU
+#else /* !(CONFIG_PLAT_M32700UT_Alpha) && !(CONFIG_PLAT_M32700UT) */
+#if defined(CONFIG_PLAT_MAPPI2)
 #define SIO0STS        (volatile unsigned short *)(0xa0efd000 + 14)
 #define SIO0TXB        (volatile unsigned short *)(0xa0efd000 + 30)
 #else
@@ -57,11 +59,12 @@ static void putc(char c)
 
 static void putc(char c)
 {
-
-       while ((*SIO0STS & 0x1) == 0) ;
+       while ((*SIO0STS & 0x1) == 0)
+               cpu_relax();
        if (c == '\n') {
                *SIO0TXB = '\r';
-               while ((*SIO0STS & 0x1) == 0) ;
+               while ((*SIO0STS & 0x1) == 0)
+                       cpu_relax();
        }
        *SIO0TXB = c;
 }
index 417c95ba87e96dd91c9393ed03afd1279d765564..853093093168e40bede4a8df4baa86dc0931af2f 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc4
-# Wed Feb 16 21:10:44 2005
+# Linux kernel version: 2.6.12-rc5
+# Fri Jun  3 16:20:11 2005
 #
 CONFIG_M32R=y
 # CONFIG_UID16 is not set
@@ -16,6 +16,7 @@ CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -28,13 +29,15 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=14
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 # CONFIG_IKCONFIG_PROC is not set
 CONFIG_EMBEDDED=y
 # CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -44,6 +47,7 @@ CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -65,6 +69,7 @@ CONFIG_PLAT_M32700UT=y
 # CONFIG_PLAT_OPSPUT is not set
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
+# CONFIG_PLAT_MAPPI3 is not set
 CONFIG_CHIP_M32700=y
 # CONFIG_CHIP_M32102 is not set
 # CONFIG_CHIP_VDEC2 is not set
@@ -268,7 +273,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -392,18 +396,6 @@ CONFIG_INPUT=y
 # CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_LIBPS2 is not set
-# CONFIG_SERIO_RAW is not set
-
 #
 # Input Device Drivers
 #
@@ -413,6 +405,17 @@ CONFIG_SERIO_SERPORT=y
 # 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=y
+# CONFIG_SERIO_LIBPS2 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+
 #
 # Character devices
 #
@@ -464,6 +467,10 @@ CONFIG_DS1302=y
 # CONFIG_SYNCLINK_CS is not set
 # CONFIG_RAW_DRIVER is not set
 
+#
+# TPM devices
+#
+
 #
 # I2C support
 #
@@ -508,8 +515,14 @@ CONFIG_VIDEO_M32R_AR_M64278=y
 # Graphics support
 #
 CONFIG_FB=y
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_SOFT_CURSOR is not set
+# CONFIG_FB_MACMODES is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -542,10 +555,6 @@ CONFIG_LOGO_LINUX_CLUT224=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
-
 #
 # USB Gadget Support
 #
@@ -719,8 +728,9 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_DEBUG_PREEMPT=y
+CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
 # CONFIG_FRAME_POINTER is not set
 
index cfd690bf6d8abc25b24b5acae048d07540339463..6c6b6c37663816f3e59ac520be02527252f731a3 100644 (file)
@@ -10,6 +10,7 @@ obj-y := process.o entry.o traps.o align.o irq.o setup.o time.o \
 obj-$(CONFIG_SMP)              += smp.o smpboot.o
 obj-$(CONFIG_PLAT_MAPPI)       += setup_mappi.o io_mappi.o
 obj-$(CONFIG_PLAT_MAPPI2)      += setup_mappi2.o io_mappi2.o
+obj-$(CONFIG_PLAT_MAPPI3)      += setup_mappi3.o io_mappi3.o
 obj-$(CONFIG_PLAT_USRV)                += setup_usrv.o io_usrv.o
 obj-$(CONFIG_PLAT_M32700UT)    += setup_m32700ut.o io_m32700ut.o
 obj-$(CONFIG_PLAT_OPSPUT)      += setup_opsput.o io_opsput.o
@@ -17,4 +18,3 @@ obj-$(CONFIG_MODULES)         += module.o
 obj-$(CONFIG_PLAT_OAKS32R)     += setup_oaks32r.o io_oaks32r.o
 
 EXTRA_AFLAGS   := -traditional
-
index 371ba904e96860a5f62099020459e639c8ca4c6e..e545b065f7e98e1f80f2a8f876b751aedd999ccb 100644 (file)
@@ -3,8 +3,8 @@
  *
  *  Typical I/O routines for M32700UT board.
  *
- *  Copyright (c) 2001, 2002  Hiroyuki Kondo, Hirokazu Takata,
- *                            Hitoshi Yamamoto, Takeo Takahashi
+ *  Copyright (c) 2001-2005  Hiroyuki Kondo, Hirokazu Takata,
+ *                           Hitoshi Yamamoto, Takeo Takahashi
  *
  *  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
@@ -172,64 +172,21 @@ unsigned long _inl(unsigned long port)
 
 unsigned char _inb_p(unsigned long port)
 {
-       unsigned char  v;
-
-       if (port >= LAN_IOSTART && port < LAN_IOEND)
-               v = _ne_inb(PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
-       if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
-               return *(volatile unsigned char *)__port2addr_ata(port);
-       } else
-#endif
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               unsigned char b;
-               pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0);
-               return b;
-       } else
-#endif
-               v = *(volatile unsigned char *)PORT2ADDR(port);
-
+       unsigned char v = _inb(port);
        delay();
        return (v);
 }
 
 unsigned short _inw_p(unsigned long port)
 {
-       unsigned short  v;
-
-       if (port >= LAN_IOSTART && port < LAN_IOEND)
-               v = _ne_inw(PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
-       if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
-               return *(volatile unsigned short *)__port2addr_ata(port);
-       } else
-#endif
-#if defined(CONFIG_USB)
-       if(port >= 0x340 && port < 0x3a0)
-               return *(volatile unsigned short *)PORT2ADDR_USB(port);
-       else
-#endif
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               unsigned short w;
-               pcc_ioread_word(0, port, &w, sizeof(w), 1, 0);
-               return w;
-       } else
-#endif
-               v = *(volatile unsigned short *)PORT2ADDR(port);
-
+       unsigned short v = _inw(port);
        delay();
        return (v);
 }
 
 unsigned long _inl_p(unsigned long port)
 {
-       unsigned long  v;
-
-       v = *(volatile unsigned long *)PORT2ADDR(port);
+       unsigned long v = _inl(port);
        delay();
        return (v);
 }
@@ -287,52 +244,19 @@ void _outl(unsigned long l, unsigned long port)
 
 void _outb_p(unsigned char b, unsigned long port)
 {
-       if (port >= LAN_IOSTART && port < LAN_IOEND)
-               _ne_outb(b, PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
-       if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
-               *(volatile unsigned char *)__port2addr_ata(port) = b;
-       } else
-#endif
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0);
-       } else
-#endif
-               *(volatile unsigned char *)PORT2ADDR(port) = b;
-
+       _outb(b, port);
        delay();
 }
 
 void _outw_p(unsigned short w, unsigned long port)
 {
-       if (port >= LAN_IOSTART && port < LAN_IOEND)
-               _ne_outw(w, PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
-       if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
-               *(volatile unsigned short *)__port2addr_ata(port) = w;
-       } else
-#endif
-#if defined(CONFIG_USB)
-       if(port >= 0x340 && port < 0x3a0)
-               *(volatile unsigned short *)PORT2ADDR_USB(port) = w;
-       else
-#endif
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0);
-       } else
-#endif
-               *(volatile unsigned short *)PORT2ADDR(port) = w;
-
+       _outw(w, port);
        delay();
 }
 
 void _outl_p(unsigned long l, unsigned long port)
 {
-       *(volatile unsigned long *)PORT2ADDR(port) = l;
+       _outl(l, port);
        delay();
 }
 
index 85688ffb52f93cd632041419c3634babc33e0b77..78033165fb5c7ecb489bb35a442654f8ce415ccc 100644 (file)
@@ -3,8 +3,8 @@
  *
  *  Typical I/O routines for Mappi board.
  *
- *  Copyright (c) 2001, 2002  Hiroyuki Kondo, Hirokazu Takata,
- *                            Hitoshi Yamamoto
+ *  Copyright (c) 2001-2005  Hiroyuki Kondo, Hirokazu Takata,
+ *                           Hitoshi Yamamoto
  */
 
 #include <linux/config.h>
@@ -130,57 +130,21 @@ unsigned long _inl(unsigned long port)
 
 unsigned char _inb_p(unsigned long port)
 {
-       unsigned char  v;
-
-       if (port >= 0x300 && port < 0x320)
-               v = _ne_inb(PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               unsigned char b;
-               pcc_ioread(0, port, &b, sizeof(b), 1, 0);
-               return b;
-       } else  if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) {
-               unsigned char b;
-               pcc_ioread(1, port, &b, sizeof(b), 1, 0);
-               return b;
-       } else
-#endif
-               v = *(volatile unsigned char *)PORT2ADDR(port);
-
+       unsigned char v = _inb(port);
        delay();
        return (v);
 }
 
 unsigned short _inw_p(unsigned long port)
 {
-       unsigned short  v;
-
-       if (port >= 0x300 && port < 0x320)
-               v = _ne_inw(PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               unsigned short w;
-               pcc_ioread(0, port, &w, sizeof(w), 1, 0);
-               return w;
-       } else  if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) {
-               unsigned short w;
-               pcc_ioread(1, port, &w, sizeof(w), 1, 0);
-               return w;
-       } else
-#endif
-               v = *(volatile unsigned short *)PORT2ADDR(port);
-
+       unsigned short v = _inw(port);
        delay();
        return (v);
 }
 
 unsigned long _inl_p(unsigned long port)
 {
-       unsigned long  v;
-
-       v = *(volatile unsigned long *)PORT2ADDR(port);
+       unsigned long v = _inl(port);
        delay();
        return (v);
 }
@@ -229,41 +193,19 @@ void _outl(unsigned long l, unsigned long port)
 
 void _outb_p(unsigned char b, unsigned long port)
 {
-       if (port >= 0x300 && port < 0x320)
-               _ne_outb(b, PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               pcc_iowrite(0, port, &b, sizeof(b), 1, 0);
-       } else  if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) {
-               pcc_iowrite(1, port, &b, sizeof(b), 1, 0);
-       } else
-#endif
-               *(volatile unsigned char *)PORT2ADDR(port) = b;
-
+       _outb(b, port);
        delay();
 }
 
 void _outw_p(unsigned short w, unsigned long port)
 {
-       if (port >= 0x300 && port < 0x320)
-               _ne_outw(w, PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               pcc_iowrite(0, port, &w, sizeof(w), 1, 0);
-       } else  if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) {
-               pcc_iowrite(1, port, &w, sizeof(w), 1, 0);
-       } else
-#endif
-               *(volatile unsigned short *)PORT2ADDR(port) = w;
-
+       _outw(w, port);
        delay();
 }
 
 void _outl_p(unsigned long l, unsigned long port)
 {
-       *(volatile unsigned long *)PORT2ADDR(port) = l;
+       _outl(l, port);
        delay();
 }
 
index 4182cd4f97c8a77a60ca636de368677059cbf792..5c03504bf65375646880da8f8eadd973fabbbf24 100644 (file)
@@ -3,7 +3,7 @@
  *
  *  Typical I/O routines for Mappi2 board.
  *
- *  Copyright (c) 2001-2003  Hiroyuki Kondo, Hirokazu Takata,
+ *  Copyright (c) 2001-2005  Hiroyuki Kondo, Hirokazu Takata,
  *                           Hitoshi Yamamoto, Mamoru Sakugawa
  */
 
@@ -25,7 +25,7 @@ extern void pcc_ioread_byte(int, unsigned long, void *, size_t, size_t, int);
 extern void pcc_ioread_word(int, unsigned long, void *, size_t, size_t, int);
 extern void pcc_iowrite_byte(int, unsigned long, void *, size_t, size_t, int);
 extern void pcc_iowrite_word(int, unsigned long, void *, size_t, size_t, int);
-#endif /* CONFIG_PCMCIA && CONFIG_MAPPI2_CFC */
+#endif /* CONFIG_PCMCIA && CONFIG_M32R_CFC */
 
 #define PORT2ADDR(port)      _port2addr(port)
 #define PORT2ADDR_NE(port)   _port2addr_ne(port)
@@ -169,64 +169,21 @@ unsigned long _inl(unsigned long port)
 
 unsigned char _inb_p(unsigned long port)
 {
-       unsigned char  v;
-
-       if (port >= LAN_IOSTART && port < LAN_IOEND)
-               v = _ne_inb(PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
-       if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
-               return *(volatile unsigned char *)__port2addr_ata(port);
-       } else
-#endif
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               unsigned char b;
-               pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0);
-               return b;
-       } else
-#endif
-               v = *(volatile unsigned char *)PORT2ADDR(port);
-
+       unsigned char v = _inb(port);
        delay();
        return (v);
 }
 
 unsigned short _inw_p(unsigned long port)
 {
-       unsigned short  v;
-
-       if (port >= LAN_IOSTART && port < LAN_IOEND)
-               v = _ne_inw(PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
-       if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
-               return *(volatile unsigned short *)__port2addr_ata(port);
-       } else
-#endif
-#if defined(CONFIG_USB)
-       if (port >= 0x340 && port < 0x3a0)
-               v = *(volatile unsigned short *)PORT2ADDR_USB(port);
-       else
-#endif
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               unsigned short w;
-               pcc_ioread_word(0, port, &w, sizeof(w), 1, 0);
-               return w;
-       } else
-#endif
-               v = *(volatile unsigned short *)PORT2ADDR(port);
-
+       unsigned short v = _inw(port);
        delay();
        return (v);
 }
 
 unsigned long _inl_p(unsigned long port)
 {
-       unsigned long  v;
-
-       v = *(volatile unsigned long *)PORT2ADDR(port);
+       unsigned long v = _inl(port);
        delay();
        return (v);
 }
@@ -284,52 +241,19 @@ void _outl(unsigned long l, unsigned long port)
 
 void _outb_p(unsigned char b, unsigned long port)
 {
-       if (port >= LAN_IOSTART && port < LAN_IOEND)
-               _ne_outb(b, PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
-       if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
-               *(volatile unsigned char *)__port2addr_ata(port) = b;
-       } else
-#endif
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0);
-       } else
-#endif
-               *(volatile unsigned char *)PORT2ADDR(port) = b;
-
+       _outb(b, port);
        delay();
 }
 
 void _outw_p(unsigned short w, unsigned long port)
 {
-       if (port >= LAN_IOSTART && port < LAN_IOEND)
-               _ne_outw(w, PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
-       if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
-               *(volatile unsigned short *)__port2addr_ata(port) = w;
-       } else
-#endif
-#if defined(CONFIG_USB)
-         if (port >= 0x340 && port < 0x3a0)
-               *(volatile unsigned short *)PORT2ADDR_USB(port) = w;
-       else
-#endif
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0);
-       } else
-#endif
-               *(volatile unsigned short *)PORT2ADDR(port) = w;
-
+       _outw(w, port);
        delay();
 }
 
 void _outl_p(unsigned long l, unsigned long port)
 {
-       *(volatile unsigned long *)PORT2ADDR(port) = l;
+       _outl(l, port);
        delay();
 }
 
diff --git a/arch/m32r/kernel/io_mappi3.c b/arch/m32r/kernel/io_mappi3.c
new file mode 100644 (file)
index 0000000..c80bde6
--- /dev/null
@@ -0,0 +1,378 @@
+/*
+ *  linux/arch/m32r/kernel/io_mappi3.c
+ *
+ *  Typical I/O routines for Mappi3 board.
+ *
+ *  Copyright (c) 2001-2005  Hiroyuki Kondo, Hirokazu Takata,
+ *                           Hitoshi Yamamoto, Mamoru Sakugawa
+ */
+
+#include <linux/config.h>
+#include <asm/m32r.h>
+#include <asm/page.h>
+#include <asm/io.h>
+#include <asm/byteorder.h>
+
+#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
+#include <linux/types.h>
+
+#define M32R_PCC_IOMAP_SIZE 0x1000
+
+#define M32R_PCC_IOSTART0 0x1000
+#define M32R_PCC_IOEND0   (M32R_PCC_IOSTART0 + M32R_PCC_IOMAP_SIZE - 1)
+
+extern void pcc_ioread_byte(int, unsigned long, void *, size_t, size_t, int);
+extern void pcc_ioread_word(int, unsigned long, void *, size_t, size_t, int);
+extern void pcc_iowrite_byte(int, unsigned long, void *, size_t, size_t, int);
+extern void pcc_iowrite_word(int, unsigned long, void *, size_t, size_t, int);
+#endif /* CONFIG_PCMCIA && CONFIG_M32R_CFC */
+
+#define PORT2ADDR(port)      _port2addr(port)
+#define PORT2ADDR_NE(port)   _port2addr_ne(port)
+#define PORT2ADDR_USB(port)  _port2addr_usb(port)
+
+static inline void *_port2addr(unsigned long port)
+{
+       return (void *)(port + NONCACHE_OFFSET);
+}
+
+#define LAN_IOSTART    0x300
+#define LAN_IOEND      0x320
+
+#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
+static inline void *__port2addr_ata(unsigned long port)
+{
+       static int      dummy_reg;
+
+       switch (port) {
+       case 0x1f0:     return (void *)0xb4002000;
+       case 0x1f1:     return (void *)0xb4012800;
+       case 0x1f2:     return (void *)0xb4012002;
+       case 0x1f3:     return (void *)0xb4012802;
+       case 0x1f4:     return (void *)0xb4012004;
+       case 0x1f5:     return (void *)0xb4012804;
+       case 0x1f6:     return (void *)0xb4012006;
+       case 0x1f7:     return (void *)0xb4012806;
+       case 0x3f6:     return (void *)0xb401200e;
+       default:        return (void *)&dummy_reg;
+       }
+}
+#endif
+
+static inline void *_port2addr_ne(unsigned long port)
+{
+       return (void *)(port + NONCACHE_OFFSET + 0x10000000);
+}
+
+static inline void *_port2addr_usb(unsigned long port)
+{
+       return (void *)(port + NONCACHE_OFFSET + 0x12000000);
+}
+static inline void delay(void)
+{
+       __asm__ __volatile__ ("push r0; \n\t pop r0;" : : :"memory");
+}
+
+/*
+ * NIC I/O function
+ */
+
+static inline unsigned char _ne_inb(void *portp)
+{
+       return (unsigned char) *(volatile unsigned char *)portp;
+}
+
+static inline unsigned short _ne_inw(void *portp)
+{
+       return (unsigned short)le16_to_cpu(*(volatile unsigned short *)portp);
+}
+
+static inline void _ne_insb(void *portp, void * addr, unsigned long count)
+{
+       unsigned char *buf = addr;
+
+       while (count--)
+               *buf++ = *(volatile unsigned char *)portp;
+}
+
+static inline void _ne_outb(unsigned char b, void *portp)
+{
+       *(volatile unsigned char *)portp = (unsigned char)b;
+}
+
+static inline void _ne_outw(unsigned short w, void *portp)
+{
+       *(volatile unsigned short *)portp = cpu_to_le16(w);
+}
+
+unsigned char _inb(unsigned long port)
+{
+       if (port >= LAN_IOSTART && port < LAN_IOEND)
+               return _ne_inb(PORT2ADDR_NE(port));
+#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
+       else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
+               return *(volatile unsigned char *)__port2addr_ata(port);
+       }
+#endif
+#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
+       else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
+               unsigned char b;
+               pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0);
+               return b;
+       } else
+#endif
+       return *(volatile unsigned char *)PORT2ADDR(port);
+}
+
+unsigned short _inw(unsigned long port)
+{
+       if (port >= LAN_IOSTART && port < LAN_IOEND)
+               return _ne_inw(PORT2ADDR_NE(port));
+#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
+       else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
+               return *(volatile unsigned short *)__port2addr_ata(port);
+       }
+#endif
+#if defined(CONFIG_USB)
+       else if (port >= 0x340 && port < 0x3a0)
+               return *(volatile unsigned short *)PORT2ADDR_USB(port);
+#endif
+
+#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
+       else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
+               unsigned short w;
+               pcc_ioread_word(0, port, &w, sizeof(w), 1, 0);
+               return w;
+       } else
+#endif
+       return *(volatile unsigned short *)PORT2ADDR(port);
+}
+
+unsigned long _inl(unsigned long port)
+{
+#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
+       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
+               unsigned long l;
+               pcc_ioread_word(0, port, &l, sizeof(l), 1, 0);
+               return l;
+       } else
+#endif
+       return *(volatile unsigned long *)PORT2ADDR(port);
+}
+
+unsigned char _inb_p(unsigned long port)
+{
+       unsigned char v = _inb(port);
+       delay();
+       return (v);
+}
+
+unsigned short _inw_p(unsigned long port)
+{
+       unsigned short v = _inw(port);
+       delay();
+       return (v);
+}
+
+unsigned long _inl_p(unsigned long port)
+{
+       unsigned long v = _inl(port);
+       delay();
+       return (v);
+}
+
+void _outb(unsigned char b, unsigned long port)
+{
+       if (port >= LAN_IOSTART && port < LAN_IOEND)
+               _ne_outb(b, PORT2ADDR_NE(port));
+       else
+#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
+       if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
+               *(volatile unsigned char *)__port2addr_ata(port) = b;
+       } else
+#endif
+#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
+       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
+               pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0);
+       } else
+#endif
+               *(volatile unsigned char *)PORT2ADDR(port) = b;
+}
+
+void _outw(unsigned short w, unsigned long port)
+{
+       if (port >= LAN_IOSTART && port < LAN_IOEND)
+               _ne_outw(w, PORT2ADDR_NE(port));
+       else
+#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
+       if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
+               *(volatile unsigned short *)__port2addr_ata(port) = w;
+       } else
+#endif
+#if defined(CONFIG_USB)
+       if (port >= 0x340 && port < 0x3a0)
+               *(volatile unsigned short *)PORT2ADDR_USB(port) = w;
+       else
+#endif
+#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
+       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
+               pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0);
+       } else
+#endif
+               *(volatile unsigned short *)PORT2ADDR(port) = w;
+}
+
+void _outl(unsigned long l, unsigned long port)
+{
+#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
+       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
+               pcc_iowrite_word(0, port, &l, sizeof(l), 1, 0);
+       } else
+#endif
+       *(volatile unsigned long *)PORT2ADDR(port) = l;
+}
+
+void _outb_p(unsigned char b, unsigned long port)
+{
+       _outb(b, port);
+       delay();
+}
+
+void _outw_p(unsigned short w, unsigned long port)
+{
+       _outw(w, port);
+       delay();
+}
+
+void _outl_p(unsigned long l, unsigned long port)
+{
+       _outl(l, port);
+       delay();
+}
+
+void _insb(unsigned int port, void * addr, unsigned long count)
+{
+       if (port >= LAN_IOSTART && port < LAN_IOEND)
+               _ne_insb(PORT2ADDR_NE(port), addr, count);
+#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
+       else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
+               unsigned char *buf = addr;
+               unsigned char *portp = __port2addr_ata(port);
+               while (count--)
+                       *buf++ = *(volatile unsigned char *)portp;
+       }
+#endif
+#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
+       else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
+               pcc_ioread_byte(0, port, (void *)addr, sizeof(unsigned char),
+                               count, 1);
+       }
+#endif
+       else {
+               unsigned char *buf = addr;
+               unsigned char *portp = PORT2ADDR(port);
+               while (count--)
+                       *buf++ = *(volatile unsigned char *)portp;
+       }
+}
+
+void _insw(unsigned int port, void * addr, unsigned long count)
+{
+       unsigned short *buf = addr;
+       unsigned short *portp;
+
+       if (port >= LAN_IOSTART && port < LAN_IOEND) {
+               portp = PORT2ADDR_NE(port);
+               while (count--)
+                       *buf++ = *(volatile unsigned short *)portp;
+#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
+       } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
+               pcc_ioread_word(9, port, (void *)addr, sizeof(unsigned short),
+                               count, 1);
+#endif
+#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
+       } else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
+               portp = __port2addr_ata(port);
+               while (count--)
+                       *buf++ = *(volatile unsigned short *)portp;
+#endif
+       } else {
+               portp = PORT2ADDR(port);
+               while (count--)
+                       *buf++ = *(volatile unsigned short *)portp;
+       }
+}
+
+void _insl(unsigned int port, void * addr, unsigned long count)
+{
+       unsigned long *buf = addr;
+       unsigned long *portp;
+
+       portp = PORT2ADDR(port);
+       while (count--)
+               *buf++ = *(volatile unsigned long *)portp;
+}
+
+void _outsb(unsigned int port, const void * addr, unsigned long count)
+{
+       const unsigned char *buf = addr;
+       unsigned char *portp;
+
+       if (port >= LAN_IOSTART && port < LAN_IOEND) {
+               portp = PORT2ADDR_NE(port);
+               while (count--)
+                       _ne_outb(*buf++, portp);
+#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
+       } else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
+               portp = __port2addr_ata(port);
+               while (count--)
+                       *(volatile unsigned char *)portp = *buf++;
+#endif
+#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
+       } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
+               pcc_iowrite_byte(0, port, (void *)addr, sizeof(unsigned char),
+                                count, 1);
+#endif
+       } else {
+               portp = PORT2ADDR(port);
+               while (count--)
+                       *(volatile unsigned char *)portp = *buf++;
+       }
+}
+
+void _outsw(unsigned int port, const void * addr, unsigned long count)
+{
+       const unsigned short *buf = addr;
+       unsigned short *portp;
+
+       if (port >= LAN_IOSTART && port < LAN_IOEND) {
+               portp = PORT2ADDR_NE(port);
+               while (count--)
+                       *(volatile unsigned short *)portp = *buf++;
+#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
+       } else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
+               portp = __port2addr_ata(port);
+               while (count--)
+                       *(volatile unsigned short *)portp = *buf++;
+#endif
+#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
+       } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
+               pcc_iowrite_word(9, port, (void *)addr, sizeof(unsigned short),
+                                count, 1);
+#endif
+       } else {
+               portp = PORT2ADDR(port);
+               while (count--)
+                       *(volatile unsigned short *)portp = *buf++;
+       }
+}
+
+void _outsl(unsigned int port, const void * addr, unsigned long count)
+{
+       const unsigned long *buf = addr;
+       unsigned char *portp;
+
+       portp = PORT2ADDR(port);
+       while (count--)
+               *(volatile unsigned long *)portp = *buf++;
+}
index 286964794d5158bc58e666c0cbf8664a92781db4..9997dddd24d7ea8584bc5e66ae579b5249aca3e8 100644 (file)
@@ -3,7 +3,7 @@
  *
  *  Typical I/O routines for OAKS32R board.
  *
- *  Copyright (c) 2001-2004  Hiroyuki Kondo, Hirokazu Takata,
+ *  Copyright (c) 2001-2005  Hiroyuki Kondo, Hirokazu Takata,
  *                           Hitoshi Yamamoto, Mamoru Sakugawa
  */
 
@@ -90,35 +90,21 @@ unsigned long _inl(unsigned long port)
 
 unsigned char _inb_p(unsigned long port)
 {
-       unsigned char  v;
-
-       if (port >= 0x300 && port < 0x320)
-               v = _ne_inb(PORT2ADDR_NE(port));
-       else
-               v = *(volatile unsigned char *)PORT2ADDR(port);
-
+       unsigned char v = _inb(port);
        delay();
        return (v);
 }
 
 unsigned short _inw_p(unsigned long port)
 {
-       unsigned short  v;
-
-       if (port >= 0x300 && port < 0x320)
-               v = _ne_inw(PORT2ADDR_NE(port));
-       else
-               v = *(volatile unsigned short *)PORT2ADDR(port);
-
+       unsigned short v = _inw(port);
        delay();
        return (v);
 }
 
 unsigned long _inl_p(unsigned long port)
 {
-       unsigned long  v;
-
-       v = *(volatile unsigned long *)PORT2ADDR(port);
+       unsigned long v = _inl(port);
        delay();
        return (v);
 }
@@ -146,27 +132,19 @@ void _outl(unsigned long l, unsigned long port)
 
 void _outb_p(unsigned char b, unsigned long port)
 {
-       if (port >= 0x300 && port < 0x320)
-               _ne_outb(b, PORT2ADDR_NE(port));
-       else
-               *(volatile unsigned char *)PORT2ADDR(port) = b;
-
+       _outb(b, port);
        delay();
 }
 
 void _outw_p(unsigned short w, unsigned long port)
 {
-       if (port >= 0x300 && port < 0x320)
-               _ne_outw(w, PORT2ADDR_NE(port));
-       else
-               *(volatile unsigned short *)PORT2ADDR(port) = w;
-
+       _outw(w, port);
        delay();
 }
 
 void _outl_p(unsigned long l, unsigned long port)
 {
-       *(volatile unsigned long *)PORT2ADDR(port) = l;
+       _outl(l, port);
        delay();
 }
 
index aaf42f9f76dab13ce73e37c0e3d23de9482fa54e..e34951e8156fe227e431fcad50289edf638653df 100644 (file)
@@ -1,10 +1,10 @@
 /*
- *  linux/arch/m32r/kernel/io_mappi.c
+ *  linux/arch/m32r/kernel/io_opsput.c
  *
  *  Typical I/O routines for OPSPUT board.
  *
- *  Copyright (c) 2001, 2002  Hiroyuki Kondo, Hirokazu Takata,
- *                            Hitoshi Yamamoto, Takeo Takahashi
+ *  Copyright (c) 2001-2005  Hiroyuki Kondo, Hirokazu Takata,
+ *                           Hitoshi Yamamoto, Takeo Takahashi
  *
  *  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
@@ -98,7 +98,6 @@ unsigned char _inb(unsigned long port)
 {
        if (port >= LAN_IOSTART && port < LAN_IOEND)
                return _ne_inb(PORT2ADDR_NE(port));
-
 #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
        else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
                unsigned char b;
@@ -118,7 +117,6 @@ unsigned short _inw(unsigned long port)
        else if(port >= 0x340 && port < 0x3a0)
                return *(volatile unsigned short *)PORT2ADDR_USB(port);
 #endif
-
 #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
        else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
                unsigned short w;
@@ -143,55 +141,21 @@ unsigned long _inl(unsigned long port)
 
 unsigned char _inb_p(unsigned long port)
 {
-       unsigned char  v;
-
-       if (port >= LAN_IOSTART && port < LAN_IOEND)
-               v = _ne_inb(PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               unsigned char b;
-               pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0);
-               return b;
-       } else
-#endif
-               v = *(volatile unsigned char *)PORT2ADDR(port);
-
+       unsigned char v = _inb(port);
        delay();
        return (v);
 }
 
 unsigned short _inw_p(unsigned long port)
 {
-       unsigned short  v;
-
-       if (port >= LAN_IOSTART && port < LAN_IOEND)
-               v = _ne_inw(PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_USB)
-       if(port >= 0x340 && port < 0x3a0)
-               return *(volatile unsigned short *)PORT2ADDR_USB(port);
-       else
-#endif
-
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               unsigned short w;
-               pcc_ioread_word(0, port, &w, sizeof(w), 1, 0);
-               return w;
-       } else
-#endif
-               v = *(volatile unsigned short *)PORT2ADDR(port);
-
+       unsigned short v = _inw(port);
        delay();
        return (v);
 }
 
 unsigned long _inl_p(unsigned long port)
 {
-       unsigned long  v;
-
-       v = *(volatile unsigned long *)PORT2ADDR(port);
+       unsigned long v = _inl(port);
        delay();
        return (v);
 }
@@ -219,7 +183,6 @@ void _outw(unsigned short w, unsigned long port)
                *(volatile unsigned short *)PORT2ADDR_USB(port) = w;
        else
 #endif
-
 #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
        if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
                pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0);
@@ -240,43 +203,19 @@ void _outl(unsigned long l, unsigned long port)
 
 void _outb_p(unsigned char b, unsigned long port)
 {
-       if (port >= LAN_IOSTART && port < LAN_IOEND)
-               _ne_outb(b, PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0);
-       } else
-#endif
-               *(volatile unsigned char *)PORT2ADDR(port) = b;
-
+       _outb(b, port);
        delay();
 }
 
 void _outw_p(unsigned short w, unsigned long port)
 {
-       if (port >= LAN_IOSTART && port < LAN_IOEND)
-               _ne_outw(w, PORT2ADDR_NE(port));
-       else
-#if defined(CONFIG_USB)
-       if(port >= 0x340 && port < 0x3a0)
-               *(volatile unsigned short *)PORT2ADDR_USB(port) = w;
-       else
-#endif
-
-#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
-       if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
-               pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0);
-       } else
-#endif
-               *(volatile unsigned short *)PORT2ADDR(port) = w;
-
+       _outw(w, port);
        delay();
 }
 
 void _outl_p(unsigned long l, unsigned long port)
 {
-       *(volatile unsigned long *)PORT2ADDR(port) = l;
+       _outl(l, port);
        delay();
 }
 
index 27928a0b99edf875450bf196e39d7e5435c5ce18..9eb161dcc1042ea86a0154a7ec2bc324773578cc 100644 (file)
@@ -3,8 +3,8 @@
  *
  *  Typical I/O routines for uServer board.
  *
- *  Copyright (c) 2001 - 2003  Hiroyuki Kondo, Hirokazu Takata,
- *                             Hitoshi Yamamoto, Takeo Takahashi
+ *  Copyright (c) 2001-2005  Hiroyuki Kondo, Hirokazu Takata,
+ *                           Hitoshi Yamamoto, Takeo Takahashi
  *
  *  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
@@ -39,7 +39,7 @@ extern void pcc_iowrite_word(int, unsigned long, void *, size_t, size_t, int);
 
 #define PORT2ADDR(port)        _port2addr(port)
 
-static __inline__ void *_port2addr(unsigned long port)
+static inline void *_port2addr(unsigned long port)
 {
 #if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE)
        if (port >= UART0_IOSTART && port <= UART0_IOEND)
@@ -50,7 +50,7 @@ static __inline__ void *_port2addr(unsigned long port)
        return (void *)(port + NONCACHE_OFFSET);
 }
 
-static __inline__ void delay(void)
+static inline void delay(void)
 {
        __asm__ __volatile__ ("push r0; \n\t pop r0;" : : :"memory");
 }
@@ -87,39 +87,22 @@ unsigned long _inl(unsigned long port)
 
 unsigned char _inb_p(unsigned long port)
 {
-       unsigned char b;
-
-       if (port >= CFC_IOSTART && port <= CFC_IOEND) {
-               pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0);
-               return b;
-       } else {
-               b = *(volatile unsigned char *)PORT2ADDR(port);
-               delay();
-               return b;
-       }
+       unsigned char v = _inb(port);
+       delay();
+       return v;
 }
 
 unsigned short _inw_p(unsigned long port)
 {
-       unsigned short w;
-
-       if (port >= CFC_IOSTART && port <= CFC_IOEND) {
-               pcc_ioread_word(0, port, &w, sizeof(w), 1, 0);
-               return w;
-       } else {
-               w = *(volatile unsigned short *)PORT2ADDR(port);
-               delay();
-               return w;
-       }
+       unsigned short v = _inw(port);
+       delay();
+       return v;
 }
 
 unsigned long _inl_p(unsigned long port)
 {
-       unsigned long v;
-
-       v = *(volatile unsigned long *)PORT2ADDR(port);
+       unsigned long v = _inl(port);
        delay();
-
        return v;
 }
 
@@ -149,25 +132,19 @@ void _outl(unsigned long l, unsigned long port)
 
 void _outb_p(unsigned char b, unsigned long port)
 {
-       if (port >= CFC_IOSTART && port <= CFC_IOEND)
-               pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0);
-       else
-               *(volatile unsigned char *)PORT2ADDR(port) = b;
+       _outb(b, port);
        delay();
 }
 
 void _outw_p(unsigned short w, unsigned long port)
 {
-       if (port >= CFC_IOSTART && port <= CFC_IOEND)
-               pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0);
-       else
-               *(volatile unsigned short *)PORT2ADDR(port) = w;
+       _outw(w, port);
        delay();
 }
 
 void _outl_p(unsigned long l, unsigned long port)
 {
-       *(volatile unsigned long *)PORT2ADDR(port) = l;
+       _outl(l, port);
        delay();
 }
 
index 4826cd6e40e8eef3bcdee95245fbec18db7868a5..ec5674727e7f148c0b42fc4224143223a726d9a6 100644 (file)
@@ -330,6 +330,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
        seq_printf(m, "Machine\t\t: Mappi Evaluation board\n");
 #elif CONFIG_PLAT_MAPPI2
        seq_printf(m, "Machine\t\t: Mappi-II Evaluation board\n");
+#elif CONFIG_PLAT_MAPPI3
+       seq_printf(m, "Machine\t\t: Mappi-III Evaluation board\n");
 #elif  CONFIG_PLAT_M32700UT
        seq_printf(m, "Machine\t\t: M32700UT Evaluation board\n");
 #elif  CONFIG_PLAT_OPSPUT
index 488aa87bab7666eeae74c6297ebcb73e0315ce4a..b014e2c1e524973a58f8adf7ecff122966446787 100644 (file)
@@ -78,13 +78,13 @@ static void shutdown_m32700ut_irq(unsigned int irq)
 
 static struct hw_interrupt_type m32700ut_irq_type =
 {
-       "M32700UT-IRQ",
-       startup_m32700ut_irq,
-       shutdown_m32700ut_irq,
-       enable_m32700ut_irq,
-       disable_m32700ut_irq,
-       mask_and_ack_m32700ut,
-       end_m32700ut_irq
+       .typename = "M32700UT-IRQ",
+       .startup = startup_m32700ut_irq,
+       .shutdown = shutdown_m32700ut_irq,
+       .enable = enable_m32700ut_irq,
+       .disable = disable_m32700ut_irq,
+       .ack = mask_and_ack_m32700ut,
+       .end = end_m32700ut_irq
 };
 
 /*
@@ -155,13 +155,13 @@ static void shutdown_m32700ut_pld_irq(unsigned int irq)
 
 static struct hw_interrupt_type m32700ut_pld_irq_type =
 {
-       "M32700UT-PLD-IRQ",
-       startup_m32700ut_pld_irq,
-       shutdown_m32700ut_pld_irq,
-       enable_m32700ut_pld_irq,
-       disable_m32700ut_pld_irq,
-       mask_and_ack_m32700ut_pld,
-       end_m32700ut_pld_irq
+       .typename = "M32700UT-PLD-IRQ",
+       .startup = startup_m32700ut_pld_irq,
+       .shutdown = shutdown_m32700ut_pld_irq,
+       .enable = enable_m32700ut_pld_irq,
+       .disable = disable_m32700ut_pld_irq,
+       .ack = mask_and_ack_m32700ut_pld,
+       .end = end_m32700ut_pld_irq
 };
 
 /*
@@ -224,13 +224,13 @@ static void shutdown_m32700ut_lanpld_irq(unsigned int irq)
 
 static struct hw_interrupt_type m32700ut_lanpld_irq_type =
 {
-       "M32700UT-PLD-LAN-IRQ",
-       startup_m32700ut_lanpld_irq,
-       shutdown_m32700ut_lanpld_irq,
-       enable_m32700ut_lanpld_irq,
-       disable_m32700ut_lanpld_irq,
-       mask_and_ack_m32700ut_lanpld,
-       end_m32700ut_lanpld_irq
+       .typename = "M32700UT-PLD-LAN-IRQ",
+       .startup = startup_m32700ut_lanpld_irq,
+       .shutdown = shutdown_m32700ut_lanpld_irq,
+       .enable = enable_m32700ut_lanpld_irq,
+       .disable = disable_m32700ut_lanpld_irq,
+       .ack = mask_and_ack_m32700ut_lanpld,
+       .end = end_m32700ut_lanpld_irq
 };
 
 /*
@@ -293,13 +293,13 @@ static void shutdown_m32700ut_lcdpld_irq(unsigned int irq)
 
 static struct hw_interrupt_type m32700ut_lcdpld_irq_type =
 {
-       "M32700UT-PLD-LCD-IRQ",
-       startup_m32700ut_lcdpld_irq,
-       shutdown_m32700ut_lcdpld_irq,
-       enable_m32700ut_lcdpld_irq,
-       disable_m32700ut_lcdpld_irq,
-       mask_and_ack_m32700ut_lcdpld,
-       end_m32700ut_lcdpld_irq
+       .typename = "M32700UT-PLD-LCD-IRQ",
+       .startup = startup_m32700ut_lcdpld_irq,
+       .shutdown = shutdown_m32700ut_lcdpld_irq,
+       .enable = enable_m32700ut_lcdpld_irq,
+       .disable = disable_m32700ut_lcdpld_irq,
+       .ack = mask_and_ack_m32700ut_lcdpld,
+       .end = end_m32700ut_lcdpld_irq
 };
 
 void __init init_IRQ(void)
index 1e74110f0670a19008d8632482f353c815b4f98d..aaf8e569b930267a45b4603fc351d58daae9f11e 100644 (file)
@@ -70,13 +70,13 @@ static void shutdown_mappi_irq(unsigned int irq)
 
 static struct hw_interrupt_type mappi_irq_type =
 {
-       "MAPPI-IRQ",
-       startup_mappi_irq,
-       shutdown_mappi_irq,
-       enable_mappi_irq,
-       disable_mappi_irq,
-       mask_and_ack_mappi,
-       end_mappi_irq
+       .typename = "MAPPI-IRQ",
+       .startup = startup_mappi_irq,
+       .shutdown = shutdown_mappi_irq,
+       .enable = enable_mappi_irq,
+       .disable = disable_mappi_irq,
+       .ack = mask_and_ack_mappi,
+       .end = end_mappi_irq
 };
 
 void __init init_IRQ(void)
index 1904d465a507cae133c8d9a919082422d4b9e83c..38d5e9a4142782ac201748ea4c3a0b52fae2865d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/arch/m32r/kernel/setup_mappi.c
+ *  linux/arch/m32r/kernel/setup_mappi2.c
  *
  *  Setup routines for Renesas MAPPI-II(M3A-ZA36) Board
  *
@@ -79,13 +79,13 @@ static void shutdown_mappi2_irq(unsigned int irq)
 
 static struct hw_interrupt_type mappi2_irq_type =
 {
-       "MAPPI2-IRQ",
-       startup_mappi2_irq,
-       shutdown_mappi2_irq,
-       enable_mappi2_irq,
-       disable_mappi2_irq,
-       mask_and_ack_mappi2,
-       end_mappi2_irq
+       .typename = "MAPPI2-IRQ",
+       .startup = startup_mappi2_irq,
+       .shutdown = shutdown_mappi2_irq,
+       .enable = enable_mappi2_irq,
+       .disable = disable_mappi2_irq,
+       .ack = mask_and_ack_mappi2,
+       .end = end_mappi2_irq
 };
 
 void __init init_IRQ(void)
@@ -156,7 +156,6 @@ void __init init_IRQ(void)
        irq_desc[PLD_IRQ_CFIREQ].handler = &mappi2_irq_type;
        irq_desc[PLD_IRQ_CFIREQ].action = 0;
        irq_desc[PLD_IRQ_CFIREQ].depth = 1;     /* disable nested irq */
-//     icu_data[PLD_IRQ_CFIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD00;
        icu_data[PLD_IRQ_CFIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01;
        disable_mappi2_irq(PLD_IRQ_CFIREQ);
 
@@ -167,7 +166,6 @@ void __init init_IRQ(void)
        irq_desc[PLD_IRQ_CFC_INSERT].action = 0;
        irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */
        icu_data[PLD_IRQ_CFC_INSERT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD00;
-//     icu_data[PLD_IRQ_CFC_INSERT].icucr = 0;
        disable_mappi2_irq(PLD_IRQ_CFC_INSERT);
 
        /* ICUCR42: CFC Eject */
@@ -176,9 +174,7 @@ void __init init_IRQ(void)
        irq_desc[PLD_IRQ_CFC_EJECT].action = 0;
        irq_desc[PLD_IRQ_CFC_EJECT].depth = 1;  /* disable nested irq */
        icu_data[PLD_IRQ_CFC_EJECT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10;
-//     icu_data[PLD_IRQ_CFC_EJECT].icucr = 0;
        disable_mappi2_irq(PLD_IRQ_CFC_EJECT);
-
 #endif /* CONFIG_MAPPI2_CFC */
 }
 
diff --git a/arch/m32r/kernel/setup_mappi3.c b/arch/m32r/kernel/setup_mappi3.c
new file mode 100644 (file)
index 0000000..3d60a85
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+ *  linux/arch/m32r/kernel/setup_mappi3.c
+ *
+ *  Setup routines for Renesas MAPPI-III(M3A-2170) Board
+ *
+ *  Copyright (c) 2001-2005   Hiroyuki Kondo, Hirokazu Takata,
+ *                            Hitoshi Yamamoto, Mamoru Sakugawa
+ */
+
+#include <linux/config.h>
+#include <linux/irq.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/device.h>
+
+#include <asm/system.h>
+#include <asm/m32r.h>
+#include <asm/io.h>
+
+#define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long)))
+
+#ifndef CONFIG_SMP
+typedef struct {
+       unsigned long icucr;  /* ICU Control Register */
+} icu_data_t;
+#endif /* CONFIG_SMP */
+
+icu_data_t icu_data[NR_IRQS];
+
+static void disable_mappi3_irq(unsigned int irq)
+{
+       unsigned long port, data;
+
+       if ((irq == 0) ||(irq >= NR_IRQS))  {
+               printk("bad irq 0x%08x\n", irq);
+               return;
+       }
+       port = irq2port(irq);
+       data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7;
+       outl(data, port);
+}
+
+static void enable_mappi3_irq(unsigned int irq)
+{
+       unsigned long port, data;
+
+       if ((irq == 0) ||(irq >= NR_IRQS))  {
+               printk("bad irq 0x%08x\n", irq);
+               return;
+       }
+       port = irq2port(irq);
+       data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6;
+       outl(data, port);
+}
+
+static void mask_and_ack_mappi3(unsigned int irq)
+{
+       disable_mappi3_irq(irq);
+}
+
+static void end_mappi3_irq(unsigned int irq)
+{
+       enable_mappi3_irq(irq);
+}
+
+static unsigned int startup_mappi3_irq(unsigned int irq)
+{
+       enable_mappi3_irq(irq);
+       return (0);
+}
+
+static void shutdown_mappi3_irq(unsigned int irq)
+{
+       unsigned long port;
+
+       port = irq2port(irq);
+       outl(M32R_ICUCR_ILEVEL7, port);
+}
+
+static struct hw_interrupt_type mappi3_irq_type =
+{
+       .typename = "MAPPI3-IRQ",
+       .startup = startup_mappi3_irq,
+       .shutdown = shutdown_mappi3_irq,
+       .enable = enable_mappi3_irq,
+       .disable = disable_mappi3_irq,
+       .ack = mask_and_ack_mappi3,
+       .end = end_mappi3_irq
+};
+
+void __init init_IRQ(void)
+{
+#if defined(CONFIG_SMC91X)
+       /* INT0 : LAN controller (SMC91111) */
+       irq_desc[M32R_IRQ_INT0].status = IRQ_DISABLED;
+       irq_desc[M32R_IRQ_INT0].handler = &mappi3_irq_type;
+       irq_desc[M32R_IRQ_INT0].action = 0;
+       irq_desc[M32R_IRQ_INT0].depth = 1;
+       icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10;
+       disable_mappi3_irq(M32R_IRQ_INT0);
+#endif  /* CONFIG_SMC91X */
+
+       /* MFT2 : system timer */
+       irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED;
+       irq_desc[M32R_IRQ_MFT2].handler = &mappi3_irq_type;
+       irq_desc[M32R_IRQ_MFT2].action = 0;
+       irq_desc[M32R_IRQ_MFT2].depth = 1;
+       icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN;
+       disable_mappi3_irq(M32R_IRQ_MFT2);
+
+#ifdef CONFIG_SERIAL_M32R_SIO
+       /* SIO0_R : uart receive data */
+       irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED;
+       irq_desc[M32R_IRQ_SIO0_R].handler = &mappi3_irq_type;
+       irq_desc[M32R_IRQ_SIO0_R].action = 0;
+       irq_desc[M32R_IRQ_SIO0_R].depth = 1;
+       icu_data[M32R_IRQ_SIO0_R].icucr = 0;
+       disable_mappi3_irq(M32R_IRQ_SIO0_R);
+
+       /* SIO0_S : uart send data */
+       irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED;
+       irq_desc[M32R_IRQ_SIO0_S].handler = &mappi3_irq_type;
+       irq_desc[M32R_IRQ_SIO0_S].action = 0;
+       irq_desc[M32R_IRQ_SIO0_S].depth = 1;
+       icu_data[M32R_IRQ_SIO0_S].icucr = 0;
+       disable_mappi3_irq(M32R_IRQ_SIO0_S);
+       /* SIO1_R : uart receive data */
+       irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED;
+       irq_desc[M32R_IRQ_SIO1_R].handler = &mappi3_irq_type;
+       irq_desc[M32R_IRQ_SIO1_R].action = 0;
+       irq_desc[M32R_IRQ_SIO1_R].depth = 1;
+       icu_data[M32R_IRQ_SIO1_R].icucr = 0;
+       disable_mappi3_irq(M32R_IRQ_SIO1_R);
+
+       /* SIO1_S : uart send data */
+       irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED;
+       irq_desc[M32R_IRQ_SIO1_S].handler = &mappi3_irq_type;
+       irq_desc[M32R_IRQ_SIO1_S].action = 0;
+       irq_desc[M32R_IRQ_SIO1_S].depth = 1;
+       icu_data[M32R_IRQ_SIO1_S].icucr = 0;
+       disable_mappi3_irq(M32R_IRQ_SIO1_S);
+#endif  /* CONFIG_M32R_USE_DBG_CONSOLE */
+
+#if defined(CONFIG_USB)
+       /* INT1 : USB Host controller interrupt */
+       irq_desc[M32R_IRQ_INT1].status = IRQ_DISABLED;
+       irq_desc[M32R_IRQ_INT1].handler = &mappi3_irq_type;
+       irq_desc[M32R_IRQ_INT1].action = 0;
+       irq_desc[M32R_IRQ_INT1].depth = 1;
+       icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_ISMOD01;
+       disable_mappi3_irq(M32R_IRQ_INT1);
+#endif /* CONFIG_USB */
+
+       /* ICUCR40: CFC IREQ */
+       irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED;
+       irq_desc[PLD_IRQ_CFIREQ].handler = &mappi3_irq_type;
+       irq_desc[PLD_IRQ_CFIREQ].action = 0;
+       irq_desc[PLD_IRQ_CFIREQ].depth = 1;     /* disable nested irq */
+       icu_data[PLD_IRQ_CFIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01;
+       disable_mappi3_irq(PLD_IRQ_CFIREQ);
+
+#if defined(CONFIG_M32R_CFC)
+       /* ICUCR41: CFC Insert */
+       irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED;
+       irq_desc[PLD_IRQ_CFC_INSERT].handler = &mappi3_irq_type;
+       irq_desc[PLD_IRQ_CFC_INSERT].action = 0;
+       irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */
+       icu_data[PLD_IRQ_CFC_INSERT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD00;
+       disable_mappi3_irq(PLD_IRQ_CFC_INSERT);
+
+       /* ICUCR42: CFC Eject */
+       irq_desc[PLD_IRQ_CFC_EJECT].status = IRQ_DISABLED;
+       irq_desc[PLD_IRQ_CFC_EJECT].handler = &mappi3_irq_type;
+       irq_desc[PLD_IRQ_CFC_EJECT].action = 0;
+       irq_desc[PLD_IRQ_CFC_EJECT].depth = 1;  /* disable nested irq */
+       icu_data[PLD_IRQ_CFC_EJECT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10;
+       disable_mappi3_irq(PLD_IRQ_CFC_EJECT);
+#endif /* CONFIG_M32R_CFC */
+}
+
+#define LAN_IOSTART     0x300
+#define LAN_IOEND       0x320
+static struct resource smc91x_resources[] = {
+       [0] = {
+               .start  = (LAN_IOSTART),
+               .end    = (LAN_IOEND),
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = M32R_IRQ_INT0,
+               .end    = M32R_IRQ_INT0,
+               .flags  = IORESOURCE_IRQ,
+       }
+};
+
+static struct platform_device smc91x_device = {
+       .name           = "smc91x",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(smc91x_resources),
+       .resource       = smc91x_resources,
+};
+
+static int __init platform_init(void)
+{
+       platform_device_register(&smc91x_device);
+       return 0;
+}
+arch_initcall(platform_init);
index b04834526c9a8a6311ace7897b13bc90487360d7..d656640badc98f091bedb9b29004903fb445cb9d 100644 (file)
@@ -70,13 +70,13 @@ static void shutdown_oaks32r_irq(unsigned int irq)
 
 static struct hw_interrupt_type oaks32r_irq_type =
 {
-       "OAKS32R-IRQ",
-       startup_oaks32r_irq,
-       shutdown_oaks32r_irq,
-       enable_oaks32r_irq,
-       disable_oaks32r_irq,
-       mask_and_ack_mappi,
-       end_oaks32r_irq
+       .typename = "OAKS32R-IRQ",
+       .startup = startup_oaks32r_irq,
+       .shutdown = shutdown_oaks32r_irq,
+       .enable = enable_oaks32r_irq,
+       .disable = disable_oaks32r_irq,
+       .ack = mask_and_ack_mappi,
+       .end = end_oaks32r_irq
 };
 
 void __init init_IRQ(void)
index 84315e344c58007e6e2e1ec155b06b0b5256f35e..86f4cf2a86c3ba6b4eb25c81aad7983aea924e0f 100644 (file)
@@ -79,13 +79,13 @@ static void shutdown_opsput_irq(unsigned int irq)
 
 static struct hw_interrupt_type opsput_irq_type =
 {
-       "OPSPUT-IRQ",
-       startup_opsput_irq,
-       shutdown_opsput_irq,
-       enable_opsput_irq,
-       disable_opsput_irq,
-       mask_and_ack_opsput,
-       end_opsput_irq
+       .typename = "OPSPUT-IRQ",
+       .startup = startup_opsput_irq,
+       .shutdown = shutdown_opsput_irq,
+       .enable = enable_opsput_irq,
+       .disable = disable_opsput_irq,
+       .ack = mask_and_ack_opsput,
+       .end = end_opsput_irq
 };
 
 /*
@@ -156,13 +156,13 @@ static void shutdown_opsput_pld_irq(unsigned int irq)
 
 static struct hw_interrupt_type opsput_pld_irq_type =
 {
-       "OPSPUT-PLD-IRQ",
-       startup_opsput_pld_irq,
-       shutdown_opsput_pld_irq,
-       enable_opsput_pld_irq,
-       disable_opsput_pld_irq,
-       mask_and_ack_opsput_pld,
-       end_opsput_pld_irq
+       .typename = "OPSPUT-PLD-IRQ",
+       .startup = startup_opsput_pld_irq,
+       .shutdown = shutdown_opsput_pld_irq,
+       .enable = enable_opsput_pld_irq,
+       .disable = disable_opsput_pld_irq,
+       .ack = mask_and_ack_opsput_pld,
+       .end = end_opsput_pld_irq
 };
 
 /*
index fe417be5e3e95c5e4ec8c9958761e3847282b3ac..634741bf9d355c736463b4cb0df4ab4245449485 100644 (file)
@@ -70,13 +70,13 @@ static void shutdown_mappi_irq(unsigned int irq)
 
 static struct hw_interrupt_type mappi_irq_type =
 {
-       "M32700-IRQ",
-       startup_mappi_irq,
-       shutdown_mappi_irq,
-       enable_mappi_irq,
-       disable_mappi_irq,
-       mask_and_ack_mappi,
-       end_mappi_irq
+       .typename = "M32700-IRQ",
+       .startup = startup_mappi_irq,
+       .shutdown = shutdown_mappi_irq,
+       .enable = enable_mappi_irq,
+       .disable = disable_mappi_irq,
+       .ack = mask_and_ack_mappi,
+       .end = end_mappi_irq
 };
 
 /*
@@ -143,13 +143,13 @@ static void shutdown_m32700ut_pld_irq(unsigned int irq)
 
 static struct hw_interrupt_type m32700ut_pld_irq_type =
 {
-       "USRV-PLD-IRQ",
-       startup_m32700ut_pld_irq,
-       shutdown_m32700ut_pld_irq,
-       enable_m32700ut_pld_irq,
-       disable_m32700ut_pld_irq,
-       mask_and_ack_m32700ut_pld,
-       end_m32700ut_pld_irq
+       .typename = "USRV-PLD-IRQ",
+       .startup = startup_m32700ut_pld_irq,
+       .shutdown = shutdown_m32700ut_pld_irq,
+       .enable = enable_m32700ut_pld_irq,
+       .disable = disable_m32700ut_pld_irq,
+       .ack = mask_and_ack_m32700ut_pld,
+       .end = end_m32700ut_pld_irq
 };
 
 void __init init_IRQ(void)
index 1c002181df7ffb245267c499240b08120cafc3c5..3e607d90b5f45b71af6cd34a907ecece49c5ecc1 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc4
-# Wed Feb 16 21:10:50 2005
+# Linux kernel version: 2.6.12-rc5
+# Fri Jun  3 16:20:58 2005
 #
 CONFIG_M32R=y
 # CONFIG_UID16 is not set
@@ -15,6 +15,7 @@ CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -27,13 +28,16 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=15
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 # CONFIG_IKCONFIG_PROC is not set
+# CONFIG_CPUSETS is not set
 CONFIG_EMBEDDED=y
 # CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -43,6 +47,7 @@ CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -65,6 +70,7 @@ CONFIG_PLAT_M32700UT=y
 # CONFIG_PLAT_OPSPUT is not set
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
+# CONFIG_PLAT_MAPPI3 is not set
 CONFIG_CHIP_M32700=y
 # CONFIG_CHIP_M32102 is not set
 # CONFIG_CHIP_VDEC2 is not set
@@ -271,7 +277,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -395,18 +400,6 @@ CONFIG_INPUT=y
 # CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_LIBPS2 is not set
-# CONFIG_SERIO_RAW is not set
-
 #
 # Input Device Drivers
 #
@@ -416,6 +409,17 @@ CONFIG_SERIO_SERPORT=y
 # 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=y
+# CONFIG_SERIO_LIBPS2 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+
 #
 # Character devices
 #
@@ -467,6 +471,10 @@ CONFIG_DS1302=y
 # CONFIG_SYNCLINK_CS is not set
 # CONFIG_RAW_DRIVER is not set
 
+#
+# TPM devices
+#
+
 #
 # I2C support
 #
@@ -511,8 +519,14 @@ CONFIG_VIDEO_M32R_AR_M64278=y
 # Graphics support
 #
 CONFIG_FB=y
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_SOFT_CURSOR is not set
+# CONFIG_FB_MACMODES is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -545,10 +559,6 @@ CONFIG_LOGO_LINUX_CLUT224=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
-
 #
 # USB Gadget Support
 #
@@ -722,8 +732,9 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_DEBUG_PREEMPT=y
+CONFIG_LOG_BUF_SHIFT=15
 # CONFIG_DEBUG_BUGVERBOSE is not set
 # CONFIG_FRAME_POINTER is not set
 
index 805357f7bda1661dce5c7810e8d2d5ea52a08a7c..2d3e7cda8f461e5f8a35a51e61f6ada8a006268e 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc4
-# Wed Feb 16 21:10:54 2005
+# Linux kernel version: 2.6.12-rc5
+# Fri Jun  3 16:21:34 2005
 #
 CONFIG_M32R=y
 # CONFIG_UID16 is not set
@@ -16,6 +16,7 @@ CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -28,13 +29,15 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=14
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 # CONFIG_IKCONFIG_PROC is not set
 CONFIG_EMBEDDED=y
 # CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -44,6 +47,7 @@ CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -65,6 +69,7 @@ CONFIG_PLAT_M32700UT=y
 # CONFIG_PLAT_OPSPUT is not set
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
+# CONFIG_PLAT_MAPPI3 is not set
 CONFIG_CHIP_M32700=y
 # CONFIG_CHIP_M32102 is not set
 # CONFIG_CHIP_VDEC2 is not set
@@ -268,7 +273,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -392,18 +396,6 @@ CONFIG_INPUT=y
 # CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_LIBPS2 is not set
-# CONFIG_SERIO_RAW is not set
-
 #
 # Input Device Drivers
 #
@@ -413,6 +405,17 @@ CONFIG_SERIO_SERPORT=y
 # 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=y
+# CONFIG_SERIO_LIBPS2 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+
 #
 # Character devices
 #
@@ -464,6 +467,10 @@ CONFIG_DS1302=y
 # CONFIG_SYNCLINK_CS is not set
 # CONFIG_RAW_DRIVER is not set
 
+#
+# TPM devices
+#
+
 #
 # I2C support
 #
@@ -508,8 +515,14 @@ CONFIG_VIDEO_M32R_AR_M64278=y
 # Graphics support
 #
 CONFIG_FB=y
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_SOFT_CURSOR is not set
+# CONFIG_FB_MACMODES is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -542,10 +555,6 @@ CONFIG_LOGO_LINUX_CLUT224=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
-
 #
 # USB Gadget Support
 #
@@ -719,8 +728,9 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_DEBUG_PREEMPT=y
+CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
 # CONFIG_FRAME_POINTER is not set
 
index 714aa6e7034cb41e349cb31ab0a4f2973a2b3472..a8425fba340b43a8cbe924bc35d71dd8177b7c16 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc4
-# Wed Feb 16 21:10:57 2005
+# Linux kernel version: 2.6.12-rc5
+# Fri Jun  3 16:21:46 2005
 #
 CONFIG_M32R=y
 # CONFIG_UID16 is not set
@@ -16,6 +16,7 @@ CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -26,13 +27,15 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=14
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 # CONFIG_IKCONFIG_PROC is not set
 CONFIG_EMBEDDED=y
 # CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -41,6 +44,7 @@ CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 CONFIG_TINY_SHMEM=y
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -62,6 +66,7 @@ CONFIG_PLAT_MAPPI=y
 # CONFIG_PLAT_OPSPUT is not set
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
+# CONFIG_PLAT_MAPPI3 is not set
 CONFIG_CHIP_M32700=y
 # CONFIG_CHIP_M32102 is not set
 # CONFIG_CHIP_VDEC2 is not set
@@ -202,7 +207,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -324,18 +328,6 @@ CONFIG_INPUT=y
 # CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_LIBPS2 is not set
-# CONFIG_SERIO_RAW is not set
-
 #
 # Input Device Drivers
 #
@@ -345,6 +337,17 @@ CONFIG_SERIO_SERPORT=y
 # 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=y
+# CONFIG_SERIO_LIBPS2 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+
 #
 # Character devices
 #
@@ -393,6 +396,10 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_SYNCLINK_CS is not set
 # CONFIG_RAW_DRIVER is not set
 
+#
+# TPM devices
+#
+
 #
 # I2C support
 #
@@ -433,10 +440,6 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
-
 #
 # USB Gadget Support
 #
@@ -595,8 +598,9 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_DEBUG_PREEMPT=y
+CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
 # CONFIG_FRAME_POINTER is not set
 
index 956a8e2f98d67a8a4c66d3fc392aebeb61ee6119..1a7f3cd4224667cc82e71f2e1ca4de92d0e85c2a 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc4
-# Wed Feb 16 21:11:02 2005
+# Linux kernel version: 2.6.12-rc5
+# Fri Jun  3 16:21:52 2005
 #
 CONFIG_M32R=y
 # CONFIG_UID16 is not set
@@ -17,6 +17,7 @@ CONFIG_EXPERIMENTAL=y
 CONFIG_BROKEN=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -28,13 +29,16 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=15
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
+# CONFIG_CPUSETS is not set
 CONFIG_EMBEDDED=y
 # CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -44,6 +48,7 @@ CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -66,6 +71,7 @@ CONFIG_PLAT_MAPPI=y
 # CONFIG_PLAT_OPSPUT is not set
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
+# CONFIG_PLAT_MAPPI3 is not set
 CONFIG_CHIP_M32700=y
 # CONFIG_CHIP_M32102 is not set
 # CONFIG_CHIP_VDEC2 is not set
@@ -139,8 +145,8 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 #
 CONFIG_MTD=y
 # CONFIG_MTD_DEBUG is not set
-CONFIG_MTD_PARTITIONS=y
 # CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
 CONFIG_MTD_REDBOOT_PARTS=y
 CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
 # CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
@@ -294,7 +300,6 @@ CONFIG_NET=y
 # Networking options
 #
 # CONFIG_PACKET is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -419,18 +424,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
 # CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_LIBPS2 is not set
-# CONFIG_SERIO_RAW is not set
-
 #
 # Input Device Drivers
 #
@@ -440,6 +433,17 @@ CONFIG_SERIO=y
 # 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 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+
 #
 # Character devices
 #
@@ -488,6 +492,10 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_SYNCLINK_CS is not set
 # CONFIG_RAW_DRIVER is not set
 
+#
+# TPM devices
+#
+
 #
 # I2C support
 #
@@ -528,10 +536,6 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
-
 #
 # USB Gadget Support
 #
@@ -708,8 +712,9 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_DEBUG_PREEMPT=y
+CONFIG_LOG_BUF_SHIFT=15
 # CONFIG_DEBUG_BUGVERBOSE is not set
 # CONFIG_FRAME_POINTER is not set
 
index c9253e94efbd565d5424f0e349811eecf71a504f..38910fb766926078b6cb7bf38b0c37b8b3ce3b45 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc4
-# Wed Feb 16 21:11:07 2005
+# Linux kernel version: 2.6.12-rc5
+# Fri Jun  3 16:21:59 2005
 #
 CONFIG_M32R=y
 # CONFIG_UID16 is not set
@@ -17,6 +17,7 @@ CONFIG_EXPERIMENTAL=y
 CONFIG_BROKEN=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -28,13 +29,15 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=14
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_EMBEDDED=y
 # CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -44,6 +47,7 @@ CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -65,6 +69,7 @@ CONFIG_PLAT_MAPPI=y
 # CONFIG_PLAT_OPSPUT is not set
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
+# CONFIG_PLAT_MAPPI3 is not set
 CONFIG_CHIP_M32700=y
 # CONFIG_CHIP_M32102 is not set
 # CONFIG_CHIP_VDEC2 is not set
@@ -135,8 +140,8 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 #
 CONFIG_MTD=y
 # CONFIG_MTD_DEBUG is not set
-CONFIG_MTD_PARTITIONS=y
 # CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
 CONFIG_MTD_REDBOOT_PARTS=y
 CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
 # CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
@@ -290,7 +295,6 @@ CONFIG_NET=y
 # Networking options
 #
 # CONFIG_PACKET is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -415,18 +419,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
 # CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_LIBPS2 is not set
-# CONFIG_SERIO_RAW is not set
-
 #
 # Input Device Drivers
 #
@@ -436,6 +428,17 @@ CONFIG_SERIO=y
 # 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 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+
 #
 # Character devices
 #
@@ -484,6 +487,10 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_SYNCLINK_CS is not set
 # CONFIG_RAW_DRIVER is not set
 
+#
+# TPM devices
+#
+
 #
 # I2C support
 #
@@ -524,10 +531,6 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
-
 #
 # USB Gadget Support
 #
@@ -704,8 +707,9 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_DEBUG_PREEMPT=y
+CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
 # CONFIG_FRAME_POINTER is not set
 
index c14791d27300d8e2a043f919aa49ea3b8bf0783d..56f287b658989cbf700afc53c4dd55b82080d2b5 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc4
-# Wed Feb 16 21:11:10 2005
+# Linux kernel version: 2.6.12-rc5
+# Fri Jun  3 16:22:02 2005
 #
 CONFIG_M32R=y
 # CONFIG_UID16 is not set
@@ -16,6 +16,7 @@ CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -28,13 +29,15 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=14
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 # CONFIG_IKCONFIG_PROC is not set
 CONFIG_EMBEDDED=y
 # CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -44,6 +47,7 @@ CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -65,6 +69,7 @@ CONFIG_KMOD=y
 # CONFIG_PLAT_OPSPUT is not set
 # CONFIG_PLAT_OAKS32R is not set
 CONFIG_PLAT_MAPPI2=y
+# CONFIG_PLAT_MAPPI3 is not set
 # CONFIG_CHIP_M32700 is not set
 # CONFIG_CHIP_M32102 is not set
 CONFIG_CHIP_VDEC2=y
@@ -264,7 +269,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -388,18 +392,6 @@ CONFIG_INPUT=y
 # CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_LIBPS2 is not set
-# CONFIG_SERIO_RAW is not set
-
 #
 # Input Device Drivers
 #
@@ -409,6 +401,17 @@ CONFIG_SERIO_SERPORT=y
 # 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=y
+# CONFIG_SERIO_LIBPS2 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+
 #
 # Character devices
 #
@@ -459,6 +462,10 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_SYNCLINK_CS is not set
 # CONFIG_RAW_DRIVER is not set
 
+#
+# TPM devices
+#
+
 #
 # I2C support
 #
@@ -520,10 +527,6 @@ CONFIG_DUMMY_CONSOLE=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
-
 #
 # USB Gadget Support
 #
@@ -697,8 +700,9 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_DEBUG_PREEMPT=y
+CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
 # CONFIG_FRAME_POINTER is not set
 
diff --git a/arch/m32r/mappi3/defconfig.smp b/arch/m32r/mappi3/defconfig.smp
new file mode 100644 (file)
index 0000000..2eebe75
--- /dev/null
@@ -0,0 +1,751 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.12-rc5
+# Tue May 31 17:55:34 2005
+#
+CONFIG_M32R=y
+# CONFIG_UID16 is not set
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_CLEAN_COMPILE is not set
+CONFIG_BROKEN=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_HOTPLUG=y
+CONFIG_KOBJECT_UEVENT=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+# CONFIG_CPUSETS is not set
+CONFIG_EMBEDDED=y
+# CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
+# CONFIG_FUTEX is not set
+# CONFIG_EPOLL is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SHMEM=y
+CONFIG_CC_ALIGN_FUNCTIONS=0
+CONFIG_CC_ALIGN_LABELS=0
+CONFIG_CC_ALIGN_LOOPS=0
+CONFIG_CC_ALIGN_JUMPS=0
+# 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_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
+
+#
+# Processor type and features
+#
+# CONFIG_PLAT_MAPPI is not set
+# CONFIG_PLAT_USRV is not set
+# CONFIG_PLAT_M32700UT is not set
+# CONFIG_PLAT_OPSPUT is not set
+# CONFIG_PLAT_OAKS32R is not set
+# CONFIG_PLAT_MAPPI2 is not set
+CONFIG_PLAT_MAPPI3=y
+CONFIG_CHIP_M32700=y
+# CONFIG_CHIP_M32102 is not set
+# CONFIG_CHIP_VDEC2 is not set
+# CONFIG_CHIP_OPSP is not set
+CONFIG_MMU=y
+CONFIG_TLB_ENTRIES=32
+CONFIG_ISA_M32R2=y
+CONFIG_ISA_DSP_LEVEL2=y
+CONFIG_ISA_DUAL_ISSUE=y
+CONFIG_BUS_CLOCK=10000000
+CONFIG_TIMER_DIVIDE=128
+# CONFIG_CPU_LITTLE_ENDIAN is not set
+CONFIG_MEMORY_START=0x08000000
+CONFIG_MEMORY_SIZE=0x08000000
+CONFIG_NOHIGHMEM=y
+CONFIG_DISCONTIGMEM=y
+CONFIG_IRAM_START=0x00f00000
+CONFIG_IRAM_SIZE=0x00080000
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_PREEMPT=y
+# CONFIG_HAVE_DEC_LOCK is not set
+CONFIG_SMP=y
+# CONFIG_CHIP_M32700_TS1 is not set
+CONFIG_NR_CPUS=2
+# CONFIG_NUMA is not set
+
+#
+# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+#
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=y
+# CONFIG_PCMCIA_DEBUG is not set
+CONFIG_PCMCIA=y
+
+#
+# PC-card bridges
+#
+# CONFIG_TCIC is not set
+# CONFIG_M32R_PCC is not set
+# CONFIG_M32R_CFC is not set
+
+#
+# PCI Hotplug Support
+#
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_REDBOOT_PARTS=y
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_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
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLKMTD is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CDROM_PKTCDVD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_BLK_DEV_IDEDISK=y
+# CONFIG_IDEDISK_MULTI_MODE is not set
+CONFIG_BLK_DEV_IDECS=y
+CONFIG_BLK_DEV_IDECD=m
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=y
+# CONFIG_IDE_ARM is not set
+# CONFIG_BLK_DEV_IDEDMA is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_SCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_PACKET is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER 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_TUNNEL is not set
+CONFIG_IP_TCPDIAG=y
+# CONFIG_IP_TCPDIAG_IPV6 is not set
+# CONFIG_IPV6 is not set
+# CONFIG_NETFILTER is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT 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
+# CONFIG_NET_CLS_ROUTE is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+CONFIG_SMC91X=y
+# CONFIG_NE2000 is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# PCMCIA network device support
+#
+# CONFIG_NET_PCMCIA is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_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 is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK 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 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+
+#
+# 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_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_M32R_SIO=y
+CONFIG_SERIAL_M32R_SIO_CONSOLE=y
+# CONFIG_SERIAL_M32R_PLDSIO is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_RTC 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_DRM is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+# CONFIG_FB is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR 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_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+
+#
+# XFS support
+#
+# CONFIG_XFS_FS is not set
+# CONFIG_MINIX_FS is not set
+CONFIG_ROMFS_FS=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+# CONFIG_JOLIET is not set
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
+CONFIG_DEVFS_FS=y
+CONFIG_DEVFS_MOUNT=y
+# CONFIG_DEVFS_DEBUG is not set
+# CONFIG_DEVPTS_FS_XATTR is not set
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_XATTR is not set
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# 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_JFFS_FS=y
+CONFIG_JFFS_FS_VERBOSE=0
+CONFIG_JFFS_PROC_FS=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# CONFIG_JFFS2_FS_NAND is not set
+# CONFIG_JFFS2_FS_NOR_ECC is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+# CONFIG_CRAMFS 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_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# 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
+
+#
+# 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 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_ASCII 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
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=15
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_FRAME_POINTER is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
diff --git a/arch/m32r/mappi3/dot.gdbinit b/arch/m32r/mappi3/dot.gdbinit
new file mode 100644 (file)
index 0000000..89c2218
--- /dev/null
@@ -0,0 +1,224 @@
+# .gdbinit file
+# $Id: dot.gdbinit,v 1.1 2005/04/11 02:21:08 sakugawa Exp $
+
+# setting
+set width 0d70
+set radix 0d16
+use_debug_dma
+
+# Initialize SDRAM controller for Mappi
+define sdram_init
+  # SDIR0
+  set *(unsigned long *)0x00ef6008 = 0x00000182
+  # SDIR1
+  set *(unsigned long *)0x00ef600c = 0x00000001
+  # Initialize wait
+  shell sleep 0.1
+  # MOD
+  set *(unsigned long *)0x00ef602c = 0x00000020
+  set *(unsigned long *)0x00ef604c = 0x00000020
+  # TR
+  set *(unsigned long *)0x00ef6028 = 0x00051502
+  set *(unsigned long *)0x00ef6048 = 0x00051502
+  # ADR
+  set *(unsigned long *)0x00ef6020 = 0x08000004
+  set *(unsigned long *)0x00ef6040 = 0x0c000004
+  # AutoRef On
+  set *(unsigned long *)0x00ef6004 = 0x00010517
+  # Access enable
+  set *(unsigned long *)0x00ef6024 = 0x00000001
+  set *(unsigned long *)0x00ef6044 = 0x00000001
+end
+
+# Initialize LAN controller for Mappi
+define lanc_init
+  # Set BSEL4
+  #set *(unsigned long *)0x00ef5004 = 0x0fff330f
+  #set *(unsigned long *)0x00ef5004 = 0x01113301
+
+#  set *(unsigned long *)0x00ef5004 = 0x02011101
+#  set *(unsigned long *)0x00ef5004 = 0x04441104
+end
+
+define clock_init
+  set *(unsigned long *)0x00ef4010 = 2
+  set *(unsigned long *)0x00ef4014 = 2
+  set *(unsigned long *)0x00ef4020 = 3
+  set *(unsigned long *)0x00ef4024 = 3
+  set *(unsigned long *)0x00ef4004 = 0x7
+#  shell sleep 0.1
+#  set *(unsigned long *)0x00ef4004 = 0x5
+  shell sleep 0.1
+  set *(unsigned long *)0x00ef4008 = 0x0200
+end
+
+define port_init
+  set $sfrbase = 0x00ef0000
+  set *(unsigned short *)0x00ef1060 = 0x5555
+  set *(unsigned short *)0x00ef1062 = 0x5555
+  set *(unsigned short *)0x00ef1064 = 0x5555
+  set *(unsigned short *)0x00ef1066 = 0x5555
+  set *(unsigned short *)0x00ef1068 = 0x5555
+  set *(unsigned short *)0x00ef106a = 0x0000
+  set *(unsigned short *)0x00ef106e = 0x5555
+  set *(unsigned short *)0x00ef1070 = 0x5555
+end
+
+# MMU enable
+define mmu_enable
+  set $evb=0x88000000
+  set *(unsigned long *)0xffff0024=1
+end
+
+# MMU disable
+define mmu_disable
+  set $evb=0
+  set *(unsigned long *)0xffff0024=0
+end
+
+# Show TLB entries
+define show_tlb_entries
+  set $i = 0
+  set $addr = $arg0
+  while ($i < 0d16 )
+    set $tlb_tag = *(unsigned long*)$addr
+    set $tlb_data = *(unsigned long*)($addr + 4)
+    printf " [%2d] 0x%08lx : 0x%08lx - 0x%08lx\n", $i, $addr, $tlb_tag, $tlb_data
+    set $i = $i + 1
+    set $addr = $addr + 8
+  end
+end
+define itlb
+  set $itlb=0xfe000000
+  show_tlb_entries $itlb
+end
+define dtlb
+  set $dtlb=0xfe000800
+  show_tlb_entries $dtlb
+end
+
+# Cache ON
+define set_cache_type
+  set $mctype = (void*)0xfffffff8
+# chaos
+# set *(unsigned long *)($mctype) = 0x0000c000
+# m32102 i-cache only
+  set *(unsigned long *)($mctype) = 0x00008000
+# m32102 d-cache only
+#  set *(unsigned long *)($mctype) = 0x00004000
+end
+define cache_on
+  set $param = (void*)0x08001000
+  set *(unsigned long *)($param) = 0x60ff6102
+end
+
+
+# Show current task structure
+define show_current
+  set $current = $spi & 0xffffe000
+  printf "$current=0x%08lX\n",$current
+  print *(struct task_struct *)$current
+end
+
+# Show user assigned task structure
+define show_task
+  set $task = $arg0 & 0xffffe000
+  printf "$task=0x%08lX\n",$task
+  print *(struct task_struct *)$task
+end
+document show_task
+  Show user assigned task structure
+  arg0 : task structure address
+end
+
+# Show M32R registers
+define show_regs
+  printf " R0[0x%08lX]   R1[0x%08lX]   R2[0x%08lX]   R3[0x%08lX]\n",$r0,$r1,$r2,$r3
+  printf " R4[0x%08lX]   R5[0x%08lX]   R6[0x%08lX]   R7[0x%08lX]\n",$r4,$r5,$r6,$r7
+  printf " R8[0x%08lX]   R9[0x%08lX]  R10[0x%08lX]  R11[0x%08lX]\n",$r8,$r9,$r10,$r11
+  printf "R12[0x%08lX]   FP[0x%08lX]   LR[0x%08lX]   SP[0x%08lX]\n",$r12,$fp,$lr,$sp
+  printf "PSW[0x%08lX]  CBR[0x%08lX]  SPI[0x%08lX]  SPU[0x%08lX]\n",$psw,$cbr,$spi,$spu
+  printf "BPC[0x%08lX]   PC[0x%08lX] ACCL[0x%08lX] ACCH[0x%08lX]\n",$bpc,$pc,$accl,$acch
+  printf "EVB[0x%08lX]\n",$evb
+
+  set $mests = *(unsigned long *)0xffff000c
+  set $mdeva = *(unsigned long *)0xffff0010
+  printf "MESTS[0x%08lX] MDEVA[0x%08lX]\n",$mests,$mdeva
+end
+
+
+# Setup all
+define setup
+  clock_init
+  shell sleep 0.1
+  port_init
+  sdram_init
+#  lanc_init
+#  dispc_init
+#  set $evb=0x08000000
+end
+
+# Load modules
+define load_modules
+  use_debug_dma
+  load
+#  load busybox.mot
+end
+
+# Set kernel parameters
+define set_kernel_parameters
+  set $param = (void*)0x08001000
+
+  ## MOUNT_ROOT_RDONLY
+  set {long}($param+0x00)=0
+  ## RAMDISK_FLAGS
+  #set {long}($param+0x04)=0
+  ## ORIG_ROOT_DEV
+  #set {long}($param+0x08)=0x00000100
+  ## LOADER_TYPE
+  #set {long}($param+0x0C)=0
+  ## INITRD_START
+  set {long}($param+0x10)=0x082a0000
+  ## INITRD_SIZE
+  set {long}($param+0x14)=0d6200000
+
+  # M32R_CPUCLK
+  set *(unsigned long *)($param + 0x0018) = 0d100000000
+  # M32R_BUSCLK
+  set *(unsigned long *)($param + 0x001c) = 0d50000000
+  # M32R_TIMER_DIVIDE
+  set *(unsigned long *)($param + 0x0020) = 0d128
+
+
+ set {char[0x200]}($param + 0x100) = "console=ttyS0,115200n8x root=/dev/nfsroot nfsroot=192.168.0.1:/project/m32r-linux/export/root.2.6_04 nfsaddrs=192.168.0.102:192.168.0.1:192.168.0.1:255.255.255.0:mappi: \0"
+
+
+end
+
+# Boot
+define boot
+  set_kernel_parameters
+  debug_chaos
+  set *(unsigned long *)0x00f00000=0x08002000
+  set $pc=0x08002000
+  set $fp=0
+  del b
+  si
+end
+
+# Restart
+define restart
+  sdireset
+  sdireset
+  setup
+  load_modules
+  boot
+end
+
+sdireset
+sdireset
+file vmlinux
+target m32rsdi
+
+restart
+boot
index 9a97363b65244e735c55f10fd02d513795b9e2be..1743f23d49a320a8d1e0dec3b63942d8c8475e80 100644 (file)
@@ -1,10 +1,8 @@
 /*
- * linux/arch/i386/mm/extable.c
+ * linux/arch/m32r/mm/extable.c
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
-#include <linux/spinlock.h>
 #include <asm/uaccess.h>
 
 int fixup_exception(struct pt_regs *regs)
@@ -19,4 +17,3 @@ int fixup_exception(struct pt_regs *regs)
 
        return 0;
 }
-
index f2da9be726e54291f092aca80e3efec4a82c9ab6..3f9fe519acb2413e62ccb26ac004c4ddcc616277 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc4
-# Wed Feb 16 21:11:13 2005
+# Linux kernel version: 2.6.12-rc5
+# Fri Jun  3 16:22:04 2005
 #
 CONFIG_M32R=y
 # CONFIG_UID16 is not set
@@ -16,6 +16,7 @@ CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -26,12 +27,14 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=14
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 # CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -40,6 +43,7 @@ CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 CONFIG_TINY_SHMEM=y
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -61,6 +65,7 @@ CONFIG_KMOD=y
 # CONFIG_PLAT_OPSPUT is not set
 CONFIG_PLAT_OAKS32R=y
 # CONFIG_PLAT_MAPPI2 is not set
+# CONFIG_PLAT_MAPPI3 is not set
 # CONFIG_CHIP_M32700 is not set
 CONFIG_CHIP_M32102=y
 # CONFIG_CHIP_VDEC2 is not set
@@ -91,10 +96,6 @@ CONFIG_PREEMPT=y
 #
 # CONFIG_PCCARD is not set
 
-#
-# PC-card bridges
-#
-
 #
 # PCI Hotplug Support
 #
@@ -193,7 +194,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -310,18 +310,6 @@ CONFIG_INPUT=y
 # CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_LIBPS2 is not set
-# CONFIG_SERIO_RAW is not set
-
 #
 # Input Device Drivers
 #
@@ -331,6 +319,17 @@ CONFIG_SERIO_SERPORT=y
 # 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=y
+# CONFIG_SERIO_LIBPS2 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+
 #
 # Character devices
 #
@@ -374,6 +373,10 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_DRM is not set
 # CONFIG_RAW_DRIVER is not set
 
+#
+# TPM devices
+#
+
 #
 # I2C support
 #
@@ -414,10 +417,6 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
-
 #
 # USB Gadget Support
 #
@@ -574,8 +573,9 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_DEBUG_PREEMPT=y
+CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
 # CONFIG_FRAME_POINTER is not set
 
index a87e1ea4c301b801a1e2215ee2163f960eb7a10f..66adec6a701adeba82cdf8a5fd9e69c2ef755d44 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc4
-# Wed Feb 16 21:11:41 2005
+# Linux kernel version: 2.6.12-rc5
+# Fri Jun  3 16:22:06 2005
 #
 CONFIG_M32R=y
 # CONFIG_UID16 is not set
@@ -15,6 +15,7 @@ CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -27,13 +28,15 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=14
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 # CONFIG_IKCONFIG_PROC is not set
 CONFIG_EMBEDDED=y
 # CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -43,6 +46,7 @@ CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -64,6 +68,7 @@ CONFIG_KMOD=y
 CONFIG_PLAT_OPSPUT=y
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
+# CONFIG_PLAT_MAPPI3 is not set
 # CONFIG_CHIP_M32700 is not set
 # CONFIG_CHIP_M32102 is not set
 # CONFIG_CHIP_VDEC2 is not set
@@ -243,7 +248,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -367,18 +371,6 @@ CONFIG_INPUT=y
 # CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_LIBPS2 is not set
-# CONFIG_SERIO_RAW is not set
-
 #
 # Input Device Drivers
 #
@@ -388,6 +380,17 @@ CONFIG_SERIO_SERPORT=y
 # 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=y
+# CONFIG_SERIO_LIBPS2 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+
 #
 # Character devices
 #
@@ -437,6 +440,10 @@ CONFIG_DS1302=y
 # CONFIG_SYNCLINK_CS is not set
 # CONFIG_RAW_DRIVER is not set
 
+#
+# TPM devices
+#
+
 #
 # I2C support
 #
@@ -477,10 +484,6 @@ CONFIG_DS1302=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
-
 #
 # USB Gadget Support
 #
@@ -654,8 +657,10 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 CONFIG_DEBUG_KERNEL=y
 # CONFIG_MAGIC_SYSRQ is not set
+CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
 # CONFIG_DEBUG_SPINLOCK is not set
index 7dbf997ff20525dd4ae6bf1ec2347a2a5c206b25..5649fbae430ebefeb525e529c5669bc45bfec929 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc2-m68k
-# Tue Apr  5 14:05:59 2005
+# Linux kernel version: 2.6.12-rc6-m68k
+# Tue Jun  7 20:34:23 2005
 #
 CONFIG_M68K=y
 CONFIG_MMU=y
@@ -35,6 +35,8 @@ CONFIG_KOBJECT_UEVENT=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -135,7 +137,6 @@ CONFIG_PARPORT_1284=y
 #
 CONFIG_AMIGA_FLOPPY=y
 CONFIG_AMIGA_Z2RAM=y
-# CONFIG_BLK_DEV_XD is not set
 # CONFIG_PARIDE is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
@@ -223,17 +224,12 @@ CONFIG_SCSI_CONSTANTS=y
 #
 # SCSI low-level drivers
 #
-# CONFIG_SCSI_7000FASST is not set
 # CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 is not set
 # CONFIG_SCSI_AIC7XXX_OLD is not set
 # CONFIG_SCSI_IN2000 is not set
 # CONFIG_SCSI_SATA is not set
-# CONFIG_SCSI_BUSLOGIC is not set
 # CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
 # CONFIG_SCSI_GENERIC_NCR5380 is not set
 # CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
 # CONFIG_SCSI_PPA is not set
@@ -244,7 +240,6 @@ CONFIG_SCSI_CONSTANTS=y
 # CONFIG_SCSI_QLOGIC_FAS is not set
 # CONFIG_SCSI_SYM53C416 is not set
 # CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_U14_34F is not set
 # CONFIG_SCSI_DEBUG is not set
 CONFIG_A3000_SCSI=y
 CONFIG_A2091_SCSI=y
@@ -492,7 +487,6 @@ CONFIG_HYDRA=m
 CONFIG_ZORRO8390=m
 CONFIG_APNE=m
 # CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_LANCE is not set
 # CONFIG_NET_VENDOR_SMC is not set
 # CONFIG_NET_VENDOR_RACAL is not set
 # CONFIG_AT1700 is not set
@@ -620,7 +614,6 @@ CONFIG_SERIO_SERPORT=m
 # CONFIG_SERIO_PARKBD is not set
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
index 505a2968e60446443cd9c0dc1b6240b4e29939e7..63024b0b7ac3a0d05c58f125602cf50653b1b7f8 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc2-m68k
-# Tue Apr  5 14:06:00 2005
+# Linux kernel version: 2.6.12-rc6-m68k
+# Tue Jun  7 20:34:27 2005
 #
 CONFIG_M68K=y
 CONFIG_MMU=y
@@ -35,6 +35,8 @@ CONFIG_KOBJECT_UEVENT=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -497,7 +499,6 @@ CONFIG_SERIO_SERPORT=m
 CONFIG_SERIO_LIBPS2=m
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
index 617aa73c3250dee5c93bcb9e00e51d7e6e805524..6433da2d2ce2ab65fcac9130869d9a0da76511d6 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc2-m68k
-# Tue Apr  5 14:06:18 2005
+# Linux kernel version: 2.6.12-rc6-m68k
+# Tue Jun  7 20:34:32 2005
 #
 CONFIG_M68K=y
 CONFIG_MMU=y
@@ -35,6 +35,8 @@ CONFIG_KOBJECT_UEVENT=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -531,7 +533,6 @@ CONFIG_SERIO_SERPORT=y
 CONFIG_SERIO_LIBPS2=y
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
index b501db51d9ec71c177fa994b9242019c19e6f820..da2a23a214632265c4b61c83c7c2f7ba2f474ece 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc2-m68k
-# Tue Apr  5 14:06:19 2005
+# Linux kernel version: 2.6.12-rc6-m68k
+# Tue Jun  7 20:34:37 2005
 #
 CONFIG_M68K=y
 CONFIG_MMU=y
@@ -35,6 +35,8 @@ CONFIG_KOBJECT_UEVENT=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -496,7 +498,6 @@ CONFIG_SERIO_SERPORT=m
 CONFIG_SERIO_LIBPS2=m
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
index 2bf6cef4f2b21e800c642ef5e5b442245ec133f3..51251883adf863c55442a268404748ccd1d1a0eb 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc2-m68k
-# Tue Apr  5 14:06:21 2005
+# Linux kernel version: 2.6.12-rc6-m68k
+# Tue Jun  7 20:34:41 2005
 #
 CONFIG_M68K=y
 CONFIG_MMU=y
@@ -35,6 +35,8 @@ CONFIG_KOBJECT_UEVENT=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -498,7 +500,6 @@ CONFIG_SERIO_SERPORT=m
 CONFIG_SERIO_LIBPS2=m
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
index 7074f856820c3971a81ed6908a9b1678c3e6897d..15b80abfe94a53e2462926f26d2417bed1113ceb 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc2-m68k
-# Tue Apr  5 14:06:24 2005
+# Linux kernel version: 2.6.12-rc6-m68k
+# Tue Jun  7 20:34:45 2005
 #
 CONFIG_M68K=y
 CONFIG_MMU=y
@@ -35,6 +35,8 @@ CONFIG_KOBJECT_UEVENT=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -540,7 +542,6 @@ CONFIG_SERIO_SERPORT=m
 CONFIG_SERIO_LIBPS2=m
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
index 61f09bc4846a2d56a0d7f0e2636274a151b70708..f0d5534f683087c6771ad41cfc11b39ee648d5a0 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc2-m68k
-# Tue Apr  5 14:06:28 2005
+# Linux kernel version: 2.6.12-rc6-m68k
+# Tue Jun  7 20:34:50 2005
 #
 CONFIG_M68K=y
 CONFIG_MMU=y
@@ -35,6 +35,8 @@ CONFIG_KOBJECT_UEVENT=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -498,7 +500,6 @@ CONFIG_SERIO_SERPORT=m
 CONFIG_SERIO_LIBPS2=m
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
index 69c01004ec412d1ade4ddadaf08c5eef6175f85e..1d5c46ff3c819d425c3a98a6bb05f5402b4e12f4 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc2-m68k
-# Tue Apr  5 14:06:31 2005
+# Linux kernel version: 2.6.12-rc6-m68k
+# Tue Jun  7 20:34:53 2005
 #
 CONFIG_M68K=y
 CONFIG_MMU=y
@@ -35,6 +35,8 @@ CONFIG_KOBJECT_UEVENT=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -497,7 +499,6 @@ CONFIG_SERIO_SERPORT=m
 CONFIG_SERIO_LIBPS2=m
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
index 550ec26006c1cdbbd0b7706fb6778319e659bd76..856238634d424ad3c9f62d88282e5b74f08bf1f9 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc2-m68k
-# Tue Apr  5 14:06:34 2005
+# Linux kernel version: 2.6.12-rc6-m68k
+# Tue Jun  7 20:34:58 2005
 #
 CONFIG_M68K=y
 CONFIG_MMU=y
@@ -35,6 +35,8 @@ CONFIG_KOBJECT_UEVENT=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -125,7 +127,6 @@ CONFIG_FW_LOADER=m
 # Block devices
 #
 # CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_XD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_CRYPTOLOOP=m
@@ -210,17 +211,12 @@ CONFIG_SCSI_CONSTANTS=y
 #
 # SCSI low-level drivers
 #
-# CONFIG_SCSI_7000FASST is not set
 # CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 is not set
 # CONFIG_SCSI_AIC7XXX_OLD is not set
 # CONFIG_SCSI_IN2000 is not set
 # CONFIG_SCSI_SATA is not set
-# CONFIG_SCSI_BUSLOGIC is not set
 # CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
 # CONFIG_SCSI_GENERIC_NCR5380 is not set
 # CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
 # CONFIG_SCSI_NCR53C406A is not set
@@ -229,7 +225,6 @@ CONFIG_SCSI_CONSTANTS=y
 # CONFIG_SCSI_QLOGIC_FAS is not set
 # CONFIG_SCSI_SYM53C416 is not set
 # CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_U14_34F is not set
 # CONFIG_SCSI_DEBUG is not set
 
 #
@@ -466,7 +461,6 @@ CONFIG_EQUALIZER=m
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=m
 # CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_LANCE is not set
 # CONFIG_NET_VENDOR_SMC is not set
 # CONFIG_NET_VENDOR_RACAL is not set
 # CONFIG_AT1700 is not set
@@ -570,7 +564,6 @@ CONFIG_SERIO_Q40KBD=m
 CONFIG_SERIO_LIBPS2=m
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
index 5b5a619645aad9abb69f1b203cf0677e09611dc1..af903b5c5708c8150ddba154ae96190eac314175 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc2-m68k
-# Tue Apr  5 14:06:37 2005
+# Linux kernel version: 2.6.12-rc6-m68k
+# Tue Jun  7 20:35:02 2005
 #
 CONFIG_M68K=y
 CONFIG_MMU=y
@@ -35,6 +35,8 @@ CONFIG_KOBJECT_UEVENT=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -171,7 +173,6 @@ CONFIG_SCSI_CONSTANTS=y
 #
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DEBUG is not set
-CONFIG_SUN3_SCSI=y
 
 #
 # Multi-device support (RAID and LVM)
@@ -487,7 +488,6 @@ CONFIG_SERIO_SERPORT=m
 CONFIG_SERIO_LIBPS2=m
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
index 704e42344cba19d47bb1e2a6752f6b2d4568b460..997143b7928adf71e6d3e4fc5e3559bdc8dd0045 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc2-m68k
-# Tue Apr  5 14:06:40 2005
+# Linux kernel version: 2.6.12-rc6-m68k
+# Tue Jun  7 20:35:06 2005
 #
 CONFIG_M68K=y
 CONFIG_MMU=y
@@ -35,6 +35,8 @@ CONFIG_KOBJECT_UEVENT=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -497,7 +499,6 @@ CONFIG_SERIO_SERPORT=m
 CONFIG_SERIO_LIBPS2=m
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
index 5b2296ecba8207db90c7ac996212763f1c3056af..7d935e48a9a88f8fc5d322bcebaf8b44cf837f0d 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc2-m68k
-# Tue Apr  5 14:05:31 2005
+# Linux kernel version: 2.6.12-rc6-m68k
+# Tue Jun  7 20:34:17 2005
 #
 CONFIG_M68K=y
 CONFIG_MMU=y
@@ -33,6 +33,8 @@ CONFIG_KOBJECT_UEVENT=y
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -355,7 +357,6 @@ CONFIG_SERIO_SERPORT=y
 CONFIG_SERIO_LIBPS2=y
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
index 2b6c9d32b7a6267754ab11b202317755a825a0b5..c4a33f265dc07e53577350d5366b3a936c8bc665 100644 (file)
@@ -45,11 +45,13 @@ asmlinkage void ret_from_fork(void);
  */
 void default_idle(void)
 {
-       while(1) {
-               if (need_resched())
-                       __asm__("stop #0x2000" : : : "cc");
-               schedule();
+       local_irq_disable();
+       while (!need_resched()) {
+               /* This stop will re-enable interrupts */
+               __asm__("stop #0x2000" : : : "cc");
+               local_irq_disable();
        }
+       local_irq_enable();
 }
 
 void (*idle)(void) = default_idle;
@@ -63,7 +65,12 @@ void (*idle)(void) = default_idle;
 void cpu_idle(void)
 {
        /* endless idle loop with no priority at all */
-       idle();
+       while (1) {
+               idle();
+               preempt_enable_no_resched();
+               schedule();
+               preempt_disable();
+       }
 }
 
 void machine_restart(char * __unused)
index b027ce7efbc67c2246a6cc21c0ecb56b4d01ae7e..73843c5287782f3ef74a6adaec316445c8e20764 100644 (file)
@@ -232,7 +232,6 @@ void __init mem_init(void)
 #ifdef CONFIG_LIMITED_DMA
                set_page_address(page, lowmem_page_address(page));
 #endif
-               set_bit(PG_highmem, &page->flags);
                set_page_count(page, 1);
                __free_page(page);
                totalhigh_pages++;
index c5f1043de9384c2f495705d0ff9c43fd670b8066..53166f3598b25fdd82cde85c1963fefa0e22c742 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  pmu.c, Power Management Unit routines for NEC VR4100 series.
  *
- *  Copyright (C) 2003-2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *  Copyright (C) 2003-2005  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
  *
  *  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
@@ -17,7 +17,9 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
+#include <linux/errno.h>
 #include <linux/init.h>
+#include <linux/ioport.h>
 #include <linux/kernel.h>
 #include <linux/smp.h>
 #include <linux/types.h>
 #include <asm/reboot.h>
 #include <asm/system.h>
 
-#define PMUCNT2REG     KSEG1ADDR(0x0f0000c6)
+#define PMU_TYPE1_BASE 0x0b0000a0UL
+#define PMU_TYPE1_SIZE 0x0eUL
+
+#define PMU_TYPE2_BASE 0x0f0000c0UL
+#define PMU_TYPE2_SIZE 0x10UL
+
+#define PMUCNT2REG     0x06
  #define SOFTRST       0x0010
 
+static void __iomem *pmu_base;
+
+#define pmu_read(offset)               readw(pmu_base + (offset))
+#define pmu_write(offset, value)       writew((value), pmu_base + (offset))
+
 static inline void software_reset(void)
 {
-       uint16_t val;
+       uint16_t pmucnt2;
 
        switch (current_cpu_data.cputype) {
        case CPU_VR4122:
        case CPU_VR4131:
        case CPU_VR4133:
-               val = readw(PMUCNT2REG);
-               val |= SOFTRST;
-               writew(val, PMUCNT2REG);
+               pmucnt2 = pmu_read(PMUCNT2REG);
+               pmucnt2 |= SOFTRST;
+               pmu_write(PMUCNT2REG, pmucnt2);
                break;
        default:
                break;
@@ -71,6 +84,34 @@ static void vr41xx_power_off(void)
 
 static int __init vr41xx_pmu_init(void)
 {
+       unsigned long start, size;
+
+       switch (current_cpu_data.cputype) {
+       case CPU_VR4111:
+       case CPU_VR4121:
+               start = PMU_TYPE1_BASE;
+               size = PMU_TYPE1_SIZE;
+               break;
+       case CPU_VR4122:
+       case CPU_VR4131:
+       case CPU_VR4133:
+               start = PMU_TYPE2_BASE;
+               size = PMU_TYPE2_SIZE;
+               break;
+       default:
+               printk("Unexpected CPU of NEC VR4100 series\n");
+               return -ENODEV;
+       }
+
+       if (request_mem_region(start, size, "PMU") == NULL)
+               return -EBUSY;
+
+       pmu_base = ioremap(start, size);
+       if (pmu_base == NULL) {
+               release_mem_region(start, size);
+               return -EBUSY;
+       }
+
        _machine_restart = vr41xx_restart;
        _machine_halt = vr41xx_halt;
        _machine_power_off = vr41xx_power_off;
@@ -78,4 +119,4 @@ static int __init vr41xx_pmu_init(void)
        return 0;
 }
 
-early_initcall(vr41xx_pmu_init);
+core_initcall(vr41xx_pmu_init);
index ebf186656afbd16bc2a0040990388462228704d6..d34bbe7ae0e3e9d192e73fe774702891bae98a6a 100644 (file)
@@ -466,7 +466,7 @@ static int parisc_generic_match(struct device *dev, struct device_driver *drv)
 }
 
 #define pa_dev_attr(name, field, format_string)                                \
-static ssize_t name##_show(struct device *dev, char *buf)              \
+static ssize_t name##_show(struct device *dev, struct device_attribute *attr, char *buf)               \
 {                                                                      \
        struct parisc_device *padev = to_parisc_device(dev);            \
        return sprintf(buf, format_string, padev->field);               \
index 600f23d7fd33aae9e5115875ada43a289e075b5d..10162b187bcf000a04897bc45cebefbe4d87c3b0 100644 (file)
@@ -826,11 +826,6 @@ config MPC10X_BRIDGE
        depends on PCORE || POWERPMC250 || LOPEC || SANDPOINT
        default y
 
-config FSL_OCP
-       bool
-       depends on MPC10X_BRIDGE
-       default y
-
 config MPC10X_OPENPIC
        bool
        depends on POWERPMC250 || LOPEC || SANDPOINT
@@ -1083,6 +1078,23 @@ source "drivers/zorro/Kconfig"
 
 source kernel/power/Kconfig
 
+config SECCOMP
+       bool "Enable seccomp to safely compute untrusted bytecode"
+       depends on PROC_FS
+       default y
+       help
+         This kernel feature is useful for number crunching applications
+         that may need to compute untrusted bytecode during their
+         execution. By using pipes or other transports made available to
+         the process as file descriptors supporting the read/write
+         syscalls, it's possible to isolate those applications in
+         their own address space using seccomp. Once seccomp is
+         enabled via /proc/<pid>/seccomp, it cannot be disabled
+         and the task is only allowed to execute a few safe syscalls
+         defined by each seccomp mode.
+
+         If unsure, say Y. Only embedded should say N here.
+
 endmenu
 
 config ISA_DMA_API
@@ -1143,12 +1155,12 @@ config PCI_QSPAN
 
 config PCI_8260
        bool
-       depends on PCI && 8260 && !8272
+       depends on PCI && 8260
        default y
 
 config 8260_PCI9
        bool "  Enable workaround for MPC826x erratum PCI 9"
-       depends on PCI_8260
+       depends on PCI_8260 && !ADS8272
        default y
 
 choice
index f850fb0fb5118be47d976291ee028697fbdeb688..c9ac5f5fa9e483d205172b4835c7a361ade172a1 100644 (file)
@@ -22,7 +22,8 @@ targets += uImage
 $(obj)/uImage: $(obj)/vmlinux.gz
        $(Q)rm -f $@
        $(call if_changed,uimage)
-       @echo '  Image: $@' $(if $(wildcard $@),'is ready','not made')
+       @echo -n '  Image: $@ '
+       @if [ -f $@ ]; then echo 'is ready' ; else echo 'not made'; fi
 
 # Files generated that shall be removed upon make clean
 clean-files    := sImage vmapus vmlinux* miboot* zImage* uImage
index 6ee602d8b6a08f1d2105332e4261e1a2c47516d0..9362193742aceecf5dd52110767f6cfb502acdd4 100644 (file)
@@ -58,9 +58,6 @@ SECTIONS
     *(.ramdisk)
     __ramdisk_end = .;
     . = ALIGN(4096);
-    __sysmap_begin = .;
-    *(.sysmap)
-    __sysmap_end = .;
     CONSTRUCTORS
   }
   _edata  =  .;
index 4eacbd8c772a7fb67833770ea4ab87884b952da5..03415238fabf67791bd084775aacf22997ff9370 100644 (file)
@@ -54,13 +54,10 @@ $(images)/ramdisk.image.gz:
        @echo '          RAM disk image must be provided separately'
        @/bin/false
 
-objcpxmon-$(CONFIG_XMON) := --add-section=.sysmap=System.map \
-       --set-section-flags=.sysmap=contents,alloc,load,readonly,data
 quiet_cmd_genimage = GEN     $@
       cmd_genimage = $(OBJCOPY) -R .comment       \
        --add-section=.image=$(images)/vmlinux.gz \
-       --set-section-flags=.image=contents,alloc,load,readonly,data \
-       $(objcpxmon-y) $< $@
+       --set-section-flags=.image=contents,alloc,load,readonly,data $< $@
 
 targets += image.o
 $(obj)/image.o: $(obj)/dummy.o $(images)/vmlinux.gz FORCE
index 9e6952781f1f03729c9500753ad07a0f79a08848..0f46756a903e3d38a5c1a539f4beed9dd986ce44 100644 (file)
@@ -15,7 +15,6 @@
 #include <asm/page.h>
 
 /* Information from the linker */
-extern char __sysmap_begin, __sysmap_end;
 
 extern int strcmp(const char *s1, const char *s2);
 extern char *avail_ram, *avail_high;
@@ -116,14 +115,8 @@ void gunzip(void *dst, int dstlen, unsigned char *src, int *lenp)
 void make_bi_recs(unsigned long addr, char *name, unsigned int mach,
                unsigned long progend)
 {
-       unsigned long sysmap_size;
        struct bi_record *rec;
 
-       /* Figure out the size of a possible System.map we're going to
-        * pass along.
-        * */
-       sysmap_size = (unsigned long)(&__sysmap_end) -
-               (unsigned long)(&__sysmap_begin);
 
        /* leave a 1MB gap then align to the next 1MB boundary */
        addr = _ALIGN(addr+ (1<<20) - 1, (1<<20));
@@ -147,15 +140,6 @@ void make_bi_recs(unsigned long addr, char *name, unsigned int mach,
        rec->size = sizeof(struct bi_record) + 2 * sizeof(unsigned long);
        rec = (struct bi_record *)((unsigned long)rec + rec->size);
 
-       if (sysmap_size) {
-               rec->tag = BI_SYSMAP;
-               rec->data[0] = (unsigned long)(&__sysmap_begin);
-               rec->data[1] = sysmap_size;
-               rec->size = sizeof(struct bi_record) + 2 *
-                       sizeof(unsigned long);
-               rec = (struct bi_record *)((unsigned long)rec + rec->size);
-       }
-
        rec->tag = BI_LAST;
        rec->size = sizeof(struct bi_record);
        rec = (struct bi_record *)((unsigned long)rec + rec->size);
index c28061ad5982eb7c89745a66f5b448a37f2b66ba..991b4cbb83c8953e14159d64e542f2fa98b5a75e 100644 (file)
@@ -203,7 +203,7 @@ $(obj)/zvmlinux: $(OBJS) $(LIBS) $(srctree)/$(boot)/ld.script \
                $(obj)/dummy.o $(obj)/image.o
        $(LD) $(LD_ARGS) -o $@ $(OBJS) $(obj)/image.o $(LIBS)
        $(OBJCOPY) $(OBJCOPY_ARGS) $@ $@ -R .comment -R .stab \
-               -R .stabstr -R .ramdisk -R .sysmap
+               -R .stabstr -R .ramdisk
 
 $(obj)/zvmlinux.initrd: $(OBJS) $(LIBS) $(srctree)/$(boot)/ld.script \
                $(images)/vmlinux.gz $(obj)/dummy.o
@@ -215,7 +215,7 @@ $(obj)/zvmlinux.initrd: $(OBJS) $(LIBS) $(srctree)/$(boot)/ld.script \
                $(obj)/dummy.o $(obj)/image.o
        $(LD) $(LD_ARGS) -o $@ $(OBJS) $(obj)/image.o $(LIBS)
        $(OBJCOPY) $(OBJCOPY_ARGS) $@ $@ -R .comment -R .stab \
-               -R .stabstr -R .sysmap
+               -R .stabstr
 
 # Sort-of dummy rules, that let us format the image we want.
 zImage: $(images)/$(zimage-y) $(obj)/zvmlinux
diff --git a/arch/ppc/boot/utils/addSystemMap.c b/arch/ppc/boot/utils/addSystemMap.c
deleted file mode 100644 (file)
index 4654f89..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <byteswap.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-void xlate( char * inb, char * trb, unsigned len )
-{
-    unsigned i;
-    for (  i=0; i<len; ++i ) {
-       char c = *inb++;
-       char c1 = c >> 4;
-       char c2 = c & 0xf;
-       if ( c1 > 9 )
-           c1 = c1 + 'A' - 10;
-       else
-           c1 = c1 + '0';
-       if ( c2 > 9 )
-           c2 = c2 + 'A' - 10;
-       else
-           c2 = c2 + '0';
-       *trb++ = c1;
-       *trb++ = c2;
-    }
-    *trb = 0;
-}
-
-#define ElfHeaderSize  (64 * 1024)
-#define ElfPages  (ElfHeaderSize / 4096)
-#define KERNELBASE (0xc0000000)
-
-void get4k( /*istream *inf*/FILE *file, char *buf )
-{
-    unsigned j;
-    unsigned num = fread(buf, 1, 4096, file);
-    for (  j=num; j<4096; ++j )
-       buf[j] = 0;
-}
-
-void put4k( /*ostream *outf*/FILE *file, char *buf )
-{
-    fwrite(buf, 1, 4096, file);
-}
-
-int main(int argc, char **argv)
-{
-    char inbuf[4096];
-    FILE *ramDisk = NULL;
-    FILE *inputVmlinux = NULL;
-    FILE *outputVmlinux = NULL;
-    unsigned i = 0;
-    unsigned long ramFileLen = 0;
-    unsigned long ramLen = 0;
-    unsigned long roundR = 0;
-    unsigned long kernelLen = 0;
-    unsigned long actualKernelLen = 0;
-    unsigned long round = 0;
-    unsigned long roundedKernelLen = 0;
-    unsigned long ramStartOffs = 0;
-    unsigned long ramPages = 0;
-    unsigned long roundedKernelPages = 0;
-    if ( argc < 2 ) {
-       printf("Name of System Map file missing.\n");
-       exit(1);
-    }
-
-    if ( argc < 3 ) {
-       printf("Name of vmlinux file missing.\n");
-       exit(1);
-    }
-
-    if ( argc < 4 ) {
-       printf("Name of vmlinux output file missing.\n");
-       exit(1);
-    }
-
-    ramDisk = fopen(argv[1], "r");
-    if ( ! ramDisk ) {
-       printf("System Map file \"%s\" failed to open.\n", argv[1]);
-       exit(1);
-    }
-    inputVmlinux = fopen(argv[2], "r");
-    if ( ! inputVmlinux ) {
-       printf("vmlinux file \"%s\" failed to open.\n", argv[2]);
-       exit(1);
-    }
-    outputVmlinux = fopen(argv[3], "w");
-    if ( ! outputVmlinux ) {
-       printf("output vmlinux file \"%s\" failed to open.\n", argv[3]);
-       exit(1);
-    }
-    fseek(ramDisk, 0, SEEK_END);
-    ramFileLen = ftell(ramDisk);
-    fseek(ramDisk, 0, SEEK_SET);
-    printf("%s file size = %ld\n", argv[1], ramFileLen);
-
-    ramLen = ramFileLen;
-
-    roundR = 4096 - (ramLen % 4096);
-    if ( roundR ) {
-       printf("Rounding System Map file up to a multiple of 4096, adding %ld\n", roundR);
-       ramLen += roundR;
-    }
-
-    printf("Rounded System Map size is %ld\n", ramLen);
-    fseek(inputVmlinux, 0, SEEK_END);
-    kernelLen = ftell(inputVmlinux);
-    fseek(inputVmlinux, 0, SEEK_SET);
-    printf("kernel file size = %ld\n", kernelLen);
-    if ( kernelLen == 0 ) {
-       printf("You must have a linux kernel specified as argv[2]\n");
-       exit(1);
-    }
-
-    actualKernelLen = kernelLen - ElfHeaderSize;
-
-    printf("actual kernel length (minus ELF header) = %ld\n", actualKernelLen);
-
-    round = actualKernelLen % 4096;
-    roundedKernelLen = actualKernelLen;
-    if ( round )
-       roundedKernelLen += (4096 - round);
-
-    printf("actual kernel length rounded up to a 4k multiple = %ld\n", roundedKernelLen);
-
-    ramStartOffs = roundedKernelLen;
-    ramPages = ramLen / 4096;
-
-    printf("System map pages to copy = %ld\n", ramPages);
-
-    // Copy 64K ELF header
-      for (i=0; i<(ElfPages); ++i) {
-         get4k( inputVmlinux, inbuf );
-         put4k( outputVmlinux, inbuf );
-      }
-
-
-
-    roundedKernelPages = roundedKernelLen / 4096;
-
-    fseek(inputVmlinux, ElfHeaderSize, SEEK_SET);
-
-    {
-       for ( i=0; i<roundedKernelPages; ++i ) {
-           get4k( inputVmlinux, inbuf );
-           if ( i == 0 ) {
-               unsigned long * p;
-               printf("Storing embedded_sysmap_start at 0x3c\n");
-               p = (unsigned long *)(inbuf + 0x3c);
-
-#if (BYTE_ORDER == __BIG_ENDIAN)
-               *p = ramStartOffs;
-#else
-               *p = bswap_32(ramStartOffs);
-#endif
-
-               printf("Storing embedded_sysmap_end at 0x44\n");
-               p = (unsigned long *)(inbuf + 0x44);
-#if (BYTE_ORDER == __BIG_ENDIAN)
-               *p = ramStartOffs + ramFileLen;
-#else
-               *p = bswap_32(ramStartOffs + ramFileLen);
-#endif
-           }
-           put4k( outputVmlinux, inbuf );
-       }
-    }
-
-    {
-       for ( i=0; i<ramPages; ++i ) {
-           get4k( ramDisk, inbuf );
-           put4k( outputVmlinux, inbuf );
-       }
-    }
-
-
-    fclose(ramDisk);
-    fclose(inputVmlinux);
-    fclose(outputVmlinux);
-    /* Set permission to executable */
-    chmod(argv[3], S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH);
-
-    return 0;
-
-}
-
diff --git a/arch/ppc/configs/mpc8548_cds_defconfig b/arch/ppc/configs/mpc8548_cds_defconfig
new file mode 100644 (file)
index 0000000..abe034f
--- /dev/null
@@ -0,0 +1,659 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.12-rc4
+# Tue May 24 22:36:27 2005
+#
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_HAVE_DEC_LOCK=y
+CONFIG_PPC=y
+CONFIG_PPC32=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+# CONFIG_HOTPLUG is not set
+CONFIG_KOBJECT_UEVENT=y
+# CONFIG_IKCONFIG is not set
+CONFIG_EMBEDDED=y
+# CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+# CONFIG_EPOLL is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SHMEM=y
+CONFIG_CC_ALIGN_FUNCTIONS=0
+CONFIG_CC_ALIGN_LABELS=0
+CONFIG_CC_ALIGN_LOOPS=0
+CONFIG_CC_ALIGN_JUMPS=0
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Processor
+#
+# CONFIG_6xx is not set
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_POWER3 is not set
+# CONFIG_POWER4 is not set
+# CONFIG_8xx is not set
+CONFIG_E500=y
+CONFIG_BOOKE=y
+CONFIG_FSL_BOOKE=y
+# CONFIG_PHYS_64BIT is not set
+CONFIG_SPE=y
+CONFIG_MATH_EMULATION=y
+# CONFIG_CPU_FREQ is not set
+# CONFIG_PM is not set
+CONFIG_85xx=y
+CONFIG_PPC_INDIRECT_PCI_BE=y
+
+#
+# Freescale 85xx options
+#
+# CONFIG_MPC8540_ADS is not set
+CONFIG_MPC8548_CDS=y
+# CONFIG_MPC8555_CDS is not set
+# CONFIG_MPC8560_ADS is not set
+# CONFIG_SBC8560 is not set
+# CONFIG_STX_GP3 is not set
+CONFIG_MPC8548=y
+
+#
+# Platform options
+#
+# CONFIG_SMP is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_HIGHMEM is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_CMDLINE_BOOL is not set
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+# CONFIG_PCI is not set
+# CONFIG_PCI_DOMAINS is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Advanced setup
+#
+# CONFIG_ADVANCED_OPTIONS is not set
+
+#
+# Default settings for advanced configuration options are used
+#
+CONFIG_HIGHMEM_START=0xfe000000
+CONFIG_LOWMEM_SIZE=0x30000000
+CONFIG_KERNEL_START=0xc0000000
+CONFIG_TASK_SIZE=0x80000000
+CONFIG_BOOT_LOAD=0x00800000
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=32768
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_LBD is not set
+# CONFIG_CDROM_PKTCDVD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_SCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+
+#
+# IEEE 1394 (FireWire) support
+#
+
+#
+# I2O device support
+#
+
+#
+# Macintosh device drivers
+#
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+CONFIG_SYN_COOKIES=y
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_IP_TCPDIAG=y
+# CONFIG_IP_TCPDIAG_IPV6 is not set
+# CONFIG_IPV6 is not set
+# CONFIG_NETFILTER is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT 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
+# CONFIG_NET_CLS_ROUTE is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+
+#
+# Ethernet (1000 Mbit)
+#
+CONFIG_GIANFAR=y
+CONFIG_GFAR_NAPI=y
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+# CONFIG_INPUT_MOUSEDEV is not set
+# 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 is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_NVRAM is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=y
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+# CONFIG_I2C_ISA is not set
+CONFIG_I2C_MPC=y
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_PCA_ISA is not set
+
+#
+# Hardware Sensors Chip support
+#
+# CONFIG_I2C_SENSOR is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ASB100 is not set
+# CONFIG_SENSORS_DS1621 is not set
+# CONFIG_SENSORS_FSCHER is not set
+# CONFIG_SENSORS_FSCPOS is not set
+# CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
+# CONFIG_SENSORS_IT87 is not set
+# CONFIG_SENSORS_LM63 is not set
+# CONFIG_SENSORS_LM75 is not set
+# CONFIG_SENSORS_LM77 is not set
+# CONFIG_SENSORS_LM78 is not set
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+# CONFIG_SENSORS_LM85 is not set
+# CONFIG_SENSORS_LM87 is not set
+# CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+
+#
+# Other I2C Chip support
+#
+# CONFIG_SENSORS_DS1337 is not set
+# CONFIG_SENSORS_EEPROM is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 is not set
+# CONFIG_SENSORS_M41T00 is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CHIP is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+# CONFIG_FB is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR 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_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+
+#
+# XFS support
+#
+# CONFIG_XFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_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_SYSFS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVPTS_FS_XATTR is not set
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_XATTR is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# 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 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# 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
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+# CONFIG_MSDOS_PARTITION is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Hardware crypto devices
+#
index 728bd9e1a8fabf3982d5bc52b0147cd5637e9219..15abebf46b96f8344c634831099794f4e429305e 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc1
-# Thu Jan 20 01:25:35 2005
+# Linux kernel version: 2.6.12-rc4
+# Tue May 17 11:56:01 2005
 #
 CONFIG_MMU=y
 CONFIG_GENERIC_HARDIRQS=y
@@ -11,6 +11,7 @@ CONFIG_HAVE_DEC_LOCK=y
 CONFIG_PPC=y
 CONFIG_PPC32=y
 CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 
 #
 # Code maturity level options
@@ -18,6 +19,7 @@ CONFIG_GENERIC_NVRAM=y
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -29,12 +31,14 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_HOTPLUG is not set
 CONFIG_KOBJECT_UEVENT=y
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 # CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 # CONFIG_EPOLL is not set
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -44,6 +48,7 @@ CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -62,10 +67,12 @@ CONFIG_CC_ALIGN_JUMPS=0
 CONFIG_E500=y
 CONFIG_BOOKE=y
 CONFIG_FSL_BOOKE=y
+# CONFIG_PHYS_64BIT is not set
 CONFIG_SPE=y
 CONFIG_MATH_EMULATION=y
 # CONFIG_CPU_FREQ is not set
 CONFIG_PPC_GEN550=y
+# CONFIG_PM is not set
 CONFIG_85xx=y
 CONFIG_PPC_INDIRECT_PCI_BE=y
 
@@ -76,6 +83,7 @@ CONFIG_PPC_INDIRECT_PCI_BE=y
 CONFIG_MPC8555_CDS=y
 # CONFIG_MPC8560_ADS is not set
 # CONFIG_SBC8560 is not set
+# CONFIG_STX_GP3 is not set
 CONFIG_MPC8555=y
 CONFIG_85xx_PCI2=y
 
@@ -90,6 +98,7 @@ CONFIG_CPM2=y
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 # CONFIG_CMDLINE_BOOL is not set
+CONFIG_ISA_DMA_API=y
 
 #
 # Bus options
@@ -104,10 +113,6 @@ CONFIG_PCI_NAMES=y
 #
 # CONFIG_PCCARD is not set
 
-#
-# PC-card bridges
-#
-
 #
 # Advanced setup
 #
@@ -180,7 +185,59 @@ CONFIG_IOSCHED_CFQ=y
 #
 # ATA/ATAPI/MFM/RLL support
 #
-# CONFIG_IDE is not set
+CONFIG_IDE=y
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_BLK_DEV_IDEDISK=y
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=y
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_IDEPCI_SHARE_IRQ=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+CONFIG_BLK_DEV_GENERIC=y
+# CONFIG_BLK_DEV_OPTI621 is not set
+# CONFIG_BLK_DEV_SL82C105 is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+CONFIG_IDEDMA_PCI_AUTO=y
+# CONFIG_IDEDMA_ONLYDISK is not set
+# CONFIG_BLK_DEV_AEC62XX is not set
+# CONFIG_BLK_DEV_ALI15X3 is not set
+# CONFIG_BLK_DEV_AMD74XX is not set
+# CONFIG_BLK_DEV_CMD64X is not set
+# CONFIG_BLK_DEV_TRIFLEX is not set
+# CONFIG_BLK_DEV_CY82C693 is not set
+# CONFIG_BLK_DEV_CS5520 is not set
+# CONFIG_BLK_DEV_CS5530 is not set
+# CONFIG_BLK_DEV_HPT34X is not set
+# CONFIG_BLK_DEV_HPT366 is not set
+# CONFIG_BLK_DEV_SC1200 is not set
+# CONFIG_BLK_DEV_PIIX is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+# CONFIG_BLK_DEV_SVWKS is not set
+# CONFIG_BLK_DEV_SIIMAGE is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+CONFIG_BLK_DEV_VIA82CXXX=y
+# CONFIG_IDE_ARM is not set
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_IDEDMA_IVB is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_BLK_DEV_HD is not set
 
 #
 # SCSI device support
@@ -220,7 +277,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -369,14 +425,6 @@ CONFIG_INPUT=y
 # CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-# CONFIG_SERIO is not set
-# CONFIG_SERIO_I8042 is not set
-
 #
 # Input Device Drivers
 #
@@ -386,6 +434,13 @@ CONFIG_SOUND_GAMEPORT=y
 # CONFIG_INPUT_TOUCHSCREEN is not set
 # CONFIG_INPUT_MISC is not set
 
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+
 #
 # Character devices
 #
@@ -406,6 +461,7 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_SERIAL_CPM is not set
+# CONFIG_SERIAL_JSM is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -433,6 +489,11 @@ CONFIG_GEN_RTC=y
 # CONFIG_DRM is not set
 # CONFIG_RAW_DRIVER is not set
 
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
 #
 # I2C support
 #
@@ -456,11 +517,11 @@ CONFIG_I2C_CHARDEV=y
 # CONFIG_I2C_AMD8111 is not set
 # CONFIG_I2C_I801 is not set
 # CONFIG_I2C_I810 is not set
+# CONFIG_I2C_PIIX4 is not set
 # CONFIG_I2C_ISA is not set
 CONFIG_I2C_MPC=y
 # CONFIG_I2C_NFORCE2 is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PIIX4 is not set
 # CONFIG_I2C_PROSAVAGE is not set
 # CONFIG_I2C_SAVAGE4 is not set
 # CONFIG_SCx200_ACB is not set
@@ -483,7 +544,9 @@ CONFIG_I2C_MPC=y
 # CONFIG_SENSORS_ASB100 is not set
 # CONFIG_SENSORS_DS1621 is not set
 # CONFIG_SENSORS_FSCHER is not set
+# CONFIG_SENSORS_FSCPOS is not set
 # CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
 # CONFIG_SENSORS_IT87 is not set
 # CONFIG_SENSORS_LM63 is not set
 # CONFIG_SENSORS_LM75 is not set
@@ -494,9 +557,11 @@ CONFIG_I2C_MPC=y
 # CONFIG_SENSORS_LM85 is not set
 # CONFIG_SENSORS_LM87 is not set
 # CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
 # CONFIG_SENSORS_MAX1619 is not set
 # CONFIG_SENSORS_PC87360 is not set
 # CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_SIS5595 is not set
 # CONFIG_SENSORS_SMSC47M1 is not set
 # CONFIG_SENSORS_VIA686A is not set
 # CONFIG_SENSORS_W83781D is not set
@@ -506,10 +571,12 @@ CONFIG_I2C_MPC=y
 #
 # Other I2C Chip support
 #
+# CONFIG_SENSORS_DS1337 is not set
 # CONFIG_SENSORS_EEPROM is not set
 # CONFIG_SENSORS_PCF8574 is not set
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
+# CONFIG_SENSORS_M41T00 is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -538,7 +605,6 @@ CONFIG_I2C_MPC=y
 # Graphics support
 #
 # CONFIG_FB is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
 # Sound
@@ -548,13 +614,9 @@ CONFIG_I2C_MPC=y
 #
 # USB support
 #
-# CONFIG_USB is not set
 CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
+# CONFIG_USB is not set
 
 #
 # USB Gadget Support
@@ -585,6 +647,10 @@ CONFIG_JBD=y
 CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
+
+#
+# XFS support
+#
 # CONFIG_XFS_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
@@ -646,7 +712,6 @@ CONFIG_NFS_FS=y
 # CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
-# CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
@@ -698,7 +763,9 @@ CONFIG_CRC32=y
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 # CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_KGDB_CONSOLE is not set
 # CONFIG_SERIAL_TEXT_DEBUG is not set
 
index 8aa5e8c69009b43c89415b3ec643ad808ea41596..01c226008dbf2abb71ec55a6a41df0dc68c16d56 100644 (file)
@@ -838,6 +838,17 @@ struct cpu_spec    cpu_specs[] = {
                .icache_bsize           = 32,
                .dcache_bsize           = 32,
        },
+       {       /* 405EP */
+               .pvr_mask               = 0xffff0000,
+               .pvr_value              = 0x51210000,
+               .cpu_name               = "405EP",
+               .cpu_features           = CPU_FTR_SPLIT_ID_CACHE |
+                       CPU_FTR_USE_TB,
+               .cpu_user_features      = PPC_FEATURE_32 |
+                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+               .icache_bsize           = 32,
+               .dcache_bsize           = 32,
+       },
 
 #endif /* CONFIG_40x */
 #ifdef CONFIG_44x
@@ -907,6 +918,20 @@ struct cpu_spec    cpu_specs[] = {
                .dcache_bsize           = 32,
                .num_pmcs               = 4,
        },
+       {       /* e500v2 */
+               .pvr_mask               = 0xffff0000,
+               .pvr_value              = 0x80210000,
+               .cpu_name               = "e500v2",
+               /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
+               .cpu_features           = CPU_FTR_SPLIT_ID_CACHE |
+                       CPU_FTR_USE_TB | CPU_FTR_BIG_PHYS,
+               .cpu_user_features      = PPC_FEATURE_32 |
+                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_SPE_COMP |
+                       PPC_FEATURE_HAS_EFP_SINGLE | PPC_FEATURE_HAS_EFP_DOUBLE,
+               .icache_bsize           = 32,
+               .dcache_bsize           = 32,
+               .num_pmcs               = 4,
+       },
 #endif
 #if !CLASSIC_PPC
        {       /* default match */
index 5f075dbc4ee72546e710a546db046ca58a1ad5a2..8377b6ca26da4039fabc0ba5dd46861edb4e9190 100644 (file)
 
 #ifdef CONFIG_BOOKE
 #include "head_booke.h"
+#define TRANSFER_TO_HANDLER_EXC_LEVEL(exc_level)       \
+       mtspr   exc_level##_SPRG,r8;                    \
+       BOOKE_LOAD_EXC_LEVEL_STACK(exc_level);          \
+       lwz     r0,GPR10-INT_FRAME_SIZE(r8);            \
+       stw     r0,GPR10(r11);                          \
+       lwz     r0,GPR11-INT_FRAME_SIZE(r8);            \
+       stw     r0,GPR11(r11);                          \
+       mfspr   r8,exc_level##_SPRG
+
        .globl  mcheck_transfer_to_handler
 mcheck_transfer_to_handler:
-       mtspr   MCHECK_SPRG,r8
-       BOOKE_LOAD_MCHECK_STACK
-       lwz     r0,GPR10-INT_FRAME_SIZE(r8)
-       stw     r0,GPR10(r11)
-       lwz     r0,GPR11-INT_FRAME_SIZE(r8)
-       stw     r0,GPR11(r11)
-       mfspr   r8,MCHECK_SPRG
+       TRANSFER_TO_HANDLER_EXC_LEVEL(MCHECK)
        b       transfer_to_handler_full
 
        .globl  crit_transfer_to_handler
 crit_transfer_to_handler:
-       mtspr   CRIT_SPRG,r8
-       BOOKE_LOAD_CRIT_STACK
-       lwz     r0,GPR10-INT_FRAME_SIZE(r8)
-       stw     r0,GPR10(r11)
-       lwz     r0,GPR11-INT_FRAME_SIZE(r8)
-       stw     r0,GPR11(r11)
-       mfspr   r8,CRIT_SPRG
+       TRANSFER_TO_HANDLER_EXC_LEVEL(CRIT)
        /* fall through */
 #endif
 
@@ -202,7 +199,7 @@ _GLOBAL(DoSyscall)
        rlwinm  r11,r11,0,~_TIFL_FORCE_NOERROR
        stw     r11,TI_LOCAL_FLAGS(r10)
        lwz     r11,TI_FLAGS(r10)
-       andi.   r11,r11,_TIF_SYSCALL_TRACE
+       andi.   r11,r11,_TIF_SYSCALL_T_OR_A
        bne-    syscall_dotrace
 syscall_dotrace_cont:
        cmplwi  0,r0,NR_syscalls
@@ -237,7 +234,7 @@ ret_from_syscall:
        SYNC
        MTMSRD(r10)
        lwz     r9,TI_FLAGS(r12)
-       andi.   r0,r9,(_TIF_SYSCALL_TRACE|_TIF_SIGPENDING|_TIF_NEED_RESCHED)
+       andi.   r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SIGPENDING|_TIF_NEED_RESCHED)
        bne-    syscall_exit_work
 syscall_exit_cont:
 #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
@@ -277,7 +274,8 @@ syscall_dotrace:
        SAVE_NVGPRS(r1)
        li      r0,0xc00
        stw     r0,TRAP(r1)
-       bl      do_syscall_trace
+       addi    r3,r1,STACK_FRAME_OVERHEAD
+       bl      do_syscall_trace_enter
        lwz     r0,GPR0(r1)     /* Restore original registers */
        lwz     r3,GPR3(r1)
        lwz     r4,GPR4(r1)
@@ -291,7 +289,7 @@ syscall_dotrace:
 syscall_exit_work:
        stw     r6,RESULT(r1)   /* Save result */
        stw     r3,GPR3(r1)     /* Update return value */
-       andi.   r0,r9,_TIF_SYSCALL_TRACE
+       andi.   r0,r9,_TIF_SYSCALL_T_OR_A
        beq     5f
        ori     r10,r10,MSR_EE
        SYNC
@@ -303,7 +301,8 @@ syscall_exit_work:
        li      r4,0xc00
        stw     r4,TRAP(r1)
 4:
-       bl      do_syscall_trace
+       addi    r3,r1,STACK_FRAME_OVERHEAD
+       bl      do_syscall_trace_leave
        REST_NVGPRS(r1)
 2:
        lwz     r3,GPR3(r1)
@@ -627,8 +626,8 @@ sigreturn_exit:
        subi    r1,r3,STACK_FRAME_OVERHEAD
        rlwinm  r12,r1,0,0,18   /* current_thread_info() */
        lwz     r9,TI_FLAGS(r12)
-       andi.   r0,r9,_TIF_SYSCALL_TRACE
-       bnel-   do_syscall_trace
+       andi.   r0,r9,_TIF_SYSCALL_T_OR_A
+       bnel-   do_syscall_trace_leave
        /* fall through */
 
        .globl  ret_from_except_full
@@ -781,99 +780,64 @@ exc_exit_restart_end:
  * time of the critical interrupt.
  *
  */
-       .globl  ret_from_crit_exc
-ret_from_crit_exc:
-       REST_NVGPRS(r1)
-       lwz     r3,_MSR(r1)
-       andi.   r3,r3,MSR_PR
-       LOAD_MSR_KERNEL(r10,MSR_KERNEL)
-       bne     user_exc_return
-
-       lwz     r0,GPR0(r1)
-       lwz     r2,GPR2(r1)
-       REST_4GPRS(3, r1)
-       REST_2GPRS(7, r1)
-
-       lwz     r10,_XER(r1)
-       lwz     r11,_CTR(r1)
-       mtspr   SPRN_XER,r10
-       mtctr   r11
-
-       PPC405_ERR77(0,r1)
-       stwcx.  r0,0,r1                 /* to clear the reservation */
-
-       lwz     r11,_LINK(r1)
-       mtlr    r11
-       lwz     r10,_CCR(r1)
-       mtcrf   0xff,r10
 #ifdef CONFIG_40x
-       /* avoid any possible TLB misses here by turning off MSR.DR, we
-        * assume the instructions here are mapped by a pinned TLB entry */
-       li      r10,MSR_IR
-       mtmsr   r10
-       isync
-       tophys(r1, r1)
+#define PPC_40x_TURN_OFF_MSR_DR                                                    \
+       /* avoid any possible TLB misses here by turning off MSR.DR, we     \
+        * assume the instructions here are mapped by a pinned TLB entry */ \
+       li      r10,MSR_IR;                                                 \
+       mtmsr   r10;                                                        \
+       isync;                                                              \
+       tophys(r1, r1);
+#else
+#define PPC_40x_TURN_OFF_MSR_DR
 #endif
-       lwz     r9,_DEAR(r1)
-       lwz     r10,_ESR(r1)
-       mtspr   SPRN_DEAR,r9
-       mtspr   SPRN_ESR,r10
-       lwz     r11,_NIP(r1)
-       lwz     r12,_MSR(r1)
-       mtspr   SPRN_CSRR0,r11
-       mtspr   SPRN_CSRR1,r12
-       lwz     r9,GPR9(r1)
-       lwz     r12,GPR12(r1)
-       lwz     r10,GPR10(r1)
-       lwz     r11,GPR11(r1)
-       lwz     r1,GPR1(r1)
-       PPC405_ERR77_SYNC
-       rfci
-       b       .               /* prevent prefetch past rfci */
+
+#define RET_FROM_EXC_LEVEL(exc_lvl_srr0, exc_lvl_srr1, exc_lvl_rfi)    \
+       REST_NVGPRS(r1);                                                \
+       lwz     r3,_MSR(r1);                                            \
+       andi.   r3,r3,MSR_PR;                                           \
+       LOAD_MSR_KERNEL(r10,MSR_KERNEL);                                \
+       bne     user_exc_return;                                        \
+       lwz     r0,GPR0(r1);                                            \
+       lwz     r2,GPR2(r1);                                            \
+       REST_4GPRS(3, r1);                                              \
+       REST_2GPRS(7, r1);                                              \
+       lwz     r10,_XER(r1);                                           \
+       lwz     r11,_CTR(r1);                                           \
+       mtspr   SPRN_XER,r10;                                           \
+       mtctr   r11;                                                    \
+       PPC405_ERR77(0,r1);                                             \
+       stwcx.  r0,0,r1;                /* to clear the reservation */  \
+       lwz     r11,_LINK(r1);                                          \
+       mtlr    r11;                                                    \
+       lwz     r10,_CCR(r1);                                           \
+       mtcrf   0xff,r10;                                               \
+       PPC_40x_TURN_OFF_MSR_DR;                                        \
+       lwz     r9,_DEAR(r1);                                           \
+       lwz     r10,_ESR(r1);                                           \
+       mtspr   SPRN_DEAR,r9;                                           \
+       mtspr   SPRN_ESR,r10;                                           \
+       lwz     r11,_NIP(r1);                                           \
+       lwz     r12,_MSR(r1);                                           \
+       mtspr   exc_lvl_srr0,r11;                                       \
+       mtspr   exc_lvl_srr1,r12;                                       \
+       lwz     r9,GPR9(r1);                                            \
+       lwz     r12,GPR12(r1);                                          \
+       lwz     r10,GPR10(r1);                                          \
+       lwz     r11,GPR11(r1);                                          \
+       lwz     r1,GPR1(r1);                                            \
+       PPC405_ERR77_SYNC;                                              \
+       exc_lvl_rfi;                                                    \
+       b       .;              /* prevent prefetch past exc_lvl_rfi */
+
+       .globl  ret_from_crit_exc
+ret_from_crit_exc:
+       RET_FROM_EXC_LEVEL(SPRN_CSRR0, SPRN_CSRR1, RFCI)
 
 #ifdef CONFIG_BOOKE
-/*
- * Return from a machine check interrupt, similar to a critical
- * interrupt.
- */
        .globl  ret_from_mcheck_exc
 ret_from_mcheck_exc:
-       REST_NVGPRS(r1)
-       lwz     r3,_MSR(r1)
-       andi.   r3,r3,MSR_PR
-       LOAD_MSR_KERNEL(r10,MSR_KERNEL)
-       bne     user_exc_return
-
-       lwz     r0,GPR0(r1)
-       lwz     r2,GPR2(r1)
-       REST_4GPRS(3, r1)
-       REST_2GPRS(7, r1)
-
-       lwz     r10,_XER(r1)
-       lwz     r11,_CTR(r1)
-       mtspr   SPRN_XER,r10
-       mtctr   r11
-
-       stwcx.  r0,0,r1                 /* to clear the reservation */
-
-       lwz     r11,_LINK(r1)
-       mtlr    r11
-       lwz     r10,_CCR(r1)
-       mtcrf   0xff,r10
-       lwz     r9,_DEAR(r1)
-       lwz     r10,_ESR(r1)
-       mtspr   SPRN_DEAR,r9
-       mtspr   SPRN_ESR,r10
-       lwz     r11,_NIP(r1)
-       lwz     r12,_MSR(r1)
-       mtspr   SPRN_MCSRR0,r11
-       mtspr   SPRN_MCSRR1,r12
-       lwz     r9,GPR9(r1)
-       lwz     r12,GPR12(r1)
-       lwz     r10,GPR10(r1)
-       lwz     r11,GPR11(r1)
-       lwz     r1,GPR1(r1)
-       RFMCI
+       RET_FROM_EXC_LEVEL(SPRN_MCSRR0, SPRN_MCSRR1, RFMCI)
 #endif /* CONFIG_BOOKE */
 
 /*
index 9b6a8e5136570537adca7dc8ddf244a8fac19cfd..6c7ae6052464f3d28f7cc754487e8aaa6fba1361 100644 (file)
@@ -330,8 +330,9 @@ interrupt_base:
        /* If we are faulting a kernel address, we have to use the
         * kernel page tables.
         */
-       andis.  r11, r10, 0x8000
-       beq     3f
+       lis     r11, TASK_SIZE@h
+       cmplw   r10, r11
+       blt+    3f
        lis     r11, swapper_pg_dir@h
        ori     r11, r11, swapper_pg_dir@l
 
@@ -464,8 +465,9 @@ interrupt_base:
        /* If we are faulting a kernel address, we have to use the
         * kernel page tables.
         */
-       andis.  r11, r10, 0x8000
-       beq     3f
+       lis     r11, TASK_SIZE@h
+       cmplw   r10, r11
+       blt+    3f
        lis     r11, swapper_pg_dir@h
        ori     r11, r11, swapper_pg_dir@l
 
@@ -533,8 +535,9 @@ interrupt_base:
        /* If we are faulting a kernel address, we have to use the
         * kernel page tables.
         */
-       andis.  r11, r10, 0x8000
-       beq     3f
+       lis     r11, TASK_SIZE@h
+       cmplw   r10, r11
+       blt+    3f
        lis     r11, swapper_pg_dir@h
        ori     r11, r11, swapper_pg_dir@l
 
index 6f5d380e234503bb4e48aadc5549cfae9e25bb8e..23fb51819ba5128735dd7bb28edf5085c02b2da2 100644 (file)
@@ -291,8 +291,9 @@ label:
        /* If we are faulting a kernel address, we have to use the
         * kernel page tables.
         */
-       andis.  r11, r10, 0x8000
-       beq     3f
+       lis     r11, TASK_SIZE@h
+       cmplw   r10, r11
+       blt+    3f
        lis     r11, swapper_pg_dir@h
        ori     r11, r11, swapper_pg_dir@l
        li      r9, 0
@@ -479,8 +480,9 @@ label:
        /* If we are faulting a kernel address, we have to use the
         * kernel page tables.
         */
-       andis.  r11, r10, 0x8000
-       beq     3f
+       lis     r11, TASK_SIZE@h
+       cmplw   r10, r11
+       blt+    3f
        lis     r11, swapper_pg_dir@h
        ori     r11, r11, swapper_pg_dir@l
        li      r9, 0
@@ -578,8 +580,9 @@ label:
        /* If we are faulting a kernel address, we have to use the
         * kernel page tables.
         */
-       andis.  r11, r10, 0x8000
-       beq     3f
+       lis     r11, TASK_SIZE@h
+       cmplw   r10, r11
+       blt+    3f
        lis     r11, swapper_pg_dir@h
        ori     r11, r11, swapper_pg_dir@l
        li      r9, 0
index f213d12eec080be8de4435f8294f94dfdb0e1b83..9c50f9d2657c10d1e0dea4199f3f33149c9cb33f 100644 (file)
 #define CRIT_STACK_TOP         (exception_stack_top)
 
 #ifdef CONFIG_SMP
-#define BOOKE_LOAD_CRIT_STACK                          \
+#define BOOKE_LOAD_EXC_LEVEL_STACK(level)              \
        mfspr   r8,SPRN_PIR;                            \
        mulli   r8,r8,BOOKE_EXCEPTION_STACK_SIZE;       \
        neg     r8,r8;                                  \
-       addis   r8,r8,CRIT_STACK_TOP@ha;                \
-       addi    r8,r8,CRIT_STACK_TOP@l
-#define BOOKE_LOAD_MCHECK_STACK                                \
-       mfspr   r8,SPRN_PIR;                            \
-       mulli   r8,r8,BOOKE_EXCEPTION_STACK_SIZE;       \
-       neg     r8,r8;                                  \
-       addis   r8,r8,MCHECK_STACK_TOP@ha;              \
-       addi    r8,r8,MCHECK_STACK_TOP@l
+       addis   r8,r8,level##_STACK_TOP@ha;             \
+       addi    r8,r8,level##_STACK_TOP@l
 #else
-#define BOOKE_LOAD_CRIT_STACK                          \
-       lis     r8,CRIT_STACK_TOP@h;                    \
-       ori     r8,r8,CRIT_STACK_TOP@l
-#define BOOKE_LOAD_MCHECK_STACK                                \
-       lis     r8,MCHECK_STACK_TOP@h;                  \
-       ori     r8,r8,MCHECK_STACK_TOP@l
+#define BOOKE_LOAD_EXC_LEVEL_STACK(level)              \
+       lis     r8,level##_STACK_TOP@h;                 \
+       ori     r8,r8,level##_STACK_TOP@l
 #endif
 
 /*
- * Exception prolog for critical exceptions.  This is a little different
- * from the normal exception prolog above since a critical exception
- * can potentially occur at any point during normal exception processing.
- * Thus we cannot use the same SPRG registers as the normal prolog above.
- * Instead we use a portion of the critical exception stack at low physical
- * addresses.
+ * Exception prolog for critical/machine check exceptions.  This is a
+ * little different from the normal exception prolog above since a
+ * critical/machine check exception can potentially occur at any point
+ * during normal exception processing. Thus we cannot use the same SPRG
+ * registers as the normal prolog above. Instead we use a portion of the
+ * critical/machine check exception stack at low physical addresses.
  */
-
-#define CRITICAL_EXCEPTION_PROLOG                                           \
-       mtspr   CRIT_SPRG,r8;                                                \
-       BOOKE_LOAD_CRIT_STACK;          /* r8 points to the crit stack */    \
+#define EXC_LEVEL_EXCEPTION_PROLOG(exc_level, exc_level_srr0, exc_level_srr1) \
+       mtspr   exc_level##_SPRG,r8;                                         \
+       BOOKE_LOAD_EXC_LEVEL_STACK(exc_level);/* r8 points to the exc_level stack*/ \
        stw     r10,GPR10-INT_FRAME_SIZE(r8);                                \
        stw     r11,GPR11-INT_FRAME_SIZE(r8);                                \
        mfcr    r10;                    /* save CR in r10 for now          */\
-       mfspr   r11,SPRN_CSRR1;         /* check whether user or kernel    */\
+       mfspr   r11,exc_level_srr1;     /* check whether user or kernel    */\
        andi.   r11,r11,MSR_PR;                                              \
        mr      r11,r8;                                                      \
-       mfspr   r8,CRIT_SPRG;                                                \
+       mfspr   r8,exc_level##_SPRG;                                         \
        beq     1f;                                                          \
        /* COMING FROM USER MODE */                                          \
        mfspr   r11,SPRN_SPRG3;         /* if from user, start at top of   */\
        stw     r12,_DEAR(r11);         /* since they may have had stuff   */\
        mfspr   r9,SPRN_ESR;            /* in them at the point where the  */\
        stw     r9,_ESR(r11);           /* exception was taken             */\
-       mfspr   r12,SPRN_CSRR0;                                              \
+       mfspr   r12,exc_level_srr0;                                          \
        stw     r1,GPR1(r11);                                                \
-       mfspr   r9,SPRN_CSRR1;                                               \
+       mfspr   r9,exc_level_srr1;                                           \
        stw     r1,0(r11);                                                   \
        mr      r1,r11;                                                      \
        rlwinm  r9,r9,0,14,12;          /* clear MSR_WE (necessary?)       */\
        SAVE_4GPRS(3, r11);                                                  \
        SAVE_2GPRS(7, r11)
 
-/*
- * Exception prolog for machine check exceptions.  This is similar to
- * the critical exception prolog, except that machine check exceptions
- * have their stack.
- */
-#define MCHECK_EXCEPTION_PROLOG                                             \
-       mtspr   MCHECK_SPRG,r8;                                              \
-       BOOKE_LOAD_MCHECK_STACK;        /* r8 points to the mcheck stack   */\
-       stw     r10,GPR10-INT_FRAME_SIZE(r8);                                \
-       stw     r11,GPR11-INT_FRAME_SIZE(r8);                                \
-       mfcr    r10;                    /* save CR in r10 for now          */\
-       mfspr   r11,SPRN_MCSRR1;        /* check whether user or kernel    */\
-       andi.   r11,r11,MSR_PR;                                              \
-       mr      r11,r8;                                                      \
-       mfspr   r8,MCHECK_SPRG;                                              \
-       beq     1f;                                                          \
-       /* COMING FROM USER MODE */                                          \
-       mfspr   r11,SPRN_SPRG3;         /* if from user, start at top of   */\
-       lwz     r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\
-       addi    r11,r11,THREAD_SIZE;                                         \
-1:     subi    r11,r11,INT_FRAME_SIZE; /* Allocate an exception frame     */\
-       stw     r10,_CCR(r11);          /* save various registers          */\
-       stw     r12,GPR12(r11);                                              \
-       stw     r9,GPR9(r11);                                                \
-       mflr    r10;                                                         \
-       stw     r10,_LINK(r11);                                              \
-       mfspr   r12,SPRN_DEAR;          /* save DEAR and ESR in the frame  */\
-       stw     r12,_DEAR(r11);         /* since they may have had stuff   */\
-       mfspr   r9,SPRN_ESR;            /* in them at the point where the  */\
-       stw     r9,_ESR(r11);           /* exception was taken             */\
-       mfspr   r12,SPRN_MCSRR0;                                             \
-       stw     r1,GPR1(r11);                                                \
-       mfspr   r9,SPRN_MCSRR1;                                              \
-       stw     r1,0(r11);                                                   \
-       mr      r1,r11;                                                      \
-       rlwinm  r9,r9,0,14,12;          /* clear MSR_WE (necessary?)       */\
-       stw     r0,GPR0(r11);                                                \
-       SAVE_4GPRS(3, r11);                                                  \
-       SAVE_2GPRS(7, r11)
+#define CRITICAL_EXCEPTION_PROLOG \
+               EXC_LEVEL_EXCEPTION_PROLOG(CRIT, SPRN_CSRR0, SPRN_CSRR1)
+#define MCHECK_EXCEPTION_PROLOG \
+               EXC_LEVEL_EXCEPTION_PROLOG(MCHECK, SPRN_MCSRR0, SPRN_MCSRR1)
 
 /*
  * Exception vectors.
@@ -237,7 +192,6 @@ label:
        EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, COPY_EE, transfer_to_handler, \
                          ret_from_except)
 
-
 /* Check for a single step debug exception while in an exception
  * handler before state has been saved.  This is to catch the case
  * where an instruction that we are trying to single step causes
@@ -291,7 +245,7 @@ label:
        lwz     r9,GPR9(r11);                                                 \
        lwz     r12,GPR12(r11);                                               \
        mtspr   CRIT_SPRG,r8;                                                 \
-       BOOKE_LOAD_CRIT_STACK;          /* r8 points to the crit stack */     \
+       BOOKE_LOAD_EXC_LEVEL_STACK(CRIT); /* r8 points to the debug stack */  \
        lwz     r10,GPR10-INT_FRAME_SIZE(r8);                                 \
        lwz     r11,GPR11-INT_FRAME_SIZE(r8);                                 \
        mfspr   r8,CRIT_SPRG;                                                 \
index f22ddce36135fddce922d21e2b033d642f5fe946..ce36e88ba6277ea68631ddd0fc8fb13623e94fe6 100644 (file)
@@ -232,7 +232,8 @@ skpinv:     addi    r6,r6,1                         /* Increment */
        tlbwe
 
 /* 7. Jump to KERNELBASE mapping */
-       li      r7,0
+       lis     r7,MSR_KERNEL@h
+       ori     r7,r7,MSR_KERNEL@l
        bl      1f                      /* Find our address */
 1:     mflr    r9
        rlwimi  r6,r9,0,20,31
@@ -293,6 +294,18 @@ skpinv:    addi    r6,r6,1                         /* Increment */
        mtspr   SPRN_HID0, r2
 #endif
 
+#if !defined(CONFIG_BDI_SWITCH)
+       /*
+        * The Abatron BDI JTAG debugger does not tolerate others
+        * mucking with the debug registers.
+        */
+       lis     r2,DBCR0_IDM@h
+       mtspr   SPRN_DBCR0,r2
+       /* clear any residual debug events */
+       li      r2,-1
+       mtspr   SPRN_DBSR,r2
+#endif
+
        /*
         * This is where the main kernel code starts.
         */
index e4f1615ec13f42eb034426443d881e2db0534d47..7329ef177a18c36c4f068d2a09dad48d34fce92e 100644 (file)
@@ -619,7 +619,7 @@ _GLOBAL(flush_instruction_cache)
 _GLOBAL(flush_icache_range)
 BEGIN_FTR_SECTION
        blr                             /* for 601, do nothing */
-END_FTR_SECTION_IFSET(PPC_FEATURE_UNIFIED_CACHE)
+END_FTR_SECTION_IFCLR(CPU_FTR_SPLIT_ID_CACHE)
        li      r5,L1_CACHE_LINE_SIZE-1
        andc    r3,r3,r5
        subf    r4,r3,r4
@@ -736,7 +736,7 @@ _GLOBAL(flush_dcache_all)
 _GLOBAL(__flush_dcache_icache)
 BEGIN_FTR_SECTION
        blr                                     /* for 601, do nothing */
-END_FTR_SECTION_IFSET(PPC_FEATURE_UNIFIED_CACHE)
+END_FTR_SECTION_IFCLR(CPU_FTR_SPLIT_ID_CACHE)
        rlwinm  r3,r3,0,0,19                    /* Get page base address */
        li      r4,4096/L1_CACHE_LINE_SIZE      /* Number of lines in a page */
        mtctr   r4
@@ -764,7 +764,7 @@ END_FTR_SECTION_IFSET(PPC_FEATURE_UNIFIED_CACHE)
 _GLOBAL(__flush_dcache_icache_phys)
 BEGIN_FTR_SECTION
        blr                                     /* for 601, do nothing */
-END_FTR_SECTION_IFSET(PPC_FEATURE_UNIFIED_CACHE)
+END_FTR_SECTION_IFCLR(CPU_FTR_SPLIT_ID_CACHE)
        mfmsr   r10
        rlwinm  r0,r10,0,28,26                  /* clear DR */
        mtmsr   r0
index 47a15306823ae4d603a262e6dfa1dffbd9b55740..6d7b92d724582c87b9bd23b7e54752191c269666 100644 (file)
@@ -1003,7 +1003,7 @@ pci_create_OF_bus_map(void)
        }
 }
 
-static ssize_t pci_show_devspec(struct device *dev, char *buf)
+static ssize_t pci_show_devspec(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pci_dev *pdev;
        struct device_node *np;
index 2ccb58fe4fc3caf391fc914cb496fb6a82f9d741..d59ad07de8e7d83b3931b90e3777aef95d7df532 100644 (file)
@@ -55,7 +55,6 @@
 #define EXPORT_SYMTAB_STROPS
 
 extern void transfer_to_handler(void);
-extern void do_syscall_trace(void);
 extern void do_IRQ(struct pt_regs *regs);
 extern void MachineCheckException(struct pt_regs *regs);
 extern void AlignmentException(struct pt_regs *regs);
@@ -74,7 +73,6 @@ extern unsigned long mm_ptov (unsigned long paddr);
 EXPORT_SYMBOL(clear_pages);
 EXPORT_SYMBOL(clear_user_page);
 EXPORT_SYMBOL(do_signal);
-EXPORT_SYMBOL(do_syscall_trace);
 EXPORT_SYMBOL(transfer_to_handler);
 EXPORT_SYMBOL(do_IRQ);
 EXPORT_SYMBOL(MachineCheckException);
index 59d59a8dc249675b1f2e5186568dfbeae344c8a1..e7aee4108dea69985ba02507a78a46f227ba47da 100644 (file)
@@ -27,6 +27,9 @@
 #include <linux/user.h>
 #include <linux/security.h>
 #include <linux/signal.h>
+#include <linux/seccomp.h>
+#include <linux/audit.h>
+#include <linux/module.h>
 
 #include <asm/uaccess.h>
 #include <asm/page.h>
@@ -455,11 +458,10 @@ out:
        return ret;
 }
 
-void do_syscall_trace(void)
+static void do_syscall_trace(void)
 {
-        if (!test_thread_flag(TIF_SYSCALL_TRACE)
-           || !(current->ptrace & PT_PTRACED))
-               return;
+       /* the 0x80 provides a way for the tracing parent to distinguish
+          between a syscall stop and SIGTRAP delivery */
        ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
                                 ? 0x80 : 0));
 
@@ -473,3 +475,33 @@ void do_syscall_trace(void)
                current->exit_code = 0;
        }
 }
+
+void do_syscall_trace_enter(struct pt_regs *regs)
+{
+       if (test_thread_flag(TIF_SYSCALL_TRACE)
+           && (current->ptrace & PT_PTRACED))
+               do_syscall_trace();
+
+       if (unlikely(current->audit_context))
+               audit_syscall_entry(current, AUDIT_ARCH_PPC,
+                                   regs->gpr[0],
+                                   regs->gpr[3], regs->gpr[4],
+                                   regs->gpr[5], regs->gpr[6]);
+}
+
+void do_syscall_trace_leave(struct pt_regs *regs)
+{
+       secure_computing(regs->gpr[0]);
+
+       if (unlikely(current->audit_context))
+               audit_syscall_exit(current,
+                                  (regs->ccr&0x1000)?AUDITSC_FAILURE:AUDITSC_SUCCESS,
+                                  regs->result);
+
+       if ((test_thread_flag(TIF_SYSCALL_TRACE))
+           && (current->ptrace & PT_PTRACED))
+               do_syscall_trace();
+}
+
+EXPORT_SYMBOL(do_syscall_trace_enter);
+EXPORT_SYMBOL(do_syscall_trace_leave);
index 5dfb42f1a1529d561bf73b5b5c1411a3e51f6402..c42f753269396ff297e02669004e3c126a921f26 100644 (file)
@@ -41,7 +41,7 @@
 #include <asm/xmon.h>
 #include <asm/ocp.h>
 
-#if defined(CONFIG_85xx) || defined(CONFIG_83xx)
+#if defined(CONFIG_85xx) || defined(CONFIG_83xx) || defined(CONFIG_MPC10X_BRIDGE)
 #include <asm/ppc_sys.h>
 #endif
 
@@ -61,8 +61,6 @@ extern void power4_idle(void);
 
 extern boot_infos_t *boot_infos;
 struct ide_machdep_calls ppc_ide_md;
-char *sysmap;
-unsigned long sysmap_size;
 
 /* Used with the BI_MEMSIZE bootinfo parameter to store the memory
    size value reported by the boot loader. */
@@ -249,7 +247,7 @@ int show_cpuinfo(struct seq_file *m, void *v)
        seq_printf(m, "bogomips\t: %lu.%02lu\n",
                   lpj / (500000/HZ), (lpj / (5000/HZ)) % 100);
 
-#if defined(CONFIG_85xx) || defined(CONFIG_83xx)
+#if defined(CONFIG_85xx) || defined(CONFIG_83xx) || defined(CONFIG_MPC10X_BRIDGE)
        if (cur_ppc_sys_spec->ppc_sys_name)
                seq_printf(m, "chipset\t\t: %s\n",
                        cur_ppc_sys_spec->ppc_sys_name);
@@ -499,7 +497,7 @@ static int __init set_preferred_console(void)
 {
        struct device_node *prom_stdout;
        char *name;
-       int offset;
+       int offset = 0;
 
        if (of_stdout_device == NULL)
                return -ENODEV;
@@ -578,11 +576,6 @@ void parse_bootinfo(struct bi_record *rec)
                case BI_CMD_LINE:
                        strlcpy(cmd_line, (void *)data, sizeof(cmd_line));
                        break;
-               case BI_SYSMAP:
-                       sysmap = (char *)((data[0] >= (KERNELBASE)) ? data[0] :
-                                         (data[0]+KERNELBASE));
-                       sysmap_size = data[1];
-                       break;
 #ifdef CONFIG_BLK_DEV_INITRD
                case BI_INITRD:
                        initrd_start = data[0] + KERNELBASE;
@@ -753,6 +746,8 @@ void __init setup_arch(char **cmdline_p)
        strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);
        *cmdline_p = cmd_line;
 
+       parse_early_param();
+
        /* set up the bootmem stuff with available memory */
        do_init_bootmem();
        if ( ppc_md.progress ) ppc_md.progress("setup_arch: bootmem", 0x3eab);
index f8e7e324a17396fc81e64a3afbcc2cb77eaa6702..2ca8ecfeefd978058bb65d6ca3d526d1e640a483 100644 (file)
@@ -81,8 +81,10 @@ void die(const char * str, struct pt_regs * fp, long err)
        console_verbose();
        spin_lock_irq(&die_lock);
 #ifdef CONFIG_PMAC_BACKLIGHT
-       set_backlight_enable(1);
-       set_backlight_level(BACKLIGHT_MAX);
+       if (_machine == _MACH_Pmac) {
+               set_backlight_enable(1);
+               set_backlight_level(BACKLIGHT_MAX);
+       }
 #endif
        printk("Oops: %s, sig: %ld [#%d]\n", str, err, ++die_counter);
 #ifdef CONFIG_PREEMPT
@@ -408,12 +410,7 @@ static int emulate_string_inst(struct pt_regs *regs, u32 instword)
 
        /* Early out if we are an invalid form of lswx */
        if ((instword & INST_STRING_MASK) == INST_LSWX)
-               if ((rA >= rT) || (NB_RB >= rT) || (rT == rA) || (rT == NB_RB))
-                       return -EINVAL;
-
-       /* Early out if we are an invalid form of lswi */
-       if ((instword & INST_STRING_MASK) == INST_LSWI)
-               if ((rA >= rT) || (rT == rA))
+               if ((rT == rA) || (rT == NB_RB))
                        return -EINVAL;
 
        EA = (rA == 0) ? 0 : regs->gpr[rA];
index 694163d696d886244b6ea769ab8b19abed8b65a0..c450dc4b766e23b5588dccf0f57e42ea6e1ea22d 100644 (file)
@@ -130,7 +130,7 @@ void _raw_read_lock(rwlock_t *rw)
                while (!read_can_lock(rw)) {
                        if (--stuck == 0) {
                                printk("_read_lock(%p) CPU#%d lock %d\n",
-                                      rw, _smp_processor_id(), rw->lock);
+                                      rw, raw_smp_processor_id(), rw->lock);
                                stuck = INIT_STUCK;
                        }
                }
@@ -158,7 +158,7 @@ void _raw_write_lock(rwlock_t *rw)
                while (!write_can_lock(rw)) {
                        if (--stuck == 0) {
                                printk("write_lock(%p) CPU#%d lock %d)\n",
-                                      rw, _smp_processor_id(), rw->lock);
+                                      rw, raw_smp_processor_id(), rw->lock);
                                stuck = INIT_STUCK;
                        }
                }
index 8d08a2eb225e8608310c205033a34db857eb5ebf..36c9b97fd92abf9c6728f425e73d9d88fa0d8a84 100644 (file)
@@ -446,6 +446,7 @@ _GLOBAL(__copy_tofrom_user)
 #ifdef CONFIG_8xx
        /* Don't use prefetch on 8xx */
        mtctr   r0
+       li      r0,0
 53:    COPY_16_BYTES_WITHEX(0)
        bdnz    53b
 
@@ -564,7 +565,9 @@ _GLOBAL(__copy_tofrom_user)
 /* or write fault in cacheline loop */
 105:   li      r9,1
 92:    li      r3,LG_CACHELINE_BYTES
-       b       99f
+       mfctr   r8
+       add     r0,r0,r8
+       b       106f
 /* read fault in final word loop */
 108:   li      r9,0
        b       93f
@@ -585,7 +588,7 @@ _GLOBAL(__copy_tofrom_user)
  * r5 + (ctr << r3), and r9 is 0 for read or 1 for write.
  */
 99:    mfctr   r0
-       slw     r3,r0,r3
+106:   slw     r3,r0,r3
        add.    r3,r3,r5
        beq     120f                    /* shouldn't happen */
        cmpwi   0,r9,0
index 36233bdcdf8ff7590b64941ef05430851a18a1d6..e07990efa046e238b8dcc4deadff38bb80afcf3d 100644 (file)
@@ -64,6 +64,8 @@ extern unsigned long total_lowmem;
 extern unsigned long __max_low_memory;
 #define MAX_LOW_MEM    CONFIG_LOWMEM_SIZE
 
+#define NUM_TLBCAMS    (16)
+
 struct tlbcam {
        u32     MAS0;
        u32     MAS1;
index be02a7fec2b73ceb42675c54e747eafea7ac55c2..334ef4150d9291165fc9a3e78f77756c742f8221 100644 (file)
@@ -96,9 +96,6 @@ extern struct task_struct *current_set[NR_CPUS];
 char *klimit = _end;
 struct mem_pieces phys_avail;
 
-extern char *sysmap;
-extern unsigned long sysmap_size;
-
 /*
  * this tells the system to map all of ram with the segregs
  * (i.e. page tables) instead of the bats.
@@ -179,6 +176,7 @@ void free_initmem(void)
        if (!have_of)
                FREESEC(openfirmware);
        printk("\n");
+       ppc_md.progress = NULL;
 #undef FREESEC
 }
 
@@ -441,12 +439,6 @@ void __init mem_init(void)
        if (agp_special_page)
                SetPageReserved(virt_to_page(agp_special_page));
 #endif
-       if ( sysmap )
-               for (addr = (unsigned long)sysmap;
-                    addr < PAGE_ALIGN((unsigned long)sysmap+sysmap_size) ;
-                    addr += PAGE_SIZE)
-                       SetPageReserved(virt_to_page(addr));
-
        for (addr = PAGE_OFFSET; addr < (unsigned long)high_memory;
             addr += PAGE_SIZE) {
                if (!PageReserved(virt_to_page(addr)))
@@ -468,7 +460,6 @@ void __init mem_init(void)
                        struct page *page = mem_map + pfn;
 
                        ClearPageReserved(page);
-                       set_bit(PG_highmem, &page->flags);
                        set_page_count(page, 1);
                        __free_page(page);
                        totalhigh_pages++;
@@ -482,9 +473,7 @@ void __init mem_init(void)
               codepages<< (PAGE_SHIFT-10), datapages<< (PAGE_SHIFT-10),
               initpages<< (PAGE_SHIFT-10),
               (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10)));
-       if (sysmap)
-               printk("System.map loaded at 0x%08x for debugger, size: %ld bytes\n",
-                       (unsigned int)sysmap, sysmap_size);
+
 #ifdef CONFIG_PPC_PMAC
        if (agp_special_page)
                printk(KERN_INFO "AGP special page: 0x%08lx\n", agp_special_page);
@@ -534,9 +523,6 @@ set_phys_avail(unsigned long total_memory)
        if (rtas_data)
                mem_pieces_remove(&phys_avail, rtas_data, rtas_size, 1);
 #endif
-       /* remove the sysmap pages from the available memory */
-       if (sysmap)
-               mem_pieces_remove(&phys_avail, __pa(sysmap), sysmap_size, 1);
 #ifdef CONFIG_PPC_PMAC
        /* Because of some uninorth weirdness, we need a page of
         * memory as high as possible (it must be outside of the
index ffcdb46997dc3396463b55990f36b9dea2b17828..540f3292b2291f0c1e2cc78ccbdf87b5feac39b3 100644 (file)
@@ -43,6 +43,8 @@ extern int mem_init_done;
 extern PTE *Hash, *Hash_end;
 extern unsigned long Hash_size, Hash_mask;
 
+extern unsigned int num_tlbcam_entries;
+
 /* ...and now those things that may be slightly different between processor
  * architectures.  -- Dan
  */
index 5d2f3f66aefa6a695ed19fa9e069f61c03434dc9..81a3d7446d3718576505f4cd847c75c644bd33e2 100644 (file)
@@ -66,7 +66,6 @@ void setbat(int index, unsigned long virt, unsigned long phys,
 
 #ifdef HAVE_TLBCAM
 extern unsigned int tlbcam_index;
-extern unsigned int num_tlbcam_entries;
 extern unsigned long v_mapped_by_tlbcam(unsigned long va);
 extern unsigned long p_mapped_by_tlbcam(unsigned long pa);
 #else /* !HAVE_TLBCAM */
index b3b0f51979d2b2c6ef6b316c392567e8d4a67765..86ca5cf81263ccd0f53a37ebe2b3fe8032e96af3 100644 (file)
@@ -41,7 +41,6 @@
 #include <asm/time.h>
 #include <asm/io.h>
 #include <asm/machdep.h>
-#include <asm/prom.h>
 #include <asm/ipic.h>
 #include <asm/bootinfo.h>
 #include <asm/pci-bridge.h>
@@ -127,7 +126,6 @@ mpc834x_sys_map_io(void)
 {
        /* we steal the lowest ioremap addr for virt space */
        io_block_mapping(VIRT_IMMRBAR, immrbar, 1024*1024, _PAGE_IO);
-       io_block_mapping(BCSR_VIRT_ADDR, BCSR_PHYS_ADDR, BCSR_SIZE, _PAGE_IO);
 }
 
 int
index f4d055ae19c14b6eecf94e6be35bd05d6afc3f19..a2f6e49d71512946ca5e89e2b7d7ca80fec0f8de 100644 (file)
 #define VIRT_IMMRBAR           ((uint)0xfe000000)
 
 #define BCSR_PHYS_ADDR         ((uint)0xf8000000)
-#define BCSR_VIRT_ADDR         ((uint)0xfe100000)
 #define BCSR_SIZE              ((uint)(32 * 1024))
 
+#define BCSR_MISC_REG2_OFF     0x07
+#define BCSR_MISC_REG2_PORESET 0x01
+
+#define BCSR_MISC_REG3_OFF     0x08
+#define BCSR_MISC_REG3_CNFLOCK 0x80
+
 #ifdef CONFIG_PCI
 /* PCI interrupt controller */
 #define PIRQA        MPC83xx_IRQ_IRQ4
index ff92e38e7da124ffe4bd698b3d3ed4f7988238ff..c5bc2821d99162c673aac9a2d1558d4e950a8502 100644 (file)
@@ -21,6 +21,11 @@ config MPC8540_ADS
        help
          This option enables support for the MPC 8540 ADS evaluation board.
 
+config MPC8548_CDS
+       bool "Freescale MPC8548 CDS"
+       help
+         This option enablese support for the MPC8548 CDS evaluation board.
+
 config MPC8555_CDS
        bool "Freescale MPC8555 CDS"
        help
@@ -53,6 +58,11 @@ config MPC8540
        depends on MPC8540_ADS
        default y
 
+config MPC8548
+       bool
+       depends on MPC8548_CDS
+       default y
+
 config MPC8555
        bool
        depends on MPC8555_CDS
index 854fbd298ba2afa43d7620bf3151b87603c69b43..efdf813108f2fb86c0e7bfff4f7b095db47ee8e2 100644 (file)
@@ -2,6 +2,7 @@
 # Makefile for the PowerPC 85xx linux kernel.
 #
 obj-$(CONFIG_MPC8540_ADS)      += mpc85xx_ads_common.o mpc8540_ads.o
+obj-$(CONFIG_MPC8548_CDS)      += mpc85xx_cds_common.o
 obj-$(CONFIG_MPC8555_CDS)      += mpc85xx_cds_common.o
 obj-$(CONFIG_MPC8560_ADS)      += mpc85xx_ads_common.o mpc8560_ads.o
 obj-$(CONFIG_SBC8560)          += sbc85xx.o sbc8560.o
index 4d857d6d633d757c7818356c24a12219f99c341d..a2ed611cd936877f836e381b23c14cf0193969a2 100644 (file)
@@ -41,7 +41,6 @@
 #include <asm/time.h>
 #include <asm/io.h>
 #include <asm/machdep.h>
-#include <asm/prom.h>
 #include <asm/open_pic.h>
 #include <asm/bootinfo.h>
 #include <asm/pci-bridge.h>
@@ -88,7 +87,7 @@ mpc8540ads_setup_arch(void)
 #ifdef CONFIG_SERIAL_TEXT_DEBUG
        /* Invalidate the entry we stole earlier the serial ports
         * should be properly mapped */
-       invalidate_tlbcam_entry(NUM_TLBCAMS - 1);
+       invalidate_tlbcam_entry(num_tlbcam_entries - 1);
 #endif
 
        /* setup the board related information for the enet controllers */
@@ -150,7 +149,7 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
                struct uart_port p;
 
                /* Use the last TLB entry to map CCSRBAR to allow access to DUART regs */
-               settlbcam(NUM_TLBCAMS - 1, binfo->bi_immr_base,
+               settlbcam(num_tlbcam_entries - 1, binfo->bi_immr_base,
                          binfo->bi_immr_base, MPC85xx_CCSRBAR_SIZE, _PAGE_IO, 0);
 
                memset(&p, 0, sizeof (p));
@@ -210,6 +209,9 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
 #if defined(CONFIG_SERIAL_8250) && defined(CONFIG_SERIAL_TEXT_DEBUG)
        ppc_md.progress = gen550_progress;
 #endif /* CONFIG_SERIAL_8250 && CONFIG_SERIAL_TEXT_DEBUG */
+#if defined(CONFIG_SERIAL_8250) && defined(CONFIG_KGDB)
+       ppc_md.early_serial_map = mpc85xx_early_serial_map;
+#endif /* CONFIG_SERIAL_8250 && CONFIG_KGDB */
 
        if (ppc_md.progress)
                ppc_md.progress("mpc8540ads_init(): exit", 0);
index 761b8c7b25d27514ec7d305c855b45c2aa629b96..d87dfd5ce0a23d62fed242154763b70e99e56f17 100644 (file)
@@ -41,7 +41,6 @@
 #include <asm/time.h>
 #include <asm/io.h>
 #include <asm/machdep.h>
-#include <asm/prom.h>
 #include <asm/open_pic.h>
 #include <asm/bootinfo.h>
 #include <asm/pci-bridge.h>
index ba9f9f562c4587da3c8e0422be1d92f3166ee775..18e952d1767cd7a481f38a4c372e8af1b602c1ae 100644 (file)
@@ -36,7 +36,6 @@
 #include <asm/time.h>
 #include <asm/io.h>
 #include <asm/machdep.h>
-#include <asm/prom.h>
 #include <asm/open_pic.h>
 #include <asm/bootinfo.h>
 #include <asm/pci-bridge.h>
@@ -59,40 +58,8 @@ extern unsigned long total_memory;   /* in mm/init */
 unsigned char __res[sizeof (bd_t)];
 
 /* Internal interrupts are all Level Sensitive, and Positive Polarity */
-
 static u_char mpc85xx_ads_openpic_initsenses[] __initdata = {
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  0: L2 Cache */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  1: ECM */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  2: DDR DRAM */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  3: LBIU */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  4: DMA 0 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  5: DMA 1 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  6: DMA 2 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  7: DMA 3 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  8: PCI/PCI-X */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  9: RIO Inbound Port Write Error */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 10: RIO Doorbell Inbound */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 11: RIO Outbound Message */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 12: RIO Inbound Message */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 13: TSEC 0 Transmit */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 14: TSEC 0 Receive */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 15: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 16: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 17: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 18: TSEC 0 Receive/Transmit Error */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 19: TSEC 1 Transmit */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 20: TSEC 1 Receive */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 21: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 22: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 23: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 24: TSEC 1 Receive/Transmit Error */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 25: Fast Ethernet */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 26: DUART */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 27: I2C */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 28: Performance Monitor */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 29: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 30: CPM */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 31: Unused */
+       MPC85XX_INTERNAL_IRQ_SENSES,
        0x0,                                            /* External  0: */
 #if defined(CONFIG_PCI)
        (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* External 1: PCI slot 0 */
@@ -159,7 +126,7 @@ mpc85xx_ads_init_IRQ(void)
        /* Skip reserved space and internal sources */
        openpic_set_sources(0, 32, OpenPIC_Addr + 0x10200);
        /* Map PIC IRQs 0-11 */
-       openpic_set_sources(32, 12, OpenPIC_Addr + 0x10000);
+       openpic_set_sources(48, 12, OpenPIC_Addr + 0x10000);
 
        /* we let openpic interrupts starting from an offset, to
         * leave space for cascading interrupts underneath.
index 6c020d67ad704457a1341d2295907d5c52733928..203b2ca61df896d6be9d466b05a95ca5169ee4ce 100644 (file)
@@ -42,8 +42,8 @@
 #include <asm/todc.h>
 #include <asm/io.h>
 #include <asm/machdep.h>
-#include <asm/prom.h>
 #include <asm/open_pic.h>
+#include <asm/i8259.h>
 #include <asm/bootinfo.h>
 #include <asm/pci-bridge.h>
 #include <asm/mpc85xx.h>
@@ -72,40 +72,8 @@ static int cds_pci_slot = 2;
 static volatile u8 * cadmus;
 
 /* Internal interrupts are all Level Sensitive, and Positive Polarity */
-
 static u_char mpc85xx_cds_openpic_initsenses[] __initdata = {
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  0: L2 Cache */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  1: ECM */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  2: DDR DRAM */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  3: LBIU */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  4: DMA 0 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  5: DMA 1 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  6: DMA 2 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  7: DMA 3 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  8: PCI/PCI-X */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  9: RIO Inbound Port Write Error */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 10: RIO Doorbell Inbound */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 11: RIO Outbound Message */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 12: RIO Inbound Message */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 13: TSEC 0 Transmit */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 14: TSEC 0 Receive */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 15: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 16: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 17: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 18: TSEC 0 Receive/Transmit Error */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 19: TSEC 1 Transmit */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 20: TSEC 1 Receive */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 21: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 22: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 23: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 24: TSEC 1 Receive/Transmit Error */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 25: Fast Ethernet */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 26: DUART */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 27: I2C */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 28: Performance Monitor */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 29: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 30: CPM */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 31: Unused */
+       MPC85XX_INTERNAL_IRQ_SENSES,
 #if defined(CONFIG_PCI)
        (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* External 0: PCI1 slot */
        (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* External 1: PCI1 slot */
@@ -189,15 +157,28 @@ mpc85xx_cds_init_IRQ(void)
        OpenPIC_NumInitSenses = sizeof (mpc85xx_cds_openpic_initsenses);
 
        /* Skip reserved space and internal sources */
+#ifdef CONFIG_MPC8548
+       openpic_set_sources(0, 48, OpenPIC_Addr + 0x10200);
+#else
        openpic_set_sources(0, 32, OpenPIC_Addr + 0x10200);
+#endif
        /* Map PIC IRQs 0-11 */
-       openpic_set_sources(32, 12, OpenPIC_Addr + 0x10000);
+       openpic_set_sources(48, 12, OpenPIC_Addr + 0x10000);
 
        /* we let openpic interrupts starting from an offset, to
         * leave space for cascading interrupts underneath.
         */
        openpic_init(MPC85xx_OPENPIC_IRQ_OFFSET);
 
+#ifdef CONFIG_PCI
+       openpic_hookup_cascade(PIRQ0A, "82c59 cascade", i8259_irq);
+
+       for (i = 0; i < NUM_8259_INTERRUPTS; i++)
+               irq_desc[i].handler = &i8259_pic;
+
+       i8259_init(0);
+#endif
+
 #ifdef CONFIG_CPM2
        /* Setup CPM2 PIC */
         cpm2_init_IRQ();
@@ -231,7 +212,7 @@ mpc85xx_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin)
                         * interrupt on slot */
                {
                        { 0, 1, 2, 3 }, /* 16 - PMC */
-                       { 3, 0, 0, 0 }, /* 17 P2P (Tsi320) */
+                       { 0, 1, 2, 3 }, /* 17 P2P (Tsi320) */
                        { 0, 1, 2, 3 }, /* 18 - Slot 1 */
                        { 1, 2, 3, 0 }, /* 19 - Slot 2 */
                        { 2, 3, 0, 1 }, /* 20 - Slot 3 */
@@ -280,13 +261,135 @@ mpc85xx_exclude_device(u_char bus, u_char devfn)
                        return PCIBIOS_DEVICE_NOT_FOUND;
 #endif
        /* We explicitly do not go past the Tundra 320 Bridge */
-       if (bus == 1)
+       if ((bus == 1) && (PCI_SLOT(devfn) == ARCADIA_2ND_BRIDGE_IDSEL))
                return PCIBIOS_DEVICE_NOT_FOUND;
        if ((bus == 0) && (PCI_SLOT(devfn) == ARCADIA_2ND_BRIDGE_IDSEL))
                return PCIBIOS_DEVICE_NOT_FOUND;
        else
                return PCIBIOS_SUCCESSFUL;
 }
+
+void __init
+mpc85xx_cds_enable_via(struct pci_controller *hose)
+{
+       u32 pci_class;
+       u16 vid, did;
+
+       early_read_config_dword(hose, 0, 0x88, PCI_CLASS_REVISION, &pci_class);
+       if ((pci_class >> 16) != PCI_CLASS_BRIDGE_PCI)
+               return;
+
+       /* Configure P2P so that we can reach bus 1 */
+       early_write_config_byte(hose, 0, 0x88, PCI_PRIMARY_BUS, 0);
+       early_write_config_byte(hose, 0, 0x88, PCI_SECONDARY_BUS, 1);
+       early_write_config_byte(hose, 0, 0x88, PCI_SUBORDINATE_BUS, 0xff);
+
+       early_read_config_word(hose, 1, 0x10, PCI_VENDOR_ID, &vid);
+       early_read_config_word(hose, 1, 0x10, PCI_DEVICE_ID, &did);
+
+       if ((vid != PCI_VENDOR_ID_VIA) ||
+                       (did != PCI_DEVICE_ID_VIA_82C686))
+               return;
+
+       /* Enable USB and IDE functions */
+       early_write_config_byte(hose, 1, 0x10, 0x48, 0x08);
+}
+
+void __init
+mpc85xx_cds_fixup_via(struct pci_controller *hose)
+{
+       u32 pci_class;
+       u16 vid, did;
+
+       early_read_config_dword(hose, 0, 0x88, PCI_CLASS_REVISION, &pci_class);
+       if ((pci_class >> 16) != PCI_CLASS_BRIDGE_PCI)
+               return;
+
+       /*
+        * Force the backplane P2P bridge to have a window
+        * open from 0x00000000-0x00001fff in PCI I/O space.
+        * This allows legacy I/O (i8259, etc) on the VIA
+        * southbridge to be accessed.
+        */
+       early_write_config_byte(hose, 0, 0x88, PCI_IO_BASE, 0x00);
+       early_write_config_word(hose, 0, 0x88, PCI_IO_BASE_UPPER16, 0x0000);
+       early_write_config_byte(hose, 0, 0x88, PCI_IO_LIMIT, 0x10);
+       early_write_config_word(hose, 0, 0x88, PCI_IO_LIMIT_UPPER16, 0x0000);
+
+       early_read_config_word(hose, 1, 0x10, PCI_VENDOR_ID, &vid);
+       early_read_config_word(hose, 1, 0x10, PCI_DEVICE_ID, &did);
+       if ((vid != PCI_VENDOR_ID_VIA) ||
+                       (did != PCI_DEVICE_ID_VIA_82C686))
+               return;
+
+       /*
+        * Since the P2P window was forced to cover the fixed
+        * legacy I/O addresses, it is necessary to manually
+        * place the base addresses for the IDE and USB functions
+        * within this window.
+        */
+       /* Function 1, IDE */
+       early_write_config_dword(hose, 1, 0x11, PCI_BASE_ADDRESS_0, 0x1ff8);
+       early_write_config_dword(hose, 1, 0x11, PCI_BASE_ADDRESS_1, 0x1ff4);
+       early_write_config_dword(hose, 1, 0x11, PCI_BASE_ADDRESS_2, 0x1fe8);
+       early_write_config_dword(hose, 1, 0x11, PCI_BASE_ADDRESS_3, 0x1fe4);
+       early_write_config_dword(hose, 1, 0x11, PCI_BASE_ADDRESS_4, 0x1fd0);
+
+       /* Function 2, USB ports 0-1 */
+       early_write_config_dword(hose, 1, 0x12, PCI_BASE_ADDRESS_4, 0x1fa0);
+
+       /* Function 3, USB ports 2-3 */
+       early_write_config_dword(hose, 1, 0x13, PCI_BASE_ADDRESS_4, 0x1f80);
+
+       /* Function 5, Power Management */
+       early_write_config_dword(hose, 1, 0x15, PCI_BASE_ADDRESS_0, 0x1e00);
+       early_write_config_dword(hose, 1, 0x15, PCI_BASE_ADDRESS_1, 0x1dfc);
+       early_write_config_dword(hose, 1, 0x15, PCI_BASE_ADDRESS_2, 0x1df8);
+
+       /* Function 6, AC97 Interface */
+       early_write_config_dword(hose, 1, 0x16, PCI_BASE_ADDRESS_0, 0x1c00);
+}
+
+void __init
+mpc85xx_cds_pcibios_fixup(void)
+{
+        struct pci_dev *dev = NULL;
+       u_char          c;
+
+        if ((dev = pci_find_device(PCI_VENDOR_ID_VIA,
+                                        PCI_DEVICE_ID_VIA_82C586_1, NULL))) {
+                /*
+                 * U-Boot does not set the enable bits
+                 * for the IDE device. Force them on here.
+                 */
+                pci_read_config_byte(dev, 0x40, &c);
+                c |= 0x03; /* IDE: Chip Enable Bits */
+                pci_write_config_byte(dev, 0x40, c);
+
+               /*
+                * Since only primary interface works, force the
+                * IDE function to standard primary IDE interrupt
+                * w/ 8259 offset
+                */
+                dev->irq = 14;
+                pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
+        }
+
+       /*
+        * Force legacy USB interrupt routing
+        */
+        if ((dev = pci_find_device(PCI_VENDOR_ID_VIA,
+                                        PCI_DEVICE_ID_VIA_82C586_2, NULL))) {
+                dev->irq = 10;
+                pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 10);
+        }
+
+        if ((dev = pci_find_device(PCI_VENDOR_ID_VIA,
+                                        PCI_DEVICE_ID_VIA_82C586_2, dev))) {
+                dev->irq = 11;
+                pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 11);
+        }
+}
 #endif /* CONFIG_PCI */
 
 TODC_ALLOC();
@@ -328,6 +431,9 @@ mpc85xx_cds_setup_arch(void)
        loops_per_jiffy = freq / HZ;
 
 #ifdef CONFIG_PCI
+       /* VIA IDE configuration */
+        ppc_md.pcibios_fixup = mpc85xx_cds_pcibios_fixup;
+
        /* setup PCI host bridges */
        mpc85xx_setup_hose();
 #endif
@@ -339,26 +445,52 @@ mpc85xx_cds_setup_arch(void)
 #ifdef CONFIG_SERIAL_TEXT_DEBUG
        /* Invalidate the entry we stole earlier the serial ports
         * should be properly mapped */
-       invalidate_tlbcam_entry(NUM_TLBCAMS - 1);
+       invalidate_tlbcam_entry(num_tlbcam_entries - 1);
 #endif
 
        /* setup the board related information for the enet controllers */
        pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1);
-       pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR;
-       pdata->interruptPHY = MPC85xx_IRQ_EXT5;
-       pdata->phyid = 0;
-       /* fixup phy address */
-       pdata->phy_reg_addr += binfo->bi_immr_base;
-       memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6);
+       if (pdata) {
+               pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR;
+               pdata->interruptPHY = MPC85xx_IRQ_EXT5;
+               pdata->phyid = 0;
+               /* fixup phy address */
+               pdata->phy_reg_addr += binfo->bi_immr_base;
+               memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6);
+       }
 
        pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2);
-       pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR;
-       pdata->interruptPHY = MPC85xx_IRQ_EXT5;
-       pdata->phyid = 1;
-       /* fixup phy address */
-       pdata->phy_reg_addr += binfo->bi_immr_base;
-       memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6);
+       if (pdata) {
+               pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR;
+               pdata->interruptPHY = MPC85xx_IRQ_EXT5;
+               pdata->phyid = 1;
+               /* fixup phy address */
+               pdata->phy_reg_addr += binfo->bi_immr_base;
+               memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6);
+       }
+
+       pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_eTSEC1);
+       if (pdata) {
+               pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR;
+               pdata->interruptPHY = MPC85xx_IRQ_EXT5;
+               pdata->phyid = 0;
+               /* fixup phy address */
+               pdata->phy_reg_addr += binfo->bi_immr_base;
+               memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6);
+       }
+
+       pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_eTSEC2);
+       if (pdata) {
+               pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR;
+               pdata->interruptPHY = MPC85xx_IRQ_EXT5;
+               pdata->phyid = 1;
+               /* fixup phy address */
+               pdata->phy_reg_addr += binfo->bi_immr_base;
+               memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6);
+       }
 
+       ppc_sys_device_remove(MPC85xx_eTSEC3);
+       ppc_sys_device_remove(MPC85xx_eTSEC4);
 
 #ifdef CONFIG_BLK_DEV_INITRD
        if (initrd_start)
@@ -395,7 +527,7 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
                struct uart_port p;
 
                /* Use the last TLB entry to map CCSRBAR to allow access to DUART regs */
-               settlbcam(NUM_TLBCAMS - 1, binfo->bi_immr_base,
+               settlbcam(num_tlbcam_entries - 1, binfo->bi_immr_base,
                                binfo->bi_immr_base, MPC85xx_CCSRBAR_SIZE, _PAGE_IO, 0);
 
                memset(&p, 0, sizeof (p));
@@ -459,6 +591,9 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
 #if defined(CONFIG_SERIAL_8250) && defined(CONFIG_SERIAL_TEXT_DEBUG)
        ppc_md.progress = gen550_progress;
 #endif /* CONFIG_SERIAL_8250 && CONFIG_SERIAL_TEXT_DEBUG */
+#if defined(CONFIG_SERIAL_8250) && defined(CONFIG_KGDB)
+       ppc_md.early_serial_map = mpc85xx_early_serial_map;
+#endif /* CONFIG_SERIAL_8250 && CONFIG_KGDB */
 
        if (ppc_md.progress)
                ppc_md.progress("mpc85xx_cds_init(): exit", 0);
index 7627d77504bd07a8da615ccff57662ca44f4421e..12b292c6ae3225bb41eeea720de35a8770bdca0a 100644 (file)
@@ -77,4 +77,7 @@
 
 #define MPC85XX_PCI2_IO_SIZE         0x01000000
 
+#define NR_8259_INTS                16
+#define CPM_IRQ_OFFSET              NR_8259_INTS
+
 #endif /* __MACH_MPC85XX_CDS_H__ */
index 9ab05e590c3e0a60537052f7880fc5f8e4033aba..3dbdd73618ebd9ce31d7377e60b9a2d57ffa3e33 100644 (file)
@@ -41,7 +41,6 @@
 #include <asm/time.h>
 #include <asm/io.h>
 #include <asm/machdep.h>
-#include <asm/prom.h>
 #include <asm/open_pic.h>
 #include <asm/bootinfo.h>
 #include <asm/pci-bridge.h>
@@ -125,7 +124,7 @@ sbc8560_setup_arch(void)
 #ifdef CONFIG_SERIAL_TEXT_DEBUG
        /* Invalidate the entry we stole earlier the serial ports
         * should be properly mapped */ 
-       invalidate_tlbcam_entry(NUM_TLBCAMS - 1);
+       invalidate_tlbcam_entry(num_tlbcam_entries - 1);
 #endif
 
        /* setup the board related information for the enet controllers */
@@ -176,7 +175,7 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
 
 #ifdef CONFIG_SERIAL_TEXT_DEBUG
        /* Use the last TLB entry to map CCSRBAR to allow access to DUART regs */
-       settlbcam(NUM_TLBCAMS - 1, UARTA_ADDR,
+       settlbcam(num_tlbcam_entries - 1, UARTA_ADDR,
                  UARTA_ADDR, 0x1000, _PAGE_IO, 0);
 #endif
 
@@ -221,6 +220,9 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
 #if defined(CONFIG_SERIAL_8250) && defined(CONFIG_SERIAL_TEXT_DEBUG)
        ppc_md.progress = gen550_progress;
 #endif /* CONFIG_SERIAL_8250 && CONFIG_SERIAL_TEXT_DEBUG */
+#if defined(CONFIG_SERIAL_8250) && defined(CONFIG_KGDB)
+       ppc_md.early_serial_map = sbc8560_early_serial_map;
+#endif /* CONFIG_SERIAL_8250 && CONFIG_KGDB */
 
        if (ppc_md.progress)
                ppc_md.progress("sbc8560_init(): exit", 0);
index 2d638c1c1bd6f79847fb5d4109ca383c59ca65ee..4f6d1ddd6fb8073cc76d7923b3721e77ac80028a 100644 (file)
@@ -35,7 +35,6 @@
 #include <asm/time.h>
 #include <asm/io.h>
 #include <asm/machdep.h>
-#include <asm/prom.h>
 #include <asm/open_pic.h>
 #include <asm/bootinfo.h>
 #include <asm/pci-bridge.h>
@@ -59,40 +58,8 @@ unsigned long pci_dram_offset = 0;
 extern unsigned long total_memory;     /* in mm/init */
 
 /* Internal interrupts are all Level Sensitive, and Positive Polarity */
-
 static u_char sbc8560_openpic_initsenses[] __initdata = {
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  0: L2 Cache */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  1: ECM */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  2: DDR DRAM */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  3: LBIU */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  4: DMA 0 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  5: DMA 1 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  6: DMA 2 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  7: DMA 3 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  8: PCI/PCI-X */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  9: RIO Inbound Port Write Error */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 10: RIO Doorbell Inbound */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 11: RIO Outbound Message */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 12: RIO Inbound Message */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 13: TSEC 0 Transmit */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 14: TSEC 0 Receive */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 15: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 16: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 17: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 18: TSEC 0 Receive/Transmit Error */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 19: TSEC 1 Transmit */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 20: TSEC 1 Receive */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 21: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 22: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 23: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 24: TSEC 1 Receive/Transmit Error */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 25: Fast Ethernet */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 26: DUART */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 27: I2C */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 28: Performance Monitor */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 29: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 30: CPM */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 31: Unused */
+       MPC85XX_INTERNAL_IRQ_SENSES,
        0x0,                            /* External  0: */
        0x0,                            /* External  1: */
 #if defined(CONFIG_PCI)
@@ -159,7 +126,7 @@ sbc8560_init_IRQ(void)
        /* Skip reserved space and internal sources */
        openpic_set_sources(0, 32, OpenPIC_Addr + 0x10200);
        /* Map PIC IRQs 0-11 */
-       openpic_set_sources(32, 12, OpenPIC_Addr + 0x10000);
+       openpic_set_sources(48, 12, OpenPIC_Addr + 0x10000);
 
        /* we let openpic interrupts starting from an offset, to 
         * leave space for cascading interrupts underneath.
index bc95836e417c512b88924b513104de64069397f2..9455bb6b45e933dfe220c62afe96a8bf4543b1ac 100644 (file)
@@ -46,7 +46,6 @@
 #include <asm/time.h>
 #include <asm/io.h>
 #include <asm/machdep.h>
-#include <asm/prom.h>
 #include <asm/open_pic.h>
 #include <asm/bootinfo.h>
 #include <asm/pci-bridge.h>
@@ -72,38 +71,7 @@ unsigned long pci_dram_offset = 0;
 
 /* Internal interrupts are all Level Sensitive, and Positive Polarity */
 static u8 gp3_openpic_initsenses[] __initdata = {
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  0: L2 Cache */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  1: ECM */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  2: DDR DRAM */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  3: LBIU */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  4: DMA 0 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  5: DMA 1 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  6: DMA 2 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  7: DMA 3 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  8: PCI/PCI-X */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  9: RIO Inbound Port Write Error */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 10: RIO Doorbell Inbound */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 11: RIO Outbound Message */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 12: RIO Inbound Message */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 13: TSEC 0 Transmit */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 14: TSEC 0 Receive */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 15: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 16: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 17: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 18: TSEC 0 Receive/Transmit Error */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 19: TSEC 1 Transmit */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 20: TSEC 1 Receive */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 21: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 22: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 23: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 24: TSEC 1 Receive/Transmit Error */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 25: Fast Ethernet */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 26: DUART */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 27: I2C */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 28: Performance Monitor */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 29: Unused */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 30: CPM */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 31: Unused */
+       MPC85XX_INTERNAL_IRQ_SENSES,
        0x0,                                            /* External  0: */
 #if defined(CONFIG_PCI)
        (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* External 1: PCI slot 0 */
@@ -200,7 +168,6 @@ static struct irqaction cpm2_irqaction = {
 static void __init
 gp3_init_IRQ(void)
 {
-       int i;
        bd_t *binfo = (bd_t *) __res;
 
        /*
@@ -218,7 +185,7 @@ gp3_init_IRQ(void)
        openpic_set_sources(0, 32, OpenPIC_Addr + 0x10200);
 
        /* Map PIC IRQs 0-11 */
-       openpic_set_sources(32, 12, OpenPIC_Addr + 0x10000);
+       openpic_set_sources(48, 12, OpenPIC_Addr + 0x10000);
 
        /*
         * Let openpic interrupts starting from an offset, to
index f7fb2786cd505a7701fe2322c73b169af4ff2133..5fdd4f607a40f23b25e441a9b9140c22364fa323 100644 (file)
@@ -83,16 +83,13 @@ static u32 frequency_gpio;
 static u32 slew_done_gpio;
 static int no_schedule;
 static int has_cpu_l2lve;
-
-
-#define PMAC_CPU_LOW_SPEED     1
-#define PMAC_CPU_HIGH_SPEED    0
+static int is_pmu_based;
 
 /* There are only two frequency states for each processor. Values
  * are in kHz for the time being.
  */
-#define CPUFREQ_HIGH                  PMAC_CPU_HIGH_SPEED
-#define CPUFREQ_LOW                   PMAC_CPU_LOW_SPEED
+#define CPUFREQ_HIGH                  0
+#define CPUFREQ_LOW                   1
 
 static struct cpufreq_frequency_table pmac_cpu_freqs[] = {
        {CPUFREQ_HIGH,          0},
@@ -100,6 +97,11 @@ static struct cpufreq_frequency_table pmac_cpu_freqs[] = {
        {0,                     CPUFREQ_TABLE_END},
 };
 
+static struct freq_attr* pmac_cpu_freqs_attr[] = {
+       &cpufreq_freq_attr_scaling_available_freqs,
+       NULL,
+};
+
 static inline void local_delay(unsigned long ms)
 {
        if (no_schedule)
@@ -269,6 +271,8 @@ static int __pmac pmu_set_cpu_speed(int low_speed)
 #ifdef DEBUG_FREQ
        printk(KERN_DEBUG "HID1, before: %x\n", mfspr(SPRN_HID1));
 #endif
+       pmu_suspend();
+
        /* Disable all interrupt sources on openpic */
        pic_prio = openpic_get_priority();
        openpic_set_priority(0xf);
@@ -343,6 +347,8 @@ static int __pmac pmu_set_cpu_speed(int low_speed)
        debug_calc_bogomips();
 #endif
 
+       pmu_resume();
+
        preempt_enable();
 
        return 0;
@@ -355,7 +361,7 @@ static int __pmac do_set_cpu_speed(int speed_mode, int notify)
        static unsigned long prev_l3cr;
 
        freqs.old = cur_freq;
-       freqs.new = (speed_mode == PMAC_CPU_HIGH_SPEED) ? hi_freq : low_freq;
+       freqs.new = (speed_mode == CPUFREQ_HIGH) ? hi_freq : low_freq;
        freqs.cpu = smp_processor_id();
 
        if (freqs.old == freqs.new)
@@ -363,7 +369,7 @@ static int __pmac do_set_cpu_speed(int speed_mode, int notify)
 
        if (notify)
                cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
-       if (speed_mode == PMAC_CPU_LOW_SPEED &&
+       if (speed_mode == CPUFREQ_LOW &&
            cpu_has_feature(CPU_FTR_L3CR)) {
                l3cr = _get_L3CR();
                if (l3cr & L3CR_L3E) {
@@ -371,8 +377,8 @@ static int __pmac do_set_cpu_speed(int speed_mode, int notify)
                        _set_L3CR(0);
                }
        }
-       set_speed_proc(speed_mode == PMAC_CPU_LOW_SPEED);
-       if (speed_mode == PMAC_CPU_HIGH_SPEED &&
+       set_speed_proc(speed_mode == CPUFREQ_LOW);
+       if (speed_mode == CPUFREQ_HIGH &&
            cpu_has_feature(CPU_FTR_L3CR)) {
                l3cr = _get_L3CR();
                if ((prev_l3cr & L3CR_L3E) && l3cr != prev_l3cr)
@@ -380,7 +386,7 @@ static int __pmac do_set_cpu_speed(int speed_mode, int notify)
        }
        if (notify)
                cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
-       cur_freq = (speed_mode == PMAC_CPU_HIGH_SPEED) ? hi_freq : low_freq;
+       cur_freq = (speed_mode == CPUFREQ_HIGH) ? hi_freq : low_freq;
 
        return 0;
 }
@@ -423,7 +429,8 @@ static int __pmac pmac_cpufreq_cpu_init(struct cpufreq_policy *policy)
        policy->cpuinfo.transition_latency      = CPUFREQ_ETERNAL;
        policy->cur = cur_freq;
 
-       return cpufreq_frequency_table_cpuinfo(policy, &pmac_cpu_freqs[0]);
+       cpufreq_frequency_table_get_attr(pmac_cpu_freqs, policy->cpu);
+       return cpufreq_frequency_table_cpuinfo(policy, pmac_cpu_freqs);
 }
 
 static u32 __pmac read_gpio(struct device_node *np)
@@ -456,8 +463,8 @@ static int __pmac pmac_cpufreq_suspend(struct cpufreq_policy *policy, u32 state)
         */
        no_schedule = 1;
        sleep_freq = cur_freq;
-       if (cur_freq == low_freq)
-               do_set_cpu_speed(PMAC_CPU_HIGH_SPEED, 0);
+       if (cur_freq == low_freq && !is_pmu_based)
+               do_set_cpu_speed(CPUFREQ_HIGH, 0);
        return 0;
 }
 
@@ -473,8 +480,8 @@ static int __pmac pmac_cpufreq_resume(struct cpufreq_policy *policy)
         * is that we force a switch to whatever it was, which is
         * probably high speed due to our suspend() routine
         */
-       do_set_cpu_speed(sleep_freq == low_freq ? PMAC_CPU_LOW_SPEED
-                        : PMAC_CPU_HIGH_SPEED, 0);
+       do_set_cpu_speed(sleep_freq == low_freq ?
+                        CPUFREQ_LOW : CPUFREQ_HIGH, 0);
 
        no_schedule = 0;
        return 0;
@@ -488,6 +495,7 @@ static struct cpufreq_driver pmac_cpufreq_driver = {
        .suspend        = pmac_cpufreq_suspend,
        .resume         = pmac_cpufreq_resume,
        .flags          = CPUFREQ_PM_NO_WARN,
+       .attr           = pmac_cpu_freqs_attr,
        .name           = "powermac",
        .owner          = THIS_MODULE,
 };
@@ -580,6 +588,7 @@ static int __pmac pmac_cpufreq_init_MacRISC3(struct device_node *cpunode)
                return 1;
        hi_freq = (*value) / 1000;
        set_speed_proc = pmu_set_cpu_speed;
+       is_pmu_based = 1;
 
        return 0;
 }
@@ -684,6 +693,7 @@ static int __init pmac_cpufreq_setup(void)
                hi_freq = cur_freq;
                low_freq = 400000;
                set_speed_proc = pmu_set_cpu_speed;
+               is_pmu_based = 1;
        }
        /* Else check for TiPb 400 & 500 */
        else if (machine_is_compatible("PowerBook3,2")) {
@@ -695,6 +705,7 @@ static int __init pmac_cpufreq_setup(void)
                hi_freq = cur_freq;
                low_freq = 300000;
                set_speed_proc = pmu_set_cpu_speed;
+               is_pmu_based = 1;
        }
        /* Else check for 750FX */
        else if (PVR_VER(mfspr(SPRN_PVR)) == 0x7000)
index cf5e5dd06d6300d7733b20f4e5b21c31a1bdda48..067d9a5aebc108f7301913e74d3d218161c23ea7 100644 (file)
 /* PCI interrupt controller */
 #define PCI_INT_STAT_REG       0xF8200000
 #define PCI_INT_MASK_REG       0xF8200004
-#define PIRQA                  (NR_SIU_INTS + 0)
-#define PIRQB                  (NR_SIU_INTS + 1)
-#define PIRQC                  (NR_SIU_INTS + 2)
-#define PIRQD                  (NR_SIU_INTS + 3)
+#define PIRQA                  (NR_CPM_INTS + 0)
+#define PIRQB                  (NR_CPM_INTS + 1)
+#define PIRQC                  (NR_CPM_INTS + 2)
+#define PIRQD                  (NR_CPM_INTS + 3)
 
 /*
  * PCI memory map definitions for MPC8266ADS-PCI.
  *     0x00000000-0x1FFFFFFF   0x00000000-0x1FFFFFFF   MPC8266 local memory
  */
 
-/* window for a PCI master to access MPC8266 memory */
-#define PCI_SLV_MEM_LOCAL      0x00000000      /* Local base */
-#define PCI_SLV_MEM_BUS                0x00000000      /* PCI base */
+/* All the other PCI memory map definitions reside at syslib/m82xx_pci.h
+   Here we should redefine what is unique for this board */
+#define M82xx_PCI_SLAVE_MEM_LOCAL      0x00000000      /* Local base */
+#define M82xx_PCI_SLAVE_MEM_BUS                0x00000000      /* PCI base */
+#define M82xx_PCI_SLAVE_MEM_SIZE       0x10000000      /* 256 Mb */
 
-/* window for the processor to access PCI memory with prefetching */
-#define PCI_MSTR_MEM_LOCAL     0x80000000      /* Local base */
-#define PCI_MSTR_MEM_BUS       0x80000000      /* PCI base   */
-#define PCI_MSTR_MEM_SIZE      0x20000000      /* 512MB */
+#define M82xx_PCI_SLAVE_SEC_WND_SIZE   ~(0x40000000 - 1U)      /* 2 x 512Mb  */
+#define M82xx_PCI_SLAVE_SEC_WND_BASE   0x80000000              /* PCI Memory base */
 
-/* window for the processor to access PCI memory without prefetching */
-#define PCI_MSTR_MEMIO_LOCAL   0xA0000000      /* Local base */
-#define PCI_MSTR_MEMIO_BUS     0xA0000000      /* PCI base   */
-#define PCI_MSTR_MEMIO_SIZE    0x20000000      /* 512MB */
+#if defined(CONFIG_ADS8272)
+#define PCI_INT_TO_SIU         SIU_INT_IRQ2
+#elif defined(CONFIG_PQ2FADS)
+#define PCI_INT_TO_SIU         SIU_INT_IRQ6
+#else
+#warning PCI Bridge will be without interrupts support
+#endif
 
-/* window for the processor to access PCI I/O */
-#define PCI_MSTR_IO_LOCAL      0xF4000000      /* Local base */
-#define PCI_MSTR_IO_BUS         0x00000000     /* PCI base   */
-#define PCI_MSTR_IO_SIZE        0x04000000     /* 64MB */
-
-#define _IO_BASE               PCI_MSTR_IO_LOCAL
-#define _ISA_MEM_BASE          PCI_MSTR_MEMIO_LOCAL
-#define PCI_DRAM_OFFSET                PCI_SLV_MEM_BUS
 #endif /* CONFIG_PCI */
 
 #endif /* __MACH_ADS8260_DEFS */
index 531bfa0e451214c10f9b3d68a1721794721cbd50..70e58f43f2b84b47043494c2e15c9b5a12ebb563 100644 (file)
@@ -81,6 +81,7 @@
 #include <linux/serial.h>
 #include <linux/tty.h> /* for linux/serial_core.h */
 #include <linux/serial_core.h>
+#include <linux/serial_8250.h>
 
 #include <asm/system.h>
 #include <asm/pgtable.h>
 #include <asm/mpc10x.h>
 #include <asm/pci-bridge.h>
 #include <asm/kgdb.h>
+#include <asm/ppc_sys.h>
 
 #include "sandpoint.h"
 
@@ -305,6 +307,24 @@ sandpoint_setup_arch(void)
        /* Lookup PCI host bridges */
        sandpoint_find_bridges();
 
+       if (strncmp (cur_ppc_sys_spec->ppc_sys_name, "8245", 4) == 0)
+       {
+               bd_t *bp = (bd_t *)__res;
+               struct plat_serial8250_port *pdata;
+               pdata = (struct plat_serial8250_port *) ppc_sys_get_pdata(MPC10X_DUART);
+
+               if (pdata)
+               {
+                       pdata[0].uartclk = bp->bi_busfreq;
+                       pdata[0].membase = ioremap(pdata[0].mapbase, 0x100);
+
+                       /* this disables the 2nd serial port on the DUART
+                        * since the sandpoint does not have it connected */
+                       pdata[1].uartclk = 0;
+                       pdata[1].irq = 0;
+                       pdata[1].mapbase = 0;
+               }
+
        printk(KERN_INFO "Motorola SPS Sandpoint Test Platform\n");
        printk(KERN_INFO "Port by MontaVista Software, Inc. (source@mvista.com)\n");
 
index dd418ea3426c70a4ed065986e464967fce8122fb..dec5bf4f6879ff3956aa3b7cddfde7a2028595f4 100644 (file)
@@ -81,7 +81,7 @@ obj-$(CONFIG_SBC82xx)         += todc_time.o
 obj-$(CONFIG_SPRUCE)           += cpc700_pic.o indirect_pci.o pci_auto.o \
                                   todc_time.o
 obj-$(CONFIG_8260)             += m8260_setup.o
-obj-$(CONFIG_PCI_8260)         += m8260_pci.o indirect_pci.o
+obj-$(CONFIG_PCI_8260)         += m82xx_pci.o indirect_pci.o pci_auto.o
 obj-$(CONFIG_8260_PCI9)                += m8260_pci_erratum9.o
 obj-$(CONFIG_CPM2)             += cpm2_common.o cpm2_pic.o
 ifeq ($(CONFIG_PPC_GEN550),y)
@@ -92,12 +92,12 @@ ifeq ($(CONFIG_SERIAL_MPSC_CONSOLE),y)
 obj-$(CONFIG_SERIAL_TEXT_DEBUG)        += mv64x60_dbg.o
 endif
 obj-$(CONFIG_BOOTX_TEXT)       += btext.o
-obj-$(CONFIG_MPC10X_BRIDGE)     += mpc10x_common.o indirect_pci.o
+obj-$(CONFIG_MPC10X_BRIDGE)    += mpc10x_common.o indirect_pci.o ppc_sys.o
 obj-$(CONFIG_MPC10X_OPENPIC)   += open_pic.o
 obj-$(CONFIG_40x)              += dcr.o
 obj-$(CONFIG_BOOKE)            += dcr.o
 obj-$(CONFIG_85xx)             += open_pic.o ppc85xx_common.o ppc85xx_setup.o \
-                                       ppc_sys.o mpc85xx_sys.o \
+                                       ppc_sys.o i8259.o mpc85xx_sys.o \
                                        mpc85xx_devices.o
 ifeq ($(CONFIG_85xx),y)
 obj-$(CONFIG_PCI)              += indirect_pci.o pci_auto.o
@@ -107,6 +107,7 @@ obj-$(CONFIG_83xx)          += ipic.o ppc83xx_setup.o ppc_sys.o \
 ifeq ($(CONFIG_83xx),y)
 obj-$(CONFIG_PCI)              += indirect_pci.o pci_auto.o
 endif
+obj-$(CONFIG_MPC8548_CDS)      += todc_time.o
 obj-$(CONFIG_MPC8555_CDS)      += todc_time.o
 obj-$(CONFIG_PPC_MPC52xx)      += mpc52xx_setup.o mpc52xx_pic.o \
                                        mpc52xx_sys.o mpc52xx_devices.o ppc_sys.o
index acb2cde3171f8d141b7f38f95e9def9a62210851..580ed658e87253b51873b624ed5b8f0d228f1ba5 100644 (file)
@@ -479,7 +479,7 @@ void __init ipic_init(phys_addr_t phys_addr,
        temp = 0;
        for (i = 0 ; i < senses_count ; i++) {
                if ((senses[i] & IRQ_SENSE_MASK) == IRQ_SENSE_EDGE) {
-                       temp |= 1 << (16 - i);
+                       temp |= 1 << (15 - i);
                        if (i != 0)
                                irq_desc[i + irq_offset + MPC83xx_IRQ_EXT1 - 1].status = 0;
                        else
diff --git a/arch/ppc/syslib/m8260_pci.c b/arch/ppc/syslib/m8260_pci.c
deleted file mode 100644 (file)
index 057cc3f..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * (C) Copyright 2003
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * (C) Copyright 2004 Red Hat, Inc.
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-#include <linux/slab.h>
-#include <linux/delay.h>
-
-#include <asm/byteorder.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/uaccess.h>
-#include <asm/machdep.h>
-#include <asm/pci-bridge.h>
-#include <asm/immap_cpm2.h>
-#include <asm/mpc8260.h>
-
-#include "m8260_pci.h"
-
-
-/* PCI bus configuration registers.
- */
-
-static void __init m8260_setup_pci(struct pci_controller *hose)
-{
-       volatile cpm2_map_t *immap = cpm2_immr;
-       unsigned long pocmr;
-       u16 tempShort;
-
-#ifndef CONFIG_ATC     /* already done in U-Boot */
-       /* 
-        * Setting required to enable IRQ1-IRQ7 (SIUMCR [DPPC]), 
-        * and local bus for PCI (SIUMCR [LBPC]).
-        */
-       immap->im_siu_conf.siu_82xx.sc_siumcr = 0x00640000;
-#endif
-
-       /* Make PCI lowest priority */
-       /* Each 4 bits is a device bus request  and the MS 4bits 
-          is highest priority */
-       /* Bus               4bit value 
-          ---               ----------
-          CPM high          0b0000
-          CPM middle        0b0001
-          CPM low           0b0010
-          PCI reguest       0b0011
-          Reserved          0b0100
-          Reserved          0b0101
-          Internal Core     0b0110
-          External Master 1 0b0111
-          External Master 2 0b1000
-          External Master 3 0b1001
-          The rest are reserved */
-       immap->im_siu_conf.siu_82xx.sc_ppc_alrh = 0x61207893;
-
-       /* Park bus on core while modifying PCI Bus accesses */
-       immap->im_siu_conf.siu_82xx.sc_ppc_acr = 0x6;
-
-       /* 
-        * Set up master window that allows the CPU to access PCI space. This 
-        * window is set up using the first SIU PCIBR registers.
-        */
-       immap->im_memctl.memc_pcimsk0 = MPC826x_PCI_MASK;
-       immap->im_memctl.memc_pcibr0 =  MPC826x_PCI_BASE | PCIBR_ENABLE;
-
-       /* Disable machine check on no response or target abort */
-       immap->im_pci.pci_emr = cpu_to_le32(0x1fe7);
-       /* Release PCI RST (by default the PCI RST signal is held low)  */
-       immap->im_pci.pci_gcr = cpu_to_le32(PCIGCR_PCI_BUS_EN);
-
-       /* give it some time */
-       mdelay(1);
-
-       /* 
-        * Set up master window that allows the CPU to access PCI Memory (prefetch) 
-        * space. This window is set up using the first set of Outbound ATU registers.
-        */
-       immap->im_pci.pci_potar0 = cpu_to_le32(MPC826x_PCI_LOWER_MEM >> 12);
-       immap->im_pci.pci_pobar0 = cpu_to_le32((MPC826x_PCI_LOWER_MEM - MPC826x_PCI_MEM_OFFSET) >> 12);
-       pocmr = ((MPC826x_PCI_UPPER_MEM - MPC826x_PCI_LOWER_MEM) >> 12) ^ 0xfffff;
-       immap->im_pci.pci_pocmr0 = cpu_to_le32(pocmr | POCMR_ENABLE | POCMR_PREFETCH_EN);
-
-       /* 
-        * Set up master window that allows the CPU to access PCI Memory (non-prefetch) 
-        * space. This window is set up using the second set of Outbound ATU registers.
-        */
-       immap->im_pci.pci_potar1 = cpu_to_le32(MPC826x_PCI_LOWER_MMIO >> 12);
-       immap->im_pci.pci_pobar1 = cpu_to_le32((MPC826x_PCI_LOWER_MMIO - MPC826x_PCI_MMIO_OFFSET) >> 12);
-       pocmr = ((MPC826x_PCI_UPPER_MMIO - MPC826x_PCI_LOWER_MMIO) >> 12) ^ 0xfffff;
-       immap->im_pci.pci_pocmr1 = cpu_to_le32(pocmr | POCMR_ENABLE);
-
-       /* 
-        * Set up master window that allows the CPU to access PCI IO space. This window
-        * is set up using the third set of Outbound ATU registers.
-        */
-       immap->im_pci.pci_potar2 = cpu_to_le32(MPC826x_PCI_IO_BASE >> 12);
-       immap->im_pci.pci_pobar2 = cpu_to_le32(MPC826x_PCI_LOWER_IO >> 12);
-       pocmr = ((MPC826x_PCI_UPPER_IO - MPC826x_PCI_LOWER_IO) >> 12) ^ 0xfffff;
-       immap->im_pci.pci_pocmr2 = cpu_to_le32(pocmr | POCMR_ENABLE | POCMR_PCI_IO);
-
-       /* 
-        * Set up slave window that allows PCI masters to access MPC826x local memory. 
-        * This window is set up using the first set of Inbound ATU registers
-        */
-
-       immap->im_pci.pci_pitar0 = cpu_to_le32(MPC826x_PCI_SLAVE_MEM_LOCAL >> 12);
-       immap->im_pci.pci_pibar0 = cpu_to_le32(MPC826x_PCI_SLAVE_MEM_BUS >> 12);
-       pocmr = ((MPC826x_PCI_SLAVE_MEM_SIZE-1) >> 12) ^ 0xfffff;
-       immap->im_pci.pci_picmr0 = cpu_to_le32(pocmr | PICMR_ENABLE | PICMR_PREFETCH_EN);
-
-       /* See above for description - puts PCI request as highest priority */
-       immap->im_siu_conf.siu_82xx.sc_ppc_alrh = 0x03124567;
-
-       /* Park the bus on the PCI */
-       immap->im_siu_conf.siu_82xx.sc_ppc_acr = PPC_ACR_BUS_PARK_PCI;
-
-       /* Host mode - specify the bridge as a host-PCI bridge */
-       early_write_config_word(hose, 0, 0, PCI_CLASS_DEVICE, PCI_CLASS_BRIDGE_HOST);
-
-       /* Enable the host bridge to be a master on the PCI bus, and to act as a PCI memory target */
-       early_read_config_word(hose, 0, 0, PCI_COMMAND, &tempShort);
-       early_write_config_word(hose, 0, 0, PCI_COMMAND,
-                               tempShort | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY);
-}
-
-void __init m8260_find_bridges(void)
-{
-       extern int pci_assign_all_busses;
-       struct pci_controller * hose;
-
-       pci_assign_all_busses = 1;
-
-       hose = pcibios_alloc_controller();
-
-       if (!hose)
-               return;
-
-       ppc_md.pci_swizzle = common_swizzle;
-
-       hose->first_busno = 0;
-       hose->bus_offset = 0;
-       hose->last_busno = 0xff;
-
-       setup_m8260_indirect_pci(hose, 
-                                (unsigned long)&cpm2_immr->im_pci.pci_cfg_addr,
-                                (unsigned long)&cpm2_immr->im_pci.pci_cfg_data);
-
-       m8260_setup_pci(hose);
-        hose->pci_mem_offset = MPC826x_PCI_MEM_OFFSET;
-
-        hose->io_base_virt = ioremap(MPC826x_PCI_IO_BASE,
-                                        MPC826x_PCI_IO_SIZE);
-        isa_io_base = (unsigned long) hose->io_base_virt;
-        /* setup resources */
-        pci_init_resource(&hose->mem_resources[0],
-                         MPC826x_PCI_LOWER_MEM,
-                         MPC826x_PCI_UPPER_MEM,
-                         IORESOURCE_MEM|IORESOURCE_PREFETCH, "PCI prefetchable memory");
-
-        pci_init_resource(&hose->mem_resources[1],
-                         MPC826x_PCI_LOWER_MMIO,
-                         MPC826x_PCI_UPPER_MMIO,
-                         IORESOURCE_MEM, "PCI memory");
-
-        pci_init_resource(&hose->io_resource,
-                         MPC826x_PCI_LOWER_IO,
-                         MPC826x_PCI_UPPER_IO,
-                         IORESOURCE_IO, "PCI I/O");
-}
diff --git a/arch/ppc/syslib/m8260_pci.h b/arch/ppc/syslib/m8260_pci.h
deleted file mode 100644 (file)
index d135212..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-
-#ifndef _PPC_KERNEL_M8260_PCI_H
-#define _PPC_KERNEL_M8260_PCI_H
-
-#include <asm/m8260_pci.h>
-
-/*
- *   Local->PCI map (from CPU)                             controlled by
- *   MPC826x master window
- *
- *   0x80000000 - 0xBFFFFFFF    Total CPU2PCI space        PCIBR0
- *                       
- *   0x80000000 - 0x9FFFFFFF    PCI Mem with prefetch      (Outbound ATU #1)
- *   0xA0000000 - 0xAFFFFFFF    PCI Mem w/o  prefetch      (Outbound ATU #2)
- *   0xB0000000 - 0xB0FFFFFF    32-bit PCI IO              (Outbound ATU #3)
- *                      
- *   PCI->Local map (from PCI)
- *   MPC826x slave window                                  controlled by
- *
- *   0x00000000 - 0x07FFFFFF    MPC826x local memory       (Inbound ATU #1)
- */
-
-/* 
- * Slave window that allows PCI masters to access MPC826x local memory. 
- * This window is set up using the first set of Inbound ATU registers
- */
-
-#ifndef MPC826x_PCI_SLAVE_MEM_LOCAL
-#define MPC826x_PCI_SLAVE_MEM_LOCAL    (((struct bd_info *)__res)->bi_memstart)
-#define MPC826x_PCI_SLAVE_MEM_BUS      (((struct bd_info *)__res)->bi_memstart)
-#define MPC826x_PCI_SLAVE_MEM_SIZE     (((struct bd_info *)__res)->bi_memsize)
-#endif
-
-/* 
- * This is the window that allows the CPU to access PCI address space.
- * It will be setup with the SIU PCIBR0 register. All three PCI master
- * windows, which allow the CPU to access PCI prefetch, non prefetch,
- * and IO space (see below), must all fit within this window. 
- */
-#ifndef MPC826x_PCI_BASE
-#define MPC826x_PCI_BASE       0x80000000
-#define MPC826x_PCI_MASK       0xc0000000
-#endif
-
-#ifndef MPC826x_PCI_LOWER_MEM
-#define MPC826x_PCI_LOWER_MEM  0x80000000
-#define MPC826x_PCI_UPPER_MEM  0x9fffffff
-#define MPC826x_PCI_MEM_OFFSET 0x00000000
-#endif
-
-#ifndef MPC826x_PCI_LOWER_MMIO
-#define MPC826x_PCI_LOWER_MMIO  0xa0000000
-#define MPC826x_PCI_UPPER_MMIO  0xafffffff
-#define MPC826x_PCI_MMIO_OFFSET 0x00000000
-#endif
-
-#ifndef MPC826x_PCI_LOWER_IO
-#define MPC826x_PCI_LOWER_IO   0x00000000
-#define MPC826x_PCI_UPPER_IO   0x00ffffff
-#define MPC826x_PCI_IO_BASE    0xb0000000
-#define MPC826x_PCI_IO_SIZE    0x01000000
-#endif
-
-#ifndef _IO_BASE
-#define _IO_BASE isa_io_base
-#endif
-
-#ifdef CONFIG_8260_PCI9
-struct pci_controller;
-extern void setup_m8260_indirect_pci(struct pci_controller* hose,
-                                    u32 cfg_addr, u32 cfg_data);
-#else
-#define setup_m8260_indirect_pci setup_indirect_pci
-#endif
-
-#endif /* _PPC_KERNEL_M8260_PCI_H */
index 9c0582d639e051ccba4d213044045bf99211550c..1dc7e4e1d4914ed5d11f583b944de475092436d7 100644 (file)
@@ -31,7 +31,7 @@
 #include <asm/immap_cpm2.h>
 #include <asm/cpm2.h>
 
-#include "m8260_pci.h"
+#include "m82xx_pci.h"
 
 #ifdef CONFIG_8260_PCI9
 /*#include <asm/mpc8260_pci9.h>*/ /* included in asm/io.h */
@@ -248,11 +248,11 @@ EXPORT_SYMBOL(idma_pci9_read_le);
 
 static inline int is_pci_mem(unsigned long addr)
 {
-       if (addr >= MPC826x_PCI_LOWER_MMIO &&
-           addr <= MPC826x_PCI_UPPER_MMIO)
+       if (addr >= M82xx_PCI_LOWER_MMIO &&
+               addr <= M82xx_PCI_UPPER_MMIO)
                return 1;
-       if (addr >= MPC826x_PCI_LOWER_MEM &&
-           addr <= MPC826x_PCI_UPPER_MEM)
+       if (addr >= M82xx_PCI_LOWER_MEM &&
+               addr <= M82xx_PCI_UPPER_MEM)
                return 1;
        return 0;
 }
index 23ea3f694de2066ec5b324ebedb38b1c027415ce..fda75d79050c3e9201ce7033193645bd74609aec 100644 (file)
@@ -34,7 +34,8 @@
 unsigned char __res[sizeof(bd_t)];
 
 extern void cpm2_reset(void);
-extern void m8260_find_bridges(void);
+extern void pq2_find_bridges(void);
+extern void pq2pci_init_irq(void);
 extern void idma_pci9_init(void);
 
 /* Place-holder for board-specific init */
@@ -56,7 +57,7 @@ m8260_setup_arch(void)
        idma_pci9_init();
 #endif
 #ifdef CONFIG_PCI_8260
-       m8260_find_bridges();
+       pq2_find_bridges();
 #endif
 #ifdef CONFIG_BLK_DEV_INITRD
        if (initrd_start)
@@ -173,6 +174,12 @@ m8260_init_IRQ(void)
         * in case the boot rom changed something on us.
         */
        cpm2_immr->im_intctl.ic_siprr = 0x05309770;
+
+#if defined(CONFIG_PCI) && (defined(CONFIG_ADS8272) || defined(CONFIG_PQ2FADS))
+       /* Initialize stuff for the 82xx CPLD IC and install demux  */
+       pq2pci_init_irq();
+#endif
+
 }
 
 /*
diff --git a/arch/ppc/syslib/m82xx_pci.c b/arch/ppc/syslib/m82xx_pci.c
new file mode 100644 (file)
index 0000000..5e7a7ed
--- /dev/null
@@ -0,0 +1,383 @@
+/*
+ *
+ * (C) Copyright 2003
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * (C) Copyright 2004 Red Hat, Inc.
+ *
+ * 2005 (c) MontaVista Software, Inc.
+ * Vitaly Bordug <vbordug@ru.mvista.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/pci.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+
+#include <asm/byteorder.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/uaccess.h>
+#include <asm/machdep.h>
+#include <asm/pci-bridge.h>
+#include <asm/immap_cpm2.h>
+#include <asm/mpc8260.h>
+#include <asm/cpm2.h>
+
+#include "m82xx_pci.h"
+
+/*
+ * Interrupt routing
+ */
+
+static inline int
+pq2pci_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin)
+{
+       static char pci_irq_table[][4] =
+       /*
+        *      PCI IDSEL/INTPIN->INTLINE
+        *        A      B      C      D
+        */
+       {
+               { PIRQA, PIRQB, PIRQC, PIRQD }, /* IDSEL 22 - PCI slot 0 */
+               { PIRQD, PIRQA, PIRQB, PIRQC }, /* IDSEL 23 - PCI slot 1 */
+               { PIRQC, PIRQD, PIRQA, PIRQB }, /* IDSEL 24 - PCI slot 2 */
+       };
+
+       const long min_idsel = 22, max_idsel = 24, irqs_per_slot = 4;
+       return PCI_IRQ_TABLE_LOOKUP;
+}
+
+static void
+pq2pci_mask_irq(unsigned int irq)
+{
+       int bit = irq - NR_CPM_INTS;
+
+       *(volatile unsigned long *) PCI_INT_MASK_REG |= (1 << (31 - bit));
+       return;
+}
+
+static void
+pq2pci_unmask_irq(unsigned int irq)
+{
+       int bit = irq - NR_CPM_INTS;
+
+       *(volatile unsigned long *) PCI_INT_MASK_REG &= ~(1 << (31 - bit));
+       return;
+}
+
+static void
+pq2pci_mask_and_ack(unsigned int irq)
+{
+       int bit = irq - NR_CPM_INTS;
+
+       *(volatile unsigned long *) PCI_INT_MASK_REG |= (1 << (31 - bit));
+       return;
+}
+
+static void
+pq2pci_end_irq(unsigned int irq)
+{
+       int bit = irq - NR_CPM_INTS;
+
+       *(volatile unsigned long *) PCI_INT_MASK_REG &= ~(1 << (31 - bit));
+       return;
+}
+
+struct hw_interrupt_type pq2pci_ic = {
+       "PQ2 PCI",
+       NULL,
+       NULL,
+       pq2pci_unmask_irq,
+       pq2pci_mask_irq,
+       pq2pci_mask_and_ack,
+       pq2pci_end_irq,
+       0
+};
+
+static irqreturn_t
+pq2pci_irq_demux(int irq, void *dev_id, struct pt_regs *regs)
+{
+       unsigned long stat, mask, pend;
+       int bit;
+
+       for(;;) {
+               stat = *(volatile unsigned long *) PCI_INT_STAT_REG;
+               mask = *(volatile unsigned long *) PCI_INT_MASK_REG;
+               pend = stat & ~mask & 0xf0000000;
+               if (!pend)
+                       break;
+               for (bit = 0; pend != 0; ++bit, pend <<= 1) {
+                       if (pend & 0x80000000)
+                               __do_IRQ(NR_CPM_INTS + bit, regs);
+               }
+       }
+
+       return IRQ_HANDLED;
+}
+
+static struct irqaction pq2pci_irqaction = {
+       .handler = pq2pci_irq_demux,
+       .flags   = SA_INTERRUPT,
+       .mask    = CPU_MASK_NONE,
+       .name    = "PQ2 PCI cascade",
+};
+
+
+void
+pq2pci_init_irq(void)
+{
+       int irq;
+       volatile cpm2_map_t *immap = cpm2_immr;
+#if defined CONFIG_ADS8272
+       /* configure chip select for PCI interrupt controller */
+       immap->im_memctl.memc_br3 = PCI_INT_STAT_REG | 0x00001801;
+       immap->im_memctl.memc_or3 = 0xffff8010;
+#elif defined CONFIG_PQ2FADS
+       immap->im_memctl.memc_br8 = PCI_INT_STAT_REG | 0x00001801;
+       immap->im_memctl.memc_or8 = 0xffff8010;
+#endif
+       for (irq = NR_CPM_INTS; irq < NR_CPM_INTS + 4; irq++)
+               irq_desc[irq].handler = &pq2pci_ic;
+
+       /* make PCI IRQ level sensitive */
+       immap->im_intctl.ic_siexr &=
+               ~(1 << (14 - (PCI_INT_TO_SIU - SIU_INT_IRQ1)));
+
+       /* mask all PCI interrupts */
+       *(volatile unsigned long *) PCI_INT_MASK_REG |= 0xfff00000;
+
+       /* install the demultiplexer for the PCI cascade interrupt */
+       setup_irq(PCI_INT_TO_SIU, &pq2pci_irqaction);
+       return;
+}
+
+static int
+pq2pci_exclude_device(u_char bus, u_char devfn)
+{
+       return PCIBIOS_SUCCESSFUL;
+}
+
+/* PCI bus configuration registers.
+ */
+static void
+pq2ads_setup_pci(struct pci_controller *hose)
+{
+       __u32 val;
+       volatile cpm2_map_t *immap = cpm2_immr;
+       bd_t* binfo = (bd_t*) __res;
+       u32 sccr = immap->im_clkrst.car_sccr;
+       uint pci_div,freq,time;
+               /* PCI int lowest prio */
+       /* Each 4 bits is a device bus request  and the MS 4bits
+        is highest priority */
+       /* Bus                4bit value
+          ---                ----------
+          CPM high             0b0000
+          CPM middle           0b0001
+          CPM low              0b0010
+          PCI reguest          0b0011
+          Reserved             0b0100
+          Reserved             0b0101
+          Internal Core        0b0110
+          External Master 1    0b0111
+          External Master 2    0b1000
+          External Master 3    0b1001
+          The rest are reserved
+        */
+       immap->im_siu_conf.siu_82xx.sc_ppc_alrh = 0x61207893;
+       /* park bus on core */
+       immap->im_siu_conf.siu_82xx.sc_ppc_acr = PPC_ACR_BUS_PARK_CORE;
+       /*
+        * Set up master windows that allow the CPU to access PCI space. These
+        * windows are set up using the two SIU PCIBR registers.
+        */
+
+       immap->im_memctl.memc_pcimsk0 = M82xx_PCI_PRIM_WND_SIZE;
+       immap->im_memctl.memc_pcibr0  = M82xx_PCI_PRIM_WND_BASE | PCIBR_ENABLE;
+
+#ifdef M82xx_PCI_SEC_WND_SIZE
+       immap->im_memctl.memc_pcimsk1 = M82xx_PCI_SEC_WND_SIZE;
+       immap->im_memctl.memc_pcibr1  = M82xx_PCI_SEC_WND_BASE | PCIBR_ENABLE;
+#endif
+
+#if defined CONFIG_ADS8272
+       immap->im_siu_conf.siu_82xx.sc_siumcr =
+               (immap->im_siu_conf.siu_82xx.sc_siumcr &
+               ~(SIUMCR_BBD | SIUMCR_ESE | SIUMCR_PBSE |
+               SIUMCR_CDIS | SIUMCR_DPPC11 | SIUMCR_L2CPC11 |
+               SIUMCR_LBPC11 | SIUMCR_APPC11 |
+               SIUMCR_CS10PC11 | SIUMCR_BCTLC11 | SIUMCR_MMR11)) |
+               SIUMCR_DPPC11 | SIUMCR_L2CPC01 | SIUMCR_LBPC00 |
+               SIUMCR_APPC10 | SIUMCR_CS10PC00 |
+               SIUMCR_BCTLC00 | SIUMCR_MMR11 ;
+
+#elif defined CONFIG_PQ2FADS
+       /*
+        * Setting required to enable IRQ1-IRQ7 (SIUMCR [DPPC]),
+        * and local bus for PCI (SIUMCR [LBPC]).
+        */
+       immap->im_siu_conf.siu_82xx.sc_siumcr = (immap->im_siu_conf.sc_siumcr &
+                               ~(SIUMCR_L2PC11 | SIUMCR_LBPC11 | SIUMCR_CS10PC11 | SIUMCR_APPC11) |
+                               SIUMCR_BBD | SIUMCR_LBPC01 | SIUMCR_DPPC11 | SIUMCR_APPC10;
+#endif
+       /* Enable PCI  */
+       immap->im_pci.pci_gcr = cpu_to_le32(PCIGCR_PCI_BUS_EN);
+
+       pci_div = ( (sccr & SCCR_PCI_MODCK) ? 2 : 1) *
+                       ( ( (sccr & SCCR_PCIDF_MSK) >> SCCR_PCIDF_SHIFT) + 1);
+       freq = (uint)((2*binfo->bi_cpmfreq)/(pci_div));
+       time = (int)666666/freq;
+       /* due to PCI Local Bus spec, some devices needs to wait such a long
+       time after RST  deassertion. More specifically, 0.508s for 66MHz & twice more for 33 */
+       printk("%s: The PCI bus is %d Mhz.\nWaiting %s after deasserting RST...\n",__FILE__,freq,
+       (time==1) ? "0.5 seconds":"1 second" );
+
+       {
+               int i;
+               for(i=0;i<(500*time);i++)
+                       udelay(1000);
+       }
+
+       /* setup ATU registers */
+       immap->im_pci.pci_pocmr0 = cpu_to_le32(POCMR_ENABLE | POCMR_PCI_IO |
+                               ((~(M82xx_PCI_IO_SIZE - 1U)) >> POTA_ADDR_SHIFT));
+       immap->im_pci.pci_potar0 = cpu_to_le32(M82xx_PCI_LOWER_IO >> POTA_ADDR_SHIFT);
+       immap->im_pci.pci_pobar0 = cpu_to_le32(M82xx_PCI_IO_BASE >> POTA_ADDR_SHIFT);
+
+       /* Set-up non-prefetchable window */
+       immap->im_pci.pci_pocmr1 = cpu_to_le32(POCMR_ENABLE | ((~(M82xx_PCI_MMIO_SIZE-1U)) >> POTA_ADDR_SHIFT));
+       immap->im_pci.pci_potar1 = cpu_to_le32(M82xx_PCI_LOWER_MMIO >> POTA_ADDR_SHIFT);
+       immap->im_pci.pci_pobar1 = cpu_to_le32((M82xx_PCI_LOWER_MMIO - M82xx_PCI_MMIO_OFFSET) >> POTA_ADDR_SHIFT);
+
+       /* Set-up prefetchable window */
+       immap->im_pci.pci_pocmr2 = cpu_to_le32(POCMR_ENABLE |POCMR_PREFETCH_EN |
+               (~(M82xx_PCI_MEM_SIZE-1U) >> POTA_ADDR_SHIFT));
+       immap->im_pci.pci_potar2 = cpu_to_le32(M82xx_PCI_LOWER_MEM >> POTA_ADDR_SHIFT);
+       immap->im_pci.pci_pobar2 = cpu_to_le32((M82xx_PCI_LOWER_MEM - M82xx_PCI_MEM_OFFSET) >> POTA_ADDR_SHIFT);
+
+       /* Inbound transactions from PCI memory space */
+       immap->im_pci.pci_picmr0 = cpu_to_le32(PICMR_ENABLE | PICMR_PREFETCH_EN |
+                                       ((~(M82xx_PCI_SLAVE_MEM_SIZE-1U)) >> PITA_ADDR_SHIFT));
+       immap->im_pci.pci_pibar0 = cpu_to_le32(M82xx_PCI_SLAVE_MEM_BUS  >> PITA_ADDR_SHIFT);
+       immap->im_pci.pci_pitar0 = cpu_to_le32(M82xx_PCI_SLAVE_MEM_LOCAL>> PITA_ADDR_SHIFT);
+
+#if defined CONFIG_ADS8272
+       /* PCI int highest prio */
+       immap->im_siu_conf.siu_82xx.sc_ppc_alrh = 0x01236745;
+#elif defined CONFIG_PQ2FADS
+       immap->im_siu_conf.siu_82xx.sc_ppc_alrh = 0x03124567;
+#endif
+       /* park bus on PCI */
+       immap->im_siu_conf.siu_82xx.sc_ppc_acr = PPC_ACR_BUS_PARK_PCI;
+
+       /* Enable bus mastering and inbound memory transactions */
+       early_read_config_dword(hose, hose->first_busno, 0, PCI_COMMAND, &val);
+       val &= 0xffff0000;
+       val |= PCI_COMMAND_MEMORY|PCI_COMMAND_MASTER;
+       early_write_config_dword(hose, hose->first_busno, 0, PCI_COMMAND, val);
+
+}
+
+void __init pq2_find_bridges(void)
+{
+       extern int pci_assign_all_busses;
+       struct pci_controller * hose;
+       int host_bridge;
+
+       pci_assign_all_busses = 1;
+
+       hose = pcibios_alloc_controller();
+
+       if (!hose)
+               return;
+
+       ppc_md.pci_swizzle = common_swizzle;
+
+       hose->first_busno = 0;
+       hose->bus_offset = 0;
+       hose->last_busno = 0xff;
+
+#ifdef CONFIG_ADS8272
+       hose->set_cfg_type = 1;
+#endif
+
+       setup_m8260_indirect_pci(hose,
+                                (unsigned long)&cpm2_immr->im_pci.pci_cfg_addr,
+                                (unsigned long)&cpm2_immr->im_pci.pci_cfg_data);
+
+       /* Make sure it is a supported bridge */
+       early_read_config_dword(hose,
+                               0,
+                               PCI_DEVFN(0,0),
+                               PCI_VENDOR_ID,
+                               &host_bridge);
+       switch (host_bridge) {
+               case PCI_DEVICE_ID_MPC8265:
+                       break;
+               case PCI_DEVICE_ID_MPC8272:
+                       break;
+               default:
+                       printk("Attempting to use unrecognized host bridge ID"
+                               " 0x%08x.\n", host_bridge);
+                       break;
+       }
+
+       pq2ads_setup_pci(hose);
+
+       hose->io_space.start =  M82xx_PCI_LOWER_IO;
+       hose->io_space.end = M82xx_PCI_UPPER_IO;
+       hose->mem_space.start = M82xx_PCI_LOWER_MEM;
+       hose->mem_space.end = M82xx_PCI_UPPER_MMIO;
+       hose->pci_mem_offset = M82xx_PCI_MEM_OFFSET;
+
+       isa_io_base =
+       (unsigned long) ioremap(M82xx_PCI_IO_BASE,
+                                       M82xx_PCI_IO_SIZE);
+       hose->io_base_virt = (void *) isa_io_base;
+
+       /* setup resources */
+       pci_init_resource(&hose->mem_resources[0],
+                       M82xx_PCI_LOWER_MEM,
+                       M82xx_PCI_UPPER_MEM,
+                       IORESOURCE_MEM|IORESOURCE_PREFETCH, "PCI prefetchable memory");
+
+       pci_init_resource(&hose->mem_resources[1],
+                       M82xx_PCI_LOWER_MMIO,
+                       M82xx_PCI_UPPER_MMIO,
+                       IORESOURCE_MEM, "PCI memory");
+
+       pci_init_resource(&hose->io_resource,
+                       M82xx_PCI_LOWER_IO,
+                       M82xx_PCI_UPPER_IO,
+                       IORESOURCE_IO | 1, "PCI I/O");
+
+       ppc_md.pci_exclude_device = pq2pci_exclude_device;
+       hose->last_busno = pciauto_bus_scan(hose, hose->first_busno);
+
+       ppc_md.pci_map_irq = pq2pci_map_irq;
+       ppc_md.pcibios_fixup = NULL;
+       ppc_md.pcibios_fixup_bus = NULL;
+
+}
diff --git a/arch/ppc/syslib/m82xx_pci.h b/arch/ppc/syslib/m82xx_pci.h
new file mode 100644 (file)
index 0000000..924f73f
--- /dev/null
@@ -0,0 +1,92 @@
+
+#ifndef _PPC_KERNEL_M82XX_PCI_H
+#define _PPC_KERNEL_M82XX_PCI_H
+
+#include <asm/m8260_pci.h>
+/*
+ *   Local->PCI map (from CPU)                             controlled by
+ *   MPC826x master window
+ *
+ *   0xF6000000 - 0xF7FFFFFF    IO space
+ *   0x80000000 - 0xBFFFFFFF    CPU2PCI memory space       PCIBR0
+ *
+ *   0x80000000 - 0x9FFFFFFF    PCI Mem with prefetch      (Outbound ATU #1)
+ *   0xA0000000 - 0xBFFFFFFF    PCI Mem w/o  prefetch      (Outbound ATU #2)
+ *   0xF6000000 - 0xF7FFFFFF    32-bit PCI IO              (Outbound ATU #3)
+ *
+ *   PCI->Local map (from PCI)
+ *   MPC826x slave window                                  controlled by
+ *
+ *   0x00000000 - 0x07FFFFFF    MPC826x local memory       (Inbound ATU #1)
+ */
+
+/*
+ * Slave window that allows PCI masters to access MPC826x local memory.
+ * This window is set up using the first set of Inbound ATU registers
+ */
+
+#ifndef M82xx_PCI_SLAVE_MEM_LOCAL
+#define M82xx_PCI_SLAVE_MEM_LOCAL      (((struct bd_info *)__res)->bi_memstart)
+#define M82xx_PCI_SLAVE_MEM_BUS                (((struct bd_info *)__res)->bi_memstart)
+#define M82xx_PCI_SLAVE_MEM_SIZE       (((struct bd_info *)__res)->bi_memsize)
+#endif
+
+/*
+ * This is the window that allows the CPU to access PCI address space.
+ * It will be setup with the SIU PCIBR0 register. All three PCI master
+ * windows, which allow the CPU to access PCI prefetch, non prefetch,
+ * and IO space (see below), must all fit within this window.
+ */
+
+#ifndef M82xx_PCI_LOWER_MEM
+#define M82xx_PCI_LOWER_MEM            0x80000000
+#define M82xx_PCI_UPPER_MEM            0x9fffffff
+#define M82xx_PCI_MEM_OFFSET           0x00000000
+#define M82xx_PCI_MEM_SIZE             0x20000000
+#endif
+
+#ifndef M82xx_PCI_LOWER_MMIO
+#define M82xx_PCI_LOWER_MMIO           0xa0000000
+#define M82xx_PCI_UPPER_MMIO           0xafffffff
+#define M82xx_PCI_MMIO_OFFSET          0x00000000
+#define M82xx_PCI_MMIO_SIZE            0x20000000
+#endif
+
+#ifndef M82xx_PCI_LOWER_IO
+#define M82xx_PCI_LOWER_IO             0x00000000
+#define M82xx_PCI_UPPER_IO             0x01ffffff
+#define M82xx_PCI_IO_BASE              0xf6000000
+#define M82xx_PCI_IO_SIZE              0x02000000
+#endif
+
+#ifndef M82xx_PCI_PRIM_WND_SIZE
+#define M82xx_PCI_PRIM_WND_SIZE        ~(M82xx_PCI_IO_SIZE - 1U)
+#define M82xx_PCI_PRIM_WND_BASE                (M82xx_PCI_IO_BASE)
+#endif
+
+#ifndef M82xx_PCI_SEC_WND_SIZE
+#define M82xx_PCI_SEC_WND_SIZE                 ~(M82xx_PCI_MEM_SIZE + M82xx_PCI_MMIO_SIZE - 1U)
+#define M82xx_PCI_SEC_WND_BASE                 (M82xx_PCI_LOWER_MEM)
+#endif
+
+#ifndef POTA_ADDR_SHIFT
+#define POTA_ADDR_SHIFT                12
+#endif
+
+#ifndef PITA_ADDR_SHIFT
+#define PITA_ADDR_SHIFT                12
+#endif
+
+#ifndef _IO_BASE
+#define _IO_BASE isa_io_base
+#endif
+
+#ifdef CONFIG_8260_PCI9
+struct pci_controller;
+extern void setup_m8260_indirect_pci(struct pci_controller* hose,
+                                       u32 cfg_addr, u32 cfg_data);
+#else
+#define setup_m8260_indirect_pci setup_indirect_pci
+#endif
+
+#endif /* _PPC_KERNEL_M8260_PCI_H */
index fd93adfd464c6d51e437e9ff4fb32e57a30d0d05..8fc5f4154521587193e46a73e3eee852e6e3332d 100644 (file)
@@ -21,6 +21,9 @@
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/serial_8250.h>
+#include <linux/fsl_devices.h>
+#include <linux/device.h>
 
 #include <asm/byteorder.h>
 #include <asm/io.h>
 #include <asm/pci-bridge.h>
 #include <asm/open_pic.h>
 #include <asm/mpc10x.h>
-#include <asm/ocp.h>
-
-/* The OCP structure is fixed by code below, before OCP initialises.
-   paddr depends on where the board places the EUMB.
-    - fixed in mpc10x_bridge_init().
-   irq depends on two things:
-    > does the board use the EPIC at all? (PCORE does not).
-    > is the EPIC in serial or parallel mode?
-    - fixed in mpc10x_set_openpic().
-*/
+#include <asm/ppc_sys.h>
 
 #ifdef CONFIG_MPC10X_OPENPIC
 #ifdef CONFIG_EPIC_SERIAL_MODE
 #define MPC10X_I2C_IRQ (EPIC_IRQ_BASE + NUM_8259_INTERRUPTS)
 #define MPC10X_DMA0_IRQ (EPIC_IRQ_BASE + 1 + NUM_8259_INTERRUPTS)
 #define MPC10X_DMA1_IRQ (EPIC_IRQ_BASE + 2 + NUM_8259_INTERRUPTS)
+#define MPC10X_UART0_IRQ (EPIC_IRQ_BASE + 4 + NUM_8259_INTERRUPTS)
 #else
-#define MPC10X_I2C_IRQ OCP_IRQ_NA
-#define MPC10X_DMA0_IRQ OCP_IRQ_NA
-#define MPC10X_DMA1_IRQ OCP_IRQ_NA
+#define MPC10X_I2C_IRQ -1
+#define MPC10X_DMA0_IRQ -1
+#define MPC10X_DMA1_IRQ -1
+#define MPC10X_UART0_IRQ -1
 #endif
 
-
-struct ocp_def core_ocp[] = {
-       { .vendor       = OCP_VENDOR_INVALID
-       }
+static struct fsl_i2c_platform_data mpc10x_i2c_pdata = {
+       .device_flags           = 0,
 };
 
-static struct ocp_fs_i2c_data mpc10x_i2c_data = {
-       .flags          = 0
+static struct plat_serial8250_port serial_platform_data[] = {
+       [0] = {
+               .mapbase        = 0x4500,
+               .iotype         = UPIO_MEM,
+               .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
+       },
+       [1] = {
+               .mapbase        = 0x4600,
+               .iotype         = UPIO_MEM,
+               .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
+       },
+       { },
 };
-static struct ocp_def mpc10x_i2c_ocp = {
-       .vendor         = OCP_VENDOR_MOTOROLA,
-       .function       = OCP_FUNC_IIC,
-       .index          = 0,
-       .additions      = &mpc10x_i2c_data
+
+struct platform_device ppc_sys_platform_devices[] = {
+       [MPC10X_IIC1] = {
+               .name   = "fsl-i2c",
+               .id     = 1,
+               .dev.platform_data = &mpc10x_i2c_pdata,
+               .num_resources = 2,
+               .resource = (struct resource[]) {
+                       {
+                               .start  = MPC10X_EUMB_I2C_OFFSET,
+                               .end    = MPC10X_EUMB_I2C_OFFSET +
+                                           MPC10X_EUMB_I2C_SIZE - 1,
+                               .flags  = IORESOURCE_MEM,
+                       },
+                       {
+                               .flags  = IORESOURCE_IRQ
+                       },
+               },
+       },
+       [MPC10X_DMA0] = {
+               .name   = "fsl-dma",
+               .id     = 0,
+               .num_resources = 2,
+               .resource = (struct resource[]) {
+                       {
+                               .start  = MPC10X_EUMB_DMA_OFFSET + 0x10,
+                               .end    = MPC10X_EUMB_DMA_OFFSET + 0x1f,
+                               .flags  = IORESOURCE_MEM,
+                       },
+                       {
+                               .flags  = IORESOURCE_IRQ,
+                       },
+               },
+       },
+       [MPC10X_DMA1] = {
+               .name   = "fsl-dma",
+               .id     = 1,
+               .num_resources = 2,
+               .resource = (struct resource[]) {
+                       {
+                               .start  = MPC10X_EUMB_DMA_OFFSET + 0x20,
+                               .end    = MPC10X_EUMB_DMA_OFFSET + 0x2f,
+                               .flags  = IORESOURCE_MEM,
+                       },
+                       {
+                               .flags  = IORESOURCE_IRQ,
+                       },
+               },
+       },
+       [MPC10X_DMA1] = {
+               .name   = "fsl-dma",
+               .id     = 1,
+               .num_resources = 2,
+               .resource = (struct resource[]) {
+                       {
+                               .start  = MPC10X_EUMB_DMA_OFFSET + 0x20,
+                               .end    = MPC10X_EUMB_DMA_OFFSET + 0x2f,
+                               .flags  = IORESOURCE_MEM,
+                       },
+                       {
+                               .flags  = IORESOURCE_IRQ,
+                       },
+               },
+       },
+       [MPC10X_DUART] = {
+               .name = "serial8250",
+               .id     = 0,
+               .dev.platform_data = serial_platform_data,
+       },
 };
 
-static struct ocp_def mpc10x_dma_ocp[2] = {
-{      .vendor         = OCP_VENDOR_MOTOROLA,
-       .function       = OCP_FUNC_DMA,
-       .index          = 0 },
-{      .vendor         = OCP_VENDOR_MOTOROLA,
-       .function       = OCP_FUNC_DMA,
-       .index          = 1 }
+/* We use the PCI ID to match on */
+struct ppc_sys_spec *cur_ppc_sys_spec;
+struct ppc_sys_spec ppc_sys_specs[] = {
+       {
+               .ppc_sys_name   = "8245",
+               .mask           = 0xFFFFFFFF,
+               .value          = MPC10X_BRIDGE_8245,
+               .num_devices    = 4,
+               .device_list    = (enum ppc_sys_devices[])
+               {
+                       MPC10X_IIC1, MPC10X_DMA0, MPC10X_DMA1, MPC10X_DUART,
+               },
+       },
+       {
+               .ppc_sys_name   = "8240",
+               .mask           = 0xFFFFFFFF,
+               .value          = MPC10X_BRIDGE_8240,
+               .num_devices    = 3,
+               .device_list    = (enum ppc_sys_devices[])
+               {
+                       MPC10X_IIC1, MPC10X_DMA0, MPC10X_DMA1,
+               },
+       },
+       {
+               .ppc_sys_name   = "107",
+               .mask           = 0xFFFFFFFF,
+               .value          = MPC10X_BRIDGE_107,
+               .num_devices    = 3,
+               .device_list    = (enum ppc_sys_devices[])
+               {
+                       MPC10X_IIC1, MPC10X_DMA0, MPC10X_DMA1,
+               },
+       },
+       {       /* default match */
+               .ppc_sys_name   = "",
+               .mask           = 0x00000000,
+               .value          = 0x00000000,
+       },
 };
 
 /* Set resources to match bridge memory map */
@@ -132,7 +231,7 @@ mpc10x_bridge_init(struct pci_controller *hose,
                   uint new_map,
                   uint phys_eumb_base)
 {
-       int     host_bridge, picr1, picr1_bit;
+       int     host_bridge, picr1, picr1_bit, i;
        ulong   pci_config_addr, pci_config_data;
        u_char  pir, byte;
 
@@ -273,7 +372,7 @@ mpc10x_bridge_init(struct pci_controller *hose,
                        printk("Host bridge in Agent mode\n");
                        /* Read or Set LMBAR & PCSRBAR? */
                }
-               
+
                /* Set base addr of the 8240/107 EUMB.  */
                early_write_config_dword(hose,
                                         0,
@@ -287,17 +386,6 @@ mpc10x_bridge_init(struct pci_controller *hose,
                        ioremap(phys_eumb_base + MPC10X_EUMB_EPIC_OFFSET,
                                MPC10X_EUMB_EPIC_SIZE);
 #endif
-               mpc10x_i2c_ocp.paddr = phys_eumb_base + MPC10X_EUMB_I2C_OFFSET;
-               mpc10x_i2c_ocp.irq = MPC10X_I2C_IRQ;
-               ocp_add_one_device(&mpc10x_i2c_ocp);
-               mpc10x_dma_ocp[0].paddr = phys_eumb_base +
-                                       MPC10X_EUMB_DMA_OFFSET + 0x100;
-               mpc10x_dma_ocp[0].irq = MPC10X_DMA0_IRQ;
-               ocp_add_one_device(&mpc10x_dma_ocp[0]);
-               mpc10x_dma_ocp[1].paddr = phys_eumb_base +
-                                       MPC10X_EUMB_DMA_OFFSET + 0x200;
-               mpc10x_dma_ocp[1].irq = MPC10X_DMA1_IRQ;
-               ocp_add_one_device(&mpc10x_dma_ocp[1]);
        }
 
 #ifdef CONFIG_MPC10X_STORE_GATHERING
@@ -306,6 +394,29 @@ mpc10x_bridge_init(struct pci_controller *hose,
        mpc10x_disable_store_gathering(hose);
 #endif
 
+       /* setup platform devices for MPC10x bridges */
+       identify_ppc_sys_by_id (host_bridge);
+
+       for (i = 0; i < cur_ppc_sys_spec->num_devices; i++) {
+               unsigned int dev_id = cur_ppc_sys_spec->device_list[i];
+               ppc_sys_fixup_mem_resource(&ppc_sys_platform_devices[dev_id],
+                       phys_eumb_base);
+       }
+
+       /* IRQ's are determined at runtime */
+       ppc_sys_platform_devices[MPC10X_IIC1].resource[1].start = MPC10X_I2C_IRQ;
+       ppc_sys_platform_devices[MPC10X_IIC1].resource[1].end = MPC10X_I2C_IRQ;
+       ppc_sys_platform_devices[MPC10X_DMA0].resource[1].start = MPC10X_DMA0_IRQ;
+       ppc_sys_platform_devices[MPC10X_DMA0].resource[1].end = MPC10X_DMA0_IRQ;
+       ppc_sys_platform_devices[MPC10X_DMA1].resource[1].start = MPC10X_DMA1_IRQ;
+       ppc_sys_platform_devices[MPC10X_DMA1].resource[1].end = MPC10X_DMA1_IRQ;
+
+       serial_platform_data[0].mapbase += phys_eumb_base;
+       serial_platform_data[0].irq = MPC10X_UART0_IRQ;
+
+       serial_platform_data[1].mapbase += phys_eumb_base;
+       serial_platform_data[1].irq = MPC10X_UART0_IRQ + 1;
+
        /*
         * 8240 erratum 26, 8241/8245 erratum 29, 107 erratum 23: speculative
         * PCI reads may return stale data so turn off.
@@ -330,7 +441,7 @@ mpc10x_bridge_init(struct pci_controller *hose,
         * 8245 (Rev 2., dated 10/2003) says PICR2[0] is reserverd.
         */
        if (host_bridge == MPC10X_BRIDGE_8245) {
-               ulong   picr2;
+               u32     picr2;
 
                early_read_config_dword(hose, 0, PCI_DEVFN(0,0),
                        MPC10X_CFG_PICR2_REG, &picr2);
@@ -504,6 +615,8 @@ void __init mpc10x_set_openpic(void)
        openpic_set_sources(EPIC_IRQ_BASE, 3, OpenPIC_Addr + 0x11020);
        /* Skip reserved space and map Message Unit Interrupt (I2O) */
        openpic_set_sources(EPIC_IRQ_BASE + 3, 1, OpenPIC_Addr + 0x110C0);
+       /* Skip reserved space and map Serial Interupts */
+       openpic_set_sources(EPIC_IRQ_BASE + 4, 2, OpenPIC_Addr + 0x11120);
 
        openpic_init(NUM_8259_INTERRUPTS);
 }
index 5c1a919eaabfb367a57e0ec714ceebf129aaa0ff..75c8e9834ae70ad142f2aa8e65e025065a4816de 100644 (file)
@@ -61,6 +61,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
                .iotype         = UPIO_MEM,
                .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
        },
+       { },
 };
 
 struct platform_device ppc_sys_platform_devices[] = {
index a231795ee26f0a37cc228d51a76a27c314240481..8af322dd476a6467cda34d4983d1e589d46f21a4 100644 (file)
@@ -40,6 +40,42 @@ static struct gianfar_platform_data mpc85xx_tsec2_pdata = {
        .phy_reg_addr = MPC85xx_ENET1_OFFSET,
 };
 
+static struct gianfar_platform_data mpc85xx_etsec1_pdata = {
+       .device_flags = FSL_GIANFAR_DEV_HAS_GIGABIT |
+           FSL_GIANFAR_DEV_HAS_COALESCE | FSL_GIANFAR_DEV_HAS_RMON |
+           FSL_GIANFAR_DEV_HAS_MULTI_INTR |
+           FSL_GIANFAR_DEV_HAS_CSUM | FSL_GIANFAR_DEV_HAS_VLAN |
+           FSL_GIANFAR_DEV_HAS_EXTENDED_HASH,
+       .phy_reg_addr = MPC85xx_ENET1_OFFSET,
+};
+
+static struct gianfar_platform_data mpc85xx_etsec2_pdata = {
+       .device_flags = FSL_GIANFAR_DEV_HAS_GIGABIT |
+           FSL_GIANFAR_DEV_HAS_COALESCE | FSL_GIANFAR_DEV_HAS_RMON |
+           FSL_GIANFAR_DEV_HAS_MULTI_INTR |
+           FSL_GIANFAR_DEV_HAS_CSUM | FSL_GIANFAR_DEV_HAS_VLAN |
+           FSL_GIANFAR_DEV_HAS_EXTENDED_HASH,
+       .phy_reg_addr = MPC85xx_ENET1_OFFSET,
+};
+
+static struct gianfar_platform_data mpc85xx_etsec3_pdata = {
+       .device_flags = FSL_GIANFAR_DEV_HAS_GIGABIT |
+           FSL_GIANFAR_DEV_HAS_COALESCE | FSL_GIANFAR_DEV_HAS_RMON |
+           FSL_GIANFAR_DEV_HAS_MULTI_INTR |
+           FSL_GIANFAR_DEV_HAS_CSUM | FSL_GIANFAR_DEV_HAS_VLAN |
+           FSL_GIANFAR_DEV_HAS_EXTENDED_HASH,
+       .phy_reg_addr = MPC85xx_ENET1_OFFSET,
+};
+
+static struct gianfar_platform_data mpc85xx_etsec4_pdata = {
+       .device_flags = FSL_GIANFAR_DEV_HAS_GIGABIT |
+           FSL_GIANFAR_DEV_HAS_COALESCE | FSL_GIANFAR_DEV_HAS_RMON |
+           FSL_GIANFAR_DEV_HAS_MULTI_INTR |
+           FSL_GIANFAR_DEV_HAS_CSUM | FSL_GIANFAR_DEV_HAS_VLAN |
+           FSL_GIANFAR_DEV_HAS_EXTENDED_HASH,
+       .phy_reg_addr = MPC85xx_ENET1_OFFSET,
+};
+
 static struct gianfar_platform_data mpc85xx_fec_pdata = {
        .phy_reg_addr = MPC85xx_ENET1_OFFSET,
 };
@@ -48,6 +84,10 @@ static struct fsl_i2c_platform_data mpc85xx_fsl_i2c_pdata = {
        .device_flags = FSL_I2C_DEV_SEPARATE_DFSRR,
 };
 
+static struct fsl_i2c_platform_data mpc85xx_fsl_i2c2_pdata = {
+       .device_flags = FSL_I2C_DEV_SEPARATE_DFSRR,
+};
+
 static struct plat_serial8250_port serial_platform_data[] = {
        [0] = {
                .mapbase        = 0x4500,
@@ -61,6 +101,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
                .iotype         = UPIO_MEM,
                .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ,
        },
+       { },
 };
 
 struct platform_device ppc_sys_platform_devices[] = {
@@ -280,7 +321,6 @@ struct platform_device ppc_sys_platform_devices[] = {
                        },
                },
        },
-#ifdef CONFIG_CPM2
        [MPC85xx_CPM_FCC1] = {
                .name = "fsl-cpm-fcc",
                .id     = 1,
@@ -534,7 +574,151 @@ struct platform_device ppc_sys_platform_devices[] = {
                        },
                },
        },
-#endif /* CONFIG_CPM2 */
+       [MPC85xx_eTSEC1] = {
+               .name = "fsl-gianfar",
+               .id     = 1,
+               .dev.platform_data = &mpc85xx_etsec1_pdata,
+               .num_resources   = 4,
+               .resource = (struct resource[]) {
+                       {
+                               .start  = MPC85xx_ENET1_OFFSET,
+                               .end    = MPC85xx_ENET1_OFFSET +
+                                               MPC85xx_ENET1_SIZE - 1,
+                               .flags  = IORESOURCE_MEM,
+                       },
+                       {
+                               .name   = "tx",
+                               .start  = MPC85xx_IRQ_TSEC1_TX,
+                               .end    = MPC85xx_IRQ_TSEC1_TX,
+                               .flags  = IORESOURCE_IRQ,
+                       },
+                       {
+                               .name   = "rx",
+                               .start  = MPC85xx_IRQ_TSEC1_RX,
+                               .end    = MPC85xx_IRQ_TSEC1_RX,
+                               .flags  = IORESOURCE_IRQ,
+                       },
+                       {
+                               .name   = "error",
+                               .start  = MPC85xx_IRQ_TSEC1_ERROR,
+                               .end    = MPC85xx_IRQ_TSEC1_ERROR,
+                               .flags  = IORESOURCE_IRQ,
+                       },
+               },
+       },
+       [MPC85xx_eTSEC2] = {
+               .name = "fsl-gianfar",
+               .id     = 2,
+               .dev.platform_data = &mpc85xx_etsec2_pdata,
+               .num_resources   = 4,
+               .resource = (struct resource[]) {
+                       {
+                               .start  = MPC85xx_ENET2_OFFSET,
+                               .end    = MPC85xx_ENET2_OFFSET +
+                                               MPC85xx_ENET2_SIZE - 1,
+                               .flags  = IORESOURCE_MEM,
+                       },
+                       {
+                               .name   = "tx",
+                               .start  = MPC85xx_IRQ_TSEC2_TX,
+                               .end    = MPC85xx_IRQ_TSEC2_TX,
+                               .flags  = IORESOURCE_IRQ,
+                       },
+                       {
+                               .name   = "rx",
+                               .start  = MPC85xx_IRQ_TSEC2_RX,
+                               .end    = MPC85xx_IRQ_TSEC2_RX,
+                               .flags  = IORESOURCE_IRQ,
+                       },
+                       {
+                               .name   = "error",
+                               .start  = MPC85xx_IRQ_TSEC2_ERROR,
+                               .end    = MPC85xx_IRQ_TSEC2_ERROR,
+                               .flags  = IORESOURCE_IRQ,
+                       },
+               },
+       },
+       [MPC85xx_eTSEC3] = {
+               .name = "fsl-gianfar",
+               .id     = 3,
+               .dev.platform_data = &mpc85xx_etsec3_pdata,
+               .num_resources   = 4,
+               .resource = (struct resource[]) {
+                       {
+                               .start  = MPC85xx_ENET3_OFFSET,
+                               .end    = MPC85xx_ENET3_OFFSET +
+                                               MPC85xx_ENET3_SIZE - 1,
+                               .flags  = IORESOURCE_MEM,
+                       },
+                       {
+                               .name   = "tx",
+                               .start  = MPC85xx_IRQ_TSEC3_TX,
+                               .end    = MPC85xx_IRQ_TSEC3_TX,
+                               .flags  = IORESOURCE_IRQ,
+                       },
+                       {
+                               .name   = "rx",
+                               .start  = MPC85xx_IRQ_TSEC3_RX,
+                               .end    = MPC85xx_IRQ_TSEC3_RX,
+                               .flags  = IORESOURCE_IRQ,
+                       },
+                       {
+                               .name   = "error",
+                               .start  = MPC85xx_IRQ_TSEC3_ERROR,
+                               .end    = MPC85xx_IRQ_TSEC3_ERROR,
+                               .flags  = IORESOURCE_IRQ,
+                       },
+               },
+       },
+       [MPC85xx_eTSEC4] = {
+               .name = "fsl-gianfar",
+               .id     = 4,
+               .dev.platform_data = &mpc85xx_etsec4_pdata,
+               .num_resources   = 4,
+               .resource = (struct resource[]) {
+                       {
+                               .start  = 0x27000,
+                               .end    = 0x27fff,
+                               .flags  = IORESOURCE_MEM,
+                       },
+                       {
+                               .name   = "tx",
+                               .start  = MPC85xx_IRQ_TSEC4_TX,
+                               .end    = MPC85xx_IRQ_TSEC4_TX,
+                               .flags  = IORESOURCE_IRQ,
+                       },
+                       {
+                               .name   = "rx",
+                               .start  = MPC85xx_IRQ_TSEC4_RX,
+                               .end    = MPC85xx_IRQ_TSEC4_RX,
+                               .flags  = IORESOURCE_IRQ,
+                       },
+                       {
+                               .name   = "error",
+                               .start  = MPC85xx_IRQ_TSEC4_ERROR,
+                               .end    = MPC85xx_IRQ_TSEC4_ERROR,
+                               .flags  = IORESOURCE_IRQ,
+                       },
+               },
+       },
+       [MPC85xx_IIC2] = {
+               .name = "fsl-i2c",
+               .id     = 2,
+               .dev.platform_data = &mpc85xx_fsl_i2c2_pdata,
+               .num_resources   = 2,
+               .resource = (struct resource[]) {
+                       {
+                               .start  = 0x03100,
+                               .end    = 0x031ff,
+                               .flags  = IORESOURCE_MEM,
+                       },
+                       {
+                               .start  = MPC85xx_IRQ_IIC1,
+                               .end    = MPC85xx_IRQ_IIC1,
+                               .flags  = IORESOURCE_IRQ,
+                       },
+               },
+       },
 };
 
 static int __init mach_mpc85xx_fixup(struct platform_device *pdev)
index d806a92a9401bedbb9a8083470b4456b948dd248..6e3184ab354f4da230f362d471564f4979c9ef45 100644 (file)
@@ -110,6 +110,111 @@ struct ppc_sys_spec ppc_sys_specs[] = {
                        MPC85xx_CPM_USB,
                },
        },
+       /* SVRs on 8548 rev1.0 matches for 8548/8547/8545 */
+       {
+               .ppc_sys_name   = "8548E",
+               .mask           = 0xFFFF00F0,
+               .value          = 0x80390010,
+               .num_devices    = 13,
+               .device_list    = (enum ppc_sys_devices[])
+               {
+                       MPC85xx_eTSEC1, MPC85xx_eTSEC2, MPC85xx_eTSEC3,
+                       MPC85xx_eTSEC4, MPC85xx_IIC1, MPC85xx_IIC2,
+                       MPC85xx_DMA0, MPC85xx_DMA1, MPC85xx_DMA2, MPC85xx_DMA3,
+                       MPC85xx_PERFMON, MPC85xx_DUART, MPC85xx_SEC2,
+               },
+       },
+       {
+               .ppc_sys_name   = "8548",
+               .mask           = 0xFFFF00F0,
+               .value          = 0x80310010,
+               .num_devices    = 12,
+               .device_list    = (enum ppc_sys_devices[])
+               {
+                       MPC85xx_eTSEC1, MPC85xx_eTSEC2, MPC85xx_eTSEC3,
+                       MPC85xx_eTSEC4, MPC85xx_IIC1, MPC85xx_IIC2,
+                       MPC85xx_DMA0, MPC85xx_DMA1, MPC85xx_DMA2, MPC85xx_DMA3,
+                       MPC85xx_PERFMON, MPC85xx_DUART,
+               },
+       },
+       {
+               .ppc_sys_name   = "8547E",
+               .mask           = 0xFFFF00F0,
+               .value          = 0x80390010,
+               .num_devices    = 13,
+               .device_list    = (enum ppc_sys_devices[])
+               {
+                       MPC85xx_eTSEC1, MPC85xx_eTSEC2, MPC85xx_eTSEC3,
+                       MPC85xx_eTSEC4, MPC85xx_IIC1, MPC85xx_IIC2,
+                       MPC85xx_DMA0, MPC85xx_DMA1, MPC85xx_DMA2, MPC85xx_DMA3,
+                       MPC85xx_PERFMON, MPC85xx_DUART, MPC85xx_SEC2,
+               },
+       },
+       {
+               .ppc_sys_name   = "8547",
+               .mask           = 0xFFFF00F0,
+               .value          = 0x80310010,
+               .num_devices    = 12,
+               .device_list    = (enum ppc_sys_devices[])
+               {
+                       MPC85xx_eTSEC1, MPC85xx_eTSEC2, MPC85xx_eTSEC3,
+                       MPC85xx_eTSEC4, MPC85xx_IIC1, MPC85xx_IIC2,
+                       MPC85xx_DMA0, MPC85xx_DMA1, MPC85xx_DMA2, MPC85xx_DMA3,
+                       MPC85xx_PERFMON, MPC85xx_DUART,
+               },
+       },
+       {
+               .ppc_sys_name   = "8545E",
+               .mask           = 0xFFFF00F0,
+               .value          = 0x80390010,
+               .num_devices    = 11,
+               .device_list    = (enum ppc_sys_devices[])
+               {
+                       MPC85xx_eTSEC1, MPC85xx_eTSEC2,
+                       MPC85xx_IIC1, MPC85xx_IIC2,
+                       MPC85xx_DMA0, MPC85xx_DMA1, MPC85xx_DMA2, MPC85xx_DMA3,
+                       MPC85xx_PERFMON, MPC85xx_DUART, MPC85xx_SEC2,
+               },
+       },
+       {
+               .ppc_sys_name   = "8545",
+               .mask           = 0xFFFF00F0,
+               .value          = 0x80310010,
+               .num_devices    = 10,
+               .device_list    = (enum ppc_sys_devices[])
+               {
+                       MPC85xx_eTSEC1, MPC85xx_eTSEC2,
+                       MPC85xx_IIC1, MPC85xx_IIC2,
+                       MPC85xx_DMA0, MPC85xx_DMA1, MPC85xx_DMA2, MPC85xx_DMA3,
+                       MPC85xx_PERFMON, MPC85xx_DUART,
+               },
+       },
+       {
+               .ppc_sys_name   = "8543E",
+               .mask           = 0xFFFF00F0,
+               .value          = 0x803A0010,
+               .num_devices    = 11,
+               .device_list    = (enum ppc_sys_devices[])
+               {
+                       MPC85xx_eTSEC1, MPC85xx_eTSEC2,
+                       MPC85xx_IIC1, MPC85xx_IIC2,
+                       MPC85xx_DMA0, MPC85xx_DMA1, MPC85xx_DMA2, MPC85xx_DMA3,
+                       MPC85xx_PERFMON, MPC85xx_DUART, MPC85xx_SEC2,
+               },
+       },
+       {
+               .ppc_sys_name   = "8543",
+               .mask           = 0xFFFF00F0,
+               .value          = 0x80320010,
+               .num_devices    = 10,
+               .device_list    = (enum ppc_sys_devices[])
+               {
+                       MPC85xx_eTSEC1, MPC85xx_eTSEC2,
+                       MPC85xx_IIC1, MPC85xx_IIC2,
+                       MPC85xx_DMA0, MPC85xx_DMA1, MPC85xx_DMA2, MPC85xx_DMA3,
+                       MPC85xx_PERFMON, MPC85xx_DUART,
+               },
+       },
        {       /* default match */
                .ppc_sys_name   = "",
                .mask           = 0x00000000,
index a5156c5179a617ac0ef4baeb109c30170d1d401c..e5fd2ae503ea7c2240c373f022ffa0c989ad52e3 100644 (file)
@@ -68,7 +68,7 @@ static int ocp_inited;
 /* Sysfs support */
 #define OCP_DEF_ATTR(field, format_string)                             \
 static ssize_t                                                         \
-show_##field(struct device *dev, char *buf)                            \
+show_##field(struct device *dev, struct device_attribute *attr, char *buf)                             \
 {                                                                      \
        struct ocp_device *odev = to_ocp_dev(dev);                      \
                                                                        \
index 46269ed21aee77eaab1d784ec4e57910c3b6adc1..49c0e34e2d6bf2abf8c37522337e122e007c71ce 100644 (file)
@@ -161,7 +161,7 @@ void of_unregister_driver(struct of_platform_driver *drv)
 }
 
 
-static ssize_t dev_show_devspec(struct device *dev, char *buf)
+static ssize_t dev_show_devspec(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct of_device *ofdev;
 
index 7619e16fccaef18ddd666a5058487283f884af5c..b45d8268bf93e84619b1d44382d19688d11aa204 100644 (file)
@@ -21,7 +21,6 @@
 #include <asm/signal.h>
 #include <asm/io.h>
 #include <asm/irq.h>
-#include <asm/prom.h>
 #include <asm/sections.h>
 #include <asm/open_pic.h>
 #include <asm/i8259.h>
@@ -275,7 +274,7 @@ static void __init openpic_enable_sie(void)
 }
 #endif
 
-#if defined(CONFIG_EPIC_SERIAL_MODE) || defined(CONFIG_PM)
+#if defined(CONFIG_EPIC_SERIAL_MODE)
 static void openpic_reset(void)
 {
        openpic_setfield(&OpenPIC->Global.Global_Configuration0,
@@ -557,12 +556,10 @@ static void __init openpic_initipi(u_int ipi, u_int pri, u_int vec)
  */
 void openpic_cause_IPI(u_int ipi, cpumask_t cpumask)
 {
-       cpumask_t phys;
        DECL_THIS_CPU;
 
        CHECK_THIS_CPU;
        check_arg_ipi(ipi);
-       phys = physmask(cpumask);
        openpic_write(&OpenPIC->THIS_CPU.IPI_Dispatch(ipi),
                      cpus_addr(physmask(cpumask))[0]);
 }
@@ -995,8 +992,6 @@ int openpic_resume(struct sys_device *sysdev)
                return 0;
        }
 
-       openpic_reset();
-
        /* OpenPIC sometimes seem to need some time to be fully back up... */
        do {
                openpic_set_spurious(OPENPIC_VEC_SPURIOUS);
index ea26da0d8b6b2353d2bd580320744ae8b076b2f0..7e272c51a4973e17e3deab27cb1f1754e086cfc7 100644 (file)
@@ -25,7 +25,6 @@
 #include <asm/signal.h>
 #include <asm/io.h>
 #include <asm/irq.h>
-#include <asm/prom.h>
 #include <asm/sections.h>
 #include <asm/open_pic.h>
 #include <asm/i8259.h>
diff --git a/arch/ppc/syslib/ppc4xx_kgdb.c b/arch/ppc/syslib/ppc4xx_kgdb.c
deleted file mode 100644 (file)
index fe8668b..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-#include <linux/config.h>
-#include <linux/types.h>
-#include <asm/ibm4xx.h>
-#include <linux/kernel.h>
-
-
-
-#define LSR_DR         0x01 /* Data ready */
-#define LSR_OE         0x02 /* Overrun */
-#define LSR_PE         0x04 /* Parity error */
-#define LSR_FE         0x08 /* Framing error */
-#define LSR_BI         0x10 /* Break */
-#define LSR_THRE       0x20 /* Xmit holding register empty */
-#define LSR_TEMT       0x40 /* Xmitter empty */
-#define LSR_ERR                0x80 /* Error */
-
-#include <platforms/4xx/ibm_ocp.h>
-
-extern struct NS16550* COM_PORTS[];
-#ifndef NULL
-#define NULL 0x00
-#endif
-
-static volatile struct NS16550 *kgdb_debugport = NULL;
-
-volatile struct NS16550 *
-NS16550_init(int chan)
-{
-       volatile struct NS16550 *com_port;
-       int quot;
-#ifdef BASE_BAUD
-       quot = BASE_BAUD / 9600;
-#else
-       quot = 0x000c; /* 0xc = 9600 baud (on a pc) */
-#endif
-
-       com_port = (struct NS16550 *) COM_PORTS[chan];
-
-       com_port->lcr = 0x00;
-       com_port->ier = 0xFF;
-       com_port->ier = 0x00;
-       com_port->lcr = com_port->lcr | 0x80; /* Access baud rate */
-       com_port->dll = ( quot & 0x00ff ); /* 0xc = 9600 baud */
-       com_port->dlm = ( quot & 0xff00 ) >> 8;
-       com_port->lcr = 0x03; /* 8 data, 1 stop, no parity */
-       com_port->mcr = 0x00; /* RTS/DTR */
-       com_port->fcr = 0x07; /* Clear & enable FIFOs */
-
-       return( com_port );
-}
-
-
-void
-NS16550_putc(volatile struct NS16550 *com_port, unsigned char c)
-{
-       while ((com_port->lsr & LSR_THRE) == 0)
-               ;
-       com_port->thr = c;
-       return;
-}
-
-unsigned char
-NS16550_getc(volatile struct NS16550 *com_port)
-{
-       while ((com_port->lsr & LSR_DR) == 0)
-               ;
-       return (com_port->rbr);
-}
-
-unsigned char
-NS16550_tstc(volatile struct NS16550 *com_port)
-{
-       return ((com_port->lsr & LSR_DR) != 0);
-}
-
-
-#if defined(CONFIG_KGDB_TTYS0)
-#define KGDB_PORT 0
-#elif defined(CONFIG_KGDB_TTYS1)
-#define KGDB_PORT 1
-#elif defined(CONFIG_KGDB_TTYS2)
-#define KGDB_PORT 2
-#elif defined(CONFIG_KGDB_TTYS3)
-#define KGDB_PORT 3
-#else
-#error "invalid kgdb_tty port"
-#endif
-
-void putDebugChar( unsigned char c )
-{
-       if ( kgdb_debugport == NULL )
-               kgdb_debugport = NS16550_init(KGDB_PORT);
-       NS16550_putc( kgdb_debugport, c );
-}
-
-int getDebugChar( void )
-{
-       if (kgdb_debugport == NULL)
-               kgdb_debugport = NS16550_init(KGDB_PORT);
-
-       return(NS16550_getc(kgdb_debugport));
-}
-
-void kgdb_interruptible(int enable)
-{
-       return;
-}
-
-void putDebugString(char* str)
-{
-       while (*str != '\0') {
-               putDebugChar(*str);
-               str++;
-       }
-       putDebugChar('\r');
-       return;
-}
-
-void
-kgdb_map_scc(void)
-{
-       printk("kgdb init \n");
-       kgdb_debugport = NS16550_init(KGDB_PORT);
-}
index c28f9d679484f348e18c5409141983be5a7fcfe6..602a86891f7fd826cf7b38ab92a899d23f21dc4d 100644 (file)
 #include <linux/serial_core.h>
 #include <linux/serial_8250.h>
 
-#include <asm/prom.h>
 #include <asm/time.h>
 #include <asm/mpc83xx.h>
 #include <asm/mmu.h>
 #include <asm/ppc_sys.h>
 #include <asm/kgdb.h>
+#include <asm/delay.h>
 
 #include <syslib/ppc83xx_setup.h>
 
@@ -117,7 +117,34 @@ mpc83xx_early_serial_map(void)
 void
 mpc83xx_restart(char *cmd)
 {
+       volatile unsigned char __iomem *reg;
+       unsigned char tmp;
+
+       reg = ioremap(BCSR_PHYS_ADDR, BCSR_SIZE);
+
        local_irq_disable();
+
+       /*
+        * Unlock the BCSR bits so a PRST will update the contents.
+        * Otherwise the reset asserts but doesn't clear.
+        */
+       tmp = in_8(reg + BCSR_MISC_REG3_OFF);
+       tmp |= BCSR_MISC_REG3_CNFLOCK; /* low true, high false */
+       out_8(reg + BCSR_MISC_REG3_OFF, tmp);
+
+       /*
+        * Trigger a reset via a low->high transition of the
+        * PORESET bit.
+        */
+       tmp = in_8(reg + BCSR_MISC_REG2_OFF);
+       tmp &= ~BCSR_MISC_REG2_PORESET;
+       out_8(reg + BCSR_MISC_REG2_OFF, tmp);
+
+       udelay(1);
+
+       tmp |= BCSR_MISC_REG2_PORESET;
+       out_8(reg + BCSR_MISC_REG2_OFF, tmp);
+
        for(;;);
 }
 
index 152c3ef1312aa052072b25d86db7334583c74280..ca95d79a704e56a8c94de8c645e95852940e3996 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/serial_core.h>
 #include <linux/serial_8250.h>
 
-#include <asm/prom.h>
 #include <asm/time.h>
 #include <asm/mpc85xx.h>
 #include <asm/immap_85xx.h>
@@ -33,6 +32,8 @@
 
 #include <syslib/ppc85xx_setup.h>
 
+extern void abort(void);
+
 /* Return the amount of memory */
 unsigned long __init
 mpc85xx_find_end_of_memory(void)
@@ -132,6 +133,12 @@ mpc85xx_halt(void)
 }
 
 #ifdef CONFIG_PCI
+
+#if defined(CONFIG_MPC8555_CDS) || defined(CONFIG_MPC8548_CDS)
+extern void mpc85xx_cds_enable_via(struct pci_controller *hose);
+extern void mpc85xx_cds_fixup_via(struct pci_controller *hose);
+#endif
+
 static void __init
 mpc85xx_setup_pci1(struct pci_controller *hose)
 {
@@ -302,8 +309,18 @@ mpc85xx_setup_hose(void)
 
        ppc_md.pci_exclude_device = mpc85xx_exclude_device;
 
+#if defined(CONFIG_MPC8555_CDS) || defined(CONFIG_MPC8548_CDS)
+       /* Pre pciauto_bus_scan VIA init */
+       mpc85xx_cds_enable_via(hose_a);
+#endif
+
        hose_a->last_busno = pciauto_bus_scan(hose_a, hose_a->first_busno);
 
+#if defined(CONFIG_MPC8555_CDS) || defined(CONFIG_MPC8548_CDS)
+       /* Post pciauto_bus_scan VIA fixup */
+       mpc85xx_cds_fixup_via(hose_a);
+#endif
+
 #ifdef CONFIG_85xx_PCI2
        hose_b = pcibios_alloc_controller();
 
index 2cee87137f2efa9b6efff2d25aff5c1915061464..7f15136830f4fbf38fe38e3a5418e85e51e47b96 100644 (file)
@@ -626,8 +626,18 @@ inspect_node(phandle node, struct device_node *dad,
        l = call_prom("package-to-path", 3, 1, node,
                      mem_start, mem_end - mem_start);
        if (l >= 0) {
+               char *p, *ep;
+
                np->full_name = PTRUNRELOC((char *) mem_start);
                *(char *)(mem_start + l) = 0;
+               /* Fixup an Apple bug where they have bogus \0 chars in the
+                * middle of the path in some properties
+                */
+               for (p = (char *)mem_start, ep = p + l; p < ep; p++)
+                       if ((*p) == '\0') {
+                               memmove(p, p+1, ep - p);
+                               ep--;
+                       }
                mem_start = ALIGNUL(mem_start + l + 1);
        }
 
index 8565f49b8b0b879fc0c743c6a7a4f69dbb6e94dc..be7869e394651eea0647e0234ef08798e6b33488 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/smp.h>
 #include <linux/interrupt.h>
 #include <linux/bitops.h>
+#include <linux/kallsyms.h>
 #include <asm/ptrace.h>
 #include <asm/string.h>
 #include <asm/prom.h>
@@ -93,8 +94,7 @@ static void take_input(char *);
 static unsigned read_spr(int);
 static void write_spr(int, unsigned);
 static void super_regs(void);
-static void print_sysmap(void);
-static void sysmap_lookup(void);
+static void symbol_lookup(void);
 static void remove_bpts(void);
 static void insert_bpts(void);
 static struct bpt *at_breakpoint(unsigned pc);
@@ -103,7 +103,6 @@ static void cacheflush(void);
 #ifdef CONFIG_SMP
 static void cpu_cmd(void);
 #endif /* CONFIG_SMP */
-static int pretty_print_addr(unsigned long addr);
 static void csum(void);
 #ifdef CONFIG_BOOTX_TEXT
 static void vidcmds(void);
@@ -120,8 +119,6 @@ extern void longjmp(u_int *, int);
 
 extern void xmon_enter(void);
 extern void xmon_leave(void);
-extern char* xmon_find_symbol(unsigned long addr, unsigned long* saddr);
-extern unsigned long xmon_symbol_to_addr(char* symbol);
 
 static unsigned start_tb[NR_CPUS][2];
 static unsigned stop_tb[NR_CPUS][2];
@@ -148,7 +145,6 @@ Commands:\n\
   mm   move a block of memory\n\
   ms   set a block of memory\n\
   md   compare two blocks of memory\n\
-  M    print System.map\n\
   r    print registers\n\
   S    print special registers\n\
   t    print backtrace\n\
@@ -175,6 +171,35 @@ extern inline void __delay(unsigned int loops)
                                     "r" (loops) : "ctr");
 }
 
+/* Print an address in numeric and symbolic form (if possible) */
+static void xmon_print_symbol(unsigned long address, const char *mid,
+                             const char *after)
+{
+       char *modname;
+       const char *name = NULL;
+       unsigned long offset, size;
+       static char tmpstr[128];
+
+       printf("%.8lx", address);
+       if (setjmp(bus_error_jmp) == 0) {
+               debugger_fault_handler = handle_fault;
+               sync();
+               name = kallsyms_lookup(address, &size, &offset, &modname,
+                                      tmpstr);
+               sync();
+               /* wait a little while to see if we get a machine check */
+               __delay(200);
+       }
+       debugger_fault_handler = NULL;
+
+       if (name) {
+               printf("%s%s+%#lx/%#lx", mid, name, offset, size);
+               if (modname)
+                       printf(" [%s]", modname);
+       }
+       printf("%s", after);
+}
+
 static void get_tb(unsigned *p)
 {
        unsigned hi, lo, hiagain;
@@ -454,7 +479,7 @@ cmds(struct pt_regs *excp)
                        dump();
                        break;
                case 'l':
-                       sysmap_lookup();
+                       symbol_lookup();
                        break;
                case 'r':
                        if (excp != NULL)
@@ -466,9 +491,6 @@ cmds(struct pt_regs *excp)
                        else
                                excprint(excp);
                        break;
-               case 'M':
-                       print_sysmap();
-                       break;
                case 'S':
                        super_regs();
                        break;
@@ -825,20 +847,19 @@ backtrace(struct pt_regs *excp)
        for (; sp != 0; sp = stack[0]) {
                if (mread(sp, stack, sizeof(stack)) != sizeof(stack))
                        break;
-               pretty_print_addr(stack[1]);
-               printf(" ");
+               printf("[%.8lx] ", stack);
+               xmon_print_symbol(stack[1], " ", "\n");
                if (stack[1] == (unsigned) &ret_from_except
                    || stack[1] == (unsigned) &ret_from_except_full
                    || stack[1] == (unsigned) &ret_from_syscall) {
                        if (mread(sp+16, &regs, sizeof(regs)) != sizeof(regs))
                                break;
-                       printf("\nexception:%x [%x] %x ", regs.trap, sp+16,
+                       printf("exception:%x [%x] %x\n", regs.trap, sp+16,
                               regs.nip);
                        sp = regs.gpr[1];
                        if (mread(sp, stack, sizeof(stack)) != sizeof(stack))
                                break;
                }
-               printf("\n");
        }
 }
 
@@ -859,11 +880,10 @@ excprint(struct pt_regs *fp)
 #ifdef CONFIG_SMP
        printf("cpu %d: ", smp_processor_id());
 #endif /* CONFIG_SMP */
-       printf("vector: %x at pc = ", fp->trap);
-       pretty_print_addr(fp->nip);
-       printf(", lr = ");
-       pretty_print_addr(fp->link);
-       printf("\nmsr = %x, sp = %x [%x]\n", fp->msr, fp->gpr[1], fp);
+       printf("vector: %x at pc=", fp->trap);
+       xmon_print_symbol(fp->nip, ": ", ", lr=");
+       xmon_print_symbol(fp->link, ": ", "\n");
+       printf("msr = %x, sp = %x [%x]\n", fp->msr, fp->gpr[1], fp);
        trap = TRAP(fp);
        if (trap == 0x300 || trap == 0x600)
                printf("dar = %x, dsisr = %x\n", fp->dar, fp->dsisr);
@@ -950,24 +970,6 @@ static unsigned int regno;
 extern char exc_prolog;
 extern char dec_exc;
 
-void
-print_sysmap(void)
-{
-       extern char *sysmap;
-       if ( sysmap ) {
-               printf("System.map: \n");
-               if( setjmp(bus_error_jmp) == 0 ) {
-                       debugger_fault_handler = handle_fault;
-                       sync();
-                       xmon_puts(sysmap);
-                       sync();
-               }
-               debugger_fault_handler = NULL;
-       }
-       else
-               printf("No System.map\n");
-}
-
 void
 super_regs(void)
 {
@@ -1738,7 +1740,7 @@ scanhex(unsigned *vp)
                printf("invalid register name '%%%s'\n", regname);
                return 0;
        } else if (c == '$') {
-               static char symname[64];
+               static char symname[128];
                int i;
                for (i=0; i<63; i++) {
                        c = inchar();
@@ -1749,7 +1751,14 @@ scanhex(unsigned *vp)
                        symname[i] = c;
                }
                symname[i++] = 0;
-               *vp = xmon_symbol_to_addr(symname);
+               *vp = 0;
+               if (setjmp(bus_error_jmp) == 0) {
+                       debugger_fault_handler = handle_fault;
+                       sync();
+                       *vp = kallsyms_lookup_name(symname);
+                       sync();
+               }
+               debugger_fault_handler = NULL;
                if (!(*vp)) {
                        printf("unknown symbol\n");
                        return 0;
@@ -1840,169 +1849,34 @@ take_input(char *str)
        lineptr = str;
 }
 
-void
-sysmap_lookup(void)
+static void
+symbol_lookup(void)
 {
        int type = inchar();
        unsigned addr;
-       static char tmp[64];
-       char* cur;
-
-       extern char *sysmap;
-       extern unsigned long sysmap_size;
-       if ( !sysmap || !sysmap_size )
-               return;
-
-       switch(type) {
-               case 'a':
-                       if (scanhex(&addr)) {
-                               pretty_print_addr(addr);
-                               printf("\n");
-                       }
-                       termch = 0;
-                       break;
-               case 's':
-                       getstring(tmp, 64);
-                       if( setjmp(bus_error_jmp) == 0 ) {
-                               debugger_fault_handler = handle_fault;
-                               sync();
-                               cur = sysmap;
-                               do {
-                                       cur = strstr(cur, tmp);
-                                       if (cur) {
-                                               static char res[64];
-                                               char *p, *d;
-                                               p = cur;
-                                               while(p > sysmap && *p != 10)
-                                                       p--;
-                                               if (*p == 10) p++;
-                                               d = res;
-                                               while(*p && p < (sysmap + sysmap_size) && *p != 10)
-                                                       *(d++) = *(p++);
-                                               *(d++) = 0;
-                                               printf("%s\n", res);
-                                               cur++;
-                                       }
-                               } while (cur);
-                               sync();
-                       }
-                       debugger_fault_handler = NULL;
-                       termch = 0;
-                       break;
-       }
-}
+       static char tmp[128];
 
-static int
-pretty_print_addr(unsigned long addr)
-{
-       char *sym;
-       unsigned long saddr;
-       
-       printf("%08x", addr);
-       sym = xmon_find_symbol(addr, &saddr);
-       if (sym)
-               printf(" (%s+0x%x)", sym, addr-saddr);
-       return (sym != 0);
-}
-
-char*
-xmon_find_symbol(unsigned long addr, unsigned long* saddr)
-{
-       static char rbuffer[64];
-       char *p, *ep, *limit;
-       unsigned long prev, next;
-       char* psym;
-
-       extern char *sysmap;
-       extern unsigned long sysmap_size;
-       if ( !sysmap || !sysmap_size )
-               return NULL;
-       
-       prev = 0;
-       psym = NULL;
-       p = sysmap;
-       limit = p + sysmap_size;
-       if( setjmp(bus_error_jmp) == 0 ) {
-               debugger_fault_handler = handle_fault;
-               sync();
-               do {
-                       next = simple_strtoul(p, &p, 16);
-                       if (next > addr && prev <= addr) {
-                               if (!psym)
-                                       goto bail;
-                               ep = rbuffer;
-                               p = psym;
-                               while(*p && p < limit && *p == 32)
-                                       p++;
-                               while(*p && p < limit && *p != 10 && (ep - rbuffer) < 63)
-                                       *(ep++) = *(p++);
-                               *(ep++) = 0;
-                               if (saddr)
-                                       *saddr = prev;
-                               debugger_fault_handler = NULL;
-                               return rbuffer;
-                       }
-                       prev = next;
-                       psym = p;
-                       while(*p && p < limit && *p != 10)
-                               p++;
-                       if (*p) p++;
-               } while(*p && p < limit && next);
-bail:
-               sync();
+       switch (type) {
+       case 'a':
+               if (scanhex(&addr))
+                       xmon_print_symbol(addr, ": ", "\n");
+               termch = 0;
+               break;
+       case 's':
+               getstring(tmp, 64);
+               if (setjmp(bus_error_jmp) == 0) {
+                       debugger_fault_handler = handle_fault;
+                       sync();
+                       addr = kallsyms_lookup_name(tmp);
+                       if (addr)
+                               printf("%s: %lx\n", tmp, addr);
+                       else
+                               printf("Symbol '%s' not found.\n", tmp);
+                       sync();
+               }
+               debugger_fault_handler = NULL;
+               termch = 0;
+               break;
        }
-       debugger_fault_handler = NULL;
-       return NULL;
 }
 
-unsigned long
-xmon_symbol_to_addr(char* symbol)
-{
-       char *p, *cur;
-       char *match = NULL;
-       int goodness = 0;
-       int result = 0;
-       
-       extern char *sysmap;
-       extern unsigned long sysmap_size;
-       if ( !sysmap || !sysmap_size )
-               return 0;
-
-       if( setjmp(bus_error_jmp) == 0 ) {
-               debugger_fault_handler = handle_fault;
-               sync();
-               cur = sysmap;
-               while(cur) {
-                       cur = strstr(cur, symbol);
-                       if (cur) {
-                               int gd = 1;
-
-                               /* best match if equal, better match if
-                                * begins with
-                                */
-                               if (cur == sysmap || *(cur-1) == ' ') {
-                                       gd++;
-                                       if (cur[strlen(symbol)] == 10)
-                                               gd++;
-                               }
-                               if (gd > goodness) {
-                                       match = cur;
-                                       goodness = gd;
-                                       if (gd == 3)
-                                               break;
-                               }
-                               cur++;
-                       }
-               }       
-               if (goodness) {
-                       p = match;
-                       while(p > sysmap && *p != 10)
-                               p--;
-                       if (*p == 10) p++;
-                       result = simple_strtoul(p, &p, 16);
-               }
-               sync();
-       }
-       debugger_fault_handler = NULL;
-       return result;
-}              
index 5cb343883e4d88649f8e8eaad39c67e856027d1e..0f1fa289744eaf8446a3c5d563e89611b9bfab24 100644 (file)
@@ -323,7 +323,7 @@ config EISA
        bool
 
 config PCI
-       bool
+       bool "support for PCI devices" if (EMBEDDED && PPC_ISERIES)
        default y
        help
          Find out whether your system includes a PCI bus. PCI is the name of
index 691f3008e69870d474fd45934edebc2b1a5eab11..33c752ceca4b963688d0133c002ad39cd9feff2c 100644 (file)
@@ -35,9 +35,9 @@ CROSS32AS     := $(AS) -a32
 CROSS32LD      := $(LD) -m elf32ppc
 CROSS32OBJCOPY := $(OBJCOPY)
 endif
-AS              := $(AS) -a64
-LD              := $(LD) -m elf64ppc
-CC             := $(CC) -m64
+override AS    += -a64
+override LD    += -m elf64ppc
+override CC    += -m64
 endif
 
 export CROSS32CC CROSS32AS CROSS32LD CROSS32OBJCOPY
index 7b607d1862cb07a9c4fb9a1203447c8bdedde63b..d5218b15824e93444a5b2c8810ffff5e0e6416d4 100644 (file)
 #include <linux/string.h>
 #include <linux/ctype.h>
 
+extern __u32 __div64_32(unsigned long long *dividend, __u32 divisor);
+
+/* The unnecessary pointer compare is there
+ * to check for type safety (n must be 64bit)
+ */
+# define do_div(n,base) ({                             \
+       __u32 __base = (base);                  \
+       __u32 __rem;                                    \
+       (void)(((typeof((n)) *)0) == ((unsigned long long *)0));        \
+       if (((n) >> 32) == 0) {                 \
+               __rem = (__u32)(n) % __base;            \
+               (n) = (__u32)(n) / __base;              \
+       } else                                          \
+               __rem = __div64_32(&(n), __base);       \
+       __rem;                                          \
+ })
+
 int (*prom)(void *);
 
 void *chosen_handle;
@@ -352,7 +369,7 @@ static int skip_atoi(const char **s)
 #define SPECIAL        32              /* 0x */
 #define LARGE  64              /* use 'ABCDEF' instead of 'abcdef' */
 
-static char * number(char * str, long num, int base, int size, int precision, int type)
+static char * number(char * str, unsigned long long num, int base, int size, int precision, int type)
 {
        char c,sign,tmp[66];
        const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
@@ -367,9 +384,9 @@ static char * number(char * str, long num, int base, int size, int precision, in
        c = (type & ZEROPAD) ? '0' : ' ';
        sign = 0;
        if (type & SIGN) {
-               if (num < 0) {
+               if ((signed long long)num < 0) {
                        sign = '-';
-                       num = -num;
+                       num = - (signed long long)num;
                        size--;
                } else if (type & PLUS) {
                        sign = '+';
@@ -389,8 +406,7 @@ static char * number(char * str, long num, int base, int size, int precision, in
        if (num == 0)
                tmp[i++]='0';
        else while (num != 0) {
-               tmp[i++] = digits[num % base];
-               num /= base;
+               tmp[i++] = digits[do_div(num, base)];
        }
        if (i > precision)
                precision = i;
@@ -426,7 +442,7 @@ int sprintf(char * buf, const char *fmt, ...);
 int vsprintf(char *buf, const char *fmt, va_list args)
 {
        int len;
-       unsigned long num;
+       unsigned long long num;
        int i, base;
        char * str;
        const char *s;
index 0f90df0b3f9c308b634c9aef891972e3e0710622..1eb33398648edf920bba7fe78137a499d65d1ac9 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11
-# Thu Mar 10 16:47:04 2005
+# Linux kernel version: 2.6.12-rc6
+# Tue Jun 14 16:59:20 2005
 #
 CONFIG_64BIT=y
 CONFIG_MMU=y
@@ -11,7 +11,7 @@ CONFIG_GENERIC_ISA_DMA=y
 CONFIG_HAVE_DEC_LOCK=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_COMPAT=y
-CONFIG_FRAME_POINTER=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 CONFIG_FORCE_MAX_ZONEORDER=13
 
 #
@@ -20,6 +20,7 @@ CONFIG_FORCE_MAX_ZONEORDER=13
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -31,19 +32,20 @@ CONFIG_POSIX_MQUEUE=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=17
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
+# CONFIG_CPUSETS is not set
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
 CONFIG_CC_ALIGN_FUNCTIONS=0
 CONFIG_CC_ALIGN_LABELS=0
@@ -87,6 +89,8 @@ CONFIG_NR_CPUS=2
 # CONFIG_SCHED_SMT is not set
 # CONFIG_PREEMPT is not set
 CONFIG_GENERIC_HARDIRQS=y
+CONFIG_SECCOMP=y
+CONFIG_ISA_DMA_API=y
 
 #
 # General setup
@@ -97,6 +101,7 @@ CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
+# CONFIG_PCI_DEBUG is not set
 # CONFIG_HOTPLUG_CPU is not set
 
 #
@@ -104,10 +109,6 @@ CONFIG_PCI_NAMES=y
 #
 # CONFIG_PCCARD is not set
 
-#
-# PC-card bridges
-#
-
 #
 # PCI Hotplug Support
 #
@@ -293,7 +294,6 @@ CONFIG_SCSI_SATA_SVW=y
 # CONFIG_SCSI_BUSLOGIC is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_EATA_PIO is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
 # CONFIG_SCSI_GDTH is not set
 # CONFIG_SCSI_IPS is not set
@@ -301,7 +301,6 @@ CONFIG_SCSI_SATA_SVW=y
 # CONFIG_SCSI_INIA100 is not set
 # CONFIG_SCSI_SYM53C8XX_2 is not set
 # CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_QLOGIC_ISP is not set
 # CONFIG_SCSI_QLOGIC_FC is not set
 # CONFIG_SCSI_QLOGIC_1280 is not set
 CONFIG_SCSI_QLA2XXX=y
@@ -310,6 +309,7 @@ CONFIG_SCSI_QLA2XXX=y
 # CONFIG_SCSI_QLA2300 is not set
 # CONFIG_SCSI_QLA2322 is not set
 # CONFIG_SCSI_QLA6312 is not set
+# CONFIG_SCSI_LPFC is not set
 # CONFIG_SCSI_DC395x is not set
 # CONFIG_SCSI_DC390T is not set
 # CONFIG_SCSI_DEBUG is not set
@@ -332,6 +332,7 @@ CONFIG_DM_CRYPT=m
 CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
+# CONFIG_DM_MULTIPATH is not set
 
 #
 # Fusion MPT device support
@@ -394,7 +395,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 CONFIG_NET_KEY=m
 CONFIG_INET=y
@@ -564,6 +564,8 @@ CONFIG_E1000=y
 # CONFIG_R8169 is not set
 # CONFIG_SK98LIN is not set
 CONFIG_TIGON3=m
+# CONFIG_BNX2 is not set
+# CONFIG_MV643XX_ETH is not set
 
 #
 # Ethernet (10000 Mbit)
@@ -630,18 +632,6 @@ CONFIG_INPUT_JOYDEV=m
 CONFIG_INPUT_EVDEV=y
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_PCIPS2 is not set
-# CONFIG_SERIO_RAW is not set
-
 #
 # Input Device Drivers
 #
@@ -659,6 +649,16 @@ CONFIG_INPUT_MOUSE=y
 # 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_RAW is not set
+# CONFIG_GAMEPORT is not set
+
 #
 # Character devices
 #
@@ -676,6 +676,7 @@ CONFIG_HW_CONSOLE=y
 # Non-8250 serial port support
 #
 # CONFIG_SERIAL_PMACZILOG is not set
+# CONFIG_SERIAL_JSM is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -698,9 +699,12 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # Ftape, the floppy tape device driver
 #
+CONFIG_AGP=m
+CONFIG_AGP_UNINORTH=m
 # CONFIG_DRM is not set
 CONFIG_RAW_DRIVER=y
 CONFIG_MAX_RAW_DEVS=256
+# CONFIG_HANGCHECK_TIMER is not set
 
 #
 # TPM devices
@@ -730,12 +734,11 @@ CONFIG_I2C_ALGOBIT=y
 # CONFIG_I2C_AMD8111 is not set
 # CONFIG_I2C_I801 is not set
 # CONFIG_I2C_I810 is not set
+# CONFIG_I2C_PIIX4 is not set
 # CONFIG_I2C_ISA is not set
 CONFIG_I2C_KEYWEST=y
-# CONFIG_I2C_MPC is not set
 # CONFIG_I2C_NFORCE2 is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PIIX4 is not set
 # CONFIG_I2C_PROSAVAGE is not set
 # CONFIG_I2C_SAVAGE4 is not set
 # CONFIG_SCx200_ACB is not set
@@ -772,6 +775,7 @@ CONFIG_I2C_KEYWEST=y
 # CONFIG_SENSORS_LM85 is not set
 # CONFIG_SENSORS_LM87 is not set
 # CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
 # CONFIG_SENSORS_MAX1619 is not set
 # CONFIG_SENSORS_PC87360 is not set
 # CONFIG_SENSORS_SMSC47B397 is not set
@@ -785,6 +789,7 @@ CONFIG_I2C_KEYWEST=y
 #
 # Other I2C Chip support
 #
+# CONFIG_SENSORS_DS1337 is not set
 # CONFIG_SENSORS_EEPROM is not set
 # CONFIG_SENSORS_PCF8574 is not set
 # CONFIG_SENSORS_PCF8591 is not set
@@ -817,6 +822,11 @@ CONFIG_I2C_KEYWEST=y
 # Graphics support
 #
 CONFIG_FB=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+CONFIG_FB_SOFT_CURSOR=y
+CONFIG_FB_MACMODES=y
 CONFIG_FB_MODE_HELPERS=y
 CONFIG_FB_TILEBLITTING=y
 # CONFIG_FB_CIRRUS is not set
@@ -830,6 +840,7 @@ CONFIG_FB_OF=y
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
 # CONFIG_FB_VGA16 is not set
+# CONFIG_FB_NVIDIA is not set
 CONFIG_FB_RIVA=y
 # CONFIG_FB_RIVA_I2C is not set
 # CONFIG_FB_RIVA_DEBUG is not set
@@ -847,6 +858,7 @@ CONFIG_FB_RADEON_I2C=y
 # CONFIG_FB_3DFX is not set
 # CONFIG_FB_VOODOO1 is not set
 # CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -880,6 +892,8 @@ CONFIG_LCD_DEVICE=y
 #
 # USB support
 #
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
 CONFIG_USB=y
 # CONFIG_USB_DEBUG is not set
 
@@ -890,8 +904,6 @@ CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
 # CONFIG_USB_OTG is not set
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
 
 #
 # USB Host Controller Drivers
@@ -917,7 +929,6 @@ CONFIG_USB_PRINTER=y
 #
 CONFIG_USB_STORAGE=y
 # CONFIG_USB_STORAGE_DEBUG is not set
-CONFIG_USB_STORAGE_RW_DETECT=y
 CONFIG_USB_STORAGE_DATAFAB=y
 CONFIG_USB_STORAGE_FREECOM=y
 CONFIG_USB_STORAGE_ISD200=y
@@ -1004,8 +1015,10 @@ CONFIG_USB_MON=y
 #
 CONFIG_USB_SERIAL=m
 CONFIG_USB_SERIAL_GENERIC=y
+# CONFIG_USB_SERIAL_AIRPRIME is not set
 CONFIG_USB_SERIAL_BELKIN=m
 CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+# CONFIG_USB_SERIAL_CP2101 is not set
 CONFIG_USB_SERIAL_CYPRESS_M8=m
 CONFIG_USB_SERIAL_EMPEG=m
 CONFIG_USB_SERIAL_FTDI_SIO=m
@@ -1034,6 +1047,7 @@ CONFIG_USB_SERIAL_KLSI=m
 CONFIG_USB_SERIAL_KOBIL_SCT=m
 CONFIG_USB_SERIAL_MCT_U232=m
 CONFIG_USB_SERIAL_PL2303=m
+# CONFIG_USB_SERIAL_HP4X is not set
 CONFIG_USB_SERIAL_SAFE=m
 CONFIG_USB_SERIAL_SAFE_PADDED=y
 CONFIG_USB_SERIAL_TI=m
@@ -1270,11 +1284,13 @@ CONFIG_OPROFILE=y
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
-# CONFIG_PRINTK_TIME is not set
+CONFIG_LOG_BUF_SHIFT=17
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_SPINLOCK is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
index a39e9d2e25da1120946947ceac662f96bed0118e..f6a2b99afd6314b445d7b429776590818604f60f 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc3-bk6
-# Wed Feb  9 23:34:52 2005
+# Linux kernel version: 2.6.12-rc6
+# Tue Jun 14 17:01:28 2005
 #
 CONFIG_64BIT=y
 CONFIG_MMU=y
@@ -11,7 +11,7 @@ CONFIG_GENERIC_ISA_DMA=y
 CONFIG_HAVE_DEC_LOCK=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_COMPAT=y
-CONFIG_FRAME_POINTER=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 CONFIG_FORCE_MAX_ZONEORDER=13
 
 #
@@ -20,6 +20,7 @@ CONFIG_FORCE_MAX_ZONEORDER=13
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -30,24 +31,29 @@ CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
-CONFIG_LOG_BUF_SHIFT=17
+CONFIG_AUDIT=y
+CONFIG_AUDITSYSCALL=y
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
+# CONFIG_CPUSETS is not set
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
 CONFIG_CC_ALIGN_FUNCTIONS=0
 CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -79,6 +85,8 @@ CONFIG_NR_CPUS=32
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_MSCHUNKS=y
 CONFIG_LPARCFG=y
+CONFIG_SECCOMP=y
+CONFIG_ISA_DMA_API=y
 
 #
 # General setup
@@ -89,16 +97,13 @@ CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
+# CONFIG_PCI_DEBUG is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
 #
 # CONFIG_PCCARD is not set
 
-#
-# PC-card bridges
-#
-
 #
 # PCI Hotplug Support
 #
@@ -210,7 +215,6 @@ CONFIG_SCSI_FC_ATTRS=y
 # CONFIG_SCSI_BUSLOGIC is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_EATA_PIO is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
 # CONFIG_SCSI_GDTH is not set
 # CONFIG_SCSI_IPS is not set
@@ -219,7 +223,6 @@ CONFIG_SCSI_IBMVSCSI=m
 # CONFIG_SCSI_INIA100 is not set
 # CONFIG_SCSI_SYM53C8XX_2 is not set
 # CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_QLOGIC_ISP is not set
 # CONFIG_SCSI_QLOGIC_FC is not set
 # CONFIG_SCSI_QLOGIC_1280 is not set
 CONFIG_SCSI_QLA2XXX=y
@@ -228,6 +231,7 @@ CONFIG_SCSI_QLA2XXX=y
 # CONFIG_SCSI_QLA2300 is not set
 # CONFIG_SCSI_QLA2322 is not set
 # CONFIG_SCSI_QLA6312 is not set
+# CONFIG_SCSI_LPFC is not set
 # CONFIG_SCSI_DC395x is not set
 # CONFIG_SCSI_DC390T is not set
 # CONFIG_SCSI_DEBUG is not set
@@ -250,6 +254,7 @@ CONFIG_DM_CRYPT=m
 CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
+# CONFIG_DM_MULTIPATH is not set
 
 #
 # Fusion MPT device support
@@ -280,7 +285,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 CONFIG_NET_KEY=m
 CONFIG_INET=y
@@ -445,7 +449,6 @@ CONFIG_PCNET32=y
 # CONFIG_DGRS is not set
 # CONFIG_EEPRO100 is not set
 CONFIG_E100=y
-# CONFIG_E100_NAPI is not set
 # CONFIG_FEALNX is not set
 # CONFIG_NATSEMI is not set
 # CONFIG_NE2K_PCI is not set
@@ -471,6 +474,7 @@ CONFIG_E1000=m
 # CONFIG_SK98LIN is not set
 # CONFIG_VIA_VELOCITY is not set
 # CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
 
 #
 # Ethernet (10000 Mbit)
@@ -538,14 +542,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
 # CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-# CONFIG_SERIO is not set
-# CONFIG_SERIO_I8042 is not set
-
 #
 # Input Device Drivers
 #
@@ -555,6 +551,12 @@ CONFIG_SOUND_GAMEPORT=y
 # CONFIG_INPUT_TOUCHSCREEN is not set
 # CONFIG_INPUT_MISC is not set
 
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
 #
 # Character devices
 #
@@ -570,6 +572,7 @@ CONFIG_SOUND_GAMEPORT=y
 #
 CONFIG_SERIAL_CORE=m
 CONFIG_SERIAL_ICOM=m
+# CONFIG_SERIAL_JSM is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -592,9 +595,16 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # Ftape, the floppy tape device driver
 #
+# CONFIG_AGP is not set
 # CONFIG_DRM is not set
 CONFIG_RAW_DRIVER=y
 CONFIG_MAX_RAW_DEVS=256
+# CONFIG_HANGCHECK_TIMER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
 
 #
 # I2C support
@@ -633,13 +643,9 @@ CONFIG_MAX_RAW_DEVS=256
 #
 # USB support
 #
-# CONFIG_USB is not set
 CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
+# CONFIG_USB is not set
 
 #
 # USB Gadget Support
@@ -848,10 +854,13 @@ CONFIG_OPROFILE=y
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
+CONFIG_LOG_BUF_SHIFT=17
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_SPINLOCK is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
@@ -881,6 +890,7 @@ CONFIG_CRYPTO_SHA1=m
 CONFIG_CRYPTO_SHA256=m
 CONFIG_CRYPTO_SHA512=m
 CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_TGR192=m
 CONFIG_CRYPTO_DES=y
 CONFIG_CRYPTO_BLOWFISH=m
 CONFIG_CRYPTO_TWOFISH=m
index cf527501915c6051f3ceba11e7968b7353301f10..8051b0f47b6f6ece08107b5a9929943f41b43895 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc3-bk6
-# Wed Feb  9 23:34:53 2005
+# Linux kernel version: 2.6.12-rc6
+# Tue Jun 14 17:12:48 2005
 #
 CONFIG_64BIT=y
 CONFIG_MMU=y
@@ -11,7 +11,7 @@ CONFIG_GENERIC_ISA_DMA=y
 CONFIG_HAVE_DEC_LOCK=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_COMPAT=y
-CONFIG_FRAME_POINTER=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 CONFIG_FORCE_MAX_ZONEORDER=13
 
 #
@@ -20,6 +20,7 @@ CONFIG_FORCE_MAX_ZONEORDER=13
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -30,24 +31,28 @@ CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
-CONFIG_LOG_BUF_SHIFT=17
+# CONFIG_AUDIT is not set
 # CONFIG_HOTPLUG is not set
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
+# CONFIG_CPUSETS is not set
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 CONFIG_KALLSYMS_ALL=y
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
 CONFIG_CC_ALIGN_FUNCTIONS=0
 CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -84,6 +89,8 @@ CONFIG_NR_CPUS=2
 # CONFIG_SCHED_SMT is not set
 # CONFIG_PREEMPT is not set
 CONFIG_GENERIC_HARDIRQS=y
+CONFIG_SECCOMP=y
+CONFIG_ISA_DMA_API=y
 
 #
 # General setup
@@ -94,16 +101,13 @@ CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
+# CONFIG_PCI_DEBUG is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
 #
 # CONFIG_PCCARD is not set
 
-#
-# PC-card bridges
-#
-
 #
 # PCI Hotplug Support
 #
@@ -261,7 +265,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 CONFIG_PACKET_MMAP=y
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -376,6 +379,8 @@ CONFIG_E1000=y
 # CONFIG_SK98LIN is not set
 # CONFIG_VIA_VELOCITY is not set
 # CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+# CONFIG_MV643XX_ETH is not set
 
 #
 # Ethernet (10000 Mbit)
@@ -431,14 +436,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=1200
 # CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-# CONFIG_SERIO is not set
-# CONFIG_SERIO_I8042 is not set
-
 #
 # Input Device Drivers
 #
@@ -448,6 +445,12 @@ CONFIG_SOUND_GAMEPORT=y
 # CONFIG_INPUT_TOUCHSCREEN is not set
 # CONFIG_INPUT_MISC is not set
 
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
 #
 # Character devices
 #
@@ -469,7 +472,7 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 #
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
-# CONFIG_SERIAL_PMACZILOG is not set
+# CONFIG_SERIAL_JSM is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -492,8 +495,15 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # Ftape, the floppy tape device driver
 #
+# CONFIG_AGP is not set
 # CONFIG_DRM is not set
 # CONFIG_RAW_DRIVER is not set
+# CONFIG_HANGCHECK_TIMER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
 
 #
 # I2C support
@@ -518,8 +528,8 @@ CONFIG_I2C_ALGOBIT=y
 CONFIG_I2C_AMD8111=y
 # CONFIG_I2C_I801 is not set
 # CONFIG_I2C_I810 is not set
+# CONFIG_I2C_PIIX4 is not set
 # CONFIG_I2C_ISA is not set
-# CONFIG_I2C_MPC is not set
 # CONFIG_I2C_NFORCE2 is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
 # CONFIG_I2C_PROSAVAGE is not set
@@ -545,7 +555,9 @@ CONFIG_I2C_AMD8111=y
 # CONFIG_SENSORS_ASB100 is not set
 # CONFIG_SENSORS_DS1621 is not set
 # CONFIG_SENSORS_FSCHER is not set
+# CONFIG_SENSORS_FSCPOS is not set
 # CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
 # CONFIG_SENSORS_IT87 is not set
 # CONFIG_SENSORS_LM63 is not set
 # CONFIG_SENSORS_LM75 is not set
@@ -556,9 +568,11 @@ CONFIG_I2C_AMD8111=y
 # CONFIG_SENSORS_LM85 is not set
 # CONFIG_SENSORS_LM87 is not set
 # CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
 # CONFIG_SENSORS_MAX1619 is not set
 # CONFIG_SENSORS_PC87360 is not set
 # CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_SIS5595 is not set
 # CONFIG_SENSORS_SMSC47M1 is not set
 # CONFIG_SENSORS_VIA686A is not set
 # CONFIG_SENSORS_W83781D is not set
@@ -568,6 +582,7 @@ CONFIG_I2C_AMD8111=y
 #
 # Other I2C Chip support
 #
+# CONFIG_SENSORS_DS1337 is not set
 # CONFIG_SENSORS_EEPROM is not set
 # CONFIG_SENSORS_PCF8574 is not set
 # CONFIG_SENSORS_PCF8591 is not set
@@ -615,6 +630,8 @@ CONFIG_DUMMY_CONSOLE=y
 #
 # USB support
 #
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
 CONFIG_USB=y
 # CONFIG_USB_DEBUG is not set
 
@@ -625,8 +642,6 @@ CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
 # CONFIG_USB_OTG is not set
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
 
 #
 # USB Host Controller Drivers
@@ -635,6 +650,8 @@ CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_EHCI_SPLIT_ISO=y
 CONFIG_USB_EHCI_ROOT_HUB_TT=y
 CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 CONFIG_USB_UHCI_HCD=y
 # CONFIG_USB_SL811_HCD is not set
 
@@ -688,6 +705,7 @@ CONFIG_USB_HIDINPUT=y
 CONFIG_USB_PEGASUS=y
 # CONFIG_USB_RTL8150 is not set
 # CONFIG_USB_USBNET is not set
+CONFIG_USB_MON=y
 
 #
 # USB port drivers
@@ -699,8 +717,10 @@ CONFIG_USB_PEGASUS=y
 CONFIG_USB_SERIAL=y
 # CONFIG_USB_SERIAL_CONSOLE is not set
 CONFIG_USB_SERIAL_GENERIC=y
+# CONFIG_USB_SERIAL_AIRPRIME is not set
 # CONFIG_USB_SERIAL_BELKIN is not set
 # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
+# CONFIG_USB_SERIAL_CP2101 is not set
 CONFIG_USB_SERIAL_CYPRESS_M8=m
 # CONFIG_USB_SERIAL_EMPEG is not set
 # CONFIG_USB_SERIAL_FTDI_SIO is not set
@@ -729,6 +749,7 @@ CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
 # CONFIG_USB_SERIAL_KOBIL_SCT is not set
 # CONFIG_USB_SERIAL_MCT_U232 is not set
 # CONFIG_USB_SERIAL_PL2303 is not set
+# CONFIG_USB_SERIAL_HP4X is not set
 # CONFIG_USB_SERIAL_SAFE is not set
 CONFIG_USB_SERIAL_TI=m
 # CONFIG_USB_SERIAL_CYBERJACK is not set
@@ -750,6 +771,7 @@ CONFIG_USB_EZUSB=y
 # CONFIG_USB_PHIDGETKIT is not set
 # CONFIG_USB_PHIDGETSERVO is not set
 # CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_SISUSBVGA is not set
 # CONFIG_USB_TEST is not set
 
 #
@@ -936,10 +958,13 @@ CONFIG_NLS_UTF8=y
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
+CONFIG_LOG_BUF_SHIFT=17
 # CONFIG_SCHEDSTATS is not set
 CONFIG_DEBUG_SLAB=y
+# CONFIG_DEBUG_SPINLOCK is not set
 CONFIG_DEBUG_SPINLOCK_SLEEP=y
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
@@ -971,6 +996,7 @@ CONFIG_CRYPTO_MD5=y
 # 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_DES=y
 # CONFIG_CRYPTO_BLOWFISH is not set
 # CONFIG_CRYPTO_TWOFISH is not set
index 4fecf237d5c9f1be1c3a3b9b1f07b240d1472ad2..3eb5ef25d3a3cbf25984a318ff17f908c4cc7e13 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc3-bk6
-# Wed Feb  9 23:34:54 2005
+# Linux kernel version: 2.6.12-rc6
+# Tue Jun 14 17:13:47 2005
 #
 CONFIG_64BIT=y
 CONFIG_MMU=y
@@ -11,7 +11,7 @@ CONFIG_GENERIC_ISA_DMA=y
 CONFIG_HAVE_DEC_LOCK=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_COMPAT=y
-CONFIG_FRAME_POINTER=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 CONFIG_FORCE_MAX_ZONEORDER=13
 
 #
@@ -20,6 +20,7 @@ CONFIG_FORCE_MAX_ZONEORDER=13
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -30,24 +31,29 @@ CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
-CONFIG_LOG_BUF_SHIFT=17
+CONFIG_AUDIT=y
+CONFIG_AUDITSYSCALL=y
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
+CONFIG_CPUSETS=y
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 CONFIG_KALLSYMS_ALL=y
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
 CONFIG_CC_ALIGN_FUNCTIONS=0
 CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -89,9 +95,12 @@ CONFIG_SCHED_SMT=y
 CONFIG_EEH=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_PPC_RTAS=y
+CONFIG_RTAS_PROC=y
 CONFIG_RTAS_FLASH=m
 CONFIG_SCANLOG=m
 CONFIG_LPARCFG=y
+CONFIG_SECCOMP=y
+CONFIG_ISA_DMA_API=y
 
 #
 # General setup
@@ -102,6 +111,7 @@ CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
+# CONFIG_PCI_DEBUG is not set
 CONFIG_HOTPLUG_CPU=y
 
 #
@@ -109,10 +119,6 @@ CONFIG_HOTPLUG_CPU=y
 #
 # CONFIG_PCCARD is not set
 
-#
-# PC-card bridges
-#
-
 #
 # PCI Hotplug Support
 #
@@ -147,11 +153,10 @@ CONFIG_FW_LOADER=y
 #
 CONFIG_PARPORT=m
 CONFIG_PARPORT_PC=m
-CONFIG_PARPORT_PC_CML1=m
 # CONFIG_PARPORT_SERIAL is not set
 # CONFIG_PARPORT_PC_FIFO is not set
 # CONFIG_PARPORT_PC_SUPERIO is not set
-# CONFIG_PARPORT_OTHER is not set
+# CONFIG_PARPORT_GSC is not set
 # CONFIG_PARPORT_1284 is not set
 
 #
@@ -293,7 +298,6 @@ CONFIG_SCSI_ISCSI_ATTRS=m
 # CONFIG_SCSI_BUSLOGIC is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_EATA_PIO is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
 # CONFIG_SCSI_GDTH is not set
 # CONFIG_SCSI_IPS is not set
@@ -310,7 +314,6 @@ CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
 CONFIG_SCSI_IPR=y
 CONFIG_SCSI_IPR_TRACE=y
 CONFIG_SCSI_IPR_DUMP=y
-# CONFIG_SCSI_QLOGIC_ISP is not set
 # CONFIG_SCSI_QLOGIC_FC is not set
 # CONFIG_SCSI_QLOGIC_1280 is not set
 CONFIG_SCSI_QLA2XXX=y
@@ -319,6 +322,7 @@ CONFIG_SCSI_QLA22XX=m
 CONFIG_SCSI_QLA2300=m
 CONFIG_SCSI_QLA2322=m
 CONFIG_SCSI_QLA6312=m
+CONFIG_SCSI_LPFC=m
 # CONFIG_SCSI_DC395x is not set
 # CONFIG_SCSI_DC390T is not set
 # CONFIG_SCSI_DEBUG is not set
@@ -341,6 +345,8 @@ CONFIG_DM_CRYPT=m
 CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
+CONFIG_DM_MULTIPATH=m
+CONFIG_DM_MULTIPATH_EMC=m
 
 #
 # Fusion MPT device support
@@ -371,7 +377,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 CONFIG_NET_KEY=m
 CONFIG_INET=y
@@ -539,7 +544,6 @@ CONFIG_PCNET32=y
 # CONFIG_DGRS is not set
 # CONFIG_EEPRO100 is not set
 CONFIG_E100=y
-# CONFIG_E100_NAPI is not set
 # CONFIG_FEALNX is not set
 # CONFIG_NATSEMI is not set
 # CONFIG_NE2K_PCI is not set
@@ -565,6 +569,8 @@ CONFIG_E1000=y
 # CONFIG_SK98LIN is not set
 # CONFIG_VIA_VELOCITY is not set
 CONFIG_TIGON3=y
+# CONFIG_BNX2 is not set
+# CONFIG_MV643XX_ETH is not set
 
 #
 # Ethernet (10000 Mbit)
@@ -635,20 +641,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
 # CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_PARKBD is not set
-# CONFIG_SERIO_PCIPS2 is not set
-CONFIG_SERIO_LIBPS2=y
-# CONFIG_SERIO_RAW is not set
-
 #
 # Input Device Drivers
 #
@@ -668,6 +660,18 @@ CONFIG_INPUT_MISC=y
 CONFIG_INPUT_PCSPKR=m
 # CONFIG_INPUT_UINPUT is not set
 
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_PARKBD 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
 #
@@ -689,8 +693,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 #
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
-# CONFIG_SERIAL_PMACZILOG is not set
 CONFIG_SERIAL_ICOM=m
+# CONFIG_SERIAL_JSM is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -718,9 +722,16 @@ CONFIG_HVCS=m
 #
 # Ftape, the floppy tape device driver
 #
+# CONFIG_AGP is not set
 # CONFIG_DRM is not set
 CONFIG_RAW_DRIVER=y
 CONFIG_MAX_RAW_DEVS=1024
+# CONFIG_HANGCHECK_TIMER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
 
 #
 # I2C support
@@ -745,8 +756,8 @@ CONFIG_I2C_ALGOBIT=y
 # CONFIG_I2C_AMD8111 is not set
 # CONFIG_I2C_I801 is not set
 # CONFIG_I2C_I810 is not set
+# CONFIG_I2C_PIIX4 is not set
 # CONFIG_I2C_ISA is not set
-# CONFIG_I2C_MPC is not set
 # CONFIG_I2C_NFORCE2 is not set
 # CONFIG_I2C_PARPORT is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
@@ -773,7 +784,9 @@ CONFIG_I2C_ALGOBIT=y
 # CONFIG_SENSORS_ASB100 is not set
 # CONFIG_SENSORS_DS1621 is not set
 # CONFIG_SENSORS_FSCHER is not set
+# CONFIG_SENSORS_FSCPOS is not set
 # CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
 # CONFIG_SENSORS_IT87 is not set
 # CONFIG_SENSORS_LM63 is not set
 # CONFIG_SENSORS_LM75 is not set
@@ -784,9 +797,11 @@ CONFIG_I2C_ALGOBIT=y
 # CONFIG_SENSORS_LM85 is not set
 # CONFIG_SENSORS_LM87 is not set
 # CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
 # CONFIG_SENSORS_MAX1619 is not set
 # CONFIG_SENSORS_PC87360 is not set
 # CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_SIS5595 is not set
 # CONFIG_SENSORS_SMSC47M1 is not set
 # CONFIG_SENSORS_VIA686A is not set
 # CONFIG_SENSORS_W83781D is not set
@@ -796,6 +811,7 @@ CONFIG_I2C_ALGOBIT=y
 #
 # Other I2C Chip support
 #
+# CONFIG_SENSORS_DS1337 is not set
 # CONFIG_SENSORS_EEPROM is not set
 # CONFIG_SENSORS_PCF8574 is not set
 # CONFIG_SENSORS_PCF8591 is not set
@@ -828,8 +844,13 @@ CONFIG_I2C_ALGOBIT=y
 # Graphics support
 #
 CONFIG_FB=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+CONFIG_FB_SOFT_CURSOR=y
+CONFIG_FB_MACMODES=y
 CONFIG_FB_MODE_HELPERS=y
-# CONFIG_FB_TILEBLITTING is not set
+CONFIG_FB_TILEBLITTING=y
 # CONFIG_FB_CIRRUS is not set
 # CONFIG_FB_PM2 is not set
 # CONFIG_FB_CYBER2000 is not set
@@ -838,6 +859,7 @@ CONFIG_FB_OF=y
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
 # CONFIG_FB_VGA16 is not set
+# CONFIG_FB_NVIDIA is not set
 # CONFIG_FB_RIVA is not set
 CONFIG_FB_MATROX=y
 CONFIG_FB_MATROX_MILLENIUM=y
@@ -858,6 +880,7 @@ CONFIG_FB_RADEON_I2C=y
 # CONFIG_FB_3DFX is not set
 # CONFIG_FB_VOODOO1 is not set
 # CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -891,6 +914,8 @@ CONFIG_LCD_DEVICE=y
 #
 # USB support
 #
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
 CONFIG_USB=y
 # CONFIG_USB_DEBUG is not set
 
@@ -901,8 +926,6 @@ CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
 # CONFIG_USB_OTG is not set
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
 
 #
 # USB Host Controller Drivers
@@ -911,6 +934,8 @@ CONFIG_USB_EHCI_HCD=y
 # CONFIG_USB_EHCI_SPLIT_ISO is not set
 # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
 CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 # CONFIG_USB_UHCI_HCD is not set
 # CONFIG_USB_SL811_HCD is not set
 
@@ -926,12 +951,11 @@ CONFIG_USB_OHCI_HCD=y
 #
 CONFIG_USB_STORAGE=y
 # CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_RW_DETECT is not set
 # CONFIG_USB_STORAGE_DATAFAB is not set
 # CONFIG_USB_STORAGE_FREECOM is not set
 # CONFIG_USB_STORAGE_ISD200 is not set
 # CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_HP8200e is not set
+# CONFIG_USB_STORAGE_USBAT is not set
 # CONFIG_USB_STORAGE_SDDR09 is not set
 # CONFIG_USB_STORAGE_SDDR55 is not set
 # CONFIG_USB_STORAGE_JUMPSHOT is not set
@@ -975,6 +999,7 @@ CONFIG_USB_HIDDEV=y
 # CONFIG_USB_PEGASUS is not set
 # CONFIG_USB_RTL8150 is not set
 # CONFIG_USB_USBNET is not set
+CONFIG_USB_MON=y
 
 #
 # USB port drivers
@@ -1000,6 +1025,7 @@ CONFIG_USB_HIDDEV=y
 # CONFIG_USB_PHIDGETKIT is not set
 # CONFIG_USB_PHIDGETSERVO is not set
 # CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_SISUSBVGA is not set
 # CONFIG_USB_TEST is not set
 
 #
@@ -1208,10 +1234,13 @@ CONFIG_OPROFILE=y
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
+CONFIG_LOG_BUF_SHIFT=17
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_SPINLOCK is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
@@ -1243,6 +1272,7 @@ CONFIG_CRYPTO_SHA1=m
 CONFIG_CRYPTO_SHA256=m
 CONFIG_CRYPTO_SHA512=m
 CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_TGR192=m
 CONFIG_CRYPTO_DES=y
 CONFIG_CRYPTO_BLOWFISH=m
 CONFIG_CRYPTO_TWOFISH=m
index 537b1cc82eab0bdb01a19ac9552b38061aa643c7..2f31bf3046f901a85a4b4361b73b58396b21b150 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-rc3-bk6
-# Wed Feb  9 23:34:51 2005
+# Linux kernel version: 2.6.12-rc5-git9
+# Sun Jun  5 09:26:47 2005
 #
 CONFIG_64BIT=y
 CONFIG_MMU=y
@@ -11,7 +11,7 @@ CONFIG_GENERIC_ISA_DMA=y
 CONFIG_HAVE_DEC_LOCK=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_COMPAT=y
-CONFIG_FRAME_POINTER=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 CONFIG_FORCE_MAX_ZONEORDER=13
 
 #
@@ -20,6 +20,7 @@ CONFIG_FORCE_MAX_ZONEORDER=13
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -30,24 +31,28 @@ CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
-CONFIG_LOG_BUF_SHIFT=17
+# CONFIG_AUDIT is not set
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
+CONFIG_CPUSETS=y
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
 CONFIG_CC_ALIGN_FUNCTIONS=0
 CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -91,9 +96,12 @@ CONFIG_DISCONTIGMEM=y
 CONFIG_EEH=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_PPC_RTAS=y
+CONFIG_RTAS_PROC=y
 CONFIG_RTAS_FLASH=m
 CONFIG_SCANLOG=m
 CONFIG_LPARCFG=y
+CONFIG_SECCOMP=y
+CONFIG_ISA_DMA_API=y
 
 #
 # General setup
@@ -104,6 +112,7 @@ CONFIG_BINFMT_ELF=y
 CONFIG_BINFMT_MISC=m
 # CONFIG_PCI_LEGACY_PROC is not set
 # CONFIG_PCI_NAMES is not set
+# CONFIG_PCI_DEBUG is not set
 CONFIG_HOTPLUG_CPU=y
 
 #
@@ -111,10 +120,6 @@ CONFIG_HOTPLUG_CPU=y
 #
 # CONFIG_PCCARD is not set
 
-#
-# PC-card bridges
-#
-
 #
 # PCI Hotplug Support
 #
@@ -149,11 +154,10 @@ CONFIG_FW_LOADER=y
 #
 CONFIG_PARPORT=m
 CONFIG_PARPORT_PC=m
-CONFIG_PARPORT_PC_CML1=m
 # CONFIG_PARPORT_SERIAL is not set
 # CONFIG_PARPORT_PC_FIFO is not set
 # CONFIG_PARPORT_PC_SUPERIO is not set
-# CONFIG_PARPORT_OTHER is not set
+# CONFIG_PARPORT_GSC is not set
 # CONFIG_PARPORT_1284 is not set
 
 #
@@ -301,6 +305,7 @@ CONFIG_SCSI_SATA_SVW=y
 # CONFIG_SCSI_ATA_PIIX is not set
 # CONFIG_SCSI_SATA_NV is not set
 # CONFIG_SCSI_SATA_PROMISE is not set
+# CONFIG_SCSI_SATA_QSTOR is not set
 # CONFIG_SCSI_SATA_SX4 is not set
 # CONFIG_SCSI_SATA_SIL is not set
 # CONFIG_SCSI_SATA_SIS is not set
@@ -310,7 +315,6 @@ CONFIG_SCSI_SATA_SVW=y
 # CONFIG_SCSI_BUSLOGIC is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_EATA_PIO is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
 # CONFIG_SCSI_GDTH is not set
 # CONFIG_SCSI_IPS is not set
@@ -327,7 +331,6 @@ CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
 CONFIG_SCSI_IPR=y
 CONFIG_SCSI_IPR_TRACE=y
 CONFIG_SCSI_IPR_DUMP=y
-# CONFIG_SCSI_QLOGIC_ISP is not set
 # CONFIG_SCSI_QLOGIC_FC is not set
 # CONFIG_SCSI_QLOGIC_1280 is not set
 CONFIG_SCSI_QLA2XXX=y
@@ -336,6 +339,7 @@ CONFIG_SCSI_QLA22XX=m
 CONFIG_SCSI_QLA2300=m
 CONFIG_SCSI_QLA2322=m
 CONFIG_SCSI_QLA6312=m
+CONFIG_SCSI_LPFC=m
 # CONFIG_SCSI_DC395x is not set
 # CONFIG_SCSI_DC390T is not set
 CONFIG_SCSI_DEBUG=m
@@ -358,6 +362,8 @@ CONFIG_DM_CRYPT=m
 CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
+CONFIG_DM_MULTIPATH=m
+CONFIG_DM_MULTIPATH_EMC=m
 
 #
 # Fusion MPT device support
@@ -405,6 +411,7 @@ CONFIG_IEEE1394_AMDTP=m
 #
 CONFIG_ADB=y
 CONFIG_ADB_PMU=y
+CONFIG_PMAC_SMU=y
 # CONFIG_PMAC_PBOOK is not set
 # CONFIG_PMAC_BACKLIGHT is not set
 # CONFIG_INPUT_ADBHID is not set
@@ -420,7 +427,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 CONFIG_NET_KEY=m
 CONFIG_INET=y
@@ -588,7 +594,6 @@ CONFIG_PCNET32=y
 # CONFIG_DGRS is not set
 # CONFIG_EEPRO100 is not set
 CONFIG_E100=y
-# CONFIG_E100_NAPI is not set
 # CONFIG_FEALNX is not set
 # CONFIG_NATSEMI is not set
 # CONFIG_NE2K_PCI is not set
@@ -614,6 +619,8 @@ CONFIG_E1000=y
 # CONFIG_SK98LIN is not set
 # CONFIG_VIA_VELOCITY is not set
 CONFIG_TIGON3=y
+# CONFIG_BNX2 is not set
+# CONFIG_MV643XX_ETH is not set
 
 #
 # Ethernet (10000 Mbit)
@@ -682,20 +689,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
 CONFIG_INPUT_EVDEV=m
 # CONFIG_INPUT_EVBUG is not set
 
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_PARKBD is not set
-# CONFIG_SERIO_PCIPS2 is not set
-CONFIG_SERIO_LIBPS2=y
-# CONFIG_SERIO_RAW is not set
-
 #
 # Input Device Drivers
 #
@@ -715,6 +708,18 @@ CONFIG_INPUT_MISC=y
 CONFIG_INPUT_PCSPKR=m
 # CONFIG_INPUT_UINPUT is not set
 
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_PARKBD 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
 #
@@ -738,6 +743,7 @@ CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_SERIAL_PMACZILOG is not set
 CONFIG_SERIAL_ICOM=m
+CONFIG_SERIAL_JSM=m
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -766,9 +772,16 @@ CONFIG_HVCS=m
 #
 # Ftape, the floppy tape device driver
 #
+# CONFIG_AGP is not set
 # CONFIG_DRM is not set
 CONFIG_RAW_DRIVER=y
 CONFIG_MAX_RAW_DEVS=256
+# CONFIG_HANGCHECK_TIMER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
 
 #
 # I2C support
@@ -793,9 +806,9 @@ CONFIG_I2C_ALGOBIT=y
 CONFIG_I2C_AMD8111=y
 # CONFIG_I2C_I801 is not set
 # CONFIG_I2C_I810 is not set
+# CONFIG_I2C_PIIX4 is not set
 # CONFIG_I2C_ISA is not set
 CONFIG_I2C_KEYWEST=y
-# CONFIG_I2C_MPC is not set
 # CONFIG_I2C_NFORCE2 is not set
 # CONFIG_I2C_PARPORT is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
@@ -822,7 +835,9 @@ CONFIG_I2C_KEYWEST=y
 # CONFIG_SENSORS_ASB100 is not set
 # CONFIG_SENSORS_DS1621 is not set
 # CONFIG_SENSORS_FSCHER is not set
+# CONFIG_SENSORS_FSCPOS is not set
 # CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
 # CONFIG_SENSORS_IT87 is not set
 # CONFIG_SENSORS_LM63 is not set
 # CONFIG_SENSORS_LM75 is not set
@@ -833,9 +848,11 @@ CONFIG_I2C_KEYWEST=y
 # CONFIG_SENSORS_LM85 is not set
 # CONFIG_SENSORS_LM87 is not set
 # CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
 # CONFIG_SENSORS_MAX1619 is not set
 # CONFIG_SENSORS_PC87360 is not set
 # CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_SIS5595 is not set
 # CONFIG_SENSORS_SMSC47M1 is not set
 # CONFIG_SENSORS_VIA686A is not set
 # CONFIG_SENSORS_W83781D is not set
@@ -845,6 +862,7 @@ CONFIG_I2C_KEYWEST=y
 #
 # Other I2C Chip support
 #
+# CONFIG_SENSORS_DS1337 is not set
 # CONFIG_SENSORS_EEPROM is not set
 # CONFIG_SENSORS_PCF8574 is not set
 # CONFIG_SENSORS_PCF8591 is not set
@@ -877,6 +895,11 @@ CONFIG_I2C_KEYWEST=y
 # Graphics support
 #
 CONFIG_FB=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+CONFIG_FB_SOFT_CURSOR=y
+CONFIG_FB_MACMODES=y
 CONFIG_FB_MODE_HELPERS=y
 CONFIG_FB_TILEBLITTING=y
 # CONFIG_FB_CIRRUS is not set
@@ -890,9 +913,8 @@ CONFIG_FB_OF=y
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
 # CONFIG_FB_VGA16 is not set
-CONFIG_FB_RIVA=y
-CONFIG_FB_RIVA_I2C=y
-# CONFIG_FB_RIVA_DEBUG is not set
+# CONFIG_FB_NVIDIA is not set
+# CONFIG_FB_RIVA is not set
 CONFIG_FB_MATROX=y
 CONFIG_FB_MATROX_MILLENIUM=y
 CONFIG_FB_MATROX_MYSTIQUE=y
@@ -913,6 +935,7 @@ CONFIG_FB_RADEON_I2C=y
 # CONFIG_FB_3DFX is not set
 # CONFIG_FB_VOODOO1 is not set
 # CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -946,6 +969,8 @@ CONFIG_LCD_DEVICE=y
 #
 # USB support
 #
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
 CONFIG_USB=y
 # CONFIG_USB_DEBUG is not set
 
@@ -956,8 +981,6 @@ CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
 # CONFIG_USB_OTG is not set
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
 
 #
 # USB Host Controller Drivers
@@ -966,6 +989,8 @@ CONFIG_USB_EHCI_HCD=y
 # CONFIG_USB_EHCI_SPLIT_ISO is not set
 # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
 CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 # CONFIG_USB_UHCI_HCD is not set
 # CONFIG_USB_SL811_HCD is not set
 
@@ -981,12 +1006,11 @@ CONFIG_USB_OHCI_HCD=y
 #
 CONFIG_USB_STORAGE=m
 # CONFIG_USB_STORAGE_DEBUG is not set
-CONFIG_USB_STORAGE_RW_DETECT=y
 # CONFIG_USB_STORAGE_DATAFAB is not set
 # CONFIG_USB_STORAGE_FREECOM is not set
 # CONFIG_USB_STORAGE_ISD200 is not set
 # CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_HP8200e is not set
+# CONFIG_USB_STORAGE_USBAT is not set
 # CONFIG_USB_STORAGE_SDDR09 is not set
 # CONFIG_USB_STORAGE_SDDR55 is not set
 # CONFIG_USB_STORAGE_JUMPSHOT is not set
@@ -1030,6 +1054,7 @@ CONFIG_USB_HIDDEV=y
 CONFIG_USB_PEGASUS=y
 # CONFIG_USB_RTL8150 is not set
 # CONFIG_USB_USBNET is not set
+# CONFIG_USB_MON is not set
 
 #
 # USB port drivers
@@ -1055,6 +1080,7 @@ CONFIG_USB_PEGASUS=y
 # CONFIG_USB_PHIDGETKIT is not set
 # CONFIG_USB_PHIDGETSERVO is not set
 # CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_SISUSBVGA is not set
 # CONFIG_USB_TEST is not set
 
 #
@@ -1276,10 +1302,13 @@ CONFIG_OPROFILE=y
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
+CONFIG_LOG_BUF_SHIFT=17
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_SPINLOCK is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
@@ -1311,6 +1340,7 @@ CONFIG_CRYPTO_SHA1=m
 CONFIG_CRYPTO_SHA256=m
 CONFIG_CRYPTO_SHA512=m
 CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_TGR192=m
 CONFIG_CRYPTO_DES=y
 CONFIG_CRYPTO_BLOWFISH=m
 CONFIG_CRYPTO_TWOFISH=m
index f8f19637f73f1fa9e0ecc514989c4e005c2c9b77..90032b138902e560a7e28c6df668dbae4f681bd7 100644 (file)
@@ -12,7 +12,7 @@
 #include <asm/system.h>
 #include <asm/iSeries/HvLpEvent.h>
 #include <asm/iSeries/HvCallEvent.h>
-#include <asm/iSeries/LparData.h>
+#include <asm/iSeries/ItLpNaca.h>
 
 /* Array of LpEvent handler functions */
 LpEventHandler lpEventHandler[HvLpEvent_Type_NumTypes];
index c923a815760ec50f2b478f7f2857e175a0b0575a..cdea00d7707f641e0dcabc4559ce90de101052ba 100644 (file)
@@ -16,7 +16,6 @@
 #include <asm/iSeries/ItLpQueue.h>
 #include <asm/iSeries/HvLpEvent.h>
 #include <asm/iSeries/HvCallEvent.h>
-#include <asm/iSeries/LparData.h>
 
 static __inline__ int set_inUse( struct ItLpQueue * lpQueue )
 {
index 96d90b0c5119ea6cb11a332e1b47f2b63bb60ded..b5e167cf1a05e4a70428d00aed14bc090d6cf47b 100644 (file)
@@ -16,14 +16,13 @@ obj-y += vdso32/ vdso64/
 
 obj-$(CONFIG_PPC_OF) +=        of_device.o
 
-pci-obj-$(CONFIG_PPC_ISERIES)  += iSeries_pci.o iSeries_pci_reset.o
+pci-obj-$(CONFIG_PPC_ISERIES)  += iSeries_pci.o iSeries_irq.o \
+                               iSeries_VpdInfo.o
 pci-obj-$(CONFIG_PPC_MULTIPLATFORM)    += pci_dn.o pci_direct_iommu.o
 
 obj-$(CONFIG_PCI)      += pci.o pci_iommu.o iomap.o $(pci-obj-y)
 
-obj-$(CONFIG_PPC_ISERIES) += iSeries_irq.o \
-                            iSeries_VpdInfo.o XmPciLpEvent.o \
-                            HvCall.o HvLpConfig.o LparData.o \
+obj-$(CONFIG_PPC_ISERIES) += HvCall.o HvLpConfig.o LparData.o \
                             iSeries_setup.o ItLpQueue.o hvCall.o \
                             mf.o HvLpEvent.o iSeries_proc.o iSeries_htab.o \
                             iSeries_iommu.o
diff --git a/arch/ppc64/kernel/XmPciLpEvent.c b/arch/ppc64/kernel/XmPciLpEvent.c
deleted file mode 100644 (file)
index 809c9bc..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * File XmPciLpEvent.h created by Wayne Holm on Mon Jan 15 2001.
- *
- * This module handles PCI interrupt events sent by the iSeries Hypervisor.
-*/
-
-#include <linux/config.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/threads.h>
-#include <linux/smp.h>
-#include <linux/param.h>
-#include <linux/string.h>
-#include <linux/bootmem.h>
-#include <linux/ide.h>
-
-#include <asm/iSeries/HvTypes.h>
-#include <asm/iSeries/HvLpEvent.h>
-#include <asm/iSeries/HvCallPci.h>
-#include <asm/iSeries/XmPciLpEvent.h>
-#include <asm/ppcdebug.h>
-
-static long Pci_Interrupt_Count;
-static long Pci_Event_Count;
-
-enum XmPciLpEvent_Subtype {
-       XmPciLpEvent_BusCreated    = 0,         // PHB has been created
-       XmPciLpEvent_BusError      = 1,         // PHB has failed
-       XmPciLpEvent_BusFailed     = 2,         // Msg to Secondary, Primary failed bus
-       XmPciLpEvent_NodeFailed    = 4,         // Multi-adapter bridge has failed
-       XmPciLpEvent_NodeRecovered = 5,         // Multi-adapter bridge has recovered
-       XmPciLpEvent_BusRecovered  = 12,        // PHB has been recovered
-       XmPciLpEvent_UnQuiesceBus  = 18,        // Secondary bus unqiescing
-       XmPciLpEvent_BridgeError   = 21,        // Bridge Error
-       XmPciLpEvent_SlotInterrupt = 22         // Slot interrupt
-};
-
-struct XmPciLpEvent_BusInterrupt {
-       HvBusNumber     busNumber;
-       HvSubBusNumber  subBusNumber;
-};
-
-struct XmPciLpEvent_NodeInterrupt {
-       HvBusNumber     busNumber;
-       HvSubBusNumber  subBusNumber;
-       HvAgentId       deviceId;
-};
-
-struct XmPciLpEvent {
-       struct HvLpEvent hvLpEvent;
-
-       union {
-               u64 alignData;                  // Align on an 8-byte boundary
-
-               struct {
-                       u32             fisr;
-                       HvBusNumber     busNumber;
-                       HvSubBusNumber  subBusNumber;
-                       HvAgentId       deviceId;
-               } slotInterrupt;
-
-               struct XmPciLpEvent_BusInterrupt busFailed;
-               struct XmPciLpEvent_BusInterrupt busRecovered;
-               struct XmPciLpEvent_BusInterrupt busCreated;
-
-               struct XmPciLpEvent_NodeInterrupt nodeFailed;
-               struct XmPciLpEvent_NodeInterrupt nodeRecovered;
-
-       } eventData;
-
-};
-
-static void intReceived(struct XmPciLpEvent *eventParm,
-               struct pt_regs *regsParm);
-
-static void XmPciLpEvent_handler(struct HvLpEvent *eventParm,
-               struct pt_regs *regsParm)
-{
-#ifdef CONFIG_PCI
-#if 0
-       PPCDBG(PPCDBG_BUSWALK, "XmPciLpEvent_handler, type 0x%x\n",
-                       eventParm->xType);
-#endif
-       ++Pci_Event_Count;
-
-       if (eventParm && (eventParm->xType == HvLpEvent_Type_PciIo)) {
-               switch (eventParm->xFlags.xFunction) {
-               case HvLpEvent_Function_Int:
-                       intReceived((struct XmPciLpEvent *)eventParm, regsParm);
-                       break;
-               case HvLpEvent_Function_Ack:
-                       printk(KERN_ERR
-                               "XmPciLpEvent.c: unexpected ack received\n");
-                       break;
-               default:
-                       printk(KERN_ERR
-                               "XmPciLpEvent.c: unexpected event function %d\n",
-                               (int)eventParm->xFlags.xFunction);
-                       break;
-               }
-       } else if (eventParm)
-               printk(KERN_ERR
-                       "XmPciLpEvent.c: Unrecognized PCI event type 0x%x\n",
-                       (int)eventParm->xType);
-       else
-               printk(KERN_ERR "XmPciLpEvent.c: NULL event received\n");
-#endif
-}
-
-static void intReceived(struct XmPciLpEvent *eventParm,
-               struct pt_regs *regsParm)
-{
-       int irq;
-
-       ++Pci_Interrupt_Count;
-#if 0
-       PPCDBG(PPCDBG_BUSWALK, "PCI: XmPciLpEvent.c: intReceived\n");
-#endif
-
-       switch (eventParm->hvLpEvent.xSubtype) {
-       case XmPciLpEvent_SlotInterrupt:
-               irq = eventParm->hvLpEvent.xCorrelationToken;
-               /* Dispatch the interrupt handlers for this irq */
-               ppc_irq_dispatch_handler(regsParm, irq);
-               HvCallPci_eoi(eventParm->eventData.slotInterrupt.busNumber,
-                       eventParm->eventData.slotInterrupt.subBusNumber,
-                       eventParm->eventData.slotInterrupt.deviceId);
-               break;
-               /* Ignore error recovery events for now */
-       case XmPciLpEvent_BusCreated:
-               printk(KERN_INFO "XmPciLpEvent.c: system bus %d created\n",
-                       eventParm->eventData.busCreated.busNumber);
-               break;
-       case XmPciLpEvent_BusError:
-       case XmPciLpEvent_BusFailed:
-               printk(KERN_INFO "XmPciLpEvent.c: system bus %d failed\n",
-                       eventParm->eventData.busFailed.busNumber);
-               break;
-       case XmPciLpEvent_BusRecovered:
-       case XmPciLpEvent_UnQuiesceBus:
-               printk(KERN_INFO "XmPciLpEvent.c: system bus %d recovered\n",
-                       eventParm->eventData.busRecovered.busNumber);
-               break;
-       case XmPciLpEvent_NodeFailed:
-       case XmPciLpEvent_BridgeError:
-               printk(KERN_INFO
-                       "XmPciLpEvent.c: multi-adapter bridge %d/%d/%d failed\n",
-                       eventParm->eventData.nodeFailed.busNumber,
-                       eventParm->eventData.nodeFailed.subBusNumber,
-                       eventParm->eventData.nodeFailed.deviceId);
-               break;
-       case XmPciLpEvent_NodeRecovered:
-               printk(KERN_INFO
-                       "XmPciLpEvent.c: multi-adapter bridge %d/%d/%d recovered\n",
-                       eventParm->eventData.nodeRecovered.busNumber,
-                       eventParm->eventData.nodeRecovered.subBusNumber,
-                       eventParm->eventData.nodeRecovered.deviceId);
-               break;
-       default:
-               printk(KERN_ERR
-                       "XmPciLpEvent.c: unrecognized event subtype 0x%x\n",
-                       eventParm->hvLpEvent.xSubtype);
-               break;
-       }
-}
-
-
-/* This should be called sometime prior to buswalk (init_IRQ would be good) */
-int XmPciLpEvent_init()
-{
-       int xRc;
-
-       PPCDBG(PPCDBG_BUSWALK,
-                       "XmPciLpEvent_init, Register Event type 0x%04X\n",
-                       HvLpEvent_Type_PciIo);
-
-       xRc = HvLpEvent_registerHandler(HvLpEvent_Type_PciIo,
-                       &XmPciLpEvent_handler);
-       if (xRc == 0) {
-               xRc = HvLpEvent_openPath(HvLpEvent_Type_PciIo, 0);
-               if (xRc != 0)
-                       printk(KERN_ERR
-                               "XmPciLpEvent.c: open event path failed with rc 0x%x\n",
-                               xRc);
-       } else
-               printk(KERN_ERR
-                       "XmPciLpEvent.c: register handler failed with rc 0x%x\n",
-                       xRc);
-       return xRc;
-}
index 0094ac79a18c68d0935104092554877912292caf..abb9e5b5da03b81aa42c88b2ad635f7d1cc00914 100644 (file)
@@ -31,7 +31,6 @@
 
 #include <asm/paca.h>
 #include <asm/lppaca.h>
-#include <asm/iSeries/ItLpQueue.h>
 #include <asm/iSeries/HvLpEvent.h>
 #include <asm/rtas.h>
 #include <asm/cputable.h>
index ce714c9271344f6f1e7df5ca71bb903928f16d5f..4da8e31b2b61da90c4bd93b49d630687049ad5d4 100644 (file)
 
 static struct dma_mapping_ops *get_dma_ops(struct device *dev)
 {
+#ifdef CONFIG_PCI
        if (dev->bus == &pci_bus_type)
                return &pci_dma_ops;
+#endif
 #ifdef CONFIG_IBMVIO
        if (dev->bus == &vio_bus_type)
                return &vio_dma_ops;
@@ -37,8 +39,10 @@ EXPORT_SYMBOL(dma_supported);
 
 int dma_set_mask(struct device *dev, u64 dma_mask)
 {
+#ifdef CONFIG_PCI
        if (dev->bus == &pci_bus_type)
                return pci_set_dma_mask(to_pci_dev(dev), dma_mask);
+#endif
 #ifdef CONFIG_IBMVIO
        if (dev->bus == &vio_bus_type)
                return -EIO;
index d63d41f3eecf788b6107269d36df2097075a637f..af5272fedadf4d8f4a2705edd735479dd9d96751 100644 (file)
@@ -505,7 +505,7 @@ static inline unsigned long eeh_token_to_phys(unsigned long token)
        pte_t *ptep;
        unsigned long pa;
 
-       ptep = find_linux_pte(ioremap_mm.pgd, token);
+       ptep = find_linux_pte(init_mm.pgd, token);
        if (!ptep)
                return token;
        pa = pte_pfn(*ptep) << PAGE_SHIFT;
index d3604056e1a9c53d2407243ecb44aa282609363c..b61572eb2a7130d7a46924f8412024b9879286e7 100644 (file)
@@ -436,15 +436,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
        REST_8GPRS(14, r1)
        REST_10GPRS(22, r1)
 
-#ifdef CONFIG_PPC_ISERIES
-       clrrdi  r7,r1,THREAD_SHIFT      /* get current_thread_info() */
-       ld      r7,TI_FLAGS(r7)         /* Get run light flag */
-       mfspr   r9,CTRLF
-       srdi    r7,r7,TIF_RUN_LIGHT
-       insrdi  r9,r7,1,63              /* Insert run light into CTRL */
-       mtspr   CTRLT,r9
-#endif
-
        /* convert old thread to its task_struct for return value */
        addi    r3,r3,-THREAD
        ld      r7,_NIP(r1)     /* Return to _switch caller in new task */
index 92a744c31ab183b2aec6e4532a593cef614bba13..02c8f4e3e4bc644f66dbdde07b31544d9063266b 100644 (file)
@@ -626,10 +626,10 @@ system_reset_iSeries:
        lhz     r24,PACAPACAINDEX(r13)  /* Get processor # */
        cmpwi   0,r24,0                 /* Are we processor 0? */
        beq     .__start_initialization_iSeries /* Start up the first processor */
-       mfspr   r4,CTRLF
-       li      r5,RUNLATCH             /* Turn off the run light */
+       mfspr   r4,SPRN_CTRLF
+       li      r5,CTRL_RUNLATCH        /* Turn off the run light */
        andc    r4,r4,r5
-       mtspr   CTRLT,r4
+       mtspr   SPRN_CTRLT,r4
 
 1:
        HMT_LOW
@@ -2082,9 +2082,9 @@ _GLOBAL(hmt_start_secondary)
        mfspr   r4, HID0
        ori     r4, r4, 0x1
        mtspr   HID0, r4
-       mfspr   r4, CTRLF
+       mfspr   r4, SPRN_CTRLF
        oris    r4, r4, 0x40
-       mtspr   CTRLT, r4
+       mtspr   SPRN_CTRLT, r4
        blr
 #endif
 
@@ -2121,10 +2121,6 @@ empty_zero_page:
 swapper_pg_dir:
        .space  4096
 
-       .globl  ioremap_dir
-ioremap_dir:
-       .space  4096
-
 #ifdef CONFIG_SMP
 /* 1 page segment table per cpu (max 48, cpu0 allocated at STAB0_PHYS_ADDR) */
        .globl  stab_array
index a6f0ff2d023927f58b7282f7506168bc06d39bd0..d11c732daf816a2a7bed18c58e0a20fa52439c0e 100644 (file)
@@ -1,31 +1,31 @@
-/************************************************************************/
-/* File iSeries_vpdInfo.c created by Allan Trautman on Fri Feb  2 2001. */
-/************************************************************************/
-/* This code gets the card location of the hardware                     */
-/* Copyright (C) 20yy  <Allan H Trautman> <IBM Corp>                    */
-/*                                                                      */
-/* This program is free software; you can redistribute it and/or modify */
-/* it under the terms of the GNU General Public License as published by */
-/* the Free Software Foundation; either version 2 of the License, or    */
-/* (at your option) any later version.                                  */
-/*                                                                      */
-/* This program is distributed in the hope that it will be useful,      */ 
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of       */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        */
-/* GNU General Public License for more details.                         */
-/*                                                                      */
-/* You should have received a copy of the GNU General Public License    */ 
-/* along with this program; if not, write to the:                       */
-/* Free Software Foundation, Inc.,                                      */ 
-/* 59 Temple Place, Suite 330,                                          */ 
-/* Boston, MA  02111-1307  USA                                          */
-/************************************************************************/
-/* Change Activity:                                                     */
-/*   Created, Feb 2, 2001                                               */
-/*   Ported to ppc64, August 20, 2001                                   */
-/* End Change Activity                                                  */
-/************************************************************************/
-#include <linux/config.h>
+/*
+ * File iSeries_vpdInfo.c created by Allan Trautman on Fri Feb  2 2001.
+ *
+ * This code gets the card location of the hardware
+ * Copyright (C) 2001  <Allan H Trautman> <IBM Corp>
+ * Copyright (C) 2005  Stephen Rothwel, IBM Corp
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the:
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330,
+ * Boston, MA  02111-1307  USA
+ *
+ * Change Activity:
+ *   Created, Feb 2, 2001
+ *   Ported to ppc64, August 20, 2001
+ * End Change Activity
+ */
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 
 #include <asm/iSeries/HvCallPci.h>
 #include <asm/iSeries/HvTypes.h>
-#include <asm/iSeries/mf.h>
-#include <asm/iSeries/LparData.h>
 #include <asm/iSeries/iSeries_pci.h>
-#include "pci.h"
 
 /*
  * Size of Bus VPD data
  */
 #define BUS_VPDSIZE      1024
+
 /*
  * Bus Vpd Tags
  */
-#define  VpdEndOfDataTag   0x78
 #define  VpdEndOfAreaTag   0x79
 #define  VpdIdStringTag    0x82
 #define  VpdVendorAreaTag  0x84
+
 /*
  * Mfg Area Tags
  */
-#define  VpdFruFlag       0x4647     // "FG"
 #define  VpdFruFrameId    0x4649     // "FI"
 #define  VpdSlotMapFormat 0x4D46     // "MF"
-#define  VpdAsmPartNumber 0x504E     // "PN"
-#define  VpdFruSerial     0x534E     // "SN"
 #define  VpdSlotMap       0x534D     // "SM"
 
 /*
@@ -79,74 +74,33 @@ struct SlotMapStruct {
        char CardLocation[3];
        char Parms[8];
        char Reserved[2];
-}; 
+};
 typedef struct SlotMapStruct SlotMap;
 #define SLOT_ENTRY_SIZE   16
 
-/*
- * Formats the device information.
- * - Pass in pci_dev* pointer to the device.
- * - Pass in buffer to place the data.  Danger here is the buffer must
- *   be as big as the client says it is.   Should be at least 128 bytes.
- * Return will the length of the string data put in the buffer.
- * Format:
- * PCI: Bus  0, Device 26, Vendor 0x12AE  Frame  1, Card  C10  Ethernet
- * controller
- */
-int iSeries_Device_Information(struct pci_dev *PciDev, char *buffer,
-               int BufferSize)
-{
-       struct iSeries_Device_Node *DevNode =
-               (struct iSeries_Device_Node *)PciDev->sysdata;
-       int len;
-
-       if (DevNode == NULL)
-               return sprintf(buffer,
-                               "PCI: iSeries_Device_Information DevNode is NULL");
-
-       if (BufferSize < 128)
-               return 0;
-
-       len = sprintf(buffer, "PCI: Bus%3d, Device%3d, Vendor %04X ",
-                       ISERIES_BUS(DevNode), PCI_SLOT(PciDev->devfn),
-                       PciDev->vendor);
-       len += sprintf(buffer + len, "Frame%3d, Card %4s  ",
-                       DevNode->FrameId, DevNode->CardLocation);
-#ifdef CONFIG_PCI
-       if (pci_class_name(PciDev->class >> 8) == 0)
-               len += sprintf(buffer + len, "0x%04X  ",
-                               (int)(PciDev->class >> 8));
-       else
-               len += sprintf(buffer + len, "%s",
-                               pci_class_name(PciDev->class >> 8));
-#endif
-       return len;
-}
-
 /*
  * Parse the Slot Area
  */
-void iSeries_Parse_SlotArea(SlotMap *MapPtr, int MapLen,
-               struct iSeries_Device_Node *DevNode)
+static void __init iSeries_Parse_SlotArea(SlotMap *MapPtr, int MapLen,
+               HvAgentId agent, u8 *PhbId, char card[4])
 {
        int SlotMapLen = MapLen;
        SlotMap *SlotMapPtr = MapPtr;
 
        /*
-        * Parse Slot label until we find the one requrested
+        * Parse Slot label until we find the one requested
         */
        while (SlotMapLen > 0) {
-               if (SlotMapPtr->AgentId == DevNode->AgentId ) {
+               if (SlotMapPtr->AgentId == agent) {
                        /*
                         * If Phb wasn't found, grab the entry first one found.
                         */
-                       if (DevNode->PhbId == 0xff)
-                               DevNode->PhbId = SlotMapPtr->PhbId; 
+                       if (*PhbId == 0xff)
+                               *PhbId = SlotMapPtr->PhbId;
                        /* Found it, extract the data. */
-                       if (SlotMapPtr->PhbId == DevNode->PhbId ) {
-                               memcpy(&DevNode->CardLocation,
-                                               &SlotMapPtr->CardLocation, 3);
-                               DevNode->CardLocation[3]  = 0;
+                       if (SlotMapPtr->PhbId == *PhbId) {
+                               memcpy(card, &SlotMapPtr->CardLocation, 3);
+                               card[3]  = 0;
                                break;
                        }
                }
@@ -159,8 +113,9 @@ void iSeries_Parse_SlotArea(SlotMap *MapPtr, int MapLen,
 /*
  * Parse the Mfg Area
  */
-static void iSeries_Parse_MfgArea(u8 *AreaData, int AreaLen,
-               struct iSeries_Device_Node *DevNode)
+static void __init iSeries_Parse_MfgArea(u8 *AreaData, int AreaLen,
+               HvAgentId agent, u8 *PhbId,
+               u8 *frame, char card[4])
 {
        MfgArea *MfgAreaPtr = (MfgArea *)AreaData;
        int MfgAreaLen = AreaLen;
@@ -171,7 +126,7 @@ static void iSeries_Parse_MfgArea(u8 *AreaData, int AreaLen,
                int MfgTagLen = MfgAreaPtr->TagLength;
                /* Frame ID         (FI 4649020310 ) */
                if (MfgAreaPtr->Tag == VpdFruFrameId)           /* FI  */
-                       DevNode->FrameId = MfgAreaPtr->AreaData1;
+                       *frame = MfgAreaPtr->AreaData1;
                /* Slot Map Format  (MF 4D46020004 ) */
                else if (MfgAreaPtr->Tag == VpdSlotMapFormat)   /* MF  */
                        SlotMapFmt = (MfgAreaPtr->AreaData1 * 256)
@@ -183,10 +138,11 @@ static void iSeries_Parse_MfgArea(u8 *AreaData, int AreaLen,
                        if (SlotMapFmt == 0x1004)
                                SlotMapPtr = (SlotMap *)((char *)MfgAreaPtr
                                                + MFG_ENTRY_SIZE + 1);
-                       else
+                       else
                                SlotMapPtr = (SlotMap *)((char *)MfgAreaPtr
                                                + MFG_ENTRY_SIZE);
-                       iSeries_Parse_SlotArea(SlotMapPtr, MfgTagLen, DevNode);
+                       iSeries_Parse_SlotArea(SlotMapPtr, MfgTagLen,
+                                       agent, PhbId, card);
                }
                /*
                 * Point to the next Mfg Area
@@ -194,19 +150,19 @@ static void iSeries_Parse_MfgArea(u8 *AreaData, int AreaLen,
                 */
                MfgAreaPtr = (MfgArea *)((char *)MfgAreaPtr + MfgTagLen
                                + MFG_ENTRY_SIZE);
-               MfgAreaLen -= (MfgTagLen + MFG_ENTRY_SIZE); 
-       }       
+               MfgAreaLen -= (MfgTagLen + MFG_ENTRY_SIZE);
+       }
 }
 
 /*
  * Look for "BUS".. Data is not Null terminated.
  * PHBID of 0xFF indicates PHB was not found in VPD Data.
  */
-static int iSeries_Parse_PhbId(u8 *AreaPtr, int AreaLength)
+static int __init iSeries_Parse_PhbId(u8 *AreaPtr, int AreaLength)
 {
        u8 *PhbPtr = AreaPtr;
        int DataLen = AreaLength;
-       char PhbId = 0xFF;                   
+       char PhbId = 0xFF;
 
        while (DataLen > 0) {
                if ((*PhbPtr == 'B') && (*(PhbPtr + 1) == 'U')
@@ -216,7 +172,7 @@ static int iSeries_Parse_PhbId(u8 *AreaPtr, int AreaLength)
                                ++PhbPtr;
                        PhbId = (*PhbPtr & 0x0F);
                        break;
-               }
+               }
                ++PhbPtr;
                --DataLen;
        }
@@ -226,52 +182,90 @@ static int iSeries_Parse_PhbId(u8 *AreaPtr, int AreaLength)
 /*
  * Parse out the VPD Areas
  */
-static void iSeries_Parse_Vpd(u8 *VpdData, int VpdDataLen,
-               struct iSeries_Device_Node *DevNode)
+static void __init iSeries_Parse_Vpd(u8 *VpdData, int VpdDataLen,
+               HvAgentId agent, u8 *frame, char card[4])
 {
        u8 *TagPtr = VpdData;
        int DataLen = VpdDataLen - 3;
+       u8 PhbId;
 
        while ((*TagPtr != VpdEndOfAreaTag) && (DataLen > 0)) {
-               int AreaLen = *(TagPtr + 1) + (*(TagPtr + 2) * 256);    
+               int AreaLen = *(TagPtr + 1) + (*(TagPtr + 2) * 256);
                u8 *AreaData  = TagPtr + 3;
 
                if (*TagPtr == VpdIdStringTag)
-                       DevNode->PhbId = iSeries_Parse_PhbId(AreaData, AreaLen);
+                       PhbId = iSeries_Parse_PhbId(AreaData, AreaLen);
                else if (*TagPtr == VpdVendorAreaTag)
-                       iSeries_Parse_MfgArea(AreaData, AreaLen, DevNode);
+                       iSeries_Parse_MfgArea(AreaData, AreaLen,
+                                       agent, &PhbId, frame, card);
                /* Point to next Area. */
                TagPtr  = AreaData + AreaLen;
                DataLen -= AreaLen;
        }
-}    
+}
 
-void iSeries_Get_Location_Code(struct iSeries_Device_Node *DevNode)
+static void __init iSeries_Get_Location_Code(u16 bus, HvAgentId agent,
+               u8 *frame, char card[4])
 {
        int BusVpdLen = 0;
-       u8 *BusVpdPtr = (u8 *)kmalloc(BUS_VPDSIZE, GFP_KERNEL);
+       u8 *BusVpdPtr = kmalloc(BUS_VPDSIZE, GFP_KERNEL);
 
        if (BusVpdPtr == NULL) {
                printk("PCI: Bus VPD Buffer allocation failure.\n");
                return;
        }
-       BusVpdLen = HvCallPci_getBusVpd(ISERIES_BUS(DevNode),
-                                       ISERIES_HV_ADDR(BusVpdPtr),
+       BusVpdLen = HvCallPci_getBusVpd(bus, ISERIES_HV_ADDR(BusVpdPtr),
                                        BUS_VPDSIZE);
        if (BusVpdLen == 0) {
-               kfree(BusVpdPtr);
                printk("PCI: Bus VPD Buffer zero length.\n");
-               return;
+               goto out_free;
        }
        /* printk("PCI: BusVpdPtr: %p, %d\n",BusVpdPtr, BusVpdLen); */
        /* Make sure this is what I think it is */
        if (*BusVpdPtr != VpdIdStringTag) {     /* 0x82 */
                printk("PCI: Bus VPD Buffer missing starting tag.\n");
-               kfree(BusVpdPtr);
-               return;
+               goto out_free;
        }
-       iSeries_Parse_Vpd(BusVpdPtr,BusVpdLen, DevNode);
-       sprintf(DevNode->Location, "Frame%3d, Card %-4s", DevNode->FrameId,
-                       DevNode->CardLocation);
+       iSeries_Parse_Vpd(BusVpdPtr, BusVpdLen, agent, frame, card);
+out_free:
        kfree(BusVpdPtr);
 }
+
+/*
+ * Prints the device information.
+ * - Pass in pci_dev* pointer to the device.
+ * - Pass in the device count
+ *
+ * Format:
+ * PCI: Bus  0, Device 26, Vendor 0x12AE  Frame  1, Card  C10  Ethernet
+ * controller
+ */
+void __init iSeries_Device_Information(struct pci_dev *PciDev, int count)
+{
+       struct iSeries_Device_Node *DevNode = PciDev->sysdata;
+       u16 bus;
+       u8 frame;
+       char card[4];
+       HvSubBusNumber subbus;
+       HvAgentId agent;
+
+       if (DevNode == NULL) {
+               printk("%d. PCI: iSeries_Device_Information DevNode is NULL\n",
+                               count);
+               return;
+       }
+
+       bus = ISERIES_BUS(DevNode);
+       subbus = ISERIES_SUBBUS(DevNode);
+       agent = ISERIES_PCI_AGENTID(ISERIES_GET_DEVICE_FROM_SUBBUS(subbus),
+                       ISERIES_GET_FUNCTION_FROM_SUBBUS(subbus));
+       iSeries_Get_Location_Code(bus, agent, &frame, card);
+
+       printk("%d. PCI: Bus%3d, Device%3d, Vendor %04X Frame%3d, Card %4s  ",
+                       count, bus, PCI_SLOT(PciDev->devfn), PciDev->vendor,
+                       frame, card);
+       if (pci_class_name(PciDev->class >> 8) == 0)
+               printk("0x%04X\n", (int)(PciDev->class >> 8));
+       else
+               printk("%s\n", pci_class_name(PciDev->class >> 8));
+}
index 4e1a47c8a8026a0a132d54c414848db56030e948..f8ff1bb054dcde7a0cabb1d1df94d6d419a8c939 100644 (file)
@@ -83,7 +83,7 @@ static void tce_free_iSeries(struct iommu_table *tbl, long index, long npages)
        }
 }
 
-
+#ifdef CONFIG_PCI
 /*
  * This function compares the known tables to find an iommu_table
  * that has already been built for hardware TCEs.
@@ -159,6 +159,7 @@ void iommu_devnode_init_iSeries(struct iSeries_Device_Node *dn)
        else
                kfree(tbl);
 }
+#endif
 
 static void iommu_dev_setup_iSeries(struct pci_dev *dev) { }
 static void iommu_bus_setup_iSeries(struct pci_bus *bus) { }
index f831d259dbb7707715bad82a55af8a85ad7afe67..77376c1bd611326c44bfcd71e3681f9d1508b197 100644 (file)
@@ -1,27 +1,29 @@
-/************************************************************************/
-/* This module supports the iSeries PCI bus interrupt handling          */
-/* Copyright (C) 20yy  <Robert L Holtorf> <IBM Corp>                    */
-/*                                                                      */
-/* This program is free software; you can redistribute it and/or modify */
-/* it under the terms of the GNU General Public License as published by */
-/* the Free Software Foundation; either version 2 of the License, or    */
-/* (at your option) any later version.                                  */
-/*                                                                      */
-/* This program is distributed in the hope that it will be useful,      */ 
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of       */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        */
-/* GNU General Public License for more details.                         */
-/*                                                                      */
-/* You should have received a copy of the GNU General Public License    */ 
-/* along with this program; if not, write to the:                       */
-/* Free Software Foundation, Inc.,                                      */ 
-/* 59 Temple Place, Suite 330,                                          */ 
-/* Boston, MA  02111-1307  USA                                          */
-/************************************************************************/
-/* Change Activity:                                                     */
-/*   Created, December 13, 2000 by Wayne Holm                           */ 
-/* End Change Activity                                                  */
-/************************************************************************/
+/*
+ * This module supports the iSeries PCI bus interrupt handling
+ * Copyright (C) 20yy  <Robert L Holtorf> <IBM Corp>
+ * Copyright (C) 2004-2005 IBM Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the:
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330,
+ * Boston, MA  02111-1307  USA
+ *
+ * Change Activity:
+ *   Created, December 13, 2000 by Wayne Holm
+ * End Change Activity
+ */
+#include <linux/config.h>
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <linux/threads.h>
 #include <linux/string.h>
 #include <linux/bootmem.h>
 #include <linux/ide.h>
-
 #include <linux/irq.h>
 #include <linux/spinlock.h>
-#include <asm/ppcdebug.h>
 
+#include <asm/ppcdebug.h>
+#include <asm/iSeries/HvTypes.h>
+#include <asm/iSeries/HvLpEvent.h>
 #include <asm/iSeries/HvCallPci.h>
 #include <asm/iSeries/HvCallXm.h>
 #include <asm/iSeries/iSeries_irq.h>
-#include <asm/iSeries/XmPciLpEvent.h>
-
-static unsigned int iSeries_startup_IRQ(unsigned int irq);
-static void iSeries_shutdown_IRQ(unsigned int irq);
-static void iSeries_enable_IRQ(unsigned int irq);
-static void iSeries_disable_IRQ(unsigned int irq);
-static void iSeries_end_IRQ(unsigned int irq);
-
-static hw_irq_controller iSeries_IRQ_handler = {
-       .typename = "iSeries irq controller",
-       .startup = iSeries_startup_IRQ,
-       .shutdown = iSeries_shutdown_IRQ,
-       .enable = iSeries_enable_IRQ,
-       .disable = iSeries_disable_IRQ,
-       .end = iSeries_end_IRQ
-};
 
 /* This maps virtual irq numbers to real irqs */
 unsigned int virt_irq_to_real_map[NR_IRQS];
@@ -62,37 +49,187 @@ unsigned int virt_irq_to_real_map[NR_IRQS];
 /* Note: the pcnet32 driver assumes irq numbers < 2 aren't valid. :( */
 static int next_virtual_irq = 2;
 
-/* This is called by init_IRQ.  set in ppc_md.init_IRQ by iSeries_setup.c */
-void __init iSeries_init_IRQ(void)
+static long Pci_Interrupt_Count;
+static long Pci_Event_Count;
+
+enum XmPciLpEvent_Subtype {
+       XmPciLpEvent_BusCreated         = 0,    // PHB has been created
+       XmPciLpEvent_BusError           = 1,    // PHB has failed
+       XmPciLpEvent_BusFailed          = 2,    // Msg to Secondary, Primary failed bus
+       XmPciLpEvent_NodeFailed         = 4,    // Multi-adapter bridge has failed
+       XmPciLpEvent_NodeRecovered      = 5,    // Multi-adapter bridge has recovered
+       XmPciLpEvent_BusRecovered       = 12,   // PHB has been recovered
+       XmPciLpEvent_UnQuiesceBus       = 18,   // Secondary bus unqiescing
+       XmPciLpEvent_BridgeError        = 21,   // Bridge Error
+       XmPciLpEvent_SlotInterrupt      = 22    // Slot interrupt
+};
+
+struct XmPciLpEvent_BusInterrupt {
+       HvBusNumber     busNumber;
+       HvSubBusNumber  subBusNumber;
+};
+
+struct XmPciLpEvent_NodeInterrupt {
+       HvBusNumber     busNumber;
+       HvSubBusNumber  subBusNumber;
+       HvAgentId       deviceId;
+};
+
+struct XmPciLpEvent {
+       struct HvLpEvent hvLpEvent;
+
+       union {
+               u64 alignData;                  // Align on an 8-byte boundary
+
+               struct {
+                       u32             fisr;
+                       HvBusNumber     busNumber;
+                       HvSubBusNumber  subBusNumber;
+                       HvAgentId       deviceId;
+               } slotInterrupt;
+
+               struct XmPciLpEvent_BusInterrupt busFailed;
+               struct XmPciLpEvent_BusInterrupt busRecovered;
+               struct XmPciLpEvent_BusInterrupt busCreated;
+
+               struct XmPciLpEvent_NodeInterrupt nodeFailed;
+               struct XmPciLpEvent_NodeInterrupt nodeRecovered;
+
+       } eventData;
+
+};
+
+static void intReceived(struct XmPciLpEvent *eventParm,
+               struct pt_regs *regsParm)
 {
-       /* Register PCI event handler and open an event path */
-       XmPciLpEvent_init();
+       int irq;
+
+       ++Pci_Interrupt_Count;
+
+       switch (eventParm->hvLpEvent.xSubtype) {
+       case XmPciLpEvent_SlotInterrupt:
+               irq = eventParm->hvLpEvent.xCorrelationToken;
+               /* Dispatch the interrupt handlers for this irq */
+               ppc_irq_dispatch_handler(regsParm, irq);
+               HvCallPci_eoi(eventParm->eventData.slotInterrupt.busNumber,
+                       eventParm->eventData.slotInterrupt.subBusNumber,
+                       eventParm->eventData.slotInterrupt.deviceId);
+               break;
+               /* Ignore error recovery events for now */
+       case XmPciLpEvent_BusCreated:
+               printk(KERN_INFO "intReceived: system bus %d created\n",
+                       eventParm->eventData.busCreated.busNumber);
+               break;
+       case XmPciLpEvent_BusError:
+       case XmPciLpEvent_BusFailed:
+               printk(KERN_INFO "intReceived: system bus %d failed\n",
+                       eventParm->eventData.busFailed.busNumber);
+               break;
+       case XmPciLpEvent_BusRecovered:
+       case XmPciLpEvent_UnQuiesceBus:
+               printk(KERN_INFO "intReceived: system bus %d recovered\n",
+                       eventParm->eventData.busRecovered.busNumber);
+               break;
+       case XmPciLpEvent_NodeFailed:
+       case XmPciLpEvent_BridgeError:
+               printk(KERN_INFO
+                       "intReceived: multi-adapter bridge %d/%d/%d failed\n",
+                       eventParm->eventData.nodeFailed.busNumber,
+                       eventParm->eventData.nodeFailed.subBusNumber,
+                       eventParm->eventData.nodeFailed.deviceId);
+               break;
+       case XmPciLpEvent_NodeRecovered:
+               printk(KERN_INFO
+                       "intReceived: multi-adapter bridge %d/%d/%d recovered\n",
+                       eventParm->eventData.nodeRecovered.busNumber,
+                       eventParm->eventData.nodeRecovered.subBusNumber,
+                       eventParm->eventData.nodeRecovered.deviceId);
+               break;
+       default:
+               printk(KERN_ERR
+                       "intReceived: unrecognized event subtype 0x%x\n",
+                       eventParm->hvLpEvent.xSubtype);
+               break;
+       }
+}
+
+static void XmPciLpEvent_handler(struct HvLpEvent *eventParm,
+               struct pt_regs *regsParm)
+{
+#ifdef CONFIG_PCI
+       ++Pci_Event_Count;
+
+       if (eventParm && (eventParm->xType == HvLpEvent_Type_PciIo)) {
+               switch (eventParm->xFlags.xFunction) {
+               case HvLpEvent_Function_Int:
+                       intReceived((struct XmPciLpEvent *)eventParm, regsParm);
+                       break;
+               case HvLpEvent_Function_Ack:
+                       printk(KERN_ERR
+                               "XmPciLpEvent_handler: unexpected ack received\n");
+                       break;
+               default:
+                       printk(KERN_ERR
+                               "XmPciLpEvent_handler: unexpected event function %d\n",
+                               (int)eventParm->xFlags.xFunction);
+                       break;
+               }
+       } else if (eventParm)
+               printk(KERN_ERR
+                       "XmPciLpEvent_handler: Unrecognized PCI event type 0x%x\n",
+                       (int)eventParm->xType);
+       else
+               printk(KERN_ERR "XmPciLpEvent_handler: NULL event received\n");
+#endif
 }
 
 /*
- * This is called out of iSeries_scan_slot to allocate an IRQ for an EADS slot
- * It calculates the irq value for the slot.
- * Note that subBusNumber is always 0 (at the moment at least).
+ * This is called by init_IRQ.  set in ppc_md.init_IRQ by iSeries_setup.c
+ * It must be called before the bus walk.
  */
-int __init iSeries_allocate_IRQ(HvBusNumber busNumber,
-               HvSubBusNumber subBusNumber, HvAgentId deviceId)
+void __init iSeries_init_IRQ(void)
 {
-       unsigned int realirq, virtirq;
-       u8 idsel = (deviceId >> 4);
-       u8 function = deviceId & 7;
-
-       virtirq = next_virtual_irq++;
-       realirq = ((busNumber - 1) << 6) + ((idsel - 1) << 3) + function;
-       virt_irq_to_real_map[virtirq] = realirq;
+       /* Register PCI event handler and open an event path */
+       int xRc;
 
-       irq_desc[virtirq].handler = &iSeries_IRQ_handler;
-       return virtirq;
+       xRc = HvLpEvent_registerHandler(HvLpEvent_Type_PciIo,
+                       &XmPciLpEvent_handler);
+       if (xRc == 0) {
+               xRc = HvLpEvent_openPath(HvLpEvent_Type_PciIo, 0);
+               if (xRc != 0)
+                       printk(KERN_ERR "iSeries_init_IRQ: open event path "
+                                       "failed with rc 0x%x\n", xRc);
+       } else
+               printk(KERN_ERR "iSeries_init_IRQ: register handler "
+                               "failed with rc 0x%x\n", xRc);
 }
 
 #define REAL_IRQ_TO_BUS(irq)   ((((irq) >> 6) & 0xff) + 1)
 #define REAL_IRQ_TO_IDSEL(irq) ((((irq) >> 3) & 7) + 1)
 #define REAL_IRQ_TO_FUNC(irq)  ((irq) & 7)
 
+/*
+ * This will be called by device drivers (via enable_IRQ)
+ * to enable INTA in the bridge interrupt status register.
+ */
+static void iSeries_enable_IRQ(unsigned int irq)
+{
+       u32 bus, deviceId, function, mask;
+       const u32 subBus = 0;
+       unsigned int rirq = virt_irq_to_real_map[irq];
+
+       /* The IRQ has already been locked by the caller */
+       bus = REAL_IRQ_TO_BUS(rirq);
+       function = REAL_IRQ_TO_FUNC(rirq);
+       deviceId = (REAL_IRQ_TO_IDSEL(rirq) << 4) + function;
+
+       /* Unmask secondary INTA */
+       mask = 0x80000000;
+       HvCallPci_unmaskInterrupts(bus, subBus, deviceId, mask);
+       PPCDBG(PPCDBG_BUSWALK, "iSeries_enable_IRQ 0x%02X.%02X.%02X 0x%04X\n",
+                       bus, subBus, deviceId, irq);
+}
+
 /* This is called by iSeries_activate_IRQs */
 static unsigned int iSeries_startup_IRQ(unsigned int irq)
 {
@@ -131,7 +268,7 @@ void __init iSeries_activate_IRQs()
                        desc->handler->startup(irq);
                        spin_unlock_irqrestore(&desc->lock, flags);
                }
-       }
+       }
 }
 
 /*  this is not called anywhere currently */
@@ -173,29 +310,7 @@ static void iSeries_disable_IRQ(unsigned int irq)
        mask = 0x80000000;
        HvCallPci_maskInterrupts(bus, subBus, deviceId, mask);
        PPCDBG(PPCDBG_BUSWALK, "iSeries_disable_IRQ 0x%02X.%02X.%02X 0x%04X\n",
-              bus, subBus, deviceId, irq);
-}
-
-/*
- * This will be called by device drivers (via enable_IRQ)
- * to enable INTA in the bridge interrupt status register.
- */
-static void iSeries_enable_IRQ(unsigned int irq)
-{
-       u32 bus, deviceId, function, mask;
-       const u32 subBus = 0;
-       unsigned int rirq = virt_irq_to_real_map[irq];
-
-       /* The IRQ has already been locked by the caller */
-       bus = REAL_IRQ_TO_BUS(rirq);
-       function = REAL_IRQ_TO_FUNC(rirq);
-       deviceId = (REAL_IRQ_TO_IDSEL(rirq) << 4) + function;
-
-       /* Unmask secondary INTA */
-       mask = 0x80000000;
-       HvCallPci_unmaskInterrupts(bus, subBus, deviceId, mask);
-       PPCDBG(PPCDBG_BUSWALK, "iSeries_enable_IRQ 0x%02X.%02X.%02X 0x%04X\n",
-              bus, subBus, deviceId, irq);
+                       bus, subBus, deviceId, irq);
 }
 
 /*
@@ -207,3 +322,32 @@ static void iSeries_enable_IRQ(unsigned int irq)
 static void iSeries_end_IRQ(unsigned int irq)
 {
 }
+
+static hw_irq_controller iSeries_IRQ_handler = {
+       .typename = "iSeries irq controller",
+       .startup = iSeries_startup_IRQ,
+       .shutdown = iSeries_shutdown_IRQ,
+       .enable = iSeries_enable_IRQ,
+       .disable = iSeries_disable_IRQ,
+       .end = iSeries_end_IRQ
+};
+
+/*
+ * This is called out of iSeries_scan_slot to allocate an IRQ for an EADS slot
+ * It calculates the irq value for the slot.
+ * Note that subBusNumber is always 0 (at the moment at least).
+ */
+int __init iSeries_allocate_IRQ(HvBusNumber busNumber,
+               HvSubBusNumber subBusNumber, HvAgentId deviceId)
+{
+       unsigned int realirq, virtirq;
+       u8 idsel = (deviceId >> 4);
+       u8 function = deviceId & 7;
+
+       virtirq = next_virtual_irq++;
+       realirq = ((busNumber - 1) << 6) + ((idsel - 1) << 3) + function;
+       virt_irq_to_real_map[virtirq] = realirq;
+
+       irq_desc[virtirq].handler = &iSeries_IRQ_handler;
+       return virtirq;
+}
index bd4c2554f1a048272ecf4703172e6a02ebaf00a0..356e4fd9a94fecc763e90a13bb79860ba2880f7b 100644 (file)
@@ -38,9 +38,7 @@
 #include <asm/iommu.h>
 
 #include <asm/iSeries/HvCallPci.h>
-#include <asm/iSeries/HvCallSm.h>
 #include <asm/iSeries/HvCallXm.h>
-#include <asm/iSeries/LparData.h>
 #include <asm/iSeries/iSeries_irq.h>
 #include <asm/iSeries/iSeries_pci.h>
 #include <asm/iSeries/mf.h>
@@ -225,10 +223,7 @@ static struct iSeries_Device_Node *build_device_node(HvBusNumber Bus,
        node->DsaAddr.Dsa.busNumber = Bus;
        node->DsaAddr.Dsa.subBusNumber = SubBus;
        node->DsaAddr.Dsa.deviceId = 0x10;
-       node->AgentId = AgentId;
        node->DevFn = PCI_DEVFN(ISERIES_ENCODE_DEVICE(AgentId), Function);
-       node->IoRetry = 0;
-       iSeries_Get_Location_Code(node);
        return node;
 }
 
@@ -302,7 +297,6 @@ void __init iSeries_pci_final_fixup(void)
 {
        struct pci_dev *pdev = NULL;
        struct iSeries_Device_Node *node;
-       char Buffer[256];
        int DeviceCount = 0;
 
        PPCDBG(PPCDBG_BUSWALK, "iSeries_pcibios_fixup Entry.\n"); 
@@ -324,9 +318,7 @@ void __init iSeries_pci_final_fixup(void)
                                        "pdev 0x%p <==> DevNode 0x%p\n",
                                        pdev, node);
                        allocate_device_bars(pdev);
-                       iSeries_Device_Information(pdev, Buffer,
-                                       sizeof(Buffer));
-                       printk("%d. %s\n", DeviceCount, Buffer);
+                       iSeries_Device_Information(pdev, DeviceCount);
                        iommu_devnode_init_iSeries(node);
                } else
                        printk("PCI: Device Tree not found for 0x%016lX\n",
@@ -499,7 +491,6 @@ static int scan_bridge_slot(HvBusNumber Bus,
 
                        ++DeviceCount;
                        node = build_device_node(Bus, SubBus, EADsIdSel, Function);
-                       node->Vendor = VendorId;
                        node->Irq = Irq;
                        node->LogicalSlot = BridgeInfo->logicalSlotNumber;
 
@@ -661,38 +652,34 @@ static struct pci_ops iSeries_pci_ops = {
  * Check Return Code
  * -> On Failure, print and log information.
  *    Increment Retry Count, if exceeds max, panic partition.
- * -> If in retry, print and log success 
  *
  * PCI: Device 23.90 ReadL I/O Error( 0): 0x1234
  * PCI: Device 23.90 ReadL Retry( 1)
  * PCI: Device 23.90 ReadL Retry Successful(1)
  */
 static int CheckReturnCode(char *TextHdr, struct iSeries_Device_Node *DevNode,
-               u64 ret)
+               int *retry, u64 ret)
 {
        if (ret != 0)  {
                ++Pci_Error_Count;
-               ++DevNode->IoRetry;
+               (*retry)++;
                printk("PCI: %s: Device 0x%04X:%02X  I/O Error(%2d): 0x%04X\n",
                                TextHdr, DevNode->DsaAddr.Dsa.busNumber, DevNode->DevFn,
-                               DevNode->IoRetry, (int)ret);
+                               *retry, (int)ret);
                /*
                 * Bump the retry and check for retry count exceeded.
                 * If, Exceeded, panic the system.
                 */
-               if ((DevNode->IoRetry > Pci_Retry_Max) &&
+               if (((*retry) > Pci_Retry_Max) &&
                                (Pci_Error_Flag > 0)) {
                        mf_display_src(0xB6000103);
-                       panic_timeout = 0; 
+                       panic_timeout = 0;
                        panic("PCI: Hardware I/O Error, SRC B6000103, "
                                        "Automatic Reboot Disabled.\n");
                }
                return -1;      /* Retry Try */
        }
-       /* If retry was in progress, log success and rest retry count */
-       if (DevNode->IoRetry > 0)
-               DevNode->IoRetry = 0;
-       return 0; 
+       return 0;
 }
 
 /*
@@ -738,6 +725,7 @@ u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress)
 {
        u64 BarOffset;
        u64 dsa;
+       int retry = 0;
        struct HvCallPci_LoadReturn ret;
        struct iSeries_Device_Node *DevNode =
                xlate_iomm_address(IoAddress, &dsa, &BarOffset);
@@ -757,7 +745,7 @@ u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress)
        do {
                ++Pci_Io_Read_Count;
                HvCall3Ret16(HvCallPciBarLoad8, &ret, dsa, BarOffset, 0);
-       } while (CheckReturnCode("RDB", DevNode, ret.rc) != 0);
+       } while (CheckReturnCode("RDB", DevNode, &retry, ret.rc) != 0);
 
        return (u8)ret.value;
 }
@@ -767,6 +755,7 @@ u16 iSeries_Read_Word(const volatile void __iomem *IoAddress)
 {
        u64 BarOffset;
        u64 dsa;
+       int retry = 0;
        struct HvCallPci_LoadReturn ret;
        struct iSeries_Device_Node *DevNode =
                xlate_iomm_address(IoAddress, &dsa, &BarOffset);
@@ -787,7 +776,7 @@ u16 iSeries_Read_Word(const volatile void __iomem *IoAddress)
                ++Pci_Io_Read_Count;
                HvCall3Ret16(HvCallPciBarLoad16, &ret, dsa,
                                BarOffset, 0);
-       } while (CheckReturnCode("RDW", DevNode, ret.rc) != 0);
+       } while (CheckReturnCode("RDW", DevNode, &retry, ret.rc) != 0);
 
        return swab16((u16)ret.value);
 }
@@ -797,6 +786,7 @@ u32 iSeries_Read_Long(const volatile void __iomem *IoAddress)
 {
        u64 BarOffset;
        u64 dsa;
+       int retry = 0;
        struct HvCallPci_LoadReturn ret;
        struct iSeries_Device_Node *DevNode =
                xlate_iomm_address(IoAddress, &dsa, &BarOffset);
@@ -817,7 +807,7 @@ u32 iSeries_Read_Long(const volatile void __iomem *IoAddress)
                ++Pci_Io_Read_Count;
                HvCall3Ret16(HvCallPciBarLoad32, &ret, dsa,
                                BarOffset, 0);
-       } while (CheckReturnCode("RDL", DevNode, ret.rc) != 0);
+       } while (CheckReturnCode("RDL", DevNode, &retry, ret.rc) != 0);
 
        return swab32((u32)ret.value);
 }
@@ -834,6 +824,7 @@ void iSeries_Write_Byte(u8 data, volatile void __iomem *IoAddress)
 {
        u64 BarOffset;
        u64 dsa;
+       int retry = 0;
        u64 rc;
        struct iSeries_Device_Node *DevNode =
                xlate_iomm_address(IoAddress, &dsa, &BarOffset);
@@ -853,7 +844,7 @@ void iSeries_Write_Byte(u8 data, volatile void __iomem *IoAddress)
        do {
                ++Pci_Io_Write_Count;
                rc = HvCall4(HvCallPciBarStore8, dsa, BarOffset, data, 0);
-       } while (CheckReturnCode("WWB", DevNode, rc) != 0);
+       } while (CheckReturnCode("WWB", DevNode, &retry, rc) != 0);
 }
 EXPORT_SYMBOL(iSeries_Write_Byte);
 
@@ -861,6 +852,7 @@ void iSeries_Write_Word(u16 data, volatile void __iomem *IoAddress)
 {
        u64 BarOffset;
        u64 dsa;
+       int retry = 0;
        u64 rc;
        struct iSeries_Device_Node *DevNode =
                xlate_iomm_address(IoAddress, &dsa, &BarOffset);
@@ -880,7 +872,7 @@ void iSeries_Write_Word(u16 data, volatile void __iomem *IoAddress)
        do {
                ++Pci_Io_Write_Count;
                rc = HvCall4(HvCallPciBarStore16, dsa, BarOffset, swab16(data), 0);
-       } while (CheckReturnCode("WWW", DevNode, rc) != 0);
+       } while (CheckReturnCode("WWW", DevNode, &retry, rc) != 0);
 }
 EXPORT_SYMBOL(iSeries_Write_Word);
 
@@ -888,6 +880,7 @@ void iSeries_Write_Long(u32 data, volatile void __iomem *IoAddress)
 {
        u64 BarOffset;
        u64 dsa;
+       int retry = 0;
        u64 rc;
        struct iSeries_Device_Node *DevNode =
                xlate_iomm_address(IoAddress, &dsa, &BarOffset);
@@ -907,6 +900,6 @@ void iSeries_Write_Long(u32 data, volatile void __iomem *IoAddress)
        do {
                ++Pci_Io_Write_Count;
                rc = HvCall4(HvCallPciBarStore32, dsa, BarOffset, swab32(data), 0);
-       } while (CheckReturnCode("WWL", DevNode, rc) != 0);
+       } while (CheckReturnCode("WWL", DevNode, &retry, rc) != 0);
 }
 EXPORT_SYMBOL(iSeries_Write_Long);
diff --git a/arch/ppc64/kernel/iSeries_pci_reset.c b/arch/ppc64/kernel/iSeries_pci_reset.c
deleted file mode 100644 (file)
index 0f785e4..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-#define PCIFR(...)
-/************************************************************************/
-/* File iSeries_pci_reset.c created by Allan Trautman on Mar 21 2001.   */
-/************************************************************************/
-/* This code supports the pci interface on the IBM iSeries systems.     */
-/* Copyright (C) 20yy  <Allan H Trautman> <IBM Corp>                    */
-/*                                                                      */
-/* This program is free software; you can redistribute it and/or modify */
-/* it under the terms of the GNU General Public License as published by */
-/* the Free Software Foundation; either version 2 of the License, or    */
-/* (at your option) any later version.                                  */
-/*                                                                      */
-/* This program is distributed in the hope that it will be useful,      */ 
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of       */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        */
-/* GNU General Public License for more details.                         */
-/*                                                                      */
-/* You should have received a copy of the GNU General Public License    */ 
-/* along with this program; if not, write to the:                       */
-/* Free Software Foundation, Inc.,                                      */ 
-/* 59 Temple Place, Suite 330,                                          */ 
-/* Boston, MA  02111-1307  USA                                          */
-/************************************************************************/
-/* Change Activity:                                                     */
-/*   Created, March 20, 2001                                            */
-/*   April 30, 2001, Added return codes on functions.                   */
-/*   September 10, 2001, Ported to ppc64.                               */
-/* End Change Activity                                                  */
-/************************************************************************/
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/pci.h>
-#include <linux/irq.h>
-#include <linux/delay.h>
-
-#include <asm/io.h>
-#include <asm/iSeries/HvCallPci.h>
-#include <asm/iSeries/HvTypes.h>
-#include <asm/iSeries/mf.h>
-#include <asm/pci.h>
-
-#include <asm/iSeries/iSeries_pci.h>
-#include "pci.h"
-
-/*
- * Interface to toggle the reset line
- * Time is in .1 seconds, need for seconds.
- */
-int iSeries_Device_ToggleReset(struct pci_dev *PciDev, int AssertTime,
-               int DelayTime)
-{
-       unsigned int AssertDelay, WaitDelay;
-       struct iSeries_Device_Node *DeviceNode =
-               (struct iSeries_Device_Node *)PciDev->sysdata;
-
-       if (DeviceNode == NULL) { 
-               printk("PCI: Pci Reset Failed, Device Node not found for pci_dev %p\n",
-                               PciDev);
-               return -1;
-       }
-       /*
-        * Set defaults, Assert is .5 second, Wait is 3 seconds.
-        */
-       if (AssertTime == 0)
-               AssertDelay = 500;
-       else
-               AssertDelay = AssertTime * 100;
-
-       if (DelayTime == 0)
-               WaitDelay = 3000;
-       else
-               WaitDelay = DelayTime * 100;
-
-       /*
-        * Assert reset
-        */
-       DeviceNode->ReturnCode = HvCallPci_setSlotReset(ISERIES_BUS(DeviceNode),
-                       0x00, DeviceNode->AgentId, 1);
-       if (DeviceNode->ReturnCode == 0) {
-               msleep(AssertDelay);                    /* Sleep for the time */
-               DeviceNode->ReturnCode =
-                       HvCallPci_setSlotReset(ISERIES_BUS(DeviceNode),
-                                       0x00, DeviceNode->AgentId, 0);
-
-               /*
-                * Wait for device to reset
-                */
-               msleep(WaitDelay);
-       }
-       if (DeviceNode->ReturnCode == 0)
-               PCIFR("Slot 0x%04X.%02 Reset\n", ISERIES_BUS(DeviceNode),
-                               DeviceNode->AgentId);
-       else {
-               printk("PCI: Slot 0x%04X.%02X Reset Failed, RCode: %04X\n",
-                               ISERIES_BUS(DeviceNode), DeviceNode->AgentId,
-                               DeviceNode->ReturnCode);
-               PCIFR("Slot 0x%04X.%02X Reset Failed, RCode: %04X\n",
-                               ISERIES_BUS(DeviceNode), DeviceNode->AgentId,
-                               DeviceNode->ReturnCode);
-       }
-       return DeviceNode->ReturnCode;
-}
-EXPORT_SYMBOL(iSeries_Device_ToggleReset);
index 0cc58ddf48ded6bd265c43c067b2ffc1a1e1bdd3..356bd9931fcc923e7e3645557bc3392331f855b4 100644 (file)
@@ -28,8 +28,7 @@
 #include <asm/iSeries/ItLpQueue.h>
 #include <asm/iSeries/HvCallXm.h>
 #include <asm/iSeries/IoHriMainStore.h>
-#include <asm/iSeries/LparData.h>
-#include <asm/iSeries/iSeries_proc.h>
+#include <asm/iSeries/IoHriProcessorVpd.h>
 
 static int __init iseries_proc_create(void)
 {
index da20120f22617515f554e405d9eaa744288aca57..b31962436fe36b4e795e1d2c15ae0c5c0e774456 100644 (file)
@@ -47,7 +47,7 @@
 #include <asm/paca.h>
 #include <asm/cache.h>
 #include <asm/sections.h>
-#include <asm/iSeries/LparData.h>
+#include <asm/abs_addr.h>
 #include <asm/iSeries/HvCallHpt.h>
 #include <asm/iSeries/HvLpConfig.h>
 #include <asm/iSeries/HvCallEvent.h>
 #include <asm/iSeries/HvCallXm.h>
 #include <asm/iSeries/ItLpQueue.h>
 #include <asm/iSeries/IoHriMainStore.h>
-#include <asm/iSeries/iSeries_proc.h>
 #include <asm/iSeries/mf.h>
 #include <asm/iSeries/HvLpEvent.h>
 #include <asm/iSeries/iSeries_irq.h>
+#include <asm/iSeries/IoHriProcessorVpd.h>
+#include <asm/iSeries/ItVpdAreas.h>
+#include <asm/iSeries/LparMap.h>
 
 extern void hvlog(char *fmt, ...);
 
@@ -74,7 +76,11 @@ extern void ppcdbg_initialize(void);
 static void build_iSeries_Memory_Map(void);
 static void setup_iSeries_cache_sizes(void);
 static void iSeries_bolt_kernel(unsigned long saddr, unsigned long eaddr);
+#ifdef CONFIG_PCI
 extern void iSeries_pci_final_fixup(void);
+#else
+static void iSeries_pci_final_fixup(void) { }
+#endif
 
 /* Global Variables */
 static unsigned long procFreqHz;
@@ -852,6 +858,32 @@ static int __init iSeries_src_init(void)
 
 late_initcall(iSeries_src_init);
 
+static int set_spread_lpevents(char *str)
+{
+       unsigned long i;
+       unsigned long val = simple_strtoul(str, NULL, 0);
+
+       /*
+        * The parameter is the number of processors to share in processing
+        * lp events.
+        */
+       if (( val > 0) && (val <= NR_CPUS)) {
+               for (i = 1; i < val; ++i)
+                       paca[i].lpqueue_ptr = paca[0].lpqueue_ptr;
+
+               printk("lpevent processing spread over %ld processors\n", val);
+       } else {
+               printk("invalid spread_lpevents %ld\n", val);
+       }
+
+       return 1;
+}
+__setup("spread_lpevents=", set_spread_lpevents);
+
+#ifndef CONFIG_PCI
+void __init iSeries_init_IRQ(void) { }
+#endif
+
 void __init iSeries_early_setup(void)
 {
        iSeries_fixup_klimit();
index ba1f084d5462419d842df6ab2a56b46d3ae7e220..f74386e31638d38185755bcf9cb3ae6d8b2f725c 100644 (file)
@@ -38,9 +38,7 @@
 #include <asm/io.h>
 #include <asm/smp.h>
 #include <asm/paca.h>
-#include <asm/iSeries/LparData.h>
 #include <asm/iSeries/HvCall.h>
-#include <asm/iSeries/HvCallCfg.h>
 #include <asm/time.h>
 #include <asm/ppcdebug.h>
 #include <asm/machdep.h>
index 6abc621d3ba0ca1fd2f52b934d83faaae4d8d81e..bdf13b4dc1c832972733e907b6e68ab83704ff01 100644 (file)
@@ -42,6 +42,11 @@ static int (*idle_loop)(void);
 static unsigned long maxYieldTime = 0;
 static unsigned long minYieldTime = 0xffffffffffffffffUL;
 
+static inline void process_iSeries_events(void)
+{
+       asm volatile ("li 0,0x5555; sc" : : : "r0", "r3");
+}
+
 static void yield_shared_processor(void)
 {
        unsigned long tb;
@@ -75,13 +80,9 @@ static int iSeries_idle(void)
 {
        struct paca_struct *lpaca;
        long oldval;
-       unsigned long CTRL;
 
        /* ensure iSeries run light will be out when idle */
-       clear_thread_flag(TIF_RUN_LIGHT);
-       CTRL = mfspr(CTRLF);
-       CTRL &= ~RUNLATCH;
-       mtspr(CTRLT, CTRL);
+       ppc64_runlatch_off();
 
        lpaca = get_paca();
 
@@ -111,7 +112,9 @@ static int iSeries_idle(void)
                        }
                }
 
+               ppc64_runlatch_on();
                schedule();
+               ppc64_runlatch_off();
        }
 
        return 0;
@@ -294,7 +297,7 @@ static int native_idle(void)
                if (need_resched())
                        schedule();
 
-               if (cpu_is_offline(_smp_processor_id()) &&
+               if (cpu_is_offline(raw_smp_processor_id()) &&
                    system_state == SYSTEM_RUNNING)
                        cpu_die();
        }
index 344164681d2ce5a4f4373ed9637140e42d17fcee..8316426ccaf60036c59d3cd45e18835d8e19c88a 100644 (file)
@@ -423,6 +423,9 @@ struct iommu_table *iommu_init_table(struct iommu_table *tbl)
        tbl->it_largehint = tbl->it_halfpoint;
        spin_lock_init(&tbl->it_lock);
 
+       /* Clear the hardware table in case firmware left allocations in it */
+       ppc_md.tce_free(tbl, tbl->it_offset, tbl->it_size);
+
        if (!welcomed) {
                printk(KERN_INFO "IOMMU table initialized, virtual merging %s\n",
                       novmerge ? "disabled" : "enabled");
index 4fd7f203c1e3e89bc122fe9c090cf675cfd6cb7c..d860467b8f096430456bb9842033e3d53c020e05 100644 (file)
@@ -52,7 +52,7 @@
 #include <asm/cache.h>
 #include <asm/prom.h>
 #include <asm/ptrace.h>
-#include <asm/iSeries/LparData.h>
+#include <asm/iSeries/ItLpQueue.h>
 #include <asm/machdep.h>
 #include <asm/paca.h>
 
index 103daaf735734e5a6006d95e5a9ecda68cc01f21..e950a2058a1994fc9a9e8531465813f9de3ff09c 100644 (file)
@@ -45,12 +45,17 @@ static struct pt_regs jprobe_saved_regs;
 
 int arch_prepare_kprobe(struct kprobe *p)
 {
+       int ret = 0;
        kprobe_opcode_t insn = *p->addr;
 
-       if (IS_MTMSRD(insn) || IS_RFID(insn))
-               /* cannot put bp on RFID/MTMSRD */
-               return 1;
-       return 0;
+       if ((unsigned long)p->addr & 0x03) {
+               printk("Attempt to register kprobe at an unaligned address\n");
+               ret = -EINVAL;
+       } else if (IS_MTMSRD(insn) || IS_RFID(insn)) {
+               printk("Cannot register a kprobe on rfid or mtmsrd\n");
+               ret = -EINVAL;
+       }
+       return ret;
 }
 
 void arch_copy_kprobe(struct kprobe *p)
@@ -172,8 +177,6 @@ static void resume_execution(struct kprobe *p, struct pt_regs *regs)
        ret = emulate_step(regs, p->ainsn.insn[0]);
        if (ret == 0)
                regs->nip = (unsigned long)p->addr + 4;
-
-       regs->msr &= ~MSR_SE;
 }
 
 static inline int post_kprobe_handler(struct pt_regs *regs)
@@ -210,6 +213,7 @@ static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
 
        if (kprobe_status & KPROBE_HIT_SS) {
                resume_execution(current_kprobe, regs);
+               regs->msr &= ~MSR_SE;
                regs->msr |= kprobe_saved_msr;
 
                unlock_kprobes();
@@ -233,8 +237,6 @@ int kprobe_exceptions_notify(struct notifier_block *self, unsigned long val,
         */
        preempt_disable();
        switch (val) {
-       case DIE_IABR_MATCH:
-       case DIE_DABR_MATCH:
        case DIE_BPT:
                if (kprobe_handler(args->regs))
                        ret = NOTIFY_STOP;
index a8fd32df848b71ade564d51316ab93f35a4348c6..387923fcf9b06492a07b0b9e63c8748197de0e7b 100644 (file)
 #include <asm/uaccess.h>
 #include <asm/iSeries/HvLpConfig.h>
 #include <asm/lppaca.h>
-#include <asm/iSeries/LparData.h>
 #include <asm/hvcall.h>
 #include <asm/cputable.h>
 #include <asm/rtas.h>
 #include <asm/system.h>
 #include <asm/time.h>
+#include <asm/iSeries/ItExtVpdPanel.h>
 
 #define MODULE_VERS "1.6"
 #define MODULE_NAME "lparcfg"
index 1bd52ece497c6016a80ff535a68d52babbb139c6..d98bebf7042faf990e63a8732c8dab4c91991033 100644 (file)
@@ -1,7 +1,7 @@
 /*
   * mf.c
   * Copyright (C) 2001 Troy D. Armstrong  IBM Corporation
-  * Copyright (C) 2004 Stephen Rothwell  IBM Corporation
+  * Copyright (C) 2004-2005 Stephen Rothwell  IBM Corporation
   *
   * This modules exists as an interface between a Linux secondary partition
   * running on an iSeries and the primary partition's Virtual Service
 
 #include <asm/time.h>
 #include <asm/uaccess.h>
+#include <asm/paca.h>
 #include <asm/iSeries/vio.h>
 #include <asm/iSeries/mf.h>
 #include <asm/iSeries/HvLpConfig.h>
-#include <asm/iSeries/ItSpCommArea.h>
+#include <asm/iSeries/ItLpQueue.h>
 
 /*
  * This is the structure layout for the Machine Facilites LPAR event
@@ -696,36 +697,23 @@ static void get_rtc_time_complete(void *token, struct ce_msg_data *ce_msg)
        complete(&rtc->com);
 }
 
-int mf_get_rtc(struct rtc_time *tm)
+static int rtc_set_tm(int rc, u8 *ce_msg, struct rtc_time *tm)
 {
-       struct ce_msg_comp_data ce_complete;
-       struct rtc_time_data rtc_data;
-       int rc;
-
-       memset(&ce_complete, 0, sizeof(ce_complete));
-       memset(&rtc_data, 0, sizeof(rtc_data));
-       init_completion(&rtc_data.com);
-       ce_complete.handler = &get_rtc_time_complete;
-       ce_complete.token = &rtc_data;
-       rc = signal_ce_msg_simple(0x40, &ce_complete);
-       if (rc)
-               return rc;
-       wait_for_completion(&rtc_data.com);
        tm->tm_wday = 0;
        tm->tm_yday = 0;
        tm->tm_isdst = 0;
-       if (rtc_data.rc) {
+       if (rc) {
                tm->tm_sec = 0;
                tm->tm_min = 0;
                tm->tm_hour = 0;
                tm->tm_mday = 15;
                tm->tm_mon = 5;
                tm->tm_year = 52;
-               return rtc_data.rc;
+               return rc;
        }
 
-       if ((rtc_data.ce_msg.ce_msg[2] == 0xa9) ||
-           (rtc_data.ce_msg.ce_msg[2] == 0xaf)) {
+       if ((ce_msg[2] == 0xa9) ||
+           (ce_msg[2] == 0xaf)) {
                /* TOD clock is not set */
                tm->tm_sec = 1;
                tm->tm_min = 1;
@@ -736,7 +724,6 @@ int mf_get_rtc(struct rtc_time *tm)
                mf_set_rtc(tm);
        }
        {
-               u8 *ce_msg = rtc_data.ce_msg.ce_msg;
                u8 year = ce_msg[5];
                u8 sec = ce_msg[6];
                u8 min = ce_msg[7];
@@ -765,6 +752,63 @@ int mf_get_rtc(struct rtc_time *tm)
        return 0;
 }
 
+int mf_get_rtc(struct rtc_time *tm)
+{
+       struct ce_msg_comp_data ce_complete;
+       struct rtc_time_data rtc_data;
+       int rc;
+
+       memset(&ce_complete, 0, sizeof(ce_complete));
+       memset(&rtc_data, 0, sizeof(rtc_data));
+       init_completion(&rtc_data.com);
+       ce_complete.handler = &get_rtc_time_complete;
+       ce_complete.token = &rtc_data;
+       rc = signal_ce_msg_simple(0x40, &ce_complete);
+       if (rc)
+               return rc;
+       wait_for_completion(&rtc_data.com);
+       return rtc_set_tm(rtc_data.rc, rtc_data.ce_msg.ce_msg, tm);
+}
+
+struct boot_rtc_time_data {
+       int busy;
+       struct ce_msg_data ce_msg;
+       int rc;
+};
+
+static void get_boot_rtc_time_complete(void *token, struct ce_msg_data *ce_msg)
+{
+       struct boot_rtc_time_data *rtc = token;
+
+       memcpy(&rtc->ce_msg, ce_msg, sizeof(rtc->ce_msg));
+       rtc->rc = 0;
+       rtc->busy = 0;
+}
+
+int mf_get_boot_rtc(struct rtc_time *tm)
+{
+       struct ce_msg_comp_data ce_complete;
+       struct boot_rtc_time_data rtc_data;
+       int rc;
+
+       memset(&ce_complete, 0, sizeof(ce_complete));
+       memset(&rtc_data, 0, sizeof(rtc_data));
+       rtc_data.busy = 1;
+       ce_complete.handler = &get_boot_rtc_time_complete;
+       ce_complete.token = &rtc_data;
+       rc = signal_ce_msg_simple(0x40, &ce_complete);
+       if (rc)
+               return rc;
+       /* We need to poll here as we are not yet taking interrupts */
+       while (rtc_data.busy) {
+               extern unsigned long lpevent_count;
+               struct ItLpQueue *lpq = get_paca()->lpqueue_ptr;
+               if (lpq && ItLpQueue_isLpIntPending(lpq))
+                       lpevent_count += ItLpQueue_process(lpq, NULL);
+       }
+       return rtc_set_tm(rtc_data.rc, rtc_data.ce_msg.ce_msg, tm);
+}
+
 int mf_set_rtc(struct rtc_time *tm)
 {
        char ce_time[12];
index b944717c1dbd97c7fdfd547a53be87dffec47862..e3c73b3425dc016447d7e417f536d7a66fde39c4 100644 (file)
@@ -792,7 +792,7 @@ _GLOBAL(sys_call_table32)
        .llong .compat_sys_newstat
        .llong .compat_sys_newlstat
        .llong .compat_sys_newfstat
-       .llong .sys_uname
+       .llong .sys32_uname
        .llong .sys_ni_syscall          /* 110 old iopl syscall */
        .llong .sys_vhangup
        .llong .sys_ni_syscall          /* old idle syscall */
index f4c825a69fa0ce700065f51ed48a71cfa5d5985b..66bd5ab7c25a4f17a3d95430fcc790c68e2c6360 100644 (file)
@@ -161,7 +161,7 @@ void of_unregister_driver(struct of_platform_driver *drv)
 }
 
 
-static ssize_t dev_show_devspec(struct device *dev, char *buf)
+static ssize_t dev_show_devspec(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct of_device *ofdev;
 
index cb5443f2e49b81ba09b70966acf92fd5edcd6aa6..dc2a69d412a204820546107a47ab7c676036a7de 100644 (file)
@@ -47,14 +47,6 @@ static void remove_node_proc_entries(struct device_node *np)
                remove_proc_entry(pp->name, np->pde);
                pp = pp->next;
        }
-
-       /* Assuming that symlinks have the same parent directory as
-        * np->pde.
-        */
-       if (np->name_link)
-               remove_proc_entry(np->name_link->name, parent->pde);
-       if (np->addr_link)
-               remove_proc_entry(np->addr_link->name, parent->pde);
        if (np->pde)
                remove_proc_entry(np->pde->name, parent->pde);
 }
index fbad349ec58c2179fce3731d9ead5b8739cbc8c8..4203bd020c828364a42279ea48ef9ac1c85f6f03 100644 (file)
@@ -375,7 +375,7 @@ static int smp_pSeries_cpu_bootable(unsigned int nr)
         * cpus are assumed to be secondary threads.
         */
        if (system_state < SYSTEM_RUNNING &&
-           cur_cpu_spec->cpu_features & CPU_FTR_SMT &&
+           cpu_has_feature(CPU_FTR_SMT) &&
            !smt_enabled_at_boot && nr % 2 != 0)
                return 0;
 
@@ -419,8 +419,8 @@ void __init smp_init_pSeries(void)
 #endif
 
        /* Mark threads which are still spinning in hold loops. */
-       if (cur_cpu_spec->cpu_features & CPU_FTR_SMT)
-               for_each_present_cpu(i) {
+       if (cpu_has_feature(CPU_FTR_SMT)) {
+               for_each_present_cpu(i) { 
                        if (i % 2 == 0)
                                /*
                                 * Even-numbered logical cpus correspond to
@@ -428,8 +428,9 @@ void __init smp_init_pSeries(void)
                                 */
                                cpu_set(i, of_spin_map);
                }
-       else
+       } else {
                of_spin_map = cpu_present_map;
+       }
 
        cpu_clear(boot_cpuid, of_spin_map);
 
index d786d4b6af0b2a78403d4bb1325b9f2c2be414fe..2bf0513f3eca0a0fa2c53f50640ef312def4cc71 100644 (file)
@@ -507,7 +507,7 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
 }
 
 #ifdef CONFIG_PPC_MULTIPLATFORM
-static ssize_t pci_show_devspec(struct device *dev, char *buf)
+static ssize_t pci_show_devspec(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pci_dev *pdev;
        struct device_node *np;
index c27588ede2fea38f3990f2104f1af4d37246de23..a23de37227bfcc9b81edc2839a6f817f58e61171 100644 (file)
@@ -68,6 +68,7 @@ extern struct smp_ops_t *smp_ops;
 
 static void (*pmac_tb_freeze)(int freeze);
 static struct device_node *pmac_tb_clock_chip_host;
+static u8 pmac_tb_pulsar_addr;
 static DEFINE_SPINLOCK(timebase_lock);
 static unsigned long timebase;
 
@@ -106,12 +107,9 @@ static void smp_core99_pulsar_tb_freeze(int freeze)
        u8 data;
        int rc;
 
-       /* Strangely, the device-tree says address is 0xd2, but darwin
-        * accesses 0xd0 ...
-        */
        pmac_low_i2c_setmode(pmac_tb_clock_chip_host, pmac_low_i2c_mode_combined);
        rc = pmac_low_i2c_xfer(pmac_tb_clock_chip_host,
-                              0xd4 | pmac_low_i2c_read,
+                              pmac_tb_pulsar_addr | pmac_low_i2c_read,
                               0x2e, &data, 1);
        if (rc != 0)
                goto bail;
@@ -120,7 +118,7 @@ static void smp_core99_pulsar_tb_freeze(int freeze)
 
        pmac_low_i2c_setmode(pmac_tb_clock_chip_host, pmac_low_i2c_mode_stdsub);
        rc = pmac_low_i2c_xfer(pmac_tb_clock_chip_host,
-                              0xd4 | pmac_low_i2c_write,
+                              pmac_tb_pulsar_addr | pmac_low_i2c_write,
                               0x2e, &data, 1);
  bail:
        if (rc != 0) {
@@ -185,6 +183,12 @@ static int __init smp_core99_probe(void)
        if (ncpus <= 1)
                return 1;
 
+       /* HW sync only on these platforms */
+       if (!machine_is_compatible("PowerMac7,2") &&
+           !machine_is_compatible("PowerMac7,3") &&
+           !machine_is_compatible("RackMac3,1"))
+               goto nohwsync;
+
        /* Look for the clock chip */
        for (cc = NULL; (cc = of_find_node_by_name(cc, "i2c-hwclock")) != NULL;) {
                struct device_node *p = of_get_parent(cc);
@@ -198,11 +202,18 @@ static int __init smp_core99_probe(void)
                        goto next;
                switch (*reg) {
                case 0xd2:
-                       pmac_tb_freeze = smp_core99_cypress_tb_freeze;
-                       printk(KERN_INFO "Timebase clock is Cypress chip\n");
+                       if (device_is_compatible(cc, "pulsar-legacy-slewing")) {
+                               pmac_tb_freeze = smp_core99_pulsar_tb_freeze;
+                               pmac_tb_pulsar_addr = 0xd2;
+                               printk(KERN_INFO "Timebase clock is Pulsar chip\n");
+                       } else if (device_is_compatible(cc, "cy28508")) {
+                               pmac_tb_freeze = smp_core99_cypress_tb_freeze;
+                               printk(KERN_INFO "Timebase clock is Cypress chip\n");
+                       }
                        break;
                case 0xd4:
                        pmac_tb_freeze = smp_core99_pulsar_tb_freeze;
+                       pmac_tb_pulsar_addr = 0xd4;
                        printk(KERN_INFO "Timebase clock is Pulsar chip\n");
                        break;
                }
@@ -210,12 +221,15 @@ static int __init smp_core99_probe(void)
                        pmac_tb_clock_chip_host = p;
                        smp_ops->give_timebase = smp_core99_give_timebase;
                        smp_ops->take_timebase = smp_core99_take_timebase;
+                       of_node_put(cc);
+                       of_node_put(p);
                        break;
                }
        next:
                of_node_put(p);
        }
 
+ nohwsync:
        mpic_request_ipis();
 
        return ncpus;
index 8b06861227385709431ace73498417c448b10e5d..aba89554d89df912f268e465fab3f74f5cb7e90f 100644 (file)
@@ -58,14 +58,6 @@ struct task_struct *last_task_used_math = NULL;
 struct task_struct *last_task_used_altivec = NULL;
 #endif
 
-struct mm_struct ioremap_mm = {
-       .pgd            = ioremap_dir,
-       .mm_users       = ATOMIC_INIT(2),
-       .mm_count       = ATOMIC_INIT(1),
-       .cpu_vm_mask    = CPU_MASK_ALL,
-       .page_table_lock = SPIN_LOCK_UNLOCKED,
-};
-
 /*
  * Make sure the floating-point register state in the
  * the thread_struct is up to date for task tsk.
@@ -378,9 +370,6 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
                childregs->gpr[1] = sp + sizeof(struct pt_regs);
                p->thread.regs = NULL;  /* no user register state */
                clear_ti_thread_flag(p->thread_info, TIF_32BIT);
-#ifdef CONFIG_PPC_ISERIES
-               set_ti_thread_flag(p->thread_info, TIF_RUN_LIGHT);
-#endif
        } else {
                childregs->gpr[1] = usp;
                p->thread.regs = childregs;
index eb6538b58008b641f06cd7fab3ca815b4ae4ca3d..47727a6f734623c89a14d5b0d61593bdcacafa74 100644 (file)
@@ -884,6 +884,7 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
 {
        char *type = get_flat_dt_prop(node, "device_type", NULL);
        u32 *prop;
+       unsigned long size;
 
        /* We are scanning "cpu" nodes only */
        if (type == NULL || strcmp(type, "cpu") != 0)
@@ -929,6 +930,17 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
                cur_cpu_spec->cpu_user_features |= PPC_FEATURE_HAS_ALTIVEC;
        }
 
+       /*
+        * Check for an SMT capable CPU and set the CPU feature. We do
+        * this by looking at the size of the ibm,ppc-interrupt-server#s
+        * property
+        */
+       prop = (u32 *)get_flat_dt_prop(node, "ibm,ppc-interrupt-server#s",
+                                      &size);
+       cur_cpu_spec->cpu_features &= ~CPU_FTR_SMT;
+       if (prop && ((size / sizeof(u32)) > 1))
+               cur_cpu_spec->cpu_features |= CPU_FTR_SMT;
+
        return 0;
 }
 
index 35ec42de962e2f42d331e72f3a09cac678e6486a..b7683abfbe6a5f71e8031610ef8cb67dd14a07bd 100644 (file)
@@ -211,13 +211,23 @@ struct {
  */
 #define ADDR(x)                (u32) ((unsigned long)(x) - offset)
 
+/*
+ * Error results ... some OF calls will return "-1" on error, some
+ * will return 0, some will return either. To simplify, here are
+ * macros to use with any ihandle or phandle return value to check if
+ * it is valid
+ */
+
+#define PROM_ERROR             (-1u)
+#define PHANDLE_VALID(p)       ((p) != 0 && (p) != PROM_ERROR)
+#define IHANDLE_VALID(i)       ((i) != 0 && (i) != PROM_ERROR)
+
+
 /* This is the one and *ONLY* place where we actually call open
  * firmware from, since we need to make sure we're running in 32b
  * mode when we do.  We switch back to 64b mode upon return.
  */
 
-#define PROM_ERROR     (-1)
-
 static int __init call_prom(const char *service, int nargs, int nret, ...)
 {
        int i;
@@ -587,14 +597,13 @@ static void __init prom_send_capabilities(void)
 {
        unsigned long offset = reloc_offset();
        ihandle elfloader;
-       int ret;
 
        elfloader = call_prom("open", 1, 1, ADDR("/packages/elf-loader"));
        if (elfloader == 0) {
                prom_printf("couldn't open /packages/elf-loader\n");
                return;
        }
-       ret = call_prom("call-method", 3, 1, ADDR("process-elf-header"),
+       call_prom("call-method", 3, 1, ADDR("process-elf-header"),
                        elfloader, ADDR(&fake_elf));
        call_prom("close", 1, 0, elfloader);
 }
@@ -646,7 +655,7 @@ static unsigned long __init alloc_up(unsigned long size, unsigned long align)
            base = _ALIGN_UP(base + 0x100000, align)) {
                prom_debug("    trying: 0x%x\n\r", base);
                addr = (unsigned long)prom_claim(base, size, 0);
-               if ((int)addr != PROM_ERROR)
+               if (addr != PROM_ERROR)
                        break;
                addr = 0;
                if (align == 0)
@@ -708,7 +717,7 @@ static unsigned long __init alloc_down(unsigned long size, unsigned long align,
        for(; base > RELOC(alloc_bottom); base = _ALIGN_DOWN(base - 0x100000, align))  {
                prom_debug("    trying: 0x%x\n\r", base);
                addr = (unsigned long)prom_claim(base, size, 0);
-               if ((int)addr != PROM_ERROR)
+               if (addr != PROM_ERROR)
                        break;
                addr = 0;
        }
@@ -902,18 +911,19 @@ static void __init prom_instantiate_rtas(void)
 {
        unsigned long offset = reloc_offset();
        struct prom_t *_prom = PTRRELOC(&prom);
-       phandle prom_rtas, rtas_node;
+       phandle rtas_node;
+       ihandle rtas_inst;
        u32 base, entry = 0;
        u32 size = 0;
 
        prom_debug("prom_instantiate_rtas: start...\n");
 
-       prom_rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
-       prom_debug("prom_rtas: %x\n", prom_rtas);
-       if (prom_rtas == (phandle) -1)
+       rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
+       prom_debug("rtas_node: %x\n", rtas_node);
+       if (!PHANDLE_VALID(rtas_node))
                return;
 
-       prom_getprop(prom_rtas, "rtas-size", &size, sizeof(size));
+       prom_getprop(rtas_node, "rtas-size", &size, sizeof(size));
        if (size == 0)
                return;
 
@@ -922,14 +932,18 @@ static void __init prom_instantiate_rtas(void)
                prom_printf("RTAS allocation failed !\n");
                return;
        }
-       prom_printf("instantiating rtas at 0x%x", base);
 
-       rtas_node = call_prom("open", 1, 1, ADDR("/rtas"));
-       prom_printf("...");
+       rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
+       if (!IHANDLE_VALID(rtas_inst)) {
+               prom_printf("opening rtas package failed");
+               return;
+       }
+
+       prom_printf("instantiating rtas at 0x%x ...", base);
 
        if (call_prom("call-method", 3, 2,
                      ADDR("instantiate-rtas"),
-                     rtas_node, base) != PROM_ERROR) {
+                     rtas_inst, base) != PROM_ERROR) {
                entry = (long)_prom->args.rets[1];
        }
        if (entry == 0) {
@@ -940,8 +954,8 @@ static void __init prom_instantiate_rtas(void)
 
        reserve_mem(base, size);
 
-       prom_setprop(prom_rtas, "linux,rtas-base", &base, sizeof(base));
-       prom_setprop(prom_rtas, "linux,rtas-entry", &entry, sizeof(entry));
+       prom_setprop(rtas_node, "linux,rtas-base", &base, sizeof(base));
+       prom_setprop(rtas_node, "linux,rtas-entry", &entry, sizeof(entry));
 
        prom_debug("rtas base     = 0x%x\n", base);
        prom_debug("rtas entry    = 0x%x\n", entry);
@@ -1062,7 +1076,7 @@ static void __init prom_initialize_tce_table(void)
 
                prom_printf("opening PHB %s", path);
                phb_node = call_prom("open", 1, 1, path);
-               if ( (long)phb_node <= 0)
+               if (phb_node == 0)
                        prom_printf("... failed\n");
                else
                        prom_printf("... done\n");
@@ -1279,12 +1293,12 @@ static void __init prom_init_client_services(unsigned long pp)
 
        /* get a handle for the stdout device */
        _prom->chosen = call_prom("finddevice", 1, 1, ADDR("/chosen"));
-       if ((long)_prom->chosen <= 0)
+       if (!PHANDLE_VALID(_prom->chosen))
                prom_panic("cannot find chosen"); /* msg won't be printed :( */
 
        /* get device tree root */
        _prom->root = call_prom("finddevice", 1, 1, ADDR("/"));
-       if ((long)_prom->root <= 0)
+       if (!PHANDLE_VALID(_prom->root))
                prom_panic("cannot find device tree root"); /* msg won't be printed :( */
 }
 
@@ -1356,9 +1370,8 @@ static int __init prom_find_machine_type(void)
        }
        /* Default to pSeries. We need to know if we are running LPAR */
        rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
-       if (rtas != (phandle) -1) {
-               unsigned long x;
-               x = prom_getproplen(rtas, "ibm,hypertas-functions");
+       if (PHANDLE_VALID(rtas)) {
+               int x = prom_getproplen(rtas, "ibm,hypertas-functions");
                if (x != PROM_ERROR) {
                        prom_printf("Hypertas detected, assuming LPAR !\n");
                        return PLATFORM_PSERIES_LPAR;
@@ -1426,12 +1439,13 @@ static void __init prom_check_displays(void)
                 * leave some room at the end of the path for appending extra
                 * arguments
                 */
-               if (call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-10) < 0)
+               if (call_prom("package-to-path", 3, 1, node, path,
+                             PROM_SCRATCH_SIZE-10) == PROM_ERROR)
                        continue;
                prom_printf("found display   : %s, opening ... ", path);
                
                ih = call_prom("open", 1, 1, path);
-               if (ih == (ihandle)0 || ih == (ihandle)-1) {
+               if (ih == 0) {
                        prom_printf("failed\n");
                        continue;
                }
@@ -1514,6 +1528,12 @@ static unsigned long __init dt_find_string(char *str)
        return 0;
 }
 
+/*
+ * The Open Firmware 1275 specification states properties must be 31 bytes or
+ * less, however not all firmwares obey this. Make it 64 bytes to be safe.
+ */
+#define MAX_PROPERTY_NAME 64
+
 static void __init scan_dt_build_strings(phandle node, unsigned long *mem_start,
                                         unsigned long *mem_end)
 {
@@ -1527,10 +1547,12 @@ static void __init scan_dt_build_strings(phandle node, unsigned long *mem_start,
        /* get and store all property names */
        prev_name = RELOC("");
        for (;;) {
-               
-               /* 32 is max len of name including nul. */
-               namep = make_room(mem_start, mem_end, 32, 1);
-               if (call_prom("nextprop", 3, 1, node, prev_name, namep) <= 0) {
+               int rc;
+
+               /* 64 is max len of name including nul. */
+               namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1);
+               rc = call_prom("nextprop", 3, 1, node, prev_name, namep);
+               if (rc != 1) {
                        /* No more nodes: unwind alloc */
                        *mem_start = (unsigned long)namep;
                        break;
@@ -1555,18 +1577,12 @@ static void __init scan_dt_build_strings(phandle node, unsigned long *mem_start,
        }
 }
 
-/*
- * The Open Firmware 1275 specification states properties must be 31 bytes or
- * less, however not all firmwares obey this. Make it 64 bytes to be safe.
- */
-#define MAX_PROPERTY_NAME 64
-
 static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
                                        unsigned long *mem_end)
 {
        int l, align;
        phandle child;
-       char *namep, *prev_name, *sstart;
+       char *namep, *prev_name, *sstart, *p, *ep;
        unsigned long soff;
        unsigned char *valp;
        unsigned long offset = reloc_offset();
@@ -1588,6 +1604,14 @@ static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
                        call_prom("package-to-path", 3, 1, node, namep, l);
                }
                namep[l] = '\0';
+               /* Fixup an Apple bug where they have bogus \0 chars in the
+                * middle of the path in some properties
+                */
+               for (p = namep, ep = namep + l; p < ep; p++)
+                       if (*p == '\0') {
+                               memmove(p, p+1, ep - p);
+                               ep--; l--;
+                       }
                *mem_start = _ALIGN(((unsigned long) namep) + strlen(namep) + 1, 4);
        }
 
@@ -1599,7 +1623,10 @@ static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
        prev_name = RELOC("");
        sstart = (char *)RELOC(dt_string_start);
        for (;;) {
-               if (call_prom("nextprop", 3, 1, node, prev_name, pname) <= 0)
+               int rc;
+
+               rc = call_prom("nextprop", 3, 1, node, prev_name, pname);
+               if (rc != 1)
                        break;
 
                /* find string offset */
@@ -1615,7 +1642,7 @@ static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
                l = call_prom("getproplen", 2, 1, node, pname);
 
                /* sanity checks */
-               if (l < 0)
+               if (l == PROM_ERROR)
                        continue;
                if (l > MAX_PROPERTY_LENGTH) {
                        prom_printf("WARNING: ignoring large property ");
@@ -1750,7 +1777,45 @@ static void __init flatten_device_tree(void)
        prom_printf("Device tree struct  0x%x -> 0x%x\n",
                    RELOC(dt_struct_start), RELOC(dt_struct_end));
 
- }
+}
+
+
+static void __init fixup_device_tree(void)
+{
+       unsigned long offset = reloc_offset();
+       phandle u3, i2c, mpic;
+       u32 u3_rev;
+       u32 interrupts[2];
+       u32 parent;
+
+       /* Some G5s have a missing interrupt definition, fix it up here */
+       u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000"));
+       if (!PHANDLE_VALID(u3))
+               return;
+       i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000"));
+       if (!PHANDLE_VALID(i2c))
+               return;
+       mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000"));
+       if (!PHANDLE_VALID(mpic))
+               return;
+
+       /* check if proper rev of u3 */
+       if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
+           == PROM_ERROR)
+               return;
+       if (u3_rev != 0x35)
+               return;
+       /* does it need fixup ? */
+       if (prom_getproplen(i2c, "interrupts") > 0)
+               return;
+       /* interrupt on this revision of u3 is number 0 and level */
+       interrupts[0] = 0;
+       interrupts[1] = 1;
+       prom_setprop(i2c, "interrupts", &interrupts, sizeof(interrupts));
+       parent = (u32)mpic;
+       prom_setprop(i2c, "interrupt-parent", &parent, sizeof(parent));
+}
+
 
 static void __init prom_find_boot_cpu(void)
 {
@@ -1843,6 +1908,12 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, unsigned long
        prom_setprop(_prom->chosen, "linux,platform",
                     &getprop_rval, sizeof(getprop_rval));
 
+       /*
+        * On pSeries, inform the firmware about our capabilities
+        */
+       if (RELOC(of_platform) & PLATFORM_PSERIES)
+               prom_send_capabilities();
+
        /*
         * On pSeries, copy the CPU hold code
         */
@@ -1919,6 +1990,11 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, unsigned long
                        PTRRELOC(&prom_tce_alloc_end), sizeof(RELOC(prom_tce_alloc_end)));
        }
 
+       /*
+        * Fixup any known bugs in the device-tree
+        */
+       fixup_device_tree();
+
        /*
         * Now finally create the flattened device-tree
         */
index 1c4c796b212b03ada36dae8130913bc95d1671ff..3c00f7bfc1b5736d43ab2011e3ac37aafe6da9cf 100644 (file)
@@ -47,7 +47,6 @@
 #include <asm/cache.h>
 #include <asm/prom.h>
 #include <asm/ptrace.h>
-#include <asm/iSeries/LparData.h>
 #include <asm/machdep.h>
 #include <asm/rtas.h>
 #include <asm/ppcdebug.h>
index ff65dc33320ee779bf89b4b602d64da4d22a003b..b0c3b829fe47c43eac16b7d5ff9d885f0fd1b5c4 100644 (file)
@@ -440,7 +440,7 @@ static int rtasd(void *unused)
                goto error;
        }
 
-       printk(KERN_ERR "RTAS daemon started\n");
+       printk(KERN_INFO "RTAS daemon started\n");
 
        DEBUG("will sleep for %d jiffies\n", (HZ*60/rtas_event_scan_rate) / 2);
 
@@ -485,7 +485,7 @@ static int __init rtas_init(void)
        /* No RTAS, only warn if we are on a pSeries box  */
        if (rtas_token("event-scan") == RTAS_UNKNOWN_SERVICE) {
                if (systemcfg->platform & PLATFORM_PSERIES)
-                       printk(KERN_ERR "rtasd: no event-scan on system\n");
+                       printk(KERN_INFO "rtasd: no event-scan on system\n");
                return 1;
        }
 
index 3e70b91375fcb808464c190b5e39e1dc72ed9d15..de02aedbe08085e5955a53f90dcaa924ecf53f94 100644 (file)
 #include <asm/time.h>
 #include <asm/rtas.h>
 
-#include <asm/iSeries/LparData.h>
 #include <asm/iSeries/mf.h>
 #include <asm/machdep.h>
-#include <asm/iSeries/ItSpCommArea.h>
 
 extern int piranha_simulator;
 
@@ -292,47 +290,10 @@ int iSeries_set_rtc_time(struct rtc_time *tm)
 
 void iSeries_get_boot_time(struct rtc_time *tm)
 {
-       unsigned long time;
-       static unsigned long lastsec = 1;
-
-       u32 dataWord1 = *((u32 *)(&xSpCommArea.xBcdTimeAtIplStart));
-       u32 dataWord2 = *(((u32 *)&(xSpCommArea.xBcdTimeAtIplStart)) + 1);
-       int year = 1970;
-       int year1 = ( dataWord1 >> 24 ) & 0x000000FF;
-       int year2 = ( dataWord1 >> 16 ) & 0x000000FF;
-       int sec = ( dataWord1 >> 8 ) & 0x000000FF;
-       int min = dataWord1 & 0x000000FF;
-       int hour = ( dataWord2 >> 24 ) & 0x000000FF;
-       int day = ( dataWord2 >> 8 ) & 0x000000FF;
-       int mon = dataWord2 & 0x000000FF;
-
        if ( piranha_simulator )
                return;
 
-       BCD_TO_BIN(sec);
-       BCD_TO_BIN(min);
-       BCD_TO_BIN(hour);
-       BCD_TO_BIN(day);
-       BCD_TO_BIN(mon);
-       BCD_TO_BIN(year1);
-       BCD_TO_BIN(year2);
-       year = year1 * 100 + year2;
-
-       time = mktime(year, mon, day, hour, min, sec);
-       time += ( jiffies / HZ );
-
-       /* Now THIS is a nasty hack!
-       * It ensures that the first two calls get different answers.  
-       * That way the loop in init_time (time.c) will not think
-       * the clock is stuck.
-       */
-       if ( lastsec ) {
-               time -= lastsec;
-               --lastsec;
-       }
-
-       to_tm(time, tm); 
-       tm->tm_year -= 1900;
+       mf_get_boot_rtc(tm);
        tm->tm_mon  -= 1;
 }
 #endif
index 21c57f539c29305b1bf7ecef8c8a7a5b72a33046..8e439a8176421ac6009f7b569207afe07b9ae730 100644 (file)
@@ -41,7 +41,6 @@
 #include <asm/smp.h>
 #include <asm/elf.h>
 #include <asm/machdep.h>
-#include <asm/iSeries/LparData.h>
 #include <asm/paca.h>
 #include <asm/ppcdebug.h>
 #include <asm/time.h>
@@ -57,6 +56,8 @@
 #include <asm/cache.h>
 #include <asm/page.h>
 #include <asm/mmu.h>
+#include <asm/lmb.h>
+#include <asm/iSeries/ItLpNaca.h>
 
 #ifdef DEBUG
 #define DBG(fmt...) udbg_printf(fmt)
@@ -103,11 +104,6 @@ extern void unflatten_device_tree(void);
 
 extern void smp_release_cpus(void);
 
-unsigned long decr_overclock = 1;
-unsigned long decr_overclock_proc0 = 1;
-unsigned long decr_overclock_set = 0;
-unsigned long decr_overclock_proc0_set = 0;
-
 int have_of = 1;
 int boot_cpuid = 0;
 int boot_cpuid_phys = 0;
@@ -1120,64 +1116,15 @@ void ppc64_dump_msg(unsigned int src, const char *msg)
        printk("[dump]%04x %s\n", src, msg);
 }
 
-int set_spread_lpevents( char * str )
-{
-       /* The parameter is the number of processors to share in processing lp events */
-       unsigned long i;
-       unsigned long val = simple_strtoul( str, NULL, 0 );
-       if ( ( val > 0 ) && ( val <= NR_CPUS ) ) {
-               for ( i=1; i<val; ++i )
-                       paca[i].lpqueue_ptr = paca[0].lpqueue_ptr;
-               printk("lpevent processing spread over %ld processors\n", val);
-       }
-       else
-               printk("invalid spreaqd_lpevents %ld\n", val);
-       return 1;
-}      
-
 /* This should only be called on processor 0 during calibrate decr */
 void setup_default_decr(void)
 {
        struct paca_struct *lpaca = get_paca();
 
-       if ( decr_overclock_set && !decr_overclock_proc0_set )
-               decr_overclock_proc0 = decr_overclock;
-
-       lpaca->default_decr = tb_ticks_per_jiffy / decr_overclock_proc0;        
+       lpaca->default_decr = tb_ticks_per_jiffy;
        lpaca->next_jiffy_update_tb = get_tb() + tb_ticks_per_jiffy;
 }
 
-int set_decr_overclock_proc0( char * str )
-{
-       unsigned long val = simple_strtoul( str, NULL, 0 );
-       if ( ( val >= 1 ) && ( val <= 48 ) ) {
-               decr_overclock_proc0_set = 1;
-               decr_overclock_proc0 = val;
-               printk("proc 0 decrementer overclock factor of %ld\n", val);
-       }
-       else
-               printk("invalid proc 0 decrementer overclock factor of %ld\n", val);
-       return 1;
-}
-
-int set_decr_overclock( char * str )
-{
-       unsigned long val = simple_strtoul( str, NULL, 0 );
-       if ( ( val >= 1 ) && ( val <= 48 ) ) {
-               decr_overclock_set = 1;
-               decr_overclock = val;
-               printk("decrementer overclock factor of %ld\n", val);
-       }
-       else
-               printk("invalid decrementer overclock factor of %ld\n", val);
-       return 1;
-
-}
-
-__setup("spread_lpevents=", set_spread_lpevents );
-__setup("decr_overclock_proc0=", set_decr_overclock_proc0 );
-__setup("decr_overclock=", set_decr_overclock );
-
 #ifndef CONFIG_PPC_ISERIES
 /*
  * This function can be used by platforms to "find" legacy serial ports.
index 3b906cd940378086b84d18f2d0b71c70a33308cc..9ef5d36d6b253d38127cc026554e2d0e698f87d5 100644 (file)
@@ -334,7 +334,6 @@ void smp_call_function_interrupt(void)
        }
 }
 
-extern unsigned long decr_overclock;
 extern struct gettimeofday_struct do_gtod;
 
 struct thread_info *current_set[NR_CPUS];
@@ -491,7 +490,7 @@ int __devinit __cpu_up(unsigned int cpu)
        if (smp_ops->cpu_bootable && !smp_ops->cpu_bootable(cpu))
                return -EINVAL;
 
-       paca[cpu].default_decr = tb_ticks_per_jiffy / decr_overclock;
+       paca[cpu].default_decr = tb_ticks_per_jiffy;
 
        if (!cpu_has_feature(CPU_FTR_SLB)) {
                void *tmp;
index 7cf7a9600025bdfeb793fbb43dbb2b11c22ea743..118436e8085ae79d31bb8de5ee28b8196c8a645a 100644 (file)
@@ -741,6 +741,7 @@ asmlinkage int sys32_pciconfig_write(u32 bus, u32 dfn, u32 off, u32 len, u32 ubu
 
 asmlinkage int sys32_pciconfig_iobase(u32 which, u32 in_bus, u32 in_devfn)
 {
+#ifdef CONFIG_PCI
        struct pci_controller* hose;
        struct list_head *ln;
        struct pci_bus *bus = NULL;
@@ -786,36 +787,11 @@ asmlinkage int sys32_pciconfig_iobase(u32 which, u32 in_bus, u32 in_devfn)
        case IOBASE_ISA_MEM:
                return -EINVAL;
        }
-
+#endif /* CONFIG_PCI */
        return -EOPNOTSUPP;
 }
 
 
-asmlinkage int ppc64_newuname(struct new_utsname __user * name)
-{
-       int errno = sys_newuname(name);
-
-       if (current->personality == PER_LINUX32 && !errno) {
-               if(copy_to_user(name->machine, "ppc\0\0", 8)) {
-                       errno = -EFAULT;
-               }
-       }
-       return errno;
-}
-
-asmlinkage int ppc64_personality(unsigned long personality)
-{
-       int ret;
-       if (current->personality == PER_LINUX32 && personality == PER_LINUX)
-               personality = PER_LINUX32;
-       ret = sys_personality(personality);
-       if (ret == PER_LINUX32)
-               ret = PER_LINUX;
-       return ret;
-}
-
-
-
 /* Note: it is necessary to treat mode as an unsigned int,
  * with the corresponding cast to a signed int to insure that the 
  * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
@@ -1158,26 +1134,47 @@ asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args)
 }
 #endif
 
+asmlinkage int sys32_uname(struct old_utsname __user * name)
+{
+       int err = 0;
+       
+       down_read(&uts_sem);
+       if (copy_to_user(name, &system_utsname, sizeof(*name)))
+               err = -EFAULT;
+       up_read(&uts_sem);
+       if (!err && personality(current->personality) == PER_LINUX32) {
+               /* change "ppc64" to "ppc" */
+               if (__put_user(0, name->machine + 3)
+                   || __put_user(0, name->machine + 4))
+                       err = -EFAULT;
+       }
+       return err;
+}
+
 asmlinkage int sys32_olduname(struct oldold_utsname __user * name)
 {
        int error;
-       
-       if (!name)
-               return -EFAULT;
+
        if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname)))
                return -EFAULT;
   
        down_read(&uts_sem);
        error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN);
-       error -= __put_user(0,name->sysname+__OLD_UTS_LEN);
-       error -= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN);
-       error -= __put_user(0,name->nodename+__OLD_UTS_LEN);
-       error -= __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN);
-       error -= __put_user(0,name->release+__OLD_UTS_LEN);
-       error -= __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN);
-       error -= __put_user(0,name->version+__OLD_UTS_LEN);
-       error -= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN);
-       error = __put_user(0,name->machine+__OLD_UTS_LEN);
+       error |= __put_user(0,name->sysname+__OLD_UTS_LEN);
+       error |= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN);
+       error |= __put_user(0,name->nodename+__OLD_UTS_LEN);
+       error |= __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN);
+       error |= __put_user(0,name->release+__OLD_UTS_LEN);
+       error |= __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN);
+       error |= __put_user(0,name->version+__OLD_UTS_LEN);
+       error |= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN);
+       error |= __put_user(0,name->machine+__OLD_UTS_LEN);
+       if (personality(current->personality) == PER_LINUX32) {
+               /* change "ppc64" to "ppc" */
+               error |= __put_user(0, name->machine + 3);
+               error |= __put_user(0, name->machine + 4);
+       }
+       
        up_read(&uts_sem);
 
        error = error ? -EFAULT : 0;
index f2865ff8d2f93863c1d8eb4416f02a82e9a68ad2..a8cbb202b8cd482f8deb05e68287341600c44637 100644 (file)
@@ -199,24 +199,33 @@ out:
        return ret;
 }
 
-static int __init set_fakeppc(char *str)
+long ppc64_personality(unsigned long personality)
 {
-       if (*str)
-               return 0;
-       init_task.personality = PER_LINUX32;
-       return 1;
+       long ret;
+
+       if (personality(current->personality) == PER_LINUX32
+           && personality == PER_LINUX)
+               personality = PER_LINUX32;
+       ret = sys_personality(personality);
+       if (ret == PER_LINUX32)
+               ret = PER_LINUX;
+       return ret;
 }
-__setup("fakeppc", set_fakeppc);
 
-asmlinkage int sys_uname(struct old_utsname __user * name)
+long ppc64_newuname(struct new_utsname __user * name)
 {
-       int err = -EFAULT;
-       
+       int err = 0;
+
        down_read(&uts_sem);
-       if (name && !copy_to_user(name, &system_utsname, sizeof (*name)))
-               err = 0;
+       if (copy_to_user(name, &system_utsname, sizeof(*name)))
+               err = -EFAULT;
        up_read(&uts_sem);
-       
+       if (!err && personality(current->personality) == PER_LINUX32) {
+               /* change ppc64 to ppc */
+               if (__put_user(0, name->machine + 3)
+                   || __put_user(0, name->machine + 4))
+                       err = -EFAULT;
+       }
        return err;
 }
 
index 0925694c3ce5e7873438ae300075a80d648e7657..c8fa6569b2fd789fc3476a3c5ab86c3bf6b3c203 100644 (file)
@@ -113,7 +113,6 @@ void ppc64_enable_pmcs(void)
 #ifdef CONFIG_PPC_PSERIES
        unsigned long set, reset;
        int ret;
-       unsigned int ctrl;
 #endif /* CONFIG_PPC_PSERIES */
 
        /* Only need to enable them once */
@@ -167,11 +166,8 @@ void ppc64_enable_pmcs(void)
         * On SMT machines we have to set the run latch in the ctrl register
         * in order to make PMC6 spin.
         */
-       if (cpu_has_feature(CPU_FTR_SMT)) {
-               ctrl = mfspr(CTRLF);
-               ctrl |= RUNLATCH;
-               mtspr(CTRLT, ctrl);
-       }
+       if (cpu_has_feature(CPU_FTR_SMT))
+               ppc64_runlatch_on();
 #endif /* CONFIG_PPC_PSERIES */
 }
 
index 772a465b49f9c2d65636e71d27b7f4ca70f6c17f..33364a7d2cd2e07dbcdd8567d669da11439b5038 100644 (file)
@@ -325,9 +325,7 @@ int timer_interrupt(struct pt_regs * regs)
 
        irq_enter();
 
-#ifndef CONFIG_PPC_ISERIES
        profile_tick(CPU_PROFILING, regs);
-#endif
 
        lpaca->lppaca.int_dword.fields.decr_int = 0;
 
@@ -515,6 +513,7 @@ void __init time_init(void)
        do_gtod.varp = &do_gtod.vars[0];
        do_gtod.var_idx = 0;
        do_gtod.varp->tb_orig_stamp = tb_last_stamp;
+       get_paca()->next_jiffy_update_tb = tb_last_stamp + tb_ticks_per_jiffy;
        do_gtod.varp->stamp_xsec = xtime.tv_sec * XSEC_PER_SEC;
        do_gtod.tb_ticks_per_sec = tb_ticks_per_sec;
        do_gtod.varp->tb_to_xs = tb_to_xs;
index cdd830cb2768b6de5e2642022b383a78941935eb..0c0ba71ac0e8b79cd2a29b8fffd8d4f177ac006b 100644 (file)
@@ -41,20 +41,25 @@ static const struct vio_device_id *vio_match_device(
 static struct iommu_table *vio_build_iommu_table(struct vio_dev *);
 static int vio_num_address_cells;
 #endif
-static struct vio_dev *vio_bus_device; /* fake "parent" device */
-
 #ifdef CONFIG_PPC_ISERIES
-static struct vio_dev *__init vio_register_device_iseries(char *type,
-               uint32_t unit_num);
-
 static struct iommu_table veth_iommu_table;
 static struct iommu_table vio_iommu_table;
-
-static struct vio_dev _vio_dev  = {
+#endif
+static struct vio_dev vio_bus_device  = { /* fake "parent" device */
+       .name = vio_bus_device.dev.bus_id,
+       .type = "",
+#ifdef CONFIG_PPC_ISERIES
        .iommu_table = &vio_iommu_table,
-       .dev.bus = &vio_bus_type
+#endif
+       .dev.bus_id = "vio",
+       .dev.bus = &vio_bus_type,
 };
-struct device *iSeries_vio_dev = &_vio_dev.dev;
+
+#ifdef CONFIG_PPC_ISERIES
+static struct vio_dev *__init vio_register_device_iseries(char *type,
+               uint32_t unit_num);
+
+struct device *iSeries_vio_dev = &vio_bus_device.dev;
 EXPORT_SYMBOL(iSeries_vio_dev);
 
 #define device_is_compatible(a, b)     1
@@ -260,18 +265,10 @@ static int __init vio_bus_init(void)
        }
 
        /* the fake parent of all vio devices, just to give us a nice directory */
-       vio_bus_device = kmalloc(sizeof(struct vio_dev), GFP_KERNEL);
-       if (!vio_bus_device) {
-               return 1;
-       }
-       memset(vio_bus_device, 0, sizeof(struct vio_dev));
-       strcpy(vio_bus_device->dev.bus_id, "vio");
-
-       err = device_register(&vio_bus_device->dev);
+       err = device_register(&vio_bus_device.dev);
        if (err) {
                printk(KERN_WARNING "%s: device_register returned %i\n", __FUNCTION__,
                        err);
-               kfree(vio_bus_device);
                return err;
        }
 
@@ -300,7 +297,7 @@ static void __devinit vio_dev_release(struct device *dev)
 }
 
 #ifdef CONFIG_PPC_PSERIES
-static ssize_t viodev_show_devspec(struct device *dev, char *buf)
+static ssize_t viodev_show_devspec(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct device_node *of_node = dev->platform_data;
 
@@ -309,7 +306,7 @@ static ssize_t viodev_show_devspec(struct device *dev, char *buf)
 DEVICE_ATTR(devspec, S_IRUSR | S_IRGRP | S_IROTH, viodev_show_devspec, NULL);
 #endif
 
-static ssize_t viodev_show_name(struct device *dev, char *buf)
+static ssize_t viodev_show_name(struct device *dev, struct device_attribute *attr, char *buf)
 {
        return sprintf(buf, "%s\n", to_vio_dev(dev)->name);
 }
@@ -326,7 +323,7 @@ static struct vio_dev * __devinit vio_register_device_common(
        viodev->unit_address = unit_address;
        viodev->iommu_table = iommu_table;
        /* init generic 'struct device' fields: */
-       viodev->dev.parent = &vio_bus_device->dev;
+       viodev->dev.parent = &vio_bus_device.dev;
        viodev->dev.bus = &vio_bus_type;
        viodev->dev.release = vio_dev_release;
 
@@ -636,5 +633,3 @@ struct bus_type vio_bus_type = {
        .name = "vio",
        .match = vio_bus_match,
 };
-
-EXPORT_SYMBOL(vio_bus_type);
index 2ed8ee075680557c88c2a4641fd0c9afa1225f85..2a6c4f01c45ed6d320581fdd62eaa2698ce155d9 100644 (file)
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <asm/iSeries/HvTypes.h>
-#include <asm/iSeries/LparData.h>
+#include <asm/iSeries/ItExtVpdPanel.h>
 #include <asm/iSeries/HvLpEvent.h>
 #include <asm/iSeries/HvLpConfig.h>
-#include <asm/iSeries/HvCallCfg.h>
 #include <asm/iSeries/mf.h>
-#include <asm/iSeries/iSeries_proc.h>
 #include <asm/iSeries/vio.h>
 
 /* Status of the path to each other partition in the system.
@@ -365,7 +363,7 @@ void vio_set_hostlp(void)
         * while we're active
         */
        viopath_ourLp = HvLpConfig_getLpIndex();
-       viopath_hostLp = HvCallCfg_getHostingLpIndex(viopath_ourLp);
+       viopath_hostLp = HvLpConfig_getHostingLpIndex(viopath_ourLp);
 
        if (viopath_hostLp != HvLpIndexInvalid)
                vio_setHandler(viomajorsubtype_config, handleConfig);
@@ -487,7 +485,7 @@ int viopath_open(HvLpIndex remoteLp, int subtype, int numReq)
        unsigned long flags;
        int tempNumAllocated;
 
-       if ((remoteLp >= HvMaxArchitectedLps) || (remoteLp == HvLpIndexInvalid))
+       if ((remoteLp >= HVMAXARCHITECTEDLPS) || (remoteLp == HvLpIndexInvalid))
                return -EINVAL;
 
        subtype = subtype >> VIOMAJOR_SUBTYPE_SHIFT;
@@ -558,7 +556,7 @@ int viopath_close(HvLpIndex remoteLp, int subtype, int numReq)
        int numOpen;
        struct alloc_parms parms;
 
-       if ((remoteLp >= HvMaxArchitectedLps) || (remoteLp == HvLpIndexInvalid))
+       if ((remoteLp >= HVMAXARCHITECTEDLPS) || (remoteLp == HvLpIndexInvalid))
                return -EINVAL;
 
        subtype = subtype >> VIOMAJOR_SUBTYPE_SHIFT;
index bf7b5bbfc04e6338a286ff53ecca9b039b78bcf0..76fbfa9f706fb4c220036244b882290c56be22a6 100644 (file)
@@ -12,7 +12,7 @@ lib-$(CONFIG_SMP) += locks.o
 
 # e2a provides EBCDIC to ASCII conversions.
 ifdef CONFIG_PPC_ISERIES
-obj-$(CONFIG_PCI)      += e2a.o
+obj-y += e2a.o
 endif
 
 lib-$(CONFIG_DEBUG_KERNEL) += sstep.o
index 0a0f97008d02bc383e2b45aaf10cab443dea9561..1647b1c6f28e84453b314669bfda90c0a12b83f7 100644 (file)
@@ -195,7 +195,7 @@ void __init htab_initialize(void)
                memset((void *)table, 0, htab_size_bytes);
        }
 
-       mode_rw = _PAGE_ACCESSED | _PAGE_COHERENT | PP_RWXX;
+       mode_rw = _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_COHERENT | PP_RWXX;
 
        /* On U3 based machines, we need to reserve the DART area and
         * _NOT_ map it to avoid cache paradoxes as it's remapped non
@@ -310,10 +310,6 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
 
                vsid = get_vsid(mm->context.id, ea);
                break;
-       case IO_REGION_ID:
-               mm = &ioremap_mm;
-               vsid = get_kernel_vsid(ea);
-               break;
        case VMALLOC_REGION_ID:
                mm = &init_mm;
                vsid = get_kernel_vsid(ea);
index d3bf86a5c1ad40a745ded13bdf9d9b6aa80da0c8..fdcfe97c75c1dbc388cec0fe261ce446e82ab3e3 100644 (file)
@@ -121,7 +121,7 @@ static pte_t *hugepte_alloc(struct mm_struct *mm, pud_t *dir, unsigned long addr
        return hugepte_offset(dir, addr);
 }
 
-static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
+pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
 {
        pud_t *pud;
 
@@ -134,7 +134,7 @@ static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
        return hugepte_offset(pud, addr);
 }
 
-static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
+pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
 {
        pud_t *pud;
 
@@ -147,25 +147,6 @@ static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
        return hugepte_alloc(mm, pud, addr);
 }
 
-static void set_huge_pte(struct mm_struct *mm, struct vm_area_struct *vma,
-                        unsigned long addr, struct page *page,
-                        pte_t *ptep, int write_access)
-{
-       pte_t entry;
-
-       add_mm_counter(mm, rss, HPAGE_SIZE / PAGE_SIZE);
-       if (write_access) {
-               entry =
-                   pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
-       } else {
-               entry = pte_wrprotect(mk_pte(page, vma->vm_page_prot));
-       }
-       entry = pte_mkyoung(entry);
-       entry = pte_mkhuge(entry);
-
-       set_pte_at(mm, addr, ptep, entry);
-}
-
 /*
  * This function checks for proper alignment of input addr and len parameters.
  */
@@ -259,80 +240,6 @@ int prepare_hugepage_range(unsigned long addr, unsigned long len)
        return -EINVAL;
 }
 
-int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
-                       struct vm_area_struct *vma)
-{
-       pte_t *src_pte, *dst_pte, entry;
-       struct page *ptepage;
-       unsigned long addr = vma->vm_start;
-       unsigned long end = vma->vm_end;
-       int err = -ENOMEM;
-
-       while (addr < end) {
-               dst_pte = huge_pte_alloc(dst, addr);
-               if (!dst_pte)
-                       goto out;
-
-               src_pte = huge_pte_offset(src, addr);
-               entry = *src_pte;
-               
-               ptepage = pte_page(entry);
-               get_page(ptepage);
-               add_mm_counter(dst, rss, HPAGE_SIZE / PAGE_SIZE);
-               set_pte_at(dst, addr, dst_pte, entry);
-
-               addr += HPAGE_SIZE;
-       }
-
-       err = 0;
- out:
-       return err;
-}
-
-int
-follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma,
-                   struct page **pages, struct vm_area_struct **vmas,
-                   unsigned long *position, int *length, int i)
-{
-       unsigned long vpfn, vaddr = *position;
-       int remainder = *length;
-
-       WARN_ON(!is_vm_hugetlb_page(vma));
-
-       vpfn = vaddr/PAGE_SIZE;
-       while (vaddr < vma->vm_end && remainder) {
-               if (pages) {
-                       pte_t *pte;
-                       struct page *page;
-
-                       pte = huge_pte_offset(mm, vaddr);
-
-                       /* hugetlb should be locked, and hence, prefaulted */
-                       WARN_ON(!pte || pte_none(*pte));
-
-                       page = &pte_page(*pte)[vpfn % (HPAGE_SIZE/PAGE_SIZE)];
-
-                       WARN_ON(!PageCompound(page));
-
-                       get_page(page);
-                       pages[i] = page;
-               }
-
-               if (vmas)
-                       vmas[i] = vma;
-
-               vaddr += PAGE_SIZE;
-               ++vpfn;
-               --remainder;
-               ++i;
-       }
-
-       *length = remainder;
-       *position = vaddr;
-
-       return i;
-}
-
 struct page *
 follow_huge_addr(struct mm_struct *mm, unsigned long address, int write)
 {
@@ -363,89 +270,6 @@ follow_huge_pmd(struct mm_struct *mm, unsigned long address,
        return NULL;
 }
 
-void unmap_hugepage_range(struct vm_area_struct *vma,
-                         unsigned long start, unsigned long end)
-{
-       struct mm_struct *mm = vma->vm_mm;
-       unsigned long addr;
-       pte_t *ptep;
-       struct page *page;
-
-       WARN_ON(!is_vm_hugetlb_page(vma));
-       BUG_ON((start % HPAGE_SIZE) != 0);
-       BUG_ON((end % HPAGE_SIZE) != 0);
-
-       for (addr = start; addr < end; addr += HPAGE_SIZE) {
-               pte_t pte;
-
-               ptep = huge_pte_offset(mm, addr);
-               if (!ptep || pte_none(*ptep))
-                       continue;
-
-               pte = *ptep;
-               page = pte_page(pte);
-               pte_clear(mm, addr, ptep);
-
-               put_page(page);
-       }
-       add_mm_counter(mm, rss, -((end - start) >> PAGE_SHIFT));
-       flush_tlb_pending();
-}
-
-int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
-{
-       struct mm_struct *mm = current->mm;
-       unsigned long addr;
-       int ret = 0;
-
-       WARN_ON(!is_vm_hugetlb_page(vma));
-       BUG_ON((vma->vm_start % HPAGE_SIZE) != 0);
-       BUG_ON((vma->vm_end % HPAGE_SIZE) != 0);
-
-       spin_lock(&mm->page_table_lock);
-       for (addr = vma->vm_start; addr < vma->vm_end; addr += HPAGE_SIZE) {
-               unsigned long idx;
-               pte_t *pte = huge_pte_alloc(mm, addr);
-               struct page *page;
-
-               if (!pte) {
-                       ret = -ENOMEM;
-                       goto out;
-               }
-               if (! pte_none(*pte))
-                       continue;
-
-               idx = ((addr - vma->vm_start) >> HPAGE_SHIFT)
-                       + (vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT));
-               page = find_get_page(mapping, idx);
-               if (!page) {
-                       /* charge the fs quota first */
-                       if (hugetlb_get_quota(mapping)) {
-                               ret = -ENOMEM;
-                               goto out;
-                       }
-                       page = alloc_huge_page();
-                       if (!page) {
-                               hugetlb_put_quota(mapping);
-                               ret = -ENOMEM;
-                               goto out;
-                       }
-                       ret = add_to_page_cache(page, mapping, idx, GFP_ATOMIC);
-                       if (! ret) {
-                               unlock_page(page);
-                       } else {
-                               hugetlb_put_quota(mapping);
-                               free_huge_page(page);
-                               goto out;
-                       }
-               }
-               set_huge_pte(mm, vma, addr, page, pte, vma->vm_flags & VM_WRITE);
-       }
-out:
-       spin_unlock(&mm->page_table_lock);
-       return ret;
-}
-
 /* Because we have an exclusive hugepage region which lies within the
  * normal user address space, we have to take special measures to make
  * non-huge mmap()s evade the hugepage reserved regions. */
@@ -468,7 +292,12 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
                    && !is_hugepage_only_range(mm, addr,len))
                        return addr;
        }
-       start_addr = addr = mm->free_area_cache;
+       if (len > mm->cached_hole_size) {
+               start_addr = addr = mm->free_area_cache;
+       } else {
+               start_addr = addr = TASK_UNMAPPED_BASE;
+               mm->cached_hole_size = 0;
+       }
 
 full_search:
        vma = find_vma(mm, addr);
@@ -492,6 +321,8 @@ full_search:
                        mm->free_area_cache = addr + len;
                        return addr;
                }
+               if (addr + mm->cached_hole_size < vma->vm_start)
+                       mm->cached_hole_size = vma->vm_start - addr;
                addr = vma->vm_end;
                vma = vma->vm_next;
        }
@@ -499,6 +330,7 @@ full_search:
        /* Make sure we didn't miss any holes */
        if (start_addr != TASK_UNMAPPED_BASE) {
                start_addr = addr = TASK_UNMAPPED_BASE;
+               mm->cached_hole_size = 0;
                goto full_search;
        }
        return -ENOMEM;
@@ -520,6 +352,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
        struct vm_area_struct *vma, *prev_vma;
        struct mm_struct *mm = current->mm;
        unsigned long base = mm->mmap_base, addr = addr0;
+       unsigned long largest_hole = mm->cached_hole_size;
        int first_time = 1;
 
        /* requested length too big for entire address space */
@@ -540,6 +373,10 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
                        return addr;
        }
 
+       if (len <= largest_hole) {
+               largest_hole = 0;
+               mm->free_area_cache = base;
+       }
 try_again:
        /* make sure it can fit in the remaining address space */
        if (mm->free_area_cache < len)
@@ -568,13 +405,21 @@ hugepage_recheck:
                 * vma->vm_start, use it:
                 */
                if (addr+len <= vma->vm_start &&
-                               (!prev_vma || (addr >= prev_vma->vm_end)))
+                         (!prev_vma || (addr >= prev_vma->vm_end))) {
                        /* remember the address as a hint for next time */
-                       return (mm->free_area_cache = addr);
-               else
+                       mm->cached_hole_size = largest_hole;
+                       return (mm->free_area_cache = addr);
+               } else {
                        /* pull free_area_cache down to the first hole */
-                       if (mm->free_area_cache == vma->vm_end)
+                       if (mm->free_area_cache == vma->vm_end) {
                                mm->free_area_cache = vma->vm_start;
+                               mm->cached_hole_size = largest_hole;
+                       }
+               }
+
+               /* remember the largest hole we saw so far */
+               if (addr + largest_hole < vma->vm_start)
+                       largest_hole = vma->vm_start - addr;
 
                /* try just below the current vma->vm_start */
                addr = vma->vm_start-len;
@@ -587,6 +432,7 @@ fail:
         */
        if (first_time) {
                mm->free_area_cache = base;
+               largest_hole = 0;
                first_time = 0;
                goto try_again;
        }
@@ -597,11 +443,13 @@ fail:
         * allocations.
         */
        mm->free_area_cache = TASK_UNMAPPED_BASE;
+       mm->cached_hole_size = ~0UL;
        addr = arch_get_unmapped_area(filp, addr0, len, pgoff, flags);
        /*
         * Restore the topdown base:
         */
        mm->free_area_cache = base;
+       mm->cached_hole_size = ~0UL;
 
        return addr;
 }
index cb8727f3267a1c252b1f4d3d7fe1e498a210d3b4..b6e75b891ac0fef5a2aa9dea4152b2c2ea2b998b 100644 (file)
@@ -15,6 +15,7 @@
 #include <asm/pgtable.h>
 #include <asm/semaphore.h>
 #include <asm/imalloc.h>
+#include <asm/cacheflush.h>
 
 static DECLARE_MUTEX(imlist_sem);
 struct vm_struct * imlist = NULL;
@@ -285,29 +286,32 @@ struct vm_struct * im_get_area(unsigned long v_addr, unsigned long size,
        return area;
 }
 
-unsigned long im_free(void * addr)
+void im_free(void * addr)
 {
        struct vm_struct **p, *tmp;
-       unsigned long ret_size = 0;
   
        if (!addr)
-               return ret_size;
-       if ((PAGE_SIZE-1) & (unsigned long) addr) {
+               return;
+       if ((unsigned long) addr & ~PAGE_MASK) {
                printk(KERN_ERR "Trying to %s bad address (%p)\n", __FUNCTION__,                        addr);
-               return ret_size;
+               return;
        }
        down(&imlist_sem);
        for (p = &imlist ; (tmp = *p) ; p = &tmp->next) {
                if (tmp->addr == addr) {
-                       ret_size = tmp->size;
                        *p = tmp->next;
+
+                       /* XXX: do we need the lock? */
+                       spin_lock(&init_mm.page_table_lock);
+                       unmap_vm_area(tmp);
+                       spin_unlock(&init_mm.page_table_lock);
+
                        kfree(tmp);
                        up(&imlist_sem);
-                       return ret_size;
+                       return;
                }
        }
        up(&imlist_sem);
        printk(KERN_ERR "Trying to %s nonexistent area (%p)\n", __FUNCTION__,
                        addr);
-       return ret_size;
 }
index 4b42aff74d7312e7f2cdad4aa58dcdaa13a04e1b..6fa1e6490b5747d9ece0de44a9ae4828156a4597 100644 (file)
@@ -73,9 +73,6 @@ static unsigned long phbs_io_bot = PHBS_IO_BASE;
 extern pgd_t swapper_pg_dir[];
 extern struct task_struct *current_set[NR_CPUS];
 
-extern pgd_t ioremap_dir[];
-pgd_t * ioremap_pgd = (pgd_t *)&ioremap_dir;
-
 unsigned long klimit = (unsigned long)_end;
 
 unsigned long _SDR1=0;
@@ -137,69 +134,6 @@ void iounmap(volatile void __iomem *addr)
 
 #else
 
-static void unmap_im_area_pte(pmd_t *pmd, unsigned long addr,
-                                 unsigned long end)
-{
-       pte_t *pte;
-
-       pte = pte_offset_kernel(pmd, addr);
-       do {
-               pte_t ptent = ptep_get_and_clear(&ioremap_mm, addr, pte);
-               WARN_ON(!pte_none(ptent) && !pte_present(ptent));
-       } while (pte++, addr += PAGE_SIZE, addr != end);
-}
-
-static inline void unmap_im_area_pmd(pud_t *pud, unsigned long addr,
-                                    unsigned long end)
-{
-       pmd_t *pmd;
-       unsigned long next;
-
-       pmd = pmd_offset(pud, addr);
-       do {
-               next = pmd_addr_end(addr, end);
-               if (pmd_none_or_clear_bad(pmd))
-                       continue;
-               unmap_im_area_pte(pmd, addr, next);
-       } while (pmd++, addr = next, addr != end);
-}
-
-static inline void unmap_im_area_pud(pgd_t *pgd, unsigned long addr,
-                                    unsigned long end)
-{
-       pud_t *pud;
-       unsigned long next;
-
-       pud = pud_offset(pgd, addr);
-       do {
-               next = pud_addr_end(addr, end);
-               if (pud_none_or_clear_bad(pud))
-                       continue;
-               unmap_im_area_pmd(pud, addr, next);
-       } while (pud++, addr = next, addr != end);
-}
-
-static void unmap_im_area(unsigned long addr, unsigned long end)
-{
-       struct mm_struct *mm = &ioremap_mm;
-       unsigned long next;
-       pgd_t *pgd;
-
-       spin_lock(&mm->page_table_lock);
-
-       pgd = pgd_offset_i(addr);
-       flush_cache_vunmap(addr, end);
-       do {
-               next = pgd_addr_end(addr, end);
-               if (pgd_none_or_clear_bad(pgd))
-                       continue;
-               unmap_im_area_pud(pgd, addr, next);
-       } while (pgd++, addr = next, addr != end);
-       flush_tlb_kernel_range(start, end);
-
-       spin_unlock(&mm->page_table_lock);
-}
-
 /*
  * map_io_page currently only called by __ioremap
  * map_io_page adds an entry to the ioremap page table
@@ -214,21 +148,21 @@ static int map_io_page(unsigned long ea, unsigned long pa, int flags)
        unsigned long vsid;
 
        if (mem_init_done) {
-               spin_lock(&ioremap_mm.page_table_lock);
-               pgdp = pgd_offset_i(ea);
-               pudp = pud_alloc(&ioremap_mm, pgdp, ea);
+               spin_lock(&init_mm.page_table_lock);
+               pgdp = pgd_offset_k(ea);
+               pudp = pud_alloc(&init_mm, pgdp, ea);
                if (!pudp)
                        return -ENOMEM;
-               pmdp = pmd_alloc(&ioremap_mm, pudp, ea);
+               pmdp = pmd_alloc(&init_mm, pudp, ea);
                if (!pmdp)
                        return -ENOMEM;
-               ptep = pte_alloc_kernel(&ioremap_mm, pmdp, ea);
+               ptep = pte_alloc_kernel(&init_mm, pmdp, ea);
                if (!ptep)
                        return -ENOMEM;
                pa = abs_to_phys(pa);
-               set_pte_at(&ioremap_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT,
+               set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT,
                                                          __pgprot(flags)));
-               spin_unlock(&ioremap_mm.page_table_lock);
+               spin_unlock(&init_mm.page_table_lock);
        } else {
                unsigned long va, vpn, hash, hpteg;
 
@@ -267,13 +201,9 @@ static void __iomem * __ioremap_com(unsigned long addr, unsigned long pa,
 
        for (i = 0; i < size; i += PAGE_SIZE)
                if (map_io_page(ea+i, pa+i, flags))
-                       goto failure;
+                       return NULL;
 
        return (void __iomem *) (ea + (addr & ~PAGE_MASK));
- failure:
-       if (mem_init_done)
-               unmap_im_area(ea, ea + size);
-       return NULL;
 }
 
 
@@ -381,19 +311,14 @@ int __ioremap_explicit(unsigned long pa, unsigned long ea,
  */
 void iounmap(volatile void __iomem *token)
 {
-       unsigned long address, size;
        void *addr;
 
        if (!mem_init_done)
                return;
        
        addr = (void *) ((unsigned long __force) token & PAGE_MASK);
-       
-       if ((size = im_free(addr)) == 0)
-               return;
 
-       address = (unsigned long)addr; 
-       unmap_im_area(address, address + size);
+       im_free(addr);
 }
 
 static int iounmap_subset_regions(unsigned long addr, unsigned long size)
index 3c0ccb2623aeba4e89e9b43c439bf0c4ceafe1cd..7f6e13a4b71eec0c23330aaca24dcc76aa6a5971 100644 (file)
@@ -2247,7 +2247,14 @@ scanhex(unsigned long *vp)
                        tmpstr[i] = c;
                }
                tmpstr[i++] = 0;
-               *vp = kallsyms_lookup_name(tmpstr);
+               *vp = 0;
+               if (setjmp(bus_error_jmp) == 0) {
+                       catch_memory_errors = 1;
+                       sync();
+                       *vp = kallsyms_lookup_name(tmpstr);
+                       sync();
+               }
+               catch_memory_errors = 0;
                if (!(*vp)) {
                        printf("unknown symbol '%s'\n", tmpstr);
                        return 0;
index 01ae1964c938cd828379dc594087299309531725..c067435bae4506130b9dd05cbf4e6a30078000a1 100644 (file)
@@ -28,6 +28,7 @@
 //#include <linux/kernel_stat.h>
 #include <linux/notifier.h>
 #include <linux/cpu.h>
+#include <linux/workqueue.h>
 
 #include "appldata.h"
 
@@ -133,9 +134,12 @@ static int appldata_interval = APPLDATA_CPU_INTERVAL;
 static int appldata_timer_active;
 
 /*
- * Tasklet
+ * Work queue
  */
-static struct tasklet_struct appldata_tasklet_struct;
+static struct workqueue_struct *appldata_wq;
+static void appldata_work_fn(void *data);
+static DECLARE_WORK(appldata_work, appldata_work_fn, NULL);
+
 
 /*
  * Ops list
@@ -144,11 +148,11 @@ static DEFINE_SPINLOCK(appldata_ops_lock);
 static LIST_HEAD(appldata_ops_list);
 
 
-/************************* timer, tasklet, DIAG ******************************/
+/*************************** timer, work, DIAG *******************************/
 /*
  * appldata_timer_function()
  *
- * schedule tasklet and reschedule timer
+ * schedule work and reschedule timer
  */
 static void appldata_timer_function(unsigned long data, struct pt_regs *regs)
 {
@@ -157,22 +161,22 @@ static void appldata_timer_function(unsigned long data, struct pt_regs *regs)
                atomic_read(&appldata_expire_count));
        if (atomic_dec_and_test(&appldata_expire_count)) {
                atomic_set(&appldata_expire_count, num_online_cpus());
-               tasklet_schedule((struct tasklet_struct *) data);
+               queue_work(appldata_wq, (struct work_struct *) data);
        }
 }
 
 /*
- * appldata_tasklet_function()
+ * appldata_work_fn()
  *
  * call data gathering function for each (active) module
  */
-static void appldata_tasklet_function(unsigned long data)
+static void appldata_work_fn(void *data)
 {
        struct list_head *lh;
        struct appldata_ops *ops;
        int i;
 
-       P_DEBUG("  -= Tasklet =-\n");
+       P_DEBUG("  -= Work Queue =-\n");
        i = 0;
        spin_lock(&appldata_ops_lock);
        list_for_each(lh, &appldata_ops_list) {
@@ -231,7 +235,7 @@ static int appldata_diag(char record_nr, u16 function, unsigned long buffer,
                        : "=d" (ry) : "d" (&(appldata_parameter_list)) : "cc");
        return (int) ry;
 }
-/********************** timer, tasklet, DIAG <END> ***************************/
+/************************ timer, work, DIAG <END> ****************************/
 
 
 /****************************** /proc stuff **********************************/
@@ -411,7 +415,7 @@ appldata_generic_handler(ctl_table *ctl, int write, struct file *filp,
        struct list_head *lh;
 
        found = 0;
-       spin_lock_bh(&appldata_ops_lock);
+       spin_lock(&appldata_ops_lock);
        list_for_each(lh, &appldata_ops_list) {
                tmp_ops = list_entry(lh, struct appldata_ops, list);
                if (&tmp_ops->ctl_table[2] == ctl) {
@@ -419,15 +423,15 @@ appldata_generic_handler(ctl_table *ctl, int write, struct file *filp,
                }
        }
        if (!found) {
-               spin_unlock_bh(&appldata_ops_lock);
+               spin_unlock(&appldata_ops_lock);
                return -ENODEV;
        }
        ops = ctl->data;
        if (!try_module_get(ops->owner)) {      // protect this function
-               spin_unlock_bh(&appldata_ops_lock);
+               spin_unlock(&appldata_ops_lock);
                return -ENODEV;
        }
-       spin_unlock_bh(&appldata_ops_lock);
+       spin_unlock(&appldata_ops_lock);
 
        if (!*lenp || *ppos) {
                *lenp = 0;
@@ -451,10 +455,11 @@ appldata_generic_handler(ctl_table *ctl, int write, struct file *filp,
                return -EFAULT;
        }
 
-       spin_lock_bh(&appldata_ops_lock);
+       spin_lock(&appldata_ops_lock);
        if ((buf[0] == '1') && (ops->active == 0)) {
-               if (!try_module_get(ops->owner)) {      // protect tasklet
-                       spin_unlock_bh(&appldata_ops_lock);
+               // protect work queue callback
+               if (!try_module_get(ops->owner)) {
+                       spin_unlock(&appldata_ops_lock);
                        module_put(ops->owner);
                        return -ENODEV;
                }
@@ -485,7 +490,7 @@ appldata_generic_handler(ctl_table *ctl, int write, struct file *filp,
                }
                module_put(ops->owner);
        }
-       spin_unlock_bh(&appldata_ops_lock);
+       spin_unlock(&appldata_ops_lock);
 out:
        *lenp = len;
        *ppos += len;
@@ -529,7 +534,7 @@ int appldata_register_ops(struct appldata_ops *ops)
        }
        memset(ops->ctl_table, 0, 4*sizeof(struct ctl_table));
 
-       spin_lock_bh(&appldata_ops_lock);
+       spin_lock(&appldata_ops_lock);
        list_for_each(lh, &appldata_ops_list) {
                tmp_ops = list_entry(lh, struct appldata_ops, list);
                P_DEBUG("register_ops loop: %i) name = %s, ctl = %i\n",
@@ -541,18 +546,18 @@ int appldata_register_ops(struct appldata_ops *ops)
                                APPLDATA_PROC_NAME_LENGTH) == 0) {
                        P_ERROR("Name \"%s\" already registered!\n", ops->name);
                        kfree(ops->ctl_table);
-                       spin_unlock_bh(&appldata_ops_lock);
+                       spin_unlock(&appldata_ops_lock);
                        return -EBUSY;
                }
                if (tmp_ops->ctl_nr == ops->ctl_nr) {
                        P_ERROR("ctl_nr %i already registered!\n", ops->ctl_nr);
                        kfree(ops->ctl_table);
-                       spin_unlock_bh(&appldata_ops_lock);
+                       spin_unlock(&appldata_ops_lock);
                        return -EBUSY;
                }
        }
        list_add(&ops->list, &appldata_ops_list);
-       spin_unlock_bh(&appldata_ops_lock);
+       spin_unlock(&appldata_ops_lock);
 
        ops->ctl_table[0].ctl_name = CTL_APPLDATA;
        ops->ctl_table[0].procname = appldata_proc_name;
@@ -583,12 +588,12 @@ int appldata_register_ops(struct appldata_ops *ops)
  */
 void appldata_unregister_ops(struct appldata_ops *ops)
 {
-       spin_lock_bh(&appldata_ops_lock);
+       spin_lock(&appldata_ops_lock);
        unregister_sysctl_table(ops->sysctl_header);
        list_del(&ops->list);
        kfree(ops->ctl_table);
        ops->ctl_table = NULL;
-       spin_unlock_bh(&appldata_ops_lock);
+       spin_unlock(&appldata_ops_lock);
        P_INFO("%s-ops unregistered!\n", ops->name);
 }
 /********************** module-ops management <END> **************************/
@@ -602,7 +607,7 @@ appldata_online_cpu(int cpu)
        init_virt_timer(&per_cpu(appldata_timer, cpu));
        per_cpu(appldata_timer, cpu).function = appldata_timer_function;
        per_cpu(appldata_timer, cpu).data = (unsigned long)
-               &appldata_tasklet_struct;
+               &appldata_work;
        atomic_inc(&appldata_expire_count);
        spin_lock(&appldata_timer_lock);
        __appldata_vtimer_setup(APPLDATA_MOD_TIMER);
@@ -615,7 +620,7 @@ appldata_offline_cpu(int cpu)
        del_virt_timer(&per_cpu(appldata_timer, cpu));
        if (atomic_dec_and_test(&appldata_expire_count)) {
                atomic_set(&appldata_expire_count, num_online_cpus());
-               tasklet_schedule(&appldata_tasklet_struct);
+               queue_work(appldata_wq, &appldata_work);
        }
        spin_lock(&appldata_timer_lock);
        __appldata_vtimer_setup(APPLDATA_MOD_TIMER);
@@ -648,7 +653,7 @@ static struct notifier_block __devinitdata appldata_nb = {
 /*
  * appldata_init()
  *
- * init timer and tasklet, register /proc entries
+ * init timer, register /proc entries
  */
 static int __init appldata_init(void)
 {
@@ -657,6 +662,12 @@ static int __init appldata_init(void)
        P_DEBUG("sizeof(parameter_list) = %lu\n",
                sizeof(struct appldata_parameter_list));
 
+       appldata_wq = create_singlethread_workqueue("appldata");
+       if (!appldata_wq) {
+               P_ERROR("Could not create work queue\n");
+               return -ENOMEM;
+       }
+
        for_each_online_cpu(i)
                appldata_online_cpu(i);
 
@@ -670,7 +681,6 @@ static int __init appldata_init(void)
        appldata_table[1].de->owner = THIS_MODULE;
 #endif
 
-       tasklet_init(&appldata_tasklet_struct, appldata_tasklet_function, 0);
        P_DEBUG("Base interface initialized.\n");
        return 0;
 }
@@ -678,7 +688,7 @@ static int __init appldata_init(void)
 /*
  * appldata_exit()
  *
- * stop timer and tasklet, unregister /proc entries
+ * stop timer, unregister /proc entries
  */
 static void __exit appldata_exit(void)
 {
@@ -690,7 +700,7 @@ static void __exit appldata_exit(void)
        /*
         * ops list should be empty, but just in case something went wrong...
         */
-       spin_lock_bh(&appldata_ops_lock);
+       spin_lock(&appldata_ops_lock);
        list_for_each(lh, &appldata_ops_list) {
                ops = list_entry(lh, struct appldata_ops, list);
                rc = appldata_diag(ops->record_nr, APPLDATA_STOP_REC,
@@ -700,7 +710,7 @@ static void __exit appldata_exit(void)
                                "return code: %d\n", ops->name, rc);
                }
        }
-       spin_unlock_bh(&appldata_ops_lock);
+       spin_unlock(&appldata_ops_lock);
 
        for_each_online_cpu(i)
                appldata_offline_cpu(i);
@@ -709,7 +719,7 @@ static void __exit appldata_exit(void)
 
        unregister_sysctl_table(appldata_sysctl_header);
 
-       tasklet_kill(&appldata_tasklet_struct);
+       destroy_workqueue(appldata_wq);
        P_DEBUG("... module unloaded!\n");
 }
 /**************************** init / exit <END> ******************************/
index 462ee9a84e7655fb39403fdcc4ff2ba83e33823b..f0e2fbed3d4cf86a8000ec212e435546098507fc 100644 (file)
@@ -68,7 +68,7 @@ struct appldata_mem_data {
        u64 pgmajfault;         /* page faults (major only) */
 // <-- New in 2.6
 
-} appldata_mem_data;
+} __attribute__((packed)) appldata_mem_data;
 
 
 static inline void appldata_debug_print(struct appldata_mem_data *mem_data)
index dd61638d3027c6eddcaa0bf8bfd5e1d8d2477541..2a4c7432db4ac2960cde34ee6033671fe171cfc5 100644 (file)
@@ -57,7 +57,7 @@ struct appldata_net_sum_data {
        u64 rx_dropped;         /* no space in linux buffers     */
        u64 tx_dropped;         /* no space available in linux   */
        u64 collisions;         /* collisions while transmitting */
-} appldata_net_sum_data;
+} __attribute__((packed)) appldata_net_sum_data;
 
 
 static inline void appldata_print_debug(struct appldata_net_sum_data *net_data)
index b83f074845514ad409f8c5da3e57cf3a2c2b8459..e0a476bf4fd644691bf5b50e93db05a2367b59bd 100644 (file)
@@ -49,7 +49,7 @@ struct appldata_os_per_cpu {
        u32 per_cpu_softirq;    /* ... spent in softirqs            */
        u32 per_cpu_iowait;     /* ... spent while waiting for I/O  */
 // <-- New in 2.6
-};
+} __attribute__((packed));
 
 struct appldata_os_data {
        u64 timestamp;
@@ -75,7 +75,7 @@ struct appldata_os_data {
 
        /* per cpu data */
        struct appldata_os_per_cpu os_cpu[0];
-};
+} __attribute__((packed));
 
 static struct appldata_os_data *appldata_os_data;
 
index 03d03c6d3cbbea2cdce5b15f5988717220882d5e..24a1e9f069a7f0adb9ac9aab34fa6613243c0cd3 100644 (file)
@@ -42,7 +42,6 @@ struct ioctl_trans ioctl_start[] = {
 #include "../../../fs/compat_ioctl.c"
 
 /* s390 only ioctls */
-#if defined(CONFIG_DASD) || defined(CONFIG_DASD_MODULE)
 COMPATIBLE_IOCTL(DASDAPIVER)
 COMPATIBLE_IOCTL(BIODASDDISABLE)
 COMPATIBLE_IOCTL(BIODASDENABLE)
@@ -59,16 +58,11 @@ COMPATIBLE_IOCTL(BIODASDPRRD)
 COMPATIBLE_IOCTL(BIODASDPSRD)
 COMPATIBLE_IOCTL(BIODASDGATTR)
 COMPATIBLE_IOCTL(BIODASDSATTR)
-#if defined(CONFIG_DASD_CMB) || defined(CONFIG_DASD_CMB_MODULE)
 COMPATIBLE_IOCTL(BIODASDCMFENABLE)
 COMPATIBLE_IOCTL(BIODASDCMFDISABLE)
 COMPATIBLE_IOCTL(BIODASDREADALLCMB)
-#endif
-#endif
 
-#if defined(CONFIG_S390_TAPE) || defined(CONFIG_S390_TAPE_MODULE)
 COMPATIBLE_IOCTL(TAPE390_DISPLAY)
-#endif
 
 /* s390 doesn't need handlers here */
 COMPATIBLE_IOCTL(TIOCGSERIAL)
index b804c55bd919ee37b44d01bf5c64543b97ece822..fc8bf5e285f6ccb187fcd81d6a810e4ffe713543 100644 (file)
@@ -345,10 +345,25 @@ iplstart:
        bno   .Lnoreset
         la    %r2,.Lreset              
         lhi   %r3,26
-        .long 0x83230008
+       diag  %r2,%r3,8
+       mvc   0x78(8),.Lrdrnewpsw              # set up IO interrupt psw
+.Lwaitrdrirq:
+       lpsw  .Lrdrwaitpsw
+.Lrdrint:
+       c     %r1,0xb8                         # compare subchannel number
+       bne   .Lwaitrdrirq
+       la    %r5,.Lirb
+       tsch  0(%r5)
 .Lnoreset:
+        b     .Lnoload
+
+       .align 8
+.Lrdrnewpsw:
+       .long  0x00080000,0x80000000+.Lrdrint
+.Lrdrwaitpsw:
+       .long  0x020a0000,0x80000000+.Lrdrint
 #endif
-       
+
 #
 # everything loaded, go for it
 #
@@ -517,10 +532,10 @@ startup:basr  %r13,0                     # get base
        l     %r2, .Lrcp2-.LPG1(%r13)   # try with Read SCP
        b     .Lservicecall-.LPG1(%r13)
 .Lprocsccb:
-       lh    %r1,.Lscpincr1-PARMAREA(%r4) # use this one if != 0
-       chi   %r1,0x00
-       jne   .Lscnd
-       l     %r1,.Lscpincr2-PARMAREA(%r4) # otherwise use this one
+       lhi   %r1,0
+       icm   %r1,3,.Lscpincr1-PARMAREA(%r4) # use this one if != 0
+       jnz   .Lscnd
+       l     %r1,.Lscpincr2-PARMAREA+4(%r4) # otherwise use this one
 .Lscnd:
        xr    %r3,%r3                   # same logic
        ic    %r3,.Lscpa1-PARMAREA(%r4)
index 8366793bc371522117fe869159a3c8cd8f39add3..f525c0c212500fad80ad0b98e5f6c9a525f8a2a8 100644 (file)
@@ -344,10 +344,25 @@ iplstart:
        bno   .Lnoreset
         la    %r2,.Lreset              
         lhi   %r3,26
-        .long 0x83230008
+       diag  %r2,%r3,8
+       mvc   0x78(8),.Lrdrnewpsw              # set up IO interrupt psw
+.Lwaitrdrirq:
+       lpsw  .Lrdrwaitpsw
+.Lrdrint:
+       c     %r1,0xb8                         # compare subchannel number
+       bne   .Lwaitrdrirq
+       la    %r5,.Lirb
+       tsch  0(%r5)
 .Lnoreset:
+       b     .Lnoload
+
+       .align 8
+.Lrdrnewpsw:
+       .long  0x00080000,0x80000000+.Lrdrint
+.Lrdrwaitpsw:
+       .long  0x020a0000,0x80000000+.Lrdrint
 #endif
-       
+
 #
 # everything loaded, go for it
 #
@@ -518,9 +533,9 @@ startup:basr  %r13,0                     # get base
        l     %r2,.Lrcp2-.LPG1(%r13)    # try with Read SCP
        b     .Lservicecall-.LPG1(%r13)
 .Lprocsccb:
-       lh    %r1,.Lscpincr1-PARMAREA(%r4) # use this one if != 0
-       chi   %r1,0x00
-       jne   .Lscnd
+       lghi  %r1,0
+       icm   %r1,3,.Lscpincr1-PARMAREA(%r4) # use this one if != 0
+       jnz   .Lscnd
        lg    %r1,.Lscpincr2-PARMAREA(%r4) # otherwise use this one
 .Lscnd:
        xr    %r3,%r3                   # same logic
index 26889366929a1ac3d9162a2ba357dd837a143877..06afa3103ace75143d44258c215cc9c3d1a7fb00 100644 (file)
@@ -40,6 +40,7 @@
 #include <asm/pgalloc.h>
 #include <asm/system.h>
 #include <asm/uaccess.h>
+#include <asm/unistd.h>
 
 #ifdef CONFIG_S390_SUPPORT
 #include "compat_ptrace.h"
@@ -130,13 +131,19 @@ static int
 peek_user(struct task_struct *child, addr_t addr, addr_t data)
 {
        struct user *dummy = NULL;
-       addr_t offset, tmp;
+       addr_t offset, tmp, mask;
 
        /*
         * Stupid gdb peeks/pokes the access registers in 64 bit with
         * an alignment of 4. Programmers from hell...
         */
-       if ((addr & 3) || addr > sizeof(struct user) - __ADDR_MASK)
+       mask = __ADDR_MASK;
+#ifdef CONFIG_ARCH_S390X
+       if (addr >= (addr_t) &dummy->regs.acrs &&
+           addr < (addr_t) &dummy->regs.orig_gpr2)
+               mask = 3;
+#endif
+       if ((addr & mask) || addr > sizeof(struct user) - __ADDR_MASK)
                return -EIO;
 
        if (addr < (addr_t) &dummy->regs.acrs) {
@@ -153,6 +160,16 @@ peek_user(struct task_struct *child, addr_t addr, addr_t data)
                 * access registers are stored in the thread structure
                 */
                offset = addr - (addr_t) &dummy->regs.acrs;
+#ifdef CONFIG_ARCH_S390X
+               /*
+                * Very special case: old & broken 64 bit gdb reading
+                * from acrs[15]. Result is a 64 bit value. Read the
+                * 32 bit acrs[15] value and shift it by 32. Sick...
+                */
+               if (addr == (addr_t) &dummy->regs.acrs[15])
+                       tmp = ((unsigned long) child->thread.acrs[15]) << 32;
+               else
+#endif
                tmp = *(addr_t *)((addr_t) &child->thread.acrs + offset);
 
        } else if (addr == (addr_t) &dummy->regs.orig_gpr2) {
@@ -167,6 +184,9 @@ peek_user(struct task_struct *child, addr_t addr, addr_t data)
                 */
                offset = addr - (addr_t) &dummy->regs.fp_regs;
                tmp = *(addr_t *)((addr_t) &child->thread.fp_regs + offset);
+               if (addr == (addr_t) &dummy->regs.fp_regs.fpc)
+                       tmp &= (unsigned long) FPC_VALID_MASK
+                               << (BITS_PER_LONG - 32);
 
        } else if (addr < (addr_t) (&dummy->regs.per_info + 1)) {
                /*
@@ -191,13 +211,19 @@ static int
 poke_user(struct task_struct *child, addr_t addr, addr_t data)
 {
        struct user *dummy = NULL;
-       addr_t offset;
+       addr_t offset, mask;
 
        /*
         * Stupid gdb peeks/pokes the access registers in 64 bit with
         * an alignment of 4. Programmers from hell indeed...
         */
-       if ((addr & 3) || addr > sizeof(struct user) - __ADDR_MASK)
+       mask = __ADDR_MASK;
+#ifdef CONFIG_ARCH_S390X
+       if (addr >= (addr_t) &dummy->regs.acrs &&
+           addr < (addr_t) &dummy->regs.orig_gpr2)
+               mask = 3;
+#endif
+       if ((addr & mask) || addr > sizeof(struct user) - __ADDR_MASK)
                return -EIO;
 
        if (addr < (addr_t) &dummy->regs.acrs) {
@@ -224,6 +250,17 @@ poke_user(struct task_struct *child, addr_t addr, addr_t data)
                 * access registers are stored in the thread structure
                 */
                offset = addr - (addr_t) &dummy->regs.acrs;
+#ifdef CONFIG_ARCH_S390X
+               /*
+                * Very special case: old & broken 64 bit gdb writing
+                * to acrs[15] with a 64 bit value. Ignore the lower
+                * half of the value and write the upper 32 bit to
+                * acrs[15]. Sick...
+                */
+               if (addr == (addr_t) &dummy->regs.acrs[15])
+                       child->thread.acrs[15] = (unsigned int) (data >> 32);
+               else
+#endif
                *(addr_t *)((addr_t) &child->thread.acrs + offset) = data;
 
        } else if (addr == (addr_t) &dummy->regs.orig_gpr2) {
@@ -237,7 +274,8 @@ poke_user(struct task_struct *child, addr_t addr, addr_t data)
                 * floating point regs. are stored in the thread structure
                 */
                if (addr == (addr_t) &dummy->regs.fp_regs.fpc &&
-                   (data & ~FPC_VALID_MASK) != 0)
+                   (data & ~((unsigned long) FPC_VALID_MASK
+                             << (BITS_PER_LONG - 32))) != 0)
                        return -EINVAL;
                offset = addr - (addr_t) &dummy->regs.fp_regs;
                *(addr_t *)((addr_t) &child->thread.fp_regs + offset) = data;
@@ -722,6 +760,13 @@ syscall_trace(struct pt_regs *regs, int entryexit)
        ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
                                 ? 0x80 : 0));
 
+       /*
+        * If the debuffer has set an invalid system call number,
+        * we prepare to skip the system call restart handling.
+        */
+       if (!entryexit && regs->gprs[2] >= NR_syscalls)
+               regs->trap = -1;
+
        /*
         * this isn't the same as continuing with a signal, but it will do
         * for normal use.  strace only continues with a signal if the
index 8b90e9528b911b882f04b9e686e2f727d0dad419..ca34b6f34b38e9efc78fc2a418d8390d9174233f 100644 (file)
@@ -668,7 +668,10 @@ asmlinkage void space_switch_exception(struct pt_regs * regs, long int_code)
 
 asmlinkage void kernel_stack_overflow(struct pt_regs * regs)
 {
-       die("Kernel stack overflow", regs, 0);
+       bust_spinlocks(1);
+       printk("Kernel stack overflow.\n");
+       show_regs(regs);
+       bust_spinlocks(0);
        panic("Corrupt kernel stack, can't continue.");
 }
 
index f5a5bc09b8fa736b337f61e4eed6f49d58b07327..2d5cb1385753249e1d9b282a5b947563f36dc520 100644 (file)
@@ -21,7 +21,7 @@
 #include <asm/uaccess.h>
 
 static char *sender = "VMRMSVM";
-module_param(sender, charp, 0);
+module_param(sender, charp, 0400);
 MODULE_PARM_DESC(sender,
                 "Guest name that may send SMSG messages (default VMRMSVM)");
 
index 80306bc8c799b7c7e8c98d819806a78a1a7eb951..75fde949d12570a68d1a5aaa228fc946fccc0c4b 100644 (file)
@@ -207,7 +207,7 @@ do_exception(struct pt_regs *regs, unsigned long error_code, int is_protection)
         * we are not in an interrupt and that there is a 
         * user context.
         */
-        if (user_address == 0 || in_interrupt() || !mm)
+        if (user_address == 0 || in_atomic() || !mm)
                 goto no_context;
 
        /*
index df5ac294c37906cd575a9bd482b2478cdfbd4805..917b2f32f260888b2a84b272303edce8d0b5c1b6 100644 (file)
@@ -79,6 +79,10 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
                    (!vma || addr + len <= vma->vm_start))
                        return addr;
        }
+       if (len <= mm->cached_hole_size) {
+               mm->cached_hole_size = 0;
+               mm->free_area_cache = TASK_UNMAPPED_BASE;
+       }
        if (flags & MAP_PRIVATE)
                addr = PAGE_ALIGN(mm->free_area_cache);
        else
@@ -95,6 +99,7 @@ full_search:
                         */
                        if (start_addr != TASK_UNMAPPED_BASE) {
                                start_addr = addr = TASK_UNMAPPED_BASE;
+                               mm->cached_hole_size = 0;
                                goto full_search;
                        }
                        return -ENOMEM;
@@ -106,6 +111,9 @@ full_search:
                        mm->free_area_cache = addr + len;
                        return addr;
                }
+               if (addr + mm->cached_hole_size < vma->vm_start)
+                       mm->cached_hole_size = vma->vm_start - addr;
+
                addr = vma->vm_end;
                if (!(flags & MAP_PRIVATE))
                        addr = COLOUR_ALIGN(addr);
index 50b36037d86b01e51c0f4c1107c2e43588a62974..351714694d6d4b9b6f81d183e774f1fc47e0e215 100644 (file)
@@ -24,7 +24,7 @@ inline void __const_udelay(unsigned long xloops)
        __asm__("dmulu.l        %0, %2\n\t"
                "sts    mach, %0"
                : "=r" (xloops)
-               : "0" (xloops), "r" (cpu_data[_smp_processor_id()].loops_per_jiffy)
+               : "0" (xloops), "r" (cpu_data[raw_smp_processor_id()].loops_per_jiffy)
                : "macl", "mach");
        __delay(xloops * HZ);
 }
index 1f897bab2318a00efa6a1d9f845f2c107cb33eff..95bb1a6c60609fa7567d4fa0928a44e689c3fc6e 100644 (file)
@@ -24,7 +24,7 @@
 #include <asm/tlbflush.h>
 #include <asm/cacheflush.h>
 
-static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
+pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
 {
        pgd_t *pgd;
        pmd_t *pmd;
@@ -39,7 +39,7 @@ static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
        return pte;
 }
 
-static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
+pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
 {
        pgd_t *pgd;
        pmd_t *pmd;
@@ -56,28 +56,34 @@ static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
 
 #define mk_pte_huge(entry) do { pte_val(entry) |= _PAGE_SZHUGE; } while (0)
 
-static void set_huge_pte(struct mm_struct *mm, struct vm_area_struct *vma,
-                        struct page *page, pte_t * page_table, int write_access)
+void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
+                    pte_t *ptep, pte_t entry)
 {
-       unsigned long i;
-       pte_t entry;
+       int i;
 
-       add_mm_counter(mm, rss, HPAGE_SIZE / PAGE_SIZE);
+       for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
+               set_pte_at(mm, addr, ptep, entry);
+               ptep++;
+               addr += PAGE_SIZE;
+               pte_val(entry) += PAGE_SIZE;
+       }
+}
 
-       if (write_access)
-               entry = pte_mkwrite(pte_mkdirty(mk_pte(page,
-                                                      vma->vm_page_prot)));
-       else
-               entry = pte_wrprotect(mk_pte(page, vma->vm_page_prot));
-       entry = pte_mkyoung(entry);
-       mk_pte_huge(entry);
+pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
+                             pte_t *ptep)
+{
+       pte_t entry;
+       int i;
 
-       for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
-               set_pte(page_table, entry);
-               page_table++;
+       entry = *ptep;
 
-               pte_val(entry) += PAGE_SIZE;
+       for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
+               pte_clear(mm, addr, ptep);
+               addr += PAGE_SIZE;
+               ptep++;
        }
+
+       return entry;
 }
 
 /*
@@ -92,79 +98,6 @@ int is_aligned_hugepage_range(unsigned long addr, unsigned long len)
        return 0;
 }
 
-int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
-                           struct vm_area_struct *vma)
-{
-       pte_t *src_pte, *dst_pte, entry;
-       struct page *ptepage;
-       unsigned long addr = vma->vm_start;
-       unsigned long end = vma->vm_end;
-       int i;
-
-       while (addr < end) {
-               dst_pte = huge_pte_alloc(dst, addr);
-               if (!dst_pte)
-                       goto nomem;
-               src_pte = huge_pte_offset(src, addr);
-               BUG_ON(!src_pte || pte_none(*src_pte));
-               entry = *src_pte;
-               ptepage = pte_page(entry);
-               get_page(ptepage);
-               for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
-                       set_pte(dst_pte, entry);
-                       pte_val(entry) += PAGE_SIZE;
-                       dst_pte++;
-               }
-               add_mm_counter(dst, rss, HPAGE_SIZE / PAGE_SIZE);
-               addr += HPAGE_SIZE;
-       }
-       return 0;
-
-nomem:
-       return -ENOMEM;
-}
-
-int follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma,
-                       struct page **pages, struct vm_area_struct **vmas,
-                       unsigned long *position, int *length, int i)
-{
-       unsigned long vaddr = *position;
-       int remainder = *length;
-
-       WARN_ON(!is_vm_hugetlb_page(vma));
-
-       while (vaddr < vma->vm_end && remainder) {
-               if (pages) {
-                       pte_t *pte;
-                       struct page *page;
-
-                       pte = huge_pte_offset(mm, vaddr);
-
-                       /* hugetlb should be locked, and hence, prefaulted */
-                       BUG_ON(!pte || pte_none(*pte));
-
-                       page = pte_page(*pte);
-
-                       WARN_ON(!PageCompound(page));
-
-                       get_page(page);
-                       pages[i] = page;
-               }
-
-               if (vmas)
-                       vmas[i] = vma;
-
-               vaddr += PAGE_SIZE;
-               --remainder;
-               ++i;
-       }
-
-       *length = remainder;
-       *position = vaddr;
-
-       return i;
-}
-
 struct page *follow_huge_addr(struct mm_struct *mm,
                              unsigned long address, int write)
 {
@@ -181,84 +114,3 @@ struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
 {
        return NULL;
 }
-
-void unmap_hugepage_range(struct vm_area_struct *vma,
-                         unsigned long start, unsigned long end)
-{
-       struct mm_struct *mm = vma->vm_mm;
-       unsigned long address;
-       pte_t *pte;
-       struct page *page;
-       int i;
-
-       BUG_ON(start & (HPAGE_SIZE - 1));
-       BUG_ON(end & (HPAGE_SIZE - 1));
-
-       for (address = start; address < end; address += HPAGE_SIZE) {
-               pte = huge_pte_offset(mm, address);
-               BUG_ON(!pte);
-               if (pte_none(*pte))
-                       continue;
-               page = pte_page(*pte);
-               put_page(page);
-               for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
-                       pte_clear(mm, address+(i*PAGE_SIZE), pte);
-                       pte++;
-               }
-       }
-       add_mm_counter(mm, rss, -((end - start) >> PAGE_SHIFT));
-       flush_tlb_range(vma, start, end);
-}
-
-int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
-{
-       struct mm_struct *mm = current->mm;
-       unsigned long addr;
-       int ret = 0;
-
-       BUG_ON(vma->vm_start & ~HPAGE_MASK);
-       BUG_ON(vma->vm_end & ~HPAGE_MASK);
-
-       spin_lock(&mm->page_table_lock);
-       for (addr = vma->vm_start; addr < vma->vm_end; addr += HPAGE_SIZE) {
-               unsigned long idx;
-               pte_t *pte = huge_pte_alloc(mm, addr);
-               struct page *page;
-
-               if (!pte) {
-                       ret = -ENOMEM;
-                       goto out;
-               }
-               if (!pte_none(*pte))
-                       continue;
-
-               idx = ((addr - vma->vm_start) >> HPAGE_SHIFT)
-                       + (vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT));
-               page = find_get_page(mapping, idx);
-               if (!page) {
-                       /* charge the fs quota first */
-                       if (hugetlb_get_quota(mapping)) {
-                               ret = -ENOMEM;
-                               goto out;
-                       }
-                       page = alloc_huge_page();
-                       if (!page) {
-                               hugetlb_put_quota(mapping);
-                               ret = -ENOMEM;
-                               goto out;
-                       }
-                       ret = add_to_page_cache(page, mapping, idx, GFP_ATOMIC);
-                       if (! ret) {
-                               unlock_page(page);
-                       } else {
-                               hugetlb_put_quota(mapping);
-                               free_huge_page(page);
-                               goto out;
-                       }
-               }
-               set_huge_pte(mm, vma, page, pte, vma->vm_flags & VM_WRITE);
-       }
-out:
-       spin_unlock(&mm->page_table_lock);
-       return ret;
-}
index bcad2aefa4eeaa3809ae1bbcf0c4316b40cff183..dcd9c8a8baf84426daea75ca0d968b3891a40e21 100644 (file)
@@ -24,7 +24,7 @@
 #include <asm/tlbflush.h>
 #include <asm/cacheflush.h>
 
-static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
+pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
 {
        pgd_t *pgd;
        pmd_t *pmd;
@@ -39,7 +39,7 @@ static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
        return pte;
 }
 
-static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
+pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
 {
        pgd_t *pgd;
        pmd_t *pmd;
@@ -80,6 +80,20 @@ static void set_huge_pte(struct mm_struct *mm, struct vm_area_struct *vma,
        }
 }
 
+pte_t huge_ptep_get_and_clear(pte_t *ptep)
+{
+       pte_t entry;
+
+       entry = *ptep;
+
+       for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
+               pte_clear(pte);
+               pte++;
+       }
+
+       return entry;
+}
+
 /*
  * This function checks for proper alignment of input addr and len parameters.
  */
index a2dea69b2f072a1dcaa55674abb7cf22b4e1449f..ec2e05028a10d7ff7804ef912833942e1e0fd20a 100644 (file)
@@ -384,7 +384,6 @@ void map_high_region(unsigned long start_pfn, unsigned long end_pfn)
                struct page *page = pfn_to_page(tmp);
 
                ClearPageReserved(page);
-               set_bit(PG_highmem, &page->flags);
                set_page_count(page, 1);
                __free_page(page);
                totalhigh_pages++;
index 292983413ae2af3616f57b13f47e485212753251..2803bc7c2c798af12fc0d57b701991bc51727995 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
+#include <linux/delay.h>
 
 #include <asm/pbm.h>
 
@@ -195,6 +196,34 @@ static iopte_t *alloc_consistent_cluster(struct pci_iommu *iommu, unsigned long
        return NULL;
 }
 
+static int iommu_alloc_ctx(struct pci_iommu *iommu)
+{
+       int lowest = iommu->ctx_lowest_free;
+       int sz = IOMMU_NUM_CTXS - lowest;
+       int n = find_next_zero_bit(iommu->ctx_bitmap, sz, lowest);
+
+       if (unlikely(n == sz)) {
+               n = find_next_zero_bit(iommu->ctx_bitmap, lowest, 1);
+               if (unlikely(n == lowest)) {
+                       printk(KERN_WARNING "IOMMU: Ran out of contexts.\n");
+                       n = 0;
+               }
+       }
+       if (n)
+               __set_bit(n, iommu->ctx_bitmap);
+
+       return n;
+}
+
+static inline void iommu_free_ctx(struct pci_iommu *iommu, int ctx)
+{
+       if (likely(ctx)) {
+               __clear_bit(ctx, iommu->ctx_bitmap);
+               if (ctx < iommu->ctx_lowest_free)
+                       iommu->ctx_lowest_free = ctx;
+       }
+}
+
 /* Allocate and map kernel buffer of size SIZE using consistent mode
  * DMA for PCI device PDEV.  Return non-NULL cpu-side address if
  * successful and set *DMA_ADDRP to the PCI side dma address.
@@ -235,7 +264,7 @@ void *pci_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_ad
        npages = size >> IO_PAGE_SHIFT;
        ctx = 0;
        if (iommu->iommu_ctxflush)
-               ctx = iommu->iommu_cur_ctx++;
+               ctx = iommu_alloc_ctx(iommu);
        first_page = __pa(first_page);
        while (npages--) {
                iopte_val(*iopte) = (IOPTE_CONSISTENT(ctx) |
@@ -316,6 +345,8 @@ void pci_free_consistent(struct pci_dev *pdev, size_t size, void *cpu, dma_addr_
                }
        }
 
+       iommu_free_ctx(iommu, ctx);
+
        spin_unlock_irqrestore(&iommu->lock, flags);
 
        order = get_order(size);
@@ -359,7 +390,7 @@ dma_addr_t pci_map_single(struct pci_dev *pdev, void *ptr, size_t sz, int direct
        base_paddr = __pa(oaddr & IO_PAGE_MASK);
        ctx = 0;
        if (iommu->iommu_ctxflush)
-               ctx = iommu->iommu_cur_ctx++;
+               ctx = iommu_alloc_ctx(iommu);
        if (strbuf->strbuf_enabled)
                iopte_protection = IOPTE_STREAMING(ctx);
        else
@@ -379,6 +410,70 @@ bad:
        return PCI_DMA_ERROR_CODE;
 }
 
+static void pci_strbuf_flush(struct pci_strbuf *strbuf, struct pci_iommu *iommu, u32 vaddr, unsigned long ctx, unsigned long npages, int direction)
+{
+       int limit;
+
+       if (strbuf->strbuf_ctxflush &&
+           iommu->iommu_ctxflush) {
+               unsigned long matchreg, flushreg;
+               u64 val;
+
+               flushreg = strbuf->strbuf_ctxflush;
+               matchreg = PCI_STC_CTXMATCH_ADDR(strbuf, ctx);
+
+               pci_iommu_write(flushreg, ctx);
+               val = pci_iommu_read(matchreg);
+               val &= 0xffff;
+               if (!val)
+                       goto do_flush_sync;
+
+               while (val) {
+                       if (val & 0x1)
+                               pci_iommu_write(flushreg, ctx);
+                       val >>= 1;
+               }
+               val = pci_iommu_read(matchreg);
+               if (unlikely(val)) {
+                       printk(KERN_WARNING "pci_strbuf_flush: ctx flush "
+                              "timeout matchreg[%lx] ctx[%lx]\n",
+                              val, ctx);
+                       goto do_page_flush;
+               }
+       } else {
+               unsigned long i;
+
+       do_page_flush:
+               for (i = 0; i < npages; i++, vaddr += IO_PAGE_SIZE)
+                       pci_iommu_write(strbuf->strbuf_pflush, vaddr);
+       }
+
+do_flush_sync:
+       /* If the device could not have possibly put dirty data into
+        * the streaming cache, no flush-flag synchronization needs
+        * to be performed.
+        */
+       if (direction == PCI_DMA_TODEVICE)
+               return;
+
+       PCI_STC_FLUSHFLAG_INIT(strbuf);
+       pci_iommu_write(strbuf->strbuf_fsync, strbuf->strbuf_flushflag_pa);
+       (void) pci_iommu_read(iommu->write_complete_reg);
+
+       limit = 100000;
+       while (!PCI_STC_FLUSHFLAG_SET(strbuf)) {
+               limit--;
+               if (!limit)
+                       break;
+               udelay(1);
+               membar("#LoadLoad");
+       }
+       if (!limit)
+               printk(KERN_WARNING "pci_strbuf_flush: flushflag timeout "
+                      "vaddr[%08x] ctx[%lx] npages[%ld]\n",
+                      vaddr, ctx, npages);
+}
+
 /* Unmap a single streaming mode DMA translation. */
 void pci_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_t sz, int direction)
 {
@@ -386,7 +481,7 @@ void pci_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_t sz, int
        struct pci_iommu *iommu;
        struct pci_strbuf *strbuf;
        iopte_t *base;
-       unsigned long flags, npages, i, ctx;
+       unsigned long flags, npages, ctx;
 
        if (direction == PCI_DMA_NONE)
                BUG();
@@ -414,29 +509,8 @@ void pci_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_t sz, int
                ctx = (iopte_val(*base) & IOPTE_CONTEXT) >> 47UL;
 
        /* Step 1: Kick data out of streaming buffers if necessary. */
-       if (strbuf->strbuf_enabled) {
-               u32 vaddr = bus_addr;
-
-               PCI_STC_FLUSHFLAG_INIT(strbuf);
-               if (strbuf->strbuf_ctxflush &&
-                   iommu->iommu_ctxflush) {
-                       unsigned long matchreg, flushreg;
-
-                       flushreg = strbuf->strbuf_ctxflush;
-                       matchreg = PCI_STC_CTXMATCH_ADDR(strbuf, ctx);
-                       do {
-                               pci_iommu_write(flushreg, ctx);
-                       } while(((long)pci_iommu_read(matchreg)) < 0L);
-               } else {
-                       for (i = 0; i < npages; i++, vaddr += IO_PAGE_SIZE)
-                               pci_iommu_write(strbuf->strbuf_pflush, vaddr);
-               }
-
-               pci_iommu_write(strbuf->strbuf_fsync, strbuf->strbuf_flushflag_pa);
-               (void) pci_iommu_read(iommu->write_complete_reg);
-               while (!PCI_STC_FLUSHFLAG_SET(strbuf))
-                       membar("#LoadLoad");
-       }
+       if (strbuf->strbuf_enabled)
+               pci_strbuf_flush(strbuf, iommu, bus_addr, ctx, npages, direction);
 
        /* Step 2: Clear out first TSB entry. */
        iopte_make_dummy(iommu, base);
@@ -444,6 +518,8 @@ void pci_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_t sz, int
        free_streaming_cluster(iommu, bus_addr - iommu->page_table_map_base,
                               npages, ctx);
 
+       iommu_free_ctx(iommu, ctx);
+
        spin_unlock_irqrestore(&iommu->lock, flags);
 }
 
@@ -583,7 +659,7 @@ int pci_map_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int
        /* Step 4: Choose a context if necessary. */
        ctx = 0;
        if (iommu->iommu_ctxflush)
-               ctx = iommu->iommu_cur_ctx++;
+               ctx = iommu_alloc_ctx(iommu);
 
        /* Step 5: Create the mappings. */
        if (strbuf->strbuf_enabled)
@@ -647,29 +723,8 @@ void pci_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems,
                ctx = (iopte_val(*base) & IOPTE_CONTEXT) >> 47UL;
 
        /* Step 1: Kick data out of streaming buffers if necessary. */
-       if (strbuf->strbuf_enabled) {
-               u32 vaddr = (u32) bus_addr;
-
-               PCI_STC_FLUSHFLAG_INIT(strbuf);
-               if (strbuf->strbuf_ctxflush &&
-                   iommu->iommu_ctxflush) {
-                       unsigned long matchreg, flushreg;
-
-                       flushreg = strbuf->strbuf_ctxflush;
-                       matchreg = PCI_STC_CTXMATCH_ADDR(strbuf, ctx);
-                       do {
-                               pci_iommu_write(flushreg, ctx);
-                       } while(((long)pci_iommu_read(matchreg)) < 0L);
-               } else {
-                       for (i = 0; i < npages; i++, vaddr += IO_PAGE_SIZE)
-                               pci_iommu_write(strbuf->strbuf_pflush, vaddr);
-               }
-
-               pci_iommu_write(strbuf->strbuf_fsync, strbuf->strbuf_flushflag_pa);
-               (void) pci_iommu_read(iommu->write_complete_reg);
-               while (!PCI_STC_FLUSHFLAG_SET(strbuf))
-                       membar("#LoadLoad");
-       }
+       if (strbuf->strbuf_enabled)
+               pci_strbuf_flush(strbuf, iommu, bus_addr, ctx, npages, direction);
 
        /* Step 2: Clear out first TSB entry. */
        iopte_make_dummy(iommu, base);
@@ -677,6 +732,8 @@ void pci_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems,
        free_streaming_cluster(iommu, bus_addr - iommu->page_table_map_base,
                               npages, ctx);
 
+       iommu_free_ctx(iommu, ctx);
+
        spin_unlock_irqrestore(&iommu->lock, flags);
 }
 
@@ -715,28 +772,7 @@ void pci_dma_sync_single_for_cpu(struct pci_dev *pdev, dma_addr_t bus_addr, size
        }
 
        /* Step 2: Kick data out of streaming buffers. */
-       PCI_STC_FLUSHFLAG_INIT(strbuf);
-       if (iommu->iommu_ctxflush &&
-           strbuf->strbuf_ctxflush) {
-               unsigned long matchreg, flushreg;
-
-               flushreg = strbuf->strbuf_ctxflush;
-               matchreg = PCI_STC_CTXMATCH_ADDR(strbuf, ctx);
-               do {
-                       pci_iommu_write(flushreg, ctx);
-               } while(((long)pci_iommu_read(matchreg)) < 0L);
-       } else {
-               unsigned long i;
-
-               for (i = 0; i < npages; i++, bus_addr += IO_PAGE_SIZE)
-                       pci_iommu_write(strbuf->strbuf_pflush, bus_addr);
-       }
-
-       /* Step 3: Perform flush synchronization sequence. */
-       pci_iommu_write(strbuf->strbuf_fsync, strbuf->strbuf_flushflag_pa);
-       (void) pci_iommu_read(iommu->write_complete_reg);
-       while (!PCI_STC_FLUSHFLAG_SET(strbuf))
-               membar("#LoadLoad");
+       pci_strbuf_flush(strbuf, iommu, bus_addr, ctx, npages, direction);
 
        spin_unlock_irqrestore(&iommu->lock, flags);
 }
@@ -749,7 +785,8 @@ void pci_dma_sync_sg_for_cpu(struct pci_dev *pdev, struct scatterlist *sglist, i
        struct pcidev_cookie *pcp;
        struct pci_iommu *iommu;
        struct pci_strbuf *strbuf;
-       unsigned long flags, ctx;
+       unsigned long flags, ctx, npages, i;
+       u32 bus_addr;
 
        pcp = pdev->sysdata;
        iommu = pcp->pbm->iommu;
@@ -772,36 +809,14 @@ void pci_dma_sync_sg_for_cpu(struct pci_dev *pdev, struct scatterlist *sglist, i
        }
 
        /* Step 2: Kick data out of streaming buffers. */
-       PCI_STC_FLUSHFLAG_INIT(strbuf);
-       if (iommu->iommu_ctxflush &&
-           strbuf->strbuf_ctxflush) {
-               unsigned long matchreg, flushreg;
-
-               flushreg = strbuf->strbuf_ctxflush;
-               matchreg = PCI_STC_CTXMATCH_ADDR(strbuf, ctx);
-               do {
-                       pci_iommu_write(flushreg, ctx);
-               } while (((long)pci_iommu_read(matchreg)) < 0L);
-       } else {
-               unsigned long i, npages;
-               u32 bus_addr;
-
-               bus_addr = sglist[0].dma_address & IO_PAGE_MASK;
-
-               for(i = 1; i < nelems; i++)
-                       if (!sglist[i].dma_length)
-                               break;
-               i--;
-               npages = (IO_PAGE_ALIGN(sglist[i].dma_address + sglist[i].dma_length) - bus_addr) >> IO_PAGE_SHIFT;
-               for (i = 0; i < npages; i++, bus_addr += IO_PAGE_SIZE)
-                       pci_iommu_write(strbuf->strbuf_pflush, bus_addr);
-       }
-
-       /* Step 3: Perform flush synchronization sequence. */
-       pci_iommu_write(strbuf->strbuf_fsync, strbuf->strbuf_flushflag_pa);
-       (void) pci_iommu_read(iommu->write_complete_reg);
-       while (!PCI_STC_FLUSHFLAG_SET(strbuf))
-               membar("#LoadLoad");
+       bus_addr = sglist[0].dma_address & IO_PAGE_MASK;
+       for(i = 1; i < nelems; i++)
+               if (!sglist[i].dma_length)
+                       break;
+       i--;
+       npages = (IO_PAGE_ALIGN(sglist[i].dma_address + sglist[i].dma_length)
+                 - bus_addr) >> IO_PAGE_SHIFT;
+       pci_strbuf_flush(strbuf, iommu, bus_addr, ctx, npages, direction);
 
        spin_unlock_irqrestore(&iommu->lock, flags);
 }
index 3567fa879e1fe7a900e545704ad97593d01cc820..534320ef0db2a43992ac6341df4c444d9ccc2182 100644 (file)
@@ -1212,7 +1212,7 @@ static void __init psycho_iommu_init(struct pci_controller_info *p)
 
        /* Setup initial software IOMMU state. */
        spin_lock_init(&iommu->lock);
-       iommu->iommu_cur_ctx = 0;
+       iommu->ctx_lowest_free = 1;
 
        /* Register addresses. */
        iommu->iommu_control  = p->pbm_A.controller_regs + PSYCHO_IOMMU_CONTROL;
index 5525d1ec4af883884404d13b17ddc6deda8379f5..53d333b4a4e809f7ebf48231c46bb5e65af86ec3 100644 (file)
@@ -1265,7 +1265,7 @@ static void __init sabre_iommu_init(struct pci_controller_info *p,
 
        /* Setup initial software IOMMU state. */
        spin_lock_init(&iommu->lock);
-       iommu->iommu_cur_ctx = 0;
+       iommu->ctx_lowest_free = 1;
 
        /* Register addresses. */
        iommu->iommu_control  = p->pbm_A.controller_regs + SABRE_IOMMU_CONTROL;
index e93fcadc37229f99221d1e7781941e5f00ddf0b1..5753175b94e6c91da7eb7ad91fcf197585bf3c98 100644 (file)
@@ -1753,7 +1753,7 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
 
        /* Setup initial software IOMMU state. */
        spin_lock_init(&iommu->lock);
-       iommu->iommu_cur_ctx = 0;
+       iommu->ctx_lowest_free = 1;
 
        /* Register addresses, SCHIZO has iommu ctx flushing. */
        iommu->iommu_control  = pbm->pbm_regs + SCHIZO_IOMMU_CONTROL;
index 14d9c3a21b9aab04d79a0fb60703a4661cf2c80d..89f5e019f24c02ade1ed11ab0c6ed721de1b4bfd 100644 (file)
@@ -117,19 +117,42 @@ static void iommu_flush(struct sbus_iommu *iommu, u32 base, unsigned long npages
 
 #define STRBUF_TAG_VALID       0x02UL
 
-static void strbuf_flush(struct sbus_iommu *iommu, u32 base, unsigned long npages)
+static void sbus_strbuf_flush(struct sbus_iommu *iommu, u32 base, unsigned long npages, int direction)
 {
-       iommu->strbuf_flushflag = 0UL;
-       while (npages--)
-               upa_writeq(base + (npages << IO_PAGE_SHIFT),
+       unsigned long n;
+       int limit;
+
+       n = npages;
+       while (n--)
+               upa_writeq(base + (n << IO_PAGE_SHIFT),
                           iommu->strbuf_regs + STRBUF_PFLUSH);
 
+       /* If the device could not have possibly put dirty data into
+        * the streaming cache, no flush-flag synchronization needs
+        * to be performed.
+        */
+       if (direction == SBUS_DMA_TODEVICE)
+               return;
+
+       iommu->strbuf_flushflag = 0UL;
+
        /* Whoopee cushion! */
        upa_writeq(__pa(&iommu->strbuf_flushflag),
                   iommu->strbuf_regs + STRBUF_FSYNC);
        upa_readq(iommu->sbus_control_reg);
-       while (iommu->strbuf_flushflag == 0UL)
+
+       limit = 100000;
+       while (iommu->strbuf_flushflag == 0UL) {
+               limit--;
+               if (!limit)
+                       break;
+               udelay(1);
                membar("#LoadLoad");
+       }
+       if (!limit)
+               printk(KERN_WARNING "sbus_strbuf_flush: flushflag timeout "
+                      "vaddr[%08x] npages[%ld]\n",
+                      base, npages);
 }
 
 static iopte_t *alloc_streaming_cluster(struct sbus_iommu *iommu, unsigned long npages)
@@ -406,7 +429,7 @@ void sbus_unmap_single(struct sbus_dev *sdev, dma_addr_t dma_addr, size_t size,
 
        spin_lock_irqsave(&iommu->lock, flags);
        free_streaming_cluster(iommu, dma_base, size >> IO_PAGE_SHIFT);
-       strbuf_flush(iommu, dma_base, size >> IO_PAGE_SHIFT);
+       sbus_strbuf_flush(iommu, dma_base, size >> IO_PAGE_SHIFT, direction);
        spin_unlock_irqrestore(&iommu->lock, flags);
 }
 
@@ -569,7 +592,7 @@ void sbus_unmap_sg(struct sbus_dev *sdev, struct scatterlist *sg, int nents, int
        iommu = sdev->bus->iommu;
        spin_lock_irqsave(&iommu->lock, flags);
        free_streaming_cluster(iommu, dvma_base, size >> IO_PAGE_SHIFT);
-       strbuf_flush(iommu, dvma_base, size >> IO_PAGE_SHIFT);
+       sbus_strbuf_flush(iommu, dvma_base, size >> IO_PAGE_SHIFT, direction);
        spin_unlock_irqrestore(&iommu->lock, flags);
 }
 
@@ -581,7 +604,7 @@ void sbus_dma_sync_single_for_cpu(struct sbus_dev *sdev, dma_addr_t base, size_t
        size = (IO_PAGE_ALIGN(base + size) - (base & IO_PAGE_MASK));
 
        spin_lock_irqsave(&iommu->lock, flags);
-       strbuf_flush(iommu, base & IO_PAGE_MASK, size >> IO_PAGE_SHIFT);
+       sbus_strbuf_flush(iommu, base & IO_PAGE_MASK, size >> IO_PAGE_SHIFT, direction);
        spin_unlock_irqrestore(&iommu->lock, flags);
 }
 
@@ -605,7 +628,7 @@ void sbus_dma_sync_sg_for_cpu(struct sbus_dev *sdev, struct scatterlist *sg, int
        size = IO_PAGE_ALIGN(sg[i].dma_address + sg[i].dma_length) - base;
 
        spin_lock_irqsave(&iommu->lock, flags);
-       strbuf_flush(iommu, base, size >> IO_PAGE_SHIFT);
+       sbus_strbuf_flush(iommu, base, size >> IO_PAGE_SHIFT, direction);
        spin_unlock_irqrestore(&iommu->lock, flags);
 }
 
index 12c3d84b7460cb987fc511e0675f0ef5234f58c3..b7e6a91952b213dacfe1ce43e2497df4192de634 100644 (file)
@@ -383,6 +383,17 @@ static void __init process_switch(char c)
                /* Use PROM debug console. */
                register_console(&prom_debug_console);
                break;
+       case 'P':
+               /* Force UltraSPARC-III P-Cache on. */
+               if (tlb_type != cheetah) {
+                       printk("BOOT: Ignoring P-Cache force option.\n");
+                       break;
+               }
+               cheetah_pcache_forced_on = 1;
+               add_taint(TAINT_MACHINE_CHECK);
+               cheetah_enable_pcache();
+               break;
+
        default:
                printk("Unknown boot switch (-%c)\n", c);
                break;
index 6dff06a44e76ed4730d6919fb0c09f3f044f8a42..e5b9c7a27789853d13c6e350afabdfb123092373 100644 (file)
@@ -123,6 +123,9 @@ void __init smp_callin(void)
 
        smp_setup_percpu_timer();
 
+       if (cheetah_pcache_forced_on)
+               cheetah_enable_pcache();
+
        local_irq_enable();
 
        calibrate_delay();
index 0077f02f4b374e34ced8a57e03490a6dd06c2165..5f8c822a2b4a4a3dbcdab26809d94a90679682d8 100644 (file)
@@ -84,6 +84,10 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi
                        return addr;
        }
 
+       if (len <= mm->cached_hole_size) {
+               mm->cached_hole_size = 0;
+               mm->free_area_cache = TASK_UNMAPPED_BASE;
+       }
        start_addr = addr = mm->free_area_cache;
 
        task_size -= len;
@@ -103,6 +107,7 @@ full_search:
                if (task_size < addr) {
                        if (start_addr != TASK_UNMAPPED_BASE) {
                                start_addr = addr = TASK_UNMAPPED_BASE;
+                               mm->cached_hole_size = 0;
                                goto full_search;
                        }
                        return -ENOMEM;
@@ -114,6 +119,9 @@ full_search:
                        mm->free_area_cache = addr + len;
                        return addr;
                }
+               if (addr + mm->cached_hole_size < vma->vm_start)
+                       mm->cached_hole_size = vma->vm_start - addr;
+
                addr = vma->vm_end;
                if (do_color_align)
                        addr = COLOUR_ALIGN(addr, pgoff);
index 56b203a2af696e43491e8e4dba0057daa72b95db..a9f4596d7c2bcd82419386d808b5f35d69d2a46a 100644 (file)
@@ -421,6 +421,25 @@ asmlinkage void cee_log(unsigned long ce_status,
        }
 }
 
+int cheetah_pcache_forced_on;
+
+void cheetah_enable_pcache(void)
+{
+       unsigned long dcr;
+
+       printk("CHEETAH: Enabling P-Cache on cpu %d.\n",
+              smp_processor_id());
+
+       __asm__ __volatile__("ldxa [%%g0] %1, %0"
+                            : "=r" (dcr)
+                            : "i" (ASI_DCU_CONTROL_REG));
+       dcr |= (DCU_PE | DCU_HPE | DCU_SPE | DCU_SL);
+       __asm__ __volatile__("stxa %0, [%%g0] %1\n\t"
+                            "membar #Sync"
+                            : /* no outputs */
+                            : "r" (dcr), "i" (ASI_DCU_CONTROL_REG));
+}
+
 /* Cheetah error trap handling. */
 static unsigned long ecache_flush_physbase;
 static unsigned long ecache_flush_linesize;
index f6b4c784d53e05111fbda459f465c04d20c8cc43..e8808727617a146aea231267d4fafe7beb8e8132 100644 (file)
@@ -31,7 +31,7 @@ void __const_udelay(unsigned long n)
 {
        n *= 4;
 
-       n *= (cpu_data(_smp_processor_id()).udelay_val * (HZ/4));
+       n *= (cpu_data(raw_smp_processor_id()).udelay_val * (HZ/4));
        n >>= 32;
 
        __delay(n + 1);
index 5a1f831b2de1b0ef92032a0ed34dff5a8ff48fcb..625cbb336a239df14cfe2eff88776cbb028353f6 100644 (file)
@@ -22,7 +22,7 @@
 #include <asm/cacheflush.h>
 #include <asm/mmu_context.h>
 
-static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
+pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
 {
        pgd_t *pgd;
        pud_t *pud;
@@ -41,7 +41,7 @@ static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
        return pte;
 }
 
-static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
+pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
 {
        pgd_t *pgd;
        pud_t *pud;
@@ -62,30 +62,34 @@ static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
 
 #define mk_pte_huge(entry) do { pte_val(entry) |= _PAGE_SZHUGE; } while (0)
 
-static void set_huge_pte(struct mm_struct *mm, struct vm_area_struct *vma,
-                        unsigned long addr,
-                        struct page *page, pte_t * page_table, int write_access)
+void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
+                    pte_t *ptep, pte_t entry)
 {
-       unsigned long i;
-       pte_t entry;
+       int i;
+
+       for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
+               set_pte_at(mm, addr, ptep, entry);
+               ptep++;
+               addr += PAGE_SIZE;
+               pte_val(entry) += PAGE_SIZE;
+       }
+}
 
-       add_mm_counter(mm, rss, HPAGE_SIZE / PAGE_SIZE);
+pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
+                             pte_t *ptep)
+{
+       pte_t entry;
+       int i;
 
-       if (write_access)
-               entry = pte_mkwrite(pte_mkdirty(mk_pte(page,
-                                                      vma->vm_page_prot)));
-       else
-               entry = pte_wrprotect(mk_pte(page, vma->vm_page_prot));
-       entry = pte_mkyoung(entry);
-       mk_pte_huge(entry);
+       entry = *ptep;
 
        for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
-               set_pte_at(mm, addr, page_table, entry);
-               page_table++;
+               pte_clear(mm, addr, ptep);
                addr += PAGE_SIZE;
-
-               pte_val(entry) += PAGE_SIZE;
+               ptep++;
        }
+
+       return entry;
 }
 
 /*
@@ -100,79 +104,6 @@ int is_aligned_hugepage_range(unsigned long addr, unsigned long len)
        return 0;
 }
 
-int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
-                           struct vm_area_struct *vma)
-{
-       pte_t *src_pte, *dst_pte, entry;
-       struct page *ptepage;
-       unsigned long addr = vma->vm_start;
-       unsigned long end = vma->vm_end;
-       int i;
-
-       while (addr < end) {
-               dst_pte = huge_pte_alloc(dst, addr);
-               if (!dst_pte)
-                       goto nomem;
-               src_pte = huge_pte_offset(src, addr);
-               BUG_ON(!src_pte || pte_none(*src_pte));
-               entry = *src_pte;
-               ptepage = pte_page(entry);
-               get_page(ptepage);
-               for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
-                       set_pte_at(dst, addr, dst_pte, entry);
-                       pte_val(entry) += PAGE_SIZE;
-                       dst_pte++;
-                       addr += PAGE_SIZE;
-               }
-               add_mm_counter(dst, rss, HPAGE_SIZE / PAGE_SIZE);
-       }
-       return 0;
-
-nomem:
-       return -ENOMEM;
-}
-
-int follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma,
-                       struct page **pages, struct vm_area_struct **vmas,
-                       unsigned long *position, int *length, int i)
-{
-       unsigned long vaddr = *position;
-       int remainder = *length;
-
-       WARN_ON(!is_vm_hugetlb_page(vma));
-
-       while (vaddr < vma->vm_end && remainder) {
-               if (pages) {
-                       pte_t *pte;
-                       struct page *page;
-
-                       pte = huge_pte_offset(mm, vaddr);
-
-                       /* hugetlb should be locked, and hence, prefaulted */
-                       BUG_ON(!pte || pte_none(*pte));
-
-                       page = pte_page(*pte);
-
-                       WARN_ON(!PageCompound(page));
-
-                       get_page(page);
-                       pages[i] = page;
-               }
-
-               if (vmas)
-                       vmas[i] = vma;
-
-               vaddr += PAGE_SIZE;
-               --remainder;
-               ++i;
-       }
-
-       *length = remainder;
-       *position = vaddr;
-
-       return i;
-}
-
 struct page *follow_huge_addr(struct mm_struct *mm,
                              unsigned long address, int write)
 {
@@ -190,34 +121,6 @@ struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
        return NULL;
 }
 
-void unmap_hugepage_range(struct vm_area_struct *vma,
-                         unsigned long start, unsigned long end)
-{
-       struct mm_struct *mm = vma->vm_mm;
-       unsigned long address;
-       pte_t *pte;
-       struct page *page;
-       int i;
-
-       BUG_ON(start & (HPAGE_SIZE - 1));
-       BUG_ON(end & (HPAGE_SIZE - 1));
-
-       for (address = start; address < end; address += HPAGE_SIZE) {
-               pte = huge_pte_offset(mm, address);
-               BUG_ON(!pte);
-               if (pte_none(*pte))
-                       continue;
-               page = pte_page(*pte);
-               put_page(page);
-               for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
-                       pte_clear(mm, address+(i*PAGE_SIZE), pte);
-                       pte++;
-               }
-       }
-       add_mm_counter(mm, rss, -((end - start) >> PAGE_SHIFT));
-       flush_tlb_range(vma, start, end);
-}
-
 static void context_reload(void *__data)
 {
        struct mm_struct *mm = __data;
@@ -226,12 +129,8 @@ static void context_reload(void *__data)
                load_secondary_context(mm);
 }
 
-int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
+void hugetlb_prefault_arch_hook(struct mm_struct *mm)
 {
-       struct mm_struct *mm = current->mm;
-       unsigned long addr;
-       int ret = 0;
-
        /* On UltraSPARC-III+ and later, configure the second half of
         * the Data-TLB for huge pages.
         */
@@ -261,50 +160,4 @@ int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
                }
                spin_unlock(&ctx_alloc_lock);
        }
-
-       BUG_ON(vma->vm_start & ~HPAGE_MASK);
-       BUG_ON(vma->vm_end & ~HPAGE_MASK);
-
-       spin_lock(&mm->page_table_lock);
-       for (addr = vma->vm_start; addr < vma->vm_end; addr += HPAGE_SIZE) {
-               unsigned long idx;
-               pte_t *pte = huge_pte_alloc(mm, addr);
-               struct page *page;
-
-               if (!pte) {
-                       ret = -ENOMEM;
-                       goto out;
-               }
-               if (!pte_none(*pte))
-                       continue;
-
-               idx = ((addr - vma->vm_start) >> HPAGE_SHIFT)
-                       + (vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT));
-               page = find_get_page(mapping, idx);
-               if (!page) {
-                       /* charge the fs quota first */
-                       if (hugetlb_get_quota(mapping)) {
-                               ret = -ENOMEM;
-                               goto out;
-                       }
-                       page = alloc_huge_page();
-                       if (!page) {
-                               hugetlb_put_quota(mapping);
-                               ret = -ENOMEM;
-                               goto out;
-                       }
-                       ret = add_to_page_cache(page, mapping, idx, GFP_ATOMIC);
-                       if (! ret) {
-                               unlock_page(page);
-                       } else {
-                               hugetlb_put_quota(mapping);
-                               free_huge_page(page);
-                               goto out;
-                       }
-               }
-               set_huge_pte(mm, vma, addr, page, pte, vma->vm_flags & VM_WRITE);
-       }
-out:
-       spin_unlock(&mm->page_table_lock);
-       return ret;
 }
index ec8e074c4eac18ce7179f898390c8a250ed645b4..06740582717e4427da136ed80b139b4aa40cbf05 100644 (file)
@@ -317,8 +317,10 @@ asmlinkage int solaris_sendmsg(int fd, struct sol_nmsghdr __user *user_msg, unsi
                unsigned long *kcmsg;
                compat_size_t cmlen;
 
-               if(kern_msg.msg_controllen > sizeof(ctl) &&
-                  kern_msg.msg_controllen <= 256) {
+               if (kern_msg.msg_controllen <= sizeof(compat_size_t))
+                       return -EINVAL;
+
+               if(kern_msg.msg_controllen > sizeof(ctl)) {
                        err = -ENOBUFS;
                        ctl_buf = kmalloc(kern_msg.msg_controllen, GFP_KERNEL);
                        if(!ctl_buf)
index c5292181a6642f601986102255691d1924b6a37b..b8e952c88fd1280f704737c95ef3e387ca055f64 100644 (file)
@@ -35,6 +35,11 @@ config GENERIC_CALIBRATE_DELAY
        bool
        default y
 
+# Used in kernel/irq/manage.c and include/linux/irq.h
+config IRQ_RELEASE_METHOD
+       bool
+       default y
+
 menu "UML-specific options"
 
 config MODE_TT
index b89989de364d1dbe650e988c5ec009b73acc5ba0..bd41e4286d0d4b743fafc74a993f167c7cac0955 100644 (file)
@@ -2,10 +2,6 @@ menu "Kernel hacking"
 
 source "lib/Kconfig.debug"
 
-config FRAME_POINTER
-       bool
-       default y if DEBUG_INFO
-
 config PT_PROXY
        bool "Enable ptrace proxy"
        depends on XTERM_CHAN && DEBUG_INFO && MODE_TT
index 3e50fdb67626a20a64a85fa6e4d9ec748bcc28ca..62d87b71179b5b63497d6183c6b2f3c66c994fc1 100644 (file)
@@ -204,5 +204,11 @@ config UML_RANDOM
        http://sourceforge.net/projects/gkernel/).  rngd periodically reads
        /dev/hwrng and injects the entropy into /dev/random.
 
+config MMAPPER
+       tristate "iomem emulation driver"
+       help
+       This driver allows a host file to be used as emulated IO memory inside
+       UML.
+
 endmenu
 
index fd8d7e8982b19b6c066e80b8d46db30eafa3bd77..f162f50f0b179539c5a6f8c0dfa439dc47ebfff5 100644 (file)
@@ -6,6 +6,10 @@ config 64BIT
        bool
        default y
 
+config TOP_ADDR
+       hex
+       default 0x80000000
+
 config 3_LEVEL_PGTABLES
        bool
        default y
index f2a0c40a9204d5efa76437a45bcec5aaa84fb02d..3f073902351fb28cc82ac95be4a8de3a9f1586f9 100644 (file)
@@ -122,7 +122,7 @@ endif
 CPPFLAGS_vmlinux.lds = $(shell echo -U$(SUBARCH) \
        -DSTART=$(START) -DELF_ARCH=$(ELF_ARCH) \
        -DELF_FORMAT=\"$(ELF_FORMAT)\" $(CPP_MODE-y) \
-       -DKERNEL_STACK_SIZE=$(STACK_SIZE))
+       -DKERNEL_STACK_SIZE=$(STACK_SIZE) -DSUBARCH=$(SUBARCH))
 
 #The wrappers will select whether using "malloc" or the kernel allocator.
 LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc
index 323f72c64cd207bb14e77280e540df3f7957ca45..b2de9916c32c08a543325dde86d8069f1535ea5a 100644 (file)
@@ -22,8 +22,8 @@ obj-y := stdio_console.o fd.o chan_kern.o chan_user.o line.o
 obj-$(CONFIG_SSL) += ssl.o
 obj-$(CONFIG_STDERR_CONSOLE) += stderr_console.o
 
-obj-$(CONFIG_UML_NET_SLIP) += slip.o
-obj-$(CONFIG_UML_NET_SLIRP) += slirp.o
+obj-$(CONFIG_UML_NET_SLIP) += slip.o slip_common.o
+obj-$(CONFIG_UML_NET_SLIRP) += slirp.o slip_common.o
 obj-$(CONFIG_UML_NET_DAEMON) += daemon.o 
 obj-$(CONFIG_UML_NET_MCAST) += mcast.o 
 #obj-$(CONFIG_UML_NET_PCAP) += pcap.o $(PCAP)
@@ -41,6 +41,6 @@ obj-$(CONFIG_UML_WATCHDOG) += harddog.o
 obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_user.o
 obj-$(CONFIG_UML_RANDOM) += random.o
 
-USER_OBJS := fd.o null.o pty.o tty.o xterm.o
+USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o
 
 include arch/um/scripts/Makefile.rules
index 0150038af795f054e66b8331f9ffcf4d2e8d612a..14a12d6b3df6e89c695860170ce10145d1556f0d 100644 (file)
 #include "os.h"
 
 #ifdef CONFIG_NOCONFIG_CHAN
+
+/* The printk's here are wrong because we are complaining that there is no
+ * output device, but printk is printing to that output device.  The user will
+ * never see the error.  printf would be better, except it can't run on a
+ * kernel stack because it will overflow it.
+ * Use printk for now since that will avoid crashing.
+ */
+
 static void *not_configged_init(char *str, int device, struct chan_opts *opts)
 {
-       printf(KERN_ERR "Using a channel type which is configured out of "
+       printk(KERN_ERR "Using a channel type which is configured out of "
               "UML\n");
        return(NULL);
 }
@@ -30,27 +38,27 @@ static void *not_configged_init(char *str, int device, struct chan_opts *opts)
 static int not_configged_open(int input, int output, int primary, void *data,
                              char **dev_out)
 {
-       printf(KERN_ERR "Using a channel type which is configured out of "
+       printk(KERN_ERR "Using a channel type which is configured out of "
               "UML\n");
        return(-ENODEV);
 }
 
 static void not_configged_close(int fd, void *data)
 {
-       printf(KERN_ERR "Using a channel type which is configured out of "
+       printk(KERN_ERR "Using a channel type which is configured out of "
               "UML\n");
 }
 
 static int not_configged_read(int fd, char *c_out, void *data)
 {
-       printf(KERN_ERR "Using a channel type which is configured out of "
+       printk(KERN_ERR "Using a channel type which is configured out of "
               "UML\n");
        return(-EIO);
 }
 
 static int not_configged_write(int fd, const char *buf, int len, void *data)
 {
-       printf(KERN_ERR "Using a channel type which is configured out of "
+       printk(KERN_ERR "Using a channel type which is configured out of "
               "UML\n");
        return(-EIO);
 }
@@ -58,7 +66,7 @@ static int not_configged_write(int fd, const char *buf, int len, void *data)
 static int not_configged_console_write(int fd, const char *buf, int len,
                                       void *data)
 {
-       printf(KERN_ERR "Using a channel type which is configured out of "
+       printk(KERN_ERR "Using a channel type which is configured out of "
               "UML\n");
        return(-EIO);
 }
@@ -66,7 +74,7 @@ static int not_configged_console_write(int fd, const char *buf, int len,
 static int not_configged_window_size(int fd, void *data, unsigned short *rows,
                                     unsigned short *cols)
 {
-       printf(KERN_ERR "Using a channel type which is configured out of "
+       printk(KERN_ERR "Using a channel type which is configured out of "
               "UML\n");
        return(-ENODEV);
 }
index 583b8e137c334fe5dba0dee27c937eca6733b293..5d3768156c92b3a9653ac022ce6b9c1f3f486719 100644 (file)
@@ -143,22 +143,22 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out)
 {
        struct winch_data data;
        unsigned long stack;
-       int fds[2], pid, n, err;
+       int fds[2], n, err;
        char c;
 
        err = os_pipe(fds, 1, 1);
        if(err < 0){
                printk("winch_tramp : os_pipe failed, err = %d\n", -err);
-               return(err);
+               goto out;
        }
 
        data = ((struct winch_data) { .pty_fd           = fd,
                                      .pipe_fd          = fds[1],
                                      .close_me         = fds[0] } );
-       pid = run_helper_thread(winch_thread, &data, 0, &stack, 0);
-       if(pid < 0){
+       err = run_helper_thread(winch_thread, &data, 0, &stack, 0);
+       if(err < 0){
                printk("fork of winch_thread failed - errno = %d\n", errno);
-               return(pid);
+               goto out_close;
        }
 
        os_close_file(fds[1]);
@@ -168,14 +168,22 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out)
                printk("winch_tramp : failed to read synchronization byte\n");
                printk("read failed, err = %d\n", -n);
                printk("fd %d will not support SIGWINCH\n", fd);
-               *fd_out = -1;
+                err = -EINVAL;
+               goto out_close1;
        }
-       return(pid);
+       return err ;
+
+ out_close:
+       os_close_file(fds[1]);
+ out_close1:
+       os_close_file(fds[0]);
+ out:
+       return err;
 }
 
 void register_winch(int fd, struct tty_struct *tty)
 {
-       int pid, thread, thread_fd;
+       int pid, thread, thread_fd = -1;
        int count;
        char c = 1;
 
@@ -186,7 +194,7 @@ void register_winch(int fd, struct tty_struct *tty)
        if(!CHOOSE_MODE_PROC(is_tracer_winch, is_skas_winch, pid, fd,
                             tty) && (pid == -1)){
                thread = winch_tramp(fd, tty, &thread_fd);
-               if(fd != -1){
+               if(thread > 0){
                        register_winch_irq(thread_fd, fd, thread, tty);
 
                        count = os_write_file(thread_fd, &c, sizeof(c));
index 025d3be8aca4ae522e40b6aaa2a8623834805243..0f59736db329587d079b910279a035d409f4e884 100644 (file)
@@ -406,14 +406,12 @@ void line_disable(struct tty_struct *tty, int current_irq)
        if(line->driver->read_irq == current_irq)
                free_irq_later(line->driver->read_irq, tty);
        else {
-               free_irq_by_irq_and_dev(line->driver->read_irq, tty);
                free_irq(line->driver->read_irq, tty);
        }
 
        if(line->driver->write_irq == current_irq)
                free_irq_later(line->driver->write_irq, tty);
        else {
-               free_irq_by_irq_and_dev(line->driver->write_irq, tty);
                free_irq(line->driver->write_irq, tty);
        }
 
@@ -758,7 +756,6 @@ static void unregister_winch(struct tty_struct *tty)
         if(winch->pid != -1)
                 os_kill_process(winch->pid, 1);
 
-        free_irq_by_irq_and_dev(WINCH_IRQ, winch);
         free_irq(WINCH_IRQ, winch);
         list_del(&winch->list);
         kfree(winch);
index faf714e87b5b1a8bd78663b18c37c3799b29fb07..217438cdef336fff7e609fbb63378a541c3e93f4 100644 (file)
@@ -73,7 +73,6 @@ int mcast_setup(char *str, char **mac_out, void *data)
        struct mcast_init *init = data;
        char *port_str = NULL, *ttl_str = NULL, *remain;
        char *last;
-       int n;
 
        *init = ((struct mcast_init)
                { .addr         = "239.192.168.1",
@@ -89,13 +88,12 @@ int mcast_setup(char *str, char **mac_out, void *data)
        }
        
        if(port_str != NULL){
-               n = simple_strtoul(port_str, &last, 10);
+               init->port = simple_strtoul(port_str, &last, 10);
                if((*last != '\0') || (last == port_str)){
                        printk(KERN_ERR "mcast_setup - Bad port : '%s'\n", 
                               port_str);
                        return(0);
                }
-               init->port = htons(n);
        }
 
        if(ttl_str != NULL){
index 0fe1d9fa9139a8b326ed831527c48e49f378eb2f..7a0d115b29d09e8b9361668e424c208c0f1a6e5b 100644 (file)
@@ -38,7 +38,7 @@ static struct sockaddr_in *new_addr(char *addr, unsigned short port)
        }
        sin->sin_family = AF_INET;
        sin->sin_addr.s_addr = in_aton(addr);
-       sin->sin_port = port;
+       sin->sin_port = htons(port);
        return(sin);
 }
 
@@ -55,28 +55,25 @@ static int mcast_open(void *data)
        struct mcast_data *pri = data;
        struct sockaddr_in *sin = pri->mcast_addr;
        struct ip_mreq mreq;
-       int fd, yes = 1;
+       int fd = -EINVAL, yes = 1, err = -EINVAL;;
 
 
-       if ((sin->sin_addr.s_addr == 0) || (sin->sin_port == 0)) {
-               fd = -EINVAL;
+       if ((sin->sin_addr.s_addr == 0) || (sin->sin_port == 0))
                goto out;
-       }
 
        fd = socket(AF_INET, SOCK_DGRAM, 0);
+
        if (fd < 0){
                printk("mcast_open : data socket failed, errno = %d\n", 
                       errno);
-               fd = -ENOMEM;
+               fd = -errno;
                goto out;
        }
 
        if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0) {
                printk("mcast_open: SO_REUSEADDR failed, errno = %d\n",
                        errno);
-               os_close_file(fd);
-               fd = -EINVAL;
-               goto out;
+               goto out_close;
        }
 
        /* set ttl according to config */
@@ -84,26 +81,20 @@ static int mcast_open(void *data)
                       sizeof(pri->ttl)) < 0) {
                printk("mcast_open: IP_MULTICAST_TTL failed, error = %d\n",
                        errno);
-               os_close_file(fd);
-               fd = -EINVAL;
-               goto out;
+               goto out_close;
        }
 
        /* set LOOP, so data does get fed back to local sockets */
        if (setsockopt(fd, SOL_IP, IP_MULTICAST_LOOP, &yes, sizeof(yes)) < 0) {
                printk("mcast_open: IP_MULTICAST_LOOP failed, error = %d\n",
                        errno);
-               os_close_file(fd);
-               fd = -EINVAL;
-               goto out;
+               goto out_close;
        }
 
        /* bind socket to mcast address */
        if (bind(fd, (struct sockaddr *) sin, sizeof(*sin)) < 0) {
                printk("mcast_open : data bind failed, errno = %d\n", errno);
-               os_close_file(fd);
-               fd = -EINVAL;
-               goto out;
+               goto out_close;
        }               
        
        /* subscribe to the multicast group */
@@ -117,12 +108,15 @@ static int mcast_open(void *data)
                       "interface on the host.\n");
                printk("eth0 should be configured in order to use the "
                       "multicast transport.\n");
-               os_close_file(fd);
-               fd = -EINVAL;
+                goto out_close;
        }
 
  out:
-       return(fd);
+       return fd;
+
+ out_close:
+        os_close_file(fd);
+        return err;
 }
 
 static void mcast_close(int fd, void *data)
@@ -164,14 +158,3 @@ struct net_user_info mcast_user_info = {
        .delete_address = NULL,
        .max_packet     = MAX_PACKET - ETH_HEADER_OTHER
 };
-
-/*
- * 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 a63231dffe058efc6ace1a2364715fd39f081df4..a37a5ac13c22b8fb709d0ced7ec5db0a2629ce63 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/slab.h>
 #include <linux/init.h> 
 #include <linux/smp_lock.h>
+#include <linux/miscdevice.h>
 #include <asm/uaccess.h>
 #include <asm/irq.h>
 #include <asm/pgtable.h>
@@ -117,24 +118,39 @@ static struct file_operations mmapper_fops = {
        .release        = mmapper_release,
 };
 
+static struct miscdevice mmapper_dev = {
+       .minor          = MISC_DYNAMIC_MINOR,
+       .name           = "mmapper",
+       .fops           = &mmapper_fops
+};
+
 static int __init mmapper_init(void)
 {
+       int err;
+
        printk(KERN_INFO "Mapper v0.1\n");
 
        v_buf = (char *) find_iomem("mmapper", &mmapper_size);
        if(mmapper_size == 0){
                printk(KERN_ERR "mmapper_init - find_iomem failed\n");
-               return(0);
+               goto out;
        }
 
-       p_buf = __pa(v_buf);
+       err = misc_register(&mmapper_dev);
+       if(err){
+               printk(KERN_ERR "mmapper - misc_register failed, err = %d\n",
+                      err);
+               goto out;
+       }
 
-       devfs_mk_cdev(MKDEV(30, 0), S_IFCHR|S_IRUGO|S_IWUGO, "mmapper");
-       return(0);
+       p_buf = __pa(v_buf);
+out:
+       return 0;
 }
 
 static void mmapper_exit(void)
 {
+       misc_deregister(&mmapper_dev);
 }
 
 module_init(mmapper_init);
index 4eeaf88c1e97ba3bac425ff55b5cc904b4ee6d29..5388a7428691a2c4c12791b0e5370cd0b31685ba 100644 (file)
@@ -146,7 +146,6 @@ static int uml_net_close(struct net_device *dev)
        netif_stop_queue(dev);
        spin_lock(&lp->lock);
 
-       free_irq_by_irq_and_dev(dev->irq, dev);
        free_irq(dev->irq, dev);
        if(lp->close != NULL)
                (*lp->close)(lp->fd, &lp->user);
index 47229fe4a8131022c13e09e4b2c660ab93b86013..3730d4f1271368e43ee147303973b8490ab153ea 100644 (file)
@@ -32,7 +32,7 @@ int tap_open_common(void *dev, char *gate_addr)
        return(0);
 }
 
-void tap_check_ips(char *gate_addr, char *eth_addr)
+void tap_check_ips(char *gate_addr, unsigned char *eth_addr)
 {
        int tap_addr[4];
 
index b5ee07472f79bb266822383c4c57c14a21481f7b..c41efd207fcc23b33cf35b09edd94d1c841893c8 100644 (file)
@@ -257,7 +257,6 @@ int port_wait(void *data)
                 * connection.  Then we loop here throwing out failed 
                 * connections until a good one is found.
                 */
-               free_irq_by_irq_and_dev(TELNETD_IRQ, conn);
                free_irq(TELNETD_IRQ, conn);
 
                if(conn->fd >= 0) break;
index d43e9fab05a769db0dfa53f84aa93527732a6155..f9e22198e011c911c7c2f1d36a1b8da742c2325e 100644 (file)
@@ -1,5 +1,10 @@
-/* Much of this ripped from hw_random.c */
-
+/* Copyright (C) 2005 Jeff Dike <jdike@addtoit.com> */
+/* Much of this ripped from drivers/char/hw_random.c, see there for other
+ * copyright.
+ *
+ * This software may be used and distributed according to the terms
+ * of the GNU General Public License, incorporated herein by reference.
+ */
 #include <linux/module.h>
 #include <linux/fs.h>
 #include <linux/miscdevice.h>
@@ -12,8 +17,6 @@
  */
 #define RNG_VERSION "1.0.0"
 #define RNG_MODULE_NAME "random"
-#define RNG_DRIVER_NAME   RNG_MODULE_NAME " virtual driver " RNG_VERSION
-#define PFX RNG_MODULE_NAME ": "
 
 #define RNG_MISCDEV_MINOR              183 /* official */
 
@@ -98,7 +101,7 @@ static int __init rng_init (void)
 
        err = misc_register (&rng_miscdev);
        if (err) {
-               printk (KERN_ERR PFX "misc device register failed\n");
+               printk (KERN_ERR RNG_MODULE_NAME ": misc device register failed\n");
                goto err_out_cleanup_hw;
        }
 
@@ -120,3 +123,6 @@ static void __exit rng_cleanup (void)
 
 module_init (rng_init);
 module_exit (rng_cleanup);
+
+MODULE_DESCRIPTION("UML Host Random Number Generator (RNG) driver");
+MODULE_LICENSE("GPL");
index 495f2f1b14202779b686bd93bb5dd053b8ac5bab..bb0dab41c2e43a464f5e7dbfe15c28aca84a197c 100644 (file)
@@ -1,10 +1,7 @@
 #ifndef __UM_SLIP_H
 #define __UM_SLIP_H
 
-#define BUF_SIZE 1500
- /* two bytes each for a (pathological) max packet of escaped chars +  * 
-  * terminating END char + initial END char                            */
-#define ENC_BUF_SIZE (2 * BUF_SIZE + 2)
+#include "slip_common.h"
 
 struct slip_data {
        void *dev;
@@ -12,28 +9,12 @@ struct slip_data {
        char *addr;
        char *gate_addr;
        int slave;
-       char ibuf[ENC_BUF_SIZE];
-       char obuf[ENC_BUF_SIZE];
-       int more; /* more data: do not read fd until ibuf has been drained */
-       int pos;
-       int esc;
+       struct slip_proto slip;
 };
 
 extern struct net_user_info slip_user_info;
 
-extern int set_umn_addr(int fd, char *addr, char *ptp_addr);
 extern int slip_user_read(int fd, void *buf, int len, struct slip_data *pri);
 extern int slip_user_write(int fd, void *buf, int len, struct slip_data *pri);
 
 #endif
-
-/*
- * 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:
- */
diff --git a/arch/um/drivers/slip_common.c b/arch/um/drivers/slip_common.c
new file mode 100644 (file)
index 0000000..e89cfc6
--- /dev/null
@@ -0,0 +1,54 @@
+#include <string.h>
+#include "slip_common.h"
+#include "net_user.h"
+
+int slip_proto_read(int fd, void *buf, int len, struct slip_proto *slip)
+{
+       int i, n, size, start;
+
+       if(slip->more > 0){
+               i = 0;
+               while(i < slip->more){
+                       size = slip_unesc(slip->ibuf[i++], slip->ibuf,
+                                         &slip->pos, &slip->esc);
+                       if(size){
+                               memcpy(buf, slip->ibuf, size);
+                               memmove(slip->ibuf, &slip->ibuf[i],
+                                       slip->more - i);
+                               slip->more = slip->more - i;
+                               return size;
+                       }
+               }
+               slip->more = 0;
+       }
+
+       n = net_read(fd, &slip->ibuf[slip->pos],
+                    sizeof(slip->ibuf) - slip->pos);
+       if(n <= 0)
+               return n;
+
+       start = slip->pos;
+       for(i = 0; i < n; i++){
+               size = slip_unesc(slip->ibuf[start + i], slip->ibuf,&slip->pos,
+                                 &slip->esc);
+               if(size){
+                       memcpy(buf, slip->ibuf, size);
+                       memmove(slip->ibuf, &slip->ibuf[start+i+1],
+                               n - (i + 1));
+                       slip->more = n - (i + 1);
+                       return size;
+               }
+       }
+       return 0;
+}
+
+int slip_proto_write(int fd, void *buf, int len, struct slip_proto *slip)
+{
+       int actual, n;
+
+       actual = slip_esc(buf, slip->obuf, len);
+       n = net_write(fd, slip->obuf, actual);
+       if(n < 0)
+               return n;
+       else return len;
+}
diff --git a/arch/um/drivers/slip_common.h b/arch/um/drivers/slip_common.h
new file mode 100644 (file)
index 0000000..2ae76d8
--- /dev/null
@@ -0,0 +1,104 @@
+#ifndef __UM_SLIP_COMMON_H
+#define __UM_SLIP_COMMON_H
+
+#define BUF_SIZE 1500
+ /* two bytes each for a (pathological) max packet of escaped chars +  *
+  * terminating END char + initial END char                            */
+#define ENC_BUF_SIZE (2 * BUF_SIZE + 2)
+
+/* SLIP protocol characters. */
+#define SLIP_END             0300      /* indicates end of frame       */
+#define SLIP_ESC             0333      /* indicates byte stuffing      */
+#define SLIP_ESC_END         0334      /* ESC ESC_END means END 'data' */
+#define SLIP_ESC_ESC         0335      /* ESC ESC_ESC means ESC 'data' */
+
+static inline int slip_unesc(unsigned char c, unsigned char *buf, int *pos,
+                             int *esc)
+{
+       int ret;
+
+       switch(c){
+       case SLIP_END:
+               *esc = 0;
+               ret=*pos;
+               *pos=0;
+               return(ret);
+       case SLIP_ESC:
+               *esc = 1;
+               return(0);
+       case SLIP_ESC_ESC:
+               if(*esc){
+                       *esc = 0;
+                       c = SLIP_ESC;
+               }
+               break;
+       case SLIP_ESC_END:
+               if(*esc){
+                       *esc = 0;
+                       c = SLIP_END;
+               }
+               break;
+       }
+       buf[(*pos)++] = c;
+       return(0);
+}
+
+static inline int slip_esc(unsigned char *s, unsigned char *d, int len)
+{
+       unsigned char *ptr = d;
+       unsigned char c;
+
+       /*
+        * Send an initial END character to flush out any
+        * data that may have accumulated in the receiver
+        * due to line noise.
+        */
+
+       *ptr++ = SLIP_END;
+
+       /*
+        * For each byte in the packet, send the appropriate
+        * character sequence, according to the SLIP protocol.
+        */
+
+       while (len-- > 0) {
+               switch(c = *s++) {
+               case SLIP_END:
+                       *ptr++ = SLIP_ESC;
+                       *ptr++ = SLIP_ESC_END;
+                       break;
+               case SLIP_ESC:
+                       *ptr++ = SLIP_ESC;
+                       *ptr++ = SLIP_ESC_ESC;
+                       break;
+               default:
+                       *ptr++ = c;
+                       break;
+               }
+       }
+       *ptr++ = SLIP_END;
+       return (ptr - d);
+}
+
+struct slip_proto {
+       unsigned char ibuf[ENC_BUF_SIZE];
+       unsigned char obuf[ENC_BUF_SIZE];
+       int more; /* more data: do not read fd until ibuf has been drained */
+       int pos;
+       int esc;
+};
+
+#define SLIP_PROTO_INIT { \
+       .ibuf   = { '\0' }, \
+       .obuf   = { '\0' }, \
+        .more  = 0, \
+       .pos    = 0, \
+       .esc    = 0 \
+}
+
+extern int slip_proto_read(int fd, void *buf, int len,
+                          struct slip_proto *slip);
+extern int slip_proto_write(int fd, void *buf, int len,
+                           struct slip_proto *slip);
+
+#endif
index 0886eedba213ad58926104b8c31b9899d39a82cc..9a6f5c85f902ad997a11538a51c8015a99fb5209 100644 (file)
@@ -26,16 +26,16 @@ void slip_init(struct net_device *dev, void *data)
                  .addr         = NULL,
                  .gate_addr    = init->gate_addr,
                  .slave        = -1,
-                 .ibuf         = { '\0' },
-                 .obuf         = { '\0' },
-                 .pos          = 0,
-                 .esc          = 0,
+                 .slip         = SLIP_PROTO_INIT,
                  .dev          = dev });
 
        dev->init = NULL;
+       dev->header_cache_update = NULL;
+       dev->hard_header_cache = NULL;
+       dev->hard_header = NULL;
        dev->hard_header_len = 0;
-       dev->addr_len = 4;
-       dev->type = ARPHRD_ETHER;
+       dev->addr_len = 0;
+       dev->type = ARPHRD_SLIP;
        dev->tx_queue_len = 256;
        dev->flags = IFF_NOARP;
        printk("SLIP backend - SLIP IP = %s\n", spri->gate_addr);
diff --git a/arch/um/drivers/slip_proto.h b/arch/um/drivers/slip_proto.h
deleted file mode 100644 (file)
index 7206361..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/* 
- * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
- * Licensed under the GPL
- */
-
-#ifndef __UM_SLIP_PROTO_H__
-#define __UM_SLIP_PROTO_H__
-
-/* SLIP protocol characters. */
-#define SLIP_END             0300      /* indicates end of frame       */
-#define SLIP_ESC             0333      /* indicates byte stuffing      */
-#define SLIP_ESC_END         0334      /* ESC ESC_END means END 'data' */
-#define SLIP_ESC_ESC         0335      /* ESC ESC_ESC means ESC 'data' */
-
-static inline int slip_unesc(unsigned char c,char *buf,int *pos, int *esc)
-{
-       int ret;
-
-       switch(c){
-       case SLIP_END:
-               *esc = 0;
-               ret=*pos;
-               *pos=0;
-               return(ret);
-       case SLIP_ESC:
-               *esc = 1;
-               return(0);
-       case SLIP_ESC_ESC:
-               if(*esc){
-                       *esc = 0;
-                       c = SLIP_ESC;
-               }
-               break;
-       case SLIP_ESC_END:
-               if(*esc){
-                       *esc = 0;
-                       c = SLIP_END;
-               }
-               break;
-       }
-       buf[(*pos)++] = c;
-       return(0);
-}
-
-static inline int slip_esc(unsigned char *s, unsigned char *d, int len)
-{
-       unsigned char *ptr = d;
-       unsigned char c;
-
-       /*
-        * Send an initial END character to flush out any
-        * data that may have accumulated in the receiver
-        * due to line noise.
-        */
-
-       *ptr++ = SLIP_END;
-
-       /*
-        * For each byte in the packet, send the appropriate
-        * character sequence, according to the SLIP protocol.
-        */
-
-       while (len-- > 0) {
-               switch(c = *s++) {
-               case SLIP_END:
-                       *ptr++ = SLIP_ESC;
-                       *ptr++ = SLIP_ESC_END;
-                       break;
-               case SLIP_ESC:
-                       *ptr++ = SLIP_ESC;
-                       *ptr++ = SLIP_ESC_ESC;
-                       break;
-               default:
-                       *ptr++ = c;
-                       break;
-               }
-       }
-       *ptr++ = SLIP_END;
-       return (ptr - d);
-}
-
-#endif
-
-/*
- * 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 d94846b1b4cfd319e94bbeafbbeb21d7de5979ad..71af444e591f8bff7b097ac57dc85376529fb677 100644 (file)
@@ -13,7 +13,7 @@
 #include "user.h"
 #include "net_user.h"
 #include "slip.h"
-#include "slip_proto.h"
+#include "slip_common.h"
 #include "helper.h"
 #include "os.h"
 
@@ -77,41 +77,51 @@ static int slip_tramp(char **argv, int fd)
        err = os_pipe(fds, 1, 0);
        if(err < 0){
                printk("slip_tramp : pipe failed, err = %d\n", -err);
-               return(err);
+               goto out;
        }
 
        err = 0;
        pe_data.stdin = fd;
        pe_data.stdout = fds[1];
        pe_data.close_me = fds[0];
-       pid = run_helper(slip_pre_exec, &pe_data, argv, NULL);
+       err = run_helper(slip_pre_exec, &pe_data, argv, NULL);
+       if(err < 0)
+               goto out_close;
+       pid = err;
+
+       output_len = page_size();
+       output = um_kmalloc(output_len);
+       if(output == NULL){
+               printk("slip_tramp : failed to allocate output buffer\n");
+               os_kill_process(pid, 1);
+               err = -ENOMEM;
+               goto out_free;
+       }
 
-       if(pid < 0) err = pid;
-       else {
-               output_len = page_size();
-               output = um_kmalloc(output_len);
-               if(output == NULL)
-                       printk("slip_tramp : failed to allocate output "
-                              "buffer\n");
-
-               os_close_file(fds[1]);
-               read_output(fds[0], output, output_len);
-               if(output != NULL){
-                       printk("%s", output);
-                       kfree(output);
-               }
-               CATCH_EINTR(err = waitpid(pid, &status, 0));
-               if(err < 0)
-                       err = errno;
-               else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 0)){
-                       printk("'%s' didn't exit with status 0\n", argv[0]);
-                       err = -EINVAL;
-               }
+       os_close_file(fds[1]);
+       read_output(fds[0], output, output_len);
+       printk("%s", output);
+
+       CATCH_EINTR(err = waitpid(pid, &status, 0));
+       if(err < 0)
+               err = errno;
+       else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 0)){
+               printk("'%s' didn't exit with status 0\n", argv[0]);
+               err = -EINVAL;
        }
+       else err = 0;
 
        os_close_file(fds[0]);
 
-       return(err);
+out_free:
+       kfree(output);
+       return err;
+
+out_close:
+       os_close_file(fds[0]);
+       os_close_file(fds[1]);
+out:
+       return err;
 }
 
 static int slip_open(void *data)
@@ -123,21 +133,26 @@ static int slip_open(void *data)
                         NULL };
        int sfd, mfd, err;
 
-       mfd = get_pty();
-       if(mfd < 0){
-               printk("umn : Failed to open pty, err = %d\n", -mfd);
-               return(mfd);
+       err = get_pty();
+       if(err < 0){
+               printk("slip-open : Failed to open pty, err = %d\n", -err);
+               goto out;
        }
-       sfd = os_open_file(ptsname(mfd), of_rdwr(OPENFLAGS()), 0);
-       if(sfd < 0){
-               printk("Couldn't open tty for slip line, err = %d\n", -sfd);
-               os_close_file(mfd);
-               return(sfd);
+       mfd = err;
+
+       err = os_open_file(ptsname(mfd), of_rdwr(OPENFLAGS()), 0);
+       if(err < 0){
+               printk("Couldn't open tty for slip line, err = %d\n", -err);
+               goto out_close;
        }
-       if(set_up_tty(sfd)) return(-1);
+       sfd = err;
+
+       if(set_up_tty(sfd))
+               goto out_close2;
+
        pri->slave = sfd;
-       pri->pos = 0;
-       pri->esc = 0;
+       pri->slip.pos = 0;
+       pri->slip.esc = 0;
        if(pri->gate_addr != NULL){
                sprintf(version_buf, "%d", UML_NET_VERSION);
                strcpy(gate_buf, pri->gate_addr);
@@ -146,12 +161,12 @@ static int slip_open(void *data)
 
                if(err < 0){
                        printk("slip_tramp failed - err = %d\n", -err);
-                       return(err);
+                       goto out_close2;
                }
                err = os_get_ifname(pri->slave, pri->name);
                if(err < 0){
                        printk("get_ifname failed, err = %d\n", -err);
-                       return(err);
+                       goto out_close2;
                }
                iter_addresses(pri->dev, open_addr, pri->name);
        }
@@ -160,10 +175,16 @@ static int slip_open(void *data)
                if(err < 0){
                        printk("Failed to set slip discipline encapsulation - "
                               "err = %d\n", -err);
-                       return(err);
+                       goto out_close2;
                }
        }
        return(mfd);
+out_close2:
+       os_close_file(sfd);
+out_close:
+       os_close_file(mfd);
+out:
+       return err;
 }
 
 static void slip_close(int fd, void *data)
@@ -190,48 +211,12 @@ static void slip_close(int fd, void *data)
 
 int slip_user_read(int fd, void *buf, int len, struct slip_data *pri)
 {
-       int i, n, size, start;
-
-       if(pri->more>0) {
-               i = 0;
-               while(i < pri->more) {
-                       size = slip_unesc(pri->ibuf[i++],
-                                       pri->ibuf, &pri->pos, &pri->esc);
-                       if(size){
-                               memcpy(buf, pri->ibuf, size);
-                               memmove(pri->ibuf, &pri->ibuf[i], pri->more-i);
-                               pri->more=pri->more-i; 
-                               return(size);
-                       }
-               }
-               pri->more=0;
-       }
-
-       n = net_read(fd, &pri->ibuf[pri->pos], sizeof(pri->ibuf) - pri->pos);
-       if(n <= 0) return(n);
-
-       start = pri->pos;
-       for(i = 0; i < n; i++){
-               size = slip_unesc(pri->ibuf[start + i],
-                               pri->ibuf, &pri->pos, &pri->esc);
-               if(size){
-                       memcpy(buf, pri->ibuf, size);
-                       memmove(pri->ibuf, &pri->ibuf[start+i+1], n-(i+1));
-                       pri->more=n-(i+1); 
-                       return(size);
-               }
-       }
-       return(0);
+       return slip_proto_read(fd, buf, len, &pri->slip);
 }
 
 int slip_user_write(int fd, void *buf, int len, struct slip_data *pri)
 {
-       int actual, n;
-
-       actual = slip_esc(buf, pri->obuf, len);
-       n = net_write(fd, pri->obuf, actual);
-       if(n < 0) return(n);
-       else return(len);
+       return slip_proto_write(fd, buf, len, &pri->slip);
 }
 
 static int slip_set_mtu(int mtu, void *data)
@@ -267,14 +252,3 @@ struct net_user_info slip_user_info = {
        .delete_address = slip_del_addr,
        .max_packet     = BUF_SIZE
 };
-
-/*
- * 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 04e407d1e44aeceb18ec5ef6313816899a8bd068..6cf88ab580c99a7828fbf545fa8b427ec8b862b5 100644 (file)
@@ -1,10 +1,7 @@
 #ifndef __UM_SLIRP_H
 #define __UM_SLIRP_H
 
-#define BUF_SIZE 1500
- /* two bytes each for a (pathological) max packet of escaped chars +  * 
-  * terminating END char + initial END char                            */
-#define ENC_BUF_SIZE (2 * BUF_SIZE + 2)
+#include "slip_common.h"
 
 #define SLIRP_MAX_ARGS 100
 /*
@@ -24,28 +21,13 @@ struct slirp_data {
        struct arg_list_dummy_wrapper argw;
        int pid;
        int slave;
-       char ibuf[ENC_BUF_SIZE];
-       char obuf[ENC_BUF_SIZE];
-       int more; /* more data: do not read fd until ibuf has been drained */
-       int pos;
-       int esc;
+       struct slip_proto slip;
 };
 
 extern struct net_user_info slirp_user_info;
 
-extern int set_umn_addr(int fd, char *addr, char *ptp_addr);
 extern int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri);
-extern int slirp_user_write(int fd, void *buf, int len, struct slirp_data *pri);
+extern int slirp_user_write(int fd, void *buf, int len,
+                           struct slirp_data *pri);
 
 #endif
-
-/*
- * 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 c9d6b52a831de0c5836222bb14cf27bb3c760b0a..9864d27afdbe22f27319042030116caef12f93d9 100644 (file)
@@ -25,10 +25,7 @@ void slirp_init(struct net_device *dev, void *data)
                { .argw         = init->argw,
                  .pid          = -1,
                  .slave        = -1,
-                 .ibuf         = { '\0' },
-                 .obuf         = { '\0' },
-                 .pos          = 0,
-                 .esc          = 0,
+                 .slip         = SLIP_PROTO_INIT,
                  .dev          = dev });
 
        dev->init = NULL;
index c322515c71ccb4071cc6b0e4cf718720d047cbba..8d91f663d82c684267567f2489f8059b738590e8 100644 (file)
@@ -12,7 +12,7 @@
 #include "user.h"
 #include "net_user.h"
 #include "slirp.h"
-#include "slip_proto.h"
+#include "slip_common.h"
 #include "helper.h"
 #include "os.h"
 
@@ -48,47 +48,32 @@ static int slirp_tramp(char **argv, int fd)
        return(pid);
 }
 
-/* XXX This is just a trivial wrapper around os_pipe */
-static int slirp_datachan(int *mfd, int *sfd)
-{
-       int fds[2], err;
-
-       err = os_pipe(fds, 1, 1);
-       if(err < 0){
-               printk("slirp_datachan: Failed to open pipe, err = %d\n", -err);
-               return(err);
-       }
-
-       *mfd = fds[0];
-       *sfd = fds[1];
-       return(0);
-}
-
 static int slirp_open(void *data)
 {
        struct slirp_data *pri = data;
-       int sfd, mfd, pid, err;
+       int fds[2], pid, err;
 
-       err = slirp_datachan(&mfd, &sfd);
+       err = os_pipe(fds, 1, 1);
        if(err)
                return(err);
 
-       pid = slirp_tramp(pri->argw.argv, sfd);
-
-       if(pid < 0){
-               printk("slirp_tramp failed - errno = %d\n", -pid);
-               os_close_file(sfd);     
-               os_close_file(mfd);     
-               return(pid);
+       err = slirp_tramp(pri->argw.argv, fds[1]);
+       if(err < 0){
+               printk("slirp_tramp failed - errno = %d\n", -err);
+               goto out;
        }
-
-       pri->slave = sfd;
-       pri->pos = 0;
-       pri->esc = 0;
-
-       pri->pid = pid;
-
-       return(mfd);
+       pid = err;
+
+       pri->slave = fds[1];
+       pri->slip.pos = 0;
+       pri->slip.esc = 0;
+       pri->pid = err;
+
+       return(fds[0]);
+out:
+       os_close_file(fds[0]);
+       os_close_file(fds[1]);
+       return err;
 }
 
 static void slirp_close(int fd, void *data)
@@ -129,48 +114,12 @@ static void slirp_close(int fd, void *data)
 
 int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri)
 {
-       int i, n, size, start;
-
-       if(pri->more>0) {
-               i = 0;
-               while(i < pri->more) {
-                       size = slip_unesc(pri->ibuf[i++],
-                                       pri->ibuf,&pri->pos,&pri->esc);
-                       if(size){
-                               memcpy(buf, pri->ibuf, size);
-                               memmove(pri->ibuf, &pri->ibuf[i], pri->more-i);
-                               pri->more=pri->more-i; 
-                               return(size);
-                       }
-               }
-               pri->more=0;
-       }
-
-       n = net_read(fd, &pri->ibuf[pri->pos], sizeof(pri->ibuf) - pri->pos);
-       if(n <= 0) return(n);
-
-       start = pri->pos;
-       for(i = 0; i < n; i++){
-               size = slip_unesc(pri->ibuf[start + i],
-                               pri->ibuf,&pri->pos,&pri->esc);
-               if(size){
-                       memcpy(buf, pri->ibuf, size);
-                       memmove(pri->ibuf, &pri->ibuf[start+i+1], n-(i+1));
-                       pri->more=n-(i+1); 
-                       return(size);
-               }
-       }
-       return(0);
+       return slip_proto_read(fd, buf, len, &pri->slip);
 }
 
 int slirp_user_write(int fd, void *buf, int len, struct slirp_data *pri)
 {
-       int actual, n;
-
-       actual = slip_esc(buf, pri->obuf, len);
-       n = net_write(fd, pri->obuf, actual);
-       if(n < 0) return(n);
-       else return(len);
+       return slip_proto_write(fd, buf, len, &pri->slip);
 }
 
 static int slirp_set_mtu(int mtu, void *data)
@@ -188,14 +137,3 @@ struct net_user_info slirp_user_info = {
        .delete_address = NULL,
        .max_packet     = BUF_SIZE
 };
-
-/*
- * 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 a2bac429f3d41d8b1941969318b2831fc3750567..b32a77010fbe5743aace38839dcf21f477c7da25 100644 (file)
@@ -22,7 +22,6 @@
 #include "init.h"
 #include "irq_user.h"
 #include "mconsole_kern.h"
-#include "2_5compat.h"
 
 static int ssl_version = 1;
 
index 98565b53d170158a678a12b2ba72a582d4220854..429ae8e6c7e514f67fac718d9912828dec7e7768 100644 (file)
@@ -22,9 +22,9 @@ static void stderr_console_write(struct console *console, const char *string,
 }
 
 static struct console stderr_console = {
-       .name           "stderr",
-       .write          stderr_console_write,
-       .flags          CON_PRINTBUFFER,
+       .name           "stderr",
+       .write          stderr_console_write,
+       .flags          CON_PRINTBUFFER,
 };
 
 static int __init stderr_console_init(void)
index 361d0be342b3e68c717802ac0b3fa2dae4d10c0d..afbe1e71ed8310f36b2be4f8f633b61ca84af0a2 100644 (file)
@@ -28,7 +28,6 @@
 #include "irq_user.h"
 #include "mconsole_kern.h"
 #include "init.h"
-#include "2_5compat.h"
 
 #define MAX_TTYS (16)
 
index 9a56ff94308dff7a06a5b0fd5cff8ed3b14249ad..2a7f6892c55c203d66c03640acdccb8a3655b8e3 100644 (file)
 #include "irq_user.h"
 #include "irq_kern.h"
 #include "ubd_user.h"
-#include "2_5compat.h"
 #include "os.h"
 #include "mem.h"
 #include "mem_kern.h"
 #include "cow.h"
 
-enum ubd_req { UBD_READ, UBD_WRITE, UBD_MMAP };
+enum ubd_req { UBD_READ, UBD_WRITE };
 
 struct io_thread_req {
        enum ubd_req op;
@@ -68,8 +67,6 @@ struct io_thread_req {
        unsigned long sector_mask;
        unsigned long long cow_offset;
        unsigned long bitmap_words[2];
-       int map_fd;
-       unsigned long long map_offset;
        int error;
 };
 
@@ -122,10 +119,6 @@ static int ubd_ioctl(struct inode * inode, struct file * file,
 
 #define MAX_DEV (8)
 
-/* Changed in early boot */
-static int ubd_do_mmap = 0;
-#define UBD_MMAP_BLOCK_SIZE PAGE_SIZE
-
 static struct block_device_operations ubd_blops = {
         .owner         = THIS_MODULE,
         .open          = ubd_open,
@@ -175,12 +168,6 @@ struct ubd {
        int no_cow;
        struct cow cow;
        struct platform_device pdev;
-
-       int map_writes;
-       int map_reads;
-       int nomap_writes;
-       int nomap_reads;
-       int write_maps;
 };
 
 #define DEFAULT_COW { \
@@ -200,11 +187,6 @@ struct ubd {
        .openflags =            OPEN_FLAGS, \
         .no_cow =               0, \
         .cow =                 DEFAULT_COW, \
-       .map_writes             = 0, \
-       .map_reads              = 0, \
-       .nomap_writes           = 0, \
-       .nomap_reads            = 0, \
-       .write_maps             = 0, \
 }
 
 struct ubd ubd_dev[MAX_DEV] = { [ 0 ... MAX_DEV - 1 ] = DEFAULT_UBD };
@@ -314,13 +296,6 @@ static int ubd_setup_common(char *str, int *index_out)
                int major;
 
                str++;
-               if(!strcmp(str, "mmap")){
-                       CHOOSE_MODE(printk("mmap not supported by the ubd "
-                                          "driver in tt mode\n"),
-                                   ubd_do_mmap = 1);
-                       return(0);
-               }
-
                if(!strcmp(str, "sync")){
                        global_openflags = of_sync(global_openflags);
                        return(0);
@@ -464,9 +439,9 @@ static int udb_setup(char *str)
 __setup("udb", udb_setup);
 __uml_help(udb_setup,
 "udb\n"
-"    This option is here solely to catch ubd -> udb typos, which can be\n\n"
-"    to impossible to catch visually unless you specifically look for\n\n"
-"    them.  The only result of any option starting with 'udb' is an error\n\n"
+"    This option is here solely to catch ubd -> udb typos, which can be\n"
+"    to impossible to catch visually unless you specifically look for\n"
+"    them.  The only result of any option starting with 'udb' is an error\n"
 "    in the boot output.\n\n"
 );
 
@@ -524,7 +499,7 @@ static void ubd_handler(void)
 {
        struct io_thread_req req;
        struct request *rq = elv_next_request(ubd_queue);
-       int n, err;
+       int n;
 
        do_ubd = NULL;
        intr_count++;
@@ -538,19 +513,6 @@ static void ubd_handler(void)
                return;
        }
         
-       if((req.op != UBD_MMAP) &&
-          ((req.offset != ((__u64) (rq->sector)) << 9) ||
-           (req.length != (rq->current_nr_sectors) << 9)))
-               panic("I/O op mismatch");
-       
-       if(req.map_fd != -1){
-               err = physmem_subst_mapping(req.buffer, req.map_fd,
-                                           req.map_offset, 1);
-               if(err)
-                       printk("ubd_handler - physmem_subst_mapping failed, "
-                              "err = %d\n", -err);
-       }
-
        ubd_finish(rq, req.error);
        reactivate_fd(thread_fd, UBD_IRQ);      
        do_ubd_request(ubd_queue);
@@ -583,14 +545,10 @@ static int ubd_file_size(struct ubd *dev, __u64 *size_out)
 
 static void ubd_close(struct ubd *dev)
 {
-       if(ubd_do_mmap)
-               physmem_forget_descriptor(dev->fd);
        os_close_file(dev->fd);
        if(dev->cow.file == NULL)
                return;
 
-       if(ubd_do_mmap)
-               physmem_forget_descriptor(dev->cow.fd);
        os_close_file(dev->cow.fd);
        vfree(dev->cow.bitmap);
        dev->cow.bitmap = NULL;
@@ -1010,94 +968,13 @@ static void cowify_req(struct io_thread_req *req, unsigned long *bitmap,
                           req->bitmap_words, bitmap_len);
 }
 
-static int mmap_fd(struct request *req, struct ubd *dev, __u64 offset)
-{
-       __u64 sector;
-       unsigned char *bitmap;
-       int bit, i;
-
-       /* mmap must have been requested on the command line */
-       if(!ubd_do_mmap)
-               return(-1);
-
-       /* The buffer must be page aligned */
-       if(((unsigned long) req->buffer % UBD_MMAP_BLOCK_SIZE) != 0)
-               return(-1);
-
-       /* The request must be a page long */
-       if((req->current_nr_sectors << 9) != PAGE_SIZE)
-               return(-1);
-
-       if(dev->cow.file == NULL)
-               return(dev->fd);
-
-       sector = offset >> 9;
-       bitmap = (unsigned char *) dev->cow.bitmap;
-       bit = ubd_test_bit(sector, bitmap);
-
-       for(i = 1; i < req->current_nr_sectors; i++){
-               if(ubd_test_bit(sector + i, bitmap) != bit)
-                       return(-1);
-       }
-
-       if(bit || (rq_data_dir(req) == WRITE))
-               offset += dev->cow.data_offset;
-
-       /* The data on disk must be page aligned */
-       if((offset % UBD_MMAP_BLOCK_SIZE) != 0)
-               return(-1);
-
-       return(bit ? dev->fd : dev->cow.fd);
-}
-
-static int prepare_mmap_request(struct ubd *dev, int fd, __u64 offset,
-                               struct request *req,
-                               struct io_thread_req *io_req)
-{
-       int err;
-
-       if(rq_data_dir(req) == WRITE){
-               /* Writes are almost no-ops since the new data is already in the
-                * host page cache
-                */
-               dev->map_writes++;
-               if(dev->cow.file != NULL)
-                       cowify_bitmap(io_req->offset, io_req->length,
-                                     &io_req->sector_mask, &io_req->cow_offset,
-                                     dev->cow.bitmap, dev->cow.bitmap_offset,
-                                     io_req->bitmap_words,
-                                     dev->cow.bitmap_len);
-       }
-       else {
-               int w;
-
-               if((dev->cow.file != NULL) && (fd == dev->cow.fd))
-                       w = 0;
-               else w = dev->openflags.w;
-
-               if((dev->cow.file != NULL) && (fd == dev->fd))
-                       offset += dev->cow.data_offset;
-
-               err = physmem_subst_mapping(req->buffer, fd, offset, w);
-               if(err){
-                       printk("physmem_subst_mapping failed, err = %d\n",
-                              -err);
-                       return(1);
-               }
-               dev->map_reads++;
-       }
-       io_req->op = UBD_MMAP;
-       io_req->buffer = req->buffer;
-       return(0);
-}
-
 /* Called with ubd_io_lock held */
 static int prepare_request(struct request *req, struct io_thread_req *io_req)
 {
        struct gendisk *disk = req->rq_disk;
        struct ubd *dev = disk->private_data;
        __u64 offset;
-       int len, fd;
+       int len;
 
        if(req->rq_status == RQ_INACTIVE) return(1);
 
@@ -1114,34 +991,12 @@ static int prepare_request(struct request *req, struct io_thread_req *io_req)
 
        io_req->fds[0] = (dev->cow.file != NULL) ? dev->cow.fd : dev->fd;
        io_req->fds[1] = dev->fd;
-       io_req->map_fd = -1;
        io_req->cow_offset = -1;
        io_req->offset = offset;
        io_req->length = len;
        io_req->error = 0;
        io_req->sector_mask = 0;
 
-       fd = mmap_fd(req, dev, io_req->offset);
-       if(fd > 0){
-               /* If mmapping is otherwise OK, but the first access to the
-                * page is a write, then it's not mapped in yet.  So we have
-                * to write the data to disk first, then we can map the disk
-                * page in and continue normally from there.
-                */
-               if((rq_data_dir(req) == WRITE) && !is_remapped(req->buffer)){
-                       io_req->map_fd = dev->fd;
-                       io_req->map_offset = io_req->offset +
-                               dev->cow.data_offset;
-                       dev->write_maps++;
-               }
-               else return(prepare_mmap_request(dev, fd, io_req->offset, req,
-                                                io_req));
-       }
-
-       if(rq_data_dir(req) == READ)
-               dev->nomap_reads++;
-       else dev->nomap_writes++;
-
        io_req->op = (rq_data_dir(req) == READ) ? UBD_READ : UBD_WRITE;
        io_req->offsets[0] = 0;
        io_req->offsets[1] = dev->cow.data_offset;
@@ -1229,143 +1084,6 @@ static int ubd_ioctl(struct inode * inode, struct file * file,
        return(-EINVAL);
 }
 
-static int ubd_check_remapped(int fd, unsigned long address, int is_write,
-                             __u64 offset)
-{
-       __u64 bitmap_offset;
-       unsigned long new_bitmap[2];
-       int i, err, n;
-
-       /* If it's not a write access, we can't do anything about it */
-       if(!is_write)
-               return(0);
-
-       /* We have a write */
-       for(i = 0; i < sizeof(ubd_dev) / sizeof(ubd_dev[0]); i++){
-               struct ubd *dev = &ubd_dev[i];
-
-               if((dev->fd != fd) && (dev->cow.fd != fd))
-                       continue;
-
-               /* It's a write to a ubd device */
-
-               /* This should be impossible now */
-               if(!dev->openflags.w){
-                       /* It's a write access on a read-only device - probably
-                        * shouldn't happen.  If the kernel is trying to change
-                        * something with no intention of writing it back out,
-                        * then this message will clue us in that this needs
-                        * fixing
-                        */
-                       printk("Write access to mapped page from readonly ubd "
-                              "device %d\n", i);
-                       return(0);
-               }
-
-               /* It's a write to a writeable ubd device - it must be COWed
-                * because, otherwise, the page would have been mapped in
-                * writeable
-                */
-
-               if(!dev->cow.file)
-                       panic("Write fault on writeable non-COW ubd device %d",
-                             i);
-
-               /* It should also be an access to the backing file since the
-                * COW pages should be mapped in read-write
-                */
-
-               if(fd == dev->fd)
-                       panic("Write fault on a backing page of ubd "
-                             "device %d\n", i);
-
-               /* So, we do the write, copying the backing data to the COW
-                * file...
-                */
-
-               err = os_seek_file(dev->fd, offset + dev->cow.data_offset);
-               if(err < 0)
-                       panic("Couldn't seek to %lld in COW file of ubd "
-                             "device %d, err = %d",
-                             offset + dev->cow.data_offset, i, -err);
-
-               n = os_write_file(dev->fd, (void *) address, PAGE_SIZE);
-               if(n != PAGE_SIZE)
-                       panic("Couldn't copy data to COW file of ubd "
-                             "device %d, err = %d", i, -n);
-
-               /* ... updating the COW bitmap... */
-
-               cowify_bitmap(offset, PAGE_SIZE, NULL, &bitmap_offset,
-                             dev->cow.bitmap, dev->cow.bitmap_offset,
-                             new_bitmap, dev->cow.bitmap_len);
-
-               err = os_seek_file(dev->fd, bitmap_offset);
-               if(err < 0)
-                       panic("Couldn't seek to %lld in COW file of ubd "
-                             "device %d, err = %d", bitmap_offset, i, -err);
-
-               n = os_write_file(dev->fd, new_bitmap, sizeof(new_bitmap));
-               if(n != sizeof(new_bitmap))
-                       panic("Couldn't update bitmap  of ubd device %d, "
-                             "err = %d", i, -n);
-
-               /* Maybe we can map the COW page in, and maybe we can't.  If
-                * it is a pre-V3 COW file, we can't, since the alignment will
-                * be wrong.  If it is a V3 or later COW file which has been
-                * moved to a system with a larger page size, then maybe we
-                * can't, depending on the exact location of the page.
-                */
-
-               offset += dev->cow.data_offset;
-
-               /* Remove the remapping, putting the original anonymous page
-                * back.  If the COW file can be mapped in, that is done.
-                * Otherwise, the COW page is read in.
-                */
-
-               if(!physmem_remove_mapping((void *) address))
-                       panic("Address 0x%lx not remapped by ubd device %d",
-                             address, i);
-               if((offset % UBD_MMAP_BLOCK_SIZE) == 0)
-                       physmem_subst_mapping((void *) address, dev->fd,
-                                             offset, 1);
-               else {
-                       err = os_seek_file(dev->fd, offset);
-                       if(err < 0)
-                               panic("Couldn't seek to %lld in COW file of "
-                                     "ubd device %d, err = %d", offset, i,
-                                     -err);
-
-                       n = os_read_file(dev->fd, (void *) address, PAGE_SIZE);
-                       if(n != PAGE_SIZE)
-                               panic("Failed to read page from offset %llx of "
-                                     "COW file of ubd device %d, err = %d",
-                                     offset, i, -n);
-               }
-
-               return(1);
-       }
-
-       /* It's not a write on a ubd device */
-       return(0);
-}
-
-static struct remapper ubd_remapper = {
-       .list   = LIST_HEAD_INIT(ubd_remapper.list),
-       .proc   = ubd_check_remapped,
-};
-
-static int ubd_remapper_setup(void)
-{
-       if(ubd_do_mmap)
-               register_remapper(&ubd_remapper);
-
-       return(0);
-}
-
-__initcall(ubd_remapper_setup);
-
 static int same_backing_files(char *from_cmdline, char *from_cow, char *cow)
 {
        struct uml_stat buf1, buf2;
@@ -1568,15 +1286,6 @@ void do_io(struct io_thread_req *req)
        int err;
        __u64 off;
 
-       if(req->op == UBD_MMAP){
-               /* Touch the page to force the host to do any necessary IO to
-                * get it into memory
-                */
-               n = *((volatile int *) req->buffer);
-               req->error = update_bitmap(req);
-               return;
-       }
-
        nsectors = req->length / req->sectorsize;
        start = 0;
        do {
index a4fdf3584ad2c455e6165de1f88e5cc9a75ce62b..d269a80f4b0c665b70ef6f32422a53474efcb7af 100644 (file)
@@ -69,7 +69,6 @@ int xterm_fd(int socket, int *pid_out)
         * isn't set) this will hang... */
        wait_for_completion(&data->ready);
 
-       free_irq_by_irq_and_dev(XTERM_IRQ, data);
        free_irq(XTERM_IRQ, data);
 
        ret = data->new_fd;
diff --git a/arch/um/include/2_5compat.h b/arch/um/include/2_5compat.h
deleted file mode 100644 (file)
index abdb015..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/* 
- * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
- * Licensed under the GPL
- */
-
-#ifndef __2_5_COMPAT_H__
-#define __2_5_COMPAT_H__
-
-#define INIT_HARDSECT(arr, maj, sizes)
-
-#define SET_PRI(task) do ; while(0)
-
-#endif
-
-/*
- * 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 9fbe3083fdd8c70c7e2ac74e8dbe4f5d7dd238fc..cfa368e045a548b76aa2bd05677effbf584d07f7 100644 (file)
@@ -56,7 +56,7 @@ struct mc_request
        int as_interrupt;
 
        int originating_fd;
-       int originlen;
+       unsigned int originlen;
        unsigned char origin[128];                      /* sockaddr_un */
 
        struct mconsole_request request;
index 36807b796e9ffe542e57397034899a91691b898f..89885a77a771f203edbbf39d6fadd6742e54e2e2 100644 (file)
@@ -35,7 +35,7 @@ extern void *get_output_buffer(int *len_out);
 extern void free_output_buffer(void *buffer);
 
 extern int tap_open_common(void *dev, char *gate_addr);
-extern void tap_check_ips(char *gate_addr, char *eth_addr);
+extern void tap_check_ips(char *gate_addr, unsigned char *eth_addr);
 
 extern void read_output(int fd, char *output_out, int len);
 
index d246d5a24609e3657649cc0793b15233c63392db..881d2988d2d80ef2564a41309edf0c93099f4edd 100644 (file)
@@ -136,7 +136,7 @@ extern int os_seek_file(int fd, __u64 offset);
 extern int os_open_file(char *file, struct openflags flags, int mode);
 extern int os_read_file(int fd, void *buf, int len);
 extern int os_write_file(int fd, const void *buf, int count);
-extern int os_file_size(char *file, long long *size_out);
+extern int os_file_size(char *file, unsigned long long *size_out);
 extern int os_file_modtime(char *file, unsigned long *modtime);
 extern int os_pipe(int *fd, int stream, int close_on_exec);
 extern int os_set_fd_async(int fd, int owner);
index 84ec7ff5cf8c11754cdb6b72df60f5ddb0fc1784..c8ee9559f3ab2d3994fc83e424627b9c53993607 100644 (file)
@@ -8,6 +8,8 @@
 
 #include "uml-config.h"
 #include "user_constants.h"
+#include "sysdep/faultinfo.h"
+#include "choose-mode.h"
 
 #define MAX_REG_NR (UM_FRAME_SIZE / sizeof(unsigned long))
 #define MAX_REG_OFFSET (UM_FRAME_SIZE)
@@ -31,7 +33,6 @@ extern int sysemu_supported;
 #ifdef UML_CONFIG_MODE_SKAS
 
 #include "skas_ptregs.h"
-#include "sysdep/faultinfo.h"
 
 #define REGS_IP(r) ((r)[HOST_IP])
 #define REGS_SP(r) ((r)[HOST_SP])
@@ -59,8 +60,6 @@ extern int sysemu_supported;
 #define PTRACE_SYSEMU_SINGLESTEP 32
 #endif
 
-#include "choose-mode.h"
-
 union uml_pt_regs {
 #ifdef UML_CONFIG_MODE_TT
        struct tt_regs {
index 572c6c19be33b3ea0e496ea803011040db5cfb4f..ea97005af69443883110f3573035b6cf5f5ab753 100644 (file)
@@ -9,8 +9,6 @@
 #include "linux/in6.h"
 #include "asm/uaccess.h"
 
-extern unsigned int csum_partial_copy_from(const unsigned char *src, unsigned char *dst, int len,
-                                          int sum, int *err_ptr);
 extern unsigned csum_partial(const unsigned char *buff, unsigned len,
                              unsigned sum);
 
@@ -31,10 +29,15 @@ unsigned int csum_partial_copy_nocheck(const unsigned char *src, unsigned char *
 }
 
 static __inline__
-unsigned int csum_partial_copy_from_user(const unsigned char *src, unsigned char *dst,
-                                        int len, int sum, int *err_ptr)
+unsigned int csum_partial_copy_from_user(const unsigned char *src,
+                                         unsigned char *dst, int len, int sum,
+                                         int *err_ptr)
 {
-       return csum_partial_copy_from(src, dst, len, sum, err_ptr);
+        if(copy_from_user(dst, src, len)){
+                *err_ptr = -EFAULT;
+                return(-1);
+        }
+        return csum_partial(dst, len, sum);
 }
 
 /**
@@ -137,15 +140,6 @@ static inline unsigned add32_with_carry(unsigned a, unsigned b)
         return a;
 }
 
-#endif
+extern unsigned short ip_compute_csum(unsigned char * buff, int len);
 
-/*
- * 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:
- */
+#endif
index 348e8fcd513fe6b4759a943603327bcb927fbad2..be8acd5efd974ac9a3b36a2b3a7703d332900996 100644 (file)
@@ -135,6 +135,7 @@ extern int mode_tt;
        __CHOOSE_MODE(SC_EFLAGS(UPT_SC(r)), REGS_EFLAGS((r)->skas.regs))
 #define UPT_SC(r) ((r)->tt.sc)
 #define UPT_SYSCALL_NR(r) __CHOOSE_MODE((r)->tt.syscall, (r)->skas.syscall)
+#define UPT_SYSCALL_RET(r) UPT_RAX(r)
 
 extern int user_context(unsigned long sp);
 
@@ -196,32 +197,32 @@ struct syscall_args {
 
 
 #define UPT_SET(regs, reg, val) \
-        ({      unsigned long val; \
+        ({      unsigned long __upt_val = val; \
                 switch(reg){ \
-               case R8: UPT_R8(regs) = val; break; \
-               case R9: UPT_R9(regs) = val; break; \
-               case R10: UPT_R10(regs) = val; break; \
-               case R11: UPT_R11(regs) = val; break; \
-               case R12: UPT_R12(regs) = val; break; \
-               case R13: UPT_R13(regs) = val; break; \
-               case R14: UPT_R14(regs) = val; break; \
-               case R15: UPT_R15(regs) = val; break; \
-                case RIP: UPT_IP(regs) = val; break; \
-                case RSP: UPT_SP(regs) = val; break; \
-                case RAX: UPT_RAX(regs) = val; break; \
-                case RBX: UPT_RBX(regs) = val; break; \
-                case RCX: UPT_RCX(regs) = val; break; \
-                case RDX: UPT_RDX(regs) = val; break; \
-                case RSI: UPT_RSI(regs) = val; break; \
-                case RDI: UPT_RDI(regs) = val; break; \
-                case RBP: UPT_RBP(regs) = val; break; \
-                case ORIG_RAX: UPT_ORIG_RAX(regs) = val; break; \
-                case CS: UPT_CS(regs) = val; break; \
-                case DS: UPT_DS(regs) = val; break; \
-                case ES: UPT_ES(regs) = val; break; \
-                case FS: UPT_FS(regs) = val; break; \
-                case GS: UPT_GS(regs) = val; break; \
-                case EFLAGS: UPT_EFLAGS(regs) = val; break; \
+                case R8: UPT_R8(regs) = __upt_val; break; \
+                case R9: UPT_R9(regs) = __upt_val; break; \
+                case R10: UPT_R10(regs) = __upt_val; break; \
+                case R11: UPT_R11(regs) = __upt_val; break; \
+                case R12: UPT_R12(regs) = __upt_val; break; \
+                case R13: UPT_R13(regs) = __upt_val; break; \
+                case R14: UPT_R14(regs) = __upt_val; break; \
+                case R15: UPT_R15(regs) = __upt_val; break; \
+                case RIP: UPT_IP(regs) = __upt_val; break; \
+                case RSP: UPT_SP(regs) = __upt_val; break; \
+                case RAX: UPT_RAX(regs) = __upt_val; break; \
+                case RBX: UPT_RBX(regs) = __upt_val; break; \
+                case RCX: UPT_RCX(regs) = __upt_val; break; \
+                case RDX: UPT_RDX(regs) = __upt_val; break; \
+                case RSI: UPT_RSI(regs) = __upt_val; break; \
+                case RDI: UPT_RDI(regs) = __upt_val; break; \
+                case RBP: UPT_RBP(regs) = __upt_val; break; \
+                case ORIG_RAX: UPT_ORIG_RAX(regs) = __upt_val; break; \
+                case CS: UPT_CS(regs) = __upt_val; break; \
+                case DS: UPT_DS(regs) = __upt_val; break; \
+                case ES: UPT_ES(regs) = __upt_val; break; \
+                case FS: UPT_FS(regs) = __upt_val; break; \
+                case GS: UPT_GS(regs) = __upt_val; break; \
+                case EFLAGS: UPT_EFLAGS(regs) = __upt_val; break; \
                 default :  \
                         panic("Bad register in UPT_SET : %d\n", reg);  \
                        break; \
@@ -245,14 +246,3 @@ struct syscall_args {
         CHOOSE_MODE((&(r)->tt.faultinfo), (&(r)->skas.faultinfo))
 
 #endif
-
-/*
- * 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 2ce9423460b3858f5fc68db67d2fc1d85b90d865..c8d332b56b98b636adb113eef91ec1372cef2a92 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef __UM_SYSRQ_H
 #define __UM_SYSRQ_H
 
-extern void show_trace(unsigned long *stack);
+struct task_struct;
+extern void show_trace(struct task_struct* task, unsigned long *stack);
 
 #endif
index b8c5b8a952509395c790845e072714093f2655f7..7b6a24dfd302b7b90388a164c72e6c9ee79219f2 100644 (file)
@@ -41,9 +41,6 @@ extern unsigned long highmem;
 extern char host_info[];
 
 extern char saved_command_line[];
-extern char command_line[];
-
-extern char *tempdir;
 
 extern unsigned long _stext, _etext, _sdata, _edata, __bss_start, _end;
 extern unsigned long _unprotected_end;
index 9736ca27c5f0782edfc34f18d830c03977fb9d65..a8918e80df9623542a7b2cce781c2476b4fb9827 100644 (file)
@@ -14,7 +14,7 @@ obj-y = config.o exec_kern.o exitcode.o \
        tlb.o trap_kern.o trap_user.o uaccess_user.o um_arch.o umid.o \
        user_util.o
 
-obj-$(CONFIG_BLK_DEV_INITRD) += initrd_kern.o initrd_user.o
+obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o
 obj-$(CONFIG_GPROF)    += gprof_syms.o
 obj-$(CONFIG_GCOV)     += gmon_syms.o
 obj-$(CONFIG_TTY_LOG)  += tty_log.o
diff --git a/arch/um/kernel/checksum.c b/arch/um/kernel/checksum.c
deleted file mode 100644 (file)
index e69de29..0000000
index 49ddabe69be74e3db30641cad223f90610896b10..efd222ffe20e1df22fa2e04a4c61cdd5d6a3a419 100644 (file)
@@ -16,7 +16,6 @@
 #include "kern.h"
 #include "irq_user.h"
 #include "tlb.h"
-#include "2_5compat.h"
 #include "os.h"
 #include "time_user.h"
 #include "choose-mode.h"
diff --git a/arch/um/kernel/initrd.c b/arch/um/kernel/initrd.c
new file mode 100644 (file)
index 0000000..82ecf90
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
+ * Licensed under the GPL
+ */
+
+#include "linux/init.h"
+#include "linux/bootmem.h"
+#include "linux/initrd.h"
+#include "asm/types.h"
+#include "user_util.h"
+#include "kern_util.h"
+#include "initrd.h"
+#include "init.h"
+#include "os.h"
+
+/* Changed by uml_initrd_setup, which is a setup */
+static char *initrd __initdata = NULL;
+
+static int __init read_initrd(void)
+{
+       void *area;
+       long long size;
+       int err;
+
+       if(initrd == NULL) return 0;
+       err = os_file_size(initrd, &size);
+       if(err) return 0;
+       area = alloc_bootmem(size);
+       if(area == NULL) return 0;
+       if(load_initrd(initrd, area, size) == -1) return 0;
+       initrd_start = (unsigned long) area;
+       initrd_end = initrd_start + size;
+       return 0;
+}
+
+__uml_postsetup(read_initrd);
+
+static int __init uml_initrd_setup(char *line, int *add)
+{
+       initrd = line;
+       return 0;
+}
+
+__uml_setup("initrd=", uml_initrd_setup,
+"initrd=<initrd image>\n"
+"    This is used to boot UML from an initrd image.  The argument is the\n"
+"    name of the file containing the image.\n\n"
+);
+
+int load_initrd(char *filename, void *buf, int size)
+{
+       int fd, n;
+
+       fd = os_open_file(filename, of_read(OPENFLAGS()), 0);
+       if(fd < 0){
+               printk("Opening '%s' failed - err = %d\n", filename, -fd);
+               return(-1);
+       }
+       n = os_read_file(fd, buf, size);
+       if(n != size){
+               printk("Read of %d bytes from '%s' failed, err = %d\n", size,
+                      filename, -n);
+               return(-1);
+       }
+
+       os_close_file(fd);
+       return(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:
+ */
diff --git a/arch/um/kernel/initrd_kern.c b/arch/um/kernel/initrd_kern.c
deleted file mode 100644 (file)
index fc568af..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
- * Licensed under the GPL
- */
-
-#include "linux/init.h"
-#include "linux/bootmem.h"
-#include "linux/initrd.h"
-#include "asm/types.h"
-#include "user_util.h"
-#include "kern_util.h"
-#include "initrd.h"
-#include "init.h"
-#include "os.h"
-
-/* Changed by uml_initrd_setup, which is a setup */
-static char *initrd __initdata = NULL;
-
-static int __init read_initrd(void)
-{
-       void *area;
-       long long size;
-       int err;
-
-       if(initrd == NULL) return 0;
-       err = os_file_size(initrd, &size);
-       if(err) return 0;
-       area = alloc_bootmem(size);
-       if(area == NULL) return 0;
-       if(load_initrd(initrd, area, size) == -1) return 0;
-       initrd_start = (unsigned long) area;
-       initrd_end = initrd_start + size;
-       return 0;
-}
-
-__uml_postsetup(read_initrd);
-
-static int __init uml_initrd_setup(char *line, int *add)
-{
-       initrd = line;
-       return 0;
-}
-
-__uml_setup("initrd=", uml_initrd_setup, 
-"initrd=<initrd image>\n"
-"    This is used to boot UML from an initrd image.  The argument is the\n"
-"    name of the file containing the image.\n\n"
-);
-
-/*
- * 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:
- */
diff --git a/arch/um/kernel/initrd_user.c b/arch/um/kernel/initrd_user.c
deleted file mode 100644 (file)
index cb90681..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
- * Licensed under the GPL
- */
-
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>
-
-#include "user_util.h"
-#include "kern_util.h"
-#include "user.h"
-#include "initrd.h"
-#include "os.h"
-
-int load_initrd(char *filename, void *buf, int size)
-{
-       int fd, n;
-
-       fd = os_open_file(filename, of_read(OPENFLAGS()), 0);
-       if(fd < 0){
-               printk("Opening '%s' failed - err = %d\n", filename, -fd);
-               return(-1);
-       }
-       n = os_read_file(fd, buf, size);
-       if(n != size){
-               printk("Read of %d bytes from '%s' failed, err = %d\n", size,
-                      filename, -n);
-               return(-1);
-       }
-
-       os_close_file(fd);
-       return(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 d44fb52825479fb8c00f67360c547c37473e1877..9f18061ef4c98d16915f7f040709340ed6740ad2 100644 (file)
@@ -124,14 +124,16 @@ void irq_unlock(unsigned long flags)
        spin_unlock_irqrestore(&irq_spinlock, flags);
 }
 
-/*  presently hw_interrupt_type must define (startup || enable) &&
- *  disable && end */
+/* hw_interrupt_type must define (startup || enable) &&
+ * (shutdown || disable) && end */
 static void dummy(unsigned int irq)
 {
 }
 
-static struct hw_interrupt_type SIGIO_irq_type = {
+/* This is used for everything else than the timer. */
+static struct hw_interrupt_type normal_irq_type = {
        .typename = "SIGIO",
+       .release = free_irq_by_irq_and_dev,
        .disable = dummy,
        .enable = dummy,
        .ack = dummy,
@@ -140,6 +142,7 @@ static struct hw_interrupt_type SIGIO_irq_type = {
 
 static struct hw_interrupt_type SIGVTALRM_irq_type = {
        .typename = "SIGVTALRM",
+       .release = free_irq_by_irq_and_dev,
        .shutdown = dummy, /* never called */
        .disable = dummy,
        .enable = dummy,
@@ -160,7 +163,7 @@ void __init init_IRQ(void)
                irq_desc[i].status = IRQ_DISABLED;
                irq_desc[i].action = NULL;
                irq_desc[i].depth = 1;
-               irq_desc[i].handler = &SIGIO_irq_type;
+               irq_desc[i].handler = &normal_irq_type;
                enable_irq(i);
        }
 }
index 6d6f9484b884d357240beaf65266c0d376644e55..c3ccaf24f3e0722cc4e3cc1a9ab8458fd8f41fdf 100644 (file)
@@ -85,8 +85,6 @@ void sigio_handler(int sig, union uml_pt_regs *regs)
                                next = irq_fd->next;
                                if(irq_fd->freed){
                                        free_irq(irq_fd->irq, irq_fd->id);
-                                       free_irq_by_irq_and_dev(irq_fd->irq,
-                                                               irq_fd->id);
                                }
                        }
                }
@@ -236,9 +234,15 @@ static void free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg)
                                       (*prev)->fd, pollfds[i].fd);
                                goto out;
                        }
-                       memcpy(&pollfds[i], &pollfds[i + 1],
-                              (pollfds_num - i - 1) * sizeof(pollfds[0]));
+
                        pollfds_num--;
+
+                       /* This moves the *whole* array after pollfds[i] (though
+                        * it doesn't spot as such)! */
+
+                       memmove(&pollfds[i], &pollfds[i + 1],
+                              (pollfds_num - i) * sizeof(pollfds[0]));
+
                        if(last_irq_ptr == &old_fd->next) 
                                last_irq_ptr = prev;
                        *prev = (*prev)->next;
index 78d69dc74b26d3b4653932f39227159259dc2dd2..99439fa15ef42514b8e563623f6eaa8238c829cc 100644 (file)
@@ -57,6 +57,7 @@ EXPORT_SYMBOL(copy_to_user_tt);
 EXPORT_SYMBOL(strncpy_from_user_skas);
 EXPORT_SYMBOL(copy_to_user_skas);
 EXPORT_SYMBOL(copy_from_user_skas);
+EXPORT_SYMBOL(clear_user_skas);
 #endif
 EXPORT_SYMBOL(uml_strdup);
 
index a17c49703f9bd2513af8eef1eae001dc4fd11a52..e59f581526782adca0763540a98bc80505a7a79a 100644 (file)
@@ -24,8 +24,6 @@
 #include "mode.h"
 #include "choose-mode.h"
 #include "uml-config.h"
-#include "irq_user.h"
-#include "time_user.h"
 #include "os.h"
 
 /* Set in set_stklim, which is called from main and __wrap_malloc.
@@ -71,7 +69,7 @@ static __init void do_uml_initcalls(void)
 
 static void last_ditch_exit(int sig)
 {
-       CHOOSE_MODE(kmalloc_ok = 0, (void) 0);
+        kmalloc_ok = 0;
        signal(SIGINT, SIG_DFL);
        signal(SIGTERM, SIG_DFL);
        signal(SIGHUP, SIG_DFL);
@@ -87,7 +85,7 @@ int main(int argc, char **argv, char **envp)
 {
        char **new_argv;
        sigset_t mask;
-       int ret, i;
+       int ret, i, err;
 
        /* Enable all signals except SIGIO - in some environments, we can
         * enter with some signals blocked
@@ -160,27 +158,29 @@ int main(int argc, char **argv, char **envp)
         */
        change_sig(SIGPROF, 0);
 
-       /* Reboot */
-       if(ret){
-               int err;
+        /* This signal stuff used to be in the reboot case.  However,
+         * sometimes a SIGVTALRM can come in when we're halting (reproducably
+         * when writing out gcov information, presumably because that takes
+         * some time) and cause a segfault.
+         */
 
-               printf("\n");
+        /* stop timers and set SIG*ALRM to be ignored */
+        disable_timer();
 
-               /* stop timers and set SIG*ALRM to be ignored */
-               disable_timer();
+        /* disable SIGIO for the fds and set SIGIO to be ignored */
+        err = deactivate_all_fds();
+        if(err)
+                printf("deactivate_all_fds failed, errno = %d\n", -err);
 
-               /* disable SIGIO for the fds and set SIGIO to be ignored */
-               err = deactivate_all_fds();
-               if(err)
-                       printf("deactivate_all_fds failed, errno = %d\n",
-                              -err);
-
-               /* Let any pending signals fire now.  This ensures
-                * that they won't be delivered after the exec, when
-                * they are definitely not expected.
-                */
-               unblock_signals();
+        /* Let any pending signals fire now.  This ensures
+         * that they won't be delivered after the exec, when
+         * they are definitely not expected.
+         */
+        unblock_signals();
 
+       /* Reboot */
+       if(ret){
+               printf("\n");
                execvp(new_argv[0], new_argv);
                perror("Failed to exec kernel");
                ret = 1;
index f156661781cb19a2000900d195503616090de77d..5597bd39e6b54a9f9d93ac914327c5eb1fb264ed 100644 (file)
@@ -53,7 +53,6 @@ static void setup_highmem(unsigned long highmem_start,
        for(i = 0; i < highmem_len >> PAGE_SHIFT; i++){
                page = &mem_map[highmem_pfn + i];
                ClearPageReserved(page);
-               set_bit(PG_highmem, &page->flags);
                set_page_count(page, 1);
                __free_page(page);
        }
@@ -100,12 +99,37 @@ void mem_init(void)
 #endif
 }
 
+/*
+ * Create a page table and place a pointer to it in a middle page
+ * directory entry.
+ */
+static void __init one_page_table_init(pmd_t *pmd)
+{
+       if (pmd_none(*pmd)) {
+               pte_t *pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+               set_pmd(pmd, __pmd(_KERNPG_TABLE +
+                                          (unsigned long) __pa(pte)));
+               if (pte != pte_offset_kernel(pmd, 0))
+                       BUG();
+       }
+}
+
+static void __init one_md_table_init(pud_t *pud)
+{
+#ifdef CONFIG_3_LEVEL_PGTABLES
+       pmd_t *pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+       set_pud(pud, __pud(_KERNPG_TABLE + (unsigned long) __pa(pmd_table)));
+       if (pmd_table != pmd_offset(pud, 0))
+               BUG();
+#endif
+}
+
 static void __init fixrange_init(unsigned long start, unsigned long end, 
                                 pgd_t *pgd_base)
 {
        pgd_t *pgd;
+       pud_t *pud;
        pmd_t *pmd;
-       pte_t *pte;
        int i, j;
        unsigned long vaddr;
 
@@ -115,15 +139,12 @@ static void __init fixrange_init(unsigned long start, unsigned long end,
        pgd = pgd_base + i;
 
        for ( ; (i < PTRS_PER_PGD) && (vaddr < end); pgd++, i++) {
-               pmd = (pmd_t *)pgd;
+               pud = pud_offset(pgd, vaddr);
+               if (pud_none(*pud))
+                       one_md_table_init(pud);
+               pmd = pmd_offset(pud, vaddr);
                for (; (j < PTRS_PER_PMD) && (vaddr != end); pmd++, j++) {
-                       if (pmd_none(*pmd)) {
-                               pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-                               set_pmd(pmd, __pmd(_KERNPG_TABLE + 
-                                                  (unsigned long) __pa(pte)));
-                               if (pte != pte_offset_kernel(pmd, 0))
-                                       BUG();
-                       }
+                       one_page_table_init(pmd);
                        vaddr += PMD_SIZE;
                }
                j = 0;
index 51f8e5a8ac6a9d60357888e56462f18f6b2ff93e..1b5ef3e96c7161fad6a8c2c41a927e5d795ee2fa 100644 (file)
@@ -30,7 +30,6 @@
 #include "init.h"
 #include "os.h"
 #include "uml-config.h"
-#include "ptrace_user.h"
 #include "choose-mode.h"
 #include "mode.h"
 #ifdef UML_CONFIG_MODE_SKAS
@@ -131,7 +130,7 @@ int start_fork_tramp(void *thread_arg, unsigned long temp_stack,
        return(arg.pid);
 }
 
-static int ptrace_child(void *arg)
+static int ptrace_child(void)
 {
        int ret;
        int pid = os_getpid(), ppid = getppid();
@@ -160,20 +159,16 @@ static int ptrace_child(void *arg)
        _exit(ret);
 }
 
-static int start_ptraced_child(void **stack_out)
+static int start_ptraced_child(void)
 {
-       void *stack;
-       unsigned long sp;
        int pid, n, status;
        
-       stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC,
-                    MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-       if(stack == MAP_FAILED)
-               panic("check_ptrace : mmap failed, errno = %d", errno);
-       sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *);
-       pid = clone(ptrace_child, (void *) sp, SIGCHLD, NULL);
+       pid = fork();
+       if(pid == 0)
+               ptrace_child();
+
        if(pid < 0)
-               panic("check_ptrace : clone failed, errno = %d", errno);
+               panic("check_ptrace : fork failed, errno = %d", errno);
        CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
        if(n < 0)
                panic("check_ptrace : wait failed, errno = %d", errno);
@@ -181,7 +176,6 @@ static int start_ptraced_child(void **stack_out)
                panic("check_ptrace : expected SIGSTOP, got status = %d",
                      status);
 
-       *stack_out = stack;
        return(pid);
 }
 
@@ -189,12 +183,12 @@ static int start_ptraced_child(void **stack_out)
  * just avoid using sysemu, not panic, but only if SYSEMU features are broken.
  * So only for SYSEMU features we test mustpanic, while normal host features
  * must work anyway!*/
-static int stop_ptraced_child(int pid, void *stack, int exitcode, int mustpanic)
+static int stop_ptraced_child(int pid, int exitcode, int mustexit)
 {
        int status, n, ret = 0;
 
        if(ptrace(PTRACE_CONT, pid, 0, 0) < 0)
-               panic("check_ptrace : ptrace failed, errno = %d", errno);
+               panic("stop_ptraced_child : ptrace failed, errno = %d", errno);
        CATCH_EINTR(n = waitpid(pid, &status, 0));
        if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) {
                int exit_with = WEXITSTATUS(status);
@@ -205,15 +199,13 @@ static int stop_ptraced_child(int pid, void *stack, int exitcode, int mustpanic)
                printk("check_ptrace : child exited with exitcode %d, while "
                      "expecting %d; status 0x%x", exit_with,
                      exitcode, status);
-               if (mustpanic)
+               if (mustexit)
                        panic("\n");
                else
                        printk("\n");
                ret = -1;
        }
 
-       if(munmap(stack, PAGE_SIZE) < 0)
-               panic("check_ptrace : munmap failed, errno = %d", errno);
        return ret;
 }
 
@@ -235,12 +227,11 @@ __uml_setup("nosysemu", nosysemu_cmd_param,
 
 static void __init check_sysemu(void)
 {
-       void *stack;
        int pid, syscall, n, status, count=0;
 
        printk("Checking syscall emulation patch for ptrace...");
        sysemu_supported = 0;
-       pid = start_ptraced_child(&stack);
+       pid = start_ptraced_child();
 
        if(ptrace(PTRACE_SYSEMU, pid, 0, 0) < 0)
                goto fail;
@@ -258,7 +249,7 @@ static void __init check_sysemu(void)
                panic("check_sysemu : failed to modify system "
                      "call return, errno = %d", errno);
 
-       if (stop_ptraced_child(pid, stack, 0, 0) < 0)
+       if (stop_ptraced_child(pid, 0, 0) < 0)
                goto fail_stopped;
 
        sysemu_supported = 1;
@@ -266,7 +257,7 @@ static void __init check_sysemu(void)
        set_using_sysemu(!force_sysemu_disabled);
 
        printk("Checking advanced syscall emulation patch for ptrace...");
-       pid = start_ptraced_child(&stack);
+       pid = start_ptraced_child();
        while(1){
                count++;
                if(ptrace(PTRACE_SYSEMU_SINGLESTEP, pid, 0, 0) < 0)
@@ -291,7 +282,7 @@ static void __init check_sysemu(void)
                        break;
                }
        }
-       if (stop_ptraced_child(pid, stack, 0, 0) < 0)
+       if (stop_ptraced_child(pid, 0, 0) < 0)
                goto fail_stopped;
 
        sysemu_supported = 2;
@@ -302,18 +293,17 @@ static void __init check_sysemu(void)
        return;
 
 fail:
-       stop_ptraced_child(pid, stack, 1, 0);
+       stop_ptraced_child(pid, 1, 0);
 fail_stopped:
        printk("missing\n");
 }
 
 void __init check_ptrace(void)
 {
-       void *stack;
        int pid, syscall, n, status;
 
        printk("Checking that ptrace can change system call numbers...");
-       pid = start_ptraced_child(&stack);
+       pid = start_ptraced_child();
 
        if (ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0)
                panic("check_ptrace: PTRACE_SETOPTIONS failed, errno = %d", errno);
@@ -340,7 +330,7 @@ void __init check_ptrace(void)
                        break;
                }
        }
-       stop_ptraced_child(pid, stack, 0, 1);
+       stop_ptraced_child(pid, 0, 1);
        printk("OK\n");
        check_sysemu();
 }
@@ -372,11 +362,10 @@ void forward_pending_sigio(int target)
 static inline int check_skas3_ptrace_support(void)
 {
        struct ptrace_faultinfo fi;
-       void *stack;
        int pid, n, ret = 1;
 
        printf("Checking for the skas3 patch in the host...");
-       pid = start_ptraced_child(&stack);
+       pid = start_ptraced_child();
 
        n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi);
        if (n < 0) {
@@ -391,7 +380,7 @@ static inline int check_skas3_ptrace_support(void)
        }
 
        init_registers(pid);
-       stop_ptraced_child(pid, stack, 1, 1);
+       stop_ptraced_child(pid, 1, 1);
 
        return(ret);
 }
index c1adf7ba3fd16aaece7fc79a4b7afde720786316..804c6bbdf67c157e5e28b6a9be9a76c9d8c0ce04 100644 (file)
@@ -43,7 +43,6 @@
 #include "tlb.h"
 #include "frame_kern.h"
 #include "sigcontext.h"
-#include "2_5compat.h"
 #include "os.h"
 #include "mode.h"
 #include "mode_kern.h"
  */
 struct cpu_task cpu_tasks[NR_CPUS] = { [0 ... NR_CPUS - 1] = { -1, NULL } };
 
-struct task_struct *get_task(int pid, int require)
-{
-        struct task_struct *ret;
-
-        read_lock(&tasklist_lock);
-       ret = find_task_by_pid(pid);
-        read_unlock(&tasklist_lock);
-
-        if(require && (ret == NULL)) panic("get_task couldn't find a task\n");
-        return(ret);
-}
-
 int external_pid(void *t)
 {
        struct task_struct *task = t ? t : current;
@@ -189,7 +176,6 @@ void default_idle(void)
 
        while(1){
                /* endless idle loop with no priority at all */
-               SET_PRI(current);
 
                /*
                 * although we are an idle CPU, we do not want to
@@ -212,11 +198,6 @@ int page_size(void)
        return(PAGE_SIZE);
 }
 
-unsigned long page_mask(void)
-{
-       return(PAGE_MASK);
-}
-
 void *um_virt_to_phys(struct task_struct *task, unsigned long addr, 
                      pte_t *pte_out)
 {
@@ -349,11 +330,6 @@ char *uml_strdup(char *string)
        return(new);
 }
 
-void *get_init_task(void)
-{
-       return(&init_thread_union.thread_info.task);
-}
-
 int copy_to_user_proc(void __user *to, void *from, int size)
 {
        return(copy_to_user(to, from, size));
@@ -480,15 +456,3 @@ unsigned long arch_align_stack(unsigned long sp)
        return sp & ~0xf;
 }
 #endif
-
-
-/*
- * 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 2b75d8d9ba738f493289aa86c045ea3cd07fdc71..71af4d5038994014f12e5030dd3187bcbaae9450 100644 (file)
@@ -28,9 +28,9 @@ static inline void set_singlestepping(struct task_struct *child, int on)
         child->thread.singlestep_syscall = 0;
 
 #ifdef SUBARCH_SET_SINGLESTEPPING
-        SUBARCH_SET_SINGLESTEPPING(child, on)
+        SUBARCH_SET_SINGLESTEPPING(child, on);
 #endif
-                }
+}
 
 /*
  * Called by kernel/ptrace.c when detaching..
@@ -83,7 +83,7 @@ long sys_ptrace(long request, long pid, long addr, long data)
        }
 
 #ifdef SUBACH_PTRACE_SPECIAL
-        SUBARCH_PTRACE_SPECIAL(child,request,addr,data)
+        SUBARCH_PTRACE_SPECIAL(child,request,addr,data);
 #endif
 
        ret = ptrace_check_attach(child, request == PTRACE_KILL);
@@ -322,11 +322,9 @@ void syscall_trace(union uml_pt_regs *regs, int entryexit)
                                            UPT_SYSCALL_ARG2(regs),
                                            UPT_SYSCALL_ARG3(regs),
                                            UPT_SYSCALL_ARG4(regs));
-               else {
-                        int res = UPT_SYSCALL_RET(regs);
-                       audit_syscall_exit(current, AUDITSC_RESULT(res),
-                                           res);
-                }
+               else audit_syscall_exit(current,
+                                        AUDITSC_RESULT(UPT_SYSCALL_RET(regs)),
+                                        UPT_SYSCALL_RET(regs));
        }
 
        /* Fake a debug trap */
@@ -356,14 +354,3 @@ void syscall_trace(union uml_pt_regs *regs, int entryexit)
                current->exit_code = 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 ab5d3271da0b08229a01964428a4d033fdd0604c..fc71ef295782296d10d118f3cc95b336e6b01fcb 100644 (file)
@@ -68,8 +68,11 @@ void new_thread_handler(int sig)
         * 0 if it just exits
         */
        n = run_kernel_thread(fn, arg, &current->thread.exec_buf);
-       if(n == 1)
+       if(n == 1){
+               /* Handle any immediate reschedules or signals */
+               interrupt_end();
                userspace(&current->thread.regs.regs);
+       }
        else do_exit(0);
 }
 
@@ -96,6 +99,8 @@ void fork_handler(int sig)
        schedule_tail(current->thread.prev_sched);
        current->thread.prev_sched = NULL;
 
+       /* Handle any immediate reschedules or signals */
+       interrupt_end();
        userspace(&current->thread.regs.regs);
 }
 
index e630438f9e73ee7d28c9101037a56a0c0a48bc9e..f80850091e798c1eab0ad3f820cdf21350cf22b3 100644 (file)
@@ -3,6 +3,7 @@
  * Licensed under the GPL
  */
 
+#include "linux/config.h"
 #include "linux/sched.h"
 #include "linux/kernel.h"
 #include "linux/module.h"
 #include "sysrq.h"
 #include "user_util.h"
 
-void show_trace(unsigned long * stack)
+/* Catch non-i386 SUBARCH's. */
+#if !defined(CONFIG_UML_X86) || defined(CONFIG_64BIT)
+void show_trace(struct task_struct *task, unsigned long * stack)
 {
-       /* XXX: Copy the CONFIG_FRAME_POINTER stack-walking backtrace from
-        * arch/i386/kernel/traps.c, and then move this to sys-i386/sysrq.c.*/
         unsigned long addr;
 
         if (!stack) {
-                stack = (unsigned long*) &stack;
+               stack = (unsigned long*) &stack;
                WARN_ON(1);
        }
 
@@ -35,6 +36,7 @@ void show_trace(unsigned long * stack)
         }
         printk("\n");
 }
+#endif
 
 /*
  * stack dumps generator - this is used by arch-independent code.
@@ -44,7 +46,7 @@ void dump_stack(void)
 {
        unsigned long stack;
 
-       show_trace(&stack);
+       show_trace(current, &stack);
 }
 EXPORT_SYMBOL(dump_stack);
 
@@ -59,7 +61,11 @@ void show_stack(struct task_struct *task, unsigned long *esp)
        int i;
 
        if (esp == NULL) {
-               if (task != current) {
+               if (task != current && task != NULL) {
+                       /* XXX: Isn't this bogus? I.e. isn't this the
+                        * *userspace* stack of this task? If not so, use this
+                        * even when task == current (as in i386).
+                        */
                        esp = (unsigned long *) KSTK_ESP(task);
                        /* Which one? No actual difference - just coding style.*/
                        //esp = (unsigned long *) PT_REGS_IP(&task->thread.regs);
@@ -77,5 +83,6 @@ void show_stack(struct task_struct *task, unsigned long *esp)
                printk("%08lx ", *stack++);
        }
 
-       show_trace(esp);
+       printk("Call Trace: \n");
+       show_trace(current, esp);
 }
index 5fca2c61eb980a631fe70d500b18b9422e17e0cf..c20aef120598ddb071f6362ca8868ecdc8373eca 100644 (file)
@@ -23,7 +23,6 @@
 #include "kern.h"
 #include "chan_kern.h"
 #include "mconsole_kern.h"
-#include "2_5compat.h"
 #include "mem.h"
 #include "mem_kern.h"
 
@@ -57,10 +56,11 @@ int handle_page_fault(unsigned long address, unsigned long ip,
        *code_out = SEGV_ACCERR;
        if(is_write && !(vma->vm_flags & VM_WRITE)) 
                goto out;
+
+        if(!(vma->vm_flags & (VM_READ | VM_EXEC)))
+                goto out;
+
        page = address & PAGE_MASK;
-       pgd = pgd_offset(mm, page);
-       pud = pud_offset(pgd, page);
-       pmd = pmd_offset(pud, page);
        do {
  survive:
                switch (handle_mm_fault(mm, vma, address, is_write)){
@@ -106,33 +106,6 @@ out_of_memory:
        goto out;
 }
 
-LIST_HEAD(physmem_remappers);
-
-void register_remapper(struct remapper *info)
-{
-       list_add(&info->list, &physmem_remappers);
-}
-
-static int check_remapped_addr(unsigned long address, int is_write)
-{
-       struct remapper *remapper;
-       struct list_head *ele;
-       __u64 offset;
-       int fd;
-
-       fd = phys_mapping(__pa(address), &offset);
-       if(fd == -1)
-               return(0);
-
-       list_for_each(ele, &physmem_remappers){
-               remapper = list_entry(ele, struct remapper, list);
-               if((*remapper->proc)(fd, address, is_write, offset))
-                       return(1);
-       }
-
-       return(0);
-}
-
 /*
  * We give a *copy* of the faultinfo in the regs to segv.
  * This must be done, since nesting SEGVs could overwrite
@@ -151,8 +124,6 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc)
                 flush_tlb_kernel_vm();
                 return(0);
         }
-       else if(check_remapped_addr(address & PAGE_MASK, is_write))
-               return(0);
        else if(current->mm == NULL)
                panic("Segfault with no mm");
        err = handle_page_fault(address, ip, is_write, is_user, &si.si_code);
index c3faea21a996316fa2012c9c1f215305ee20ff93..3fd2554e60b6e58ff35b7af3b4141421f69ef1f1 100644 (file)
@@ -3,10 +3,6 @@
 # Licensed under the GPL
 #
 
-extra-y := unmap_fin.o
-targets := unmap.o
-clean-files := unmap_tmp.o
-
 obj-y = exec_kern.o exec_user.o gdb.o ksyms.o mem.o mem_user.o process_kern.o \
        syscall_kern.o syscall_user.o time.o tlb.o tracer.o trap_user.o \
        uaccess.o uaccess_user.o
@@ -16,14 +12,3 @@ obj-$(CONFIG_PT_PROXY) += gdb_kern.o ptproxy/
 USER_OBJS := gdb.o time.o tracer.o
 
 include arch/um/scripts/Makefile.rules
-
-UNMAP_CFLAGS := $(patsubst -pg -DPROFILING,,$(USER_CFLAGS))
-UNMAP_CFLAGS := $(patsubst -fprofile-arcs -ftest-coverage,,$(UNMAP_CFLAGS))
-
-#XXX: partially copied from arch/um/scripts/Makefile.rules
-$(obj)/unmap.o: c_flags = -Wp,-MD,$(depfile) $(UNMAP_CFLAGS)
-
-$(obj)/unmap_fin.o : $(obj)/unmap.o
-       $(LD) -r -o $(obj)/unmap_tmp.o $< $(shell $(CC) -print-file-name=libc.a)
-       $(OBJCOPY) $(obj)/unmap_tmp.o $@ -G switcheroo
-
index 92ec85d67c7c601706f2e35fafe25862aa00372c..84a9385a8fefbcc1048cedbc2a71edecaf9999e4 100644 (file)
@@ -12,6 +12,7 @@ EXPORT_SYMBOL(__do_copy_to_user);
 EXPORT_SYMBOL(__do_strncpy_from_user);
 EXPORT_SYMBOL(__do_strnlen_user); 
 EXPORT_SYMBOL(__do_clear_user);
+EXPORT_SYMBOL(clear_user_tt);
 
 EXPORT_SYMBOL(tracing_pid);
 EXPORT_SYMBOL(honeypot);
index df810ca8fc1204a1c48c1c05e6f3c93d945fbb9c..776310fd5b8b7e34d4b651b5fd2216a27b0a8935 100644 (file)
@@ -32,10 +32,6 @@ void *switch_to_tt(void *prev, void *next, void *last)
        unsigned long flags;
        int err, vtalrm, alrm, prof, cpu;
        char c;
-       /* jailing and SMP are incompatible, so this doesn't need to be 
-        * made per-cpu 
-        */
-       static int reading;
 
        from = prev;
        to = next;
@@ -59,13 +55,11 @@ void *switch_to_tt(void *prev, void *next, void *last)
        c = 0;
        set_current(to);
 
-       reading = 0;
        err = os_write_file(to->thread.mode.tt.switch_pipe[1], &c, sizeof(c));
        if(err != sizeof(c))
                panic("write of switch_pipe failed, err = %d", -err);
 
-       reading = 1;
-        if(from->thread.mode.tt.switch_pipe[0] == -1)
+       if(from->thread.mode.tt.switch_pipe[0] == -1)
                os_kill_process(os_getpid(), 0);
 
        err = os_read_file(from->thread.mode.tt.switch_pipe[0], &c, sizeof(c));
diff --git a/arch/um/kernel/tt/unmap.c b/arch/um/kernel/tt/unmap.c
deleted file mode 100644 (file)
index 3f7aecd..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/* 
- * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
- * Licensed under the GPL
- */
-
-#include <sys/mman.h>
-
-int switcheroo(int fd, int prot, void *from, void *to, int size)
-{
-       if(munmap(to, size) < 0){
-               return(-1);
-       }
-       if(mmap(to, size, prot, MAP_SHARED | MAP_FIXED, fd, 0) != to){
-               return(-1);
-       }
-       if(munmap(from, size) < 0){
-               return(-1);
-       }
-       return(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 4d10ec372a678a28124428f128d7b3b822b84d9f..8736d098f0eed6ce704b137a455c5a0aa5f4660e 100644 (file)
@@ -26,7 +26,6 @@
 #include "asm/setup.h"
 #include "ubd_user.h"
 #include "asm/current.h"
-#include "asm/setup.h"
 #include "user_util.h"
 #include "kern_util.h"
 #include "kern.h"
@@ -111,12 +110,6 @@ struct seq_operations cpuinfo_op = {
        .show   = show_cpuinfo,
 };
 
-pte_t * __bad_pagetable(void)
-{
-       panic("Someone should implement __bad_pagetable");
-       return(NULL);
-}
-
 /* Set in linux_main */
 unsigned long host_task_size;
 unsigned long task_size;
index 76eadb3091894d8058b571d235d02ac2ad0c01ad..61dfd4fef752a0810f24cdfdee20fa89aecc497b 100644 (file)
@@ -14,19 +14,10 @@ SECTIONS
   /* Used in arch/um/kernel/mem.c. Any memory between START and __binary_start
    * is remapped.*/
   __binary_start = .;
-#ifdef MODE_TT
-  .thread_private : {
-    __start_thread_private = .;
-    errno = .;
-    . += 4;
-    arch/um/kernel/tt/unmap_fin.o (.data)
-    __end_thread_private = .;
-  }
-  . = ALIGN(4096);
-  .remap : { arch/um/kernel/tt/unmap_fin.o (.text) }
 
-  /* We want it only if we are in MODE_TT. In both cases, however, when MODE_TT
-   * is off the resulting binary segfaults.*/
+#ifdef MODE_TT
+  .remap_data : { arch/um/sys-SUBARCH/unmap_fin.o (.data .bss) }
+  .remap : { arch/um/sys-SUBARCH/unmap_fin.o (.text) }
 
   . = ALIGN(4096);             /* Init code and data */
 #endif
@@ -73,6 +64,8 @@ SECTIONS
 
   .got           : { *(.got.plt) *(.got) }
   .dynamic       : { *(.dynamic) }
+  .tdata         : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
+  .tbss                  : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
   /* We want the small data sections together, so single-instruction offsets
      can access them all, and initialized data all before uninitialized, so
      we can shorten the on-disk segment size.  */
index 9aee0b62ebca19c1551242c49c3e11ed17ad0baf..f0d6060e3e57f601dd5a861e31ca7b7a87a0cf61 100644 (file)
@@ -45,7 +45,11 @@ __init void scan_elf_aux( char **envp)
                                elf_aux_hwcap = auxv->a_un.a_val;
                                break;
                        case AT_PLATFORM:
-                               elf_aux_platform = auxv->a_un.a_ptr;
+                                /* elf.h removed the pointer elements from
+                                 * a_un, so we have to use a_val, which is
+                                 * all that's left.
+                                 */
+                               elf_aux_platform = (char *) auxv->a_un.a_val;
                                break;
                        case AT_PAGESZ:
                                page_size = auxv->a_un.a_val;
index 77d4066d1af8e371b6e8255f2920b94043e580a2..fd45bb2609079a3bd3f13339ec8154d6a168ef69 100644 (file)
@@ -363,7 +363,7 @@ int os_write_file(int fd, const void *buf, int len)
                       (int (*)(int, void *, int)) write, copy_to_user_proc));
 }
 
-int os_file_size(char *file, long long *size_out)
+int os_file_size(char *file, unsigned long long *size_out)
 {
        struct uml_stat buf;
        int err;
index 0b2491883d9c017d0ce7285d28c1abdfdfb8d8d4..7459d09c233e37f99b840b4454ea2d295fd5c72f 100644 (file)
@@ -10,11 +10,17 @@ USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file))
 $(USER_OBJS) : c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) \
        $(CFLAGS_$(notdir $@))
 
+# The stubs and unmap.o can't try to call mcount or update basic block data
+define unprofile
+       $(patsubst -pg,,$(patsubst -fprofile-arcs -ftest-coverage,,$(1)))
+endef
+
+
 quiet_cmd_make_link = SYMLINK $@
 cmd_make_link       = ln -sf $(srctree)/arch/$(SUBARCH)/$($(notdir $@)-dir)/$(notdir $@) $@
 
 # this needs to be before the foreach, because targets does not accept
-# complete paths like $(obj)/$(f). To make sure this works, use a := assignment,
+# complete paths like $(obj)/$(f). To make sure this works, use a := assignment
 # or we will get $(obj)/$(f) in the "targets" value.
 # Also, this forces you to use the := syntax when assigning to targets.
 # Otherwise the line below will cause an infinite loop (if you don't know why,
diff --git a/arch/um/scripts/Makefile.unmap b/arch/um/scripts/Makefile.unmap
new file mode 100644 (file)
index 0000000..37a8f97
--- /dev/null
@@ -0,0 +1,22 @@
+clean-files += unmap_tmp.o unmap_fin.o unmap.o
+
+ifdef CONFIG_MODE_TT
+
+#Always build unmap_fin.o
+extra-y += unmap_fin.o
+#Do dependency tracking for unmap.o (it will be always built, but won't get the tracking unless we use this).
+targets += unmap.o
+
+#XXX: partially copied from arch/um/scripts/Makefile.rules
+$(obj)/unmap.o: _c_flags = $(call unprofile,$(CFLAGS))
+
+quiet_cmd_wrapld = LD      $@
+define cmd_wrapld
+       $(LD) -r -o $(obj)/unmap_tmp.o $< $(shell $(CC) -print-file-name=libc.a); \
+       $(OBJCOPY) $(obj)/unmap_tmp.o $@ -G switcheroo
+endef
+
+$(obj)/unmap_fin.o : $(obj)/unmap.o FORCE
+       $(call if_changed,wrapld)
+
+endif
index fcd67c3414e40d47cfb384b502efdcbc6af29cc1..095bcdb0b9cc1f0a40a012b3511456fcee0957a4 100644 (file)
@@ -9,6 +9,8 @@ USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o
 
 SYMLINKS = bitops.c semaphore.c highmem.c module.c
 
+include arch/um/scripts/Makefile.rules
+
 bitops.c-dir = lib
 semaphore.c-dir = kernel
 highmem.c-dir = mm
@@ -16,4 +18,4 @@ module.c-dir = kernel
 
 subdir- := util
 
-include arch/um/scripts/Makefile.rules
+include arch/um/scripts/Makefile.unmap
index e9892eef51cee5dd85038ba98c22432bb81d42af..2c11b9770e8b351c3756864237ff27b9be721e41 100644 (file)
@@ -1,5 +1,7 @@
-#include "linux/delay.h"
-#include "asm/param.h"
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <asm/param.h>
 
 void __delay(unsigned long time)
 {
@@ -20,13 +22,19 @@ void __udelay(unsigned long usecs)
        int i, n;
 
        n = (loops_per_jiffy * HZ * usecs) / MILLION;
-       for(i=0;i<n;i++) ;
+        for(i=0;i<n;i++)
+                cpu_relax();
 }
 
+EXPORT_SYMBOL(__udelay);
+
 void __const_udelay(unsigned long usecs)
 {
        int i, n;
 
        n = (loops_per_jiffy * HZ * usecs) / MILLION;
-       for(i=0;i<n;i++) ;
+        for(i=0;i<n;i++)
+                cpu_relax();
 }
+
+EXPORT_SYMBOL(__const_udelay);
index 281fc7b8ca00bbdfa9a9a892803e0365c600c3ec..e3706d15c4f51bfefe364ee37c45c5fe99375c12 100644 (file)
@@ -3,12 +3,15 @@
  * Licensed under the GPL
  */
 
+#include "linux/config.h"
 #include "linux/kernel.h"
 #include "linux/smp.h"
 #include "linux/sched.h"
+#include "linux/kallsyms.h"
 #include "asm/ptrace.h"
 #include "sysrq.h"
 
+/* This is declared by <linux/sched.h> */
 void show_regs(struct pt_regs *regs)
 {
         printk("\n");
@@ -31,5 +34,80 @@ void show_regs(struct pt_regs *regs)
               0xffff & PT_REGS_DS(regs), 
               0xffff & PT_REGS_ES(regs));
 
-        show_trace((unsigned long *) &regs);
+        show_trace(NULL, (unsigned long *) &regs);
 }
+
+/* Copied from i386. */
+static inline int valid_stack_ptr(struct thread_info *tinfo, void *p)
+{
+       return  p > (void *)tinfo &&
+               p < (void *)tinfo + THREAD_SIZE - 3;
+}
+
+/* Adapted from i386 (we also print the address we read from). */
+static inline unsigned long print_context_stack(struct thread_info *tinfo,
+                               unsigned long *stack, unsigned long ebp)
+{
+       unsigned long addr;
+
+#ifdef CONFIG_FRAME_POINTER
+       while (valid_stack_ptr(tinfo, (void *)ebp)) {
+               addr = *(unsigned long *)(ebp + 4);
+               printk("%08lx:  [<%08lx>]", ebp + 4, addr);
+               print_symbol(" %s", addr);
+               printk("\n");
+               ebp = *(unsigned long *)ebp;
+       }
+#else
+       while (valid_stack_ptr(tinfo, stack)) {
+               addr = *stack;
+               if (__kernel_text_address(addr)) {
+                       printk("%08lx:  [<%08lx>]", (unsigned long) stack, addr);
+                       print_symbol(" %s", addr);
+                       printk("\n");
+               }
+               stack++;
+       }
+#endif
+       return ebp;
+}
+
+void show_trace(struct task_struct* task, unsigned long * stack)
+{
+       unsigned long ebp;
+       struct thread_info *context;
+
+       /* Turn this into BUG_ON if possible. */
+       if (!stack) {
+               stack = (unsigned long*) &stack;
+               printk("show_trace: got NULL stack, implicit assumption task == current");
+               WARN_ON(1);
+       }
+
+       if (!task)
+               task = current;
+
+       if (task != current) {
+               //ebp = (unsigned long) KSTK_EBP(task);
+               /* Which one? No actual difference - just coding style.*/
+               ebp = (unsigned long) PT_REGS_EBP(&task->thread.regs);
+       } else {
+               asm ("movl %%ebp, %0" : "=r" (ebp) : );
+       }
+
+       context = (struct thread_info *)
+               ((unsigned long)stack & (~(THREAD_SIZE - 1)));
+       print_context_stack(context, stack, ebp);
+
+       /*while (((long) stack & (THREAD_SIZE-1)) != 0) {
+               addr = *stack;
+               if (__kernel_text_address(addr)) {
+                       printk("%08lx:  [<%08lx>]", (unsigned long) stack, addr);
+                       print_symbol(" %s", addr);
+                       printk("\n");
+               }
+               stack++;
+       }*/
+       printk("\n");
+}
+
diff --git a/arch/um/sys-i386/unmap.c b/arch/um/sys-i386/unmap.c
new file mode 100644 (file)
index 0000000..1368752
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
+ * Licensed under the GPL
+ */
+
+#include <linux/mman.h>
+#include <asm/unistd.h>
+
+static int errno;
+
+static inline _syscall2(int,munmap,void *,start,size_t,len)
+static inline _syscall6(void *,mmap2,void *,addr,size_t,len,int,prot,int,flags,int,fd,off_t,offset)
+int switcheroo(int fd, int prot, void *from, void *to, int size)
+{
+       if(munmap(to, size) < 0){
+               return(-1);
+       }
+       if(mmap2(to, size, prot, MAP_SHARED | MAP_FIXED, fd, 0) != to){
+               return(-1);
+       }
+       if(munmap(from, size) < 0){
+               return(-1);
+       }
+       return(0);
+}
index 82d6e9335bb6bc9c8614c3e10c55e95e68516efa..2f816f1a0ff4d3ceae814f81e8aedd107b955430 100644 (file)
@@ -27,17 +27,5 @@ void show_regs(struct pt_regs_subarch *regs)
                 0xffff & regs->xds, 0xffff & regs->xes);
 #endif
 
-        show_trace(&regs->gpr[1]);
+        show_trace(current, &regs->gpr[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 3d7da911cc8c90cf0cf0d78382a7b6b8f36d0416..2bc6f6849010d0ca27a7aeaa414bcfd9421fa3b8 100644 (file)
@@ -14,11 +14,11 @@ obj-$(CONFIG_MODULES) += module.o um_module.o
 
 USER_OBJS := ptrace_user.o sigcontext.o
 
-include arch/um/scripts/Makefile.rules
-
 SYMLINKS = bitops.c csum-copy.S csum-partial.c csum-wrappers.c memcpy.S \
        semaphore.c thunk.S module.c
 
+include arch/um/scripts/Makefile.rules
+
 bitops.c-dir = lib
 csum-copy.S-dir = lib
 csum-partial.c-dir = lib
@@ -28,6 +28,6 @@ semaphore.c-dir = kernel
 thunk.S-dir = lib
 module.c-dir = kernel
 
-CFLAGS_csum-partial.o := -Dcsum_partial=arch_csum_partial
-
 subdir- := util
+
+include arch/um/scripts/Makefile.unmap
index 651332aeec22db781a0af12181210515b788a990..137f4446b4390cfe49b7036de853b1fff05d350a 100644 (file)
@@ -5,40 +5,37 @@
  * Licensed under the GPL
  */
 
-#include "linux/delay.h"
-#include "asm/processor.h"
-#include "asm/param.h"
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <asm/processor.h>
+#include <asm/param.h>
 
 void __delay(unsigned long loops)
 {
        unsigned long i;
 
-       for(i = 0; i < loops; i++) ;
+        for(i = 0; i < loops; i++)
+                cpu_relax();
 }
 
 void __udelay(unsigned long usecs)
 {
-       int i, n;
+       unsigned long i, n;
 
        n = (loops_per_jiffy * HZ * usecs) / MILLION;
-       for(i=0;i<n;i++) ;
+        for(i=0;i<n;i++)
+                cpu_relax();
 }
 
+EXPORT_SYMBOL(__udelay);
+
 void __const_udelay(unsigned long usecs)
 {
-       int i, n;
+       unsigned long i, n;
 
        n = (loops_per_jiffy * HZ * usecs) / MILLION;
-       for(i=0;i<n;i++) ;
+        for(i=0;i<n;i++)
+                cpu_relax();
 }
 
-/*
- * 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:
- */
+EXPORT_SYMBOL(__const_udelay);
index a27f0ee6a4f657e3cacdb77366276862abdc5bfe..8592738082038b0b8d500408fcc0e616793e457e 100644 (file)
@@ -16,5 +16,4 @@ EXPORT_SYMBOL(__up_wakeup);
 EXPORT_SYMBOL(__memcpy);
 
 /* Networking helper routines. */
-/*EXPORT_SYMBOL(csum_partial_copy_from);
-EXPORT_SYMBOL(csum_partial_copy_to);*/
+EXPORT_SYMBOL(ip_compute_csum);
index b593bb256f2cf96d0b65ee3a76de1a1594b4af18..74eee5c7c6dd7aa3b6b79d244bb54d2cda33439a 100644 (file)
@@ -5,10 +5,11 @@
  */
 
 #define __FRAME_OFFSETS
-#include "asm/ptrace.h"
-#include "linux/sched.h"
-#include "linux/errno.h"
-#include "asm/elf.h"
+#include <asm/ptrace.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+#include <asm/elf.h>
 
 /* XXX x86_64 */
 unsigned long not_ss;
index dd9914642b8e905e5744d81cf712d9af9a141a84..6f44f40204ed0947ffe93f6358a0a517649b6fd8 100644 (file)
@@ -15,6 +15,7 @@
 #include "asm/unistd.h"
 #include "asm/prctl.h" /* XXX This should get the constants from libc */
 #include "choose-mode.h"
+#include "kern.h"
 
 asmlinkage long sys_uname64(struct new_utsname __user * name)
 {
@@ -132,23 +133,27 @@ static long arch_prctl_tt(int code, unsigned long addr)
 
 #ifdef CONFIG_MODE_SKAS
 
+/* XXX: Must also call arch_prctl in the host, beside saving the segment bases! */
 static long arch_prctl_skas(int code, unsigned long addr)
 {
        long ret = 0;
 
        switch(code){
-       case ARCH_SET_GS:
-               current->thread.regs.regs.skas.regs[GS_BASE / sizeof(unsigned long)] = addr;
-               break;
        case ARCH_SET_FS:
                current->thread.regs.regs.skas.regs[FS_BASE / sizeof(unsigned long)] = addr;
                break;
+       case ARCH_SET_GS:
+               current->thread.regs.regs.skas.regs[GS_BASE / sizeof(unsigned long)] = addr;
+               break;
        case ARCH_GET_FS:
-               ret = put_user(current->thread.regs.regs.skas.regs[GS / sizeof(unsigned long)], &addr);
+               ret = put_user(current->thread.regs.regs.skas.
+                               regs[FS_BASE / sizeof(unsigned long)],
+                               (unsigned long __user *)addr);
                break;
        case ARCH_GET_GS:
-               ret = put_user(current->thread.regs.regs.skas.regs[FS / sizeof(unsigned \
-long)], &addr);
+               ret = put_user(current->thread.regs.regs.skas.
+                               regs[GS_BASE / sizeof(unsigned long)],
+                               (unsigned long __user *)addr);
                break;
        default:
                ret = -EINVAL;
index ddf74691a6109cfb406123c01354cf6b20cd9a15..d0a25af19a5bd216dc2995807fb0ed410238b44e 100644 (file)
@@ -36,14 +36,5 @@ void __show_regs(struct pt_regs * regs)
 void show_regs(struct pt_regs *regs)
 {
        __show_regs(regs);
-       show_trace((unsigned long *) &regs);
+       show_trace(current, (unsigned long *) &regs);
 }
-
-/* 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:
- */
diff --git a/arch/um/sys-x86_64/unmap.c b/arch/um/sys-x86_64/unmap.c
new file mode 100644 (file)
index 0000000..bc7094c
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
+ * Licensed under the GPL
+ */
+
+#include <linux/mman.h>
+#include <asm/unistd.h>
+
+static int errno;
+
+static inline _syscall2(int,munmap,void *,start,size_t,len)
+static inline _syscall6(void *,mmap,void *,addr,size_t,len,int,prot,int,flags,int,fd,off_t,offset)
+int switcheroo(int fd, int prot, void *from, void *to, int size)
+{
+       if(munmap(to, size) < 0){
+               return(-1);
+       }
+       if(mmap(to, size, prot, MAP_SHARED | MAP_FIXED, fd, 0) != to){
+               return(-1);
+       }
+       if(munmap(from, size) < 0){
+               return(-1);
+       }
+       return(0);
+}
index 5e14792e48384458e075d0cf4bccf9e3bb4260c6..513d17ceafd4de4cad8a5f722837347eb038af53 100644 (file)
@@ -3,6 +3,14 @@
 #include <signal.h>
 #define __FRAME_OFFSETS
 #include <asm/ptrace.h>
+#include <asm/types.h>
+/* For some reason, x86_64 defines u64 and u32 only in <pci/types.h>, which I
+ * refuse to include here, even though they're used throughout the headers.
+ * These are used in asm/user.h, and that include can't be avoided because of
+ * the sizeof(struct user_regs_struct) below.
+ */
+typedef __u64 u64;
+typedef __u32 u32;
 #include <asm/user.h>
 
 #define DEFINE(sym, val) \
index 44ee7f6acf7b521ac9e291eb949e0257ecb5d7fd..289f448ac89cc426dcb5fdb4d23aaf8bef7988bb 100644 (file)
@@ -303,6 +303,21 @@ config HPET_TIMER
          as it is off-chip.  You can find the HPET spec at
          <http://www.intel.com/labs/platcomp/hpet/hpetspec.htm>.
 
+config X86_PM_TIMER
+       bool "PM timer"
+       depends on ACPI
+       default y
+       help
+         Support the ACPI PM timer for time keeping. This is slow,
+         but is useful on some chipsets without HPET on systems with more
+         than one CPU. On a single processor or single socket multi core
+         system it is normally not required.
+         When the PM timer is active 64bit vsyscalls are disabled
+         and should not be enabled (/proc/sys/kernel/vsyscall64 should
+         not be changed).
+         The kernel selects the PM timer only as a last resort, so it is
+         useful to enable just in case.
+
 config HPET_EMULATE_RTC
        bool "Provide RTC interrupt"
        depends on HPET_TIMER && RTC=y
@@ -407,7 +422,7 @@ config PCI_DIRECT
 
 config PCI_MMCONFIG
        bool "Support mmconfig PCI config space access"
-       depends on PCI
+       depends on PCI && ACPI
        select ACPI_BOOT
 
 config UNORDERED_IO
index 9ce51dee30b301972d6d5a8b160b8bef74d17049..569595b74c7ccfc5412053959f5cd68891122848 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-bk7
-# Sat Mar 12 23:43:44 2005
+# Linux kernel version: 2.6.12-rc4
+# Fri May 13 06:39:11 2005
 #
 CONFIG_X86_64=y
 CONFIG_64BIT=y
@@ -11,8 +11,6 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_X86_CMPXCHG=y
 CONFIG_EARLY_PRINTK=y
-CONFIG_HPET_TIMER=y
-CONFIG_HPET_EMULATE_RTC=y
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_GENERIC_IOMAP=y
 
@@ -22,6 +20,7 @@ CONFIG_GENERIC_IOMAP=y
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -33,7 +32,6 @@ CONFIG_POSIX_MQUEUE=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=18
 # CONFIG_HOTPLUG is not set
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
@@ -43,10 +41,11 @@ CONFIG_IKCONFIG_PROC=y
 CONFIG_KALLSYMS=y
 CONFIG_KALLSYMS_ALL=y
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
 CONFIG_CC_ALIGN_FUNCTIONS=0
 CONFIG_CC_ALIGN_LABELS=0
@@ -93,6 +92,9 @@ CONFIG_DISCONTIGMEM=y
 CONFIG_NUMA=y
 CONFIG_HAVE_DEC_LOCK=y
 CONFIG_NR_CPUS=8
+CONFIG_HPET_TIMER=y
+CONFIG_X86_PM_TIMER=y
+CONFIG_HPET_EMULATE_RTC=y
 CONFIG_GART_IOMMU=y
 CONFIG_SWIOTLB=y
 CONFIG_X86_MCE=y
@@ -100,6 +102,7 @@ CONFIG_X86_MCE_INTEL=y
 CONFIG_SECCOMP=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_ISA_DMA_API=y
 
 #
 # Power management options
@@ -129,7 +132,7 @@ CONFIG_ACPI_NUMA=y
 # CONFIG_ACPI_IBM is not set
 CONFIG_ACPI_TOSHIBA=y
 CONFIG_ACPI_BLACKLIST_YEAR=2001
-CONFIG_ACPI_DEBUG=y
+# CONFIG_ACPI_DEBUG is not set
 CONFIG_ACPI_BUS=y
 CONFIG_ACPI_EC=y
 CONFIG_ACPI_POWER=y
@@ -141,6 +144,7 @@ CONFIG_ACPI_SYSTEM=y
 # CPU Frequency scaling
 #
 CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
 # CONFIG_CPU_FREQ_DEBUG is not set
 CONFIG_CPU_FREQ_STAT=y
 # CONFIG_CPU_FREQ_STAT_DETAILS is not set
@@ -150,7 +154,6 @@ CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
 # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
 CONFIG_CPU_FREQ_GOV_USERSPACE=y
 CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-CONFIG_CPU_FREQ_TABLE=y
 
 #
 # CPUFreq processor drivers
@@ -164,6 +167,7 @@ CONFIG_X86_ACPI_CPUFREQ=y
 # shared options
 #
 CONFIG_X86_ACPI_CPUFREQ_PROC_INTF=y
+# CONFIG_X86_SPEEDSTEP_LIB is not set
 
 #
 # Bus options (PCI etc.)
@@ -172,19 +176,17 @@ CONFIG_PCI=y
 CONFIG_PCI_DIRECT=y
 CONFIG_PCI_MMCONFIG=y
 CONFIG_UNORDERED_IO=y
+# CONFIG_PCIEPORTBUS is not set
 CONFIG_PCI_MSI=y
 # CONFIG_PCI_LEGACY_PROC is not set
 # CONFIG_PCI_NAMES is not set
+# CONFIG_PCI_DEBUG is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
 #
 # CONFIG_PCCARD is not set
 
-#
-# PC-card bridges
-#
-
 #
 # PCI Hotplug Support
 #
@@ -254,7 +256,7 @@ CONFIG_LBD=y
 # IO Schedulers
 #
 CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
+# CONFIG_IOSCHED_AS is not set
 CONFIG_IOSCHED_DEADLINE=y
 CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
@@ -308,7 +310,8 @@ CONFIG_BLK_DEV_AMD74XX=y
 CONFIG_BLK_DEV_PIIX=y
 # CONFIG_BLK_DEV_NS87415 is not set
 # CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+CONFIG_BLK_DEV_PDC202XX_NEW=y
+# CONFIG_PDC202XX_FORCE is not set
 # CONFIG_BLK_DEV_SVWKS is not set
 # CONFIG_BLK_DEV_SIIMAGE is not set
 # CONFIG_BLK_DEV_SIS5513 is not set
@@ -353,7 +356,7 @@ CONFIG_BLK_DEV_SD=y
 #
 # SCSI low-level drivers
 #
-CONFIG_BLK_DEV_3W_XXXX_RAID=y
+# 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
@@ -384,7 +387,6 @@ CONFIG_SCSI_SATA_VIA=y
 # CONFIG_SCSI_BUSLOGIC is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_EATA_PIO is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
 # CONFIG_SCSI_GDTH is not set
 # CONFIG_SCSI_IPS is not set
@@ -392,7 +394,6 @@ CONFIG_SCSI_SATA_VIA=y
 # CONFIG_SCSI_INIA100 is not set
 # CONFIG_SCSI_SYM53C8XX_2 is not set
 # CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_QLOGIC_ISP is not set
 # CONFIG_SCSI_QLOGIC_FC is not set
 # CONFIG_SCSI_QLOGIC_1280 is not set
 CONFIG_SCSI_QLA2XXX=y
@@ -401,6 +402,7 @@ CONFIG_SCSI_QLA2XXX=y
 # CONFIG_SCSI_QLA2300 is not set
 # CONFIG_SCSI_QLA2322 is not set
 # CONFIG_SCSI_QLA6312 is not set
+# CONFIG_SCSI_LPFC is not set
 # CONFIG_SCSI_DC395x is not set
 # CONFIG_SCSI_DC390T is not set
 # CONFIG_SCSI_DEBUG is not set
@@ -437,7 +439,6 @@ CONFIG_NET=y
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -502,7 +503,7 @@ CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
+CONFIG_TUN=y
 
 #
 # ARCnet devices
@@ -525,8 +526,7 @@ CONFIG_MII=y
 # CONFIG_HP100 is not set
 CONFIG_NET_PCI=y
 # CONFIG_PCNET32 is not set
-CONFIG_AMD8111_ETH=y
-# CONFIG_AMD8111E_NAPI is not set
+# CONFIG_AMD8111_ETH is not set
 # CONFIG_ADAPTEC_STARFIRE is not set
 # CONFIG_B44 is not set
 CONFIG_FORCEDETH=y
@@ -536,7 +536,7 @@ CONFIG_FORCEDETH=y
 # CONFIG_FEALNX is not set
 # CONFIG_NATSEMI is not set
 # CONFIG_NE2K_PCI is not set
-CONFIG_8139CP=m
+CONFIG_8139CP=y
 CONFIG_8139TOO=y
 # CONFIG_8139TOO_PIO is not set
 # CONFIG_8139TOO_TUNE_TWISTER is not set
@@ -671,6 +671,7 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 #
 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
@@ -696,6 +697,7 @@ CONFIG_RTC=y
 #
 CONFIG_AGP=y
 CONFIG_AGP_AMD64=y
+CONFIG_AGP_INTEL=y
 # CONFIG_DRM is not set
 # CONFIG_MWAVE is not set
 CONFIG_RAW_DRIVER=y
@@ -703,7 +705,7 @@ CONFIG_HPET=y
 # CONFIG_HPET_RTC_IRQ is not set
 CONFIG_HPET_MMAP=y
 CONFIG_MAX_RAW_DEVS=256
-CONFIG_HANGCHECK_TIMER=y
+# CONFIG_HANGCHECK_TIMER is not set
 
 #
 # TPM devices
@@ -786,6 +788,8 @@ CONFIG_SOUND_ICH=y
 #
 # USB support
 #
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
 CONFIG_USB=y
 # CONFIG_USB_DEBUG is not set
 
@@ -797,8 +801,6 @@ CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_DYNAMIC_MINORS is not set
 # CONFIG_USB_SUSPEND is not set
 # CONFIG_USB_OTG is not set
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
 
 #
 # USB Host Controller Drivers
@@ -826,7 +828,6 @@ CONFIG_USB_PRINTER=y
 #
 CONFIG_USB_STORAGE=y
 # CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_RW_DETECT is not set
 # CONFIG_USB_STORAGE_DATAFAB is not set
 # CONFIG_USB_STORAGE_FREECOM is not set
 # CONFIG_USB_STORAGE_ISD200 is not set
@@ -965,7 +966,7 @@ CONFIG_AUTOFS_FS=y
 # CD-ROM/DVD Filesystems
 #
 CONFIG_ISO9660_FS=y
-# CONFIG_JOLIET is not set
+CONFIG_JOLIET=y
 # CONFIG_ZISOFS is not set
 # CONFIG_UDF_FS is not set
 
@@ -1092,9 +1093,10 @@ CONFIG_OPROFILE=y
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
-# CONFIG_PRINTK_TIME is not set
+CONFIG_LOG_BUF_SHIFT=18
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
 # CONFIG_DEBUG_SPINLOCK is not set
index 1965efc974dc4d1312717c9a948e927a456ae884..c12edf5d97f02a6e3c87e90a8f55d3b8c73618aa 100644 (file)
@@ -312,6 +312,7 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs)
        current->mm->brk = ex.a_bss +
                (current->mm->start_brk = N_BSSADDR(ex));
        current->mm->free_area_cache = TASK_UNMAPPED_BASE;
+       current->mm->cached_hole_size = 0;
 
        set_mm_counter(current->mm, rss, 0);
        current->mm->mmap = NULL;
index 99b522052d16d9cae2f3c07f11afd9c3cdfb59e9..c8131f342cfc6de02b41e447b66bdaaee5e83b5b 100644 (file)
@@ -46,7 +46,7 @@ struct elf_phdr;
 
 #define IA32_EMULATOR 1
 
-#define ELF_ET_DYN_BASE                (TASK_UNMAPPED_32 + 0x1000000)
+#define ELF_ET_DYN_BASE                (TASK_UNMAPPED_BASE + 0x1000000)
 
 #undef ELF_ARCH
 #define ELF_ARCH EM_386
@@ -307,9 +307,6 @@ MODULE_AUTHOR("Eric Youngdale, Andi Kleen");
 
 #define elf_addr_t __u32
 
-#undef TASK_SIZE
-#define TASK_SIZE 0xffffffff
-
 static void elf32_init(struct pt_regs *);
 
 #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
index 0a3318e08ab6f123e5a015f4c9cd2198c932b821..5ca4a4598fdad807b5aa0e8143c2aa55525fced2 100644 (file)
@@ -28,6 +28,7 @@ obj-$(CONFIG_GART_IOMMU)      += pci-gart.o aperture.o
 obj-$(CONFIG_DUMMY_IOMMU)      += pci-nommu.o pci-dma.o
 obj-$(CONFIG_SWIOTLB)          += swiotlb.o
 obj-$(CONFIG_KPROBES)          += kprobes.o
+obj-$(CONFIG_X86_PM_TIMER)     += pmtimer.o
 
 obj-$(CONFIG_MODULES)          += module.o
 
index a491f72cc96663a79bf26a5e8f642cbab55dac26..504e634749938dcba3775cffb1bad10ecee7d848 100644 (file)
@@ -33,12 +33,10 @@ int fallback_aper_force __initdata = 0;
 
 int fix_aperture __initdata = 1;
 
-#define NB_ID_3 (PCI_VENDOR_ID_AMD | (0x1103<<16))
+/* This code runs before the PCI subsystem is initialized, so just
+   access the northbridge directly. */
 
-static struct resource aper_res = {
-       .name = "Aperture",
-       .flags = IORESOURCE_MEM,
-};
+#define NB_ID_3 (PCI_VENDOR_ID_AMD | (0x1103<<16))
 
 static u32 __init allocate_aperture(void) 
 {
@@ -55,24 +53,11 @@ static u32 __init allocate_aperture(void)
        aper_size = (32 * 1024 * 1024) << fallback_aper_order; 
 
        /* 
-        * Aperture has to be naturally aligned. This means an 2GB
-        * aperture won't have much chances to find a place in the
-        * lower 4GB of memory.  Unfortunately we cannot move it up
-        * because that would make the IOMMU useless.
+        * Aperture has to be naturally aligned. This means an 2GB aperture won't
+        * have much chances to find a place in the lower 4GB of memory.
+        * Unfortunately we cannot move it up because that would make the
+        * IOMMU useless.
         */
-
-       /* First try to find some free unused space */
-       if (!allocate_resource(&iomem_resource, &aper_res,
-                              aper_size,
-                              0, 0xffffffff,
-                              aper_size,
-                              NULL, NULL)) {
-               printk(KERN_INFO "Putting aperture at %lx-%lx\n",
-                      aper_res.start, aper_res.end);
-               return aper_res.start;
-       }
-
-       /* No free space found. Go on to waste some memory... */
        p = __alloc_bootmem_node(nd0, aper_size, aper_size, 0); 
        if (!p || __pa(p)+aper_size > 0xffffffff) {
                printk("Cannot allocate aperture memory hole (%p,%uK)\n",
@@ -81,7 +66,7 @@ static u32 __init allocate_aperture(void)
                        free_bootmem_node(nd0, (unsigned long)p, aper_size); 
                return 0;
        }
-       printk("Mapping aperture over %d KB of precious RAM @ %lx\n",
+       printk("Mapping aperture over %d KB of RAM @ %lx\n",
               aper_size >> 10, __pa(p)); 
        return (u32)__pa(p); 
 }
@@ -102,16 +87,10 @@ static int __init aperture_valid(char *name, u64 aper_base, u32 aper_size)
                printk("Aperture from %s pointing to e820 RAM. Ignoring.\n",name);
                return 0; 
        } 
-       /* Don't check the resource here because the aperture is usually
-          in an e820 reserved area, and we allocated these earlier. */
        return 1;
 } 
 
-/*
- * Find a PCI capability.
- * This code runs before the PCI subsystem is initialized, so just
- * access the northbridge directly.
- */
+/* Find a PCI capability */
 static __u32 __init find_cap(int num, int slot, int func, int cap) 
 { 
        u8 pos;
@@ -276,6 +255,8 @@ void __init iommu_hole_init(void)
                   fallback_aper_force) { 
                printk("Your BIOS doesn't leave a aperture memory hole\n");
                printk("Please enable the IOMMU option in the BIOS setup\n");
+               printk("This costs you %d MB of RAM\n",
+                      32 << fallback_aper_order);
 
                aper_order = fallback_aper_order;
                aper_alloc = allocate_aperture();
index 7e13545748e0ef3378c87a23c401ba25f34d6c65..f8e6cc4fecd4887acc244fee292f401a96aac59b 100644 (file)
@@ -33,6 +33,7 @@
 #include <asm/mpspec.h>
 #include <asm/pgalloc.h>
 #include <asm/mach_apic.h>
+#include <asm/nmi.h>
 
 int apic_verbosity;
 
@@ -925,7 +926,7 @@ __init int oem_force_hpet_timer(void)
        unsigned id;
        DECLARE_BITMAP(clustermap, NUM_APIC_CLUSTERS);
 
-       bitmap_empty(clustermap, NUM_APIC_CLUSTERS);
+       bitmap_zero(clustermap, NUM_APIC_CLUSTERS);
 
        for (i = 0; i < NR_CPUS; i++) {
                id = bios_cpu_apicid[i];
@@ -1056,7 +1057,7 @@ int __init APIC_init_uniprocessor (void)
                nr_ioapics = 0;
 #endif
        setup_boot_APIC_clock();
-
+       check_nmi_watchdog();
        return 0;
 }
 
index 1086b5fcac21c51ad8acb01a02c6c8a6a971a8c7..28817490fdc69510a527c9974be8bb550aa2a5b6 100644 (file)
@@ -220,13 +220,18 @@ sysret_careful:
        jmp sysret_check
 
        /* Handle a signal */ 
-       /* edx: work flags (arg3) */
 sysret_signal:
        sti
+       testl $(_TIF_SIGPENDING|_TIF_NOTIFY_RESUME|_TIF_SINGLESTEP),%edx
+       jz    1f
+
+       /* Really a signal */
+       /* edx: work flags (arg3) */
        leaq do_notify_resume(%rip),%rax
        leaq -ARGOFFSET(%rsp),%rdi # &pt_regs -> arg1
        xorl %esi,%esi # oldset -> arg2
        call ptregscall_common
+1:     movl $_TIF_NEED_RESCHED,%edi
        jmp sysret_check
        
        /* Do syscall tracing */
@@ -484,6 +489,8 @@ retint_careful:
        jmp retint_check
        
 retint_signal:
+       testl $(_TIF_SIGPENDING|_TIF_NOTIFY_RESUME|_TIF_SINGLESTEP),%edx
+       jz    retint_swapgs
        sti
        SAVE_REST
        movq $-1,ORIG_RAX(%rsp)                         
@@ -492,8 +499,8 @@ retint_signal:
        call do_notify_resume
        RESTORE_REST
        cli
+       movl $_TIF_NEED_RESCHED,%edi
        GET_THREAD_INFO(%rcx)
-       movl $_TIF_WORK_MASK,%edi
        jmp retint_check
 
 #ifdef CONFIG_PREEMPT
index 60be58617eb977e1620beda8e363ba9cfd9fc17c..afd87e64d0a870c43eaab0a6a99882c9d1c12281 100644 (file)
 #include <asm/desc.h>
 #include <asm/proto.h>
 #include <asm/mach_apic.h>
+#include <asm/acpi.h>
 
 #define __apicdebuginit  __init
 
 int sis_apic_bug; /* not actually supported, dummy for compile */
 
+static int no_timer_check;
+
 static DEFINE_SPINLOCK(ioapic_lock);
 
 /*
@@ -1601,7 +1604,7 @@ static inline void check_timer(void)
                 * Ok, does IRQ0 through the IOAPIC work?
                 */
                unmask_IO_APIC_irq(0);
-               if (timer_irq_works()) {
+               if (!no_timer_check && timer_irq_works()) {
                        nmi_watchdog_default();
                        if (nmi_watchdog == NMI_IO_APIC) {
                                disable_8259A_irq(0);
@@ -1671,6 +1674,13 @@ static inline void check_timer(void)
        panic("IO-APIC + timer doesn't work! Try using the 'noapic' kernel parameter\n");
 }
 
+static int __init notimercheck(char *s)
+{
+       no_timer_check = 1;
+       return 1;
+}
+__setup("no_timer_check", notimercheck);
+
 /*
  *
  * IRQ's that are handled by the PIC in the MPS IOAPIC case.
@@ -1804,76 +1814,6 @@ device_initcall(ioapic_init_sysfs);
 
 #define IO_APIC_MAX_ID         0xFE
 
-int __init io_apic_get_unique_id (int ioapic, int apic_id)
-{
-       union IO_APIC_reg_00 reg_00;
-       static physid_mask_t apic_id_map;
-       unsigned long flags;
-       int i = 0;
-
-       /*
-        * The P4 platform supports up to 256 APIC IDs on two separate APIC 
-        * buses (one for LAPICs, one for IOAPICs), where predecessors only 
-        * supports up to 16 on one shared APIC bus.
-        * 
-        * TBD: Expand LAPIC/IOAPIC support on P4-class systems to take full
-        *      advantage of new APIC bus architecture.
-        */
-
-       if (physids_empty(apic_id_map))
-               apic_id_map = phys_cpu_present_map;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       reg_00.raw = io_apic_read(ioapic, 0);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       if (apic_id >= IO_APIC_MAX_ID) {
-               apic_printk(APIC_QUIET, KERN_WARNING "IOAPIC[%d]: Invalid apic_id %d, trying "
-                       "%d\n", ioapic, apic_id, reg_00.bits.ID);
-               apic_id = reg_00.bits.ID;
-       }
-
-       /*
-        * Every APIC in a system must have a unique ID or we get lots of nice 
-        * 'stuck on smp_invalidate_needed IPI wait' messages.
-        */
-       if (physid_isset(apic_id, apic_id_map)) {
-
-               for (i = 0; i < IO_APIC_MAX_ID; i++) {
-                       if (!physid_isset(i, apic_id_map))
-                               break;
-               }
-
-               if (i == IO_APIC_MAX_ID)
-                       panic("Max apic_id exceeded!\n");
-
-               apic_printk(APIC_VERBOSE, KERN_WARNING "IOAPIC[%d]: apic_id %d already used, "
-                       "trying %d\n", ioapic, apic_id, i);
-
-               apic_id = i;
-       } 
-
-       physid_set(apic_id, apic_id_map);
-
-       if (reg_00.bits.ID != apic_id) {
-               reg_00.bits.ID = apic_id;
-
-               spin_lock_irqsave(&ioapic_lock, flags);
-               io_apic_write(ioapic, 0, reg_00.raw);
-               reg_00.raw = io_apic_read(ioapic, 0);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-
-               /* Sanity check */
-               if (reg_00.bits.ID != apic_id)
-                       panic("IOAPIC[%d]: Unable change apic_id!\n", ioapic);
-       }
-
-       apic_printk(APIC_VERBOSE,KERN_INFO "IOAPIC[%d]: Assigned apic_id %d\n", ioapic, apic_id);
-
-       return apic_id;
-}
-
-
 int __init io_apic_get_version (int ioapic)
 {
        union IO_APIC_reg_01    reg_01;
index 7ec031c6ca10fe566e444fcafcb3b1b4995887b9..61a63be6b294adf3f0716ad8bcd27c13b7028c36 100644 (file)
@@ -30,6 +30,7 @@
 #include <asm/pgalloc.h>
 #include <asm/io_apic.h>
 #include <asm/proto.h>
+#include <asm/acpi.h>
 
 /* Have we found an MP table */
 int smp_found_config;
@@ -107,6 +108,7 @@ static int __init mpf_checksum(unsigned char *mp, int len)
 static void __init MP_processor_info (struct mpc_config_processor *m)
 {
        int ver;
+       static int found_bsp=0;
 
        if (!(m->mpc_cpuflag & CPU_ENABLED))
                return;
@@ -126,11 +128,6 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
                        " Processor ignored.\n", NR_CPUS);
                return;
        }
-       if (num_processors >= maxcpus) {
-               printk(KERN_WARNING "WARNING: maxcpus limit of %i reached."
-                       " Processor ignored.\n", maxcpus);
-               return;
-       }
 
        num_processors++;
 
@@ -150,7 +147,19 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
                ver = 0x10;
        }
        apic_version[m->mpc_apicid] = ver;
-       bios_cpu_apicid[num_processors - 1] = m->mpc_apicid;
+       if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
+               /*
+                * bios_cpu_apicid is required to have processors listed
+                * in same order as logical cpu numbers. Hence the first
+                * entry is BSP, and so on.
+                */
+               bios_cpu_apicid[0] = m->mpc_apicid;
+               x86_cpu_to_apicid[0] = m->mpc_apicid;
+               found_bsp = 1;
+       } else {
+               bios_cpu_apicid[num_processors - found_bsp] = m->mpc_apicid;
+               x86_cpu_to_apicid[num_processors - found_bsp] = m->mpc_apicid;
+       }
 }
 
 static void __init MP_bus_info (struct mpc_config_bus *m)
@@ -759,7 +768,7 @@ void __init mp_register_ioapic (
        mp_ioapics[idx].mpc_apicaddr = address;
 
        set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
-       mp_ioapics[idx].mpc_apicid = io_apic_get_unique_id(idx, id);
+       mp_ioapics[idx].mpc_apicid = id;
        mp_ioapics[idx].mpc_apicver = io_apic_get_version(idx);
        
        /* 
index 61de0b34a01e850fedb824115b2e0560ed98ff59..31c0f2e6ac916c8f1cd93f025cf3182b92f1fa3e 100644 (file)
@@ -33,6 +33,7 @@
 #include <asm/msr.h>
 #include <asm/proto.h>
 #include <asm/kdebug.h>
+#include <asm/local.h>
 
 /*
  * lapic_nmi_owner tracks the ownership of the lapic NMI hardware:
@@ -59,7 +60,8 @@ int panic_on_timeout;
 
 unsigned int nmi_watchdog = NMI_DEFAULT;
 static unsigned int nmi_hz = HZ;
-unsigned int nmi_perfctr_msr;  /* the MSR to reset in NMI handler */
+static unsigned int nmi_perfctr_msr;   /* the MSR to reset in NMI handler */
+static unsigned int nmi_p4_cccr_val;
 
 /* Note that these events don't tick when the CPU idles. This means
    the frequency varies with CPU load. */
@@ -71,61 +73,87 @@ unsigned int nmi_perfctr_msr;       /* the MSR to reset in NMI handler */
 #define K7_EVENT_CYCLES_PROCESSOR_IS_RUNNING   0x76
 #define K7_NMI_EVENT           K7_EVENT_CYCLES_PROCESSOR_IS_RUNNING
 
-#define P6_EVNTSEL0_ENABLE     (1 << 22)
-#define P6_EVNTSEL_INT         (1 << 20)
-#define P6_EVNTSEL_OS          (1 << 17)
-#define P6_EVNTSEL_USR         (1 << 16)
-#define P6_EVENT_CPU_CLOCKS_NOT_HALTED 0x79
-#define P6_NMI_EVENT           P6_EVENT_CPU_CLOCKS_NOT_HALTED
+#define MSR_P4_MISC_ENABLE     0x1A0
+#define MSR_P4_MISC_ENABLE_PERF_AVAIL  (1<<7)
+#define MSR_P4_MISC_ENABLE_PEBS_UNAVAIL        (1<<12)
+#define MSR_P4_PERFCTR0                0x300
+#define MSR_P4_CCCR0           0x360
+#define P4_ESCR_EVENT_SELECT(N)        ((N)<<25)
+#define P4_ESCR_OS             (1<<3)
+#define P4_ESCR_USR            (1<<2)
+#define P4_CCCR_OVF_PMI0       (1<<26)
+#define P4_CCCR_OVF_PMI1       (1<<27)
+#define P4_CCCR_THRESHOLD(N)   ((N)<<20)
+#define P4_CCCR_COMPLEMENT     (1<<19)
+#define P4_CCCR_COMPARE                (1<<18)
+#define P4_CCCR_REQUIRED       (3<<16)
+#define P4_CCCR_ESCR_SELECT(N) ((N)<<13)
+#define P4_CCCR_ENABLE         (1<<12)
+/* Set up IQ_COUNTER0 to behave like a clock, by having IQ_CCCR0 filter
+   CRU_ESCR0 (with any non-null event selector) through a complemented
+   max threshold. [IA32-Vol3, Section 14.9.9] */
+#define MSR_P4_IQ_COUNTER0     0x30C
+#define P4_NMI_CRU_ESCR0       (P4_ESCR_EVENT_SELECT(0x3F)|P4_ESCR_OS|P4_ESCR_USR)
+#define P4_NMI_IQ_CCCR0        \
+       (P4_CCCR_OVF_PMI0|P4_CCCR_THRESHOLD(15)|P4_CCCR_COMPLEMENT|     \
+        P4_CCCR_COMPARE|P4_CCCR_REQUIRED|P4_CCCR_ESCR_SELECT(4)|P4_CCCR_ENABLE)
+
+static __init inline int nmi_known_cpu(void)
+{
+       switch (boot_cpu_data.x86_vendor) {
+       case X86_VENDOR_AMD:
+               return boot_cpu_data.x86 == 15;
+       case X86_VENDOR_INTEL:
+               return boot_cpu_data.x86 == 15;
+       }
+       return 0;
+}
 
 /* Run after command line and cpu_init init, but before all other checks */
 void __init nmi_watchdog_default(void)
 {
        if (nmi_watchdog != NMI_DEFAULT)
                return;
-
-       /* For some reason the IO APIC watchdog doesn't work on the AMD
-          8111 chipset. For now switch to local APIC mode using
-          perfctr0 there.  On Intel CPUs we don't have code to handle
-          the perfctr and the IO-APIC seems to work, so use that.  */
-
-       if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
-               nmi_watchdog = NMI_LOCAL_APIC; 
-               printk(KERN_INFO 
-              "Using local APIC NMI watchdog using perfctr0\n");
-       } else {
-               printk(KERN_INFO "Using IO APIC NMI watchdog\n");
+       if (nmi_known_cpu())
+               nmi_watchdog = NMI_LOCAL_APIC;
+       else
                nmi_watchdog = NMI_IO_APIC;
-       }
 }
 
-/* Why is there no CPUID flag for this? */
-static __init int cpu_has_lapic(void)
+#ifdef CONFIG_SMP
+/* The performance counters used by NMI_LOCAL_APIC don't trigger when
+ * the CPU is idle. To make sure the NMI watchdog really ticks on all
+ * CPUs during the test make them busy.
+ */
+static __init void nmi_cpu_busy(void *data)
 {
-       switch (boot_cpu_data.x86_vendor) { 
-       case X86_VENDOR_INTEL:
-       case X86_VENDOR_AMD: 
-               return boot_cpu_data.x86 >= 6; 
-       /* .... add more cpus here or find a different way to figure this out. */       
-       default:
-               return 0;
-       }       
+       volatile int *endflag = data;
+       local_irq_enable();
+       /* Intentionally don't use cpu_relax here. This is
+          to make sure that the performance counter really ticks,
+          even if there is a simulator or similar that catches the
+          pause instruction. On a real HT machine this is fine because
+          all other CPUs are busy with "useless" delay loops and don't
+          care if they get somewhat less cycles. */
+       while (*endflag == 0)
+               barrier();
 }
+#endif
 
-static int __init check_nmi_watchdog (void)
+int __init check_nmi_watchdog (void)
 {
-       int counts[NR_CPUS];
+       volatile int endflag = 0;
+       int *counts;
        int cpu;
 
-       if (nmi_watchdog == NMI_NONE)
-               return 0;
+       counts = kmalloc(NR_CPUS * sizeof(int), GFP_KERNEL);
+       if (!counts)
+               return -1;
 
-       if (nmi_watchdog == NMI_LOCAL_APIC && !cpu_has_lapic())  {
-               nmi_watchdog = NMI_NONE;
-               return -1; 
-       }       
+       printk(KERN_INFO "testing NMI watchdog ... ");
 
-       printk(KERN_INFO "Testing NMI watchdog ... ");
+       if (nmi_watchdog == NMI_LOCAL_APIC)
+               smp_call_function(nmi_cpu_busy, (void *)&endflag, 0, 0);
 
        for (cpu = 0; cpu < NR_CPUS; cpu++)
                counts[cpu] = cpu_pda[cpu].__nmi_count; 
@@ -133,15 +161,22 @@ static int __init check_nmi_watchdog (void)
        mdelay((10*1000)/nmi_hz); // wait 10 ticks
 
        for (cpu = 0; cpu < NR_CPUS; cpu++) {
+               if (!cpu_online(cpu))
+                       continue;
                if (cpu_pda[cpu].__nmi_count - counts[cpu] <= 5) {
-                       printk("CPU#%d: NMI appears to be stuck (%d)!\n", 
+                       endflag = 1;
+                       printk("CPU#%d: NMI appears to be stuck (%d->%d)!\n",
                               cpu,
+                              counts[cpu],
                               cpu_pda[cpu].__nmi_count);
                        nmi_active = 0;
                        lapic_nmi_owner &= ~LAPIC_NMI_WATCHDOG;
+                       nmi_perfctr_msr = 0;
+                       kfree(counts);
                        return -1;
                }
        }
+       endflag = 1;
        printk("OK.\n");
 
        /* now that we know it works we can reduce NMI frequency to
@@ -149,10 +184,9 @@ static int __init check_nmi_watchdog (void)
        if (nmi_watchdog == NMI_LOCAL_APIC)
                nmi_hz = 1;
 
+       kfree(counts);
        return 0;
 }
-/* Have this called later during boot so counters are updating */
-late_initcall(check_nmi_watchdog);
 
 int __init setup_nmi_watchdog(char *str)
 {
@@ -170,7 +204,7 @@ int __init setup_nmi_watchdog(char *str)
 
        if (nmi >= NMI_INVALID)
                return 0;
-               nmi_watchdog = nmi;
+       nmi_watchdog = nmi;
        return 1;
 }
 
@@ -185,7 +219,10 @@ static void disable_lapic_nmi_watchdog(void)
                wrmsr(MSR_K7_EVNTSEL0, 0, 0);
                break;
        case X86_VENDOR_INTEL:
-               wrmsr(MSR_IA32_EVNTSEL0, 0, 0);
+               if (boot_cpu_data.x86 == 15) {
+                       wrmsr(MSR_P4_IQ_CCCR0, 0, 0);
+                       wrmsr(MSR_P4_CRU_ESCR0, 0, 0);
+               }
                break;
        }
        nmi_active = -1;
@@ -253,7 +290,7 @@ void enable_timer_nmi_watchdog(void)
 
 static int nmi_pm_active; /* nmi_active before suspend */
 
-static int lapic_nmi_suspend(struct sys_device *dev, pm_message_t state)
+static int lapic_nmi_suspend(struct sys_device *dev, u32 state)
 {
        nmi_pm_active = nmi_active;
        disable_lapic_nmi_watchdog();
@@ -300,22 +337,27 @@ late_initcall(init_lapic_nmi_sysfs);
  * Original code written by Keith Owens.
  */
 
+static void clear_msr_range(unsigned int base, unsigned int n)
+{
+       unsigned int i;
+
+       for(i = 0; i < n; ++i)
+               wrmsr(base+i, 0, 0);
+}
+
 static void setup_k7_watchdog(void)
 {
        int i;
        unsigned int evntsel;
 
-       /* No check, so can start with slow frequency */
-       nmi_hz = 1; 
-
-       /* XXX should check these in EFER */
-
        nmi_perfctr_msr = MSR_K7_PERFCTR0;
 
        for(i = 0; i < 4; ++i) {
                /* Simulator may not support it */
-               if (checking_wrmsrl(MSR_K7_EVNTSEL0+i, 0UL))
+               if (checking_wrmsrl(MSR_K7_EVNTSEL0+i, 0UL)) {
+                       nmi_perfctr_msr = 0;
                        return;
+               }
                wrmsrl(MSR_K7_PERFCTR0+i, 0UL);
        }
 
@@ -325,12 +367,54 @@ static void setup_k7_watchdog(void)
                | K7_NMI_EVENT;
 
        wrmsr(MSR_K7_EVNTSEL0, evntsel, 0);
-       wrmsrl(MSR_K7_PERFCTR0, -((u64)cpu_khz*1000) / nmi_hz);
+       wrmsr(MSR_K7_PERFCTR0, -(cpu_khz/nmi_hz*1000), -1);
        apic_write(APIC_LVTPC, APIC_DM_NMI);
        evntsel |= K7_EVNTSEL_ENABLE;
        wrmsr(MSR_K7_EVNTSEL0, evntsel, 0);
 }
 
+
+static int setup_p4_watchdog(void)
+{
+       unsigned int misc_enable, dummy;
+
+       rdmsr(MSR_P4_MISC_ENABLE, misc_enable, dummy);
+       if (!(misc_enable & MSR_P4_MISC_ENABLE_PERF_AVAIL))
+               return 0;
+
+       nmi_perfctr_msr = MSR_P4_IQ_COUNTER0;
+       nmi_p4_cccr_val = P4_NMI_IQ_CCCR0;
+#ifdef CONFIG_SMP
+       if (smp_num_siblings == 2)
+               nmi_p4_cccr_val |= P4_CCCR_OVF_PMI1;
+#endif
+
+       if (!(misc_enable & MSR_P4_MISC_ENABLE_PEBS_UNAVAIL))
+               clear_msr_range(0x3F1, 2);
+       /* MSR 0x3F0 seems to have a default value of 0xFC00, but current
+          docs doesn't fully define it, so leave it alone for now. */
+       if (boot_cpu_data.x86_model >= 0x3) {
+               /* MSR_P4_IQ_ESCR0/1 (0x3ba/0x3bb) removed */
+               clear_msr_range(0x3A0, 26);
+               clear_msr_range(0x3BC, 3);
+       } else {
+               clear_msr_range(0x3A0, 31);
+       }
+       clear_msr_range(0x3C0, 6);
+       clear_msr_range(0x3C8, 6);
+       clear_msr_range(0x3E0, 2);
+       clear_msr_range(MSR_P4_CCCR0, 18);
+       clear_msr_range(MSR_P4_PERFCTR0, 18);
+
+       wrmsr(MSR_P4_CRU_ESCR0, P4_NMI_CRU_ESCR0, 0);
+       wrmsr(MSR_P4_IQ_CCCR0, P4_NMI_IQ_CCCR0 & ~P4_CCCR_ENABLE, 0);
+       Dprintk("setting P4_IQ_COUNTER0 to 0x%08lx\n", -(cpu_khz/nmi_hz*1000));
+       wrmsr(MSR_P4_IQ_COUNTER0, -(cpu_khz/nmi_hz*1000), -1);
+       apic_write(APIC_LVTPC, APIC_DM_NMI);
+       wrmsr(MSR_P4_IQ_CCCR0, nmi_p4_cccr_val, 0);
+       return 1;
+}
+
 void setup_apic_nmi_watchdog(void)
 {
        switch (boot_cpu_data.x86_vendor) {
@@ -341,6 +425,13 @@ void setup_apic_nmi_watchdog(void)
                        return;
                setup_k7_watchdog();
                break;
+       case X86_VENDOR_INTEL:
+               if (boot_cpu_data.x86 != 15)
+                       return;
+               if (!setup_p4_watchdog())
+                       return;
+               break;
+
        default:
                return;
        }
@@ -355,56 +446,67 @@ void setup_apic_nmi_watchdog(void)
  *
  * as these watchdog NMI IRQs are generated on every CPU, we only
  * have to check the current processor.
- *
- * since NMIs don't listen to _any_ locks, we have to be extremely
- * careful not to rely on unsafe variables. The printk might lock
- * up though, so we have to break up any console locks first ...
- * [when there will be more tty-related locks, break them up
- *  here too!]
  */
 
-static unsigned int
-       last_irq_sums [NR_CPUS],
-       alert_counter [NR_CPUS];
+static DEFINE_PER_CPU(unsigned, last_irq_sum);
+static DEFINE_PER_CPU(local_t, alert_counter);
+static DEFINE_PER_CPU(int, nmi_touch);
 
 void touch_nmi_watchdog (void)
 {
        int i;
 
        /*
-        * Just reset the alert counters, (other CPUs might be
-        * spinning on locks we hold):
+        * Tell other CPUs to reset their alert counters. We cannot
+        * do it ourselves because the alert count increase is not
+        * atomic.
         */
        for (i = 0; i < NR_CPUS; i++)
-               alert_counter[i] = 0;
+               per_cpu(nmi_touch, i) = 1;
 }
 
 void nmi_watchdog_tick (struct pt_regs * regs, unsigned reason)
 {
-       int sum, cpu;
+       int sum;
+       int touched = 0;
 
-       cpu = safe_smp_processor_id();
        sum = read_pda(apic_timer_irqs);
-       if (last_irq_sums[cpu] == sum) {
+       if (__get_cpu_var(nmi_touch)) {
+               __get_cpu_var(nmi_touch) = 0;
+               touched = 1;
+       }
+       if (!touched && __get_cpu_var(last_irq_sum) == sum) {
                /*
                 * Ayiee, looks like this CPU is stuck ...
                 * wait a few IRQs (5 seconds) before doing the oops ...
                 */
-               alert_counter[cpu]++;
-               if (alert_counter[cpu] == 5*nmi_hz) {
+               local_inc(&__get_cpu_var(alert_counter));
+               if (local_read(&__get_cpu_var(alert_counter)) == 5*nmi_hz) {
                        if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT)
                                                        == NOTIFY_STOP) {
-                               alert_counter[cpu] = 0; 
+                               local_set(&__get_cpu_var(alert_counter), 0);
                                return;
                        } 
                        die_nmi("NMI Watchdog detected LOCKUP on CPU%d", regs);
                }
        } else {
-               last_irq_sums[cpu] = sum;
-               alert_counter[cpu] = 0;
+               __get_cpu_var(last_irq_sum) = sum;
+               local_set(&__get_cpu_var(alert_counter), 0);
        }
-       if (nmi_perfctr_msr)
+       if (nmi_perfctr_msr) {
+               if (nmi_perfctr_msr == MSR_P4_IQ_COUNTER0) {
+                       /*
+                        * P4 quirks:
+                        * - An overflown perfctr will assert its interrupt
+                        *   until the OVF flag in its CCCR is cleared.
+                        * - LVTPC is masked on interrupt and must be
+                        *   unmasked by the LVTPC handler.
+                        */
+                       wrmsr(MSR_P4_IQ_CCCR0, nmi_p4_cccr_val, 0);
+                       apic_write(APIC_LVTPC, APIC_DM_NMI);
+               }
                wrmsr(nmi_perfctr_msr, -(cpu_khz/nmi_hz*1000), -1);
+       }
 }
 
 static int dummy_nmi_callback(struct pt_regs * regs, int cpu)
diff --git a/arch/x86_64/kernel/pmtimer.c b/arch/x86_64/kernel/pmtimer.c
new file mode 100644 (file)
index 0000000..feb5f10
--- /dev/null
@@ -0,0 +1,101 @@
+/* Ported over from i386 by AK, original copyright was:
+ *
+ * (C) Dominik Brodowski <linux@brodo.de> 2003
+ *
+ * Driver to use the Power Management Timer (PMTMR) available in some
+ * southbridges as primary timing source for the Linux kernel.
+ *
+ * Based on parts of linux/drivers/acpi/hardware/hwtimer.c, timer_pit.c,
+ * timer_hpet.c, and on Arjan van de Ven's implementation for 2.4.
+ *
+ * This file is licensed under the GPL v2.
+ *
+ * Dropped all the hardware bug workarounds for now. Hopefully they
+ * are not needed on 64bit chipsets.
+ */
+
+#include <linux/jiffies.h>
+#include <linux/kernel.h>
+#include <linux/time.h>
+#include <linux/init.h>
+#include <linux/cpumask.h>
+#include <asm/io.h>
+#include <asm/proto.h>
+#include <asm/msr.h>
+#include <asm/vsyscall.h>
+
+/* The I/O port the PMTMR resides at.
+ * The location is detected during setup_arch(),
+ * in arch/i386/kernel/acpi/boot.c */
+u32 pmtmr_ioport;
+
+/* value of the Power timer at last timer interrupt */
+static u32 offset_delay;
+static u32 last_pmtmr_tick;
+
+#define ACPI_PM_MASK 0xFFFFFF /* limit it to 24 bits */
+
+static inline u32 cyc2us(u32 cycles)
+{
+       /* The Power Management Timer ticks at 3.579545 ticks per microsecond.
+        * 1 / PM_TIMER_FREQUENCY == 0.27936511 =~ 286/1024 [error: 0.024%]
+        *
+        * Even with HZ = 100, delta is at maximum 35796 ticks, so it can
+        * easily be multiplied with 286 (=0x11E) without having to fear
+        * u32 overflows.
+        */
+       cycles *= 286;
+       return (cycles >> 10);
+}
+
+int pmtimer_mark_offset(void)
+{
+       static int first_run = 1;
+       unsigned long tsc;
+       u32 lost;
+
+       u32 tick = inl(pmtmr_ioport);
+       u32 delta;
+
+       delta = cyc2us((tick - last_pmtmr_tick) & ACPI_PM_MASK);
+
+       last_pmtmr_tick = tick;
+       monotonic_base += delta * NSEC_PER_USEC;
+
+       delta += offset_delay;
+
+       lost = delta / (USEC_PER_SEC / HZ);
+       offset_delay = delta % (USEC_PER_SEC / HZ);
+
+       rdtscll(tsc);
+       vxtime.last_tsc = tsc - offset_delay * cpu_khz;
+
+       /* don't calculate delay for first run,
+          or if we've got less then a tick */
+       if (first_run || (lost < 1)) {
+               first_run = 0;
+               offset_delay = 0;
+       }
+
+       return lost - 1;
+}
+
+unsigned int do_gettimeoffset_pm(void)
+{
+       u32 now, offset, delta = 0;
+
+       offset = last_pmtmr_tick;
+       now = inl(pmtmr_ioport);
+       delta = (now - offset) & ACPI_PM_MASK;
+
+       return offset_delay + cyc2us(delta);
+}
+
+
+static int __init nopmtimer_setup(char *s)
+{
+       pmtmr_ioport = 0;
+       return 0;
+}
+
+__setup("nopmtimer", nopmtimer_setup);
index 761b6d35e338d05e44d2e325808af9b20d81d25e..dce8bab4306cdc3c73abd6ef91529040487360fb 100644 (file)
@@ -656,7 +656,7 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
 
        switch (code) { 
        case ARCH_SET_GS:
-               if (addr >= TASK_SIZE
+               if (addr >= TASK_SIZE_OF(task))
                        return -EPERM; 
                cpu = get_cpu();
                /* handle small bases via the GDT because that's faster to 
@@ -682,7 +682,7 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
        case ARCH_SET_FS:
                /* Not strictly needed for fs, but do it for symmetry
                   with gs */
-               if (addr >= TASK_SIZE)
+               if (addr >= TASK_SIZE_OF(task))
                        return -EPERM; 
                cpu = get_cpu();
                /* handle small bases via the GDT because that's faster to 
index e26e86bb56fe53381e2016e4f478dbdc37ec0294..bbf64b59a21e217b64085f7ce378d7fa332a4bab 100644 (file)
@@ -257,13 +257,13 @@ static int putreg(struct task_struct *child,
                        value &= 0xffff;
                        return 0;
                case offsetof(struct user_regs_struct,fs_base):
-                       if (!((value >> 48) == 0 || (value >> 48) == 0xffff))
-                               return -EIO; 
+                       if (value >= TASK_SIZE_OF(child))
+                               return -EIO;
                        child->thread.fs = value;
                        return 0;
                case offsetof(struct user_regs_struct,gs_base):
-                       if (!((value >> 48) == 0 || (value >> 48) == 0xffff))
-                               return -EIO; 
+                       if (value >= TASK_SIZE_OF(child))
+                               return -EIO;
                        child->thread.gs = value;
                        return 0;
                case offsetof(struct user_regs_struct, eflags):
@@ -277,6 +277,11 @@ static int putreg(struct task_struct *child,
                                return -EIO;
                        value &= 0xffff;
                        break;
+               case offsetof(struct user_regs_struct, rip):
+                       /* Check if the new RIP address is canonical */
+                       if (value >= TASK_SIZE_OF(child))
+                               return -EIO;
+                       break;
        }
        put_stack_long(child, regno - sizeof(struct pt_regs), value);
        return 0;
@@ -375,7 +380,7 @@ asmlinkage long sys_ptrace(long request, long pid, unsigned long addr, long data
                        break;
 
                switch (addr) { 
-               case 0 ... sizeof(struct user_regs_struct):
+               case 0 ... sizeof(struct user_regs_struct) - sizeof(long):
                        tmp = getreg(child, addr);
                        break;
                case offsetof(struct user, u_debugreg[0]):
@@ -414,33 +419,35 @@ asmlinkage long sys_ptrace(long request, long pid, unsigned long addr, long data
                break;
 
        case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
+       {
+               int dsize = test_tsk_thread_flag(child, TIF_IA32) ? 3 : 7;
                ret = -EIO;
                if ((addr & 7) ||
                    addr > sizeof(struct user) - 7)
                        break;
 
                switch (addr) { 
-               case 0 ... sizeof(struct user_regs_struct)
+               case 0 ... sizeof(struct user_regs_struct) - sizeof(long):
                        ret = putreg(child, addr, data);
                        break;
                /* Disallows to set a breakpoint into the vsyscall */
                case offsetof(struct user, u_debugreg[0]):
-                       if (data >= TASK_SIZE-7) break;
+                       if (data >= TASK_SIZE_OF(child) - dsize) break;
                        child->thread.debugreg0 = data;
                        ret = 0;
                        break;
                case offsetof(struct user, u_debugreg[1]):
-                       if (data >= TASK_SIZE-7) break;
+                       if (data >= TASK_SIZE_OF(child) - dsize) break;
                        child->thread.debugreg1 = data;
                        ret = 0;
                        break;
                case offsetof(struct user, u_debugreg[2]):
-                       if (data >= TASK_SIZE-7) break;
+                       if (data >= TASK_SIZE_OF(child) - dsize) break;
                        child->thread.debugreg2 = data;
                        ret = 0;
                        break;
                case offsetof(struct user, u_debugreg[3]):
-                       if (data >= TASK_SIZE-7) break;
+                       if (data >= TASK_SIZE_OF(child) - dsize) break;
                        child->thread.debugreg3 = data;
                        ret = 0;
                        break;
@@ -464,6 +471,7 @@ asmlinkage long sys_ptrace(long request, long pid, unsigned long addr, long data
                  break;
                }
                break;
+       }
        case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
        case PTRACE_CONT:    /* restart after signal. */
 
index 2129cf9ba6b2fc066194474c058f821eefe22f4c..99f038ede23c323d98eca770b17344f4bc97838d 100644 (file)
@@ -719,7 +719,6 @@ static void __init display_cacheinfo(struct cpuinfo_x86 *c)
        }
 }
 
-#ifdef CONFIG_SMP
 /*
  * On a AMD dual core setup the lower bits of the APIC id distingush the cores.
  * Assumes number of cores is a power of two.
@@ -727,17 +726,26 @@ static void __init display_cacheinfo(struct cpuinfo_x86 *c)
 static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
 {
 #ifdef CONFIG_SMP
-       int cpu = c->x86_apicid;
+       int cpu = smp_processor_id();
        int node = 0;
+       unsigned bits;
        if (c->x86_num_cores == 1)
                return;
-       cpu_core_id[cpu] = cpu >> hweight32(c->x86_num_cores - 1);
+
+       bits = 0;
+       while ((1 << bits) < c->x86_num_cores)
+               bits++;
+
+       /* Low order bits define the core id (index of core in socket) */
+       cpu_core_id[cpu] = phys_proc_id[cpu] & ((1 << bits)-1);
+       /* Convert the APIC ID into the socket ID */
+       phys_proc_id[cpu] >>= bits;
 
 #ifdef CONFIG_NUMA
        /* When an ACPI SRAT table is available use the mappings from SRAT
           instead. */
        if (acpi_numa <= 0) {
-               node = cpu_core_id[cpu];
+               node = phys_proc_id[cpu];
                if (!node_online(node))
                        node = first_node(node_online_map);
                cpu_to_node[cpu] = node;
@@ -745,15 +753,11 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
                node = cpu_to_node[cpu];
        }
 #endif
+
        printk(KERN_INFO "CPU %d(%d) -> Node %d -> Core %d\n",
                        cpu, c->x86_num_cores, node, cpu_core_id[cpu]);
 #endif
 }
-#else
-static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
-{
-}
-#endif
 
 static int __init init_amd(struct cpuinfo_x86 *c)
 {
@@ -925,7 +929,6 @@ void __init early_identify_cpu(struct cpuinfo_x86 *c)
        c->x86_clflush_size = 64;
        c->x86_cache_alignment = c->x86_clflush_size;
        c->x86_num_cores = 1;
-       c->x86_apicid = c == &boot_cpu_data ? 0 : c - cpu_data;
        c->extended_cpuid_level = 0;
        memset(&c->x86_capability, 0, sizeof c->x86_capability);
 
@@ -954,11 +957,14 @@ void __init early_identify_cpu(struct cpuinfo_x86 *c)
                } 
                if (c->x86_capability[0] & (1<<19)) 
                        c->x86_clflush_size = ((misc >> 8) & 0xff) * 8;
-               c->x86_apicid = misc >> 24;
        } else {
                /* Have CPUID level 0 only - unheard of */
                c->x86 = 4;
        }
+
+#ifdef CONFIG_SMP
+       phys_proc_id[smp_processor_id()] = (cpuid_ebx(1) >> 24) & 0xff;
+#endif
 }
 
 /*
@@ -1088,7 +1094,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
                /* Other (Linux-defined) */
-               "cxmmx", NULL, "cyrix_arr", "centaur_mcr", "k8c+",
+               "cxmmx", NULL, "cyrix_arr", "centaur_mcr", NULL,
                "constant_tsc", NULL, NULL,
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
index d439ced150c603c33cbc2220bec5532654822b86..429c0269dc4e300abcf8efcb3c7a806c7ffb86a6 100644 (file)
@@ -28,6 +28,7 @@
 #include <asm/uaccess.h>
 #include <asm/i387.h>
 #include <asm/proto.h>
+#include <asm/ia32_unistd.h>
 
 /* #define DEBUG_SIG 1 */
 
@@ -452,7 +453,9 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
                        regs->rip -= 2;
                }
                if (regs->rax == (unsigned long)-ERESTART_RESTARTBLOCK) {
-                       regs->rax = __NR_restart_syscall;
+                       regs->rax = test_thread_flag(TIF_IA32) ?
+                                       __NR_ia32_restart_syscall :
+                                       __NR_restart_syscall;
                        regs->rip -= 2;
                }
        }
index 73f7e8b9543aa55051e6a912e231db6ad6c8aa3b..f1ec0f34594124f73feb76dcf0f270dc420dfca5 100644 (file)
@@ -56,6 +56,7 @@
 #include <asm/kdebug.h>
 #include <asm/tlbflush.h>
 #include <asm/proto.h>
+#include <asm/nmi.h>
 
 /* Change for real CPU hotplug. Note other files need to be fixed
    first too. */
@@ -93,6 +94,7 @@ int smp_threads_ready;
 
 cpumask_t cpu_sibling_map[NR_CPUS] __cacheline_aligned;
 cpumask_t cpu_core_map[NR_CPUS] __cacheline_aligned;
+EXPORT_SYMBOL(cpu_core_map);
 
 /*
  * Trampoline 80x86 program as an array.
@@ -125,96 +127,210 @@ static void __cpuinit smp_store_cpu_info(int id)
 
        *c = boot_cpu_data;
        identify_cpu(c);
+       print_cpu_info(c);
 }
 
 /*
- * Synchronize TSCs of CPUs
+ * New Funky TSC sync algorithm borrowed from IA64.
+ * Main advantage is that it doesn't reset the TSCs fully and
+ * in general looks more robust and it works better than my earlier
+ * attempts. I believe it was written by David Mosberger. Some minor
+ * adjustments for x86-64 by me -AK
  *
- * This new algorithm is less accurate than the old "zero TSCs"
- * one, but we cannot zero TSCs anymore in the new hotplug CPU
- * model.
+ * Original comment reproduced below.
+ *
+ * Synchronize TSC of the current (slave) CPU with the TSC of the
+ * MASTER CPU (normally the time-keeper CPU).  We use a closed loop to
+ * eliminate the possibility of unaccounted-for errors (such as
+ * getting a machine check in the middle of a calibration step).  The
+ * basic idea is for the slave to ask the master what itc value it has
+ * and to read its own itc before and after the master responds.  Each
+ * iteration gives us three timestamps:
+ *
+ *     slave           master
+ *
+ *     t0 ---\
+ *             ---\
+ *                --->
+ *                     tm
+ *                /---
+ *            /---
+ *     t1 <---
+ *
+ *
+ * The goal is to adjust the slave's TSC such that tm falls exactly
+ * half-way between t0 and t1.  If we achieve this, the clocks are
+ * synchronized provided the interconnect between the slave and the
+ * master is symmetric.  Even if the interconnect were asymmetric, we
+ * would still know that the synchronization error is smaller than the
+ * roundtrip latency (t0 - t1).
+ *
+ * When the interconnect is quiet and symmetric, this lets us
+ * synchronize the TSC to within one or two cycles.  However, we can
+ * only *guarantee* that the synchronization is accurate to within a
+ * round-trip time, which is typically in the range of several hundred
+ * cycles (e.g., ~500 cycles).  In practice, this means that the TSCs
+ * are usually almost perfectly synchronized, but we shouldn't assume
+ * that the accuracy is much better than half a micro second or so.
+ *
+ * [there are other errors like the latency of RDTSC and of the
+ * WRMSR. These can also account to hundreds of cycles. So it's
+ * probably worse. It claims 153 cycles error on a dual Opteron,
+ * but I suspect the numbers are actually somewhat worse -AK]
  */
 
-static atomic_t __cpuinitdata tsc_flag;
+#define MASTER 0
+#define SLAVE  (SMP_CACHE_BYTES/8)
+
+/* Intentionally don't use cpu_relax() while TSC synchronization
+   because we don't want to go into funky power save modi or cause
+   hypervisors to schedule us away.  Going to sleep would likely affect
+   latency and low latency is the primary objective here. -AK */
+#define no_cpu_relax() barrier()
+
 static __cpuinitdata DEFINE_SPINLOCK(tsc_sync_lock);
-static unsigned long long __cpuinitdata bp_tsc, ap_tsc;
+static volatile __cpuinitdata unsigned long go[SLAVE + 1];
+static int notscsync __cpuinitdata;
+
+#undef DEBUG_TSC_SYNC
 
-#define NR_LOOPS 5
+#define NUM_ROUNDS     64      /* magic value */
+#define NUM_ITERS      5       /* likewise */
 
-static void __cpuinit sync_tsc_bp_init(int init)
+/* Callback on boot CPU */
+static __cpuinit void sync_master(void *arg)
 {
-       if (init)
-               _raw_spin_lock(&tsc_sync_lock);
-       else
-               _raw_spin_unlock(&tsc_sync_lock);
-       atomic_set(&tsc_flag, 0);
+       unsigned long flags, i;
+
+       if (smp_processor_id() != boot_cpu_id)
+               return;
+
+       go[MASTER] = 0;
+
+       local_irq_save(flags);
+       {
+               for (i = 0; i < NUM_ROUNDS*NUM_ITERS; ++i) {
+                       while (!go[MASTER])
+                               no_cpu_relax();
+                       go[MASTER] = 0;
+                       rdtscll(go[SLAVE]);
+               }
+       }
+       local_irq_restore(flags);
 }
 
 /*
- * Synchronize TSC on AP with BP.
+ * Return the number of cycles by which our tsc differs from the tsc
+ * on the master (time-keeper) CPU.  A positive number indicates our
+ * tsc is ahead of the master, negative that it is behind.
  */
-static void __cpuinit __sync_tsc_ap(void)
+static inline long
+get_delta(long *rt, long *master)
 {
-       if (!cpu_has_tsc)
-               return;
-       Dprintk("AP %d syncing TSC\n", smp_processor_id());
+       unsigned long best_t0 = 0, best_t1 = ~0UL, best_tm = 0;
+       unsigned long tcenter, t0, t1, tm;
+       int i;
 
-       while (atomic_read(&tsc_flag) != 0)
-               cpu_relax();
-       atomic_inc(&tsc_flag);
-       mb();
-       _raw_spin_lock(&tsc_sync_lock);
-       wrmsrl(MSR_IA32_TSC, bp_tsc);
-       _raw_spin_unlock(&tsc_sync_lock);
-       rdtscll(ap_tsc);
-       mb();
-       atomic_inc(&tsc_flag);
-       mb();
+       for (i = 0; i < NUM_ITERS; ++i) {
+               rdtscll(t0);
+               go[MASTER] = 1;
+               while (!(tm = go[SLAVE]))
+                       no_cpu_relax();
+               go[SLAVE] = 0;
+               rdtscll(t1);
+
+               if (t1 - t0 < best_t1 - best_t0)
+                       best_t0 = t0, best_t1 = t1, best_tm = tm;
+       }
+
+       *rt = best_t1 - best_t0;
+       *master = best_tm - best_t0;
+
+       /* average best_t0 and best_t1 without overflow: */
+       tcenter = (best_t0/2 + best_t1/2);
+       if (best_t0 % 2 + best_t1 % 2 == 2)
+               ++tcenter;
+       return tcenter - best_tm;
 }
 
-static void __cpuinit sync_tsc_ap(void)
+static __cpuinit void sync_tsc(void)
 {
-       int i;
-       for (i = 0; i < NR_LOOPS; i++)
-               __sync_tsc_ap();
+       int i, done = 0;
+       long delta, adj, adjust_latency = 0;
+       unsigned long flags, rt, master_time_stamp, bound;
+#if DEBUG_TSC_SYNC
+       static struct syncdebug {
+               long rt;        /* roundtrip time */
+               long master;    /* master's timestamp */
+               long diff;      /* difference between midpoint and master's timestamp */
+               long lat;       /* estimate of tsc adjustment latency */
+       } t[NUM_ROUNDS] __cpuinitdata;
+#endif
+
+       go[MASTER] = 1;
+
+       smp_call_function(sync_master, NULL, 1, 0);
+
+       while (go[MASTER])      /* wait for master to be ready */
+               no_cpu_relax();
+
+       spin_lock_irqsave(&tsc_sync_lock, flags);
+       {
+               for (i = 0; i < NUM_ROUNDS; ++i) {
+                       delta = get_delta(&rt, &master_time_stamp);
+                       if (delta == 0) {
+                               done = 1;       /* let's lock on to this... */
+                               bound = rt;
+                       }
+
+                       if (!done) {
+                               unsigned long t;
+                               if (i > 0) {
+                                       adjust_latency += -delta;
+                                       adj = -delta + adjust_latency/4;
+                               } else
+                                       adj = -delta;
+
+                               rdtscll(t);
+                               wrmsrl(MSR_IA32_TSC, t + adj);
+                       }
+#if DEBUG_TSC_SYNC
+                       t[i].rt = rt;
+                       t[i].master = master_time_stamp;
+                       t[i].diff = delta;
+                       t[i].lat = adjust_latency/4;
+#endif
+               }
+       }
+       spin_unlock_irqrestore(&tsc_sync_lock, flags);
+
+#if DEBUG_TSC_SYNC
+       for (i = 0; i < NUM_ROUNDS; ++i)
+               printk("rt=%5ld master=%5ld diff=%5ld adjlat=%5ld\n",
+                      t[i].rt, t[i].master, t[i].diff, t[i].lat);
+#endif
+
+       printk(KERN_INFO
+              "CPU %d: synchronized TSC with CPU %u (last diff %ld cycles, "
+              "maxerr %lu cycles)\n",
+              smp_processor_id(), boot_cpu_id, delta, rt);
 }
 
-/*
- * Synchronize TSC from BP to AP.
- */
-static void __cpuinit __sync_tsc_bp(int cpu)
+static void __cpuinit tsc_sync_wait(void)
 {
-       if (!cpu_has_tsc)
+       if (notscsync || !cpu_has_tsc)
                return;
-
-       /* Wait for AP */
-       while (atomic_read(&tsc_flag) == 0)
-               cpu_relax();
-       /* Save BPs TSC */
-       sync_core();
-       rdtscll(bp_tsc);
-       /* Don't do the sync core here to avoid too much latency. */
-       mb();
-       /* Start the AP */
-       _raw_spin_unlock(&tsc_sync_lock);
-       /* Wait for AP again */
-       while (atomic_read(&tsc_flag) < 2)
-               cpu_relax();
-       rdtscl(bp_tsc);
-       barrier();
+       printk(KERN_INFO "CPU %d: Syncing TSC to CPU %u.\n", smp_processor_id(),
+                       boot_cpu_id);
+       sync_tsc();
 }
 
-static void __cpuinit sync_tsc_bp(int cpu)
+static __init int notscsync_setup(char *s)
 {
-       int i;
-       for (i = 0; i < NR_LOOPS - 1; i++) {
-               __sync_tsc_bp(cpu);
-               sync_tsc_bp_init(1);
-       }
-       __sync_tsc_bp(cpu);
-       printk(KERN_INFO "Synced TSC of CPU %d difference %Ld\n",
-              cpu, ap_tsc - bp_tsc);
+       notscsync = 1;
+       return 0;
 }
+__setup("notscsync", notscsync_setup);
 
 static atomic_t init_deasserted __cpuinitdata;
 
@@ -315,11 +431,6 @@ void __cpuinit start_secondary(void)
        cpu_init();
        smp_callin();
 
-       /*
-        * Synchronize the TSC with the BP
-        */
-       sync_tsc_ap();
-
        /* otherwise gcc will move up the smp_processor_id before the cpu_init */
        barrier();
 
@@ -334,7 +445,6 @@ void __cpuinit start_secondary(void)
                enable_8259A_irq(0);
        }
 
-
        enable_APIC_timer();
 
        /*
@@ -343,6 +453,11 @@ void __cpuinit start_secondary(void)
        cpu_set(smp_processor_id(), cpu_online_map);
        mb();
 
+       /* Wait for TSC sync to not schedule things before.
+          We still process interrupts, which could see an inconsistent
+          time in that window unfortunately. */
+       tsc_sync_wait();
+
        cpu_idle();
 }
 
@@ -531,7 +646,6 @@ static int __cpuinit do_boot_cpu(int cpu, int apicid)
                printk("failed fork for CPU %d\n", cpu);
                return PTR_ERR(idle);
        }
-       x86_cpu_to_apicid[cpu] = apicid;
 
        cpu_pda[cpu].pcurrent = idle;
 
@@ -600,8 +714,6 @@ static int __cpuinit do_boot_cpu(int cpu, int apicid)
 
                if (cpu_isset(cpu, cpu_callin_map)) {
                        /* number CPUs logically, starting from 1 (BSP is 0) */
-                       Dprintk("OK.\n");
-                       print_cpu_info(&cpu_data[cpu]);
                        Dprintk("CPU has booted.\n");
                } else {
                        boot_error = 1;
@@ -842,7 +954,6 @@ void __cpuinit smp_prepare_cpus(unsigned int max_cpus)
                      GET_APIC_ID(apic_read(APIC_ID)), boot_cpu_id);
                /* Or can we switch back to PIC here? */
        }
-       x86_cpu_to_apicid[0] = boot_cpu_id;
 
        /*
         * Now start the IO-APICs
@@ -889,18 +1000,14 @@ int __cpuinit __cpu_up(unsigned int cpu)
                printk("__cpu_up: bad cpu %d\n", cpu);
                return -EINVAL;
        }
-       sync_tsc_bp_init(1);
 
        /* Boot it! */
        err = do_boot_cpu(cpu, apicid);
        if (err < 0) {
-               sync_tsc_bp_init(0);
                Dprintk("do_boot_cpu failed %d\n", err);
                return err;
        }
 
-       sync_tsc_bp(cpu);
-
        /* Unleash the CPU! */
        Dprintk("waiting for cpu %d\n", cpu);
 
@@ -923,4 +1030,6 @@ void __cpuinit smp_cpus_done(unsigned int max_cpus)
 
        detect_siblings();
        time_init_gtod();
+
+       check_nmi_watchdog();
 }
index dbebd5ccba6b067531c0f7425d2bd17ef08c2bfd..cc7821c68851d5334b01359f8dd892a5266fdf0b 100644 (file)
@@ -68,13 +68,7 @@ out:
 static void find_start_end(unsigned long flags, unsigned long *begin,
                           unsigned long *end)
 {
-#ifdef CONFIG_IA32_EMULATION
-       if (test_thread_flag(TIF_IA32)) { 
-               *begin = TASK_UNMAPPED_32;
-               *end = IA32_PAGE_OFFSET; 
-       } else 
-#endif
-       if (flags & MAP_32BIT) { 
+       if (!test_thread_flag(TIF_IA32) && (flags & MAP_32BIT)) {
                /* This is usually used needed to map code in small
                   model, so it needs to be in the first 31bit. Limit
                   it to that.  This means we need to move the
@@ -84,10 +78,10 @@ static void find_start_end(unsigned long flags, unsigned long *begin,
                   of playground for now. -AK */ 
                *begin = 0x40000000; 
                *end = 0x80000000;              
-       } else { 
-               *begin = TASK_UNMAPPED_64; 
+       } else {
+               *begin = TASK_UNMAPPED_BASE;
                *end = TASK_SIZE; 
-               }
+       }
 } 
 
 unsigned long
@@ -111,6 +105,11 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
                    (!vma || addr + len <= vma->vm_start))
                        return addr;
        }
+       if (((flags & MAP_32BIT) || test_thread_flag(TIF_IA32))
+           && len <= mm->cached_hole_size) {
+               mm->cached_hole_size = 0;
+               mm->free_area_cache = begin;
+       }
        addr = mm->free_area_cache;
        if (addr < begin) 
                addr = begin; 
@@ -126,6 +125,7 @@ full_search:
                         */
                        if (start_addr != begin) {
                                start_addr = addr = begin;
+                               mm->cached_hole_size = 0;
                                goto full_search;
                        }
                        return -ENOMEM;
@@ -137,6 +137,9 @@ full_search:
                        mm->free_area_cache = addr + len;
                        return addr;
                }
+               if (addr + mm->cached_hole_size < vma->vm_start)
+                       mm->cached_hole_size = vma->vm_start - addr;
+
                addr = vma->vm_end;
        }
 }
index 0e3b60e1ac5b54f60d4a2a7cff4492c8ddef9774..fb8c809b4cd94fb817b7d04b6db140423e80cf30 100644 (file)
 #include <linux/sysdev.h>
 #include <linux/bcd.h>
 #include <linux/kallsyms.h>
+#include <linux/acpi.h>
+#ifdef CONFIG_ACPI
+#include <acpi/achware.h>      /* for PM timer frequency */
+#endif
 #include <asm/8253pit.h>
 #include <asm/pgtable.h>
 #include <asm/vsyscall.h>
@@ -396,6 +400,10 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                        (offset - vxtime.last)*(NSEC_PER_SEC/HZ) / hpet_tick;
 
                vxtime.last = offset;
+#ifdef CONFIG_X86_PM_TIMER
+       } else if (vxtime.mode == VXTIME_PMTMR) {
+               lost = pmtimer_mark_offset();
+#endif
        } else {
                offset = (((tsc - vxtime.last_tsc) *
                           vxtime.tsc_quot) >> 32) - (USEC_PER_SEC / HZ);
@@ -898,6 +906,13 @@ void __init time_init(void)
                        hpet_period;
                cpu_khz = hpet_calibrate_tsc();
                timename = "HPET";
+#ifdef CONFIG_X86_PM_TIMER
+       } else if (pmtmr_ioport) {
+               vxtime_hz = PM_TIMER_FREQUENCY;
+               timename = "PM";
+               pit_init();
+               cpu_khz = pit_calibrate_tsc();
+#endif
        } else {
                pit_init();
                cpu_khz = pit_calibrate_tsc();
@@ -922,6 +937,27 @@ void __init time_init(void)
 #endif
 }
 
+/*
+ * Make an educated guess if the TSC is trustworthy and synchronized
+ * over all CPUs.
+ */
+static __init int unsynchronized_tsc(void)
+{
+#ifdef CONFIG_SMP
+       if (oem_force_hpet_timer())
+               return 1;
+       /* Intel systems are normally all synchronized. Exceptions
+          are handled in the OEM check above. */
+       if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
+               return 0;
+       /* All in a single socket - should be synchronized */
+       if (cpus_weight(cpu_core_map[0]) == num_online_cpus())
+               return 0;
+#endif
+       /* Assume multi socket systems are not synchronized */
+       return num_online_cpus() > 1;
+}
+
 /*
  * Decide after all CPUs are booted what mode gettimeofday should use.
  */
@@ -929,29 +965,23 @@ void __init time_init_gtod(void)
 {
        char *timetype;
 
-       /*
-        * AMD systems with more than one CPU don't have fully synchronized
-        * TSCs. Always use HPET gettimeofday for these, although it is slower.
-        * Intel SMP systems usually have synchronized TSCs, so use always
-        * the TSC.
-        *
-        * Exceptions:
-        * IBM Summit2 checked by oem_force_hpet_timer().
-        * AMD dual core may also not need HPET. Check me.
-        *
-        * Can be turned off with "notsc".
-        */
-       if (num_online_cpus() > 1 &&
-           boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
-               notsc = 1;
-       /* Some systems will want to disable TSC and use HPET. */
-       if (oem_force_hpet_timer())
+       if (unsynchronized_tsc())
                notsc = 1;
        if (vxtime.hpet_address && notsc) {
                timetype = "HPET";
                vxtime.last = hpet_readl(HPET_T0_CMP) - hpet_tick;
                vxtime.mode = VXTIME_HPET;
                do_gettimeoffset = do_gettimeoffset_hpet;
+#ifdef CONFIG_X86_PM_TIMER
+       /* Using PM for gettimeofday is quite slow, but we have no other
+          choice because the TSC is too unreliable on some systems. */
+       } else if (pmtmr_ioport && !vxtime.hpet_address && notsc) {
+               timetype = "PM";
+               do_gettimeoffset = do_gettimeoffset_pm;
+               vxtime.mode = VXTIME_PMTMR;
+               sysctl_vsyscall = 0;
+               printk(KERN_INFO "Disabling vsyscall due to use of PM timer\n");
+#endif
        } else {
                timetype = vxtime.hpet_address ? "HPET/TSC" : "PIT/TSC";
                vxtime.mode = VXTIME_TSC;
index 65a37f52c56ef2c0760f2e3db9dfec9312a74d88..3dfec8fdabcdd35799cf014d08fc89d6bf1a7701 100644 (file)
@@ -332,10 +332,12 @@ void handle_BUG(struct pt_regs *regs)
        printk(KERN_ALERT "Kernel BUG at %.50s:%d\n", f.filename, f.line);
 } 
 
+#ifdef CONFIG_BUG
 void out_of_line_bug(void)
 { 
        BUG(); 
 } 
+#endif
 
 static DEFINE_SPINLOCK(die_lock);
 static int die_owner = -1;
index b4b8dc59663ad447f6228fff15209067928b642e..2e5734425949648ea92bd8d7fd9e65e6f99a8ed5 100644 (file)
@@ -65,7 +65,7 @@ static force_inline void do_vgettimeofday(struct timeval * tv)
                usec = (__xtime.tv_nsec / 1000) +
                        (__jiffies - __wall_jiffies) * (1000000 / HZ);
 
-               if (__vxtime.mode == VXTIME_TSC) {
+               if (__vxtime.mode != VXTIME_HPET) {
                        sync_core();
                        rdtscll(t);
                        if (t < __vxtime.last_tsc)
@@ -217,8 +217,9 @@ static int __init vsyscall_init(void)
        BUG_ON((unsigned long) &vtime != VSYSCALL_ADDR(__NR_vtime));
        BUG_ON((VSYSCALL_ADDR(0) != __fix_to_virt(VSYSCALL_FIRST_PAGE)));
        map_vsyscall();
-       sysctl_vsyscall = 1;
+#ifdef CONFIG_SYSCTL
        register_sysctl_table(kernel_root_table2, 0);
+#endif
        return 0;
 }
 
index a43dedb58fa2a7415bd281be832186ff3a34f900..68ec03070e5adbe82925dba26772a688cecd1b9b 100644 (file)
@@ -193,8 +193,9 @@ EXPORT_SYMBOL(smp_num_siblings);
 extern void do_softirq_thunk(void);
 EXPORT_SYMBOL(do_softirq_thunk);
 
-void out_of_line_bug(void);
+#ifdef CONFIG_BUG
 EXPORT_SYMBOL(out_of_line_bug);
+#endif
 
 EXPORT_SYMBOL(init_level4_pgt);
 
index 6e2d66472eb1938f50aa45c2e0306b124f7885b1..aed61a668a1bebbf5b4661cd5fad774e03cca895 100644 (file)
@@ -34,7 +34,7 @@ void __delay(unsigned long loops)
 
 inline void __const_udelay(unsigned long xloops)
 {
-       __delay(((xloops * cpu_data[_smp_processor_id()].loops_per_jiffy) >> 32) * HZ);
+       __delay(((xloops * cpu_data[raw_smp_processor_id()].loops_per_jiffy) >> 32) * HZ);
 }
 
 void __udelay(unsigned long usecs)
index e0330921676413d100b6a1f2cf2c6f579133e3d8..57d3ab15a5c737aeda66c83ed6756cae3c9924e5 100644 (file)
@@ -234,6 +234,8 @@ static noinline void pgtable_bad(unsigned long address, struct pt_regs *regs,
 
 /*
  * Handle a fault on the vmalloc or module mapping area
+ *
+ * This assumes no large pages in there.
  */
 static int vmalloc_fault(unsigned long address)
 {
@@ -272,7 +274,10 @@ static int vmalloc_fault(unsigned long address)
        if (!pte_present(*pte_ref))
                return -1;
        pte = pte_offset_kernel(pmd, address);
-       if (!pte_present(*pte) || pte_page(*pte) != pte_page(*pte_ref))
+       /* Don't use pte_page here, because the mappings can point
+          outside mem_map, and the NUMA hash lookup cannot handle
+          that. */
+       if (!pte_present(*pte) || pte_pfn(*pte) != pte_pfn(*pte_ref))
                BUG();
        __flush_tlb_all();
        return 0;
@@ -345,8 +350,10 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code)
         * (error_code & 4) == 0, and that the fault was not a
         * protection error (error_code & 1) == 0.
         */
-       if (unlikely(address >= TASK_SIZE)) {
-               if (!(error_code & 5)) {
+       if (unlikely(address >= TASK_SIZE64)) {
+               if (!(error_code & 5) &&
+                     ((address >= VMALLOC_START && address < VMALLOC_END) ||
+                      (address >= MODULES_VADDR && address < MODULES_END))) {
                        if (vmalloc_fault(address) < 0)
                                goto bad_area_nosemaphore;
                        return;
index 74ec8554b195de6c5a9b87ce5d39f08d9c5da544..58aac23760efeb3e37aa76ab888e3e900b7ac667 100644 (file)
@@ -133,7 +133,7 @@ ioremap_change_attr(unsigned long phys_addr, unsigned long size,
                                        unsigned long flags)
 {
        int err = 0;
-       if (flags && phys_addr + size - 1 < (end_pfn_map << PAGE_SHIFT)) {
+       if (phys_addr + size - 1 < (end_pfn_map << PAGE_SHIFT)) {
                unsigned long npages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
                unsigned long vaddr = (unsigned long) __va(phys_addr);
 
@@ -214,7 +214,7 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l
                remove_vm_area((void *)(PAGE_MASK & (unsigned long) addr));
                return NULL;
        }
-       if (ioremap_change_attr(phys_addr, size, flags) < 0) {
+       if (flags && ioremap_change_attr(phys_addr, size, flags) < 0) {
                area->flags &= 0xffffff;
                vunmap(addr);
                return NULL;
@@ -251,7 +251,7 @@ void __iomem *ioremap_nocache (unsigned long phys_addr, unsigned long size)
 
 void iounmap(volatile void __iomem *addr)
 {
-       struct vm_struct *p, **pprev;
+       struct vm_struct *p;
 
        if (addr <= high_memory) 
                return; 
@@ -260,24 +260,11 @@ void iounmap(volatile void __iomem *addr)
                return;
 
        write_lock(&vmlist_lock);
-       for (p = vmlist, pprev = &vmlist; p != NULL; pprev = &p->next, p = *pprev)
-               if (p->addr == (void *)(PAGE_MASK & (unsigned long)addr))
-                       break;
-       if (!p) { 
-               printk("__iounmap: bad address %p\n", addr);
-               goto out_unlock;
-       }
-       *pprev = p->next;
-       unmap_vm_area(p);
-       if ((p->flags >> 20) &&
-               p->phys_addr + p->size - 1 < virt_to_phys(high_memory)) {
-               /* p->size includes the guard page, but cpa doesn't like that */
-               change_page_attr(virt_to_page(__va(p->phys_addr)),
-                                p->size >> PAGE_SHIFT,
-                                PAGE_KERNEL);
-               global_flush_tlb();
-       } 
-out_unlock:
+       p = __remove_vm_area((void *)((unsigned long)addr & PAGE_MASK));
+       if (!p)
+               printk("iounmap: bad address %p\n", addr);
+       else if (p->flags >> 20)
+               ioremap_change_attr(p->phys_addr, p->size, 0);
        write_unlock(&vmlist_lock);
        kfree(p); 
 }
index f691d31fa9ee0cbe7a1817408ea845584bd2a8b9..3fcf6e887e87d7280a9765450b237e9933af035a 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/mm.h>
 #include <asm/scatterlist.h>
 #include <linux/crypto.h>
+#include <linux/string.h>
 
 #define NULL_KEY_SIZE          0
 #define NULL_BLOCK_SIZE                1
 
 static int null_compress(void *ctx, const u8 *src, unsigned int slen,
                          u8 *dst, unsigned int *dlen)
-{ return 0; }
-
-static int null_decompress(void *ctx, const u8 *src, unsigned int slen,
-                           u8 *dst, unsigned int *dlen)
-{ return 0; }
+{
+       if (slen > *dlen)
+               return -EINVAL;
+       memcpy(dst, src, slen);
+       *dlen = slen;
+       return 0;
+}
 
 static void null_init(void *ctx)
 { }
@@ -47,11 +50,10 @@ static int null_setkey(void *ctx, const u8 *key,
                        unsigned int keylen, u32 *flags)
 { return 0; }
 
-static void null_encrypt(void *ctx, u8 *dst, const u8 *src)
-{ }
-
-static void null_decrypt(void *ctx, u8 *dst, const u8 *src)
-{ }
+static void null_crypt(void *ctx, u8 *dst, const u8 *src)
+{
+       memcpy(dst, src, NULL_BLOCK_SIZE);
+}
 
 static struct crypto_alg compress_null = {
        .cra_name               =       "compress_null",
@@ -62,7 +64,7 @@ static struct crypto_alg compress_null = {
        .cra_list               =       LIST_HEAD_INIT(compress_null.cra_list),
        .cra_u                  =       { .compress = {
        .coa_compress           =       null_compress,
-       .coa_decompress         =       null_decompress } }
+       .coa_decompress         =       null_compress } }
 };
 
 static struct crypto_alg digest_null = {
@@ -90,8 +92,8 @@ static struct crypto_alg cipher_null = {
        .cia_min_keysize        =       NULL_KEY_SIZE,
        .cia_max_keysize        =       NULL_KEY_SIZE,
        .cia_setkey             =       null_setkey,
-       .cia_encrypt            =       null_encrypt,
-       .cia_decrypt            =       null_decrypt } }
+       .cia_encrypt            =       null_crypt,
+       .cia_decrypt            =       null_crypt } }
 };
 
 MODULE_ALIAS("compress_null");
index e68e43886d3cc23439f30210e88b517911bf395e..964b9a60ca24413f07b1fe8410f7ac3198642135 100644 (file)
@@ -38,7 +38,7 @@ static inline void crypto_kunmap(void *vaddr, int out)
 
 static inline void crypto_yield(struct crypto_tfm *tfm)
 {
-       if (!in_softirq())
+       if (!in_atomic())
                cond_resched();
 }
 
index ed41d9036bfc374c261d3d800bea543f191e3b70..aed4a9b97c1459adff1aafb111b4cee41a46b19b 100644 (file)
@@ -58,4 +58,6 @@ source "drivers/mmc/Kconfig"
 
 source "drivers/infiniband/Kconfig"
 
+source "drivers/sn/Kconfig"
+
 endmenu
index 15681de688f4802b7619d98dd17b285dc500a4cf..3167be54feddec9f788d63f7fe17e362b84fedd1 100644 (file)
@@ -61,6 +61,6 @@ obj-$(CONFIG_EISA)            += eisa/
 obj-$(CONFIG_CPU_FREQ)         += cpufreq/
 obj-$(CONFIG_MMC)              += mmc/
 obj-$(CONFIG_INFINIBAND)       += infiniband/
-obj-$(CONFIG_BLK_DEV_SGIIOC4)  += sn/
+obj-$(CONFIG_SGI_IOC4)         += sn/
 obj-y                          += firmware/
 obj-$(CONFIG_CRYPTO)           += crypto/
index 0400a52d50855744a0a23d331db4a1928263789f..670fdb5142d17d3da59717b844560c861bbad8a5 100644 (file)
@@ -40,13 +40,12 @@ config ACPI
          available at:
          <http://www.acpi.info>
 
+if ACPI
+
 config ACPI_BOOT
        bool
-       depends on ACPI || X86_HT
        default y
 
-if ACPI
-
 config ACPI_INTERPRETER
        bool
        depends on !IA64_SGI_SN
index 12b0eea634073399d5f219e460dbf88acde98b34..8093f2e003215156d376c9a8c086e8d9dfaf9d30 100644 (file)
@@ -391,7 +391,6 @@ acpi_pci_irq_enable (
        u8                      pin = 0;
        int                     edge_level = ACPI_LEVEL_SENSITIVE;
        int                     active_high_low = ACPI_ACTIVE_LOW;
-       extern int              via_interrupt_line_quirk;
        char                    *link = NULL;
 
        ACPI_FUNCTION_TRACE("acpi_pci_irq_enable");
@@ -444,9 +443,6 @@ acpi_pci_irq_enable (
                }
        }
 
-       if (via_interrupt_line_quirk)
-               pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq & 15);
-
        dev->irq = acpi_register_gsi(irq, edge_level, active_high_low);
 
        printk(KERN_INFO PREFIX "PCI Interrupt %s[%c] -> ",
index ff64d333e95f58c68ac45f83832e41060ecb9d1c..c9d671cf7857dbc7101e99d469fa24eed711ac60 100644 (file)
@@ -171,7 +171,7 @@ static void acpi_processor_idle (void)
        int                     sleep_ticks = 0;
        u32                     t1, t2 = 0;
 
-       pr = processors[_smp_processor_id()];
+       pr = processors[raw_smp_processor_id()];
        if (!pr)
                return;
 
index 119c94093a136a4704f0422b25cf30e2e26fccbe..e85885593280dde6313df7ac701785c23511ecb0 100644 (file)
@@ -65,14 +65,14 @@ static ssize_t acpi_device_attr_show(struct kobject *kobj,
 {
        struct acpi_device *device = to_acpi_device(kobj);
        struct acpi_device_attribute *attribute = to_handle_attr(attr);
-       return attribute->show ? attribute->show(device, buf) : 0;
+       return attribute->show ? attribute->show(device, buf) : -EIO;
 }
 static ssize_t acpi_device_attr_store(struct kobject *kobj,
                struct attribute *attr, const char *buf, size_t len)
 {
        struct acpi_device *device = to_acpi_device(kobj);
        struct acpi_device_attribute *attribute = to_handle_attr(attr);
-       return attribute->store ? attribute->store(device, buf, len) : len;
+       return attribute->store ? attribute->store(device, buf, len) : -EIO;
 }
 
 static struct sysfs_ops acpi_device_sysfs_ops = {
index d1dcd8eae3c901c3bacb00f08875ebb770141e44..5b77188527a9ad91f8d3f70691ba9c2d4393f4a1 100644 (file)
@@ -39,7 +39,8 @@ ifeq ($(CONFIG_ATM_FORE200E_PCA),y)
   fore_200e-objs               += fore200e_pca_fw.o
   # guess the target endianess to choose the right PCA-200E firmware image
   ifeq ($(CONFIG_ATM_FORE200E_PCA_DEFAULT_FW),y)
-    CONFIG_ATM_FORE200E_PCA_FW = $(shell if test -n "`$(CC) -E -dM $(src)/../../include/asm/byteorder.h | grep ' __LITTLE_ENDIAN '`"; then echo $(obj)/pca200e.bin; else echo $(obj)/pca200e_ecd.bin2; fi)
+    byteorder.h                        := include$(if $(patsubst $(srctree),,$(objtree)),2)/asm/byteorder.h
+    CONFIG_ATM_FORE200E_PCA_FW := $(obj)/pca200e$(if $(shell $(CC) -E -dM $(byteorder.h) | grep ' __LITTLE_ENDIAN '),.bin,_ecd.bin2)
   endif
 endif
 
index 9e65bfb85ba325285f299dcaf82388146bcafebb..5f702199543ac043eec3905b6231e119e421ba7c 100644 (file)
@@ -383,8 +383,7 @@ fore200e_shutdown(struct fore200e* fore200e)
     switch(fore200e->state) {
 
     case FORE200E_STATE_COMPLETE:
-       if (fore200e->stats)
-           kfree(fore200e->stats);
+       kfree(fore200e->stats);
 
     case FORE200E_STATE_IRQ:
        free_irq(fore200e->irq, fore200e->atm_dev);
@@ -963,8 +962,7 @@ fore200e_tx_irq(struct fore200e* fore200e)
                entry, txq->tail, entry->vc_map, entry->skb);
 
        /* free copy of misaligned data */
-       if (entry->data)
-           kfree(entry->data);
+       kfree(entry->data);
        
        /* remove DMA mapping */
        fore200e->bus->dma_unmap(fore200e, entry->tpd->tsd[ 0 ].buffer, entry->tpd->tsd[ 0 ].length,
index 3022c548a132317e4b8c9334b0cd520b63bde32e..df2c83fd5496015ac64025ea9762e90e80c5093f 100644 (file)
@@ -412,8 +412,7 @@ he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
 init_one_failure:
        if (atm_dev)
                atm_dev_deregister(atm_dev);
-       if (he_dev)
-               kfree(he_dev);
+       kfree(he_dev);
        pci_disable_device(pci_dev);
        return err;
 }
@@ -2534,8 +2533,7 @@ he_open(struct atm_vcc *vcc)
 open_failed:
 
        if (err) {
-               if (he_vcc)
-                       kfree(he_vcc);
+               kfree(he_vcc);
                clear_bit(ATM_VF_ADDR, &vcc->flags);
        }
        else
index 85bf5c8442b000917465b56fb9ce12d2b0e68a14..b2a7b754fd1403a4c7dbd4ffe5ab47cd3de70b5e 100644 (file)
@@ -676,10 +676,10 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
    PRINTK("nicstar%d: RSQ base at 0x%x.\n", i, (u32) card->rsq.base);
       
    /* Initialize SCQ0, the only VBR SCQ used */
-   card->scq1 = (scq_info *) NULL;
-   card->scq2 = (scq_info *) NULL;
+   card->scq1 = NULL;
+   card->scq2 = NULL;
    card->scq0 = get_scq(VBR_SCQSIZE, NS_VRSCD0);
-   if (card->scq0 == (scq_info *) NULL)
+   if (card->scq0 == NULL)
    {
       printk("nicstar%d: can't get SCQ0.\n", i);
       error = 12;
@@ -993,24 +993,24 @@ static scq_info *get_scq(int size, u32 scd)
    int i;
 
    if (size != VBR_SCQSIZE && size != CBR_SCQSIZE)
-      return (scq_info *) NULL;
+      return NULL;
 
    scq = (scq_info *) kmalloc(sizeof(scq_info), GFP_KERNEL);
-   if (scq == (scq_info *) NULL)
-      return (scq_info *) NULL;
+   if (scq == NULL)
+      return NULL;
    scq->org = kmalloc(2 * size, GFP_KERNEL);
    if (scq->org == NULL)
    {
       kfree(scq);
-      return (scq_info *) NULL;
+      return NULL;
    }
    scq->skb = (struct sk_buff **) kmalloc(sizeof(struct sk_buff *) *
                                           (size / NS_SCQE_SIZE), GFP_KERNEL);
-   if (scq->skb == (struct sk_buff **) NULL)
+   if (scq->skb == NULL)
    {
       kfree(scq->org);
       kfree(scq);
-      return (scq_info *) NULL;
+      return NULL;
    }
    scq->num_entries = size / NS_SCQE_SIZE;
    scq->base = (ns_scqe *) ALIGN_ADDRESS(scq->org, size);
@@ -1498,7 +1498,7 @@ static int ns_open(struct atm_vcc *vcc)
          vc->cbr_scd = NS_FRSCD + frscdi * NS_FRSCD_SIZE;
 
          scq = get_scq(CBR_SCQSIZE, vc->cbr_scd);
-         if (scq == (scq_info *) NULL)
+         if (scq == NULL)
          {
             PRINTK("nicstar%d: can't get fixed rate SCQ.\n", card->index);
             card->scd2vc[frscdi] = NULL;
index 47a800519ad01ed87638b329f1fd4a1213c6a641..8d5e65cb975528203ebb5b951044d9eaf73c91ad 100644 (file)
@@ -902,7 +902,7 @@ static void close_tx(struct atm_vcc *vcc)
                zatm_dev->tx_bw += vcc->qos.txtp.min_pcr;
                dealloc_shaper(vcc->dev,zatm_vcc->shaper);
        }
-       if (zatm_vcc->ring) kfree(zatm_vcc->ring);
+       kfree(zatm_vcc->ring);
 }
 
 
@@ -1339,12 +1339,9 @@ static int __init zatm_start(struct atm_dev *dev)
        return 0;
     out:
        for (i = 0; i < NR_MBX; i++)
-               if (zatm_dev->mbx_start[i] != 0)
-                       kfree((void *) zatm_dev->mbx_start[i]);
-       if (zatm_dev->rx_map != NULL)
-               kfree(zatm_dev->rx_map);
-       if (zatm_dev->tx_map != NULL)
-               kfree(zatm_dev->tx_map);
+               kfree(zatm_dev->mbx_start[i]);
+       kfree(zatm_dev->rx_map);
+       kfree(zatm_dev->tx_map);
        free_irq(zatm_dev->irq, dev);
        return error;
 }
index 6662b545e0a910cde8cccee988efe337b54fd2a6..66d9c4643fc1d0857cbaac240a2cc7a9f6dbfff6 100644 (file)
@@ -1,7 +1,7 @@
 # Makefile for the Linux device tree
 
-obj-y                  := core.o sys.o interface.o bus.o \
-                          driver.o class.o class_simple.o platform.o \
+obj-y                  := core.o sys.o bus.o dd.o \
+                          driver.o class.o platform.o \
                           cpu.o firmware.o init.o map.o dmapool.o \
                           attribute_container.o transport_class.o
 obj-y                  += power/
index 8d1e8bd48632e68b001755d673c3f90bfad47b03..645f626929209dd9e59cef9cd3070de9f0181a71 100644 (file)
@@ -4,6 +4,8 @@ extern void bus_remove_device(struct device * dev);
 extern int bus_add_driver(struct device_driver *);
 extern void bus_remove_driver(struct device_driver *);
 
+extern void driver_detach(struct device_driver * drv);
+
 static inline struct class_device *to_class_dev(struct kobject *obj)
 {
        return container_of(obj, struct class_device, kobj);
index 2b3902c867dab76cf5b9b9d65d1778be20ac20e1..43722af90bddf2e01343bc24de33e25668952237 100644 (file)
@@ -17,9 +17,6 @@
 #include "base.h"
 #include "power/power.h"
 
-#define to_dev(node) container_of(node, struct device, bus_list)
-#define to_drv(node) container_of(node, struct device_driver, kobj.entry)
-
 #define to_bus_attr(_attr) container_of(_attr, struct bus_attribute, attr)
 #define to_bus(obj) container_of(obj, struct bus_type, subsys.kset.kobj)
 
@@ -36,7 +33,7 @@ drv_attr_show(struct kobject * kobj, struct attribute * attr, char * buf)
 {
        struct driver_attribute * drv_attr = to_drv_attr(attr);
        struct device_driver * drv = to_driver(kobj);
-       ssize_t ret = 0;
+       ssize_t ret = -EIO;
 
        if (drv_attr->show)
                ret = drv_attr->show(drv, buf);
@@ -49,7 +46,7 @@ drv_attr_store(struct kobject * kobj, struct attribute * attr,
 {
        struct driver_attribute * drv_attr = to_drv_attr(attr);
        struct device_driver * drv = to_driver(kobj);
-       ssize_t ret = 0;
+       ssize_t ret = -EIO;
 
        if (drv_attr->store)
                ret = drv_attr->store(drv, buf, count);
@@ -135,50 +132,11 @@ static struct kobj_type ktype_bus = {
 
 decl_subsys(bus, &ktype_bus, NULL);
 
-static int __bus_for_each_dev(struct bus_type *bus, struct device *start,
-                             void *data, int (*fn)(struct device *, void *))
-{
-       struct list_head *head;
-       struct device *dev;
-       int error = 0;
-
-       if (!(bus = get_bus(bus)))
-               return -EINVAL;
-
-       head = &bus->devices.list;
-       dev = list_prepare_entry(start, head, bus_list);
-       list_for_each_entry_continue(dev, head, bus_list) {
-               get_device(dev);
-               error = fn(dev, data);
-               put_device(dev);
-               if (error)
-                       break;
-       }
-       put_bus(bus);
-       return error;
-}
 
-static int __bus_for_each_drv(struct bus_type *bus, struct device_driver *start,
-                             void * data, int (*fn)(struct device_driver *, void *))
+static struct device * next_device(struct klist_iter * i)
 {
-       struct list_head *head;
-       struct device_driver *drv;
-       int error = 0;
-
-       if (!(bus = get_bus(bus)))
-               return -EINVAL;
-
-       head = &bus->drivers.list;
-       drv = list_prepare_entry(start, head, kobj.entry);
-       list_for_each_entry_continue(drv, head, kobj.entry) {
-               get_driver(drv);
-               error = fn(drv, data);
-               put_driver(drv);
-               if (error)
-                       break;
-       }
-       put_bus(bus);
-       return error;
+       struct klist_node * n = klist_next(i);
+       return n ? container_of(n, struct device, knode_bus) : NULL;
 }
 
 /**
@@ -204,12 +162,27 @@ static int __bus_for_each_drv(struct bus_type *bus, struct device_driver *start,
 int bus_for_each_dev(struct bus_type * bus, struct device * start,
                     void * data, int (*fn)(struct device *, void *))
 {
-       int ret;
+       struct klist_iter i;
+       struct device * dev;
+       int error = 0;
 
-       down_read(&bus->subsys.rwsem);
-       ret = __bus_for_each_dev(bus, start, data, fn);
-       up_read(&bus->subsys.rwsem);
-       return ret;
+       if (!bus)
+               return -EINVAL;
+
+       klist_iter_init_node(&bus->klist_devices, &i,
+                            (start ? &start->knode_bus : NULL));
+       while ((dev = next_device(&i)) && !error)
+               error = fn(dev, data);
+       klist_iter_exit(&i);
+       return error;
+}
+
+
+
+static struct device_driver * next_driver(struct klist_iter * i)
+{
+       struct klist_node * n = klist_next(i);
+       return n ? container_of(n, struct device_driver, knode_bus) : NULL;
 }
 
 /**
@@ -235,180 +208,19 @@ int bus_for_each_dev(struct bus_type * bus, struct device * start,
 int bus_for_each_drv(struct bus_type * bus, struct device_driver * start,
                     void * data, int (*fn)(struct device_driver *, void *))
 {
-       int ret;
-
-       down_read(&bus->subsys.rwsem);
-       ret = __bus_for_each_drv(bus, start, data, fn);
-       up_read(&bus->subsys.rwsem);
-       return ret;
-}
-
-/**
- *     device_bind_driver - bind a driver to one device.
- *     @dev:   device.
- *
- *     Allow manual attachment of a driver to a device.
- *     Caller must have already set @dev->driver.
- *
- *     Note that this does not modify the bus reference count
- *     nor take the bus's rwsem. Please verify those are accounted
- *     for before calling this. (It is ok to call with no other effort
- *     from a driver's probe() method.)
- */
-
-void device_bind_driver(struct device * dev)
-{
-       pr_debug("bound device '%s' to driver '%s'\n",
-                dev->bus_id, dev->driver->name);
-       list_add_tail(&dev->driver_list, &dev->driver->devices);
-       sysfs_create_link(&dev->driver->kobj, &dev->kobj,
-                         kobject_name(&dev->kobj));
-       sysfs_create_link(&dev->kobj, &dev->driver->kobj, "driver");
-}
-
-
-/**
- *     driver_probe_device - attempt to bind device & driver.
- *     @drv:   driver.
- *     @dev:   device.
- *
- *     First, we call the bus's match function, if one present, which
- *     should compare the device IDs the driver supports with the
- *     device IDs of the device. Note we don't do this ourselves
- *     because we don't know the format of the ID structures, nor what
- *     is to be considered a match and what is not.
- *
- *     If we find a match, we call @drv->probe(@dev) if it exists, and
- *     call device_bind_driver() above.
- */
-int driver_probe_device(struct device_driver * drv, struct device * dev)
-{
-       if (drv->bus->match && !drv->bus->match(dev, drv))
-               return -ENODEV;
-
-       dev->driver = drv;
-       if (drv->probe) {
-               int error = drv->probe(dev);
-               if (error) {
-                       dev->driver = NULL;
-                       return error;
-               }
-       }
-
-       device_bind_driver(dev);
-       return 0;
-}
-
-
-/**
- *     device_attach - try to attach device to a driver.
- *     @dev:   device.
- *
- *     Walk the list of drivers that the bus has and call
- *     driver_probe_device() for each pair. If a compatible
- *     pair is found, break out and return.
- */
-int device_attach(struct device * dev)
-{
-       struct bus_type * bus = dev->bus;
-       struct list_head * entry;
-       int error;
-
-       if (dev->driver) {
-               device_bind_driver(dev);
-               return 1;
-       }
-
-       if (bus->match) {
-               list_for_each(entry, &bus->drivers.list) {
-                       struct device_driver * drv = to_drv(entry);
-                       error = driver_probe_device(drv, dev);
-                       if (!error)
-                               /* success, driver matched */
-                               return 1;
-                       if (error != -ENODEV && error != -ENXIO)
-                               /* driver matched but the probe failed */
-                               printk(KERN_WARNING
-                                   "%s: probe of %s failed with error %d\n",
-                                   drv->name, dev->bus_id, error);
-               }
-       }
-
-       return 0;
-}
-
-
-/**
- *     driver_attach - try to bind driver to devices.
- *     @drv:   driver.
- *
- *     Walk the list of devices that the bus has on it and try to
- *     match the driver with each one.  If driver_probe_device()
- *     returns 0 and the @dev->driver is set, we've found a
- *     compatible pair.
- *
- *     Note that we ignore the -ENODEV error from driver_probe_device(),
- *     since it's perfectly valid for a driver not to bind to any devices.
- */
-void driver_attach(struct device_driver * drv)
-{
-       struct bus_type * bus = drv->bus;
-       struct list_head * entry;
-       int error;
-
-       if (!bus->match)
-               return;
-
-       list_for_each(entry, &bus->devices.list) {
-               struct device * dev = container_of(entry, struct device, bus_list);
-               if (!dev->driver) {
-                       error = driver_probe_device(drv, dev);
-                       if (error && (error != -ENODEV))
-                               /* driver matched but the probe failed */
-                               printk(KERN_WARNING
-                                   "%s: probe of %s failed with error %d\n",
-                                   drv->name, dev->bus_id, error);
-               }
-       }
-}
-
-
-/**
- *     device_release_driver - manually detach device from driver.
- *     @dev:   device.
- *
- *     Manually detach device from driver.
- *     Note that this is called without incrementing the bus
- *     reference count nor taking the bus's rwsem. Be sure that
- *     those are accounted for before calling this function.
- */
-
-void device_release_driver(struct device * dev)
-{
-       struct device_driver * drv = dev->driver;
-       if (drv) {
-               sysfs_remove_link(&drv->kobj, kobject_name(&dev->kobj));
-               sysfs_remove_link(&dev->kobj, "driver");
-               list_del_init(&dev->driver_list);
-               device_detach_shutdown(dev);
-               if (drv->remove)
-                       drv->remove(dev);
-               dev->driver = NULL;
-       }
-}
-
+       struct klist_iter i;
+       struct device_driver * drv;
+       int error = 0;
 
-/**
- *     driver_detach - detach driver from all devices it controls.
- *     @drv:   driver.
- */
+       if (!bus)
+               return -EINVAL;
 
-static void driver_detach(struct device_driver * drv)
-{
-       while (!list_empty(&drv->devices)) {
-               struct device * dev = container_of(drv->devices.next, struct device, driver_list);
-               device_release_driver(dev);
-       }
+       klist_iter_init_node(&bus->klist_drivers, &i,
+                            start ? &start->knode_bus : NULL);
+       while ((drv = next_driver(&i)) && !error)
+               error = fn(drv, data);
+       klist_iter_exit(&i);
+       return error;
 }
 
 static int device_add_attrs(struct bus_type * bus, struct device * dev)
@@ -457,14 +269,15 @@ int bus_add_device(struct device * dev)
        int error = 0;
 
        if (bus) {
-               down_write(&dev->bus->subsys.rwsem);
                pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id);
-               list_add_tail(&dev->bus_list, &dev->bus->devices.list);
-               device_attach(dev);
-               up_write(&dev->bus->subsys.rwsem);
-               device_add_attrs(bus, dev);
-               sysfs_create_link(&bus->devices.kobj, &dev->kobj, dev->bus_id);
-               sysfs_create_link(&dev->kobj, &dev->bus->subsys.kset.kobj, "bus");
+               error = device_attach(dev);
+               klist_add_tail(&bus->klist_devices, &dev->knode_bus);
+               if (error >= 0)
+                       error = device_add_attrs(bus, dev);
+               if (!error) {
+                       sysfs_create_link(&bus->devices.kobj, &dev->kobj, dev->bus_id);
+                       sysfs_create_link(&dev->kobj, &dev->bus->subsys.kset.kobj, "bus");
+               }
        }
        return error;
 }
@@ -484,11 +297,9 @@ void bus_remove_device(struct device * dev)
                sysfs_remove_link(&dev->kobj, "bus");
                sysfs_remove_link(&dev->bus->devices.kobj, dev->bus_id);
                device_remove_attrs(dev->bus, dev);
-               down_write(&dev->bus->subsys.rwsem);
+               klist_remove(&dev->knode_bus);
                pr_debug("bus %s: remove device %s\n", dev->bus->name, dev->bus_id);
                device_release_driver(dev);
-               list_del_init(&dev->bus_list);
-               up_write(&dev->bus->subsys.rwsem);
                put_bus(dev->bus);
        }
 }
@@ -548,9 +359,8 @@ int bus_add_driver(struct device_driver * drv)
                        return error;
                }
 
-               down_write(&bus->subsys.rwsem);
                driver_attach(drv);
-               up_write(&bus->subsys.rwsem);
+               klist_add_tail(&bus->klist_drivers, &drv->knode_bus);
                module_add_driver(drv->owner, drv);
 
                driver_add_attrs(bus, drv);
@@ -572,10 +382,9 @@ void bus_remove_driver(struct device_driver * drv)
 {
        if (drv->bus) {
                driver_remove_attrs(drv->bus, drv);
-               down_write(&drv->bus->subsys.rwsem);
+               klist_remove(&drv->knode_bus);
                pr_debug("bus %s: remove driver %s\n", drv->bus->name, drv->name);
                driver_detach(drv);
-               up_write(&drv->bus->subsys.rwsem);
                module_remove_driver(drv);
                kobject_unregister(&drv->kobj);
                put_bus(drv->bus);
@@ -588,7 +397,7 @@ static int bus_rescan_devices_helper(struct device *dev, void *data)
 {
        int *count = data;
 
-       if (!dev->driver && device_attach(dev))
+       if (!dev->driver && (device_attach(dev) > 0))
                (*count)++;
 
        return 0;
@@ -608,9 +417,7 @@ int bus_rescan_devices(struct bus_type * bus)
 {
        int count = 0;
 
-       down_write(&bus->subsys.rwsem);
-       __bus_for_each_dev(bus, NULL, &count, bus_rescan_devices_helper);
-       up_write(&bus->subsys.rwsem);
+       bus_for_each_dev(bus, NULL, &count, bus_rescan_devices_helper);
 
        return count;
 }
@@ -711,6 +518,9 @@ int bus_register(struct bus_type * bus)
        retval = kset_register(&bus->drivers);
        if (retval)
                goto bus_drivers_fail;
+
+       klist_init(&bus->klist_devices);
+       klist_init(&bus->klist_drivers);
        bus_add_attrs(bus);
 
        pr_debug("bus type '%s' registered\n", bus->name);
@@ -750,12 +560,6 @@ int __init buses_init(void)
 EXPORT_SYMBOL_GPL(bus_for_each_dev);
 EXPORT_SYMBOL_GPL(bus_for_each_drv);
 
-EXPORT_SYMBOL_GPL(driver_probe_device);
-EXPORT_SYMBOL_GPL(device_bind_driver);
-EXPORT_SYMBOL_GPL(device_release_driver);
-EXPORT_SYMBOL_GPL(device_attach);
-EXPORT_SYMBOL_GPL(driver_attach);
-
 EXPORT_SYMBOL_GPL(bus_add_device);
 EXPORT_SYMBOL_GPL(bus_remove_device);
 EXPORT_SYMBOL_GPL(bus_register);
index d2a2f8f2b4ed49d7c9e60e4c3a768f7ce53065e4..479c12570881374f9bdb6fafb172879b583b20bc 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/init.h>
 #include <linux/string.h>
 #include <linux/kdev_t.h>
+#include <linux/err.h>
 #include "base.h"
 
 #define to_class_attr(_attr) container_of(_attr, struct class_attribute, attr)
@@ -26,7 +27,7 @@ class_attr_show(struct kobject * kobj, struct attribute * attr, char * buf)
 {
        struct class_attribute * class_attr = to_class_attr(attr);
        struct class * dc = to_class(kobj);
-       ssize_t ret = 0;
+       ssize_t ret = -EIO;
 
        if (class_attr->show)
                ret = class_attr->show(dc, buf);
@@ -39,7 +40,7 @@ class_attr_store(struct kobject * kobj, struct attribute * attr,
 {
        struct class_attribute * class_attr = to_class_attr(attr);
        struct class * dc = to_class(kobj);
-       ssize_t ret = 0;
+       ssize_t ret = -EIO;
 
        if (class_attr->store)
                ret = class_attr->store(dc, buf, count);
@@ -162,6 +163,69 @@ void class_unregister(struct class * cls)
        subsystem_unregister(&cls->subsys);
 }
 
+static void class_create_release(struct class *cls)
+{
+       kfree(cls);
+}
+
+static void class_device_create_release(struct class_device *class_dev)
+{
+       kfree(class_dev);
+}
+
+/**
+ * class_create - create a struct class structure
+ * @owner: pointer to the module that is to "own" this struct class
+ * @name: pointer to a string for the name of this class.
+ *
+ * This is used to create a struct class pointer that can then be used
+ * in calls to class_device_create().
+ *
+ * Note, the pointer created here is to be destroyed when finished by
+ * making a call to class_destroy().
+ */
+struct class *class_create(struct module *owner, char *name)
+{
+       struct class *cls;
+       int retval;
+
+       cls = kmalloc(sizeof(struct class), GFP_KERNEL);
+       if (!cls) {
+               retval = -ENOMEM;
+               goto error;
+       }
+       memset(cls, 0x00, sizeof(struct class));
+
+       cls->name = name;
+       cls->owner = owner;
+       cls->class_release = class_create_release;
+       cls->release = class_device_create_release;
+
+       retval = class_register(cls);
+       if (retval)
+               goto error;
+
+       return cls;
+
+error:
+       kfree(cls);
+       return ERR_PTR(retval);
+}
+
+/**
+ * class_destroy - destroys a struct class structure
+ * @cs: pointer to the struct class that is to be destroyed
+ *
+ * Note, the pointer to be destroyed must have been created with a call
+ * to class_create().
+ */
+void class_destroy(struct class *cls)
+{
+       if ((cls == NULL) || (IS_ERR(cls)))
+               return;
+
+       class_unregister(cls);
+}
 
 /* Class Device Stuff */
 
@@ -262,7 +326,7 @@ static int class_hotplug_filter(struct kset *kset, struct kobject *kobj)
        return 0;
 }
 
-static char *class_hotplug_name(struct kset *kset, struct kobject *kobj)
+static const char *class_hotplug_name(struct kset *kset, struct kobject *kobj)
 {
        struct class_device *class_dev = to_class_dev(kobj);
 
@@ -375,7 +439,6 @@ static ssize_t show_dev(struct class_device *class_dev, char *buf)
 {
        return print_dev_t(buf, class_dev->devt);
 }
-static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
 
 void class_device_initialize(struct class_device *class_dev)
 {
@@ -412,7 +475,31 @@ int class_device_add(struct class_device *class_dev)
        if ((error = kobject_add(&class_dev->kobj)))
                goto register_done;
 
-       /* now take care of our own registration */
+       /* add the needed attributes to this device */
+       if (MAJOR(class_dev->devt)) {
+               struct class_device_attribute *attr;
+               attr = kmalloc(sizeof(*attr), GFP_KERNEL);
+               if (!attr) {
+                       error = -ENOMEM;
+                       kobject_del(&class_dev->kobj);
+                       goto register_done;
+               }
+               memset(attr, sizeof(*attr), 0x00);
+               attr->attr.name = "dev";
+               attr->attr.mode = S_IRUGO;
+               attr->attr.owner = parent->owner;
+               attr->show = show_dev;
+               attr->store = NULL;
+               class_device_create_file(class_dev, attr);
+               class_dev->devt_attr = attr;
+       }
+
+       class_device_add_attrs(class_dev);
+       if (class_dev->dev)
+               sysfs_create_link(&class_dev->kobj,
+                                 &class_dev->dev->kobj, "device");
+
+       /* notify any interfaces this device is now here */
        if (parent) {
                down(&parent->sem);
                list_add_tail(&class_dev->node, &parent->children);
@@ -421,16 +508,8 @@ int class_device_add(struct class_device *class_dev)
                                class_intf->add(class_dev);
                up(&parent->sem);
        }
-
-       if (MAJOR(class_dev->devt))
-               class_device_create_file(class_dev, &class_device_attr_dev);
-
-       class_device_add_attrs(class_dev);
-       if (class_dev->dev)
-               sysfs_create_link(&class_dev->kobj,
-                                 &class_dev->dev->kobj, "device");
-
        kobject_hotplug(&class_dev->kobj, KOBJ_ADD);
+
  register_done:
        if (error && parent)
                class_put(parent);
@@ -444,6 +523,58 @@ int class_device_register(struct class_device *class_dev)
        return class_device_add(class_dev);
 }
 
+/**
+ * class_device_create - creates a class device and registers it with sysfs
+ * @cs: pointer to the struct class that this device should be registered to.
+ * @dev: the dev_t for the char device to be added.
+ * @device: a pointer to a struct device that is assiociated with this class device.
+ * @fmt: string for the class device's name
+ *
+ * This function can be used by char device classes.  A struct
+ * class_device will be created in sysfs, registered to the specified
+ * class.  A "dev" file will be created, showing the dev_t for the
+ * device.  The pointer to the struct class_device will be returned from
+ * the call.  Any further sysfs files that might be required can be
+ * created using this pointer.
+ *
+ * Note: the struct class passed to this function must have previously
+ * been created with a call to class_create().
+ */
+struct class_device *class_device_create(struct class *cls, dev_t devt,
+                                        struct device *device, char *fmt, ...)
+{
+       va_list args;
+       struct class_device *class_dev = NULL;
+       int retval = -ENODEV;
+
+       if (cls == NULL || IS_ERR(cls))
+               goto error;
+
+       class_dev = kmalloc(sizeof(struct class_device), GFP_KERNEL);
+       if (!class_dev) {
+               retval = -ENOMEM;
+               goto error;
+       }
+       memset(class_dev, 0x00, sizeof(struct class_device));
+
+       class_dev->devt = devt;
+       class_dev->dev = device;
+       class_dev->class = cls;
+
+       va_start(args, fmt);
+       vsnprintf(class_dev->class_id, BUS_ID_SIZE, fmt, args);
+       va_end(args);
+       retval = class_device_register(class_dev);
+       if (retval)
+               goto error;
+
+       return class_dev;
+
+error:
+       kfree(class_dev);
+       return ERR_PTR(retval);
+}
+
 void class_device_del(struct class_device *class_dev)
 {
        struct class * parent = class_dev->class;
@@ -460,6 +591,11 @@ void class_device_del(struct class_device *class_dev)
 
        if (class_dev->dev)
                sysfs_remove_link(&class_dev->kobj, "device");
+       if (class_dev->devt_attr) {
+               class_device_remove_file(class_dev, class_dev->devt_attr);
+               kfree(class_dev->devt_attr);
+               class_dev->devt_attr = NULL;
+       }
        class_device_remove_attrs(class_dev);
 
        kobject_hotplug(&class_dev->kobj, KOBJ_REMOVE);
@@ -477,6 +613,32 @@ void class_device_unregister(struct class_device *class_dev)
        class_device_put(class_dev);
 }
 
+/**
+ * class_device_destroy - removes a class device that was created with class_device_create()
+ * @cls: the pointer to the struct class that this device was registered * with.
+ * @dev: the dev_t of the device that was previously registered.
+ *
+ * This call unregisters and cleans up a class device that was created with a
+ * call to class_device_create()
+ */
+void class_device_destroy(struct class *cls, dev_t devt)
+{
+       struct class_device *class_dev = NULL;
+       struct class_device *class_dev_tmp;
+
+       down(&cls->sem);
+       list_for_each_entry(class_dev_tmp, &cls->children, node) {
+               if (class_dev_tmp->devt == devt) {
+                       class_dev = class_dev_tmp;
+                       break;
+               }
+       }
+       up(&cls->sem);
+
+       if (class_dev)
+               class_device_unregister(class_dev);
+}
+
 int class_device_rename(struct class_device *class_dev, char *new_name)
 {
        int error = 0;
@@ -576,6 +738,8 @@ EXPORT_SYMBOL_GPL(class_register);
 EXPORT_SYMBOL_GPL(class_unregister);
 EXPORT_SYMBOL_GPL(class_get);
 EXPORT_SYMBOL_GPL(class_put);
+EXPORT_SYMBOL_GPL(class_create);
+EXPORT_SYMBOL_GPL(class_destroy);
 
 EXPORT_SYMBOL_GPL(class_device_register);
 EXPORT_SYMBOL_GPL(class_device_unregister);
@@ -584,6 +748,8 @@ EXPORT_SYMBOL_GPL(class_device_add);
 EXPORT_SYMBOL_GPL(class_device_del);
 EXPORT_SYMBOL_GPL(class_device_get);
 EXPORT_SYMBOL_GPL(class_device_put);
+EXPORT_SYMBOL_GPL(class_device_create);
+EXPORT_SYMBOL_GPL(class_device_destroy);
 EXPORT_SYMBOL_GPL(class_device_create_file);
 EXPORT_SYMBOL_GPL(class_device_remove_file);
 EXPORT_SYMBOL_GPL(class_device_create_bin_file);
diff --git a/drivers/base/class_simple.c b/drivers/base/class_simple.c
deleted file mode 100644 (file)
index 27699eb..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * class_simple.c - a "simple" interface for classes for simple char devices.
- *
- * Copyright (c) 2003-2004 Greg Kroah-Hartman <greg@kroah.com>
- * Copyright (c) 2003-2004 IBM Corp.
- *
- * This file is released under the GPLv2
- *
- */
-
-#include <linux/config.h>
-#include <linux/device.h>
-#include <linux/err.h>
-
-struct class_simple {
-       struct class class;
-};
-#define to_class_simple(d) container_of(d, struct class_simple, class)
-
-struct simple_dev {
-       struct list_head node;
-       struct class_device class_dev;
-};
-#define to_simple_dev(d) container_of(d, struct simple_dev, class_dev)
-
-static LIST_HEAD(simple_dev_list);
-static DEFINE_SPINLOCK(simple_dev_list_lock);
-
-static void release_simple_dev(struct class_device *class_dev)
-{
-       struct simple_dev *s_dev = to_simple_dev(class_dev);
-       kfree(s_dev);
-}
-
-static void class_simple_release(struct class *class)
-{
-       struct class_simple *cs = to_class_simple(class);
-       kfree(cs);
-}
-
-/**
- * class_simple_create - create a struct class_simple structure
- * @owner: pointer to the module that is to "own" this struct class_simple
- * @name: pointer to a string for the name of this class.
- *
- * This is used to create a struct class_simple pointer that can then be used
- * in calls to class_simple_device_add().  This is used when you do not wish to
- * create a full blown class support for a type of char devices.
- *
- * Note, the pointer created here is to be destroyed when finished by making a
- * call to class_simple_destroy().
- */
-struct class_simple *class_simple_create(struct module *owner, char *name)
-{
-       struct class_simple *cs;
-       int retval;
-
-       cs = kmalloc(sizeof(*cs), GFP_KERNEL);
-       if (!cs) {
-               retval = -ENOMEM;
-               goto error;
-       }
-       memset(cs, 0x00, sizeof(*cs));
-
-       cs->class.name = name;
-       cs->class.class_release = class_simple_release;
-       cs->class.release = release_simple_dev;
-
-       retval = class_register(&cs->class);
-       if (retval)
-               goto error;
-
-       return cs;
-
-error:
-       kfree(cs);
-       return ERR_PTR(retval);
-}
-EXPORT_SYMBOL(class_simple_create);
-
-/**
- * class_simple_destroy - destroys a struct class_simple structure
- * @cs: pointer to the struct class_simple that is to be destroyed
- *
- * Note, the pointer to be destroyed must have been created with a call to
- * class_simple_create().
- */
-void class_simple_destroy(struct class_simple *cs)
-{
-       if ((cs == NULL) || (IS_ERR(cs)))
-               return;
-
-       class_unregister(&cs->class);
-}
-EXPORT_SYMBOL(class_simple_destroy);
-
-/**
- * class_simple_device_add - adds a class device to sysfs for a character driver
- * @cs: pointer to the struct class_simple that this device should be registered to.
- * @dev: the dev_t for the device to be added.
- * @device: a pointer to a struct device that is assiociated with this class device.
- * @fmt: string for the class device's name
- *
- * This function can be used by simple char device classes that do not
- * implement their own class device registration.  A struct class_device will
- * be created in sysfs, registered to the specified class.  A "dev" file will
- * be created, showing the dev_t for the device.  The pointer to the struct
- * class_device will be returned from the call.  Any further sysfs files that
- * might be required can be created using this pointer.
- * Note: the struct class_simple passed to this function must have previously been
- * created with a call to class_simple_create().
- */
-struct class_device *class_simple_device_add(struct class_simple *cs, dev_t dev, struct device *device, const char *fmt, ...)
-{
-       va_list args;
-       struct simple_dev *s_dev = NULL;
-       int retval;
-
-       if ((cs == NULL) || (IS_ERR(cs))) {
-               retval = -ENODEV;
-               goto error;
-       }
-
-       s_dev = kmalloc(sizeof(*s_dev), GFP_KERNEL);
-       if (!s_dev) {
-               retval = -ENOMEM;
-               goto error;
-       }
-       memset(s_dev, 0x00, sizeof(*s_dev));
-
-       s_dev->class_dev.devt = dev;
-       s_dev->class_dev.dev = device;
-       s_dev->class_dev.class = &cs->class;
-
-       va_start(args, fmt);
-       vsnprintf(s_dev->class_dev.class_id, BUS_ID_SIZE, fmt, args);
-       va_end(args);
-       retval = class_device_register(&s_dev->class_dev);
-       if (retval)
-               goto error;
-
-       spin_lock(&simple_dev_list_lock);
-       list_add(&s_dev->node, &simple_dev_list);
-       spin_unlock(&simple_dev_list_lock);
-
-       return &s_dev->class_dev;
-
-error:
-       kfree(s_dev);
-       return ERR_PTR(retval);
-}
-EXPORT_SYMBOL(class_simple_device_add);
-
-/**
- * class_simple_set_hotplug - set the hotplug callback in the embedded struct class
- * @cs: pointer to the struct class_simple to hold the pointer
- * @hotplug: function pointer to the hotplug function
- *
- * Implement and set a hotplug function to add environment variables specific to this
- * class on the hotplug event.
- */
-int class_simple_set_hotplug(struct class_simple *cs,
-       int (*hotplug)(struct class_device *dev, char **envp, int num_envp, char *buffer, int buffer_size))
-{
-       if ((cs == NULL) || (IS_ERR(cs)))
-               return -ENODEV;
-       cs->class.hotplug = hotplug;
-       return 0;
-}
-EXPORT_SYMBOL(class_simple_set_hotplug);
-
-/**
- * class_simple_device_remove - removes a class device that was created with class_simple_device_add()
- * @dev: the dev_t of the device that was previously registered.
- *
- * This call unregisters and cleans up a class device that was created with a
- * call to class_device_simple_add()
- */
-void class_simple_device_remove(dev_t dev)
-{
-       struct simple_dev *s_dev = NULL;
-       int found = 0;
-
-       spin_lock(&simple_dev_list_lock);
-       list_for_each_entry(s_dev, &simple_dev_list, node) {
-               if (s_dev->class_dev.devt == dev) {
-                       found = 1;
-                       break;
-               }
-       }
-       if (found) {
-               list_del(&s_dev->node);
-               spin_unlock(&simple_dev_list_lock);
-               class_device_unregister(&s_dev->class_dev);
-       } else {
-               spin_unlock(&simple_dev_list_lock);
-       }
-}
-EXPORT_SYMBOL(class_simple_device_remove);
index 268a9c8d168b6ac72a46e0c624830b030b79df51..86d79755fbfb9d4c62c572df8d0585200d1064bf 100644 (file)
@@ -31,17 +31,15 @@ int (*platform_notify_remove)(struct device * dev) = NULL;
 #define to_dev(obj) container_of(obj, struct device, kobj)
 #define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr)
 
-extern struct attribute * dev_default_attrs[];
-
 static ssize_t
 dev_attr_show(struct kobject * kobj, struct attribute * attr, char * buf)
 {
        struct device_attribute * dev_attr = to_dev_attr(attr);
        struct device * dev = to_dev(kobj);
-       ssize_t ret = 0;
+       ssize_t ret = -EIO;
 
        if (dev_attr->show)
-               ret = dev_attr->show(dev, buf);
+               ret = dev_attr->show(dev, dev_attr, buf);
        return ret;
 }
 
@@ -51,10 +49,10 @@ dev_attr_store(struct kobject * kobj, struct attribute * attr,
 {
        struct device_attribute * dev_attr = to_dev_attr(attr);
        struct device * dev = to_dev(kobj);
-       ssize_t ret = 0;
+       ssize_t ret = -EIO;
 
        if (dev_attr->store)
-               ret = dev_attr->store(dev, buf, count);
+               ret = dev_attr->store(dev, dev_attr, buf, count);
        return ret;
 }
 
@@ -89,7 +87,6 @@ static void device_release(struct kobject * kobj)
 static struct kobj_type ktype_device = {
        .release        = device_release,
        .sysfs_ops      = &dev_sysfs_ops,
-       .default_attrs  = dev_default_attrs,
 };
 
 
@@ -105,7 +102,7 @@ static int dev_hotplug_filter(struct kset *kset, struct kobject *kobj)
        return 0;
 }
 
-static char *dev_hotplug_name(struct kset *kset, struct kobject *kobj)
+static const char *dev_hotplug_name(struct kset *kset, struct kobject *kobj)
 {
        struct device *dev = to_dev(kobj);
 
@@ -210,11 +207,9 @@ void device_initialize(struct device *dev)
 {
        kobj_set_kset_s(dev, devices_subsys);
        kobject_init(&dev->kobj);
-       INIT_LIST_HEAD(&dev->node);
-       INIT_LIST_HEAD(&dev->children);
-       INIT_LIST_HEAD(&dev->driver_list);
-       INIT_LIST_HEAD(&dev->bus_list);
+       klist_init(&dev->klist_children);
        INIT_LIST_HEAD(&dev->dma_pools);
+       init_MUTEX(&dev->sem);
 }
 
 /**
@@ -248,26 +243,24 @@ int device_add(struct device *dev)
 
        if ((error = kobject_add(&dev->kobj)))
                goto Error;
+       kobject_hotplug(&dev->kobj, KOBJ_ADD);
        if ((error = device_pm_add(dev)))
                goto PMError;
        if ((error = bus_add_device(dev)))
                goto BusError;
-       down_write(&devices_subsys.rwsem);
        if (parent)
-               list_add_tail(&dev->node, &parent->children);
-       up_write(&devices_subsys.rwsem);
+               klist_add_tail(&parent->klist_children, &dev->knode_parent);
 
        /* notify platform of device entry */
        if (platform_notify)
                platform_notify(dev);
-
-       kobject_hotplug(&dev->kobj, KOBJ_ADD);
  Done:
        put_device(dev);
        return error;
  BusError:
        device_pm_remove(dev);
  PMError:
+       kobject_hotplug(&dev->kobj, KOBJ_REMOVE);
        kobject_del(&dev->kobj);
  Error:
        if (parent)
@@ -339,10 +332,8 @@ void device_del(struct device * dev)
 {
        struct device * parent = dev->parent;
 
-       down_write(&devices_subsys.rwsem);
        if (parent)
-               list_del_init(&dev->node);
-       up_write(&devices_subsys.rwsem);
+               klist_remove(&dev->knode_parent);
 
        /* Notify the platform of the removal, in case they
         * need to do anything...
@@ -376,6 +367,12 @@ void device_unregister(struct device * dev)
 }
 
 
+static struct device * next_device(struct klist_iter * i)
+{
+       struct klist_node * n = klist_next(i);
+       return n ? container_of(n, struct device, knode_parent) : NULL;
+}
+
 /**
  *     device_for_each_child - device child iterator.
  *     @dev:   parent struct device.
@@ -388,39 +385,20 @@ void device_unregister(struct device * dev)
  *     We check the return of @fn each time. If it returns anything
  *     other than 0, we break out and return that value.
  */
-int device_for_each_child(struct device * dev, void * data,
+int device_for_each_child(struct device * parent, void * data,
                     int (*fn)(struct device *, void *))
 {
+       struct klist_iter i;
        struct device * child;
        int error = 0;
 
-       down_read(&devices_subsys.rwsem);
-       list_for_each_entry(child, &dev->children, node) {
-               if((error = fn(child, data)))
-                       break;
-       }
-       up_read(&devices_subsys.rwsem);
+       klist_iter_init(&parent->klist_children, &i);
+       while ((child = next_device(&i)) && !error)
+               error = fn(child, data);
+       klist_iter_exit(&i);
        return error;
 }
 
-/**
- *     device_find - locate device on a bus by name.
- *     @name:  name of the device.
- *     @bus:   bus to scan for the device.
- *
- *     Call kset_find_obj() to iterate over list of devices on
- *     a bus to find device by name. Return device if found.
- *
- *     Note that kset_find_obj increments device's reference count.
- */
-struct device *device_find(const char *name, struct bus_type *bus)
-{
-       struct kobject *k = kset_find_obj(&bus->devices, name);
-       if (k)
-               return to_dev(k);
-       return NULL;
-}
-
 int __init devices_init(void)
 {
        return subsystem_register(&devices_subsys);
@@ -436,7 +414,6 @@ EXPORT_SYMBOL_GPL(device_del);
 EXPORT_SYMBOL_GPL(device_unregister);
 EXPORT_SYMBOL_GPL(get_device);
 EXPORT_SYMBOL_GPL(put_device);
-EXPORT_SYMBOL_GPL(device_find);
 
 EXPORT_SYMBOL_GPL(device_create_file);
 EXPORT_SYMBOL_GPL(device_remove_file);
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
new file mode 100644 (file)
index 0000000..6db3a78
--- /dev/null
@@ -0,0 +1,248 @@
+/*
+ *     drivers/base/dd.c - The core device/driver interactions.
+ *
+ *     This file contains the (sometimes tricky) code that controls the
+ *     interactions between devices and drivers, which primarily includes
+ *     driver binding and unbinding.
+ *
+ *     All of this code used to exist in drivers/base/bus.c, but was
+ *     relocated to here in the name of compartmentalization (since it wasn't
+ *     strictly code just for the 'struct bus_type'.
+ *
+ *     Copyright (c) 2002-5 Patrick Mochel
+ *     Copyright (c) 2002-3 Open Source Development Labs
+ *
+ *     This file is released under the GPLv2
+ */
+
+#include <linux/device.h>
+#include <linux/module.h>
+
+#include "base.h"
+#include "power/power.h"
+
+#define to_drv(node) container_of(node, struct device_driver, kobj.entry)
+
+
+/**
+ *     device_bind_driver - bind a driver to one device.
+ *     @dev:   device.
+ *
+ *     Allow manual attachment of a driver to a device.
+ *     Caller must have already set @dev->driver.
+ *
+ *     Note that this does not modify the bus reference count
+ *     nor take the bus's rwsem. Please verify those are accounted
+ *     for before calling this. (It is ok to call with no other effort
+ *     from a driver's probe() method.)
+ *
+ *     This function must be called with @dev->sem held.
+ */
+void device_bind_driver(struct device * dev)
+{
+       pr_debug("bound device '%s' to driver '%s'\n",
+                dev->bus_id, dev->driver->name);
+       klist_add_tail(&dev->driver->klist_devices, &dev->knode_driver);
+       sysfs_create_link(&dev->driver->kobj, &dev->kobj,
+                         kobject_name(&dev->kobj));
+       sysfs_create_link(&dev->kobj, &dev->driver->kobj, "driver");
+}
+
+/**
+ *     driver_probe_device - attempt to bind device & driver.
+ *     @drv:   driver.
+ *     @dev:   device.
+ *
+ *     First, we call the bus's match function, if one present, which
+ *     should compare the device IDs the driver supports with the
+ *     device IDs of the device. Note we don't do this ourselves
+ *     because we don't know the format of the ID structures, nor what
+ *     is to be considered a match and what is not.
+ *
+ *
+ *     This function returns 1 if a match is found, an error if one
+ *     occurs (that is not -ENODEV or -ENXIO), and 0 otherwise.
+ *
+ *     This function must be called with @dev->sem held.
+ */
+static int driver_probe_device(struct device_driver * drv, struct device * dev)
+{
+       int ret = 0;
+
+       if (drv->bus->match && !drv->bus->match(dev, drv))
+               goto Done;
+
+       pr_debug("%s: Matched Device %s with Driver %s\n",
+                drv->bus->name, dev->bus_id, drv->name);
+       dev->driver = drv;
+       if (drv->probe) {
+               ret = drv->probe(dev);
+               if (ret) {
+                       dev->driver = NULL;
+                       goto ProbeFailed;
+               }
+       }
+       device_bind_driver(dev);
+       ret = 1;
+       pr_debug("%s: Bound Device %s to Driver %s\n",
+                drv->bus->name, dev->bus_id, drv->name);
+       goto Done;
+
+ ProbeFailed:
+       if (ret == -ENODEV || ret == -ENXIO) {
+               /* Driver matched, but didn't support device
+                * or device not found.
+                * Not an error; keep going.
+                */
+               ret = 0;
+       } else {
+               /* driver matched but the probe failed */
+               printk(KERN_WARNING
+                      "%s: probe of %s failed with error %d\n",
+                      drv->name, dev->bus_id, ret);
+       }
+ Done:
+       return ret;
+}
+
+static int __device_attach(struct device_driver * drv, void * data)
+{
+       struct device * dev = data;
+       return driver_probe_device(drv, dev);
+}
+
+/**
+ *     device_attach - try to attach device to a driver.
+ *     @dev:   device.
+ *
+ *     Walk the list of drivers that the bus has and call
+ *     driver_probe_device() for each pair. If a compatible
+ *     pair is found, break out and return.
+ *
+ *     Returns 1 if the device was bound to a driver;
+ *     0 if no matching device was found; error code otherwise.
+ */
+int device_attach(struct device * dev)
+{
+       int ret = 0;
+
+       down(&dev->sem);
+       if (dev->driver) {
+               device_bind_driver(dev);
+               ret = 1;
+       } else
+               ret = bus_for_each_drv(dev->bus, NULL, dev, __device_attach);
+       up(&dev->sem);
+       return ret;
+}
+
+static int __driver_attach(struct device * dev, void * data)
+{
+       struct device_driver * drv = data;
+
+       /*
+        * Lock device and try to bind to it. We drop the error
+        * here and always return 0, because we need to keep trying
+        * to bind to devices and some drivers will return an error
+        * simply if it didn't support the device.
+        *
+        * driver_probe_device() will spit a warning if there
+        * is an error.
+        */
+
+       down(&dev->sem);
+       if (!dev->driver)
+               driver_probe_device(drv, dev);
+       up(&dev->sem);
+
+
+       return 0;
+}
+
+/**
+ *     driver_attach - try to bind driver to devices.
+ *     @drv:   driver.
+ *
+ *     Walk the list of devices that the bus has on it and try to
+ *     match the driver with each one.  If driver_probe_device()
+ *     returns 0 and the @dev->driver is set, we've found a
+ *     compatible pair.
+ */
+void driver_attach(struct device_driver * drv)
+{
+       bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
+}
+
+/**
+ *     device_release_driver - manually detach device from driver.
+ *     @dev:   device.
+ *
+ *     Manually detach device from driver.
+ *
+ *     __device_release_driver() must be called with @dev->sem held.
+ */
+
+static void __device_release_driver(struct device * dev)
+{
+       struct device_driver * drv;
+
+       drv = dev->driver;
+       if (drv) {
+               get_driver(drv);
+               sysfs_remove_link(&drv->kobj, kobject_name(&dev->kobj));
+               sysfs_remove_link(&dev->kobj, "driver");
+               klist_remove(&dev->knode_driver);
+
+               if (drv->remove)
+                       drv->remove(dev);
+               dev->driver = NULL;
+               put_driver(drv);
+       }
+}
+
+void device_release_driver(struct device * dev)
+{
+       /*
+        * If anyone calls device_release_driver() recursively from
+        * within their ->remove callback for the same device, they
+        * will deadlock right here.
+        */
+       down(&dev->sem);
+       __device_release_driver(dev);
+       up(&dev->sem);
+}
+
+
+/**
+ * driver_detach - detach driver from all devices it controls.
+ * @drv: driver.
+ */
+void driver_detach(struct device_driver * drv)
+{
+       struct device * dev;
+
+       for (;;) {
+               spin_lock_irq(&drv->klist_devices.k_lock);
+               if (list_empty(&drv->klist_devices.k_list)) {
+                       spin_unlock_irq(&drv->klist_devices.k_lock);
+                       break;
+               }
+               dev = list_entry(drv->klist_devices.k_list.prev,
+                               struct device, knode_driver.n_node);
+               get_device(dev);
+               spin_unlock_irq(&drv->klist_devices.k_lock);
+
+               down(&dev->sem);
+               if (dev->driver == drv)
+                       __device_release_driver(dev);
+               up(&dev->sem);
+               put_device(dev);
+       }
+}
+
+
+EXPORT_SYMBOL_GPL(device_bind_driver);
+EXPORT_SYMBOL_GPL(device_release_driver);
+EXPORT_SYMBOL_GPL(device_attach);
+EXPORT_SYMBOL_GPL(driver_attach);
+
index f48833df61a29dfba2c469abba7bc4ed6516aa77..c4aebf2f522d724abfbb8e1c5538ac8441322bbd 100644 (file)
@@ -41,7 +41,7 @@ struct dma_page {     /* cacheable header for 'allocation' bytes */
 static DECLARE_MUTEX (pools_lock);
 
 static ssize_t
-show_pools (struct device *dev, char *buf)
+show_pools (struct device *dev, struct device_attribute *attr, char *buf)
 {
        unsigned temp;
        unsigned size;
index 3b269f7e52135472c70b6102e17ca31a5b24c050..1b645886e9eba14046fbb0d62fd7051477ff43a5 100644 (file)
 #define to_dev(node) container_of(node, struct device, driver_list)
 #define to_drv(obj) container_of(obj, struct device_driver, kobj)
 
+
+static struct device * next_device(struct klist_iter * i)
+{
+       struct klist_node * n = klist_next(i);
+       return n ? container_of(n, struct device, knode_driver) : NULL;
+}
+
+/**
+ *     driver_for_each_device - Iterator for devices bound to a driver.
+ *     @drv:   Driver we're iterating.
+ *     @data:  Data to pass to the callback.
+ *     @fn:    Function to call for each device.
+ *
+ *     Iterate over the @drv's list of devices calling @fn for each one.
+ */
+
+int driver_for_each_device(struct device_driver * drv, struct device * start, 
+                          void * data, int (*fn)(struct device *, void *))
+{
+       struct klist_iter i;
+       struct device * dev;
+       int error = 0;
+
+       if (!drv)
+               return -EINVAL;
+
+       klist_iter_init_node(&drv->klist_devices, &i,
+                            start ? &start->knode_driver : NULL);
+       while ((dev = next_device(&i)) && !error)
+               error = fn(dev, data);
+       klist_iter_exit(&i);
+       return error;
+}
+
+EXPORT_SYMBOL_GPL(driver_for_each_device);
+
+
 /**
  *     driver_create_file - create sysfs file for driver.
  *     @drv:   driver.
@@ -85,7 +122,7 @@ void put_driver(struct device_driver * drv)
  */
 int driver_register(struct device_driver * drv)
 {
-       INIT_LIST_HEAD(&drv->devices);
+       klist_init(&drv->klist_devices);
        init_completion(&drv->unloaded);
        return bus_add_driver(drv);
 }
diff --git a/drivers/base/interface.c b/drivers/base/interface.c
deleted file mode 100644 (file)
index bd51584..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * drivers/base/interface.c - common driverfs interface that's exported to
- *     the world for all devices.
- *
- * Copyright (c) 2002-3 Patrick Mochel
- * Copyright (c) 2002-3 Open Source Development Labs
- *
- * This file is released under the GPLv2
- *
- */
-
-#include <linux/device.h>
-#include <linux/err.h>
-#include <linux/stat.h>
-#include <linux/string.h>
-
-/**
- *     detach_state - control the default power state for the device.
- *
- *     This is the state the device enters when it's driver module is
- *     unloaded. The value is an unsigned integer, in the range of 0-4.
- *     '0' indicates 'On', so no action will be taken when the driver is
- *     unloaded. This is the default behavior.
- *     '4' indicates 'Off', meaning the driver core will call the driver's
- *     shutdown method to quiesce the device.
- *     1-3 indicate a low-power state for the device to enter via the
- *     driver's suspend method.
- */
-
-static ssize_t detach_show(struct device * dev, char * buf)
-{
-       return sprintf(buf, "%u\n", dev->detach_state);
-}
-
-static ssize_t detach_store(struct device * dev, const char * buf, size_t n)
-{
-       u32 state;
-       state = simple_strtoul(buf, NULL, 10);
-       if (state > 4)
-               return -EINVAL;
-       dev->detach_state = state;
-       return n;
-}
-
-static DEVICE_ATTR(detach_state, 0644, detach_show, detach_store);
-
-
-struct attribute * dev_default_attrs[] = {
-       &dev_attr_detach_state.attr,
-       NULL,
-};
index 583d57ec49a822f0f30305526d456141662bec38..904b27caf697df2c0d14d1cab426212bad27bb25 100644 (file)
@@ -87,7 +87,7 @@ static ssize_t node_read_numastat(struct sys_device * dev, char * buf)
        for (i = 0; i < MAX_NR_ZONES; i++) {
                struct zone *z = &pg->node_zones[i];
                for (cpu = 0; cpu < NR_CPUS; cpu++) {
-                       struct per_cpu_pageset *ps = &z->pageset[cpu];
+                       struct per_cpu_pageset *ps = zone_pcp(z,cpu);
                        numa_hit += ps->numa_hit;
                        numa_miss += ps->numa_miss;
                        numa_foreign += ps->numa_foreign;
@@ -136,7 +136,7 @@ static SYSDEV_ATTR(distance, S_IRUGO, node_read_distance, NULL);
  *
  * Initialize and register the node device.
  */
-int __init register_node(struct node *node, int num, struct node *parent)
+int register_node(struct node *node, int num, struct node *parent)
 {
        int error;
 
@@ -153,8 +153,24 @@ int __init register_node(struct node *node, int num, struct node *parent)
        return error;
 }
 
+/**
+ * unregister_node - unregister a node device
+ * @node: node going away
+ *
+ * Unregisters a node device @node.  All the devices on the node must be
+ * unregistered before calling this function.
+ */
+void unregister_node(struct node *node)
+{
+       sysdev_remove_file(&node->sysdev, &attr_cpumap);
+       sysdev_remove_file(&node->sysdev, &attr_meminfo);
+       sysdev_remove_file(&node->sysdev, &attr_numastat);
+       sysdev_remove_file(&node->sysdev, &attr_distance);
+
+       sysdev_unregister(&node->sysdev);
+}
 
-int __init register_node_type(void)
+static int __init register_node_type(void)
 {
        return sysdev_class_register(&node_class);
 }
index e5eda746f2a6d1f2a543e017665d2dac90f0fe5c..2e700d795cf15033c933e4a1a71a4d73afa59a14 100644 (file)
@@ -1,18 +1,7 @@
-
-
-enum {
-       DEVICE_PM_ON,
-       DEVICE_PM1,
-       DEVICE_PM2,
-       DEVICE_PM3,
-       DEVICE_PM_OFF,
-};
-
 /*
  * shutdown.c
  */
 
-extern int device_detach_shutdown(struct device *);
 extern void device_shutdown(void);
 
 
index f8f5055754d65b3fd1c41348dade1e1092b9bc5e..bdd96b03b8857a14367535bf408224b1eb939503 100644 (file)
@@ -22,9 +22,22 @@ extern int sysdev_resume(void);
 
 int resume_device(struct device * dev)
 {
-       if (dev->bus && dev->bus->resume)
-               return dev->bus->resume(dev);
-       return 0;
+       int error = 0;
+
+       down(&dev->sem);
+       if (dev->power.pm_parent
+                       && dev->power.pm_parent->power.power_state) {
+               dev_err(dev, "PM: resume from %d, parent %s still %d\n",
+                       dev->power.power_state,
+                       dev->power.pm_parent->bus_id,
+                       dev->power.pm_parent->power.power_state);
+       }
+       if (dev->bus && dev->bus->resume) {
+               dev_dbg(dev,"resuming\n");
+               error = dev->bus->resume(dev);
+       }
+       up(&dev->sem);
+       return error;
 }
 
 
index d1e023fbe16939051739c8424dc7515d9f965f42..f50a08be424b1c524122b19ba769342f38caf02b 100644 (file)
 extern struct subsystem devices_subsys;
 
 
-int device_detach_shutdown(struct device * dev)
-{
-       if (!dev->detach_state)
-               return 0;
-
-       if (dev->detach_state == DEVICE_PM_OFF) {
-               if (dev->driver && dev->driver->shutdown)
-                       dev->driver->shutdown(dev);
-               return 0;
-       }
-       return dpm_runtime_suspend(dev, dev->detach_state);
-}
-
-
 /**
  * We handle system devices differently - we suspend and shut them
  * down last and resume them first. That way, we don't do anything stupid like
@@ -52,13 +38,12 @@ void device_shutdown(void)
        struct device * dev;
 
        down_write(&devices_subsys.rwsem);
-       list_for_each_entry_reverse(dev, &devices_subsys.kset.list, kobj.entry) {
-               pr_debug("shutting down %s: ", dev->bus_id);
+       list_for_each_entry_reverse(dev, &devices_subsys.kset.list,
+                               kobj.entry) {
                if (dev->driver && dev->driver->shutdown) {
-                       pr_debug("Ok\n");
+                       dev_dbg(dev, "shutdown\n");
                        dev->driver->shutdown(dev);
-               } else
-                       pr_debug("Ignored.\n");
+               }
        }
        up_write(&devices_subsys.rwsem);
 
index a0b5cf689e6398422be2db4c1e37119d97856be1..2ccee3763acfae23a3d1de899179dd5ac0ca9419 100644 (file)
@@ -39,13 +39,27 @@ int suspend_device(struct device * dev, pm_message_t state)
 {
        int error = 0;
 
-       dev_dbg(dev, "suspending\n");
+       down(&dev->sem);
+       if (dev->power.power_state) {
+               dev_dbg(dev, "PM: suspend %d-->%d\n",
+                       dev->power.power_state, state);
+       }
+       if (dev->power.pm_parent
+                       && dev->power.pm_parent->power.power_state) {
+               dev_err(dev,
+                       "PM: suspend %d->%d, parent %s already %d\n",
+                       dev->power.power_state, state,
+                       dev->power.pm_parent->bus_id,
+                       dev->power.pm_parent->power.power_state);
+       }
 
        dev->power.prev_state = dev->power.power_state;
 
-       if (dev->bus && dev->bus->suspend && !dev->power.power_state)
+       if (dev->bus && dev->bus->suspend && !dev->power.power_state) {
+               dev_dbg(dev, "suspending\n");
                error = dev->bus->suspend(dev, state);
-
+       }
+       up(&dev->sem);
        return error;
 }
 
@@ -100,8 +114,19 @@ int device_suspend(pm_message_t state)
                put_device(dev);
        }
        up(&dpm_list_sem);
-       if (error)
+       if (error) {
+               /* we failed... before resuming, bring back devices from
+                * dpm_off_irq list back to main dpm_off list, we do want
+                * to call resume() on them, in case they partially suspended
+                * despite returning -EAGAIN
+                */
+               while (!list_empty(&dpm_off_irq)) {
+                       struct list_head * entry = dpm_off_irq.next;
+                       list_del(entry);
+                       list_add(entry, &dpm_off);
+               }
                dpm_resume();
+       }
        up(&dpm_sem);
        return error;
 }
index 6ac96349a8e8688b3e557608742b9d866ddb99f7..f82b3df9545f68b66cd1866862bc665a1f7e00c5 100644 (file)
  *     low-power state.
  */
 
-static ssize_t state_show(struct device * dev, char * buf)
+static ssize_t state_show(struct device * dev, struct device_attribute *attr, char * buf)
 {
        return sprintf(buf, "%u\n", dev->power.power_state);
 }
 
-static ssize_t state_store(struct device * dev, const char * buf, size_t n)
+static ssize_t state_store(struct device * dev, struct device_attribute *attr, const char * buf, size_t n)
 {
        u32 state;
        char * rest;
index 9102e3756f953cfc8bd0303f1add2948ee07a8bc..f37a13de804a9905c131f59d75c07ada35f9dd9d 100644 (file)
@@ -37,7 +37,7 @@ sysdev_show(struct kobject * kobj, struct attribute * attr, char * buffer)
 
        if (sysdev_attr->show)
                return sysdev_attr->show(sysdev, buffer);
-       return 0;
+       return -EIO;
 }
 
 
@@ -50,7 +50,7 @@ sysdev_store(struct kobject * kobj, struct attribute * attr,
 
        if (sysdev_attr->store)
                return sysdev_attr->store(sysdev, buffer, count);
-       return 0;
+       return -EIO;
 }
 
 static struct sysfs_ops sysfs_ops = {
index 14aeca3e2e8c58ab178ba489b6e32f230ebec29d..45a243096187afed4746ca58b84584841b2373eb 100644 (file)
@@ -36,7 +36,7 @@ static int emsgs_head_idx, emsgs_tail_idx;
 static struct semaphore emsgs_sema;
 static spinlock_t emsgs_lock;
 static int nblocked_emsgs_readers;
-static struct class_simple *aoe_class;
+static struct class *aoe_class;
 static struct aoe_chardev chardevs[] = {
        { MINOR_ERR, "err" },
        { MINOR_DISCOVER, "discover" },
@@ -218,13 +218,13 @@ aoechr_init(void)
        }
        sema_init(&emsgs_sema, 0);
        spin_lock_init(&emsgs_lock);
-       aoe_class = class_simple_create(THIS_MODULE, "aoe");
+       aoe_class = class_create(THIS_MODULE, "aoe");
        if (IS_ERR(aoe_class)) {
                unregister_chrdev(AOE_MAJOR, "aoechr");
                return PTR_ERR(aoe_class);
        }
        for (i = 0; i < ARRAY_SIZE(chardevs); ++i)
-               class_simple_device_add(aoe_class,
+               class_device_create(aoe_class,
                                        MKDEV(AOE_MAJOR, chardevs[i].minor),
                                        NULL, chardevs[i].name);
 
@@ -237,8 +237,8 @@ aoechr_exit(void)
        int i;
 
        for (i = 0; i < ARRAY_SIZE(chardevs); ++i)
-               class_simple_device_remove(MKDEV(AOE_MAJOR, chardevs[i].minor));
-       class_simple_destroy(aoe_class);
+               class_device_destroy(aoe_class, MKDEV(AOE_MAJOR, chardevs[i].minor));
+       class_destroy(aoe_class);
        unregister_chrdev(AOE_MAJOR, "aoechr");
 }
 
index a9575bb58a5e14630c507734bb35288c32da8338..638db06de2bea5414a55b0dfa8522a5db238c8bf 100644 (file)
@@ -2044,7 +2044,7 @@ as_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
        struct as_fs_entry *entry = to_as(attr);
 
        if (!entry->show)
-               return 0;
+               return -EIO;
 
        return entry->show(e->elevator_data, page);
 }
@@ -2057,7 +2057,7 @@ as_attr_store(struct kobject *kobj, struct attribute *attr,
        struct as_fs_entry *entry = to_as(attr);
 
        if (!entry->store)
-               return -EINVAL;
+               return -EIO;
 
        return entry->store(e->elevator_data, page, length);
 }
index 8f7c1a1ed7f4402128c7a7477758aea040a1ddbc..abde27027c06b5cddd2dd873267e80b7a27dda51 100644 (file)
@@ -41,6 +41,7 @@
 #include <asm/uaccess.h>
 #include <asm/io.h>
 
+#include <linux/dma-mapping.h>
 #include <linux/blkdev.h>
 #include <linux/genhd.h>
 #include <linux/completion.h>
@@ -126,8 +127,6 @@ static struct board_type products[] = {
 #define MAX_CTLR_ORIG  8
 
 
-#define CCISS_DMA_MASK 0xFFFFFFFF      /* 32 bit DMA */
-
 static ctlr_info_t *hba[MAX_CTLR];
 
 static void do_cciss_request(request_queue_t *q);
@@ -2393,11 +2392,6 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
                printk(KERN_ERR "cciss: Unable to Enable PCI device\n");
                return( -1);
        }
-       if (pci_set_dma_mask(pdev, CCISS_DMA_MASK ) != 0)
-       {
-               printk(KERN_ERR "cciss:  Unable to set DMA mask\n");
-               return(-1);
-       }
 
        subsystem_vendor_id = pdev->subsystem_vendor;
        subsystem_device_id = pdev->subsystem_device;
@@ -2747,9 +2741,9 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
        hba[i]->pdev = pdev;
 
        /* configure PCI DMA stuff */
-       if (!pci_set_dma_mask(pdev, 0xffffffffffffffffULL))
+       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK))
                printk("cciss: using DAC cycles\n");
-       else if (!pci_set_dma_mask(pdev, 0xffffffff))
+       else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK))
                printk("cciss: not using DAC cycles\n");
        else {
                printk("cciss: no suitable DMA available\n");
index 0ef7a0065ece2c9468ced12e65016c37b40ad3c4..3ac47dde64da3be93b5e4bed65cee827f16db952 100644 (file)
@@ -1202,13 +1202,16 @@ retry:
                if (new_cfqq) {
                        cfqq = new_cfqq;
                        new_cfqq = NULL;
-               } else if (gfp_mask & __GFP_WAIT) {
+               } else {
                        spin_unlock_irq(cfqd->queue->queue_lock);
                        new_cfqq = kmem_cache_alloc(cfq_pool, gfp_mask);
                        spin_lock_irq(cfqd->queue->queue_lock);
+
+                       if (!new_cfqq && !(gfp_mask & __GFP_WAIT))
+                               goto out;
+
                        goto retry;
-               } else
-                       goto out;
+               }
 
                memset(cfqq, 0, sizeof(*cfqq));
 
@@ -1772,7 +1775,7 @@ cfq_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
        struct cfq_fs_entry *entry = to_cfq(attr);
 
        if (!entry->show)
-               return 0;
+               return -EIO;
 
        return entry->show(e->elevator_data, page);
 }
@@ -1785,7 +1788,7 @@ cfq_attr_store(struct kobject *kobj, struct attribute *attr,
        struct cfq_fs_entry *entry = to_cfq(attr);
 
        if (!entry->store)
-               return -EINVAL;
+               return -EIO;
 
        return entry->store(e->elevator_data, page, length);
 }
index d63d34c671f7a7fcbc9007ca009a04f125303cd1..7f79f3dd01655f111d88701bb48df642c72046a5 100644 (file)
@@ -886,7 +886,7 @@ deadline_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
        struct deadline_fs_entry *entry = to_deadline(attr);
 
        if (!entry->show)
-               return 0;
+               return -EIO;
 
        return entry->show(e->elevator_data, page);
 }
@@ -899,7 +899,7 @@ deadline_attr_store(struct kobject *kobj, struct attribute *attr,
        struct deadline_fs_entry *entry = to_deadline(attr);
 
        if (!entry->store)
-               return -EINVAL;
+               return -EIO;
 
        return entry->store(e->elevator_data, page, length);
 }
index 6b79b4314622053858e17598c50dda88496f06fa..f831f08f839c14d145cb19d322b361c47a08a2e6 100644 (file)
@@ -220,11 +220,6 @@ void elevator_exit(elevator_t *e)
        kfree(e);
 }
 
-static int elevator_global_init(void)
-{
-       return 0;
-}
-
 int elv_merge(request_queue_t *q, struct request **req, struct bio *bio)
 {
        elevator_t *e = q->elevator;
@@ -290,6 +285,13 @@ void elv_requeue_request(request_queue_t *q, struct request *rq)
                rq = rq->end_io_data;
        }
 
+       /*
+        * the request is prepped and may have some resources allocated.
+        * allowing unprepped requests to pass this one may cause resource
+        * deadlock.  turn on softbarrier.
+        */
+       rq->flags |= REQ_SOFTBARRIER;
+
        /*
         * if iosched has an explicit requeue hook, then use that. otherwise
         * just put the request at the front of the queue
@@ -322,7 +324,7 @@ void __elv_add_request(request_queue_t *q, struct request *rq, int where,
                        int nrq = q->rq.count[READ] + q->rq.count[WRITE]
                                  - q->in_flight;
 
-                       if (nrq == q->unplug_thresh)
+                       if (nrq >= q->unplug_thresh)
                                __generic_unplug_device(q);
                }
        } else
@@ -386,6 +388,12 @@ struct request *elv_next_request(request_queue_t *q)
                if (ret == BLKPREP_OK) {
                        break;
                } else if (ret == BLKPREP_DEFER) {
+                       /*
+                        * the request may have been (partially) prepped.
+                        * we need to keep this request in the front to
+                        * avoid resource deadlock.  turn on softbarrier.
+                        */
+                       rq->flags |= REQ_SOFTBARRIER;
                        rq = NULL;
                        break;
                } else if (ret == BLKPREP_KILL) {
@@ -692,8 +700,6 @@ ssize_t elv_iosched_show(request_queue_t *q, char *name)
        return len;
 }
 
-module_init(elevator_global_init);
-
 EXPORT_SYMBOL(elv_add_request);
 EXPORT_SYMBOL(__elv_add_request);
 EXPORT_SYMBOL(elv_requeue_request);
index 8bbe01d4b487cf5c9a03b474e8ffd2e57bbf1e8f..53f7d846b747f35692f782e0bc84f1fa8639a42e 100644 (file)
@@ -322,7 +322,7 @@ static ssize_t disk_attr_show(struct kobject *kobj, struct attribute *attr,
        struct gendisk *disk = to_disk(kobj);
        struct disk_attribute *disk_attr =
                container_of(attr,struct disk_attribute,attr);
-       ssize_t ret = 0;
+       ssize_t ret = -EIO;
 
        if (disk_attr->show)
                ret = disk_attr->show(disk,page);
index 5e03f5157ef93b2d2b3bc447a36ceba566a2336d..6d7bcc9da9e72f806d0c3fe77aacca8c1ec896e3 100644 (file)
@@ -237,3 +237,5 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
        }
        return ret;
 }
+
+EXPORT_SYMBOL_GPL(blkdev_ioctl);
index 11ef9d9ea139316e454cfae3d3b10f7aaab71959..81fe3a0c1fe730f0cfea7661b65c44602aca5844 100644 (file)
@@ -2038,7 +2038,6 @@ EXPORT_SYMBOL(blk_requeue_request);
  * @rq:                request to be inserted
  * @at_head:   insert request at head or tail of queue
  * @data:      private data
- * @reinsert:  true if request it a reinsertion of previously processed one
  *
  * Description:
  *    Many block devices need to execute commands asynchronously, so they don't
@@ -2053,8 +2052,9 @@ EXPORT_SYMBOL(blk_requeue_request);
  *    host that is unable to accept a particular command.
  */
 void blk_insert_request(request_queue_t *q, struct request *rq,
-                       int at_head, void *data, int reinsert)
+                       int at_head, void *data)
 {
+       int where = at_head ? ELEVATOR_INSERT_FRONT : ELEVATOR_INSERT_BACK;
        unsigned long flags;
 
        /*
@@ -2071,20 +2071,12 @@ void blk_insert_request(request_queue_t *q, struct request *rq,
        /*
         * If command is tagged, release the tag
         */
-       if (reinsert)
-               blk_requeue_request(q, rq);
-       else {
-               int where = ELEVATOR_INSERT_BACK;
-
-               if (at_head)
-                       where = ELEVATOR_INSERT_FRONT;
+       if (blk_rq_tagged(rq))
+               blk_queue_end_tag(q, rq);
 
-               if (blk_rq_tagged(rq))
-                       blk_queue_end_tag(q, rq);
+       drive_stat_acct(rq, rq->nr_sectors, 1);
+       __elv_add_request(q, rq, where, 0);
 
-               drive_stat_acct(rq, rq->nr_sectors, 1);
-               __elv_add_request(q, rq, where, 0);
-       }
        if (blk_queue_plugged(q))
                __generic_unplug_device(q);
        else
@@ -3582,7 +3574,7 @@ queue_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
 
        q = container_of(kobj, struct request_queue, kobj);
        if (!entry->show)
-               return 0;
+               return -EIO;
 
        return entry->show(q, page);
 }
@@ -3596,7 +3588,7 @@ queue_attr_store(struct kobject *kobj, struct attribute *attr,
 
        q = container_of(kobj, struct request_queue, kobj);
        if (!entry->store)
-               return -EINVAL;
+               return -EIO;
 
        return entry->store(q, page, length);
 }
index 202a5a74ad37ba6e3aee1edcac7ffe1c0482e4cf..fa49d62626ba12d1e8647993f48a4fa6e655d660 100644 (file)
@@ -723,7 +723,7 @@ static int pd_special_command(struct pd_unit *disk,
        rq.ref_count = 1;
        rq.waiting = &wait;
        rq.end_io = blk_end_sync_rq;
-       blk_insert_request(disk->gd->queue, &rq, 0, func, 0);
+       blk_insert_request(disk->gd->queue, &rq, 0, func);
        wait_for_completion(&wait);
        rq.waiting = NULL;
        if (rq.errors)
index dbeb107bb97107c42af8abffa049d56bb888f9e4..84d8e291ed964aaafb537790dc2fd00f1b781263 100644 (file)
@@ -222,7 +222,7 @@ static int pg_identify(struct pg *dev, int log);
 
 static char pg_scratch[512];   /* scratch block buffer */
 
-static struct class_simple *pg_class;
+static struct class *pg_class;
 
 /* kernel glue structures */
 
@@ -666,7 +666,7 @@ static int __init pg_init(void)
                err = -1;
                goto out;
        }
-       pg_class = class_simple_create(THIS_MODULE, "pg");
+       pg_class = class_create(THIS_MODULE, "pg");
        if (IS_ERR(pg_class)) {
                err = PTR_ERR(pg_class);
                goto out_chrdev;
@@ -675,7 +675,7 @@ static int __init pg_init(void)
        for (unit = 0; unit < PG_UNITS; unit++) {
                struct pg *dev = &devices[unit];
                if (dev->present) {
-                       class_simple_device_add(pg_class, MKDEV(major, unit), 
+                       class_device_create(pg_class, MKDEV(major, unit),
                                        NULL, "pg%u", unit);
                        err = devfs_mk_cdev(MKDEV(major, unit),
                                      S_IFCHR | S_IRUSR | S_IWUSR, "pg/%u",
@@ -688,8 +688,8 @@ static int __init pg_init(void)
        goto out;
 
 out_class:
-       class_simple_device_remove(MKDEV(major, unit));
-       class_simple_destroy(pg_class);
+       class_device_destroy(pg_class, MKDEV(major, unit));
+       class_destroy(pg_class);
 out_chrdev:
        unregister_chrdev(major, "pg");
 out:
@@ -703,11 +703,11 @@ static void __exit pg_exit(void)
        for (unit = 0; unit < PG_UNITS; unit++) {
                struct pg *dev = &devices[unit];
                if (dev->present) {
-                       class_simple_device_remove(MKDEV(major, unit));
+                       class_device_destroy(pg_class, MKDEV(major, unit));
                        devfs_remove("pg/%u", unit);
                }
        }
-       class_simple_destroy(pg_class);
+       class_destroy(pg_class);
        devfs_remove("pg");
        unregister_chrdev(major, name);
 
index 8fbd6922fe0d461a0b3cd5b885756fc882d0535d..5fe8ee86f095bb82a9691fd5792f8411a4797555 100644 (file)
@@ -242,7 +242,7 @@ static struct file_operations pt_fops = {
 };
 
 /* sysfs class support */
-static struct class_simple *pt_class;
+static struct class *pt_class;
 
 static inline int status_reg(struct pi_adapter *pi)
 {
@@ -963,7 +963,7 @@ static int __init pt_init(void)
                err = -1;
                goto out;
        }
-       pt_class = class_simple_create(THIS_MODULE, "pt");
+       pt_class = class_create(THIS_MODULE, "pt");
        if (IS_ERR(pt_class)) {
                err = PTR_ERR(pt_class);
                goto out_chrdev;
@@ -972,29 +972,29 @@ static int __init pt_init(void)
        devfs_mk_dir("pt");
        for (unit = 0; unit < PT_UNITS; unit++)
                if (pt[unit].present) {
-                       class_simple_device_add(pt_class, MKDEV(major, unit), 
+                       class_device_create(pt_class, MKDEV(major, unit),
                                        NULL, "pt%d", unit);
                        err = devfs_mk_cdev(MKDEV(major, unit),
                                      S_IFCHR | S_IRUSR | S_IWUSR,
                                      "pt/%d", unit);
                        if (err) {
-                               class_simple_device_remove(MKDEV(major, unit));
+                               class_device_destroy(pt_class, MKDEV(major, unit));
                                goto out_class;
                        }
-                       class_simple_device_add(pt_class, MKDEV(major, unit + 128),
+                       class_device_create(pt_class, MKDEV(major, unit + 128),
                                        NULL, "pt%dn", unit);
                        err = devfs_mk_cdev(MKDEV(major, unit + 128),
                                      S_IFCHR | S_IRUSR | S_IWUSR,
                                      "pt/%dn", unit);
                        if (err) {
-                               class_simple_device_remove(MKDEV(major, unit + 128));
+                               class_device_destroy(pt_class, MKDEV(major, unit + 128));
                                goto out_class;
                        }
                }
        goto out;
 
 out_class:
-       class_simple_destroy(pt_class);
+       class_destroy(pt_class);
 out_chrdev:
        unregister_chrdev(major, "pt");
 out:
@@ -1006,12 +1006,12 @@ static void __exit pt_exit(void)
        int unit;
        for (unit = 0; unit < PT_UNITS; unit++)
                if (pt[unit].present) {
-                       class_simple_device_remove(MKDEV(major, unit));
+                       class_device_destroy(pt_class, MKDEV(major, unit));
                        devfs_remove("pt/%d", unit);
-                       class_simple_device_remove(MKDEV(major, unit + 128));
+                       class_device_destroy(pt_class, MKDEV(major, unit + 128));
                        devfs_remove("pt/%dn", unit);
                }
-       class_simple_destroy(pt_class);
+       class_destroy(pt_class);
        devfs_remove("pt");
        unregister_chrdev(major, name);
        for (unit = 0; unit < PT_UNITS; unit++)
index 1a1fa3ccb91375031556815e71fa858cdc48ab60..bc56770bcc90889338810134bba163530e9f72d1 100644 (file)
@@ -914,8 +914,10 @@ static int pkt_handle_queue(struct pktcdvd_device *pd)
                bio = node->bio;
                zone = ZONE(bio->bi_sector, pd);
                list_for_each_entry(p, &pd->cdrw.pkt_active_list, list) {
-                       if (p->sector == zone)
+                       if (p->sector == zone) {
+                               bio = NULL;
                                goto try_next_bio;
+                       }
                }
                break;
 try_next_bio:
@@ -2019,7 +2021,13 @@ static int pkt_open(struct inode *inode, struct file *file)
        BUG_ON(pd->refcnt < 0);
 
        pd->refcnt++;
-       if (pd->refcnt == 1) {
+       if (pd->refcnt > 1) {
+               if ((file->f_mode & FMODE_WRITE) &&
+                   !test_bit(PACKET_WRITABLE, &pd->flags)) {
+                       ret = -EBUSY;
+                       goto out_dec;
+               }
+       } else {
                if (pkt_open_dev(pd, file->f_mode & FMODE_WRITE)) {
                        ret = -EIO;
                        goto out_dec;
@@ -2406,7 +2414,7 @@ static int pkt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u
        case CDROM_LAST_WRITTEN:
        case CDROM_SEND_PACKET:
        case SCSI_IOCTL_SEND_COMMAND:
-               return ioctl_by_bdev(pd->bdev, cmd, arg);
+               return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg);
 
        case CDROMEJECT:
                /*
@@ -2414,7 +2422,7 @@ static int pkt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u
                 * have to unlock it or else the eject command fails.
                 */
                pkt_lock_door(pd, 0);
-               return ioctl_by_bdev(pd->bdev, cmd, arg);
+               return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg);
 
        default:
                printk("pktcdvd: Unknown ioctl for %s (%x)\n", pd->name, cmd);
index 797f5988c2b574fb06b4b6005ae8a01afccbe78c..5ed3a63794522ae0fbca00d787daf6a780aaf717 100644 (file)
@@ -614,7 +614,7 @@ static int carm_array_info (struct carm_host *host, unsigned int array_idx)
        spin_unlock_irq(&host->lock);
 
        DPRINTK("blk_insert_request, tag == %u\n", idx);
-       blk_insert_request(host->oob_q, crq->rq, 1, crq, 0);
+       blk_insert_request(host->oob_q, crq->rq, 1, crq);
 
        return 0;
 
@@ -653,7 +653,7 @@ static int carm_send_special (struct carm_host *host, carm_sspc_t func)
        crq->msg_bucket = (u32) rc;
 
        DPRINTK("blk_insert_request, tag == %u\n", idx);
-       blk_insert_request(host->oob_q, crq->rq, 1, crq, 0);
+       blk_insert_request(host->oob_q, crq->rq, 1, crq);
 
        return 0;
 }
index ce42889f98fbdac287a2af1d50a8c66346a5433a..685f061e69b2971484a9546de5f3e32cc7b32801 100644 (file)
@@ -8,13 +8,12 @@
  * and is not licensed separately. See file COPYING for details.
  *
  * TODO (sorted by decreasing priority)
+ *  -- Kill first_open (Al Viro fixed the block layer now)
  *  -- Do resets with usb_device_reset (needs a thread context, use khubd)
  *  -- set readonly flag for CDs, set removable flag for CF readers
  *  -- do inquiry and verify we got a disk and not a tape (for LUN mismatch)
- *  -- support pphaneuf's SDDR-75 with two LUNs (also broken capacity...)
  *  -- special case some senses, e.g. 3a/0 -> no media present, reduce retries
  *  -- verify the 13 conditions and do bulk resets
- *  -- normal pool of commands instead of cmdv[]?
  *  -- kill last_pipe and simply do two-state clearing on both pipes
  *  -- verify protocol (bulk) from USB descriptors (maybe...)
  *  -- highmem and sg
 #define US_SC_SCSI     0x06            /* Transparent */
 
 /*
+ * This many LUNs per USB device.
+ * Every one of them takes a host, see UB_MAX_HOSTS.
  */
+#define UB_MAX_LUNS   9
+
+/*
+ */
+
 #define UB_MINORS_PER_MAJOR    8
 
 #define UB_MAX_CDB_SIZE      16                /* Corresponds to Bulk */
@@ -65,7 +71,7 @@ struct bulk_cb_wrap {
        u32     Tag;                    /* unique per command id */
        __le32  DataTransferLength;     /* size of data */
        u8      Flags;                  /* direction in bit 0 */
-       u8      Lun;                    /* LUN normally 0 */
+       u8      Lun;                    /* LUN */
        u8      Length;                 /* of of the CDB */
        u8      CDB[UB_MAX_CDB_SIZE];   /* max command */
 };
@@ -168,6 +174,7 @@ struct ub_scsi_cmd {
        unsigned int len;               /* Requested length */
        // struct scatterlist sgv[UB_MAX_REQ_SG];
 
+       struct ub_lun *lun;
        void (*done)(struct ub_dev *, struct ub_scsi_cmd *);
        void *back;
 };
@@ -252,25 +259,47 @@ struct ub_scsi_cmd_queue {
 };
 
 /*
- * The UB device instance.
+ * The block device instance (one per LUN).
+ */
+struct ub_lun {
+       struct ub_dev *udev;
+       struct list_head link;
+       struct gendisk *disk;
+       int id;                         /* Host index */
+       int num;                        /* LUN number */
+       char name[16];
+
+       int changed;                    /* Media was changed */
+       int removable;
+       int readonly;
+       int first_open;                 /* Kludge. See ub_bd_open. */
+
+       /* Use Ingo's mempool if or when we have more than one command. */
+       /*
+        * Currently we never need more than one command for the whole device.
+        * However, giving every LUN a command is a cheap and automatic way
+        * to enforce fairness between them.
+        */
+       int cmda[1];
+       struct ub_scsi_cmd cmdv[1];
+
+       struct ub_capacity capacity; 
+};
+
+/*
+ * The USB device instance.
  */
 struct ub_dev {
        spinlock_t lock;
-       int id;                         /* Number among ub's */
        atomic_t poison;                /* The USB device is disconnected */
        int openc;                      /* protected by ub_lock! */
                                        /* kref is too implicit for our taste */
        unsigned int tagcnt;
-       int changed;                    /* Media was changed */
-       int removable;
-       int readonly;
-       int first_open;                 /* Kludge. See ub_bd_open. */
-       char name[8];
+       char name[12];
        struct usb_device *dev;
        struct usb_interface *intf;
 
-       struct ub_capacity capacity; 
-       struct gendisk *disk;
+       struct list_head luns;
 
        unsigned int send_bulk_pipe;    /* cached pipe values */
        unsigned int recv_bulk_pipe;
@@ -279,10 +308,6 @@ struct ub_dev {
 
        struct tasklet_struct tasklet;
 
-       /* XXX Use Ingo's mempool (once we have more than one) */
-       int cmda[1];
-       struct ub_scsi_cmd cmdv[1];
-
        struct ub_scsi_cmd_queue cmd_queue;
        struct ub_scsi_cmd top_rqs_cmd; /* REQUEST SENSE */
        unsigned char top_sense[UB_SENSE_SIZE];
@@ -301,9 +326,9 @@ struct ub_dev {
 /*
  */
 static void ub_cleanup(struct ub_dev *sc);
-static int ub_bd_rq_fn_1(struct ub_dev *sc, struct request *rq);
-static int ub_cmd_build_block(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
-    struct request *rq);
+static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq);
+static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
+    struct ub_scsi_cmd *cmd, struct request *rq);
 static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
     struct request *rq);
 static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
@@ -320,8 +345,10 @@ static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
 static int ub_submit_clear_stall(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
     int stalled_pipe);
 static void ub_top_sense_done(struct ub_dev *sc, struct ub_scsi_cmd *scmd);
-static int ub_sync_tur(struct ub_dev *sc);
-static int ub_sync_read_cap(struct ub_dev *sc, struct ub_capacity *ret);
+static int ub_sync_tur(struct ub_dev *sc, struct ub_lun *lun);
+static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun,
+    struct ub_capacity *ret);
+static int ub_probe_lun(struct ub_dev *sc, int lnum);
 
 /*
  */
@@ -342,6 +369,7 @@ MODULE_DEVICE_TABLE(usb, ub_usb_ids);
  */
 #define UB_MAX_HOSTS  26
 static char ub_hostv[UB_MAX_HOSTS];
+
 static DEFINE_SPINLOCK(ub_lock);       /* Locks globals and ->openc */
 
 /*
@@ -402,10 +430,12 @@ static void ub_cmdtr_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
        }
 }
 
-static ssize_t ub_diag_show(struct device *dev, char *page)
+static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr, char *page)
 {
        struct usb_interface *intf;
        struct ub_dev *sc;
+       struct list_head *p;
+       struct ub_lun *lun;
        int cnt;
        unsigned long flags;
        int nc, nh;
@@ -421,9 +451,15 @@ static ssize_t ub_diag_show(struct device *dev, char *page)
        spin_lock_irqsave(&sc->lock, flags);
 
        cnt += sprintf(page + cnt,
-           "qlen %d qmax %d changed %d removable %d readonly %d\n",
-           sc->cmd_queue.qlen, sc->cmd_queue.qmax,
-           sc->changed, sc->removable, sc->readonly);
+           "qlen %d qmax %d\n",
+           sc->cmd_queue.qlen, sc->cmd_queue.qmax);
+
+       list_for_each (p, &sc->luns) {
+               lun = list_entry(p, struct ub_lun, link);
+               cnt += sprintf(page + cnt,
+                   "lun %u changed %d removable %d readonly %d\n",
+                   lun->num, lun->changed, lun->removable, lun->readonly);
+       }
 
        if ((nc = sc->tr.cur + 1) == SCMD_TRACE_SZ) nc = 0;
        for (j = 0; j < SCMD_TRACE_SZ; j++) {
@@ -523,53 +559,63 @@ static void ub_put(struct ub_dev *sc)
  */
 static void ub_cleanup(struct ub_dev *sc)
 {
+       struct list_head *p;
+       struct ub_lun *lun;
        request_queue_t *q;
 
-       /* I don't think queue can be NULL. But... Stolen from sx8.c */
-       if ((q = sc->disk->queue) != NULL)
-               blk_cleanup_queue(q);
+       while (!list_empty(&sc->luns)) {
+               p = sc->luns.next;
+               lun = list_entry(p, struct ub_lun, link);
+               list_del(p);
 
-       /*
-        * If we zero disk->private_data BEFORE put_disk, we have to check
-        * for NULL all over the place in open, release, check_media and
-        * revalidate, because the block level semaphore is well inside the
-        * put_disk. But we cannot zero after the call, because *disk is gone.
-        * The sd.c is blatantly racy in this area.
-        */
-       /* disk->private_data = NULL; */
-       put_disk(sc->disk);
-       sc->disk = NULL;
+               /* I don't think queue can be NULL. But... Stolen from sx8.c */
+               if ((q = lun->disk->queue) != NULL)
+                       blk_cleanup_queue(q);
+               /*
+                * If we zero disk->private_data BEFORE put_disk, we have
+                * to check for NULL all over the place in open, release,
+                * check_media and revalidate, because the block level
+                * semaphore is well inside the put_disk.
+                * But we cannot zero after the call, because *disk is gone.
+                * The sd.c is blatantly racy in this area.
+                */
+               /* disk->private_data = NULL; */
+               put_disk(lun->disk);
+               lun->disk = NULL;
+
+               ub_id_put(lun->id);
+               kfree(lun);
+       }
 
-       ub_id_put(sc->id);
        kfree(sc);
 }
 
 /*
  * The "command allocator".
  */
-static struct ub_scsi_cmd *ub_get_cmd(struct ub_dev *sc)
+static struct ub_scsi_cmd *ub_get_cmd(struct ub_lun *lun)
 {
        struct ub_scsi_cmd *ret;
 
-       if (sc->cmda[0])
+       if (lun->cmda[0])
                return NULL;
-       ret = &sc->cmdv[0];
-       sc->cmda[0] = 1;
+       ret = &lun->cmdv[0];
+       lun->cmda[0] = 1;
        return ret;
 }
 
-static void ub_put_cmd(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
+static void ub_put_cmd(struct ub_lun *lun, struct ub_scsi_cmd *cmd)
 {
-       if (cmd != &sc->cmdv[0]) {
+       if (cmd != &lun->cmdv[0]) {
                printk(KERN_WARNING "%s: releasing a foreign cmd %p\n",
-                   sc->name, cmd);
+                   lun->name, cmd);
                return;
        }
-       if (!sc->cmda[0]) {
-               printk(KERN_WARNING "%s: releasing a free cmd\n", sc->name);
+       if (!lun->cmda[0]) {
+               printk(KERN_WARNING "%s: releasing a free cmd\n", lun->name);
                return;
        }
-       sc->cmda[0] = 0;
+       lun->cmda[0] = 0;
 }
 
 /*
@@ -630,29 +676,30 @@ static struct ub_scsi_cmd *ub_cmdq_pop(struct ub_dev *sc)
 
 static void ub_bd_rq_fn(request_queue_t *q)
 {
-       struct ub_dev *sc = q->queuedata;
+       struct ub_lun *lun = q->queuedata;
        struct request *rq;
 
        while ((rq = elv_next_request(q)) != NULL) {
-               if (ub_bd_rq_fn_1(sc, rq) != 0) {
+               if (ub_bd_rq_fn_1(lun, rq) != 0) {
                        blk_stop_queue(q);
                        break;
                }
        }
 }
 
-static int ub_bd_rq_fn_1(struct ub_dev *sc, struct request *rq)
+static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq)
 {
+       struct ub_dev *sc = lun->udev;
        struct ub_scsi_cmd *cmd;
        int rc;
 
-       if (atomic_read(&sc->poison) || sc->changed) {
+       if (atomic_read(&sc->poison) || lun->changed) {
                blkdev_dequeue_request(rq);
                ub_end_rq(rq, 0);
                return 0;
        }
 
-       if ((cmd = ub_get_cmd(sc)) == NULL)
+       if ((cmd = ub_get_cmd(lun)) == NULL)
                return -1;
        memset(cmd, 0, sizeof(struct ub_scsi_cmd));
 
@@ -661,32 +708,30 @@ static int ub_bd_rq_fn_1(struct ub_dev *sc, struct request *rq)
        if (blk_pc_request(rq)) {
                rc = ub_cmd_build_packet(sc, cmd, rq);
        } else {
-               rc = ub_cmd_build_block(sc, cmd, rq);
+               rc = ub_cmd_build_block(sc, lun, cmd, rq);
        }
        if (rc != 0) {
-               ub_put_cmd(sc, cmd);
+               ub_put_cmd(lun, cmd);
                ub_end_rq(rq, 0);
-               blk_start_queue(sc->disk->queue);
                return 0;
        }
-
        cmd->state = UB_CMDST_INIT;
+       cmd->lun = lun;
        cmd->done = ub_rw_cmd_done;
        cmd->back = rq;
 
        cmd->tag = sc->tagcnt++;
        if ((rc = ub_submit_scsi(sc, cmd)) != 0) {
-               ub_put_cmd(sc, cmd);
+               ub_put_cmd(lun, cmd);
                ub_end_rq(rq, 0);
-               blk_start_queue(sc->disk->queue);
                return 0;
        }
 
        return 0;
 }
 
-static int ub_cmd_build_block(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
-    struct request *rq)
+static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
+    struct ub_scsi_cmd *cmd, struct request *rq)
 {
        int ub_dir;
 #if 0 /* We use rq->buffer for now */
@@ -707,7 +752,7 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
        sg = &cmd->sgv[0];
        n_elem = blk_rq_map_sg(q, rq, sg);
        if (n_elem <= 0) {
-               ub_put_cmd(sc, cmd);
+               ub_put_cmd(lun, cmd);
                ub_end_rq(rq, 0);
                blk_start_queue(q);
                return 0;               /* request with no s/g entries? */
@@ -716,7 +761,7 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
        if (n_elem != 1) {              /* Paranoia */
                printk(KERN_WARNING "%s: request with %d segments\n",
                    sc->name, n_elem);
-               ub_put_cmd(sc, cmd);
+               ub_put_cmd(lun, cmd);
                ub_end_rq(rq, 0);
                blk_start_queue(q);
                return 0;
@@ -748,8 +793,8 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
         * The call to blk_queue_hardsect_size() guarantees that request
         * is aligned, but it is given in terms of 512 byte units, always.
         */
-       block = rq->sector >> sc->capacity.bshift;
-       nblks = rq->nr_sectors >> sc->capacity.bshift;
+       block = rq->sector >> lun->capacity.bshift;
+       nblks = rq->nr_sectors >> lun->capacity.bshift;
 
        cmd->cdb[0] = (ub_dir == UB_DIR_READ)? READ_10: WRITE_10;
        /* 10-byte uses 4 bytes of LBA: 2147483648KB, 2097152MB, 2048GB */
@@ -803,7 +848,8 @@ static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
 static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
 {
        struct request *rq = cmd->back;
-       struct gendisk *disk = sc->disk;
+       struct ub_lun *lun = cmd->lun;
+       struct gendisk *disk = lun->disk;
        request_queue_t *q = disk->queue;
        int uptodate;
 
@@ -818,7 +864,7 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
        else
                uptodate = 0;
 
-       ub_put_cmd(sc, cmd);
+       ub_put_cmd(lun, cmd);
        ub_end_rq(rq, uptodate);
        blk_start_queue(q);
 }
@@ -887,7 +933,7 @@ static int ub_scsi_cmd_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
        bcb->Tag = cmd->tag;            /* Endianness is not important */
        bcb->DataTransferLength = cpu_to_le32(cmd->len);
        bcb->Flags = (cmd->dir == UB_DIR_READ) ? 0x80 : 0;
-       bcb->Lun = 0;                   /* No multi-LUN yet */
+       bcb->Lun = (cmd->lun != NULL) ? cmd->lun->num : 0;
        bcb->Length = cmd->cdb_len;
 
        /* copy the command payload */
@@ -1002,9 +1048,8 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                         * The control pipe clears itself - nothing to do.
                         * XXX Might try to reset the device here and retry.
                         */
-                       printk(KERN_NOTICE "%s: "
-                           "stall on control pipe for device %u\n",
-                           sc->name, sc->dev->devnum);
+                       printk(KERN_NOTICE "%s: stall on control pipe\n",
+                           sc->name);
                        goto Bad_End;
                }
 
@@ -1025,9 +1070,8 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                         * The control pipe clears itself - nothing to do.
                         * XXX Might try to reset the device here and retry.
                         */
-                       printk(KERN_NOTICE "%s: "
-                           "stall on control pipe for device %u\n",
-                           sc->name, sc->dev->devnum);
+                       printk(KERN_NOTICE "%s: stall on control pipe\n",
+                           sc->name);
                        goto Bad_End;
                }
 
@@ -1046,9 +1090,8 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                        rc = ub_submit_clear_stall(sc, cmd, sc->last_pipe);
                        if (rc != 0) {
                                printk(KERN_NOTICE "%s: "
-                                   "unable to submit clear for device %u"
-                                   " (code %d)\n",
-                                   sc->name, sc->dev->devnum, rc);
+                                   "unable to submit clear (%d)\n",
+                                   sc->name, rc);
                                /*
                                 * This is typically ENOMEM or some other such shit.
                                 * Retrying is pointless. Just do Bad End on it...
@@ -1107,9 +1150,8 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                        rc = ub_submit_clear_stall(sc, cmd, sc->last_pipe);
                        if (rc != 0) {
                                printk(KERN_NOTICE "%s: "
-                                   "unable to submit clear for device %u"
-                                   " (code %d)\n",
-                                   sc->name, sc->dev->devnum, rc);
+                                   "unable to submit clear (%d)\n",
+                                   sc->name, rc);
                                /*
                                 * This is typically ENOMEM or some other such shit.
                                 * Retrying is pointless. Just do Bad End on it...
@@ -1140,9 +1182,8 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                        rc = ub_submit_clear_stall(sc, cmd, sc->last_pipe);
                        if (rc != 0) {
                                printk(KERN_NOTICE "%s: "
-                                   "unable to submit clear for device %u"
-                                   " (code %d)\n",
-                                   sc->name, sc->dev->devnum, rc);
+                                   "unable to submit clear (%d)\n",
+                                   sc->name, rc);
                                /*
                                 * This is typically ENOMEM or some other such shit.
                                 * Retrying is pointless. Just do Bad End on it...
@@ -1164,9 +1205,8 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                         * encounter such a thing, try to read the CSW again.
                         */
                        if (++cmd->stat_count >= 4) {
-                               printk(KERN_NOTICE "%s: "
-                                   "unable to get CSW on device %u\n",
-                                   sc->name, sc->dev->devnum);
+                               printk(KERN_NOTICE "%s: unable to get CSW\n",
+                                   sc->name);
                                goto Bad_End;
                        }
                        __ub_state_stat(sc, cmd);
@@ -1207,10 +1247,8 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                         */
                        if (++cmd->stat_count >= 4) {
                                printk(KERN_NOTICE "%s: "
-                                   "tag mismatch orig 0x%x reply 0x%x "
-                                   "on device %u\n",
-                                   sc->name, cmd->tag, bcs->Tag,
-                                   sc->dev->devnum);
+                                   "tag mismatch orig 0x%x reply 0x%x\n",
+                                   sc->name, cmd->tag, bcs->Tag);
                                goto Bad_End;
                        }
                        __ub_state_stat(sc, cmd);
@@ -1244,8 +1282,8 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
 
        } else {
                printk(KERN_WARNING "%s: "
-                   "wrong command state %d on device %u\n",
-                   sc->name, cmd->state, sc->dev->devnum);
+                   "wrong command state %d\n",
+                   sc->name, cmd->state);
                goto Bad_End;
        }
        return;
@@ -1288,7 +1326,6 @@ static void __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
 
        if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) {
                /* XXX Clear stalls */
-               printk("%s: CSW #%d submit failed (%d)\n", sc->name, cmd->tag, rc); /* P3 */
                ub_complete(&sc->work_done);
                ub_state_done(sc, cmd, rc);
                return;
@@ -1333,6 +1370,7 @@ static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
        scmd->state = UB_CMDST_INIT;
        scmd->data = sc->top_sense;
        scmd->len = UB_SENSE_SIZE;
+       scmd->lun = cmd->lun;
        scmd->done = ub_top_sense_done;
        scmd->back = cmd;
 
@@ -1411,14 +1449,14 @@ static void ub_top_sense_done(struct ub_dev *sc, struct ub_scsi_cmd *scmd)
        }
        if (cmd != scmd->back) {
                printk(KERN_WARNING "%s: "
-                   "sense done for wrong command 0x%x on device %u\n",
-                   sc->name, cmd->tag, sc->dev->devnum);
+                   "sense done for wrong command 0x%x\n",
+                   sc->name, cmd->tag);
                return;
        }
        if (cmd->state != UB_CMDST_SENSE) {
                printk(KERN_WARNING "%s: "
-                   "sense done with bad cmd state %d on device %u\n",
-                   sc->name, cmd->state, sc->dev->devnum);
+                   "sense done with bad cmd state %d\n",
+                   sc->name, cmd->state);
                return;
        }
 
@@ -1429,68 +1467,32 @@ static void ub_top_sense_done(struct ub_dev *sc, struct ub_scsi_cmd *scmd)
        ub_scsi_urb_compl(sc, cmd);
 }
 
-#if 0
-/* Determine what the maximum LUN supported is */
-int usb_stor_Bulk_max_lun(struct us_data *us)
-{
-       int result;
-
-       /* issue the command */
-       result = usb_stor_control_msg(us, us->recv_ctrl_pipe,
-                                US_BULK_GET_MAX_LUN, 
-                                USB_DIR_IN | USB_TYPE_CLASS | 
-                                USB_RECIP_INTERFACE,
-                                0, us->ifnum, us->iobuf, 1, HZ);
-
-       /* 
-        * Some devices (i.e. Iomega Zip100) need this -- apparently
-        * the bulk pipes get STALLed when the GetMaxLUN request is
-        * processed.   This is, in theory, harmless to all other devices
-        * (regardless of if they stall or not).
-        */
-       if (result < 0) {
-               usb_stor_clear_halt(us, us->recv_bulk_pipe);
-               usb_stor_clear_halt(us, us->send_bulk_pipe);
-       }
-
-       US_DEBUGP("GetMaxLUN command result is %d, data is %d\n", 
-                 result, us->iobuf[0]);
-
-       /* if we have a successful request, return the result */
-       if (result == 1)
-               return us->iobuf[0];
-
-       /* return the default -- no LUNs */
-       return 0;
-}
-#endif
-
 /*
  * This is called from a process context.
  */
-static void ub_revalidate(struct ub_dev *sc)
+static void ub_revalidate(struct ub_dev *sc, struct ub_lun *lun)
 {
 
-       sc->readonly = 0;       /* XXX Query this from the device */
+       lun->readonly = 0;      /* XXX Query this from the device */
 
-       sc->capacity.nsec = 0;
-       sc->capacity.bsize = 512;
-       sc->capacity.bshift = 0;
+       lun->capacity.nsec = 0;
+       lun->capacity.bsize = 512;
+       lun->capacity.bshift = 0;
 
-       if (ub_sync_tur(sc) != 0)
+       if (ub_sync_tur(sc, lun) != 0)
                return;                 /* Not ready */
-       sc->changed = 0;
+       lun->changed = 0;
 
-       if (ub_sync_read_cap(sc, &sc->capacity) != 0) {
+       if (ub_sync_read_cap(sc, lun, &lun->capacity) != 0) {
                /*
                 * The retry here means something is wrong, either with the
                 * device, with the transport, or with our code.
                 * We keep this because sd.c has retries for capacity.
                 */
-               if (ub_sync_read_cap(sc, &sc->capacity) != 0) {
-                       sc->capacity.nsec = 0;
-                       sc->capacity.bsize = 512;
-                       sc->capacity.bshift = 0;
+               if (ub_sync_read_cap(sc, lun, &lun->capacity) != 0) {
+                       lun->capacity.nsec = 0;
+                       lun->capacity.bsize = 512;
+                       lun->capacity.bshift = 0;
                }
        }
 }
@@ -1503,12 +1505,15 @@ static void ub_revalidate(struct ub_dev *sc)
 static int ub_bd_open(struct inode *inode, struct file *filp)
 {
        struct gendisk *disk = inode->i_bdev->bd_disk;
+       struct ub_lun *lun;
        struct ub_dev *sc;
        unsigned long flags;
        int rc;
 
-       if ((sc = disk->private_data) == NULL)
+       if ((lun = disk->private_data) == NULL)
                return -ENXIO;
+       sc = lun->udev;
+
        spin_lock_irqsave(&ub_lock, flags);
        if (atomic_read(&sc->poison)) {
                spin_unlock_irqrestore(&ub_lock, flags);
@@ -1529,15 +1534,15 @@ static int ub_bd_open(struct inode *inode, struct file *filp)
         * The bottom line is, Al Viro says that we should not allow
         * bdev->bd_invalidated to be set when doing add_disk no matter what.
         */
-       if (sc->first_open) {
-               if (sc->changed) {
-                       sc->first_open = 0;
+       if (lun->first_open) {
+               lun->first_open = 0;
+               if (lun->changed) {
                        rc = -ENOMEDIUM;
                        goto err_open;
                }
        }
 
-       if (sc->removable || sc->readonly)
+       if (lun->removable || lun->readonly)
                check_disk_change(inode->i_bdev);
 
        /*
@@ -1545,12 +1550,12 @@ static int ub_bd_open(struct inode *inode, struct file *filp)
         * under some pretty murky conditions (a failure of READ CAPACITY).
         * We may need it one day.
         */
-       if (sc->removable && sc->changed && !(filp->f_flags & O_NDELAY)) {
+       if (lun->removable && lun->changed && !(filp->f_flags & O_NDELAY)) {
                rc = -ENOMEDIUM;
                goto err_open;
        }
 
-       if (sc->readonly && (filp->f_mode & FMODE_WRITE)) {
+       if (lun->readonly && (filp->f_mode & FMODE_WRITE)) {
                rc = -EROFS;
                goto err_open;
        }
@@ -1567,7 +1572,8 @@ err_open:
 static int ub_bd_release(struct inode *inode, struct file *filp)
 {
        struct gendisk *disk = inode->i_bdev->bd_disk;
-       struct ub_dev *sc = disk->private_data;
+       struct ub_lun *lun = disk->private_data;
+       struct ub_dev *sc = lun->udev;
 
        ub_put(sc);
        return 0;
@@ -1597,20 +1603,14 @@ static int ub_bd_ioctl(struct inode *inode, struct file *filp,
  */
 static int ub_bd_revalidate(struct gendisk *disk)
 {
-       struct ub_dev *sc = disk->private_data;
-
-       ub_revalidate(sc);
-       /* This is pretty much a long term P3 */
-       if (!atomic_read(&sc->poison)) {                /* Cover sc->dev */
-               printk(KERN_INFO "%s: device %u capacity nsec %ld bsize %u\n",
-                   sc->name, sc->dev->devnum,
-                   sc->capacity.nsec, sc->capacity.bsize);
-       }
+       struct ub_lun *lun = disk->private_data;
+
+       ub_revalidate(lun->udev, lun);
 
        /* XXX Support sector size switching like in sr.c */
-       blk_queue_hardsect_size(disk->queue, sc->capacity.bsize);
-       set_capacity(disk, sc->capacity.nsec);
-       // set_disk_ro(sdkp->disk, sc->readonly);
+       blk_queue_hardsect_size(disk->queue, lun->capacity.bsize);
+       set_capacity(disk, lun->capacity.nsec);
+       // set_disk_ro(sdkp->disk, lun->readonly);
 
        return 0;
 }
@@ -1626,9 +1626,9 @@ static int ub_bd_revalidate(struct gendisk *disk)
  */
 static int ub_bd_media_changed(struct gendisk *disk)
 {
-       struct ub_dev *sc = disk->private_data;
+       struct ub_lun *lun = disk->private_data;
 
-       if (!sc->removable)
+       if (!lun->removable)
                return 0;
 
        /*
@@ -1640,12 +1640,12 @@ static int ub_bd_media_changed(struct gendisk *disk)
         * will fail, then block layer discards the data. Since we never
         * spin drives up, such devices simply cannot be used with ub anyway.
         */
-       if (ub_sync_tur(sc) != 0) {
-               sc->changed = 1;
+       if (ub_sync_tur(lun->udev, lun) != 0) {
+               lun->changed = 1;
                return 1;
        }
 
-       return sc->changed;
+       return lun->changed;
 }
 
 static struct block_device_operations ub_bd_fops = {
@@ -1669,7 +1669,7 @@ static void ub_probe_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
 /*
  * Test if the device has a check condition on it, synchronously.
  */
-static int ub_sync_tur(struct ub_dev *sc)
+static int ub_sync_tur(struct ub_dev *sc, struct ub_lun *lun)
 {
        struct ub_scsi_cmd *cmd;
        enum { ALLOC_SIZE = sizeof(struct ub_scsi_cmd) };
@@ -1688,6 +1688,7 @@ static int ub_sync_tur(struct ub_dev *sc)
        cmd->cdb_len = 6;
        cmd->dir = UB_DIR_NONE;
        cmd->state = UB_CMDST_INIT;
+       cmd->lun = lun;                 /* This may be NULL, but that's ok */
        cmd->done = ub_probe_done;
        cmd->back = &compl;
 
@@ -1718,7 +1719,8 @@ err_alloc:
 /*
  * Read the SCSI capacity synchronously (for probing).
  */
-static int ub_sync_read_cap(struct ub_dev *sc, struct ub_capacity *ret)
+static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun,
+    struct ub_capacity *ret)
 {
        struct ub_scsi_cmd *cmd;
        char *p;
@@ -1743,6 +1745,7 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_capacity *ret)
        cmd->state = UB_CMDST_INIT;
        cmd->data = p;
        cmd->len = 8;
+       cmd->lun = lun;
        cmd->done = ub_probe_done;
        cmd->back = &compl;
 
@@ -1811,6 +1814,90 @@ static void ub_probe_timeout(unsigned long arg)
        complete(cop);
 }
 
+/*
+ * Get number of LUNs by the way of Bulk GetMaxLUN command.
+ */
+static int ub_sync_getmaxlun(struct ub_dev *sc)
+{
+       int ifnum = sc->intf->cur_altsetting->desc.bInterfaceNumber;
+       unsigned char *p;
+       enum { ALLOC_SIZE = 1 };
+       struct usb_ctrlrequest *cr;
+       struct completion compl;
+       struct timer_list timer;
+       int nluns;
+       int rc;
+
+       init_completion(&compl);
+
+       rc = -ENOMEM;
+       if ((p = kmalloc(ALLOC_SIZE, GFP_KERNEL)) == NULL)
+               goto err_alloc;
+       *p = 55;
+
+       cr = &sc->work_cr;
+       cr->bRequestType = USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE;
+       cr->bRequest = US_BULK_GET_MAX_LUN;
+       cr->wValue = cpu_to_le16(0);
+       cr->wIndex = cpu_to_le16(ifnum);
+       cr->wLength = cpu_to_le16(1);
+
+       usb_fill_control_urb(&sc->work_urb, sc->dev, sc->recv_ctrl_pipe,
+           (unsigned char*) cr, p, 1, ub_probe_urb_complete, &compl);
+       sc->work_urb.transfer_flags = 0;
+       sc->work_urb.actual_length = 0;
+       sc->work_urb.error_count = 0;
+       sc->work_urb.status = 0;
+
+       if ((rc = usb_submit_urb(&sc->work_urb, GFP_KERNEL)) != 0) {
+               if (rc == -EPIPE) {
+                       printk("%s: Stall at GetMaxLUN, using 1 LUN\n",
+                            sc->name); /* P3 */
+               } else {
+                       printk(KERN_WARNING
+                            "%s: Unable to submit GetMaxLUN (%d)\n",
+                            sc->name, rc);
+               }
+               goto err_submit;
+       }
+
+       init_timer(&timer);
+       timer.function = ub_probe_timeout;
+       timer.data = (unsigned long) &compl;
+       timer.expires = jiffies + UB_CTRL_TIMEOUT;
+       add_timer(&timer);
+
+       wait_for_completion(&compl);
+
+       del_timer_sync(&timer);
+       usb_kill_urb(&sc->work_urb);
+
+       if (sc->work_urb.actual_length != 1) {
+               printk("%s: GetMaxLUN returned %d bytes\n", sc->name,
+                   sc->work_urb.actual_length); /* P3 */
+               nluns = 0;
+       } else {
+               if ((nluns = *p) == 55) {
+                       nluns = 0;
+               } else {
+                       /* GetMaxLUN returns the maximum LUN number */
+                       nluns += 1;
+                       if (nluns > UB_MAX_LUNS)
+                               nluns = UB_MAX_LUNS;
+               }
+               printk("%s: GetMaxLUN returned %d, using %d LUNs\n", sc->name,
+                   *p, nluns); /* P3 */
+       }
+
+       kfree(p);
+       return nluns;
+
+err_submit:
+       kfree(p);
+err_alloc:
+       return rc;
+}
+
 /*
  * Clear initial stalls.
  */
@@ -1897,8 +1984,8 @@ static int ub_get_pipes(struct ub_dev *sc, struct usb_device *dev,
        }
 
        if (ep_in == NULL || ep_out == NULL) {
-               printk(KERN_NOTICE "%s: device %u failed endpoint check\n",
-                   sc->name, sc->dev->devnum);
+               printk(KERN_NOTICE "%s: failed endpoint check\n",
+                   sc->name);
                return -EIO;
        }
 
@@ -1921,8 +2008,7 @@ static int ub_probe(struct usb_interface *intf,
     const struct usb_device_id *dev_id)
 {
        struct ub_dev *sc;
-       request_queue_t *q;
-       struct gendisk *disk;
+       int nluns;
        int rc;
        int i;
 
@@ -1931,6 +2017,7 @@ static int ub_probe(struct usb_interface *intf,
                goto err_core;
        memset(sc, 0, sizeof(struct ub_dev));
        spin_lock_init(&sc->lock);
+       INIT_LIST_HEAD(&sc->luns);
        usb_init_urb(&sc->work_urb);
        tasklet_init(&sc->tasklet, ub_scsi_action, (unsigned long)sc);
        atomic_set(&sc->poison, 0);
@@ -1942,19 +2029,16 @@ static int ub_probe(struct usb_interface *intf,
        ub_init_completion(&sc->work_done);
        sc->work_done.done = 1;         /* A little yuk, but oh well... */
 
-       rc = -ENOSR;
-       if ((sc->id = ub_id_get()) == -1)
-               goto err_id;
-       snprintf(sc->name, 8, DRV_NAME "%c", sc->id + 'a');
-
        sc->dev = interface_to_usbdev(intf);
        sc->intf = intf;
        // sc->ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
-
        usb_set_intfdata(intf, sc);
        usb_get_dev(sc->dev);
        // usb_get_intf(sc->intf);      /* Do we need this? */
 
+       snprintf(sc->name, 12, DRV_NAME "(%d.%d)",
+           sc->dev->bus->busnum, sc->dev->devnum);
+
        /* XXX Verify that we can handle the device (from descriptors) */
 
        ub_get_pipes(sc, sc->dev, intf);
@@ -1992,35 +2076,88 @@ static int ub_probe(struct usb_interface *intf,
         * In any case it's not our business how revaliadation is implemented.
         */
        for (i = 0; i < 3; i++) {       /* Retries for benh's key */
-               if ((rc = ub_sync_tur(sc)) <= 0) break;
+               if ((rc = ub_sync_tur(sc, NULL)) <= 0) break;
                if (rc != 0x6) break;
                msleep(10);
        }
 
-       sc->removable = 1;              /* XXX Query this from the device */
-       sc->changed = 1;                /* ub_revalidate clears only */
-       sc->first_open = 1;
+       nluns = 1;
+       for (i = 0; i < 3; i++) {
+               if ((rc = ub_sync_getmaxlun(sc)) < 0) {
+                       /* 
+                        * Some devices (i.e. Iomega Zip100) need this --
+                        * apparently the bulk pipes get STALLed when the
+                        * GetMaxLUN request is processed.
+                        * XXX I have a ZIP-100, verify it does this.
+                        */
+                       if (rc == -EPIPE) {
+                               ub_probe_clear_stall(sc, sc->recv_bulk_pipe);
+                               ub_probe_clear_stall(sc, sc->send_bulk_pipe);
+                       }
+                       break;
+               }
+               if (rc != 0) {
+                       nluns = rc;
+                       break;
+               }
+               msleep(100);
+       }
 
-       ub_revalidate(sc);
-       /* This is pretty much a long term P3 */
-       printk(KERN_INFO "%s: device %u capacity nsec %ld bsize %u\n",
-           sc->name, sc->dev->devnum, sc->capacity.nsec, sc->capacity.bsize);
+       for (i = 0; i < nluns; i++) {
+               ub_probe_lun(sc, i);
+       }
+       return 0;
+
+       /* device_remove_file(&sc->intf->dev, &dev_attr_diag); */
+err_diag:
+       usb_set_intfdata(intf, NULL);
+       // usb_put_intf(sc->intf);
+       usb_put_dev(sc->dev);
+       kfree(sc);
+err_core:
+       return rc;
+}
+
+static int ub_probe_lun(struct ub_dev *sc, int lnum)
+{
+       struct ub_lun *lun;
+       request_queue_t *q;
+       struct gendisk *disk;
+       int rc;
+
+       rc = -ENOMEM;
+       if ((lun = kmalloc(sizeof(struct ub_lun), GFP_KERNEL)) == NULL)
+               goto err_alloc;
+       memset(lun, 0, sizeof(struct ub_lun));
+       lun->num = lnum;
+
+       rc = -ENOSR;
+       if ((lun->id = ub_id_get()) == -1)
+               goto err_id;
+
+       lun->udev = sc;
+       list_add(&lun->link, &sc->luns);
+
+       snprintf(lun->name, 16, DRV_NAME "%c(%d.%d.%d)",
+           lun->id + 'a', sc->dev->bus->busnum, sc->dev->devnum, lun->num);
+
+       lun->removable = 1;             /* XXX Query this from the device */
+       lun->changed = 1;               /* ub_revalidate clears only */
+       lun->first_open = 1;
+       ub_revalidate(sc, lun);
 
-       /*
-        * Just one disk per sc currently, but maybe more.
-        */
        rc = -ENOMEM;
        if ((disk = alloc_disk(UB_MINORS_PER_MAJOR)) == NULL)
                goto err_diskalloc;
 
-       sc->disk = disk;
-       sprintf(disk->disk_name, DRV_NAME "%c", sc->id + 'a');
-       sprintf(disk->devfs_name, DEVFS_NAME "/%c", sc->id + 'a');
+       lun->disk = disk;
+       sprintf(disk->disk_name, DRV_NAME "%c", lun->id + 'a');
+       sprintf(disk->devfs_name, DEVFS_NAME "/%c", lun->id + 'a');
        disk->major = UB_MAJOR;
-       disk->first_minor = sc->id * UB_MINORS_PER_MAJOR;
+       disk->first_minor = lun->id * UB_MINORS_PER_MAJOR;
        disk->fops = &ub_bd_fops;
-       disk->private_data = sc;
-       disk->driverfs_dev = &intf->dev;
+       disk->private_data = lun;
+       disk->driverfs_dev = &sc->intf->dev;    /* XXX Many to one ok? */
 
        rc = -ENOMEM;
        if ((q = blk_init_queue(ub_bd_rq_fn, &sc->lock)) == NULL)
@@ -2028,28 +2165,17 @@ static int ub_probe(struct usb_interface *intf,
 
        disk->queue = q;
 
-        // blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask);
+       blk_queue_bounce_limit(q, BLK_BOUNCE_HIGH);
        blk_queue_max_hw_segments(q, UB_MAX_REQ_SG);
        blk_queue_max_phys_segments(q, UB_MAX_REQ_SG);
-       // blk_queue_segment_boundary(q, CARM_SG_BOUNDARY);
+       blk_queue_segment_boundary(q, 0xffffffff);      /* Dubious. */
        blk_queue_max_sectors(q, UB_MAX_SECTORS);
-       blk_queue_hardsect_size(q, sc->capacity.bsize);
-
-       /*
-        * This is a serious infraction, caused by a deficiency in the
-        * USB sg interface (usb_sg_wait()). We plan to remove this once
-        * we get mileage on the driver and can justify a change to USB API.
-        * See blk_queue_bounce_limit() to understand this part.
-        *
-        * XXX And I still need to be aware of the DMA mask in the HC.
-        */
-       q->bounce_pfn = blk_max_low_pfn;
-       q->bounce_gfp = GFP_NOIO;
+       blk_queue_hardsect_size(q, lun->capacity.bsize);
 
-       q->queuedata = sc;
+       q->queuedata = lun;
 
-       set_capacity(disk, sc->capacity.nsec);
-       if (sc->removable)
+       set_capacity(disk, lun->capacity.nsec);
+       if (lun->removable)
                disk->flags |= GENHD_FL_REMOVABLE;
 
        add_disk(disk);
@@ -2059,22 +2185,20 @@ static int ub_probe(struct usb_interface *intf,
 err_blkqinit:
        put_disk(disk);
 err_diskalloc:
-       device_remove_file(&sc->intf->dev, &dev_attr_diag);
-err_diag:
-       usb_set_intfdata(intf, NULL);
-       // usb_put_intf(sc->intf);
-       usb_put_dev(sc->dev);
-       ub_id_put(sc->id);
+       list_del(&lun->link);
+       ub_id_put(lun->id);
 err_id:
-       kfree(sc);
-err_core:
+       kfree(lun);
+err_alloc:
        return rc;
 }
 
 static void ub_disconnect(struct usb_interface *intf)
 {
        struct ub_dev *sc = usb_get_intfdata(intf);
-       struct gendisk *disk = sc->disk;
+       struct list_head *p;
+       struct ub_lun *lun;
+       struct gendisk *disk;
        unsigned long flags;
 
        /*
@@ -2124,14 +2248,18 @@ static void ub_disconnect(struct usb_interface *intf)
        /*
         * Unregister the upper layer.
         */
-       if (disk->flags & GENHD_FL_UP)
-               del_gendisk(disk);
-       /*
-        * I wish I could do:
-        *    set_bit(QUEUE_FLAG_DEAD, &q->queue_flags);
-        * As it is, we rely on our internal poisoning and let
-        * the upper levels to spin furiously failing all the I/O.
-        */
+       list_for_each (p, &sc->luns) {
+               lun = list_entry(p, struct ub_lun, link);
+               disk = lun->disk;
+               if (disk->flags & GENHD_FL_UP)
+                       del_gendisk(disk);
+               /*
+                * I wish I could do:
+                *    set_bit(QUEUE_FLAG_DEAD, &q->queue_flags);
+                * As it is, we rely on our internal poisoning and let
+                * the upper levels to spin furiously failing all the I/O.
+                */
+       }
 
        /*
         * Taking a lock on a structure which is about to be freed
@@ -2182,8 +2310,8 @@ static int __init ub_init(void)
 {
        int rc;
 
-       /* P3 */ printk("ub: sizeof ub_scsi_cmd %zu ub_dev %zu\n",
-                       sizeof(struct ub_scsi_cmd), sizeof(struct ub_dev));
+       /* P3 */ printk("ub: sizeof ub_scsi_cmd %zu ub_dev %zu ub_lun %zu\n",
+                       sizeof(struct ub_scsi_cmd), sizeof(struct ub_dev), sizeof(struct ub_lun));
 
        if ((rc = register_blkdev(UB_MAJOR, DRV_NAME)) != 0)
                goto err_regblkdev;
index fcca26c89bbccfa5803680bc0b5b5d417ced3b44..38dd9ffbe8bcc147cc2174e3965870ab5a9aba73 100644 (file)
@@ -488,6 +488,20 @@ static int viocd_packet(struct cdrom_device_info *cdi,
                                         & (CDC_DVD_RAM | CDC_RAM)) != 0;
                }
                break;
+       case GPCMD_GET_CONFIGURATION:
+               if (cgc->cmd[3] == CDF_RWRT) {
+                       struct rwrt_feature_desc *rfd = (struct rwrt_feature_desc *)(cgc->buffer + sizeof(struct feature_header));
+
+                       if ((buflen >=
+                            (sizeof(struct feature_header) + sizeof(*rfd))) &&
+                           (cdi->ops->capability & ~cdi->mask
+                            & (CDC_DVD_RAM | CDC_RAM))) {
+                               rfd->feature_code = cpu_to_be16(CDF_RWRT);
+                               rfd->curr = 1;
+                               ret = 0;
+                       }
+               }
+               break;
        default:
                if (cgc->sense) {
                        /* indicate Unknown code */
index 5ed6515ae01fe0fee127d23fa18717b688a7eb24..7ccf871d3c9dd77178fa9ca46fb3e5def6c33a0e 100644 (file)
@@ -929,6 +929,10 @@ config SCx200_GPIO
 
          If compiled as a module, it will be called scx200_gpio.
 
+config GPIO_VR41XX
+       tristate "NEC VR4100 series General-purpose I/O Unit support"
+       depends on CPU_VR41XX
+
 config RAW_DRIVER
        tristate "RAW driver (/dev/raw/rawN) (OBSOLETE)"
        help
index e3f5c32aac55d24312054b1a0bc32d8c2d84e4df..1aff819f3832d33f11fc9a60a21bf2b30d847b30 100644 (file)
@@ -80,6 +80,7 @@ obj-$(CONFIG_PPDEV) += ppdev.o
 obj-$(CONFIG_NWBUTTON) += nwbutton.o
 obj-$(CONFIG_NWFLASH) += nwflash.o
 obj-$(CONFIG_SCx200_GPIO) += scx200_gpio.o
+obj-$(CONFIG_GPIO_VR41XX) += vr41xx_giu.o
 obj-$(CONFIG_TANBAC_TB0219) += tb0219.o
 
 obj-$(CONFIG_WATCHDOG) += watchdog/
index ad9c11391d81112409b2aaf27549cb5d766e2219..c1fe013c64f34c31c1d9b9cceded9d0d2b51ad08 100644 (file)
@@ -278,6 +278,8 @@ void agp3_generic_cleanup(void);
 #define AGP_GENERIC_SIZES_ENTRIES 11
 extern struct aper_size_info_16 agp3_generic_sizes[];
 
+#define virt_to_gart(x) (phys_to_gart(virt_to_phys(x)))
+#define gart_to_virt(x) (phys_to_virt(gart_to_phys(x)))
 
 extern int agp_off;
 extern int agp_try_unsupported_boot;
index 0212febda654b06da557ec331e3c4c4893c9bfab..9c9c9c2247cecfe8c48d0607e8a5d5a0b5f0921f 100644 (file)
@@ -150,7 +150,7 @@ static void *m1541_alloc_page(struct agp_bridge_data *bridge)
        pci_read_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, &temp);
        pci_write_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL,
                        (((temp & ALI_CACHE_FLUSH_ADDR_MASK) |
-                         virt_to_phys(addr)) | ALI_CACHE_FLUSH_EN ));
+                         virt_to_gart(addr)) | ALI_CACHE_FLUSH_EN ));
        return addr;
 }
 
@@ -174,7 +174,7 @@ static void m1541_destroy_page(void * addr)
        pci_read_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, &temp);
        pci_write_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL,
                        (((temp & ALI_CACHE_FLUSH_ADDR_MASK) |
-                         virt_to_phys(addr)) | ALI_CACHE_FLUSH_EN));
+                         virt_to_gart(addr)) | ALI_CACHE_FLUSH_EN));
        agp_generic_destroy_page(addr);
 }
 
index e62a3c2c44a9b891c5dcdb2fa002cd0a56276c62..3a41672e4d6682112f19a19ee8ceae2752984be0 100644 (file)
@@ -43,7 +43,7 @@ static int amd_create_page_map(struct amd_page_map *page_map)
 
        SetPageReserved(virt_to_page(page_map->real));
        global_cache_flush();
-       page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real),
+       page_map->remapped = ioremap_nocache(virt_to_gart(page_map->real),
                                            PAGE_SIZE);
        if (page_map->remapped == NULL) {
                ClearPageReserved(virt_to_page(page_map->real));
@@ -154,7 +154,7 @@ static int amd_create_gatt_table(struct agp_bridge_data *bridge)
 
        agp_bridge->gatt_table_real = (u32 *)page_dir.real;
        agp_bridge->gatt_table = (u32 __iomem *)page_dir.remapped;
-       agp_bridge->gatt_bus_addr = virt_to_phys(page_dir.real);
+       agp_bridge->gatt_bus_addr = virt_to_gart(page_dir.real);
 
        /* Get the address for the gart region.
         * This is a bus address even on the alpha, b/c its
@@ -167,7 +167,7 @@ static int amd_create_gatt_table(struct agp_bridge_data *bridge)
 
        /* Calculate the agp offset */
        for (i = 0; i < value->num_entries / 1024; i++, addr += 0x00400000) {
-               writel(virt_to_phys(amd_irongate_private.gatt_pages[i]->real) | 1,
+               writel(virt_to_gart(amd_irongate_private.gatt_pages[i]->real) | 1,
                        page_dir.remapped+GET_PAGE_DIR_OFF(addr));
                readl(page_dir.remapped+GET_PAGE_DIR_OFF(addr));        /* PCI Posting. */
        }
index 399c042f68f04f0634ae7375f3917d1f1475edee..1407945a5892887565219b6594dde1444a6e30ea 100644 (file)
@@ -219,7 +219,7 @@ static struct aper_size_info_32 amd_8151_sizes[7] =
 
 static int amd_8151_configure(void)
 {
-       unsigned long gatt_bus = virt_to_phys(agp_bridge->gatt_table_real);
+       unsigned long gatt_bus = virt_to_gart(agp_bridge->gatt_table_real);
 
        /* Configure AGP regs in each x86-64 host bridge. */
        for_each_nb() {
@@ -591,7 +591,7 @@ static void __devexit agp_amd64_remove(struct pci_dev *pdev)
 {
        struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
 
-       release_mem_region(virt_to_phys(bridge->gatt_table_real),
+       release_mem_region(virt_to_gart(bridge->gatt_table_real),
                           amd64_aperture_sizes[bridge->aperture_size_idx].size);
        agp_remove_bridge(bridge);
        agp_put_bridge(bridge);
index a65f8827c2831d40f33e0baf5970211e5bba07d9..e572ced9100aeb8d78fc9bdf5379952ae3ff3905 100644 (file)
@@ -61,7 +61,7 @@ static int ati_create_page_map(ati_page_map *page_map)
 
        SetPageReserved(virt_to_page(page_map->real));
        err = map_page_into_agp(virt_to_page(page_map->real));
-       page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real),
+       page_map->remapped = ioremap_nocache(virt_to_gart(page_map->real),
                                            PAGE_SIZE);
        if (page_map->remapped == NULL || err) {
                ClearPageReserved(virt_to_page(page_map->real));
@@ -343,7 +343,7 @@ static int ati_create_gatt_table(struct agp_bridge_data *bridge)
 
        agp_bridge->gatt_table_real = (u32 *)page_dir.real;
        agp_bridge->gatt_table = (u32 __iomem *) page_dir.remapped;
-       agp_bridge->gatt_bus_addr = virt_to_bus(page_dir.real);
+       agp_bridge->gatt_bus_addr = virt_to_gart(page_dir.real);
 
        /* Write out the size register */
        current_size = A_SIZE_LVL2(agp_bridge->current_size);
@@ -373,7 +373,7 @@ static int ati_create_gatt_table(struct agp_bridge_data *bridge)
 
        /* Calculate the agp offset */
        for(i = 0; i < value->num_entries / 1024; i++, addr += 0x00400000) {
-               writel(virt_to_bus(ati_generic_private.gatt_pages[i]->real) | 1,
+               writel(virt_to_gart(ati_generic_private.gatt_pages[i]->real) | 1,
                        page_dir.remapped+GET_PAGE_DIR_OFF(addr));
                readl(page_dir.remapped+GET_PAGE_DIR_OFF(addr));        /* PCI Posting. */
        }
index 2f3dfb63bdc6518742ebdbd08e9f88ae800974d8..4d4e602fdc7e7cfa326000b84135583ed866296d 100644 (file)
@@ -148,7 +148,7 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
                        return -ENOMEM;
                }
 
-               bridge->scratch_page_real = virt_to_phys(addr);
+               bridge->scratch_page_real = virt_to_gart(addr);
                bridge->scratch_page =
                    bridge->driver->mask_memory(bridge, bridge->scratch_page_real, 0);
        }
@@ -189,7 +189,7 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
 err_out:
        if (bridge->driver->needs_scratch_page)
                bridge->driver->agp_destroy_page(
-                               phys_to_virt(bridge->scratch_page_real));
+                               gart_to_virt(bridge->scratch_page_real));
        if (got_gatt)
                bridge->driver->free_gatt_table(bridge);
        if (got_keylist) {
@@ -214,7 +214,7 @@ static void agp_backend_cleanup(struct agp_bridge_data *bridge)
        if (bridge->driver->agp_destroy_page &&
            bridge->driver->needs_scratch_page)
                bridge->driver->agp_destroy_page(
-                               phys_to_virt(bridge->scratch_page_real));
+                               gart_to_virt(bridge->scratch_page_real));
 }
 
 /* When we remove the global variable agp_bridge from all drivers
index 1383c3165ea1942143ad8f1fa18872cf78b982d0..ac19fdcd21c1c7583246256edba92157b42d278e 100644 (file)
@@ -219,7 +219,7 @@ static int efficeon_create_gatt_table(struct agp_bridge_data *bridge)
 
                efficeon_private.l1_table[index] = page;
 
-               value = __pa(page) | pati | present | index;
+               value = virt_to_gart(page) | pati | present | index;
 
                pci_write_config_dword(agp_bridge->dev,
                        EFFICEON_ATTPAGE, value);
index c321a924e38a8241e7d9c9cc2e0927a2bfc384ce..f0079e991bdc4ffaf95c787e50bd9618a848e225 100644 (file)
@@ -153,7 +153,7 @@ void agp_free_memory(struct agp_memory *curr)
        }
        if (curr->page_count != 0) {
                for (i = 0; i < curr->page_count; i++) {
-                       curr->bridge->driver->agp_destroy_page(phys_to_virt(curr->memory[i]));
+                       curr->bridge->driver->agp_destroy_page(gart_to_virt(curr->memory[i]));
                }
        }
        agp_free_key(curr->key);
@@ -209,7 +209,7 @@ struct agp_memory *agp_allocate_memory(struct agp_bridge_data *bridge,
                        agp_free_memory(new);
                        return NULL;
                }
-               new->memory[i] = virt_to_phys(addr);
+               new->memory[i] = virt_to_gart(addr);
                new->page_count++;
        }
        new->bridge = bridge;
@@ -295,19 +295,6 @@ int agp_num_entries(void)
 EXPORT_SYMBOL_GPL(agp_num_entries);
 
 
-static int check_bridge_mode(struct pci_dev *dev)
-{
-       u32 agp3;
-       u8 cap_ptr;
-
-       cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
-       pci_read_config_dword(dev, cap_ptr+AGPSTAT, &agp3);
-       if (agp3 & AGPSTAT_MODE_3_0)
-               return 1;
-       return 0;
-}
-
-
 /**
  *     agp_copy_info  -  copy bridge state information
  *
@@ -328,7 +315,7 @@ int agp_copy_info(struct agp_bridge_data *bridge, struct agp_kern_info *info)
        info->version.minor = bridge->version->minor;
        info->chipset = SUPPORTED;
        info->device = bridge->dev;
-       if (check_bridge_mode(bridge->dev))
+       if (bridge->mode & AGPSTAT_MODE_3_0)
                info->mode = bridge->mode & ~AGP3_RESERVED_MASK;
        else
                info->mode = bridge->mode & ~AGP2_RESERVED_MASK;
@@ -661,7 +648,7 @@ u32 agp_collect_device_status(struct agp_bridge_data *bridge, u32 requested_mode
                bridge_agpstat &= ~AGPSTAT_FW;
 
        /* Check to see if we are operating in 3.0 mode */
-       if (check_bridge_mode(agp_bridge->dev))
+       if (agp_bridge->mode & AGPSTAT_MODE_3_0)
                agp_v3_parse_one(&requested_mode, &bridge_agpstat, &vga_agpstat);
        else
                agp_v2_parse_one(&requested_mode, &bridge_agpstat, &vga_agpstat);
@@ -732,7 +719,7 @@ void agp_generic_enable(struct agp_bridge_data *bridge, u32 requested_mode)
 
        /* Do AGP version specific frobbing. */
        if (bridge->major_version >= 3) {
-               if (check_bridge_mode(bridge->dev)) {
+               if (bridge->mode & AGPSTAT_MODE_3_0) {
                        /* If we have 3.5, we can do the isoch stuff. */
                        if (bridge->minor_version >= 5)
                                agp_3_5_enable(bridge);
@@ -806,8 +793,7 @@ int agp_generic_create_gatt_table(struct agp_bridge_data *bridge)
                                break;
                        }
 
-                       table = (char *) __get_free_pages(GFP_KERNEL,
-                                                         page_order);
+                       table = alloc_gatt_pages(page_order);
 
                        if (table == NULL) {
                                i++;
@@ -838,7 +824,7 @@ int agp_generic_create_gatt_table(struct agp_bridge_data *bridge)
                size = ((struct aper_size_info_fixed *) temp)->size;
                page_order = ((struct aper_size_info_fixed *) temp)->page_order;
                num_entries = ((struct aper_size_info_fixed *) temp)->num_entries;
-               table = (char *) __get_free_pages(GFP_KERNEL, page_order);
+               table = alloc_gatt_pages(page_order);
        }
 
        if (table == NULL)
@@ -853,7 +839,7 @@ int agp_generic_create_gatt_table(struct agp_bridge_data *bridge)
        agp_gatt_table = (void *)table;
 
        bridge->driver->cache_flush();
-       bridge->gatt_table = ioremap_nocache(virt_to_phys(table),
+       bridge->gatt_table = ioremap_nocache(virt_to_gart(table),
                                        (PAGE_SIZE * (1 << page_order)));
        bridge->driver->cache_flush();
 
@@ -861,11 +847,11 @@ int agp_generic_create_gatt_table(struct agp_bridge_data *bridge)
                for (page = virt_to_page(table); page <= virt_to_page(table_end); page++)
                        ClearPageReserved(page);
 
-               free_pages((unsigned long) table, page_order);
+               free_gatt_pages(table, page_order);
 
                return -ENOMEM;
        }
-       bridge->gatt_bus_addr = virt_to_phys(bridge->gatt_table_real);
+       bridge->gatt_bus_addr = virt_to_gart(bridge->gatt_table_real);
 
        /* AK: bogus, should encode addresses > 4GB */
        for (i = 0; i < num_entries; i++) {
@@ -919,7 +905,7 @@ int agp_generic_free_gatt_table(struct agp_bridge_data *bridge)
        for (page = virt_to_page(table); page <= virt_to_page(table_end); page++)
                ClearPageReserved(page);
 
-       free_pages((unsigned long) bridge->gatt_table_real, page_order);
+       free_gatt_pages(bridge->gatt_table_real, page_order);
 
        agp_gatt_table = NULL;
        bridge->gatt_table = NULL;
index 6052bfa04c728c5a7373597d81137635a3ed71ac..99762b6c19aea2fdc82119d44f28dde30479f969 100644 (file)
@@ -110,7 +110,7 @@ static int __init hp_zx1_ioc_shared(void)
        hp->gart_size = HP_ZX1_GART_SIZE;
        hp->gatt_entries = hp->gart_size / hp->io_page_size;
 
-       hp->io_pdir = phys_to_virt(readq(hp->ioc_regs+HP_ZX1_PDIR_BASE));
+       hp->io_pdir = gart_to_virt(readq(hp->ioc_regs+HP_ZX1_PDIR_BASE));
        hp->gatt = &hp->io_pdir[HP_ZX1_IOVA_TO_PDIR(hp->gart_base)];
 
        if (hp->gatt[0] != HP_ZX1_SBA_IOMMU_COOKIE) {
@@ -248,7 +248,7 @@ hp_zx1_configure (void)
        agp_bridge->mode = readl(hp->lba_regs+hp->lba_cap_offset+PCI_AGP_STATUS);
 
        if (hp->io_pdir_owner) {
-               writel(virt_to_phys(hp->io_pdir), hp->ioc_regs+HP_ZX1_PDIR_BASE);
+               writel(virt_to_gart(hp->io_pdir), hp->ioc_regs+HP_ZX1_PDIR_BASE);
                readl(hp->ioc_regs+HP_ZX1_PDIR_BASE);
                writel(hp->io_tlb_ps, hp->ioc_regs+HP_ZX1_TCNFG);
                readl(hp->ioc_regs+HP_ZX1_TCNFG);
index adbea896c0d2e73f0ee6ab5d51c40fa17aedf47d..94943298c03eb42056d00ba73875147bd40b7e24 100644 (file)
@@ -372,7 +372,7 @@ static int i460_alloc_large_page (struct lp_desc *lp)
        }
        memset(lp->alloced_map, 0, map_size);
 
-       lp->paddr = virt_to_phys(lpage);
+       lp->paddr = virt_to_gart(lpage);
        lp->refcount = 0;
        atomic_add(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp);
        return 0;
@@ -383,7 +383,7 @@ static void i460_free_large_page (struct lp_desc *lp)
        kfree(lp->alloced_map);
        lp->alloced_map = NULL;
 
-       free_pages((unsigned long) phys_to_virt(lp->paddr), I460_IO_PAGE_SHIFT - PAGE_SHIFT);
+       free_pages((unsigned long) gart_to_virt(lp->paddr), I460_IO_PAGE_SHIFT - PAGE_SHIFT);
        atomic_sub(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp);
 }
 
index 8c7d727432bb5b02c25fa22467de24cbd52ef300..51266d6b4d78af9bf138f52dbbdf6f43413ac0c7 100644 (file)
@@ -286,7 +286,7 @@ static struct agp_memory *alloc_agpphysmem_i8xx(size_t pg_count, int type)
        if (new == NULL)
                return NULL;
 
-       new->memory[0] = virt_to_phys(addr);
+       new->memory[0] = virt_to_gart(addr);
        if (pg_count == 4) {
                /* kludge to get 4 physical pages for ARGB cursor */
                new->memory[1] = new->memory[0] + PAGE_SIZE;
@@ -329,10 +329,10 @@ static void intel_i810_free_by_type(struct agp_memory *curr)
        agp_free_key(curr->key);
        if(curr->type == AGP_PHYS_MEMORY) {
                if (curr->page_count == 4)
-                       i8xx_destroy_pages(phys_to_virt(curr->memory[0]));
+                       i8xx_destroy_pages(gart_to_virt(curr->memory[0]));
                else
                        agp_bridge->driver->agp_destroy_page(
-                                phys_to_virt(curr->memory[0]));
+                                gart_to_virt(curr->memory[0]));
                vfree(curr->memory);
        }
        kfree(curr);
@@ -418,7 +418,8 @@ static void intel_i830_init_gtt_entries(void)
                case I915_GMCH_GMS_STOLEN_48M:
                        /* Check it's really I915G */
                        if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
-                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB)
+                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
+                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB)
                                gtt_entries = MB(48) - KB(size);
                        else
                                gtt_entries = 0;
@@ -426,7 +427,8 @@ static void intel_i830_init_gtt_entries(void)
                case I915_GMCH_GMS_STOLEN_64M:
                        /* Check it's really I915G */
                        if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
-                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB)
+                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
+                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB)
                                gtt_entries = MB(64) - KB(size);
                        else
                                gtt_entries = 0;
@@ -1662,6 +1664,14 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev,
                }
                name = "915GM";
                break;
+       case PCI_DEVICE_ID_INTEL_82945G_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82945G_IG)) {
+                       bridge->driver = &intel_915_driver;
+               } else {
+                       bridge->driver = &intel_845_driver;
+               }
+               name = "945G";
+               break;
        case PCI_DEVICE_ID_INTEL_7505_0:
                bridge->driver = &intel_7505_driver;
                name = "E7505";
@@ -1801,6 +1811,7 @@ static struct pci_device_id agp_intel_pci_table[] = {
        ID(PCI_DEVICE_ID_INTEL_7205_0),
        ID(PCI_DEVICE_ID_INTEL_82915G_HB),
        ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
+       ID(PCI_DEVICE_ID_INTEL_82945G_HB),
        { }
 };
 
index 4b3eda2679761ff5937ba044b2047422ad8c03ce..d3aa159c9decbfa0ba99e6b42db5aa7f22ac6859 100644 (file)
@@ -133,11 +133,14 @@ static int sgi_tioca_insert_memory(struct agp_memory *mem, off_t pg_start,
        off_t j;
        void *temp;
        struct agp_bridge_data *bridge;
+       u64 *table;
 
        bridge = mem->bridge;
        if (!bridge)
                return -EINVAL;
 
+       table = (u64 *)bridge->gatt_table;
+
        temp = bridge->current_size;
 
        switch (bridge->driver->size_type) {
@@ -175,7 +178,7 @@ static int sgi_tioca_insert_memory(struct agp_memory *mem, off_t pg_start,
        j = pg_start;
 
        while (j < (pg_start + mem->page_count)) {
-               if (*(bridge->gatt_table + j))
+               if (table[j])
                        return -EBUSY;
                j++;
        }
@@ -186,7 +189,7 @@ static int sgi_tioca_insert_memory(struct agp_memory *mem, off_t pg_start,
        }
 
        for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
-               *(bridge->gatt_table + j) =
+               table[j] =
                    bridge->driver->mask_memory(bridge, mem->memory[i],
                                                mem->type);
        }
@@ -200,6 +203,7 @@ static int sgi_tioca_remove_memory(struct agp_memory *mem, off_t pg_start,
 {
        size_t i;
        struct agp_bridge_data *bridge;
+       u64 *table;
 
        bridge = mem->bridge;
        if (!bridge)
@@ -209,8 +213,10 @@ static int sgi_tioca_remove_memory(struct agp_memory *mem, off_t pg_start,
                return -EINVAL;
        }
 
+       table = (u64 *)bridge->gatt_table;
+
        for (i = pg_start; i < (mem->page_count + pg_start); i++) {
-               *(bridge->gatt_table + i) = 0;
+               table[i] = 0;
        }
 
        bridge->driver->tlb_flush(mem);
index 10c23302dd840d3bcc747c93871b2b1f9cc36209..a9fb12c20eb72e92aa343413094270022a159e47 100644 (file)
@@ -51,7 +51,7 @@ static int serverworks_create_page_map(struct serverworks_page_map *page_map)
        }
        SetPageReserved(virt_to_page(page_map->real));
        global_cache_flush();
-       page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real), 
+       page_map->remapped = ioremap_nocache(virt_to_gart(page_map->real),
                                            PAGE_SIZE);
        if (page_map->remapped == NULL) {
                ClearPageReserved(virt_to_page(page_map->real));
@@ -162,7 +162,7 @@ static int serverworks_create_gatt_table(struct agp_bridge_data *bridge)
        /* Create a fake scratch directory */
        for(i = 0; i < 1024; i++) {
                writel(agp_bridge->scratch_page, serverworks_private.scratch_dir.remapped+i);
-               writel(virt_to_phys(serverworks_private.scratch_dir.real) | 1, page_dir.remapped+i);
+               writel(virt_to_gart(serverworks_private.scratch_dir.real) | 1, page_dir.remapped+i);
        }
 
        retval = serverworks_create_gatt_pages(value->num_entries / 1024);
@@ -174,7 +174,7 @@ static int serverworks_create_gatt_table(struct agp_bridge_data *bridge)
 
        agp_bridge->gatt_table_real = (u32 *)page_dir.real;
        agp_bridge->gatt_table = (u32 __iomem *)page_dir.remapped;
-       agp_bridge->gatt_bus_addr = virt_to_phys(page_dir.real);
+       agp_bridge->gatt_bus_addr = virt_to_gart(page_dir.real);
 
        /* Get the address for the gart region.
         * This is a bus address even on the alpha, b/c its
@@ -187,7 +187,7 @@ static int serverworks_create_gatt_table(struct agp_bridge_data *bridge)
        /* Calculate the agp offset */  
 
        for(i = 0; i < value->num_entries / 1024; i++)
-               writel(virt_to_phys(serverworks_private.gatt_pages[i]->real)|1, page_dir.remapped+i);
+               writel(virt_to_gart(serverworks_private.gatt_pages[i]->real)|1, page_dir.remapped+i);
 
        return 0;
 }
index a673971f2a90309becddc27835d195bd36f30fad..c8255312b8c1f3728fb608928ebf554913cff4d2 100644 (file)
@@ -407,7 +407,7 @@ static int uninorth_create_gatt_table(struct agp_bridge_data *bridge)
 
        bridge->gatt_table_real = (u32 *) table;
        bridge->gatt_table = (u32 *)table;
-       bridge->gatt_bus_addr = virt_to_phys(table);
+       bridge->gatt_bus_addr = virt_to_gart(table);
 
        for (i = 0; i < num_entries; i++)
                bridge->gatt_table[i] = 0;
index 54a2914e3a321a31c0093b9f53fef81934b99427..11c6950158b3d7606bc3bb859ed1c7132177bacb 100644 (file)
        {0x8086, 0x2572, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
        {0x8086, 0x2582, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
        {0x8086, 0x2592, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
+       {0x8086, 0x2772, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
        {0, 0, 0}
 
index 5b18bee6492e898936d994dab4c5ec93d93fbecf..cd25f28e26a38874738705d935c37d51de4cda42 100644 (file)
@@ -123,11 +123,6 @@ static int radeon_wait_irq(drm_device_t *dev, int swi_nr)
 
        dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
 
-       /* This is a hack to work around mysterious freezes on certain
-        * systems:
-        */ 
-       radeon_acknowledge_irqs( dev_priv );
-
        DRM_WAIT_ON( ret, dev_priv->swi_queue, 3 * DRM_HZ, 
                     RADEON_READ( RADEON_LAST_SWI_REG ) >= swi_nr );
 
index 37d6649011ad29900d11d6a2483db08d6bae768d..26271e3ca82371542b9395fea1815e0b71f43290 100644 (file)
@@ -144,7 +144,7 @@ static struct dsp56k_device {
        int tx_wsize, rx_wsize;
 } dsp56k;
 
-static struct class_simple *dsp56k_class;
+static struct class *dsp56k_class;
 
 static int dsp56k_reset(void)
 {
@@ -510,12 +510,12 @@ static int __init dsp56k_init_driver(void)
                printk("DSP56k driver: Unable to register driver\n");
                return -ENODEV;
        }
-       dsp56k_class = class_simple_create(THIS_MODULE, "dsp56k");
+       dsp56k_class = class_create(THIS_MODULE, "dsp56k");
        if (IS_ERR(dsp56k_class)) {
                err = PTR_ERR(dsp56k_class);
                goto out_chrdev;
        }
-       class_simple_device_add(dsp56k_class, MKDEV(DSP56K_MAJOR, 0), NULL, "dsp56k");
+       class_device_create(dsp56k_class, MKDEV(DSP56K_MAJOR, 0), NULL, "dsp56k");
 
        err = devfs_mk_cdev(MKDEV(DSP56K_MAJOR, 0),
                      S_IFCHR | S_IRUSR | S_IWUSR, "dsp56k");
@@ -526,8 +526,8 @@ static int __init dsp56k_init_driver(void)
        goto out;
 
 out_class:
-       class_simple_device_remove(MKDEV(DSP56K_MAJOR, 0));
-       class_simple_destroy(dsp56k_class);
+       class_device_destroy(dsp56k_class, MKDEV(DSP56K_MAJOR, 0));
+       class_destroy(dsp56k_class);
 out_chrdev:
        unregister_chrdev(DSP56K_MAJOR, "dsp56k");
 out:
@@ -537,8 +537,8 @@ module_init(dsp56k_init_driver);
 
 static void __exit dsp56k_cleanup_driver(void)
 {
-       class_simple_device_remove(MKDEV(DSP56K_MAJOR, 0));
-       class_simple_destroy(dsp56k_class);
+       class_device_destroy(dsp56k_class, MKDEV(DSP56K_MAJOR, 0));
+       class_destroy(dsp56k_class);
        unregister_chrdev(DSP56K_MAJOR, "dsp56k");
        devfs_remove("dsp56k");
 }
index dbac7e54e8e069911517c99f153b9c8650475b06..5745b74044ec1b1a583a606b2ef7346b7df5bfad 100644 (file)
@@ -99,7 +99,7 @@ static struct file_operations zft_cdev =
        .release        = zft_close,
 };
 
-static struct class_simple *zft_class;
+static struct class *zft_class;
 
 /*      Open floppy tape device
  */
@@ -329,29 +329,29 @@ KERN_INFO
              "installing zftape VFS interface for ftape driver ...");
        TRACE_CATCH(register_chrdev(QIC117_TAPE_MAJOR, "zft", &zft_cdev),);
 
-       zft_class = class_simple_create(THIS_MODULE, "zft");
+       zft_class = class_create(THIS_MODULE, "zft");
        for (i = 0; i < 4; i++) {
-               class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i), NULL, "qft%i", i);
+               class_device_create(zft_class, MKDEV(QIC117_TAPE_MAJOR, i), NULL, "qft%i", i);
                devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i),
                                S_IFCHR | S_IRUSR | S_IWUSR,
                                "qft%i", i);
-               class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 4), NULL, "nqft%i", i);
+               class_device_create(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 4), NULL, "nqft%i", i);
                devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 4),
                                S_IFCHR | S_IRUSR | S_IWUSR,
                                "nqft%i", i);
-               class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 16), NULL, "zqft%i", i);
+               class_device_create(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 16), NULL, "zqft%i", i);
                devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 16),
                                S_IFCHR | S_IRUSR | S_IWUSR,
                                "zqft%i", i);
-               class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 20), NULL, "nzqft%i", i);
+               class_device_create(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 20), NULL, "nzqft%i", i);
                devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 20),
                                S_IFCHR | S_IRUSR | S_IWUSR,
                                "nzqft%i", i);
-               class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 32), NULL, "rawqft%i", i);
+               class_device_create(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 32), NULL, "rawqft%i", i);
                devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 32),
                                S_IFCHR | S_IRUSR | S_IWUSR,
                                "rawqft%i", i);
-               class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 36), NULL, "nrawrawqft%i", i);
+               class_device_create(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 36), NULL, "nrawrawqft%i", i);
                devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 36),
                                S_IFCHR | S_IRUSR | S_IWUSR,
                                "nrawqft%i", i);
@@ -381,19 +381,19 @@ static void zft_exit(void)
        }
         for (i = 0; i < 4; i++) {
                devfs_remove("qft%i", i);
-               class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i));
+               class_device_destroy(zft_class, MKDEV(QIC117_TAPE_MAJOR, i));
                devfs_remove("nqft%i", i);
-               class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 4));
+               class_device_destroy(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 4));
                devfs_remove("zqft%i", i);
-               class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 16));
+               class_device_destroy(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 16));
                devfs_remove("nzqft%i", i);
-               class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 20));
+               class_device_destroy(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 20));
                devfs_remove("rawqft%i", i);
-               class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 32));
+               class_device_destroy(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 32));
                devfs_remove("nrawqft%i", i);
-               class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 36));
+               class_device_destroy(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 36));
        }
-       class_simple_destroy(zft_class);
+       class_destroy(zft_class);
        zft_uninit_mem(); /* release remaining memory, if any */
         printk(KERN_INFO "zftape successfully unloaded.\n");
        TRACE_EXIT;
index abfbdcfd4e725a397f23121144d5a308c1a429e7..3236d2404905003ad92ce5b2ef82cc96f28a3906 100644 (file)
@@ -1466,7 +1466,7 @@ static inline struct hvcs_struct *from_vio_dev(struct vio_dev *viod)
 }
 /* The sysfs interface for the driver and devices */
 
-static ssize_t hvcs_partner_vtys_show(struct device *dev, char *buf)
+static ssize_t hvcs_partner_vtys_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct vio_dev *viod = to_vio_dev(dev);
        struct hvcs_struct *hvcsd = from_vio_dev(viod);
@@ -1480,7 +1480,7 @@ static ssize_t hvcs_partner_vtys_show(struct device *dev, char *buf)
 }
 static DEVICE_ATTR(partner_vtys, S_IRUGO, hvcs_partner_vtys_show, NULL);
 
-static ssize_t hvcs_partner_clcs_show(struct device *dev, char *buf)
+static ssize_t hvcs_partner_clcs_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct vio_dev *viod = to_vio_dev(dev);
        struct hvcs_struct *hvcsd = from_vio_dev(viod);
@@ -1494,7 +1494,7 @@ static ssize_t hvcs_partner_clcs_show(struct device *dev, char *buf)
 }
 static DEVICE_ATTR(partner_clcs, S_IRUGO, hvcs_partner_clcs_show, NULL);
 
-static ssize_t hvcs_current_vty_store(struct device *dev, const char * buf,
+static ssize_t hvcs_current_vty_store(struct device *dev, struct device_attribute *attr, const char * buf,
                size_t count)
 {
        /*
@@ -1505,7 +1505,7 @@ static ssize_t hvcs_current_vty_store(struct device *dev, const char * buf,
        return -EPERM;
 }
 
-static ssize_t hvcs_current_vty_show(struct device *dev, char *buf)
+static ssize_t hvcs_current_vty_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct vio_dev *viod = to_vio_dev(dev);
        struct hvcs_struct *hvcsd = from_vio_dev(viod);
@@ -1521,7 +1521,7 @@ static ssize_t hvcs_current_vty_show(struct device *dev, char *buf)
 static DEVICE_ATTR(current_vty,
        S_IRUGO | S_IWUSR, hvcs_current_vty_show, hvcs_current_vty_store);
 
-static ssize_t hvcs_vterm_state_store(struct device *dev, const char *buf,
+static ssize_t hvcs_vterm_state_store(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        struct vio_dev *viod = to_vio_dev(dev);
@@ -1559,7 +1559,7 @@ static ssize_t hvcs_vterm_state_store(struct device *dev, const char *buf,
        return count;
 }
 
-static ssize_t hvcs_vterm_state_show(struct device *dev, char *buf)
+static ssize_t hvcs_vterm_state_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct vio_dev *viod = to_vio_dev(dev);
        struct hvcs_struct *hvcsd = from_vio_dev(viod);
@@ -1574,7 +1574,7 @@ static ssize_t hvcs_vterm_state_show(struct device *dev, char *buf)
 static DEVICE_ATTR(vterm_state, S_IRUGO | S_IWUSR,
                hvcs_vterm_state_show, hvcs_vterm_state_store);
 
-static ssize_t hvcs_index_show(struct device *dev, char *buf)
+static ssize_t hvcs_index_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct vio_dev *viod = to_vio_dev(dev);
        struct hvcs_struct *hvcsd = from_vio_dev(viod);
index fca9a978fb73fc2662daea26caa6f0744e0a5764..3b8314b4249ac902b5da172c20a781191956afa2 100644 (file)
@@ -302,7 +302,7 @@ static char rirqs[IP2_MAX_BOARDS];
 static int Valid_Irqs[] = { 3, 4, 5, 7, 10, 11, 12, 15, 0};
 
 /* for sysfs class support */
-static struct class_simple *ip2_class;
+static struct class *ip2_class;
 
 // Some functions to keep track of what irq's we have
 
@@ -414,9 +414,9 @@ cleanup_module(void)
                        iiResetDelay( i2BoardPtrTable[i] );
                        /* free io addresses and Tibet */
                        release_region( ip2config.addr[i], 8 );
-                       class_simple_device_remove(MKDEV(IP2_IPL_MAJOR, 4 * i)); 
+                       class_device_destroy(ip2_class, MKDEV(IP2_IPL_MAJOR, 4 * i));
                        devfs_remove("ip2/ipl%d", i);
-                       class_simple_device_remove(MKDEV(IP2_IPL_MAJOR, 4 * i + 1));
+                       class_device_destroy(ip2_class, MKDEV(IP2_IPL_MAJOR, 4 * i + 1));
                        devfs_remove("ip2/stat%d", i);
                }
                /* Disable and remove interrupt handler. */
@@ -425,7 +425,7 @@ cleanup_module(void)
                        clear_requested_irq( ip2config.irq[i]);
                }
        }
-       class_simple_destroy(ip2_class);
+       class_destroy(ip2_class);
        devfs_remove("ip2");
        if ( ( err = tty_unregister_driver ( ip2_tty_driver ) ) ) {
                printk(KERN_ERR "IP2: failed to unregister tty driver (%d)\n", err);
@@ -700,7 +700,7 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize)
                printk(KERN_ERR "IP2: failed to register IPL device (%d)\n", err );
        } else {
                /* create the sysfs class */
-               ip2_class = class_simple_create(THIS_MODULE, "ip2");
+               ip2_class = class_create(THIS_MODULE, "ip2");
                if (IS_ERR(ip2_class)) {
                        err = PTR_ERR(ip2_class);
                        goto out_chrdev;        
@@ -722,25 +722,25 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize)
                        }
 
                        if ( NULL != ( pB = i2BoardPtrTable[i] ) ) {
-                               class_simple_device_add(ip2_class, MKDEV(IP2_IPL_MAJOR, 
+                               class_device_create(ip2_class, MKDEV(IP2_IPL_MAJOR,
                                                4 * i), NULL, "ipl%d", i);
                                err = devfs_mk_cdev(MKDEV(IP2_IPL_MAJOR, 4 * i),
                                                S_IRUSR | S_IWUSR | S_IRGRP | S_IFCHR,
                                                "ip2/ipl%d", i);
                                if (err) {
-                                       class_simple_device_remove(MKDEV(IP2_IPL_MAJOR, 
-                                               4 * i));
+                                       class_device_destroy(ip2_class,
+                                               MKDEV(IP2_IPL_MAJOR, 4 * i));
                                        goto out_class;
                                }
 
-                               class_simple_device_add(ip2_class, MKDEV(IP2_IPL_MAJOR, 
+                               class_device_create(ip2_class, MKDEV(IP2_IPL_MAJOR,
                                                4 * i + 1), NULL, "stat%d", i);
                                err = devfs_mk_cdev(MKDEV(IP2_IPL_MAJOR, 4 * i + 1),
                                                S_IRUSR | S_IWUSR | S_IRGRP | S_IFCHR,
                                                "ip2/stat%d", i);
                                if (err) {
-                                       class_simple_device_remove(MKDEV(IP2_IPL_MAJOR, 
-                                               4 * i + 1));
+                                       class_device_destroy(ip2_class,
+                                               MKDEV(IP2_IPL_MAJOR, 4 * i + 1));
                                        goto out_class;
                                }
 
@@ -798,7 +798,7 @@ retry:
        goto out;
 
 out_class:
-       class_simple_destroy(ip2_class);
+       class_destroy(ip2_class);
 out_chrdev:
        unregister_chrdev(IP2_IPL_MAJOR, "ip2");
 out:
index 49d67f5384a2c2d9a0a5b97ad0cbd4c40c500b2b..88d1ad656e99a2df138122225992d7cb91f3d728 100644 (file)
@@ -44,6 +44,7 @@
 #include <linux/ipmi.h>
 #include <asm/semaphore.h>
 #include <linux/init.h>
+#include <linux/device.h>
 
 #define IPMI_DEVINTF_VERSION "v33"
 
@@ -519,15 +520,21 @@ MODULE_PARM_DESC(ipmi_major, "Sets the major number of the IPMI device.  By"
                 " interface.  Other values will set the major device number"
                 " to that value.");
 
+static struct class *ipmi_class;
+
 static void ipmi_new_smi(int if_num)
 {
-       devfs_mk_cdev(MKDEV(ipmi_major, if_num),
-                     S_IFCHR | S_IRUSR | S_IWUSR,
+       dev_t dev = MKDEV(ipmi_major, if_num);
+
+       devfs_mk_cdev(dev, S_IFCHR | S_IRUSR | S_IWUSR,
                      "ipmidev/%d", if_num);
+
+       class_device_create(ipmi_class, dev, NULL, "ipmi%d", if_num);
 }
 
 static void ipmi_smi_gone(int if_num)
 {
+       class_device_destroy(ipmi_class, MKDEV(ipmi_major, if_num));
        devfs_remove("ipmidev/%d", if_num);
 }
 
@@ -548,8 +555,15 @@ static __init int init_ipmi_devintf(void)
        printk(KERN_INFO "ipmi device interface version "
               IPMI_DEVINTF_VERSION "\n");
 
+       ipmi_class = class_create(THIS_MODULE, "ipmi");
+       if (IS_ERR(ipmi_class)) {
+               printk(KERN_ERR "ipmi: can't register device class\n");
+               return PTR_ERR(ipmi_class);
+       }
+
        rv = register_chrdev(ipmi_major, DEVICE_NAME, &ipmi_fops);
        if (rv < 0) {
+               class_destroy(ipmi_class);
                printk(KERN_ERR "ipmi: can't get major %d\n", ipmi_major);
                return rv;
        }
@@ -563,6 +577,7 @@ static __init int init_ipmi_devintf(void)
        rv = ipmi_smi_watcher_register(&smi_watcher);
        if (rv) {
                unregister_chrdev(ipmi_major, DEVICE_NAME);
+               class_destroy(ipmi_class);
                printk(KERN_WARNING "ipmi: can't register smi watcher\n");
                return rv;
        }
@@ -573,6 +588,7 @@ module_init(init_ipmi_devintf);
 
 static __exit void cleanup_ipmi(void)
 {
+       class_destroy(ipmi_class);
        ipmi_smi_watcher_unregister(&smi_watcher);
        devfs_remove(DEVICE_NAME);
        unregister_chrdev(ipmi_major, DEVICE_NAME);
index d7fb452af7f988a4d289acc4f3ebcb0c0bac5efb..0c81652eaba65cc7895cb740a00a4bfdcffbd79f 100644 (file)
@@ -641,7 +641,7 @@ int ipmi_create_user(unsigned int          if_num,
                return -ENOMEM;
 
        down_read(&interfaces_sem);
-       if ((if_num > MAX_IPMI_INTERFACES) || ipmi_interfaces[if_num] == NULL)
+       if ((if_num >= MAX_IPMI_INTERFACES) || ipmi_interfaces[if_num] == NULL)
        {
                rv = -EINVAL;
                goto out_unlock;
index 21aed0e8779de8e934b0bedebd8c4306ea9abe34..c02a21dbad5d516b400f28fa0f2c601aaa8b7136 100644 (file)
@@ -792,7 +792,7 @@ static int  stli_timeron;
 
 /*****************************************************************************/
 
-static struct class_simple *istallion_class;
+static struct class *istallion_class;
 
 #ifdef MODULE
 
@@ -854,10 +854,10 @@ static void __exit istallion_module_exit(void)
        put_tty_driver(stli_serial);
        for (i = 0; i < 4; i++) {
                devfs_remove("staliomem/%d", i);
-               class_simple_device_remove(MKDEV(STL_SIOMEMMAJOR, i));
+               class_device_destroy(istallion_class, MKDEV(STL_SIOMEMMAJOR, i));
        }
        devfs_remove("staliomem");
-       class_simple_destroy(istallion_class);
+       class_destroy(istallion_class);
        if ((i = unregister_chrdev(STL_SIOMEMMAJOR, "staliomem")))
                printk("STALLION: failed to un-register serial memory device, "
                        "errno=%d\n", -i);
@@ -5242,12 +5242,12 @@ int __init stli_init(void)
                                "device\n");
 
        devfs_mk_dir("staliomem");
-       istallion_class = class_simple_create(THIS_MODULE, "staliomem");
+       istallion_class = class_create(THIS_MODULE, "staliomem");
        for (i = 0; i < 4; i++) {
                devfs_mk_cdev(MKDEV(STL_SIOMEMMAJOR, i),
                               S_IFCHR | S_IRUSR | S_IWUSR,
                               "staliomem/%d", i);
-               class_simple_device_add(istallion_class, MKDEV(STL_SIOMEMMAJOR, i), 
+               class_device_create(istallion_class, MKDEV(STL_SIOMEMMAJOR, i),
                                NULL, "staliomem%d", i);
        }
 
index 4dee945031d45cf46d61b604bcbfffe58f1ac895..59eebe5a035f1c7691656f389c75af261769c0eb 100644 (file)
 static struct lp_struct lp_table[LP_NO];
 
 static unsigned int lp_count = 0;
-static struct class_simple *lp_class;
+static struct class *lp_class;
 
 #ifdef CONFIG_LP_CONSOLE
 static struct parport *console_registered; // initially NULL
@@ -804,7 +804,7 @@ static int lp_register(int nr, struct parport *port)
        if (reset)
                lp_reset(nr);
 
-       class_simple_device_add(lp_class, MKDEV(LP_MAJOR, nr), NULL,
+       class_device_create(lp_class, MKDEV(LP_MAJOR, nr), NULL,
                                "lp%d", nr);
        devfs_mk_cdev(MKDEV(LP_MAJOR, nr), S_IFCHR | S_IRUGO | S_IWUGO,
                        "printers/%d", nr);
@@ -907,7 +907,7 @@ static int __init lp_init (void)
        }
 
        devfs_mk_dir("printers");
-       lp_class = class_simple_create(THIS_MODULE, "printer");
+       lp_class = class_create(THIS_MODULE, "printer");
        if (IS_ERR(lp_class)) {
                err = PTR_ERR(lp_class);
                goto out_devfs;
@@ -930,7 +930,7 @@ static int __init lp_init (void)
        return 0;
 
 out_class:
-       class_simple_destroy(lp_class);
+       class_destroy(lp_class);
 out_devfs:
        devfs_remove("printers");
        unregister_chrdev(LP_MAJOR, "lp");
@@ -981,10 +981,10 @@ static void lp_cleanup_module (void)
                        continue;
                parport_unregister_device(lp_table[offset].dev);
                devfs_remove("printers/%d", offset);
-               class_simple_device_remove(MKDEV(LP_MAJOR, offset));
+               class_device_destroy(lp_class, MKDEV(LP_MAJOR, offset));
        }
        devfs_remove("printers");
-       class_simple_destroy(lp_class);
+       class_destroy(lp_class);
 }
 
 __setup("lp=", lp_setup);
index ac9cfa9701ea9003d0f440ec572e0eecaec7a1a3..115dbb35334b031e71acaedff084402499a449a2 100644 (file)
@@ -699,7 +699,7 @@ static inline int mbcs_hw_init(struct mbcs_soft *soft)
        return 0;
 }
 
-static ssize_t show_algo(struct device *dev, char *buf)
+static ssize_t show_algo(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct cx_dev *cx_dev = to_cx_dev(dev);
        struct mbcs_soft *soft = cx_dev->soft;
@@ -715,7 +715,7 @@ static ssize_t show_algo(struct device *dev, char *buf)
                       (debug0 >> 32), (debug0 & 0xffffffff));
 }
 
-static ssize_t store_algo(struct device *dev, const char *buf, size_t count)
+static ssize_t store_algo(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        int n;
        struct cx_dev *cx_dev = to_cx_dev(dev);
index 947cb3cef816715dafe2c6a48e092d9dbf30d0a7..e3085b22a365b7104fbb6e29483cdf7531121e36 100644 (file)
@@ -484,7 +484,7 @@ static ssize_t write_kmem(struct file * file, const char __user * buf,
        return virtr + wrote;
 }
 
-#if defined(CONFIG_ISA) || !defined(__mc68000__)
+#if (defined(CONFIG_ISA) || !defined(__mc68000__)) && (!defined(CONFIG_PPC_ISERIES) || defined(CONFIG_PCI))
 static ssize_t read_port(struct file * file, char __user * buf,
                         size_t count, loff_t *ppos)
 {
@@ -744,7 +744,7 @@ static struct file_operations null_fops = {
        .write          = write_null,
 };
 
-#if defined(CONFIG_ISA) || !defined(__mc68000__)
+#if (defined(CONFIG_ISA) || !defined(__mc68000__)) && (!defined(CONFIG_PPC_ISERIES) || defined(CONFIG_PCI))
 static struct file_operations port_fops = {
        .llseek         = memory_lseek,
        .read           = read_port,
@@ -804,7 +804,7 @@ static int memory_open(struct inode * inode, struct file * filp)
                case 3:
                        filp->f_op = &null_fops;
                        break;
-#if defined(CONFIG_ISA) || !defined(__mc68000__)
+#if (defined(CONFIG_ISA) || !defined(__mc68000__)) && (!defined(CONFIG_PPC_ISERIES) || defined(CONFIG_PCI))
                case 4:
                        filp->f_op = &port_fops;
                        break;
@@ -846,7 +846,7 @@ static const struct {
        {1, "mem",     S_IRUSR | S_IWUSR | S_IRGRP, &mem_fops},
        {2, "kmem",    S_IRUSR | S_IWUSR | S_IRGRP, &kmem_fops},
        {3, "null",    S_IRUGO | S_IWUGO,           &null_fops},
-#if defined(CONFIG_ISA) || !defined(__mc68000__)
+#if (defined(CONFIG_ISA) || !defined(__mc68000__)) && (!defined(CONFIG_PPC_ISERIES) || defined(CONFIG_PCI))
        {4, "port",    S_IRUSR | S_IWUSR | S_IRGRP, &port_fops},
 #endif
        {5, "zero",    S_IRUGO | S_IWUGO,           &zero_fops},
@@ -856,7 +856,7 @@ static const struct {
        {11,"kmsg",    S_IRUGO | S_IWUSR,           &kmsg_fops},
 };
 
-static struct class_simple *mem_class;
+static struct class *mem_class;
 
 static int __init chr_dev_init(void)
 {
@@ -865,10 +865,9 @@ static int __init chr_dev_init(void)
        if (register_chrdev(MEM_MAJOR,"mem",&memory_fops))
                printk("unable to get major %d for memory devs\n", MEM_MAJOR);
 
-       mem_class = class_simple_create(THIS_MODULE, "mem");
+       mem_class = class_create(THIS_MODULE, "mem");
        for (i = 0; i < ARRAY_SIZE(devlist); i++) {
-               class_simple_device_add(mem_class,
-                                       MKDEV(MEM_MAJOR, devlist[i].minor),
+               class_device_create(mem_class, MKDEV(MEM_MAJOR, devlist[i].minor),
                                        NULL, devlist[i].name);
                devfs_mk_cdev(MKDEV(MEM_MAJOR, devlist[i].minor),
                                S_IFCHR | devlist[i].mode, devlist[i].name);
index 0937544762da76d0a8627a9fe96b35c394a5d768..3115d318b9978618784a4ee4f8173070cfcbe023 100644 (file)
@@ -177,10 +177,10 @@ fail:
 
 /* 
  * TODO for 2.7:
- *  - add a struct class_device to struct miscdevice and make all usages of
+ *  - add a struct kref to struct miscdevice and make all usages of
  *    them dynamic.
  */
-static struct class_simple *misc_class;
+static struct class *misc_class;
 
 static struct file_operations misc_fops = {
        .owner          = THIS_MODULE,
@@ -238,8 +238,8 @@ int misc_register(struct miscdevice * misc)
        }
        dev = MKDEV(MISC_MAJOR, misc->minor);
 
-       misc->class = class_simple_device_add(misc_class, dev,
-                                             misc->dev, misc->name);
+       misc->class = class_device_create(misc_class, dev, misc->dev,
+                                         "%s", misc->name);
        if (IS_ERR(misc->class)) {
                err = PTR_ERR(misc->class);
                goto out;
@@ -248,7 +248,7 @@ int misc_register(struct miscdevice * misc)
        err = devfs_mk_cdev(dev, S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP, 
                            misc->devfs_name);
        if (err) {
-               class_simple_device_remove(dev);
+               class_device_destroy(misc_class, dev);
                goto out;
        }
 
@@ -281,7 +281,7 @@ int misc_deregister(struct miscdevice * misc)
 
        down(&misc_sem);
        list_del(&misc->list);
-       class_simple_device_remove(MKDEV(MISC_MAJOR, misc->minor));
+       class_device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor));
        devfs_remove(misc->devfs_name);
        if (i < DYNAMIC_MINORS && i>0) {
                misc_minors[i>>3] &= ~(1 << (misc->minor & 7));
@@ -302,7 +302,7 @@ static int __init misc_init(void)
        if (ent)
                ent->proc_fops = &misc_proc_fops;
 #endif
-       misc_class = class_simple_create(THIS_MODULE, "misc");
+       misc_class = class_create(THIS_MODULE, "misc");
        if (IS_ERR(misc_class))
                return PTR_ERR(misc_class);
 #ifdef CONFIG_MVME16x
@@ -323,7 +323,7 @@ static int __init misc_init(void)
        if (register_chrdev(MISC_MAJOR,"misc",&misc_fops)) {
                printk("unable to get major %d for misc devices\n",
                       MISC_MAJOR);
-               class_simple_destroy(misc_class);
+               class_destroy(misc_class);
                return -EIO;
        }
        return 0;
index d37625d477465c732a19273beecf1c706c40e0b7..d568991ac6b3eafcc2dd85b48a881756c9353d2c 100644 (file)
@@ -472,7 +472,7 @@ struct device mwave_device;
 
 /* Prevent code redundancy, create a macro for mwave_show_* functions. */
 #define mwave_show_function(attr_name, format_string, field)           \
-static ssize_t mwave_show_##attr_name(struct device *dev, char *buf)   \
+static ssize_t mwave_show_##attr_name(struct device *dev, struct device_attribute *attr, char *buf)    \
 {                                                                      \
        DSP_3780I_CONFIG_SETTINGS *pSettings =                          \
                &mwave_s_mdd.rBDData.rDspSettings;                      \
index 7a245068e3e55e2ba47801ca8ea9fa08f99cf66a..f022f0944434158f31eb3a9b3f0c9da35abadf1b 100644 (file)
@@ -1995,9 +1995,6 @@ static void mxser_receive_chars(struct mxser_struct *info, int *status)
        unsigned char ch, gdl;
        int ignored = 0;
        int cnt = 0;
-       unsigned char *cp;
-       char *fp;
-       int count;
        int recv_room;
        int max = 256;
        unsigned long flags;
@@ -2011,10 +2008,6 @@ static void mxser_receive_chars(struct mxser_struct *info, int *status)
                //return;
        }
 
-       cp = tty->flip.char_buf;
-       fp = tty->flip.flag_buf;
-       count = 0;
-
        // following add by Victor Yu. 09-02-2002
        if (info->IsMoxaMustChipFlag != MOXA_OTHER_UART) {
 
@@ -2041,12 +2034,10 @@ static void mxser_receive_chars(struct mxser_struct *info, int *status)
                }
                while (gdl--) {
                        ch = inb(info->base + UART_RX);
-                       count++;
-                       *cp++ = ch;
-                       *fp++ = 0;
+                       tty_insert_flip_char(tty, ch, 0);
                        cnt++;
                        /*
-                          if((count>=HI_WATER) && (info->stop_rx==0)){
+                          if((cnt>=HI_WATER) && (info->stop_rx==0)){
                           mxser_stoprx(tty);
                           info->stop_rx=1;
                           break;
@@ -2061,7 +2052,7 @@ intr_old:
                if (max-- < 0)
                        break;
                /*
-                  if((count>=HI_WATER) && (info->stop_rx==0)){
+                  if((cnt>=HI_WATER) && (info->stop_rx==0)){
                   mxser_stoprx(tty);
                   info->stop_rx=1;
                   break;
@@ -2078,36 +2069,33 @@ intr_old:
                        if (++ignored > 100)
                                break;
                } else {
-                       count++;
+                       char flag = 0;
                        if (*status & UART_LSR_SPECIAL) {
                                if (*status & UART_LSR_BI) {
-                                       *fp++ = TTY_BREAK;
+                                       flag = TTY_BREAK;
 /* added by casper 1/11/2000 */
                                        info->icount.brk++;
-
 /* */
                                        if (info->flags & ASYNC_SAK)
                                                do_SAK(tty);
                                } else if (*status & UART_LSR_PE) {
-                                       *fp++ = TTY_PARITY;
+                                       flag = TTY_PARITY;
 /* added by casper 1/11/2000 */
                                        info->icount.parity++;
 /* */
                                } else if (*status & UART_LSR_FE) {
-                                       *fp++ = TTY_FRAME;
+                                       flag = TTY_FRAME;
 /* added by casper 1/11/2000 */
                                        info->icount.frame++;
 /* */
                                } else if (*status & UART_LSR_OE) {
-                                       *fp++ = TTY_OVERRUN;
+                                       flag = TTY_OVERRUN;
 /* added by casper 1/11/2000 */
                                        info->icount.overrun++;
 /* */
-                               } else
-                                       *fp++ = 0;
-                       } else
-                               *fp++ = 0;
-                       *cp++ = ch;
+                               }
+                       }
+                       tty_insert_flip_char(tty, ch, flag);
                        cnt++;
                        if (cnt >= recv_room) {
                                if (!info->ldisc_stop_rx) {
@@ -2132,13 +2120,13 @@ intr_old:
                // above add by Victor Yu. 09-02-2002
        } while (*status & UART_LSR_DR);
 
-      end_intr:                // add by Victor Yu. 09-02-2002
+end_intr:              // add by Victor Yu. 09-02-2002
 
        mxvar_log.rxcnt[info->port] += cnt;
        info->mon_data.rxcnt += cnt;
        info->mon_data.up_rxcnt += cnt;
        spin_unlock_irqrestore(&info->slock, flags);
-       
+
        tty_flip_buffer_push(tty);
 }
 
index 5eda075c62bd173eafa3c0868bdb12b00e6b0b9b..0e22880432bca3d8c89be8c7b0a6ffabbd05fc03 100644 (file)
@@ -737,7 +737,7 @@ static unsigned int pp_poll (struct file * file, poll_table * wait)
        return mask;
 }
 
-static struct class_simple *ppdev_class;
+static struct class *ppdev_class;
 
 static struct file_operations pp_fops = {
        .owner          = THIS_MODULE,
@@ -752,13 +752,13 @@ static struct file_operations pp_fops = {
 
 static void pp_attach(struct parport *port)
 {
-       class_simple_device_add(ppdev_class, MKDEV(PP_MAJOR, port->number),
+       class_device_create(ppdev_class, MKDEV(PP_MAJOR, port->number),
                        NULL, "parport%d", port->number);
 }
 
 static void pp_detach(struct parport *port)
 {
-       class_simple_device_remove(MKDEV(PP_MAJOR, port->number));
+       class_device_destroy(ppdev_class, MKDEV(PP_MAJOR, port->number));
 }
 
 static struct parport_driver pp_driver = {
@@ -776,7 +776,7 @@ static int __init ppdev_init (void)
                        PP_MAJOR);
                return -EIO;
        }
-       ppdev_class = class_simple_create(THIS_MODULE, CHRDEV);
+       ppdev_class = class_create(THIS_MODULE, CHRDEV);
        if (IS_ERR(ppdev_class)) {
                err = PTR_ERR(ppdev_class);
                goto out_chrdev;
@@ -798,7 +798,7 @@ out_class:
        for (i = 0; i < PARPORT_MAX; i++)
                devfs_remove("parports/%d", i);
        devfs_remove("parports");
-       class_simple_destroy(ppdev_class);
+       class_destroy(ppdev_class);
 out_chrdev:
        unregister_chrdev(PP_MAJOR, CHRDEV);
 out:
@@ -813,7 +813,7 @@ static void __exit ppdev_cleanup (void)
                devfs_remove("parports/%d", i);
        parport_unregister_driver(&pp_driver);
        devfs_remove("parports");
-       class_simple_destroy(ppdev_class);
+       class_destroy(ppdev_class);
        unregister_chrdev (PP_MAJOR, CHRDEV);
 }
 
index a2e33ec796151ab4f96f4a869447f87088f0e300..f13e5de02207b8dff569c58f80d6ab85988671ee 100644 (file)
@@ -27,7 +27,7 @@ struct raw_device_data {
        int inuse;
 };
 
-static struct class_simple *raw_class;
+static struct class *raw_class;
 static struct raw_device_data raw_devices[MAX_RAW_MINORS];
 static DECLARE_MUTEX(raw_mutex);
 static struct file_operations raw_ctl_fops;         /* forward declaration */
@@ -122,13 +122,13 @@ raw_ioctl(struct inode *inode, struct file *filp,
 {
        struct block_device *bdev = filp->private_data;
 
-       return ioctl_by_bdev(bdev, command, arg);
+       return blkdev_ioctl(bdev->bd_inode, NULL, command, arg);
 }
 
 static void bind_device(struct raw_config_request *rq)
 {
-       class_simple_device_remove(MKDEV(RAW_MAJOR, rq->raw_minor));
-       class_simple_device_add(raw_class, MKDEV(RAW_MAJOR, rq->raw_minor),
+       class_device_destroy(raw_class, MKDEV(RAW_MAJOR, rq->raw_minor));
+       class_device_create(raw_class, MKDEV(RAW_MAJOR, rq->raw_minor),
                                      NULL, "raw%d", rq->raw_minor);
 }
 
@@ -200,8 +200,8 @@ static int raw_ctl_ioctl(struct inode *inode, struct file *filp,
                        if (rq.block_major == 0 && rq.block_minor == 0) {
                                /* unbind */
                                rawdev->binding = NULL;
-                               class_simple_device_remove(MKDEV(RAW_MAJOR,
-                                                               rq.raw_minor));
+                               class_device_destroy(raw_class,
+                                               MKDEV(RAW_MAJOR, rq.raw_minor));
                        } else {
                                rawdev->binding = bdget(dev);
                                if (rawdev->binding == NULL)
@@ -300,14 +300,14 @@ static int __init raw_init(void)
                goto error;
        }
 
-       raw_class = class_simple_create(THIS_MODULE, "raw");
+       raw_class = class_create(THIS_MODULE, "raw");
        if (IS_ERR(raw_class)) {
                printk(KERN_ERR "Error creating raw class.\n");
                cdev_del(&raw_cdev);
                unregister_chrdev_region(dev, MAX_RAW_MINORS);
                goto error;
        }
-       class_simple_device_add(raw_class, MKDEV(RAW_MAJOR, 0), NULL, "rawctl");
+       class_device_create(raw_class, MKDEV(RAW_MAJOR, 0), NULL, "rawctl");
 
        devfs_mk_cdev(MKDEV(RAW_MAJOR, 0),
                      S_IFCHR | S_IRUGO | S_IWUGO,
@@ -331,8 +331,8 @@ static void __exit raw_exit(void)
                devfs_remove("raw/raw%d", i);
        devfs_remove("raw/rawctl");
        devfs_remove("raw");
-       class_simple_device_remove(MKDEV(RAW_MAJOR, 0));
-       class_simple_destroy(raw_class);
+       class_device_destroy(raw_class, MKDEV(RAW_MAJOR, 0));
+       class_destroy(raw_class);
        cdev_del(&raw_cdev);
        unregister_chrdev_region(MKDEV(RAW_MAJOR, 0), MAX_RAW_MINORS);
 }
index e3c0b52d943fda57b321896c48d43c6a86c64f71..261a41bf6d02edc4fece911485dd5680d9ddcede 100644 (file)
@@ -357,6 +357,8 @@ static struct file_operations scdrv_fops = {
        .release =      scdrv_release,
 };
 
+static struct class *snsc_class;
+
 /*
  * scdrv_init
  *
@@ -372,7 +374,6 @@ scdrv_init(void)
        char *devnamep;
        struct sysctl_data_s *scd;
        void *salbuf;
-       struct class_simple *snsc_class;
        dev_t first_dev, dev;
        nasid_t event_nasid = ia64_sn_get_console_nasid();
 
@@ -382,7 +383,7 @@ scdrv_init(void)
                       __FUNCTION__);
                return -ENODEV;
        }
-       snsc_class = class_simple_create(THIS_MODULE, SYSCTL_BASENAME);
+       snsc_class = class_create(THIS_MODULE, SYSCTL_BASENAME);
 
        for (cnode = 0; cnode < numionodes; cnode++) {
                        geoid = cnodeid_get_geoid(cnode);
@@ -436,7 +437,7 @@ scdrv_init(void)
                                continue;
                        }
 
-                       class_simple_device_add(snsc_class, dev, NULL,
+                       class_device_create(snsc_class, dev, NULL,
                                                "%s", devname);
 
                        ia64_sn_irtr_intr_enable(scd->scd_nasid,
index b8899f560b5ecd85dd17f86affdf1f0638c0fa4d..951545a6ef2d3f4c63a6f8c372fcbe88bbbdb277 100644 (file)
@@ -719,7 +719,7 @@ static struct file_operations       stl_fsiomem = {
 
 /*****************************************************************************/
 
-static struct class_simple *stallion_class;
+static struct class *stallion_class;
 
 /*
  *     Loadable module initialization stuff.
@@ -777,13 +777,13 @@ static void __exit stallion_module_exit(void)
        }
        for (i = 0; i < 4; i++) {
                devfs_remove("staliomem/%d", i);
-               class_simple_device_remove(MKDEV(STL_SIOMEMMAJOR, i));
+               class_device_destroy(stallion_class, MKDEV(STL_SIOMEMMAJOR, i));
        }
        devfs_remove("staliomem");
        if ((i = unregister_chrdev(STL_SIOMEMMAJOR, "staliomem")))
                printk("STALLION: failed to un-register serial memory device, "
                        "errno=%d\n", -i);
-       class_simple_destroy(stallion_class);
+       class_destroy(stallion_class);
 
        if (stl_tmpwritebuf != (char *) NULL)
                kfree(stl_tmpwritebuf);
@@ -3090,12 +3090,12 @@ static int __init stl_init(void)
                printk("STALLION: failed to register serial board device\n");
        devfs_mk_dir("staliomem");
 
-       stallion_class = class_simple_create(THIS_MODULE, "staliomem");
+       stallion_class = class_create(THIS_MODULE, "staliomem");
        for (i = 0; i < 4; i++) {
                devfs_mk_cdev(MKDEV(STL_SIOMEMMAJOR, i),
                                S_IFCHR|S_IRUSR|S_IWUSR,
                                "staliomem/%d", i);
-               class_simple_device_add(stallion_class, MKDEV(STL_SIOMEMMAJOR, i), NULL, "staliomem%d", i);
+               class_device_create(stallion_class, MKDEV(STL_SIOMEMMAJOR, i), NULL, "staliomem%d", i);
        }
 
        stl_serial->owner = THIS_MODULE;
index 0c5ba9dc906358c15cb29663d923c5fb505c8adb..659335d80ee73703b6c56b7653e454a34332402a 100644 (file)
@@ -90,7 +90,7 @@ static int timeout = TIMAXTIME;       /* timeout in tenth of seconds     */
 static unsigned int tp_count;  /* tipar count */
 static unsigned long opened;   /* opened devices */
 
-static struct class_simple *tipar_class;
+static struct class *tipar_class;
 
 /* --- macros for parport access -------------------------------------- */
 
@@ -436,7 +436,7 @@ tipar_register(int nr, struct parport *port)
                goto out;
        }
 
-       class_simple_device_add(tipar_class, MKDEV(TIPAR_MAJOR,
+       class_device_create(tipar_class, MKDEV(TIPAR_MAJOR,
                        TIPAR_MINOR + nr), NULL, "par%d", nr);
        /* Use devfs, tree: /dev/ticables/par/[0..2] */
        err = devfs_mk_cdev(MKDEV(TIPAR_MAJOR, TIPAR_MINOR + nr),
@@ -458,8 +458,8 @@ tipar_register(int nr, struct parport *port)
        goto out;
 
 out_class:
-       class_simple_device_remove(MKDEV(TIPAR_MAJOR, TIPAR_MINOR + nr));
-       class_simple_destroy(tipar_class);
+       class_device_destroy(tipar_class, MKDEV(TIPAR_MAJOR, TIPAR_MINOR + nr));
+       class_destroy(tipar_class);
 out:
        return err;
 }
@@ -505,7 +505,7 @@ tipar_init_module(void)
        /* Use devfs with tree: /dev/ticables/par/[0..2] */
        devfs_mk_dir("ticables/par");
 
-       tipar_class = class_simple_create(THIS_MODULE, "ticables");
+       tipar_class = class_create(THIS_MODULE, "ticables");
        if (IS_ERR(tipar_class)) {
                err = PTR_ERR(tipar_class);
                goto out_chrdev;
@@ -539,10 +539,10 @@ tipar_cleanup_module(void)
                if (table[i].dev == NULL)
                        continue;
                parport_unregister_device(table[i].dev);
-               class_simple_device_remove(MKDEV(TIPAR_MAJOR, i));
+               class_device_destroy(tipar_class, MKDEV(TIPAR_MAJOR, i));
                devfs_remove("ticables/par/%d", i);
        }
-       class_simple_destroy(tipar_class);
+       class_destroy(tipar_class);
        devfs_remove("ticables/par");
 
        pr_info("tipar: module unloaded\n");
index 87235330fdbe9ced1e186e8e670f919709fd2c9c..8ce508b29865eb866cb21f4575c1cc324b66cda5 100644 (file)
@@ -212,7 +212,7 @@ static u8 pcrread[] = {
        0, 0, 0, 0              /* PCR index */
 };
 
-static ssize_t show_pcrs(struct device *dev, char *buf)
+static ssize_t show_pcrs(struct device *dev, struct device_attribute *attr, char *buf)
 {
        u8 data[READ_PCR_RESULT_SIZE];
        ssize_t len;
@@ -255,7 +255,7 @@ static u8 readpubek[] = {
        0, 0, 0, 124,           /* TPM_ORD_ReadPubek */
 };
 
-static ssize_t show_pubek(struct device *dev, char *buf)
+static ssize_t show_pubek(struct device *dev, struct device_attribute *attr, char *buf)
 {
        u8 data[READ_PUBEK_RESULT_SIZE];
        ssize_t len;
@@ -330,7 +330,7 @@ static u8 cap_manufacturer[] = {
        0, 0, 1, 3
 };
 
-static ssize_t show_caps(struct device *dev, char *buf)
+static ssize_t show_caps(struct device *dev, struct device_attribute *attr, char *buf)
 {
        u8 data[READ_PUBEK_RESULT_SIZE];
        ssize_t len;
index 26e5e19ed8545b880833623e960f654378e595f0..31831030f73fcd3a0e59e159020edc42c89a3e3e 100644 (file)
@@ -2654,7 +2654,7 @@ static void tty_default_put_char(struct tty_struct *tty, unsigned char ch)
        tty->driver->write(tty, &ch, 1);
 }
 
-static struct class_simple *tty_class;
+static struct class *tty_class;
 
 /**
  * tty_register_device - register a tty device
@@ -2687,7 +2687,7 @@ void tty_register_device(struct tty_driver *driver, unsigned index,
                pty_line_name(driver, index, name);
        else
                tty_line_name(driver, index, name);
-       class_simple_device_add(tty_class, dev, device, name);
+       class_device_create(tty_class, dev, device, name);
 }
 
 /**
@@ -2701,7 +2701,7 @@ void tty_register_device(struct tty_driver *driver, unsigned index,
 void tty_unregister_device(struct tty_driver *driver, unsigned index)
 {
        devfs_remove("%s%d", driver->devfs_name, index + driver->name_base);
-       class_simple_device_remove(MKDEV(driver->major, driver->minor_start) + index);
+       class_device_destroy(tty_class, MKDEV(driver->major, driver->minor_start) + index);
 }
 
 EXPORT_SYMBOL(tty_register_device);
@@ -2918,7 +2918,7 @@ extern int vty_init(void);
 
 static int __init tty_class_init(void)
 {
-       tty_class = class_simple_create(THIS_MODULE, "tty");
+       tty_class = class_create(THIS_MODULE, "tty");
        if (IS_ERR(tty_class))
                return PTR_ERR(tty_class);
        return 0;
@@ -2947,14 +2947,14 @@ static int __init tty_init(void)
            register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
                panic("Couldn't register /dev/tty driver\n");
        devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 0), S_IFCHR|S_IRUGO|S_IWUGO, "tty");
-       class_simple_device_add(tty_class, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");
+       class_device_create(tty_class, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");
 
        cdev_init(&console_cdev, &console_fops);
        if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
            register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
                panic("Couldn't register /dev/console driver\n");
        devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 1), S_IFCHR|S_IRUSR|S_IWUSR, "console");
-       class_simple_device_add(tty_class, MKDEV(TTYAUX_MAJOR, 1), NULL, "console");
+       class_device_create(tty_class, MKDEV(TTYAUX_MAJOR, 1), NULL, "console");
 
 #ifdef CONFIG_UNIX98_PTYS
        cdev_init(&ptmx_cdev, &ptmx_fops);
@@ -2962,7 +2962,7 @@ static int __init tty_init(void)
            register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
                panic("Couldn't register /dev/ptmx driver\n");
        devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 2), S_IFCHR|S_IRUGO|S_IWUGO, "ptmx");
-       class_simple_device_add(tty_class, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
+       class_device_create(tty_class, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
 #endif
 
 #ifdef CONFIG_VT
@@ -2971,7 +2971,7 @@ static int __init tty_init(void)
            register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0)
                panic("Couldn't register /dev/tty0 driver\n");
        devfs_mk_cdev(MKDEV(TTY_MAJOR, 0), S_IFCHR|S_IRUSR|S_IWUSR, "vc/0");
-       class_simple_device_add(tty_class, MKDEV(TTY_MAJOR, 0), NULL, "tty0");
+       class_device_create(tty_class, MKDEV(TTY_MAJOR, 0), NULL, "tty0");
 
        vty_init();
 #endif
index 7abe405b8657cd835a30d54f9628d656c2ed4510..79c2928a8817d1132389a129c4da1a36dda8afb3 100644 (file)
@@ -474,7 +474,7 @@ static struct file_operations vcs_fops = {
        .open           = vcs_open,
 };
 
-static struct class_simple *vc_class;
+static struct class *vc_class;
 
 void vcs_make_devfs(struct tty_struct *tty)
 {
@@ -484,26 +484,26 @@ void vcs_make_devfs(struct tty_struct *tty)
        devfs_mk_cdev(MKDEV(VCS_MAJOR, tty->index + 129),
                        S_IFCHR|S_IRUSR|S_IWUSR,
                        "vcc/a%u", tty->index + 1);
-       class_simple_device_add(vc_class, MKDEV(VCS_MAJOR, tty->index + 1), NULL, "vcs%u", tty->index + 1);
-       class_simple_device_add(vc_class, MKDEV(VCS_MAJOR, tty->index + 129), NULL, "vcsa%u", tty->index + 1);
+       class_device_create(vc_class, MKDEV(VCS_MAJOR, tty->index + 1), NULL, "vcs%u", tty->index + 1);
+       class_device_create(vc_class, MKDEV(VCS_MAJOR, tty->index + 129), NULL, "vcsa%u", tty->index + 1);
 }
 void vcs_remove_devfs(struct tty_struct *tty)
 {
        devfs_remove("vcc/%u", tty->index + 1);
        devfs_remove("vcc/a%u", tty->index + 1);
-       class_simple_device_remove(MKDEV(VCS_MAJOR, tty->index + 1));
-       class_simple_device_remove(MKDEV(VCS_MAJOR, tty->index + 129));
+       class_device_destroy(vc_class, MKDEV(VCS_MAJOR, tty->index + 1));
+       class_device_destroy(vc_class, MKDEV(VCS_MAJOR, tty->index + 129));
 }
 
 int __init vcs_init(void)
 {
        if (register_chrdev(VCS_MAJOR, "vcs", &vcs_fops))
                panic("unable to get major %d for vcs device", VCS_MAJOR);
-       vc_class = class_simple_create(THIS_MODULE, "vc");
+       vc_class = class_create(THIS_MODULE, "vc");
 
        devfs_mk_cdev(MKDEV(VCS_MAJOR, 0), S_IFCHR|S_IRUSR|S_IWUSR, "vcc/0");
        devfs_mk_cdev(MKDEV(VCS_MAJOR, 128), S_IFCHR|S_IRUSR|S_IWUSR, "vcc/a0");
-       class_simple_device_add(vc_class, MKDEV(VCS_MAJOR, 0), NULL, "vcs");
-       class_simple_device_add(vc_class, MKDEV(VCS_MAJOR, 128), NULL, "vcsa");
+       class_device_create(vc_class, MKDEV(VCS_MAJOR, 0), NULL, "vcs");
+       class_device_create(vc_class, MKDEV(VCS_MAJOR, 128), NULL, "vcsa");
        return 0;
 }
index aea3cbf5219d4a0ab89827f6179bf4118264279a..4764b4f9555de93de3ec0e945a7089a4e5dbf537 100644 (file)
@@ -237,7 +237,7 @@ static dma_addr_t viotape_unitinfo_token;
 
 static struct mtget viomtget[VIOTAPE_MAX_TAPE];
 
-static struct class_simple *tape_class;
+static struct class *tape_class;
 
 static struct device *tape_device[VIOTAPE_MAX_TAPE];
 
@@ -956,9 +956,9 @@ static int viotape_probe(struct vio_dev *vdev, const struct vio_device_id *id)
        state[i].cur_part = 0;
        for (j = 0; j < MAX_PARTITIONS; ++j)
                state[i].part_stat_rwi[j] = VIOT_IDLE;
-       class_simple_device_add(tape_class, MKDEV(VIOTAPE_MAJOR, i), NULL,
+       class_device_create(tape_class, MKDEV(VIOTAPE_MAJOR, i), NULL,
                        "iseries!vt%d", i);
-       class_simple_device_add(tape_class, MKDEV(VIOTAPE_MAJOR, i | 0x80),
+       class_device_create(tape_class, MKDEV(VIOTAPE_MAJOR, i | 0x80),
                        NULL, "iseries!nvt%d", i);
        devfs_mk_cdev(MKDEV(VIOTAPE_MAJOR, i), S_IFCHR | S_IRUSR | S_IWUSR,
                        "iseries/vt%d", i);
@@ -980,8 +980,8 @@ static int viotape_remove(struct vio_dev *vdev)
        devfs_remove("iseries/nvt%d", i);
        devfs_remove("iseries/vt%d", i);
        devfs_unregister_tape(state[i].dev_handle);
-       class_simple_device_remove(MKDEV(VIOTAPE_MAJOR, i | 0x80));
-       class_simple_device_remove(MKDEV(VIOTAPE_MAJOR, i));
+       class_device_destroy(tape_class, MKDEV(VIOTAPE_MAJOR, i | 0x80));
+       class_device_destroy(tape_class, MKDEV(VIOTAPE_MAJOR, i));
        return 0;
 }
 
@@ -1045,7 +1045,7 @@ int __init viotap_init(void)
                goto clear_handler;
        }
 
-       tape_class = class_simple_create(THIS_MODULE, "tape");
+       tape_class = class_create(THIS_MODULE, "tape");
        if (IS_ERR(tape_class)) {
                printk(VIOTAPE_KERN_WARN "Unable to allocat class\n");
                ret = PTR_ERR(tape_class);
@@ -1070,7 +1070,7 @@ int __init viotap_init(void)
        return 0;
 
 unreg_class:
-       class_simple_destroy(tape_class);
+       class_destroy(tape_class);
 unreg_chrdev:
        unregister_chrdev(VIOTAPE_MAJOR, "viotape");
 clear_handler:
@@ -1110,7 +1110,7 @@ static void __exit viotap_exit(void)
 
        remove_proc_entry("iSeries/viotape", NULL);
        vio_unregister_driver(&viotape_driver);
-       class_simple_destroy(tape_class);
+       class_destroy(tape_class);
        ret = unregister_chrdev(VIOTAPE_MAJOR, "viotape");
        if (ret < 0)
                printk(VIOTAPE_KERN_WARN "Error unregistering device: %d\n",
diff --git a/drivers/char/vr41xx_giu.c b/drivers/char/vr41xx_giu.c
new file mode 100644 (file)
index 0000000..683278b
--- /dev/null
@@ -0,0 +1,743 @@
+/*
+ *  Driver for NEC VR4100 series General-purpose I/O Unit.
+ *
+ *  Copyright (C) 2002 MontaVista Software Inc.
+ *     Author: Yoichi Yuasa <yyuasa@mvista.com or source@mvista.com>
+ *  Copyright (C) 2003-2005  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#include <linux/device.h>
+#include <linux/errno.h>
+#include <linux/fs.h>
+#include <linux/init.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/spinlock.h>
+#include <linux/types.h>
+
+#include <asm/cpu.h>
+#include <asm/io.h>
+#include <asm/vr41xx/giu.h>
+#include <asm/vr41xx/vr41xx.h>
+
+MODULE_AUTHOR("Yoichi Yuasa <yuasa@hh.iij4u.or.jp>");
+MODULE_DESCRIPTION("NEC VR4100 series General-purpose I/O Unit driver");
+MODULE_LICENSE("GPL");
+
+static int major;      /* default is dynamic major device number */
+module_param(major, int, 0);
+MODULE_PARM_DESC(major, "Major device number");
+
+#define GIU_TYPE1_START                0x0b000100UL
+#define GIU_TYPE1_SIZE         0x20UL
+
+#define GIU_TYPE2_START                0x0f000140UL
+#define GIU_TYPE2_SIZE         0x20UL
+
+#define GIU_TYPE3_START                0x0f000140UL
+#define GIU_TYPE3_SIZE         0x28UL
+
+#define GIU_PULLUPDOWN_START   0x0b0002e0UL
+#define GIU_PULLUPDOWN_SIZE    0x04UL
+
+#define GIUIOSELL      0x00
+#define GIUIOSELH      0x02
+#define GIUPIODL       0x04
+#define GIUPIODH       0x06
+#define GIUINTSTATL    0x08
+#define GIUINTSTATH    0x0a
+#define GIUINTENL      0x0c
+#define GIUINTENH      0x0e
+#define GIUINTTYPL     0x10
+#define GIUINTTYPH     0x12
+#define GIUINTALSELL   0x14
+#define GIUINTALSELH   0x16
+#define GIUINTHTSELL   0x18
+#define GIUINTHTSELH   0x1a
+#define GIUPODATL      0x1c
+#define GIUPODATEN     0x1c
+#define GIUPODATH      0x1e
+ #define PIOEN0                0x0100
+ #define PIOEN1                0x0200
+#define GIUPODAT       0x1e
+#define GIUFEDGEINHL   0x20
+#define GIUFEDGEINHH   0x22
+#define GIUREDGEINHL   0x24
+#define GIUREDGEINHH   0x26
+
+#define GIUUSEUPDN     0x1e0
+#define GIUTERMUPDN    0x1e2
+
+#define GPIO_HAS_PULLUPDOWN_IO         0x0001
+#define GPIO_HAS_OUTPUT_ENABLE         0x0002
+#define GPIO_HAS_INTERRUPT_EDGE_SELECT 0x0100
+
+static spinlock_t giu_lock;
+static struct resource *giu_resource1;
+static struct resource *giu_resource2;
+static unsigned long giu_flags;
+static unsigned int giu_nr_pins;
+
+static void __iomem *giu_base;
+
+#define giu_read(offset)               readw(giu_base + (offset))
+#define giu_write(offset, value)       writew((value), giu_base + (offset))
+
+#define GPIO_PIN_OF_IRQ(irq)   ((irq) - GIU_IRQ_BASE)
+#define GIUINT_HIGH_OFFSET     16
+#define GIUINT_HIGH_MAX                32
+
+static inline uint16_t giu_set(uint16_t offset, uint16_t set)
+{
+       uint16_t data;
+
+       data = giu_read(offset);
+       data |= set;
+       giu_write(offset, data);
+
+       return data;
+}
+
+static inline uint16_t giu_clear(uint16_t offset, uint16_t clear)
+{
+       uint16_t data;
+
+       data = giu_read(offset);
+       data &= ~clear;
+       giu_write(offset, data);
+
+       return data;
+}
+
+static unsigned int startup_giuint_low_irq(unsigned int irq)
+{
+       unsigned int pin;
+
+       pin = GPIO_PIN_OF_IRQ(irq);
+       giu_write(GIUINTSTATL, 1 << pin);
+       giu_set(GIUINTENL, 1 << pin);
+
+       return 0;
+}
+
+static void shutdown_giuint_low_irq(unsigned int irq)
+{
+       giu_clear(GIUINTENL, 1 << GPIO_PIN_OF_IRQ(irq));
+}
+
+static void enable_giuint_low_irq(unsigned int irq)
+{
+       giu_set(GIUINTENL, 1 << GPIO_PIN_OF_IRQ(irq));
+}
+
+#define disable_giuint_low_irq shutdown_giuint_low_irq
+
+static void ack_giuint_low_irq(unsigned int irq)
+{
+       unsigned int pin;
+
+       pin = GPIO_PIN_OF_IRQ(irq);
+       giu_clear(GIUINTENL, 1 << pin);
+       giu_write(GIUINTSTATL, 1 << pin);
+}
+
+static void end_giuint_low_irq(unsigned int irq)
+{
+       if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
+               giu_set(GIUINTENL, 1 << GPIO_PIN_OF_IRQ(irq));
+}
+
+static struct hw_interrupt_type giuint_low_irq_type = {
+       .typename       = "GIUINTL",
+       .startup        = startup_giuint_low_irq,
+       .shutdown       = shutdown_giuint_low_irq,
+       .enable         = enable_giuint_low_irq,
+       .disable        = disable_giuint_low_irq,
+       .ack            = ack_giuint_low_irq,
+       .end            = end_giuint_low_irq,
+};
+
+static unsigned int startup_giuint_high_irq(unsigned int irq)
+{
+       unsigned int pin;
+
+       pin = GPIO_PIN_OF_IRQ(irq) - GIUINT_HIGH_OFFSET;
+       giu_write(GIUINTSTATH, 1 << pin);
+       giu_set(GIUINTENH, 1 << pin);
+
+       return 0;
+}
+
+static void shutdown_giuint_high_irq(unsigned int irq)
+{
+       giu_clear(GIUINTENH, 1 << (GPIO_PIN_OF_IRQ(irq) - GIUINT_HIGH_OFFSET));
+}
+
+static void enable_giuint_high_irq(unsigned int irq)
+{
+       giu_set(GIUINTENH, 1 << (GPIO_PIN_OF_IRQ(irq) - GIUINT_HIGH_OFFSET));
+}
+
+#define disable_giuint_high_irq        shutdown_giuint_high_irq
+
+static void ack_giuint_high_irq(unsigned int irq)
+{
+       unsigned int pin;
+
+       pin = GPIO_PIN_OF_IRQ(irq) - GIUINT_HIGH_OFFSET;
+       giu_clear(GIUINTENH, 1 << pin);
+       giu_write(GIUINTSTATH, 1 << pin);
+}
+
+static void end_giuint_high_irq(unsigned int irq)
+{
+       if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
+               giu_set(GIUINTENH, 1 << (GPIO_PIN_OF_IRQ(irq) - GIUINT_HIGH_OFFSET));
+}
+
+static struct hw_interrupt_type giuint_high_irq_type = {
+       .typename       = "GIUINTH",
+       .startup        = startup_giuint_high_irq,
+       .shutdown       = shutdown_giuint_high_irq,
+       .enable         = enable_giuint_high_irq,
+       .disable        = disable_giuint_high_irq,
+       .ack            = ack_giuint_high_irq,
+       .end            = end_giuint_high_irq,
+};
+
+static int giu_get_irq(unsigned int irq, struct pt_regs *regs)
+{
+       uint16_t pendl, pendh, maskl, maskh;
+       int i;
+
+       pendl = giu_read(GIUINTSTATL);
+       pendh = giu_read(GIUINTSTATH);
+       maskl = giu_read(GIUINTENL);
+       maskh = giu_read(GIUINTENH);
+
+       maskl &= pendl;
+       maskh &= pendh;
+
+       if (maskl) {
+               for (i = 0; i < 16; i++) {
+                       if (maskl & (1 << i))
+                               return GIU_IRQ(i);
+               }
+       } else if (maskh) {
+               for (i = 0; i < 16; i++) {
+                       if (maskh & (1 << i))
+                               return GIU_IRQ(i + GIUINT_HIGH_OFFSET);
+               }
+       }
+
+       printk(KERN_ERR "spurious GIU interrupt: %04x(%04x),%04x(%04x)\n",
+              maskl, pendl, maskh, pendh);
+
+       atomic_inc(&irq_err_count);
+
+       return -EINVAL;
+}
+
+void vr41xx_set_irq_trigger(unsigned int pin, irq_trigger_t trigger, irq_signal_t signal)
+{
+       uint16_t mask;
+
+       if (pin < GIUINT_HIGH_OFFSET) {
+               mask = 1 << pin;
+               if (trigger != IRQ_TRIGGER_LEVEL) {
+                       giu_set(GIUINTTYPL, mask);
+                       if (signal == IRQ_SIGNAL_HOLD)
+                               giu_set(GIUINTHTSELL, mask);
+                       else
+                               giu_clear(GIUINTHTSELL, mask);
+                       if (current_cpu_data.cputype == CPU_VR4133) {
+                               switch (trigger) {
+                               case IRQ_TRIGGER_EDGE_FALLING:
+                                       giu_set(GIUFEDGEINHL, mask);
+                                       giu_clear(GIUREDGEINHL, mask);
+                                       break;
+                               case IRQ_TRIGGER_EDGE_RISING:
+                                       giu_clear(GIUFEDGEINHL, mask);
+                                       giu_set(GIUREDGEINHL, mask);
+                                       break;
+                               default:
+                                       giu_set(GIUFEDGEINHL, mask);
+                                       giu_set(GIUREDGEINHL, mask);
+                                       break;
+                               }
+                       }
+               } else {
+                       giu_clear(GIUINTTYPL, mask);
+                       giu_clear(GIUINTHTSELL, mask);
+               }
+               giu_write(GIUINTSTATL, mask);
+       } else if (pin < GIUINT_HIGH_MAX) {
+               mask = 1 << (pin - GIUINT_HIGH_OFFSET);
+               if (trigger != IRQ_TRIGGER_LEVEL) {
+                       giu_set(GIUINTTYPH, mask);
+                       if (signal == IRQ_SIGNAL_HOLD)
+                               giu_set(GIUINTHTSELH, mask);
+                       else
+                               giu_clear(GIUINTHTSELH, mask);
+                       if (current_cpu_data.cputype == CPU_VR4133) {
+                               switch (trigger) {
+                               case IRQ_TRIGGER_EDGE_FALLING:
+                                       giu_set(GIUFEDGEINHH, mask);
+                                       giu_clear(GIUREDGEINHH, mask);
+                                       break;
+                               case IRQ_TRIGGER_EDGE_RISING:
+                                       giu_clear(GIUFEDGEINHH, mask);
+                                       giu_set(GIUREDGEINHH, mask);
+                                       break;
+                               default:
+                                       giu_set(GIUFEDGEINHH, mask);
+                                       giu_set(GIUREDGEINHH, mask);
+                                       break;
+                               }
+                       }
+               } else {
+                       giu_clear(GIUINTTYPH, mask);
+                       giu_clear(GIUINTHTSELH, mask);
+               }
+               giu_write(GIUINTSTATH, mask);
+       }
+}
+
+EXPORT_SYMBOL_GPL(vr41xx_set_irq_trigger);
+
+void vr41xx_set_irq_level(unsigned int pin, irq_level_t level)
+{
+       uint16_t mask;
+
+       if (pin < GIUINT_HIGH_OFFSET) {
+               mask = 1 << pin;
+               if (level == IRQ_LEVEL_HIGH)
+                       giu_set(GIUINTALSELL, mask);
+               else
+                       giu_clear(GIUINTALSELL, mask);
+               giu_write(GIUINTSTATL, mask);
+       } else if (pin < GIUINT_HIGH_MAX) {
+               mask = 1 << (pin - GIUINT_HIGH_OFFSET);
+               if (level == IRQ_LEVEL_HIGH)
+                       giu_set(GIUINTALSELH, mask);
+               else
+                       giu_clear(GIUINTALSELH, mask);
+               giu_write(GIUINTSTATH, mask);
+       }
+}
+
+EXPORT_SYMBOL_GPL(vr41xx_set_irq_level);
+
+gpio_data_t vr41xx_gpio_get_pin(unsigned int pin)
+{
+       uint16_t reg, mask;
+
+       if (pin >= giu_nr_pins)
+               return GPIO_DATA_INVAL;
+
+       if (pin < 16) {
+               reg = giu_read(GIUPIODL);
+               mask = (uint16_t)1 << pin;
+       } else if (pin < 32) {
+               reg = giu_read(GIUPIODH);
+               mask = (uint16_t)1 << (pin - 16);
+       } else if (pin < 48) {
+               reg = giu_read(GIUPODATL);
+               mask = (uint16_t)1 << (pin - 32);
+       } else {
+               reg = giu_read(GIUPODATH);
+               mask = (uint16_t)1 << (pin - 48);
+       }
+
+       if (reg & mask)
+               return GPIO_DATA_HIGH;
+
+       return GPIO_DATA_LOW;
+}
+
+EXPORT_SYMBOL_GPL(vr41xx_gpio_get_pin);
+
+int vr41xx_gpio_set_pin(unsigned int pin, gpio_data_t data)
+{
+       uint16_t offset, mask, reg;
+       unsigned long flags;
+
+       if (pin >= giu_nr_pins)
+               return -EINVAL;
+
+       if (pin < 16) {
+               offset = GIUPIODL;
+               mask = (uint16_t)1 << pin;
+       } else if (pin < 32) {
+               offset = GIUPIODH;
+               mask = (uint16_t)1 << (pin - 16);
+       } else if (pin < 48) {
+               offset = GIUPODATL;
+               mask = (uint16_t)1 << (pin - 32);
+       } else {
+               offset = GIUPODATH;
+               mask = (uint16_t)1 << (pin - 48);
+       }
+
+       spin_lock_irqsave(&giu_lock, flags);
+
+       reg = giu_read(offset);
+       if (data == GPIO_DATA_HIGH)
+               reg |= mask;
+       else
+               reg &= ~mask;
+       giu_write(offset, reg);
+
+       spin_unlock_irqrestore(&giu_lock, flags);
+
+       return 0;
+}
+
+EXPORT_SYMBOL_GPL(vr41xx_gpio_set_pin);
+
+int vr41xx_gpio_set_direction(unsigned int pin, gpio_direction_t dir)
+{
+       uint16_t offset, mask, reg;
+       unsigned long flags;
+
+       if (pin >= giu_nr_pins)
+               return -EINVAL;
+
+       if (pin < 16) {
+               offset = GIUIOSELL;
+               mask = (uint16_t)1 << pin;
+       } else if (pin < 32) {
+               offset = GIUIOSELH;
+               mask = (uint16_t)1 << (pin - 16);
+       } else {
+               if (giu_flags & GPIO_HAS_OUTPUT_ENABLE) {
+                       offset = GIUPODATEN;
+                       mask = (uint16_t)1 << (pin - 32);
+               } else {
+                       switch (pin) {
+                       case 48:
+                               offset = GIUPODATH;
+                               mask = PIOEN0;
+                               break;
+                       case 49:
+                               offset = GIUPODATH;
+                               mask = PIOEN1;
+                               break;
+                       default:
+                               return -EINVAL;
+                       }
+               }
+       }
+
+       spin_lock_irqsave(&giu_lock, flags);
+
+       reg = giu_read(offset);
+       if (dir == GPIO_OUTPUT)
+               reg |= mask;
+       else
+               reg &= ~mask;
+       giu_write(offset, reg);
+
+       spin_unlock_irqrestore(&giu_lock, flags);
+
+       return 0;
+}
+
+EXPORT_SYMBOL_GPL(vr41xx_gpio_set_direction);
+
+int vr41xx_gpio_pullupdown(unsigned int pin, gpio_pull_t pull)
+{
+       uint16_t reg, mask;
+       unsigned long flags;
+
+       if ((giu_flags & GPIO_HAS_PULLUPDOWN_IO) != GPIO_HAS_PULLUPDOWN_IO)
+               return -EPERM;
+
+       if (pin >= 15)
+               return -EINVAL;
+
+       mask = (uint16_t)1 << pin;
+
+       spin_lock_irqsave(&giu_lock, flags);
+
+       if (pull == GPIO_PULL_UP || pull == GPIO_PULL_DOWN) {
+               reg = giu_read(GIUTERMUPDN);
+               if (pull == GPIO_PULL_UP)
+                       reg |= mask;
+               else
+                       reg &= ~mask;
+               giu_write(GIUTERMUPDN, reg);
+
+               reg = giu_read(GIUUSEUPDN);
+               reg |= mask;
+               giu_write(GIUUSEUPDN, reg);
+       } else {
+               reg = giu_read(GIUUSEUPDN);
+               reg &= ~mask;
+               giu_write(GIUUSEUPDN, reg);
+       }
+
+       spin_unlock_irqrestore(&giu_lock, flags);
+
+       return 0;
+}
+
+EXPORT_SYMBOL_GPL(vr41xx_gpio_pullupdown);
+
+static ssize_t gpio_read(struct file *file, char __user *buf, size_t len,
+                         loff_t *ppos)
+{
+       unsigned int pin;
+       char value = '0';
+
+       pin = iminor(file->f_dentry->d_inode);
+       if (pin >= giu_nr_pins)
+               return -EBADF;
+
+       if (vr41xx_gpio_get_pin(pin) == GPIO_DATA_HIGH)
+               value = '1';
+
+       if (len <= 0)
+               return -EFAULT;
+
+       if (put_user(value, buf))
+               return -EFAULT;
+
+       return 1;
+}
+
+static ssize_t gpio_write(struct file *file, const char __user *data,
+                          size_t len, loff_t *ppos)
+{
+       unsigned int pin;
+       size_t i;
+       char c;
+       int retval = 0;
+
+       pin = iminor(file->f_dentry->d_inode);
+       if (pin >= giu_nr_pins)
+               return -EBADF;
+
+       for (i = 0; i < len; i++) {
+               if (get_user(c, data + i))
+                       return -EFAULT;
+
+               switch (c) {
+               case '0':
+                       retval = vr41xx_gpio_set_pin(pin, GPIO_DATA_LOW);
+                       break;
+               case '1':
+                       retval = vr41xx_gpio_set_pin(pin, GPIO_DATA_HIGH);
+                       break;
+               case 'D':
+                       printk(KERN_INFO "GPIO%d: pull down\n", pin);
+                       retval = vr41xx_gpio_pullupdown(pin, GPIO_PULL_DOWN);
+                       break;
+               case 'd':
+                       printk(KERN_INFO "GPIO%d: pull up/down disable\n", pin);
+                       retval = vr41xx_gpio_pullupdown(pin, GPIO_PULL_DISABLE);
+                       break;
+               case 'I':
+                       printk(KERN_INFO "GPIO%d: input\n", pin);
+                       retval = vr41xx_gpio_set_direction(pin, GPIO_INPUT);
+                       break;
+               case 'O':
+                       printk(KERN_INFO "GPIO%d: output\n", pin);
+                       retval = vr41xx_gpio_set_direction(pin, GPIO_OUTPUT);
+                       break;
+               case 'o':
+                       printk(KERN_INFO "GPIO%d: output disable\n", pin);
+                       retval = vr41xx_gpio_set_direction(pin, GPIO_OUTPUT_DISABLE);
+                       break;
+               case 'P':
+                       printk(KERN_INFO "GPIO%d: pull up\n", pin);
+                       retval = vr41xx_gpio_pullupdown(pin, GPIO_PULL_UP);
+                       break;
+               case 'p':
+                       printk(KERN_INFO "GPIO%d: pull up/down disable\n", pin);
+                       retval = vr41xx_gpio_pullupdown(pin, GPIO_PULL_DISABLE);
+                       break;
+               default:
+                       break;
+               }
+
+               if (retval < 0)
+                       break;
+       }
+
+       return i;
+}
+
+static int gpio_open(struct inode *inode, struct file *file)
+{
+       unsigned int pin;
+
+       pin = iminor(inode);
+       if (pin >= giu_nr_pins)
+               return -EBADF;
+
+       return nonseekable_open(inode, file);
+}
+
+static int gpio_release(struct inode *inode, struct file *file)
+{
+       unsigned int pin;
+
+       pin = iminor(inode);
+       if (pin >= giu_nr_pins)
+               return -EBADF;
+
+       return 0;
+}
+
+static struct file_operations gpio_fops = {
+       .owner          = THIS_MODULE,
+       .read           = gpio_read,
+       .write          = gpio_write,
+       .open           = gpio_open,
+       .release        = gpio_release,
+};
+
+static int giu_probe(struct device *dev)
+{
+       unsigned long start, size, flags = 0;
+       unsigned int nr_pins = 0;
+       struct resource *res1, *res2 = NULL;
+       void *base;
+       int retval, i;
+
+       switch (current_cpu_data.cputype) {
+       case CPU_VR4111:
+       case CPU_VR4121:
+               start = GIU_TYPE1_START;
+               size = GIU_TYPE1_SIZE;
+               flags = GPIO_HAS_PULLUPDOWN_IO;
+               nr_pins = 50;
+               break;
+       case CPU_VR4122:
+       case CPU_VR4131:
+               start = GIU_TYPE2_START;
+               size = GIU_TYPE2_SIZE;
+               nr_pins = 36;
+               break;
+       case CPU_VR4133:
+               start = GIU_TYPE3_START;
+               size = GIU_TYPE3_SIZE;
+               flags = GPIO_HAS_INTERRUPT_EDGE_SELECT;
+               nr_pins = 48;
+               break;
+       default:
+               return -ENODEV;
+       }
+
+       res1 = request_mem_region(start, size, "GIU");
+       if (res1 == NULL)
+               return -EBUSY;
+
+       base = ioremap(start, size);
+       if (base == NULL) {
+               release_resource(res1);
+               return -ENOMEM;
+       }
+
+       if (flags & GPIO_HAS_PULLUPDOWN_IO) {
+               res2 = request_mem_region(GIU_PULLUPDOWN_START, GIU_PULLUPDOWN_SIZE, "GIU");
+               if (res2 == NULL) {
+                       iounmap(base);
+                       release_resource(res1);
+                       return -EBUSY;
+               }
+       }
+
+       retval = register_chrdev(major, "GIU", &gpio_fops);
+       if (retval < 0) {
+               iounmap(base);
+               release_resource(res1);
+               release_resource(res2);
+               return retval;
+       }
+
+       if (major == 0) {
+               major = retval;
+               printk(KERN_INFO "GIU: major number %d\n", major);
+       }
+
+       spin_lock_init(&giu_lock);
+       giu_base = base;
+       giu_resource1 = res1;
+       giu_resource2 = res2;
+       giu_flags = flags;
+       giu_nr_pins = nr_pins;
+
+       giu_write(GIUINTENL, 0);
+       giu_write(GIUINTENH, 0);
+
+       for (i = GIU_IRQ_BASE; i <= GIU_IRQ_LAST; i++) {
+               if (i < GIU_IRQ(GIUINT_HIGH_OFFSET))
+                       irq_desc[i].handler = &giuint_low_irq_type;
+               else
+                       irq_desc[i].handler = &giuint_high_irq_type;
+       }
+
+       return cascade_irq(GIUINT_IRQ, giu_get_irq);
+}
+
+static int giu_remove(struct device *dev)
+{
+       iounmap(giu_base);
+
+       release_resource(giu_resource1);
+       if (giu_flags & GPIO_HAS_PULLUPDOWN_IO)
+               release_resource(giu_resource2);
+
+       return 0;
+}
+
+static struct platform_device *giu_platform_device;
+
+static struct device_driver giu_device_driver = {
+       .name           = "GIU",
+       .bus            = &platform_bus_type,
+       .probe          = giu_probe,
+       .remove         = giu_remove,
+};
+
+static int __devinit vr41xx_giu_init(void)
+{
+       int retval;
+
+       giu_platform_device = platform_device_register_simple("GIU", -1, NULL, 0);
+       if (IS_ERR(giu_platform_device))
+               return PTR_ERR(giu_platform_device);
+
+       retval = driver_register(&giu_device_driver);
+       if (retval < 0)
+               platform_device_unregister(giu_platform_device);
+
+       return retval;
+}
+
+static void __devexit vr41xx_giu_exit(void)
+{
+       driver_unregister(&giu_device_driver);
+
+       platform_device_unregister(giu_platform_device);
+}
+
+module_init(vr41xx_giu_init);
+module_exit(vr41xx_giu_exit);
index e5ef1dfc54826a33b4b86e9347b8584087bda831..d7aa7a29f67e888c5f2b1946245ef84f60c47783 100644 (file)
@@ -2867,6 +2867,10 @@ void unblank_screen(void)
  */
 static void blank_screen_t(unsigned long dummy)
 {
+       if (unlikely(!keventd_up())) {
+               mod_timer(&console_timer, jiffies + blankinterval);
+               return;
+       }
        blank_timer_expired = 1;
        schedule_work(&console_work);
 }
index c337978dc966b7e955a1ed736e8fd7bad47a062b..b14d642439ed1343ba30e8db18769176d80a9b63 100644 (file)
@@ -382,6 +382,7 @@ static struct pci_device_id i8xx_tco_pci_tbl[] = {
        { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_2,      PCI_ANY_ID, PCI_ANY_ID, },
        { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0,      PCI_ANY_ID, PCI_ANY_ID, },
        { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_1,      PCI_ANY_ID, PCI_ANY_ID, },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_1,       PCI_ANY_ID, PCI_ANY_ID, },
        { 0, },                 /* End of list */
 };
 MODULE_DEVICE_TABLE (pci, i8xx_tco_pci_tbl);
index ab659d37b4d2bb4aa0dc50e932c512adea781e59..4e98c215e5b1bd63788ff031638191e0024045e8 100644 (file)
@@ -192,7 +192,12 @@ static struct miscdevice ixp2000_wdt_miscdev =
 
 static int __init ixp2000_wdt_init(void)
 {
-       wdt_tick_rate = (*IXP2000_T1_CLD * HZ)/ 256;;
+       if ((*IXP2000_PRODUCT_ID & 0x001ffef0) == 0x00000000) {
+               printk(KERN_INFO "Unable to use IXP2000 watchdog due to IXP2800 erratum #25.\n");
+               return -EIO;
+       }
+
+       wdt_tick_rate = (*IXP2000_T1_CLD * HZ) / 256;
 
        return misc_register(&ixp2000_wdt_miscdev);
 }
index 95882bb1950e3c2f211e28467d782a51fb4cd69a..60c9be99c6d91244f311dccd2837f49e00b14e87 100644 (file)
@@ -46,6 +46,10 @@ config CPU_FREQ_STAT_DETAILS
          This will show detail CPU frequency translation table in sysfs file
          system
 
+# Note that it is not currently possible to set the other governors (such as ondemand)
+# as the default, since if they fail to initialise, cpufreq will be
+# left in an undefined state.
+
 choice
        prompt "Default CPUFreq governor"
        default CPU_FREQ_DEFAULT_GOV_USERSPACE if CPU_FREQ_SA1100 || CPU_FREQ_SA1110
@@ -115,4 +119,24 @@ config CPU_FREQ_GOV_ONDEMAND
 
          If in doubt, say N.
 
+config CPU_FREQ_GOV_CONSERVATIVE
+       tristate "'conservative' cpufreq governor"
+       depends on CPU_FREQ
+       help
+         'conservative' - this driver is rather similar to the 'ondemand'
+         governor both in its source code and its purpose, the difference is
+         its optimisation for better suitability in a battery powered
+         environment.  The frequency is gracefully increased and decreased
+         rather than jumping to 100% when speed is required.
+
+         If you have a desktop machine then you should really be considering
+         the 'ondemand' governor instead, however if you are using a laptop,
+         PDA or even an AMD64 based computer (due to the unacceptable
+         step-by-step latency issues between the minimum and maximum frequency
+         transitions in the CPU) you will probably want to use this governor.
+
+         For details, take a look at linux/Documentation/cpu-freq.
+
+         If in doubt, say N.
+
 endif  # CPU_FREQ
index 67b16e5a41a790d1cbfcc9aae766f96c1b379e6c..71fc3b4173f10d2d81930ae003445f0037fb1e7d 100644 (file)
@@ -8,6 +8,7 @@ obj-$(CONFIG_CPU_FREQ_GOV_PERFORMANCE)  += cpufreq_performance.o
 obj-$(CONFIG_CPU_FREQ_GOV_POWERSAVE)   += cpufreq_powersave.o
 obj-$(CONFIG_CPU_FREQ_GOV_USERSPACE)   += cpufreq_userspace.o
 obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND)    += cpufreq_ondemand.o
+obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE)        += cpufreq_conservative.o
 
 # CPUfreq cross-arch helpers
 obj-$(CONFIG_CPU_FREQ_TABLE)           += freq_table.o
index 8e561313d0942571c99de7c19b26f920d355f974..bf62dfe4976acc4f986886aa3e922c2c453d011a 100644 (file)
@@ -258,7 +258,7 @@ void cpufreq_notify_transition(struct cpufreq_freqs *freqs, unsigned int state)
                            (likely(cpufreq_cpu_data[freqs->cpu]->cur)) &&
                            (unlikely(freqs->old != cpufreq_cpu_data[freqs->cpu]->cur)))
                        {
-                               printk(KERN_WARNING "Warning: CPU frequency is %u, "
+                               dprintk(KERN_WARNING "Warning: CPU frequency is %u, "
                                       "cpufreq assumed %u kHz.\n", freqs->old, cpufreq_cpu_data[freqs->cpu]->cur);
                                freqs->old = cpufreq_cpu_data[freqs->cpu]->cur;
                        }
@@ -521,7 +521,7 @@ static ssize_t show(struct kobject * kobj, struct attribute * attr ,char * buf)
        policy = cpufreq_cpu_get(policy->cpu);
        if (!policy)
                return -EINVAL;
-       ret = fattr->show ? fattr->show(policy,buf) : 0;
+       ret = fattr->show ? fattr->show(policy,buf) : -EIO;
        cpufreq_cpu_put(policy);
        return ret;
 }
@@ -535,7 +535,7 @@ static ssize_t store(struct kobject * kobj, struct attribute * attr,
        policy = cpufreq_cpu_get(policy->cpu);
        if (!policy)
                return -EINVAL;
-       ret = fattr->store ? fattr->store(policy,buf,count) : 0;
+       ret = fattr->store ? fattr->store(policy,buf,count) : -EIO;
        cpufreq_cpu_put(policy);
        return ret;
 }
@@ -814,7 +814,7 @@ static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq, unsigne
 {
        struct cpufreq_freqs freqs;
 
-       printk(KERN_WARNING "Warning: CPU frequency out of sync: cpufreq and timing "
+       dprintk(KERN_WARNING "Warning: CPU frequency out of sync: cpufreq and timing "
               "core thinks of %u, is %u kHz.\n", old_freq, new_freq);
 
        freqs.cpu = cpu;
@@ -923,7 +923,7 @@ static int cpufreq_suspend(struct sys_device * sysdev, u32 state)
                struct cpufreq_freqs freqs;
 
                if (!(cpufreq_driver->flags & CPUFREQ_PM_NO_WARN))
-                       printk(KERN_DEBUG "Warning: CPU frequency is %u, "
+                       dprintk(KERN_DEBUG "Warning: CPU frequency is %u, "
                               "cpufreq assumed %u kHz.\n",
                               cur_freq, cpu_policy->cur);
 
@@ -1004,7 +1004,7 @@ static int cpufreq_resume(struct sys_device * sysdev)
                        struct cpufreq_freqs freqs;
 
                        if (!(cpufreq_driver->flags & CPUFREQ_PM_NO_WARN))
-                               printk(KERN_WARNING "Warning: CPU frequency"
+                               dprintk(KERN_WARNING "Warning: CPU frequency"
                                       "is %u, cpufreq assumed %u kHz.\n",
                                       cur_freq, cpu_policy->cur);
 
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c
new file mode 100644 (file)
index 0000000..e1df376
--- /dev/null
@@ -0,0 +1,586 @@
+/*
+ *  drivers/cpufreq/cpufreq_conservative.c
+ *
+ *  Copyright (C)  2001 Russell King
+ *            (C)  2003 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>.
+ *                      Jun Nakajima <jun.nakajima@intel.com>
+ *            (C)  2004 Alexander Clouter <alex-kernel@digriz.org.uk>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/smp.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/ctype.h>
+#include <linux/cpufreq.h>
+#include <linux/sysctl.h>
+#include <linux/types.h>
+#include <linux/fs.h>
+#include <linux/sysfs.h>
+#include <linux/sched.h>
+#include <linux/kmod.h>
+#include <linux/workqueue.h>
+#include <linux/jiffies.h>
+#include <linux/kernel_stat.h>
+#include <linux/percpu.h>
+
+/*
+ * dbs is used in this file as a shortform for demandbased switching
+ * It helps to keep variable names smaller, simpler
+ */
+
+#define DEF_FREQUENCY_UP_THRESHOLD             (80)
+#define MIN_FREQUENCY_UP_THRESHOLD             (0)
+#define MAX_FREQUENCY_UP_THRESHOLD             (100)
+
+#define DEF_FREQUENCY_DOWN_THRESHOLD           (20)
+#define MIN_FREQUENCY_DOWN_THRESHOLD           (0)
+#define MAX_FREQUENCY_DOWN_THRESHOLD           (100)
+
+/* 
+ * The polling frequency of this governor depends on the capability of 
+ * the processor. Default polling frequency is 1000 times the transition
+ * latency of the processor. The governor will work on any processor with 
+ * transition latency <= 10mS, using appropriate sampling 
+ * rate.
+ * For CPUs with transition latency > 10mS (mostly drivers with CPUFREQ_ETERNAL)
+ * this governor will not work.
+ * All times here are in uS.
+ */
+static unsigned int                            def_sampling_rate;
+#define MIN_SAMPLING_RATE                      (def_sampling_rate / 2)
+#define MAX_SAMPLING_RATE                      (500 * def_sampling_rate)
+#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER   (100000)
+#define DEF_SAMPLING_DOWN_FACTOR               (5)
+#define TRANSITION_LATENCY_LIMIT               (10 * 1000)
+
+static void do_dbs_timer(void *data);
+
+struct cpu_dbs_info_s {
+       struct cpufreq_policy   *cur_policy;
+       unsigned int            prev_cpu_idle_up;
+       unsigned int            prev_cpu_idle_down;
+       unsigned int            enable;
+};
+static DEFINE_PER_CPU(struct cpu_dbs_info_s, cpu_dbs_info);
+
+static unsigned int dbs_enable;        /* number of CPUs using this policy */
+
+static DECLARE_MUTEX   (dbs_sem);
+static DECLARE_WORK    (dbs_work, do_dbs_timer, NULL);
+
+struct dbs_tuners {
+       unsigned int            sampling_rate;
+       unsigned int            sampling_down_factor;
+       unsigned int            up_threshold;
+       unsigned int            down_threshold;
+       unsigned int            ignore_nice;
+       unsigned int            freq_step;
+};
+
+static struct dbs_tuners dbs_tuners_ins = {
+       .up_threshold           = DEF_FREQUENCY_UP_THRESHOLD,
+       .down_threshold         = DEF_FREQUENCY_DOWN_THRESHOLD,
+       .sampling_down_factor   = DEF_SAMPLING_DOWN_FACTOR,
+};
+
+static inline unsigned int get_cpu_idle_time(unsigned int cpu)
+{
+       return  kstat_cpu(cpu).cpustat.idle +
+               kstat_cpu(cpu).cpustat.iowait +
+               ( !dbs_tuners_ins.ignore_nice ? 
+                 kstat_cpu(cpu).cpustat.nice :
+                 0);
+}
+
+/************************** sysfs interface ************************/
+static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf)
+{
+       return sprintf (buf, "%u\n", MAX_SAMPLING_RATE);
+}
+
+static ssize_t show_sampling_rate_min(struct cpufreq_policy *policy, char *buf)
+{
+       return sprintf (buf, "%u\n", MIN_SAMPLING_RATE);
+}
+
+#define define_one_ro(_name)                                   \
+static struct freq_attr _name =                                \
+__ATTR(_name, 0444, show_##_name, NULL)
+
+define_one_ro(sampling_rate_max);
+define_one_ro(sampling_rate_min);
+
+/* cpufreq_conservative Governor Tunables */
+#define show_one(file_name, object)                                    \
+static ssize_t show_##file_name                                                \
+(struct cpufreq_policy *unused, char *buf)                             \
+{                                                                      \
+       return sprintf(buf, "%u\n", dbs_tuners_ins.object);             \
+}
+show_one(sampling_rate, sampling_rate);
+show_one(sampling_down_factor, sampling_down_factor);
+show_one(up_threshold, up_threshold);
+show_one(down_threshold, down_threshold);
+show_one(ignore_nice, ignore_nice);
+show_one(freq_step, freq_step);
+
+static ssize_t store_sampling_down_factor(struct cpufreq_policy *unused, 
+               const char *buf, size_t count)
+{
+       unsigned int input;
+       int ret;
+       ret = sscanf (buf, "%u", &input);
+       if (ret != 1 )
+               return -EINVAL;
+
+       down(&dbs_sem);
+       dbs_tuners_ins.sampling_down_factor = input;
+       up(&dbs_sem);
+
+       return count;
+}
+
+static ssize_t store_sampling_rate(struct cpufreq_policy *unused, 
+               const char *buf, size_t count)
+{
+       unsigned int input;
+       int ret;
+       ret = sscanf (buf, "%u", &input);
+
+       down(&dbs_sem);
+       if (ret != 1 || input > MAX_SAMPLING_RATE || input < MIN_SAMPLING_RATE) {
+               up(&dbs_sem);
+               return -EINVAL;
+       }
+
+       dbs_tuners_ins.sampling_rate = input;
+       up(&dbs_sem);
+
+       return count;
+}
+
+static ssize_t store_up_threshold(struct cpufreq_policy *unused, 
+               const char *buf, size_t count)
+{
+       unsigned int input;
+       int ret;
+       ret = sscanf (buf, "%u", &input);
+
+       down(&dbs_sem);
+       if (ret != 1 || input > MAX_FREQUENCY_UP_THRESHOLD || 
+                       input < MIN_FREQUENCY_UP_THRESHOLD ||
+                       input <= dbs_tuners_ins.down_threshold) {
+               up(&dbs_sem);
+               return -EINVAL;
+       }
+
+       dbs_tuners_ins.up_threshold = input;
+       up(&dbs_sem);
+
+       return count;
+}
+
+static ssize_t store_down_threshold(struct cpufreq_policy *unused, 
+               const char *buf, size_t count)
+{
+       unsigned int input;
+       int ret;
+       ret = sscanf (buf, "%u", &input);
+
+       down(&dbs_sem);
+       if (ret != 1 || input > MAX_FREQUENCY_DOWN_THRESHOLD || 
+                       input < MIN_FREQUENCY_DOWN_THRESHOLD ||
+                       input >= dbs_tuners_ins.up_threshold) {
+               up(&dbs_sem);
+               return -EINVAL;
+       }
+
+       dbs_tuners_ins.down_threshold = input;
+       up(&dbs_sem);
+
+       return count;
+}
+
+static ssize_t store_ignore_nice(struct cpufreq_policy *policy,
+               const char *buf, size_t count)
+{
+       unsigned int input;
+       int ret;
+
+       unsigned int j;
+       
+       ret = sscanf (buf, "%u", &input);
+       if ( ret != 1 )
+               return -EINVAL;
+
+       if ( input > 1 )
+               input = 1;
+       
+       down(&dbs_sem);
+       if ( input == dbs_tuners_ins.ignore_nice ) { /* nothing to do */
+               up(&dbs_sem);
+               return count;
+       }
+       dbs_tuners_ins.ignore_nice = input;
+
+       /* we need to re-evaluate prev_cpu_idle_up and prev_cpu_idle_down */
+       for_each_online_cpu(j) {
+               struct cpu_dbs_info_s *j_dbs_info;
+               j_dbs_info = &per_cpu(cpu_dbs_info, j);
+               j_dbs_info->prev_cpu_idle_up = get_cpu_idle_time(j);
+               j_dbs_info->prev_cpu_idle_down = j_dbs_info->prev_cpu_idle_up;
+       }
+       up(&dbs_sem);
+
+       return count;
+}
+
+static ssize_t store_freq_step(struct cpufreq_policy *policy,
+               const char *buf, size_t count)
+{
+       unsigned int input;
+       int ret;
+
+       ret = sscanf (buf, "%u", &input);
+
+       if ( ret != 1 )
+               return -EINVAL;
+
+       if ( input > 100 )
+               input = 100;
+       
+       /* no need to test here if freq_step is zero as the user might actually
+        * want this, they would be crazy though :) */
+       down(&dbs_sem);
+       dbs_tuners_ins.freq_step = input;
+       up(&dbs_sem);
+
+       return count;
+}
+
+#define define_one_rw(_name) \
+static struct freq_attr _name = \
+__ATTR(_name, 0644, show_##_name, store_##_name)
+
+define_one_rw(sampling_rate);
+define_one_rw(sampling_down_factor);
+define_one_rw(up_threshold);
+define_one_rw(down_threshold);
+define_one_rw(ignore_nice);
+define_one_rw(freq_step);
+
+static struct attribute * dbs_attributes[] = {
+       &sampling_rate_max.attr,
+       &sampling_rate_min.attr,
+       &sampling_rate.attr,
+       &sampling_down_factor.attr,
+       &up_threshold.attr,
+       &down_threshold.attr,
+       &ignore_nice.attr,
+       &freq_step.attr,
+       NULL
+};
+
+static struct attribute_group dbs_attr_group = {
+       .attrs = dbs_attributes,
+       .name = "conservative",
+};
+
+/************************** sysfs end ************************/
+
+static void dbs_check_cpu(int cpu)
+{
+       unsigned int idle_ticks, up_idle_ticks, down_idle_ticks;
+       unsigned int freq_step;
+       unsigned int freq_down_sampling_rate;
+       static int down_skip[NR_CPUS];
+       static int requested_freq[NR_CPUS];
+       static unsigned short init_flag = 0;
+       struct cpu_dbs_info_s *this_dbs_info;
+       struct cpu_dbs_info_s *dbs_info;
+
+       struct cpufreq_policy *policy;
+       unsigned int j;
+
+       this_dbs_info = &per_cpu(cpu_dbs_info, cpu);
+       if (!this_dbs_info->enable)
+               return;
+
+       policy = this_dbs_info->cur_policy;
+
+       if ( init_flag == 0 ) {
+               for ( /* NULL */; init_flag < NR_CPUS; init_flag++ ) {
+                       dbs_info = &per_cpu(cpu_dbs_info, init_flag);
+                       requested_freq[cpu] = dbs_info->cur_policy->cur;
+               }
+               init_flag = 1;
+       }
+       
+       /* 
+        * The default safe range is 20% to 80% 
+        * Every sampling_rate, we check
+        *      - If current idle time is less than 20%, then we try to 
+        *        increase frequency
+        * Every sampling_rate*sampling_down_factor, we check
+        *      - If current idle time is more than 80%, then we try to
+        *        decrease frequency
+        *
+        * Any frequency increase takes it to the maximum frequency. 
+        * Frequency reduction happens at minimum steps of 
+        * 5% (default) of max_frequency 
+        */
+
+       /* Check for frequency increase */
+
+       idle_ticks = UINT_MAX;
+       for_each_cpu_mask(j, policy->cpus) {
+               unsigned int tmp_idle_ticks, total_idle_ticks;
+               struct cpu_dbs_info_s *j_dbs_info;
+
+               j_dbs_info = &per_cpu(cpu_dbs_info, j);
+               /* Check for frequency increase */
+               total_idle_ticks = get_cpu_idle_time(j);
+               tmp_idle_ticks = total_idle_ticks -
+                       j_dbs_info->prev_cpu_idle_up;
+               j_dbs_info->prev_cpu_idle_up = total_idle_ticks;
+
+               if (tmp_idle_ticks < idle_ticks)
+                       idle_ticks = tmp_idle_ticks;
+       }
+
+       /* Scale idle ticks by 100 and compare with up and down ticks */
+       idle_ticks *= 100;
+       up_idle_ticks = (100 - dbs_tuners_ins.up_threshold) *
+               usecs_to_jiffies(dbs_tuners_ins.sampling_rate);
+
+       if (idle_ticks < up_idle_ticks) {
+               down_skip[cpu] = 0;
+               for_each_cpu_mask(j, policy->cpus) {
+                       struct cpu_dbs_info_s *j_dbs_info;
+
+                       j_dbs_info = &per_cpu(cpu_dbs_info, j);
+                       j_dbs_info->prev_cpu_idle_down = 
+                                       j_dbs_info->prev_cpu_idle_up;
+               }
+               /* if we are already at full speed then break out early */
+               if (requested_freq[cpu] == policy->max)
+                       return;
+               
+               freq_step = (dbs_tuners_ins.freq_step * policy->max) / 100;
+
+               /* max freq cannot be less than 100. But who knows.... */
+               if (unlikely(freq_step == 0))
+                       freq_step = 5;
+               
+               requested_freq[cpu] += freq_step;
+               if (requested_freq[cpu] > policy->max)
+                       requested_freq[cpu] = policy->max;
+
+               __cpufreq_driver_target(policy, requested_freq[cpu], 
+                       CPUFREQ_RELATION_H);
+               return;
+       }
+
+       /* Check for frequency decrease */
+       down_skip[cpu]++;
+       if (down_skip[cpu] < dbs_tuners_ins.sampling_down_factor)
+               return;
+
+       idle_ticks = UINT_MAX;
+       for_each_cpu_mask(j, policy->cpus) {
+               unsigned int tmp_idle_ticks, total_idle_ticks;
+               struct cpu_dbs_info_s *j_dbs_info;
+
+               j_dbs_info = &per_cpu(cpu_dbs_info, j);
+               total_idle_ticks = j_dbs_info->prev_cpu_idle_up;
+               tmp_idle_ticks = total_idle_ticks -
+                       j_dbs_info->prev_cpu_idle_down;
+               j_dbs_info->prev_cpu_idle_down = total_idle_ticks;
+
+               if (tmp_idle_ticks < idle_ticks)
+                       idle_ticks = tmp_idle_ticks;
+       }
+
+       /* Scale idle ticks by 100 and compare with up and down ticks */
+       idle_ticks *= 100;
+       down_skip[cpu] = 0;
+
+       freq_down_sampling_rate = dbs_tuners_ins.sampling_rate *
+               dbs_tuners_ins.sampling_down_factor;
+       down_idle_ticks = (100 - dbs_tuners_ins.down_threshold) *
+                       usecs_to_jiffies(freq_down_sampling_rate);
+
+       if (idle_ticks > down_idle_ticks) {
+               /* if we are already at the lowest speed then break out early
+                * or if we 'cannot' reduce the speed as the user might want
+                * freq_step to be zero */
+               if (requested_freq[cpu] == policy->min
+                               || dbs_tuners_ins.freq_step == 0)
+                       return;
+
+               freq_step = (dbs_tuners_ins.freq_step * policy->max) / 100;
+
+               /* max freq cannot be less than 100. But who knows.... */
+               if (unlikely(freq_step == 0))
+                       freq_step = 5;
+
+               requested_freq[cpu] -= freq_step;
+               if (requested_freq[cpu] < policy->min)
+                       requested_freq[cpu] = policy->min;
+
+               __cpufreq_driver_target(policy,
+                       requested_freq[cpu],
+                       CPUFREQ_RELATION_H);
+               return;
+       }
+}
+
+static void do_dbs_timer(void *data)
+{ 
+       int i;
+       down(&dbs_sem);
+       for_each_online_cpu(i)
+               dbs_check_cpu(i);
+       schedule_delayed_work(&dbs_work, 
+                       usecs_to_jiffies(dbs_tuners_ins.sampling_rate));
+       up(&dbs_sem);
+} 
+
+static inline void dbs_timer_init(void)
+{
+       INIT_WORK(&dbs_work, do_dbs_timer, NULL);
+       schedule_delayed_work(&dbs_work,
+                       usecs_to_jiffies(dbs_tuners_ins.sampling_rate));
+       return;
+}
+
+static inline void dbs_timer_exit(void)
+{
+       cancel_delayed_work(&dbs_work);
+       return;
+}
+
+static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
+                                  unsigned int event)
+{
+       unsigned int cpu = policy->cpu;
+       struct cpu_dbs_info_s *this_dbs_info;
+       unsigned int j;
+
+       this_dbs_info = &per_cpu(cpu_dbs_info, cpu);
+
+       switch (event) {
+       case CPUFREQ_GOV_START:
+               if ((!cpu_online(cpu)) || 
+                   (!policy->cur))
+                       return -EINVAL;
+
+               if (policy->cpuinfo.transition_latency >
+                               (TRANSITION_LATENCY_LIMIT * 1000))
+                       return -EINVAL;
+               if (this_dbs_info->enable) /* Already enabled */
+                       break;
+                
+               down(&dbs_sem);
+               for_each_cpu_mask(j, policy->cpus) {
+                       struct cpu_dbs_info_s *j_dbs_info;
+                       j_dbs_info = &per_cpu(cpu_dbs_info, j);
+                       j_dbs_info->cur_policy = policy;
+               
+                       j_dbs_info->prev_cpu_idle_up = get_cpu_idle_time(j);
+                       j_dbs_info->prev_cpu_idle_down
+                               = j_dbs_info->prev_cpu_idle_up;
+               }
+               this_dbs_info->enable = 1;
+               sysfs_create_group(&policy->kobj, &dbs_attr_group);
+               dbs_enable++;
+               /*
+                * Start the timerschedule work, when this governor
+                * is used for first time
+                */
+               if (dbs_enable == 1) {
+                       unsigned int latency;
+                       /* policy latency is in nS. Convert it to uS first */
+
+                       latency = policy->cpuinfo.transition_latency;
+                       if (latency < 1000)
+                               latency = 1000;
+
+                       def_sampling_rate = (latency / 1000) *
+                                       DEF_SAMPLING_RATE_LATENCY_MULTIPLIER;
+                       dbs_tuners_ins.sampling_rate = def_sampling_rate;
+                       dbs_tuners_ins.ignore_nice = 0;
+                       dbs_tuners_ins.freq_step = 5;
+
+                       dbs_timer_init();
+               }
+               
+               up(&dbs_sem);
+               break;
+
+       case CPUFREQ_GOV_STOP:
+               down(&dbs_sem);
+               this_dbs_info->enable = 0;
+               sysfs_remove_group(&policy->kobj, &dbs_attr_group);
+               dbs_enable--;
+               /*
+                * Stop the timerschedule work, when this governor
+                * is used for first time
+                */
+               if (dbs_enable == 0) 
+                       dbs_timer_exit();
+               
+               up(&dbs_sem);
+
+               break;
+
+       case CPUFREQ_GOV_LIMITS:
+               down(&dbs_sem);
+               if (policy->max < this_dbs_info->cur_policy->cur)
+                       __cpufreq_driver_target(
+                                       this_dbs_info->cur_policy,
+                                       policy->max, CPUFREQ_RELATION_H);
+               else if (policy->min > this_dbs_info->cur_policy->cur)
+                       __cpufreq_driver_target(
+                                       this_dbs_info->cur_policy,
+                                       policy->min, CPUFREQ_RELATION_L);
+               up(&dbs_sem);
+               break;
+       }
+       return 0;
+}
+
+static struct cpufreq_governor cpufreq_gov_dbs = {
+       .name           = "conservative",
+       .governor       = cpufreq_governor_dbs,
+       .owner          = THIS_MODULE,
+};
+
+static int __init cpufreq_gov_dbs_init(void)
+{
+       return cpufreq_register_governor(&cpufreq_gov_dbs);
+}
+
+static void __exit cpufreq_gov_dbs_exit(void)
+{
+       /* Make sure that the scheduled work is indeed not running */
+       flush_scheduled_work();
+
+       cpufreq_unregister_governor(&cpufreq_gov_dbs);
+}
+
+
+MODULE_AUTHOR ("Alexander Clouter <alex-kernel@digriz.org.uk>");
+MODULE_DESCRIPTION ("'cpufreq_conservative' - A dynamic cpufreq governor for "
+               "Low Latency Frequency Transition capable processors "
+               "optimised for use in a battery environment");
+MODULE_LICENSE ("GPL");
+
+module_init(cpufreq_gov_dbs_init);
+module_exit(cpufreq_gov_dbs_exit);
index 8d83a21c6477f3e7a3cd223a9bffa4e8b1af1710..c1fc9c62bb51d0c1d2620f522d7c6ebbb0f432bc 100644 (file)
  */
 
 #define DEF_FREQUENCY_UP_THRESHOLD             (80)
-#define MIN_FREQUENCY_UP_THRESHOLD             (0)
+#define MIN_FREQUENCY_UP_THRESHOLD             (11)
 #define MAX_FREQUENCY_UP_THRESHOLD             (100)
 
-#define DEF_FREQUENCY_DOWN_THRESHOLD           (20)
-#define MIN_FREQUENCY_DOWN_THRESHOLD           (0)
-#define MAX_FREQUENCY_DOWN_THRESHOLD           (100)
-
 /* 
  * The polling frequency of this governor depends on the capability of 
  * the processor. Default polling frequency is 1000 times the transition
@@ -55,9 +51,9 @@ static unsigned int                           def_sampling_rate;
 #define MIN_SAMPLING_RATE                      (def_sampling_rate / 2)
 #define MAX_SAMPLING_RATE                      (500 * def_sampling_rate)
 #define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER   (1000)
-#define DEF_SAMPLING_DOWN_FACTOR               (10)
+#define DEF_SAMPLING_DOWN_FACTOR               (1)
+#define MAX_SAMPLING_DOWN_FACTOR               (10)
 #define TRANSITION_LATENCY_LIMIT               (10 * 1000)
-#define sampling_rate_in_HZ(x)                 (((x * HZ) < (1000 * 1000))?1:((x * HZ) / (1000 * 1000)))
 
 static void do_dbs_timer(void *data);
 
@@ -78,15 +74,23 @@ struct dbs_tuners {
        unsigned int            sampling_rate;
        unsigned int            sampling_down_factor;
        unsigned int            up_threshold;
-       unsigned int            down_threshold;
+       unsigned int            ignore_nice;
 };
 
 static struct dbs_tuners dbs_tuners_ins = {
        .up_threshold           = DEF_FREQUENCY_UP_THRESHOLD,
-       .down_threshold         = DEF_FREQUENCY_DOWN_THRESHOLD,
        .sampling_down_factor   = DEF_SAMPLING_DOWN_FACTOR,
 };
 
+static inline unsigned int get_cpu_idle_time(unsigned int cpu)
+{
+       return  kstat_cpu(cpu).cpustat.idle +
+               kstat_cpu(cpu).cpustat.iowait +
+               ( !dbs_tuners_ins.ignore_nice ? 
+                 kstat_cpu(cpu).cpustat.nice :
+                 0);
+}
+
 /************************** sysfs interface ************************/
 static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf)
 {
@@ -115,7 +119,7 @@ static ssize_t show_##file_name                                             \
 show_one(sampling_rate, sampling_rate);
 show_one(sampling_down_factor, sampling_down_factor);
 show_one(up_threshold, up_threshold);
-show_one(down_threshold, down_threshold);
+show_one(ignore_nice, ignore_nice);
 
 static ssize_t store_sampling_down_factor(struct cpufreq_policy *unused, 
                const char *buf, size_t count)
@@ -126,6 +130,9 @@ static ssize_t store_sampling_down_factor(struct cpufreq_policy *unused,
        if (ret != 1 )
                return -EINVAL;
 
+       if (input > MAX_SAMPLING_DOWN_FACTOR || input < 1)
+               return -EINVAL;
+
        down(&dbs_sem);
        dbs_tuners_ins.sampling_down_factor = input;
        up(&dbs_sem);
@@ -161,8 +168,7 @@ static ssize_t store_up_threshold(struct cpufreq_policy *unused,
 
        down(&dbs_sem);
        if (ret != 1 || input > MAX_FREQUENCY_UP_THRESHOLD || 
-                       input < MIN_FREQUENCY_UP_THRESHOLD ||
-                       input <= dbs_tuners_ins.down_threshold) {
+                       input < MIN_FREQUENCY_UP_THRESHOLD) {
                up(&dbs_sem);
                return -EINVAL;
        }
@@ -173,22 +179,35 @@ static ssize_t store_up_threshold(struct cpufreq_policy *unused,
        return count;
 }
 
-static ssize_t store_down_threshold(struct cpufreq_policy *unused, 
+static ssize_t store_ignore_nice(struct cpufreq_policy *policy,
                const char *buf, size_t count)
 {
        unsigned int input;
        int ret;
+
+       unsigned int j;
+       
        ret = sscanf (buf, "%u", &input);
+       if ( ret != 1 )
+               return -EINVAL;
 
+       if ( input > 1 )
+               input = 1;
+       
        down(&dbs_sem);
-       if (ret != 1 || input > MAX_FREQUENCY_DOWN_THRESHOLD || 
-                       input < MIN_FREQUENCY_DOWN_THRESHOLD ||
-                       input >= dbs_tuners_ins.up_threshold) {
+       if ( input == dbs_tuners_ins.ignore_nice ) { /* nothing to do */
                up(&dbs_sem);
-               return -EINVAL;
+               return count;
        }
+       dbs_tuners_ins.ignore_nice = input;
 
-       dbs_tuners_ins.down_threshold = input;
+       /* we need to re-evaluate prev_cpu_idle_up and prev_cpu_idle_down */
+       for_each_online_cpu(j) {
+               struct cpu_dbs_info_s *j_dbs_info;
+               j_dbs_info = &per_cpu(cpu_dbs_info, j);
+               j_dbs_info->prev_cpu_idle_up = get_cpu_idle_time(j);
+               j_dbs_info->prev_cpu_idle_down = j_dbs_info->prev_cpu_idle_up;
+       }
        up(&dbs_sem);
 
        return count;
@@ -201,7 +220,7 @@ __ATTR(_name, 0644, show_##_name, store_##_name)
 define_one_rw(sampling_rate);
 define_one_rw(sampling_down_factor);
 define_one_rw(up_threshold);
-define_one_rw(down_threshold);
+define_one_rw(ignore_nice);
 
 static struct attribute * dbs_attributes[] = {
        &sampling_rate_max.attr,
@@ -209,7 +228,7 @@ static struct attribute * dbs_attributes[] = {
        &sampling_rate.attr,
        &sampling_down_factor.attr,
        &up_threshold.attr,
-       &down_threshold.attr,
+       &ignore_nice.attr,
        NULL
 };
 
@@ -222,9 +241,8 @@ static struct attribute_group dbs_attr_group = {
 
 static void dbs_check_cpu(int cpu)
 {
-       unsigned int idle_ticks, up_idle_ticks, down_idle_ticks;
-       unsigned int total_idle_ticks;
-       unsigned int freq_down_step;
+       unsigned int idle_ticks, up_idle_ticks, total_ticks;
+       unsigned int freq_next;
        unsigned int freq_down_sampling_rate;
        static int down_skip[NR_CPUS];
        struct cpu_dbs_info_s *this_dbs_info;
@@ -238,38 +256,25 @@ static void dbs_check_cpu(int cpu)
 
        policy = this_dbs_info->cur_policy;
        /* 
-        * The default safe range is 20% to 80% 
-        * Every sampling_rate, we check
-        *      - If current idle time is less than 20%, then we try to 
-        *        increase frequency
-        * Every sampling_rate*sampling_down_factor, we check
-        *      - If current idle time is more than 80%, then we try to
-        *        decrease frequency
+        * Every sampling_rate, we check, if current idle time is less
+        * than 20% (default), then we try to increase frequency
+        * Every sampling_rate*sampling_down_factor, we look for a the lowest
+        * frequency which can sustain the load while keeping idle time over
+        * 30%. If such a frequency exist, we try to decrease to this frequency.
         *
         * Any frequency increase takes it to the maximum frequency. 
         * Frequency reduction happens at minimum steps of 
-        * 5% of max_frequency 
+        * 5% (default) of current frequency 
         */
 
        /* Check for frequency increase */
-       total_idle_ticks = kstat_cpu(cpu).cpustat.idle +
-               kstat_cpu(cpu).cpustat.iowait;
-       idle_ticks = total_idle_ticks -
-               this_dbs_info->prev_cpu_idle_up;
-       this_dbs_info->prev_cpu_idle_up = total_idle_ticks;
-       
-
+       idle_ticks = UINT_MAX;
        for_each_cpu_mask(j, policy->cpus) {
-               unsigned int tmp_idle_ticks;
+               unsigned int tmp_idle_ticks, total_idle_ticks;
                struct cpu_dbs_info_s *j_dbs_info;
 
-               if (j == cpu)
-                       continue;
-
                j_dbs_info = &per_cpu(cpu_dbs_info, j);
-               /* Check for frequency increase */
-               total_idle_ticks = kstat_cpu(j).cpustat.idle +
-                       kstat_cpu(j).cpustat.iowait;
+               total_idle_ticks = get_cpu_idle_time(j);
                tmp_idle_ticks = total_idle_ticks -
                        j_dbs_info->prev_cpu_idle_up;
                j_dbs_info->prev_cpu_idle_up = total_idle_ticks;
@@ -281,13 +286,23 @@ static void dbs_check_cpu(int cpu)
        /* Scale idle ticks by 100 and compare with up and down ticks */
        idle_ticks *= 100;
        up_idle_ticks = (100 - dbs_tuners_ins.up_threshold) *
-                       sampling_rate_in_HZ(dbs_tuners_ins.sampling_rate);
+                       usecs_to_jiffies(dbs_tuners_ins.sampling_rate);
 
        if (idle_ticks < up_idle_ticks) {
+               down_skip[cpu] = 0;
+               for_each_cpu_mask(j, policy->cpus) {
+                       struct cpu_dbs_info_s *j_dbs_info;
+
+                       j_dbs_info = &per_cpu(cpu_dbs_info, j);
+                       j_dbs_info->prev_cpu_idle_down = 
+                                       j_dbs_info->prev_cpu_idle_up;
+               }
+               /* if we are already at full speed then break out early */
+               if (policy->cur == policy->max)
+                       return;
+               
                __cpufreq_driver_target(policy, policy->max, 
                        CPUFREQ_RELATION_H);
-               down_skip[cpu] = 0;
-               this_dbs_info->prev_cpu_idle_down = total_idle_ticks;
                return;
        }
 
@@ -296,23 +311,14 @@ static void dbs_check_cpu(int cpu)
        if (down_skip[cpu] < dbs_tuners_ins.sampling_down_factor)
                return;
 
-       total_idle_ticks = kstat_cpu(cpu).cpustat.idle +
-               kstat_cpu(cpu).cpustat.iowait;
-       idle_ticks = total_idle_ticks -
-               this_dbs_info->prev_cpu_idle_down;
-       this_dbs_info->prev_cpu_idle_down = total_idle_ticks;
-
+       idle_ticks = UINT_MAX;
        for_each_cpu_mask(j, policy->cpus) {
-               unsigned int tmp_idle_ticks;
+               unsigned int tmp_idle_ticks, total_idle_ticks;
                struct cpu_dbs_info_s *j_dbs_info;
 
-               if (j == cpu)
-                       continue;
-
                j_dbs_info = &per_cpu(cpu_dbs_info, j);
-               /* Check for frequency increase */
-               total_idle_ticks = kstat_cpu(j).cpustat.idle +
-                       kstat_cpu(j).cpustat.iowait;
+               /* Check for frequency decrease */
+               total_idle_ticks = j_dbs_info->prev_cpu_idle_up;
                tmp_idle_ticks = total_idle_ticks -
                        j_dbs_info->prev_cpu_idle_down;
                j_dbs_info->prev_cpu_idle_down = total_idle_ticks;
@@ -321,38 +327,37 @@ static void dbs_check_cpu(int cpu)
                        idle_ticks = tmp_idle_ticks;
        }
 
-       /* Scale idle ticks by 100 and compare with up and down ticks */
-       idle_ticks *= 100;
        down_skip[cpu] = 0;
+       /* if we cannot reduce the frequency anymore, break out early */
+       if (policy->cur == policy->min)
+               return;
 
+       /* Compute how many ticks there are between two measurements */
        freq_down_sampling_rate = dbs_tuners_ins.sampling_rate *
                dbs_tuners_ins.sampling_down_factor;
-       down_idle_ticks = (100 - dbs_tuners_ins.down_threshold) *
-                       sampling_rate_in_HZ(freq_down_sampling_rate);
+       total_ticks = usecs_to_jiffies(freq_down_sampling_rate);
 
-       if (idle_ticks > down_idle_ticks ) {
-               freq_down_step = (5 * policy->max) / 100;
-
-               /* max freq cannot be less than 100. But who knows.... */
-               if (unlikely(freq_down_step == 0))
-                       freq_down_step = 5;
+       /*
+        * The optimal frequency is the frequency that is the lowest that
+        * can support the current CPU usage without triggering the up
+        * policy. To be safe, we focus 10 points under the threshold.
+        */
+       freq_next = ((total_ticks - idle_ticks) * 100) / total_ticks;
+       freq_next = (freq_next * policy->cur) / 
+                       (dbs_tuners_ins.up_threshold - 10);
 
-               __cpufreq_driver_target(policy,
-                       policy->cur - freq_down_step, 
-                       CPUFREQ_RELATION_H);
-               return;
-       }
+       if (freq_next <= ((policy->cur * 95) / 100))
+               __cpufreq_driver_target(policy, freq_next, CPUFREQ_RELATION_L);
 }
 
 static void do_dbs_timer(void *data)
 { 
        int i;
        down(&dbs_sem);
-       for (i = 0; i < NR_CPUS; i++)
-               if (cpu_online(i))
-                       dbs_check_cpu(i);
+       for_each_online_cpu(i)
+               dbs_check_cpu(i);
        schedule_delayed_work(&dbs_work, 
-                       sampling_rate_in_HZ(dbs_tuners_ins.sampling_rate));
+                       usecs_to_jiffies(dbs_tuners_ins.sampling_rate));
        up(&dbs_sem);
 } 
 
@@ -360,7 +365,7 @@ static inline void dbs_timer_init(void)
 {
        INIT_WORK(&dbs_work, do_dbs_timer, NULL);
        schedule_delayed_work(&dbs_work,
-                       sampling_rate_in_HZ(dbs_tuners_ins.sampling_rate));
+                       usecs_to_jiffies(dbs_tuners_ins.sampling_rate));
        return;
 }
 
@@ -397,12 +402,9 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
                        j_dbs_info = &per_cpu(cpu_dbs_info, j);
                        j_dbs_info->cur_policy = policy;
                
-                       j_dbs_info->prev_cpu_idle_up = 
-                               kstat_cpu(j).cpustat.idle +
-                               kstat_cpu(j).cpustat.iowait;
-                       j_dbs_info->prev_cpu_idle_down = 
-                               kstat_cpu(j).cpustat.idle +
-                               kstat_cpu(j).cpustat.iowait;
+                       j_dbs_info->prev_cpu_idle_up = get_cpu_idle_time(j);
+                       j_dbs_info->prev_cpu_idle_down
+                               = j_dbs_info->prev_cpu_idle_up;
                }
                this_dbs_info->enable = 1;
                sysfs_create_group(&policy->kobj, &dbs_attr_group);
@@ -422,6 +424,7 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
                        def_sampling_rate = (latency / 1000) *
                                        DEF_SAMPLING_RATE_LATENCY_MULTIPLIER;
                        dbs_tuners_ins.sampling_rate = def_sampling_rate;
+                       dbs_tuners_ins.ignore_nice = 0;
 
                        dbs_timer_init();
                }
@@ -461,12 +464,11 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
        return 0;
 }
 
-struct cpufreq_governor cpufreq_gov_dbs = {
+static struct cpufreq_governor cpufreq_gov_dbs = {
        .name           = "ondemand",
        .governor       = cpufreq_governor_dbs,
        .owner          = THIS_MODULE,
 };
-EXPORT_SYMBOL(cpufreq_gov_dbs);
 
 static int __init cpufreq_gov_dbs_init(void)
 {
index 2084593937c6382508ee75b0701fb7d49636046a..741b6b191e6a2ca667b5ab6f36888279cb9823ce 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/percpu.h>
 #include <linux/kobject.h>
 #include <linux/spinlock.h>
+#include <asm/cputime.h>
 
 static spinlock_t cpufreq_stats_lock;
 
@@ -29,20 +30,14 @@ static struct freq_attr _attr_##_name = {\
        .show = _show,\
 };
 
-static unsigned long
-delta_time(unsigned long old, unsigned long new)
-{
-       return (old > new) ? (old - new): (new + ~old + 1);
-}
-
 struct cpufreq_stats {
        unsigned int cpu;
        unsigned int total_trans;
-       unsigned long long last_time;
+       unsigned long long  last_time;
        unsigned int max_state;
        unsigned int state_num;
        unsigned int last_index;
-       unsigned long long *time_in_state;
+       cputime64_t *time_in_state;
        unsigned int *freq_table;
 #ifdef CONFIG_CPU_FREQ_STAT_DETAILS
        unsigned int *trans_table;
@@ -60,12 +55,16 @@ static int
 cpufreq_stats_update (unsigned int cpu)
 {
        struct cpufreq_stats *stat;
+       unsigned long long cur_time;
+
+       cur_time = get_jiffies_64();
        spin_lock(&cpufreq_stats_lock);
        stat = cpufreq_stats_table[cpu];
        if (stat->time_in_state)
-               stat->time_in_state[stat->last_index] +=
-                       delta_time(stat->last_time, jiffies);
-       stat->last_time = jiffies;
+               stat->time_in_state[stat->last_index] =
+                       cputime64_add(stat->time_in_state[stat->last_index],
+                                     cputime_sub(cur_time, stat->last_time));
+       stat->last_time = cur_time;
        spin_unlock(&cpufreq_stats_lock);
        return 0;
 }
@@ -90,8 +89,8 @@ show_time_in_state(struct cpufreq_policy *policy, char *buf)
                return 0;
        cpufreq_stats_update(stat->cpu);
        for (i = 0; i < stat->state_num; i++) {
-               len += sprintf(buf + len, "%u %llu\n",
-                       stat->freq_table[i], stat->time_in_state[i]);
+               len += sprintf(buf + len, "%u %llu\n", stat->freq_table[i], 
+                       (unsigned long long)cputime64_to_clock_t(stat->time_in_state[i]));
        }
        return len;
 }
@@ -107,16 +106,30 @@ show_trans_table(struct cpufreq_policy *policy, char *buf)
        if(!stat)
                return 0;
        cpufreq_stats_update(stat->cpu);
+       len += snprintf(buf + len, PAGE_SIZE - len, "   From  :    To\n");
+       len += snprintf(buf + len, PAGE_SIZE - len, "         : ");
+       for (i = 0; i < stat->state_num; i++) {
+               if (len >= PAGE_SIZE)
+                       break;
+               len += snprintf(buf + len, PAGE_SIZE - len, "%9u ",
+                               stat->freq_table[i]);
+       }
+       if (len >= PAGE_SIZE)
+               return len;
+
+       len += snprintf(buf + len, PAGE_SIZE - len, "\n");
+
        for (i = 0; i < stat->state_num; i++) {
                if (len >= PAGE_SIZE)
                        break;
-               len += snprintf(buf + len, PAGE_SIZE - len, "%9u:\t",
+
+               len += snprintf(buf + len, PAGE_SIZE - len, "%9u: ",
                                stat->freq_table[i]);
 
                for (j = 0; j < stat->state_num; j++)   {
                        if (len >= PAGE_SIZE)
                                break;
-                       len += snprintf(buf + len, PAGE_SIZE - len, "%u\t",
+                       len += snprintf(buf + len, PAGE_SIZE - len, "%9u ",
                                        stat->trans_table[i*stat->max_state+j]);
                }
                len += snprintf(buf + len, PAGE_SIZE - len, "\n");
@@ -197,7 +210,7 @@ cpufreq_stats_create_table (struct cpufreq_policy *policy,
                count++;
        }
 
-       alloc_size = count * sizeof(int) + count * sizeof(long long);
+       alloc_size = count * sizeof(int) + count * sizeof(cputime64_t);
 
 #ifdef CONFIG_CPU_FREQ_STAT_DETAILS
        alloc_size += count * count * sizeof(int);
@@ -224,7 +237,7 @@ cpufreq_stats_create_table (struct cpufreq_policy *policy,
        }
        stat->state_num = j;
        spin_lock(&cpufreq_stats_lock);
-       stat->last_time = jiffies;
+       stat->last_time = get_jiffies_64();
        stat->last_index = freq_table_get_index(stat, policy->cur);
        spin_unlock(&cpufreq_stats_lock);
        cpufreq_cpu_put(data);
index d30591f69dd9ce5304c258189ddfd9428c16a37f..f464630388471a69fb048d41f60c4d186821df3e 100644 (file)
@@ -17,7 +17,7 @@
 
 /* show configuration fields */
 
-static ssize_t dio_show_id(struct device *dev, char *buf)
+static ssize_t dio_show_id(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct dio_dev *d;
 
@@ -26,7 +26,7 @@ static ssize_t dio_show_id(struct device *dev, char *buf)
 }
 static DEVICE_ATTR(id, S_IRUGO, dio_show_id, NULL);
 
-static ssize_t dio_show_ipl(struct device *dev, char *buf)
+static ssize_t dio_show_ipl(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct dio_dev *d;
 
@@ -35,7 +35,7 @@ static ssize_t dio_show_ipl(struct device *dev, char *buf)
 }
 static DEVICE_ATTR(ipl, S_IRUGO, dio_show_ipl, NULL);
 
-static ssize_t dio_show_secid(struct device *dev, char *buf)
+static ssize_t dio_show_secid(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct dio_dev *d;
 
@@ -44,7 +44,7 @@ static ssize_t dio_show_secid(struct device *dev, char *buf)
 }
 static DEVICE_ATTR(secid, S_IRUGO, dio_show_secid, NULL);
 
-static ssize_t dio_show_name(struct device *dev, char *buf)
+static ssize_t dio_show_name(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct dio_dev *d;
 
@@ -53,7 +53,7 @@ static ssize_t dio_show_name(struct device *dev, char *buf)
 }
 static DEVICE_ATTR(name, S_IRUGO, dio_show_name, NULL);
 
-static ssize_t dio_show_resource(struct device *dev, char *buf)
+static ssize_t dio_show_resource(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct dio_dev *d = to_dio_dev(dev);
 
index 6381ba53853c25c32567be5c37934ad8582a6604..1937743c8e2971bb15b9f1d703aca168be4240e2 100644 (file)
@@ -149,7 +149,7 @@ void eisa_driver_unregister (struct eisa_driver *edrv)
        driver_unregister (&edrv->driver);
 }
 
-static ssize_t eisa_show_sig (struct device *dev, char *buf)
+static ssize_t eisa_show_sig (struct device *dev, struct device_attribute *attr, char *buf)
 {
         struct eisa_device *edev = to_eisa_device (dev);
         return sprintf (buf,"%s\n", edev->id.sig);
@@ -157,7 +157,7 @@ static ssize_t eisa_show_sig (struct device *dev, char *buf)
 
 static DEVICE_ATTR(signature, S_IRUGO, eisa_show_sig, NULL);
 
-static ssize_t eisa_show_state (struct device *dev, char *buf)
+static ssize_t eisa_show_state (struct device *dev, struct device_attribute *attr, char *buf)
 {
         struct eisa_device *edev = to_eisa_device (dev);
         return sprintf (buf,"%d\n", edev->state & EISA_CONFIG_ENABLED);
index 1fbb219aa9baa1fbc7a57927636881e127a00e02..e3c95882353341bb103a3d9164bd12d2e3fb2d58 100644 (file)
@@ -765,12 +765,8 @@ void fcp_release(fc_channel *fcchain, int count)  /* count must > 0 */
 
 static void fcp_scsi_done (Scsi_Cmnd *SCpnt)
 {
-       unsigned long flags;
-
-       spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
        if (FCP_CMND(SCpnt)->done)
                FCP_CMND(SCpnt)->done(SCpnt);
-       spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
 }
 
 static int fcp_scsi_queue_it(fc_channel *fc, Scsi_Cmnd *SCpnt, fcp_cmnd *fcmd, int prepare)
@@ -909,12 +905,8 @@ int fcp_scsi_abort(Scsi_Cmnd *SCpnt)
         */
 
        if (++fc->abort_count < (fc->can_queue >> 1)) {
-               unsigned long flags;
-
                SCpnt->result = DID_ABORT;
-               spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
                fcmd->done(SCpnt);
-               spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
                printk("FC: soft abort\n");
                return SUCCESS;
        } else {
@@ -935,6 +927,7 @@ void fcp_scsi_reset_done(Scsi_Cmnd *SCpnt)
 
 int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt)
 {
+       unsigned long flags;
        fcp_cmd *cmd;
        fcp_cmnd *fcmd;
        fc_channel *fc = FC_SCMND(SCpnt);
@@ -987,7 +980,10 @@ int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt)
        fc->rst_pkt->request->rq_status = RQ_SCSI_BUSY;
 
        fc->rst_pkt->done = fcp_scsi_reset_done;
+
+       spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
        fcp_scsi_queue_it(fc, fc->rst_pkt, fcmd, 0);
+       spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
        
        down(&sem);
 
@@ -1006,13 +1002,7 @@ int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt)
        return SUCCESS;
 }
 
-int fcp_scsi_bus_reset(Scsi_Cmnd *SCpnt)
-{
-       printk ("FC: bus reset!\n");
-       return FAILED;
-}
-
-int fcp_scsi_host_reset(Scsi_Cmnd *SCpnt)
+static int __fcp_scsi_host_reset(Scsi_Cmnd *SCpnt)
 {
        fc_channel *fc = FC_SCMND(SCpnt);
        fcp_cmnd *fcmd = FCP_CMND(SCpnt);
@@ -1033,6 +1023,18 @@ int fcp_scsi_host_reset(Scsi_Cmnd *SCpnt)
        else return FAILED;
 }
 
+int fcp_scsi_host_reset(Scsi_Cmnd *SCpnt)
+{
+       unsigned long flags;
+       int rc;
+
+       spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
+       rc = __fcp_scsi_host_reset(SCpnt);
+       spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
+
+       return rc;
+}
+
 static int fcp_els_queue_it(fc_channel *fc, fcp_cmnd *fcmd)
 {
        long i;
index 8bac2c453027f836d951bcc70912b3a207b10dbf..ed85dfcef69a403ab84120824e248784a4acab3e 100644 (file)
@@ -27,7 +27,6 @@ EXPORT_SYMBOL(fc_do_prli);
 EXPORT_SYMBOL(fcp_scsi_queuecommand);
 EXPORT_SYMBOL(fcp_scsi_abort);
 EXPORT_SYMBOL(fcp_scsi_dev_reset);
-EXPORT_SYMBOL(fcp_scsi_bus_reset);
 EXPORT_SYMBOL(fcp_scsi_host_reset);
 
 #endif /* CONFIG_MODULES */
index e44d652a83dc055ba1a24118b26d78518bc99b33..c397c84bef635668f4e3e8c79e51de0695d43812 100644 (file)
@@ -158,7 +158,6 @@ int fc_do_prli(fc_channel *, unsigned char);
 int fcp_scsi_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *));
 int fcp_scsi_abort(Scsi_Cmnd *);
 int fcp_scsi_dev_reset(Scsi_Cmnd *);
-int fcp_scsi_bus_reset(Scsi_Cmnd *);
 int fcp_scsi_host_reset(Scsi_Cmnd *);
 
 #endif /* !(_FCP_SCSI_H) */
index 33b669e6f977ec392c662b973601c0b794dcf21b..6996476669f17397d1f9b1cab8e8b2f2a094cb6d 100644 (file)
@@ -115,7 +115,7 @@ edd_attr_show(struct kobject * kobj, struct attribute *attr, char *buf)
 {
        struct edd_device *dev = to_edd_device(kobj);
        struct edd_attribute *edd_attr = to_edd_attr(attr);
-       ssize_t ret = 0;
+       ssize_t ret = -EIO;
 
        if (edd_attr->show)
                ret = edd_attr->show(dev, buf);
index 0287ff65963be783c03397729532114c35be6393..a3451cb94004dc3a876f5032e6a440b8c6800df5 100644 (file)
@@ -352,7 +352,7 @@ static ssize_t efivar_attr_show(struct kobject *kobj, struct attribute *attr,
 {
        struct efivar_entry *var = to_efivar_entry(kobj);
        struct efivar_attribute *efivar_attr = to_efivar_attr(attr);
-       ssize_t ret = 0;
+       ssize_t ret = -EIO;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
@@ -368,7 +368,7 @@ static ssize_t efivar_attr_store(struct kobject *kobj, struct attribute *attr,
 {
        struct efivar_entry *var = to_efivar_entry(kobj);
        struct efivar_attribute *efivar_attr = to_efivar_attr(attr);
-       ssize_t ret = 0;
+       ssize_t ret = -EIO;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
index 6d5df6c2efa2ff3044610736aeaf79326396b182..df1b721154d2728504541e023a43701db5e6d2f5 100644 (file)
@@ -11,6 +11,7 @@
  * published by the Free Software Foundation.
  */
 
+#include <linux/config.h>
 #include <linux/acpi.h>
 #include <linux/console.h>
 #include <linux/efi.h>
index 35710818fe47cbfaf78b5070c59a4c85fabee641..fdd881aee618172df04f70977ee4cb4a57e7d58c 100644 (file)
@@ -2,6 +2,7 @@
  *     i2c-ali1563.c - i2c driver for the ALi 1563 Southbridge
  *
  *     Copyright (C) 2004 Patrick Mochel
+ *                   2005 Rudolf Marek <r.marek@sh.cvut.cz>
  *
  *     The 1563 southbridge is deceptively similar to the 1533, with a
  *     few notable exceptions. One of those happens to be the fact they
 #define HST_CNTL2_BLOCK                0x05
 
 
+#define HST_CNTL2_SIZEMASK     0x38
 
 static unsigned short ali1563_smba;
 
-static int ali1563_transaction(struct i2c_adapter * a)
+static int ali1563_transaction(struct i2c_adapter * a, int size)
 {
        u32 data;
        int timeout;
@@ -73,7 +75,7 @@ static int ali1563_transaction(struct i2c_adapter * a)
 
        data = inb_p(SMB_HST_STS);
        if (data & HST_STS_BAD) {
-               dev_warn(&a->dev,"ali1563: Trying to reset busy device\n");
+               dev_err(&a->dev, "ali1563: Trying to reset busy device\n");
                outb_p(data | HST_STS_BAD,SMB_HST_STS);
                data = inb_p(SMB_HST_STS);
                if (data & HST_STS_BAD)
@@ -94,19 +96,31 @@ static int ali1563_transaction(struct i2c_adapter * a)
 
        if (timeout && !(data & HST_STS_BAD))
                return 0;
-       dev_warn(&a->dev, "SMBus Error: %s%s%s%s%s\n",
-               timeout ? "Timeout " : "",
-               data & HST_STS_FAIL ? "Transaction Failed " : "",
-               data & HST_STS_BUSERR ? "No response or Bus Collision " : "",
-               data & HST_STS_DEVERR ? "Device Error " : "",
-               !(data & HST_STS_DONE) ? "Transaction Never Finished " : "");
 
-       if (!(data & HST_STS_DONE))
+       if (!timeout) {
+               dev_err(&a->dev, "Timeout - Trying to KILL transaction!\n");
                /* Issue 'kill' to host controller */
                outb_p(HST_CNTL2_KILL,SMB_HST_CNTL2);
-       else
-               /* Issue timeout to reset all devices on bus */
+               data = inb_p(SMB_HST_STS);
+       }
+
+       /* device error - no response, ignore the autodetection case */
+       if ((data & HST_STS_DEVERR) && (size != HST_CNTL2_QUICK)) {
+               dev_err(&a->dev, "Device error!\n");
+       }
+
+       /* bus collision */
+       if (data & HST_STS_BUSERR) {
+               dev_err(&a->dev, "Bus collision!\n");
+               /* Issue timeout, hoping it helps */
                outb_p(HST_CNTL1_TIMEOUT,SMB_HST_CNTL1);
+       }
+
+       if (data & HST_STS_FAIL) {
+               dev_err(&a->dev, "Cleaning fail after KILL!\n");
+               outb_p(0x0,SMB_HST_CNTL2);
+       }
+
        return -1;
 }
 
@@ -149,7 +163,7 @@ static int ali1563_block_start(struct i2c_adapter * a)
 
        if (timeout && !(data & HST_STS_BAD))
                return 0;
-       dev_warn(&a->dev, "SMBus Error: %s%s%s%s%s\n",
+       dev_err(&a->dev, "SMBus Error: %s%s%s%s%s\n",
                timeout ? "Timeout " : "",
                data & HST_STS_FAIL ? "Transaction Failed " : "",
                data & HST_STS_BUSERR ? "No response or Bus Collision " : "",
@@ -242,13 +256,15 @@ static s32 ali1563_access(struct i2c_adapter * a, u16 addr,
        }
 
        outb_p(((addr & 0x7f) << 1) | (rw & 0x01), SMB_HST_ADD);
-       outb_p(inb_p(SMB_HST_CNTL2) | (size << 3), SMB_HST_CNTL2);
+       outb_p((inb_p(SMB_HST_CNTL2) & ~HST_CNTL2_SIZEMASK) | (size << 3), SMB_HST_CNTL2);
 
        /* Write the command register */
+
        switch(size) {
        case HST_CNTL2_BYTE:
                if (rw== I2C_SMBUS_WRITE)
-                       outb_p(cmd, SMB_HST_CMD);
+                       /* Beware it uses DAT0 register and not CMD! */
+                       outb_p(cmd, SMB_HST_DAT0);
                break;
        case HST_CNTL2_BYTE_DATA:
                outb_p(cmd, SMB_HST_CMD);
@@ -268,7 +284,7 @@ static s32 ali1563_access(struct i2c_adapter * a, u16 addr,
                goto Done;
        }
 
-       if ((error = ali1563_transaction(a)))
+       if ((error = ali1563_transaction(a, size)))
                goto Done;
 
        if ((rw == I2C_SMBUS_WRITE) || (size == HST_CNTL2_QUICK))
index dd0d4c463146be33d9469c2f434ddbed4d96d615..867d443e7133f03c1f8999e4fe25e38f76f9419f 100644 (file)
@@ -516,6 +516,11 @@ create_iface(struct device_node *np, struct device *dev)
        u32 *psteps, *prate;
        int rc;
 
+       if (np->n_intrs < 1 || np->n_addrs < 1) {
+               printk(KERN_ERR "%s: Missing interrupt or address !\n",
+                      np->full_name);
+               return -ENODEV;
+       }
        if (pmac_low_i2c_lock(np))
                return -ENODEV;
 
index 9c59a370b6d9563179d9bba00846ef1e2be8e198..9058c3956710d38c5444e50876fbd31c6f4800b1 100644 (file)
@@ -137,7 +137,7 @@ static struct i2c_driver adm1021_driver = {
 };
 
 #define show(value)    \
-static ssize_t show_##value(struct device *dev, char *buf)             \
+static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf)              \
 {                                                                      \
        struct adm1021_data *data = adm1021_update_device(dev);         \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value));        \
@@ -150,7 +150,7 @@ show(remote_temp_hyst);
 show(remote_temp_input);
 
 #define show2(value)   \
-static ssize_t show_##value(struct device *dev, char *buf)             \
+static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf)              \
 {                                                                      \
        struct adm1021_data *data = adm1021_update_device(dev);         \
        return sprintf(buf, "%d\n", data->value);                       \
@@ -159,7 +159,7 @@ show2(alarms);
 show2(die_code);
 
 #define set(value, reg)        \
-static ssize_t set_##value(struct device *dev, const char *buf, size_t count)  \
+static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)   \
 {                                                              \
        struct i2c_client *client = to_i2c_client(dev);         \
        struct adm1021_data *data = i2c_get_clientdata(client); \
index e0771a3d05c955ccf0278496ac104658a7701764..111f0c86c9337d9f7733d127c5c399850066d13d 100644 (file)
@@ -153,19 +153,19 @@ struct adm1025_data {
  */
 
 #define show_in(offset) \
-static ssize_t show_in##offset(struct device *dev, char *buf) \
+static ssize_t show_in##offset(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct adm1025_data *data = adm1025_update_device(dev); \
        return sprintf(buf, "%u\n", IN_FROM_REG(data->in[offset], \
                       in_scale[offset])); \
 } \
-static ssize_t show_in##offset##_min(struct device *dev, char *buf) \
+static ssize_t show_in##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct adm1025_data *data = adm1025_update_device(dev); \
        return sprintf(buf, "%u\n", IN_FROM_REG(data->in_min[offset], \
                       in_scale[offset])); \
 } \
-static ssize_t show_in##offset##_max(struct device *dev, char *buf) \
+static ssize_t show_in##offset##_max(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct adm1025_data *data = adm1025_update_device(dev); \
        return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[offset], \
@@ -180,17 +180,17 @@ show_in(4);
 show_in(5);
 
 #define show_temp(offset) \
-static ssize_t show_temp##offset(struct device *dev, char *buf) \
+static ssize_t show_temp##offset(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct adm1025_data *data = adm1025_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[offset-1])); \
 } \
-static ssize_t show_temp##offset##_min(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct adm1025_data *data = adm1025_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_min[offset-1])); \
 } \
-static ssize_t show_temp##offset##_max(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_max(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct adm1025_data *data = adm1025_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[offset-1])); \
@@ -200,7 +200,7 @@ show_temp(1);
 show_temp(2);
 
 #define set_in(offset) \
-static ssize_t set_in##offset##_min(struct device *dev, const char *buf, \
+static ssize_t set_in##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -214,7 +214,7 @@ static ssize_t set_in##offset##_min(struct device *dev, const char *buf, \
        up(&data->update_lock); \
        return count; \
 } \
-static ssize_t set_in##offset##_max(struct device *dev, const char *buf, \
+static ssize_t set_in##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -240,7 +240,7 @@ set_in(4);
 set_in(5);
 
 #define set_temp(offset) \
-static ssize_t set_temp##offset##_min(struct device *dev, const char *buf, \
+static ssize_t set_temp##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -254,7 +254,7 @@ static ssize_t set_temp##offset##_min(struct device *dev, const char *buf, \
        up(&data->update_lock); \
        return count; \
 } \
-static ssize_t set_temp##offset##_max(struct device *dev, const char *buf, \
+static ssize_t set_temp##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -275,26 +275,26 @@ static DEVICE_ATTR(temp##offset##_max, S_IWUSR | S_IRUGO, \
 set_temp(1);
 set_temp(2);
 
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1025_data *data = adm1025_update_device(dev);
        return sprintf(buf, "%u\n", data->alarms);
 }
 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
 
-static ssize_t show_vid(struct device *dev, char *buf)
+static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1025_data *data = adm1025_update_device(dev);
        return sprintf(buf, "%u\n", vid_from_reg(data->vid, data->vrm));
 }
 static DEVICE_ATTR(in1_ref, S_IRUGO, show_vid, NULL);
 
-static ssize_t show_vrm(struct device *dev, char *buf)
+static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1025_data *data = adm1025_update_device(dev);
        return sprintf(buf, "%u\n", data->vrm);
 }
-static ssize_t set_vrm(struct device *dev, const char *buf, size_t count)
+static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct adm1025_data *data = i2c_get_clientdata(client);
index 39e2f4a900bf321be243ecac9656f7de29871327..b15fafe8f1116340604f20d3dbde248d041d48bf 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/i2c-sysfs.h>
 #include <linux/i2c-vid.h>
 
 /* Addresses to scan */
@@ -711,19 +712,27 @@ static struct adm1026_data *adm1026_update_device(struct device *dev)
        return data;
 }
 
-static ssize_t show_in(struct device *dev, char *buf, int nr)
+static ssize_t show_in(struct device *dev, struct device_attribute *attr,
+               char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", INS_FROM_REG(nr, data->in[nr]));
 }
-static ssize_t show_in_min(struct device *dev, char *buf, int nr) 
+static ssize_t show_in_min(struct device *dev, struct device_attribute *attr,
+               char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev); 
        return sprintf(buf,"%d\n", INS_FROM_REG(nr, data->in_min[nr]));
 }
-static ssize_t set_in_min(struct device *dev, const char *buf, 
-               size_t count, int nr)
+static ssize_t set_in_min(struct device *dev, struct device_attribute *attr,
+               const char *buf, size_t count)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct i2c_client *client = to_i2c_client(dev);
        struct adm1026_data *data = i2c_get_clientdata(client);
        int val = simple_strtol(buf, NULL, 10);
@@ -734,14 +743,19 @@ static ssize_t set_in_min(struct device *dev, const char *buf,
        up(&data->update_lock);
        return count; 
 }
-static ssize_t show_in_max(struct device *dev, char *buf, int nr)
+static ssize_t show_in_max(struct device *dev, struct device_attribute *attr,
+               char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", INS_FROM_REG(nr, data->in_max[nr]));
 }
-static ssize_t set_in_max(struct device *dev, const char *buf,
-               size_t count, int nr)
+static ssize_t set_in_max(struct device *dev, struct device_attribute *attr,
+               const char *buf, size_t count)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct i2c_client *client = to_i2c_client(dev);
        struct adm1026_data *data = i2c_get_clientdata(client);
        int val = simple_strtol(buf, NULL, 10);
@@ -753,34 +767,13 @@ static ssize_t set_in_max(struct device *dev, const char *buf,
        return count;
 }
 
-#define in_reg(offset)                                                    \
-static ssize_t show_in##offset (struct device *dev, char *buf)            \
-{                                                                         \
-       return show_in(dev, buf, offset);                                 \
-}                                                                         \
-static ssize_t show_in##offset##_min (struct device *dev, char *buf)      \
-{                                                                         \
-       return show_in_min(dev, buf, offset);                             \
-}                                                                         \
-static ssize_t set_in##offset##_min (struct device *dev,                  \
-       const char *buf, size_t count)                                    \
-{                                                                         \
-       return set_in_min(dev, buf, count, offset);                       \
-}                                                                         \
-static ssize_t show_in##offset##_max (struct device *dev, char *buf)      \
-{                                                                         \
-       return show_in_max(dev, buf, offset);                             \
-}                                                                         \
-static ssize_t set_in##offset##_max (struct device *dev,                  \
-       const char *buf, size_t count)                                    \
-{                                                                         \
-       return set_in_max(dev, buf, count, offset);                       \
-}                                                                         \
-static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in##offset, NULL);   \
-static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR,                   \
-               show_in##offset##_min, set_in##offset##_min);             \
-static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR,                   \
-               show_in##offset##_max, set_in##offset##_max);
+#define in_reg(offset)                                         \
+static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in,        \
+               NULL, offset);                                  \
+static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
+               show_in_min, set_in_min, offset);               \
+static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
+               show_in_max, set_in_max, offset);
 
 
 in_reg(0);
@@ -800,19 +793,19 @@ in_reg(13);
 in_reg(14);
 in_reg(15);
 
-static ssize_t show_in16(struct device *dev, char *buf)
+static ssize_t show_in16(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", INS_FROM_REG(16, data->in[16]) -
                NEG12_OFFSET);
 }
-static ssize_t show_in16_min(struct device *dev, char *buf) 
+static ssize_t show_in16_min(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev); 
        return sprintf(buf,"%d\n", INS_FROM_REG(16, data->in_min[16])
                - NEG12_OFFSET);
 }
-static ssize_t set_in16_min(struct device *dev, const char *buf, size_t count)
+static ssize_t set_in16_min(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct adm1026_data *data = i2c_get_clientdata(client);
@@ -824,13 +817,13 @@ static ssize_t set_in16_min(struct device *dev, const char *buf, size_t count)
        up(&data->update_lock);
        return count; 
 }
-static ssize_t show_in16_max(struct device *dev, char *buf)
+static ssize_t show_in16_max(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", INS_FROM_REG(16, data->in_max[16])
                        - NEG12_OFFSET);
 }
-static ssize_t set_in16_max(struct device *dev, const char *buf, size_t count)
+static ssize_t set_in16_max(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct adm1026_data *data = i2c_get_clientdata(client);
@@ -843,30 +836,38 @@ static ssize_t set_in16_max(struct device *dev, const char *buf, size_t count)
        return count;
 }
 
-static DEVICE_ATTR(in16_input, S_IRUGO, show_in16, NULL);
-static DEVICE_ATTR(in16_min, S_IRUGO | S_IWUSR, show_in16_min, set_in16_min);
-static DEVICE_ATTR(in16_max, S_IRUGO | S_IWUSR, show_in16_max, set_in16_max);
+static SENSOR_DEVICE_ATTR(in16_input, S_IRUGO, show_in16, NULL, 16);
+static SENSOR_DEVICE_ATTR(in16_min, S_IRUGO | S_IWUSR, show_in16_min, set_in16_min, 16);
+static SENSOR_DEVICE_ATTR(in16_max, S_IRUGO | S_IWUSR, show_in16_max, set_in16_max, 16);
 
 
 
 
 /* Now add fan read/write functions */
 
-static ssize_t show_fan(struct device *dev, char *buf, int nr)
+static ssize_t show_fan(struct device *dev, struct device_attribute *attr,
+               char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan[nr],
                data->fan_div[nr]));
 }
-static ssize_t show_fan_min(struct device *dev, char *buf, int nr)
+static ssize_t show_fan_min(struct device *dev, struct device_attribute *attr,
+               char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan_min[nr],
                data->fan_div[nr]));
 }
-static ssize_t set_fan_min(struct device *dev, const char *buf,
-               size_t count, int nr)
+static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr,
+               const char *buf, size_t count)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct i2c_client *client = to_i2c_client(dev);
        struct adm1026_data *data = i2c_get_clientdata(client);
        int val = simple_strtol(buf, NULL, 10);
@@ -879,23 +880,11 @@ static ssize_t set_fan_min(struct device *dev, const char *buf,
        return count;
 }
 
-#define fan_offset(offset)                                                  \
-static ssize_t show_fan_##offset (struct device *dev, char *buf)            \
-{                                                                           \
-       return show_fan(dev, buf, offset - 1);                              \
-}                                                                           \
-static ssize_t show_fan_##offset##_min (struct device *dev, char *buf)      \
-{                                                                           \
-       return show_fan_min(dev, buf, offset - 1);                          \
-}                                                                           \
-static ssize_t set_fan_##offset##_min (struct device *dev,                  \
-       const char *buf, size_t count)                                      \
-{                                                                           \
-       return set_fan_min(dev, buf, count, offset - 1);                    \
-}                                                                           \
-static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, NULL);  \
-static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR,                    \
-               show_fan_##offset##_min, set_fan_##offset##_min);
+#define fan_offset(offset)                                                     \
+static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan, NULL,        \
+               offset - 1);                                                    \
+static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR,                \
+               show_fan_min, set_fan_min, offset - 1);
 
 fan_offset(1);
 fan_offset(2);
@@ -926,14 +915,19 @@ static void fixup_fan_min(struct device *dev, int fan, int old_div)
 }
 
 /* Now add fan_div read/write functions */
-static ssize_t show_fan_div(struct device *dev, char *buf, int nr)
+static ssize_t show_fan_div(struct device *dev, struct device_attribute *attr,
+               char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", data->fan_div[nr]);
 }
-static ssize_t set_fan_div(struct device *dev, const char *buf,
-               size_t count, int nr)
+static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
+               const char *buf, size_t count)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct i2c_client *client = to_i2c_client(dev);
        struct adm1026_data *data = i2c_get_clientdata(client);
        int    val,orig_div,new_div,shift;
@@ -967,17 +961,8 @@ static ssize_t set_fan_div(struct device *dev, const char *buf,
 }
 
 #define fan_offset_div(offset)                                          \
-static ssize_t show_fan_##offset##_div (struct device *dev, char *buf)  \
-{                                                                       \
-       return show_fan_div(dev, buf, offset - 1);                      \
-}                                                                       \
-static ssize_t set_fan_##offset##_div (struct device *dev,              \
-       const char *buf, size_t count)                                  \
-{                                                                       \
-       return set_fan_div(dev, buf, count, offset - 1);                \
-}                                                                       \
-static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR,                \
-               show_fan_##offset##_div, set_fan_##offset##_div);
+static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR,         \
+               show_fan_div, set_fan_div, offset - 1);
 
 fan_offset_div(1);
 fan_offset_div(2);
@@ -989,19 +974,27 @@ fan_offset_div(7);
 fan_offset_div(8);
 
 /* Temps */
-static ssize_t show_temp(struct device *dev, char *buf, int nr)
+static ssize_t show_temp(struct device *dev, struct device_attribute *attr,
+               char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp[nr]));
 }
-static ssize_t show_temp_min(struct device *dev, char *buf, int nr)
+static ssize_t show_temp_min(struct device *dev, struct device_attribute *attr,
+               char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_min[nr]));
 }
-static ssize_t set_temp_min(struct device *dev, const char *buf,
-               size_t count, int nr)
+static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr,
+               const char *buf, size_t count)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct i2c_client *client = to_i2c_client(dev);
        struct adm1026_data *data = i2c_get_clientdata(client);
        int val = simple_strtol(buf, NULL, 10);
@@ -1013,14 +1006,19 @@ static ssize_t set_temp_min(struct device *dev, const char *buf,
        up(&data->update_lock);
        return count;
 }
-static ssize_t show_temp_max(struct device *dev, char *buf, int nr)
+static ssize_t show_temp_max(struct device *dev, struct device_attribute *attr,
+               char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_max[nr]));
 }
-static ssize_t set_temp_max(struct device *dev, const char *buf,
-               size_t count, int nr)
+static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr,
+               const char *buf, size_t count)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct i2c_client *client = to_i2c_client(dev);
        struct adm1026_data *data = i2c_get_clientdata(client);
        int val = simple_strtol(buf, NULL, 10);
@@ -1032,48 +1030,34 @@ static ssize_t set_temp_max(struct device *dev, const char *buf,
        up(&data->update_lock);
        return count;
 }
-#define temp_reg(offset)                                                      \
-static ssize_t show_temp_##offset (struct device *dev, char *buf)             \
-{                                                                             \
-       return show_temp(dev, buf, offset - 1);                               \
-}                                                                             \
-static ssize_t show_temp_##offset##_min (struct device *dev, char *buf)       \
-{                                                                             \
-       return show_temp_min(dev, buf, offset - 1);                           \
-}                                                                             \
-static ssize_t show_temp_##offset##_max (struct device *dev, char *buf)       \
-{                                                                             \
-       return show_temp_max(dev, buf, offset - 1);                           \
-}                                                                             \
-static ssize_t set_temp_##offset##_min (struct device *dev,                   \
-       const char *buf, size_t count)                                        \
-{                                                                             \
-       return set_temp_min(dev, buf, count, offset - 1);                     \
-}                                                                             \
-static ssize_t set_temp_##offset##_max (struct device *dev,                   \
-       const char *buf, size_t count)                                        \
-{                                                                             \
-       return set_temp_max(dev, buf, count, offset - 1);                     \
-}                                                                             \
-static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp_##offset, NULL);  \
-static DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR,                     \
-               show_temp_##offset##_min, set_temp_##offset##_min);           \
-static DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR,                     \
-               show_temp_##offset##_max, set_temp_##offset##_max);
+
+#define temp_reg(offset)                                               \
+static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp,    \
+               NULL, offset - 1);                                      \
+static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR,       \
+               show_temp_min, set_temp_min, offset - 1);               \
+static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR,       \
+               show_temp_max, set_temp_max, offset - 1);
 
 
 temp_reg(1);
 temp_reg(2);
 temp_reg(3);
 
-static ssize_t show_temp_offset(struct device *dev, char *buf, int nr)
+static ssize_t show_temp_offset(struct device *dev,
+               struct device_attribute *attr, char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_offset[nr]));
 }
-static ssize_t set_temp_offset(struct device *dev, const char *buf,
-               size_t count, int nr)
+static ssize_t set_temp_offset(struct device *dev,
+               struct device_attribute *attr, const char *buf,
+               size_t count)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct i2c_client *client = to_i2c_client(dev);
        struct adm1026_data *data = i2c_get_clientdata(client);
        int val = simple_strtol(buf, NULL, 10);
@@ -1086,46 +1070,45 @@ static ssize_t set_temp_offset(struct device *dev, const char *buf,
        return count;
 }
 
-#define temp_offset_reg(offset)                                             \
-static ssize_t show_temp_##offset##_offset (struct device *dev, char *buf)  \
-{                                                                           \
-       return show_temp_offset(dev, buf, offset - 1);                      \
-}                                                                           \
-static ssize_t set_temp_##offset##_offset (struct device *dev,              \
-       const char *buf, size_t count)                                      \
-{                                                                           \
-       return set_temp_offset(dev, buf, count, offset - 1);                \
-}                                                                           \
-static DEVICE_ATTR(temp##offset##_offset, S_IRUGO | S_IWUSR,                \
-               show_temp_##offset##_offset, set_temp_##offset##_offset);
+#define temp_offset_reg(offset)                                                        \
+static SENSOR_DEVICE_ATTR(temp##offset##_offset, S_IRUGO | S_IWUSR,            \
+               show_temp_offset, set_temp_offset, offset - 1);
 
 temp_offset_reg(1);
 temp_offset_reg(2);
 temp_offset_reg(3);
 
-static ssize_t show_temp_auto_point1_temp_hyst(struct device *dev, char *buf,
-               int nr)
+static ssize_t show_temp_auto_point1_temp_hyst(struct device *dev,
+               struct device_attribute *attr, char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", TEMP_FROM_REG(
                ADM1026_FAN_ACTIVATION_TEMP_HYST + data->temp_tmin[nr]));
 }
-static ssize_t show_temp_auto_point2_temp(struct device *dev, char *buf,
-               int nr)
+static ssize_t show_temp_auto_point2_temp(struct device *dev,
+               struct device_attribute *attr, char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_tmin[nr] +
                ADM1026_FAN_CONTROL_TEMP_RANGE));
 }
-static ssize_t show_temp_auto_point1_temp(struct device *dev, char *buf,
-               int nr)
+static ssize_t show_temp_auto_point1_temp(struct device *dev,
+               struct device_attribute *attr, char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_tmin[nr]));
 }
-static ssize_t set_temp_auto_point1_temp(struct device *dev, const char *buf,
-               size_t count, int nr)
+static ssize_t set_temp_auto_point1_temp(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t count)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct i2c_client *client = to_i2c_client(dev);
        struct adm1026_data *data = i2c_get_clientdata(client);
        int val = simple_strtol(buf, NULL, 10);
@@ -1138,46 +1121,27 @@ static ssize_t set_temp_auto_point1_temp(struct device *dev, const char *buf,
        return count;
 }
 
-#define temp_auto_point(offset)                                             \
-static ssize_t show_temp##offset##_auto_point1_temp (struct device *dev,    \
-       char *buf)                                                          \
-{                                                                           \
-       return show_temp_auto_point1_temp(dev, buf, offset - 1);            \
-}                                                                           \
-static ssize_t set_temp##offset##_auto_point1_temp (struct device *dev,     \
-       const char *buf, size_t count)                                      \
-{                                                                           \
-       return set_temp_auto_point1_temp(dev, buf, count, offset - 1);      \
-}                                                                           \
-static ssize_t show_temp##offset##_auto_point1_temp_hyst (struct device     \
-       *dev, char *buf)                                                    \
-{                                                                           \
-       return show_temp_auto_point1_temp_hyst(dev, buf, offset - 1);       \
-}                                                                           \
-static ssize_t show_temp##offset##_auto_point2_temp (struct device *dev,    \
-        char *buf)                                                         \
-{                                                                           \
-       return show_temp_auto_point2_temp(dev, buf, offset - 1);            \
-}                                                                           \
-static DEVICE_ATTR(temp##offset##_auto_point1_temp, S_IRUGO | S_IWUSR,      \
-               show_temp##offset##_auto_point1_temp,                       \
-               set_temp##offset##_auto_point1_temp);                       \
-static DEVICE_ATTR(temp##offset##_auto_point1_temp_hyst, S_IRUGO,           \
-               show_temp##offset##_auto_point1_temp_hyst, NULL);           \
-static DEVICE_ATTR(temp##offset##_auto_point2_temp, S_IRUGO,                \
-               show_temp##offset##_auto_point2_temp, NULL);
+#define temp_auto_point(offset)                                                        \
+static SENSOR_DEVICE_ATTR(temp##offset##_auto_point1_temp, S_IRUGO | S_IWUSR,  \
+               show_temp_auto_point1_temp, set_temp_auto_point1_temp,          \
+               offset - 1);                                                    \
+static SENSOR_DEVICE_ATTR(temp##offset##_auto_point1_temp_hyst, S_IRUGO,       \
+               show_temp_auto_point1_temp_hyst, NULL, offset - 1);             \
+static SENSOR_DEVICE_ATTR(temp##offset##_auto_point2_temp, S_IRUGO,            \
+               show_temp_auto_point2_temp, NULL, offset - 1);
 
 temp_auto_point(1);
 temp_auto_point(2);
 temp_auto_point(3);
 
-static ssize_t show_temp_crit_enable(struct device *dev, char *buf)
+static ssize_t show_temp_crit_enable(struct device *dev,
+               struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", (data->config1 & CFG1_THERM_HOT) >> 4);
 }
-static ssize_t set_temp_crit_enable(struct device *dev, const char *buf,
-               size_t count)
+static ssize_t set_temp_crit_enable(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct adm1026_data *data = i2c_get_clientdata(client);
@@ -1193,24 +1157,27 @@ static ssize_t set_temp_crit_enable(struct device *dev, const char *buf,
        return count;
 }
 
-static DEVICE_ATTR(temp1_crit_enable, S_IRUGO | S_IWUSR, 
-       show_temp_crit_enable, set_temp_crit_enable);
-
-static DEVICE_ATTR(temp2_crit_enable, S_IRUGO | S_IWUSR, 
-       show_temp_crit_enable, set_temp_crit_enable);
-
-static DEVICE_ATTR(temp3_crit_enable, S_IRUGO | S_IWUSR, 
+#define temp_crit_enable(offset)                               \
+static DEVICE_ATTR(temp##offset##_crit_enable, S_IRUGO | S_IWUSR, \
        show_temp_crit_enable, set_temp_crit_enable);
 
+temp_crit_enable(1);
+temp_crit_enable(2);
+temp_crit_enable(3);
 
-static ssize_t show_temp_crit(struct device *dev, char *buf, int nr)
+static ssize_t show_temp_crit(struct device *dev,
+               struct device_attribute *attr, char *buf)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_crit[nr]));
 }
-static ssize_t set_temp_crit(struct device *dev, const char *buf,
-               size_t count, int nr)
+static ssize_t set_temp_crit(struct device *dev, struct device_attribute *attr,
+               const char *buf, size_t count)
 {
+       struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
+       int nr = sensor_attr->index;
        struct i2c_client *client = to_i2c_client(dev);
        struct adm1026_data *data = i2c_get_clientdata(client);
        int val = simple_strtol(buf, NULL, 10);
@@ -1223,29 +1190,20 @@ static ssize_t set_temp_crit(struct device *dev, const char *buf,
        return count;
 }
 
-#define temp_crit_reg(offset)                                             \
-static ssize_t show_temp_##offset##_crit (struct device *dev, char *buf)  \
-{                                                                         \
-       return show_temp_crit(dev, buf, offset - 1);                      \
-}                                                                         \
-static ssize_t set_temp_##offset##_crit (struct device *dev,              \
-       const char *buf, size_t count)                                    \
-{                                                                         \
-       return set_temp_crit(dev, buf, count, offset - 1);                \
-}                                                                         \
-static DEVICE_ATTR(temp##offset##_crit, S_IRUGO | S_IWUSR,                \
-               show_temp_##offset##_crit, set_temp_##offset##_crit);
+#define temp_crit_reg(offset)                                          \
+static SENSOR_DEVICE_ATTR(temp##offset##_crit, S_IRUGO | S_IWUSR,      \
+               show_temp_crit, set_temp_crit, offset - 1);
 
 temp_crit_reg(1);
 temp_crit_reg(2);
 temp_crit_reg(3);
 
-static ssize_t show_analog_out_reg(struct device *dev, char *buf)
+static ssize_t show_analog_out_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", DAC_FROM_REG(data->analog_out));
 }
-static ssize_t set_analog_out_reg(struct device *dev, const char *buf,
+static ssize_t set_analog_out_reg(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -1262,7 +1220,7 @@ static ssize_t set_analog_out_reg(struct device *dev, const char *buf,
 static DEVICE_ATTR(analog_out, S_IRUGO | S_IWUSR, show_analog_out_reg, 
        set_analog_out_reg);
 
-static ssize_t show_vid_reg(struct device *dev, char *buf)
+static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", vid_from_reg(data->vid & 0x3f, data->vrm));
@@ -1270,12 +1228,12 @@ static ssize_t show_vid_reg(struct device *dev, char *buf)
 
 static DEVICE_ATTR(vid, S_IRUGO, show_vid_reg, NULL);
 
-static ssize_t show_vrm_reg(struct device *dev, char *buf)
+static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", data->vrm);
 }
-static ssize_t store_vrm_reg(struct device *dev, const char *buf,
+static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -1287,7 +1245,7 @@ static ssize_t store_vrm_reg(struct device *dev, const char *buf,
 
 static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
 
-static ssize_t show_alarms_reg(struct device *dev, char *buf)
+static ssize_t show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf, "%ld\n", (long) (data->alarms));
@@ -1295,12 +1253,12 @@ static ssize_t show_alarms_reg(struct device *dev, char *buf)
 
 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
 
-static ssize_t show_alarm_mask(struct device *dev, char *buf)
+static ssize_t show_alarm_mask(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%ld\n", data->alarm_mask);
 }
-static ssize_t set_alarm_mask(struct device *dev, const char *buf,
+static ssize_t set_alarm_mask(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -1331,12 +1289,12 @@ static DEVICE_ATTR(alarm_mask, S_IRUGO | S_IWUSR, show_alarm_mask,
        set_alarm_mask);
 
 
-static ssize_t show_gpio(struct device *dev, char *buf)
+static ssize_t show_gpio(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%ld\n", data->gpio);
 }
-static ssize_t set_gpio(struct device *dev, const char *buf,
+static ssize_t set_gpio(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -1359,12 +1317,12 @@ static ssize_t set_gpio(struct device *dev, const char *buf,
 static DEVICE_ATTR(gpio, S_IRUGO | S_IWUSR, show_gpio, set_gpio);
 
 
-static ssize_t show_gpio_mask(struct device *dev, char *buf)
+static ssize_t show_gpio_mask(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%ld\n", data->gpio_mask);
 }
-static ssize_t set_gpio_mask(struct device *dev, const char *buf,
+static ssize_t set_gpio_mask(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -1386,12 +1344,12 @@ static ssize_t set_gpio_mask(struct device *dev, const char *buf,
 
 static DEVICE_ATTR(gpio_mask, S_IRUGO | S_IWUSR, show_gpio_mask, set_gpio_mask);
 
-static ssize_t show_pwm_reg(struct device *dev, char *buf)
+static ssize_t show_pwm_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", PWM_FROM_REG(data->pwm1.pwm));
 }
-static ssize_t set_pwm_reg(struct device *dev, const char *buf,
+static ssize_t set_pwm_reg(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -1407,12 +1365,12 @@ static ssize_t set_pwm_reg(struct device *dev, const char *buf,
        }
        return count;
 }
-static ssize_t show_auto_pwm_min(struct device *dev, char *buf)
+static ssize_t show_auto_pwm_min(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", data->pwm1.auto_pwm_min);
 }
-static ssize_t set_auto_pwm_min(struct device *dev, const char *buf,
+static ssize_t set_auto_pwm_min(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -1429,16 +1387,16 @@ static ssize_t set_auto_pwm_min(struct device *dev, const char *buf,
        up(&data->update_lock);
        return count;
 }
-static ssize_t show_auto_pwm_max(struct device *dev, char *buf)
+static ssize_t show_auto_pwm_max(struct device *dev, struct device_attribute *attr, char *buf)
 {
        return sprintf(buf,"%d\n", ADM1026_PWM_MAX);
 }
-static ssize_t show_pwm_enable(struct device *dev, char *buf)
+static ssize_t show_pwm_enable(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1026_data *data = adm1026_update_device(dev);
        return sprintf(buf,"%d\n", data->pwm1.enable);
 }
-static ssize_t set_pwm_enable(struct device *dev, const char *buf,
+static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -1597,114 +1555,114 @@ int adm1026_detect(struct i2c_adapter *adapter, int address,
        adm1026_init_client(new_client);
 
        /* Register sysfs hooks */
-       device_create_file(&new_client->dev, &dev_attr_in0_input);
-       device_create_file(&new_client->dev, &dev_attr_in0_max);
-       device_create_file(&new_client->dev, &dev_attr_in0_min);
-       device_create_file(&new_client->dev, &dev_attr_in1_input);
-       device_create_file(&new_client->dev, &dev_attr_in1_max);
-       device_create_file(&new_client->dev, &dev_attr_in1_min);
-       device_create_file(&new_client->dev, &dev_attr_in2_input);
-       device_create_file(&new_client->dev, &dev_attr_in2_max);
-       device_create_file(&new_client->dev, &dev_attr_in2_min);
-       device_create_file(&new_client->dev, &dev_attr_in3_input);
-       device_create_file(&new_client->dev, &dev_attr_in3_max);
-       device_create_file(&new_client->dev, &dev_attr_in3_min);
-       device_create_file(&new_client->dev, &dev_attr_in4_input);
-       device_create_file(&new_client->dev, &dev_attr_in4_max);
-       device_create_file(&new_client->dev, &dev_attr_in4_min);
-       device_create_file(&new_client->dev, &dev_attr_in5_input);
-       device_create_file(&new_client->dev, &dev_attr_in5_max);
-       device_create_file(&new_client->dev, &dev_attr_in5_min);
-       device_create_file(&new_client->dev, &dev_attr_in6_input);
-       device_create_file(&new_client->dev, &dev_attr_in6_max);
-       device_create_file(&new_client->dev, &dev_attr_in6_min);
-       device_create_file(&new_client->dev, &dev_attr_in7_input);
-       device_create_file(&new_client->dev, &dev_attr_in7_max);
-       device_create_file(&new_client->dev, &dev_attr_in7_min);
-       device_create_file(&new_client->dev, &dev_attr_in8_input);
-       device_create_file(&new_client->dev, &dev_attr_in8_max);
-       device_create_file(&new_client->dev, &dev_attr_in8_min);
-       device_create_file(&new_client->dev, &dev_attr_in9_input);
-       device_create_file(&new_client->dev, &dev_attr_in9_max);
-       device_create_file(&new_client->dev, &dev_attr_in9_min);
-       device_create_file(&new_client->dev, &dev_attr_in10_input);
-       device_create_file(&new_client->dev, &dev_attr_in10_max);
-       device_create_file(&new_client->dev, &dev_attr_in10_min);
-       device_create_file(&new_client->dev, &dev_attr_in11_input);
-       device_create_file(&new_client->dev, &dev_attr_in11_max);
-       device_create_file(&new_client->dev, &dev_attr_in11_min);
-       device_create_file(&new_client->dev, &dev_attr_in12_input);
-       device_create_file(&new_client->dev, &dev_attr_in12_max);
-       device_create_file(&new_client->dev, &dev_attr_in12_min);
-       device_create_file(&new_client->dev, &dev_attr_in13_input);
-       device_create_file(&new_client->dev, &dev_attr_in13_max);
-       device_create_file(&new_client->dev, &dev_attr_in13_min);
-       device_create_file(&new_client->dev, &dev_attr_in14_input);
-       device_create_file(&new_client->dev, &dev_attr_in14_max);
-       device_create_file(&new_client->dev, &dev_attr_in14_min);
-       device_create_file(&new_client->dev, &dev_attr_in15_input);
-       device_create_file(&new_client->dev, &dev_attr_in15_max);
-       device_create_file(&new_client->dev, &dev_attr_in15_min);
-       device_create_file(&new_client->dev, &dev_attr_in16_input);
-       device_create_file(&new_client->dev, &dev_attr_in16_max);
-       device_create_file(&new_client->dev, &dev_attr_in16_min);
-       device_create_file(&new_client->dev, &dev_attr_fan1_input);
-       device_create_file(&new_client->dev, &dev_attr_fan1_div);
-       device_create_file(&new_client->dev, &dev_attr_fan1_min);
-       device_create_file(&new_client->dev, &dev_attr_fan2_input);
-       device_create_file(&new_client->dev, &dev_attr_fan2_div);
-       device_create_file(&new_client->dev, &dev_attr_fan2_min);
-       device_create_file(&new_client->dev, &dev_attr_fan3_input);
-       device_create_file(&new_client->dev, &dev_attr_fan3_div);
-       device_create_file(&new_client->dev, &dev_attr_fan3_min);
-       device_create_file(&new_client->dev, &dev_attr_fan4_input);
-       device_create_file(&new_client->dev, &dev_attr_fan4_div);
-       device_create_file(&new_client->dev, &dev_attr_fan4_min);
-       device_create_file(&new_client->dev, &dev_attr_fan5_input);
-       device_create_file(&new_client->dev, &dev_attr_fan5_div);
-       device_create_file(&new_client->dev, &dev_attr_fan5_min);
-       device_create_file(&new_client->dev, &dev_attr_fan6_input);
-       device_create_file(&new_client->dev, &dev_attr_fan6_div);
-       device_create_file(&new_client->dev, &dev_attr_fan6_min);
-       device_create_file(&new_client->dev, &dev_attr_fan7_input);
-       device_create_file(&new_client->dev, &dev_attr_fan7_div);
-       device_create_file(&new_client->dev, &dev_attr_fan7_min);
-       device_create_file(&new_client->dev, &dev_attr_fan8_input);
-       device_create_file(&new_client->dev, &dev_attr_fan8_div);
-       device_create_file(&new_client->dev, &dev_attr_fan8_min);
-       device_create_file(&new_client->dev, &dev_attr_temp1_input);
-       device_create_file(&new_client->dev, &dev_attr_temp1_max);
-       device_create_file(&new_client->dev, &dev_attr_temp1_min);
-       device_create_file(&new_client->dev, &dev_attr_temp2_input);
-       device_create_file(&new_client->dev, &dev_attr_temp2_max);
-       device_create_file(&new_client->dev, &dev_attr_temp2_min);
-       device_create_file(&new_client->dev, &dev_attr_temp3_input);
-       device_create_file(&new_client->dev, &dev_attr_temp3_max);
-       device_create_file(&new_client->dev, &dev_attr_temp3_min);
-       device_create_file(&new_client->dev, &dev_attr_temp1_offset);
-       device_create_file(&new_client->dev, &dev_attr_temp2_offset);
-       device_create_file(&new_client->dev, &dev_attr_temp3_offset);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in0_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in0_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in0_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in1_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in1_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in1_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in2_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in2_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in2_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in3_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in3_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in3_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in4_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in4_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in4_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in5_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in5_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in5_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in6_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in6_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in6_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in7_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in7_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in7_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in8_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in8_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in8_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in9_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in9_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in9_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in10_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in10_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in10_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in11_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in11_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in11_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in12_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in12_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in12_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in13_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in13_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in13_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in14_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in14_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in14_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in15_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in15_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in15_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in16_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in16_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_in16_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan1_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan1_div.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan1_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan2_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan2_div.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan2_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan3_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan3_div.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan3_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan4_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan4_div.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan4_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan5_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan5_div.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan5_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan6_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan6_div.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan6_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan7_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan7_div.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan7_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan8_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan8_div.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_fan8_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp1_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp1_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp1_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp2_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp2_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp2_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp3_input.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp3_max.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp3_min.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp1_offset.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp2_offset.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp3_offset.dev_attr);
        device_create_file(&new_client->dev, 
-               &dev_attr_temp1_auto_point1_temp);
+               &sensor_dev_attr_temp1_auto_point1_temp.dev_attr);
        device_create_file(&new_client->dev, 
-               &dev_attr_temp2_auto_point1_temp);
+               &sensor_dev_attr_temp2_auto_point1_temp.dev_attr);
        device_create_file(&new_client->dev, 
-               &dev_attr_temp3_auto_point1_temp);
+               &sensor_dev_attr_temp3_auto_point1_temp.dev_attr);
        device_create_file(&new_client->dev,
-               &dev_attr_temp1_auto_point1_temp_hyst);
+               &sensor_dev_attr_temp1_auto_point1_temp_hyst.dev_attr);
        device_create_file(&new_client->dev,
-               &dev_attr_temp2_auto_point1_temp_hyst);
+               &sensor_dev_attr_temp2_auto_point1_temp_hyst.dev_attr);
        device_create_file(&new_client->dev,
-               &dev_attr_temp3_auto_point1_temp_hyst);
+               &sensor_dev_attr_temp3_auto_point1_temp_hyst.dev_attr);
        device_create_file(&new_client->dev, 
-               &dev_attr_temp1_auto_point2_temp);
+               &sensor_dev_attr_temp1_auto_point2_temp.dev_attr);
        device_create_file(&new_client->dev, 
-               &dev_attr_temp2_auto_point2_temp);
+               &sensor_dev_attr_temp2_auto_point2_temp.dev_attr);
        device_create_file(&new_client->dev, 
-               &dev_attr_temp3_auto_point2_temp);
-       device_create_file(&new_client->dev, &dev_attr_temp1_crit);
-       device_create_file(&new_client->dev, &dev_attr_temp2_crit);
-       device_create_file(&new_client->dev, &dev_attr_temp3_crit);
+               &sensor_dev_attr_temp3_auto_point2_temp.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp1_crit.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp2_crit.dev_attr);
+       device_create_file(&new_client->dev, &sensor_dev_attr_temp3_crit.dev_attr);
        device_create_file(&new_client->dev, &dev_attr_temp1_crit_enable);
        device_create_file(&new_client->dev, &dev_attr_temp2_crit_enable);
        device_create_file(&new_client->dev, &dev_attr_temp3_crit_enable);
index d4385a23f79a7d7abce199990ff3a8bbe315396b..2163dba467c47a3dfb5282d255dada96ffe89d7f 100644 (file)
@@ -292,11 +292,11 @@ set_fan_auto_channel(struct device *dev, const char *buf, size_t count, int nr)
 }
 
 #define fan_auto_channel_offset(offset)                                                \
-static ssize_t show_fan_auto_channel_##offset (struct device *dev, char *buf)  \
+static ssize_t show_fan_auto_channel_##offset (struct device *dev, struct device_attribute *attr, char *buf)   \
 {                                                                              \
        return show_fan_auto_channel(dev, buf, offset - 1);                     \
 }                                                                              \
-static ssize_t set_fan_auto_channel_##offset (struct device *dev,              \
+static ssize_t set_fan_auto_channel_##offset (struct device *dev, struct device_attribute *attr,               \
        const char *buf, size_t count)                                          \
 {                                                                              \
        return set_fan_auto_channel(dev, buf, count, offset - 1);               \
@@ -357,24 +357,24 @@ set_auto_temp_max(struct device *dev, const char *buf, size_t count, int nr)
 }
 
 #define auto_temp_reg(offset)                                                  \
-static ssize_t show_auto_temp_##offset##_off (struct device *dev, char *buf)   \
+static ssize_t show_auto_temp_##offset##_off (struct device *dev, struct device_attribute *attr, char *buf)    \
 {                                                                              \
        return show_auto_temp_off(dev, buf, offset - 1);                        \
 }                                                                              \
-static ssize_t show_auto_temp_##offset##_min (struct device *dev, char *buf)   \
+static ssize_t show_auto_temp_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)    \
 {                                                                              \
        return show_auto_temp_min(dev, buf, offset - 1);                        \
 }                                                                              \
-static ssize_t show_auto_temp_##offset##_max (struct device *dev, char *buf)   \
+static ssize_t show_auto_temp_##offset##_max (struct device *dev, struct device_attribute *attr, char *buf)    \
 {                                                                              \
        return show_auto_temp_max(dev, buf, offset - 1);                        \
 }                                                                              \
-static ssize_t set_auto_temp_##offset##_min (struct device *dev,               \
+static ssize_t set_auto_temp_##offset##_min (struct device *dev, struct device_attribute *attr,                \
                                             const char *buf, size_t count)     \
 {                                                                              \
        return set_auto_temp_min(dev, buf, count, offset - 1);          \
 }                                                                              \
-static ssize_t set_auto_temp_##offset##_max (struct device *dev,               \
+static ssize_t set_auto_temp_##offset##_max (struct device *dev, struct device_attribute *attr,                \
                                             const char *buf, size_t count)     \
 {                                                                              \
        return set_auto_temp_max(dev, buf, count, offset - 1);          \
@@ -421,11 +421,11 @@ set_pwm(struct device *dev, const char *buf, size_t count, int nr)
 }
 
 #define pwm_reg(offset)                                                        \
-static ssize_t show_pwm_##offset (struct device *dev, char *buf)       \
+static ssize_t show_pwm_##offset (struct device *dev, struct device_attribute *attr, char *buf)        \
 {                                                                      \
        return show_pwm(dev, buf, offset - 1);                  \
 }                                                                      \
-static ssize_t set_pwm_##offset (struct device *dev,                   \
+static ssize_t set_pwm_##offset (struct device *dev, struct device_attribute *attr,                    \
                                 const char *buf, size_t count)         \
 {                                                                      \
        return set_pwm(dev, buf, count, offset - 1);            \
@@ -557,24 +557,24 @@ set_fan_div(struct device *dev, const char *buf, size_t count, int nr)
 }
 
 #define fan_offset(offset)                                             \
-static ssize_t show_fan_##offset (struct device *dev, char *buf)       \
+static ssize_t show_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf)        \
 {                                                                      \
        return show_fan(dev, buf, offset - 1);                  \
 }                                                                      \
-static ssize_t show_fan_##offset##_min (struct device *dev, char *buf) \
+static ssize_t show_fan_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)  \
 {                                                                      \
        return show_fan_min(dev, buf, offset - 1);                      \
 }                                                                      \
-static ssize_t show_fan_##offset##_div (struct device *dev, char *buf) \
+static ssize_t show_fan_##offset##_div (struct device *dev, struct device_attribute *attr, char *buf)  \
 {                                                                      \
        return show_fan_div(dev, buf, offset - 1);                      \
 }                                                                      \
-static ssize_t set_fan_##offset##_min (struct device *dev,             \
+static ssize_t set_fan_##offset##_min (struct device *dev, struct device_attribute *attr,              \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_fan_min(dev, buf, count, offset - 1);                \
 }                                                                      \
-static ssize_t set_fan_##offset##_div (struct device *dev,             \
+static ssize_t set_fan_##offset##_div (struct device *dev, struct device_attribute *attr,              \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_fan_div(dev, buf, count, offset - 1);                \
@@ -667,33 +667,33 @@ set_temp_crit(struct device *dev, const char *buf, size_t count, int nr)
 }
 
 #define temp_reg(offset)                                                       \
-static ssize_t show_temp_##offset (struct device *dev, char *buf)              \
+static ssize_t show_temp_##offset (struct device *dev, struct device_attribute *attr, char *buf)               \
 {                                                                              \
        return show_temp(dev, buf, offset - 1);                         \
 }                                                                              \
-static ssize_t show_temp_##offset##_min (struct device *dev, char *buf)                \
+static ssize_t show_temp_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)         \
 {                                                                              \
        return show_temp_min(dev, buf, offset - 1);                             \
 }                                                                              \
-static ssize_t show_temp_##offset##_max (struct device *dev, char *buf)                \
+static ssize_t show_temp_##offset##_max (struct device *dev, struct device_attribute *attr, char *buf)         \
 {                                                                              \
        return show_temp_max(dev, buf, offset - 1);                             \
 }                                                                              \
-static ssize_t show_temp_##offset##_crit (struct device *dev, char *buf)       \
+static ssize_t show_temp_##offset##_crit (struct device *dev, struct device_attribute *attr, char *buf)        \
 {                                                                              \
        return show_temp_crit(dev, buf, offset - 1);                    \
 }                                                                              \
-static ssize_t set_temp_##offset##_min (struct device *dev,                    \
+static ssize_t set_temp_##offset##_min (struct device *dev, struct device_attribute *attr,                     \
                                        const char *buf, size_t count)          \
 {                                                                              \
        return set_temp_min(dev, buf, count, offset - 1);                       \
 }                                                                              \
-static ssize_t set_temp_##offset##_max (struct device *dev,                    \
+static ssize_t set_temp_##offset##_max (struct device *dev, struct device_attribute *attr,                     \
                                        const char *buf, size_t count)          \
 {                                                                              \
        return set_temp_max(dev, buf, count, offset - 1);                       \
 }                                                                              \
-static ssize_t set_temp_##offset##_crit (struct device *dev,                   \
+static ssize_t set_temp_##offset##_crit (struct device *dev, struct device_attribute *attr,                    \
                                         const char *buf, size_t count)         \
 {                                                                              \
        return set_temp_crit(dev, buf, count, offset - 1);                      \
@@ -712,7 +712,7 @@ temp_reg(2);
 temp_reg(3);
 
 /* Alarms */
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct adm1031_data *data = adm1031_update_device(dev);
        return sprintf(buf, "%d\n", data->alarm);
index 7f899002bc5493ca2cbbf1225dca003c6c63e6b3..4a47b4493e34aa8b567efcf818f89245a53b3182 100644 (file)
@@ -260,28 +260,28 @@ set_in_reg(MAX, max)
 
 #define sysfs_in(offset) \
 static ssize_t \
-       show_in##offset (struct device *dev, char *buf) \
+       show_in##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_in(dev, buf, offset); \
 } \
 static DEVICE_ATTR(in##offset##_input, S_IRUGO, \
                show_in##offset, NULL); \
 static ssize_t \
-       show_in##offset##_min (struct device *dev, char *buf) \
+       show_in##offset##_min (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_in_min(dev, buf, offset); \
 } \
 static ssize_t \
-       show_in##offset##_max (struct device *dev, char *buf) \
+       show_in##offset##_max (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_in_max(dev, buf, offset); \
 } \
-static ssize_t set_in##offset##_min (struct device *dev, \
+static ssize_t set_in##offset##_min (struct device *dev, struct device_attribute *attr, \
                const char *buf, size_t count) \
 { \
        return set_in_min(dev, buf, count, offset); \
 } \
-static ssize_t set_in##offset##_max (struct device *dev, \
+static ssize_t set_in##offset##_max (struct device *dev, struct device_attribute *attr, \
                const char *buf, size_t count) \
 { \
        return set_in_max(dev, buf, count, offset); \
@@ -389,24 +389,24 @@ static ssize_t set_fan_div(struct device *dev, const char *buf,
 }
 
 #define sysfs_fan(offset) \
-static ssize_t show_fan##offset(struct device *dev, char *buf) \
+static ssize_t show_fan##offset(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_fan(dev, buf, offset - 1); \
 } \
-static ssize_t show_fan##offset##_min(struct device *dev, char *buf) \
+static ssize_t show_fan##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_fan_min(dev, buf, offset - 1); \
 } \
-static ssize_t show_fan##offset##_div(struct device *dev, char *buf) \
+static ssize_t show_fan##offset##_div(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_fan_div(dev, buf, offset - 1); \
 } \
-static ssize_t set_fan##offset##_min(struct device *dev, const char *buf, \
+static ssize_t set_fan##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \
                                        size_t count) \
 { \
        return set_fan_min(dev, buf, count, offset - 1); \
 } \
-static ssize_t set_fan##offset##_div(struct device *dev, const char *buf, \
+static ssize_t set_fan##offset##_div(struct device *dev, struct device_attribute *attr, const char *buf, \
                                        size_t count) \
 { \
        return set_fan_div(dev, buf, count, offset - 1); \
@@ -482,27 +482,27 @@ set_temp_reg(MAX, temp_max);
 set_temp_reg(HYST, temp_hyst);
 
 #define sysfs_temp(num) \
-static ssize_t show_temp##num(struct device *dev, char *buf) \
+static ssize_t show_temp##num(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_temp(dev, buf, num-1); \
 } \
 static DEVICE_ATTR(temp##num##_input, S_IRUGO, show_temp##num, NULL); \
-static ssize_t show_temp_max##num(struct device *dev, char *buf) \
+static ssize_t show_temp_max##num(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_temp_max(dev, buf, num-1); \
 } \
-static ssize_t set_temp_max##num(struct device *dev, const char *buf, \
+static ssize_t set_temp_max##num(struct device *dev, struct device_attribute *attr, const char *buf, \
                                        size_t count) \
 { \
        return set_temp_max(dev, buf, count, num-1); \
 } \
 static DEVICE_ATTR(temp##num##_max, S_IRUGO | S_IWUSR, \
                show_temp_max##num, set_temp_max##num); \
-static ssize_t show_temp_hyst##num(struct device *dev, char *buf) \
+static ssize_t show_temp_hyst##num(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_temp_hyst(dev, buf, num-1); \
 } \
-static ssize_t set_temp_hyst##num(struct device *dev, const char *buf, \
+static ssize_t set_temp_hyst##num(struct device *dev, struct device_attribute *attr, const char *buf, \
                                        size_t count) \
 { \
        return set_temp_hyst(dev, buf, count, num-1); \
@@ -522,7 +522,7 @@ sysfs_temp(4);
        device_create_file(&client->dev, &dev_attr_temp##num##_max_hyst); \
 } while (0)
 
-static ssize_t show_vid(struct device *dev, char *buf)
+static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct asb100_data *data = asb100_update_device(dev);
        return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
@@ -533,13 +533,13 @@ static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
 device_create_file(&client->dev, &dev_attr_cpu0_vid)
 
 /* VRM */
-static ssize_t show_vrm(struct device *dev, char *buf)
+static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct asb100_data *data = asb100_update_device(dev);
        return sprintf(buf, "%d\n", data->vrm);
 }
 
-static ssize_t set_vrm(struct device *dev, const char *buf, size_t count)
+static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct asb100_data *data = i2c_get_clientdata(client);
@@ -553,7 +553,7 @@ static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
 #define device_create_file_vrm(client) \
 device_create_file(&client->dev, &dev_attr_vrm);
 
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct asb100_data *data = asb100_update_device(dev);
        return sprintf(buf, "%d\n", ALARMS_FROM_REG(data->alarms));
@@ -564,13 +564,13 @@ static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
 device_create_file(&client->dev, &dev_attr_alarms)
 
 /* 1 PWM */
-static ssize_t show_pwm1(struct device *dev, char *buf)
+static ssize_t show_pwm1(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct asb100_data *data = asb100_update_device(dev);
        return sprintf(buf, "%d\n", ASB100_PWM_FROM_REG(data->pwm & 0x0f));
 }
 
-static ssize_t set_pwm1(struct device *dev, const char *buf, size_t count)
+static ssize_t set_pwm1(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct asb100_data *data = i2c_get_clientdata(client);
@@ -584,13 +584,13 @@ static ssize_t set_pwm1(struct device *dev, const char *buf, size_t count)
        return count;
 }
 
-static ssize_t show_pwm_enable1(struct device *dev, char *buf)
+static ssize_t show_pwm_enable1(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct asb100_data *data = asb100_update_device(dev);
        return sprintf(buf, "%d\n", (data->pwm & 0x80) ? 1 : 0);
 }
 
-static ssize_t set_pwm_enable1(struct device *dev, const char *buf,
+static ssize_t set_pwm_enable1(struct device *dev, struct device_attribute *attr, const char *buf,
                                size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
index bb1fefb2162ecccf67c1447852f84ccf5024c64d..4ae15bd5dcfb360214b86596db736e95aed21227 100644 (file)
@@ -137,7 +137,7 @@ static void ds1621_init_client(struct i2c_client *client)
 }
 
 #define show(value)                                                    \
-static ssize_t show_##value(struct device *dev, char *buf)             \
+static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf)              \
 {                                                                      \
        struct ds1621_data *data = ds1621_update_client(dev);           \
        return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->value));   \
@@ -148,7 +148,7 @@ show(temp_min);
 show(temp_max);
 
 #define set_temp(suffix, value, reg)                                   \
-static ssize_t set_temp_##suffix(struct device *dev, const char *buf,  \
+static ssize_t set_temp_##suffix(struct device *dev, struct device_attribute *attr, const char *buf,   \
                                 size_t count)                          \
 {                                                                      \
        struct i2c_client *client = to_i2c_client(dev);                 \
@@ -165,7 +165,7 @@ static ssize_t set_temp_##suffix(struct device *dev, const char *buf,       \
 set_temp(min, temp_min, DS1621_REG_TEMP_MIN);
 set_temp(max, temp_max, DS1621_REG_TEMP_MAX);
 
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct ds1621_data *data = ds1621_update_client(dev);
        return sprintf(buf, "%d\n", ALARMS_FROM_REG(data->conf));
index 18e33ac59d0cd5d7fa5e150d0d7eeb28d45c8138..c3f37dbec11a249068742bb10ffb55f26429297f 100644 (file)
@@ -157,8 +157,8 @@ struct fscher_data {
 
 #define sysfs_r(kind, sub, offset, reg) \
 static ssize_t show_##kind##sub (struct fscher_data *, char *, int); \
-static ssize_t show_##kind##offset##sub (struct device *, char *); \
-static ssize_t show_##kind##offset##sub (struct device *dev, char *buf) \
+static ssize_t show_##kind##offset##sub (struct device *, struct device_attribute *attr, char *); \
+static ssize_t show_##kind##offset##sub (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct fscher_data *data = fscher_update_device(dev); \
        return show_##kind##sub(data, buf, (offset)); \
@@ -166,8 +166,8 @@ static ssize_t show_##kind##offset##sub (struct device *dev, char *buf) \
 
 #define sysfs_w(kind, sub, offset, reg) \
 static ssize_t set_##kind##sub (struct i2c_client *, struct fscher_data *, const char *, size_t, int, int); \
-static ssize_t set_##kind##offset##sub (struct device *, const char *, size_t); \
-static ssize_t set_##kind##offset##sub (struct device *dev, const char *buf, size_t count) \
+static ssize_t set_##kind##offset##sub (struct device *, struct device_attribute *attr, const char *, size_t); \
+static ssize_t set_##kind##offset##sub (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
        struct fscher_data *data = i2c_get_clientdata(client); \
index 2cac79145c7596b12827b02bdfb8cfb7430ed2e8..3beaa6191ef4ca5b6ba926fdc9c864d66d145ccc 100644 (file)
@@ -245,19 +245,19 @@ static void reset_fan_alarm(struct i2c_client *client, int nr)
 /* Volts */
 #define VOLT_FROM_REG(val, mult)       ((val) * (mult) / 255)
 
-static ssize_t show_volt_12(struct device *dev, char *buf)
+static ssize_t show_volt_12(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct fscpos_data *data = fscpos_update_device(dev);
        return sprintf(buf, "%u\n", VOLT_FROM_REG(data->volt[0], 14200));
 }
 
-static ssize_t show_volt_5(struct device *dev, char *buf)
+static ssize_t show_volt_5(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct fscpos_data *data = fscpos_update_device(dev);
        return sprintf(buf, "%u\n", VOLT_FROM_REG(data->volt[1], 6600));
 }
 
-static ssize_t show_volt_batt(struct device *dev, char *buf)
+static ssize_t show_volt_batt(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct fscpos_data *data = fscpos_update_device(dev);
        return sprintf(buf, "%u\n", VOLT_FROM_REG(data->volt[2], 3300));
@@ -327,7 +327,7 @@ static ssize_t set_wdog_preset(struct i2c_client *client, struct fscpos_data
 }
 
 /* Event */
-static ssize_t show_event(struct device *dev, char *buf)
+static ssize_t show_event(struct device *dev, struct device_attribute *attr, char *buf)
 {
        /* bits 5..7 reserved => mask with 0x1f */
        struct fscpos_data *data = fscpos_update_device(dev);
@@ -338,14 +338,14 @@ static ssize_t show_event(struct device *dev, char *buf)
  * Sysfs stuff
  */
 #define create_getter(kind, sub) \
-       static ssize_t sysfs_show_##kind##sub(struct device *dev, char *buf) \
+       static ssize_t sysfs_show_##kind##sub(struct device *dev, struct device_attribute *attr, char *buf) \
        { \
                struct fscpos_data *data = fscpos_update_device(dev); \
                return show_##kind##sub(data, buf); \
        }
 
 #define create_getter_n(kind, offset, sub) \
-       static ssize_t sysfs_show_##kind##offset##sub(struct device *dev, char\
+       static ssize_t sysfs_show_##kind##offset##sub(struct device *dev, struct device_attribute *attr, char\
                                                                        *buf) \
        { \
                struct fscpos_data *data = fscpos_update_device(dev); \
@@ -353,7 +353,7 @@ static ssize_t show_event(struct device *dev, char *buf)
        }
 
 #define create_setter(kind, sub, reg) \
-       static ssize_t sysfs_set_##kind##sub (struct device *dev, const char \
+       static ssize_t sysfs_set_##kind##sub (struct device *dev, struct device_attribute *attr, const char \
                                                        *buf, size_t count) \
        { \
                struct i2c_client *client = to_i2c_client(dev); \
@@ -362,7 +362,7 @@ static ssize_t show_event(struct device *dev, char *buf)
        }
 
 #define create_setter_n(kind, offset, sub, reg) \
-       static ssize_t sysfs_set_##kind##offset##sub (struct device *dev, \
+       static ssize_t sysfs_set_##kind##offset##sub (struct device *dev, struct device_attribute *attr, \
                                        const char *buf, size_t count) \
        { \
                struct i2c_client *client = to_i2c_client(dev); \
index c82d6ce2120552be7e869e074747555c9db16de6..4316a15622517af2c89a1354ff3ca80dce6f749a 100644 (file)
@@ -164,14 +164,14 @@ static struct i2c_driver gl518_driver = {
  */
 
 #define show(type, suffix, value)                                      \
-static ssize_t show_##suffix(struct device *dev, char *buf)            \
+static ssize_t show_##suffix(struct device *dev, struct device_attribute *attr, char *buf)             \
 {                                                                      \
        struct gl518_data *data = gl518_update_device(dev);             \
        return sprintf(buf, "%d\n", type##_FROM_REG(data->value));      \
 }
 
 #define show_fan(suffix, value, index)                                 \
-static ssize_t show_##suffix(struct device *dev, char *buf)            \
+static ssize_t show_##suffix(struct device *dev, struct device_attribute *attr, char *buf)             \
 {                                                                      \
        struct gl518_data *data = gl518_update_device(dev);             \
        return sprintf(buf, "%d\n", FAN_FROM_REG(data->value[index],    \
@@ -205,7 +205,7 @@ show(BOOL, beep_enable, beep_enable);
 show(BEEP_MASK, beep_mask, beep_mask);
 
 #define set(type, suffix, value, reg)                                  \
-static ssize_t set_##suffix(struct device *dev, const char *buf,       \
+static ssize_t set_##suffix(struct device *dev, struct device_attribute *attr, const char *buf,        \
        size_t count)                                                   \
 {                                                                      \
        struct i2c_client *client = to_i2c_client(dev);                 \
@@ -220,7 +220,7 @@ static ssize_t set_##suffix(struct device *dev, const char *buf,    \
 }
 
 #define set_bits(type, suffix, value, reg, mask, shift)                        \
-static ssize_t set_##suffix(struct device *dev, const char *buf,       \
+static ssize_t set_##suffix(struct device *dev, struct device_attribute *attr, const char *buf,        \
        size_t count)                                                   \
 {                                                                      \
        struct i2c_client *client = to_i2c_client(dev);                 \
@@ -258,7 +258,7 @@ set_high(IN, in_max3, voltage_max[3], GL518_REG_VIN3_LIMIT);
 set_bits(BOOL, beep_enable, beep_enable, GL518_REG_CONF, 0x04, 2);
 set(BEEP_MASK, beep_mask, beep_mask, GL518_REG_ALARM);
 
-static ssize_t set_fan_min1(struct device *dev, const char *buf, size_t count)
+static ssize_t set_fan_min1(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct gl518_data *data = i2c_get_clientdata(client);
@@ -284,7 +284,7 @@ static ssize_t set_fan_min1(struct device *dev, const char *buf, size_t count)
        return count;
 }
 
-static ssize_t set_fan_min2(struct device *dev, const char *buf, size_t count)
+static ssize_t set_fan_min2(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct gl518_data *data = i2c_get_clientdata(client);
index 3fd17e46ffc6d4dbd0195c1441afd9e1b3061b6c..a13a504f5bfa621fe4b2977f0ea9b2e3a2d33e7f 100644 (file)
@@ -148,8 +148,8 @@ struct gl520_data {
 
 #define sysfs_r(type, n, item, reg) \
 static ssize_t get_##type##item (struct gl520_data *, char *, int); \
-static ssize_t get_##type##n##item (struct device *, char *); \
-static ssize_t get_##type##n##item (struct device *dev, char *buf) \
+static ssize_t get_##type##n##item (struct device *, struct device_attribute *attr, char *); \
+static ssize_t get_##type##n##item (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct gl520_data *data = gl520_update_device(dev); \
        return get_##type##item(data, buf, (n)); \
@@ -157,8 +157,8 @@ static ssize_t get_##type##n##item (struct device *dev, char *buf) \
 
 #define sysfs_w(type, n, item, reg) \
 static ssize_t set_##type##item (struct i2c_client *, struct gl520_data *, const char *, size_t, int, int); \
-static ssize_t set_##type##n##item (struct device *, const char *, size_t); \
-static ssize_t set_##type##n##item (struct device *dev, const char *buf, size_t count) \
+static ssize_t set_##type##n##item (struct device *, struct device_attribute *attr, const char *, size_t); \
+static ssize_t set_##type##n##item (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
        struct gl520_data *data = i2c_get_clientdata(client); \
index cf7e6898754f6dffe9a0bad6b77230f2922a37c9..007bdf9e7e2afdc8775e38dba804ad9ec9db9e5b 100644 (file)
@@ -290,7 +290,7 @@ static ssize_t set_in_max(struct device *dev, const char *buf,
 
 #define show_in_offset(offset)                                 \
 static ssize_t                                                 \
-       show_in##offset (struct device *dev, char *buf)         \
+       show_in##offset (struct device *dev, struct device_attribute *attr, char *buf)          \
 {                                                              \
        return show_in(dev, buf, offset);                       \
 }                                                              \
@@ -298,21 +298,21 @@ static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in##offset, NULL);
 
 #define limit_in_offset(offset)                                        \
 static ssize_t                                                 \
-       show_in##offset##_min (struct device *dev, char *buf)   \
+       show_in##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)    \
 {                                                              \
        return show_in_min(dev, buf, offset);                   \
 }                                                              \
 static ssize_t                                                 \
-       show_in##offset##_max (struct device *dev, char *buf)   \
+       show_in##offset##_max (struct device *dev, struct device_attribute *attr, char *buf)    \
 {                                                              \
        return show_in_max(dev, buf, offset);                   \
 }                                                              \
-static ssize_t set_in##offset##_min (struct device *dev,       \
+static ssize_t set_in##offset##_min (struct device *dev, struct device_attribute *attr,        \
                const char *buf, size_t count)                  \
 {                                                              \
        return set_in_min(dev, buf, count, offset);             \
 }                                                              \
-static ssize_t set_in##offset##_max (struct device *dev,       \
+static ssize_t set_in##offset##_max (struct device *dev, struct device_attribute *attr,        \
                        const char *buf, size_t count)          \
 {                                                              \
        return set_in_max(dev, buf, count, offset);             \
@@ -383,26 +383,26 @@ static ssize_t set_temp_min(struct device *dev, const char *buf,
        return count;
 }
 #define show_temp_offset(offset)                                       \
-static ssize_t show_temp_##offset (struct device *dev, char *buf)      \
+static ssize_t show_temp_##offset (struct device *dev, struct device_attribute *attr, char *buf)       \
 {                                                                      \
        return show_temp(dev, buf, offset - 1);                         \
 }                                                                      \
 static ssize_t                                                         \
-show_temp_##offset##_max (struct device *dev, char *buf)               \
+show_temp_##offset##_max (struct device *dev, struct device_attribute *attr, char *buf)                \
 {                                                                      \
        return show_temp_max(dev, buf, offset - 1);                     \
 }                                                                      \
 static ssize_t                                                         \
-show_temp_##offset##_min (struct device *dev, char *buf)               \
+show_temp_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)                \
 {                                                                      \
        return show_temp_min(dev, buf, offset - 1);                     \
 }                                                                      \
-static ssize_t set_temp_##offset##_max (struct device *dev,            \
+static ssize_t set_temp_##offset##_max (struct device *dev, struct device_attribute *attr,             \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_temp_max(dev, buf, count, offset - 1);               \
 }                                                                      \
-static ssize_t set_temp_##offset##_min (struct device *dev,            \
+static ssize_t set_temp_##offset##_min (struct device *dev, struct device_attribute *attr,             \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_temp_min(dev, buf, count, offset - 1);               \
@@ -453,11 +453,11 @@ static ssize_t set_sensor(struct device *dev, const char *buf,
        return count;
 }
 #define show_sensor_offset(offset)                                     \
-static ssize_t show_sensor_##offset (struct device *dev, char *buf)    \
+static ssize_t show_sensor_##offset (struct device *dev, struct device_attribute *attr, char *buf)     \
 {                                                                      \
        return show_sensor(dev, buf, offset - 1);                       \
 }                                                                      \
-static ssize_t set_sensor_##offset (struct device *dev,                \
+static ssize_t set_sensor_##offset (struct device *dev, struct device_attribute *attr,                 \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_sensor(dev, buf, count, offset - 1);                 \
@@ -600,24 +600,24 @@ static ssize_t set_pwm(struct device *dev, const char *buf,
 }
 
 #define show_fan_offset(offset)                                                \
-static ssize_t show_fan_##offset (struct device *dev, char *buf)       \
+static ssize_t show_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf)        \
 {                                                                      \
        return show_fan(dev, buf, offset - 1);                          \
 }                                                                      \
-static ssize_t show_fan_##offset##_min (struct device *dev, char *buf) \
+static ssize_t show_fan_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)  \
 {                                                                      \
        return show_fan_min(dev, buf, offset - 1);                      \
 }                                                                      \
-static ssize_t show_fan_##offset##_div (struct device *dev, char *buf) \
+static ssize_t show_fan_##offset##_div (struct device *dev, struct device_attribute *attr, char *buf)  \
 {                                                                      \
        return show_fan_div(dev, buf, offset - 1);                      \
 }                                                                      \
-static ssize_t set_fan_##offset##_min (struct device *dev,             \
+static ssize_t set_fan_##offset##_min (struct device *dev, struct device_attribute *attr,              \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_fan_min(dev, buf, count, offset - 1);                \
 }                                                                      \
-static ssize_t set_fan_##offset##_div (struct device *dev,             \
+static ssize_t set_fan_##offset##_div (struct device *dev, struct device_attribute *attr,              \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_fan_div(dev, buf, count, offset - 1);                \
@@ -633,21 +633,21 @@ show_fan_offset(2);
 show_fan_offset(3);
 
 #define show_pwm_offset(offset)                                                \
-static ssize_t show_pwm##offset##_enable (struct device *dev,          \
+static ssize_t show_pwm##offset##_enable (struct device *dev, struct device_attribute *attr,           \
        char *buf)                                                      \
 {                                                                      \
        return show_pwm_enable(dev, buf, offset - 1);                   \
 }                                                                      \
-static ssize_t show_pwm##offset (struct device *dev, char *buf)                \
+static ssize_t show_pwm##offset (struct device *dev, struct device_attribute *attr, char *buf)         \
 {                                                                      \
        return show_pwm(dev, buf, offset - 1);                          \
 }                                                                      \
-static ssize_t set_pwm##offset##_enable (struct device *dev,           \
+static ssize_t set_pwm##offset##_enable (struct device *dev, struct device_attribute *attr,            \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_pwm_enable(dev, buf, count, offset - 1);             \
 }                                                                      \
-static ssize_t set_pwm##offset (struct device *dev,                    \
+static ssize_t set_pwm##offset (struct device *dev, struct device_attribute *attr,                     \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_pwm(dev, buf, count, offset - 1);                    \
@@ -663,7 +663,7 @@ show_pwm_offset(2);
 show_pwm_offset(3);
 
 /* Alarms */
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct it87_data *data = it87_update_device(dev);
        return sprintf(buf,"%d\n", ALARMS_FROM_REG(data->alarms));
@@ -671,13 +671,13 @@ static ssize_t show_alarms(struct device *dev, char *buf)
 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
 
 static ssize_t
-show_vrm_reg(struct device *dev, char *buf)
+show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct it87_data *data = it87_update_device(dev);
        return sprintf(buf, "%ld\n", (long) data->vrm);
 }
 static ssize_t
-store_vrm_reg(struct device *dev, const char *buf, size_t count)
+store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct it87_data *data = i2c_get_clientdata(client);
@@ -693,7 +693,7 @@ static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
 device_create_file(&client->dev, &dev_attr_vrm)
 
 static ssize_t
-show_vid_reg(struct device *dev, char *buf)
+show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct it87_data *data = it87_update_device(dev);
        return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
index 14cc5af03739363a010213d1061e59daed763ab9..bc68e031392b399acdfbd2c2dda62fadacdf54cc 100644 (file)
@@ -177,7 +177,7 @@ struct lm63_data {
  */
 
 #define show_fan(value) \
-static ssize_t show_##value(struct device *dev, char *buf) \
+static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm63_data *data = lm63_update_device(dev); \
        return sprintf(buf, "%d\n", FAN_FROM_REG(data->value)); \
@@ -185,7 +185,7 @@ static ssize_t show_##value(struct device *dev, char *buf) \
 show_fan(fan1_input);
 show_fan(fan1_low);
 
-static ssize_t set_fan1_low(struct device *dev, const char *buf,
+static ssize_t set_fan1_low(struct device *dev, struct device_attribute *attr, const char *buf,
        size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -202,7 +202,7 @@ static ssize_t set_fan1_low(struct device *dev, const char *buf,
        return count;
 }
 
-static ssize_t show_pwm1(struct device *dev, char *buf)
+static ssize_t show_pwm1(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm63_data *data = lm63_update_device(dev);
        return sprintf(buf, "%d\n", data->pwm1_value >= 2 * data->pwm1_freq ?
@@ -210,7 +210,7 @@ static ssize_t show_pwm1(struct device *dev, char *buf)
                       (2 * data->pwm1_freq));
 }
 
-static ssize_t set_pwm1(struct device *dev, const char *buf, size_t count)
+static ssize_t set_pwm1(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct lm63_data *data = i2c_get_clientdata(client);
@@ -229,20 +229,20 @@ static ssize_t set_pwm1(struct device *dev, const char *buf, size_t count)
        return count;
 }
 
-static ssize_t show_pwm1_enable(struct device *dev, char *buf)
+static ssize_t show_pwm1_enable(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm63_data *data = lm63_update_device(dev);
        return sprintf(buf, "%d\n", data->config_fan & 0x20 ? 1 : 2);
 }
 
 #define show_temp8(value) \
-static ssize_t show_##value(struct device *dev, char *buf) \
+static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm63_data *data = lm63_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP8_FROM_REG(data->value)); \
 }
 #define show_temp11(value) \
-static ssize_t show_##value(struct device *dev, char *buf) \
+static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm63_data *data = lm63_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP11_FROM_REG(data->value)); \
@@ -255,7 +255,7 @@ show_temp11(temp2_low);
 show_temp8(temp2_crit);
 
 #define set_temp8(value, reg) \
-static ssize_t set_##value(struct device *dev, const char *buf, \
+static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -269,7 +269,7 @@ static ssize_t set_##value(struct device *dev, const char *buf, \
        return count; \
 }
 #define set_temp11(value, reg_msb, reg_lsb) \
-static ssize_t set_##value(struct device *dev, const char *buf, \
+static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -289,7 +289,7 @@ set_temp11(temp2_low, LM63_REG_REMOTE_LOW_MSB, LM63_REG_REMOTE_LOW_LSB);
 
 /* Hysteresis register holds a relative value, while we want to present
    an absolute to user-space */
-static ssize_t show_temp2_crit_hyst(struct device *dev, char *buf)
+static ssize_t show_temp2_crit_hyst(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm63_data *data = lm63_update_device(dev);
        return sprintf(buf, "%d\n", TEMP8_FROM_REG(data->temp2_crit)
@@ -298,7 +298,7 @@ static ssize_t show_temp2_crit_hyst(struct device *dev, char *buf)
 
 /* And now the other way around, user-space provides an absolute
    hysteresis value and we have to store a relative one */
-static ssize_t set_temp2_crit_hyst(struct device *dev, const char *buf,
+static ssize_t set_temp2_crit_hyst(struct device *dev, struct device_attribute *attr, const char *buf,
        size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -314,7 +314,7 @@ static ssize_t set_temp2_crit_hyst(struct device *dev, const char *buf,
        return count;
 }
 
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm63_data *data = lm63_update_device(dev);
        return sprintf(buf, "%u\n", data->alarms);
index 0e86cc89398171f492243880462d43948b22e4d4..57c51ac37c04b121a66d09247bb8ddf15d513d68 100644 (file)
@@ -75,7 +75,7 @@ static struct i2c_driver lm75_driver = {
 };
 
 #define show(value)    \
-static ssize_t show_##value(struct device *dev, char *buf)             \
+static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf)              \
 {                                                                      \
        struct lm75_data *data = lm75_update_device(dev);               \
        return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->value));   \
@@ -85,7 +85,7 @@ show(temp_hyst);
 show(temp_input);
 
 #define set(value, reg)        \
-static ssize_t set_##value(struct device *dev, const char *buf, size_t count)  \
+static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)   \
 {                                                              \
        struct i2c_client *client = to_i2c_client(dev);         \
        struct lm75_data *data = i2c_get_clientdata(client);    \
index f56b7a37de759b33b5376c90b1eef24106d64ec2..9d15cd5189f6bd45df09b0193c85210881f5f025 100644 (file)
@@ -103,7 +103,7 @@ static inline int LM77_TEMP_FROM_REG(u16 reg)
 
 /* read routines for temperature limits */
 #define show(value)    \
-static ssize_t show_##value(struct device *dev, char *buf)     \
+static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf)      \
 {                                                              \
        struct lm77_data *data = lm77_update_device(dev);       \
        return sprintf(buf, "%d\n", data->value);               \
@@ -116,17 +116,17 @@ show(temp_max);
 show(alarms);
 
 /* read routines for hysteresis values */
-static ssize_t show_temp_crit_hyst(struct device *dev, char *buf)
+static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm77_data *data = lm77_update_device(dev);
        return sprintf(buf, "%d\n", data->temp_crit - data->temp_hyst);
 }
-static ssize_t show_temp_min_hyst(struct device *dev, char *buf)
+static ssize_t show_temp_min_hyst(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm77_data *data = lm77_update_device(dev);
        return sprintf(buf, "%d\n", data->temp_min + data->temp_hyst);
 }
-static ssize_t show_temp_max_hyst(struct device *dev, char *buf)
+static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm77_data *data = lm77_update_device(dev);
        return sprintf(buf, "%d\n", data->temp_max - data->temp_hyst);
@@ -134,7 +134,7 @@ static ssize_t show_temp_max_hyst(struct device *dev, char *buf)
 
 /* write routines */
 #define set(value, reg)        \
-static ssize_t set_##value(struct device *dev, const char *buf, size_t count)  \
+static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)   \
 {                                                                              \
        struct i2c_client *client = to_i2c_client(dev);                         \
        struct lm77_data *data = i2c_get_clientdata(client);                    \
@@ -152,7 +152,7 @@ set(temp_max, LM77_REG_TEMP_MAX);
 
 /* hysteresis is stored as a relative value on the chip, so it has to be
    converted first */
-static ssize_t set_temp_crit_hyst(struct device *dev, const char *buf, size_t count)
+static ssize_t set_temp_crit_hyst(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct lm77_data *data = i2c_get_clientdata(client);
@@ -167,7 +167,7 @@ static ssize_t set_temp_crit_hyst(struct device *dev, const char *buf, size_t co
 }
 
 /* preserve hysteresis when setting T_crit */
-static ssize_t set_temp_crit(struct device *dev, const char *buf, size_t count)
+static ssize_t set_temp_crit(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct lm77_data *data = i2c_get_clientdata(client);
index 6d52d14eb31c92bc93fff49054d3b647261cbf56..21b195ff3871430916a55234d9b6f784b39486ef 100644 (file)
@@ -224,28 +224,28 @@ static ssize_t set_in_max(struct device *dev, const char *buf,
        
 #define show_in_offset(offset)                                 \
 static ssize_t                                                 \
-       show_in##offset (struct device *dev, char *buf)         \
+       show_in##offset (struct device *dev, struct device_attribute *attr, char *buf)          \
 {                                                              \
        return show_in(dev, buf, offset);                       \
 }                                                              \
 static DEVICE_ATTR(in##offset##_input, S_IRUGO,                \
                show_in##offset, NULL);                         \
 static ssize_t                                                 \
-       show_in##offset##_min (struct device *dev, char *buf)   \
+       show_in##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)   \
 {                                                              \
        return show_in_min(dev, buf, offset);                   \
 }                                                              \
 static ssize_t                                                 \
-       show_in##offset##_max (struct device *dev, char *buf)   \
+       show_in##offset##_max (struct device *dev, struct device_attribute *attr, char *buf)   \
 {                                                              \
        return show_in_max(dev, buf, offset);                   \
 }                                                              \
-static ssize_t set_in##offset##_min (struct device *dev,       \
+static ssize_t set_in##offset##_min (struct device *dev, struct device_attribute *attr,        \
                const char *buf, size_t count)                  \
 {                                                              \
        return set_in_min(dev, buf, count, offset);             \
 }                                                              \
-static ssize_t set_in##offset##_max (struct device *dev,       \
+static ssize_t set_in##offset##_max (struct device *dev, struct device_attribute *attr,        \
                const char *buf, size_t count)                  \
 {                                                              \
        return set_in_max(dev, buf, count, offset);             \
@@ -264,19 +264,19 @@ show_in_offset(5);
 show_in_offset(6);
 
 /* Temperature */
-static ssize_t show_temp(struct device *dev, char *buf)
+static ssize_t show_temp(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm78_data *data = lm78_update_device(dev);
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
 }
 
-static ssize_t show_temp_over(struct device *dev, char *buf)
+static ssize_t show_temp_over(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm78_data *data = lm78_update_device(dev);
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
 }
 
-static ssize_t set_temp_over(struct device *dev, const char *buf, size_t count)
+static ssize_t set_temp_over(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct lm78_data *data = i2c_get_clientdata(client);
@@ -289,13 +289,13 @@ static ssize_t set_temp_over(struct device *dev, const char *buf, size_t count)
        return count;
 }
 
-static ssize_t show_temp_hyst(struct device *dev, char *buf)
+static ssize_t show_temp_hyst(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm78_data *data = lm78_update_device(dev);
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
 }
 
-static ssize_t set_temp_hyst(struct device *dev, const char *buf, size_t count)
+static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct lm78_data *data = i2c_get_clientdata(client);
@@ -398,19 +398,19 @@ static ssize_t set_fan_div(struct device *dev, const char *buf,
 }
 
 #define show_fan_offset(offset)                                                \
-static ssize_t show_fan_##offset (struct device *dev, char *buf)       \
+static ssize_t show_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf)        \
 {                                                                      \
        return show_fan(dev, buf, offset - 1);                          \
 }                                                                      \
-static ssize_t show_fan_##offset##_min (struct device *dev, char *buf)  \
+static ssize_t show_fan_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)  \
 {                                                                      \
        return show_fan_min(dev, buf, offset - 1);                      \
 }                                                                      \
-static ssize_t show_fan_##offset##_div (struct device *dev, char *buf)  \
+static ssize_t show_fan_##offset##_div (struct device *dev, struct device_attribute *attr, char *buf)  \
 {                                                                      \
        return show_fan_div(dev, buf, offset - 1);                      \
 }                                                                      \
-static ssize_t set_fan_##offset##_min (struct device *dev,             \
+static ssize_t set_fan_##offset##_min (struct device *dev, struct device_attribute *attr,              \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_fan_min(dev, buf, count, offset - 1);                \
@@ -419,13 +419,13 @@ static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, NULL);\
 static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR,               \
                show_fan_##offset##_min, set_fan_##offset##_min);
 
-static ssize_t set_fan_1_div(struct device *dev, const char *buf,
+static ssize_t set_fan_1_div(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        return set_fan_div(dev, buf, count, 0) ;
 }
 
-static ssize_t set_fan_2_div(struct device *dev, const char *buf,
+static ssize_t set_fan_2_div(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        return set_fan_div(dev, buf, count, 1) ;
@@ -443,7 +443,7 @@ static DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
 static DEVICE_ATTR(fan3_div, S_IRUGO, show_fan_3_div, NULL);
 
 /* VID */
-static ssize_t show_vid(struct device *dev, char *buf)
+static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm78_data *data = lm78_update_device(dev);
        return sprintf(buf, "%d\n", VID_FROM_REG(data->vid));
@@ -451,7 +451,7 @@ static ssize_t show_vid(struct device *dev, char *buf)
 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
 
 /* Alarms */
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm78_data *data = lm78_update_device(dev);
        return sprintf(buf, "%u\n", data->alarms);
index a72f431971bb6351872dfeef29e539fdde26658d..404057b70e9003d74915f70def6bebe8da020bfb 100644 (file)
@@ -156,7 +156,7 @@ static struct i2c_driver lm80_driver = {
  */
 
 #define show_in(suffix, value) \
-static ssize_t show_in_##suffix(struct device *dev, char *buf) \
+static ssize_t show_in_##suffix(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm80_data *data = lm80_update_device(dev); \
        return sprintf(buf, "%d\n", IN_FROM_REG(data->value)); \
@@ -184,7 +184,7 @@ show_in(input5, in[5]);
 show_in(input6, in[6]);
 
 #define set_in(suffix, value, reg) \
-static ssize_t set_in_##suffix(struct device *dev, const char *buf, \
+static ssize_t set_in_##suffix(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -213,7 +213,7 @@ set_in(max5, in_max[5], LM80_REG_IN_MAX(5));
 set_in(max6, in_max[6], LM80_REG_IN_MAX(6));
 
 #define show_fan(suffix, value, div) \
-static ssize_t show_fan_##suffix(struct device *dev, char *buf) \
+static ssize_t show_fan_##suffix(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm80_data *data = lm80_update_device(dev); \
        return sprintf(buf, "%d\n", FAN_FROM_REG(data->value, \
@@ -225,7 +225,7 @@ show_fan(input1, fan[0], fan_div[0]);
 show_fan(input2, fan[1], fan_div[1]);
 
 #define show_fan_div(suffix, value) \
-static ssize_t show_fan_div##suffix(struct device *dev, char *buf) \
+static ssize_t show_fan_div##suffix(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm80_data *data = lm80_update_device(dev); \
        return sprintf(buf, "%d\n", DIV_FROM_REG(data->value)); \
@@ -234,7 +234,7 @@ show_fan_div(1, fan_div[0]);
 show_fan_div(2, fan_div[1]);
 
 #define set_fan(suffix, value, reg, div) \
-static ssize_t set_fan_##suffix(struct device *dev, const char *buf, \
+static ssize_t set_fan_##suffix(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -292,7 +292,7 @@ static ssize_t set_fan_div(struct device *dev, const char *buf,
 }
 
 #define set_fan_div(number) \
-static ssize_t set_fan_div##number(struct device *dev, const char *buf, \
+static ssize_t set_fan_div##number(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        return set_fan_div(dev, buf, count, number - 1); \
@@ -300,14 +300,14 @@ static ssize_t set_fan_div##number(struct device *dev, const char *buf, \
 set_fan_div(1);
 set_fan_div(2);
 
-static ssize_t show_temp_input1(struct device *dev, char *buf)
+static ssize_t show_temp_input1(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm80_data *data = lm80_update_device(dev);
        return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp));
 }
 
 #define show_temp(suffix, value) \
-static ssize_t show_temp_##suffix(struct device *dev, char *buf) \
+static ssize_t show_temp_##suffix(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm80_data *data = lm80_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_LIMIT_FROM_REG(data->value)); \
@@ -318,7 +318,7 @@ show_temp(os_max, temp_os_max);
 show_temp(os_hyst, temp_os_hyst);
 
 #define set_temp(suffix, value, reg) \
-static ssize_t set_temp_##suffix(struct device *dev, const char *buf, \
+static ssize_t set_temp_##suffix(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -336,7 +336,7 @@ set_temp(hot_hyst, temp_hot_hyst, LM80_REG_TEMP_HOT_HYST);
 set_temp(os_max, temp_os_max, LM80_REG_TEMP_OS_MAX);
 set_temp(os_hyst, temp_os_hyst, LM80_REG_TEMP_OS_HYST);
 
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm80_data *data = lm80_update_device(dev);
        return sprintf(buf, "%u\n", data->alarms);
index 3dafe60766ad9de9848dbe48df1cea8507bb4033..4d6d7d21e14b2f53192fea59629f1cebadd77694 100644 (file)
@@ -155,7 +155,7 @@ struct lm83_data {
  */
 
 #define show_temp(suffix, value) \
-static ssize_t show_temp_##suffix(struct device *dev, char *buf) \
+static ssize_t show_temp_##suffix(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm83_data *data = lm83_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \
@@ -171,7 +171,7 @@ show_temp(high4, temp_high[3]);
 show_temp(crit, temp_crit);
 
 #define set_temp(suffix, value, reg) \
-static ssize_t set_temp_##suffix(struct device *dev, const char *buf, \
+static ssize_t set_temp_##suffix(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -190,7 +190,7 @@ set_temp(high3, temp_high[2], LM83_REG_W_REMOTE2_HIGH);
 set_temp(high4, temp_high[3], LM83_REG_W_REMOTE3_HIGH);
 set_temp(crit, temp_crit, LM83_REG_W_TCRIT);
 
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm83_data *data = lm83_update_device(dev);
        return sprintf(buf, "%d\n", data->alarms);
index b1a0dc5f6b34fc104fcf3e2a1c09f311de237cde..b1976775b4ba89b7e18b03487c42f622c4d5ef60 100644 (file)
@@ -426,15 +426,15 @@ static ssize_t set_fan_min(struct device *dev, const char *buf,
 }
 
 #define show_fan_offset(offset)                                                \
-static ssize_t show_fan_##offset (struct device *dev, char *buf)       \
+static ssize_t show_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf)        \
 {                                                                      \
        return show_fan(dev, buf, offset - 1);                          \
 }                                                                      \
-static ssize_t show_fan_##offset##_min (struct device *dev, char *buf) \
+static ssize_t show_fan_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)  \
 {                                                                      \
        return show_fan_min(dev, buf, offset - 1);                      \
 }                                                                      \
-static ssize_t set_fan_##offset##_min (struct device *dev,             \
+static ssize_t set_fan_##offset##_min (struct device *dev, struct device_attribute *attr,              \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_fan_min(dev, buf, count, offset - 1);                \
@@ -451,7 +451,7 @@ show_fan_offset(4);
 
 /* vid, vrm, alarms */
 
-static ssize_t show_vid_reg(struct device *dev, char *buf)
+static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm85_data *data = lm85_update_device(dev);
        return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
@@ -459,13 +459,13 @@ static ssize_t show_vid_reg(struct device *dev, char *buf)
 
 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
 
-static ssize_t show_vrm_reg(struct device *dev, char *buf)
+static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm85_data *data = lm85_update_device(dev);
        return sprintf(buf, "%ld\n", (long) data->vrm);
 }
 
-static ssize_t store_vrm_reg(struct device *dev, const char *buf, size_t count)
+static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct lm85_data *data = i2c_get_clientdata(client);
@@ -478,7 +478,7 @@ static ssize_t store_vrm_reg(struct device *dev, const char *buf, size_t count)
 
 static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
 
-static ssize_t show_alarms_reg(struct device *dev, char *buf)
+static ssize_t show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm85_data *data = lm85_update_device(dev);
        return sprintf(buf, "%ld\n", (long) ALARMS_FROM_REG(data->alarms));
@@ -516,16 +516,16 @@ static ssize_t show_pwm_enable(struct device *dev, char *buf, int nr)
 }
 
 #define show_pwm_reg(offset)                                           \
-static ssize_t show_pwm_##offset (struct device *dev, char *buf)       \
+static ssize_t show_pwm_##offset (struct device *dev, struct device_attribute *attr, char *buf)        \
 {                                                                      \
        return show_pwm(dev, buf, offset - 1);                          \
 }                                                                      \
-static ssize_t set_pwm_##offset (struct device *dev,                   \
+static ssize_t set_pwm_##offset (struct device *dev, struct device_attribute *attr,                    \
                                 const char *buf, size_t count)         \
 {                                                                      \
        return set_pwm(dev, buf, count, offset - 1);                    \
 }                                                                      \
-static ssize_t show_pwm_enable##offset (struct device *dev, char *buf) \
+static ssize_t show_pwm_enable##offset (struct device *dev, struct device_attribute *attr, char *buf)  \
 {                                                                      \
        return show_pwm_enable(dev, buf, offset - 1);                   \
 }                                                                      \
@@ -585,24 +585,24 @@ static ssize_t set_in_max(struct device *dev, const char *buf,
        return count;
 }
 #define show_in_reg(offset)                                            \
-static ssize_t show_in_##offset (struct device *dev, char *buf)                \
+static ssize_t show_in_##offset (struct device *dev, struct device_attribute *attr, char *buf)         \
 {                                                                      \
        return show_in(dev, buf, offset);                               \
 }                                                                      \
-static ssize_t show_in_##offset##_min (struct device *dev, char *buf)  \
+static ssize_t show_in_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)   \
 {                                                                      \
        return show_in_min(dev, buf, offset);                           \
 }                                                                      \
-static ssize_t show_in_##offset##_max (struct device *dev, char *buf)  \
+static ssize_t show_in_##offset##_max (struct device *dev, struct device_attribute *attr, char *buf)   \
 {                                                                      \
        return show_in_max(dev, buf, offset);                           \
 }                                                                      \
-static ssize_t set_in_##offset##_min (struct device *dev,              \
+static ssize_t set_in_##offset##_min (struct device *dev, struct device_attribute *attr,               \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_in_min(dev, buf, count, offset);                     \
 }                                                                      \
-static ssize_t set_in_##offset##_max (struct device *dev,              \
+static ssize_t set_in_##offset##_max (struct device *dev, struct device_attribute *attr,               \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_in_max(dev, buf, count, offset);                     \
@@ -666,24 +666,24 @@ static ssize_t set_temp_max(struct device *dev, const char *buf,
        return count;
 }
 #define show_temp_reg(offset)                                          \
-static ssize_t show_temp_##offset (struct device *dev, char *buf)      \
+static ssize_t show_temp_##offset (struct device *dev, struct device_attribute *attr, char *buf)       \
 {                                                                      \
        return show_temp(dev, buf, offset - 1);                         \
 }                                                                      \
-static ssize_t show_temp_##offset##_min (struct device *dev, char *buf)        \
+static ssize_t show_temp_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf) \
 {                                                                      \
        return show_temp_min(dev, buf, offset - 1);                     \
 }                                                                      \
-static ssize_t show_temp_##offset##_max (struct device *dev, char *buf)        \
+static ssize_t show_temp_##offset##_max (struct device *dev, struct device_attribute *attr, char *buf) \
 {                                                                      \
        return show_temp_max(dev, buf, offset - 1);                     \
 }                                                                      \
-static ssize_t set_temp_##offset##_min (struct device *dev,            \
+static ssize_t set_temp_##offset##_min (struct device *dev, struct device_attribute *attr,             \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_temp_min(dev, buf, count, offset - 1);               \
 }                                                                      \
-static ssize_t set_temp_##offset##_max (struct device *dev,            \
+static ssize_t set_temp_##offset##_max (struct device *dev, struct device_attribute *attr,             \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_temp_max(dev, buf, count, offset - 1);               \
@@ -786,42 +786,42 @@ static ssize_t set_pwm_auto_pwm_freq(struct device *dev, const char *buf,
        return count;
 }
 #define pwm_auto(offset)                                               \
-static ssize_t show_pwm##offset##_auto_channels (struct device *dev,   \
+static ssize_t show_pwm##offset##_auto_channels (struct device *dev, struct device_attribute *attr,    \
        char *buf)                                                      \
 {                                                                      \
        return show_pwm_auto_channels(dev, buf, offset - 1);            \
 }                                                                      \
-static ssize_t set_pwm##offset##_auto_channels (struct device *dev,    \
+static ssize_t set_pwm##offset##_auto_channels (struct device *dev, struct device_attribute *attr,     \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_pwm_auto_channels(dev, buf, count, offset - 1);      \
 }                                                                      \
-static ssize_t show_pwm##offset##_auto_pwm_min (struct device *dev,    \
+static ssize_t show_pwm##offset##_auto_pwm_min (struct device *dev, struct device_attribute *attr,     \
        char *buf)                                                      \
 {                                                                      \
        return show_pwm_auto_pwm_min(dev, buf, offset - 1);             \
 }                                                                      \
-static ssize_t set_pwm##offset##_auto_pwm_min (struct device *dev,     \
+static ssize_t set_pwm##offset##_auto_pwm_min (struct device *dev, struct device_attribute *attr,      \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_pwm_auto_pwm_min(dev, buf, count, offset - 1);       \
 }                                                                      \
-static ssize_t show_pwm##offset##_auto_pwm_minctl (struct device *dev, \
+static ssize_t show_pwm##offset##_auto_pwm_minctl (struct device *dev, struct device_attribute *attr,  \
        char *buf)                                                      \
 {                                                                      \
        return show_pwm_auto_pwm_minctl(dev, buf, offset - 1);          \
 }                                                                      \
-static ssize_t set_pwm##offset##_auto_pwm_minctl (struct device *dev,  \
+static ssize_t set_pwm##offset##_auto_pwm_minctl (struct device *dev, struct device_attribute *attr,   \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_pwm_auto_pwm_minctl(dev, buf, count, offset - 1);    \
 }                                                                      \
-static ssize_t show_pwm##offset##_auto_pwm_freq (struct device *dev,   \
+static ssize_t show_pwm##offset##_auto_pwm_freq (struct device *dev, struct device_attribute *attr,    \
        char *buf)                                                      \
 {                                                                      \
        return show_pwm_auto_pwm_freq(dev, buf, offset - 1);            \
 }                                                                      \
-static ssize_t set_pwm##offset##_auto_pwm_freq(struct device *dev,     \
+static ssize_t set_pwm##offset##_auto_pwm_freq(struct device *dev, struct device_attribute *attr,      \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_pwm_auto_pwm_freq(dev, buf, count, offset - 1);      \
@@ -962,42 +962,42 @@ static ssize_t set_temp_auto_temp_crit(struct device *dev, const char *buf,
        return count;
 }
 #define temp_auto(offset)                                              \
-static ssize_t show_temp##offset##_auto_temp_off (struct device *dev,  \
+static ssize_t show_temp##offset##_auto_temp_off (struct device *dev, struct device_attribute *attr,   \
        char *buf)                                                      \
 {                                                                      \
        return show_temp_auto_temp_off(dev, buf, offset - 1);           \
 }                                                                      \
-static ssize_t set_temp##offset##_auto_temp_off (struct device *dev,   \
+static ssize_t set_temp##offset##_auto_temp_off (struct device *dev, struct device_attribute *attr,    \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_temp_auto_temp_off(dev, buf, count, offset - 1);     \
 }                                                                      \
-static ssize_t show_temp##offset##_auto_temp_min (struct device *dev,  \
+static ssize_t show_temp##offset##_auto_temp_min (struct device *dev, struct device_attribute *attr,   \
        char *buf)                                                      \
 {                                                                      \
        return show_temp_auto_temp_min(dev, buf, offset - 1);           \
 }                                                                      \
-static ssize_t set_temp##offset##_auto_temp_min (struct device *dev,   \
+static ssize_t set_temp##offset##_auto_temp_min (struct device *dev, struct device_attribute *attr,    \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_temp_auto_temp_min(dev, buf, count, offset - 1);     \
 }                                                                      \
-static ssize_t show_temp##offset##_auto_temp_max (struct device *dev,  \
+static ssize_t show_temp##offset##_auto_temp_max (struct device *dev, struct device_attribute *attr,   \
        char *buf)                                                      \
 {                                                                      \
        return show_temp_auto_temp_max(dev, buf, offset - 1);           \
 }                                                                      \
-static ssize_t set_temp##offset##_auto_temp_max (struct device *dev,   \
+static ssize_t set_temp##offset##_auto_temp_max (struct device *dev, struct device_attribute *attr,    \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_temp_auto_temp_max(dev, buf, count, offset - 1);     \
 }                                                                      \
-static ssize_t show_temp##offset##_auto_temp_crit (struct device *dev, \
+static ssize_t show_temp##offset##_auto_temp_crit (struct device *dev, struct device_attribute *attr,  \
        char *buf)                                                      \
 {                                                                      \
        return show_temp_auto_temp_crit(dev, buf, offset - 1);          \
 }                                                                      \
-static ssize_t set_temp##offset##_auto_temp_crit (struct device *dev,  \
+static ssize_t set_temp##offset##_auto_temp_crit (struct device *dev, struct device_attribute *attr,   \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_temp_auto_temp_crit(dev, buf, count, offset - 1);    \
index 98cabd66506376321b98155f54ccd8ababa1e4ee..4372b61a08822f4c612f1d5bbf7bb949e2a54447 100644 (file)
@@ -218,19 +218,19 @@ static inline int lm87_write_value(struct i2c_client *client, u8 reg, u8 value)
 }
 
 #define show_in(offset) \
-static ssize_t show_in##offset##_input(struct device *dev, char *buf) \
+static ssize_t show_in##offset##_input(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm87_data *data = lm87_update_device(dev); \
        return sprintf(buf, "%u\n", IN_FROM_REG(data->in[offset], \
                       data->in_scale[offset])); \
 } \
-static ssize_t show_in##offset##_min(struct device *dev, char *buf) \
+static ssize_t show_in##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm87_data *data = lm87_update_device(dev); \
        return sprintf(buf, "%u\n", IN_FROM_REG(data->in_min[offset], \
                       data->in_scale[offset])); \
 } \
-static ssize_t show_in##offset##_max(struct device *dev, char *buf) \
+static ssize_t show_in##offset##_max(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm87_data *data = lm87_update_device(dev); \
        return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[offset], \
@@ -274,13 +274,13 @@ static void set_in_max(struct device *dev, const char *buf, int nr)
 }
 
 #define set_in(offset) \
-static ssize_t set_in##offset##_min(struct device *dev, \
+static ssize_t set_in##offset##_min(struct device *dev, struct device_attribute *attr, \
                const char *buf, size_t count) \
 { \
        set_in_min(dev, buf, offset); \
        return count; \
 } \
-static ssize_t set_in##offset##_max(struct device *dev, \
+static ssize_t set_in##offset##_max(struct device *dev, struct device_attribute *attr, \
                const char *buf, size_t count) \
 { \
        set_in_max(dev, buf, offset); \
@@ -300,17 +300,17 @@ set_in(6);
 set_in(7);
 
 #define show_temp(offset) \
-static ssize_t show_temp##offset##_input(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_input(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm87_data *data = lm87_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[offset-1])); \
 } \
-static ssize_t show_temp##offset##_low(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_low(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm87_data *data = lm87_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_low[offset-1])); \
 } \
-static ssize_t show_temp##offset##_high(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_high(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm87_data *data = lm87_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_high[offset-1])); \
@@ -346,13 +346,13 @@ static void set_temp_high(struct device *dev, const char *buf, int nr)
 }
 
 #define set_temp(offset) \
-static ssize_t set_temp##offset##_low(struct device *dev, \
+static ssize_t set_temp##offset##_low(struct device *dev, struct device_attribute *attr, \
                const char *buf, size_t count) \
 { \
        set_temp_low(dev, buf, offset-1); \
        return count; \
 } \
-static ssize_t set_temp##offset##_high(struct device *dev, \
+static ssize_t set_temp##offset##_high(struct device *dev, struct device_attribute *attr, \
                const char *buf, size_t count) \
 { \
        set_temp_high(dev, buf, offset-1); \
@@ -366,13 +366,13 @@ set_temp(1);
 set_temp(2);
 set_temp(3);
 
-static ssize_t show_temp_crit_int(struct device *dev, char *buf)
+static ssize_t show_temp_crit_int(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm87_data *data = lm87_update_device(dev);
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_crit_int));
 }
 
-static ssize_t show_temp_crit_ext(struct device *dev, char *buf)
+static ssize_t show_temp_crit_ext(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm87_data *data = lm87_update_device(dev);
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_crit_ext));
@@ -383,19 +383,19 @@ static DEVICE_ATTR(temp2_crit, S_IRUGO, show_temp_crit_ext, NULL);
 static DEVICE_ATTR(temp3_crit, S_IRUGO, show_temp_crit_ext, NULL);
 
 #define show_fan(offset) \
-static ssize_t show_fan##offset##_input(struct device *dev, char *buf) \
+static ssize_t show_fan##offset##_input(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm87_data *data = lm87_update_device(dev); \
        return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[offset-1], \
                       FAN_DIV_FROM_REG(data->fan_div[offset-1]))); \
 } \
-static ssize_t show_fan##offset##_min(struct device *dev, char *buf) \
+static ssize_t show_fan##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm87_data *data = lm87_update_device(dev); \
        return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[offset-1], \
                       FAN_DIV_FROM_REG(data->fan_div[offset-1]))); \
 } \
-static ssize_t show_fan##offset##_div(struct device *dev, char *buf) \
+static ssize_t show_fan##offset##_div(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm87_data *data = lm87_update_device(dev); \
        return sprintf(buf, "%d\n", FAN_DIV_FROM_REG(data->fan_div[offset-1])); \
@@ -465,13 +465,13 @@ static ssize_t set_fan_div(struct device *dev, const char *buf,
 }
 
 #define set_fan(offset) \
-static ssize_t set_fan##offset##_min(struct device *dev, const char *buf, \
+static ssize_t set_fan##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \
                size_t count) \
 { \
        set_fan_min(dev, buf, offset-1); \
        return count; \
 } \
-static ssize_t set_fan##offset##_div(struct device *dev, const char *buf, \
+static ssize_t set_fan##offset##_div(struct device *dev, struct device_attribute *attr, const char *buf, \
                size_t count) \
 { \
        return set_fan_div(dev, buf, count, offset-1); \
@@ -483,26 +483,26 @@ static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
 set_fan(1);
 set_fan(2);
 
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm87_data *data = lm87_update_device(dev);
        return sprintf(buf, "%d\n", data->alarms);
 }
 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
 
-static ssize_t show_vid(struct device *dev, char *buf)
+static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm87_data *data = lm87_update_device(dev);
        return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
 }
 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
 
-static ssize_t show_vrm(struct device *dev, char *buf)
+static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm87_data *data = lm87_update_device(dev);
        return sprintf(buf, "%d\n", data->vrm);
 }
-static ssize_t set_vrm(struct device *dev, const char *buf, size_t count)
+static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct lm87_data *data = i2c_get_clientdata(client);
@@ -511,12 +511,12 @@ static ssize_t set_vrm(struct device *dev, const char *buf, size_t count)
 }
 static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
 
-static ssize_t show_aout(struct device *dev, char *buf)
+static ssize_t show_aout(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm87_data *data = lm87_update_device(dev);
        return sprintf(buf, "%d\n", AOUT_FROM_REG(data->aout));
 }
-static ssize_t set_aout(struct device *dev, const char *buf, size_t count)
+static ssize_t set_aout(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct lm87_data *data = i2c_get_clientdata(client);
index 2c00ff83babcee0256d03c1488f16a5987b816d2..9b127a07f56bcf6dc0b981a605bfd19cc8b85f99 100644 (file)
@@ -218,7 +218,7 @@ struct lm90_data {
  */
 
 #define show_temp(value, converter) \
-static ssize_t show_##value(struct device *dev, char *buf) \
+static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm90_data *data = lm90_update_device(dev); \
        return sprintf(buf, "%d\n", converter(data->value)); \
@@ -233,7 +233,7 @@ show_temp(temp_crit1, TEMP1_FROM_REG);
 show_temp(temp_crit2, TEMP1_FROM_REG);
 
 #define set_temp1(value, reg) \
-static ssize_t set_##value(struct device *dev, const char *buf, \
+static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -250,7 +250,7 @@ static ssize_t set_##value(struct device *dev, const char *buf, \
        return count; \
 }
 #define set_temp2(value, regh, regl) \
-static ssize_t set_##value(struct device *dev, const char *buf, \
+static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -275,7 +275,7 @@ set_temp1(temp_crit1, LM90_REG_W_LOCAL_CRIT);
 set_temp1(temp_crit2, LM90_REG_W_REMOTE_CRIT);
 
 #define show_temp_hyst(value, basereg) \
-static ssize_t show_##value(struct device *dev, char *buf) \
+static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm90_data *data = lm90_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->basereg) \
@@ -284,7 +284,7 @@ static ssize_t show_##value(struct device *dev, char *buf) \
 show_temp_hyst(temp_hyst1, temp_crit1);
 show_temp_hyst(temp_hyst2, temp_crit2);
 
-static ssize_t set_temp_hyst1(struct device *dev, const char *buf,
+static ssize_t set_temp_hyst1(struct device *dev, struct device_attribute *attr, const char *buf,
        size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -300,7 +300,7 @@ static ssize_t set_temp_hyst1(struct device *dev, const char *buf,
        return count;
 }
 
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm90_data *data = lm90_update_device(dev);
        return sprintf(buf, "%d\n", data->alarms);
index fe6e83d70a72b22c5c55deaf0a2bc2b0aa7a8e0a..215c8e40ffdd4041e114aa7912f93e9292b61be3 100644 (file)
@@ -140,7 +140,7 @@ static struct lm92_data *lm92_update_device(struct device *dev)
 }
 
 #define show_temp(value) \
-static ssize_t show_##value(struct device *dev, char *buf) \
+static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct lm92_data *data = lm92_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \
@@ -151,7 +151,7 @@ show_temp(temp1_min);
 show_temp(temp1_max);
 
 #define set_temp(value, reg) \
-static ssize_t set_##value(struct device *dev, const char *buf, \
+static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -168,26 +168,26 @@ set_temp(temp1_crit, LM92_REG_TEMP_CRIT);
 set_temp(temp1_min, LM92_REG_TEMP_LOW);
 set_temp(temp1_max, LM92_REG_TEMP_HIGH);
 
-static ssize_t show_temp1_crit_hyst(struct device *dev, char *buf)
+static ssize_t show_temp1_crit_hyst(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm92_data *data = lm92_update_device(dev);
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp1_crit)
                       - TEMP_FROM_REG(data->temp1_hyst));
 }
-static ssize_t show_temp1_max_hyst(struct device *dev, char *buf)
+static ssize_t show_temp1_max_hyst(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm92_data *data = lm92_update_device(dev);
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp1_max)
                       - TEMP_FROM_REG(data->temp1_hyst));
 }
-static ssize_t show_temp1_min_hyst(struct device *dev, char *buf)
+static ssize_t show_temp1_min_hyst(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm92_data *data = lm92_update_device(dev);
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp1_min)
                       + TEMP_FROM_REG(data->temp1_hyst));
 }
 
-static ssize_t set_temp1_crit_hyst(struct device *dev, const char *buf,
+static ssize_t set_temp1_crit_hyst(struct device *dev, struct device_attribute *attr, const char *buf,
        size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -202,7 +202,7 @@ static ssize_t set_temp1_crit_hyst(struct device *dev, const char *buf,
        return count;
 }
 
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lm92_data *data = lm92_update_device(dev);
        return sprintf(buf, "%d\n", ALARMS_FROM_REG(data->temp1_input));
index 5afa961a5e106ad579102649a497b21e24688d48..30a196155fd983e53afe4e22f1b41d8f56d1b982 100644 (file)
@@ -122,7 +122,7 @@ struct max1619_data {
  */
 
 #define show_temp(value) \
-static ssize_t show_##value(struct device *dev, char *buf) \
+static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct max1619_data *data = max1619_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \
@@ -135,7 +135,7 @@ show_temp(temp_crit2);
 show_temp(temp_hyst2);
 
 #define set_temp2(value, reg) \
-static ssize_t set_##value(struct device *dev, const char *buf, \
+static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -154,7 +154,7 @@ set_temp2(temp_high2, MAX1619_REG_W_REMOTE_HIGH);
 set_temp2(temp_crit2, MAX1619_REG_W_REMOTE_CRIT);
 set_temp2(temp_hyst2, MAX1619_REG_W_TCRIT_HYST);
 
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct max1619_data *data = max1619_update_device(dev);
        return sprintf(buf, "%d\n", data->alarms);
index 6d94c36c9218c5fd4aa63ebc2f4d422b051e670f..65637b2cd170d4e334b385c6a55e8d1518fe6fb6 100644 (file)
@@ -282,31 +282,31 @@ static ssize_t set_fan_min(struct device *dev, const char *buf,
 }
 
 #define show_and_set_fan(offset) \
-static ssize_t show_fan##offset##_input(struct device *dev, char *buf) \
+static ssize_t show_fan##offset##_input(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", FAN_FROM_REG(data->fan[offset-1], \
                       FAN_DIV_FROM_REG(data->fan_status[offset-1]))); \
 } \
-static ssize_t show_fan##offset##_min(struct device *dev, char *buf) \
+static ssize_t show_fan##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", FAN_FROM_REG(data->fan_min[offset-1], \
                       FAN_DIV_FROM_REG(data->fan_status[offset-1]))); \
 } \
-static ssize_t show_fan##offset##_div(struct device *dev, char *buf) \
+static ssize_t show_fan##offset##_div(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", \
                       FAN_DIV_FROM_REG(data->fan_status[offset-1])); \
 } \
-static ssize_t show_fan##offset##_status(struct device *dev, char *buf) \
+static ssize_t show_fan##offset##_status(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", \
                       FAN_STATUS_FROM_REG(data->fan_status[offset-1])); \
 } \
-static ssize_t set_fan##offset##_min(struct device *dev, const char *buf, \
+static ssize_t set_fan##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        return set_fan_min(dev, buf, count, offset-1); \
@@ -324,7 +324,7 @@ show_and_set_fan(2)
 show_and_set_fan(3)
 
 #define show_and_set_pwm(offset) \
-static ssize_t show_pwm##offset(struct device *dev, char *buf) \
+static ssize_t show_pwm##offset(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", \
@@ -332,7 +332,7 @@ static ssize_t show_pwm##offset(struct device *dev, char *buf) \
                                    FAN_CONFIG_INVERT(data->fan_conf, \
                                                      offset-1))); \
 } \
-static ssize_t set_pwm##offset(struct device *dev, const char *buf, \
+static ssize_t set_pwm##offset(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -354,30 +354,30 @@ show_and_set_pwm(2)
 show_and_set_pwm(3)
 
 #define show_and_set_in(offset) \
-static ssize_t show_in##offset##_input(struct device *dev, char *buf) \
+static ssize_t show_in##offset##_input(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", IN_FROM_REG(data->in[offset], \
                       data->in_vref)); \
 } \
-static ssize_t show_in##offset##_min(struct device *dev, char *buf) \
+static ssize_t show_in##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", IN_FROM_REG(data->in_min[offset], \
                       data->in_vref)); \
 } \
-static ssize_t show_in##offset##_max(struct device *dev, char *buf) \
+static ssize_t show_in##offset##_max(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[offset], \
                       data->in_vref)); \
 } \
-static ssize_t show_in##offset##_status(struct device *dev, char *buf) \
+static ssize_t show_in##offset##_status(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", data->in_status[offset]); \
 } \
-static ssize_t set_in##offset##_min(struct device *dev, const char *buf, \
+static ssize_t set_in##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -391,7 +391,7 @@ static ssize_t set_in##offset##_min(struct device *dev, const char *buf, \
        up(&data->update_lock); \
        return count; \
 } \
-static ssize_t set_in##offset##_max(struct device *dev, const char *buf, \
+static ssize_t set_in##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -427,36 +427,36 @@ show_and_set_in(9)
 show_and_set_in(10)
 
 #define show_and_set_therm(offset) \
-static ssize_t show_temp##offset##_input(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_input(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", IN_FROM_REG(data->in[offset+7], \
                       data->in_vref)); \
 } \
-static ssize_t show_temp##offset##_min(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", IN_FROM_REG(data->in_min[offset+7], \
                       data->in_vref)); \
 } \
-static ssize_t show_temp##offset##_max(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_max(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[offset+7], \
                       data->in_vref)); \
 } \
-static ssize_t show_temp##offset##_crit(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_crit(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", IN_FROM_REG(data->in_crit[offset-4], \
                       data->in_vref)); \
 } \
-static ssize_t show_temp##offset##_status(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_status(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%u\n", data->in_status[offset+7]); \
 } \
-static ssize_t set_temp##offset##_min(struct device *dev, const char *buf, \
+static ssize_t set_temp##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -470,7 +470,7 @@ static ssize_t set_temp##offset##_min(struct device *dev, const char *buf, \
        up(&data->update_lock); \
        return count; \
 } \
-static ssize_t set_temp##offset##_max(struct device *dev, const char *buf, \
+static ssize_t set_temp##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -484,7 +484,7 @@ static ssize_t set_temp##offset##_max(struct device *dev, const char *buf, \
        up(&data->update_lock); \
        return count; \
 } \
-static ssize_t set_temp##offset##_crit(struct device *dev, const char *buf, \
+static ssize_t set_temp##offset##_crit(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -512,19 +512,19 @@ show_and_set_therm(4)
 show_and_set_therm(5)
 show_and_set_therm(6)
 
-static ssize_t show_vid(struct device *dev, char *buf)
+static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pc87360_data *data = pc87360_update_device(dev);
        return sprintf(buf, "%u\n", vid_from_reg(data->vid, data->vrm));
 }
 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
 
-static ssize_t show_vrm(struct device *dev, char *buf)
+static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pc87360_data *data = pc87360_update_device(dev);
        return sprintf(buf, "%u\n", data->vrm);
 }
-static ssize_t set_vrm(struct device *dev, const char *buf, size_t count)
+static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct pc87360_data *data = i2c_get_clientdata(client);
@@ -533,7 +533,7 @@ static ssize_t set_vrm(struct device *dev, const char *buf, size_t count)
 }
 static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
 
-static ssize_t show_in_alarms(struct device *dev, char *buf)
+static ssize_t show_in_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pc87360_data *data = pc87360_update_device(dev);
        return sprintf(buf, "%u\n", data->in_alarms);
@@ -541,32 +541,32 @@ static ssize_t show_in_alarms(struct device *dev, char *buf)
 static DEVICE_ATTR(alarms_in, S_IRUGO, show_in_alarms, NULL);
 
 #define show_and_set_temp(offset) \
-static ssize_t show_temp##offset##_input(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_input(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[offset-1])); \
 } \
-static ssize_t show_temp##offset##_min(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_min[offset-1])); \
 } \
-static ssize_t show_temp##offset##_max(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_max(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[offset-1])); \
 }\
-static ssize_t show_temp##offset##_crit(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_crit(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_crit[offset-1])); \
 }\
-static ssize_t show_temp##offset##_status(struct device *dev, char *buf) \
+static ssize_t show_temp##offset##_status(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct pc87360_data *data = pc87360_update_device(dev); \
        return sprintf(buf, "%d\n", data->temp_status[offset-1]); \
 }\
-static ssize_t set_temp##offset##_min(struct device *dev, const char *buf, \
+static ssize_t set_temp##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -580,7 +580,7 @@ static ssize_t set_temp##offset##_min(struct device *dev, const char *buf, \
        up(&data->update_lock); \
        return count; \
 } \
-static ssize_t set_temp##offset##_max(struct device *dev, const char *buf, \
+static ssize_t set_temp##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -594,7 +594,7 @@ static ssize_t set_temp##offset##_max(struct device *dev, const char *buf, \
        up(&data->update_lock); \
        return count; \
 } \
-static ssize_t set_temp##offset##_crit(struct device *dev, const char *buf, \
+static ssize_t set_temp##offset##_crit(struct device *dev, struct device_attribute *attr, const char *buf, \
        size_t count) \
 { \
        struct i2c_client *client = to_i2c_client(dev); \
@@ -622,7 +622,7 @@ show_and_set_temp(1)
 show_and_set_temp(2)
 show_and_set_temp(3)
 
-static ssize_t show_temp_alarms(struct device *dev, char *buf)
+static ssize_t show_temp_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pc87360_data *data = pc87360_update_device(dev);
        return sprintf(buf, "%u\n", data->temp_alarms);
index 48b4e22eaffe272e41d8d9311f4cfc129cc39529..4956e9effd75ca93551da5cc388e7548f93b53f3 100644 (file)
@@ -76,7 +76,7 @@ static struct i2c_driver pcf8574_driver = {
 };
 
 /* following are the sysfs callback functions */
-static ssize_t show_read(struct device *dev, char *buf)
+static ssize_t show_read(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct pcf8574_data *data = i2c_get_clientdata(client);
@@ -86,13 +86,13 @@ static ssize_t show_read(struct device *dev, char *buf)
 
 static DEVICE_ATTR(read, S_IRUGO, show_read, NULL);
 
-static ssize_t show_write(struct device *dev, char *buf)
+static ssize_t show_write(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pcf8574_data *data = i2c_get_clientdata(to_i2c_client(dev));
        return sprintf(buf, "%u\n", data->write);
 }
 
-static ssize_t set_write(struct device *dev, const char *buf,
+static ssize_t set_write(struct device *dev, struct device_attribute *attr, const char *buf,
                         size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
index b6b927d8b372627a9bfdae20c8d0c2ebaa65bf8a..db812ade85645bb2288190eec7a2f0359a532d92 100644 (file)
@@ -100,7 +100,7 @@ static struct i2c_driver pcf8591_driver = {
 
 /* following are the sysfs callback functions */
 #define show_in_channel(channel)                                       \
-static ssize_t show_in##channel##_input(struct device *dev, char *buf) \
+static ssize_t show_in##channel##_input(struct device *dev, struct device_attribute *attr, char *buf)  \
 {                                                                      \
        return sprintf(buf, "%d\n", pcf8591_read_channel(dev, channel));\
 }                                                                      \
@@ -112,13 +112,13 @@ show_in_channel(1);
 show_in_channel(2);
 show_in_channel(3);
 
-static ssize_t show_out0_ouput(struct device *dev, char *buf)
+static ssize_t show_out0_ouput(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pcf8591_data *data = i2c_get_clientdata(to_i2c_client(dev));
        return sprintf(buf, "%d\n", data->aout * 10);
 }
 
-static ssize_t set_out0_output(struct device *dev, const char *buf, size_t count)
+static ssize_t set_out0_output(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        unsigned int value;
        struct i2c_client *client = to_i2c_client(dev);
@@ -134,13 +134,13 @@ static ssize_t set_out0_output(struct device *dev, const char *buf, size_t count
 static DEVICE_ATTR(out0_output, S_IWUSR | S_IRUGO, 
                   show_out0_ouput, set_out0_output);
 
-static ssize_t show_out0_enable(struct device *dev, char *buf)
+static ssize_t show_out0_enable(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pcf8591_data *data = i2c_get_clientdata(to_i2c_client(dev));
        return sprintf(buf, "%u\n", !(!(data->control & PCF8591_CONTROL_AOEF)));
 }
 
-static ssize_t set_out0_enable(struct device *dev, const char *buf, size_t count)
+static ssize_t set_out0_enable(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct pcf8591_data *data = i2c_get_clientdata(client);
index 7ea84532df322b66be182a69c2ebfbca46380662..c6650727a27de66a0a3ae9a11e9036ba82d07e3f 100644 (file)
@@ -256,28 +256,28 @@ static ssize_t set_in_max(struct device *dev, const char *buf,
 
 #define show_in_offset(offset)                                 \
 static ssize_t                                                 \
-       show_in##offset (struct device *dev, char *buf)         \
+       show_in##offset (struct device *dev, struct device_attribute *attr, char *buf)          \
 {                                                              \
        return show_in(dev, buf, offset);                       \
 }                                                              \
 static DEVICE_ATTR(in##offset##_input, S_IRUGO,                \
                show_in##offset, NULL);                         \
 static ssize_t                                                 \
-       show_in##offset##_min (struct device *dev, char *buf)   \
+       show_in##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)    \
 {                                                              \
        return show_in_min(dev, buf, offset);                   \
 }                                                              \
 static ssize_t                                                 \
-       show_in##offset##_max (struct device *dev, char *buf)   \
+       show_in##offset##_max (struct device *dev, struct device_attribute *attr, char *buf)    \
 {                                                              \
        return show_in_max(dev, buf, offset);                   \
 }                                                              \
-static ssize_t set_in##offset##_min (struct device *dev,       \
+static ssize_t set_in##offset##_min (struct device *dev, struct device_attribute *attr,        \
                const char *buf, size_t count)                  \
 {                                                              \
        return set_in_min(dev, buf, count, offset);             \
 }                                                              \
-static ssize_t set_in##offset##_max (struct device *dev,       \
+static ssize_t set_in##offset##_max (struct device *dev, struct device_attribute *attr,        \
                const char *buf, size_t count)                  \
 {                                                              \
        return set_in_max(dev, buf, count, offset);             \
@@ -294,19 +294,19 @@ show_in_offset(3);
 show_in_offset(4);
 
 /* Temperature */
-static ssize_t show_temp(struct device *dev, char *buf)
+static ssize_t show_temp(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct sis5595_data *data = sis5595_update_device(dev);
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
 }
 
-static ssize_t show_temp_over(struct device *dev, char *buf)
+static ssize_t show_temp_over(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct sis5595_data *data = sis5595_update_device(dev);
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
 }
 
-static ssize_t set_temp_over(struct device *dev, const char *buf, size_t count)
+static ssize_t set_temp_over(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct sis5595_data *data = i2c_get_clientdata(client);
@@ -319,13 +319,13 @@ static ssize_t set_temp_over(struct device *dev, const char *buf, size_t count)
        return count;
 }
 
-static ssize_t show_temp_hyst(struct device *dev, char *buf)
+static ssize_t show_temp_hyst(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct sis5595_data *data = sis5595_update_device(dev);
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
 }
 
-static ssize_t set_temp_hyst(struct device *dev, const char *buf, size_t count)
+static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct sis5595_data *data = i2c_get_clientdata(client);
@@ -426,19 +426,19 @@ static ssize_t set_fan_div(struct device *dev, const char *buf,
 }
 
 #define show_fan_offset(offset)                                                \
-static ssize_t show_fan_##offset (struct device *dev, char *buf)       \
+static ssize_t show_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf)        \
 {                                                                      \
        return show_fan(dev, buf, offset - 1);                  \
 }                                                                      \
-static ssize_t show_fan_##offset##_min (struct device *dev, char *buf) \
+static ssize_t show_fan_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)  \
 {                                                                      \
        return show_fan_min(dev, buf, offset - 1);                      \
 }                                                                      \
-static ssize_t show_fan_##offset##_div (struct device *dev, char *buf) \
+static ssize_t show_fan_##offset##_div (struct device *dev, struct device_attribute *attr, char *buf)  \
 {                                                                      \
        return show_fan_div(dev, buf, offset - 1);                      \
 }                                                                      \
-static ssize_t set_fan_##offset##_min (struct device *dev,             \
+static ssize_t set_fan_##offset##_min (struct device *dev, struct device_attribute *attr,              \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_fan_min(dev, buf, count, offset - 1);                \
@@ -450,13 +450,13 @@ static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR,          \
 show_fan_offset(1);
 show_fan_offset(2);
 
-static ssize_t set_fan_1_div(struct device *dev, const char *buf,
+static ssize_t set_fan_1_div(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        return set_fan_div(dev, buf, count, 0) ;
 }
 
-static ssize_t set_fan_2_div(struct device *dev, const char *buf,
+static ssize_t set_fan_2_div(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        return set_fan_div(dev, buf, count, 1) ;
@@ -467,7 +467,7 @@ static DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
                show_fan_2_div, set_fan_2_div);
 
 /* Alarms */
-static ssize_t show_alarms(struct device *dev, char *buf)
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct sis5595_data *data = sis5595_update_device(dev);
        return sprintf(buf, "%d\n", data->alarms);
index 1119c76791d9e48db843d4191ce6bcd38a5c1849..251ac2659554d8fd77351cf54ef2ad955a7237be 100644 (file)
@@ -172,7 +172,7 @@ static ssize_t show_temp(struct device *dev, char *buf, int nr)
 }
 
 #define sysfs_temp(num) \
-static ssize_t show_temp##num(struct device *dev, char *buf) \
+static ssize_t show_temp##num(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_temp(dev, buf, num-1); \
 } \
@@ -201,7 +201,7 @@ static ssize_t show_fan(struct device *dev, char *buf, int nr)
 }
 
 #define sysfs_fan(num) \
-static ssize_t show_fan##num(struct device *dev, char *buf) \
+static ssize_t show_fan##num(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_fan(dev, buf, num-1); \
 } \
index 0e12ca3694131fa875ae168ea29f0ced72d381f7..13d6d4a8bc7d0e906d09a2a20468dce111d1e457 100644 (file)
@@ -184,7 +184,7 @@ static ssize_t get_pwm_en(struct device *dev, char *buf, int nr)
        return sprintf(buf, "%d\n", PWM_EN_FROM_REG(data->pwm[nr]));
 }
 
-static ssize_t get_alarms(struct device *dev, char *buf)
+static ssize_t get_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
        return sprintf(buf, "%d\n", data->alarms);
@@ -298,42 +298,42 @@ static ssize_t set_pwm_en(struct device *dev, const char *buf,
 }
 
 #define fan_present(offset)                                            \
-static ssize_t get_fan##offset (struct device *dev, char *buf)         \
+static ssize_t get_fan##offset (struct device *dev, struct device_attribute *attr, char *buf)          \
 {                                                                      \
        return get_fan(dev, buf, offset - 1);                           \
 }                                                                      \
-static ssize_t get_fan##offset##_min (struct device *dev, char *buf)   \
+static ssize_t get_fan##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)    \
 {                                                                      \
        return get_fan_min(dev, buf, offset - 1);                       \
 }                                                                      \
-static ssize_t set_fan##offset##_min (struct device *dev,              \
+static ssize_t set_fan##offset##_min (struct device *dev, struct device_attribute *attr,               \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_fan_min(dev, buf, count, offset - 1);                \
 }                                                                      \
-static ssize_t get_fan##offset##_div (struct device *dev, char *buf)   \
+static ssize_t get_fan##offset##_div (struct device *dev, struct device_attribute *attr, char *buf)    \
 {                                                                      \
        return get_fan_div(dev, buf, offset - 1);                       \
 }                                                                      \
-static ssize_t set_fan##offset##_div (struct device *dev,              \
+static ssize_t set_fan##offset##_div (struct device *dev, struct device_attribute *attr,               \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_fan_div(dev, buf, count, offset - 1);                \
 }                                                                      \
-static ssize_t get_pwm##offset (struct device *dev, char *buf)         \
+static ssize_t get_pwm##offset (struct device *dev, struct device_attribute *attr, char *buf)          \
 {                                                                      \
        return get_pwm(dev, buf, offset - 1);                           \
 }                                                                      \
-static ssize_t set_pwm##offset (struct device *dev,                    \
+static ssize_t set_pwm##offset (struct device *dev, struct device_attribute *attr,                     \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_pwm(dev, buf, count, offset - 1);                    \
 }                                                                      \
-static ssize_t get_pwm##offset##_en (struct device *dev, char *buf)    \
+static ssize_t get_pwm##offset##_en (struct device *dev, struct device_attribute *attr, char *buf)     \
 {                                                                      \
        return get_pwm_en(dev, buf, offset - 1);                        \
 }                                                                      \
-static ssize_t set_pwm##offset##_en (struct device *dev,               \
+static ssize_t set_pwm##offset##_en (struct device *dev, struct device_attribute *attr,                \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_pwm_en(dev, buf, count, offset - 1);                 \
index 6614a59cecd4a85e527ff5c172cf76cdcc0178d0..fefc24a9251ade9926f93bdc3f6e8c25584a6229 100644 (file)
@@ -386,26 +386,26 @@ static ssize_t set_in_max(struct device *dev, const char *buf,
 }
 #define show_in_offset(offset)                                 \
 static ssize_t                                                         \
-       show_in##offset (struct device *dev, char *buf)         \
+       show_in##offset (struct device *dev, struct device_attribute *attr, char *buf)          \
 {                                                              \
        return show_in(dev, buf, offset);                       \
 }                                                              \
 static ssize_t                                                         \
-       show_in##offset##_min (struct device *dev, char *buf)   \
+       show_in##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)    \
 {                                                              \
        return show_in_min(dev, buf, offset);           \
 }                                                              \
 static ssize_t                                                         \
-       show_in##offset##_max (struct device *dev, char *buf)   \
+       show_in##offset##_max (struct device *dev, struct device_attribute *attr, char *buf)    \
 {                                                              \
        return show_in_max(dev, buf, offset);           \
 }                                                              \
-static ssize_t set_in##offset##_min (struct device *dev,       \
+static ssize_t set_in##offset##_min (struct device *dev, struct device_attribute *attr,        \
                const char *buf, size_t count)                  \
 {                                                              \
        return set_in_min(dev, buf, count, offset);             \
 }                                                              \
-static ssize_t set_in##offset##_max (struct device *dev,       \
+static ssize_t set_in##offset##_max (struct device *dev, struct device_attribute *attr,        \
                        const char *buf, size_t count)          \
 {                                                              \
        return set_in_max(dev, buf, count, offset);             \
@@ -460,26 +460,26 @@ static ssize_t set_temp_hyst(struct device *dev, const char *buf,
        return count;
 }
 #define show_temp_offset(offset)                                       \
-static ssize_t show_temp_##offset (struct device *dev, char *buf)      \
+static ssize_t show_temp_##offset (struct device *dev, struct device_attribute *attr, char *buf)       \
 {                                                                      \
        return show_temp(dev, buf, offset - 1);                         \
 }                                                                      \
 static ssize_t                                                         \
-show_temp_##offset##_over (struct device *dev, char *buf)              \
+show_temp_##offset##_over (struct device *dev, struct device_attribute *attr, char *buf)               \
 {                                                                      \
        return show_temp_over(dev, buf, offset - 1);                    \
 }                                                                      \
 static ssize_t                                                         \
-show_temp_##offset##_hyst (struct device *dev, char *buf)              \
+show_temp_##offset##_hyst (struct device *dev, struct device_attribute *attr, char *buf)               \
 {                                                                      \
        return show_temp_hyst(dev, buf, offset - 1);                    \
 }                                                                      \
-static ssize_t set_temp_##offset##_over (struct device *dev,           \
+static ssize_t set_temp_##offset##_over (struct device *dev, struct device_attribute *attr,            \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_temp_over(dev, buf, count, offset - 1);              \
 }                                                                      \
-static ssize_t set_temp_##offset##_hyst (struct device *dev,           \
+static ssize_t set_temp_##offset##_hyst (struct device *dev, struct device_attribute *attr,            \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_temp_hyst(dev, buf, count, offset - 1);              \
@@ -538,24 +538,24 @@ static ssize_t set_fan_div(struct device *dev, const char *buf,
 }
 
 #define show_fan_offset(offset)                                                \
-static ssize_t show_fan_##offset (struct device *dev, char *buf)       \
+static ssize_t show_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf)        \
 {                                                                      \
        return show_fan(dev, buf, offset - 1);                          \
 }                                                                      \
-static ssize_t show_fan_##offset##_min (struct device *dev, char *buf) \
+static ssize_t show_fan_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)  \
 {                                                                      \
        return show_fan_min(dev, buf, offset - 1);                      \
 }                                                                      \
-static ssize_t show_fan_##offset##_div (struct device *dev, char *buf) \
+static ssize_t show_fan_##offset##_div (struct device *dev, struct device_attribute *attr, char *buf)  \
 {                                                                      \
        return show_fan_div(dev, buf, offset - 1);                      \
 }                                                                      \
-static ssize_t set_fan_##offset##_min (struct device *dev,             \
+static ssize_t set_fan_##offset##_min (struct device *dev, struct device_attribute *attr,              \
        const char *buf, size_t count)                                  \
 {                                                                      \
        return set_fan_min(dev, buf, count, offset - 1);                \
 }                                                                      \
-static ssize_t set_fan_##offset##_div (struct device *dev,             \
+static ssize_t set_fan_##offset##_div (struct device *dev, struct device_attribute *attr,              \
                const char *buf, size_t count)                          \
 {                                                                      \
        return set_fan_div(dev, buf, count, offset - 1);                \
@@ -570,7 +570,7 @@ show_fan_offset(1);
 show_fan_offset(2);
 
 /* Alarms */
-static ssize_t show_alarms(struct device *dev, char *buf) {
+static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf) {
        struct via686a_data *data = via686a_update_device(dev);
        return sprintf(buf,"%d\n", ALARMS_FROM_REG(data->alarms));
 }
index b1da5ed696d3de73f3ee2f3528015f1fc0a4bc87..4f1bff572c1c22345e5ad974be40f98817e2636b 100644 (file)
@@ -368,19 +368,19 @@ store_in_reg(MAX, max)
 
 #define sysfs_in_offset(offset) \
 static ssize_t \
-show_regs_in_##offset (struct device *dev, char *buf) \
+show_regs_in_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
         return show_in(dev, buf, offset); \
 } \
 static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_regs_in_##offset, NULL);
 
 #define sysfs_in_reg_offset(reg, offset) \
-static ssize_t show_regs_in_##reg##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_in_##reg##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_in_##reg (dev, buf, offset); \
 } \
 static ssize_t \
-store_regs_in_##reg##offset (struct device *dev, \
+store_regs_in_##reg##offset (struct device *dev, struct device_attribute *attr, \
                            const char *buf, size_t count) \
 { \
        return store_in_##reg (dev, buf, count, offset); \
@@ -419,25 +419,25 @@ static ssize_t show_in_0(struct w83627hf_data *data, char *buf, u8 reg)
        return sprintf(buf,"%ld\n", in0);
 }
 
-static ssize_t show_regs_in_0(struct device *dev, char *buf)
+static ssize_t show_regs_in_0(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w83627hf_data *data = w83627hf_update_device(dev);
        return show_in_0(data, buf, data->in[0]);
 }
 
-static ssize_t show_regs_in_min0(struct device *dev, char *buf)
+static ssize_t show_regs_in_min0(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w83627hf_data *data = w83627hf_update_device(dev);
        return show_in_0(data, buf, data->in_min[0]);
 }
 
-static ssize_t show_regs_in_max0(struct device *dev, char *buf)
+static ssize_t show_regs_in_max0(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w83627hf_data *data = w83627hf_update_device(dev);
        return show_in_0(data, buf, data->in_max[0]);
 }
 
-static ssize_t store_regs_in_min0(struct device *dev,
+static ssize_t store_regs_in_min0(struct device *dev, struct device_attribute *attr,
        const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -462,7 +462,7 @@ static ssize_t store_regs_in_min0(struct device *dev,
        return count;
 }
 
-static ssize_t store_regs_in_max0(struct device *dev,
+static ssize_t store_regs_in_max0(struct device *dev, struct device_attribute *attr,
        const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -531,19 +531,19 @@ store_fan_min(struct device *dev, const char *buf, size_t count, int nr)
 }
 
 #define sysfs_fan_offset(offset) \
-static ssize_t show_regs_fan_##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_fan(dev, buf, offset); \
 } \
 static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_regs_fan_##offset, NULL);
 
 #define sysfs_fan_min_offset(offset) \
-static ssize_t show_regs_fan_min##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_fan_min##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_fan_min(dev, buf, offset); \
 } \
 static ssize_t \
-store_regs_fan_min##offset (struct device *dev, const char *buf, size_t count) \
+store_regs_fan_min##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
 { \
        return store_fan_min(dev, buf, count, offset); \
 } \
@@ -608,19 +608,19 @@ store_temp_reg(HYST, max_hyst);
 
 #define sysfs_temp_offset(offset) \
 static ssize_t \
-show_regs_temp_##offset (struct device *dev, char *buf) \
+show_regs_temp_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_temp(dev, buf, offset); \
 } \
 static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_regs_temp_##offset, NULL);
 
 #define sysfs_temp_reg_offset(reg, offset) \
-static ssize_t show_regs_temp_##reg##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_temp_##reg##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_temp_##reg (dev, buf, offset); \
 } \
 static ssize_t \
-store_regs_temp_##reg##offset (struct device *dev, \
+store_regs_temp_##reg##offset (struct device *dev, struct device_attribute *attr, \
                              const char *buf, size_t count) \
 { \
        return store_temp_##reg (dev, buf, count, offset); \
@@ -645,7 +645,7 @@ device_create_file(&client->dev, &dev_attr_temp##offset##_max_hyst); \
 } while (0)
 
 static ssize_t
-show_vid_reg(struct device *dev, char *buf)
+show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w83627hf_data *data = w83627hf_update_device(dev);
        return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
@@ -655,13 +655,13 @@ static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
 device_create_file(&client->dev, &dev_attr_cpu0_vid)
 
 static ssize_t
-show_vrm_reg(struct device *dev, char *buf)
+show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w83627hf_data *data = w83627hf_update_device(dev);
        return sprintf(buf, "%ld\n", (long) data->vrm);
 }
 static ssize_t
-store_vrm_reg(struct device *dev, const char *buf, size_t count)
+store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct w83627hf_data *data = i2c_get_clientdata(client);
@@ -677,7 +677,7 @@ static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
 device_create_file(&client->dev, &dev_attr_vrm)
 
 static ssize_t
-show_alarms_reg(struct device *dev, char *buf)
+show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w83627hf_data *data = w83627hf_update_device(dev);
        return sprintf(buf, "%ld\n", (long) data->alarms);
@@ -687,7 +687,7 @@ static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
 device_create_file(&client->dev, &dev_attr_alarms)
 
 #define show_beep_reg(REG, reg) \
-static ssize_t show_beep_##reg (struct device *dev, char *buf) \
+static ssize_t show_beep_##reg (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        struct w83627hf_data *data = w83627hf_update_device(dev); \
        return sprintf(buf,"%ld\n", \
@@ -732,12 +732,12 @@ store_beep_reg(struct device *dev, const char *buf, size_t count,
 }
 
 #define sysfs_beep(REG, reg) \
-static ssize_t show_regs_beep_##reg (struct device *dev, char *buf) \
+static ssize_t show_regs_beep_##reg (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
-       return show_beep_##reg(dev, buf); \
+       return show_beep_##reg(dev, attr, buf); \
 } \
 static ssize_t \
-store_regs_beep_##reg (struct device *dev, const char *buf, size_t count) \
+store_regs_beep_##reg (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
 { \
        return store_beep_reg(dev, buf, count, BEEP_##REG); \
 } \
@@ -801,12 +801,12 @@ store_fan_div_reg(struct device *dev, const char *buf, size_t count, int nr)
 }
 
 #define sysfs_fan_div(offset) \
-static ssize_t show_regs_fan_div_##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_fan_div_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_fan_div_reg(dev, buf, offset); \
 } \
 static ssize_t \
-store_regs_fan_div_##offset (struct device *dev, \
+store_regs_fan_div_##offset (struct device *dev, struct device_attribute *attr, \
                            const char *buf, size_t count) \
 { \
        return store_fan_div_reg(dev, buf, count, offset - 1); \
@@ -861,12 +861,12 @@ store_pwm_reg(struct device *dev, const char *buf, size_t count, int nr)
 }
 
 #define sysfs_pwm(offset) \
-static ssize_t show_regs_pwm_##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_pwm_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_pwm_reg(dev, buf, offset); \
 } \
 static ssize_t \
-store_regs_pwm_##offset (struct device *dev, const char *buf, size_t count) \
+store_regs_pwm_##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
 { \
        return store_pwm_reg(dev, buf, count, offset); \
 } \
@@ -937,12 +937,12 @@ store_sensor_reg(struct device *dev, const char *buf, size_t count, int nr)
 }
 
 #define sysfs_sensor(offset) \
-static ssize_t show_regs_sensor_##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_sensor_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
     return show_sensor_reg(dev, buf, offset); \
 } \
 static ssize_t \
-store_regs_sensor_##offset (struct device *dev, const char *buf, size_t count) \
+store_regs_sensor_##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
 { \
     return store_sensor_reg(dev, buf, count, offset); \
 } \
index 4954e465c4199cbe951c3d051dd3354f2addea13..c3926d2d8ac6819787b726f8696124d6a9755943 100644 (file)
@@ -309,18 +309,18 @@ store_in_reg(MAX, max);
 
 #define sysfs_in_offset(offset) \
 static ssize_t \
-show_regs_in_##offset (struct device *dev, char *buf) \
+show_regs_in_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
         return show_in(dev, buf, offset); \
 } \
 static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_regs_in_##offset, NULL);
 
 #define sysfs_in_reg_offset(reg, offset) \
-static ssize_t show_regs_in_##reg##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_in_##reg##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_in_##reg (dev, buf, offset); \
 } \
-static ssize_t store_regs_in_##reg##offset (struct device *dev, const char *buf, size_t count) \
+static ssize_t store_regs_in_##reg##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
 { \
        return store_in_##reg (dev, buf, count, offset); \
 } \
@@ -378,18 +378,18 @@ store_fan_min(struct device *dev, const char *buf, size_t count, int nr)
 }
 
 #define sysfs_fan_offset(offset) \
-static ssize_t show_regs_fan_##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_fan(dev, buf, offset); \
 } \
 static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_regs_fan_##offset, NULL);
 
 #define sysfs_fan_min_offset(offset) \
-static ssize_t show_regs_fan_min##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_fan_min##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_fan_min(dev, buf, offset); \
 } \
-static ssize_t store_regs_fan_min##offset (struct device *dev, const char *buf, size_t count) \
+static ssize_t store_regs_fan_min##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
 { \
        return store_fan_min(dev, buf, count, offset); \
 } \
@@ -452,18 +452,18 @@ store_temp_reg(HYST, max_hyst);
 
 #define sysfs_temp_offset(offset) \
 static ssize_t \
-show_regs_temp_##offset (struct device *dev, char *buf) \
+show_regs_temp_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_temp(dev, buf, offset); \
 } \
 static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_regs_temp_##offset, NULL);
 
 #define sysfs_temp_reg_offset(reg, offset) \
-static ssize_t show_regs_temp_##reg##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_temp_##reg##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_temp_##reg (dev, buf, offset); \
 } \
-static ssize_t store_regs_temp_##reg##offset (struct device *dev, const char *buf, size_t count) \
+static ssize_t store_regs_temp_##reg##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
 { \
        return store_temp_##reg (dev, buf, count, offset); \
 } \
@@ -486,7 +486,7 @@ device_create_file(&client->dev, &dev_attr_temp##offset##_max_hyst); \
 } while (0)
 
 static ssize_t
-show_vid_reg(struct device *dev, char *buf)
+show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w83781d_data *data = w83781d_update_device(dev);
        return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
@@ -497,14 +497,14 @@ DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
 #define device_create_file_vid(client) \
 device_create_file(&client->dev, &dev_attr_cpu0_vid);
 static ssize_t
-show_vrm_reg(struct device *dev, char *buf)
+show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w83781d_data *data = w83781d_update_device(dev);
        return sprintf(buf, "%ld\n", (long) data->vrm);
 }
 
 static ssize_t
-store_vrm_reg(struct device *dev, const char *buf, size_t count)
+store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct w83781d_data *data = i2c_get_clientdata(client);
@@ -521,7 +521,7 @@ DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
 #define device_create_file_vrm(client) \
 device_create_file(&client->dev, &dev_attr_vrm);
 static ssize_t
-show_alarms_reg(struct device *dev, char *buf)
+show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w83781d_data *data = w83781d_update_device(dev);
        return sprintf(buf, "%ld\n", (long) ALARMS_FROM_REG(data->alarms));
@@ -531,13 +531,13 @@ static
 DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
 #define device_create_file_alarms(client) \
 device_create_file(&client->dev, &dev_attr_alarms);
-static ssize_t show_beep_mask (struct device *dev, char *buf)
+static ssize_t show_beep_mask (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w83781d_data *data = w83781d_update_device(dev);
        return sprintf(buf, "%ld\n",
                       (long)BEEP_MASK_FROM_REG(data->beep_mask, data->type));
 }
-static ssize_t show_beep_enable (struct device *dev, char *buf)
+static ssize_t show_beep_enable (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w83781d_data *data = w83781d_update_device(dev);
        return sprintf(buf, "%ld\n",
@@ -583,11 +583,11 @@ store_beep_reg(struct device *dev, const char *buf, size_t count,
 }
 
 #define sysfs_beep(REG, reg) \
-static ssize_t show_regs_beep_##reg (struct device *dev, char *buf) \
+static ssize_t show_regs_beep_##reg (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
-       return show_beep_##reg(dev, buf); \
+       return show_beep_##reg(dev, attr, buf); \
 } \
-static ssize_t store_regs_beep_##reg (struct device *dev, const char *buf, size_t count) \
+static ssize_t store_regs_beep_##reg (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
 { \
        return store_beep_reg(dev, buf, count, BEEP_##REG); \
 } \
@@ -653,11 +653,11 @@ store_fan_div_reg(struct device *dev, const char *buf, size_t count, int nr)
 }
 
 #define sysfs_fan_div(offset) \
-static ssize_t show_regs_fan_div_##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_fan_div_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_fan_div_reg(dev, buf, offset); \
 } \
-static ssize_t store_regs_fan_div_##offset (struct device *dev, const char *buf, size_t count) \
+static ssize_t store_regs_fan_div_##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
 { \
        return store_fan_div_reg(dev, buf, count, offset - 1); \
 } \
@@ -737,11 +737,11 @@ store_pwmenable_reg(struct device *dev, const char *buf, size_t count, int nr)
 }
 
 #define sysfs_pwm(offset) \
-static ssize_t show_regs_pwm_##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_pwm_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_pwm_reg(dev, buf, offset); \
 } \
-static ssize_t store_regs_pwm_##offset (struct device *dev, \
+static ssize_t store_regs_pwm_##offset (struct device *dev, struct device_attribute *attr, \
                const char *buf, size_t count) \
 { \
        return store_pwm_reg(dev, buf, count, offset); \
@@ -750,11 +750,11 @@ static DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \
                show_regs_pwm_##offset, store_regs_pwm_##offset);
 
 #define sysfs_pwmenable(offset) \
-static ssize_t show_regs_pwmenable_##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_pwmenable_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
        return show_pwmenable_reg(dev, buf, offset); \
 } \
-static ssize_t store_regs_pwmenable_##offset (struct device *dev, \
+static ssize_t store_regs_pwmenable_##offset (struct device *dev, struct device_attribute *attr, \
                const char *buf, size_t count) \
 { \
        return store_pwmenable_reg(dev, buf, count, offset); \
@@ -832,11 +832,11 @@ store_sensor_reg(struct device *dev, const char *buf, size_t count, int nr)
 }
 
 #define sysfs_sensor(offset) \
-static ssize_t show_regs_sensor_##offset (struct device *dev, char *buf) \
+static ssize_t show_regs_sensor_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
 { \
     return show_sensor_reg(dev, buf, offset); \
 } \
-static ssize_t store_regs_sensor_##offset (struct device *dev, const char *buf, size_t count) \
+static ssize_t store_regs_sensor_##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
 { \
     return store_sensor_reg(dev, buf, count, offset); \
 } \
index 59bbc5881fa6079c07310b7dafc261d75653dbdb..74d4b58e42372dbd438de41bb5a1ab64875e3cca 100644 (file)
@@ -118,13 +118,13 @@ struct w83l785ts_data {
  * Sysfs stuff
  */
 
-static ssize_t show_temp(struct device *dev, char *buf)
+static ssize_t show_temp(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w83l785ts_data *data = w83l785ts_update_device(dev);
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
 }
 
-static ssize_t show_temp_over(struct device *dev, char *buf)
+static ssize_t show_temp_over(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w83l785ts_data *data = w83l785ts_update_device(dev);
        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
index 9011627d7eb030569524437fd10ef00c4523702b..a22e53badacbe95efa5e0451be2b8236a8d60cc5 100644 (file)
@@ -103,7 +103,7 @@ static struct class i2c_adapter_class = {
        .release =      &i2c_adapter_class_dev_release,
 };
 
-static ssize_t show_adapter_name(struct device *dev, char *buf)
+static ssize_t show_adapter_name(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct i2c_adapter *adap = dev_to_i2c_adapter(dev);
        return sprintf(buf, "%s\n", adap->name);
@@ -117,7 +117,7 @@ static void i2c_client_release(struct device *dev)
        complete(&client->released);
 }
 
-static ssize_t show_client_name(struct device *dev, char *buf)
+static ssize_t show_client_name(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct i2c_client *client = to_i2c_client(dev);
        return sprintf(buf, "%s\n", client->name);
index 3ac0a535b4aa2a961bfbbbe4a4b133b294880cef..0273f124a4f723bafa7889a9bb36fc10b56a14a9 100644 (file)
@@ -672,8 +672,8 @@ config BLK_DEV_SVWKS
          chipsets.
 
 config BLK_DEV_SGIIOC4
-       tristate "Silicon Graphics IOC4 chipset support"
-       depends on IA64_SGI_SN2 || IA64_GENERIC
+       tristate "Silicon Graphics IOC4 chipset ATA/ATAPI support"
+       depends on (IA64_SGI_SN2 || IA64_GENERIC) && SGI_IOC4
        help
          This driver adds PIO & MultiMode DMA-2 support for the SGI IOC4
          chipset, which has one channel and can support two devices.
index 33a020faeabde258ef0b0e6903480f74a4f1b2d6..39f3e9101ed4b9eebb45237de5d1d3c982063d89 100644 (file)
@@ -1932,8 +1932,11 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
 
                /*
                 * check if dma is safe
+                *
+                * NOTE! The "len" and "addr" checks should possibly have
+                * separate masks.
                 */
-               if ((rq->data_len & mask) || (addr & mask))
+               if ((rq->data_len & 15) || (addr & mask))
                        info->dma = 0;
        }
 
@@ -3255,16 +3258,12 @@ sector_t ide_cdrom_capacity (ide_drive_t *drive)
        return capacity * sectors_per_frame;
 }
 
-static
-int ide_cdrom_cleanup(ide_drive_t *drive)
+static int ide_cd_remove(struct device *dev)
 {
+       ide_drive_t *drive = to_ide_device(dev);
        struct cdrom_info *info = drive->driver_data;
 
-       if (ide_unregister_subdriver(drive)) {
-               printk(KERN_ERR "%s: %s: failed to ide_unregister_subdriver\n",
-                       __FUNCTION__, drive->name);
-               return 1;
-       }
+       ide_unregister_subdriver(drive, info->driver);
 
        del_gendisk(info->disk);
 
@@ -3297,7 +3296,7 @@ static void ide_cd_release(struct kref *kref)
        kfree(info);
 }
 
-static int ide_cdrom_attach (ide_drive_t *drive);
+static int ide_cd_probe(struct device *);
 
 #ifdef CONFIG_PROC_FS
 static int proc_idecd_read_capacity
@@ -3320,19 +3319,20 @@ static ide_proc_entry_t idecd_proc[] = {
 
 static ide_driver_t ide_cdrom_driver = {
        .owner                  = THIS_MODULE,
-       .name                   = "ide-cdrom",
+       .gen_driver = {
+               .name           = "ide-cdrom",
+               .bus            = &ide_bus_type,
+               .probe          = ide_cd_probe,
+               .remove         = ide_cd_remove,
+       },
        .version                = IDECD_VERSION,
        .media                  = ide_cdrom,
-       .busy                   = 0,
        .supports_dsc_overlap   = 1,
-       .cleanup                = ide_cdrom_cleanup,
        .do_request             = ide_do_rw_cdrom,
        .end_request            = ide_end_request,
        .error                  = __ide_error,
        .abort                  = __ide_abort,
        .proc                   = idecd_proc,
-       .attach                 = ide_cdrom_attach,
-       .drives                 = LIST_HEAD_INIT(ide_cdrom_driver.drives),
 };
 
 static int idecd_open(struct inode * inode, struct file * file)
@@ -3418,8 +3418,9 @@ static char *ignore = NULL;
 module_param(ignore, charp, 0400);
 MODULE_DESCRIPTION("ATAPI CD-ROM Driver");
 
-static int ide_cdrom_attach (ide_drive_t *drive)
+static int ide_cd_probe(struct device *dev)
 {
+       ide_drive_t *drive = to_ide_device(dev);
        struct cdrom_info *info;
        struct gendisk *g;
        struct request_sense sense;
@@ -3453,11 +3454,8 @@ static int ide_cdrom_attach (ide_drive_t *drive)
 
        ide_init_disk(g, drive);
 
-       if (ide_register_subdriver(drive, &ide_cdrom_driver)) {
-               printk(KERN_ERR "%s: Failed to register the driver with ide.c\n",
-                       drive->name);
-               goto out_put_disk;
-       }
+       ide_register_subdriver(drive, &ide_cdrom_driver);
+
        memset(info, 0, sizeof (struct cdrom_info));
 
        kref_init(&info->kref);
@@ -3470,7 +3468,6 @@ static int ide_cdrom_attach (ide_drive_t *drive)
 
        drive->driver_data = info;
 
-       DRIVER(drive)->busy++;
        g->minors = 1;
        snprintf(g->devfs_name, sizeof(g->devfs_name),
                        "%s/cd", drive->devfs_name);
@@ -3478,8 +3475,7 @@ static int ide_cdrom_attach (ide_drive_t *drive)
        g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE;
        if (ide_cdrom_setup(drive)) {
                struct cdrom_device_info *devinfo = &info->devinfo;
-               DRIVER(drive)->busy--;
-               ide_unregister_subdriver(drive);
+               ide_unregister_subdriver(drive, &ide_cdrom_driver);
                if (info->buffer != NULL)
                        kfree(info->buffer);
                if (info->toc != NULL)
@@ -3492,7 +3488,6 @@ static int ide_cdrom_attach (ide_drive_t *drive)
                drive->driver_data = NULL;
                goto failed;
        }
-       DRIVER(drive)->busy--;
 
        cdrom_read_toc(drive, &sense);
        g->fops = &idecd_ops;
@@ -3500,23 +3495,20 @@ static int ide_cdrom_attach (ide_drive_t *drive)
        add_disk(g);
        return 0;
 
-out_put_disk:
-       put_disk(g);
 out_free_cd:
        kfree(info);
 failed:
-       return 1;
+       return -ENODEV;
 }
 
 static void __exit ide_cdrom_exit(void)
 {
-       ide_unregister_driver(&ide_cdrom_driver);
+       driver_unregister(&ide_cdrom_driver.gen_driver);
 }
  
 static int ide_cdrom_init(void)
 {
-       ide_register_driver(&ide_cdrom_driver);
-       return 0;
+       return driver_register(&ide_cdrom_driver.gen_driver);
 }
 
 module_init(ide_cdrom_init);
index 5d54f77561007f1622c632d1fa1dbc7886a02a51..3302cd8eab4c160caf430c1a22268abcc024e5e9 100644 (file)
@@ -1024,14 +1024,16 @@ static void ide_cacheflush_p(ide_drive_t *drive)
                printk(KERN_INFO "%s: wcache flush failed!\n", drive->name);
 }
 
-static int idedisk_cleanup (ide_drive_t *drive)
+static int ide_disk_remove(struct device *dev)
 {
+       ide_drive_t *drive = to_ide_device(dev);
        struct ide_disk_obj *idkp = drive->driver_data;
        struct gendisk *g = idkp->disk;
 
        ide_cacheflush_p(drive);
-       if (ide_unregister_subdriver(drive))
-               return 1;
+
+       ide_unregister_subdriver(drive, idkp->driver);
+
        del_gendisk(g);
 
        ide_disk_put(idkp);
@@ -1052,7 +1054,7 @@ static void ide_disk_release(struct kref *kref)
        kfree(idkp);
 }
 
-static int idedisk_attach(ide_drive_t *drive);
+static int ide_disk_probe(struct device *dev);
 
 static void ide_device_shutdown(struct device *dev)
 {
@@ -1082,27 +1084,23 @@ static void ide_device_shutdown(struct device *dev)
        dev->bus->suspend(dev, PMSG_SUSPEND);
 }
 
-/*
- *      IDE subdriver functions, registered with ide.c
- */
 static ide_driver_t idedisk_driver = {
        .owner                  = THIS_MODULE,
        .gen_driver = {
+               .name           = "ide-disk",
+               .bus            = &ide_bus_type,
+               .probe          = ide_disk_probe,
+               .remove         = ide_disk_remove,
                .shutdown       = ide_device_shutdown,
        },
-       .name                   = "ide-disk",
        .version                = IDEDISK_VERSION,
        .media                  = ide_disk,
-       .busy                   = 0,
        .supports_dsc_overlap   = 0,
-       .cleanup                = idedisk_cleanup,
        .do_request             = ide_do_rw_disk,
        .end_request            = ide_end_request,
        .error                  = __ide_error,
        .abort                  = __ide_abort,
        .proc                   = idedisk_proc,
-       .attach                 = idedisk_attach,
-       .drives                 = LIST_HEAD_INIT(idedisk_driver.drives),
 };
 
 static int idedisk_open(struct inode *inode, struct file *filp)
@@ -1199,8 +1197,9 @@ static struct block_device_operations idedisk_ops = {
 
 MODULE_DESCRIPTION("ATA DISK Driver");
 
-static int idedisk_attach(ide_drive_t *drive)
+static int ide_disk_probe(struct device *dev)
 {
+       ide_drive_t *drive = to_ide_device(dev);
        struct ide_disk_obj *idkp;
        struct gendisk *g;
 
@@ -1222,10 +1221,7 @@ static int idedisk_attach(ide_drive_t *drive)
 
        ide_init_disk(g, drive);
 
-       if (ide_register_subdriver(drive, &idedisk_driver)) {
-               printk (KERN_ERR "ide-disk: %s: Failed to register the driver with ide.c\n", drive->name);
-               goto out_put_disk;
-       }
+       ide_register_subdriver(drive, &idedisk_driver);
 
        memset(idkp, 0, sizeof(*idkp));
 
@@ -1239,7 +1235,6 @@ static int idedisk_attach(ide_drive_t *drive)
 
        drive->driver_data = idkp;
 
-       DRIVER(drive)->busy++;
        idedisk_setup(drive);
        if ((!drive->head || drive->head > 16) && !drive->select.b.lba) {
                printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n",
@@ -1247,7 +1242,7 @@ static int idedisk_attach(ide_drive_t *drive)
                drive->attach = 0;
        } else
                drive->attach = 1;
-       DRIVER(drive)->busy--;
+
        g->minors = 1 << PARTN_BITS;
        strcpy(g->devfs_name, drive->devfs_name);
        g->driverfs_dev = &drive->gendev;
@@ -1257,22 +1252,20 @@ static int idedisk_attach(ide_drive_t *drive)
        add_disk(g);
        return 0;
 
-out_put_disk:
-       put_disk(g);
 out_free_idkp:
        kfree(idkp);
 failed:
-       return 1;
+       return -ENODEV;
 }
 
 static void __exit idedisk_exit (void)
 {
-       ide_unregister_driver(&idedisk_driver);
+       driver_unregister(&idedisk_driver.gen_driver);
 }
 
 static int idedisk_init (void)
 {
-       return ide_register_driver(&idedisk_driver);
+       return driver_register(&idedisk_driver.gen_driver);
 }
 
 module_init(idedisk_init);
index 36c0b74a4e45b69dd4e0f5d71671bf5ba3781d83..c949e98df4b6da35da013d26ddb1b2d979cb36b4 100644 (file)
@@ -1865,13 +1865,13 @@ static void idefloppy_setup (ide_drive_t *drive, idefloppy_floppy_t *floppy)
        idefloppy_add_settings(drive);
 }
 
-static int idefloppy_cleanup (ide_drive_t *drive)
+static int ide_floppy_remove(struct device *dev)
 {
+       ide_drive_t *drive = to_ide_device(dev);
        idefloppy_floppy_t *floppy = drive->driver_data;
        struct gendisk *g = floppy->disk;
 
-       if (ide_unregister_subdriver(drive))
-               return 1;
+       ide_unregister_subdriver(drive, floppy->driver);
 
        del_gendisk(g);
 
@@ -1916,26 +1916,24 @@ static ide_proc_entry_t idefloppy_proc[] = {
 
 #endif /* CONFIG_PROC_FS */
 
-static int idefloppy_attach(ide_drive_t *drive);
+static int ide_floppy_probe(struct device *);
 
-/*
- *     IDE subdriver functions, registered with ide.c
- */
 static ide_driver_t idefloppy_driver = {
        .owner                  = THIS_MODULE,
-       .name                   = "ide-floppy",
+       .gen_driver = {
+               .name           = "ide-floppy",
+               .bus            = &ide_bus_type,
+               .probe          = ide_floppy_probe,
+               .remove         = ide_floppy_remove,
+       },
        .version                = IDEFLOPPY_VERSION,
        .media                  = ide_floppy,
-       .busy                   = 0,
        .supports_dsc_overlap   = 0,
-       .cleanup                = idefloppy_cleanup,
        .do_request             = idefloppy_do_request,
        .end_request            = idefloppy_do_end_request,
        .error                  = __ide_error,
        .abort                  = __ide_abort,
        .proc                   = idefloppy_proc,
-       .attach                 = idefloppy_attach,
-       .drives                 = LIST_HEAD_INIT(idefloppy_driver.drives),
 };
 
 static int idefloppy_open(struct inode *inode, struct file *filp)
@@ -2122,8 +2120,9 @@ static struct block_device_operations idefloppy_ops = {
        .revalidate_disk= idefloppy_revalidate_disk
 };
 
-static int idefloppy_attach (ide_drive_t *drive)
+static int ide_floppy_probe(struct device *dev)
 {
+       ide_drive_t *drive = to_ide_device(dev);
        idefloppy_floppy_t *floppy;
        struct gendisk *g;
 
@@ -2152,10 +2151,7 @@ static int idefloppy_attach (ide_drive_t *drive)
 
        ide_init_disk(g, drive);
 
-       if (ide_register_subdriver(drive, &idefloppy_driver)) {
-               printk (KERN_ERR "ide-floppy: %s: Failed to register the driver with ide.c\n", drive->name);
-               goto out_put_disk;
-       }
+       ide_register_subdriver(drive, &idefloppy_driver);
 
        memset(floppy, 0, sizeof(*floppy));
 
@@ -2169,9 +2165,8 @@ static int idefloppy_attach (ide_drive_t *drive)
 
        drive->driver_data = floppy;
 
-       DRIVER(drive)->busy++;
        idefloppy_setup (drive, floppy);
-       DRIVER(drive)->busy--;
+
        g->minors = 1 << PARTN_BITS;
        g->driverfs_dev = &drive->gendev;
        strcpy(g->devfs_name, drive->devfs_name);
@@ -2181,19 +2176,17 @@ static int idefloppy_attach (ide_drive_t *drive)
        add_disk(g);
        return 0;
 
-out_put_disk:
-       put_disk(g);
 out_free_floppy:
        kfree(floppy);
 failed:
-       return 1;
+       return -ENODEV;
 }
 
 MODULE_DESCRIPTION("ATAPI FLOPPY Driver");
 
 static void __exit idefloppy_exit (void)
 {
-       ide_unregister_driver(&idefloppy_driver);
+       driver_unregister(&idefloppy_driver.gen_driver);
 }
 
 /*
@@ -2202,8 +2195,7 @@ static void __exit idefloppy_exit (void)
 static int idefloppy_init (void)
 {
        printk("ide-floppy driver " IDEFLOPPY_VERSION "\n");
-       ide_register_driver(&idefloppy_driver);
-       return 0;
+       return driver_register(&idefloppy_driver.gen_driver);
 }
 
 module_init(idefloppy_init);
index 554473a95cf7474616263f791cecc427a8bd6ab6..5d876f53c69735d53c6d9b13a42eed559294d5b9 100644 (file)
@@ -47,6 +47,7 @@
 #include <linux/slab.h>
 #include <linux/delay.h>
 #include <linux/ide.h>
+#include <linux/devfs_fs_kernel.h>
 #include <linux/spinlock.h>
 #include <linux/kmod.h>
 #include <linux/pci.h>
@@ -696,13 +697,13 @@ static int wait_hwif_ready(ide_hwif_t *hwif)
        SELECT_DRIVE(&hwif->drives[0]);
        hwif->OUTB(8, hwif->io_ports[IDE_CONTROL_OFFSET]);
        mdelay(2);
-       rc = ide_wait_not_busy(hwif, 10000);
+       rc = ide_wait_not_busy(hwif, 35000);
        if (rc)
                return rc;
        SELECT_DRIVE(&hwif->drives[1]);
        hwif->OUTB(8, hwif->io_ports[IDE_CONTROL_OFFSET]);
        mdelay(2);
-       rc = ide_wait_not_busy(hwif, 10000);
+       rc = ide_wait_not_busy(hwif, 35000);
 
        /* Exit function with master reselected (let's be sane) */
        SELECT_DRIVE(&hwif->drives[0]);
@@ -918,7 +919,7 @@ int probe_hwif_init_with_fixup(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif)
                           want them on default or a new "empty" class
                           for hotplug reprobing ? */
                        if (drive->present) {
-                               ata_attach(drive);
+                               device_register(&drive->gendev);
                        }
                }
        }
@@ -1279,10 +1280,51 @@ void ide_init_disk(struct gendisk *disk, ide_drive_t *drive)
 
 EXPORT_SYMBOL_GPL(ide_init_disk);
 
+static void ide_remove_drive_from_hwgroup(ide_drive_t *drive)
+{
+       ide_hwgroup_t *hwgroup = drive->hwif->hwgroup;
+
+       if (drive == drive->next) {
+               /* special case: last drive from hwgroup. */
+               BUG_ON(hwgroup->drive != drive);
+               hwgroup->drive = NULL;
+       } else {
+               ide_drive_t *walk;
+
+               walk = hwgroup->drive;
+               while (walk->next != drive)
+                       walk = walk->next;
+               walk->next = drive->next;
+               if (hwgroup->drive == drive) {
+                       hwgroup->drive = drive->next;
+                       hwgroup->hwif = hwgroup->drive->hwif;
+               }
+       }
+       BUG_ON(hwgroup->drive == drive);
+}
+
 static void drive_release_dev (struct device *dev)
 {
        ide_drive_t *drive = container_of(dev, ide_drive_t, gendev);
 
+       spin_lock_irq(&ide_lock);
+       if (drive->devfs_name[0] != '\0') {
+               devfs_remove(drive->devfs_name);
+               drive->devfs_name[0] = '\0';
+       }
+       ide_remove_drive_from_hwgroup(drive);
+       if (drive->id != NULL) {
+               kfree(drive->id);
+               drive->id = NULL;
+       }
+       drive->present = 0;
+       /* Messed up locking ... */
+       spin_unlock_irq(&ide_lock);
+       blk_cleanup_queue(drive->queue);
+       spin_lock_irq(&ide_lock);
+       drive->queue = NULL;
+       spin_unlock_irq(&ide_lock);
+
        up(&drive->gendev_rel_sem);
 }
 
@@ -1306,7 +1348,6 @@ static void init_gendisk (ide_hwif_t *hwif)
                drive->gendev.driver_data = drive;
                drive->gendev.release = drive_release_dev;
                if (drive->present) {
-                       device_register(&drive->gendev);
                        sprintf(drive->devfs_name, "ide/host%d/bus%d/target%d/lun%d",
                                (hwif->channel && hwif->mate) ?
                                hwif->mate->index : hwif->index,
@@ -1412,7 +1453,7 @@ int ideprobe_init (void)
                                hwif->chipset = ide_generic;
                        for (unit = 0; unit < MAX_DRIVES; ++unit)
                                if (hwif->drives[unit].present)
-                                       ata_attach(&hwif->drives[unit]);
+                                       device_register(&hwif->drives[unit].gendev);
                }
        }
        return 0;
index bdff5ac580531c2bf1cdbc4faf79700552e5c762..4063d2c34e3dae692fd5654245fac53e3c371c2d 100644 (file)
@@ -307,17 +307,41 @@ static int proc_ide_read_driver
        (char *page, char **start, off_t off, int count, int *eof, void *data)
 {
        ide_drive_t     *drive = (ide_drive_t *) data;
-       ide_driver_t    *driver = drive->driver;
+       struct device   *dev = &drive->gendev;
+       ide_driver_t    *ide_drv;
        int             len;
 
-       if (driver) {
+       down_read(&dev->bus->subsys.rwsem);
+       if (dev->driver) {
+               ide_drv = container_of(dev->driver, ide_driver_t, gen_driver);
                len = sprintf(page, "%s version %s\n",
-                               driver->name, driver->version);
+                               dev->driver->name, ide_drv->version);
        } else
                len = sprintf(page, "ide-default version 0.9.newide\n");
+       up_read(&dev->bus->subsys.rwsem);
        PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
 }
 
+static int ide_replace_subdriver(ide_drive_t *drive, const char *driver)
+{
+       struct device *dev = &drive->gendev;
+       int ret = 1;
+
+       down_write(&dev->bus->subsys.rwsem);
+       device_release_driver(dev);
+       /* FIXME: device can still be in use by previous driver */
+       strlcpy(drive->driver_req, driver, sizeof(drive->driver_req));
+       device_attach(dev);
+       drive->driver_req[0] = 0;
+       if (dev->driver == NULL)
+               device_attach(dev);
+       if (dev->driver && !strcmp(dev->driver->name, driver))
+               ret = 0;
+       up_write(&dev->bus->subsys.rwsem);
+
+       return ret;
+}
+
 static int proc_ide_write_driver
        (struct file *file, const char __user *buffer, unsigned long count, void *data)
 {
@@ -488,16 +512,32 @@ void destroy_proc_ide_interface(ide_hwif_t *hwif)
        }
 }
 
-extern struct seq_operations ide_drivers_op;
+static int proc_print_driver(struct device_driver *drv, void *data)
+{
+       ide_driver_t *ide_drv = container_of(drv, ide_driver_t, gen_driver);
+       struct seq_file *s = data;
+
+       seq_printf(s, "%s version %s\n", drv->name, ide_drv->version);
+
+       return 0;
+}
+
+static int ide_drivers_show(struct seq_file *s, void *p)
+{
+       bus_for_each_drv(&ide_bus_type, NULL, s, proc_print_driver);
+       return 0;
+}
+
 static int ide_drivers_open(struct inode *inode, struct file *file)
 {
-       return seq_open(file, &ide_drivers_op);
+       return single_open(file, &ide_drivers_show, NULL);
 }
+
 static struct file_operations ide_drivers_operations = {
        .open           = ide_drivers_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
-       .release        = seq_release,
+       .release        = single_release,
 };
 
 void proc_ide_create(void)
@@ -516,6 +556,6 @@ void proc_ide_create(void)
 
 void proc_ide_destroy(void)
 {
-       remove_proc_entry("ide/drivers", proc_ide_root);
+       remove_proc_entry("drivers", proc_ide_root);
        remove_proc_entry("ide", NULL);
 }
index 4825448549850d48cb212d5f4bc006be12904988..5a3dc46008e64895fd5ccbe5e48dd3d32bd7a079 100644 (file)
@@ -4681,21 +4681,12 @@ static void idetape_setup (ide_drive_t *drive, idetape_tape_t *tape, int minor)
        idetape_add_settings(drive);
 }
 
-static int idetape_cleanup (ide_drive_t *drive)
+static int ide_tape_remove(struct device *dev)
 {
+       ide_drive_t *drive = to_ide_device(dev);
        idetape_tape_t *tape = drive->driver_data;
-       unsigned long flags;
-
-       spin_lock_irqsave(&ide_lock, flags);
-       if (test_bit(IDETAPE_BUSY, &tape->flags) || drive->usage ||
-           tape->first_stage != NULL || tape->merge_stage_size) {
-               spin_unlock_irqrestore(&ide_lock, flags);
-               return 1;
-       }
 
-       spin_unlock_irqrestore(&ide_lock, flags);
-       DRIVER(drive)->busy = 0;
-       (void) ide_unregister_subdriver(drive);
+       ide_unregister_subdriver(drive, tape->driver);
 
        ide_unregister_region(tape->disk);
 
@@ -4710,6 +4701,8 @@ static void ide_tape_release(struct kref *kref)
        ide_drive_t *drive = tape->drive;
        struct gendisk *g = tape->disk;
 
+       BUG_ON(tape->first_stage != NULL || tape->merge_stage_size);
+
        drive->dsc_overlap = 0;
        drive->driver_data = NULL;
        devfs_remove("%s/mt", drive->devfs_name);
@@ -4747,26 +4740,24 @@ static ide_proc_entry_t idetape_proc[] = {
 
 #endif
 
-static int idetape_attach(ide_drive_t *drive);
+static int ide_tape_probe(struct device *);
 
-/*
- *     IDE subdriver functions, registered with ide.c
- */
 static ide_driver_t idetape_driver = {
        .owner                  = THIS_MODULE,
-       .name                   = "ide-tape",
+       .gen_driver = {
+               .name           = "ide-tape",
+               .bus            = &ide_bus_type,
+               .probe          = ide_tape_probe,
+               .remove         = ide_tape_remove,
+       },
        .version                = IDETAPE_VERSION,
        .media                  = ide_tape,
-       .busy                   = 1,
        .supports_dsc_overlap   = 1,
-       .cleanup                = idetape_cleanup,
        .do_request             = idetape_do_request,
        .end_request            = idetape_end_request,
        .error                  = __ide_error,
        .abort                  = __ide_abort,
        .proc                   = idetape_proc,
-       .attach                 = idetape_attach,
-       .drives                 = LIST_HEAD_INIT(idetape_driver.drives),
 };
 
 /*
@@ -4829,8 +4820,9 @@ static struct block_device_operations idetape_block_ops = {
        .ioctl          = idetape_ioctl,
 };
 
-static int idetape_attach (ide_drive_t *drive)
+static int ide_tape_probe(struct device *dev)
 {
+       ide_drive_t *drive = to_ide_device(dev);
        idetape_tape_t *tape;
        struct gendisk *g;
        int minor;
@@ -4865,10 +4857,7 @@ static int idetape_attach (ide_drive_t *drive)
 
        ide_init_disk(g, drive);
 
-       if (ide_register_subdriver(drive, &idetape_driver)) {
-               printk(KERN_ERR "ide-tape: %s: Failed to register the driver with ide.c\n", drive->name);
-               goto out_put_disk;
-       }
+       ide_register_subdriver(drive, &idetape_driver);
 
        memset(tape, 0, sizeof(*tape));
 
@@ -4902,12 +4891,11 @@ static int idetape_attach (ide_drive_t *drive)
        ide_register_region(g);
 
        return 0;
-out_put_disk:
-       put_disk(g);
+
 out_free_tape:
        kfree(tape);
 failed:
-       return 1;
+       return -ENODEV;
 }
 
 MODULE_DESCRIPTION("ATAPI Streaming TAPE Driver");
@@ -4915,7 +4903,7 @@ MODULE_LICENSE("GPL");
 
 static void __exit idetape_exit (void)
 {
-       ide_unregister_driver(&idetape_driver);
+       driver_unregister(&idetape_driver.gen_driver);
        unregister_chrdev(IDETAPE_MAJOR, "ht");
 }
 
@@ -4928,8 +4916,7 @@ static int idetape_init (void)
                printk(KERN_ERR "ide-tape: Failed to register character device interface\n");
                return -EBUSY;
        }
-       ide_register_driver(&idetape_driver);
-       return 0;
+       return driver_register(&idetape_driver.gen_driver);
 }
 
 module_init(idetape_init);
index 973dec799b5c8b2d6d62f17fd8f639f7072a7be0..dae1bd5b8c3e1e16872af0eb5470ff93b3231230 100644 (file)
@@ -196,8 +196,6 @@ ide_hwif_t ide_hwifs[MAX_HWIFS];    /* master data repository */
 
 EXPORT_SYMBOL(ide_hwifs);
 
-static struct list_head ide_drives = LIST_HEAD_INIT(ide_drives);
-
 /*
  * Do not even *think* about calling this!
  */
@@ -358,54 +356,6 @@ static int ide_system_bus_speed(void)
        return system_bus_speed;
 }
 
-/*
- *     drives_lock protects the list of drives, drivers_lock the
- *     list of drivers.  Currently nobody takes both at once.
- */
-
-static DEFINE_SPINLOCK(drives_lock);
-static DEFINE_SPINLOCK(drivers_lock);
-static LIST_HEAD(drivers);
-
-/* Iterator for the driver list. */
-
-static void *m_start(struct seq_file *m, loff_t *pos)
-{
-       struct list_head *p;
-       loff_t l = *pos;
-       spin_lock(&drivers_lock);
-       list_for_each(p, &drivers)
-               if (!l--)
-                       return list_entry(p, ide_driver_t, drivers);
-       return NULL;
-}
-
-static void *m_next(struct seq_file *m, void *v, loff_t *pos)
-{
-       struct list_head *p = ((ide_driver_t *)v)->drivers.next;
-       (*pos)++;
-       return p==&drivers ? NULL : list_entry(p, ide_driver_t, drivers);
-}
-
-static void m_stop(struct seq_file *m, void *v)
-{
-       spin_unlock(&drivers_lock);
-}
-
-static int show_driver(struct seq_file *m, void *v)
-{
-       ide_driver_t *driver = v;
-       seq_printf(m, "%s version %s\n", driver->name, driver->version);
-       return 0;
-}
-
-struct seq_operations ide_drivers_op = {
-       .start  = m_start,
-       .next   = m_next,
-       .stop   = m_stop,
-       .show   = show_driver
-};
-
 #ifdef CONFIG_PROC_FS
 struct proc_dir_entry *proc_ide_root;
 #endif
@@ -630,7 +580,7 @@ void ide_unregister(unsigned int index)
        ide_hwif_t *hwif, *g;
        static ide_hwif_t tmp_hwif; /* protected by ide_cfg_sem */
        ide_hwgroup_t *hwgroup;
-       int irq_count = 0, unit, i;
+       int irq_count = 0, unit;
 
        BUG_ON(index >= MAX_HWIFS);
 
@@ -643,23 +593,22 @@ void ide_unregister(unsigned int index)
                goto abort;
        for (unit = 0; unit < MAX_DRIVES; ++unit) {
                drive = &hwif->drives[unit];
-               if (!drive->present)
+               if (!drive->present) {
+                       if (drive->devfs_name[0] != '\0') {
+                               devfs_remove(drive->devfs_name);
+                               drive->devfs_name[0] = '\0';
+                       }
                        continue;
-               if (drive->usage || DRIVER(drive)->busy)
-                       goto abort;
-               drive->dead = 1;
+               }
+               spin_unlock_irq(&ide_lock);
+               device_unregister(&drive->gendev);
+               down(&drive->gendev_rel_sem);
+               spin_lock_irq(&ide_lock);
        }
        hwif->present = 0;
 
        spin_unlock_irq(&ide_lock);
 
-       for (unit = 0; unit < MAX_DRIVES; ++unit) {
-               drive = &hwif->drives[unit];
-               if (!drive->present)
-                       continue;
-               DRIVER(drive)->cleanup(drive);
-       }
-
        destroy_proc_ide_interface(hwif);
 
        hwgroup = hwif->hwgroup;
@@ -687,44 +636,6 @@ void ide_unregister(unsigned int index)
         * Remove us from the hwgroup, and free
         * the hwgroup if we were the only member
         */
-       for (i = 0; i < MAX_DRIVES; ++i) {
-               drive = &hwif->drives[i];
-               if (drive->devfs_name[0] != '\0') {
-                       devfs_remove(drive->devfs_name);
-                       drive->devfs_name[0] = '\0';
-               }
-               if (!drive->present)
-                       continue;
-               if (drive == drive->next) {
-                       /* special case: last drive from hwgroup. */
-                       BUG_ON(hwgroup->drive != drive);
-                       hwgroup->drive = NULL;
-               } else {
-                       ide_drive_t *walk;
-
-                       walk = hwgroup->drive;
-                       while (walk->next != drive)
-                               walk = walk->next;
-                       walk->next = drive->next;
-                       if (hwgroup->drive == drive) {
-                               hwgroup->drive = drive->next;
-                               hwgroup->hwif = HWIF(hwgroup->drive);
-                       }
-               }
-               BUG_ON(hwgroup->drive == drive);
-               if (drive->id != NULL) {
-                       kfree(drive->id);
-                       drive->id = NULL;
-               }
-               drive->present = 0;
-               /* Messed up locking ... */
-               spin_unlock_irq(&ide_lock);
-               blk_cleanup_queue(drive->queue);
-               device_unregister(&drive->gendev);
-               down(&drive->gendev_rel_sem);
-               spin_lock_irq(&ide_lock);
-               drive->queue = NULL;
-       }
        if (hwif->next == hwif) {
                BUG_ON(hwgroup->hwif != hwif);
                kfree(hwgroup);
@@ -1304,73 +1215,6 @@ int system_bus_clock (void)
 
 EXPORT_SYMBOL(system_bus_clock);
 
-/*
- *     Locking is badly broken here - since way back.  That sucker is
- * root-only, but that's not an excuse...  The real question is what
- * exclusion rules do we want here.
- */
-int ide_replace_subdriver (ide_drive_t *drive, const char *driver)
-{
-       if (!drive->present || drive->usage || drive->dead)
-               goto abort;
-       if (DRIVER(drive)->cleanup(drive))
-               goto abort;
-       strlcpy(drive->driver_req, driver, sizeof(drive->driver_req));
-       if (ata_attach(drive)) {
-               spin_lock(&drives_lock);
-               list_del_init(&drive->list);
-               spin_unlock(&drives_lock);
-               drive->driver_req[0] = 0;
-               ata_attach(drive);
-       } else {
-               drive->driver_req[0] = 0;
-       }
-       if (drive->driver && !strcmp(drive->driver->name, driver))
-               return 0;
-abort:
-       return 1;
-}
-
-/**
- *     ata_attach              -       attach an ATA/ATAPI device
- *     @drive: drive to attach
- *
- *     Takes a drive that is as yet not assigned to any midlayer IDE
- *     driver (or is assigned to the default driver) and figures out
- *     which driver would like to own it. If nobody claims the drive
- *     then it is automatically attached to the default driver used for
- *     unclaimed objects.
- *
- *     A return of zero indicates attachment to a driver, of one
- *     attachment to the default driver.
- *
- *     Takes drivers_lock.
- */
-
-int ata_attach(ide_drive_t *drive)
-{
-       struct list_head *p;
-       spin_lock(&drivers_lock);
-       list_for_each(p, &drivers) {
-               ide_driver_t *driver = list_entry(p, ide_driver_t, drivers);
-               if (!try_module_get(driver->owner))
-                       continue;
-               spin_unlock(&drivers_lock);
-               if (driver->attach(drive) == 0) {
-                       module_put(driver->owner);
-                       drive->gendev.driver = &driver->gen_driver;
-                       return 0;
-               }
-               spin_lock(&drivers_lock);
-               module_put(driver->owner);
-       }
-       drive->gendev.driver = NULL;
-       spin_unlock(&drivers_lock);
-       if (ide_register_subdriver(drive, NULL))
-               panic("ide: default attach failed");
-       return 1;
-}
-
 static int generic_ide_suspend(struct device *dev, pm_message_t state)
 {
        ide_drive_t *drive = dev->driver_data;
@@ -2013,27 +1857,11 @@ static void __init probe_for_hwifs (void)
 #endif
 }
 
-int ide_register_subdriver(ide_drive_t *drive, ide_driver_t *driver)
+void ide_register_subdriver(ide_drive_t *drive, ide_driver_t *driver)
 {
-       unsigned long flags;
-
-       spin_lock_irqsave(&ide_lock, flags);
-       if (!drive->present || drive->driver != NULL ||
-           drive->usage || drive->dead) {
-               spin_unlock_irqrestore(&ide_lock, flags);
-               return 1;
-       }
-       drive->driver = driver;
-       spin_unlock_irqrestore(&ide_lock, flags);
-       spin_lock(&drives_lock);
-       list_add_tail(&drive->list, driver ? &driver->drives : &ide_drives);
-       spin_unlock(&drives_lock);
-//     printk(KERN_INFO "%s: attached %s driver.\n", drive->name, driver->name);
 #ifdef CONFIG_PROC_FS
-       if (driver)
-               ide_add_proc_entries(drive->proc, driver->proc, drive);
+       ide_add_proc_entries(drive->proc, driver->proc, drive);
 #endif
-       return 0;
 }
 
 EXPORT_SYMBOL(ide_register_subdriver);
@@ -2041,136 +1869,51 @@ EXPORT_SYMBOL(ide_register_subdriver);
 /**
  *     ide_unregister_subdriver        -       disconnect drive from driver
  *     @drive: drive to unplug
+ *     @driver: driver
  *
  *     Disconnect a drive from the driver it was attached to and then
  *     clean up the various proc files and other objects attached to it.
  *
- *     Takes ide_setting_sem, ide_lock and drives_lock.
+ *     Takes ide_setting_sem and ide_lock.
  *     Caller must hold none of the locks.
- *
- *     No locking versus subdriver unload because we are moving to the
- *     default driver anyway. Wants double checking.
  */
 
-int ide_unregister_subdriver (ide_drive_t *drive)
+void ide_unregister_subdriver(ide_drive_t *drive, ide_driver_t *driver)
 {
        unsigned long flags;
        
        down(&ide_setting_sem);
        spin_lock_irqsave(&ide_lock, flags);
-       if (drive->usage || drive->driver == NULL || DRIVER(drive)->busy) {
-               spin_unlock_irqrestore(&ide_lock, flags);
-               up(&ide_setting_sem);
-               return 1;
-       }
 #ifdef CONFIG_PROC_FS
-       ide_remove_proc_entries(drive->proc, DRIVER(drive)->proc);
+       ide_remove_proc_entries(drive->proc, driver->proc);
 #endif
        auto_remove_settings(drive);
-       drive->driver = NULL;
        spin_unlock_irqrestore(&ide_lock, flags);
        up(&ide_setting_sem);
-       spin_lock(&drives_lock);
-       list_del_init(&drive->list);
-       spin_unlock(&drives_lock);
-       /* drive will be added to &ide_drives in ata_attach() */
-       return 0;
 }
 
 EXPORT_SYMBOL(ide_unregister_subdriver);
 
-static int ide_drive_remove(struct device * dev)
-{
-       ide_drive_t * drive = container_of(dev,ide_drive_t,gendev);
-       DRIVER(drive)->cleanup(drive);
-       return 0;
-}
-
-/**
- *     ide_register_driver     -       register IDE device driver
- *     @driver: the IDE device driver
- *
- *     Register a new device driver and then scan the devices
- *     on the IDE bus in case any should be attached to the
- *     driver we have just registered.  If so attach them.
- *
- *     Takes drivers_lock and drives_lock.
- */
-
-int ide_register_driver(ide_driver_t *driver)
-{
-       struct list_head list;
-       struct list_head *list_loop;
-       struct list_head *tmp_storage;
-
-       spin_lock(&drivers_lock);
-       list_add(&driver->drivers, &drivers);
-       spin_unlock(&drivers_lock);
-
-       INIT_LIST_HEAD(&list);
-       spin_lock(&drives_lock);
-       list_splice_init(&ide_drives, &list);
-       spin_unlock(&drives_lock);
-
-       list_for_each_safe(list_loop, tmp_storage, &list) {
-               ide_drive_t *drive = container_of(list_loop, ide_drive_t, list);
-               list_del_init(&drive->list);
-               if (drive->present)
-                       ata_attach(drive);
-       }
-       driver->gen_driver.name = (char *) driver->name;
-       driver->gen_driver.bus = &ide_bus_type;
-       driver->gen_driver.remove = ide_drive_remove;
-       return driver_register(&driver->gen_driver);
-}
-
-EXPORT_SYMBOL(ide_register_driver);
-
-/**
- *     ide_unregister_driver   -       unregister IDE device driver
- *     @driver: the IDE device driver
- *
- *     Called when a driver module is being unloaded. We reattach any
- *     devices to whatever driver claims them next (typically the default
- *     driver).
- *
- *     Takes drivers_lock and called functions will take ide_setting_sem.
- */
-
-void ide_unregister_driver(ide_driver_t *driver)
-{
-       ide_drive_t *drive;
-
-       spin_lock(&drivers_lock);
-       list_del(&driver->drivers);
-       spin_unlock(&drivers_lock);
-
-       driver_unregister(&driver->gen_driver);
-
-       while(!list_empty(&driver->drives)) {
-               drive = list_entry(driver->drives.next, ide_drive_t, list);
-               if (driver->cleanup(drive)) {
-                       printk(KERN_ERR "%s: cleanup_module() called while still busy\n", drive->name);
-                       BUG();
-               }
-               ata_attach(drive);
-       }
-}
-
-EXPORT_SYMBOL(ide_unregister_driver);
-
 /*
  * Probe module
  */
 
 EXPORT_SYMBOL(ide_lock);
 
+static int ide_bus_match(struct device *dev, struct device_driver *drv)
+{
+       return 1;
+}
+
 struct bus_type ide_bus_type = {
        .name           = "ide",
+       .match          = ide_bus_match,
        .suspend        = generic_ide_suspend,
        .resume         = generic_ide_resume,
 };
 
+EXPORT_SYMBOL_GPL(ide_bus_type);
+
 /*
  * This is gets invoked once during initialization, to set *everything* up
  */
index 47225e324356a3b20c90480cadc1579fd99fb99f..4e0f13d1d06073aef6f593d2141c8cb31dd58114 100644 (file)
@@ -72,6 +72,7 @@ static struct amd_ide_chip {
        { PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2,  0x50, AMD_UDMA_133 },
        { PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE,        0x50, AMD_UDMA_133 },
        { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE,        0x50, AMD_UDMA_133 },
+       { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE,        0x50, AMD_UDMA_133 },
        { 0 }
 };
 
@@ -487,6 +488,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
        /* 12 */ DECLARE_NV_DEV("NFORCE3-250-SATA2"),
        /* 13 */ DECLARE_NV_DEV("NFORCE-CK804"),
        /* 14 */ DECLARE_NV_DEV("NFORCE-MCP04"),
+       /* 15 */ DECLARE_NV_DEV("NFORCE-MCP51"),
 };
 
 static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id)
@@ -521,6 +523,7 @@ static struct pci_device_id amd74xx_pci_tbl[] = {
 #endif
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13 },
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 },
+       { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 },
        { 0, },
 };
 MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl);
index 4651a22bf12e96ee0789f456b97348eb8f4029c7..af526b671c4e1f7ee0d9b274b5f2d90603fe7637 100644 (file)
@@ -34,7 +34,7 @@
 #include <linux/mm.h>
 #include <linux/ioport.h>
 #include <linux/blkdev.h>
-#include <linux/ioc4_common.h>
+#include <linux/ioc4.h>
 #include <asm/io.h>
 
 #include <linux/ide.h>
@@ -715,14 +715,34 @@ static ide_pci_device_t sgiioc4_chipsets[] __devinitdata = {
 };
 
 int
-ioc4_ide_attach_one(struct pci_dev *dev, const struct pci_device_id *id)
+ioc4_ide_attach_one(struct ioc4_driver_data *idd)
 {
-       return pci_init_sgiioc4(dev, &sgiioc4_chipsets[id->driver_data]);
+       return pci_init_sgiioc4(idd->idd_pdev,
+                               &sgiioc4_chipsets[idd->idd_pci_id->driver_data]);
 }
 
+static struct ioc4_submodule ioc4_ide_submodule = {
+       .is_name = "IOC4_ide",
+       .is_owner = THIS_MODULE,
+       .is_probe = ioc4_ide_attach_one,
+/*     .is_remove = ioc4_ide_remove_one,       */
+};
+
+static int __devinit
+ioc4_ide_init(void)
+{
+       return ioc4_register_submodule(&ioc4_ide_submodule);
+}
+
+static void __devexit
+ioc4_ide_exit(void)
+{
+       ioc4_unregister_submodule(&ioc4_ide_submodule);
+}
+
+module_init(ioc4_ide_init);
+module_exit(ioc4_ide_exit);
 
 MODULE_AUTHOR("Aniket Malatpure - Silicon Graphics Inc. (SGI)");
 MODULE_DESCRIPTION("IDE PCI driver module for SGI IOC4 Base-IO Card");
 MODULE_LICENSE("GPL");
-
-EXPORT_SYMBOL(ioc4_ide_attach_one);
index 78b201fb5e8ab792c622bddcc69e396039a8b772..7d58af1ae306f2574c5217a2b4477f9ef1e378f0 100644 (file)
@@ -84,11 +84,6 @@ config IEEE1394_PCILYNX
          To compile this driver as a module, say M here: the
          module will be called pcilynx.
 
-# Non-maintained pcilynx options
-# if [ "$CONFIG_IEEE1394_PCILYNX" != "n" ]; then
-#     bool '    Use PCILynx local RAM' CONFIG_IEEE1394_PCILYNX_LOCALRAM
-#     bool '    Support for non-IEEE1394 local ports' CONFIG_IEEE1394_PCILYNX_PORTS
-# fi
 config IEEE1394_OHCI1394
        tristate "OHCI-1394 support"
        depends on PCI && IEEE1394
index 68c7a5f07842d99723c7fb599d2393ca9ec972ba..4538b0235ca34ebd3aca87428443153b080b4255 100644 (file)
@@ -2343,8 +2343,8 @@ static void dv1394_remove_host (struct hpsb_host *host)
                        dv1394_un_init(video);
        } while (video != NULL);
 
-       class_simple_device_remove(MKDEV(
-               IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_DV1394 * 16 + (id<<2)));
+       class_device_destroy(hpsb_protocol_class,
+               MKDEV(IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_DV1394 * 16 + (id<<2)));
        devfs_remove("ieee1394/dv/host%d/NTSC", id);
        devfs_remove("ieee1394/dv/host%d/PAL", id);
        devfs_remove("ieee1394/dv/host%d", id);
@@ -2361,7 +2361,7 @@ static void dv1394_add_host (struct hpsb_host *host)
 
        ohci = (struct ti_ohci *)host->hostdata;
 
-       class_simple_device_add(hpsb_protocol_class, MKDEV(
+       class_device_create(hpsb_protocol_class, MKDEV(
                IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_DV1394 * 16 + (id<<2)), 
                NULL, "dv1394-%d", id);
        devfs_mk_dir("ieee1394/dv/host%d", id);
index 1c5845f7e4ab3103675db0a54edb04c4a4adf6cb..2d9a9b74e687ce51a19b7d026ca4b73155083d5f 100644 (file)
@@ -67,7 +67,7 @@ MODULE_LICENSE("GPL");
 
 /* Some globals used */
 const char *hpsb_speedto_str[] = { "S100", "S200", "S400", "S800", "S1600", "S3200" };
-struct class_simple *hpsb_protocol_class;
+struct class *hpsb_protocol_class;
 
 #ifdef CONFIG_IEEE1394_VERBOSEDEBUG
 static void dump_packet(const char *text, quadlet_t *data, int size)
@@ -520,7 +520,7 @@ int hpsb_send_packet(struct hpsb_packet *packet)
 
        if (!packet->no_waiter || packet->expect_response) {
                atomic_inc(&packet->refcnt);
-               packet->sendtime = jiffies;
+               packet->sendtime = jiffies + 10 * HZ;
                skb_queue_tail(&host->pending_packet_queue, packet->skb);
        }
 
@@ -1121,7 +1121,7 @@ static int __init ieee1394_init(void)
        if (ret < 0)
                goto release_all_bus;
 
-       hpsb_protocol_class = class_simple_create(THIS_MODULE, "ieee1394_protocol");
+       hpsb_protocol_class = class_create(THIS_MODULE, "ieee1394_protocol");
        if (IS_ERR(hpsb_protocol_class)) {
                ret = PTR_ERR(hpsb_protocol_class);
                goto release_class_host;
@@ -1159,7 +1159,7 @@ static int __init ieee1394_init(void)
 cleanup_csr:
        cleanup_csr();
 release_class_protocol:
-       class_simple_destroy(hpsb_protocol_class);
+       class_destroy(hpsb_protocol_class);
 release_class_host:
        class_unregister(&hpsb_host_class);
 release_all_bus:
@@ -1189,7 +1189,7 @@ static void __exit ieee1394_cleanup(void)
 
        cleanup_csr();
 
-       class_simple_destroy(hpsb_protocol_class);
+       class_destroy(hpsb_protocol_class);
        class_unregister(&hpsb_host_class);
        for (i = 0; fw_bus_attrs[i]; i++)
                bus_remove_file(&ieee1394_bus_type, fw_bus_attrs[i]);
@@ -1248,7 +1248,6 @@ EXPORT_SYMBOL(hpsb_make_phypacket);
 EXPORT_SYMBOL(hpsb_make_isopacket);
 EXPORT_SYMBOL(hpsb_read);
 EXPORT_SYMBOL(hpsb_write);
-EXPORT_SYMBOL(hpsb_lock);
 EXPORT_SYMBOL(hpsb_packet_success);
 
 /** highlevel.c **/
index c4b4408e2e0506f1f21acb23402934de0af65f79..73bd8efd2b6c94081400539c0cf5508f409e42d0 100644 (file)
@@ -223,6 +223,7 @@ extern int hpsb_disable_irm;
 /* Our sysfs bus entry */
 extern struct bus_type ieee1394_bus_type;
 extern struct class hpsb_host_class;
-extern struct class_simple *hpsb_protocol_class;
+extern struct class *hpsb_protocol_class;
 
 #endif /* _IEEE1394_CORE_H */
+
index 09908b9564d8b944d5029f83b03f405846890fc4..0aa876360f9be647e307923a325bcda390970979 100644 (file)
@@ -535,6 +535,7 @@ hpsb_write_fail:
         return retval;
 }
 
+#if 0
 
 int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
              u64 addr, int extcode, quadlet_t *data, quadlet_t arg)
@@ -599,3 +600,5 @@ int hpsb_send_gasp(struct hpsb_host *host, int channel, unsigned int generation,
 
        return retval;
 }
+
+#endif  /*  0  */
index 526a43ceb49602f6130869826b21ab91d2a1dad8..45ba784fe6da044b4114cfa40f1a26f96bb0fdc2 100644 (file)
@@ -53,12 +53,5 @@ int hpsb_read(struct hpsb_host *host, nodeid_t node, unsigned int generation,
              u64 addr, quadlet_t *buffer, size_t length);
 int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation,
               u64 addr, quadlet_t *buffer, size_t length);
-int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
-             u64 addr, int extcode, quadlet_t *data, quadlet_t arg);
-int hpsb_lock64(struct hpsb_host *host, nodeid_t node, unsigned int generation,
-               u64 addr, int extcode, octlet_t *data, octlet_t arg);
-int hpsb_send_gasp(struct hpsb_host *host, int channel, unsigned int generation,
-                   quadlet_t *buffer, size_t length, u32 specifier_id,
-                   unsigned int version);
 
 #endif /* _IEEE1394_TRANSACTIONS_H */
index a1e30a66297bcbff0de7d95c9257710ecfb6ea0a..32abb6dda888cbbb480b1ebf19ab3a5f45f24b17 100644 (file)
@@ -220,7 +220,7 @@ struct device nodemgr_dev_template_host = {
 
 
 #define fw_attr(class, class_type, field, type, format_string)         \
-static ssize_t fw_show_##class##_##field (struct device *dev, char *buf)\
+static ssize_t fw_show_##class##_##field (struct device *dev, struct device_attribute *attr, char *buf)\
 {                                                                      \
        class_type *class;                                              \
        class = container_of(dev, class_type, device);                  \
@@ -232,7 +232,7 @@ static struct device_attribute dev_attr_##class##_##field = {               \
 };
 
 #define fw_attr_td(class, class_type, td_kv)                           \
-static ssize_t fw_show_##class##_##td_kv (struct device *dev, char *buf)\
+static ssize_t fw_show_##class##_##td_kv (struct device *dev, struct device_attribute *attr, char *buf)\
 {                                                                      \
        int len;                                                        \
        class_type *class = container_of(dev, class_type, device);      \
@@ -265,7 +265,7 @@ static struct driver_attribute driver_attr_drv_##field = {  \
 };
 
 
-static ssize_t fw_show_ne_bus_options(struct device *dev, char *buf)
+static ssize_t fw_show_ne_bus_options(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct node_entry *ne = container_of(dev, struct node_entry, device);
 
@@ -281,7 +281,7 @@ static ssize_t fw_show_ne_bus_options(struct device *dev, char *buf)
 static DEVICE_ATTR(bus_options,S_IRUGO,fw_show_ne_bus_options,NULL);
 
 
-static ssize_t fw_show_ne_tlabels_free(struct device *dev, char *buf)
+static ssize_t fw_show_ne_tlabels_free(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct node_entry *ne = container_of(dev, struct node_entry, device);
        return sprintf(buf, "%d\n", atomic_read(&ne->tpool->count.count) + 1);
@@ -289,7 +289,7 @@ static ssize_t fw_show_ne_tlabels_free(struct device *dev, char *buf)
 static DEVICE_ATTR(tlabels_free,S_IRUGO,fw_show_ne_tlabels_free,NULL);
 
 
-static ssize_t fw_show_ne_tlabels_allocations(struct device *dev, char *buf)
+static ssize_t fw_show_ne_tlabels_allocations(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct node_entry *ne = container_of(dev, struct node_entry, device);
        return sprintf(buf, "%u\n", ne->tpool->allocations);
@@ -297,7 +297,7 @@ static ssize_t fw_show_ne_tlabels_allocations(struct device *dev, char *buf)
 static DEVICE_ATTR(tlabels_allocations,S_IRUGO,fw_show_ne_tlabels_allocations,NULL);
 
 
-static ssize_t fw_show_ne_tlabels_mask(struct device *dev, char *buf)
+static ssize_t fw_show_ne_tlabels_mask(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct node_entry *ne = container_of(dev, struct node_entry, device);
 #if (BITS_PER_LONG <= 32)
@@ -309,7 +309,7 @@ static ssize_t fw_show_ne_tlabels_mask(struct device *dev, char *buf)
 static DEVICE_ATTR(tlabels_mask, S_IRUGO, fw_show_ne_tlabels_mask, NULL);
 
 
-static ssize_t fw_set_ignore_driver(struct device *dev, const char *buf, size_t count)
+static ssize_t fw_set_ignore_driver(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct unit_directory *ud = container_of(dev, struct unit_directory, device);
        int state = simple_strtoul(buf, NULL, 10);
@@ -324,7 +324,7 @@ static ssize_t fw_set_ignore_driver(struct device *dev, const char *buf, size_t
 
        return count;
 }
-static ssize_t fw_get_ignore_driver(struct device *dev, char *buf)
+static ssize_t fw_get_ignore_driver(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct unit_directory *ud = container_of(dev, struct unit_directory, device);
 
@@ -695,14 +695,15 @@ static void nodemgr_remove_ne(struct node_entry *ne)
        put_device(dev);
 }
 
+static int __nodemgr_remove_host_dev(struct device *dev, void *data)
+{
+       nodemgr_remove_ne(container_of(dev, struct node_entry, device));
+       return 0;
+}
 
 static void nodemgr_remove_host_dev(struct device *dev)
 {
-       struct device *ne_dev, *next;
-
-       list_for_each_entry_safe(ne_dev, next, &dev->children, node)
-               nodemgr_remove_ne(container_of(ne_dev, struct node_entry, device));
-
+       device_for_each_child(dev, NULL, __nodemgr_remove_host_dev);
        sysfs_remove_link(&dev->kobj, "irm_id");
        sysfs_remove_link(&dev->kobj, "busmgr_id");
        sysfs_remove_link(&dev->kobj, "host_id");
@@ -1005,8 +1006,7 @@ static struct unit_directory *nodemgr_process_unit_directory
        return ud;
 
 unit_directory_error:
-       if (ud != NULL)
-               kfree(ud);
+       kfree(ud);
        return NULL;
 }
 
index 6cb0b586c29761d2e3873219a692f83ace1017d6..36e25ac823dc73c2f69c58e391dd4382af59de55 100644 (file)
@@ -2931,7 +2931,7 @@ static void free_dma_rcv_ctx(struct dma_rcv_ctx *d)
                kfree(d->prg_cpu);
                kfree(d->prg_bus);
        }
-       if (d->spb) kfree(d->spb);
+       kfree(d->spb);
 
        /* Mark this context as freed. */
        d->ohci = NULL;
index d1758d409610b3906823fb186a8a1325c70fd1dd..cc66c1cae250c1cb105599810637e1ff77ba58bb 100644 (file)
@@ -236,6 +236,9 @@ struct ti_ohci {
 
 static inline int cross_bound(unsigned long addr, unsigned int size)
 {
+       if (size == 0)
+               return 0;
+
        if (size > PAGE_SIZE)
                return 1;
 
index a261d2b0e5ac7b40ed039fd51a4d385c5d0e4aca..bdb3a85cafa68507a82616e88b55952f3ff0a057 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/fs.h>
 #include <linux/poll.h>
 #include <linux/kdev_t.h>
+#include <linux/dma-mapping.h>
 #include <asm/byteorder.h>
 #include <asm/atomic.h>
 #include <asm/io.h>
@@ -834,327 +835,6 @@ static int lynx_devctl(struct hpsb_host *host, enum devctl_cmd cmd, int arg)
  * IEEE-1394 functionality section END *
  ***************************************/
 
-#ifdef CONFIG_IEEE1394_PCILYNX_PORTS
-/* VFS functions for local bus / aux device access.  Access to those
- * is implemented as a character device instead of block devices
- * because buffers are not wanted for this.  Therefore llseek (from
- * VFS) can be used for these char devices with obvious effects.
- */
-static int mem_open(struct inode*, struct file*);
-static int mem_release(struct inode*, struct file*);
-static unsigned int aux_poll(struct file*, struct poll_table_struct*);
-static loff_t mem_llseek(struct file*, loff_t, int);
-static ssize_t mem_read (struct file*, char*, size_t, loff_t*);
-static ssize_t mem_write(struct file*, const char*, size_t, loff_t*);
-
-
-static struct file_operations aux_ops = {
-       .owner =        THIS_MODULE,
-        .read =         mem_read,
-        .write =        mem_write,
-        .poll =         aux_poll,
-        .llseek =       mem_llseek,
-        .open =         mem_open,
-        .release =      mem_release,
-};
-
-
-static void aux_setup_pcls(struct ti_lynx *lynx)
-{
-        struct ti_pcl pcl;
-
-        pcl.next = PCL_NEXT_INVALID;
-        pcl.user_data = pcl_bus(lynx, lynx->dmem_pcl);
-        put_pcl(lynx, lynx->dmem_pcl, &pcl);
-}
-
-static int mem_open(struct inode *inode, struct file *file)
-{
-        int cid = iminor(inode);
-        enum { t_rom, t_aux, t_ram } type;
-        struct memdata *md;
-
-        if (cid < PCILYNX_MINOR_AUX_START) {
-                /* just for completeness */
-                return -ENXIO;
-        } else if (cid < PCILYNX_MINOR_ROM_START) {
-                cid -= PCILYNX_MINOR_AUX_START;
-                if (cid >= num_of_cards || !cards[cid].aux_port)
-                        return -ENXIO;
-                type = t_aux;
-        } else if (cid < PCILYNX_MINOR_RAM_START) {
-                cid -= PCILYNX_MINOR_ROM_START;
-                if (cid >= num_of_cards || !cards[cid].local_rom)
-                        return -ENXIO;
-                type = t_rom;
-        } else {
-                /* WARNING: Know what you are doing when opening RAM.
-                 * It is currently used inside the driver! */
-                cid -= PCILYNX_MINOR_RAM_START;
-                if (cid >= num_of_cards || !cards[cid].local_ram)
-                        return -ENXIO;
-                type = t_ram;
-        }
-
-        md = (struct memdata *)kmalloc(sizeof(struct memdata), SLAB_KERNEL);
-        if (md == NULL)
-                return -ENOMEM;
-
-        md->lynx = &cards[cid];
-        md->cid = cid;
-
-        switch (type) {
-        case t_rom:
-                md->type = rom;
-                break;
-        case t_ram:
-                md->type = ram;
-                break;
-        case t_aux:
-                atomic_set(&md->aux_intr_last_seen,
-                           atomic_read(&cards[cid].aux_intr_seen));
-                md->type = aux;
-                break;
-        }
-
-        file->private_data = md;
-
-        return 0;
-}
-
-static int mem_release(struct inode *inode, struct file *file)
-{
-        kfree(file->private_data);
-        return 0;
-}
-
-static unsigned int aux_poll(struct file *file, poll_table *pt)
-{
-        struct memdata *md = (struct memdata *)file->private_data;
-        int cid = md->cid;
-        unsigned int mask;
-
-        /* reading and writing is always allowed */
-        mask = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM;
-
-        if (md->type == aux) {
-                poll_wait(file, &cards[cid].aux_intr_wait, pt);
-
-                if (atomic_read(&md->aux_intr_last_seen)
-                    != atomic_read(&cards[cid].aux_intr_seen)) {
-                        mask |= POLLPRI;
-                        atomic_inc(&md->aux_intr_last_seen);
-                }
-        }
-
-        return mask;
-}
-
-loff_t mem_llseek(struct file *file, loff_t offs, int orig)
-{
-        loff_t newoffs;
-
-        switch (orig) {
-        case 0:
-                newoffs = offs;
-                break;
-        case 1:
-                newoffs = offs + file->f_pos;
-                break;
-        case 2:
-                newoffs = PCILYNX_MAX_MEMORY + 1 + offs;
-                break;
-        default:
-                return -EINVAL;
-        }
-
-        if (newoffs < 0 || newoffs > PCILYNX_MAX_MEMORY + 1) return -EINVAL;
-
-        file->f_pos = newoffs;
-        return newoffs;
-}
-
-/*
- * do not DMA if count is too small because this will have a serious impact
- * on performance - the value 2400 was found by experiment and may not work
- * everywhere as good as here - use mem_mindma option for modules to change
- */
-static short mem_mindma = 2400;
-module_param(mem_mindma, short, 0444);
-MODULE_PARM_DESC(mem_mindma, "Minimum amount of data required to use DMA");
-
-static ssize_t mem_dmaread(struct memdata *md, u32 physbuf, ssize_t count,
-                           int offset)
-{
-        pcltmp_t pcltmp;
-        struct ti_pcl *pcl;
-        size_t retval;
-        int i;
-        DECLARE_WAITQUEUE(wait, current);
-
-        count &= ~3;
-        count = min(count, 53196);
-        retval = count;
-
-        if (reg_read(md->lynx, DMA_CHAN_CTRL(CHANNEL_LOCALBUS))
-            & DMA_CHAN_CTRL_BUSY) {
-                PRINT(KERN_WARNING, md->lynx->id, "DMA ALREADY ACTIVE!");
-        }
-
-        reg_write(md->lynx, LBUS_ADDR, md->type | offset);
-
-        pcl = edit_pcl(md->lynx, md->lynx->dmem_pcl, &pcltmp);
-        pcl->buffer[0].control = PCL_CMD_LBUS_TO_PCI | min(count, 4092);
-        pcl->buffer[0].pointer = physbuf;
-        count -= 4092;
-
-        i = 0;
-        while (count > 0) {
-                i++;
-                pcl->buffer[i].control = min(count, 4092);
-                pcl->buffer[i].pointer = physbuf + i * 4092;
-                count -= 4092;
-        }
-        pcl->buffer[i].control |= PCL_LAST_BUFF;
-        commit_pcl(md->lynx, md->lynx->dmem_pcl, &pcltmp);
-
-        set_current_state(TASK_INTERRUPTIBLE);
-        add_wait_queue(&md->lynx->mem_dma_intr_wait, &wait);
-        run_sub_pcl(md->lynx, md->lynx->dmem_pcl, 2, CHANNEL_LOCALBUS);
-
-        schedule();
-        while (reg_read(md->lynx, DMA_CHAN_CTRL(CHANNEL_LOCALBUS))
-               & DMA_CHAN_CTRL_BUSY) {
-                if (signal_pending(current)) {
-                        retval = -EINTR;
-                        break;
-                }
-                schedule();
-        }
-
-        reg_write(md->lynx, DMA_CHAN_CTRL(CHANNEL_LOCALBUS), 0);
-        remove_wait_queue(&md->lynx->mem_dma_intr_wait, &wait);
-
-        if (reg_read(md->lynx, DMA_CHAN_CTRL(CHANNEL_LOCALBUS))
-            & DMA_CHAN_CTRL_BUSY) {
-                PRINT(KERN_ERR, md->lynx->id, "DMA STILL ACTIVE!");
-        }
-
-        return retval;
-}
-
-static ssize_t mem_read(struct file *file, char *buffer, size_t count,
-                        loff_t *offset)
-{
-        struct memdata *md = (struct memdata *)file->private_data;
-        ssize_t bcount;
-        size_t alignfix;
-       loff_t off = *offset; /* avoid useless 64bit-arithmetic */
-        ssize_t retval;
-        void *membase;
-
-        if ((off + count) > PCILYNX_MAX_MEMORY+1) {
-                count = PCILYNX_MAX_MEMORY+1 - off;
-        }
-        if (count == 0 || off > PCILYNX_MAX_MEMORY) {
-                return -ENOSPC;
-        }
-
-        switch (md->type) {
-        case rom:
-                membase = md->lynx->local_rom;
-                break;
-        case ram:
-                membase = md->lynx->local_ram;
-                break;
-        case aux:
-                membase = md->lynx->aux_port;
-                break;
-        default:
-                panic("pcilynx%d: unsupported md->type %d in %s",
-                      md->lynx->id, md->type, __FUNCTION__);
-        }
-
-        down(&md->lynx->mem_dma_mutex);
-
-        if (count < mem_mindma) {
-                memcpy_fromio(md->lynx->mem_dma_buffer, membase+off, count);
-                goto out;
-        }
-
-        bcount = count;
-        alignfix = 4 - (off % 4);
-        if (alignfix != 4) {
-                if (bcount < alignfix) {
-                        alignfix = bcount;
-                }
-                memcpy_fromio(md->lynx->mem_dma_buffer, membase+off,
-                              alignfix);
-                if (bcount == alignfix) {
-                        goto out;
-                }
-                bcount -= alignfix;
-                off += alignfix;
-        }
-
-        while (bcount >= 4) {
-                retval = mem_dmaread(md, md->lynx->mem_dma_buffer_dma
-                                     + count - bcount, bcount, off);
-                if (retval < 0) return retval;
-
-                bcount -= retval;
-                off += retval;
-        }
-
-        if (bcount) {
-                memcpy_fromio(md->lynx->mem_dma_buffer + count - bcount,
-                              membase+off, bcount);
-        }
-
- out:
-        retval = copy_to_user(buffer, md->lynx->mem_dma_buffer, count);
-        up(&md->lynx->mem_dma_mutex);
-
-       if (retval) return -EFAULT;
-        *offset += count;
-        return count;
-}
-
-
-static ssize_t mem_write(struct file *file, const char *buffer, size_t count,
-                         loff_t *offset)
-{
-        struct memdata *md = (struct memdata *)file->private_data;
-
-        if (((*offset) + count) > PCILYNX_MAX_MEMORY+1) {
-                count = PCILYNX_MAX_MEMORY+1 - *offset;
-        }
-        if (count == 0 || *offset > PCILYNX_MAX_MEMORY) {
-                return -ENOSPC;
-        }
-
-        /* FIXME: dereferencing pointers to PCI mem doesn't work everywhere */
-        switch (md->type) {
-        case aux:
-               if (copy_from_user(md->lynx->aux_port+(*offset), buffer, count))
-                       return -EFAULT;
-                break;
-        case ram:
-               if (copy_from_user(md->lynx->local_ram+(*offset), buffer, count))
-                       return -EFAULT;
-                break;
-        case rom:
-                /* the ROM may be writeable */
-               if (copy_from_user(md->lynx->local_rom+(*offset), buffer, count))
-                       return -EFAULT;
-                break;
-        }
-
-        file->f_pos += count;
-        return count;
-}
-#endif /* CONFIG_IEEE1394_PCILYNX_PORTS */
-
 
 /********************************************************
  * Global stuff (interrupt handler, init/shutdown code) *
@@ -1181,18 +861,6 @@ static irqreturn_t lynx_irq_handler(int irq, void *dev_id,
         reg_write(lynx, LINK_INT_STATUS, linkint);
         reg_write(lynx, PCI_INT_STATUS, intmask);
 
-#ifdef CONFIG_IEEE1394_PCILYNX_PORTS
-        if (intmask & PCI_INT_AUX_INT) {
-                atomic_inc(&lynx->aux_intr_seen);
-                wake_up_interruptible(&lynx->aux_intr_wait);
-        }
-
-        if (intmask & PCI_INT_DMA_HLT(CHANNEL_LOCALBUS)) {
-                wake_up_interruptible(&lynx->mem_dma_intr_wait);
-        }
-#endif
-
-
         if (intmask & PCI_INT_1394) {
                 if (linkint & LINK_INT_PHY_TIMEOUT) {
                         PRINT(KERN_INFO, lynx->id, "PHY timeout occurred");
@@ -1484,15 +1152,9 @@ static void remove_card(struct pci_dev *dev)
                 pci_free_consistent(lynx->dev, PAGE_SIZE, lynx->rcv_page,
                                     lynx->rcv_page_dma);
         case have_aux_buf:
-#ifdef CONFIG_IEEE1394_PCILYNX_PORTS
-                pci_free_consistent(lynx->dev, 65536, lynx->mem_dma_buffer,
-                                    lynx->mem_dma_buffer_dma);
-#endif
         case have_pcl_mem:
-#ifndef CONFIG_IEEE1394_PCILYNX_LOCALRAM
                 pci_free_consistent(lynx->dev, LOCALRAM_SIZE, lynx->pcl_mem,
                                     lynx->pcl_mem_dma);
-#endif
         case clear:
                 /* do nothing - already freed */
                 ;
@@ -1524,7 +1186,7 @@ static int __devinit add_card(struct pci_dev *dev,
 
         error = -ENXIO;
 
-        if (pci_set_dma_mask(dev, 0xffffffff))
+        if (pci_set_dma_mask(dev, DMA_32BIT_MASK))
                 FAIL("DMA address limits not supported for PCILynx hardware");
         if (pci_enable_device(dev))
                 FAIL("failed to enable PCILynx hardware");
@@ -1546,7 +1208,6 @@ static int __devinit add_card(struct pci_dev *dev,
         spin_lock_init(&lynx->lock);
         spin_lock_init(&lynx->phy_reg_lock);
 
-#ifndef CONFIG_IEEE1394_PCILYNX_LOCALRAM
         lynx->pcl_mem = pci_alloc_consistent(dev, LOCALRAM_SIZE,
                                              &lynx->pcl_mem_dma);
 
@@ -1558,16 +1219,6 @@ static int __devinit add_card(struct pci_dev *dev,
         } else {
                 FAIL("failed to allocate PCL memory area");
         }
-#endif
-
-#ifdef CONFIG_IEEE1394_PCILYNX_PORTS
-        lynx->mem_dma_buffer = pci_alloc_consistent(dev, 65536,
-                                                    &lynx->mem_dma_buffer_dma);
-        if (lynx->mem_dma_buffer == NULL) {
-                FAIL("failed to allocate DMA buffer for aux");
-        }
-        lynx->state = have_aux_buf;
-#endif
 
         lynx->rcv_page = pci_alloc_consistent(dev, PAGE_SIZE,
                                               &lynx->rcv_page_dma);
@@ -1597,13 +1248,6 @@ static int __devinit add_card(struct pci_dev *dev,
                 FAIL("failed to remap registers - card not accessible");
         }
 
-#ifdef CONFIG_IEEE1394_PCILYNX_LOCALRAM
-        if (lynx->local_ram == NULL) {
-                FAIL("failed to remap local RAM which is required for "
-                     "operation");
-        }
-#endif
-
         reg_set_bits(lynx, MISC_CONTROL, MISC_CONTROL_SWRESET);
         /* Fix buggy cards with autoboot pin not tied low: */
         reg_write(lynx, DMA0_CHAN_CTRL, 0);
@@ -1624,13 +1268,6 @@ static int __devinit add_card(struct pci_dev *dev,
 
         /* alloc_pcl return values are not checked, it is expected that the
          * provided PCL space is sufficient for the initial allocations */
-#ifdef CONFIG_IEEE1394_PCILYNX_PORTS
-        if (lynx->aux_port != NULL) {
-                lynx->dmem_pcl = alloc_pcl(lynx);
-                aux_setup_pcls(lynx);
-                sema_init(&lynx->mem_dma_mutex, 1);
-        }
-#endif
         lynx->rcv_pcl = alloc_pcl(lynx);
         lynx->rcv_pcl_start = alloc_pcl(lynx);
         lynx->async.pcl = alloc_pcl(lynx);
@@ -1647,12 +1284,6 @@ static int __devinit add_card(struct pci_dev *dev,
 
         reg_write(lynx, PCI_INT_ENABLE, PCI_INT_DMA_ALL);
 
-#ifdef CONFIG_IEEE1394_PCILYNX_PORTS
-        reg_set_bits(lynx, PCI_INT_ENABLE, PCI_INT_AUX_INT);
-        init_waitqueue_head(&lynx->mem_dma_intr_wait);
-        init_waitqueue_head(&lynx->aux_intr_wait);
-#endif
-
        tasklet_init(&lynx->iso_rcv.tq, (void (*)(unsigned long))iso_rcv_bh,
                     (unsigned long)lynx);
 
@@ -1944,37 +1575,18 @@ static int __init pcilynx_init(void)
 {
         int ret;
 
-#ifdef CONFIG_IEEE1394_PCILYNX_PORTS
-        if (register_chrdev(PCILYNX_MAJOR, PCILYNX_DRIVER_NAME, &aux_ops)) {
-                PRINT_G(KERN_ERR, "allocation of char major number %d failed",
-                        PCILYNX_MAJOR);
-                return -EBUSY;
-        }
-#endif
-
         ret = pci_register_driver(&lynx_pci_driver);
         if (ret < 0) {
                 PRINT_G(KERN_ERR, "PCI module init failed");
-                goto free_char_dev;
+                return ret;
         }
 
         return 0;
-
- free_char_dev:
-#ifdef CONFIG_IEEE1394_PCILYNX_PORTS
-        unregister_chrdev(PCILYNX_MAJOR, PCILYNX_DRIVER_NAME);
-#endif
-
-        return ret;
 }
 
 static void __exit pcilynx_cleanup(void)
 {
         pci_unregister_driver(&lynx_pci_driver);
-
-#ifdef CONFIG_IEEE1394_PCILYNX_PORTS
-        unregister_chrdev(PCILYNX_MAJOR, PCILYNX_DRIVER_NAME);
-#endif
 }
 
 
index 644ec55d3d469b945b68f3cd51fae5651509b875..d631aa8383ada2311102469f6fb545fce1e88b70 100644 (file)
@@ -55,16 +55,6 @@ struct ti_lynx {
         void __iomem *aux_port;
        quadlet_t bus_info_block[5];
 
-#ifdef CONFIG_IEEE1394_PCILYNX_PORTS
-        atomic_t aux_intr_seen;
-        wait_queue_head_t aux_intr_wait;
-
-        void *mem_dma_buffer;
-        dma_addr_t mem_dma_buffer_dma;
-        struct semaphore mem_dma_mutex;
-        wait_queue_head_t mem_dma_intr_wait;
-#endif
-
         /*
          * use local RAM of LOCALRAM_SIZE bytes for PCLs, which allows for
          * LOCALRAM_SIZE * 8 PCLs (each sized 128 bytes);
@@ -72,11 +62,9 @@ struct ti_lynx {
          */
         u8 pcl_bmap[LOCALRAM_SIZE / 1024];
 
-#ifndef CONFIG_IEEE1394_PCILYNX_LOCALRAM
        /* point to PCLs memory area if needed */
        void *pcl_mem;
         dma_addr_t pcl_mem_dma;
-#endif
 
         /* PCLs for local mem / aux transfers */
         pcl_t dmem_pcl;
@@ -378,39 +366,6 @@ struct ti_pcl {
 #define pcloffs(MEMBER) (offsetof(struct ti_pcl, MEMBER))
 
 
-#ifdef CONFIG_IEEE1394_PCILYNX_LOCALRAM
-
-static inline void put_pcl(const struct ti_lynx *lynx, pcl_t pclid,
-                           const struct ti_pcl *pcl)
-{
-        int i;
-        u32 *in = (u32 *)pcl;
-        u32 *out = (u32 *)(lynx->local_ram + pclid * sizeof(struct ti_pcl));
-
-        for (i = 0; i < 32; i++, out++, in++) {
-                writel(*in, out);
-        }
-}
-
-static inline void get_pcl(const struct ti_lynx *lynx, pcl_t pclid,
-                           struct ti_pcl *pcl)
-{
-        int i;
-        u32 *out = (u32 *)pcl;
-        u32 *in = (u32 *)(lynx->local_ram + pclid * sizeof(struct ti_pcl));
-
-        for (i = 0; i < 32; i++, out++, in++) {
-                *out = readl(in);
-        }
-}
-
-static inline u32 pcl_bus(const struct ti_lynx *lynx, pcl_t pclid)
-{
-        return pci_resource_start(lynx->dev, 1) + pclid * sizeof(struct ti_pcl);
-}
-
-#else /* CONFIG_IEEE1394_PCILYNX_LOCALRAM */
-
 static inline void put_pcl(const struct ti_lynx *lynx, pcl_t pclid,
                            const struct ti_pcl *pcl)
 {
@@ -431,10 +386,8 @@ static inline u32 pcl_bus(const struct ti_lynx *lynx, pcl_t pclid)
         return lynx->pcl_mem_dma + pclid * sizeof(struct ti_pcl);
 }
 
-#endif /* CONFIG_IEEE1394_PCILYNX_LOCALRAM */
-
 
-#if defined (CONFIG_IEEE1394_PCILYNX_LOCALRAM) || defined (__BIG_ENDIAN)
+#if defined (__BIG_ENDIAN)
 typedef struct ti_pcl pcltmp_t;
 
 static inline struct ti_pcl *edit_pcl(const struct ti_lynx *lynx, pcl_t pclid,
index 6a08a8982ea82d5be09a1564f175624d33084162..7419af450bd119f7349fd1357978238a6535529b 100644 (file)
@@ -2901,7 +2901,7 @@ static int __init init_raw1394(void)
 
        hpsb_register_highlevel(&raw1394_highlevel);
 
-       if (IS_ERR(class_simple_device_add(hpsb_protocol_class, MKDEV(
+       if (IS_ERR(class_device_create(hpsb_protocol_class, MKDEV(
                IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_RAW1394 * 16), 
                NULL, RAW1394_DEVICE_NAME))) {
                ret = -EFAULT;
@@ -2934,8 +2934,8 @@ static int __init init_raw1394(void)
 
 out_dev:
        devfs_remove(RAW1394_DEVICE_NAME);
-       class_simple_device_remove(MKDEV(
-               IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_RAW1394 * 16));
+       class_device_destroy(hpsb_protocol_class,
+               MKDEV(IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_RAW1394 * 16));
 out_unreg:
        hpsb_unregister_highlevel(&raw1394_highlevel);
 out:
@@ -2944,8 +2944,8 @@ out:
 
 static void __exit cleanup_raw1394(void)
 {
-       class_simple_device_remove(MKDEV(
-               IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_RAW1394 * 16));
+       class_device_destroy(hpsb_protocol_class,
+               MKDEV(IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_RAW1394 * 16));
        cdev_del(&raw1394_cdev);
        devfs_remove(RAW1394_DEVICE_NAME);
        hpsb_unregister_highlevel(&raw1394_highlevel);
index 00c7b958361ada06432ffe96173b23222d591b5e..32368f3428ecfb3a425a3536e6432779e91fe619 100644 (file)
@@ -745,7 +745,8 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud
        list_add_tail(&scsi_id->scsi_list, &hi->scsi_ids);
 
        /* Register our host with the SCSI stack. */
-       scsi_host = scsi_host_alloc(&scsi_driver_template, 0);
+       scsi_host = scsi_host_alloc(&scsi_driver_template,
+                                   sizeof (unsigned long));
        if (!scsi_host) {
                SBP2_ERR("failed to register scsi host");
                goto failed_alloc;
@@ -1070,7 +1071,7 @@ static int sbp2_handle_physdma_read(struct hpsb_host *host, int nodeid, quadlet_
 static __inline__ int sbp2_command_conversion_device_type(u8 device_type)
 {
        return (((device_type == TYPE_DISK) ||
-                (device_type == TYPE_SDAD) ||
+                (device_type == TYPE_RBC) ||
                 (device_type == TYPE_ROM)) ? 1:0);
 }
 
@@ -2111,102 +2112,6 @@ static int sbp2_send_command(struct scsi_id_instance_data *scsi_id,
  */
 static void sbp2_check_sbp2_command(struct scsi_id_instance_data *scsi_id, unchar *cmd)
 {
-       unchar new_cmd[16];
-       u8 device_type = SBP2_DEVICE_TYPE (scsi_id->sbp2_device_type_and_lun);
-
-       SBP2_DEBUG("sbp2_check_sbp2_command");
-
-       switch (*cmd) {
-
-               case READ_6:
-
-                       if (sbp2_command_conversion_device_type(device_type)) {
-
-                               SBP2_DEBUG("Convert READ_6 to READ_10");
-
-                               /*
-                                * Need to turn read_6 into read_10
-                                */
-                               new_cmd[0] = 0x28;
-                               new_cmd[1] = (cmd[1] & 0xe0);
-                               new_cmd[2] = 0x0;
-                               new_cmd[3] = (cmd[1] & 0x1f);
-                               new_cmd[4] = cmd[2];
-                               new_cmd[5] = cmd[3];
-                               new_cmd[6] = 0x0;
-                               new_cmd[7] = 0x0;
-                               new_cmd[8] = cmd[4];
-                               new_cmd[9] = cmd[5];
-
-                               memcpy(cmd, new_cmd, 10);
-
-                       }
-
-                       break;
-
-               case WRITE_6:
-
-                       if (sbp2_command_conversion_device_type(device_type)) {
-
-                               SBP2_DEBUG("Convert WRITE_6 to WRITE_10");
-
-                               /*
-                                * Need to turn write_6 into write_10
-                                */
-                               new_cmd[0] = 0x2a;
-                               new_cmd[1] = (cmd[1] & 0xe0);
-                               new_cmd[2] = 0x0;
-                               new_cmd[3] = (cmd[1] & 0x1f);
-                               new_cmd[4] = cmd[2];
-                               new_cmd[5] = cmd[3];
-                               new_cmd[6] = 0x0;
-                               new_cmd[7] = 0x0;
-                               new_cmd[8] = cmd[4];
-                               new_cmd[9] = cmd[5];
-
-                               memcpy(cmd, new_cmd, 10);
-
-                       }
-
-                       break;
-
-               case MODE_SENSE:
-
-                       if (sbp2_command_conversion_device_type(device_type)) {
-
-                               SBP2_DEBUG("Convert MODE_SENSE_6 to MODE_SENSE_10");
-
-                               /*
-                                * Need to turn mode_sense_6 into mode_sense_10
-                                */
-                               new_cmd[0] = 0x5a;
-                               new_cmd[1] = cmd[1];
-                               new_cmd[2] = cmd[2];
-                               new_cmd[3] = 0x0;
-                               new_cmd[4] = 0x0;
-                               new_cmd[5] = 0x0;
-                               new_cmd[6] = 0x0;
-                               new_cmd[7] = 0x0;
-                               new_cmd[8] = cmd[4];
-                               new_cmd[9] = cmd[5];
-
-                               memcpy(cmd, new_cmd, 10);
-
-                       }
-
-                       break;
-
-               case MODE_SELECT:
-
-                       /*
-                        * TODO. Probably need to change mode select to 10 byte version
-                        */
-
-               default:
-                       break;
-       }
-
-       return;
 }
 
 /*
@@ -2247,7 +2152,6 @@ static void sbp2_check_sbp2_response(struct scsi_id_instance_data *scsi_id,
                                     struct scsi_cmnd *SCpnt)
 {
        u8 *scsi_buf = SCpnt->request_buffer;
-       u8 device_type = SBP2_DEVICE_TYPE (scsi_id->sbp2_device_type_and_lun);
 
        SBP2_DEBUG("sbp2_check_sbp2_response");
 
@@ -2271,14 +2175,6 @@ static void sbp2_check_sbp2_response(struct scsi_id_instance_data *scsi_id,
                                scsi_buf[4] = 36 - 5;
                        }
 
-                       /*
-                        * Check for Simple Direct Access Device and change it to TYPE_DISK
-                        */
-                       if ((scsi_buf[0] & 0x1f) == TYPE_SDAD) {
-                               SBP2_DEBUG("Changing TYPE_SDAD to TYPE_DISK");
-                               scsi_buf[0] &= 0xe0;
-                       }
-
                        /*
                         * Fix ansi revision and response data format
                         */
@@ -2287,27 +2183,6 @@ static void sbp2_check_sbp2_response(struct scsi_id_instance_data *scsi_id,
 
                        break;
 
-               case MODE_SENSE:
-
-                       if (sbp2_command_conversion_device_type(device_type)) {
-
-                               SBP2_DEBUG("Modify mode sense response (10 byte version)");
-
-                               scsi_buf[0] = scsi_buf[1];      /* Mode data length */
-                               scsi_buf[1] = scsi_buf[2];      /* Medium type */
-                               scsi_buf[2] = scsi_buf[3];      /* Device specific parameter */
-                               scsi_buf[3] = scsi_buf[7];      /* Block descriptor length */
-                               memcpy(scsi_buf + 4, scsi_buf + 8, scsi_buf[0]);
-                       }
-
-                       break;
-
-               case MODE_SELECT:
-
-                       /*
-                        * TODO. Probably need to change mode select to 10 byte version
-                        */
-
                default:
                        break;
        }
@@ -2579,8 +2454,6 @@ static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id,
                                      u32 scsi_status, struct scsi_cmnd *SCpnt,
                                      void (*done)(struct scsi_cmnd *))
 {
-       unsigned long flags;
-
        SBP2_DEBUG("sbp2scsi_complete_command");
 
        /*
@@ -2679,18 +2552,15 @@ static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id,
        /*
         * Tell scsi stack that we're done with this command
         */
-       spin_lock_irqsave(scsi_id->scsi_host->host_lock,flags);
        done (SCpnt);
-       spin_unlock_irqrestore(scsi_id->scsi_host->host_lock,flags);
-
-       return;
 }
 
 
 static int sbp2scsi_slave_configure (struct scsi_device *sdev)
 {
        blk_queue_dma_alignment(sdev->request_queue, (512 - 1));
-
+       sdev->use_10_for_rw = 1;
+       sdev->use_10_for_ms = 1;
        return 0;
 }
 
@@ -2746,7 +2616,7 @@ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt)
 /*
  * Called by scsi stack when something has really gone wrong.
  */
-static int sbp2scsi_reset(struct scsi_cmnd *SCpnt)
+static int __sbp2scsi_reset(struct scsi_cmnd *SCpnt)
 {
        struct scsi_id_instance_data *scsi_id =
                (struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0];
@@ -2761,12 +2631,24 @@ static int sbp2scsi_reset(struct scsi_cmnd *SCpnt)
        return(SUCCESS);
 }
 
+static int sbp2scsi_reset(struct scsi_cmnd *SCpnt)
+{
+       unsigned long flags;
+       int rc;
+
+       spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
+       rc = __sbp2scsi_reset(SCpnt);
+       spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
+
+       return rc;
+}
+
 static const char *sbp2scsi_info (struct Scsi_Host *host)
 {
         return "SCSI emulation for IEEE-1394 SBP-2 Devices";
 }
 
-static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev, char *buf)
+static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct scsi_device *sdev;
        struct scsi_id_instance_data *scsi_id;
index a84b039a05b9430ee42074e3b4fbe15d7cd8f584..cd425be74841fd41d5ede2bc8e32fdac6f6e9c7a 100644 (file)
@@ -266,10 +266,6 @@ struct sbp2_status_block {
 #define SBP2_MAX_UDS_PER_NODE          16      /* Maximum scsi devices per node */
 #define SBP2_MAX_SECTORS               255     /* Max sectors supported */
 
-#ifndef TYPE_SDAD
-#define TYPE_SDAD                      0x0e    /* simplified direct access device */
-#endif
-
 /*
  * SCSI direction table...
  * (now used as a back-up in case the direction passed down from above is "unknown")
index 4bedf7113f407e56bc1e509e255eab669cc2fe27..06759b36afea0cc87896d844e3718a35ff4f68ca 100644 (file)
  *
  */
 
+/* Markus Tavenrath <speedygoo@speedygoo.de> :
+   - fixed checks for valid buffer-numbers in video1394_icotl
+   - changed the ways the dma prg's are used, now it's possible to use
+     even a single dma buffer
+*/
 #include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
@@ -112,6 +117,7 @@ struct dma_iso_ctx {
        struct it_dma_prg **it_prg;
 
        unsigned int *buffer_status;
+       unsigned int *buffer_prg_assignment;
         struct timeval *buffer_time; /* time when the buffer was received */
        unsigned int *last_used_cmd; /* For ISO Transmit with
                                        variable sized packets only ! */
@@ -180,23 +186,14 @@ static int free_dma_iso_ctx(struct dma_iso_ctx *d)
                kfree(d->prg_reg);
        }
 
-       if (d->ir_prg)
-               kfree(d->ir_prg);
-
-       if (d->it_prg)
-               kfree(d->it_prg);
-
-       if (d->buffer_status)
-               kfree(d->buffer_status);
-       if (d->buffer_time)
-               kfree(d->buffer_time);
-       if (d->last_used_cmd)
-               kfree(d->last_used_cmd);
-       if (d->next_buffer)
-               kfree(d->next_buffer);
-
+       kfree(d->ir_prg);
+       kfree(d->it_prg);
+       kfree(d->buffer_status);
+       kfree(d->buffer_prg_assignment);
+       kfree(d->buffer_time);
+       kfree(d->last_used_cmd);
+       kfree(d->next_buffer);
        list_del(&d->link);
-
        kfree(d);
 
        return 0;
@@ -230,7 +227,7 @@ alloc_dma_iso_ctx(struct ti_ohci *ohci, int type, int num_desc,
        /* Init the regions for easy cleanup */
        dma_region_init(&d->dma);
 
-       if (dma_region_alloc(&d->dma, d->num_desc * d->buf_size, ohci->dev,
+       if (dma_region_alloc(&d->dma, (d->num_desc - 1) * d->buf_size, ohci->dev,
                             PCI_DMA_BIDIRECTIONAL)) {
                PRINT(KERN_ERR, ohci->host->id, "Failed to allocate dma buffer");
                free_dma_iso_ctx(d);
@@ -342,6 +339,8 @@ alloc_dma_iso_ctx(struct ti_ohci *ohci, int type, int num_desc,
 
        d->buffer_status = kmalloc(d->num_desc * sizeof(unsigned int),
                                   GFP_KERNEL);
+       d->buffer_prg_assignment = kmalloc(d->num_desc * sizeof(unsigned int),
+                                  GFP_KERNEL);
        d->buffer_time = kmalloc(d->num_desc * sizeof(struct timeval),
                                   GFP_KERNEL);
        d->last_used_cmd = kmalloc(d->num_desc * sizeof(unsigned int),
@@ -354,6 +353,11 @@ alloc_dma_iso_ctx(struct ti_ohci *ohci, int type, int num_desc,
                free_dma_iso_ctx(d);
                return NULL;
        }
+       if (d->buffer_prg_assignment == NULL) {
+               PRINT(KERN_ERR, ohci->host->id, "Failed to allocate buffer_prg_assignment");
+               free_dma_iso_ctx(d);
+               return NULL;
+       }
        if (d->buffer_time == NULL) {
                PRINT(KERN_ERR, ohci->host->id, "Failed to allocate buffer_time");
                free_dma_iso_ctx(d);
@@ -370,6 +374,7 @@ alloc_dma_iso_ctx(struct ti_ohci *ohci, int type, int num_desc,
                return NULL;
        }
        memset(d->buffer_status, 0, d->num_desc * sizeof(unsigned int));
+       memset(d->buffer_prg_assignment, 0, d->num_desc * sizeof(unsigned int));
        memset(d->buffer_time, 0, d->num_desc * sizeof(struct timeval));
        memset(d->last_used_cmd, 0, d->num_desc * sizeof(unsigned int));
        memset(d->next_buffer, -1, d->num_desc * sizeof(int));
@@ -379,7 +384,7 @@ alloc_dma_iso_ctx(struct ti_ohci *ohci, int type, int num_desc,
        PRINT(KERN_INFO, ohci->host->id, "Iso %s DMA: %d buffers "
              "of size %d allocated for a frame size %d, each with %d prgs",
              (type == OHCI_ISO_RECEIVE) ? "receive" : "transmit",
-             d->num_desc, d->buf_size, d->frame_size, d->nb_cmd);
+             d->num_desc - 1, d->buf_size, d->frame_size, d->nb_cmd);
 
        return d;
 }
@@ -394,11 +399,36 @@ static void reset_ir_status(struct dma_iso_ctx *d, int n)
        d->ir_prg[n][i].status = cpu_to_le32(d->left_size);
 }
 
+static void reprogram_dma_ir_prg(struct dma_iso_ctx *d, int n, int buffer, int flags)
+{
+       struct dma_cmd *ir_prg = d->ir_prg[n];
+       unsigned long buf = (unsigned long)d->dma.kvirt + buffer * d->buf_size;
+       int i;
+
+       d->buffer_prg_assignment[n] = buffer;
+
+       ir_prg[0].address = cpu_to_le32(dma_region_offset_to_bus(&d->dma, buf -
+                               (unsigned long)d->dma.kvirt));
+       ir_prg[1].address = cpu_to_le32(dma_region_offset_to_bus(&d->dma,
+                               (buf + 4) - (unsigned long)d->dma.kvirt));
+
+       for (i=2;i<d->nb_cmd-1;i++) {
+               ir_prg[i].address = cpu_to_le32(dma_region_offset_to_bus(&d->dma,
+                                               (buf+(i-1)*PAGE_SIZE) -
+                                               (unsigned long)d->dma.kvirt));
+       }
+
+       ir_prg[i].control = cpu_to_le32(DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE |
+                                 DMA_CTL_IRQ | DMA_CTL_BRANCH | d->left_size);
+       ir_prg[i].address = cpu_to_le32(dma_region_offset_to_bus(&d->dma,
+                                 (buf+(i-1)*PAGE_SIZE) - (unsigned long)d->dma.kvirt));
+}
+
 static void initialize_dma_ir_prg(struct dma_iso_ctx *d, int n, int flags)
 {
        struct dma_cmd *ir_prg = d->ir_prg[n];
        struct dma_prog_region *ir_reg = &d->prg_reg[n];
-       unsigned long buf = (unsigned long)d->dma.kvirt + n * d->buf_size;
+       unsigned long buf = (unsigned long)d->dma.kvirt;
        int i;
 
        /* the first descriptor will read only 4 bytes */
@@ -508,7 +538,7 @@ static void wakeup_dma_ir_ctx(unsigned long l)
        for (i = 0; i < d->num_desc; i++) {
                if (d->ir_prg[i][d->nb_cmd-1].status & cpu_to_le32(0xFFFF0000)) {
                        reset_ir_status(d, i);
-                       d->buffer_status[i] = VIDEO1394_BUFFER_READY;
+                       d->buffer_status[d->buffer_prg_assignment[i]] = VIDEO1394_BUFFER_READY;
                        do_gettimeofday(&d->buffer_time[i]);
                }
        }
@@ -585,7 +615,7 @@ static void wakeup_dma_it_ctx(unsigned long l)
                        int next = d->next_buffer[i];
                        put_timestamp(ohci, d, next);
                        d->it_prg[i][d->last_used_cmd[i]].end.status = 0;
-                       d->buffer_status[i] = VIDEO1394_BUFFER_READY;
+                       d->buffer_status[d->buffer_prg_assignment[i]] = VIDEO1394_BUFFER_READY;
                }
        }
 
@@ -595,11 +625,25 @@ static void wakeup_dma_it_ctx(unsigned long l)
                wake_up_interruptible(&d->waitq);
 }
 
+static void reprogram_dma_it_prg(struct dma_iso_ctx  *d, int n, int buffer)
+{
+       struct it_dma_prg *it_prg = d->it_prg[n];
+       unsigned long buf = (unsigned long)d->dma.kvirt + buffer * d->buf_size;
+       int i;
+
+       d->buffer_prg_assignment[n] = buffer;
+       for (i=0;i<d->nb_cmd;i++) {
+         it_prg[i].end.address =
+               cpu_to_le32(dma_region_offset_to_bus(&d->dma,
+                       (buf+i*d->packet_size) - (unsigned long)d->dma.kvirt));
+       }
+}
+
 static void initialize_dma_it_prg(struct dma_iso_ctx *d, int n, int sync_tag)
 {
        struct it_dma_prg *it_prg = d->it_prg[n];
        struct dma_prog_region *it_reg = &d->prg_reg[n];
-       unsigned long buf = (unsigned long)d->dma.kvirt + n * d->buf_size;
+       unsigned long buf = (unsigned long)d->dma.kvirt;
        int i;
        d->last_used_cmd[n] = d->nb_cmd - 1;
        for (i=0;i<d->nb_cmd;i++) {
@@ -796,7 +840,7 @@ static int __video1394_ioctl(struct file *file,
 
                if (cmd == VIDEO1394_IOC_LISTEN_CHANNEL) {
                        d = alloc_dma_iso_ctx(ohci, OHCI_ISO_RECEIVE,
-                                             v.nb_buffers, v.buf_size,
+                                             v.nb_buffers + 1, v.buf_size,
                                              v.channel, 0);
 
                        if (d == NULL) {
@@ -817,7 +861,7 @@ static int __video1394_ioctl(struct file *file,
                }
                else {
                        d = alloc_dma_iso_ctx(ohci, OHCI_ISO_TRANSMIT,
-                                             v.nb_buffers, v.buf_size,
+                                             v.nb_buffers + 1, v.buf_size,
                                              v.channel, v.packet_size);
 
                        if (d == NULL) {
@@ -889,6 +933,7 @@ static int __video1394_ioctl(struct file *file,
        {
                struct video1394_wait v;
                struct dma_iso_ctx *d;
+               int next_prg;
 
                if (copy_from_user(&v, argp, sizeof(v)))
                        return -EFAULT;
@@ -896,7 +941,7 @@ static int __video1394_ioctl(struct file *file,
                d = find_ctx(&ctx->context_list, OHCI_ISO_RECEIVE, v.channel);
                if (d == NULL) return -EFAULT;
 
-               if ((v.buffer<0) || (v.buffer>d->num_desc)) {
+               if ((v.buffer<0) || (v.buffer>=d->num_desc - 1)) {
                        PRINT(KERN_ERR, ohci->host->id,
                              "Buffer %d out of range",v.buffer);
                        return -EINVAL;
@@ -913,12 +958,14 @@ static int __video1394_ioctl(struct file *file,
 
                d->buffer_status[v.buffer]=VIDEO1394_BUFFER_QUEUED;
 
+               next_prg = (d->last_buffer + 1) % d->num_desc;
                if (d->last_buffer>=0)
                        d->ir_prg[d->last_buffer][d->nb_cmd-1].branchAddress =
-                               cpu_to_le32((dma_prog_region_offset_to_bus(&d->prg_reg[v.buffer], 0)
+                               cpu_to_le32((dma_prog_region_offset_to_bus(&d->prg_reg[next_prg], 0)
                                        & 0xfffffff0) | 0x1);
 
-               d->last_buffer = v.buffer;
+               d->last_buffer = next_prg;
+               reprogram_dma_ir_prg(d, d->last_buffer, v.buffer, d->flags);
 
                d->ir_prg[d->last_buffer][d->nb_cmd-1].branchAddress = 0;
 
@@ -930,7 +977,7 @@ static int __video1394_ioctl(struct file *file,
 
                        /* Tell the controller where the first program is */
                        reg_write(ohci, d->cmdPtr,
-                               dma_prog_region_offset_to_bus(&d->prg_reg[v.buffer], 0) | 0x1);
+                                 dma_prog_region_offset_to_bus(&d->prg_reg[d->last_buffer], 0) | 0x1);
 
                        /* Run IR context */
                        reg_write(ohci, d->ctrlSet, 0x8000);
@@ -951,7 +998,7 @@ static int __video1394_ioctl(struct file *file,
        {
                struct video1394_wait v;
                struct dma_iso_ctx *d;
-               int i;
+               int i = 0;
 
                if (copy_from_user(&v, argp, sizeof(v)))
                        return -EFAULT;
@@ -959,7 +1006,7 @@ static int __video1394_ioctl(struct file *file,
                d = find_ctx(&ctx->context_list, OHCI_ISO_RECEIVE, v.channel);
                if (d == NULL) return -EFAULT;
 
-               if ((v.buffer<0) || (v.buffer>d->num_desc)) {
+               if ((v.buffer<0) || (v.buffer>d->num_desc - 1)) {
                        PRINT(KERN_ERR, ohci->host->id,
                              "Buffer %d out of range",v.buffer);
                        return -EINVAL;
@@ -1005,9 +1052,9 @@ static int __video1394_ioctl(struct file *file,
                 * Look ahead to see how many more buffers have been received
                 */
                i=0;
-               while (d->buffer_status[(v.buffer+1)%d->num_desc]==
+               while (d->buffer_status[(v.buffer+1)%(d->num_desc - 1)]==
                       VIDEO1394_BUFFER_READY) {
-                       v.buffer=(v.buffer+1)%d->num_desc;
+                       v.buffer=(v.buffer+1)%(d->num_desc - 1);
                        i++;
                }
                spin_unlock_irqrestore(&d->lock, flags);
@@ -1023,6 +1070,7 @@ static int __video1394_ioctl(struct file *file,
                struct video1394_wait v;
                unsigned int *psizes = NULL;
                struct dma_iso_ctx *d;
+               int next_prg;
 
                if (copy_from_user(&v, argp, sizeof(v)))
                        return -EFAULT;
@@ -1030,7 +1078,7 @@ static int __video1394_ioctl(struct file *file,
                d = find_ctx(&ctx->context_list, OHCI_ISO_TRANSMIT, v.channel);
                if (d == NULL) return -EFAULT;
 
-               if ((v.buffer<0) || (v.buffer>d->num_desc)) {
+               if ((v.buffer<0) || (v.buffer>=d->num_desc - 1)) {
                        PRINT(KERN_ERR, ohci->host->id,
                              "Buffer %d out of range",v.buffer);
                        return -EINVAL;
@@ -1056,19 +1104,19 @@ static int __video1394_ioctl(struct file *file,
 
                spin_lock_irqsave(&d->lock,flags);
 
+               // last_buffer is last_prg
+               next_prg = (d->last_buffer + 1) % d->num_desc;
                if (d->buffer_status[v.buffer]!=VIDEO1394_BUFFER_FREE) {
                        PRINT(KERN_ERR, ohci->host->id,
                              "Buffer %d is already used",v.buffer);
                        spin_unlock_irqrestore(&d->lock,flags);
-                       if (psizes)
-                               kfree(psizes);
+                       kfree(psizes);
                        return -EBUSY;
                }
 
                if (d->flags & VIDEO1394_VARIABLE_PACKET_SIZE) {
                        initialize_dma_it_prg_var_packet_queue(
-                               d, v.buffer, psizes,
-                               ohci);
+                               d, next_prg, psizes, ohci);
                }
 
                d->buffer_status[v.buffer]=VIDEO1394_BUFFER_QUEUED;
@@ -1076,16 +1124,17 @@ static int __video1394_ioctl(struct file *file,
                if (d->last_buffer >= 0) {
                        d->it_prg[d->last_buffer]
                                [ d->last_used_cmd[d->last_buffer] ].end.branchAddress =
-                                       cpu_to_le32((dma_prog_region_offset_to_bus(&d->prg_reg[v.buffer],
+                                       cpu_to_le32((dma_prog_region_offset_to_bus(&d->prg_reg[next_prg],
                                                0) & 0xfffffff0) | 0x3);
 
                        d->it_prg[d->last_buffer]
                                [ d->last_used_cmd[d->last_buffer] ].begin.branchAddress =
-                                       cpu_to_le32((dma_prog_region_offset_to_bus(&d->prg_reg[v.buffer],
+                                       cpu_to_le32((dma_prog_region_offset_to_bus(&d->prg_reg[next_prg],
                                                0) & 0xfffffff0) | 0x3);
-                       d->next_buffer[d->last_buffer] = v.buffer;
+                       d->next_buffer[d->last_buffer] = (v.buffer + 1) % (d->num_desc - 1);
                }
-               d->last_buffer = v.buffer;
+               d->last_buffer = next_prg;
+               reprogram_dma_it_prg(d, d->last_buffer, v.buffer);
                d->next_buffer[d->last_buffer] = -1;
 
                d->it_prg[d->last_buffer][d->last_used_cmd[d->last_buffer]].end.branchAddress = 0;
@@ -1100,7 +1149,7 @@ static int __video1394_ioctl(struct file *file,
 
                        /* Tell the controller where the first program is */
                        reg_write(ohci, d->cmdPtr,
-                               dma_prog_region_offset_to_bus(&d->prg_reg[v.buffer], 0) | 0x3);
+                               dma_prog_region_offset_to_bus(&d->prg_reg[next_prg], 0) | 0x3);
 
                        /* Run IT context */
                        reg_write(ohci, d->ctrlSet, 0x8000);
@@ -1116,9 +1165,7 @@ static int __video1394_ioctl(struct file *file,
                        }
                }
 
-               if (psizes)
-                       kfree(psizes);
-
+               kfree(psizes);
                return 0;
 
        }
@@ -1133,7 +1180,7 @@ static int __video1394_ioctl(struct file *file,
                d = find_ctx(&ctx->context_list, OHCI_ISO_TRANSMIT, v.channel);
                if (d == NULL) return -EFAULT;
 
-               if ((v.buffer<0) || (v.buffer>d->num_desc)) {
+               if ((v.buffer<0) || (v.buffer>=d->num_desc-1)) {
                        PRINT(KERN_ERR, ohci->host->id,
                              "Buffer %d out of range",v.buffer);
                        return -EINVAL;
@@ -1323,7 +1370,7 @@ static void video1394_add_host (struct hpsb_host *host)
        hpsb_set_hostinfo_key(&video1394_highlevel, host, ohci->host->id);
 
        minor = IEEE1394_MINOR_BLOCK_VIDEO1394 * 16 + ohci->host->id;
-       class_simple_device_add(hpsb_protocol_class, MKDEV(
+       class_device_create(hpsb_protocol_class, MKDEV(
                IEEE1394_MAJOR, minor), 
                NULL, "%s-%d", VIDEO1394_DRIVER_NAME, ohci->host->id);
        devfs_mk_cdev(MKDEV(IEEE1394_MAJOR, minor),
@@ -1337,7 +1384,7 @@ static void video1394_remove_host (struct hpsb_host *host)
        struct ti_ohci *ohci = hpsb_get_hostinfo(&video1394_highlevel, host);
 
        if (ohci) {
-               class_simple_device_remove(MKDEV(IEEE1394_MAJOR, 
+               class_device_destroy(hpsb_protocol_class, MKDEV(IEEE1394_MAJOR,
                        IEEE1394_MINOR_BLOCK_VIDEO1394 * 16 + ohci->host->id));
                devfs_remove("%s/%d", VIDEO1394_DRIVER_NAME, ohci->host->id);
        }
index d4233ee61c35cbff8cd40a6aa8e24e22bd7ab29e..276e1a53010ddc19a312b067caccf89c3c6b6c00 100644 (file)
@@ -587,7 +587,7 @@ int ib_sa_path_rec_get(struct ib_device *device, u8 port_num,
 
        init_mad(query->sa_query.mad, agent);
 
-       query->sa_query.callback              = ib_sa_path_rec_callback;
+       query->sa_query.callback              = callback ? ib_sa_path_rec_callback : NULL;
        query->sa_query.release               = ib_sa_path_rec_release;
        query->sa_query.port                  = port;
        query->sa_query.mad->mad_hdr.method   = IB_MGMT_METHOD_GET;
@@ -663,7 +663,7 @@ int ib_sa_mcmember_rec_query(struct ib_device *device, u8 port_num,
 
        init_mad(query->sa_query.mad, agent);
 
-       query->sa_query.callback              = ib_sa_mcmember_rec_callback;
+       query->sa_query.callback              = callback ? ib_sa_mcmember_rec_callback : NULL;
        query->sa_query.release               = ib_sa_mcmember_rec_release;
        query->sa_query.port                  = port;
        query->sa_query.mad->mad_hdr.method   = method;
@@ -698,20 +698,21 @@ static void send_handler(struct ib_mad_agent *agent,
        if (!query)
                return;
 
-       switch (mad_send_wc->status) {
-       case IB_WC_SUCCESS:
-               /* No callback -- already got recv */
-               break;
-       case IB_WC_RESP_TIMEOUT_ERR:
-               query->callback(query, -ETIMEDOUT, NULL);
-               break;
-       case IB_WC_WR_FLUSH_ERR:
-               query->callback(query, -EINTR, NULL);
-               break;
-       default:
-               query->callback(query, -EIO, NULL);
-               break;
-       }
+       if (query->callback)
+               switch (mad_send_wc->status) {
+               case IB_WC_SUCCESS:
+                       /* No callback -- already got recv */
+                       break;
+               case IB_WC_RESP_TIMEOUT_ERR:
+                       query->callback(query, -ETIMEDOUT, NULL);
+                       break;
+               case IB_WC_WR_FLUSH_ERR:
+                       query->callback(query, -EINTR, NULL);
+                       break;
+               default:
+                       query->callback(query, -EIO, NULL);
+                       break;
+               }
 
        dma_unmap_single(agent->device->dma_device,
                         pci_unmap_addr(query, mapping),
@@ -736,7 +737,7 @@ static void recv_handler(struct ib_mad_agent *mad_agent,
        query = idr_find(&query_idr, mad_recv_wc->wc->wr_id);
        spin_unlock_irqrestore(&idr_lock, flags);
 
-       if (query) {
+       if (query && query->callback) {
                if (mad_recv_wc->wc->status == IB_WC_SUCCESS)
                        query->callback(query,
                                        mad_recv_wc->recv_buf.mad->mad_hdr.status ?
index 3a413f72ff6d1d311bbb896f5915512ac480a869..90d51b179abe72671603f80b5545cc919f51e841 100644 (file)
@@ -40,9 +40,7 @@ struct ib_port {
        struct kobject         kobj;
        struct ib_device      *ibdev;
        struct attribute_group gid_group;
-       struct attribute     **gid_attr;
        struct attribute_group pkey_group;
-       struct attribute     **pkey_attr;
        u8                     port_num;
 };
 
@@ -60,8 +58,9 @@ struct port_attribute port_attr_##_name = __ATTR(_name, _mode, _show, _store)
 struct port_attribute port_attr_##_name = __ATTR_RO(_name)
 
 struct port_table_attribute {
-       struct port_attribute attr;
-       int                   index;
+       struct port_attribute   attr;
+       char                    name[8];
+       int                     index;
 };
 
 static ssize_t port_attr_show(struct kobject *kobj,
@@ -72,7 +71,7 @@ static ssize_t port_attr_show(struct kobject *kobj,
        struct ib_port *p = container_of(kobj, struct ib_port, kobj);
 
        if (!port_attr->show)
-               return 0;
+               return -EIO;
 
        return port_attr->show(p, port_attr, buf);
 }
@@ -398,17 +397,16 @@ static void ib_port_release(struct kobject *kobj)
        struct attribute *a;
        int i;
 
-       for (i = 0; (a = p->gid_attr[i]); ++i) {
-               kfree(a->name);
+       for (i = 0; (a = p->gid_group.attrs[i]); ++i)
                kfree(a);
-       }
 
-       for (i = 0; (a = p->pkey_attr[i]); ++i) {
-               kfree(a->name);
+       kfree(p->gid_group.attrs);
+
+       for (i = 0; (a = p->pkey_group.attrs[i]); ++i)
                kfree(a);
-       }
 
-       kfree(p->gid_attr);
+       kfree(p->pkey_group.attrs);
+
        kfree(p);
 }
 
@@ -449,58 +447,45 @@ static int ib_device_hotplug(struct class_device *cdev, char **envp,
        return 0;
 }
 
-static int alloc_group(struct attribute ***attr,
-                      ssize_t (*show)(struct ib_port *,
-                                      struct port_attribute *, char *buf),
-                      int len)
+static struct attribute **
+alloc_group_attrs(ssize_t (*show)(struct ib_port *,
+                                 struct port_attribute *, char *buf),
+                 int len)
 {
-       struct port_table_attribute ***tab_attr =
-               (struct port_table_attribute ***) attr;
+       struct attribute **tab_attr;
+       struct port_table_attribute *element;
        int i;
-       int ret;
-
-       *tab_attr = kmalloc((1 + len) * sizeof *tab_attr, GFP_KERNEL);
-       if (!*tab_attr)
-               return -ENOMEM;
 
-       memset(*tab_attr, 0, (1 + len) * sizeof *tab_attr);
+       tab_attr = kcalloc(1 + len, sizeof(struct attribute *), GFP_KERNEL);
+       if (!tab_attr)
+               return NULL;
 
-       for (i = 0; i < len; ++i) {
-               (*tab_attr)[i] = kmalloc(sizeof *(*tab_attr)[i], GFP_KERNEL);
-               if (!(*tab_attr)[i]) {
-                       ret = -ENOMEM;
+       for (i = 0; i < len; i++) {
+               element = kcalloc(1, sizeof(struct port_table_attribute),
+                                 GFP_KERNEL);
+               if (!element)
                        goto err;
-               }
-               memset((*tab_attr)[i], 0, sizeof *(*tab_attr)[i]);
-               (*tab_attr)[i]->attr.attr.name = kmalloc(8, GFP_KERNEL);
-               if (!(*tab_attr)[i]->attr.attr.name) {
-                       ret = -ENOMEM;
-                       goto err;
-               }
 
-               if (snprintf((*tab_attr)[i]->attr.attr.name, 8, "%d", i) >= 8) {
-                       ret = -ENOMEM;
+               if (snprintf(element->name, sizeof(element->name),
+                            "%d", i) >= sizeof(element->name))
                        goto err;
-               }
 
-               (*tab_attr)[i]->attr.attr.mode  = S_IRUGO;
-               (*tab_attr)[i]->attr.attr.owner = THIS_MODULE;
-               (*tab_attr)[i]->attr.show       = show;
-               (*tab_attr)[i]->index           = i;
-       }
-
-       return 0;
+               element->attr.attr.name  = element->name;
+               element->attr.attr.mode  = S_IRUGO;
+               element->attr.attr.owner = THIS_MODULE;
+               element->attr.show       = show;
+               element->index           = i;
 
-err:
-       for (i = 0; i < len; ++i) {
-               if ((*tab_attr)[i])
-                       kfree((*tab_attr)[i]->attr.attr.name);
-               kfree((*tab_attr)[i]);
+               tab_attr[i] = &element->attr.attr;
        }
 
-       kfree(*tab_attr);
+       return tab_attr;
 
-       return ret;
+err:
+       while (--i >= 0)
+               kfree(tab_attr[i]);
+       kfree(tab_attr);
+       return NULL;
 }
 
 static int add_port(struct ib_device *device, int port_num)
@@ -541,23 +526,20 @@ static int add_port(struct ib_device *device, int port_num)
        if (ret)
                goto err_put;
 
-       ret = alloc_group(&p->gid_attr, show_port_gid, attr.gid_tbl_len);
-       if (ret)
-               goto err_remove_pma;
-
        p->gid_group.name  = "gids";
-       p->gid_group.attrs = p->gid_attr;
+       p->gid_group.attrs = alloc_group_attrs(show_port_gid, attr.gid_tbl_len);
+       if (!p->gid_group.attrs)
+               goto err_remove_pma;
 
        ret = sysfs_create_group(&p->kobj, &p->gid_group);
        if (ret)
                goto err_free_gid;
 
-       ret = alloc_group(&p->pkey_attr, show_port_pkey, attr.pkey_tbl_len);
-       if (ret)
-               goto err_remove_gid;
-
        p->pkey_group.name  = "pkeys";
-       p->pkey_group.attrs = p->pkey_attr;
+       p->pkey_group.attrs = alloc_group_attrs(show_port_pkey,
+                                               attr.pkey_tbl_len);
+       if (!p->pkey_group.attrs)
+               goto err_remove_gid;
 
        ret = sysfs_create_group(&p->kobj, &p->pkey_group);
        if (ret)
@@ -568,23 +550,19 @@ static int add_port(struct ib_device *device, int port_num)
        return 0;
 
 err_free_pkey:
-       for (i = 0; i < attr.pkey_tbl_len; ++i) {
-               kfree(p->pkey_attr[i]->name);
-               kfree(p->pkey_attr[i]);
-       }
+       for (i = 0; i < attr.pkey_tbl_len; ++i)
+               kfree(p->pkey_group.attrs[i]);
 
-       kfree(p->pkey_attr);
+       kfree(p->pkey_group.attrs);
 
 err_remove_gid:
        sysfs_remove_group(&p->kobj, &p->gid_group);
 
 err_free_gid:
-       for (i = 0; i < attr.gid_tbl_len; ++i) {
-               kfree(p->gid_attr[i]->name);
-               kfree(p->gid_attr[i]);
-       }
+       for (i = 0; i < attr.gid_tbl_len; ++i)
+               kfree(p->gid_group.attrs[i]);
 
-       kfree(p->gid_attr);
+       kfree(p->gid_group.attrs);
 
 err_remove_pma:
        sysfs_remove_group(&p->kobj, &pma_group);
index 56b9c2fa2ecccbf99399a6015a1e6f1ee3f7e650..9d912d6877ffc01ed55943b15a55ae7230f23a6a 100644 (file)
@@ -499,6 +499,7 @@ static int ib_umad_open(struct inode *inode, struct file *filp)
 static int ib_umad_close(struct inode *inode, struct file *filp)
 {
        struct ib_umad_file *file = filp->private_data;
+       struct ib_umad_packet *packet, *tmp;
        int i;
 
        for (i = 0; i < IB_UMAD_MAX_AGENTS; ++i)
@@ -507,6 +508,9 @@ static int ib_umad_close(struct inode *inode, struct file *filp)
                        ib_unregister_mad_agent(file->agent[i]);
                }
 
+       list_for_each_entry_safe(packet, tmp, &file->recv_list, list)
+               kfree(packet);
+
        kfree(file);
 
        return 0;
index f4f747707b30d462d2f5fcce2945ebac6ee9c938..00222285eb9a20ed0345784f3899fdbd8b5aa319 100644 (file)
@@ -147,7 +147,7 @@ struct ib_sa_path_rec {
        /* reserved */
        u8           sl;
        u8           mtu_selector;
-       enum ib_mtu  mtu;
+       u8           mtu;
        u8           rate_selector;
        u8           rate;
        u8           packet_life_time_selector;
@@ -180,7 +180,7 @@ struct ib_sa_mcmember_rec {
        u32          qkey;
        u16          mlid;
        u8           mtu_selector;
-       enum         ib_mtu mtu;
+       u8           mtu;
        u8           traffic_class;
        u16          pkey;
        u8           rate_selector;
index 17552a29978b862853e3bacf413547e2237e5931..556264b43425ce89a0079154c0be8479a78d0a5d 100644 (file)
@@ -431,9 +431,9 @@ static struct input_handle *evdev_connect(struct input_handler *handler, struct
 
        devfs_mk_cdev(MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor),
                        S_IFCHR|S_IRUGO|S_IWUSR, "input/event%d", minor);
-       class_simple_device_add(input_class,
-                               MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor),
-                               dev->dev, "event%d", minor);
+       class_device_create(input_class,
+                       MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor),
+                       dev->dev, "event%d", minor);
 
        return &evdev->handle;
 }
@@ -443,7 +443,8 @@ static void evdev_disconnect(struct input_handle *handle)
        struct evdev *evdev = handle->private;
        struct evdev_list *list;
 
-       class_simple_device_remove(MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + evdev->minor));
+       class_device_destroy(input_class,
+                       MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + evdev->minor));
        devfs_remove("input/event%d", evdev->minor);
        evdev->exist = 0;
 
index 6282f460aba00073cff67a3ea46acf3ff7c7feeb..1d93f50929049332e9ec2397cd67dfce9dfb2fe9 100644 (file)
@@ -68,23 +68,3 @@ config GAMEPORT_CS461X
        depends on PCI
 
 endif
-
-# Yes, SOUND_GAMEPORT looks a bit odd. Yes, it ends up being turned on
-# in every .config. Please don't touch it. It is here to handle an
-# unusual dependency between GAMEPORT and sound drivers.
-#
-# Some sound drivers call gameport functions. If GAMEPORT is
-# not selected, empty stubs are provided for the functions and all is
-# well.
-# If GAMEPORT is built in, everything is fine.
-# If GAMEPORT is a module, however, it would need to be loaded for the
-# sound driver to be able to link properly. Therefore, the sound
-# driver must be a module as well in that case. Since there's no way
-# to express that directly in Kconfig, we use SOUND_GAMEPORT to
-# express it. SOUND_GAMEPORT boils down to "if GAMEPORT is 'm',
-# anything that depends on SOUND_GAMEPORT must be 'm' as well. if
-# GAMEPORT is 'y' or 'n', it can be anything".
-config SOUND_GAMEPORT
-       tristate
-       default m if GAMEPORT=m
-       default y
index f20c3f23388b92dd78d83ac9d4e4b4ce9bd25958..e152d0fa0cdd25d4d4ac4de364eaf80b9502a0cc 100644 (file)
@@ -134,7 +134,7 @@ static int gameport_measure_speed(struct gameport *gameport)
        }
 
        gameport_close(gameport);
-       return (cpu_data[_smp_processor_id()].loops_per_jiffy * (unsigned long)HZ / (1000 / 50)) / (tx < 1 ? 1 : tx);
+       return (cpu_data[raw_smp_processor_id()].loops_per_jiffy * (unsigned long)HZ / (1000 / 50)) / (tx < 1 ? 1 : tx);
 
 #else
 
@@ -453,13 +453,13 @@ static int gameport_thread(void *nothing)
  * Gameport port operations
  */
 
-static ssize_t gameport_show_description(struct device *dev, char *buf)
+static ssize_t gameport_show_description(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct gameport *gameport = to_gameport_port(dev);
        return sprintf(buf, "%s\n", gameport->name);
 }
 
-static ssize_t gameport_rebind_driver(struct device *dev, const char *buf, size_t count)
+static ssize_t gameport_rebind_driver(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct gameport *gameport = to_gameport_port(dev);
        struct device_driver *drv;
index 3385dd03abfc17be819ce992eb8bc314eb64abc5..83c77c990ddab8b8e6a6e17e4f360d3d2d0b40d1 100644 (file)
@@ -702,13 +702,13 @@ static int __init input_proc_init(void)
 static inline int input_proc_init(void) { return 0; }
 #endif
 
-struct class_simple *input_class;
+struct class *input_class;
 
 static int __init input_init(void)
 {
        int retval = -ENOMEM;
 
-       input_class = class_simple_create(THIS_MODULE, "input");
+       input_class = class_create(THIS_MODULE, "input");
        if (IS_ERR(input_class))
                return PTR_ERR(input_class);
        input_proc_init();
@@ -718,7 +718,7 @@ static int __init input_init(void)
                remove_proc_entry("devices", proc_bus_input_dir);
                remove_proc_entry("handlers", proc_bus_input_dir);
                remove_proc_entry("input", proc_bus);
-               class_simple_destroy(input_class);
+               class_destroy(input_class);
                return retval;
        }
 
@@ -728,7 +728,7 @@ static int __init input_init(void)
                remove_proc_entry("handlers", proc_bus_input_dir);
                remove_proc_entry("input", proc_bus);
                unregister_chrdev(INPUT_MAJOR, "input");
-               class_simple_destroy(input_class);
+               class_destroy(input_class);
        }
        return retval;
 }
@@ -741,7 +741,7 @@ static void __exit input_exit(void)
 
        devfs_remove("input");
        unregister_chrdev(INPUT_MAJOR, "input");
-       class_simple_destroy(input_class);
+       class_destroy(input_class);
 }
 
 subsys_initcall(input_init);
index 7d7527f8b02dc6f832cfcde761138bbd17b9d0c8..39775fc380c77446e258fd6927760ee21974798a 100644 (file)
@@ -422,7 +422,7 @@ static struct input_handle *joydev_connect(struct input_handler *handler, struct
                        joydev->nkey++;
                }
 
-       for (i = 0; i < BTN_JOYSTICK - BTN_MISC + 1; i++)
+       for (i = 0; i < BTN_JOYSTICK - BTN_MISC; i++)
                if (test_bit(i + BTN_MISC, dev->keybit)) {
                        joydev->keymap[i] = joydev->nkey;
                        joydev->keypam[joydev->nkey] = i + BTN_MISC;
@@ -452,9 +452,9 @@ static struct input_handle *joydev_connect(struct input_handler *handler, struct
 
        devfs_mk_cdev(MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + minor),
                        S_IFCHR|S_IRUGO|S_IWUSR, "input/js%d", minor);
-       class_simple_device_add(input_class,
-                               MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + minor),
-                               dev->dev, "js%d", minor);
+       class_device_create(input_class,
+                       MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + minor),
+                       dev->dev, "js%d", minor);
 
        return &joydev->handle;
 }
@@ -464,7 +464,7 @@ static void joydev_disconnect(struct input_handle *handle)
        struct joydev *joydev = handle->private;
        struct joydev_list *list;
 
-       class_simple_device_remove(MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + joydev->minor));
+       class_device_destroy(input_class, MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + joydev->minor));
        devfs_remove("input/js%d", joydev->minor);
        joydev->exist = 0;
 
index ff66ed4ee2cd0d77a0123560b854ca9f8bfc8368..82fad9a23ace398331950e9a0ca76432206e2bf1 100644 (file)
@@ -54,7 +54,7 @@ static int atkbd_softraw = 1;
 module_param_named(softraw, atkbd_softraw, bool, 0);
 MODULE_PARM_DESC(softraw, "Use software generated rawmode");
 
-static int atkbd_scroll = 1;
+static int atkbd_scroll = 0;
 module_param_named(scroll, atkbd_scroll, bool, 0);
 MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards");
 
@@ -171,9 +171,9 @@ static struct {
        unsigned char set2;
 } atkbd_scroll_keys[] = {
        { ATKBD_SCR_1,     0xc5 },
-       { ATKBD_SCR_2,     0xa9 },
-       { ATKBD_SCR_4,     0xb6 },
-       { ATKBD_SCR_8,     0xa7 },
+       { ATKBD_SCR_2,     0x9d },
+       { ATKBD_SCR_4,     0xa4 },
+       { ATKBD_SCR_8,     0x9b },
        { ATKBD_SCR_CLICK, 0xe0 },
        { ATKBD_SCR_LEFT,  0xcb },
        { ATKBD_SCR_RIGHT, 0xd2 },
@@ -219,11 +219,11 @@ static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t
 #define ATKBD_DEFINE_ATTR(_name)                                               \
 static ssize_t atkbd_show_##_name(struct atkbd *, char *);                     \
 static ssize_t atkbd_set_##_name(struct atkbd *, const char *, size_t);                \
-static ssize_t atkbd_do_show_##_name(struct device *d, char *b)                        \
+static ssize_t atkbd_do_show_##_name(struct device *d, struct device_attribute *attr, char *b)                 \
 {                                                                              \
        return atkbd_attr_show_helper(d, b, atkbd_show_##_name);                \
 }                                                                              \
-static ssize_t atkbd_do_set_##_name(struct device *d, const char *b, size_t s) \
+static ssize_t atkbd_do_set_##_name(struct device *d, struct device_attribute *attr, const char *b, size_t s)  \
 {                                                                              \
        return atkbd_attr_set_helper(d, b, s, atkbd_set_##_name);               \
 }                                                                              \
@@ -465,8 +465,10 @@ static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int co
                        if (atkbd->softrepeat) return 0;
 
                        i = j = 0;
-                       while (i < 32 && period[i] < dev->rep[REP_PERIOD]) i++;
-                       while (j < 4 && delay[j] < dev->rep[REP_DELAY]) j++;
+                       while (i < 31 && period[i] < dev->rep[REP_PERIOD])
+                               i++;
+                       while (j < 3 && delay[j] < dev->rep[REP_DELAY])
+                               j++;
                        dev->rep[REP_PERIOD] = period[i];
                        dev->rep[REP_DELAY] = delay[j];
                        param[0] = i | (j << 5);
index 1f85a9718c89847e16053c1cae1614cd4e16a439..7bf4be733e9a89f6646ccf979503d8e4797e4400 100644 (file)
@@ -341,6 +341,8 @@ static int alps_reconnect(struct psmouse *psmouse)
        unsigned char param[4];
        int version;
 
+       psmouse_reset(psmouse);
+
        if (!(priv->i = alps_get_model(psmouse, &version)))
                return -1;
 
@@ -350,7 +352,7 @@ static int alps_reconnect(struct psmouse *psmouse)
        if (alps_get_status(psmouse, param))
                return -1;
 
-       if (param[0] & 0x04)
+       if (!(param[0] & 0x04))
                alps_tap_mode(psmouse, 1);
 
        if (alps_absolute_mode(psmouse)) {
@@ -395,7 +397,7 @@ int alps_init(struct psmouse *psmouse)
        }
 
        if (param[0] & 0x04) {
-               printk(KERN_INFO "  Enabling hardware tapping\n");
+               printk(KERN_INFO "alps.c: Enabling hardware tapping\n");
                if (alps_tap_mode(psmouse, 1))
                        printk(KERN_WARNING "alps.c: Failed to enable hardware tapping\n");
        }
index cd8509549eac60dcebfbe37144eca1eb720baa1e..019034b21a0bc91d3f0f941b05e7e495b6b69a08 100644 (file)
@@ -518,13 +518,16 @@ static int psmouse_probe(struct psmouse *psmouse)
 /*
  * First, we check if it's a mouse. It should send 0x00 or 0x03
  * in case of an IntelliMouse in 4-byte mode or 0x04 for IM Explorer.
+ * Sunrex K8561 IR Keyboard/Mouse reports 0xff on second and subsequent
+ * ID queries, probably due to a firmware bug.
  */
 
        param[0] = 0xa5;
        if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETID))
                return -1;
 
-       if (param[0] != 0x00 && param[0] != 0x03 && param[0] != 0x04)
+       if (param[0] != 0x00 && param[0] != 0x03 &&
+           param[0] != 0x04 && param[0] != 0xff)
                return -1;
 
 /*
@@ -972,7 +975,7 @@ static int psmouse_set_maxproto(const char *val, struct kernel_param *kp)
                return -EINVAL;
 
        if (!strncmp(val, "any", 3)) {
-               *((unsigned int *)kp->arg) = -1UL;
+               *((unsigned int *)kp->arg) = -1U;
                return 0;
        }
 
index bda5b065d03c5d77c1dac5121aee2fa317c07e00..79e17a0c4664b7180b9ba19217ce754967a0cfa2 100644 (file)
@@ -91,11 +91,11 @@ ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t coun
 #define PSMOUSE_DEFINE_ATTR(_name)                                             \
 static ssize_t psmouse_attr_show_##_name(struct psmouse *, char *);            \
 static ssize_t psmouse_attr_set_##_name(struct psmouse *, const char *, size_t);\
-static ssize_t psmouse_do_show_##_name(struct device *d, char *b)              \
+static ssize_t psmouse_do_show_##_name(struct device *d, struct device_attribute *attr, char *b)               \
 {                                                                              \
        return psmouse_attr_show_helper(d, b, psmouse_attr_show_##_name);       \
 }                                                                              \
-static ssize_t psmouse_do_set_##_name(struct device *d, const char *b, size_t s)\
+static ssize_t psmouse_do_set_##_name(struct device *d, struct device_attribute *attr, const char *b, size_t s)\
 {                                                                              \
        return psmouse_attr_set_helper(d, b, s, psmouse_attr_set_##_name);      \
 }                                                                              \
index 69832f8fb7202e4716e23d529a7f2ac33c8db60f..36c721227b681cfd4e28f3b7ac5cd0265c56d9b7 100644 (file)
@@ -143,39 +143,6 @@ static int synaptics_identify(struct psmouse *psmouse)
        return -1;
 }
 
-static void print_ident(struct synaptics_data *priv)
-{
-       printk(KERN_INFO "Synaptics Touchpad, model: %ld\n", SYN_ID_MODEL(priv->identity));
-       printk(KERN_INFO " Firmware: %ld.%ld\n", SYN_ID_MAJOR(priv->identity),
-              SYN_ID_MINOR(priv->identity));
-       if (SYN_MODEL_ROT180(priv->model_id))
-               printk(KERN_INFO " 180 degree mounted touchpad\n");
-       if (SYN_MODEL_PORTRAIT(priv->model_id))
-               printk(KERN_INFO " portrait touchpad\n");
-       printk(KERN_INFO " Sensor: %ld\n", SYN_MODEL_SENSOR(priv->model_id));
-       if (SYN_MODEL_NEWABS(priv->model_id))
-               printk(KERN_INFO " new absolute packet format\n");
-       if (SYN_MODEL_PEN(priv->model_id))
-               printk(KERN_INFO " pen detection\n");
-
-       if (SYN_CAP_EXTENDED(priv->capabilities)) {
-               printk(KERN_INFO " Touchpad has extended capability bits\n");
-               if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap))
-                       printk(KERN_INFO " -> %d multi-buttons, i.e. besides standard buttons\n",
-                              (int)(SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap)));
-               if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities))
-                       printk(KERN_INFO " -> middle button\n");
-               if (SYN_CAP_FOUR_BUTTON(priv->capabilities))
-                       printk(KERN_INFO " -> four buttons\n");
-               if (SYN_CAP_MULTIFINGER(priv->capabilities))
-                       printk(KERN_INFO " -> multifinger detection\n");
-               if (SYN_CAP_PALMDETECT(priv->capabilities))
-                       printk(KERN_INFO " -> palm detection\n");
-               if (SYN_CAP_PASS_THROUGH(priv->capabilities))
-                       printk(KERN_INFO " -> pass-through port\n");
-       }
-}
-
 static int synaptics_query_hardware(struct psmouse *psmouse)
 {
        int retries = 0;
@@ -666,7 +633,11 @@ int synaptics_init(struct psmouse *psmouse)
 
        priv->pkt_type = SYN_MODEL_NEWABS(priv->model_id) ? SYN_NEWABS : SYN_OLDABS;
 
-       print_ident(priv);
+       printk(KERN_INFO "Synaptics Touchpad, model: %ld, fw: %ld.%ld, id: %#lx, caps: %#lx/%#lx\n",
+               SYN_ID_MODEL(priv->identity),
+               SYN_ID_MAJOR(priv->identity), SYN_ID_MINOR(priv->identity),
+               priv->model_id, priv->capabilities, priv->ext_cap);
+
        set_input_params(&psmouse->dev, priv);
 
        psmouse->protocol_handler = synaptics_process_byte;
index 564974ce57935402ceb2e44471d727b07a056070..062848ac7e6b50f1a35f4c91b96fbe4a3d387487 100644 (file)
@@ -101,6 +101,7 @@ struct mousedev_list {
        unsigned char ready, buffer, bufsiz;
        unsigned char imexseq, impsseq;
        enum mousedev_emul mode;
+       unsigned long last_buttons;
 };
 
 #define MOUSEDEV_SEQ_LEN       6
@@ -224,7 +225,7 @@ static void mousedev_notify_readers(struct mousedev *mousedev, struct mousedev_h
                spin_lock_irqsave(&list->packet_lock, flags);
 
                p = &list->packets[list->head];
-               if (list->ready && p->buttons != packet->buttons) {
+               if (list->ready && p->buttons != mousedev->packet.buttons) {
                        unsigned int new_head = (list->head + 1) % PACKET_QUEUE_LEN;
                        if (new_head != list->tail) {
                                p = &list->packets[list->head = new_head];
@@ -249,10 +250,13 @@ static void mousedev_notify_readers(struct mousedev *mousedev, struct mousedev_h
                p->dz += packet->dz;
                p->buttons = mousedev->packet.buttons;
 
-               list->ready = 1;
+               if (p->dx || p->dy || p->dz || p->buttons != list->last_buttons)
+                       list->ready = 1;
 
                spin_unlock_irqrestore(&list->packet_lock, flags);
-               kill_fasync(&list->fasync, SIGIO, POLL_IN);
+
+               if (list->ready)
+                       kill_fasync(&list->fasync, SIGIO, POLL_IN);
        }
 
        wake_up_interruptible(&mousedev->wait);
@@ -477,9 +481,10 @@ static void mousedev_packet(struct mousedev_list *list, signed char *ps2_data)
        }
 
        if (!p->dx && !p->dy && !p->dz) {
-               if (list->tail == list->head)
+               if (list->tail == list->head) {
                        list->ready = 0;
-               else
+                       list->last_buttons = p->buttons;
+               } else
                        list->tail = (list->tail + 1) % PACKET_QUEUE_LEN;
        }
 
@@ -642,9 +647,9 @@ static struct input_handle *mousedev_connect(struct input_handler *handler, stru
 
        devfs_mk_cdev(MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + minor),
                        S_IFCHR|S_IRUGO|S_IWUSR, "input/mouse%d", minor);
-       class_simple_device_add(input_class,
-                               MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + minor),
-                               dev->dev, "mouse%d", minor);
+       class_device_create(input_class,
+                       MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + minor),
+                       dev->dev, "mouse%d", minor);
 
        return &mousedev->handle;
 }
@@ -654,7 +659,8 @@ static void mousedev_disconnect(struct input_handle *handle)
        struct mousedev *mousedev = handle->private;
        struct mousedev_list *list;
 
-       class_simple_device_remove(MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + mousedev->minor));
+       class_device_destroy(input_class,
+                       MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + mousedev->minor));
        devfs_remove("input/mouse%d", mousedev->minor);
        mousedev->exist = 0;
 
@@ -730,8 +736,8 @@ static int __init mousedev_init(void)
 
        devfs_mk_cdev(MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX),
                        S_IFCHR|S_IRUGO|S_IWUSR, "input/mice");
-       class_simple_device_add(input_class, MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX),
-                               NULL, "mice");
+       class_device_create(input_class,
+                       MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX), NULL, "mice");
 
 #ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
        if (!(psaux_registered = !misc_register(&psaux_mouse)))
@@ -750,7 +756,8 @@ static void __exit mousedev_exit(void)
                misc_deregister(&psaux_mouse);
 #endif
        devfs_remove("input/mice");
-       class_simple_device_remove(MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX));
+       class_device_destroy(input_class,
+                       MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX));
        input_unregister_handler(&mousedev_handler);
 }
 
index f64867808fea9ddde56c298e67fac8771b53f69c..0487ecbb8a49232d26b32a26c63b5e5911d31f02 100644 (file)
@@ -88,9 +88,11 @@ static struct dmi_system_id __initdata i8042_dmi_noloop_table[] = {
 };
 
 /*
- * Some Fujitsu notebooks are ahving trouble with touhcpads if
+ * Some Fujitsu notebooks are having trouble with touchpads if
  * active multiplexing mode is activated. Luckily they don't have
  * external PS/2 ports so we can safely disable it.
+ * ... apparently some Toshibas don't like MUX mode either and
+ * die horrible death on reboot.
  */
 static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
        {
@@ -114,6 +116,13 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
                        DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"),
                },
        },
+       {
+               .ident = "Fujitsu Lifebook S6230",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"),
+               },
+       },
        {
                .ident = "Fujitsu T70H",
                .matches = {
@@ -121,6 +130,13 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
                        DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"),
                },
        },
+       {
+               .ident = "Toshiba P10",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"),
+               },
+       },
        { }
 };
 
@@ -215,11 +231,15 @@ static struct pnp_driver i8042_pnp_aux_driver = {
 
 static void i8042_pnp_exit(void)
 {
-       if (i8042_pnp_kbd_registered)
+       if (i8042_pnp_kbd_registered) {
+               i8042_pnp_kbd_registered = 0;
                pnp_unregister_driver(&i8042_pnp_kbd_driver);
+       }
 
-       if (i8042_pnp_aux_registered)
+       if (i8042_pnp_aux_registered) {
+               i8042_pnp_aux_registered = 0;
                pnp_unregister_driver(&i8042_pnp_aux_driver);
+       }
 }
 
 static int i8042_pnp_init(void)
@@ -227,7 +247,7 @@ static int i8042_pnp_init(void)
        int result_kbd, result_aux;
 
        if (i8042_nopnp) {
-               printk("i8042: PNP detection disabled\n");
+               printk(KERN_INFO "i8042: PNP detection disabled\n");
                return 0;
        }
 
@@ -241,7 +261,7 @@ static int i8042_pnp_init(void)
 #if defined(__ia64__)
                return -ENODEV;
 #else
-               printk(KERN_WARNING "PNP: No PS/2 controller found. Probing ports directly.\n");
+               printk(KERN_INFO "PNP: No PS/2 controller found. Probing ports directly.\n");
                return 0;
 #endif
        }
@@ -265,7 +285,7 @@ static int i8042_pnp_init(void)
                i8042_pnp_kbd_irq = i8042_kbd_irq;
        }
 
-       if (result_aux > 0 && !i8042_pnp_aux_irq) {
+       if (!i8042_pnp_aux_irq) {
                printk(KERN_WARNING "PNP: PS/2 controller doesn't have AUX irq; using default %#x\n", i8042_aux_irq);
                i8042_pnp_aux_irq = i8042_aux_irq;
        }
index 8e63e464d361e18a7040f9c3ab52a2eff781bfa5..5900de3c3f4f04b0936d2788edf5461681dc075e 100644 (file)
@@ -698,6 +698,26 @@ static void i8042_timer_func(unsigned long data)
        i8042_interrupt(0, NULL, NULL);
 }
 
+static int i8042_ctl_test(void)
+{
+       unsigned char param;
+
+       if (!i8042_reset)
+               return 0;
+
+       if (i8042_command(&param, I8042_CMD_CTL_TEST)) {
+               printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n");
+               return -1;
+       }
+
+       if (param != I8042_RET_CTL_TEST) {
+               printk(KERN_ERR "i8042.c: i8042 controller selftest failed. (%#x != %#x)\n",
+                        param, I8042_RET_CTL_TEST);
+               return -1;
+       }
+
+       return 0;
+}
 
 /*
  * i8042_controller init initializes the i8042 controller, and,
@@ -719,21 +739,8 @@ static int i8042_controller_init(void)
                return -1;
        }
 
-       if (i8042_reset) {
-
-               unsigned char param;
-
-               if (i8042_command(&param, I8042_CMD_CTL_TEST)) {
-                       printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n");
-                       return -1;
-               }
-
-               if (param != I8042_RET_CTL_TEST) {
-                       printk(KERN_ERR "i8042.c: i8042 controller selftest failed. (%#x != %#x)\n",
-                                param, I8042_RET_CTL_TEST);
-                       return -1;
-               }
-       }
+       if (i8042_ctl_test())
+               return -1;
 
 /*
  * Save the CTR for restoral on unload / reboot.
@@ -802,15 +809,11 @@ static int i8042_controller_init(void)
  */
 static void i8042_controller_reset(void)
 {
-       unsigned char param;
-
 /*
  * Reset the controller if requested.
  */
 
-       if (i8042_reset)
-               if (i8042_command(&param, I8042_CMD_CTL_TEST))
-                       printk(KERN_ERR "i8042.c: i8042 controller reset timeout.\n");
+       i8042_ctl_test();
 
 /*
  * Disable MUX mode if present.
@@ -922,8 +925,11 @@ static int i8042_resume(struct device *dev, u32 level)
        if (level != RESUME_ENABLE)
                return 0;
 
-       if (i8042_controller_init()) {
-               printk(KERN_ERR "i8042: resume failed\n");
+       if (i8042_ctl_test())
+               return -1;
+
+       if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
+               printk(KERN_ERR "i8042: Can't write CTR\n");
                return -1;
        }
 
index 3313e2daeab022dc1d391ddc19be97bd23b286b7..feab4970406e39423711da9e9b9f55180abea9d7 100644 (file)
@@ -358,37 +358,55 @@ static int serio_thread(void *nothing)
  * Serio port operations
  */
 
-static ssize_t serio_show_description(struct device *dev, char *buf)
+static ssize_t serio_show_description(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct serio *serio = to_serio_port(dev);
        return sprintf(buf, "%s\n", serio->name);
 }
 
-static ssize_t serio_show_id_type(struct device *dev, char *buf)
+static ssize_t serio_show_id_type(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct serio *serio = to_serio_port(dev);
        return sprintf(buf, "%02x\n", serio->id.type);
 }
 
-static ssize_t serio_show_id_proto(struct device *dev, char *buf)
+static ssize_t serio_show_id_proto(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct serio *serio = to_serio_port(dev);
        return sprintf(buf, "%02x\n", serio->id.proto);
 }
 
-static ssize_t serio_show_id_id(struct device *dev, char *buf)
+static ssize_t serio_show_id_id(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct serio *serio = to_serio_port(dev);
        return sprintf(buf, "%02x\n", serio->id.id);
 }
 
-static ssize_t serio_show_id_extra(struct device *dev, char *buf)
+static ssize_t serio_show_id_extra(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct serio *serio = to_serio_port(dev);
        return sprintf(buf, "%02x\n", serio->id.extra);
 }
 
-static ssize_t serio_rebind_driver(struct device *dev, const char *buf, size_t count)
+static DEVICE_ATTR(type, S_IRUGO, serio_show_id_type, NULL);
+static DEVICE_ATTR(proto, S_IRUGO, serio_show_id_proto, NULL);
+static DEVICE_ATTR(id, S_IRUGO, serio_show_id_id, NULL);
+static DEVICE_ATTR(extra, S_IRUGO, serio_show_id_extra, NULL);
+
+static struct attribute *serio_device_id_attrs[] = {
+       &dev_attr_type.attr,
+       &dev_attr_proto.attr,
+       &dev_attr_id.attr,
+       &dev_attr_extra.attr,
+       NULL
+};
+
+static struct attribute_group serio_id_attr_group = {
+       .name   = "id",
+       .attrs  = serio_device_id_attrs,
+};
+
+static ssize_t serio_rebind_driver(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct serio *serio = to_serio_port(dev);
        struct device_driver *drv;
@@ -419,13 +437,13 @@ static ssize_t serio_rebind_driver(struct device *dev, const char *buf, size_t c
        return retval;
 }
 
-static ssize_t serio_show_bind_mode(struct device *dev, char *buf)
+static ssize_t serio_show_bind_mode(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct serio *serio = to_serio_port(dev);
        return sprintf(buf, "%s\n", serio->manual_bind ? "manual" : "auto");
 }
 
-static ssize_t serio_set_bind_mode(struct device *dev, const char *buf, size_t count)
+static ssize_t serio_set_bind_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct serio *serio = to_serio_port(dev);
        int retval;
@@ -444,10 +462,6 @@ static ssize_t serio_set_bind_mode(struct device *dev, const char *buf, size_t c
 
 static struct device_attribute serio_device_attrs[] = {
        __ATTR(description, S_IRUGO, serio_show_description, NULL),
-       __ATTR(id_type, S_IRUGO, serio_show_id_type, NULL),
-       __ATTR(id_proto, S_IRUGO, serio_show_id_proto, NULL),
-       __ATTR(id_id, S_IRUGO, serio_show_id_id, NULL),
-       __ATTR(id_extra, S_IRUGO, serio_show_id_extra, NULL),
        __ATTR(drvctl, S_IWUSR, NULL, serio_rebind_driver),
        __ATTR(bind_mode, S_IWUSR | S_IRUGO, serio_show_bind_mode, serio_set_bind_mode),
        __ATTR_NULL
@@ -498,6 +512,7 @@ static void serio_add_port(struct serio *serio)
        if (serio->start)
                serio->start(serio);
        device_add(&serio->dev);
+       sysfs_create_group(&serio->dev.kobj, &serio_id_attr_group);
        serio->registered = 1;
 }
 
@@ -526,6 +541,7 @@ static void serio_destroy_port(struct serio *serio)
        }
 
        if (serio->registered) {
+               sysfs_remove_group(&serio->dev.kobj, &serio_id_attr_group);
                device_del(&serio->dev);
                list_del_init(&serio->node);
                serio->registered = 0;
@@ -779,7 +795,6 @@ static int serio_resume(struct device *dev)
        struct serio *serio = to_serio_port(dev);
 
        if (!serio->drv || !serio->drv->reconnect || serio->drv->reconnect(serio)) {
-               serio_disconnect_port(serio);
                /*
                 * Driver re-probing can take a while, so better let kseriod
                 * deal with it.
index 22f73683952bffaa99155e16f8a3bc666bb3e770..f6b85222ba3dc9033fff294d6f45e7cc2f6986e3 100644 (file)
@@ -27,11 +27,15 @@ MODULE_LICENSE("GPL");
 MODULE_ALIAS_LDISC(N_MOUSE);
 
 #define SERPORT_BUSY   1
+#define SERPORT_ACTIVE 2
+#define SERPORT_DEAD   3
 
 struct serport {
        struct tty_struct *tty;
        wait_queue_head_t wait;
        struct serio *serio;
+       struct serio_device_id id;
+       spinlock_t lock;
        unsigned long flags;
 };
 
@@ -45,11 +49,29 @@ static int serport_serio_write(struct serio *serio, unsigned char data)
        return -(serport->tty->driver->write(serport->tty, &data, 1) != 1);
 }
 
+static int serport_serio_open(struct serio *serio)
+{
+       struct serport *serport = serio->port_data;
+       unsigned long flags;
+
+       spin_lock_irqsave(&serport->lock, flags);
+       set_bit(SERPORT_ACTIVE, &serport->flags);
+       spin_unlock_irqrestore(&serport->lock, flags);
+
+       return 0;
+}
+
+
 static void serport_serio_close(struct serio *serio)
 {
        struct serport *serport = serio->port_data;
+       unsigned long flags;
+
+       spin_lock_irqsave(&serport->lock, flags);
+       clear_bit(SERPORT_ACTIVE, &serport->flags);
+       set_bit(SERPORT_DEAD, &serport->flags);
+       spin_unlock_irqrestore(&serport->lock, flags);
 
-       serport->serio->id.type = 0;
        wake_up_interruptible(&serport->wait);
 }
 
@@ -61,36 +83,21 @@ static void serport_serio_close(struct serio *serio)
 static int serport_ldisc_open(struct tty_struct *tty)
 {
        struct serport *serport;
-       struct serio *serio;
-       char name[64];
 
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
 
-       serport = kmalloc(sizeof(struct serport), GFP_KERNEL);
-       serio = kmalloc(sizeof(struct serio), GFP_KERNEL);
-       if (unlikely(!serport || !serio)) {
-               kfree(serport);
-               kfree(serio);
+       serport = kcalloc(1, sizeof(struct serport), GFP_KERNEL);
+       if (!serport)
                return -ENOMEM;
-       }
 
-       memset(serport, 0, sizeof(struct serport));
-       serport->serio = serio;
-       set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
        serport->tty = tty;
-       tty->disc_data = serport;
-
-       memset(serio, 0, sizeof(struct serio));
-       strlcpy(serio->name, "Serial port", sizeof(serio->name));
-       snprintf(serio->phys, sizeof(serio->phys), "%s/serio0", tty_name(tty, name));
-       serio->id.type = SERIO_RS232;
-       serio->write = serport_serio_write;
-       serio->close = serport_serio_close;
-       serio->port_data = serport;
-
+       spin_lock_init(&serport->lock);
        init_waitqueue_head(&serport->wait);
 
+       tty->disc_data = serport;
+       set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
+
        return 0;
 }
 
@@ -100,7 +107,8 @@ static int serport_ldisc_open(struct tty_struct *tty)
 
 static void serport_ldisc_close(struct tty_struct *tty)
 {
-       struct serport *serport = (struct serport*) tty->disc_data;
+       struct serport *serport = (struct serport *) tty->disc_data;
+
        kfree(serport);
 }
 
@@ -116,9 +124,19 @@ static void serport_ldisc_close(struct tty_struct *tty)
 static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count)
 {
        struct serport *serport = (struct serport*) tty->disc_data;
+       unsigned long flags;
        int i;
+
+       spin_lock_irqsave(&serport->lock, flags);
+
+       if (!test_bit(SERPORT_ACTIVE, &serport->flags))
+               goto out;
+
        for (i = 0; i < count; i++)
                serio_interrupt(serport->serio, cp[i], 0, NULL);
+
+out:
+       spin_unlock_irqrestore(&serport->lock, flags);
 }
 
 /*
@@ -141,16 +159,33 @@ static int serport_ldisc_room(struct tty_struct *tty)
 static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, unsigned char __user * buf, size_t nr)
 {
        struct serport *serport = (struct serport*) tty->disc_data;
+       struct serio *serio;
        char name[64];
 
        if (test_and_set_bit(SERPORT_BUSY, &serport->flags))
                return -EBUSY;
 
+       serport->serio = serio = kcalloc(1, sizeof(struct serio), GFP_KERNEL);
+       if (!serio)
+               return -ENOMEM;
+
+       strlcpy(serio->name, "Serial port", sizeof(serio->name));
+       snprintf(serio->phys, sizeof(serio->phys), "%s/serio0", tty_name(tty, name));
+       serio->id = serport->id;
+       serio->id.type = SERIO_RS232;
+       serio->write = serport_serio_write;
+       serio->open = serport_serio_open;
+       serio->close = serport_serio_close;
+       serio->port_data = serport;
+
        serio_register_port(serport->serio);
        printk(KERN_INFO "serio: Serial port %s\n", tty_name(tty, name));
-       wait_event_interruptible(serport->wait, !serport->serio->id.type);
+
+       wait_event_interruptible(serport->wait, test_bit(SERPORT_DEAD, &serport->flags));
        serio_unregister_port(serport->serio);
+       serport->serio = NULL;
 
+       clear_bit(SERPORT_DEAD, &serport->flags);
        clear_bit(SERPORT_BUSY, &serport->flags);
 
        return 0;
@@ -163,16 +198,15 @@ static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, u
 static int serport_ldisc_ioctl(struct tty_struct * tty, struct file * file, unsigned int cmd, unsigned long arg)
 {
        struct serport *serport = (struct serport*) tty->disc_data;
-       struct serio *serio = serport->serio;
        unsigned long type;
 
        if (cmd == SPIOCSTYPE) {
                if (get_user(type, (unsigned long __user *) arg))
                        return -EFAULT;
 
-               serio->id.proto = type & 0x000000ff;
-               serio->id.id    = (type & 0x0000ff00) >> 8;
-               serio->id.extra = (type & 0x00ff0000) >> 16;
+               serport->id.proto = type & 0x000000ff;
+               serport->id.id    = (type & 0x0000ff00) >> 8;
+               serport->id.extra = (type & 0x00ff0000) >> 16;
 
                return 0;
        }
@@ -182,9 +216,13 @@ static int serport_ldisc_ioctl(struct tty_struct * tty, struct file * file, unsi
 
 static void serport_ldisc_write_wakeup(struct tty_struct * tty)
 {
-       struct serport *sp = (struct serport *) tty->disc_data;
+       struct serport *serport = (struct serport *) tty->disc_data;
+       unsigned long flags;
 
-       serio_drv_write_wakeup(sp->serio);
+       spin_lock_irqsave(&serport->lock, flags);
+       if (test_bit(SERPORT_ACTIVE, &serport->flags))
+               serio_drv_write_wakeup(serport->serio);
+       spin_unlock_irqrestore(&serport->lock, flags);
 }
 
 /*
index c9d0a153671c6a4e68dc62820e036b0faacb4bba..53a27e43dd235285d8b4c283c7c12364433ba102 100644 (file)
@@ -68,8 +68,7 @@ static void gunze_process_packet(struct gunze* gunze, struct pt_regs *regs)
 
        if (gunze->idx != GUNZE_MAX_LENGTH || gunze->data[5] != ',' ||
                (gunze->data[0] != 'T' && gunze->data[0] != 'R')) {
-               gunze->data[10] = 0;
-               printk(KERN_WARNING "gunze.c: bad packet: >%s<\n", gunze->data);
+               printk(KERN_WARNING "gunze.c: bad packet: >%.*s<\n", GUNZE_MAX_LENGTH, gunze->data);
                return;
        }
 
index d0afba85720be337f73b3beb4e1922979cf44c8f..50c63a155156a36e269ee8c40f6a8536a6bb3e08 100644 (file)
@@ -414,9 +414,9 @@ static struct input_handle *tsdev_connect(struct input_handler *handler,
                        S_IFCHR|S_IRUGO|S_IWUSR, "input/ts%d", minor);
        devfs_mk_cdev(MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + minor + TSDEV_MINORS/2),
                        S_IFCHR|S_IRUGO|S_IWUSR, "input/tsraw%d", minor);
-       class_simple_device_add(input_class,
-                               MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + minor),
-                               dev->dev, "ts%d", minor);
+       class_device_create(input_class,
+                       MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + minor),
+                       dev->dev, "ts%d", minor);
 
        return &tsdev->handle;
 }
@@ -426,7 +426,8 @@ static void tsdev_disconnect(struct input_handle *handle)
        struct tsdev *tsdev = handle->private;
        struct tsdev_list *list;
 
-       class_simple_device_remove(MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + tsdev->minor));
+       class_device_destroy(input_class,
+                       MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + tsdev->minor));
        devfs_remove("input/ts%d", tsdev->minor);
        devfs_remove("input/tsraw%d", tsdev->minor);
        tsdev->exist = 0;
index 12dee8e9fbbe068e0e481841766f8e89fd7b7ec1..04fb606b5ddd85558e02e79643d0e92791184fb7 100644 (file)
@@ -58,7 +58,7 @@ MODULE_LICENSE("GPL");
 
 /* -------- driver information -------------------------------------- */
 
-static struct class_simple *capi_class;
+static struct class *capi_class;
 
 static int capi_major = 68;            /* allocated */
 #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
@@ -1499,20 +1499,20 @@ static int __init capi_init(void)
                return -EIO;
        }
 
-       capi_class = class_simple_create(THIS_MODULE, "capi");
+       capi_class = class_create(THIS_MODULE, "capi");
        if (IS_ERR(capi_class)) {
                unregister_chrdev(capi_major, "capi20");
                return PTR_ERR(capi_class);
        }
 
-       class_simple_device_add(capi_class, MKDEV(capi_major, 0), NULL, "capi");
+       class_device_create(capi_class, MKDEV(capi_major, 0), NULL, "capi");
        devfs_mk_cdev(MKDEV(capi_major, 0), S_IFCHR | S_IRUSR | S_IWUSR,
                        "isdn/capi20");
 
 #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
        if (capinc_tty_init() < 0) {
-               class_simple_device_remove(MKDEV(capi_major, 0));
-               class_simple_destroy(capi_class);
+               class_device_destroy(capi_class, MKDEV(capi_major, 0));
+               class_destroy(capi_class);
                unregister_chrdev(capi_major, "capi20");
                return -ENOMEM;
        }
@@ -1539,8 +1539,8 @@ static void __exit capi_exit(void)
 {
        proc_exit();
 
-       class_simple_device_remove(MKDEV(capi_major, 0));
-       class_simple_destroy(capi_class);
+       class_device_destroy(capi_class, MKDEV(capi_major, 0));
+       class_destroy(capi_class);
        unregister_chrdev(capi_major, "capi20");
        devfs_remove("isdn/capi20");
 
index 7297c77f99cfbc15b3b8b03d3c36a39b93578328..493e2afa191cec0d56e92a62dfe2d13a301cbb4e 100644 (file)
@@ -77,7 +77,7 @@ static struct adb_driver *adb_driver_list[] = {
        NULL
 };
 
-static struct class_simple *adb_dev_class;
+static struct class *adb_dev_class;
 
 struct adb_driver *adb_controller;
 struct notifier_block *adb_client_list = NULL;
@@ -902,9 +902,8 @@ adbdev_init(void)
 
        devfs_mk_cdev(MKDEV(ADB_MAJOR, 0), S_IFCHR | S_IRUSR | S_IWUSR, "adb");
 
-       adb_dev_class = class_simple_create(THIS_MODULE, "adb");
-       if (IS_ERR(adb_dev_class)) {
+       adb_dev_class = class_create(THIS_MODULE, "adb");
+       if (IS_ERR(adb_dev_class))
                return;
-       }
-       class_simple_device_add(adb_dev_class, MKDEV(ADB_MAJOR, 0), NULL, "adb");
+       class_device_create(adb_dev_class, MKDEV(ADB_MAJOR, 0), NULL, "adb");
 }
index e0ac63effa5546e69eb131c31050e9f344a496ff..5ba190ce14a07dbc8a17607d5dce10bc919f8b29 100644 (file)
 #define MANUAL_MASK  0xe0
 #define AUTO_MASK    0x20
 
-static u8 TEMP_REG[3]    = {0x26, 0x25, 0x27}; /* local, cpu, gpu */
-static u8 LIMIT_REG[3]   = {0x6b, 0x6a, 0x6c}; /* local, cpu, gpu */
+static u8 TEMP_REG[3]    = {0x26, 0x25, 0x27}; /* local, sensor1, sensor2 */
+static u8 LIMIT_REG[3]   = {0x6b, 0x6a, 0x6c}; /* local, sensor1, sensor2 */
 static u8 MANUAL_MODE[2] = {0x5c, 0x5d};       
 static u8 REM_CONTROL[2] = {0x00, 0x40};
 static u8 FAN_SPEED[2]   = {0x28, 0x2a};
 static u8 FAN_SPD_SET[2] = {0x30, 0x31};
 
-static u8 default_limits_local[3] = {70, 50, 70};    /* local, cpu, gpu */
-static u8 default_limits_chip[3] = {80, 65, 80};    /* local, cpu, gpu */
+static u8 default_limits_local[3] = {70, 50, 70};    /* local, sensor1, sensor2 */
+static u8 default_limits_chip[3] = {80, 65, 80};    /* local, sensor1, sensor2 */
+static char *sensor_location[3] = {NULL, NULL, NULL};
 
 static int limit_adjust = 0;
 static int fan_speed = -1;
@@ -58,7 +59,7 @@ MODULE_DESCRIPTION("Driver for ADT746x thermostat in iBook G4 and "
 MODULE_LICENSE("GPL");
 
 module_param(limit_adjust, int, 0644);
-MODULE_PARM_DESC(limit_adjust,"Adjust maximum temperatures (50 cpu, 70 gpu) "
+MODULE_PARM_DESC(limit_adjust,"Adjust maximum temperatures (50 sensor1, 70 sensor2) "
                 "by N degrees.");
 
 module_param(fan_speed, int, 0644);
@@ -213,10 +214,10 @@ static void write_fan_speed(struct thermostat *th, int speed, int fan)
        if (th->last_speed[fan] != speed) {
                if (speed == -1)
                        printk(KERN_DEBUG "adt746x: Setting speed to automatic "
-                               "for %s fan.\n", fan?"GPU":"CPU");
+                               "for %s fan.\n", sensor_location[fan+1]);
                else
                        printk(KERN_DEBUG "adt746x: Setting speed to %d "
-                               "for %s fan.\n", speed, fan?"GPU":"CPU");
+                               "for %s fan.\n", speed, sensor_location[fan+1]);
        } else
                return;
        
@@ -300,11 +301,11 @@ static void update_fans_speed (struct thermostat *th)
                        printk(KERN_DEBUG "adt746x: setting fans speed to %d "
                                         "(limit exceeded by %d on %s) \n",
                                        new_speed, var,
-                                       fan_number?"GPU/pwr":"CPU");
+                                       sensor_location[fan_number+1]);
                        write_both_fan_speed(th, new_speed);
                        th->last_var[fan_number] = var;
                } else if (var < -2) {
-                       /* don't stop fan if GPU/power is cold and CPU is not
+                       /* don't stop fan if sensor2 is cold and sensor1 is not
                         * so cold (lastvar >= -1) */
                        if (i == 2 && lastvar < -1) {
                                if (th->last_speed[fan_number] != 0)
@@ -318,7 +319,7 @@ static void update_fans_speed (struct thermostat *th)
 
                if (started)
                        return; /* we don't want to re-stop the fan
-                               * if CPU is heating and GPU/power is not */
+                               * if sensor1 is heating and sensor2 is not */
        }
 }
 
@@ -353,7 +354,7 @@ static int monitor_task(void *arg)
 
 static void set_limit(struct thermostat *th, int i)
 {
-               /* Set CPU limit higher to avoid powerdowns */ 
+               /* Set sensor1 limit higher to avoid powerdowns */
                th->limits[i] = default_limits_chip[i] + limit_adjust;
                write_reg(th, LIMIT_REG[i], th->limits[i]);
                
@@ -454,15 +455,22 @@ static int attach_one_thermostat(struct i2c_adapter *adapter, int addr,
  * pass around to the attribute functions, so we don't really have
  * choice but implement a bunch of them...
  *
+ * FIXME, it does now...
  */
 #define BUILD_SHOW_FUNC_INT(name, data)                                \
-static ssize_t show_##name(struct device *dev, char *buf)      \
+static ssize_t show_##name(struct device *dev, struct device_attribute *attr, char *buf)       \
 {                                                              \
        return sprintf(buf, "%d\n", data);                      \
 }
 
+#define BUILD_SHOW_FUNC_STR(name, data)                                \
+static ssize_t show_##name(struct device *dev, struct device_attribute *attr, char *buf)       \
+{                                                              \
+       return sprintf(buf, "%s\n", data);                      \
+}
+
 #define BUILD_SHOW_FUNC_FAN(name, data)                                \
-static ssize_t show_##name(struct device *dev, char *buf)       \
+static ssize_t show_##name(struct device *dev, struct device_attribute *attr, char *buf)       \
 {                                                              \
        return sprintf(buf, "%d (%d rpm)\n",                    \
                thermostat->last_speed[data],                   \
@@ -471,12 +479,12 @@ static ssize_t show_##name(struct device *dev, char *buf)       \
 }
 
 #define BUILD_STORE_FUNC_DEG(name, data)                       \
-static ssize_t store_##name(struct device *dev, const char *buf, size_t n) \
+static ssize_t store_##name(struct device *dev, struct device_attribute *attr, const char *buf, size_t n) \
 {                                                              \
        int val;                                                \
        int i;                                                  \
        val = simple_strtol(buf, NULL, 10);                     \
-       printk(KERN_INFO "Adjusting limits by %d°C\n", val);    \
+       printk(KERN_INFO "Adjusting limits by %d degrees\n", val);      \
        limit_adjust = val;                                     \
        for (i=0; i < 3; i++)                                   \
                set_limit(thermostat, i);                       \
@@ -484,7 +492,7 @@ static ssize_t store_##name(struct device *dev, const char *buf, size_t n) \
 }
 
 #define BUILD_STORE_FUNC_INT(name, data)                       \
-static ssize_t store_##name(struct device *dev, const char *buf, size_t n) \
+static ssize_t store_##name(struct device *dev, struct device_attribute *attr, const char *buf, size_t n) \
 {                                                              \
        u32 val;                                                \
        val = simple_strtoul(buf, NULL, 10);                    \
@@ -495,35 +503,41 @@ static ssize_t store_##name(struct device *dev, const char *buf, size_t n) \
        return n;                                               \
 }
 
-BUILD_SHOW_FUNC_INT(cpu_temperature,    (read_reg(thermostat, TEMP_REG[1])))
-BUILD_SHOW_FUNC_INT(gpu_temperature,    (read_reg(thermostat, TEMP_REG[2])))
-BUILD_SHOW_FUNC_INT(cpu_limit,          thermostat->limits[1])
-BUILD_SHOW_FUNC_INT(gpu_limit,          thermostat->limits[2])
+BUILD_SHOW_FUNC_INT(sensor1_temperature,        (read_reg(thermostat, TEMP_REG[1])))
+BUILD_SHOW_FUNC_INT(sensor2_temperature,        (read_reg(thermostat, TEMP_REG[2])))
+BUILD_SHOW_FUNC_INT(sensor1_limit,              thermostat->limits[1])
+BUILD_SHOW_FUNC_INT(sensor2_limit,              thermostat->limits[2])
+BUILD_SHOW_FUNC_STR(sensor1_location,           sensor_location[1])
+BUILD_SHOW_FUNC_STR(sensor2_location,           sensor_location[2])
 
 BUILD_SHOW_FUNC_INT(specified_fan_speed, fan_speed)
-BUILD_SHOW_FUNC_FAN(cpu_fan_speed,      0)
-BUILD_SHOW_FUNC_FAN(gpu_fan_speed,      1)
+BUILD_SHOW_FUNC_FAN(sensor1_fan_speed,  0)
+BUILD_SHOW_FUNC_FAN(sensor2_fan_speed,  1)
 
 BUILD_STORE_FUNC_INT(specified_fan_speed,fan_speed)
 BUILD_SHOW_FUNC_INT(limit_adjust,       limit_adjust)
 BUILD_STORE_FUNC_DEG(limit_adjust,      thermostat)
                
-static DEVICE_ATTR(cpu_temperature,    S_IRUGO,
-                  show_cpu_temperature,NULL);
-static DEVICE_ATTR(gpu_temperature,    S_IRUGO,
-                  show_gpu_temperature,NULL);
-static DEVICE_ATTR(cpu_limit,          S_IRUGO,
-                  show_cpu_limit,      NULL);
-static DEVICE_ATTR(gpu_limit,          S_IRUGO,
-                  show_gpu_limit,      NULL);
+static DEVICE_ATTR(sensor1_temperature,        S_IRUGO,
+                  show_sensor1_temperature,NULL);
+static DEVICE_ATTR(sensor2_temperature,        S_IRUGO,
+                  show_sensor2_temperature,NULL);
+static DEVICE_ATTR(sensor1_limit, S_IRUGO,
+                  show_sensor1_limit,  NULL);
+static DEVICE_ATTR(sensor2_limit, S_IRUGO,
+                  show_sensor2_limit,  NULL);
+static DEVICE_ATTR(sensor1_location, S_IRUGO,
+                  show_sensor1_location, NULL);
+static DEVICE_ATTR(sensor2_location, S_IRUGO,
+                  show_sensor2_location, NULL);
 
 static DEVICE_ATTR(specified_fan_speed,        S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH,
                   show_specified_fan_speed,store_specified_fan_speed);
 
-static DEVICE_ATTR(cpu_fan_speed,      S_IRUGO,
-                  show_cpu_fan_speed,  NULL);
-static DEVICE_ATTR(gpu_fan_speed,      S_IRUGO,
-                  show_gpu_fan_speed,  NULL);
+static DEVICE_ATTR(sensor1_fan_speed,  S_IRUGO,
+                  show_sensor1_fan_speed,      NULL);
+static DEVICE_ATTR(sensor2_fan_speed,  S_IRUGO,
+                  show_sensor2_fan_speed,      NULL);
 
 static DEVICE_ATTR(limit_adjust,       S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH,
                   show_limit_adjust,   store_limit_adjust);
@@ -534,6 +548,7 @@ thermostat_init(void)
 {
        struct device_node* np;
        u32 *prop;
+       int i = 0, offset = 0;
        
        np = of_find_node_by_name(NULL, "fan");
        if (!np)
@@ -545,6 +560,12 @@ thermostat_init(void)
        else
                return -ENODEV;
 
+       prop = (u32 *)get_property(np, "hwsensor-params-version", NULL);
+       printk(KERN_INFO "adt746x: version %d (%ssupported)\n", *prop,
+                        (*prop == 1)?"":"un");
+       if (*prop != 1)
+               return -ENODEV;
+
        prop = (u32 *)get_property(np, "reg", NULL);
        if (!prop)
                return -ENODEV;
@@ -563,6 +584,23 @@ thermostat_init(void)
                         "limit_adjust: %d, fan_speed: %d\n",
                         therm_bus, therm_address, limit_adjust, fan_speed);
 
+       if (get_property(np, "hwsensor-location", NULL)) {
+               for (i = 0; i < 3; i++) {
+                       sensor_location[i] = get_property(np,
+                                       "hwsensor-location", NULL) + offset;
+
+                       if (sensor_location[i] == NULL)
+                               sensor_location[i] = "";
+
+                       printk(KERN_INFO "sensor %d: %s\n", i, sensor_location[i]);
+                       offset += strlen(sensor_location[i]) + 1;
+               }
+       } else {
+               sensor_location[0] = "?";
+               sensor_location[1] = "?";
+               sensor_location[2] = "?";
+       }
+
        of_dev = of_platform_device_create(np, "temperatures");
        
        if (of_dev == NULL) {
@@ -570,15 +608,17 @@ thermostat_init(void)
                return -ENODEV;
        }
        
-       device_create_file(&of_dev->dev, &dev_attr_cpu_temperature);
-       device_create_file(&of_dev->dev, &dev_attr_gpu_temperature);
-       device_create_file(&of_dev->dev, &dev_attr_cpu_limit);
-       device_create_file(&of_dev->dev, &dev_attr_gpu_limit);
+       device_create_file(&of_dev->dev, &dev_attr_sensor1_temperature);
+       device_create_file(&of_dev->dev, &dev_attr_sensor2_temperature);
+       device_create_file(&of_dev->dev, &dev_attr_sensor1_limit);
+       device_create_file(&of_dev->dev, &dev_attr_sensor2_limit);
+       device_create_file(&of_dev->dev, &dev_attr_sensor1_location);
+       device_create_file(&of_dev->dev, &dev_attr_sensor2_location);
        device_create_file(&of_dev->dev, &dev_attr_limit_adjust);
        device_create_file(&of_dev->dev, &dev_attr_specified_fan_speed);
-       device_create_file(&of_dev->dev, &dev_attr_cpu_fan_speed);
+       device_create_file(&of_dev->dev, &dev_attr_sensor1_fan_speed);
        if(therm_type == ADT7460)
-               device_create_file(&of_dev->dev, &dev_attr_gpu_fan_speed);
+               device_create_file(&of_dev->dev, &dev_attr_sensor2_fan_speed);
 
 #ifndef CONFIG_I2C_KEYWEST
        request_module("i2c-keywest");
@@ -591,17 +631,19 @@ static void __exit
 thermostat_exit(void)
 {
        if (of_dev) {
-               device_remove_file(&of_dev->dev, &dev_attr_cpu_temperature);
-               device_remove_file(&of_dev->dev, &dev_attr_gpu_temperature);
-               device_remove_file(&of_dev->dev, &dev_attr_cpu_limit);
-               device_remove_file(&of_dev->dev, &dev_attr_gpu_limit);
+               device_remove_file(&of_dev->dev, &dev_attr_sensor1_temperature);
+               device_remove_file(&of_dev->dev, &dev_attr_sensor2_temperature);
+               device_remove_file(&of_dev->dev, &dev_attr_sensor1_limit);
+               device_remove_file(&of_dev->dev, &dev_attr_sensor2_limit);
+               device_remove_file(&of_dev->dev, &dev_attr_sensor1_location);
+               device_remove_file(&of_dev->dev, &dev_attr_sensor2_location);
                device_remove_file(&of_dev->dev, &dev_attr_limit_adjust);
                device_remove_file(&of_dev->dev, &dev_attr_specified_fan_speed);
-               device_remove_file(&of_dev->dev, &dev_attr_cpu_fan_speed);
+               device_remove_file(&of_dev->dev, &dev_attr_sensor1_fan_speed);
 
                if(therm_type == ADT7460)
                        device_remove_file(&of_dev->dev,
-                                          &dev_attr_gpu_fan_speed);
+                                          &dev_attr_sensor2_fan_speed);
 
                of_device_unregister(of_dev);
        }
index 82336a5a547444027fd25d44d7a021d26fae1f71..feb4e2413858ca2d2b9d5bd595c26fd1a51110dd 100644 (file)
@@ -685,7 +685,7 @@ static void fetch_cpu_pumps_minmax(void)
  * the input twice... I accept patches :)
  */
 #define BUILD_SHOW_FUNC_FIX(name, data)                                \
-static ssize_t show_##name(struct device *dev, char *buf)      \
+static ssize_t show_##name(struct device *dev, struct device_attribute *attr, char *buf)       \
 {                                                              \
        ssize_t r;                                              \
        down(&driver_lock);                                     \
@@ -694,7 +694,7 @@ static ssize_t show_##name(struct device *dev, char *buf)   \
        return r;                                               \
 }
 #define BUILD_SHOW_FUNC_INT(name, data)                                \
-static ssize_t show_##name(struct device *dev, char *buf)      \
+static ssize_t show_##name(struct device *dev, struct device_attribute *attr, char *buf)       \
 {                                                              \
        return sprintf(buf, "%d", data);                        \
 }
index c153699d0f842bed724ae6aaab09bf9e35cfad97..0bdb47f08c2afa97d73d71885e70ff6dca0e1769 100644 (file)
@@ -107,13 +107,13 @@ print_temp( const char *s, int temp )
 }
 
 static ssize_t
-show_cpu_temperature( struct device *dev, char *buf )
+show_cpu_temperature( struct device *dev, struct device_attribute *attr, char *buf )
 {
        return sprintf(buf, "%d.%d\n", x.temp>>8, (x.temp & 255)*10/256 );
 }
 
 static ssize_t
-show_case_temperature( struct device *dev, char *buf )
+show_case_temperature( struct device *dev, struct device_attribute *attr, char *buf )
 {
        return sprintf(buf, "%d.%d\n", x.casetemp>>8, (x.casetemp & 255)*10/256 );
 }
index e654aa5eecd4946aa822b36659a5be8df8ced43f..b941ee220997adbc96b50b48862d0e47c687afda 100644 (file)
@@ -2421,7 +2421,7 @@ pmac_wakeup_devices(void)
 
        /* Re-enable local CPU interrupts */
        local_irq_enable();
-       mdelay(100);
+       mdelay(10);
        preempt_enable();
 
        /* Re-enable clock spreading on some machines */
@@ -2549,7 +2549,9 @@ powerbook_sleep_Core99(void)
                return ret;
        }
 
-       printk(KERN_DEBUG "HID1, before: %x\n", mfspr(SPRN_HID1));
+       /* Stop environment and ADB interrupts */
+       pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, 0);
+       pmu_wait_complete(&req);
 
        /* Tell PMU what events will wake us up */
        pmu_request(&req, NULL, 4, PMU_POWER_EVENTS, PMU_PWR_CLR_WAKEUP_EVENTS,
@@ -2591,6 +2593,9 @@ powerbook_sleep_Core99(void)
        /* Restore VIA */
        restore_via_state();
 
+       /* tweak LPJ before cpufreq is there */
+       loops_per_jiffy *= 2;
+
        /* Restore video */
        pmac_call_early_video_resume();
 
@@ -2611,7 +2616,8 @@ powerbook_sleep_Core99(void)
        pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, pmu_intr_mask);
        pmu_wait_complete(&req);
 
-       printk(KERN_DEBUG "HID1, after: %x\n", mfspr(SPRN_HID1));
+       /* Restore LPJ, cpufreq will adjust the cpu frequency */
+       loops_per_jiffy /= 2;
 
        pmac_wakeup_devices();
 
index ff9be67c2a15b9cb60ce1d11f0f8d1badea21a1e..09baa43b259975f05c3a28fe0e5f17a551418537 100644 (file)
@@ -69,7 +69,7 @@ struct bus_type mca_bus_type = {
 };
 EXPORT_SYMBOL (mca_bus_type);
 
-static ssize_t mca_show_pos_id(struct device *dev, char *buf)
+static ssize_t mca_show_pos_id(struct device *dev, struct device_attribute *attr, char *buf)
 {
        /* four digits, \n and trailing \0 */
        struct mca_device *mca_dev = to_mca_device(dev);
@@ -81,7 +81,7 @@ static ssize_t mca_show_pos_id(struct device *dev, char *buf)
                len = sprintf(buf, "none\n");
        return len;
 }
-static ssize_t mca_show_pos(struct device *dev, char *buf)
+static ssize_t mca_show_pos(struct device *dev, struct device_attribute *attr, char *buf)
 {
        /* enough for 8 two byte hex chars plus space and new line */
        int j, len=0;
index 90de9c146a5f583b683435df81f78907957687ca..d3efedf6a6ad8292d77bc3d5b0e70adff12ad3de 100644 (file)
@@ -7,6 +7,7 @@ dm-mod-objs     := dm.o dm-table.o dm-target.o dm-linear.o dm-stripe.o \
 dm-multipath-objs := dm-hw-handler.o dm-path-selector.o dm-mpath.o
 dm-snapshot-objs := dm-snap.o dm-exception-store.o
 dm-mirror-objs := dm-log.o dm-raid1.o
+md-mod-objs     := md.o bitmap.o
 raid6-objs     := raid6main.o raid6algos.o raid6recov.o raid6tables.o \
                   raid6int1.o raid6int2.o raid6int4.o \
                   raid6int8.o raid6int16.o raid6int32.o \
@@ -28,7 +29,7 @@ obj-$(CONFIG_MD_RAID5)                += raid5.o xor.o
 obj-$(CONFIG_MD_RAID6)         += raid6.o xor.o
 obj-$(CONFIG_MD_MULTIPATH)     += multipath.o
 obj-$(CONFIG_MD_FAULTY)                += faulty.o
-obj-$(CONFIG_BLK_DEV_MD)       += md.o
+obj-$(CONFIG_BLK_DEV_MD)       += md-mod.o
 obj-$(CONFIG_BLK_DEV_DM)       += dm-mod.o
 obj-$(CONFIG_DM_CRYPT)         += dm-crypt.o
 obj-$(CONFIG_DM_MULTIPATH)     += dm-multipath.o dm-round-robin.o
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
new file mode 100644 (file)
index 0000000..95980ad
--- /dev/null
@@ -0,0 +1,1586 @@
+/*
+ * bitmap.c two-level bitmap (C) Peter T. Breuer (ptb@ot.uc3m.es) 2003
+ *
+ * bitmap_create  - sets up the bitmap structure
+ * bitmap_destroy - destroys the bitmap structure
+ *
+ * additions, Copyright (C) 2003-2004, Paul Clements, SteelEye Technology, Inc.:
+ * - added disk storage for bitmap
+ * - changes to allow various bitmap chunk sizes
+ * - added bitmap daemon (to asynchronously clear bitmap bits from disk)
+ */
+
+/*
+ * Still to do:
+ *
+ * flush after percent set rather than just time based. (maybe both).
+ * wait if count gets too high, wake when it drops to half.
+ * allow bitmap to be mirrored with superblock (before or after...)
+ * allow hot-add to re-instate a current device.
+ * allow hot-add of bitmap after quiessing device
+ */
+
+#include <linux/module.h>
+#include <linux/version.h>
+#include <linux/errno.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/config.h>
+#include <linux/timer.h>
+#include <linux/sched.h>
+#include <linux/list.h>
+#include <linux/file.h>
+#include <linux/mount.h>
+#include <linux/buffer_head.h>
+#include <linux/raid/md.h>
+#include <linux/raid/bitmap.h>
+
+/* debug macros */
+
+#define DEBUG 0
+
+#if DEBUG
+/* these are for debugging purposes only! */
+
+/* define one and only one of these */
+#define INJECT_FAULTS_1 0 /* cause bitmap_alloc_page to fail always */
+#define INJECT_FAULTS_2 0 /* cause bitmap file to be kicked when first bit set*/
+#define INJECT_FAULTS_3 0 /* treat bitmap file as kicked at init time */
+#define INJECT_FAULTS_4 0 /* undef */
+#define INJECT_FAULTS_5 0 /* undef */
+#define INJECT_FAULTS_6 0
+
+/* if these are defined, the driver will fail! debug only */
+#define INJECT_FATAL_FAULT_1 0 /* fail kmalloc, causing bitmap_create to fail */
+#define INJECT_FATAL_FAULT_2 0 /* undef */
+#define INJECT_FATAL_FAULT_3 0 /* undef */
+#endif
+
+//#define DPRINTK PRINTK /* set this NULL to avoid verbose debug output */
+#define DPRINTK(x...) do { } while(0)
+
+#ifndef PRINTK
+#  if DEBUG > 0
+#    define PRINTK(x...) printk(KERN_DEBUG x)
+#  else
+#    define PRINTK(x...)
+#  endif
+#endif
+
+static inline char * bmname(struct bitmap *bitmap)
+{
+       return bitmap->mddev ? mdname(bitmap->mddev) : "mdX";
+}
+
+
+/*
+ * test if the bitmap is active
+ */
+int bitmap_active(struct bitmap *bitmap)
+{
+       unsigned long flags;
+       int res = 0;
+
+       if (!bitmap)
+               return res;
+       spin_lock_irqsave(&bitmap->lock, flags);
+       res = bitmap->flags & BITMAP_ACTIVE;
+       spin_unlock_irqrestore(&bitmap->lock, flags);
+       return res;
+}
+
+#define WRITE_POOL_SIZE 256
+/* mempool for queueing pending writes on the bitmap file */
+static void *write_pool_alloc(unsigned int gfp_flags, void *data)
+{
+       return kmalloc(sizeof(struct page_list), gfp_flags);
+}
+
+static void write_pool_free(void *ptr, void *data)
+{
+       kfree(ptr);
+}
+
+/*
+ * just a placeholder - calls kmalloc for bitmap pages
+ */
+static unsigned char *bitmap_alloc_page(struct bitmap *bitmap)
+{
+       unsigned char *page;
+
+#if INJECT_FAULTS_1
+       page = NULL;
+#else
+       page = kmalloc(PAGE_SIZE, GFP_NOIO);
+#endif
+       if (!page)
+               printk("%s: bitmap_alloc_page FAILED\n", bmname(bitmap));
+       else
+               PRINTK("%s: bitmap_alloc_page: allocated page at %p\n",
+                       bmname(bitmap), page);
+       return page;
+}
+
+/*
+ * for now just a placeholder -- just calls kfree for bitmap pages
+ */
+static void bitmap_free_page(struct bitmap *bitmap, unsigned char *page)
+{
+       PRINTK("%s: bitmap_free_page: free page %p\n", bmname(bitmap), page);
+       kfree(page);
+}
+
+/*
+ * check a page and, if necessary, allocate it (or hijack it if the alloc fails)
+ *
+ * 1) check to see if this page is allocated, if it's not then try to alloc
+ * 2) if the alloc fails, set the page's hijacked flag so we'll use the
+ *    page pointer directly as a counter
+ *
+ * if we find our page, we increment the page's refcount so that it stays
+ * allocated while we're using it
+ */
+static int bitmap_checkpage(struct bitmap *bitmap, unsigned long page, int create)
+{
+       unsigned char *mappage;
+
+       if (page >= bitmap->pages) {
+               printk(KERN_ALERT
+                       "%s: invalid bitmap page request: %lu (> %lu)\n",
+                       bmname(bitmap), page, bitmap->pages-1);
+               return -EINVAL;
+       }
+
+
+       if (bitmap->bp[page].hijacked) /* it's hijacked, don't try to alloc */
+               return 0;
+
+       if (bitmap->bp[page].map) /* page is already allocated, just return */
+               return 0;
+
+       if (!create)
+               return -ENOENT;
+
+       spin_unlock_irq(&bitmap->lock);
+
+       /* this page has not been allocated yet */
+
+       if ((mappage = bitmap_alloc_page(bitmap)) == NULL) {
+               PRINTK("%s: bitmap map page allocation failed, hijacking\n",
+                       bmname(bitmap));
+               /* failed - set the hijacked flag so that we can use the
+                * pointer as a counter */
+               spin_lock_irq(&bitmap->lock);
+               if (!bitmap->bp[page].map)
+                       bitmap->bp[page].hijacked = 1;
+               goto out;
+       }
+
+       /* got a page */
+
+       spin_lock_irq(&bitmap->lock);
+
+       /* recheck the page */
+
+       if (bitmap->bp[page].map || bitmap->bp[page].hijacked) {
+               /* somebody beat us to getting the page */
+               bitmap_free_page(bitmap, mappage);
+               return 0;
+       }
+
+       /* no page was in place and we have one, so install it */
+
+       memset(mappage, 0, PAGE_SIZE);
+       bitmap->bp[page].map = mappage;
+       bitmap->missing_pages--;
+out:
+       return 0;
+}
+
+
+/* if page is completely empty, put it back on the free list, or dealloc it */
+/* if page was hijacked, unmark the flag so it might get alloced next time */
+/* Note: lock should be held when calling this */
+static inline void bitmap_checkfree(struct bitmap *bitmap, unsigned long page)
+{
+       char *ptr;
+
+       if (bitmap->bp[page].count) /* page is still busy */
+               return;
+
+       /* page is no longer in use, it can be released */
+
+       if (bitmap->bp[page].hijacked) { /* page was hijacked, undo this now */
+               bitmap->bp[page].hijacked = 0;
+               bitmap->bp[page].map = NULL;
+               return;
+       }
+
+       /* normal case, free the page */
+
+#if 0
+/* actually ... let's not.  We will probably need the page again exactly when
+ * memory is tight and we are flusing to disk
+ */
+       return;
+#else
+       ptr = bitmap->bp[page].map;
+       bitmap->bp[page].map = NULL;
+       bitmap->missing_pages++;
+       bitmap_free_page(bitmap, ptr);
+       return;
+#endif
+}
+
+
+/*
+ * bitmap file handling - read and write the bitmap file and its superblock
+ */
+
+/* copy the pathname of a file to a buffer */
+char *file_path(struct file *file, char *buf, int count)
+{
+       struct dentry *d;
+       struct vfsmount *v;
+
+       if (!buf)
+               return NULL;
+
+       d = file->f_dentry;
+       v = file->f_vfsmnt;
+
+       buf = d_path(d, v, buf, count);
+
+       return IS_ERR(buf) ? NULL : buf;
+}
+
+/*
+ * basic page I/O operations
+ */
+
+/* IO operations when bitmap is stored near all superblocks */
+static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long index)
+{
+       /* choose a good rdev and read the page from there */
+
+       mdk_rdev_t *rdev;
+       struct list_head *tmp;
+       struct page *page = alloc_page(GFP_KERNEL);
+       sector_t target;
+
+       if (!page)
+               return ERR_PTR(-ENOMEM);
+       do {
+               ITERATE_RDEV(mddev, rdev, tmp)
+                       if (rdev->in_sync && !rdev->faulty)
+                               goto found;
+               return ERR_PTR(-EIO);
+
+       found:
+               target = (rdev->sb_offset << 1) + offset + index * (PAGE_SIZE/512);
+
+       } while (!sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ));
+
+       page->index = index;
+       return page;
+}
+
+static int write_sb_page(mddev_t *mddev, long offset, struct page *page, int wait)
+{
+       mdk_rdev_t *rdev;
+       struct list_head *tmp;
+
+       ITERATE_RDEV(mddev, rdev, tmp)
+               if (rdev->in_sync && !rdev->faulty)
+                       md_super_write(mddev, rdev,
+                                      (rdev->sb_offset<<1) + offset
+                                      + page->index * (PAGE_SIZE/512),
+                                      PAGE_SIZE,
+                                      page);
+
+       if (wait)
+               wait_event(mddev->sb_wait, atomic_read(&mddev->pending_writes)==0);
+       return 0;
+}
+
+/*
+ * write out a page to a file
+ */
+static int write_page(struct bitmap *bitmap, struct page *page, int wait)
+{
+       int ret = -ENOMEM;
+
+       if (bitmap->file == NULL)
+               return write_sb_page(bitmap->mddev, bitmap->offset, page, wait);
+
+       if (wait)
+               lock_page(page);
+       else {
+               if (TestSetPageLocked(page))
+                       return -EAGAIN; /* already locked */
+               if (PageWriteback(page)) {
+                       unlock_page(page);
+                       return -EAGAIN;
+               }
+       }
+
+       ret = page->mapping->a_ops->prepare_write(NULL, page, 0, PAGE_SIZE);
+       if (!ret)
+               ret = page->mapping->a_ops->commit_write(NULL, page, 0,
+                       PAGE_SIZE);
+       if (ret) {
+               unlock_page(page);
+               return ret;
+       }
+
+       set_page_dirty(page); /* force it to be written out */
+
+       if (!wait) {
+               /* add to list to be waited for by daemon */
+               struct page_list *item = mempool_alloc(bitmap->write_pool, GFP_NOIO);
+               item->page = page;
+               page_cache_get(page);
+               spin_lock(&bitmap->write_lock);
+               list_add(&item->list, &bitmap->complete_pages);
+               spin_unlock(&bitmap->write_lock);
+               md_wakeup_thread(bitmap->writeback_daemon);
+       }
+       return write_one_page(page, wait);
+}
+
+/* read a page from a file, pinning it into cache, and return bytes_read */
+static struct page *read_page(struct file *file, unsigned long index,
+                                       unsigned long *bytes_read)
+{
+       struct inode *inode = file->f_mapping->host;
+       struct page *page = NULL;
+       loff_t isize = i_size_read(inode);
+       unsigned long end_index = isize >> PAGE_CACHE_SHIFT;
+
+       PRINTK("read bitmap file (%dB @ %Lu)\n", (int)PAGE_CACHE_SIZE,
+                       (unsigned long long)index << PAGE_CACHE_SHIFT);
+
+       page = read_cache_page(inode->i_mapping, index,
+                       (filler_t *)inode->i_mapping->a_ops->readpage, file);
+       if (IS_ERR(page))
+               goto out;
+       wait_on_page_locked(page);
+       if (!PageUptodate(page) || PageError(page)) {
+               page_cache_release(page);
+               page = ERR_PTR(-EIO);
+               goto out;
+       }
+
+       if (index > end_index) /* we have read beyond EOF */
+               *bytes_read = 0;
+       else if (index == end_index) /* possible short read */
+               *bytes_read = isize & ~PAGE_CACHE_MASK;
+       else
+               *bytes_read = PAGE_CACHE_SIZE; /* got a full page */
+out:
+       if (IS_ERR(page))
+               printk(KERN_ALERT "md: bitmap read error: (%dB @ %Lu): %ld\n",
+                       (int)PAGE_CACHE_SIZE,
+                       (unsigned long long)index << PAGE_CACHE_SHIFT,
+                       PTR_ERR(page));
+       return page;
+}
+
+/*
+ * bitmap file superblock operations
+ */
+
+/* update the event counter and sync the superblock to disk */
+int bitmap_update_sb(struct bitmap *bitmap)
+{
+       bitmap_super_t *sb;
+       unsigned long flags;
+
+       if (!bitmap || !bitmap->mddev) /* no bitmap for this array */
+               return 0;
+       spin_lock_irqsave(&bitmap->lock, flags);
+       if (!bitmap->sb_page) { /* no superblock */
+               spin_unlock_irqrestore(&bitmap->lock, flags);
+               return 0;
+       }
+       spin_unlock_irqrestore(&bitmap->lock, flags);
+       sb = (bitmap_super_t *)kmap(bitmap->sb_page);
+       sb->events = cpu_to_le64(bitmap->mddev->events);
+       if (!bitmap->mddev->degraded)
+               sb->events_cleared = cpu_to_le64(bitmap->mddev->events);
+       kunmap(bitmap->sb_page);
+       return write_page(bitmap, bitmap->sb_page, 1);
+}
+
+/* print out the bitmap file superblock */
+void bitmap_print_sb(struct bitmap *bitmap)
+{
+       bitmap_super_t *sb;
+
+       if (!bitmap || !bitmap->sb_page)
+               return;
+       sb = (bitmap_super_t *)kmap(bitmap->sb_page);
+       printk(KERN_DEBUG "%s: bitmap file superblock:\n", bmname(bitmap));
+       printk(KERN_DEBUG "         magic: %08x\n", le32_to_cpu(sb->magic));
+       printk(KERN_DEBUG "       version: %d\n", le32_to_cpu(sb->version));
+       printk(KERN_DEBUG "          uuid: %08x.%08x.%08x.%08x\n",
+                                       *(__u32 *)(sb->uuid+0),
+                                       *(__u32 *)(sb->uuid+4),
+                                       *(__u32 *)(sb->uuid+8),
+                                       *(__u32 *)(sb->uuid+12));
+       printk(KERN_DEBUG "        events: %llu\n",
+                       (unsigned long long) le64_to_cpu(sb->events));
+       printk(KERN_DEBUG "events cleared: %llu\n",
+                       (unsigned long long) le64_to_cpu(sb->events_cleared));
+       printk(KERN_DEBUG "         state: %08x\n", le32_to_cpu(sb->state));
+       printk(KERN_DEBUG "     chunksize: %d B\n", le32_to_cpu(sb->chunksize));
+       printk(KERN_DEBUG "  daemon sleep: %ds\n", le32_to_cpu(sb->daemon_sleep));
+       printk(KERN_DEBUG "     sync size: %llu KB\n",
+                       (unsigned long long)le64_to_cpu(sb->sync_size)/2);
+       kunmap(bitmap->sb_page);
+}
+
+/* read the superblock from the bitmap file and initialize some bitmap fields */
+static int bitmap_read_sb(struct bitmap *bitmap)
+{
+       char *reason = NULL;
+       bitmap_super_t *sb;
+       unsigned long chunksize, daemon_sleep;
+       unsigned long bytes_read;
+       unsigned long long events;
+       int err = -EINVAL;
+
+       /* page 0 is the superblock, read it... */
+       if (bitmap->file)
+               bitmap->sb_page = read_page(bitmap->file, 0, &bytes_read);
+       else {
+               bitmap->sb_page = read_sb_page(bitmap->mddev, bitmap->offset, 0);
+               bytes_read = PAGE_SIZE;
+       }
+       if (IS_ERR(bitmap->sb_page)) {
+               err = PTR_ERR(bitmap->sb_page);
+               bitmap->sb_page = NULL;
+               return err;
+       }
+
+       sb = (bitmap_super_t *)kmap(bitmap->sb_page);
+
+       if (bytes_read < sizeof(*sb)) { /* short read */
+               printk(KERN_INFO "%s: bitmap file superblock truncated\n",
+                       bmname(bitmap));
+               err = -ENOSPC;
+               goto out;
+       }
+
+       chunksize = le32_to_cpu(sb->chunksize);
+       daemon_sleep = le32_to_cpu(sb->daemon_sleep);
+
+       /* verify that the bitmap-specific fields are valid */
+       if (sb->magic != cpu_to_le32(BITMAP_MAGIC))
+               reason = "bad magic";
+       else if (sb->version != cpu_to_le32(BITMAP_MAJOR))
+               reason = "unrecognized superblock version";
+       else if (chunksize < 512 || chunksize > (1024 * 1024 * 4))
+               reason = "bitmap chunksize out of range (512B - 4MB)";
+       else if ((1 << ffz(~chunksize)) != chunksize)
+               reason = "bitmap chunksize not a power of 2";
+       else if (daemon_sleep < 1 || daemon_sleep > 15)
+               reason = "daemon sleep period out of range";
+       if (reason) {
+               printk(KERN_INFO "%s: invalid bitmap file superblock: %s\n",
+                       bmname(bitmap), reason);
+               goto out;
+       }
+
+       /* keep the array size field of the bitmap superblock up to date */
+       sb->sync_size = cpu_to_le64(bitmap->mddev->resync_max_sectors);
+
+       if (!bitmap->mddev->persistent)
+               goto success;
+
+       /*
+        * if we have a persistent array superblock, compare the
+        * bitmap's UUID and event counter to the mddev's
+        */
+       if (memcmp(sb->uuid, bitmap->mddev->uuid, 16)) {
+               printk(KERN_INFO "%s: bitmap superblock UUID mismatch\n",
+                       bmname(bitmap));
+               goto out;
+       }
+       events = le64_to_cpu(sb->events);
+       if (events < bitmap->mddev->events) {
+               printk(KERN_INFO "%s: bitmap file is out of date (%llu < %llu) "
+                       "-- forcing full recovery\n", bmname(bitmap), events,
+                       (unsigned long long) bitmap->mddev->events);
+               sb->state |= BITMAP_STALE;
+       }
+success:
+       /* assign fields using values from superblock */
+       bitmap->chunksize = chunksize;
+       bitmap->daemon_sleep = daemon_sleep;
+       bitmap->flags |= sb->state;
+       bitmap->events_cleared = le64_to_cpu(sb->events_cleared);
+       err = 0;
+out:
+       kunmap(bitmap->sb_page);
+       if (err)
+               bitmap_print_sb(bitmap);
+       return err;
+}
+
+enum bitmap_mask_op {
+       MASK_SET,
+       MASK_UNSET
+};
+
+/* record the state of the bitmap in the superblock */
+static void bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits,
+                               enum bitmap_mask_op op)
+{
+       bitmap_super_t *sb;
+       unsigned long flags;
+
+       spin_lock_irqsave(&bitmap->lock, flags);
+       if (!bitmap || !bitmap->sb_page) { /* can't set the state */
+               spin_unlock_irqrestore(&bitmap->lock, flags);
+               return;
+       }
+       page_cache_get(bitmap->sb_page);
+       spin_unlock_irqrestore(&bitmap->lock, flags);
+       sb = (bitmap_super_t *)kmap(bitmap->sb_page);
+       switch (op) {
+               case MASK_SET: sb->state |= bits;
+                               break;
+               case MASK_UNSET: sb->state &= ~bits;
+                               break;
+               default: BUG();
+       }
+       kunmap(bitmap->sb_page);
+       page_cache_release(bitmap->sb_page);
+}
+
+/*
+ * general bitmap file operations
+ */
+
+/* calculate the index of the page that contains this bit */
+static inline unsigned long file_page_index(unsigned long chunk)
+{
+       return CHUNK_BIT_OFFSET(chunk) >> PAGE_BIT_SHIFT;
+}
+
+/* calculate the (bit) offset of this bit within a page */
+static inline unsigned long file_page_offset(unsigned long chunk)
+{
+       return CHUNK_BIT_OFFSET(chunk) & (PAGE_BITS - 1);
+}
+
+/*
+ * return a pointer to the page in the filemap that contains the given bit
+ *
+ * this lookup is complicated by the fact that the bitmap sb might be exactly
+ * 1 page (e.g., x86) or less than 1 page -- so the bitmap might start on page
+ * 0 or page 1
+ */
+static inline struct page *filemap_get_page(struct bitmap *bitmap,
+                                       unsigned long chunk)
+{
+       return bitmap->filemap[file_page_index(chunk) - file_page_index(0)];
+}
+
+
+static void bitmap_file_unmap(struct bitmap *bitmap)
+{
+       struct page **map, *sb_page;
+       unsigned long *attr;
+       int pages;
+       unsigned long flags;
+
+       spin_lock_irqsave(&bitmap->lock, flags);
+       map = bitmap->filemap;
+       bitmap->filemap = NULL;
+       attr = bitmap->filemap_attr;
+       bitmap->filemap_attr = NULL;
+       pages = bitmap->file_pages;
+       bitmap->file_pages = 0;
+       sb_page = bitmap->sb_page;
+       bitmap->sb_page = NULL;
+       spin_unlock_irqrestore(&bitmap->lock, flags);
+
+       while (pages--)
+               if (map[pages]->index != 0) /* 0 is sb_page, release it below */
+                       page_cache_release(map[pages]);
+       kfree(map);
+       kfree(attr);
+
+       if (sb_page)
+               page_cache_release(sb_page);
+}
+
+static void bitmap_stop_daemons(struct bitmap *bitmap);
+
+/* dequeue the next item in a page list -- don't call from irq context */
+static struct page_list *dequeue_page(struct bitmap *bitmap)
+{
+       struct page_list *item = NULL;
+       struct list_head *head = &bitmap->complete_pages;
+
+       spin_lock(&bitmap->write_lock);
+       if (list_empty(head))
+               goto out;
+       item = list_entry(head->prev, struct page_list, list);
+       list_del(head->prev);
+out:
+       spin_unlock(&bitmap->write_lock);
+       return item;
+}
+
+static void drain_write_queues(struct bitmap *bitmap)
+{
+       struct page_list *item;
+
+       while ((item = dequeue_page(bitmap))) {
+               /* don't bother to wait */
+               page_cache_release(item->page);
+               mempool_free(item, bitmap->write_pool);
+       }
+
+       wake_up(&bitmap->write_wait);
+}
+
+static void bitmap_file_put(struct bitmap *bitmap)
+{
+       struct file *file;
+       struct inode *inode;
+       unsigned long flags;
+
+       spin_lock_irqsave(&bitmap->lock, flags);
+       file = bitmap->file;
+       bitmap->file = NULL;
+       spin_unlock_irqrestore(&bitmap->lock, flags);
+
+       bitmap_stop_daemons(bitmap);
+
+       drain_write_queues(bitmap);
+
+       bitmap_file_unmap(bitmap);
+
+       if (file) {
+               inode = file->f_mapping->host;
+               spin_lock(&inode->i_lock);
+               atomic_set(&inode->i_writecount, 1); /* allow writes again */
+               spin_unlock(&inode->i_lock);
+               fput(file);
+       }
+}
+
+
+/*
+ * bitmap_file_kick - if an error occurs while manipulating the bitmap file
+ * then it is no longer reliable, so we stop using it and we mark the file
+ * as failed in the superblock
+ */
+static void bitmap_file_kick(struct bitmap *bitmap)
+{
+       char *path, *ptr = NULL;
+
+       bitmap_mask_state(bitmap, BITMAP_STALE, MASK_SET);
+       bitmap_update_sb(bitmap);
+
+       if (bitmap->file) {
+               path = kmalloc(PAGE_SIZE, GFP_KERNEL);
+               if (path)
+                       ptr = file_path(bitmap->file, path, PAGE_SIZE);
+
+               printk(KERN_ALERT "%s: kicking failed bitmap file %s from array!\n",
+                      bmname(bitmap), ptr ? ptr : "");
+
+               kfree(path);
+       }
+
+       bitmap_file_put(bitmap);
+
+       return;
+}
+
+enum bitmap_page_attr {
+       BITMAP_PAGE_DIRTY = 1, // there are set bits that need to be synced
+       BITMAP_PAGE_CLEAN = 2, // there are bits that might need to be cleared
+       BITMAP_PAGE_NEEDWRITE=4, // there are cleared bits that need to be synced
+};
+
+static inline void set_page_attr(struct bitmap *bitmap, struct page *page,
+                               enum bitmap_page_attr attr)
+{
+       bitmap->filemap_attr[page->index] |= attr;
+}
+
+static inline void clear_page_attr(struct bitmap *bitmap, struct page *page,
+                               enum bitmap_page_attr attr)
+{
+       bitmap->filemap_attr[page->index] &= ~attr;
+}
+
+static inline unsigned long get_page_attr(struct bitmap *bitmap, struct page *page)
+{
+       return bitmap->filemap_attr[page->index];
+}
+
+/*
+ * bitmap_file_set_bit -- called before performing a write to the md device
+ * to set (and eventually sync) a particular bit in the bitmap file
+ *
+ * we set the bit immediately, then we record the page number so that
+ * when an unplug occurs, we can flush the dirty pages out to disk
+ */
+static void bitmap_file_set_bit(struct bitmap *bitmap, sector_t block)
+{
+       unsigned long bit;
+       struct page *page;
+       void *kaddr;
+       unsigned long chunk = block >> CHUNK_BLOCK_SHIFT(bitmap);
+
+       if (!bitmap->filemap) {
+               return;
+       }
+
+       page = filemap_get_page(bitmap, chunk);
+       bit = file_page_offset(chunk);
+
+
+       /* make sure the page stays cached until it gets written out */
+       if (! (get_page_attr(bitmap, page) & BITMAP_PAGE_DIRTY))
+               page_cache_get(page);
+
+       /* set the bit */
+       kaddr = kmap_atomic(page, KM_USER0);
+       set_bit(bit, kaddr);
+       kunmap_atomic(kaddr, KM_USER0);
+       PRINTK("set file bit %lu page %lu\n", bit, page->index);
+
+       /* record page number so it gets flushed to disk when unplug occurs */
+       set_page_attr(bitmap, page, BITMAP_PAGE_DIRTY);
+
+}
+
+/* this gets called when the md device is ready to unplug its underlying
+ * (slave) device queues -- before we let any writes go down, we need to
+ * sync the dirty pages of the bitmap file to disk */
+int bitmap_unplug(struct bitmap *bitmap)
+{
+       unsigned long i, attr, flags;
+       struct page *page;
+       int wait = 0;
+       int err;
+
+       if (!bitmap)
+               return 0;
+
+       /* look at each page to see if there are any set bits that need to be
+        * flushed out to disk */
+       for (i = 0; i < bitmap->file_pages; i++) {
+               spin_lock_irqsave(&bitmap->lock, flags);
+               if (!bitmap->filemap) {
+                       spin_unlock_irqrestore(&bitmap->lock, flags);
+                       return 0;
+               }
+               page = bitmap->filemap[i];
+               attr = get_page_attr(bitmap, page);
+               clear_page_attr(bitmap, page, BITMAP_PAGE_DIRTY);
+               clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE);
+               if ((attr & BITMAP_PAGE_DIRTY))
+                       wait = 1;
+               spin_unlock_irqrestore(&bitmap->lock, flags);
+
+               if (attr & (BITMAP_PAGE_DIRTY | BITMAP_PAGE_NEEDWRITE)) {
+                       err = write_page(bitmap, page, 0);
+                       if (err == -EAGAIN) {
+                               if (attr & BITMAP_PAGE_DIRTY)
+                                       err = write_page(bitmap, page, 1);
+                               else
+                                       err = 0;
+                       }
+                       if (err)
+                               return 1;
+               }
+       }
+       if (wait) { /* if any writes were performed, we need to wait on them */
+               if (bitmap->file) {
+                       spin_lock_irq(&bitmap->write_lock);
+                       wait_event_lock_irq(bitmap->write_wait,
+                                           list_empty(&bitmap->complete_pages), bitmap->write_lock,
+                                           wake_up_process(bitmap->writeback_daemon->tsk));
+                       spin_unlock_irq(&bitmap->write_lock);
+               } else
+                       wait_event(bitmap->mddev->sb_wait,
+                                  atomic_read(&bitmap->mddev->pending_writes)==0);
+       }
+       return 0;
+}
+
+static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset,
+       unsigned long sectors, int in_sync);
+/* * bitmap_init_from_disk -- called at bitmap_create time to initialize
+ * the in-memory bitmap from the on-disk bitmap -- also, sets up the
+ * memory mapping of the bitmap file
+ * Special cases:
+ *   if there's no bitmap file, or if the bitmap file had been
+ *   previously kicked from the array, we mark all the bits as
+ *   1's in order to cause a full resync.
+ */
+static int bitmap_init_from_disk(struct bitmap *bitmap, int in_sync)
+{
+       unsigned long i, chunks, index, oldindex, bit;
+       struct page *page = NULL, *oldpage = NULL;
+       unsigned long num_pages, bit_cnt = 0;
+       struct file *file;
+       unsigned long bytes, offset, dummy;
+       int outofdate;
+       int ret = -ENOSPC;
+
+       chunks = bitmap->chunks;
+       file = bitmap->file;
+
+       BUG_ON(!file && !bitmap->offset);
+
+#if INJECT_FAULTS_3
+       outofdate = 1;
+#else
+       outofdate = bitmap->flags & BITMAP_STALE;
+#endif
+       if (outofdate)
+               printk(KERN_INFO "%s: bitmap file is out of date, doing full "
+                       "recovery\n", bmname(bitmap));
+
+       bytes = (chunks + 7) / 8;
+
+       num_pages = (bytes + sizeof(bitmap_super_t) + PAGE_SIZE - 1) / PAGE_SIZE;
+
+       if (file && i_size_read(file->f_mapping->host) < bytes + sizeof(bitmap_super_t)) {
+               printk(KERN_INFO "%s: bitmap file too short %lu < %lu\n",
+                       bmname(bitmap),
+                       (unsigned long) i_size_read(file->f_mapping->host),
+                       bytes + sizeof(bitmap_super_t));
+               goto out;
+       }
+
+       ret = -ENOMEM;
+
+       bitmap->filemap = kmalloc(sizeof(struct page *) * num_pages, GFP_KERNEL);
+       if (!bitmap->filemap)
+               goto out;
+
+       bitmap->filemap_attr = kmalloc(sizeof(long) * num_pages, GFP_KERNEL);
+       if (!bitmap->filemap_attr)
+               goto out;
+
+       memset(bitmap->filemap_attr, 0, sizeof(long) * num_pages);
+
+       oldindex = ~0L;
+
+       for (i = 0; i < chunks; i++) {
+               index = file_page_index(i);
+               bit = file_page_offset(i);
+               if (index != oldindex) { /* this is a new page, read it in */
+                       /* unmap the old page, we're done with it */
+                       if (oldpage != NULL)
+                               kunmap(oldpage);
+                       if (index == 0) {
+                               /*
+                                * if we're here then the superblock page
+                                * contains some bits (PAGE_SIZE != sizeof sb)
+                                * we've already read it in, so just use it
+                                */
+                               page = bitmap->sb_page;
+                               offset = sizeof(bitmap_super_t);
+                       } else if (file) {
+                               page = read_page(file, index, &dummy);
+                               offset = 0;
+                       } else {
+                               page = read_sb_page(bitmap->mddev, bitmap->offset, index);
+                               offset = 0;
+                       }
+                       if (IS_ERR(page)) { /* read error */
+                               ret = PTR_ERR(page);
+                               goto out;
+                       }
+
+                       oldindex = index;
+                       oldpage = page;
+                       kmap(page);
+
+                       if (outofdate) {
+                               /*
+                                * if bitmap is out of date, dirty the
+                                * whole page and write it out
+                                */
+                               memset(page_address(page) + offset, 0xff,
+                                       PAGE_SIZE - offset);
+                               ret = write_page(bitmap, page, 1);
+                               if (ret) {
+                                       kunmap(page);
+                                       /* release, page not in filemap yet */
+                                       page_cache_release(page);
+                                       goto out;
+                               }
+                       }
+
+                       bitmap->filemap[bitmap->file_pages++] = page;
+               }
+               if (test_bit(bit, page_address(page))) {
+                       /* if the disk bit is set, set the memory bit */
+                       bitmap_set_memory_bits(bitmap,
+                                       i << CHUNK_BLOCK_SHIFT(bitmap), 1, in_sync);
+                       bit_cnt++;
+               }
+       }
+
+       /* everything went OK */
+       ret = 0;
+       bitmap_mask_state(bitmap, BITMAP_STALE, MASK_UNSET);
+
+       if (page) /* unmap the last page */
+               kunmap(page);
+
+       if (bit_cnt) { /* Kick recovery if any bits were set */
+               set_bit(MD_RECOVERY_NEEDED, &bitmap->mddev->recovery);
+               md_wakeup_thread(bitmap->mddev->thread);
+       }
+
+out:
+       printk(KERN_INFO "%s: bitmap initialized from disk: "
+               "read %lu/%lu pages, set %lu bits, status: %d\n",
+               bmname(bitmap), bitmap->file_pages, num_pages, bit_cnt, ret);
+
+       return ret;
+}
+
+void bitmap_write_all(struct bitmap *bitmap)
+{
+       /* We don't actually write all bitmap blocks here,
+        * just flag them as needing to be written
+        */
+
+       unsigned long chunks = bitmap->chunks;
+       unsigned long bytes = (chunks+7)/8 + sizeof(bitmap_super_t);
+       unsigned long num_pages = (bytes + PAGE_SIZE-1) / PAGE_SIZE;
+       while (num_pages--)
+               bitmap->filemap_attr[num_pages] |= BITMAP_PAGE_NEEDWRITE;
+}
+
+
+static void bitmap_count_page(struct bitmap *bitmap, sector_t offset, int inc)
+{
+       sector_t chunk = offset >> CHUNK_BLOCK_SHIFT(bitmap);
+       unsigned long page = chunk >> PAGE_COUNTER_SHIFT;
+       bitmap->bp[page].count += inc;
+/*
+       if (page == 0) printk("count page 0, offset %llu: %d gives %d\n",
+                             (unsigned long long)offset, inc, bitmap->bp[page].count);
+*/
+       bitmap_checkfree(bitmap, page);
+}
+static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap,
+                                           sector_t offset, int *blocks,
+                                           int create);
+
+/*
+ * bitmap daemon -- periodically wakes up to clean bits and flush pages
+ *                     out to disk
+ */
+
+int bitmap_daemon_work(struct bitmap *bitmap)
+{
+       unsigned long j;
+       unsigned long flags;
+       struct page *page = NULL, *lastpage = NULL;
+       int err = 0;
+       int blocks;
+       int attr;
+
+       if (bitmap == NULL)
+               return 0;
+       if (time_before(jiffies, bitmap->daemon_lastrun + bitmap->daemon_sleep*HZ))
+               return 0;
+       bitmap->daemon_lastrun = jiffies;
+
+       for (j = 0; j < bitmap->chunks; j++) {
+               bitmap_counter_t *bmc;
+               spin_lock_irqsave(&bitmap->lock, flags);
+               if (!bitmap->filemap) {
+                       /* error or shutdown */
+                       spin_unlock_irqrestore(&bitmap->lock, flags);
+                       break;
+               }
+
+               page = filemap_get_page(bitmap, j);
+
+               if (page != lastpage) {
+                       /* skip this page unless it's marked as needing cleaning */
+                       if (!((attr=get_page_attr(bitmap, page)) & BITMAP_PAGE_CLEAN)) {
+                               if (attr & BITMAP_PAGE_NEEDWRITE) {
+                                       page_cache_get(page);
+                                       clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE);
+                               }
+                               spin_unlock_irqrestore(&bitmap->lock, flags);
+                               if (attr & BITMAP_PAGE_NEEDWRITE) {
+                                       switch (write_page(bitmap, page, 0)) {
+                                       case -EAGAIN:
+                                               set_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE);
+                                               break;
+                                       case 0:
+                                               break;
+                                       default:
+                                               bitmap_file_kick(bitmap);
+                                       }
+                                       page_cache_release(page);
+                               }
+                               continue;
+                       }
+
+                       /* grab the new page, sync and release the old */
+                       page_cache_get(page);
+                       if (lastpage != NULL) {
+                               if (get_page_attr(bitmap, lastpage) & BITMAP_PAGE_NEEDWRITE) {
+                                       clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
+                                       spin_unlock_irqrestore(&bitmap->lock, flags);
+                                       err = write_page(bitmap, lastpage, 0);
+                                       if (err == -EAGAIN) {
+                                               err = 0;
+                                               set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
+                                       }
+                               } else {
+                                       set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
+                                       spin_unlock_irqrestore(&bitmap->lock, flags);
+                               }
+                               kunmap(lastpage);
+                               page_cache_release(lastpage);
+                               if (err)
+                                       bitmap_file_kick(bitmap);
+                       } else
+                               spin_unlock_irqrestore(&bitmap->lock, flags);
+                       lastpage = page;
+                       kmap(page);
+/*
+                       printk("bitmap clean at page %lu\n", j);
+*/
+                       spin_lock_irqsave(&bitmap->lock, flags);
+                       clear_page_attr(bitmap, page, BITMAP_PAGE_CLEAN);
+               }
+               bmc = bitmap_get_counter(bitmap, j << CHUNK_BLOCK_SHIFT(bitmap),
+                                       &blocks, 0);
+               if (bmc) {
+/*
+  if (j < 100) printk("bitmap: j=%lu, *bmc = 0x%x\n", j, *bmc);
+*/
+                       if (*bmc == 2) {
+                               *bmc=1; /* maybe clear the bit next time */
+                               set_page_attr(bitmap, page, BITMAP_PAGE_CLEAN);
+                       } else if (*bmc == 1) {
+                               /* we can clear the bit */
+                               *bmc = 0;
+                               bitmap_count_page(bitmap, j << CHUNK_BLOCK_SHIFT(bitmap),
+                                                 -1);
+
+                               /* clear the bit */
+                               clear_bit(file_page_offset(j), page_address(page));
+                       }
+               }
+               spin_unlock_irqrestore(&bitmap->lock, flags);
+       }
+
+       /* now sync the final page */
+       if (lastpage != NULL) {
+               kunmap(lastpage);
+               spin_lock_irqsave(&bitmap->lock, flags);
+               if (get_page_attr(bitmap, lastpage) &BITMAP_PAGE_NEEDWRITE) {
+                       clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
+                       spin_unlock_irqrestore(&bitmap->lock, flags);
+                       err = write_page(bitmap, lastpage, 0);
+                       if (err == -EAGAIN) {
+                               set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
+                               err = 0;
+                       }
+               } else {
+                       set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
+                       spin_unlock_irqrestore(&bitmap->lock, flags);
+               }
+
+               page_cache_release(lastpage);
+       }
+
+       return err;
+}
+
+static void daemon_exit(struct bitmap *bitmap, mdk_thread_t **daemon)
+{
+       mdk_thread_t *dmn;
+       unsigned long flags;
+
+       /* if no one is waiting on us, we'll free the md thread struct
+        * and exit, otherwise we let the waiter clean things up */
+       spin_lock_irqsave(&bitmap->lock, flags);
+       if ((dmn = *daemon)) { /* no one is waiting, cleanup and exit */
+               *daemon = NULL;
+               spin_unlock_irqrestore(&bitmap->lock, flags);
+               kfree(dmn);
+               complete_and_exit(NULL, 0); /* do_exit not exported */
+       }
+       spin_unlock_irqrestore(&bitmap->lock, flags);
+}
+
+static void bitmap_writeback_daemon(mddev_t *mddev)
+{
+       struct bitmap *bitmap = mddev->bitmap;
+       struct page *page;
+       struct page_list *item;
+       int err = 0;
+
+       if (signal_pending(current)) {
+               printk(KERN_INFO
+                      "%s: bitmap writeback daemon got signal, exiting...\n",
+                      bmname(bitmap));
+               err = -EINTR;
+               goto out;
+       }
+
+       PRINTK("%s: bitmap writeback daemon woke up...\n", bmname(bitmap));
+       /* wait on bitmap page writebacks */
+       while ((item = dequeue_page(bitmap))) {
+               page = item->page;
+               mempool_free(item, bitmap->write_pool);
+               PRINTK("wait on page writeback: %p\n", page);
+               wait_on_page_writeback(page);
+               PRINTK("finished page writeback: %p\n", page);
+
+               err = PageError(page);
+               page_cache_release(page);
+               if (err) {
+                       printk(KERN_WARNING "%s: bitmap file writeback "
+                              "failed (page %lu): %d\n",
+                              bmname(bitmap), page->index, err);
+                       bitmap_file_kick(bitmap);
+                       goto out;
+               }
+       }
+ out:
+       wake_up(&bitmap->write_wait);
+       if (err) {
+               printk(KERN_INFO "%s: bitmap writeback daemon exiting (%d)\n",
+                      bmname(bitmap), err);
+               daemon_exit(bitmap, &bitmap->writeback_daemon);
+       }
+}
+
+static int bitmap_start_daemon(struct bitmap *bitmap, mdk_thread_t **ptr,
+                               void (*func)(mddev_t *), char *name)
+{
+       mdk_thread_t *daemon;
+       unsigned long flags;
+       char namebuf[32];
+
+       spin_lock_irqsave(&bitmap->lock, flags);
+       *ptr = NULL;
+
+       if (!bitmap->file) /* no need for daemon if there's no backing file */
+               goto out_unlock;
+
+       spin_unlock_irqrestore(&bitmap->lock, flags);
+
+#if INJECT_FATAL_FAULT_2
+       daemon = NULL;
+#else
+       sprintf(namebuf, "%%s_%s", name);
+       daemon = md_register_thread(func, bitmap->mddev, namebuf);
+#endif
+       if (!daemon) {
+               printk(KERN_ERR "%s: failed to start bitmap daemon\n",
+                       bmname(bitmap));
+               return -ECHILD;
+       }
+
+       spin_lock_irqsave(&bitmap->lock, flags);
+       *ptr = daemon;
+
+       md_wakeup_thread(daemon); /* start it running */
+
+       PRINTK("%s: %s daemon (pid %d) started...\n",
+               bmname(bitmap), name, daemon->tsk->pid);
+out_unlock:
+       spin_unlock_irqrestore(&bitmap->lock, flags);
+       return 0;
+}
+
+static int bitmap_start_daemons(struct bitmap *bitmap)
+{
+       int err = bitmap_start_daemon(bitmap, &bitmap->writeback_daemon,
+                                       bitmap_writeback_daemon, "bitmap_wb");
+       return err;
+}
+
+static void bitmap_stop_daemon(struct bitmap *bitmap, mdk_thread_t **ptr)
+{
+       mdk_thread_t *daemon;
+       unsigned long flags;
+
+       spin_lock_irqsave(&bitmap->lock, flags);
+       daemon = *ptr;
+       *ptr = NULL;
+       spin_unlock_irqrestore(&bitmap->lock, flags);
+       if (daemon)
+               md_unregister_thread(daemon); /* destroy the thread */
+}
+
+static void bitmap_stop_daemons(struct bitmap *bitmap)
+{
+       /* the daemons can't stop themselves... they'll just exit instead... */
+       if (bitmap->writeback_daemon &&
+           current->pid != bitmap->writeback_daemon->tsk->pid)
+               bitmap_stop_daemon(bitmap, &bitmap->writeback_daemon);
+}
+
+static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap,
+                                           sector_t offset, int *blocks,
+                                           int create)
+{
+       /* If 'create', we might release the lock and reclaim it.
+        * The lock must have been taken with interrupts enabled.
+        * If !create, we don't release the lock.
+        */
+       sector_t chunk = offset >> CHUNK_BLOCK_SHIFT(bitmap);
+       unsigned long page = chunk >> PAGE_COUNTER_SHIFT;
+       unsigned long pageoff = (chunk & PAGE_COUNTER_MASK) << COUNTER_BYTE_SHIFT;
+       sector_t csize;
+
+       if (bitmap_checkpage(bitmap, page, create) < 0) {
+               csize = ((sector_t)1) << (CHUNK_BLOCK_SHIFT(bitmap));
+               *blocks = csize - (offset & (csize- 1));
+               return NULL;
+       }
+       /* now locked ... */
+
+       if (bitmap->bp[page].hijacked) { /* hijacked pointer */
+               /* should we use the first or second counter field
+                * of the hijacked pointer? */
+               int hi = (pageoff > PAGE_COUNTER_MASK);
+               csize = ((sector_t)1) << (CHUNK_BLOCK_SHIFT(bitmap) +
+                                         PAGE_COUNTER_SHIFT - 1);
+               *blocks = csize - (offset & (csize- 1));
+               return  &((bitmap_counter_t *)
+                         &bitmap->bp[page].map)[hi];
+       } else { /* page is allocated */
+               csize = ((sector_t)1) << (CHUNK_BLOCK_SHIFT(bitmap));
+               *blocks = csize - (offset & (csize- 1));
+               return (bitmap_counter_t *)
+                       &(bitmap->bp[page].map[pageoff]);
+       }
+}
+
+int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sectors)
+{
+       if (!bitmap) return 0;
+       while (sectors) {
+               int blocks;
+               bitmap_counter_t *bmc;
+
+               spin_lock_irq(&bitmap->lock);
+               bmc = bitmap_get_counter(bitmap, offset, &blocks, 1);
+               if (!bmc) {
+                       spin_unlock_irq(&bitmap->lock);
+                       return 0;
+               }
+
+               switch(*bmc) {
+               case 0:
+                       bitmap_file_set_bit(bitmap, offset);
+                       bitmap_count_page(bitmap,offset, 1);
+                       blk_plug_device(bitmap->mddev->queue);
+                       /* fall through */
+               case 1:
+                       *bmc = 2;
+               }
+               if ((*bmc & COUNTER_MAX) == COUNTER_MAX) BUG();
+               (*bmc)++;
+
+               spin_unlock_irq(&bitmap->lock);
+
+               offset += blocks;
+               if (sectors > blocks)
+                       sectors -= blocks;
+               else sectors = 0;
+       }
+       return 0;
+}
+
+void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long sectors,
+                    int success)
+{
+       if (!bitmap) return;
+       while (sectors) {
+               int blocks;
+               unsigned long flags;
+               bitmap_counter_t *bmc;
+
+               spin_lock_irqsave(&bitmap->lock, flags);
+               bmc = bitmap_get_counter(bitmap, offset, &blocks, 0);
+               if (!bmc) {
+                       spin_unlock_irqrestore(&bitmap->lock, flags);
+                       return;
+               }
+
+               if (!success && ! (*bmc & NEEDED_MASK))
+                       *bmc |= NEEDED_MASK;
+
+               (*bmc)--;
+               if (*bmc <= 2) {
+                       set_page_attr(bitmap,
+                                     filemap_get_page(bitmap, offset >> CHUNK_BLOCK_SHIFT(bitmap)),
+                                     BITMAP_PAGE_CLEAN);
+               }
+               spin_unlock_irqrestore(&bitmap->lock, flags);
+               offset += blocks;
+               if (sectors > blocks)
+                       sectors -= blocks;
+               else sectors = 0;
+       }
+}
+
+int bitmap_start_sync(struct bitmap *bitmap, sector_t offset, int *blocks)
+{
+       bitmap_counter_t *bmc;
+       int rv;
+       if (bitmap == NULL) {/* FIXME or bitmap set as 'failed' */
+               *blocks = 1024;
+               return 1; /* always resync if no bitmap */
+       }
+       spin_lock_irq(&bitmap->lock);
+       bmc = bitmap_get_counter(bitmap, offset, blocks, 0);
+       rv = 0;
+       if (bmc) {
+               /* locked */
+               if (RESYNC(*bmc))
+                       rv = 1;
+               else if (NEEDED(*bmc)) {
+                       rv = 1;
+                       *bmc |= RESYNC_MASK;
+                       *bmc &= ~NEEDED_MASK;
+               }
+       }
+       spin_unlock_irq(&bitmap->lock);
+       return rv;
+}
+
+void bitmap_end_sync(struct bitmap *bitmap, sector_t offset, int *blocks, int aborted)
+{
+       bitmap_counter_t *bmc;
+       unsigned long flags;
+/*
+       if (offset == 0) printk("bitmap_end_sync 0 (%d)\n", aborted);
+*/     if (bitmap == NULL) {
+               *blocks = 1024;
+               return;
+       }
+       spin_lock_irqsave(&bitmap->lock, flags);
+       bmc = bitmap_get_counter(bitmap, offset, blocks, 0);
+       if (bmc == NULL)
+               goto unlock;
+       /* locked */
+/*
+       if (offset == 0) printk("bitmap_end sync found 0x%x, blocks %d\n", *bmc, *blocks);
+*/
+       if (RESYNC(*bmc)) {
+               *bmc &= ~RESYNC_MASK;
+
+               if (!NEEDED(*bmc) && aborted)
+                       *bmc |= NEEDED_MASK;
+               else {
+                       if (*bmc <= 2) {
+                               set_page_attr(bitmap,
+                                             filemap_get_page(bitmap, offset >> CHUNK_BLOCK_SHIFT(bitmap)),
+                                             BITMAP_PAGE_CLEAN);
+                       }
+               }
+       }
+ unlock:
+       spin_unlock_irqrestore(&bitmap->lock, flags);
+}
+
+void bitmap_close_sync(struct bitmap *bitmap)
+{
+       /* Sync has finished, and any bitmap chunks that weren't synced
+        * properly have been aborted.  It remains to us to clear the
+        * RESYNC bit wherever it is still on
+        */
+       sector_t sector = 0;
+       int blocks;
+       if (!bitmap) return;
+       while (sector < bitmap->mddev->resync_max_sectors) {
+               bitmap_end_sync(bitmap, sector, &blocks, 0);
+/*
+               if (sector < 500) printk("bitmap_close_sync: sec %llu blks %d\n",
+                                        (unsigned long long)sector, blocks);
+*/             sector += blocks;
+       }
+}
+
+static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset,
+                                  unsigned long sectors, int in_sync)
+{
+       /* For each chunk covered by any of these sectors, set the
+        * counter to 1 and set resync_needed unless in_sync.  They should all
+        * be 0 at this point
+        */
+       while (sectors) {
+               int secs;
+               bitmap_counter_t *bmc;
+               spin_lock_irq(&bitmap->lock);
+               bmc = bitmap_get_counter(bitmap, offset, &secs, 1);
+               if (!bmc) {
+                       spin_unlock_irq(&bitmap->lock);
+                       return;
+               }
+               if (! *bmc) {
+                       struct page *page;
+                       *bmc = 1 | (in_sync? 0 : NEEDED_MASK);
+                       bitmap_count_page(bitmap, offset, 1);
+                       page = filemap_get_page(bitmap, offset >> CHUNK_BLOCK_SHIFT(bitmap));
+                       set_page_attr(bitmap, page, BITMAP_PAGE_CLEAN);
+               }
+               spin_unlock_irq(&bitmap->lock);
+               if (sectors > secs)
+                       sectors -= secs;
+               else
+                       sectors = 0;
+       }
+}
+
+/*
+ * free memory that was allocated
+ */
+void bitmap_destroy(mddev_t *mddev)
+{
+       unsigned long k, pages;
+       struct bitmap_page *bp;
+       struct bitmap *bitmap = mddev->bitmap;
+
+       if (!bitmap) /* there was no bitmap */
+               return;
+
+       mddev->bitmap = NULL; /* disconnect from the md device */
+
+       /* release the bitmap file and kill the daemon */
+       bitmap_file_put(bitmap);
+
+       bp = bitmap->bp;
+       pages = bitmap->pages;
+
+       /* free all allocated memory */
+
+       mempool_destroy(bitmap->write_pool);
+
+       if (bp) /* deallocate the page memory */
+               for (k = 0; k < pages; k++)
+                       if (bp[k].map && !bp[k].hijacked)
+                               kfree(bp[k].map);
+       kfree(bp);
+       kfree(bitmap);
+}
+
+/*
+ * initialize the bitmap structure
+ * if this returns an error, bitmap_destroy must be called to do clean up
+ */
+int bitmap_create(mddev_t *mddev)
+{
+       struct bitmap *bitmap;
+       unsigned long blocks = mddev->resync_max_sectors;
+       unsigned long chunks;
+       unsigned long pages;
+       struct file *file = mddev->bitmap_file;
+       int err;
+
+       BUG_ON(sizeof(bitmap_super_t) != 256);
+
+       if (!file && !mddev->bitmap_offset) /* bitmap disabled, nothing to do */
+               return 0;
+
+       BUG_ON(file && mddev->bitmap_offset);
+
+       bitmap = kmalloc(sizeof(*bitmap), GFP_KERNEL);
+       if (!bitmap)
+               return -ENOMEM;
+
+       memset(bitmap, 0, sizeof(*bitmap));
+
+       spin_lock_init(&bitmap->lock);
+       bitmap->mddev = mddev;
+       mddev->bitmap = bitmap;
+
+       spin_lock_init(&bitmap->write_lock);
+       INIT_LIST_HEAD(&bitmap->complete_pages);
+       init_waitqueue_head(&bitmap->write_wait);
+       bitmap->write_pool = mempool_create(WRITE_POOL_SIZE, write_pool_alloc,
+                               write_pool_free, NULL);
+       if (!bitmap->write_pool)
+               return -ENOMEM;
+
+       bitmap->file = file;
+       bitmap->offset = mddev->bitmap_offset;
+       if (file) get_file(file);
+       /* read superblock from bitmap file (this sets bitmap->chunksize) */
+       err = bitmap_read_sb(bitmap);
+       if (err)
+               return err;
+
+       bitmap->chunkshift = find_first_bit(&bitmap->chunksize,
+                                       sizeof(bitmap->chunksize));
+
+       /* now that chunksize and chunkshift are set, we can use these macros */
+       chunks = (blocks + CHUNK_BLOCK_RATIO(bitmap) - 1) /
+                       CHUNK_BLOCK_RATIO(bitmap);
+       pages = (chunks + PAGE_COUNTER_RATIO - 1) / PAGE_COUNTER_RATIO;
+
+       BUG_ON(!pages);
+
+       bitmap->chunks = chunks;
+       bitmap->pages = pages;
+       bitmap->missing_pages = pages;
+       bitmap->counter_bits = COUNTER_BITS;
+
+       bitmap->syncchunk = ~0UL;
+
+#if INJECT_FATAL_FAULT_1
+       bitmap->bp = NULL;
+#else
+       bitmap->bp = kmalloc(pages * sizeof(*bitmap->bp), GFP_KERNEL);
+#endif
+       if (!bitmap->bp)
+               return -ENOMEM;
+       memset(bitmap->bp, 0, pages * sizeof(*bitmap->bp));
+
+       bitmap->flags |= BITMAP_ACTIVE;
+
+       /* now that we have some pages available, initialize the in-memory
+        * bitmap from the on-disk bitmap */
+       err = bitmap_init_from_disk(bitmap, mddev->recovery_cp == MaxSector);
+       if (err)
+               return err;
+
+       printk(KERN_INFO "created bitmap (%lu pages) for device %s\n",
+               pages, bmname(bitmap));
+
+       /* kick off the bitmap daemons */
+       err = bitmap_start_daemons(bitmap);
+       if (err)
+               return err;
+       return bitmap_update_sb(bitmap);
+}
+
+/* the bitmap API -- for raid personalities */
+EXPORT_SYMBOL(bitmap_startwrite);
+EXPORT_SYMBOL(bitmap_endwrite);
+EXPORT_SYMBOL(bitmap_start_sync);
+EXPORT_SYMBOL(bitmap_end_sync);
+EXPORT_SYMBOL(bitmap_unplug);
+EXPORT_SYMBOL(bitmap_close_sync);
+EXPORT_SYMBOL(bitmap_daemon_work);
index 0dd6c2b5391b754a9aa4bc01e87d97c4c86672b3..d0a4bab220e5e6b5608e50810b3dead70e7be095 100644 (file)
@@ -704,8 +704,7 @@ static void crypt_dtr(struct dm_target *ti)
        mempool_destroy(cc->page_pool);
        mempool_destroy(cc->io_pool);
 
-       if (cc->iv_mode)
-               kfree(cc->iv_mode);
+       kfree(cc->iv_mode);
        if (cc->iv_gen_ops && cc->iv_gen_ops->dtr)
                cc->iv_gen_ops->dtr(cc);
        crypto_free_tfm(cc->tfm);
index 1e97b3c12bd5dae147963fa7331ae3512554538d..0c1b8520ef86f9105c20b45632eb00d9a114c8be 100644 (file)
@@ -985,6 +985,9 @@ static int do_end_io(struct multipath *m, struct bio *bio,
        if (!error)
                return 0;       /* I/O complete */
 
+       if ((error == -EWOULDBLOCK) && bio_rw_ahead(bio))
+               return error;
+
        spin_lock(&m->lock);
        if (!m->nr_valid_paths) {
                if (!m->queue_if_no_path || m->suspended) {
index 161e9aa872917da3cc3bb2cc4719850317e7b9e1..8d740013d74d5eff047d99f02d1f93d7b65218bd 100644 (file)
@@ -217,8 +217,7 @@ static int linear_run (mddev_t *mddev)
        return 0;
 
 out:
-       if (conf)
-               kfree(conf);
+       kfree(conf);
        return 1;
 }
 
@@ -269,9 +268,8 @@ static int linear_make_request (request_queue_t *q, struct bio *bio)
                 * split it.
                 */
                struct bio_pair *bp;
-               bp = bio_split(bio, bio_split_pool, 
-                              (bio->bi_sector + (bio->bi_size >> 9) -
-                               (tmp_dev->offset + tmp_dev->size))<<1);
+               bp = bio_split(bio, bio_split_pool,
+                              ((tmp_dev->offset + tmp_dev->size)<<1) - bio->bi_sector);
                if (linear_make_request(q, &bp->bio1))
                        generic_make_request(&bp->bio1);
                if (linear_make_request(q, &bp->bio2))
index d899204d3743372b68ae04f92f6cefd350db99e5..0c6b5b6baff60ded7fb24d2f71988711d723c604 100644 (file)
@@ -19,6 +19,9 @@
 
      Neil Brown <neilb@cse.unsw.edu.au>.
 
+   - persistent bitmap code
+     Copyright (C) 2003-2004, Paul Clements, SteelEye Technology, Inc.
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2, or (at your option)
@@ -33,6 +36,7 @@
 #include <linux/config.h>
 #include <linux/linkage.h>
 #include <linux/raid/md.h>
+#include <linux/raid/bitmap.h>
 #include <linux/sysctl.h>
 #include <linux/devfs_fs_kernel.h>
 #include <linux/buffer_head.h> /* for invalidate_bdev */
@@ -40,6 +44,8 @@
 
 #include <linux/init.h>
 
+#include <linux/file.h>
+
 #ifdef CONFIG_KMOD
 #include <linux/kmod.h>
 #endif
@@ -189,8 +195,7 @@ static mddev_t * mddev_find(dev_t unit)
                if (mddev->unit == unit) {
                        mddev_get(mddev);
                        spin_unlock(&all_mddevs_lock);
-                       if (new)
-                               kfree(new);
+                       kfree(new);
                        return mddev;
                }
 
@@ -218,6 +223,8 @@ static mddev_t * mddev_find(dev_t unit)
        INIT_LIST_HEAD(&new->all_mddevs);
        init_timer(&new->safemode_timer);
        atomic_set(&new->active, 1);
+       spin_lock_init(&new->write_lock);
+       init_waitqueue_head(&new->sb_wait);
 
        new->queue = blk_alloc_queue(GFP_KERNEL);
        if (!new->queue) {
@@ -320,6 +327,40 @@ static void free_disk_sb(mdk_rdev_t * rdev)
 }
 
 
+static int super_written(struct bio *bio, unsigned int bytes_done, int error)
+{
+       mdk_rdev_t *rdev = bio->bi_private;
+       if (bio->bi_size)
+               return 1;
+
+       if (error || !test_bit(BIO_UPTODATE, &bio->bi_flags))
+               md_error(rdev->mddev, rdev);
+
+       if (atomic_dec_and_test(&rdev->mddev->pending_writes))
+               wake_up(&rdev->mddev->sb_wait);
+       return 0;
+}
+
+void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev,
+                  sector_t sector, int size, struct page *page)
+{
+       /* write first size bytes of page to sector of rdev
+        * Increment mddev->pending_writes before returning
+        * and decrement it on completion, waking up sb_wait
+        * if zero is reached.
+        * If an error occurred, call md_error
+        */
+       struct bio *bio = bio_alloc(GFP_NOIO, 1);
+
+       bio->bi_bdev = rdev->bdev;
+       bio->bi_sector = sector;
+       bio_add_page(bio, page, size, 0);
+       bio->bi_private = rdev;
+       bio->bi_end_io = super_written;
+       atomic_inc(&mddev->pending_writes);
+       submit_bio((1<<BIO_RW)|(1<<BIO_RW_SYNC), bio);
+}
+
 static int bi_complete(struct bio *bio, unsigned int bytes_done, int error)
 {
        if (bio->bi_size)
@@ -329,7 +370,7 @@ static int bi_complete(struct bio *bio, unsigned int bytes_done, int error)
        return 0;
 }
 
-static int sync_page_io(struct block_device *bdev, sector_t sector, int size,
+int sync_page_io(struct block_device *bdev, sector_t sector, int size,
                   struct page *page, int rw)
 {
        struct bio *bio = bio_alloc(GFP_NOIO, 1);
@@ -416,11 +457,8 @@ static int sb_equal(mdp_super_t *sb1, mdp_super_t *sb2)
                ret = 1;
 
 abort:
-       if (tmp1)
-               kfree(tmp1);
-       if (tmp2)
-               kfree(tmp2);
-
+       kfree(tmp1);
+       kfree(tmp2);
        return ret;
 }
 
@@ -569,6 +607,8 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
        mdp_disk_t *desc;
        mdp_super_t *sb = (mdp_super_t *)page_address(rdev->sb_page);
 
+       rdev->raid_disk = -1;
+       rdev->in_sync = 0;
        if (mddev->raid_disks == 0) {
                mddev->major_version = 0;
                mddev->minor_version = sb->minor_version;
@@ -599,16 +639,35 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
                memcpy(mddev->uuid+12,&sb->set_uuid3, 4);
 
                mddev->max_disks = MD_SB_DISKS;
-       } else {
-               __u64 ev1;
-               ev1 = md_event(sb);
+
+               if (sb->state & (1<<MD_SB_BITMAP_PRESENT) &&
+                   mddev->bitmap_file == NULL) {
+                       if (mddev->level != 1) {
+                               /* FIXME use a better test */
+                               printk(KERN_WARNING "md: bitmaps only support for raid1\n");
+                               return -EINVAL;
+                       }
+                       mddev->bitmap_offset = (MD_SB_BYTES >> 9);
+               }
+
+       } else if (mddev->pers == NULL) {
+               /* Insist on good event counter while assembling */
+               __u64 ev1 = md_event(sb);
                ++ev1;
                if (ev1 < mddev->events) 
                        return -EINVAL;
-       }
+       } else if (mddev->bitmap) {
+               /* if adding to array with a bitmap, then we can accept an
+                * older device ... but not too old.
+                */
+               __u64 ev1 = md_event(sb);
+               if (ev1 < mddev->bitmap->events_cleared)
+                       return 0;
+       } else /* just a hot-add of a new device, leave raid_disk at -1 */
+               return 0;
+
        if (mddev->level != LEVEL_MULTIPATH) {
-               rdev->raid_disk = -1;
-               rdev->in_sync = rdev->faulty = 0;
+               rdev->faulty = 0;
                desc = sb->disks + rdev->desc_nr;
 
                if (desc->state & (1<<MD_DISK_FAULTY))
@@ -618,7 +677,8 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
                        rdev->in_sync = 1;
                        rdev->raid_disk = desc->raid_disk;
                }
-       }
+       } else /* MULTIPATH are always insync */
+               rdev->in_sync = 1;
        return 0;
 }
 
@@ -683,6 +743,9 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev)
        sb->layout = mddev->layout;
        sb->chunk_size = mddev->chunk_size;
 
+       if (mddev->bitmap && mddev->bitmap_file == NULL)
+               sb->state |= (1<<MD_SB_BITMAP_PRESENT);
+
        sb->disks[0].state = (1<<MD_DISK_REMOVED);
        ITERATE_RDEV(mddev,rdev2,tmp) {
                mdp_disk_t *d;
@@ -780,7 +843,7 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version)
        case 0:
                sb_offset = rdev->bdev->bd_inode->i_size >> 9;
                sb_offset -= 8*2;
-               sb_offset &= ~(4*2-1);
+               sb_offset &= ~(sector_t)(4*2-1);
                /* convert from sectors to K */
                sb_offset /= 2;
                break;
@@ -860,6 +923,8 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
 {
        struct mdp_superblock_1 *sb = (struct mdp_superblock_1*)page_address(rdev->sb_page);
 
+       rdev->raid_disk = -1;
+       rdev->in_sync = 0;
        if (mddev->raid_disks == 0) {
                mddev->major_version = 1;
                mddev->patch_version = 0;
@@ -877,13 +942,30 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
                memcpy(mddev->uuid, sb->set_uuid, 16);
 
                mddev->max_disks =  (4096-256)/2;
-       } else {
-               __u64 ev1;
-               ev1 = le64_to_cpu(sb->events);
+
+               if ((le32_to_cpu(sb->feature_map) & 1) &&
+                   mddev->bitmap_file == NULL ) {
+                       if (mddev->level != 1) {
+                               printk(KERN_WARNING "md: bitmaps only supported for raid1\n");
+                               return -EINVAL;
+                       }
+                       mddev->bitmap_offset = (__s32)le32_to_cpu(sb->bitmap_offset);
+               }
+       } else if (mddev->pers == NULL) {
+               /* Insist of good event counter while assembling */
+               __u64 ev1 = le64_to_cpu(sb->events);
                ++ev1;
                if (ev1 < mddev->events)
                        return -EINVAL;
-       }
+       } else if (mddev->bitmap) {
+               /* If adding to array with a bitmap, then we can accept an
+                * older device, but not too old.
+                */
+               __u64 ev1 = le64_to_cpu(sb->events);
+               if (ev1 < mddev->bitmap->events_cleared)
+                       return 0;
+       } else /* just a hot-add of a new device, leave raid_disk at -1 */
+               return 0;
 
        if (mddev->level != LEVEL_MULTIPATH) {
                int role;
@@ -891,14 +973,10 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
                role = le16_to_cpu(sb->dev_roles[rdev->desc_nr]);
                switch(role) {
                case 0xffff: /* spare */
-                       rdev->in_sync = 0;
                        rdev->faulty = 0;
-                       rdev->raid_disk = -1;
                        break;
                case 0xfffe: /* faulty */
-                       rdev->in_sync = 0;
                        rdev->faulty = 1;
-                       rdev->raid_disk = -1;
                        break;
                default:
                        rdev->in_sync = 1;
@@ -906,7 +984,9 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
                        rdev->raid_disk = role;
                        break;
                }
-       }
+       } else /* MULTIPATH are always insync */
+               rdev->in_sync = 1;
+
        return 0;
 }
 
@@ -933,6 +1013,11 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)
        else
                sb->resync_offset = cpu_to_le64(0);
 
+       if (mddev->bitmap && mddev->bitmap_file == NULL) {
+               sb->bitmap_offset = cpu_to_le32((__u32)mddev->bitmap_offset);
+               sb->feature_map = cpu_to_le32(1);
+       }
+
        max_dev = 0;
        ITERATE_RDEV(mddev,rdev2,tmp)
                if (rdev2->desc_nr+1 > max_dev)
@@ -1196,8 +1281,11 @@ void md_print_devices(void)
        printk("md:     * <COMPLETE RAID STATE PRINTOUT> *\n");
        printk("md:     **********************************\n");
        ITERATE_MDDEV(mddev,tmp) {
-               printk("%s: ", mdname(mddev));
 
+               if (mddev->bitmap)
+                       bitmap_print_sb(mddev->bitmap);
+               else
+                       printk("%s: ", mdname(mddev));
                ITERATE_RDEV(mddev,rdev,tmp2)
                        printk("<%s>", bdevname(rdev->bdev,b));
                printk("\n");
@@ -1210,30 +1298,6 @@ void md_print_devices(void)
 }
 
 
-static int write_disk_sb(mdk_rdev_t * rdev)
-{
-       char b[BDEVNAME_SIZE];
-       if (!rdev->sb_loaded) {
-               MD_BUG();
-               return 1;
-       }
-       if (rdev->faulty) {
-               MD_BUG();
-               return 1;
-       }
-
-       dprintk(KERN_INFO "(write) %s's sb offset: %llu\n",
-               bdevname(rdev->bdev,b),
-              (unsigned long long)rdev->sb_offset);
-  
-       if (sync_page_io(rdev->bdev, rdev->sb_offset<<1, MD_SB_BYTES, rdev->sb_page, WRITE))
-               return 0;
-
-       printk("md: write_disk_sb failed for device %s\n", 
-               bdevname(rdev->bdev,b));
-       return 1;
-}
-
 static void sync_sbs(mddev_t * mddev)
 {
        mdk_rdev_t *rdev;
@@ -1248,12 +1312,14 @@ static void sync_sbs(mddev_t * mddev)
 
 static void md_update_sb(mddev_t * mddev)
 {
-       int err, count = 100;
+       int err;
        struct list_head *tmp;
        mdk_rdev_t *rdev;
+       int sync_req;
 
-       mddev->sb_dirty = 0;
 repeat:
+       spin_lock(&mddev->write_lock);
+       sync_req = mddev->in_sync;
        mddev->utime = get_seconds();
        mddev->events ++;
 
@@ -1266,20 +1332,26 @@ repeat:
                MD_BUG();
                mddev->events --;
        }
+       mddev->sb_dirty = 2;
        sync_sbs(mddev);
 
        /*
         * do not write anything to disk if using
         * nonpersistent superblocks
         */
-       if (!mddev->persistent)
+       if (!mddev->persistent) {
+               mddev->sb_dirty = 0;
+               spin_unlock(&mddev->write_lock);
+               wake_up(&mddev->sb_wait);
                return;
+       }
+       spin_unlock(&mddev->write_lock);
 
        dprintk(KERN_INFO 
                "md: updating %s RAID superblock on device (in sync %d)\n",
                mdname(mddev),mddev->in_sync);
 
-       err = 0;
+       err = bitmap_update_sb(mddev->bitmap);
        ITERATE_RDEV(mddev,rdev,tmp) {
                char b[BDEVNAME_SIZE];
                dprintk(KERN_INFO "md: ");
@@ -1288,22 +1360,32 @@ repeat:
 
                dprintk("%s ", bdevname(rdev->bdev,b));
                if (!rdev->faulty) {
-                       err += write_disk_sb(rdev);
+                       md_super_write(mddev,rdev,
+                                      rdev->sb_offset<<1, MD_SB_BYTES,
+                                      rdev->sb_page);
+                       dprintk(KERN_INFO "(write) %s's sb offset: %llu\n",
+                               bdevname(rdev->bdev,b),
+                               (unsigned long long)rdev->sb_offset);
+
                } else
                        dprintk(")\n");
-               if (!err && mddev->level == LEVEL_MULTIPATH)
+               if (mddev->level == LEVEL_MULTIPATH)
                        /* only need to write one superblock... */
                        break;
        }
-       if (err) {
-               if (--count) {
-                       printk(KERN_ERR "md: errors occurred during superblock"
-                               " update, repeating\n");
-                       goto repeat;
-               }
-               printk(KERN_ERR \
-                       "md: excessive errors occurred during superblock update, exiting\n");
+       wait_event(mddev->sb_wait, atomic_read(&mddev->pending_writes)==0);
+       /* if there was a failure, sb_dirty was set to 1, and we re-write super */
+
+       spin_lock(&mddev->write_lock);
+       if (mddev->in_sync != sync_req|| mddev->sb_dirty == 1) {
+               /* have to write it out again */
+               spin_unlock(&mddev->write_lock);
+               goto repeat;
        }
+       mddev->sb_dirty = 0;
+       spin_unlock(&mddev->write_lock);
+       wake_up(&mddev->sb_wait);
+
 }
 
 /*
@@ -1607,12 +1689,19 @@ static int do_md_run(mddev_t * mddev)
 
        mddev->resync_max_sectors = mddev->size << 1; /* may be over-ridden by personality */
 
-       err = mddev->pers->run(mddev);
+       /* before we start the array running, initialise the bitmap */
+       err = bitmap_create(mddev);
+       if (err)
+               printk(KERN_ERR "%s: failed to create bitmap (%d)\n",
+                       mdname(mddev), err);
+       else
+               err = mddev->pers->run(mddev);
        if (err) {
                printk(KERN_ERR "md: pers->run() failed ...\n");
                module_put(mddev->pers->owner);
                mddev->pers = NULL;
-               return -EINVAL;
+               bitmap_destroy(mddev);
+               return err;
        }
        atomic_set(&mddev->writes_pending,0);
        mddev->safemode = 0;
@@ -1725,6 +1814,14 @@ static int do_md_stop(mddev_t * mddev, int ro)
                if (ro)
                        set_disk_ro(disk, 1);
        }
+
+       bitmap_destroy(mddev);
+       if (mddev->bitmap_file) {
+               atomic_set(&mddev->bitmap_file->f_dentry->d_inode->i_writecount, 1);
+               fput(mddev->bitmap_file);
+               mddev->bitmap_file = NULL;
+       }
+
        /*
         * Free resources if final stop
         */
@@ -1983,6 +2080,42 @@ static int get_array_info(mddev_t * mddev, void __user * arg)
        return 0;
 }
 
+static int get_bitmap_file(mddev_t * mddev, void * arg)
+{
+       mdu_bitmap_file_t *file = NULL; /* too big for stack allocation */
+       char *ptr, *buf = NULL;
+       int err = -ENOMEM;
+
+       file = kmalloc(sizeof(*file), GFP_KERNEL);
+       if (!file)
+               goto out;
+
+       /* bitmap disabled, zero the first byte and copy out */
+       if (!mddev->bitmap || !mddev->bitmap->file) {
+               file->pathname[0] = '\0';
+               goto copy_out;
+       }
+
+       buf = kmalloc(sizeof(file->pathname), GFP_KERNEL);
+       if (!buf)
+               goto out;
+
+       ptr = file_path(mddev->bitmap->file, buf, sizeof(file->pathname));
+       if (!ptr)
+               goto out;
+
+       strcpy(file->pathname, ptr);
+
+copy_out:
+       err = 0;
+       if (copy_to_user(arg, file, sizeof(*file)))
+               err = -EFAULT;
+out:
+       kfree(buf);
+       kfree(file);
+       return err;
+}
+
 static int get_disk_info(mddev_t * mddev, void __user * arg)
 {
        mdu_disk_info_t info;
@@ -2078,11 +2211,25 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
                                PTR_ERR(rdev));
                        return PTR_ERR(rdev);
                }
+               /* set save_raid_disk if appropriate */
+               if (!mddev->persistent) {
+                       if (info->state & (1<<MD_DISK_SYNC)  &&
+                           info->raid_disk < mddev->raid_disks)
+                               rdev->raid_disk = info->raid_disk;
+                       else
+                               rdev->raid_disk = -1;
+               } else
+                       super_types[mddev->major_version].
+                               validate_super(mddev, rdev);
+               rdev->saved_raid_disk = rdev->raid_disk;
+
                rdev->in_sync = 0; /* just to be sure */
                rdev->raid_disk = -1;
                err = bind_rdev_to_array(rdev, mddev);
                if (err)
                        export_rdev(rdev);
+
+               set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
                if (mddev->thread)
                        md_wakeup_thread(mddev->thread);
                return err;
@@ -2256,6 +2403,49 @@ abort_export:
        return err;
 }
 
+/* similar to deny_write_access, but accounts for our holding a reference
+ * to the file ourselves */
+static int deny_bitmap_write_access(struct file * file)
+{
+       struct inode *inode = file->f_mapping->host;
+
+       spin_lock(&inode->i_lock);
+       if (atomic_read(&inode->i_writecount) > 1) {
+               spin_unlock(&inode->i_lock);
+               return -ETXTBSY;
+       }
+       atomic_set(&inode->i_writecount, -1);
+       spin_unlock(&inode->i_lock);
+
+       return 0;
+}
+
+static int set_bitmap_file(mddev_t *mddev, int fd)
+{
+       int err;
+
+       if (mddev->pers)
+               return -EBUSY;
+
+       mddev->bitmap_file = fget(fd);
+
+       if (mddev->bitmap_file == NULL) {
+               printk(KERN_ERR "%s: error: failed to get bitmap file\n",
+                       mdname(mddev));
+               return -EBADF;
+       }
+
+       err = deny_bitmap_write_access(mddev->bitmap_file);
+       if (err) {
+               printk(KERN_ERR "%s: error: bitmap file is already in use\n",
+                       mdname(mddev));
+               fput(mddev->bitmap_file);
+               mddev->bitmap_file = NULL;
+       } else
+               mddev->bitmap_offset = 0; /* file overrides offset */
+       return err;
+}
+
 /*
  * set_array_info is used two different ways
  * The original usage is when creating a new array.
@@ -2567,8 +2757,10 @@ static int md_ioctl(struct inode *inode, struct file *file,
        /*
         * Commands querying/configuring an existing array:
         */
-       /* if we are initialised yet, only ADD_NEW_DISK or STOP_ARRAY is allowed */
-       if (!mddev->raid_disks && cmd != ADD_NEW_DISK && cmd != STOP_ARRAY && cmd != RUN_ARRAY) {
+       /* if we are not initialised yet, only ADD_NEW_DISK, STOP_ARRAY,
+        * RUN_ARRAY, and SET_BITMAP_FILE are allowed */
+       if (!mddev->raid_disks && cmd != ADD_NEW_DISK && cmd != STOP_ARRAY
+                       && cmd != RUN_ARRAY && cmd != SET_BITMAP_FILE) {
                err = -ENODEV;
                goto abort_unlock;
        }
@@ -2582,6 +2774,10 @@ static int md_ioctl(struct inode *inode, struct file *file,
                        err = get_array_info(mddev, argp);
                        goto done_unlock;
 
+               case GET_BITMAP_FILE:
+                       err = get_bitmap_file(mddev, (void *)arg);
+                       goto done_unlock;
+
                case GET_DISK_INFO:
                        err = get_disk_info(mddev, argp);
                        goto done_unlock;
@@ -2662,6 +2858,10 @@ static int md_ioctl(struct inode *inode, struct file *file,
                        err = do_md_run (mddev);
                        goto done_unlock;
 
+               case SET_BITMAP_FILE:
+                       err = set_bitmap_file(mddev, (int)arg);
+                       goto done_unlock;
+
                default:
                        if (_IOC_TYPE(cmd) == MD_MAJOR)
                                printk(KERN_WARNING "md: %s(pid %d) used"
@@ -2773,8 +2973,9 @@ static int md_thread(void * arg)
        while (thread->run) {
                void (*run)(mddev_t *);
 
-               wait_event_interruptible(thread->wqueue,
-                                        test_bit(THREAD_WAKEUP, &thread->flags));
+               wait_event_interruptible_timeout(thread->wqueue,
+                                                test_bit(THREAD_WAKEUP, &thread->flags),
+                                                thread->timeout);
                if (current->flags & PF_FREEZE)
                        refrigerator(PF_FREEZE);
 
@@ -2820,6 +3021,7 @@ mdk_thread_t *md_register_thread(void (*run) (mddev_t *), mddev_t *mddev,
        thread->run = run;
        thread->mddev = mddev;
        thread->name = name;
+       thread->timeout = MAX_SCHEDULE_TIMEOUT;
        ret = kernel_thread(md_thread, thread, 0);
        if (ret < 0) {
                kfree(thread);
@@ -2858,13 +3060,13 @@ void md_error(mddev_t *mddev, mdk_rdev_t *rdev)
 
        if (!rdev || rdev->faulty)
                return;
-
+/*
        dprintk("md_error dev:%s, rdev:(%d:%d), (caller: %p,%p,%p,%p).\n",
                mdname(mddev),
                MAJOR(rdev->bdev->bd_dev), MINOR(rdev->bdev->bd_dev),
                __builtin_return_address(0),__builtin_return_address(1),
                __builtin_return_address(2),__builtin_return_address(3));
-
+*/
        if (!mddev->pers->error_handler)
                return;
        mddev->pers->error_handler(mddev,rdev);
@@ -3018,6 +3220,7 @@ static int md_seq_show(struct seq_file *seq, void *v)
        struct list_head *tmp2;
        mdk_rdev_t *rdev;
        int i;
+       struct bitmap *bitmap;
 
        if (v == (void*)1) {
                seq_printf(seq, "Personalities : ");
@@ -3070,10 +3273,35 @@ static int md_seq_show(struct seq_file *seq, void *v)
                if (mddev->pers) {
                        mddev->pers->status (seq, mddev);
                        seq_printf(seq, "\n      ");
-                       if (mddev->curr_resync > 2)
+                       if (mddev->curr_resync > 2) {
                                status_resync (seq, mddev);
-                       else if (mddev->curr_resync == 1 || mddev->curr_resync == 2)
-                               seq_printf(seq, "       resync=DELAYED");
+                               seq_printf(seq, "\n      ");
+                       } else if (mddev->curr_resync == 1 || mddev->curr_resync == 2)
+                               seq_printf(seq, "       resync=DELAYED\n      ");
+               } else
+                       seq_printf(seq, "\n       ");
+
+               if ((bitmap = mddev->bitmap)) {
+                       unsigned long chunk_kb;
+                       unsigned long flags;
+                       spin_lock_irqsave(&bitmap->lock, flags);
+                       chunk_kb = bitmap->chunksize >> 10;
+                       seq_printf(seq, "bitmap: %lu/%lu pages [%luKB], "
+                               "%lu%s chunk",
+                               bitmap->pages - bitmap->missing_pages,
+                               bitmap->pages,
+                               (bitmap->pages - bitmap->missing_pages)
+                                       << (PAGE_SHIFT - 10),
+                               chunk_kb ? chunk_kb : bitmap->chunksize,
+                               chunk_kb ? "KB" : "B");
+                       if (bitmap->file) {
+                               seq_printf(seq, ", file: ");
+                               seq_path(seq, bitmap->file->f_vfsmnt,
+                                        bitmap->file->f_dentry," \t\n");
+                       }
+
+                       seq_printf(seq, "\n");
+                       spin_unlock_irqrestore(&bitmap->lock, flags);
                }
 
                seq_printf(seq, "\n");
@@ -3176,19 +3404,28 @@ void md_done_sync(mddev_t *mddev, int blocks, int ok)
 }
 
 
-void md_write_start(mddev_t *mddev)
+/* md_write_start(mddev, bi)
+ * If we need to update some array metadata (e.g. 'active' flag
+ * in superblock) before writing, schedule a superblock update
+ * and wait for it to complete.
+ */
+void md_write_start(mddev_t *mddev, struct bio *bi)
 {
-       if (!atomic_read(&mddev->writes_pending)) {
-               mddev_lock_uninterruptible(mddev);
+       DEFINE_WAIT(w);
+       if (bio_data_dir(bi) != WRITE)
+               return;
+
+       atomic_inc(&mddev->writes_pending);
+       if (mddev->in_sync) {
+               spin_lock(&mddev->write_lock);
                if (mddev->in_sync) {
                        mddev->in_sync = 0;
-                       del_timer(&mddev->safemode_timer);
-                       md_update_sb(mddev);
+                       mddev->sb_dirty = 1;
+                       md_wakeup_thread(mddev->thread);
                }
-               atomic_inc(&mddev->writes_pending);
-               mddev_unlock(mddev);
-       } else
-               atomic_inc(&mddev->writes_pending);
+               spin_unlock(&mddev->write_lock);
+       }
+       wait_event(mddev->sb_wait, mddev->sb_dirty==0);
 }
 
 void md_write_end(mddev_t *mddev)
@@ -3201,37 +3438,6 @@ void md_write_end(mddev_t *mddev)
        }
 }
 
-static inline void md_enter_safemode(mddev_t *mddev)
-{
-       if (!mddev->safemode) return;
-       if (mddev->safemode == 2 &&
-           (atomic_read(&mddev->writes_pending) || mddev->in_sync ||
-                   mddev->recovery_cp != MaxSector))
-               return; /* avoid the lock */
-       mddev_lock_uninterruptible(mddev);
-       if (mddev->safemode && !atomic_read(&mddev->writes_pending) &&
-           !mddev->in_sync && mddev->recovery_cp == MaxSector) {
-               mddev->in_sync = 1;
-               md_update_sb(mddev);
-       }
-       mddev_unlock(mddev);
-
-       if (mddev->safemode == 1)
-               mddev->safemode = 0;
-}
-
-void md_handle_safemode(mddev_t *mddev)
-{
-       if (signal_pending(current)) {
-               printk(KERN_INFO "md: %s in immediate safe mode\n",
-                       mdname(mddev));
-               mddev->safemode = 2;
-               flush_signals(current);
-       }
-       md_enter_safemode(mddev);
-}
-
-
 static DECLARE_WAIT_QUEUE_HEAD(resync_wait);
 
 #define SYNC_MARKS     10
@@ -3241,12 +3447,13 @@ static void md_do_sync(mddev_t *mddev)
        mddev_t *mddev2;
        unsigned int currspeed = 0,
                 window;
-       sector_t max_sectors,j;
+       sector_t max_sectors,j, io_sectors;
        unsigned long mark[SYNC_MARKS];
        sector_t mark_cnt[SYNC_MARKS];
        int last_mark,m;
        struct list_head *tmp;
        sector_t last_check;
+       int skipped = 0;
 
        /* just incase thread restarts... */
        if (test_bit(MD_RECOVERY_DONE, &mddev->recovery))
@@ -3312,7 +3519,7 @@ static void md_do_sync(mddev_t *mddev)
 
        if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery))
                /* resync follows the size requested by the personality,
-                * which default to physical size, but can be virtual size
+                * which defaults to physical size, but can be virtual size
                 */
                max_sectors = mddev->resync_max_sectors;
        else
@@ -3327,13 +3534,15 @@ static void md_do_sync(mddev_t *mddev)
               sysctl_speed_limit_max);
 
        is_mddev_idle(mddev); /* this also initializes IO event counters */
-       if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery))
+       /* we don't use the checkpoint if there's a bitmap */
+       if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) && !mddev->bitmap)
                j = mddev->recovery_cp;
        else
                j = 0;
+       io_sectors = 0;
        for (m = 0; m < SYNC_MARKS; m++) {
                mark[m] = jiffies;
-               mark_cnt[m] = j;
+               mark_cnt[m] = io_sectors;
        }
        last_mark = 0;
        mddev->resync_mark = mark[last_mark];
@@ -3358,21 +3567,29 @@ static void md_do_sync(mddev_t *mddev)
        }
 
        while (j < max_sectors) {
-               int sectors;
+               sector_t sectors;
 
-               sectors = mddev->pers->sync_request(mddev, j, currspeed < sysctl_speed_limit_min);
-               if (sectors < 0) {
+               skipped = 0;
+               sectors = mddev->pers->sync_request(mddev, j, &skipped,
+                                           currspeed < sysctl_speed_limit_min);
+               if (sectors == 0) {
                        set_bit(MD_RECOVERY_ERR, &mddev->recovery);
                        goto out;
                }
-               atomic_add(sectors, &mddev->recovery_active);
+
+               if (!skipped) { /* actual IO requested */
+                       io_sectors += sectors;
+                       atomic_add(sectors, &mddev->recovery_active);
+               }
+
                j += sectors;
                if (j>1) mddev->curr_resync = j;
 
-               if (last_check + window > j || j == max_sectors)
+
+               if (last_check + window > io_sectors || j == max_sectors)
                        continue;
 
-               last_check = j;
+               last_check = io_sectors;
 
                if (test_bit(MD_RECOVERY_INTR, &mddev->recovery) ||
                    test_bit(MD_RECOVERY_ERR, &mddev->recovery))
@@ -3386,7 +3603,7 @@ static void md_do_sync(mddev_t *mddev)
                        mddev->resync_mark = mark[next];
                        mddev->resync_mark_cnt = mark_cnt[next];
                        mark[next] = jiffies;
-                       mark_cnt[next] = j - atomic_read(&mddev->recovery_active);
+                       mark_cnt[next] = io_sectors - atomic_read(&mddev->recovery_active);
                        last_mark = next;
                }
 
@@ -3413,7 +3630,8 @@ static void md_do_sync(mddev_t *mddev)
                mddev->queue->unplug_fn(mddev->queue);
                cond_resched();
 
-               currspeed = ((unsigned long)(j-mddev->resync_mark_cnt))/2/((jiffies-mddev->resync_mark)/HZ +1) +1;
+               currspeed = ((unsigned long)(io_sectors-mddev->resync_mark_cnt))/2
+                       /((jiffies-mddev->resync_mark)/HZ +1) +1;
 
                if (currspeed > sysctl_speed_limit_min) {
                        if ((currspeed > sysctl_speed_limit_max) ||
@@ -3433,7 +3651,7 @@ static void md_do_sync(mddev_t *mddev)
        wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active));
 
        /* tell personality that we are finished */
-       mddev->pers->sync_request(mddev, max_sectors, 1);
+       mddev->pers->sync_request(mddev, max_sectors, &skipped, 1);
 
        if (!test_bit(MD_RECOVERY_ERR, &mddev->recovery) &&
            mddev->curr_resync > 2 &&
@@ -3447,7 +3665,6 @@ static void md_do_sync(mddev_t *mddev)
                        mddev->recovery_cp = MaxSector;
        }
 
-       md_enter_safemode(mddev);
  skip:
        mddev->curr_resync = 0;
        wake_up(&resync_wait);
@@ -3484,20 +3701,48 @@ void md_check_recovery(mddev_t *mddev)
        struct list_head *rtmp;
 
 
-       dprintk(KERN_INFO "md: recovery thread got woken up ...\n");
+       if (mddev->bitmap)
+               bitmap_daemon_work(mddev->bitmap);
 
        if (mddev->ro)
                return;
+
+       if (signal_pending(current)) {
+               if (mddev->pers->sync_request) {
+                       printk(KERN_INFO "md: %s in immediate safe mode\n",
+                              mdname(mddev));
+                       mddev->safemode = 2;
+               }
+               flush_signals(current);
+       }
+
        if ( ! (
                mddev->sb_dirty ||
                test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||
-               test_bit(MD_RECOVERY_DONE, &mddev->recovery)
+               test_bit(MD_RECOVERY_DONE, &mddev->recovery) ||
+               (mddev->safemode == 1) ||
+               (mddev->safemode == 2 && ! atomic_read(&mddev->writes_pending)
+                && !mddev->in_sync && mddev->recovery_cp == MaxSector)
                ))
                return;
+
        if (mddev_trylock(mddev)==0) {
                int spares =0;
+
+               spin_lock(&mddev->write_lock);
+               if (mddev->safemode && !atomic_read(&mddev->writes_pending) &&
+                   !mddev->in_sync && mddev->recovery_cp == MaxSector) {
+                       mddev->in_sync = 1;
+                       mddev->sb_dirty = 1;
+               }
+               if (mddev->safemode == 1)
+                       mddev->safemode = 0;
+               spin_unlock(&mddev->write_lock);
+
                if (mddev->sb_dirty)
                        md_update_sb(mddev);
+
+
                if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) &&
                    !test_bit(MD_RECOVERY_DONE, &mddev->recovery)) {
                        /* resync/recovery still happening */
@@ -3515,6 +3760,14 @@ void md_check_recovery(mddev_t *mddev)
                                mddev->pers->spare_active(mddev);
                        }
                        md_update_sb(mddev);
+
+                       /* if array is no-longer degraded, then any saved_raid_disk
+                        * information must be scrapped
+                        */
+                       if (!mddev->degraded)
+                               ITERATE_RDEV(mddev,rdev,rtmp)
+                                       rdev->saved_raid_disk = -1;
+
                        mddev->recovery = 0;
                        /* flag recovery needed just to double check */
                        set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
@@ -3557,6 +3810,13 @@ void md_check_recovery(mddev_t *mddev)
                        set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
                        if (!spares)
                                set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
+                       if (spares && mddev->bitmap && ! mddev->bitmap->file) {
+                               /* We are adding a device or devices to an array
+                                * which has the bitmap stored on all devices.
+                                * So make sure all bitmap pages get written
+                                */
+                               bitmap_write_all(mddev->bitmap);
+                       }
                        mddev->sync_thread = md_register_thread(md_do_sync,
                                                                mddev,
                                                                "%s_resync");
@@ -3624,6 +3884,8 @@ static int __init md_init(void)
                        " MD_SB_DISKS=%d\n",
                        MD_MAJOR_VERSION, MD_MINOR_VERSION,
                        MD_PATCHLEVEL_VERSION, MAX_MD_DEVS, MD_SB_DISKS);
+       printk(KERN_INFO "md: bitmap version %d.%d\n", BITMAP_MAJOR,
+                       BITMAP_MINOR);
 
        if (register_blkdev(MAJOR_NR, "md"))
                return -1;
@@ -3739,7 +4001,6 @@ EXPORT_SYMBOL(md_error);
 EXPORT_SYMBOL(md_done_sync);
 EXPORT_SYMBOL(md_write_start);
 EXPORT_SYMBOL(md_write_end);
-EXPORT_SYMBOL(md_handle_safemode);
 EXPORT_SYMBOL(md_register_thread);
 EXPORT_SYMBOL(md_unregister_thread);
 EXPORT_SYMBOL(md_wakeup_thread);
index 4e4bfde3db5db8baadd5fe0242f018990970715c..2d2ca7fa0265261a71e2493e88b68403cc902c57 100644 (file)
@@ -462,10 +462,6 @@ static int multipath_run (mddev_t *mddev)
        }
        memset(conf->multipaths, 0, sizeof(struct multipath_info)*mddev->raid_disks);
 
-       mddev->queue->unplug_fn = multipath_unplug;
-
-       mddev->queue->issue_flush_fn = multipath_issue_flush;
-
        conf->working_disks = 0;
        ITERATE_RDEV(mddev,rdev,tmp) {
                disk_idx = rdev->raid_disk;
@@ -528,13 +524,16 @@ static int multipath_run (mddev_t *mddev)
         * Ok, everything is just fine now
         */
        mddev->array_size = mddev->size;
+
+       mddev->queue->unplug_fn = multipath_unplug;
+       mddev->queue->issue_flush_fn = multipath_issue_flush;
+
        return 0;
 
 out_free_conf:
        if (conf->pool)
                mempool_destroy(conf->pool);
-       if (conf->multipaths)
-               kfree(conf->multipaths);
+       kfree(conf->multipaths);
        kfree(conf);
        mddev->private = NULL;
 out:
index e7d934eca06f8de135d9cd5b545735422bc57790..e11dd14d0b43f4700f7a9779a0ed6d7676461aa4 100644 (file)
@@ -371,10 +371,8 @@ static int raid0_run (mddev_t *mddev)
        return 0;
 
 out_free_conf:
-       if (conf->strip_zone)
-               kfree(conf->strip_zone);
-       if (conf->devlist)
-               kfree (conf->devlist);
+       kfree(conf->strip_zone);
+       kfree(conf->devlist);
        kfree(conf);
        mddev->private = NULL;
 out:
@@ -386,11 +384,11 @@ static int raid0_stop (mddev_t *mddev)
        raid0_conf_t *conf = mddev_to_conf(mddev);
 
        blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
-       kfree (conf->hash_table);
+       kfree(conf->hash_table);
        conf->hash_table = NULL;
-       kfree (conf->strip_zone);
+       kfree(conf->strip_zone);
        conf->strip_zone = NULL;
-       kfree (conf);
+       kfree(conf);
        mddev->private = NULL;
 
        return 0;
index 83380b5d6593d25531a178a9aa29db17169f3a5e..ff1dbec864af51d780e1135ae392c1f6962ae37c 100644 (file)
  * Fixes to reconstruction by Jakob Østergaard" <jakob@ostenfeld.dk>
  * Various fixes by Neil Brown <neilb@cse.unsw.edu.au>
  *
+ * Changes by Peter T. Breuer <ptb@it.uc3m.es> 31/1/2003 to support
+ * bitmapped intelligence in resync:
+ *
+ *      - bitmap marked during normal i/o
+ *      - bitmap used to skip nondirty blocks during sync
+ *
+ * Additions to bitmap code, (C) 2003-2004 Paul Clements, SteelEye Technology:
+ * - persistent bitmap code
+ *
  * 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, or (at your option)
  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include "dm-bio-list.h"
 #include <linux/raid/raid1.h>
+#include <linux/raid/bitmap.h>
+
+#define DEBUG 0
+#if DEBUG
+#define PRINTK(x...) printk(x)
+#else
+#define PRINTK(x...)
+#endif
 
 /*
  * Number of guaranteed r1bios in case of extreme VM load:
@@ -287,9 +305,11 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int
        /*
         * this branch is our 'one mirror IO has finished' event handler:
         */
-       if (!uptodate)
+       if (!uptodate) {
                md_error(r1_bio->mddev, conf->mirrors[mirror].rdev);
-       else
+               /* an I/O failed, we can't clear the bitmap */
+               set_bit(R1BIO_Degraded, &r1_bio->state);
+       } else
                /*
                 * Set R1BIO_Uptodate in our master bio, so that
                 * we will return a good error code for to the higher
@@ -309,6 +329,10 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int
         * already.
         */
        if (atomic_dec_and_test(&r1_bio->remaining)) {
+               /* clear the bitmap if all writes complete successfully */
+               bitmap_endwrite(r1_bio->mddev->bitmap, r1_bio->sector,
+                               r1_bio->sectors,
+                               !test_bit(R1BIO_Degraded, &r1_bio->state));
                md_write_end(r1_bio->mddev);
                raid_end_bio_io(r1_bio);
        }
@@ -458,7 +482,10 @@ static void unplug_slaves(mddev_t *mddev)
 
 static void raid1_unplug(request_queue_t *q)
 {
-       unplug_slaves(q->queuedata);
+       mddev_t *mddev = q->queuedata;
+
+       unplug_slaves(mddev);
+       md_wakeup_thread(mddev->thread);
 }
 
 static int raid1_issue_flush(request_queue_t *q, struct gendisk *disk,
@@ -501,16 +528,16 @@ static void device_barrier(conf_t *conf, sector_t sect)
 {
        spin_lock_irq(&conf->resync_lock);
        wait_event_lock_irq(conf->wait_idle, !waitqueue_active(&conf->wait_resume),
-                           conf->resync_lock, unplug_slaves(conf->mddev));
+                           conf->resync_lock, raid1_unplug(conf->mddev->queue));
        
        if (!conf->barrier++) {
                wait_event_lock_irq(conf->wait_idle, !conf->nr_pending,
-                                   conf->resync_lock, unplug_slaves(conf->mddev));
+                                   conf->resync_lock, raid1_unplug(conf->mddev->queue));
                if (conf->nr_pending)
                        BUG();
        }
        wait_event_lock_irq(conf->wait_resume, conf->barrier < RESYNC_DEPTH,
-                           conf->resync_lock, unplug_slaves(conf->mddev));
+                           conf->resync_lock, raid1_unplug(conf->mddev->queue));
        conf->next_resync = sect;
        spin_unlock_irq(&conf->resync_lock);
 }
@@ -522,14 +549,20 @@ static int make_request(request_queue_t *q, struct bio * bio)
        mirror_info_t *mirror;
        r1bio_t *r1_bio;
        struct bio *read_bio;
-       int i, disks;
+       int i, targets = 0, disks;
        mdk_rdev_t *rdev;
+       struct bitmap *bitmap = mddev->bitmap;
+       unsigned long flags;
+       struct bio_list bl;
+
 
        /*
         * Register the new request and wait if the reconstruction
         * thread has put up a bar for new requests.
         * Continue immediately if no resync is active currently.
         */
+       md_write_start(mddev, bio); /* wait on superblock update early */
+
        spin_lock_irq(&conf->resync_lock);
        wait_event_lock_irq(conf->wait_resume, !conf->barrier, conf->resync_lock, );
        conf->nr_pending++;
@@ -552,7 +585,7 @@ static int make_request(request_queue_t *q, struct bio * bio)
 
        r1_bio->master_bio = bio;
        r1_bio->sectors = bio->bi_size >> 9;
-
+       r1_bio->state = 0;
        r1_bio->mddev = mddev;
        r1_bio->sector = bio->bi_sector;
 
@@ -595,6 +628,13 @@ static int make_request(request_queue_t *q, struct bio * bio)
         * bios[x] to bio
         */
        disks = conf->raid_disks;
+#if 0
+       { static int first=1;
+       if (first) printk("First Write sector %llu disks %d\n",
+                         (unsigned long long)r1_bio->sector, disks);
+       first = 0;
+       }
+#endif
        rcu_read_lock();
        for (i = 0;  i < disks; i++) {
                if ((rdev=conf->mirrors[i].rdev) != NULL &&
@@ -605,13 +645,21 @@ static int make_request(request_queue_t *q, struct bio * bio)
                                r1_bio->bios[i] = NULL;
                        } else
                                r1_bio->bios[i] = bio;
+                       targets++;
                } else
                        r1_bio->bios[i] = NULL;
        }
        rcu_read_unlock();
 
-       atomic_set(&r1_bio->remaining, 1);
-       md_write_start(mddev);
+       if (targets < conf->raid_disks) {
+               /* array is degraded, we will not clear the bitmap
+                * on I/O completion (see raid1_end_write_request) */
+               set_bit(R1BIO_Degraded, &r1_bio->state);
+       }
+
+       atomic_set(&r1_bio->remaining, 0);
+
+       bio_list_init(&bl);
        for (i = 0; i < disks; i++) {
                struct bio *mbio;
                if (!r1_bio->bios[i])
@@ -627,14 +675,23 @@ static int make_request(request_queue_t *q, struct bio * bio)
                mbio->bi_private = r1_bio;
 
                atomic_inc(&r1_bio->remaining);
-               generic_make_request(mbio);
-       }
 
-       if (atomic_dec_and_test(&r1_bio->remaining)) {
-               md_write_end(mddev);
-               raid_end_bio_io(r1_bio);
+               bio_list_add(&bl, mbio);
        }
 
+       bitmap_startwrite(bitmap, bio->bi_sector, r1_bio->sectors);
+       spin_lock_irqsave(&conf->device_lock, flags);
+       bio_list_merge(&conf->pending_bio_list, &bl);
+       bio_list_init(&bl);
+
+       blk_plug_device(mddev->queue);
+       spin_unlock_irqrestore(&conf->device_lock, flags);
+
+#if 0
+       while ((bio = bio_list_pop(&bl)) != NULL)
+               generic_make_request(bio);
+#endif
+
        return 0;
 }
 
@@ -714,7 +771,7 @@ static void close_sync(conf_t *conf)
 {
        spin_lock_irq(&conf->resync_lock);
        wait_event_lock_irq(conf->wait_resume, !conf->barrier,
-                           conf->resync_lock,  unplug_slaves(conf->mddev));
+                           conf->resync_lock,  raid1_unplug(conf->mddev->queue));
        spin_unlock_irq(&conf->resync_lock);
 
        if (conf->barrier) BUG();
@@ -754,9 +811,12 @@ static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
 {
        conf_t *conf = mddev->private;
        int found = 0;
-       int mirror;
+       int mirror = 0;
        mirror_info_t *p;
 
+       if (rdev->saved_raid_disk >= 0 &&
+           conf->mirrors[rdev->saved_raid_disk].rdev == NULL)
+               mirror = rdev->saved_raid_disk;
        for (mirror=0; mirror < mddev->raid_disks; mirror++)
                if ( !(p=conf->mirrors+mirror)->rdev) {
 
@@ -773,6 +833,8 @@ static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
                        p->head_position = 0;
                        rdev->raid_disk = mirror;
                        found = 1;
+                       if (rdev->saved_raid_disk != mirror)
+                               conf->fullsync = 1;
                        p->rdev = rdev;
                        break;
                }
@@ -828,10 +890,11 @@ static int end_sync_read(struct bio *bio, unsigned int bytes_done, int error)
         * or re-read if the read failed.
         * We don't do much here, just schedule handling by raid1d
         */
-       if (!uptodate)
+       if (!uptodate) {
                md_error(r1_bio->mddev,
                         conf->mirrors[r1_bio->read_disk].rdev);
-       else
+               set_bit(R1BIO_Degraded, &r1_bio->state);
+       } else
                set_bit(R1BIO_Uptodate, &r1_bio->state);
        rdev_dec_pending(conf->mirrors[r1_bio->read_disk].rdev, conf->mddev);
        reschedule_retry(r1_bio);
@@ -855,8 +918,10 @@ static int end_sync_write(struct bio *bio, unsigned int bytes_done, int error)
                        mirror = i;
                        break;
                }
-       if (!uptodate)
+       if (!uptodate) {
                md_error(mddev, conf->mirrors[mirror].rdev);
+               set_bit(R1BIO_Degraded, &r1_bio->state);
+       }
        update_head_pos(mirror, r1_bio);
 
        if (atomic_dec_and_test(&r1_bio->remaining)) {
@@ -876,6 +941,9 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
 
        bio = r1_bio->bios[r1_bio->read_disk];
 
+/*
+       if (r1_bio->sector == 0) printk("First sync write startss\n");
+*/
        /*
         * schedule writes
         */
@@ -903,10 +971,12 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
                atomic_inc(&conf->mirrors[i].rdev->nr_pending);
                atomic_inc(&r1_bio->remaining);
                md_sync_acct(conf->mirrors[i].rdev->bdev, wbio->bi_size >> 9);
+
                generic_make_request(wbio);
        }
 
        if (atomic_dec_and_test(&r1_bio->remaining)) {
+               /* if we're here, all write(s) have completed, so clean up */
                md_done_sync(mddev, r1_bio->sectors, 1);
                put_buf(r1_bio);
        }
@@ -931,11 +1001,30 @@ static void raid1d(mddev_t *mddev)
        mdk_rdev_t *rdev;
 
        md_check_recovery(mddev);
-       md_handle_safemode(mddev);
        
        for (;;) {
                char b[BDEVNAME_SIZE];
                spin_lock_irqsave(&conf->device_lock, flags);
+
+               if (conf->pending_bio_list.head) {
+                       bio = bio_list_get(&conf->pending_bio_list);
+                       blk_remove_plug(mddev->queue);
+                       spin_unlock_irqrestore(&conf->device_lock, flags);
+                       /* flush any pending bitmap writes to disk before proceeding w/ I/O */
+                       if (bitmap_unplug(mddev->bitmap) != 0)
+                               printk("%s: bitmap file write failed!\n", mdname(mddev));
+
+                       while (bio) { /* submit pending writes */
+                               struct bio *next = bio->bi_next;
+                               bio->bi_next = NULL;
+                               generic_make_request(bio);
+                               bio = next;
+                       }
+                       unplug = 1;
+
+                       continue;
+               }
+
                if (list_empty(head))
                        break;
                r1_bio = list_entry(head->prev, r1bio_t, retry_list);
@@ -1009,7 +1098,7 @@ static int init_resync(conf_t *conf)
  * that can be installed to exclude normal IO requests.
  */
 
-static int sync_request(mddev_t *mddev, sector_t sector_nr, int go_faster)
+static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster)
 {
        conf_t *conf = mddev_to_conf(mddev);
        mirror_info_t *mirror;
@@ -1019,17 +1108,43 @@ static int sync_request(mddev_t *mddev, sector_t sector_nr, int go_faster)
        int disk;
        int i;
        int write_targets = 0;
+       int sync_blocks;
 
        if (!conf->r1buf_pool)
+       {
+/*
+               printk("sync start - bitmap %p\n", mddev->bitmap);
+*/
                if (init_resync(conf))
-                       return -ENOMEM;
+                       return 0;
+       }
 
        max_sector = mddev->size << 1;
        if (sector_nr >= max_sector) {
+               /* If we aborted, we need to abort the
+                * sync on the 'current' bitmap chunk (there will
+                * only be one in raid1 resync.
+                * We can find the current addess in mddev->curr_resync
+                */
+               if (!conf->fullsync) {
+                       if (mddev->curr_resync < max_sector)
+                               bitmap_end_sync(mddev->bitmap,
+                                               mddev->curr_resync,
+                                               &sync_blocks, 1);
+                       bitmap_close_sync(mddev->bitmap);
+               }
+               if (mddev->curr_resync >= max_sector)
+                       conf->fullsync = 0;
                close_sync(conf);
                return 0;
        }
 
+       if (!conf->fullsync &&
+           !bitmap_start_sync(mddev->bitmap, sector_nr, &sync_blocks)) {
+               /* We can skip this block, and probably several more */
+               *skipped = 1;
+               return sync_blocks;
+       }
        /*
         * If there is non-resync activity waiting for us then
         * put in a delay to throttle resync.
@@ -1068,6 +1183,7 @@ static int sync_request(mddev_t *mddev, sector_t sector_nr, int go_faster)
 
        r1_bio->mddev = mddev;
        r1_bio->sector = sector_nr;
+       r1_bio->state = 0;
        set_bit(R1BIO_IsSync, &r1_bio->state);
        r1_bio->read_disk = disk;
 
@@ -1102,18 +1218,24 @@ static int sync_request(mddev_t *mddev, sector_t sector_nr, int go_faster)
                bio->bi_bdev = conf->mirrors[i].rdev->bdev;
                bio->bi_private = r1_bio;
        }
+
+       if (write_targets + 1 < conf->raid_disks)
+               /* array degraded, can't clear bitmap */
+               set_bit(R1BIO_Degraded, &r1_bio->state);
+
        if (write_targets == 0) {
                /* There is nowhere to write, so all non-sync
                 * drives must be failed - so we are finished
                 */
-               int rv = max_sector - sector_nr;
-               md_done_sync(mddev, rv, 1);
+               sector_t rv = max_sector - sector_nr;
+               *skipped = 1;
                put_buf(r1_bio);
                rdev_dec_pending(conf->mirrors[disk].rdev, mddev);
                return rv;
        }
 
        nr_sectors = 0;
+       sync_blocks = 0;
        do {
                struct page *page;
                int len = PAGE_SIZE;
@@ -1121,6 +1243,17 @@ static int sync_request(mddev_t *mddev, sector_t sector_nr, int go_faster)
                        len = (max_sector - sector_nr) << 9;
                if (len == 0)
                        break;
+               if (!conf->fullsync) {
+                       if (sync_blocks == 0) {
+                               if (!bitmap_start_sync(mddev->bitmap,
+                                                      sector_nr, &sync_blocks))
+                                       break;
+                               if (sync_blocks < (PAGE_SIZE>>9))
+                                       BUG();
+                               if (len > (sync_blocks<<9)) len = sync_blocks<<9;
+                       }
+               }
+
                for (i=0 ; i < conf->raid_disks; i++) {
                        bio = r1_bio->bios[i];
                        if (bio->bi_end_io) {
@@ -1143,6 +1276,7 @@ static int sync_request(mddev_t *mddev, sector_t sector_nr, int go_faster)
                }
                nr_sectors += len>>9;
                sector_nr += len>>9;
+               sync_blocks -= (len>>9);
        } while (r1_bio->bios[disk]->bi_vcnt < RESYNC_PAGES);
  bio_full:
        bio = r1_bio->bios[disk];
@@ -1197,10 +1331,6 @@ static int run(mddev_t *mddev)
        if (!conf->r1bio_pool)
                goto out_no_mem;
 
-       mddev->queue->unplug_fn = raid1_unplug;
-
-       mddev->queue->issue_flush_fn = raid1_issue_flush;
-
        ITERATE_RDEV(mddev, rdev, tmp) {
                disk_idx = rdev->raid_disk;
                if (disk_idx >= mddev->raid_disks
@@ -1235,6 +1365,9 @@ static int run(mddev_t *mddev)
        init_waitqueue_head(&conf->wait_idle);
        init_waitqueue_head(&conf->wait_resume);
 
+       bio_list_init(&conf->pending_bio_list);
+       bio_list_init(&conf->flushing_bio_list);
+
        if (!conf->working_disks) {
                printk(KERN_ERR "raid1: no operational mirrors for %s\n",
                        mdname(mddev));
@@ -1263,16 +1396,15 @@ static int run(mddev_t *mddev)
        conf->last_used = j;
 
 
-
-       {
-               mddev->thread = md_register_thread(raid1d, mddev, "%s_raid1");
-               if (!mddev->thread) {
-                       printk(KERN_ERR 
-                               "raid1: couldn't allocate thread for %s\n", 
-                               mdname(mddev));
-                       goto out_free_conf;
-               }
+       mddev->thread = md_register_thread(raid1d, mddev, "%s_raid1");
+       if (!mddev->thread) {
+               printk(KERN_ERR
+                      "raid1: couldn't allocate thread for %s\n",
+                      mdname(mddev));
+               goto out_free_conf;
        }
+       if (mddev->bitmap) mddev->thread->timeout = mddev->bitmap->daemon_sleep * HZ;
+
        printk(KERN_INFO 
                "raid1: raid set %s active with %d out of %d mirrors\n",
                mdname(mddev), mddev->raid_disks - mddev->degraded, 
@@ -1282,6 +1414,9 @@ static int run(mddev_t *mddev)
         */
        mddev->array_size = mddev->size;
 
+       mddev->queue->unplug_fn = raid1_unplug;
+       mddev->queue->issue_flush_fn = raid1_issue_flush;
+
        return 0;
 
 out_no_mem:
@@ -1292,10 +1427,8 @@ out_free_conf:
        if (conf) {
                if (conf->r1bio_pool)
                        mempool_destroy(conf->r1bio_pool);
-               if (conf->mirrors)
-                       kfree(conf->mirrors);
-               if (conf->poolinfo)
-                       kfree(conf->poolinfo);
+               kfree(conf->mirrors);
+               kfree(conf->poolinfo);
                kfree(conf);
                mddev->private = NULL;
        }
@@ -1312,10 +1445,8 @@ static int stop(mddev_t *mddev)
        blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
        if (conf->r1bio_pool)
                mempool_destroy(conf->r1bio_pool);
-       if (conf->mirrors)
-               kfree(conf->mirrors);
-       if (conf->poolinfo)
-               kfree(conf->poolinfo);
+       kfree(conf->mirrors);
+       kfree(conf->poolinfo);
        kfree(conf);
        mddev->private = NULL;
        return 0;
@@ -1350,17 +1481,26 @@ static int raid1_reshape(mddev_t *mddev, int raid_disks)
         * We allocate a new r1bio_pool if we can.
         * Then raise a device barrier and wait until all IO stops.
         * Then resize conf->mirrors and swap in the new r1bio pool.
+        *
+        * At the same time, we "pack" the devices so that all the missing
+        * devices have the higher raid_disk numbers.
         */
        mempool_t *newpool, *oldpool;
        struct pool_info *newpoolinfo;
        mirror_info_t *newmirrors;
        conf_t *conf = mddev_to_conf(mddev);
+       int cnt;
 
-       int d;
+       int d, d2;
 
-       for (d= raid_disks; d < conf->raid_disks; d++)
-               if (conf->mirrors[d].rdev)
+       if (raid_disks < conf->raid_disks) {
+               cnt=0;
+               for (d= 0; d < conf->raid_disks; d++)
+                       if (conf->mirrors[d].rdev)
+                               cnt++;
+               if (cnt > raid_disks)
                        return -EBUSY;
+       }
 
        newpoolinfo = kmalloc(sizeof(*newpoolinfo), GFP_KERNEL);
        if (!newpoolinfo)
@@ -1385,14 +1525,18 @@ static int raid1_reshape(mddev_t *mddev, int raid_disks)
        spin_lock_irq(&conf->resync_lock);
        conf->barrier++;
        wait_event_lock_irq(conf->wait_idle, !conf->nr_pending,
-                           conf->resync_lock, unplug_slaves(mddev));
+                           conf->resync_lock, raid1_unplug(mddev->queue));
        spin_unlock_irq(&conf->resync_lock);
 
        /* ok, everything is stopped */
        oldpool = conf->r1bio_pool;
        conf->r1bio_pool = newpool;
-       for (d=0; d < raid_disks && d < conf->raid_disks; d++)
-               newmirrors[d] = conf->mirrors[d];
+
+       for (d=d2=0; d < conf->raid_disks; d++)
+               if (conf->mirrors[d].rdev) {
+                       conf->mirrors[d].rdev->raid_disk = d2;
+                       newmirrors[d2++].rdev = conf->mirrors[d].rdev;
+               }
        kfree(conf->mirrors);
        conf->mirrors = newmirrors;
        kfree(conf->poolinfo);
@@ -1401,6 +1545,7 @@ static int raid1_reshape(mddev_t *mddev, int raid_disks)
        mddev->degraded += (raid_disks - conf->raid_disks);
        conf->raid_disks = mddev->raid_disks = raid_disks;
 
+       conf->last_used = 0; /* just make sure it is in-range */
        spin_lock_irq(&conf->resync_lock);
        conf->barrier--;
        spin_unlock_irq(&conf->resync_lock);
index e9dc2876a6269be27b0f726b83e468545be4be88..62ebb1bc72be24cc32ecc775c5bd71603d44e5c6 100644 (file)
@@ -700,6 +700,8 @@ static int make_request(request_queue_t *q, struct bio * bio)
                return 0;
        }
 
+       md_write_start(mddev, bio);
+
        /*
         * Register the new request and wait if the reconstruction
         * thread has put up a bar for new requests.
@@ -774,7 +776,7 @@ static int make_request(request_queue_t *q, struct bio * bio)
        rcu_read_unlock();
 
        atomic_set(&r10_bio->remaining, 1);
-       md_write_start(mddev);
+
        for (i = 0; i < conf->copies; i++) {
                struct bio *mbio;
                int d = r10_bio->devs[i].devnum;
@@ -1216,7 +1218,6 @@ static void raid10d(mddev_t *mddev)
        mdk_rdev_t *rdev;
 
        md_check_recovery(mddev);
-       md_handle_safemode(mddev);
 
        for (;;) {
                char b[BDEVNAME_SIZE];
@@ -1319,7 +1320,7 @@ static int init_resync(conf_t *conf)
  *
  */
 
-static int sync_request(mddev_t *mddev, sector_t sector_nr, int go_faster)
+static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster)
 {
        conf_t *conf = mddev_to_conf(mddev);
        r10bio_t *r10_bio;
@@ -1333,7 +1334,7 @@ static int sync_request(mddev_t *mddev, sector_t sector_nr, int go_faster)
 
        if (!conf->r10buf_pool)
                if (init_resync(conf))
-                       return -ENOMEM;
+                       return 0;
 
  skipped:
        max_sector = mddev->size << 1;
@@ -1341,15 +1342,15 @@ static int sync_request(mddev_t *mddev, sector_t sector_nr, int go_faster)
                max_sector = mddev->resync_max_sectors;
        if (sector_nr >= max_sector) {
                close_sync(conf);
+               *skipped = 1;
                return sectors_skipped;
        }
        if (chunks_skipped >= conf->raid_disks) {
                /* if there has been nothing to do on any drive,
                 * then there is nothing to do at all..
                 */
-               sector_t sec = max_sector - sector_nr;
-               md_done_sync(mddev, sec, 1);
-               return sec + sectors_skipped;
+               *skipped = 1;
+               return (max_sector - sector_nr) + sectors_skipped;
        }
 
        /* make sure whole request will fit in a chunk - if chunks
@@ -1563,17 +1564,22 @@ static int sync_request(mddev_t *mddev, sector_t sector_nr, int go_faster)
                }
        }
 
+       if (sectors_skipped)
+               /* pretend they weren't skipped, it makes
+                * no important difference in this case
+                */
+               md_done_sync(mddev, sectors_skipped, 1);
+
        return sectors_skipped + nr_sectors;
  giveup:
        /* There is nowhere to write, so all non-sync
         * drives must be failed, so try the next chunk...
         */
        {
-       int sec = max_sector - sector_nr;
+       sector_t sec = max_sector - sector_nr;
        sectors_skipped += sec;
        chunks_skipped ++;
        sector_nr = max_sector;
-       md_done_sync(mddev, sec, 1);
        goto skipped;
        }
 }
@@ -1639,9 +1645,6 @@ static int run(mddev_t *mddev)
                        mdname(mddev));
                goto out_free_conf;
        }
-       mddev->queue->unplug_fn = raid10_unplug;
-
-       mddev->queue->issue_flush_fn = raid10_issue_flush;
 
        ITERATE_RDEV(mddev, rdev, tmp) {
                disk_idx = rdev->raid_disk;
@@ -1713,6 +1716,9 @@ static int run(mddev_t *mddev)
        mddev->array_size = size/2;
        mddev->resync_max_sectors = size;
 
+       mddev->queue->unplug_fn = raid10_unplug;
+       mddev->queue->issue_flush_fn = raid10_issue_flush;
+
        /* Calculate max read-ahead size.
         * We need to readahead at least twice a whole stripe....
         * maybe...
@@ -1731,8 +1737,7 @@ static int run(mddev_t *mddev)
 out_free_conf:
        if (conf->r10bio_pool)
                mempool_destroy(conf->r10bio_pool);
-       if (conf->mirrors)
-               kfree(conf->mirrors);
+       kfree(conf->mirrors);
        kfree(conf);
        mddev->private = NULL;
 out:
@@ -1748,8 +1753,7 @@ static int stop(mddev_t *mddev)
        blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
        if (conf->r10bio_pool)
                mempool_destroy(conf->r10bio_pool);
-       if (conf->mirrors)
-               kfree(conf->mirrors);
+       kfree(conf->mirrors);
        kfree(conf);
        mddev->private = NULL;
        return 0;
index e96e2a10a9c96e53ebb63d562d951bba0258a380..93a9726cc2d6793ed237bfa8d3f2a955da501667 100644 (file)
@@ -1411,6 +1411,8 @@ static int make_request (request_queue_t *q, struct bio * bi)
        sector_t logical_sector, last_sector;
        struct stripe_head *sh;
 
+       md_write_start(mddev, bi);
+
        if (bio_data_dir(bi)==WRITE) {
                disk_stat_inc(mddev->gendisk, writes);
                disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bi));
@@ -1423,8 +1425,7 @@ static int make_request (request_queue_t *q, struct bio * bi)
        last_sector = bi->bi_sector + (bi->bi_size>>9);
        bi->bi_next = NULL;
        bi->bi_phys_segments = 1;       /* over-loaded to count active stripes */
-       if ( bio_data_dir(bi) == WRITE )
-               md_write_start(mddev);
+
        for (;logical_sector < last_sector; logical_sector += STRIPE_SECTORS) {
                DEFINE_WAIT(w);
                
@@ -1475,7 +1476,7 @@ static int make_request (request_queue_t *q, struct bio * bi)
 }
 
 /* FIXME go_faster isn't used */
-static int sync_request (mddev_t *mddev, sector_t sector_nr, int go_faster)
+static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster)
 {
        raid5_conf_t *conf = (raid5_conf_t *) mddev->private;
        struct stripe_head *sh;
@@ -1498,8 +1499,8 @@ static int sync_request (mddev_t *mddev, sector_t sector_nr, int go_faster)
         * nothing we can do.
         */
        if (mddev->degraded >= 1 && test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) {
-               int rv = (mddev->size << 1) - sector_nr;
-               md_done_sync(mddev, rv, 1);
+               sector_t rv = (mddev->size << 1) - sector_nr;
+               *skipped = 1;
                return rv;
        }
 
@@ -1546,7 +1547,6 @@ static void raid5d (mddev_t *mddev)
        PRINTK("+++ raid5d active\n");
 
        md_check_recovery(mddev);
-       md_handle_safemode(mddev);
 
        handled = 0;
        spin_lock_irq(&conf->device_lock);
@@ -1620,9 +1620,6 @@ static int run (mddev_t *mddev)
        atomic_set(&conf->active_stripes, 0);
        atomic_set(&conf->preread_active_stripes, 0);
 
-       mddev->queue->unplug_fn = raid5_unplug_device;
-       mddev->queue->issue_flush_fn = raid5_issue_flush;
-
        PRINTK("raid5: run(%s) called.\n", mdname(mddev));
 
        ITERATE_RDEV(mddev,rdev,tmp) {
@@ -1728,6 +1725,10 @@ memory = conf->max_nr_stripes * (sizeof(struct stripe_head) +
        }
 
        /* Ok, everything is just fine now */
+
+       mddev->queue->unplug_fn = raid5_unplug_device;
+       mddev->queue->issue_flush_fn = raid5_issue_flush;
+
        mddev->array_size =  mddev->size * (mddev->raid_disks - 1);
        return 0;
 abort:
index 8a33f351e0920f3cd4d4189b86bae39b4462e593..f62ea1a73d0d9d1b87f5f10d7b91a6f6d7f48b0d 100644 (file)
@@ -1570,6 +1570,8 @@ static int make_request (request_queue_t *q, struct bio * bi)
        sector_t logical_sector, last_sector;
        struct stripe_head *sh;
 
+       md_write_start(mddev, bi);
+
        if (bio_data_dir(bi)==WRITE) {
                disk_stat_inc(mddev->gendisk, writes);
                disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bi));
@@ -1583,8 +1585,7 @@ static int make_request (request_queue_t *q, struct bio * bi)
 
        bi->bi_next = NULL;
        bi->bi_phys_segments = 1;       /* over-loaded to count active stripes */
-       if ( bio_data_dir(bi) == WRITE )
-               md_write_start(mddev);
+
        for (;logical_sector < last_sector; logical_sector += STRIPE_SECTORS) {
                DEFINE_WAIT(w);
 
@@ -1634,7 +1635,7 @@ static int make_request (request_queue_t *q, struct bio * bi)
 }
 
 /* FIXME go_faster isn't used */
-static int sync_request (mddev_t *mddev, sector_t sector_nr, int go_faster)
+static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster)
 {
        raid6_conf_t *conf = (raid6_conf_t *) mddev->private;
        struct stripe_head *sh;
@@ -1657,8 +1658,8 @@ static int sync_request (mddev_t *mddev, sector_t sector_nr, int go_faster)
         * nothing we can do.
         */
        if (mddev->degraded >= 2 && test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) {
-               int rv = (mddev->size << 1) - sector_nr;
-               md_done_sync(mddev, rv, 1);
+               sector_t rv = (mddev->size << 1) - sector_nr;
+               *skipped = 1;
                return rv;
        }
 
@@ -1705,7 +1706,6 @@ static void raid6d (mddev_t *mddev)
        PRINTK("+++ raid6d active\n");
 
        md_check_recovery(mddev);
-       md_handle_safemode(mddev);
 
        handled = 0;
        spin_lock_irq(&conf->device_lock);
@@ -1779,9 +1779,6 @@ static int run (mddev_t *mddev)
        atomic_set(&conf->active_stripes, 0);
        atomic_set(&conf->preread_active_stripes, 0);
 
-       mddev->queue->unplug_fn = raid6_unplug_device;
-       mddev->queue->issue_flush_fn = raid6_issue_flush;
-
        PRINTK("raid6: run(%s) called.\n", mdname(mddev));
 
        ITERATE_RDEV(mddev,rdev,tmp) {
@@ -1895,6 +1892,9 @@ static int run (mddev_t *mddev)
 
        /* Ok, everything is just fine now */
        mddev->array_size =  mddev->size * (mddev->raid_disks - 2);
+
+       mddev->queue->unplug_fn = raid6_unplug_device;
+       mddev->queue->issue_flush_fn = raid6_issue_flush;
        return 0;
 abort:
        if (conf) {
index 9f6c19ac1285354c60b024197bd65ac932f2ce6d..50e8b865401883331741896bea4eae2afc739f99 100644 (file)
@@ -23,9 +23,9 @@
 LIST_HEAD(saa7146_devices);
 DECLARE_MUTEX(saa7146_devices_lock);
 
-static int saa7146_num = 0;
+static int saa7146_num;
 
-unsigned int saa7146_debug = 0;
+unsigned int saa7146_debug;
 
 module_param(saa7146_debug, int, 0644);
 MODULE_PARM_DESC(saa7146_debug, "debug level (default: 0)");
index 883ec08490f417e59a36df2cc15cf37469bed49d..4983e1b1bb1d2a7ac137f56d65365544c4fbb791 100644 (file)
@@ -33,7 +33,7 @@ source "drivers/media/dvb/dibusb/Kconfig"
 source "drivers/media/dvb/cinergyT2/Kconfig"
 
 comment "Supported FlexCopII (B2C2) Adapters"
-       depends on DVB_CORE && PCI
+       depends on DVB_CORE && (PCI || USB)
 source "drivers/media/dvb/b2c2/Kconfig"
 
 comment "Supported BT878 Adapters"
index 52596907a0be59c09e32f6f52c04010fd3fddbc9..99bd675df955ba49c61041ec35e379f75e907d76 100644 (file)
@@ -1,26 +1,50 @@
-config DVB_B2C2_SKYSTAR
-       tristate "B2C2/Technisat Air/Sky/CableStar 2 PCI"
-       depends on DVB_CORE && PCI
+config DVB_B2C2_FLEXCOP
+       tristate "Technisat/B2C2 FlexCopII(b) and FlexCopIII adapters"
+       depends on DVB_CORE
        select DVB_STV0299
        select DVB_MT352
        select DVB_MT312
        select DVB_NXT2002
+       select DVB_STV0297
        help
-         Support for the Skystar2 PCI DVB card by Technisat, which
-         is equipped with the FlexCopII chipset by B2C2, and
-         for the B2C2/BBTI Air2PC-ATSC card.
+         Support for the digital TV receiver chip made by B2C2 Inc. included in
+         Technisats PCI cards and USB boxes.
 
          Say Y if you own such a device and want to use it.
 
-config DVB_B2C2_USB
-       tristate "B2C2/Technisat Air/Sky/Cable2PC USB"
-       depends on DVB_CORE && USB && EXPERIMENTAL
+config DVB_B2C2_FLEXCOP_PCI
+       tristate "Technisat/B2C2 Air/Sky/Cable2PC PCI"
+       depends on DVB_B2C2_FLEXCOP && PCI
+       help
+         Support for the Air/Sky/CableStar2 PCI card (DVB/ATSC) by Technisat/B2C2.
+
+         Say Y if you own such a device and want to use it.
+
+config DVB_B2C2_FLEXCOP_USB
+       tristate "Technisat/B2C2 Air/Sky/Cable2PC USB"
+       depends on DVB_B2C2_FLEXCOP && USB
+       help
+         Support for the Air/Sky/Cable2PC USB1.1 box (DVB/ATSC) by Technisat/B2C2,
+
+         Say Y if you own such a device and want to use it.
+
+config DVB_B2C2_FLEXCOP_DEBUG
+       bool "Enable debug for the B2C2 FlexCop drivers"
+       depends on DVB_B2C2_FLEXCOP
+       help
+         Say Y if you want to enable the module option to control debug messages
+         of all B2C2 FlexCop drivers.
+
+config DVB_B2C2_SKYSTAR
+       tristate "B2C2/Technisat Air/Sky/CableStar 2 PCI"
+       depends on DVB_CORE && PCI
        select DVB_STV0299
        select DVB_MT352
+       select DVB_MT312
+       select DVB_NXT2002
        help
-         Support for the Air/Sky/Cable2PC USB DVB device by B2C2. Currently
-         the does nothing, but providing basic function for the used usb 
-         protocol.
+         Support for the Skystar2 PCI DVB card by Technisat, which
+         is equipped with the FlexCopII chipset by B2C2, and
+         for the B2C2/BBTI Air2PC-ATSC card.
 
          Say Y if you own such a device and want to use it.
-
index 9fb1247bfab88db84427d28429f3b4bc3ad469a2..7703812af34f9f9001de8fcb9820bf83350e4a53 100644 (file)
@@ -1,6 +1,14 @@
-obj-b2c2-usb = b2c2-usb-core.o b2c2-common.o
+b2c2-flexcop-objs = flexcop.o flexcop-fe-tuner.o flexcop-i2c.o \
+       flexcop-sram.o flexcop-eeprom.o flexcop-misc.o flexcop-hw-filter.o \
+       flexcop-dma.o
+obj-$(CONFIG_DVB_B2C2_FLEXCOP) += b2c2-flexcop.o
+
+b2c2-flexcop-pci-objs = flexcop-pci.o
+obj-$(CONFIG_DVB_B2C2_FLEXCOP_PCI) += b2c2-flexcop-pci.o
+
+b2c2-flexcop-usb-objs = flexcop-usb.o
+obj-$(CONFIG_DVB_B2C2_FLEXCOP_USB) += b2c2-flexcop-usb.o
 
 obj-$(CONFIG_DVB_B2C2_SKYSTAR) += skystar2.o
-obj-$(CONFIG_DVB_B2C2_USB) + = b2c2-usb.o
 
 EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
diff --git a/drivers/media/dvb/b2c2/b2c2-common.c b/drivers/media/dvb/b2c2/b2c2-common.c
deleted file mode 100644 (file)
index 000d60c..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * b2c2-common.c - common methods for the B2C2/Technisat SkyStar2 PCI DVB card and
- *                 for the B2C2/Technisat Sky/Cable/AirStar USB devices
- *                 based on the FlexCopII/FlexCopIII by B2C2, Inc.
- *
- * Copyright (C) 2003  Vadim Catana, skystar@moldova.cc
- *
- * FIX: DISEQC Tone Burst in flexcop_diseqc_ioctl()
- * FIX: FULL soft DiSEqC for skystar2 (FlexCopII rev 130) VP310 equipped
- *     Vincenzo Di Massa, hawk.it at tiscalinet.it
- *
- * Converted to Linux coding style
- * Misc reorganization, polishing, restyling
- *     Roberto Ragusa, r.ragusa at libero.it
- *
- * Added hardware filtering support,
- *     Niklas Peinecke, peinecke at gdv.uni-hannover.de
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1
- * 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 Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- */
-#include "stv0299.h"
-#include "mt352.h"
-#include "mt312.h"
-
-static int samsung_tbmu24112_set_symbol_rate(struct dvb_frontend* fe, u32 srate, u32 ratio)
-{
-       u8 aclk = 0;
-       u8 bclk = 0;
-
-       if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; }
-       else if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; }
-       else if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; }
-       else if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; }
-       else if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; }
-       else if (srate < 45000000) { aclk = 0xb4; bclk = 0x51; }
-
-       stv0299_writereg (fe, 0x13, aclk);
-       stv0299_writereg (fe, 0x14, bclk);
-       stv0299_writereg (fe, 0x1f, (ratio >> 16) & 0xff);
-       stv0299_writereg (fe, 0x20, (ratio >>  8) & 0xff);
-       stv0299_writereg (fe, 0x21, (ratio      ) & 0xf0);
-
-       return 0;
-}
-
-static int samsung_tbmu24112_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
-{
-       u8 buf[4];
-       u32 div;
-       struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) };
-//     struct adapter* adapter = (struct adapter*) fe->dvb->priv;
-
-       div = params->frequency / 125;
-
-       buf[0] = (div >> 8) & 0x7f;
-       buf[1] = div & 0xff;
-       buf[2] = 0x84;  // 0xC4
-       buf[3] = 0x08;
-
-       if (params->frequency < 1500000) buf[3] |= 0x10;
-
-//     if (i2c_transfer (&adapter->i2c_adap, &msg, 1) != 1) return -EIO;
-       return 0;
-}
-
-static u8 samsung_tbmu24112_inittab[] = {
-            0x01, 0x15,
-            0x02, 0x30,
-            0x03, 0x00,
-            0x04, 0x7D,
-            0x05, 0x35,
-            0x06, 0x02,
-            0x07, 0x00,
-            0x08, 0xC3,
-            0x0C, 0x00,
-            0x0D, 0x81,
-            0x0E, 0x23,
-            0x0F, 0x12,
-            0x10, 0x7E,
-            0x11, 0x84,
-            0x12, 0xB9,
-            0x13, 0x88,
-            0x14, 0x89,
-            0x15, 0xC9,
-            0x16, 0x00,
-            0x17, 0x5C,
-            0x18, 0x00,
-            0x19, 0x00,
-            0x1A, 0x00,
-            0x1C, 0x00,
-            0x1D, 0x00,
-            0x1E, 0x00,
-            0x1F, 0x3A,
-            0x20, 0x2E,
-            0x21, 0x80,
-            0x22, 0xFF,
-            0x23, 0xC1,
-            0x28, 0x00,
-            0x29, 0x1E,
-            0x2A, 0x14,
-            0x2B, 0x0F,
-            0x2C, 0x09,
-            0x2D, 0x05,
-            0x31, 0x1F,
-            0x32, 0x19,
-            0x33, 0xFE,
-            0x34, 0x93,
-            0xff, 0xff,
-};
-
-static struct stv0299_config samsung_tbmu24112_config = {
-       .demod_address = 0x68,
-       .inittab = samsung_tbmu24112_inittab,
-       .mclk = 88000000UL,
-       .invert = 0,
-       .enhanced_tuning = 0,
-       .skip_reinit = 0,
-       .lock_output = STV0229_LOCKOUTPUT_LK,
-       .volt13_op0_op1 = STV0299_VOLT13_OP1,
-       .min_delay_ms = 100,
-       .set_symbol_rate = samsung_tbmu24112_set_symbol_rate,
-       .pll_set = samsung_tbmu24112_pll_set,
-};
-
-
-
-
-
-static int samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe)
-{
-       static u8 mt352_clock_config [] = { 0x89, 0x10, 0x2d };
-       static u8 mt352_reset [] = { 0x50, 0x80 };
-       static u8 mt352_adc_ctl_1_cfg [] = { 0x8E, 0x40 };
-       static u8 mt352_agc_cfg [] = { 0x67, 0x28, 0xa1 };
-       static u8 mt352_capt_range_cfg[] = { 0x75, 0x32 };
-
-       mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config));
-       udelay(2000);
-       mt352_write(fe, mt352_reset, sizeof(mt352_reset));
-       mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg));
-
-       mt352_write(fe, mt352_agc_cfg, sizeof(mt352_agc_cfg));
-       mt352_write(fe, mt352_capt_range_cfg, sizeof(mt352_capt_range_cfg));
-
-       return 0;
-}
-
-static int samsung_tdtc9251dh0_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf)
-{
-       u32 div;
-       unsigned char bs = 0;
-
-       #define IF_FREQUENCYx6 217    /* 6 * 36.16666666667MHz */
-       div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
-
-       if (params->frequency >= 48000000 && params->frequency <= 154000000) bs = 0x09;
-       if (params->frequency >= 161000000 && params->frequency <= 439000000) bs = 0x0a;
-       if (params->frequency >= 447000000 && params->frequency <= 863000000) bs = 0x08;
-
-       pllbuf[0] = 0xc2; // Note: non-linux standard PLL i2c address
-       pllbuf[1] = div >> 8;
-       pllbuf[2] = div & 0xff;
-       pllbuf[3] = 0xcc;
-       pllbuf[4] = bs;
-
-       return 0;
-}
-
-static struct mt352_config samsung_tdtc9251dh0_config = {
-
-       .demod_address = 0x0f,
-       .demod_init = samsung_tdtc9251dh0_demod_init,
-       .pll_set = samsung_tdtc9251dh0_pll_set,
-};
-
-static int skystar23_samsung_tbdu18132_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
-{
-       u8 buf[4];
-       u32 div;
-       struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) };
-//     struct adapter* adapter = (struct adapter*) fe->dvb->priv;
-
-       div = (params->frequency + (125/2)) / 125;
-
-       buf[0] = (div >> 8) & 0x7f;
-       buf[1] = (div >> 0) & 0xff;
-       buf[2] = 0x84 | ((div >> 10) & 0x60);
-       buf[3] = 0x80;
-
-       if (params->frequency < 1550000)
-               buf[3] |= 0x02;
-
-       //if (i2c_transfer (&adapter->i2c_adap, &msg, 1) != 1) return -EIO;
-       return 0;
-}
-
-static struct mt312_config skystar23_samsung_tbdu18132_config = {
-
-       .demod_address = 0x0e,
-       .pll_set = skystar23_samsung_tbdu18132_pll_set,
-};
diff --git a/drivers/media/dvb/b2c2/b2c2-usb-core.c b/drivers/media/dvb/b2c2/b2c2-usb-core.c
deleted file mode 100644 (file)
index 9306da0..0000000
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- * Copyright (C) 2004 Patrick Boettcher <patrick.boettcher@desy.de>,
- *                    Luca Bertagnolio <>,
- *
- * based on information provided by John Jurrius from BBTI, 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, version 2.
- *
- */
-
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/usb.h>
-#include <linux/moduleparam.h>
-#include <linux/pci.h>
-#include <linux/version.h>
-
-#include "dmxdev.h"
-#include "dvb_demux.h"
-#include "dvb_filter.h"
-#include "dvb_net.h"
-#include "dvb_frontend.h"
-
-/* debug */
-#define dprintk(level,args...) \
-           do { if ((debug & level)) { printk(args); } } while (0)
-#define debug_dump(b,l) if (debug) {\
-       int i; deb_xfer("%s: %d > ",__FUNCTION__,l); \
-       for (i = 0; i < l; i++) deb_xfer("%02x ", b[i]); \
-       deb_xfer("\n");\
-}
-
-static int debug;
-module_param(debug, int, 0644);
-MODULE_PARM_DESC(debug, "set debugging level (1=info,ts=2,ctrl=4 (or-able)).");
-
-#define deb_info(args...) dprintk(0x01,args)
-#define deb_ts(args...)   dprintk(0x02,args)
-#define deb_ctrl(args...) dprintk(0x04,args)
-
-/* Version information */
-#define DRIVER_VERSION "0.0"
-#define DRIVER_DESC "Driver for B2C2/Technisat Air/Cable/Sky-2-PC USB devices"
-#define DRIVER_AUTHOR "Patrick Boettcher, patrick.boettcher@desy.de"
-
-/* transfer parameters */
-#define B2C2_USB_FRAMES_PER_ISO                4
-#define B2C2_USB_NUM_ISO_URB           4    /* TODO check out a good value */
-
-#define B2C2_USB_CTRL_PIPE_IN          usb_rcvctrlpipe(b2c2->udev,0)
-#define B2C2_USB_CTRL_PIPE_OUT         usb_sndctrlpipe(b2c2->udev,0)
-#define B2C2_USB_DATA_PIPE                     usb_rcvisocpipe(b2c2->udev,0x81)
-
-struct usb_b2c2_usb {
-       struct usb_device *udev;
-       struct usb_interface *uintf;
-
-       u8 *iso_buffer;
-       int buffer_size;
-       dma_addr_t iso_dma_handle;
-       struct urb *iso_urb[B2C2_USB_NUM_ISO_URB];
-};
-
-
-/*
- * USB
- * 10 90 34 12 78 56 04 00
- * usb_control_msg(udev, usb_sndctrlpipe(udev,0),
- * 0x90,
- * 0x10,
- * 0x1234,
- * 0x5678,
- * buf,
- * 4,
- * 5*HZ);
- *
- * extern int usb_control_msg(struct usb_device *dev, unsigned int pipe,
- * __u8 request,
- * __u8 requesttype,
- * __u16 value,
- * __u16 index,
- * void *data,
- * __u16 size,
- * int timeout);
- *
- */
-
-/* request types */
-typedef enum {
-
-/* something is wrong with this part
-       RTYPE_READ_DW         = (1 << 6),
-       RTYPE_WRITE_DW_1      = (3 << 6),
-       RTYPE_READ_V8_MEMORY  = (6 << 6),
-       RTYPE_WRITE_V8_MEMORY = (7 << 6),
-       RTYPE_WRITE_V8_FLASH  = (8 << 6),
-       RTYPE_GENERIC         = (9 << 6),
-*/
-       RTYPE_READ_DW = (3 << 6),
-       RTYPE_WRITE_DW_1 = (1 << 6),
-       
-       RTYPE_READ_V8_MEMORY  = (6 << 6),
-       RTYPE_WRITE_V8_MEMORY = (7 << 6),
-       RTYPE_WRITE_V8_FLASH  = (8 << 6),
-       RTYPE_GENERIC         = (9 << 6),
-} b2c2_usb_request_type_t;
-
-/* request */
-typedef enum {
-       B2C2_USB_WRITE_V8_MEM = 0x04,
-       B2C2_USB_READ_V8_MEM  = 0x05,
-       B2C2_USB_READ_REG     = 0x08,
-       B2C2_USB_WRITE_REG    = 0x0A,
-/*     B2C2_USB_WRITEREGLO   = 0x0A, */
-       B2C2_USB_WRITEREGHI   = 0x0B,
-       B2C2_USB_FLASH_BLOCK  = 0x10,
-       B2C2_USB_I2C_REQUEST  = 0x11,
-       B2C2_USB_UTILITY      = 0x12,
-} b2c2_usb_request_t;
-
-/* function definition for I2C_REQUEST */
-typedef enum {
-       USB_FUNC_I2C_WRITE       = 0x01,
-       USB_FUNC_I2C_MULTIWRITE  = 0x02,
-       USB_FUNC_I2C_READ        = 0x03,
-       USB_FUNC_I2C_REPEATWRITE = 0x04,
-       USB_FUNC_GET_DESCRIPTOR  = 0x05,
-       USB_FUNC_I2C_REPEATREAD  = 0x06,
-/* DKT 020208 - add this to support special case of DiSEqC */
-       USB_FUNC_I2C_CHECKWRITE  = 0x07,
-       USB_FUNC_I2C_CHECKRESULT = 0x08,
-} b2c2_usb_i2c_function_t;
-
-/*
- * function definition for UTILITY request 0x12
- * DKT 020304 - new utility function
- */
-typedef enum {
-       UTILITY_SET_FILTER          = 0x01,
-       UTILITY_DATA_ENABLE         = 0x02,
-       UTILITY_FLEX_MULTIWRITE     = 0x03,
-       UTILITY_SET_BUFFER_SIZE     = 0x04,
-       UTILITY_FLEX_OPERATOR       = 0x05,
-       UTILITY_FLEX_RESET300_START = 0x06,
-       UTILITY_FLEX_RESET300_STOP  = 0x07,
-       UTILITY_FLEX_RESET300       = 0x08,
-       UTILITY_SET_ISO_SIZE        = 0x09,
-       UTILITY_DATA_RESET          = 0x0A,
-       UTILITY_GET_DATA_STATUS     = 0x10,
-       UTILITY_GET_V8_REG          = 0x11,
-/* DKT 020326 - add function for v1.14 */
-       UTILITY_SRAM_WRITE          = 0x12,
-       UTILITY_SRAM_READ           = 0x13,
-       UTILITY_SRAM_TESTFILL       = 0x14,
-       UTILITY_SRAM_TESTSET        = 0x15,
-       UTILITY_SRAM_TESTVERIFY     = 0x16,
-} b2c2_usb_utility_function_t;
-
-#define B2C2_WAIT_FOR_OPERATION_RW  1  // 1 s
-#define B2C2_WAIT_FOR_OPERATION_RDW 3  // 3 s
-#define B2C2_WAIT_FOR_OPERATION_WDW 1  // 1 s
-
-#define B2C2_WAIT_FOR_OPERATION_V8READ   3  // 3 s
-#define B2C2_WAIT_FOR_OPERATION_V8WRITE  3  // 3 s
-#define B2C2_WAIT_FOR_OPERATION_V8FLASH  3  // 3 s
-
-/* JLP 111700: we will include the 1 bit gap between the upper and lower 3 bits
- * in the IBI address, to make the V8 code simpler.
- * PCI ADDRESS FORMAT: 0x71C -> 0000 0111 0001 1100 (these are the six bits used)
- *                  in general: 0000 0HHH 000L LL00
- * IBI ADDRESS FORMAT:                    RHHH BLLL
- *
- * where R is the read(1)/write(0) bit, B is the busy bit
- * and HHH and LLL are the two sets of three bits from the PCI address.
- */
-#define B2C2_FLEX_PCIOFFSET_TO_INTERNALADDR(usPCI) (u8) (((usPCI >> 2) & 0x07) + ((usPCI >> 4) & 0x70))
-#define B2C2_FLEX_INTERNALADDR_TO_PCIOFFSET(ucAddr) (u16) (((ucAddr & 0x07) << 2) + ((ucAddr & 0x70) << 4))
-
-/*
- * DKT 020228 - forget about this VENDOR_BUFFER_SIZE, read and write register
- * deal with DWORD or 4 bytes, that should be should from now on
- */
-static u32 b2c2_usb_read_dw(struct usb_b2c2_usb *b2c2, u16 wRegOffsPCI)
-{
-       u32 val;
-       u16 wAddress = B2C2_FLEX_PCIOFFSET_TO_INTERNALADDR(wRegOffsPCI) | 0x0080;
-       int len = usb_control_msg(b2c2->udev,
-                       B2C2_USB_CTRL_PIPE_IN,
-                       B2C2_USB_READ_REG,
-                       RTYPE_READ_DW,
-                       wAddress,
-                       0,
-                       &val,
-                       sizeof(u32),
-                       B2C2_WAIT_FOR_OPERATION_RDW * 1000);
-
-       if (len != sizeof(u32)) {
-               err("error while reading dword from %d (%d).",wAddress,wRegOffsPCI);
-               return -EIO;
-       } else
-               return val;
-}
-
-/*
- * DKT 020228 - from now on, we don't support anything older than firm 1.00
- * I eliminated the write register as a 2 trip of writing hi word and lo word
- * and force this to write only 4 bytes at a time.
- * NOTE: this should work with all the firmware from 1.00 and newer
- */
-static int b2c2_usb_write_dw(struct usb_b2c2_usb *b2c2, u16 wRegOffsPCI, u32 val)
-{
-       u16 wAddress = B2C2_FLEX_PCIOFFSET_TO_INTERNALADDR(wRegOffsPCI);
-       int len = usb_control_msg(b2c2->udev,
-                       B2C2_USB_CTRL_PIPE_OUT,
-                       B2C2_USB_WRITE_REG,
-                       RTYPE_WRITE_DW_1,
-                       wAddress,
-                       0,
-                       &val,
-                       sizeof(u32),
-                       B2C2_WAIT_FOR_OPERATION_RDW * 1000);
-
-       if (len != sizeof(u32)) {
-               err("error while reading dword from %d (%d).",wAddress,wRegOffsPCI);
-               return -EIO;
-       } else
-               return 0;
-}
-
-/*
- * DKT 010817 - add support for V8 memory read/write and flash update
- */
-static int b2c2_usb_v8_memory_req(struct usb_b2c2_usb *b2c2,
-               b2c2_usb_request_t req, u8 page, u16 wAddress,
-               u16 buflen, u8 *pbBuffer)
-{
-       u8 dwRequestType;
-       u16 wIndex;
-       int nWaitTime,pipe,len;
-
-       wIndex = page << 8;
-
-       switch (req) {
-               case B2C2_USB_READ_V8_MEM:
-                       nWaitTime = B2C2_WAIT_FOR_OPERATION_V8READ;
-                       dwRequestType = (u8) RTYPE_READ_V8_MEMORY;
-                       pipe = B2C2_USB_CTRL_PIPE_IN;
-               break;
-               case B2C2_USB_WRITE_V8_MEM:
-                       wIndex |= pbBuffer[0];
-                       nWaitTime = B2C2_WAIT_FOR_OPERATION_V8WRITE;
-                       dwRequestType = (u8) RTYPE_WRITE_V8_MEMORY;
-                       pipe = B2C2_USB_CTRL_PIPE_OUT;
-               break;
-               case B2C2_USB_FLASH_BLOCK:
-                       nWaitTime = B2C2_WAIT_FOR_OPERATION_V8FLASH;
-                       dwRequestType = (u8) RTYPE_WRITE_V8_FLASH;
-                       pipe = B2C2_USB_CTRL_PIPE_OUT;
-               break;
-               default:
-                       deb_info("unsupported request for v8_mem_req %x.\n",req);
-               return -EINVAL;
-       }
-       len = usb_control_msg(b2c2->udev,pipe,
-                       req,
-                       dwRequestType,
-                       wAddress,
-                       wIndex,
-                       pbBuffer,
-                       buflen,
-                       nWaitTime * 1000);
-       return len == buflen ? 0 : -EIO;
-}
-
-static int b2c2_usb_i2c_req(struct usb_b2c2_usb *b2c2,
-               b2c2_usb_request_t req, b2c2_usb_i2c_function_t func,
-               u8 port, u8 chipaddr, u8 addr, u8 buflen, u8 *buf)
-{
-       u16 wValue, wIndex;
-       int nWaitTime,pipe,len;
-       u8 dwRequestType;
-
-       switch (func) {
-               case USB_FUNC_I2C_WRITE:
-               case USB_FUNC_I2C_MULTIWRITE:
-               case USB_FUNC_I2C_REPEATWRITE:
-               /* DKT 020208 - add this to support special case of DiSEqC */
-               case USB_FUNC_I2C_CHECKWRITE:
-                       pipe = B2C2_USB_CTRL_PIPE_OUT;
-                       nWaitTime = 2;
-                       dwRequestType = (u8) RTYPE_GENERIC;
-               break;
-               case USB_FUNC_I2C_READ:
-               case USB_FUNC_I2C_REPEATREAD:
-                       pipe = B2C2_USB_CTRL_PIPE_IN;
-                       nWaitTime = 2;
-                       dwRequestType = (u8) RTYPE_GENERIC;
-               break;
-               default:
-                       deb_info("unsupported function for i2c_req %x\n",func);
-                       return -EINVAL;
-       }
-       wValue = (func << 8 ) | port;
-       wIndex = (chipaddr << 8 ) | addr;
-
-       len = usb_control_msg(b2c2->udev,pipe,
-                       req,
-                       dwRequestType,
-                       addr,
-                       wIndex,
-                       buf,
-                       buflen,
-                       nWaitTime * 1000);
-       return len == buflen ? 0 : -EIO;
-}
-
-int static b2c2_usb_utility_req(struct usb_b2c2_usb *b2c2, int set,
-               b2c2_usb_utility_function_t func, u8 extra, u16 wIndex,
-               u16 buflen, u8 *pvBuffer)
-{
-       u16 wValue;
-       int nWaitTime = 2,
-               pipe = set ? B2C2_USB_CTRL_PIPE_OUT : B2C2_USB_CTRL_PIPE_IN,
-               len;
-
-       wValue = (func << 8) | extra;
-
-       len = usb_control_msg(b2c2->udev,pipe,
-                       B2C2_USB_UTILITY,
-                       (u8) RTYPE_GENERIC,
-                       wValue,
-                       wIndex,
-                       pvBuffer,
-                       buflen,
-                       nWaitTime * 1000);
-       return len == buflen ? 0 : -EIO;
-}
-
-
-
-static void b2c2_dumpfourreg(struct usb_b2c2_usb *b2c2, u16 offs)
-{
-       u32 r0,r1,r2,r3;
-       r0 = r1 = r2 = r3 = 0;
-       r0 = b2c2_usb_read_dw(b2c2,offs);
-       r1 = b2c2_usb_read_dw(b2c2,offs + 0x04);
-       r2 = b2c2_usb_read_dw(b2c2,offs + 0x08);
-       r3 = b2c2_usb_read_dw(b2c2,offs + 0x0c);
-       deb_ctrl("dump: offset: %03x, %08x, %08x, %08x, %08x\n",offs,r0,r1,r2,r3);
-}
-
-static void b2c2_urb_complete(struct urb *urb, struct pt_regs *ptregs)
-{
-       struct usb_b2c2_usb *b2c2 = urb->context;
-       deb_ts("urb completed, bufsize: %d\n",urb->transfer_buffer_length);
-
-//     urb_submit_urb(urb,GFP_ATOMIC); enable for real action
-}
-
-static void b2c2_exit_usb(struct usb_b2c2_usb *b2c2)
-{
-       int i;
-       for (i = 0; i < B2C2_USB_NUM_ISO_URB; i++)
-               if (b2c2->iso_urb[i] != NULL) { /* not sure about unlink_urb and iso-urbs TODO */
-                       deb_info("unlinking/killing urb no. %d\n",i);
-#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,7)
-                       usb_unlink_urb(b2c2->iso_urb[i]);
-#else
-                       usb_kill_urb(b2c2->iso_urb[i]);
-#endif
-                       usb_free_urb(b2c2->iso_urb[i]);
-               }
-
-       if (b2c2->iso_buffer != NULL)
-               pci_free_consistent(NULL,b2c2->buffer_size, b2c2->iso_buffer, b2c2->iso_dma_handle);
-
-}
-
-static int b2c2_init_usb(struct usb_b2c2_usb *b2c2)
-{
-       u16 frame_size = le16_to_cpu(b2c2->uintf->cur_altsetting->endpoint[0].desc.wMaxPacketSize);
-       int bufsize = B2C2_USB_NUM_ISO_URB * B2C2_USB_FRAMES_PER_ISO * frame_size,i,j,ret;
-       int buffer_offset = 0;
-
-       deb_info("creating %d iso-urbs with %d frames each of %d bytes size = %d.\n",
-                       B2C2_USB_NUM_ISO_URB, B2C2_USB_FRAMES_PER_ISO, frame_size,bufsize);
-
-       b2c2->iso_buffer = pci_alloc_consistent(NULL,bufsize,&b2c2->iso_dma_handle);
-       if (b2c2->iso_buffer == NULL)
-               return -ENOMEM;
-       memset(b2c2->iso_buffer, 0, bufsize);
-       b2c2->buffer_size = bufsize;
-
-       /* creating iso urbs */
-       for (i = 0; i < B2C2_USB_NUM_ISO_URB; i++)
-               if (!(b2c2->iso_urb[i] = usb_alloc_urb(B2C2_USB_FRAMES_PER_ISO,GFP_ATOMIC))) {
-                       ret = -ENOMEM;
-                       goto urb_error;
-               }
-       /* initialising and submitting iso urbs */
-       for (i = 0; i < B2C2_USB_NUM_ISO_URB; i++) {
-               int frame_offset = 0;
-               struct urb *urb = b2c2->iso_urb[i];
-               deb_info("initializing and submitting urb no. %d (buf_offset: %d).\n",i,buffer_offset);
-
-               urb->dev = b2c2->udev;
-               urb->context = b2c2;
-               urb->complete = b2c2_urb_complete;
-               urb->pipe = B2C2_USB_DATA_PIPE;
-               urb->transfer_flags = URB_ISO_ASAP;
-               urb->interval = 1;
-               urb->number_of_packets = B2C2_USB_FRAMES_PER_ISO;
-               urb->transfer_buffer_length = frame_size * B2C2_USB_FRAMES_PER_ISO;
-               urb->transfer_buffer = b2c2->iso_buffer + buffer_offset;
-
-               buffer_offset += frame_size * B2C2_USB_FRAMES_PER_ISO;
-               for (j = 0; j < B2C2_USB_FRAMES_PER_ISO; j++) {
-                       deb_info("urb no: %d, frame: %d, frame_offset: %d\n",i,j,frame_offset);
-                       urb->iso_frame_desc[j].offset = frame_offset;
-                       urb->iso_frame_desc[j].length = frame_size;
-                       frame_offset += frame_size;
-               }
-
-               if ((ret = usb_submit_urb(b2c2->iso_urb[i],GFP_ATOMIC))) {
-                       err("submitting urb %d failed with %d.",i,ret);
-                       goto urb_error;
-               }
-               deb_info("submitted urb no. %d.\n",i);
-       }
-
-       ret = 0;
-       goto success;
-urb_error:
-       b2c2_exit_usb(b2c2);
-success:
-       return ret;
-}
-
-static int b2c2_usb_probe(struct usb_interface *intf,
-               const struct usb_device_id *id)
-{
-       struct usb_device *udev = interface_to_usbdev(intf);
-       struct usb_b2c2_usb *b2c2 = NULL;
-       int ret;
-
-       b2c2 = kmalloc(sizeof(struct usb_b2c2_usb),GFP_KERNEL);
-       if (b2c2 == NULL) {
-               err("no memory");
-               return -ENOMEM;
-       }
-       b2c2->udev = udev;
-       b2c2->uintf = intf;
-
-       /* use the alternate setting with the larges buffer */
-       usb_set_interface(udev,0,1);
-
-       if ((ret = b2c2_init_usb(b2c2)))
-               goto usb_init_error;
-
-       usb_set_intfdata(intf,b2c2);
-
-       switch (udev->speed) {
-               case USB_SPEED_LOW:
-                       err("cannot handle USB speed because it is to sLOW.");
-                       break;
-               case USB_SPEED_FULL:
-                       info("running at FULL speed.");
-                       break;
-               case USB_SPEED_HIGH:
-                       info("running at HIGH speed.");
-                       break;
-               case USB_SPEED_UNKNOWN: /* fall through */
-               default:
-                       err("cannot handle USB speed because it is unkown.");
-               break;
-       }
-
-       b2c2_dumpfourreg(b2c2,0x200);
-       b2c2_dumpfourreg(b2c2,0x300);
-       b2c2_dumpfourreg(b2c2,0x400);
-       b2c2_dumpfourreg(b2c2,0x700);
-
-
-       if (ret == 0)
-               info("%s successfully initialized and connected.",DRIVER_DESC);
-       else
-               info("%s error while loading driver (%d)",DRIVER_DESC,ret);
-
-       ret = 0;
-       goto success;
-
-usb_init_error:
-       kfree(b2c2);
-success:
-       return ret;
-}
-
-static void b2c2_usb_disconnect(struct usb_interface *intf)
-{
-       struct usb_b2c2_usb *b2c2 = usb_get_intfdata(intf);
-       usb_set_intfdata(intf,NULL);
-       if (b2c2 != NULL) {
-               b2c2_exit_usb(b2c2);
-               kfree(b2c2);
-       }
-       info("%s successfully deinitialized and disconnected.",DRIVER_DESC);
-
-}
-
-static struct usb_device_id b2c2_usb_table [] = {
-           { USB_DEVICE(0x0af7, 0x0101) }
-};
-
-/* usb specific object needed to register this driver with the usb subsystem */
-static struct usb_driver b2c2_usb_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "dvb_b2c2_usb",
-       .probe          = b2c2_usb_probe,
-       .disconnect = b2c2_usb_disconnect,
-       .id_table       = b2c2_usb_table,
-};
-
-/* module stuff */
-static int __init b2c2_usb_init(void)
-{
-       int result;
-       if ((result = usb_register(&b2c2_usb_driver))) {
-               err("usb_register failed. Error number %d",result);
-               return result;
-       }
-
-       return 0;
-}
-
-static void __exit b2c2_usb_exit(void)
-{
-       /* deregister this driver from the USB subsystem */
-       usb_deregister(&b2c2_usb_driver);
-}
-
-module_init (b2c2_usb_init);
-module_exit (b2c2_usb_exit);
-
-MODULE_AUTHOR(DRIVER_AUTHOR);
-MODULE_DESCRIPTION(DRIVER_DESC);
-MODULE_LICENSE("GPL");
-MODULE_DEVICE_TABLE(usb, b2c2_usb_table);
diff --git a/drivers/media/dvb/b2c2/flexcop-common.h b/drivers/media/dvb/b2c2/flexcop-common.h
new file mode 100644 (file)
index 0000000..773d158
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+ * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III
+ *
+ * flexcop-common.h - common header file for device-specific source files also.
+ *
+ * see flexcop.c for copyright information.
+ */
+#ifndef __FLEXCOP_COMMON_H__
+#define __FLEXCOP_COMMON_H__
+
+#include <linux/config.h>
+#include <linux/pci.h>
+
+#include "flexcop-reg.h"
+
+#include "dmxdev.h"
+#include "dvb_demux.h"
+#include "dvb_filter.h"
+#include "dvb_net.h"
+#include "dvb_frontend.h"
+
+#define FC_MAX_FEED 256
+
+#ifndef FC_LOG_PREFIX
+#warning please define a log prefix for your file, using a default one
+#define FC_LOG_PREFIX "b2c2-undef"
+#endif
+
+/* Steal from usb.h */
+#undef err
+#define err(format,  arg...) printk(KERN_ERR     FC_LOG_PREFIX ": " format "\n" , ## arg)
+#undef info
+#define info(format, arg...) printk(KERN_INFO    FC_LOG_PREFIX ": " format "\n" , ## arg)
+#undef warn
+#define warn(format, arg...) printk(KERN_WARNING FC_LOG_PREFIX ": " format "\n" , ## arg)
+
+struct flexcop_dma {
+       struct pci_dev *pdev;
+
+       u8 *cpu_addr0;
+       dma_addr_t dma_addr0;
+       u8 *cpu_addr1;
+       dma_addr_t dma_addr1;
+       u32 size; /* size of each address in bytes */
+};
+
+/* Control structure for data definitions that are common to
+ * the B2C2-based PCI and USB devices.
+ */
+struct flexcop_device {
+       /* general */
+       struct device *dev; /* for firmware_class */
+
+#define FC_STATE_DVB_INIT 0x01
+#define FC_STATE_I2C_INIT 0x02
+#define FC_STATE_FE_INIT  0x04
+       int init_state;
+
+       /* device information */
+       int has_32_hw_pid_filter;
+       flexcop_revision_t rev;
+       flexcop_device_type_t dev_type;
+       flexcop_bus_t bus_type;
+
+       /* dvb stuff */
+       struct dvb_adapter dvb_adapter;
+       struct dvb_frontend *fe;
+       struct dvb_net dvbnet;
+       struct dvb_demux demux;
+       struct dmxdev dmxdev;
+       struct dmx_frontend hw_frontend;
+       struct dmx_frontend mem_frontend;
+       int (*fe_sleep) (struct dvb_frontend *);
+
+       struct i2c_adapter i2c_adap;
+       struct semaphore i2c_sem;
+
+       struct module *owner;
+
+       /* options and status */
+       int extra_feedcount;
+       int feedcount;
+       int pid_filtering;
+       int fullts_streaming_state;
+
+       /* bus specific callbacks */
+       flexcop_ibi_value (*read_ibi_reg)  (struct flexcop_device *, flexcop_ibi_register);
+       int               (*write_ibi_reg) (struct flexcop_device *, flexcop_ibi_register, flexcop_ibi_value);
+
+
+       int (*i2c_request) (struct flexcop_device*, flexcop_access_op_t, flexcop_i2c_port_t, u8 chipaddr, u8 addr, u8 *buf, u16 len);
+       int (*stream_control) (struct flexcop_device*, int);
+
+       int (*get_mac_addr) (struct flexcop_device *fc, int extended);
+
+       void *bus_specific;
+};
+
+/* exported prototypes */
+
+/* from flexcop.c */
+void flexcop_pass_dmx_data(struct flexcop_device *fc, u8 *buf, u32 len);
+void flexcop_pass_dmx_packets(struct flexcop_device *fc, u8 *buf, u32 no);
+
+struct flexcop_device *flexcop_device_kmalloc(size_t bus_specific_len);
+void flexcop_device_kfree(struct flexcop_device*);
+
+int  flexcop_device_initialize(struct flexcop_device*);
+void flexcop_device_exit(struct flexcop_device *fc);
+
+/* from flexcop-dma.c */
+int flexcop_dma_allocate(struct pci_dev *pdev, struct flexcop_dma *dma, u32 size);
+void flexcop_dma_free(struct flexcop_dma *dma);
+
+int flexcop_dma_control_timer_irq(struct flexcop_device *fc, flexcop_dma_index_t no, int onoff);
+int flexcop_dma_control_size_irq(struct flexcop_device *fc, flexcop_dma_index_t no, int onoff);
+int flexcop_dma_control_packet_irq(struct flexcop_device *fc, flexcop_dma_index_t no, int onoff);
+int flexcop_dma_config(struct flexcop_device *fc, struct flexcop_dma *dma, flexcop_dma_index_t dma_idx,flexcop_dma_addr_index_t index);
+int flexcop_dma_config_timer(struct flexcop_device *fc, flexcop_dma_index_t dma_idx, u8 cycles);
+int flexcop_dma_config_packet_count(struct flexcop_device *fc, flexcop_dma_index_t dma_idx, u8 packets);
+
+/* from flexcop-eeprom.c */
+/* the PCI part uses this call to get the MAC address, the USB part has its own */
+int flexcop_eeprom_check_mac_addr(struct flexcop_device *fc, int extended);
+
+/* from flexcop-i2c.c */
+/* the PCI part uses this a i2c_request callback, whereas the usb part has its own
+ * one. We have it in flexcop-i2c.c, because it is going via the actual
+ * I2C-channel of the flexcop.
+ */
+int flexcop_i2c_request(struct flexcop_device*, flexcop_access_op_t,
+                       flexcop_i2c_port_t, u8 chipaddr, u8 addr, u8 *buf, u16 len);
+
+/* from flexcop-sram.c */
+int flexcop_sram_set_dest(struct flexcop_device *fc, flexcop_sram_dest_t dest, flexcop_sram_dest_target_t target);
+void flexcop_wan_set_speed(struct flexcop_device *fc, flexcop_wan_speed_t s);
+void flexcop_sram_ctrl(struct flexcop_device *fc, int usb_wan, int sramdma, int maximumfill);
+
+/* global prototypes for the flexcop-chip */
+/* from flexcop-fe-tuner.c */
+int flexcop_frontend_init(struct flexcop_device *card);
+void flexcop_frontend_exit(struct flexcop_device *fc);
+
+/* from flexcop-i2c.c */
+int flexcop_i2c_init(struct flexcop_device *fc);
+void flexcop_i2c_exit(struct flexcop_device *fc);
+
+/* from flexcop-sram.c */
+int flexcop_sram_init(struct flexcop_device *fc);
+
+/* from flexcop-misc.c */
+void flexcop_determine_revision(struct flexcop_device *fc);
+void flexcop_device_name(struct flexcop_device *fc,const char *prefix,const char *suffix);
+
+/* from flexcop-hw-filter.c */
+int flexcop_pid_feed_control(struct flexcop_device *fc, struct dvb_demux_feed *dvbdmxfeed, int onoff);
+void flexcop_hw_filter_init(struct flexcop_device *fc);
+
+void flexcop_smc_ctrl(struct flexcop_device *fc, int onoff);
+
+void flexcop_set_mac_filter(struct flexcop_device *fc, u8 mac[6]);
+void flexcop_mac_filter_ctrl(struct flexcop_device *fc, int onoff);
+
+#endif
diff --git a/drivers/media/dvb/b2c2/flexcop-dma.c b/drivers/media/dvb/b2c2/flexcop-dma.c
new file mode 100644 (file)
index 0000000..8d27060
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III
+ *
+ * flexcop-dma.c - methods for configuring and controlling the DMA of the FlexCop.
+ *
+ * see flexcop.c for copyright information.
+ */
+#include "flexcop.h"
+
+int flexcop_dma_allocate(struct pci_dev *pdev, struct flexcop_dma *dma, u32 size)
+{
+       u8 *tcpu;
+       dma_addr_t tdma;
+
+       if (size % 2) {
+               err("dma buffersize has to be even.");
+               return -EINVAL;
+       }
+
+       if ((tcpu = pci_alloc_consistent(pdev, size, &tdma)) != NULL) {
+               dma->pdev = pdev;
+               dma->cpu_addr0 = tcpu;
+               dma->dma_addr0 = tdma;
+               dma->cpu_addr1 = tcpu + size/2;
+               dma->dma_addr1 = tdma + size/2;
+               dma->size = size/2;
+               return 0;
+       }
+       return -ENOMEM;
+}
+EXPORT_SYMBOL(flexcop_dma_allocate);
+
+void flexcop_dma_free(struct flexcop_dma *dma)
+{
+       pci_free_consistent(dma->pdev, dma->size*2,dma->cpu_addr0, dma->dma_addr0);
+       memset(dma,0,sizeof(struct flexcop_dma));
+}
+EXPORT_SYMBOL(flexcop_dma_free);
+
+int flexcop_dma_control_timer_irq(struct flexcop_device *fc, flexcop_dma_index_t no, int onoff)
+{
+       flexcop_ibi_value v = fc->read_ibi_reg(fc,ctrl_208);
+
+       if (no & FC_DMA_1)
+               v.ctrl_208.DMA1_Timer_Enable_sig = onoff;
+
+       if (no & FC_DMA_2)
+               v.ctrl_208.DMA2_Timer_Enable_sig = onoff;
+
+       fc->write_ibi_reg(fc,ctrl_208,v);
+       return 0;
+}
+EXPORT_SYMBOL(flexcop_dma_control_timer_irq);
+
+int flexcop_dma_control_size_irq(struct flexcop_device *fc, flexcop_dma_index_t no, int onoff)
+{
+       flexcop_ibi_value v = fc->read_ibi_reg(fc,ctrl_208);
+
+       if (no & FC_DMA_1)
+               v.ctrl_208.DMA1_IRQ_Enable_sig = onoff;
+
+       if (no & FC_DMA_2)
+               v.ctrl_208.DMA2_IRQ_Enable_sig = onoff;
+
+       fc->write_ibi_reg(fc,ctrl_208,v);
+       return 0;
+}
+EXPORT_SYMBOL(flexcop_dma_control_size_irq);
+
+int flexcop_dma_control_packet_irq(struct flexcop_device *fc, flexcop_dma_index_t no, int onoff)
+{
+       flexcop_ibi_value v = fc->read_ibi_reg(fc,ctrl_208);
+
+       if (no & FC_DMA_1)
+               v.ctrl_208.DMA1_Size_IRQ_Enable_sig = onoff;
+
+       if (no & FC_DMA_2)
+               v.ctrl_208.DMA2_Size_IRQ_Enable_sig = onoff;
+
+       fc->write_ibi_reg(fc,ctrl_208,v);
+       return 0;
+}
+EXPORT_SYMBOL(flexcop_dma_control_packet_irq);
+
+int flexcop_dma_config(struct flexcop_device *fc, struct flexcop_dma *dma, flexcop_dma_index_t dma_idx,flexcop_dma_addr_index_t index)
+{
+
+       flexcop_ibi_value v0x0,v0x4,v0xc;
+       v0x0.raw = v0x4.raw = v0xc.raw = 0;
+
+       v0x0.dma_0x0.dma_address0        = dma->dma_addr0 >> 2;
+       v0xc.dma_0xc.dma_address1        = dma->dma_addr1 >> 2;
+       v0x4.dma_0x4_write.dma_addr_size = dma->size / 4;
+
+       if (index & FC_DMA_SUBADDR_0)
+               v0x0.dma_0x0.dma_0start = 1;
+
+       if (index & FC_DMA_SUBADDR_1)
+               v0xc.dma_0xc.dma_1start = 1;
+
+       if (dma_idx & FC_DMA_1) {
+               fc->write_ibi_reg(fc,dma1_000,v0x0);
+               fc->write_ibi_reg(fc,dma1_004,v0x4);
+               fc->write_ibi_reg(fc,dma1_00c,v0xc);
+       } else { /* (dma_idx & FC_DMA_2) */
+               fc->write_ibi_reg(fc,dma2_010,v0x0);
+               fc->write_ibi_reg(fc,dma2_014,v0x4);
+               fc->write_ibi_reg(fc,dma2_01c,v0xc);
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(flexcop_dma_config);
+
+static int flexcop_dma_remap(struct flexcop_device *fc, flexcop_dma_index_t dma_idx, int onoff)
+{
+       flexcop_ibi_register r = (dma_idx & FC_DMA_1) ? dma1_00c : dma2_01c;
+       flexcop_ibi_value v = fc->read_ibi_reg(fc,r);
+       v.dma_0xc.remap_enable = onoff;
+       fc->write_ibi_reg(fc,r,v);
+       return 0;
+}
+
+/* 1 cycles = 1.97 msec */
+int flexcop_dma_config_timer(struct flexcop_device *fc, flexcop_dma_index_t dma_idx, u8 cycles)
+{
+       flexcop_ibi_register r = (dma_idx & FC_DMA_1) ? dma1_004 : dma2_014;
+       flexcop_ibi_value v = fc->read_ibi_reg(fc,r);
+
+       flexcop_dma_remap(fc,dma_idx,0);
+
+       v.dma_0x4_write.dmatimer = cycles >> 1;
+       fc->write_ibi_reg(fc,r,v);
+       return 0;
+}
+EXPORT_SYMBOL(flexcop_dma_config_timer);
+
+int flexcop_dma_config_packet_count(struct flexcop_device *fc, flexcop_dma_index_t dma_idx, u8 packets)
+{
+       flexcop_ibi_register r = (dma_idx & FC_DMA_1) ? dma1_004 : dma2_014;
+       flexcop_ibi_value v = fc->read_ibi_reg(fc,r);
+
+       flexcop_dma_remap(fc,dma_idx,1);
+
+       v.dma_0x4_remap.DMA_maxpackets = packets;
+       fc->write_ibi_reg(fc,r,v);
+       return 0;
+}
+EXPORT_SYMBOL(flexcop_dma_config_packet_count);
diff --git a/drivers/media/dvb/b2c2/flexcop-eeprom.c b/drivers/media/dvb/b2c2/flexcop-eeprom.c
new file mode 100644 (file)
index 0000000..bbcf070
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III
+ *
+ * flexcop-eeprom.c - eeprom access methods (currently only MAC address reading is used)
+ *
+ * see flexcop.c for copyright information.
+ */
+#include "flexcop.h"
+
+#if 0
+/*EEPROM (Skystar2 has one "24LC08B" chip on board) */
+static int eeprom_write(struct adapter *adapter, u16 addr, u8 *buf, u16 len)
+{
+       return flex_i2c_write(adapter, 0x20000000, 0x50, addr, buf, len);
+}
+
+static int eeprom_lrc_write(struct adapter *adapter, u32 addr, u32 len, u8 *wbuf, u8 *rbuf, int retries)
+{
+       int i;
+
+       for (i = 0; i < retries; i++) {
+               if (eeprom_write(adapter, addr, wbuf, len) == len) {
+                       if (eeprom_lrc_read(adapter, addr, len, rbuf, retries) == 1)
+                               return 1;
+               }
+       }
+
+       return 0;
+}
+
+/* These functions could be used to unlock SkyStar2 cards. */
+
+static int eeprom_writeKey(struct adapter *adapter, u8 *key, u32 len)
+{
+       u8 rbuf[20];
+       u8 wbuf[20];
+
+       if (len != 16)
+               return 0;
+
+       memcpy(wbuf, key, len);
+
+       wbuf[16] = 0;
+       wbuf[17] = 0;
+       wbuf[18] = 0;
+       wbuf[19] = calc_lrc(wbuf, 19);
+
+       return eeprom_lrc_write(adapter, 0x3e4, 20, wbuf, rbuf, 4);
+}
+
+static int eeprom_readKey(struct adapter *adapter, u8 *key, u32 len)
+{
+       u8 buf[20];
+
+       if (len != 16)
+               return 0;
+
+       if (eeprom_lrc_read(adapter, 0x3e4, 20, buf, 4) == 0)
+               return 0;
+
+       memcpy(key, buf, len);
+
+       return 1;
+}
+
+static char eeprom_set_mac_addr(struct adapter *adapter, char type, u8 *mac)
+{
+       u8 tmp[8];
+
+       if (type != 0) {
+               tmp[0] = mac[0];
+               tmp[1] = mac[1];
+               tmp[2] = mac[2];
+               tmp[3] = mac[5];
+               tmp[4] = mac[6];
+               tmp[5] = mac[7];
+
+       } else {
+
+               tmp[0] = mac[0];
+               tmp[1] = mac[1];
+               tmp[2] = mac[2];
+               tmp[3] = mac[3];
+               tmp[4] = mac[4];
+               tmp[5] = mac[5];
+       }
+
+       tmp[6] = 0;
+       tmp[7] = calc_lrc(tmp, 7);
+
+       if (eeprom_write(adapter, 0x3f8, tmp, 8) == 8)
+               return 1;
+
+       return 0;
+}
+
+static int flexcop_eeprom_read(struct flexcop_device *fc, u16 addr, u8 *buf, u16 len)
+{
+       return fc->i2c_request(fc,FC_READ,FC_I2C_PORT_EEPROM,0x50,addr,buf,len);
+}
+
+#endif
+
+static u8 calc_lrc(u8 *buf, int len)
+{
+       int i;
+       u8 sum = 0;
+       for (i = 0; i < len; i++)
+               sum = sum ^ buf[i];
+       return sum;
+}
+
+static int flexcop_eeprom_request(struct flexcop_device *fc, flexcop_access_op_t op, u16 addr, u8 *buf, u16 len, int retries)
+{
+       int i,ret = 0;
+       u8 chipaddr =  0x50 | ((addr >> 8) & 3);
+       for (i = 0; i < retries; i++)
+               if ((ret = fc->i2c_request(fc,op,FC_I2C_PORT_EEPROM,chipaddr,addr & 0xff,buf,len)) == 0)
+                       break;
+       return ret;
+}
+
+static int flexcop_eeprom_lrc_read(struct flexcop_device *fc, u16 addr, u8 *buf, u16 len, int retries)
+{
+       int ret = flexcop_eeprom_request(fc,FC_READ,addr,buf,len,retries);
+       if (ret == 0)
+               if (calc_lrc(buf, len - 1) != buf[len - 1])
+                       ret = -EINVAL;
+       return ret;
+}
+
+/* JJ's comment about extended == 1: it is not presently used anywhere but was
+ * added to the low-level functions for possible support of EUI64
+ */
+int flexcop_eeprom_check_mac_addr(struct flexcop_device *fc, int extended)
+{
+       u8 buf[8];
+       int ret = 0;
+
+       if ((ret = flexcop_eeprom_lrc_read(fc,0x3f8,buf,8,4)) == 0) {
+               if (extended != 0) {
+                       err("TODO: extended (EUI64) MAC addresses aren't completely supported yet");
+                       ret = -EINVAL;
+/*                     memcpy(fc->dvb_adapter.proposed_mac,buf,3);
+                       mac[3] = 0xfe;
+                       mac[4] = 0xff;
+                       memcpy(&fc->dvb_adapter.proposed_mac[3],&buf[5],3); */
+               } else
+                       memcpy(fc->dvb_adapter.proposed_mac,buf,6);
+       }
+       return ret;
+}
+EXPORT_SYMBOL(flexcop_eeprom_check_mac_addr);
diff --git a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c
new file mode 100644 (file)
index 0000000..71be400
--- /dev/null
@@ -0,0 +1,403 @@
+/*
+ * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III
+ *
+ * flexcop-fe-tuner.c - methods for attaching a frontend and controlling DiSEqC.
+ *
+ * see flexcop.c for copyright information.
+ */
+#include "flexcop.h"
+
+#include "stv0299.h"
+#include "mt352.h"
+#include "nxt2002.h"
+#include "stv0297.h"
+#include "mt312.h"
+
+/* lnb control */
+
+static int flexcop_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
+{
+       struct flexcop_device *fc = fe->dvb->priv;
+       flexcop_ibi_value v;
+       deb_tuner("polarity/voltage = %u\n", voltage);
+
+       v = fc->read_ibi_reg(fc, misc_204);
+       switch (voltage) {
+               case SEC_VOLTAGE_OFF:
+                       v.misc_204.ACPI1_sig = 1;
+                       break;
+               case SEC_VOLTAGE_13:
+                       v.misc_204.ACPI1_sig = 0;
+                       v.misc_204.LNB_L_H_sig = 0;
+                       break;
+               case SEC_VOLTAGE_18:
+                       v.misc_204.ACPI1_sig = 0;
+                       v.misc_204.LNB_L_H_sig = 1;
+                       break;
+               default:
+                       err("unknown SEC_VOLTAGE value");
+                       return -EINVAL;
+       }
+       return fc->write_ibi_reg(fc, misc_204, v);
+}
+
+static int flexcop_sleep(struct dvb_frontend* fe)
+{
+       struct flexcop_device *fc = fe->dvb->priv;
+/*     flexcop_ibi_value v = fc->read_ibi_reg(fc,misc_204); */
+
+       if (fc->fe_sleep)
+               return fc->fe_sleep(fe);
+
+/*     v.misc_204.ACPI3_sig = 1;
+       fc->write_ibi_reg(fc,misc_204,v);*/
+
+       return 0;
+}
+
+static int flexcop_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
+{
+       /* u16 wz_half_period_for_45_mhz[] = { 0x01ff, 0x0154, 0x00ff, 0x00cc }; */
+       struct flexcop_device *fc = fe->dvb->priv;
+       flexcop_ibi_value v;
+       u16 ax;
+       v.raw = 0;
+
+       deb_tuner("tone = %u\n",tone);
+
+       switch (tone) {
+               case SEC_TONE_ON:
+                       ax = 0x01ff;
+                       break;
+               case SEC_TONE_OFF:
+                       ax = 0;
+                       break;
+               default:
+                       err("unknown SEC_TONE value");
+                       return -EINVAL;
+       }
+
+       v.lnb_switch_freq_200.LNB_CTLPrescaler_sig = 1; /* divide by 2 */
+
+       v.lnb_switch_freq_200.LNB_CTLHighCount_sig = ax;
+       v.lnb_switch_freq_200.LNB_CTLLowCount_sig  = ax == 0 ? 0x1ff : ax;
+
+       return fc->write_ibi_reg(fc,lnb_switch_freq_200,v);
+}
+
+static void flexcop_diseqc_send_bit(struct dvb_frontend* fe, int data)
+{
+       flexcop_set_tone(fe, SEC_TONE_ON);
+       udelay(data ? 500 : 1000);
+       flexcop_set_tone(fe, SEC_TONE_OFF);
+       udelay(data ? 1000 : 500);
+}
+
+static void flexcop_diseqc_send_byte(struct dvb_frontend* fe, int data)
+{
+       int i, par = 1, d;
+
+       for (i = 7; i >= 0; i--) {
+               d = (data >> i) & 1;
+               par ^= d;
+               flexcop_diseqc_send_bit(fe, d);
+       }
+
+       flexcop_diseqc_send_bit(fe, par);
+}
+
+static int flexcop_send_diseqc_msg(struct dvb_frontend* fe, int len, u8 *msg, unsigned long burst)
+{
+       int i;
+
+       flexcop_set_tone(fe, SEC_TONE_OFF);
+       mdelay(16);
+
+       for (i = 0; i < len; i++)
+               flexcop_diseqc_send_byte(fe,msg[i]);
+
+       mdelay(16);
+
+       if (burst != -1) {
+               if (burst)
+                       flexcop_diseqc_send_byte(fe, 0xff);
+               else {
+                       flexcop_set_tone(fe, SEC_TONE_ON);
+                       udelay(12500);
+                       flexcop_set_tone(fe, SEC_TONE_OFF);
+               }
+               msleep(20);
+       }
+       return 0;
+}
+
+static int flexcop_diseqc_send_master_cmd(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd)
+{
+       return flexcop_send_diseqc_msg(fe, cmd->msg_len, cmd->msg, 0);
+}
+
+static int flexcop_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd)
+{
+       return flexcop_send_diseqc_msg(fe, 0, NULL, minicmd);
+}
+
+/* dvb-s stv0299 */
+static int samsung_tbmu24112_set_symbol_rate(struct dvb_frontend* fe, u32 srate, u32 ratio)
+{
+       u8 aclk = 0;
+       u8 bclk = 0;
+
+       if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; }
+       else if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; }
+       else if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; }
+       else if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; }
+       else if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; }
+       else if (srate < 45000000) { aclk = 0xb4; bclk = 0x51; }
+
+       stv0299_writereg (fe, 0x13, aclk);
+       stv0299_writereg (fe, 0x14, bclk);
+       stv0299_writereg (fe, 0x1f, (ratio >> 16) & 0xff);
+       stv0299_writereg (fe, 0x20, (ratio >>  8) & 0xff);
+       stv0299_writereg (fe, 0x21, (ratio      ) & 0xf0);
+
+       return 0;
+}
+
+static int samsung_tbmu24112_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
+{
+       u8 buf[4];
+       u32 div;
+       struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) };
+       struct flexcop_device *fc = fe->dvb->priv;
+
+       div = params->frequency / 125;
+
+       buf[0] = (div >> 8) & 0x7f;
+       buf[1] = div & 0xff;
+       buf[2] = 0x84;  /* 0xC4 */
+       buf[3] = 0x08;
+
+       if (params->frequency < 1500000) buf[3] |= 0x10;
+
+       if (i2c_transfer(&fc->i2c_adap, &msg, 1) != 1)
+               return -EIO;
+       return 0;
+}
+
+static u8 samsung_tbmu24112_inittab[] = {
+            0x01, 0x15,
+            0x02, 0x30,
+            0x03, 0x00,
+            0x04, 0x7D,
+            0x05, 0x35,
+            0x06, 0x02,
+            0x07, 0x00,
+            0x08, 0xC3,
+            0x0C, 0x00,
+            0x0D, 0x81,
+            0x0E, 0x23,
+            0x0F, 0x12,
+            0x10, 0x7E,
+            0x11, 0x84,
+            0x12, 0xB9,
+            0x13, 0x88,
+            0x14, 0x89,
+            0x15, 0xC9,
+            0x16, 0x00,
+            0x17, 0x5C,
+            0x18, 0x00,
+            0x19, 0x00,
+            0x1A, 0x00,
+            0x1C, 0x00,
+            0x1D, 0x00,
+            0x1E, 0x00,
+            0x1F, 0x3A,
+            0x20, 0x2E,
+            0x21, 0x80,
+            0x22, 0xFF,
+            0x23, 0xC1,
+            0x28, 0x00,
+            0x29, 0x1E,
+            0x2A, 0x14,
+            0x2B, 0x0F,
+            0x2C, 0x09,
+            0x2D, 0x05,
+            0x31, 0x1F,
+            0x32, 0x19,
+            0x33, 0xFE,
+            0x34, 0x93,
+            0xff, 0xff,
+};
+
+static struct stv0299_config samsung_tbmu24112_config = {
+       .demod_address = 0x68,
+       .inittab = samsung_tbmu24112_inittab,
+       .mclk = 88000000UL,
+       .invert = 0,
+       .enhanced_tuning = 0,
+       .skip_reinit = 0,
+       .lock_output = STV0229_LOCKOUTPUT_LK,
+       .volt13_op0_op1 = STV0299_VOLT13_OP1,
+       .min_delay_ms = 100,
+       .set_symbol_rate = samsung_tbmu24112_set_symbol_rate,
+       .pll_set = samsung_tbmu24112_pll_set,
+};
+
+/* dvb-t mt352 */
+static int samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe)
+{
+       static u8 mt352_clock_config [] = { 0x89, 0x18, 0x2d };
+       static u8 mt352_reset [] = { 0x50, 0x80 };
+       static u8 mt352_adc_ctl_1_cfg [] = { 0x8E, 0x40 };
+       static u8 mt352_agc_cfg [] = { 0x67, 0x28, 0xa1 };
+       static u8 mt352_capt_range_cfg[] = { 0x75, 0x32 };
+
+       mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config));
+       udelay(2000);
+       mt352_write(fe, mt352_reset, sizeof(mt352_reset));
+       mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg));
+
+       mt352_write(fe, mt352_agc_cfg, sizeof(mt352_agc_cfg));
+       mt352_write(fe, mt352_capt_range_cfg, sizeof(mt352_capt_range_cfg));
+
+       return 0;
+}
+
+static int samsung_tdtc9251dh0_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf)
+{
+       u32 div;
+       unsigned char bs = 0;
+
+       #define IF_FREQUENCYx6 217    /* 6 * 36.16666666667MHz */
+       div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
+
+       if (params->frequency >= 48000000 && params->frequency <= 154000000) bs = 0x09;
+       if (params->frequency >= 161000000 && params->frequency <= 439000000) bs = 0x0a;
+       if (params->frequency >= 447000000 && params->frequency <= 863000000) bs = 0x08;
+
+       pllbuf[0] = 0xc2; /* Note: non-linux standard PLL i2c address */
+       pllbuf[1] = div >> 8;
+       pllbuf[2] = div & 0xff;
+       pllbuf[3] = 0xcc;
+       pllbuf[4] = bs;
+
+       return 0;
+}
+
+static struct mt352_config samsung_tdtc9251dh0_config = {
+
+       .demod_address = 0x0f,
+       .demod_init = samsung_tdtc9251dh0_demod_init,
+       .pll_set = samsung_tdtc9251dh0_pll_set,
+};
+
+static int nxt2002_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name)
+{
+       struct flexcop_device *fc = fe->dvb->priv;
+       return request_firmware(fw, name, fc->dev);
+}
+
+static struct nxt2002_config samsung_tbmv_config = {
+       .demod_address = 0x0a,
+       .request_firmware = nxt2002_request_firmware,
+};
+
+static int skystar23_samsung_tbdu18132_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
+{
+       u8 buf[4];
+       u32 div;
+       struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) };
+       struct flexcop_device *fc = fe->dvb->priv;
+
+       div = (params->frequency + (125/2)) / 125;
+
+       buf[0] = (div >> 8) & 0x7f;
+       buf[1] = (div >> 0) & 0xff;
+       buf[2] = 0x84 | ((div >> 10) & 0x60);
+       buf[3] = 0x80;
+
+       if (params->frequency < 1550000)
+               buf[3] |= 0x02;
+
+       if (i2c_transfer(&fc->i2c_adap, &msg, 1) != 1)
+               return -EIO;
+       return 0;
+}
+
+static struct mt312_config skystar23_samsung_tbdu18132_config = {
+
+       .demod_address = 0x0e,
+       .pll_set = skystar23_samsung_tbdu18132_pll_set,
+};
+
+static struct stv0297_config alps_tdee4_stv0297_config = {
+       .demod_address = 0x1c,
+//     .invert = 1,
+//     .pll_set = alps_tdee4_stv0297_pll_set,
+};
+
+/* try to figure out the frontend, each card/box can have on of the following list */
+int flexcop_frontend_init(struct flexcop_device *fc)
+{
+       /* try the sky v2.6 (stv0299/Samsung tbmu24112(sl1935)) */
+       if ((fc->fe = stv0299_attach(&samsung_tbmu24112_config, &fc->i2c_adap)) != NULL) {
+               fc->fe->ops->set_voltage = flexcop_set_voltage;
+
+               fc->fe_sleep             = fc->fe->ops->sleep;
+               fc->fe->ops->sleep       = flexcop_sleep;
+
+               fc->dev_type          = FC_SKY;
+               info("found the stv0299 at i2c address: 0x%02x",samsung_tbmu24112_config.demod_address);
+       } else
+       /* try the air dvb-t (mt352/Samsung tdtc9251dh0(??)) */
+       if ((fc->fe = mt352_attach(&samsung_tdtc9251dh0_config, &fc->i2c_adap)) != NULL ) {
+               fc->dev_type          = FC_AIR_DVB;
+               info("found the mt352 at i2c address: 0x%02x",samsung_tdtc9251dh0_config.demod_address);
+       } else
+       /* try the air atsc (nxt2002) */
+       if ((fc->fe = nxt2002_attach(&samsung_tbmv_config, &fc->i2c_adap)) != NULL) {
+               fc->dev_type          = FC_AIR_ATSC;
+               info("found the nxt2002 at i2c address: 0x%02x",samsung_tbmv_config.demod_address);
+       } else
+       /* try the cable dvb (stv0297) */
+       if ((fc->fe = stv0297_attach(&alps_tdee4_stv0297_config, &fc->i2c_adap, 0xf8)) != NULL) {
+               fc->dev_type                        = FC_CABLE;
+               info("found the stv0297 at i2c address: 0x%02x",alps_tdee4_stv0297_config.demod_address);
+       } else
+       /* try the sky v2.3 (vp310/Samsung tbdu18132(tsa5059)) */
+       if ((fc->fe = vp310_attach(&skystar23_samsung_tbdu18132_config, &fc->i2c_adap)) != NULL) {
+               fc->fe->ops->diseqc_send_master_cmd = flexcop_diseqc_send_master_cmd;
+               fc->fe->ops->diseqc_send_burst      = flexcop_diseqc_send_burst;
+               fc->fe->ops->set_tone               = flexcop_set_tone;
+               fc->fe->ops->set_voltage            = flexcop_set_voltage;
+
+               fc->fe_sleep                        = fc->fe->ops->sleep;
+               fc->fe->ops->sleep                  = flexcop_sleep;
+
+               fc->dev_type                        = FC_SKY_OLD;
+               info("found the vp310 (aka mt312) at i2c address: 0x%02x",skystar23_samsung_tbdu18132_config.demod_address);
+       }
+
+       if (fc->fe == NULL) {
+               err("no frontend driver found for this B2C2/FlexCop adapter");
+               return -ENODEV;
+       } else {
+               if (dvb_register_frontend(&fc->dvb_adapter, fc->fe)) {
+                       err("frontend registration failed!");
+                       if (fc->fe->ops->release != NULL)
+                               fc->fe->ops->release(fc->fe);
+                       fc->fe = NULL;
+                       return -EINVAL;
+               }
+       }
+       fc->init_state |= FC_STATE_FE_INIT;
+       return 0;
+}
+
+void flexcop_frontend_exit(struct flexcop_device *fc)
+{
+       if (fc->init_state & FC_STATE_FE_INIT)
+               dvb_unregister_frontend(fc->fe);
+
+       fc->init_state &= ~FC_STATE_FE_INIT;
+}
diff --git a/drivers/media/dvb/b2c2/flexcop-hw-filter.c b/drivers/media/dvb/b2c2/flexcop-hw-filter.c
new file mode 100644 (file)
index 0000000..2baf43d
--- /dev/null
@@ -0,0 +1,204 @@
+/*
+ * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III
+ *
+ * flexcop-hw-filter.c - pid and mac address filtering and corresponding control functions.
+ *
+ * see flexcop.c for copyright information.
+ */
+#include "flexcop.h"
+
+static void flexcop_rcv_data_ctrl(struct flexcop_device *fc, int onoff)
+{
+       flexcop_set_ibi_value(ctrl_208,Rcv_Data_sig,onoff);
+}
+
+void flexcop_smc_ctrl(struct flexcop_device *fc, int onoff)
+{
+       flexcop_set_ibi_value(ctrl_208,SMC_Enable_sig,onoff);
+}
+
+void flexcop_null_filter_ctrl(struct flexcop_device *fc, int onoff)
+{
+       flexcop_set_ibi_value(ctrl_208,Null_filter_sig,onoff);
+}
+
+void flexcop_set_mac_filter(struct flexcop_device *fc, u8 mac[6])
+{
+       flexcop_ibi_value v418,v41c;
+       v41c = fc->read_ibi_reg(fc,mac_address_41c);
+
+       v418.mac_address_418.MAC1 = mac[0];
+       v418.mac_address_418.MAC2 = mac[1];
+       v418.mac_address_418.MAC3 = mac[2];
+       v418.mac_address_418.MAC6 = mac[3];
+       v41c.mac_address_41c.MAC7 = mac[4];
+       v41c.mac_address_41c.MAC8 = mac[5];
+
+       fc->write_ibi_reg(fc,mac_address_418,v418);
+       fc->write_ibi_reg(fc,mac_address_41c,v41c);
+}
+
+void flexcop_mac_filter_ctrl(struct flexcop_device *fc, int onoff)
+{
+       flexcop_set_ibi_value(ctrl_208,MAC_filter_Mode_sig,onoff);
+}
+
+static void flexcop_pid_group_filter(struct flexcop_device *fc, u16 pid, u16 mask)
+{
+       /* index_reg_310.extra_index_reg need to 0 or 7 to work */
+       flexcop_ibi_value v30c;
+       v30c.pid_filter_30c_ext_ind_0_7.Group_PID = pid;
+       v30c.pid_filter_30c_ext_ind_0_7.Group_mask = mask;
+       fc->write_ibi_reg(fc,pid_filter_30c,v30c);
+}
+
+static void flexcop_pid_group_filter_ctrl(struct flexcop_device *fc, int onoff)
+{
+       flexcop_set_ibi_value(ctrl_208,Mask_filter_sig,onoff);
+}
+
+/* this fancy define reduces the code size of the quite similar PID controlling of
+ * the first 6 PIDs
+ */
+
+#define pid_ctrl(vregname,field,enablefield,trans_field,transval) \
+       flexcop_ibi_value vpid = fc->read_ibi_reg(fc, vregname), \
+                                         v208 = fc->read_ibi_reg(fc, ctrl_208); \
+\
+       vpid.vregname.field = onoff ? pid : 0x1fff; \
+       vpid.vregname.trans_field = transval; \
+       v208.ctrl_208.enablefield = onoff; \
+\
+       fc->write_ibi_reg(fc,vregname,vpid); \
+       fc->write_ibi_reg(fc,ctrl_208,v208);
+
+static void flexcop_pid_Stream1_PID_ctrl(struct flexcop_device *fc, u16 pid, int onoff)
+{
+       pid_ctrl(pid_filter_300,Stream1_PID,Stream1_filter_sig,Stream1_trans,0);
+}
+
+static void flexcop_pid_Stream2_PID_ctrl(struct flexcop_device *fc, u16 pid, int onoff)
+{
+       pid_ctrl(pid_filter_300,Stream2_PID,Stream2_filter_sig,Stream2_trans,0);
+}
+
+static void flexcop_pid_PCR_PID_ctrl(struct flexcop_device *fc, u16 pid, int onoff)
+{
+       pid_ctrl(pid_filter_304,PCR_PID,PCR_filter_sig,PCR_trans,0);
+}
+
+static void flexcop_pid_PMT_PID_ctrl(struct flexcop_device *fc, u16 pid, int onoff)
+{
+       pid_ctrl(pid_filter_304,PMT_PID,PMT_filter_sig,PMT_trans,0);
+}
+
+static void flexcop_pid_EMM_PID_ctrl(struct flexcop_device *fc, u16 pid, int onoff)
+{
+       pid_ctrl(pid_filter_308,EMM_PID,EMM_filter_sig,EMM_trans,0);
+}
+
+static void flexcop_pid_ECM_PID_ctrl(struct flexcop_device *fc, u16 pid, int onoff)
+{
+       pid_ctrl(pid_filter_308,ECM_PID,ECM_filter_sig,ECM_trans,0);
+}
+
+static void flexcop_pid_control(struct flexcop_device *fc, int index, u16 pid,int onoff)
+{
+       if (pid == 0x2000)
+               return;
+
+       deb_ts("setting pid: %5d %04x at index %d '%s'\n",pid,pid,index,onoff ? "on" : "off");
+
+       /* We could use bit magic here to reduce source code size.
+        * I decided against it, but to use the real register names */
+       switch (index) {
+               case 0: flexcop_pid_Stream1_PID_ctrl(fc,pid,onoff); break;
+               case 1: flexcop_pid_Stream2_PID_ctrl(fc,pid,onoff); break;
+               case 2: flexcop_pid_PCR_PID_ctrl(fc,pid,onoff); break;
+               case 3: flexcop_pid_PMT_PID_ctrl(fc,pid,onoff); break;
+               case 4: flexcop_pid_EMM_PID_ctrl(fc,pid,onoff); break;
+               case 5: flexcop_pid_ECM_PID_ctrl(fc,pid,onoff); break;
+               default:
+                       if (fc->has_32_hw_pid_filter && index < 38) {
+                               flexcop_ibi_value vpid,vid;
+
+                               /* set the index */
+                               vid = fc->read_ibi_reg(fc,index_reg_310);
+                               vid.index_reg_310.index_reg = index - 6;
+                               fc->write_ibi_reg(fc,index_reg_310, vid);
+
+                               vpid = fc->read_ibi_reg(fc,pid_n_reg_314);
+                               vpid.pid_n_reg_314.PID = onoff ? pid : 0x1fff;
+                               vpid.pid_n_reg_314.PID_enable_bit = onoff;
+                               fc->write_ibi_reg(fc,pid_n_reg_314, vpid);
+                       }
+                       break;
+       }
+}
+
+static int flexcop_toggle_fullts_streaming(struct flexcop_device *fc,int onoff)
+{
+       if (fc->fullts_streaming_state != onoff) {
+               deb_ts("%s full TS transfer\n",onoff ? "enabling" : "disabling");
+               flexcop_pid_group_filter(fc, 0, 0x1fe0 * (!onoff));
+               flexcop_pid_group_filter_ctrl(fc,onoff);
+               fc->fullts_streaming_state = onoff;
+       }
+       return 0;
+}
+
+int flexcop_pid_feed_control(struct flexcop_device *fc, struct dvb_demux_feed *dvbdmxfeed, int onoff)
+{
+       int max_pid_filter = 6 + fc->has_32_hw_pid_filter*32;
+
+       fc->feedcount += onoff ? 1 : -1;
+       if (dvbdmxfeed->index >= max_pid_filter)
+               fc->extra_feedcount += onoff ? 1 : -1;
+
+       /* toggle complete-TS-streaming when:
+        * - pid_filtering is not enabled and it is the first or last feed requested
+        * - pid_filtering is enabled,
+        *   - but the number of requested feeds is exceeded
+        *   - or the requested pid is 0x2000 */
+
+       if (!fc->pid_filtering && fc->feedcount == onoff)
+               flexcop_toggle_fullts_streaming(fc,onoff);
+
+       if (fc->pid_filtering) {
+               flexcop_pid_control(fc,dvbdmxfeed->index,dvbdmxfeed->pid,onoff);
+
+               if (fc->extra_feedcount > 0)
+                       flexcop_toggle_fullts_streaming(fc,1);
+               else if (dvbdmxfeed->pid == 0x2000)
+                       flexcop_toggle_fullts_streaming(fc,onoff);
+               else
+                       flexcop_toggle_fullts_streaming(fc,0);
+       }
+
+       /* if it was the first or last feed request change the stream-status */
+       if (fc->feedcount == onoff) {
+               flexcop_rcv_data_ctrl(fc,onoff);
+               if (fc->stream_control)
+                       fc->stream_control(fc,onoff);
+       }
+
+       return 0;
+}
+
+void flexcop_hw_filter_init(struct flexcop_device *fc)
+{
+       int i;
+       flexcop_ibi_value v;
+       for (i = 0; i < 6 + 32*fc->has_32_hw_pid_filter; i++)
+               flexcop_pid_control(fc,i,0x1fff,0);
+
+       flexcop_pid_group_filter(fc, 0, 0x1fe0);
+       flexcop_pid_group_filter_ctrl(fc,0);
+
+       v = fc->read_ibi_reg(fc,pid_filter_308);
+       v.pid_filter_308.EMM_filter_4 = 1;
+       v.pid_filter_308.EMM_filter_6 = 0;
+       fc->write_ibi_reg(fc,pid_filter_308,v);
+
+       flexcop_null_filter_ctrl(fc, 1);
+}
diff --git a/drivers/media/dvb/b2c2/flexcop-i2c.c b/drivers/media/dvb/b2c2/flexcop-i2c.c
new file mode 100644 (file)
index 0000000..be4266d
--- /dev/null
@@ -0,0 +1,210 @@
+/*
+ * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III
+ *
+ * flexcop-i2c.c - flexcop internal 2Wire bus (I2C) and dvb i2c initialization
+ *
+ * see flexcop.c for copyright information.
+ */
+#include "flexcop.h"
+
+#define FC_MAX_I2C_RETRIES 100000
+
+static int flexcop_i2c_operation(struct flexcop_device *fc, flexcop_ibi_value *r100)
+{
+       int i;
+       flexcop_ibi_value r;
+
+       r100->tw_sm_c_100.working_start = 1;
+       deb_i2c("r100 before: %08x\n",r100->raw);
+
+       fc->write_ibi_reg(fc, tw_sm_c_100, ibi_zero);
+       fc->write_ibi_reg(fc, tw_sm_c_100, *r100); /* initiating i2c operation */
+
+       for (i = 0; i < FC_MAX_I2C_RETRIES; i++) {
+               r = fc->read_ibi_reg(fc, tw_sm_c_100);
+
+               if (!r.tw_sm_c_100.no_base_addr_ack_error) {
+                       if (r.tw_sm_c_100.st_done) {  /* && !r.tw_sm_c_100.working_start */
+                               *r100 = r;
+                               deb_i2c("i2c success\n");
+                               return 0;
+                       }
+               } else {
+                       deb_i2c("suffering from an i2c ack_error\n");
+                       return -EREMOTEIO;
+               }
+       }
+       deb_i2c("tried %d times i2c operation, never finished or too many ack errors.\n",i);
+       return -EREMOTEIO;
+}
+
+static int flexcop_i2c_read4(struct flexcop_device *fc, flexcop_ibi_value r100, u8 *buf)
+{
+       flexcop_ibi_value r104;
+       int len = r100.tw_sm_c_100.total_bytes, /* remember total_bytes is buflen-1 */
+               ret;
+
+       if ((ret = flexcop_i2c_operation(fc,&r100)) != 0) {
+               /* The Cablestar needs a different kind of i2c-transfer (does not
+                * support "Repeat Start"):
+                * wait for the ACK failure,
+                * and do a subsequent read with the Bit 30 enabled
+                */
+               r100.tw_sm_c_100.no_base_addr_ack_error = 1;
+               if ((ret = flexcop_i2c_operation(fc,&r100)) != 0) {
+                       deb_i2c("no_base_addr read failed. %d\n",ret);
+                       return ret;
+               }
+       }
+
+       buf[0] = r100.tw_sm_c_100.data1_reg;
+
+       if (len > 0) {
+               r104 = fc->read_ibi_reg(fc,tw_sm_c_104);
+               deb_i2c("read: r100: %08x, r104: %08x\n",r100.raw,r104.raw);
+
+               /* there is at least one more byte, otherwise we wouldn't be here */
+               buf[1] = r104.tw_sm_c_104.data2_reg;
+               if (len > 1) buf[2] = r104.tw_sm_c_104.data3_reg;
+               if (len > 2) buf[3] = r104.tw_sm_c_104.data4_reg;
+       }
+
+       return 0;
+}
+
+static int flexcop_i2c_write4(struct flexcop_device *fc, flexcop_ibi_value r100, u8 *buf)
+{
+       flexcop_ibi_value r104;
+       int len = r100.tw_sm_c_100.total_bytes; /* remember total_bytes is buflen-1 */
+       r104.raw = 0;
+
+       /* there is at least one byte, otherwise we wouldn't be here */
+       r100.tw_sm_c_100.data1_reg = buf[0];
+
+       r104.tw_sm_c_104.data2_reg = len > 0 ? buf[1] : 0;
+       r104.tw_sm_c_104.data3_reg = len > 1 ? buf[2] : 0;
+       r104.tw_sm_c_104.data4_reg = len > 2 ? buf[3] : 0;
+
+       deb_i2c("write: r100: %08x, r104: %08x\n",r100.raw,r104.raw);
+
+       /* write the additional i2c data before doing the actual i2c operation */
+       fc->write_ibi_reg(fc,tw_sm_c_104,r104);
+       return flexcop_i2c_operation(fc,&r100);
+}
+
+int flexcop_i2c_request(struct flexcop_device *fc, flexcop_access_op_t op,
+               flexcop_i2c_port_t port, u8 chipaddr, u8 addr, u8 *buf, u16 len)
+{
+       int ret;
+       u16 bytes_to_transfer;
+       flexcop_ibi_value r100;
+
+       deb_i2c("op = %d\n",op);
+       r100.raw = 0;
+       r100.tw_sm_c_100.chipaddr = chipaddr;
+       r100.tw_sm_c_100.twoWS_rw = op;
+       r100.tw_sm_c_100.twoWS_port_reg = port;
+
+       while (len != 0) {
+               bytes_to_transfer = len > 4 ? 4 : len;
+
+               r100.tw_sm_c_100.total_bytes = bytes_to_transfer - 1;
+               r100.tw_sm_c_100.baseaddr = addr;
+
+               if (op == FC_READ)
+                       ret = flexcop_i2c_read4(fc, r100, buf);
+               else
+                       ret = flexcop_i2c_write4(fc,r100, buf);
+
+               if (ret < 0)
+                       return ret;
+
+               buf  += bytes_to_transfer;
+               addr += bytes_to_transfer;
+               len  -= bytes_to_transfer;
+       };
+
+       return 0;
+}
+/* exported for PCI i2c */
+EXPORT_SYMBOL(flexcop_i2c_request);
+
+/* master xfer callback for demodulator */
+static int flexcop_master_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num)
+{
+       struct flexcop_device *fc = i2c_get_adapdata(i2c_adap);
+       int i, ret = 0;
+
+       if (down_interruptible(&fc->i2c_sem))
+               return -ERESTARTSYS;
+
+       /* reading */
+       if (num == 2 &&
+               msgs[0].flags == 0 &&
+               msgs[1].flags == I2C_M_RD &&
+               msgs[0].buf != NULL &&
+               msgs[1].buf != NULL) {
+
+               ret = fc->i2c_request(fc, FC_READ, FC_I2C_PORT_DEMOD, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
+
+       } else for (i = 0; i < num; i++) { /* writing command */
+               if (msgs[i].flags != 0 || msgs[i].buf == NULL || msgs[i].len < 2) {
+                       ret = -EINVAL;
+                       break;
+               }
+
+               ret = fc->i2c_request(fc, FC_WRITE, FC_I2C_PORT_DEMOD, msgs[i].addr, msgs[i].buf[0], &msgs[i].buf[1], msgs[i].len - 1);
+       }
+
+       if (ret < 0)
+               err("i2c master_xfer failed");
+       else
+               ret = num;
+
+       up(&fc->i2c_sem);
+
+       return ret;
+}
+
+static u32 flexcop_i2c_func(struct i2c_adapter *adapter)
+{
+       return I2C_FUNC_I2C;
+}
+
+static struct i2c_algorithm flexcop_algo = {
+       .name                   = "FlexCop I2C algorithm",
+       .id                             = I2C_ALGO_BIT,
+       .master_xfer    = flexcop_master_xfer,
+       .functionality  = flexcop_i2c_func,
+};
+
+int flexcop_i2c_init(struct flexcop_device *fc)
+{
+       int ret;
+
+       sema_init(&fc->i2c_sem,1);
+
+       memset(&fc->i2c_adap, 0, sizeof(struct i2c_adapter));
+       strncpy(fc->i2c_adap.name, "B2C2 FlexCop device",I2C_NAME_SIZE);
+
+       i2c_set_adapdata(&fc->i2c_adap,fc);
+
+       fc->i2c_adap.class          = I2C_CLASS_TV_DIGITAL;
+       fc->i2c_adap.algo       = &flexcop_algo;
+       fc->i2c_adap.algo_data  = NULL;
+       fc->i2c_adap.id         = I2C_ALGO_BIT;
+
+       if ((ret = i2c_add_adapter(&fc->i2c_adap)) < 0)
+               return ret;
+
+       fc->init_state |= FC_STATE_I2C_INIT;
+       return 0;
+}
+
+void flexcop_i2c_exit(struct flexcop_device *fc)
+{
+       if (fc->init_state & FC_STATE_I2C_INIT)
+               i2c_del_adapter(&fc->i2c_adap);
+
+       fc->init_state &= ~FC_STATE_I2C_INIT;
+}
diff --git a/drivers/media/dvb/b2c2/flexcop-misc.c b/drivers/media/dvb/b2c2/flexcop-misc.c
new file mode 100644 (file)
index 0000000..19e06da
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III
+ *
+ * flexcop-misc.c - miscellaneous functions.
+ *
+ * see flexcop.c for copyright information.
+ */
+#include "flexcop.h"
+
+void flexcop_determine_revision(struct flexcop_device *fc)
+{
+       flexcop_ibi_value v = fc->read_ibi_reg(fc,misc_204);
+
+       switch (v.misc_204.Rev_N_sig_revision_hi) {
+               case 0x2:
+                       deb_info("found a FlexCopII.\n");
+                       fc->rev = FLEXCOP_II;
+                       break;
+               case 0x3:
+                       deb_info("found a FlexCopIIb.\n");
+                       fc->rev = FLEXCOP_IIB;
+                       break;
+               case 0x0:
+                       deb_info("found a FlexCopIII.\n");
+                       fc->rev = FLEXCOP_III;
+                       break;
+               default:
+                       err("unkown FlexCop Revision: %x. Please report the linux-dvb@linuxtv.org.",v.misc_204.Rev_N_sig_revision_hi);
+                       break;
+       }
+
+       if ((fc->has_32_hw_pid_filter = v.misc_204.Rev_N_sig_caps))
+               deb_info("this FlexCop has the additional 32 hardware pid filter.\n");
+       else
+               deb_info("this FlexCop has only the 6 basic main hardware pid filter.\n");
+       /* bus parts have to decide if hw pid filtering is used or not. */
+}
+
+const char *flexcop_revision_names[] = {
+       "Unkown chip",
+       "FlexCopII",
+       "FlexCopIIb",
+       "FlexCopIII",
+};
+
+const char *flexcop_device_names[] = {
+       "Unkown device",
+       "AirStar 2 DVB-T",
+       "AirStar 2 ATSC",
+       "SkyStar 2 DVB-S",
+       "SkyStar 2 DVB-S (old version)",
+       "CableStar 2 DVB-C",
+};
+
+const char *flexcop_bus_names[] = {
+       "USB",
+       "PCI",
+};
+
+void flexcop_device_name(struct flexcop_device *fc,const char *prefix,const
+               char *suffix)
+{
+       info("%s '%s' at the '%s' bus controlled by a '%s' %s",prefix,
+                       flexcop_device_names[fc->dev_type],flexcop_bus_names[fc->bus_type],
+                       flexcop_revision_names[fc->rev],suffix);
+}
diff --git a/drivers/media/dvb/b2c2/flexcop-pci.c b/drivers/media/dvb/b2c2/flexcop-pci.c
new file mode 100644 (file)
index 0000000..ed717c0
--- /dev/null
@@ -0,0 +1,381 @@
+/*
+ * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III
+ *
+ * flexcop-pci.c - covers the PCI part including DMA transfers.
+ *
+ * see flexcop.c for copyright information.
+ */
+
+#define FC_LOG_PREFIX "flexcop-pci"
+#include "flexcop-common.h"
+
+static int enable_pid_filtering = 1;
+module_param(enable_pid_filtering, int, 0444);
+MODULE_PARM_DESC(enable_pid_filtering, "enable hardware pid filtering: supported values: 0 (fullts), 1");
+
+#ifdef CONFIG_DVB_B2C2_FLEXCOP_DEBUG
+#define dprintk(level,args...) \
+       do { if ((debug & level)) printk(args); } while (0)
+#define DEBSTATUS ""
+#else
+#define dprintk(level,args...)
+#define DEBSTATUS " (debugging is not enabled)"
+#endif
+
+#define deb_info(args...)  dprintk(0x01,args)
+#define deb_reg(args...)   dprintk(0x02,args)
+#define deb_ts(args...)    dprintk(0x04,args)
+#define deb_irq(args...)   dprintk(0x08,args)
+
+static int debug = 0;
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug, "set debug level (1=info,2=regs,4=TS,8=irqdma (|-able))." DEBSTATUS);
+
+#define DRIVER_VERSION "0.1"
+#define DRIVER_NAME "Technisat/B2C2 FlexCop II/IIb/III Digital TV PCI Driver"
+#define DRIVER_AUTHOR "Patrick Boettcher <patrick.boettcher@desy.de>"
+
+struct flexcop_pci {
+       struct pci_dev *pdev;
+
+#define FC_PCI_INIT     0x01
+#define FC_PCI_DMA_INIT 0x02
+       int init_state;
+
+       void __iomem *io_mem;
+       u32 irq;
+/* buffersize (at least for DMA1, need to be % 188 == 0,
+ * this logic is required */
+#define FC_DEFAULT_DMA1_BUFSIZE (1280 * 188)
+#define FC_DEFAULT_DMA2_BUFSIZE (10 * 188)
+       struct flexcop_dma dma[2];
+
+       int active_dma1_addr; /* 0 = addr0 of dma1; 1 = addr1 of dma1 */
+       u32 last_dma1_cur_pos; /* position of the pointer last time the timer/packet irq occured */
+       int count;
+
+       spinlock_t irq_lock;
+
+       struct flexcop_device *fc_dev;
+};
+
+static int lastwreg,lastwval,lastrreg,lastrval;
+
+static flexcop_ibi_value flexcop_pci_read_ibi_reg (struct flexcop_device *fc, flexcop_ibi_register r)
+{
+       struct flexcop_pci *fc_pci = fc->bus_specific;
+       flexcop_ibi_value v;
+       v.raw = readl(fc_pci->io_mem + r);
+
+       if (lastrreg != r || lastrval != v.raw) {
+               lastrreg = r; lastrval = v.raw;
+               deb_reg("new rd: %3x: %08x\n",r,v.raw);
+       }
+
+       return v;
+}
+
+static int flexcop_pci_write_ibi_reg(struct flexcop_device *fc, flexcop_ibi_register r, flexcop_ibi_value v)
+{
+       struct flexcop_pci *fc_pci = fc->bus_specific;
+
+       if (lastwreg != r || lastwval != v.raw) {
+               lastwreg = r; lastwval = v.raw;
+               deb_reg("new wr: %3x: %08x\n",r,v.raw);
+       }
+
+       writel(v.raw, fc_pci->io_mem + r);
+       return 0;
+}
+
+/* When PID filtering is turned on, we use the timer IRQ, because small amounts
+ * of data need to be passed to the user space instantly as well. When PID
+ * filtering is turned off, we use the page-change-IRQ */
+static irqreturn_t flexcop_pci_irq(int irq, void *dev_id, struct pt_regs *regs)
+{
+       struct flexcop_pci *fc_pci = dev_id;
+       struct flexcop_device *fc = fc_pci->fc_dev;
+       flexcop_ibi_value v = fc->read_ibi_reg(fc,irq_20c);
+       irqreturn_t ret = IRQ_HANDLED;
+
+       spin_lock_irq(&fc_pci->irq_lock);
+
+       if (v.irq_20c.DMA1_IRQ_Status == 1) {
+               if (fc_pci->active_dma1_addr == 0)
+                       flexcop_pass_dmx_packets(fc_pci->fc_dev,fc_pci->dma[0].cpu_addr0,fc_pci->dma[0].size / 188);
+               else
+                       flexcop_pass_dmx_packets(fc_pci->fc_dev,fc_pci->dma[0].cpu_addr1,fc_pci->dma[0].size / 188);
+
+               deb_irq("page change to page: %d\n",!fc_pci->active_dma1_addr);
+               fc_pci->active_dma1_addr = !fc_pci->active_dma1_addr;
+       } else if (v.irq_20c.DMA1_Timer_Status == 1) {
+               /* for the timer IRQ we only can use buffer dmx feeding, because we don't have
+                * complete TS packets when reading from the DMA memory */
+               dma_addr_t cur_addr =
+                       fc->read_ibi_reg(fc,dma1_008).dma_0x8.dma_cur_addr << 2;
+               u32 cur_pos = cur_addr - fc_pci->dma[0].dma_addr0;
+
+               deb_irq("irq: %08x cur_addr: %08x: cur_pos: %08x, last_cur_pos: %08x ",
+                               v.raw,cur_addr,cur_pos,fc_pci->last_dma1_cur_pos);
+
+               /* buffer end was reached, restarted from the beginning
+                * pass the data from last_cur_pos to the buffer end to the demux
+                */
+               if (cur_pos < fc_pci->last_dma1_cur_pos) {
+                       deb_irq(" end was reached: passing %d bytes ",(fc_pci->dma[0].size*2 - 1) - fc_pci->last_dma1_cur_pos);
+                       flexcop_pass_dmx_data(fc_pci->fc_dev,
+                                       fc_pci->dma[0].cpu_addr0 + fc_pci->last_dma1_cur_pos,
+                                       (fc_pci->dma[0].size*2) - fc_pci->last_dma1_cur_pos);
+                       fc_pci->last_dma1_cur_pos = 0;
+                       fc_pci->count = 0;
+               }
+
+               if (cur_pos > fc_pci->last_dma1_cur_pos) {
+                       deb_irq(" passing %d bytes ",cur_pos - fc_pci->last_dma1_cur_pos);
+                       flexcop_pass_dmx_data(fc_pci->fc_dev,
+                                       fc_pci->dma[0].cpu_addr0 + fc_pci->last_dma1_cur_pos,
+                                       cur_pos - fc_pci->last_dma1_cur_pos);
+               }
+               deb_irq("\n");
+
+               fc_pci->last_dma1_cur_pos = cur_pos;
+       } else
+               ret = IRQ_NONE;
+
+       spin_unlock_irq(&fc_pci->irq_lock);
+
+/* packet count would be ideal for hw filtering, but it isn't working. Either
+ * the data book is wrong, or I'm unable to read it correctly */
+
+/*     if (v.irq_20c.DMA1_Size_IRQ_Status == 1) { packet counter */
+
+       return ret;
+}
+
+static int flexcop_pci_stream_control(struct flexcop_device *fc, int onoff)
+{
+       struct flexcop_pci *fc_pci = fc->bus_specific;
+       if (onoff) {
+               flexcop_dma_config(fc,&fc_pci->dma[0],FC_DMA_1,FC_DMA_SUBADDR_0 | FC_DMA_SUBADDR_1);
+               flexcop_dma_config(fc,&fc_pci->dma[1],FC_DMA_2,FC_DMA_SUBADDR_0 | FC_DMA_SUBADDR_1);
+               flexcop_dma_config_timer(fc,FC_DMA_1,1);
+
+               if (fc_pci->fc_dev->pid_filtering) {
+                       fc_pci->last_dma1_cur_pos = 0;
+                       flexcop_dma_control_timer_irq(fc,FC_DMA_1,1);
+               } else {
+                       fc_pci->active_dma1_addr = 0;
+                       flexcop_dma_control_size_irq(fc,FC_DMA_1,1);
+               }
+
+/*             flexcop_dma_config_packet_count(fc,FC_DMA_1,0xc0);
+               flexcop_dma_control_packet_irq(fc,FC_DMA_1,1); */
+
+               deb_irq("irqs enabled\n");
+       } else {
+               if (fc_pci->fc_dev->pid_filtering)
+                       flexcop_dma_control_timer_irq(fc,FC_DMA_1,0);
+               else
+                       flexcop_dma_control_size_irq(fc,FC_DMA_1,0);
+
+//             flexcop_dma_control_packet_irq(fc,FC_DMA_1,0);
+               deb_irq("irqs disabled\n");
+       }
+
+       return 0;
+}
+
+static int flexcop_pci_dma_init(struct flexcop_pci *fc_pci)
+{
+       int ret;
+       if ((ret = flexcop_dma_allocate(fc_pci->pdev,&fc_pci->dma[0],FC_DEFAULT_DMA1_BUFSIZE)) != 0)
+               return ret;
+
+       if ((ret = flexcop_dma_allocate(fc_pci->pdev,&fc_pci->dma[1],FC_DEFAULT_DMA2_BUFSIZE)) != 0)
+               goto dma1_free;
+
+       flexcop_sram_set_dest(fc_pci->fc_dev,FC_SRAM_DEST_MEDIA | FC_SRAM_DEST_NET, FC_SRAM_DEST_TARGET_DMA1);
+       flexcop_sram_set_dest(fc_pci->fc_dev,FC_SRAM_DEST_CAO   | FC_SRAM_DEST_CAI, FC_SRAM_DEST_TARGET_DMA2);
+
+       fc_pci->init_state |= FC_PCI_DMA_INIT;
+       goto success;
+dma1_free:
+       flexcop_dma_free(&fc_pci->dma[0]);
+
+success:
+       return ret;
+}
+
+static void flexcop_pci_dma_exit(struct flexcop_pci *fc_pci)
+{
+       if (fc_pci->init_state & FC_PCI_DMA_INIT) {
+               flexcop_dma_free(&fc_pci->dma[0]);
+               flexcop_dma_free(&fc_pci->dma[1]);
+       }
+       fc_pci->init_state &= ~FC_PCI_DMA_INIT;
+}
+
+static int flexcop_pci_init(struct flexcop_pci *fc_pci)
+{
+       int ret;
+       u8 card_rev;
+
+       pci_read_config_byte(fc_pci->pdev, PCI_CLASS_REVISION, &card_rev);
+       info("card revision %x", card_rev);
+
+       if ((ret = pci_enable_device(fc_pci->pdev)) != 0)
+               return ret;
+
+       pci_set_master(fc_pci->pdev);
+
+       /* enable interrupts */
+       // pci_write_config_dword(pdev, 0x6c, 0x8000);
+
+       if ((ret = pci_request_regions(fc_pci->pdev, DRIVER_NAME)) != 0)
+               goto err_pci_disable_device;
+
+       fc_pci->io_mem = pci_iomap(fc_pci->pdev, 0, 0x800);
+
+       if (!fc_pci->io_mem) {
+               err("cannot map io memory\n");
+               ret = -EIO;
+               goto err_pci_release_regions;
+       }
+
+       pci_set_drvdata(fc_pci->pdev, fc_pci);
+
+       if ((ret = request_irq(fc_pci->pdev->irq, flexcop_pci_irq,
+                                       SA_SHIRQ, DRIVER_NAME, fc_pci)) != 0)
+               goto err_pci_iounmap;
+
+       spin_lock_init(&fc_pci->irq_lock);
+
+       fc_pci->init_state |= FC_PCI_INIT;
+       goto success;
+
+err_pci_iounmap:
+       pci_iounmap(fc_pci->pdev, fc_pci->io_mem);
+       pci_set_drvdata(fc_pci->pdev, NULL);
+err_pci_release_regions:
+       pci_release_regions(fc_pci->pdev);
+err_pci_disable_device:
+       pci_disable_device(fc_pci->pdev);
+
+success:
+       return ret;
+}
+
+static void flexcop_pci_exit(struct flexcop_pci *fc_pci)
+{
+       if (fc_pci->init_state & FC_PCI_INIT) {
+               free_irq(fc_pci->pdev->irq, fc_pci);
+               pci_iounmap(fc_pci->pdev, fc_pci->io_mem);
+               pci_set_drvdata(fc_pci->pdev, NULL);
+               pci_release_regions(fc_pci->pdev);
+               pci_disable_device(fc_pci->pdev);
+       }
+       fc_pci->init_state &= ~FC_PCI_INIT;
+}
+
+
+static int flexcop_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+{
+       struct flexcop_device *fc;
+       struct flexcop_pci *fc_pci;
+       int ret = -ENOMEM;
+
+       if ((fc = flexcop_device_kmalloc(sizeof(struct flexcop_pci))) == NULL) {
+               err("out of memory\n");
+               return -ENOMEM;
+       }
+
+/* general flexcop init */
+       fc_pci = fc->bus_specific;
+       fc_pci->fc_dev = fc;
+
+       fc->read_ibi_reg = flexcop_pci_read_ibi_reg;
+       fc->write_ibi_reg = flexcop_pci_write_ibi_reg;
+       fc->i2c_request = flexcop_i2c_request;
+       fc->get_mac_addr = flexcop_eeprom_check_mac_addr;
+
+       fc->stream_control = flexcop_pci_stream_control;
+
+       if (enable_pid_filtering)
+               info("will use the HW PID filter.");
+       else
+               info("will pass the complete TS to the demuxer.");
+
+       fc->pid_filtering = enable_pid_filtering;
+       fc->bus_type = FC_PCI;
+
+       fc->dev = &pdev->dev;
+       fc->owner = THIS_MODULE;
+
+/* bus specific part */
+       fc_pci->pdev = pdev;
+       if ((ret = flexcop_pci_init(fc_pci)) != 0)
+               goto err_kfree;
+
+/* init flexcop */
+       if ((ret = flexcop_device_initialize(fc)) != 0)
+               goto err_pci_exit;
+
+/* init dma */
+       if ((ret = flexcop_pci_dma_init(fc_pci)) != 0)
+               goto err_fc_exit;
+
+       goto success;
+err_fc_exit:
+       flexcop_device_exit(fc);
+err_pci_exit:
+       flexcop_pci_exit(fc_pci);
+err_kfree:
+       flexcop_device_kfree(fc);
+success:
+       return ret;
+}
+
+/* in theory every _exit function should be called exactly two times,
+ * here and in the bail-out-part of the _init-function
+ */
+static void flexcop_pci_remove(struct pci_dev *pdev)
+{
+       struct flexcop_pci *fc_pci = pci_get_drvdata(pdev);
+
+       flexcop_pci_dma_exit(fc_pci);
+       flexcop_device_exit(fc_pci->fc_dev);
+       flexcop_pci_exit(fc_pci);
+       flexcop_device_kfree(fc_pci->fc_dev);
+}
+
+static struct pci_device_id flexcop_pci_tbl[] = {
+       { PCI_DEVICE(0x13d0, 0x2103) },
+/*     { PCI_DEVICE(0x13d0, 0x2200) }, PCI FlexCopIII ? */
+       { },
+};
+
+MODULE_DEVICE_TABLE(pci, flexcop_pci_tbl);
+
+static struct pci_driver flexcop_pci_driver = {
+       .name = "Technisat/B2C2 FlexCop II/IIb/III PCI",
+       .id_table = flexcop_pci_tbl,
+       .probe = flexcop_pci_probe,
+       .remove = flexcop_pci_remove,
+};
+
+static int __init flexcop_pci_module_init(void)
+{
+       return pci_register_driver(&flexcop_pci_driver);
+}
+
+static void __exit flexcop_pci_module_exit(void)
+{
+       pci_unregister_driver(&flexcop_pci_driver);
+}
+
+module_init(flexcop_pci_module_init);
+module_exit(flexcop_pci_module_exit);
+
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_NAME);
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/b2c2/flexcop-reg.h b/drivers/media/dvb/b2c2/flexcop-reg.h
new file mode 100644 (file)
index 0000000..5e131be
--- /dev/null
@@ -0,0 +1,701 @@
+/*
+ * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III
+ *
+ * flexcop-reg.h - register abstraction for FlexCopII, FlexCopIIb and FlexCopIII
+ *
+ * see flexcop.c for copyright information.
+ */
+#ifndef __FLEXCOP_REG_H__
+#define __FLEXCOP_REG_H__
+
+
+typedef enum {
+       FLEXCOP_UNK = 0,
+       FLEXCOP_II,
+       FLEXCOP_IIB,
+       FLEXCOP_III,
+} flexcop_revision_t;
+
+extern const char *flexcop_revision_names[];
+
+typedef enum {
+       FC_UNK = 0,
+       FC_AIR_DVB,
+       FC_AIR_ATSC,
+       FC_SKY,
+       FC_SKY_OLD,
+       FC_CABLE,
+} flexcop_device_type_t;
+
+typedef enum {
+       FC_USB = 0,
+       FC_PCI,
+} flexcop_bus_t;
+
+extern const char *flexcop_device_names[];
+
+/* FlexCop IBI Registers */
+
+/* flexcop_ibi_reg - a huge union representing the register structure */
+typedef union {
+       u32 raw;
+
+/* DMA 0x000 to 0x01c
+ * DMA1 0x000 to 0x00c
+ * DMA2 0x010 to 0x01c
+ */
+       struct {
+               u32 dma_0start        : 1;   /* set: data will be delivered to dma1_address0 */
+        u32 dma_0No_update    : 1;   /* set: dma1_cur_address will be updated, unset: no update */
+        u32 dma_address0      :30;   /* physical/virtual host memory address0 DMA */
+       } dma_0x0;
+
+       struct {
+               u32 DMA_maxpackets    : 8;   /* (remapped) PCI DMA1 Packet Count Interrupt. This variable
+                                                                               is able to be read and written while bit(1) of register
+                                                                               0x00c (remap_enable) is set. This variable represents
+                                                                               the number of packets that will be transmitted to the PCI
+                                                                               host using PCI DMA1 before an interrupt to the PCI is
+                                                                               asserted. This functionality may be enabled using bit(20)
+                                                                               of register 0x208. N=0 disables the IRQ. */
+               u32 dma_addr_size     :24;   /* size of memory buffer in DWORDs (bytesize / 4) for DMA */
+       } dma_0x4_remap;
+
+       struct {
+               u32 dma1timer         : 7;   /* reading PCI DMA1 timer ... when remap_enable is 0 */
+               u32 unused            : 1;
+               u32 dma_addr_size     :24;
+       } dma_0x4_read;
+
+       struct {
+               u32 unused            : 1;
+               u32 dmatimer          : 7;   /* writing PCI DMA1 timer ... when remap_enable is 0 */
+               u32 dma_addr_size     :24;
+       } dma_0x4_write;
+
+       struct {
+               u32 unused            : 2;
+               u32 dma_cur_addr      :30;   /* current physical host memory address pointer for DMA */
+       } dma_0x8;
+
+       struct {
+               u32 dma_1start        : 1;   /* set: data will be delivered to dma_address1, when dma_address0 is full */
+               u32 remap_enable      : 1;   /* remap enable for 0x0x4(7:0) */
+               u32 dma_address1      :30;   /* Physical/virtual address 1 on DMA */
+       } dma_0xc;
+
+/* Two-wire Serial Master and Clock 0x100-0x110 */
+       struct {
+//             u32 slave_transmitter : 1;   /* ???*/
+               u32 chipaddr          : 7;   /* two-line serial address of the target slave */
+               u32 reserved1         : 1;
+               u32 baseaddr          : 8;   /* address of the location of the read/write operation */
+               u32 data1_reg         : 8;   /* first byte in two-line serial read/write operation */
+               u32 working_start     : 1;  /* when doing a write operation this indicator is 0 when ready
+                                                                         * set to 1 when doing a write operation */
+               u32 twoWS_rw          : 1;   /* read/write indicator (1 = read, 0 write) */
+               u32 total_bytes       : 2;   /* number of data bytes in each two-line serial transaction (0 = 1 byte, 11 = 4byte)*/
+               u32 twoWS_port_reg    : 2;   /* port selection: 01 - Front End/Demod, 10 - EEPROM, 11 - Tuner */
+               u32 no_base_addr_ack_error : 1;   /* writing: write-req: frame is produced w/o baseaddr, read-req: read-cycles w/o
+                                                                         * preceding address assignment write frame
+                                                                         * ACK_ERROR = 1 when no ACK from slave in the last transaction */
+               u32 st_done           : 1;   /* indicator for transaction is done */
+       } tw_sm_c_100;
+
+       struct {
+               u32 data2_reg         : 8;   /* 2nd data byte */
+               u32 data3_reg         : 8;   /* 3rd data byte */
+               u32 data4_reg         : 8;   /* 4th data byte */
+               u32 exlicit_stops     : 1;   /* when set, transactions are produced w/o trailing STOP flag, then send isolated STOP flags */
+               u32 force_stop        : 1;   /* isolated stop flag */
+               u32 unused            : 6;
+       } tw_sm_c_104;
+
+/* Clock. The register allows the FCIII to convert an incoming Master clock
+ * (MCLK) signal into a lower frequency clock through the use of a LowCounter
+ * (TLO) and a High- Counter (THI). The time counts for THI and TLO are
+ * measured in MCLK; each count represents 4 MCLK input clock cycles.
+ *
+ * The default output for port #1 is set for Front End Demod communication. (0x108)
+ * The default output for port #2 is set for EEPROM communication. (0x10c)
+ * The default output for port #3 is set for Tuner communication. (0x110)
+ */
+       struct {
+               u32 thi1              : 6;   /* Thi for port #1 (def: 100110b; 38) */
+               u32 reserved1         : 2;
+               u32 tlo1              : 5;   /* Tlo for port #1 (def: 11100b; 28) */
+               u32 reserved2         :19;
+       } tw_sm_c_108;
+
+       struct {
+               u32 thi1              : 6;   /* Thi for port #2 (def: 111001b; 57) */
+               u32 reserved1         : 2;
+               u32 tlo1              : 5;   /* Tlo for port #2 (def: 11100b; 28) */
+               u32 reserved2         :19;
+       } tw_sm_c_10c;
+
+       struct {
+               u32 thi1              : 6;   /* Thi for port #3 (def: 111001b; 57) */
+               u32 reserved1         : 2;
+               u32 tlo1              : 5;   /* Tlo for port #3 (def: 11100b; 28) */
+               u32 reserved2         :19;
+       } tw_sm_c_110;
+
+/* LNB Switch Frequency 0x200
+ * Clock that creates the LNB switch tone. The default is set to have a fixed
+ * low output (not oscillating) to the LNB_CTL line.
+ */
+       struct {
+               u32 LNB_CTLHighCount_sig :15; /* It is the number of pre-scaled clock cycles that will be low. */
+               u32 LNB_CTLLowCount_sig  :15; /* For example, to obtain a 22KHz output given a 45 Mhz Master
+                                                                               Clock signal (MCLK), set PreScalar=01 and LowCounter value to 0x1ff. */
+               u32 LNB_CTLPrescaler_sig : 2; /* pre-scaler divides MCLK: 00 (no division), 01 by 2, 10 by 4, 11 by 12 */
+       } lnb_switch_freq_200;
+
+/* ACPI, Peripheral Reset, LNB Polarity
+ * ACPI power conservation mode, LNB polarity selection (low or high voltage),
+ * and peripheral reset.
+ */
+       struct {
+               u32 ACPI1_sig         : 1;   /* turn of the power of tuner and LNB, not implemented in FCIII */
+               u32 ACPI3_sig         : 1;   /* turn of power of the complete satelite receiver board (except FCIII) */
+               u32 LNB_L_H_sig       : 1;   /* low or high voltage for LNB. (0 = low, 1 = high) */
+               u32 Per_reset_sig     : 1;   /* misc. init reset (default: 1), to reset set to low and back to high */
+               u32 reserved          :20;
+               u32 Rev_N_sig_revision_hi : 4;/* 0xc in case of FCIII */
+               u32 Rev_N_sig_reserved1 : 2;
+               u32 Rev_N_sig_caps    : 1;   /* if 1, FCIII has 32 PID- and MAC-filters and is capable of IP multicast */
+               u32 Rev_N_sig_reserved2 : 1;
+       } misc_204;
+
+/* Control and Status 0x208 to 0x21c */
+/* Gross enable and disable control */
+       struct {
+               u32 Stream1_filter_sig : 1;  /* Stream1 PID filtering */
+               u32 Stream2_filter_sig : 1;  /* Stream2 PID filtering */
+               u32 PCR_filter_sig    : 1;   /* PCR PID filter */
+               u32 PMT_filter_sig    : 1;   /* PMT PID filter */
+
+               u32 EMM_filter_sig    : 1;   /* EMM PID filter */
+               u32 ECM_filter_sig    : 1;   /* ECM PID filter */
+               u32 Null_filter_sig   : 1;   /* Filters null packets, PID=0x1fff. */
+               u32 Mask_filter_sig   : 1;   /* mask PID filter */
+
+               u32 WAN_Enable_sig    : 1;   /* WAN output line through V8 memory space is activated. */
+               u32 WAN_CA_Enable_sig : 1;   /* not in FCIII */
+               u32 CA_Enable_sig     : 1;   /* not in FCIII */
+               u32 SMC_Enable_sig    : 1;   /* CI stream data (CAI) goes directly to the smart card intf (opposed IBI 0x600 or SC-cmd buf). */
+
+               u32 Per_CA_Enable_sig : 1;   /* not in FCIII */
+               u32 Multi2_Enable_sig : 1;   /* ? */
+               u32 MAC_filter_Mode_sig : 1; /* (MAC_filter_enable) Globally enables MAC filters for Net PID filteres. */
+               u32 Rcv_Data_sig      : 1;   /* PID filtering module enable. When this bit is a one, the PID filter will
+                                                                               examine and process packets according to all other (individual) PID
+                                                                               filtering controls. If it a zero, no packet processing of any kind will
+                                                                               take place. All data from the tuner will be thrown away. */
+
+               u32 DMA1_IRQ_Enable_sig : 1; /* When set, a DWORD counter is enabled on PCI DMA1 that asserts the PCI
+                                                                         * interrupt after the specified count for filling the buffer. */
+               u32 DMA1_Timer_Enable_sig : 1; /* When set, a timer is enabled on PCI DMA1 that asserts the PCI interrupt
+                                                                                       after a specified amount of time. */
+               u32 DMA2_IRQ_Enable_sig : 1;   /* same as DMA1_IRQ_Enable_sig but for DMA2 */
+               u32 DMA2_Timer_Enable_sig : 1;   /* same as DMA1_Timer_Enable_sig but for DMA2 */
+
+               u32 DMA1_Size_IRQ_Enable_sig : 1; /* When set, a packet count detector is enabled on PCI DMA1 that asserts the PCI interrupt. */
+               u32 DMA2_Size_IRQ_Enable_sig : 1; /* When set, a packet count detector is enabled on PCI DMA2 that asserts the PCI interrupt. */
+               u32 Mailbox_from_V8_Enable_sig: 1; /* When set, writes to the mailbox register produce an interrupt to the
+                                                                                       PCI host to indicate that mailbox data is available. */
+
+               u32 unused            : 9;
+       } ctrl_208;
+
+/* General status. When a PCI interrupt occurs, this register is read to
+ * discover the reason for the interrupt.
+ */
+       struct {
+               u32 DMA1_IRQ_Status   : 1;   /* When set(1) the DMA1 counter had generated an IRQ. Read Only. */
+               u32 DMA1_Timer_Status : 1;   /* When set(1) the DMA1 timer had generated an IRQ. Read Only. */
+               u32 DMA2_IRQ_Status   : 1;   /* When set(1) the DMA2 counter had generated an IRQ. Read Only. */
+               u32 DMA2_Timer_Status : 1;   /* When set(1) the DMA2 timer had generated an IRQ. Read Only. */
+               u32 DMA1_Size_IRQ_Status : 1; /* (Read only). This register is read after an interrupt to */
+               u32 DMA2_Size_IRQ_Status : 1; /* find out why we had an IRQ. Reading this register will clear this bit. Packet count*/
+               u32 Mailbox_from_V8_Status_sig: 1; /* Same as above. Reading this register will clear this bit. */
+               u32 Data_receiver_error : 1; /* 1 indicate an error in the receiver Front End (Tuner module) */
+               u32 Continuity_error_flag : 1;   /* 1 indicates a continuity error in the TS stream. */
+               u32 LLC_SNAP_FLAG_set : 1;   /* 1 indicates that the LCC_SNAP_FLAG was set. */
+               u32 Transport_Error   : 1;   /*  When set indicates that an unexpected packet was received. */
+               u32 reserved          :21;
+       } irq_20c;
+
+
+/* Software reset register */
+       struct {
+               u32 reset_blocks      : 8;   /* Enabled when Block_reset_enable = 0xB2 and 0x208 bits 15:8 = 0x00.
+                                                                               Each bit location represents a 0x100 block of registers. Writing
+                                                                               a one in a bit location resets that block of registers and the logic
+                                                                               that it controls. */
+               u32 Block_reset_enable : 8;  /* This variable is set to 0xB2 when the register is written. */
+               u32 Special_controls  :16;   /* Asserts Reset_V8 => 0xC258; Turns on pci encryption => 0xC25A;
+                                                                               Turns off pci encryption => 0xC259 Note: pci_encryption default
+                                                                               at power-up is ON. */
+       } sw_reset_210;
+
+       struct {
+               u32 vuart_oe_sig      : 1;   /* When clear, the V8 processor has sole control of the serial UART
+                                                                               (RS-232 Smart Card interface). When set, the IBI interface
+                                                                               defined by register 0x600 controls the serial UART. */
+               u32 v2WS_oe_sig       : 1;   /* When clear, the V8 processor has direct control of the Two-line
+                                                                               Serial Master EEPROM target. When set, the Two-line Serial Master
+                                                                               EEPROM target interface is controlled by IBI register 0x100. */
+               u32 halt_V8_sig       : 1;   /* When set, contiguous wait states are applied to the V8-space
+                                                                               bus masters. Once this signal is cleared, normal V8-space
+                                                                               operations resume. */
+               u32 section_pkg_enable_sig: 1; /* When set, this signal enables the front end translation circuitry
+                                                                                 to process section packed transport streams. */
+               u32 s2p_sel_sig       : 1;   /* Serial to parallel conversion. When set, polarized transport data
+                                                                               within the FlexCop3 front end circuitry is converted from a serial
+                                                                               stream into parallel data before downstream processing otherwise
+                                                                               interprets the data. */
+               u32 unused1           : 3;
+               u32 polarity_PS_CLK_sig: 1;  /* This signal is used to invert the input polarity of the tranport
+                                                                               stream CLOCK signal before any processing occurs on the transport
+                                                                               stream within FlexCop3. */
+               u32 polarity_PS_VALID_sig: 1; /* This signal is used to invert the input polarity of the tranport
+                                                                               stream VALID signal before any processing occurs on the transport
+                                                                               stream within FlexCop3. */
+               u32 polarity_PS_SYNC_sig: 1; /* This signal is used to invert the input polarity of the tranport
+                                                                               stream SYNC signal before any processing occurs on the transport
+                                                                               stream within FlexCop3. */
+               u32 polarity_PS_ERR_sig: 1;  /* This signal is used to invert the input polarity of the tranport
+                                                                               stream ERROR signal before any processing occurs on the transport
+                                                                               stream within FlexCop3. */
+               u32 unused2           :20;
+       } misc_214;
+
+/* Mailbox from V8 to host */
+       struct {
+               u32 Mailbox_from_V8   :32;   /* When this register is written by either the V8 processor or by an
+                                                                               end host, an interrupt is generated to the PCI host to indicate
+                                                                               that mailbox data is available. Reading register 20c will clear
+                                                                               the IRQ. */
+       } mbox_v8_to_host_218;
+
+/* Mailbox from host to v8 Mailbox_to_V8
+ * Mailbox_to_V8 mailbox storage register
+ * used to send messages from PCI to V8. Writing to this register will send an
+ * IRQ to the V8. Then it can read the data from here. Reading this register
+ * will clear the IRQ. If the V8 is halted and bit 31 of this register is set,
+ * then this register is used instead as a direct interface to access the
+ * V8space memory.
+ */
+       struct {
+               u32 sysramaccess_data : 8;   /* Data byte written or read from the specified address in V8 SysRAM. */
+               u32 sysramaccess_addr :15;   /* 15 bit address used to access V8 Sys-RAM. */
+               u32 unused            : 7;
+               u32 sysramaccess_write: 1;   /* Write flag used to latch data into the V8 SysRAM. */
+               u32 sysramaccess_busmuster: 1; /* Setting this bit when the V8 is halted at 0x214 Bit(2) allows
+                                                                                 this IBI register interface to directly drive the V8-space memory. */
+       } mbox_host_to_v8_21c;
+
+
+/* PIDs, Translation Bit, SMC Filter Select 0x300 to 0x31c */
+       struct {
+               u32 Stream1_PID       :13;   /* Primary use is receiving Net data, so these 13 bits normally
+                                                                               hold the PID value for the desired network stream. */
+               u32 Stream1_trans     : 1;   /* When set, Net translation will take place for Net data ferried in TS packets. */
+               u32 MAC_Multicast_filter : 1;   /* When clear, multicast MAC filtering is not allowed for Stream1 and PID_n filters. */
+               u32 debug_flag_pid_saved : 1;
+               u32 Stream2_PID       :13;   /* 13 bits for Stream 2 PID filter value. General use. */
+               u32 Stream2_trans     : 1;   /* When set Tables/CAI translation will take place for the data ferried in
+                                                                               Stream2_PID TS packets. */
+               u32 debug_flag_write_status00 : 1;
+               u32 debug_fifo_problem : 1;
+       } pid_filter_300;
+
+       struct {
+               u32 PCR_PID           :13;   /* PCR stream PID filter value. Primary use is Program Clock Reference stream filtering. */
+               u32 PCR_trans         : 1;   /* When set, Tables/CAI translation will take place for these packets. */
+               u32 debug_overrun3    : 1;
+               u32 debug_overrun2    : 1;
+               u32 PMT_PID           :13;   /* stream PID filter value. Primary use is Program Management Table segment filtering. */
+               u32 PMT_trans         : 1;   /* When set, Tables/CAI translation will take place for these packets. */
+               u32 reserved          : 2;
+       } pid_filter_304;
+
+       struct {
+               u32 EMM_PID           :13;   /* EMM PID filter value. Primary use is Entitlement Management Messaging for
+                                                                               conditional access-related data. */
+               u32 EMM_trans         : 1;   /* When set, Tables/CAI translation will take place for these packets. */
+               u32 EMM_filter_4      : 1;   /* When set will pass only EMM data possessing the same ID code as the
+                                                                               first four bytes (32 bits) of the end-user s 6-byte Smart Card ID number Select */
+               u32 EMM_filter_6      : 1;   /* When set will pass only EMM data possessing the same 6-byte code as the end-users
+                                                                               complete 6-byte Smart Card ID number. */
+               u32 ECM_PID           :13;   /* ECM PID filter value. Primary use is Entitlement Control Messaging for conditional
+                                                                               access-related data. */
+               u32 ECM_trans         : 1;   /* When set, Tables/CAI translation will take place for these packets. */
+               u32 reserved          : 2;
+       } pid_filter_308;
+
+       struct {
+               u32 Group_PID     :13;   /* PID value for group filtering. */
+               u32 Group_trans   : 1;   /* When set, Tables/CAI translation will take place for these packets. */
+               u32 unused1       : 2;
+               u32 Group_mask    :13;   /* Mask value used in logical "and" equation that defines group filtering */
+               u32 unused2       : 3;
+       } pid_filter_30c_ext_ind_0_7;
+
+       struct {
+               u32 net_master_read :17;
+               u32 unused        :15;
+       } pid_filter_30c_ext_ind_1;
+
+       struct {
+               u32 net_master_write :17;
+               u32 unused        :15;
+       } pid_filter_30c_ext_ind_2;
+
+       struct {
+               u32 next_net_master_write :17;
+               u32 unused        :15;
+       } pid_filter_30c_ext_ind_3;
+
+       struct {
+               u32 unused1       : 1;
+               u32 state_write   :10;
+               u32 reserved1     : 6;   /* default: 000100 */
+               u32 stack_read    :10;
+               u32 reserved2     : 5;   /* default: 00100 */
+       } pid_filter_30c_ext_ind_4;
+
+       struct {
+               u32 stack_cnt     :10;
+               u32 unused        :22;
+       } pid_filter_30c_ext_ind_5;
+
+       struct {
+               u32 pid_fsm_save_reg0 : 2;
+               u32 pid_fsm_save_reg1 : 2;
+               u32 pid_fsm_save_reg2 : 2;
+               u32 pid_fsm_save_reg3 : 2;
+               u32 pid_fsm_save_reg4 : 2;
+               u32 pid_fsm_save_reg300 : 2;
+               u32 write_status1 : 2;
+               u32 write_status4 : 2;
+               u32 data_size_reg :12;
+               u32 unused        : 4;
+       } pid_filter_30c_ext_ind_6;
+
+       struct {
+               u32 index_reg         : 5;   /* (Index pointer) Points at an internal PIDn register. A binary code
+                                                                               representing one of 32 internal PIDn registers as well as its
+                                                                               corresponding internal MAC_lown register. */
+               u32 extra_index_reg   : 3;   /* This vector is used to select between sets of debug signals routed to register 0x30c. */
+               u32 AB_select         : 1;   /* Used in conjunction with 0x31c. read/write to the MAC_highA or MAC_highB register
+                                                                               0=MAC_highB register, 1=MAC_highA */
+               u32 pass_alltables    : 1;   /* 1=Net packets are not filtered against the Network Table ID found in register 0x400.
+                                                                               All types of networks (DVB, ATSC, ISDB) are passed. */
+               u32 unused            :22;
+       } index_reg_310;
+
+       struct {
+               u32 PID               :13;   /* PID value */
+               u32 PID_trans         : 1;   /* translation will take place for packets filtered */
+               u32 PID_enable_bit    : 1;   /* When set this PID filter is enabled */
+               u32 reserved          :17;
+       } pid_n_reg_314;
+
+       struct {
+               u32 A4_byte           : 8;
+               u32 A5_byte           : 8;
+               u32 A6_byte           : 8;
+               u32 Enable_bit        : 1;   /* enabled (1) or disabled (1) */
+               u32 HighAB_bit        : 1;   /* use MAC_highA (1) or MAC_highB (0) as MSB */
+               u32 reserved          : 6;
+       } mac_low_reg_318;
+
+       struct {
+               u32 A1_byte           : 8;
+               u32 A2_byte           : 8;
+               u32 A3_byte           : 8;
+               u32 reserved          : 8;
+       } mac_high_reg_31c;
+
+/* Table, SMCID,MACDestination Filters 0x400 to 0x41c */
+       struct {
+               u32 reserved          :16;
+#define fc_data_Tag_ID_DVB  0x3e
+#define fc_data_Tag_ID_ATSC 0x3f
+#define fc_data_Tag_ID_IDSB 0x8b
+               u32 data_Tag_ID       :16;
+       } data_tag_400;
+
+       struct {
+               u32 Card_IDbyte6      : 8;
+               u32 Card_IDbyte5      : 8;
+               u32 Card_IDbyte4      : 8;
+               u32 Card_IDbyte3      : 8;
+       } card_id_408;
+
+       struct {
+               u32 Card_IDbyte2      : 8;
+               u32 Card_IDbyte1      : 8;
+       } card_id_40c;
+
+       /* holding the unique mac address of the receiver which houses the FlexCopIII */
+       struct {
+               u32 MAC1              : 8;
+               u32 MAC2              : 8;
+               u32 MAC3              : 8;
+               u32 MAC6              : 8;
+       } mac_address_418;
+
+       struct {
+               u32 MAC7              : 8;
+               u32 MAC8              : 8;
+               u32 reserved          : 16;
+       } mac_address_41c;
+
+       struct {
+               u32 transmitter_data_byte : 8;
+               u32 ReceiveDataReady  : 1;
+               u32 ReceiveByteFrameError: 1;
+               u32 txbuffempty       : 1;
+               u32 reserved          :21;
+       } ci_600;
+
+       struct {
+               u32 pi_d              : 8;
+               u32 pi_ha             :20;
+               u32 pi_rw             : 1;
+               u32 pi_component_reg  : 3;
+       } pi_604;
+
+       struct {
+               u32 serialReset       : 1;
+               u32 oncecycle_read    : 1;
+               u32 Timer_Read_req    : 1;
+               u32 Timer_Load_req    : 1;
+               u32 timer_data        : 7;
+               u32 unused            : 1; /* ??? not mentioned in data book */
+               u32 Timer_addr        : 5;
+               u32 reserved          : 3;
+               u32 pcmcia_a_mod_pwr_n : 1;
+               u32 pcmcia_b_mod_pwr_n : 1;
+               u32 config_Done_stat  : 1;
+               u32 config_Init_stat  : 1;
+               u32 config_Prog_n     : 1;
+               u32 config_wr_n       : 1;
+               u32 config_cs_n       : 1;
+               u32 config_cclk       : 1;
+               u32 pi_CiMax_IRQ_n    : 1;
+               u32 pi_timeout_status : 1;
+               u32 pi_wait_n         : 1;
+               u32 pi_busy_n         : 1;
+       } pi_608;
+
+       struct {
+               u32 PID               :13;
+               u32 key_enable        : 1;
+#define fc_key_code_default 0x1
+#define fc_key_code_even    0x2
+#define fc_key_code_odd     0x3
+               u32 key_code          : 2;
+               u32 key_array_col     : 3;
+               u32 key_array_row     : 5;
+               u32 dvb_en            : 1; /* 0=TS bypasses the Descrambler */
+               u32 rw_flag           : 1;
+               u32 reserved          : 6;
+       } dvb_reg_60c;
+
+/* SRAM and Output Destination 0x700 to 0x714 */
+       struct {
+               u32 sram_addr         :15;
+               u32 sram_rw           : 1;   /* 0=write, 1=read */
+               u32 sram_data         : 8;
+               u32 sc_xfer_bit       : 1;
+               u32 reserved1         : 3;
+               u32 oe_pin_reg        : 1;
+               u32 ce_pin_reg        : 1;
+               u32 reserved2         : 1;
+               u32 start_sram_ibi    : 1;
+       } sram_ctrl_reg_700;
+
+       struct {
+               u32 net_addr_read     :16;
+               u32 net_addr_write    :16;
+       } net_buf_reg_704;
+
+       struct {
+               u32 cai_read          :11;
+               u32 reserved1         : 5;
+               u32 cai_write         :11;
+               u32 reserved2         : 6;
+               u32 cai_cnt           : 4;
+       } cai_buf_reg_708;
+
+       struct {
+               u32 cao_read          :11;
+               u32 reserved1         : 5;
+               u32 cap_write         :11;
+               u32 reserved2         : 6;
+               u32 cao_cnt           : 4;
+       } cao_buf_reg_70c;
+
+       struct {
+               u32 media_read        :11;
+               u32 reserved1         : 5;
+               u32 media_write       :11;
+               u32 reserved2         : 6;
+               u32 media_cnt         : 4;
+       } media_buf_reg_710;
+
+       struct {
+               u32 NET_Dest          : 2;
+               u32 CAI_Dest          : 2;
+               u32 CAO_Dest          : 2;
+               u32 MEDIA_Dest        : 2;
+               u32 net_ovflow_error  : 1;
+               u32 media_ovflow_error : 1;
+               u32 cai_ovflow_error  : 1;
+               u32 cao_ovflow_error  : 1;
+               u32 ctrl_usb_wan      : 1;
+               u32 ctrl_sramdma      : 1;
+               u32 ctrl_maximumfill  : 1;
+               u32 reserved          :17;
+       } sram_dest_reg_714;
+
+       struct {
+               u32 net_cnt           :12;
+               u32 reserved1         : 4;
+               u32 net_addr_read     : 1;
+               u32 reserved2         : 3;
+               u32 net_addr_write    : 1;
+               u32 reserved3         :11;
+       } net_buf_reg_718;
+
+       struct {
+               u32 wan_speed_sig     : 2;
+               u32 reserved1         : 6;
+               u32 wan_wait_state    : 8;
+               u32 sram_chip         : 2;
+               u32 sram_memmap       : 2;
+               u32 reserved2         : 4;
+               u32 wan_pkt_frame     : 4;
+               u32 reserved3         : 4;
+       } wan_ctrl_reg_71c;
+} flexcop_ibi_value;
+
+extern flexcop_ibi_value ibi_zero;
+
+typedef enum {
+       FC_I2C_PORT_DEMOD  = 1,
+       FC_I2C_PORT_EEPROM = 2,
+       FC_I2C_PORT_TUNER  = 3,
+} flexcop_i2c_port_t;
+
+typedef enum {
+       FC_WRITE = 0,
+       FC_READ  = 1,
+} flexcop_access_op_t;
+
+typedef enum {
+       FC_SRAM_DEST_NET   = 1,
+       FC_SRAM_DEST_CAI   = 2,
+       FC_SRAM_DEST_CAO   = 4,
+       FC_SRAM_DEST_MEDIA = 8
+} flexcop_sram_dest_t;
+
+typedef enum {
+       FC_SRAM_DEST_TARGET_WAN_USB = 0,
+       FC_SRAM_DEST_TARGET_DMA1    = 1,
+       FC_SRAM_DEST_TARGET_DMA2    = 2,
+       FC_SRAM_DEST_TARGET_FC3_CA  = 3
+} flexcop_sram_dest_target_t;
+
+typedef enum {
+       FC_SRAM_2_32KB  = 0, /*  64KB */
+       FC_SRAM_1_32KB  = 1, /*  32KB - default fow FCII */
+       FC_SRAM_1_128KB = 2, /* 128KB */
+       FC_SRAM_1_48KB  = 3, /*  48KB - default for FCIII */
+} flexcop_sram_type_t;
+
+typedef enum {
+       FC_WAN_SPEED_4MBITS  = 0,
+       FC_WAN_SPEED_8MBITS  = 1,
+       FC_WAN_SPEED_12MBITS = 2,
+       FC_WAN_SPEED_16MBITS = 3,
+} flexcop_wan_speed_t;
+
+typedef enum {
+       FC_DMA_1 = 1,
+       FC_DMA_2 = 2,
+} flexcop_dma_index_t;
+
+typedef enum {
+       FC_DMA_SUBADDR_0 = 1,
+       FC_DMA_SUBADDR_1 = 2,
+} flexcop_dma_addr_index_t;
+
+/* names of the particular registers */
+typedef enum {
+       dma1_000            = 0x000,
+       dma1_004            = 0x004,
+       dma1_008            = 0x008,
+       dma1_00c            = 0x00c,
+       dma2_010            = 0x010,
+       dma2_014            = 0x014,
+       dma2_018            = 0x018,
+       dma2_01c            = 0x01c,
+
+       tw_sm_c_100         = 0x100,
+       tw_sm_c_104         = 0x104,
+       tw_sm_c_108         = 0x108,
+       tw_sm_c_10c         = 0x10c,
+       tw_sm_c_110         = 0x110,
+
+       lnb_switch_freq_200 = 0x200,
+       misc_204            = 0x204,
+       ctrl_208            = 0x208,
+       irq_20c             = 0x20c,
+       sw_reset_210        = 0x210,
+       misc_214            = 0x214,
+       mbox_v8_to_host_218 = 0x218,
+       mbox_host_to_v8_21c = 0x21c,
+
+       pid_filter_300      = 0x300,
+       pid_filter_304      = 0x304,
+       pid_filter_308      = 0x308,
+       pid_filter_30c      = 0x30c,
+       index_reg_310       = 0x310,
+       pid_n_reg_314       = 0x314,
+       mac_low_reg_318     = 0x318,
+       mac_high_reg_31c    = 0x31c,
+
+       data_tag_400        = 0x400,
+       card_id_408         = 0x408,
+       card_id_40c         = 0x40c,
+       mac_address_418     = 0x418,
+       mac_address_41c     = 0x41c,
+
+       ci_600              = 0x600,
+       pi_604              = 0x604,
+       pi_608              = 0x608,
+       dvb_reg_60c         = 0x60c,
+
+       sram_ctrl_reg_700   = 0x700,
+       net_buf_reg_704     = 0x704,
+       cai_buf_reg_708     = 0x708,
+       cao_buf_reg_70c     = 0x70c,
+       media_buf_reg_710   = 0x710,
+       sram_dest_reg_714   = 0x714,
+       net_buf_reg_718     = 0x718,
+       wan_ctrl_reg_71c    = 0x71c,
+} flexcop_ibi_register;
+
+#define flexcop_set_ibi_value(reg,attr,val) { \
+       flexcop_ibi_value v = fc->read_ibi_reg(fc,reg); \
+       v.reg.attr = val; \
+       fc->write_ibi_reg(fc,reg,v); \
+}
+
+#endif
diff --git a/drivers/media/dvb/b2c2/flexcop-sram.c b/drivers/media/dvb/b2c2/flexcop-sram.c
new file mode 100644 (file)
index 0000000..01570ec
--- /dev/null
@@ -0,0 +1,403 @@
+/*
+ * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III
+ *
+ * flexcop-sram.c - functions for controlling the SRAM.
+ *
+ * see flexcop.c for copyright information.
+ */
+#include "flexcop.h"
+
+static void flexcop_sram_set_chip (struct flexcop_device *fc, flexcop_sram_type_t type)
+{
+       flexcop_set_ibi_value(wan_ctrl_reg_71c,sram_chip,type);
+}
+
+int flexcop_sram_init(struct flexcop_device *fc)
+{
+       switch (fc->rev) {
+               case FLEXCOP_II:
+               case FLEXCOP_IIB:
+                       flexcop_sram_set_chip(fc,FC_SRAM_1_32KB);
+                       break;
+               case FLEXCOP_III:
+                       flexcop_sram_set_chip(fc,FC_SRAM_1_48KB);
+                       break;
+               default:
+                       return -EINVAL;
+       }
+       return 0;
+}
+
+int flexcop_sram_set_dest(struct flexcop_device *fc, flexcop_sram_dest_t dest, flexcop_sram_dest_target_t target)
+{
+       flexcop_ibi_value v;
+
+       v = fc->read_ibi_reg(fc,sram_dest_reg_714);
+
+       if (fc->rev != FLEXCOP_III && target == FC_SRAM_DEST_TARGET_FC3_CA) {
+               err("SRAM destination target to available on FlexCopII(b)\n");
+               return -EINVAL;
+       }
+
+       deb_sram("sram dest: %x target: %x\n",dest, target);
+
+       if (dest & FC_SRAM_DEST_NET)
+               v.sram_dest_reg_714.NET_Dest = target;
+       if (dest & FC_SRAM_DEST_CAI)
+               v.sram_dest_reg_714.CAI_Dest = target;
+       if (dest & FC_SRAM_DEST_CAO)
+               v.sram_dest_reg_714.CAO_Dest = target;
+       if (dest & FC_SRAM_DEST_MEDIA)
+               v.sram_dest_reg_714.MEDIA_Dest = target;
+
+       fc->write_ibi_reg(fc,sram_dest_reg_714,v);
+       udelay(1000); /* TODO delay really necessary */
+
+       return 0;
+}
+EXPORT_SYMBOL(flexcop_sram_set_dest);
+
+void flexcop_wan_set_speed(struct flexcop_device *fc, flexcop_wan_speed_t s)
+{
+       flexcop_set_ibi_value(wan_ctrl_reg_71c,wan_speed_sig,s);
+}
+EXPORT_SYMBOL(flexcop_wan_set_speed);
+
+void flexcop_sram_ctrl(struct flexcop_device *fc, int usb_wan, int sramdma, int maximumfill)
+{
+       flexcop_ibi_value v = fc->read_ibi_reg(fc,sram_dest_reg_714);
+       v.sram_dest_reg_714.ctrl_usb_wan = usb_wan;
+       v.sram_dest_reg_714.ctrl_sramdma = sramdma;
+       v.sram_dest_reg_714.ctrl_maximumfill = maximumfill;
+       fc->write_ibi_reg(fc,sram_dest_reg_714,v);
+}
+EXPORT_SYMBOL(flexcop_sram_ctrl);
+
+#if 0
+static void flexcop_sram_write(struct adapter *adapter, u32 bank, u32 addr, u8 *buf, u32 len)
+{
+       int i, retries;
+       u32 command;
+
+       for (i = 0; i < len; i++) {
+               command = bank | addr | 0x04000000 | (*buf << 0x10);
+
+               retries = 2;
+
+               while (((read_reg_dw(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
+                       mdelay(1);
+                       retries--;
+               };
+
+               if (retries == 0)
+                       printk("%s: SRAM timeout\n", __FUNCTION__);
+
+               write_reg_dw(adapter, 0x700, command);
+
+               buf++;
+               addr++;
+       }
+}
+
+static void flex_sram_read(struct adapter *adapter, u32 bank, u32 addr, u8 *buf, u32 len)
+{
+       int i, retries;
+       u32 command, value;
+
+       for (i = 0; i < len; i++) {
+               command = bank | addr | 0x04008000;
+
+               retries = 10000;
+
+               while (((read_reg_dw(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
+                       mdelay(1);
+                       retries--;
+               };
+
+               if (retries == 0)
+                       printk("%s: SRAM timeout\n", __FUNCTION__);
+
+               write_reg_dw(adapter, 0x700, command);
+
+               retries = 10000;
+
+               while (((read_reg_dw(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
+                       mdelay(1);
+                       retries--;
+               };
+
+               if (retries == 0)
+                       printk("%s: SRAM timeout\n", __FUNCTION__);
+
+               value = read_reg_dw(adapter, 0x700) >> 0x10;
+
+               *buf = (value & 0xff);
+
+               addr++;
+               buf++;
+       }
+}
+
+static void sram_write_chunk(struct adapter *adapter, u32 addr, u8 *buf, u16 len)
+{
+       u32 bank;
+
+       bank = 0;
+
+       if (adapter->dw_sram_type == 0x20000) {
+               bank = (addr & 0x18000) << 0x0d;
+       }
+
+       if (adapter->dw_sram_type == 0x00000) {
+               if ((addr >> 0x0f) == 0)
+                       bank = 0x20000000;
+               else
+                       bank = 0x10000000;
+       }
+
+       flex_sram_write(adapter, bank, addr & 0x7fff, buf, len);
+}
+
+static void sram_read_chunk(struct adapter *adapter, u32 addr, u8 *buf, u16 len)
+{
+       u32 bank;
+
+       bank = 0;
+
+       if (adapter->dw_sram_type == 0x20000) {
+               bank = (addr & 0x18000) << 0x0d;
+       }
+
+       if (adapter->dw_sram_type == 0x00000) {
+               if ((addr >> 0x0f) == 0)
+                       bank = 0x20000000;
+               else
+                       bank = 0x10000000;
+       }
+
+       flex_sram_read(adapter, bank, addr & 0x7fff, buf, len);
+}
+
+static void sram_read(struct adapter *adapter, u32 addr, u8 *buf, u32 len)
+{
+       u32 length;
+
+       while (len != 0) {
+               length = len;
+
+               // check if the address range belongs to the same
+               // 32K memory chip. If not, the data is read from
+               // one chip at a time.
+               if ((addr >> 0x0f) != ((addr + len - 1) >> 0x0f)) {
+                       length = (((addr >> 0x0f) + 1) << 0x0f) - addr;
+               }
+
+               sram_read_chunk(adapter, addr, buf, length);
+
+               addr = addr + length;
+               buf = buf + length;
+               len = len - length;
+       }
+}
+
+static void sram_write(struct adapter *adapter, u32 addr, u8 *buf, u32 len)
+{
+       u32 length;
+
+       while (len != 0) {
+               length = len;
+
+               // check if the address range belongs to the same
+               // 32K memory chip. If not, the data is written to
+               // one chip at a time.
+               if ((addr >> 0x0f) != ((addr + len - 1) >> 0x0f)) {
+                       length = (((addr >> 0x0f) + 1) << 0x0f) - addr;
+               }
+
+               sram_write_chunk(adapter, addr, buf, length);
+
+               addr = addr + length;
+               buf = buf + length;
+               len = len - length;
+       }
+}
+
+static void sram_set_size(struct adapter *adapter, u32 mask)
+{
+       write_reg_dw(adapter, 0x71c, (mask | (~0x30000 & read_reg_dw(adapter, 0x71c))));
+}
+
+static void sram_init(struct adapter *adapter)
+{
+       u32 tmp;
+
+       tmp = read_reg_dw(adapter, 0x71c);
+
+       write_reg_dw(adapter, 0x71c, 1);
+
+       if (read_reg_dw(adapter, 0x71c) != 0) {
+               write_reg_dw(adapter, 0x71c, tmp);
+
+               adapter->dw_sram_type = tmp & 0x30000;
+
+               ddprintk("%s: dw_sram_type = %x\n", __FUNCTION__, adapter->dw_sram_type);
+
+       } else {
+
+               adapter->dw_sram_type = 0x10000;
+
+               ddprintk("%s: dw_sram_type = %x\n", __FUNCTION__, adapter->dw_sram_type);
+       }
+
+       /* return value is never used? */
+/*     return adapter->dw_sram_type; */
+}
+
+static int sram_test_location(struct adapter *adapter, u32 mask, u32 addr)
+{
+       u8 tmp1, tmp2;
+
+       dprintk("%s: mask = %x, addr = %x\n", __FUNCTION__, mask, addr);
+
+       sram_set_size(adapter, mask);
+       sram_init(adapter);
+
+       tmp2 = 0xa5;
+       tmp1 = 0x4f;
+
+       sram_write(adapter, addr, &tmp2, 1);
+       sram_write(adapter, addr + 4, &tmp1, 1);
+
+       tmp2 = 0;
+
+       mdelay(20);
+
+       sram_read(adapter, addr, &tmp2, 1);
+       sram_read(adapter, addr, &tmp2, 1);
+
+       dprintk("%s: wrote 0xa5, read 0x%2x\n", __FUNCTION__, tmp2);
+
+       if (tmp2 != 0xa5)
+               return 0;
+
+       tmp2 = 0x5a;
+       tmp1 = 0xf4;
+
+       sram_write(adapter, addr, &tmp2, 1);
+       sram_write(adapter, addr + 4, &tmp1, 1);
+
+       tmp2 = 0;
+
+       mdelay(20);
+
+       sram_read(adapter, addr, &tmp2, 1);
+       sram_read(adapter, addr, &tmp2, 1);
+
+       dprintk("%s: wrote 0x5a, read 0x%2x\n", __FUNCTION__, tmp2);
+
+       if (tmp2 != 0x5a)
+               return 0;
+
+       return 1;
+}
+
+static u32 sram_length(struct adapter *adapter)
+{
+       if (adapter->dw_sram_type == 0x10000)
+               return 32768;   //  32K
+       if (adapter->dw_sram_type == 0x00000)
+               return 65536;   //  64K
+       if (adapter->dw_sram_type == 0x20000)
+               return 131072;  // 128K
+
+       return 32768;           // 32K
+}
+
+/* FlexcopII can work with 32K, 64K or 128K of external SRAM memory.
+    - for 128K there are 4x32K chips at bank 0,1,2,3.
+    - for  64K there are 2x32K chips at bank 1,2.
+    - for  32K there is one 32K chip at bank 0.
+
+   FlexCop works only with one bank at a time. The bank is selected
+   by bits 28-29 of the 0x700 register.
+
+   bank 0 covers addresses 0x00000-0x07fff
+   bank 1 covers addresses 0x08000-0x0ffff
+   bank 2 covers addresses 0x10000-0x17fff
+   bank 3 covers addresses 0x18000-0x1ffff
+*/
+
+static int flexcop_sram_detect(struct flexcop_device *fc)
+{
+       flexcop_ibi_value r208,r71c_0,vr71c_1;
+
+       r208 = fc->read_ibi_reg(fc, ctrl_208);
+       fc->write_ibi_reg(fc, ctrl_208, ibi_zero);
+
+       r71c_0 = fc->read_ibi_reg(fc, wan_ctrl_reg_71c);
+
+       write_reg_dw(adapter, 0x71c, 1);
+
+       tmp3 = read_reg_dw(adapter, 0x71c);
+
+       dprintk("%s: tmp3 = %x\n", __FUNCTION__, tmp3);
+
+       write_reg_dw(adapter, 0x71c, tmp2);
+
+       // check for internal SRAM ???
+       tmp3--;
+       if (tmp3 != 0) {
+               sram_set_size(adapter, 0x10000);
+               sram_init(adapter);
+               write_reg_dw(adapter, 0x208, tmp);
+
+               dprintk("%s: sram size = 32K\n", __FUNCTION__);
+
+               return 32;
+       }
+
+       if (sram_test_location(adapter, 0x20000, 0x18000) != 0) {
+               sram_set_size(adapter, 0x20000);
+               sram_init(adapter);
+               write_reg_dw(adapter, 0x208, tmp);
+
+               dprintk("%s: sram size = 128K\n", __FUNCTION__);
+
+               return 128;
+       }
+
+       if (sram_test_location(adapter, 0x00000, 0x10000) != 0) {
+               sram_set_size(adapter, 0x00000);
+               sram_init(adapter);
+               write_reg_dw(adapter, 0x208, tmp);
+
+               dprintk("%s: sram size = 64K\n", __FUNCTION__);
+
+               return 64;
+       }
+
+       if (sram_test_location(adapter, 0x10000, 0x00000) != 0) {
+               sram_set_size(adapter, 0x10000);
+               sram_init(adapter);
+               write_reg_dw(adapter, 0x208, tmp);
+
+               dprintk("%s: sram size = 32K\n", __FUNCTION__);
+
+               return 32;
+       }
+
+       sram_set_size(adapter, 0x10000);
+       sram_init(adapter);
+       write_reg_dw(adapter, 0x208, tmp);
+
+       dprintk("%s: SRAM detection failed. Set to 32K \n", __FUNCTION__);
+
+       return 0;
+}
+
+static void sll_detect_sram_size(struct adapter *adapter)
+{
+       sram_detect_for_flex2(adapter);
+}
+
+#endif
diff --git a/drivers/media/dvb/b2c2/flexcop-usb.c b/drivers/media/dvb/b2c2/flexcop-usb.c
new file mode 100644 (file)
index 0000000..0113449
--- /dev/null
@@ -0,0 +1,577 @@
+/*
+ * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III
+ *
+ * flexcop-usb.c - covers the USB part.
+ *
+ * see flexcop.c for copyright information.
+ */
+
+#define FC_LOG_PREFIX "flexcop_usb"
+#include "flexcop-usb.h"
+#include "flexcop-common.h"
+
+/* Version information */
+#define DRIVER_VERSION "0.1"
+#define DRIVER_NAME "Technisat/B2C2 FlexCop II/IIb/III Digital TV USB Driver"
+#define DRIVER_AUTHOR "Patrick Boettcher <patrick.boettcher@desy.de>"
+
+/* debug */
+#ifdef CONFIG_DVB_B2C2_FLEXCOP_DEBUG
+#define dprintk(level,args...) \
+           do { if ((debug & level)) { printk(args); } } while (0)
+#define debug_dump(b,l,method) {\
+       int i; \
+       for (i = 0; i < l; i++) method("%02x ", b[i]); \
+       method("\n");\
+}
+
+#define DEBSTATUS ""
+#else
+#define dprintk(level,args...)
+#define debug_dump(b,l,method)
+#define DEBSTATUS " (debugging is not enabled)"
+#endif
+
+static int debug;
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug, "set debugging level (1=info,ts=2,ctrl=4,i2c=8,v8mem=16 (or-able))." DEBSTATUS);
+#undef DEBSTATUS
+
+#define deb_info(args...) dprintk(0x01,args)
+#define deb_ts(args...)   dprintk(0x02,args)
+#define deb_ctrl(args...) dprintk(0x04,args)
+#define deb_i2c(args...)  dprintk(0x08,args)
+#define deb_v8(args...)   dprintk(0x10,args)
+
+/* JLP 111700: we will include the 1 bit gap between the upper and lower 3 bits
+ * in the IBI address, to make the V8 code simpler.
+ * PCI ADDRESS FORMAT: 0x71C -> 0000 0111 0001 1100 (these are the six bits used)
+ *                  in general: 0000 0HHH 000L LL00
+ * IBI ADDRESS FORMAT:                    RHHH BLLL
+ *
+ * where R is the read(1)/write(0) bit, B is the busy bit
+ * and HHH and LLL are the two sets of three bits from the PCI address.
+ */
+#define B2C2_FLEX_PCIOFFSET_TO_INTERNALADDR(usPCI) (u8) (((usPCI >> 2) & 0x07) + ((usPCI >> 4) & 0x70))
+#define B2C2_FLEX_INTERNALADDR_TO_PCIOFFSET(ucAddr) (u16) (((ucAddr & 0x07) << 2) + ((ucAddr & 0x70) << 4))
+
+/*
+ * DKT 020228
+ * - forget about this VENDOR_BUFFER_SIZE, read and write register
+ *   deal with DWORD or 4 bytes, that should be should from now on
+ * - from now on, we don't support anything older than firm 1.00
+ *   I eliminated the write register as a 2 trip of writing hi word and lo word
+ *   and force this to write only 4 bytes at a time.
+ *   NOTE: this should work with all the firmware from 1.00 and newer
+ */
+static int flexcop_usb_readwrite_dw(struct flexcop_device *fc, u16 wRegOffsPCI, u32 *val, u8 read)
+{
+       struct flexcop_usb *fc_usb = fc->bus_specific;
+       u8 request = read ? B2C2_USB_READ_REG : B2C2_USB_WRITE_REG;
+       u8 request_type = (read ? USB_DIR_IN : USB_DIR_OUT) | USB_TYPE_VENDOR;
+       u8 wAddress = B2C2_FLEX_PCIOFFSET_TO_INTERNALADDR(wRegOffsPCI) | (read ? 0x80 : 0);
+
+       int len = usb_control_msg(fc_usb->udev,
+                       read ? B2C2_USB_CTRL_PIPE_IN : B2C2_USB_CTRL_PIPE_OUT,
+                       request,
+                       request_type,  /* 0xc0 read or 0x40 write*/
+                       wAddress,
+                       0,
+                       val,
+                       sizeof(u32),
+                       B2C2_WAIT_FOR_OPERATION_RDW * HZ);
+
+       if (len != sizeof(u32)) {
+               err("error while %s dword from %d (%d).",read ? "reading" : "writing",
+                       wAddress,wRegOffsPCI);
+               return -EIO;
+       }
+       return 0;
+}
+
+/*
+ * DKT 010817 - add support for V8 memory read/write and flash update
+ */
+static int flexcop_usb_v8_memory_req(struct flexcop_usb *fc_usb,
+               flexcop_usb_request_t req, u8 page, u16 wAddress,
+               u8 *pbBuffer,u32 buflen)
+{
+//     u8 dwRequestType;
+       u8 request_type = USB_TYPE_VENDOR;
+       u16 wIndex;
+       int nWaitTime,pipe,len;
+
+       wIndex = page << 8;
+
+       switch (req) {
+               case B2C2_USB_READ_V8_MEM:
+                       nWaitTime = B2C2_WAIT_FOR_OPERATION_V8READ;
+                       request_type |= USB_DIR_IN;
+//                     dwRequestType = (u8) RTYPE_READ_V8_MEMORY;
+                       pipe = B2C2_USB_CTRL_PIPE_IN;
+               break;
+               case B2C2_USB_WRITE_V8_MEM:
+                       wIndex |= pbBuffer[0];
+                       request_type |= USB_DIR_OUT;
+                       nWaitTime = B2C2_WAIT_FOR_OPERATION_V8WRITE;
+//                     dwRequestType = (u8) RTYPE_WRITE_V8_MEMORY;
+                       pipe = B2C2_USB_CTRL_PIPE_OUT;
+               break;
+               case B2C2_USB_FLASH_BLOCK:
+                       request_type |= USB_DIR_OUT;
+                       nWaitTime = B2C2_WAIT_FOR_OPERATION_V8FLASH;
+//                     dwRequestType = (u8) RTYPE_WRITE_V8_FLASH;
+                       pipe = B2C2_USB_CTRL_PIPE_OUT;
+               break;
+               default:
+                       deb_info("unsupported request for v8_mem_req %x.\n",req);
+               return -EINVAL;
+       }
+       deb_v8("v8mem: %02x %02x %04x %04x, len: %d\n",request_type,req,
+                       wAddress,wIndex,buflen);
+
+       len = usb_control_msg(fc_usb->udev,pipe,
+                       req,
+                       request_type,
+                       wAddress,
+                       wIndex,
+                       pbBuffer,
+                       buflen,
+                       nWaitTime * HZ);
+
+       debug_dump(pbBuffer,len,deb_v8);
+
+       return len == buflen ? 0 : -EIO;
+}
+
+#define bytes_left_to_read_on_page(paddr,buflen) \
+                       ((V8_MEMORY_PAGE_SIZE - (paddr & V8_MEMORY_PAGE_MASK)) > buflen \
+                       ? buflen : (V8_MEMORY_PAGE_SIZE - (paddr & V8_MEMORY_PAGE_MASK)))
+
+static int flexcop_usb_memory_req(struct flexcop_usb *fc_usb,flexcop_usb_request_t req,
+               flexcop_usb_mem_page_t page_start, u32 addr, int extended, u8 *buf, u32 len)
+{
+       int i,ret = 0;
+       u16 wMax;
+       u32 pagechunk = 0;
+
+       switch(req) {
+               case B2C2_USB_READ_V8_MEM:  wMax = USB_MEM_READ_MAX; break;
+               case B2C2_USB_WRITE_V8_MEM:     wMax = USB_MEM_WRITE_MAX; break;
+               case B2C2_USB_FLASH_BLOCK:  wMax = USB_FLASH_MAX; break;
+               default:
+                       return -EINVAL;
+               break;
+       }
+       for (i = 0; i < len;) {
+               pagechunk = wMax < bytes_left_to_read_on_page(addr,len) ? wMax : bytes_left_to_read_on_page(addr,len);
+               deb_info("%x\n",(addr & V8_MEMORY_PAGE_MASK) | (V8_MEMORY_EXTENDED*extended));
+               if ((ret = flexcop_usb_v8_memory_req(fc_usb,req,
+                               page_start + (addr / V8_MEMORY_PAGE_SIZE), /* actual page */
+                               (addr & V8_MEMORY_PAGE_MASK) | (V8_MEMORY_EXTENDED*extended),
+                               &buf[i],pagechunk)) < 0)
+                       return ret;
+
+               addr += pagechunk;
+               len -= pagechunk;
+       }
+       return 0;
+}
+
+static int flexcop_usb_get_mac_addr(struct flexcop_device *fc, int extended)
+{
+       return flexcop_usb_memory_req(fc->bus_specific,B2C2_USB_READ_V8_MEM,
+                       V8_MEMORY_PAGE_FLASH,0x1f010,1,fc->dvb_adapter.proposed_mac,6);
+}
+
+#if 0
+static int flexcop_usb_utility_req(struct flexcop_usb *fc_usb, int set,
+               flexcop_usb_utility_function_t func, u8 extra, u16 wIndex,
+               u16 buflen, u8 *pvBuffer)
+{
+       u16 wValue;
+       u8 request_type = (set ? USB_DIR_OUT : USB_DIR_IN) | USB_TYPE_VENDOR;
+//     u8 dwRequestType = (u8) RTYPE_GENERIC,
+       int nWaitTime = 2,
+               pipe = set ? B2C2_USB_CTRL_PIPE_OUT : B2C2_USB_CTRL_PIPE_IN,
+               len;
+
+       wValue = (func << 8) | extra;
+
+       len = usb_control_msg(fc_usb->udev,pipe,
+                       B2C2_USB_UTILITY,
+                       request_type,
+                       wValue,
+                       wIndex,
+                       pvBuffer,
+                       buflen,
+                       nWaitTime * HZ);
+       return len == buflen ? 0 : -EIO;
+}
+#endif
+
+/* usb i2c stuff */
+static int flexcop_usb_i2c_req(struct flexcop_usb *fc_usb,
+               flexcop_usb_request_t req, flexcop_usb_i2c_function_t func,
+               flexcop_i2c_port_t port, u8 chipaddr, u8 addr, u8 *buf, u8 buflen)
+{
+       u16 wValue, wIndex;
+       int nWaitTime,pipe,len;
+//     u8 dwRequestType;
+       u8 request_type = USB_TYPE_VENDOR;
+
+       switch (func) {
+               case USB_FUNC_I2C_WRITE:
+               case USB_FUNC_I2C_MULTIWRITE:
+               case USB_FUNC_I2C_REPEATWRITE:
+               /* DKT 020208 - add this to support special case of DiSEqC */
+               case USB_FUNC_I2C_CHECKWRITE:
+                       pipe = B2C2_USB_CTRL_PIPE_OUT;
+                       nWaitTime = 2;
+//                     dwRequestType = (u8) RTYPE_GENERIC;
+                       request_type |= USB_DIR_OUT;
+               break;
+               case USB_FUNC_I2C_READ:
+               case USB_FUNC_I2C_REPEATREAD:
+                       pipe = B2C2_USB_CTRL_PIPE_IN;
+                       nWaitTime = 2;
+//                     dwRequestType = (u8) RTYPE_GENERIC;
+                       request_type |= USB_DIR_IN;
+               break;
+               default:
+                       deb_info("unsupported function for i2c_req %x\n",func);
+                       return -EINVAL;
+       }
+       wValue = (func << 8 ) | (port << 4);
+       wIndex = (chipaddr << 8 ) | addr;
+
+       deb_i2c("i2c %2d: %02x %02x %02x %02x %02x %02x\n",func,request_type,req,
+                       ((wValue && 0xff) << 8),wValue >> 8,((wIndex && 0xff) << 8),wIndex >> 8);
+
+       len = usb_control_msg(fc_usb->udev,pipe,
+                       req,
+                       request_type,
+                       wValue,
+                       wIndex,
+                       buf,
+                       buflen,
+                       nWaitTime * HZ);
+
+       return len == buflen ? 0 : -EREMOTEIO;
+}
+
+/* actual bus specific access functions, make sure prototype are/will be equal to pci */
+static flexcop_ibi_value flexcop_usb_read_ibi_reg(struct flexcop_device *fc, flexcop_ibi_register reg)
+{
+       flexcop_ibi_value val;
+       val.raw = 0;
+       flexcop_usb_readwrite_dw(fc,reg, &val.raw, 1);
+       return val;
+}
+
+static int flexcop_usb_write_ibi_reg(struct flexcop_device *fc, flexcop_ibi_register reg, flexcop_ibi_value val)
+{
+       return flexcop_usb_readwrite_dw(fc,reg, &val.raw, 0);
+}
+
+static int flexcop_usb_i2c_request(struct flexcop_device *fc, flexcop_access_op_t op,
+               flexcop_i2c_port_t port, u8 chipaddr, u8 addr, u8 *buf, u16 len)
+{
+       if (op == FC_READ)
+               return flexcop_usb_i2c_req(fc->bus_specific,B2C2_USB_I2C_REQUEST,USB_FUNC_I2C_READ,port,chipaddr,addr,buf,len);
+       else
+               return flexcop_usb_i2c_req(fc->bus_specific,B2C2_USB_I2C_REQUEST,USB_FUNC_I2C_WRITE,port,chipaddr,addr,buf,len);
+}
+
+static void flexcop_usb_process_frame(struct flexcop_usb *fc_usb, u8 *buffer, int buffer_length)
+{
+       u8 *b;
+       int l;
+
+       deb_ts("tmp_buffer_length=%d, buffer_length=%d\n", fc_usb->tmp_buffer_length, buffer_length);
+
+       if (fc_usb->tmp_buffer_length > 0) {
+               memcpy(fc_usb->tmp_buffer+fc_usb->tmp_buffer_length, buffer, buffer_length);
+               fc_usb->tmp_buffer_length += buffer_length;
+               b = fc_usb->tmp_buffer;
+               l = fc_usb->tmp_buffer_length;
+       } else {
+               b=buffer;
+               l=buffer_length;
+       }
+
+       while (l >= 190) {
+               if (*b == 0xff)
+                       switch (*(b+1) & 0x03) {
+                               case 0x01: /* media packet */
+                                       if ( *(b+2) == 0x47 )
+                                               flexcop_pass_dmx_packets(fc_usb->fc_dev, b+2, 1);
+                                       else
+                                               deb_ts("not ts packet %02x %02x %02x %02x \n", *(b+2), *(b+3), *(b+4), *(b+5) );
+
+                                       b += 190;
+                                       l -= 190;
+                               break;
+                               default:
+                                       deb_ts("wrong packet type\n");
+                                       l = 0;
+                               break;
+                       }
+               else {
+                       deb_ts("wrong header\n");
+                       l = 0;
+               }
+       }
+
+       if (l>0)
+               memcpy(fc_usb->tmp_buffer, b, l);
+       fc_usb->tmp_buffer_length = l;
+}
+
+static void flexcop_usb_urb_complete(struct urb *urb, struct pt_regs *ptregs)
+{
+       struct flexcop_usb *fc_usb = urb->context;
+       int i;
+
+       if (urb->actual_length > 0)
+               deb_ts("urb completed, bufsize: %d actlen; %d\n",urb->transfer_buffer_length, urb->actual_length);
+
+       for (i = 0; i < urb->number_of_packets; i++) {
+               if (urb->iso_frame_desc[i].status < 0) {
+                       err("iso frame descriptor %d has an error: %d\n",i,urb->iso_frame_desc[i].status);
+               } else
+                       if (urb->iso_frame_desc[i].actual_length > 0) {
+                               deb_ts("passed %d bytes to the demux\n",urb->iso_frame_desc[i].actual_length);
+
+                               flexcop_usb_process_frame(fc_usb,
+                                       urb->transfer_buffer + urb->iso_frame_desc[i].offset,
+                                       urb->iso_frame_desc[i].actual_length);
+               }
+               urb->iso_frame_desc[i].status = 0;
+               urb->iso_frame_desc[i].actual_length = 0;
+       }
+
+       usb_submit_urb(urb,GFP_ATOMIC);
+}
+
+static int flexcop_usb_stream_control(struct flexcop_device *fc, int onoff)
+{
+       /* submit/kill iso packets */
+       return 0;
+}
+
+static void flexcop_usb_transfer_exit(struct flexcop_usb *fc_usb)
+{
+       int i;
+       for (i = 0; i < B2C2_USB_NUM_ISO_URB; i++)
+               if (fc_usb->iso_urb[i] != NULL) {
+                       deb_ts("unlinking/killing urb no. %d\n",i);
+                       usb_kill_urb(fc_usb->iso_urb[i]);
+                       usb_free_urb(fc_usb->iso_urb[i]);
+               }
+
+       if (fc_usb->iso_buffer != NULL)
+               pci_free_consistent(NULL,fc_usb->buffer_size, fc_usb->iso_buffer, fc_usb->dma_addr);
+}
+
+static int flexcop_usb_transfer_init(struct flexcop_usb *fc_usb)
+{
+       u16 frame_size = fc_usb->uintf->cur_altsetting->endpoint[0].desc.wMaxPacketSize;
+       int bufsize = B2C2_USB_NUM_ISO_URB * B2C2_USB_FRAMES_PER_ISO * frame_size,i,j,ret;
+       int buffer_offset = 0;
+
+       deb_ts("creating %d iso-urbs with %d frames each of %d bytes size = %d.\n",
+                       B2C2_USB_NUM_ISO_URB, B2C2_USB_FRAMES_PER_ISO, frame_size,bufsize);
+
+       fc_usb->iso_buffer = pci_alloc_consistent(NULL,bufsize,&fc_usb->dma_addr);
+       if (fc_usb->iso_buffer == NULL)
+               return -ENOMEM;
+       memset(fc_usb->iso_buffer, 0, bufsize);
+       fc_usb->buffer_size = bufsize;
+
+       /* creating iso urbs */
+       for (i = 0; i < B2C2_USB_NUM_ISO_URB; i++)
+               if (!(fc_usb->iso_urb[i] = usb_alloc_urb(B2C2_USB_FRAMES_PER_ISO,GFP_ATOMIC))) {
+                       ret = -ENOMEM;
+                       goto urb_error;
+               }
+       /* initialising and submitting iso urbs */
+       for (i = 0; i < B2C2_USB_NUM_ISO_URB; i++) {
+               int frame_offset = 0;
+               struct urb *urb = fc_usb->iso_urb[i];
+               deb_ts("initializing and submitting urb no. %d (buf_offset: %d).\n",i,buffer_offset);
+
+               urb->dev = fc_usb->udev;
+               urb->context = fc_usb;
+               urb->complete = flexcop_usb_urb_complete;
+               urb->pipe = B2C2_USB_DATA_PIPE;
+               urb->transfer_flags = URB_ISO_ASAP;
+               urb->interval = 1;
+               urb->number_of_packets = B2C2_USB_FRAMES_PER_ISO;
+               urb->transfer_buffer_length = frame_size * B2C2_USB_FRAMES_PER_ISO;
+               urb->transfer_buffer = fc_usb->iso_buffer + buffer_offset;
+
+               buffer_offset += frame_size * B2C2_USB_FRAMES_PER_ISO;
+               for (j = 0; j < B2C2_USB_FRAMES_PER_ISO; j++) {
+                       deb_ts("urb no: %d, frame: %d, frame_offset: %d\n",i,j,frame_offset);
+                       urb->iso_frame_desc[j].offset = frame_offset;
+                       urb->iso_frame_desc[j].length = frame_size;
+                       frame_offset += frame_size;
+               }
+
+               if ((ret = usb_submit_urb(fc_usb->iso_urb[i],GFP_ATOMIC))) {
+                       err("submitting urb %d failed with %d.",i,ret);
+                       goto urb_error;
+               }
+               deb_ts("submitted urb no. %d.\n",i);
+       }
+
+/* SRAM */
+
+       flexcop_sram_set_dest(fc_usb->fc_dev,FC_SRAM_DEST_MEDIA | FC_SRAM_DEST_NET |
+                       FC_SRAM_DEST_CAO | FC_SRAM_DEST_CAI, FC_SRAM_DEST_TARGET_WAN_USB);
+       flexcop_wan_set_speed(fc_usb->fc_dev,FC_WAN_SPEED_8MBITS);
+       flexcop_sram_ctrl(fc_usb->fc_dev,1,1,1);
+
+       ret = 0;
+       goto success;
+urb_error:
+       flexcop_usb_transfer_exit(fc_usb);
+success:
+       return ret;
+}
+
+static int flexcop_usb_init(struct flexcop_usb *fc_usb)
+{
+       /* use the alternate setting with the larges buffer */
+       usb_set_interface(fc_usb->udev,0,1);
+       switch (fc_usb->udev->speed) {
+               case USB_SPEED_LOW:
+                       err("cannot handle USB speed because it is to sLOW.");
+                       return -ENODEV;
+                       break;
+               case USB_SPEED_FULL:
+                       info("running at FULL speed.");
+                       break;
+               case USB_SPEED_HIGH:
+                       info("running at HIGH speed.");
+                       break;
+               case USB_SPEED_UNKNOWN: /* fall through */
+               default:
+                       err("cannot handle USB speed because it is unkown.");
+                       return -ENODEV;
+       }
+       usb_set_intfdata(fc_usb->uintf, fc_usb);
+       return 0;
+}
+
+static void flexcop_usb_exit(struct flexcop_usb *fc_usb)
+{
+       usb_set_intfdata(fc_usb->uintf, NULL);
+}
+
+static int flexcop_usb_probe(struct usb_interface *intf,
+               const struct usb_device_id *id)
+{
+       struct usb_device *udev = interface_to_usbdev(intf);
+       struct flexcop_usb *fc_usb = NULL;
+       struct flexcop_device *fc = NULL;
+       int ret;
+
+       if ((fc = flexcop_device_kmalloc(sizeof(struct flexcop_usb))) == NULL) {
+               err("out of memory\n");
+               return -ENOMEM;
+       }
+
+/* general flexcop init */
+       fc_usb = fc->bus_specific;
+       fc_usb->fc_dev = fc;
+
+       fc->read_ibi_reg  = flexcop_usb_read_ibi_reg;
+       fc->write_ibi_reg = flexcop_usb_write_ibi_reg;
+       fc->i2c_request = flexcop_usb_i2c_request;
+       fc->get_mac_addr = flexcop_usb_get_mac_addr;
+
+       fc->stream_control = flexcop_usb_stream_control;
+
+       fc->pid_filtering = 1;
+       fc->bus_type = FC_USB;
+
+       fc->dev = &udev->dev;
+       fc->owner = THIS_MODULE;
+
+/* bus specific part */
+       fc_usb->udev = udev;
+       fc_usb->uintf = intf;
+       if ((ret = flexcop_usb_init(fc_usb)) != 0)
+               goto err_kfree;
+
+/* init flexcop */
+       if ((ret = flexcop_device_initialize(fc)) != 0)
+               goto err_usb_exit;
+
+/* xfer init */
+       if ((ret = flexcop_usb_transfer_init(fc_usb)) != 0)
+               goto err_fc_exit;
+
+       info("%s successfully initialized and connected.",DRIVER_NAME);
+       ret = 0;
+       goto success;
+err_fc_exit:
+       flexcop_device_exit(fc);
+err_usb_exit:
+       flexcop_usb_exit(fc_usb);
+err_kfree:
+       flexcop_device_kfree(fc);
+success:
+       return ret;
+}
+
+static void flexcop_usb_disconnect(struct usb_interface *intf)
+{
+       struct flexcop_usb *fc_usb = usb_get_intfdata(intf);
+       flexcop_usb_transfer_exit(fc_usb);
+       flexcop_device_exit(fc_usb->fc_dev);
+       flexcop_usb_exit(fc_usb);
+       flexcop_device_kfree(fc_usb->fc_dev);
+       info("%s successfully deinitialized and disconnected.",DRIVER_NAME);
+}
+
+static struct usb_device_id flexcop_usb_table [] = {
+           { USB_DEVICE(0x0af7, 0x0101) },
+           { }
+};
+
+/* usb specific object needed to register this driver with the usb subsystem */
+static struct usb_driver flexcop_usb_driver = {
+       .owner          = THIS_MODULE,
+       .name           = "Technisat/B2C2 FlexCop II/IIb/III USB",
+       .probe          = flexcop_usb_probe,
+       .disconnect = flexcop_usb_disconnect,
+       .id_table       = flexcop_usb_table,
+};
+
+/* module stuff */
+static int __init flexcop_usb_module_init(void)
+{
+       int result;
+       if ((result = usb_register(&flexcop_usb_driver))) {
+               err("usb_register failed. (%d)",result);
+               return result;
+       }
+
+       return 0;
+}
+
+static void __exit flexcop_usb_module_exit(void)
+{
+       /* deregister this driver from the USB subsystem */
+       usb_deregister(&flexcop_usb_driver);
+}
+
+module_init(flexcop_usb_module_init);
+module_exit(flexcop_usb_module_exit);
+
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_NAME);
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/b2c2/flexcop-usb.h b/drivers/media/dvb/b2c2/flexcop-usb.h
new file mode 100644 (file)
index 0000000..630e647
--- /dev/null
@@ -0,0 +1,119 @@
+#ifndef __FLEXCOP_USB_H_INCLUDED__
+#define __FLEXCOP_USB_H_INCLUDED__
+
+#include <linux/usb.h>
+
+/* transfer parameters */
+#define B2C2_USB_FRAMES_PER_ISO                4
+#define B2C2_USB_NUM_ISO_URB           4
+
+#define B2C2_USB_CTRL_PIPE_IN          usb_rcvctrlpipe(fc_usb->udev,0)
+#define B2C2_USB_CTRL_PIPE_OUT         usb_sndctrlpipe(fc_usb->udev,0)
+#define B2C2_USB_DATA_PIPE                     usb_rcvisocpipe(fc_usb->udev,0x81)
+
+struct flexcop_usb {
+       struct usb_device *udev;
+       struct usb_interface *uintf;
+
+       u8 *iso_buffer;
+       int buffer_size;
+       dma_addr_t dma_addr;
+       struct urb *iso_urb[B2C2_USB_NUM_ISO_URB];
+
+       struct flexcop_device *fc_dev;
+
+       u8 tmp_buffer[1023+190];
+       int tmp_buffer_length;
+};
+
+#if 0
+/* request types TODO What is its use?*/
+typedef enum {
+
+/* something is wrong with this part
+       RTYPE_READ_DW         = (1 << 6),
+       RTYPE_WRITE_DW_1      = (3 << 6),
+       RTYPE_READ_V8_MEMORY  = (6 << 6),
+       RTYPE_WRITE_V8_MEMORY = (7 << 6),
+       RTYPE_WRITE_V8_FLASH  = (8 << 6),
+       RTYPE_GENERIC         = (9 << 6),
+*/
+} flexcop_usb_request_type_t;
+#endif
+
+/* request */
+typedef enum {
+       B2C2_USB_WRITE_V8_MEM = 0x04,
+       B2C2_USB_READ_V8_MEM  = 0x05,
+       B2C2_USB_READ_REG     = 0x08,
+       B2C2_USB_WRITE_REG    = 0x0A,
+/*     B2C2_USB_WRITEREGLO   = 0x0A, */
+       B2C2_USB_WRITEREGHI   = 0x0B,
+       B2C2_USB_FLASH_BLOCK  = 0x10,
+       B2C2_USB_I2C_REQUEST  = 0x11,
+       B2C2_USB_UTILITY      = 0x12,
+} flexcop_usb_request_t;
+
+/* function definition for I2C_REQUEST */
+typedef enum {
+       USB_FUNC_I2C_WRITE       = 0x01,
+       USB_FUNC_I2C_MULTIWRITE  = 0x02,
+       USB_FUNC_I2C_READ        = 0x03,
+       USB_FUNC_I2C_REPEATWRITE = 0x04,
+       USB_FUNC_GET_DESCRIPTOR  = 0x05,
+       USB_FUNC_I2C_REPEATREAD  = 0x06,
+/* DKT 020208 - add this to support special case of DiSEqC */
+       USB_FUNC_I2C_CHECKWRITE  = 0x07,
+       USB_FUNC_I2C_CHECKRESULT = 0x08,
+} flexcop_usb_i2c_function_t;
+
+/*
+ * function definition for UTILITY request 0x12
+ * DKT 020304 - new utility function
+ */
+typedef enum {
+       UTILITY_SET_FILTER          = 0x01,
+       UTILITY_DATA_ENABLE         = 0x02,
+       UTILITY_FLEX_MULTIWRITE     = 0x03,
+       UTILITY_SET_BUFFER_SIZE     = 0x04,
+       UTILITY_FLEX_OPERATOR       = 0x05,
+       UTILITY_FLEX_RESET300_START = 0x06,
+       UTILITY_FLEX_RESET300_STOP  = 0x07,
+       UTILITY_FLEX_RESET300       = 0x08,
+       UTILITY_SET_ISO_SIZE        = 0x09,
+       UTILITY_DATA_RESET          = 0x0A,
+       UTILITY_GET_DATA_STATUS     = 0x10,
+       UTILITY_GET_V8_REG          = 0x11,
+/* DKT 020326 - add function for v1.14 */
+       UTILITY_SRAM_WRITE          = 0x12,
+       UTILITY_SRAM_READ           = 0x13,
+       UTILITY_SRAM_TESTFILL       = 0x14,
+       UTILITY_SRAM_TESTSET        = 0x15,
+       UTILITY_SRAM_TESTVERIFY     = 0x16,
+} flexcop_usb_utility_function_t;
+
+#define B2C2_WAIT_FOR_OPERATION_RW  1*HZ       /* 1 s */
+#define B2C2_WAIT_FOR_OPERATION_RDW 3*HZ       /* 3 s */
+#define B2C2_WAIT_FOR_OPERATION_WDW 1*HZ       /* 1 s */
+
+#define B2C2_WAIT_FOR_OPERATION_V8READ   3*HZ  /* 3 s */
+#define B2C2_WAIT_FOR_OPERATION_V8WRITE  3*HZ  /* 3 s */
+#define B2C2_WAIT_FOR_OPERATION_V8FLASH  3*HZ  /* 3 s */
+
+typedef enum {
+       V8_MEMORY_PAGE_DVB_CI = 0x20,
+       V8_MEMORY_PAGE_DVB_DS = 0x40,
+       V8_MEMORY_PAGE_MULTI2 = 0x60,
+       V8_MEMORY_PAGE_FLASH  = 0x80
+} flexcop_usb_mem_page_t;
+
+#define V8_MEMORY_EXTENDED      (1 << 15)
+
+#define USB_MEM_READ_MAX                32
+#define USB_MEM_WRITE_MAX               1
+#define USB_FLASH_MAX                   8
+
+#define V8_MEMORY_PAGE_SIZE     0x8000      // 32K
+#define V8_MEMORY_PAGE_MASK     0x7FFF
+
+#endif
diff --git a/drivers/media/dvb/b2c2/flexcop.c b/drivers/media/dvb/b2c2/flexcop.c
new file mode 100644 (file)
index 0000000..8b5d14d
--- /dev/null
@@ -0,0 +1,286 @@
+/*
+ * flexcop.c - driver for digital TV devices equipped with B2C2 FlexcopII(b)/III
+ *
+ * Copyright (C) 2004-5 Patrick Boettcher <patrick.boettcher@desy.de>
+ *
+ * based on the skystar2-driver
+ * Copyright (C) 2003 Vadim Catana, skystar@moldova.cc
+ *
+ * Acknowledgements:
+ *     John Jurrius from BBTI, Inc. for extensive support with
+ *         code examples and data books
+ *
+ *     Bjarne Steinsbo, bjarne at steinsbo.com (some ideas for rewriting)
+ *
+ * Contributions to the skystar2-driver have been done by
+ *     Vincenzo Di Massa, hawk.it at tiscalinet.it (several DiSEqC fixes)
+ *     Roberto Ragusa, r.ragusa at libero.it (polishing, restyling the code)
+ *     Niklas Peinecke, peinecke at gdv.uni-hannover.de (hardware pid/mac filtering)
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * 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 Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#include "flexcop.h"
+
+#define DRIVER_NAME "B2C2 FlexcopII/II(b)/III digital TV receiver chip"
+#define DRIVER_AUTHOR "Patrick Boettcher <patrick.boettcher@desy.de"
+
+#ifdef CONFIG_DVB_B2C2_FLEXCOP_DEBUG
+#define DEBSTATUS ""
+#else
+#define DEBSTATUS " (debugging is not enabled)"
+#endif
+
+int b2c2_flexcop_debug;
+module_param_named(debug, b2c2_flexcop_debug,  int, 0644);
+MODULE_PARM_DESC(debug, "set debug level (1=info,2=tuner,4=i2c,8=ts,16=sram (|-able))." DEBSTATUS);
+#undef DEBSTATUS
+
+/* global zero for ibi values */
+flexcop_ibi_value ibi_zero;
+
+static int flexcop_dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
+{
+       struct flexcop_device *fc = dvbdmxfeed->demux->priv;
+       return flexcop_pid_feed_control(fc,dvbdmxfeed,1);
+}
+
+static int flexcop_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
+{
+       struct flexcop_device *fc = dvbdmxfeed->demux->priv;
+       return flexcop_pid_feed_control(fc,dvbdmxfeed,0);
+}
+
+static int flexcop_dvb_init(struct flexcop_device *fc)
+{
+       int ret;
+       if ((ret = dvb_register_adapter(&fc->dvb_adapter,"FlexCop Digital TV device",fc->owner)) < 0) {
+               err("error registering DVB adapter");
+               return ret;
+       }
+       fc->dvb_adapter.priv = fc;
+
+       fc->demux.dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING);
+       fc->demux.priv = fc;
+
+       fc->demux.filternum = fc->demux.feednum = FC_MAX_FEED;
+
+       fc->demux.start_feed = flexcop_dvb_start_feed;
+       fc->demux.stop_feed = flexcop_dvb_stop_feed;
+       fc->demux.write_to_decoder = NULL;
+
+       if ((ret = dvb_dmx_init(&fc->demux)) < 0) {
+               err("dvb_dmx failed: error %d",ret);
+               goto err_dmx;
+       }
+
+       fc->hw_frontend.source = DMX_FRONTEND_0;
+
+       fc->dmxdev.filternum = fc->demux.feednum;
+       fc->dmxdev.demux = &fc->demux.dmx;
+       fc->dmxdev.capabilities = 0;
+       if ((ret = dvb_dmxdev_init(&fc->dmxdev, &fc->dvb_adapter)) < 0) {
+               err("dvb_dmxdev_init failed: error %d",ret);
+               goto err_dmx_dev;
+       }
+
+       if ((ret = fc->demux.dmx.add_frontend(&fc->demux.dmx, &fc->hw_frontend)) < 0) {
+               err("adding hw_frontend to dmx failed: error %d",ret);
+               goto err_dmx_add_hw_frontend;
+       }
+
+       fc->mem_frontend.source = DMX_MEMORY_FE;
+       if ((ret = fc->demux.dmx.add_frontend(&fc->demux.dmx, &fc->mem_frontend)) < 0) {
+               err("adding mem_frontend to dmx failed: error %d",ret);
+               goto err_dmx_add_mem_frontend;
+       }
+
+       if ((ret = fc->demux.dmx.connect_frontend(&fc->demux.dmx, &fc->hw_frontend)) < 0) {
+               err("connect frontend failed: error %d",ret);
+               goto err_connect_frontend;
+       }
+
+       dvb_net_init(&fc->dvb_adapter, &fc->dvbnet, &fc->demux.dmx);
+
+       fc->init_state |= FC_STATE_DVB_INIT;
+       goto success;
+
+err_connect_frontend:
+       fc->demux.dmx.remove_frontend(&fc->demux.dmx,&fc->mem_frontend);
+err_dmx_add_mem_frontend:
+       fc->demux.dmx.remove_frontend(&fc->demux.dmx,&fc->hw_frontend);
+err_dmx_add_hw_frontend:
+       dvb_dmxdev_release(&fc->dmxdev);
+err_dmx_dev:
+       dvb_dmx_release(&fc->demux);
+err_dmx:
+       dvb_unregister_adapter(&fc->dvb_adapter);
+       return ret;
+
+success:
+       return 0;
+}
+
+static void flexcop_dvb_exit(struct flexcop_device *fc)
+{
+       if (fc->init_state & FC_STATE_DVB_INIT) {
+               dvb_net_release(&fc->dvbnet);
+
+               fc->demux.dmx.close(&fc->demux.dmx);
+               fc->demux.dmx.remove_frontend(&fc->demux.dmx,&fc->mem_frontend);
+               fc->demux.dmx.remove_frontend(&fc->demux.dmx,&fc->hw_frontend);
+               dvb_dmxdev_release(&fc->dmxdev);
+               dvb_dmx_release(&fc->demux);
+               dvb_unregister_adapter(&fc->dvb_adapter);
+
+               deb_info("deinitialized dvb stuff\n");
+       }
+       fc->init_state &= ~FC_STATE_DVB_INIT;
+}
+
+/* these methods are necessary to achieve the long-term-goal of hiding the
+ * struct flexcop_device from the bus-parts */
+void flexcop_pass_dmx_data(struct flexcop_device *fc, u8 *buf, u32 len)
+{
+       dvb_dmx_swfilter(&fc->demux, buf, len);
+}
+EXPORT_SYMBOL(flexcop_pass_dmx_data);
+
+void flexcop_pass_dmx_packets(struct flexcop_device *fc, u8 *buf, u32 no)
+{
+       dvb_dmx_swfilter_packets(&fc->demux, buf, no);
+}
+EXPORT_SYMBOL(flexcop_pass_dmx_packets);
+
+static void flexcop_reset(struct flexcop_device *fc)
+{
+       flexcop_ibi_value v210,v204;
+
+/* reset the flexcop itself */
+       fc->write_ibi_reg(fc,ctrl_208,ibi_zero);
+
+       v210.raw = 0;
+       v210.sw_reset_210.reset_blocks = 0xff;
+       v210.sw_reset_210.Block_reset_enable = 0xb2;
+       fc->write_ibi_reg(fc,sw_reset_210,v210);
+
+/* reset the periphical devices */
+
+       v204 = fc->read_ibi_reg(fc,misc_204);
+       v204.misc_204.Per_reset_sig = 0;
+       fc->write_ibi_reg(fc,misc_204,v204);
+       v204.misc_204.Per_reset_sig = 1;
+       fc->write_ibi_reg(fc,misc_204,v204);
+}
+
+struct flexcop_device *flexcop_device_kmalloc(size_t bus_specific_len)
+{
+       void *bus;
+       struct flexcop_device *fc = kmalloc(sizeof(struct flexcop_device), GFP_KERNEL);
+       if (!fc) {
+               err("no memory");
+               return NULL;
+       }
+       memset(fc, 0, sizeof(struct flexcop_device));
+
+       bus = kmalloc(bus_specific_len, GFP_KERNEL);
+       if (!bus) {
+               err("no memory");
+               kfree(fc);
+               return NULL;
+       }
+       memset(bus, 0, bus_specific_len);
+
+       fc->bus_specific = bus;
+
+       return fc;
+}
+EXPORT_SYMBOL(flexcop_device_kmalloc);
+
+void flexcop_device_kfree(struct flexcop_device *fc)
+{
+       kfree(fc->bus_specific);
+       kfree(fc);
+}
+EXPORT_SYMBOL(flexcop_device_kfree);
+
+int flexcop_device_initialize(struct flexcop_device *fc)
+{
+       int ret;
+       ibi_zero.raw = 0;
+
+       flexcop_reset(fc);
+       flexcop_determine_revision(fc);
+       flexcop_sram_init(fc);
+       flexcop_hw_filter_init(fc);
+
+       flexcop_smc_ctrl(fc, 0);
+
+       if ((ret = flexcop_dvb_init(fc)))
+               goto error;
+
+       /* do the MAC address reading after initializing the dvb_adapter */
+       if (fc->get_mac_addr(fc, 0) == 0) {
+               u8 *b = fc->dvb_adapter.proposed_mac;
+               info("MAC address = %02x:%02x:%02x:%02x:%02x:%02x", b[0],b[1],b[2],b[3],b[4],b[5]);
+               flexcop_set_mac_filter(fc,b);
+               flexcop_mac_filter_ctrl(fc,1);
+       } else
+               warn("reading of MAC address failed.\n");
+
+
+       if ((ret = flexcop_i2c_init(fc)))
+               goto error;
+
+       if ((ret = flexcop_frontend_init(fc)))
+               goto error;
+
+       flexcop_device_name(fc,"initialization of","complete");
+
+       ret = 0;
+       goto success;
+error:
+       flexcop_device_exit(fc);
+success:
+       return ret;
+}
+EXPORT_SYMBOL(flexcop_device_initialize);
+
+void flexcop_device_exit(struct flexcop_device *fc)
+{
+       flexcop_frontend_exit(fc);
+       flexcop_i2c_exit(fc);
+       flexcop_dvb_exit(fc);
+}
+EXPORT_SYMBOL(flexcop_device_exit);
+
+static int flexcop_module_init(void)
+{
+       info(DRIVER_NAME " loaded successfully");
+       return 0;
+}
+
+static void flexcop_module_cleanup(void)
+{
+       info(DRIVER_NAME " unloaded successfully");
+}
+
+module_init(flexcop_module_init);
+module_exit(flexcop_module_cleanup);
+
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_NAME);
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/b2c2/flexcop.h b/drivers/media/dvb/b2c2/flexcop.h
new file mode 100644 (file)
index 0000000..caa343a
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III
+ *
+ * flexcop.h - private header file for all flexcop-chip-source files.
+ *
+ * see flexcop.c for copyright information.
+ */
+#ifndef __FLEXCOP_H__
+#define __FLEXCOP_H___
+
+#define FC_LOG_PREFIX "b2c2-flexcop"
+#include "flexcop-common.h"
+
+extern int b2c2_flexcop_debug;
+
+/* debug */
+#ifdef CONFIG_DVB_B2C2_FLEXCOP_DEBUG
+#define dprintk(level,args...) \
+       do { if ((b2c2_flexcop_debug & level)) printk(args); } while (0)
+#else
+#define dprintk(level,args...)
+#endif
+
+#define deb_info(args...)  dprintk(0x01,args)
+#define deb_tuner(args...) dprintk(0x02,args)
+#define deb_i2c(args...)   dprintk(0x04,args)
+#define deb_ts(args...)    dprintk(0x08,args)
+#define deb_sram(args...)  dprintk(0x10,args)
+
+#endif
index 336c178fcd5fc51e4315a81af98df984b75a86fa..acbc4c34f72ab0f9abaa07ed80fad07d85de9658 100644 (file)
@@ -97,7 +97,7 @@ struct adapter {
        u8 mac_addr[8];
        u32 dw_sram_type;
 
-       struct dvb_adapter *dvb_adapter;
+       struct dvb_adapter dvb_adapter;
        struct dvb_demux demux;
        struct dmxdev dmxdev;
        struct dmx_frontend hw_frontend;
@@ -2461,7 +2461,7 @@ static void frontend_init(struct adapter *skystar2)
                       skystar2->pdev->subsystem_vendor,
                       skystar2->pdev->subsystem_device);
        } else {
-               if (dvb_register_frontend(skystar2->dvb_adapter, skystar2->fe)) {
+               if (dvb_register_frontend(&skystar2->dvb_adapter, skystar2->fe)) {
                        printk("skystar2: Frontend registration failed!\n");
                        if (skystar2->fe->ops->release)
                                skystar2->fe->ops->release(skystar2->fe);
@@ -2486,17 +2486,17 @@ static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (ret < 0)
                goto out;
 
-       ret = dvb_register_adapter(&dvb_adapter, skystar2_pci_driver.name,
+       adapter = pci_get_drvdata(pdev);
+       dvb_adapter = &adapter->dvb_adapter;
+
+       ret = dvb_register_adapter(dvb_adapter, skystar2_pci_driver.name,
                                   THIS_MODULE);
        if (ret < 0) {
                printk("%s: Error registering DVB adapter\n", __FUNCTION__);
                goto err_halt;
        }
 
-       adapter = pci_get_drvdata(pdev);
-
        dvb_adapter->priv = adapter;
-       adapter->dvb_adapter = dvb_adapter;
 
 
        init_MUTEX(&adapter->i2c_sem);
@@ -2541,7 +2541,7 @@ static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        adapter->dmxdev.demux = dmx;
        adapter->dmxdev.capabilities = 0;
 
-       ret = dvb_dmxdev_init(&adapter->dmxdev, adapter->dvb_adapter);
+       ret = dvb_dmxdev_init(&adapter->dmxdev, &adapter->dvb_adapter);
        if (ret < 0)
                goto err_dmx_release;
 
@@ -2559,7 +2559,7 @@ static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (ret < 0)
                goto err_remove_mem_frontend;
 
-       dvb_net_init(adapter->dvb_adapter, &adapter->dvbnet, &dvbdemux->dmx);
+       dvb_net_init(&adapter->dvb_adapter, &adapter->dvbnet, &dvbdemux->dmx);
 
        frontend_init(adapter);
 out:
@@ -2576,7 +2576,7 @@ err_dmx_release:
 err_i2c_del:
        i2c_del_adapter(&adapter->i2c_adap);
 err_dvb_unregister:
-       dvb_unregister_adapter(adapter->dvb_adapter);
+       dvb_unregister_adapter(&adapter->dvb_adapter);
 err_halt:
        driver_halt(pdev);
        goto out;
@@ -2605,7 +2605,7 @@ static void skystar2_remove(struct pci_dev *pdev)
        if (adapter->fe != NULL)
                dvb_unregister_frontend(adapter->fe);
 
-       dvb_unregister_adapter(adapter->dvb_adapter);
+       dvb_unregister_adapter(&adapter->dvb_adapter);
 
                        i2c_del_adapter(&adapter->i2c_adap);
 
index e7d11e0667a8b2a1bd8add1ece6868befb864b4a..b12545f093f8aacd54e4aac476a0b504aaddda38 100644 (file)
@@ -11,9 +11,8 @@ config DVB_BT8XX
          the Nebula cards, the Pinnacle PCTV cards, the Twinhan DST cards and
          pcHDTV HD2000 cards.
 
-          Since these cards have no MPEG decoder onboard, they transmit
+         Since these cards have no MPEG decoder onboard, they transmit
          only compressed MPEG data over the PCI bus, so you need
          an external software decoder to watch TV on your computer.
 
          Say Y if you own such a device and want to use it.
-
index 9da8604b9e18a01b370b8339ff25277be19405e1..d188e4c670b512f6667825a39117a14a6a843d08 100644 (file)
@@ -1,5 +1,3 @@
-
-obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-bt8xx.o dst.o
+obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-bt8xx.o dst.o dst_ca.o
 
 EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/video -Idrivers/media/dvb/frontends
-
index 213ff7902024221c176e4d138ea2faa87aaf5e7f..3c5a8e273c4aa47488837a3110deab42f33099b2 100644 (file)
@@ -4,27 +4,27 @@
  * Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
  *
  * large parts based on the bttv driver
- * Copyright (C) 1996,97,98 Ralph  Metzler (rjkm@thp.uni-koeln.de)
- *                        & Marcus Metzler (mocm@thp.uni-koeln.de)
+ * Copyright (C) 1996,97,98 Ralph  Metzler (rjkm@metzlerbros.de)
+ *                        & Marcus Metzler (mocm@metzlerbros.de)
  * (c) 1999,2000 Gerd Knorr <kraxel@goldbach.in-berlin.de>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
  * of the License, or (at your option) any later version.
- * 
+ *
 
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
 
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
- * 
+ *
  */
 
 #include <linux/module.h>
@@ -58,7 +58,7 @@ module_param_named(verbose, bt878_verbose, int, 0444);
 MODULE_PARM_DESC(verbose,
                 "verbose startup messages, default is 1 (yes)");
 module_param_named(debug, bt878_debug, int, 0644);
-MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
+MODULE_PARM_DESC(debug, "Turn on/off debugging, default is 0 (off).");
 
 int bt878_num;
 struct bt878 bt878[BT878_MAX];
@@ -128,21 +128,21 @@ static int bt878_mem_alloc(struct bt878 *bt)
 }
 
 /* RISC instructions */
-#define RISC_WRITE             (0x01 << 28)
-#define RISC_JUMP              (0x07 << 28)
-#define RISC_SYNC              (0x08 << 28)
+#define RISC_WRITE             (0x01 << 28)
+#define RISC_JUMP              (0x07 << 28)
+#define RISC_SYNC              (0x08 << 28)
 
 /* RISC bits */
-#define RISC_WR_SOL            (1 << 27)
-#define RISC_WR_EOL            (1 << 26)
-#define RISC_IRQ               (1 << 24)
+#define RISC_WR_SOL            (1 << 27)
+#define RISC_WR_EOL            (1 << 26)
+#define RISC_IRQ               (1 << 24)
 #define RISC_STATUS(status)    ((((~status) & 0x0F) << 20) | ((status & 0x0F) << 16))
-#define RISC_SYNC_RESYNC       (1 << 15)
-#define RISC_SYNC_FM1          0x06
-#define RISC_SYNC_VRO          0x0C
+#define RISC_SYNC_RESYNC       (1 << 15)
+#define RISC_SYNC_FM1          0x06
+#define RISC_SYNC_VRO          0x0C
 
 #define RISC_FLUSH()           bt->risc_pos = 0
-#define RISC_INSTR(instr)      bt->risc_cpu[bt->risc_pos++] = cpu_to_le32(instr)
+#define RISC_INSTR(instr)      bt->risc_cpu[bt->risc_pos++] = cpu_to_le32(instr)
 
 static int bt878_make_risc(struct bt878 *bt)
 {
@@ -173,7 +173,7 @@ static void bt878_risc_program(struct bt878 *bt, u32 op_sync_orin)
        RISC_INSTR(RISC_SYNC | RISC_SYNC_FM1 | op_sync_orin);
        RISC_INSTR(0);
 
-       dprintk("bt878: risc len lines %u, bytes per line %u\n", 
+       dprintk("bt878: risc len lines %u, bytes per line %u\n",
                        bt->line_count, bt->line_bytes);
        for (line = 0; line < bt->line_count; line++) {
                // At the beginning of every block we issue an IRQ with previous (finished) block number set
@@ -228,14 +228,14 @@ void bt878_start(struct bt878 *bt, u32 controlreg, u32 op_sync_orin,
         * Hacked for DST to:
         * SCERR | OCERR | FDSR | FTRGT | FBUS | RISCI
         */
-       int_mask = BT878_ASCERR | BT878_AOCERR | BT878_APABORT | 
-               BT878_ARIPERR | BT878_APPERR | BT878_AFDSR | BT878_AFTRGT | 
+       int_mask = BT878_ASCERR | BT878_AOCERR | BT878_APABORT |
+               BT878_ARIPERR | BT878_APPERR | BT878_AFDSR | BT878_AFTRGT |
                BT878_AFBUS | BT878_ARISCI;
 
 
        /* ignore pesky bits */
        int_mask &= ~irq_err_ignore;
-       
+
        btwrite(int_mask, BT878_AINT_MASK);
        btwrite(controlreg, BT878_AGPIO_DMA_CTL);
 }
@@ -461,9 +461,9 @@ static int __devinit bt878_probe(struct pci_dev *dev,
        pci_set_drvdata(dev, bt);
 
 /*        if(init_bt878(btv) < 0) {
-                bt878_remove(dev);
-                return -EIO;
-        }
+               bt878_remove(dev);
+               return -EIO;
+       }
 */
 
        if ((result = bt878_mem_alloc(bt))) {
@@ -536,10 +536,10 @@ static struct pci_device_id bt878_pci_tbl[] __devinitdata = {
 MODULE_DEVICE_TABLE(pci, bt878_pci_tbl);
 
 static struct pci_driver bt878_pci_driver = {
-      .name    = "bt878",
+      .name    = "bt878",
       .id_table = bt878_pci_tbl,
-      .probe   = bt878_probe,
-      .remove  = bt878_remove,
+      .probe   = bt878_probe,
+      .remove  = bt878_remove,
 };
 
 static int bt878_pci_driver_registered = 0;
@@ -558,7 +558,7 @@ static int bt878_init_module(void)
               (BT878_VERSION_CODE >> 8) & 0xff,
               BT878_VERSION_CODE & 0xff);
 /*
-        bt878_check_chipset();
+       bt878_check_chipset();
 */
        /* later we register inside of bt878_find_audio_dma()
         * because we may want to ignore certain cards */
index e1b9809d1b083b0f2d32be74884df713b1fc81df..837623f7fcdfce60e08bc97de33c09134c49462f 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
     bt878.h - Bt878 audio module (register offsets)
 
     Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
@@ -120,14 +120,14 @@ struct bt878 {
        u32 risc_pos;
 
        struct tasklet_struct tasklet;
-       int shutdown;   
+       int shutdown;
 };
 
 extern struct bt878 bt878[BT878_MAX];
 
 void bt878_start(struct bt878 *bt, u32 controlreg, u32 op_sync_orin,
                u32 irq_err_ignore);
-void bt878_stop(struct bt878 *bt);          
+void bt878_stop(struct bt878 *bt);
 
 #if defined(__powerpc__)       /* big-endian */
 extern __inline__ void io_st_le32(volatile unsigned __iomem *addr, unsigned val)
index eac83768dfd0ef2d6d2ad90b3e6f1872f802c130..1339912c308b4a502e418ab0949b658d0583c26f 100644 (file)
@@ -1,25 +1,25 @@
 /*
-    Frontend-driver for TwinHan DST Frontend
 
-    Copyright (C) 2003 Jamie Honan
+       Frontend/Card driver for TwinHan DST Frontend
+       Copyright (C) 2003 Jamie Honan
+       Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.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 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.
+       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/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
 
 #include "dvb_frontend.h"
 #include "dst_priv.h"
-#include "dst.h"
-
-struct dst_state {
-
-       struct i2c_adapter* i2c;
-
-       struct bt878* bt;
-
-       struct dvb_frontend_ops ops;
-
-       /* configuration settings */
-       const struct dst_config* config;
-
-       struct dvb_frontend frontend;
-
-       /* private demodulator data */
-       u8 tx_tuna[10];
-       u8 rx_tuna[10];
-       u8 rxbuffer[10];
-       u8 diseq_flags;
-       u8 dst_type;
-       u32 type_flags;
-       u32 frequency;          /* intermediate frequency in kHz for QPSK */
-       fe_spectral_inversion_t inversion;
-       u32 symbol_rate;        /* symbol rate in Symbols per second */
-       fe_code_rate_t fec;
-       fe_sec_voltage_t voltage;
-       fe_sec_tone_mode_t tone;
-       u32 decode_freq;
-       u8 decode_lock;
-       u16 decode_strength;
-       u16 decode_snr;
-       unsigned long cur_jiff;
-       u8 k22;
-       fe_bandwidth_t bandwidth;
-};
+#include "dst_common.h"
+
 
-static unsigned int dst_verbose = 0;
-module_param(dst_verbose, int, 0644);
-MODULE_PARM_DESC(dst_verbose, "verbose startup messages, default is 1 (yes)");
-static unsigned int dst_debug = 0;
-module_param(dst_debug, int, 0644);
-MODULE_PARM_DESC(dst_debug, "debug messages, default is 0 (no)");
+static unsigned int verbose = 1;
+module_param(verbose, int, 0644);
+MODULE_PARM_DESC(verbose, "verbose startup messages, default is 1 (yes)");
 
-#define dprintk        if (dst_debug) printk
+static unsigned int debug = 1;
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug, "debug messages, default is 0 (yes)");
 
-#define DST_TYPE_IS_SAT                0
-#define DST_TYPE_IS_TERR       1
-#define DST_TYPE_IS_CABLE      2
+static unsigned int dst_addons;
+module_param(dst_addons, int, 0644);
+MODULE_PARM_DESC(dst_addons, "CA daughterboard, default is 0 (No addons)");
 
-#define DST_TYPE_HAS_NEWTUNE   1
-#define DST_TYPE_HAS_TS204     2
-#define DST_TYPE_HAS_SYMDIV    4
+#define dprintk        if (debug) printk
 
 #define HAS_LOCK       1
 #define ATTEMPT_TUNE   2
@@ -97,7 +60,7 @@ static void dst_packsize(struct dst_state* state, int psize)
        bt878_device_control(state->bt, DST_IG_TS, &bits);
 }
 
-static int dst_gpio_outb(struct dst_state* state, u32 mask, u32 enbb, u32 outhigh)
+int dst_gpio_outb(struct dst_state* state, u32 mask, u32 enbb, u32 outhigh, int delay)
 {
        union dst_gpio_packet enb;
        union dst_gpio_packet bits;
@@ -105,26 +68,33 @@ static int dst_gpio_outb(struct dst_state* state, u32 mask, u32 enbb, u32 outhig
 
        enb.enb.mask = mask;
        enb.enb.enable = enbb;
+       if (verbose > 4)
+               dprintk("%s: mask=[%04x], enbb=[%04x], outhigh=[%04x]\n", __FUNCTION__, mask, enbb, outhigh);
+
        if ((err = bt878_device_control(state->bt, DST_IG_ENABLE, &enb)) < 0) {
-               dprintk("%s: dst_gpio_enb error (err == %i, mask == 0x%02x, enb == 0x%02x)\n", __FUNCTION__, err, mask, enbb);
+               dprintk("%s: dst_gpio_enb error (err == %i, mask == %02x, enb == %02x)\n", __FUNCTION__, err, mask, enbb);
                return -EREMOTEIO;
        }
-
+       udelay(1000);
        /* because complete disabling means no output, no need to do output packet */
        if (enbb == 0)
                return 0;
 
+       if (delay)
+               msleep(10);
+
        bits.outp.mask = enbb;
        bits.outp.highvals = outhigh;
 
        if ((err = bt878_device_control(state->bt, DST_IG_WRITE, &bits)) < 0) {
-               dprintk("%s: dst_gpio_outb error (err == %i, enbb == 0x%02x, outhigh == 0x%02x)\n", __FUNCTION__, err, enbb, outhigh);
+               dprintk("%s: dst_gpio_outb error (err == %i, enbb == %02x, outhigh == %02x)\n", __FUNCTION__, err, enbb, outhigh);
                return -EREMOTEIO;
        }
        return 0;
 }
+EXPORT_SYMBOL(dst_gpio_outb);
 
-static int dst_gpio_inb(struct dst_state *state, u8 * result)
+int dst_gpio_inb(struct dst_state *state, u8 * result)
 {
        union dst_gpio_packet rd_packet;
        int err;
@@ -139,143 +109,225 @@ static int dst_gpio_inb(struct dst_state *state, u8 * result)
        *result = (u8) rd_packet.rd.value;
        return 0;
 }
+EXPORT_SYMBOL(dst_gpio_inb);
 
-#define DST_I2C_ENABLE 1
-#define DST_8820       2
-
-static int dst_reset8820(struct dst_state *state)
+int rdc_reset_state(struct dst_state *state)
 {
-       int retval;
-       /* pull 8820 gpio pin low, wait, high, wait, then low */
-       // dprintk ("%s: reset 8820\n", __FUNCTION__);
-       retval = dst_gpio_outb(state, DST_8820, DST_8820, 0);
-       if (retval < 0)
-               return retval;
+       if (verbose > 1)
+               dprintk("%s: Resetting state machine\n", __FUNCTION__);
+
+       if (dst_gpio_outb(state, RDC_8820_INT, RDC_8820_INT, 0, NO_DELAY) < 0) {
+               dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
+               return -1;
+       }
+
        msleep(10);
-       retval = dst_gpio_outb(state, DST_8820, DST_8820, DST_8820);
-       if (retval < 0)
-               return retval;
-       /* wait for more feedback on what works here *
-          msleep(10);
-          retval = dst_gpio_outb(dst, DST_8820, DST_8820, 0);
-          if (retval < 0)
-          return retval;
-        */
+
+       if (dst_gpio_outb(state, RDC_8820_INT, RDC_8820_INT, RDC_8820_INT, NO_DELAY) < 0) {
+               dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
+               msleep(10);
+               return -1;
+       }
+
        return 0;
 }
+EXPORT_SYMBOL(rdc_reset_state);
 
-static int dst_i2c_enable(struct dst_state *state)
+int rdc_8820_reset(struct dst_state *state)
 {
-       int retval;
-       /* pull I2C enable gpio pin low, wait */
-       // dprintk ("%s: i2c enable\n", __FUNCTION__);
-       retval = dst_gpio_outb(state, ~0, DST_I2C_ENABLE, 0);
-       if (retval < 0)
-               return retval;
-       // dprintk ("%s: i2c enable delay\n", __FUNCTION__);
-       msleep(33);
+       if (verbose > 1)
+               dprintk("%s: Resetting DST\n", __FUNCTION__);
+
+       if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, 0, NO_DELAY) < 0) {
+               dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
+               return -1;
+       }
+       udelay(1000);
+       if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, RDC_8820_RESET, DELAY) < 0) {
+               dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
+               return -1;
+       }
+
        return 0;
 }
+EXPORT_SYMBOL(rdc_8820_reset);
 
-static int dst_i2c_disable(struct dst_state *state)
+int dst_pio_enable(struct dst_state *state)
 {
-       int retval;
-       /* release I2C enable gpio pin, wait */
-       // dprintk ("%s: i2c disable\n", __FUNCTION__);
-       retval = dst_gpio_outb(state, ~0, 0, 0);
-       if (retval < 0)
-               return retval;
-       // dprintk ("%s: i2c disable delay\n", __FUNCTION__);
-       msleep(33);
+       if (dst_gpio_outb(state, ~0, RDC_8820_PIO_0_ENABLE, 0, NO_DELAY) < 0) {
+               dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
+               return -1;
+       }
+       udelay(1000);
+       return 0;
+}
+EXPORT_SYMBOL(dst_pio_enable);
+
+int dst_pio_disable(struct dst_state *state)
+{
+       if (dst_gpio_outb(state, ~0, RDC_8820_PIO_0_DISABLE, RDC_8820_PIO_0_DISABLE, NO_DELAY) < 0) {
+               dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
+               return -1;
+       }
+       if (state->type_flags & DST_TYPE_HAS_FW_1)
+               udelay(1000);
+
        return 0;
 }
+EXPORT_SYMBOL(dst_pio_disable);
 
-static int dst_wait_dst_ready(struct dst_state *state)
+int dst_wait_dst_ready(struct dst_state *state, u8 delay_mode)
 {
        u8 reply;
-       int retval;
        int i;
+
        for (i = 0; i < 200; i++) {
-               retval = dst_gpio_inb(state, &reply);
-               if (retval < 0)
-                       return retval;
-               if ((reply & DST_I2C_ENABLE) == 0) {
-                       dprintk("%s: dst wait ready after %d\n", __FUNCTION__, i);
+               if (dst_gpio_inb(state, &reply) < 0) {
+                       dprintk("%s: dst_gpio_inb ERROR !\n", __FUNCTION__);
+                       return -1;
+               }
+
+               if ((reply & RDC_8820_PIO_0_ENABLE) == 0) {
+                       if (verbose > 4)
+                               dprintk("%s: dst wait ready after %d\n", __FUNCTION__, i);
                        return 1;
                }
                msleep(10);
        }
-       dprintk("%s: dst wait NOT ready after %d\n", __FUNCTION__, i);
+       if (verbose > 1)
+               dprintk("%s: dst wait NOT ready after %d\n", __FUNCTION__, i);
+
+       return 0;
+}
+EXPORT_SYMBOL(dst_wait_dst_ready);
+
+int dst_error_recovery(struct dst_state *state)
+{
+       dprintk("%s: Trying to return from previous errors...\n", __FUNCTION__);
+       dst_pio_disable(state);
+       msleep(10);
+       dst_pio_enable(state);
+       msleep(10);
+
        return 0;
 }
+EXPORT_SYMBOL(dst_error_recovery);
+
+int dst_error_bailout(struct dst_state *state)
+{
+       dprintk("%s: Trying to bailout from previous error...\n", __FUNCTION__);
+       rdc_8820_reset(state);
+       dst_pio_disable(state);
+       msleep(10);
+
+       return 0;
+}
+EXPORT_SYMBOL(dst_error_bailout);
+
+
+int dst_comm_init(struct dst_state* state)
+{
+       if (verbose > 1)
+               dprintk ("%s: Initializing DST..\n", __FUNCTION__);
+       if ((dst_pio_enable(state)) < 0) {
+               dprintk("%s: PIO Enable Failed.\n", __FUNCTION__);
+               return -1;
+       }
+       if ((rdc_reset_state(state)) < 0) {
+               dprintk("%s: RDC 8820 State RESET Failed.\n", __FUNCTION__);
+               return -1;
+       }
+       if (state->type_flags & DST_TYPE_HAS_FW_1)
+               msleep(100);
+       else
+               msleep(5);
+
+       return 0;
+}
+EXPORT_SYMBOL(dst_comm_init);
+
 
-static int write_dst(struct dst_state *state, u8 * data, u8 len)
+int write_dst(struct dst_state *state, u8 *data, u8 len)
 {
        struct i2c_msg msg = {
                .addr = state->config->demod_address,.flags = 0,.buf = data,.len = len
        };
+
        int err;
        int cnt;
-
-       if (dst_debug && dst_verbose) {
+       if (debug && (verbose > 4)) {
                u8 i;
-               dprintk("%s writing", __FUNCTION__);
-               for (i = 0; i < len; i++) {
-                       dprintk(" 0x%02x", data[i]);
+               if (verbose > 4) {
+                       dprintk("%s writing", __FUNCTION__);
+                       for (i = 0; i < len; i++)
+                               dprintk(" %02x", data[i]);
+                       dprintk("\n");
                }
-               dprintk("\n");
        }
-       msleep(30);
-       for (cnt = 0; cnt < 4; cnt++) {
+       for (cnt = 0; cnt < 2; cnt++) {
                if ((err = i2c_transfer(state->i2c, &msg, 1)) < 0) {
-                       dprintk("%s: write_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n", __FUNCTION__, err, len, data[0]);
-                       dst_i2c_disable(state);
-                       msleep(500);
-                       dst_i2c_enable(state);
-                       msleep(500);
+                       dprintk("%s: _write_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n", __FUNCTION__, err, len, data[0]);
+                       dst_error_recovery(state);
                        continue;
                } else
                        break;
        }
-       if (cnt >= 4)
-               return -EREMOTEIO;
+
+       if (cnt >= 2) {
+               if (verbose > 1)
+                       printk("%s: RDC 8820 RESET...\n", __FUNCTION__);
+               dst_error_bailout(state);
+
+               return -1;
+       }
+
        return 0;
 }
+EXPORT_SYMBOL(write_dst);
 
-static int read_dst(struct dst_state *state, u8 * ret, u8 len)
+int read_dst(struct dst_state *state, u8 * ret, u8 len)
 {
        struct i2c_msg msg = {.addr = state->config->demod_address,.flags = I2C_M_RD,.buf = ret,.len = len };
        int err;
        int cnt;
 
-       for (cnt = 0; cnt < 4; cnt++) {
+       for (cnt = 0; cnt < 2; cnt++) {
                if ((err = i2c_transfer(state->i2c, &msg, 1)) < 0) {
+
                        dprintk("%s: read_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n", __FUNCTION__, err, len, ret[0]);
-                       dst_i2c_disable(state);
-                       dst_i2c_enable(state);
+                       dst_error_recovery(state);
+
                        continue;
                } else
                        break;
        }
-       if (cnt >= 4)
-               return -EREMOTEIO;
-       dprintk("%s reply is 0x%x\n", __FUNCTION__, ret[0]);
-       if (dst_debug && dst_verbose) {
+       if (cnt >= 2) {
+               if (verbose > 1)
+                       printk("%s: RDC 8820 RESET...\n", __FUNCTION__);
+               dst_error_bailout(state);
+
+               return -1;
+       }
+       if (debug && (verbose > 4)) {
+               dprintk("%s reply is 0x%x\n", __FUNCTION__, ret[0]);
                for (err = 1; err < len; err++)
                        dprintk(" 0x%x", ret[err]);
                if (err > 1)
                        dprintk("\n");
        }
+
        return 0;
 }
+EXPORT_SYMBOL(read_dst);
 
 static int dst_set_freq(struct dst_state *state, u32 freq)
 {
        u8 *val;
 
        state->frequency = freq;
+       if (debug > 4)
+               dprintk("%s: set Frequency %u\n", __FUNCTION__, freq);
 
-       // dprintk("%s: set frequency %u\n", __FUNCTION__, freq);
        if (state->dst_type == DST_TYPE_IS_SAT) {
                freq = freq / 1000;
                if (freq < 950 || freq > 2150)
@@ -398,7 +450,8 @@ static int dst_set_symbolrate(struct dst_state* state, u32 srate)
        if (state->dst_type == DST_TYPE_IS_TERR) {
                return 0;
        }
-       // dprintk("%s: set srate %u\n", __FUNCTION__, srate);
+       if (debug > 4)
+               dprintk("%s: set symrate %u\n", __FUNCTION__, srate);
        srate /= 1000;
        val = &state->tx_tuna[0];
 
@@ -407,7 +460,10 @@ static int dst_set_symbolrate(struct dst_state* state, u32 srate)
                sval <<= 20;
                do_div(sval, 88000);
                symcalc = (u32) sval;
-               // dprintk("%s: set symcalc %u\n", __FUNCTION__, symcalc);
+
+               if (debug > 4)
+                       dprintk("%s: set symcalc %u\n", __FUNCTION__, symcalc);
+
                val[5] = (u8) (symcalc >> 12);
                val[6] = (u8) (symcalc >> 4);
                val[7] = (u8) (symcalc << 4);
@@ -422,7 +478,7 @@ static int dst_set_symbolrate(struct dst_state* state, u32 srate)
        return 0;
 }
 
-static u8 dst_check_sum(u8 * buf, u32 len)
+u8 dst_check_sum(u8 * buf, u32 len)
 {
        u32 i;
        u8 val = 0;
@@ -433,28 +489,7 @@ static u8 dst_check_sum(u8 * buf, u32 len)
        }
        return ((~val) + 1);
 }
-
-struct dst_types {
-       char *mstr;
-       int offs;
-       u8 dst_type;
-       u32 type_flags;
-};
-
-static struct dst_types dst_tlist[] = {
-       {"DST-020", 0, DST_TYPE_IS_SAT, DST_TYPE_HAS_SYMDIV},
-       {"DST-030", 0, DST_TYPE_IS_SAT, DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE},
-       {"DST-03T", 0, DST_TYPE_IS_SAT, DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_TS204},
-       {"DST-MOT", 0, DST_TYPE_IS_SAT, DST_TYPE_HAS_SYMDIV},
-       {"DST-CI",  1, DST_TYPE_IS_SAT, DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE},
-       {"DSTMCI",  1, DST_TYPE_IS_SAT, DST_TYPE_HAS_NEWTUNE},
-       {"DSTFCI",  1, DST_TYPE_IS_SAT, DST_TYPE_HAS_NEWTUNE},
-       {"DCTNEW",  1, DST_TYPE_IS_CABLE, DST_TYPE_HAS_NEWTUNE},
-       {"DCT-CI",  1, DST_TYPE_IS_CABLE, DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_TS204},
-       {"DTTDIG",  1, DST_TYPE_IS_TERR, 0}
-};
-
-/* DCTNEW and DCT-CI are guesses */
+EXPORT_SYMBOL(dst_check_sum);
 
 static void dst_type_flags_print(u32 type_flags)
 {
@@ -465,93 +500,270 @@ static void dst_type_flags_print(u32 type_flags)
                printk(" 0x%x ts204", DST_TYPE_HAS_TS204);
        if (type_flags & DST_TYPE_HAS_SYMDIV)
                printk(" 0x%x symdiv", DST_TYPE_HAS_SYMDIV);
+       if (type_flags & DST_TYPE_HAS_FW_1)
+               printk(" 0x%x firmware version = 1", DST_TYPE_HAS_FW_1);
+       if (type_flags & DST_TYPE_HAS_FW_2)
+               printk(" 0x%x firmware version = 2", DST_TYPE_HAS_FW_2);
+       if (type_flags & DST_TYPE_HAS_FW_3)
+               printk(" 0x%x firmware version = 3", DST_TYPE_HAS_FW_3);
+//     if ((type_flags & DST_TYPE_HAS_FW_BUILD) && new_fw)
+
        printk("\n");
 }
 
-static int dst_type_print(u8 type)
+
+static int dst_type_print (u8 type)
 {
        char *otype;
        switch (type) {
        case DST_TYPE_IS_SAT:
                otype = "satellite";
                break;
+
        case DST_TYPE_IS_TERR:
                otype = "terrestrial";
                break;
+
        case DST_TYPE_IS_CABLE:
                otype = "cable";
                break;
+
        default:
                printk("%s: invalid dst type %d\n", __FUNCTION__, type);
                return -EINVAL;
        }
        printk("DST type : %s\n", otype);
+
        return 0;
 }
 
-static int dst_check_ci(struct dst_state *state)
+/*
+       Known cards list
+       Satellite
+       -------------------
+                 200103A
+       VP-1020   DST-MOT       LG(old), TS=188
+
+       VP-1020   DST-03T       LG(new), TS=204
+       VP-1022   DST-03T       LG(new), TS=204
+       VP-1025   DST-03T       LG(new), TS=204
+
+       VP-1030   DSTMCI,       LG(new), TS=188
+       VP-1032   DSTMCI,       LG(new), TS=188
+
+       Cable
+       -------------------
+       VP-2030   DCT-CI,       Samsung, TS=204
+       VP-2021   DCT-CI,       Unknown, TS=204
+       VP-2031   DCT-CI,       Philips, TS=188
+       VP-2040   DCT-CI,       Philips, TS=188, with CA daughter board
+       VP-2040   DCT-CI,       Philips, TS=204, without CA daughter board
+
+       Terrestrial
+       -------------------
+       VP-3050  DTTNXT                  TS=188
+       VP-3040  DTT-CI,        Philips, TS=188
+       VP-3040  DTT-CI,        Philips, TS=204
+
+       ATSC
+       -------------------
+       VP-3220  ATSCDI,                 TS=188
+       VP-3250  ATSCAD,                 TS=188
+
+*/
+
+struct dst_types dst_tlist[] = {
+       {
+               .device_id = "200103A",
+               .offset = 0,
+               .dst_type =  DST_TYPE_IS_SAT,
+               .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1,
+               .dst_feature = 0
+       },      /*      obsolete        */
+
+       {
+               .device_id = "DST-020",
+               .offset = 0,
+               .dst_type =  DST_TYPE_IS_SAT,
+               .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1,
+               .dst_feature = 0
+       },      /*      obsolete        */
+
+       {
+               .device_id = "DST-030",
+               .offset =  0,
+               .dst_type = DST_TYPE_IS_SAT,
+               .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1,
+               .dst_feature = 0
+       },      /*      obsolete        */
+
+       {
+               .device_id = "DST-03T",
+               .offset = 0,
+               .dst_type = DST_TYPE_IS_SAT,
+               .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_2,
+               .dst_feature = DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4 | DST_TYPE_HAS_DISEQC5
+                                                        | DST_TYPE_HAS_MAC | DST_TYPE_HAS_MOTO
+        },
+
+       {
+               .device_id = "DST-MOT",
+               .offset =  0,
+               .dst_type = DST_TYPE_IS_SAT,
+               .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1,
+               .dst_feature = 0
+       },      /*      obsolete        */
+
+       {
+               .device_id = "DST-CI",
+               .offset = 1,
+               .dst_type = DST_TYPE_IS_SAT,
+               .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1,
+               .dst_feature = DST_TYPE_HAS_CA
+       },      /*      An OEM board    */
+
+       {
+               .device_id = "DSTMCI",
+               .offset = 1,
+               .dst_type = DST_TYPE_IS_SAT,
+               .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD,
+               .dst_feature = DST_TYPE_HAS_CA | DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4
+                                                       | DST_TYPE_HAS_MOTO | DST_TYPE_HAS_MAC
+       },
+
+       {
+               .device_id = "DSTFCI",
+               .offset = 1,
+               .dst_type = DST_TYPE_IS_SAT,
+               .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1,
+               .dst_feature = 0
+       },      /* unknown to vendor    */
+
+       {
+               .device_id = "DCT-CI",
+               .offset = 1,
+               .dst_type = DST_TYPE_IS_CABLE,
+               .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1
+                                                       | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD,
+               .dst_feature = DST_TYPE_HAS_CA
+       },
+
+       {
+               .device_id = "DCTNEW",
+               .offset = 1,
+               .dst_type = DST_TYPE_IS_CABLE,
+               .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_3,
+               .dst_feature = 0
+       },
+
+       {
+               .device_id = "DTT-CI",
+               .offset = 1,
+               .dst_type = DST_TYPE_IS_TERR,
+               .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD,
+               .dst_feature = 0
+       },
+
+       {
+               .device_id = "DTTDIG",
+               .offset = 1,
+               .dst_type = DST_TYPE_IS_TERR,
+               .type_flags = DST_TYPE_HAS_FW_2,
+               .dst_feature = 0
+       },
+
+       {
+               .device_id = "DTTNXT",
+               .offset = 1,
+               .dst_type = DST_TYPE_IS_TERR,
+               .type_flags = DST_TYPE_HAS_FW_2,
+               .dst_feature = DST_TYPE_HAS_ANALOG
+       },
+
+       {
+               .device_id = "ATSCDI",
+               .offset = 1,
+               .dst_type = DST_TYPE_IS_ATSC,
+               .type_flags = DST_TYPE_HAS_FW_2,
+               .dst_feature = 0
+       },
+
+       {
+               .device_id = "ATSCAD",
+               .offset = 1,
+               .dst_type = DST_TYPE_IS_ATSC,
+               .type_flags = DST_TYPE_HAS_FW_2,
+               .dst_feature = 0
+       },
+
+       { }
+
+};
+
+
+static int dst_get_device_id(struct dst_state *state)
 {
-       u8 txbuf[8];
-       u8 rxbuf[8];
-       int retval;
+       u8 reply;
+
        int i;
-       struct dst_types *dsp;
-       u8 use_dst_type;
-       u32 use_type_flags;
+       struct dst_types *p_dst_type;
+       u8 use_dst_type = 0;
+       u32 use_type_flags = 0;
 
-       memset(txbuf, 0, sizeof(txbuf));
-       txbuf[1] = 6;
-       txbuf[7] = dst_check_sum(txbuf, 7);
+       static u8 device_type[8] = {0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff};
 
-       dst_i2c_enable(state);
-       dst_reset8820(state);
-       retval = write_dst(state, txbuf, 8);
-       if (retval < 0) {
-               dst_i2c_disable(state);
-               dprintk("%s: write not successful, maybe no card?\n", __FUNCTION__);
-               return retval;
-       }
-       msleep(3);
-       retval = read_dst(state, rxbuf, 1);
-       dst_i2c_disable(state);
-       if (retval < 0) {
-               dprintk("%s: read not successful, maybe no card?\n", __FUNCTION__);
-               return retval;
-       }
-       if (rxbuf[0] != 0xff) {
-               dprintk("%s: write reply not 0xff, not ci (%02x)\n", __FUNCTION__, rxbuf[0]);
-               return retval;
-       }
-       if (!dst_wait_dst_ready(state))
-               return 0;
-       // dst_i2c_enable(i2c); Dimitri
-       retval = read_dst(state, rxbuf, 8);
-       dst_i2c_disable(state);
-       if (retval < 0) {
-               dprintk("%s: read not successful\n", __FUNCTION__);
-               return retval;
+       device_type[7] = dst_check_sum(device_type, 7);
+
+       if (write_dst(state, device_type, FIXED_COMM))
+               return -1;              /*      Write failed            */
+
+       if ((dst_pio_disable(state)) < 0)
+               return -1;
+
+       if (read_dst(state, &reply, GET_ACK))
+               return -1;              /*      Read failure            */
+
+       if (reply != ACK) {
+               dprintk("%s: Write not Acknowledged! [Reply=0x%02x]\n", __FUNCTION__, reply);
+               return -1;              /*      Unack'd write           */
        }
-       if (rxbuf[7] != dst_check_sum(rxbuf, 7)) {
-               dprintk("%s: checksum failure\n", __FUNCTION__);
-               return retval;
+
+       if (!dst_wait_dst_ready(state, DEVICE_INIT))
+               return -1;              /*      DST not ready yet       */
+
+       if (read_dst(state, state->rxbuffer, FIXED_COMM))
+               return -1;
+
+       dst_pio_disable(state);
+
+       if (state->rxbuffer[7] != dst_check_sum(state->rxbuffer, 7)) {
+               dprintk("%s: Checksum failure! \n", __FUNCTION__);
+               return -1;              /*      Checksum failure        */
        }
-       rxbuf[7] = '\0';
-       for (i = 0, dsp = &dst_tlist[0]; i < sizeof(dst_tlist) / sizeof(dst_tlist[0]); i++, dsp++) {
-               if (!strncmp(&rxbuf[dsp->offs], dsp->mstr, strlen(dsp->mstr))) {
-                       use_type_flags = dsp->type_flags;
-                       use_dst_type = dsp->dst_type;
-                       printk("%s: recognize %s\n", __FUNCTION__, dsp->mstr);
+
+       state->rxbuffer[7] = '\0';
+
+       for (i = 0, p_dst_type = dst_tlist; i < ARRAY_SIZE (dst_tlist); i++, p_dst_type++) {
+               if (!strncmp (&state->rxbuffer[p_dst_type->offset], p_dst_type->device_id, strlen (p_dst_type->device_id))) {
+                       use_type_flags = p_dst_type->type_flags;
+                       use_dst_type = p_dst_type->dst_type;
+
+                       /*      Card capabilities       */
+                       state->dst_hw_cap = p_dst_type->dst_feature;
+                       printk ("%s: Recognise [%s]\n", __FUNCTION__, p_dst_type->device_id);
+
                        break;
                }
        }
-       if (i >= sizeof(dst_tlist) / sizeof(dst_tlist[0])) {
-               printk("%s: unable to recognize %s or %s\n", __FUNCTION__, &rxbuf[0], &rxbuf[1]);
-               printk("%s please email linux-dvb@linuxtv.org with this type in\n", __FUNCTION__);
+
+       if (i >= sizeof (dst_tlist) / sizeof (dst_tlist [0])) {
+               printk("%s: Unable to recognize %s or %s\n", __FUNCTION__, &state->rxbuffer[0], &state->rxbuffer[1]);
+               printk("%s: please email linux-dvb@linuxtv.org with this type in\n", __FUNCTION__);
                use_dst_type = DST_TYPE_IS_SAT;
                use_type_flags = DST_TYPE_HAS_SYMDIV;
        }
-       dst_type_print(use_dst_type);
 
+       dst_type_print(use_dst_type);
        state->type_flags = use_type_flags;
        state->dst_type = use_dst_type;
        dst_type_flags_print(state->type_flags);
@@ -559,50 +771,102 @@ static int dst_check_ci(struct dst_state *state)
        if (state->type_flags & DST_TYPE_HAS_TS204) {
                dst_packsize(state, 204);
        }
+
        return 0;
 }
 
-static int dst_command(struct dst_state* state, u8 * data, u8 len)
+static int dst_probe(struct dst_state *state)
+{
+       if ((rdc_8820_reset(state)) < 0) {
+               dprintk("%s: RDC 8820 RESET Failed.\n", __FUNCTION__);
+               return -1;
+       }
+       if (dst_addons & DST_TYPE_HAS_CA)
+               msleep(4000);
+       else
+               msleep(100);
+
+       if ((dst_comm_init(state)) < 0) {
+               dprintk("%s: DST Initialization Failed.\n", __FUNCTION__);
+               return -1;
+       }
+       msleep(100);
+       if (dst_get_device_id(state) < 0) {
+               dprintk("%s: unknown device.\n", __FUNCTION__);
+               return -1;
+       }
+
+       return 0;
+}
+
+int dst_command(struct dst_state* state, u8 * data, u8 len)
 {
-       int retval;
        u8 reply;
+       if ((dst_comm_init(state)) < 0) {
+               dprintk("%s: DST Communication Initialization Failed.\n", __FUNCTION__);
+               return -1;
+       }
 
-       dst_i2c_enable(state);
-       dst_reset8820(state);
-       retval = write_dst(state, data, len);
-       if (retval < 0) {
-               dst_i2c_disable(state);
-               dprintk("%s: write not successful\n", __FUNCTION__);
-               return retval;
+       if (write_dst(state, data, len)) {
+               if (verbose > 1)
+                       dprintk("%s: Tring to recover.. \n", __FUNCTION__);
+               if ((dst_error_recovery(state)) < 0) {
+                       dprintk("%s: Recovery Failed.\n", __FUNCTION__);
+                       return -1;
+               }
+               return -1;
        }
-       msleep(33);
-       retval = read_dst(state, &reply, 1);
-       dst_i2c_disable(state);
-       if (retval < 0) {
-               dprintk("%s: read verify  not successful\n", __FUNCTION__);
-               return retval;
+       if ((dst_pio_disable(state)) < 0) {
+               dprintk("%s: PIO Disable Failed.\n", __FUNCTION__);
+               return -1;
        }
-       if (reply != 0xff) {
-               dprintk("%s: write reply not 0xff 0x%02x \n", __FUNCTION__, reply);
-               return 0;
+       if (state->type_flags & DST_TYPE_HAS_FW_1)
+               udelay(3000);
+
+       if (read_dst(state, &reply, GET_ACK)) {
+               if (verbose > 1)
+                       dprintk("%s: Trying to recover.. \n", __FUNCTION__);
+               if ((dst_error_recovery(state)) < 0) {
+                       dprintk("%s: Recovery Failed.\n", __FUNCTION__);
+                       return -1;
+               }
+               return -1;
+       }
+
+       if (reply != ACK) {
+               dprintk("%s: write not acknowledged 0x%02x \n", __FUNCTION__, reply);
+               return -1;
        }
        if (len >= 2 && data[0] == 0 && (data[1] == 1 || data[1] == 3))
                return 0;
-       if (!dst_wait_dst_ready(state))
-               return 0;
-       // dst_i2c_enable(i2c); Per dimitri
-       retval = read_dst(state, state->rxbuffer, 8);
-       dst_i2c_disable(state);
-       if (retval < 0) {
-               dprintk("%s: read not successful\n", __FUNCTION__);
-               return 0;
+
+//     udelay(3000);
+       if (state->type_flags & DST_TYPE_HAS_FW_1)
+               udelay(3000);
+       else
+               udelay(2000);
+
+       if (!dst_wait_dst_ready(state, NO_DELAY))
+               return -1;
+
+       if (read_dst(state, state->rxbuffer, FIXED_COMM)) {
+               if (verbose > 1)
+                       dprintk("%s: Trying to recover.. \n", __FUNCTION__);
+               if ((dst_error_recovery(state)) < 0) {
+                       dprintk("%s: Recovery failed.\n", __FUNCTION__);
+                       return -1;
+               }
+               return -1;
        }
+
        if (state->rxbuffer[7] != dst_check_sum(state->rxbuffer, 7)) {
                dprintk("%s: checksum failure\n", __FUNCTION__);
-               return 0;
+               return -1;
        }
+
        return 0;
 }
+EXPORT_SYMBOL(dst_command);
 
 static int dst_get_signal(struct dst_state* state)
 {
@@ -642,37 +906,38 @@ static int dst_tone_power_cmd(struct dst_state* state)
        if (state->dst_type == DST_TYPE_IS_TERR)
                return 0;
 
-       if (state->voltage == SEC_VOLTAGE_OFF)
-               paket[4] = 0;
-       else
-               paket[4] = 1;
-       if (state->tone == SEC_TONE_ON)
-               paket[2] = state->k22;
-       else
-               paket[2] = 0;
-       paket[7] = dst_check_sum(&paket[0], 7);
+       paket[4] = state->tx_tuna[4];
+       paket[2] = state->tx_tuna[2];
+       paket[3] = state->tx_tuna[3];
+       paket[7] = dst_check_sum (paket, 7);
        dst_command(state, paket, 8);
+
        return 0;
 }
 
 static int dst_get_tuna(struct dst_state* state)
 {
        int retval;
+
        if ((state->diseq_flags & ATTEMPT_TUNE) == 0)
                return 0;
+
        state->diseq_flags &= ~(HAS_LOCK);
-       if (!dst_wait_dst_ready(state))
+       if (!dst_wait_dst_ready(state, NO_DELAY))
                return 0;
+
        if (state->type_flags & DST_TYPE_HAS_NEWTUNE) {
                /* how to get variable length reply ???? */
                retval = read_dst(state, state->rx_tuna, 10);
        } else {
-               retval = read_dst(state, &state->rx_tuna[2], 8);
+               retval = read_dst(state, &state->rx_tuna[2], FIXED_COMM);
        }
+
        if (retval < 0) {
                dprintk("%s: read not successful\n", __FUNCTION__);
                return 0;
        }
+
        if (state->type_flags & DST_TYPE_HAS_NEWTUNE) {
                if (state->rx_tuna[9] != dst_check_sum(&state->rx_tuna[0], 9)) {
                        dprintk("%s: checksum failure?\n", __FUNCTION__);
@@ -705,11 +970,13 @@ static int dst_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage);
 
 static int dst_write_tuna(struct dvb_frontend* fe)
 {
-       struct dst_state* state = (struct dst_state*) fe->demodulator_priv;
+       struct dst_state* state = fe->demodulator_priv;
        int retval;
        u8 reply;
 
-       dprintk("%s: type_flags 0x%x \n", __FUNCTION__, state->type_flags);
+       if (debug > 4)
+               dprintk("%s: type_flags 0x%x \n", __FUNCTION__, state->type_flags);
+
        state->decode_freq = 0;
        state->decode_lock = state->decode_strength = state->decode_snr = 0;
        if (state->dst_type == DST_TYPE_IS_SAT) {
@@ -717,32 +984,41 @@ static int dst_write_tuna(struct dvb_frontend* fe)
                        dst_set_voltage(fe, SEC_VOLTAGE_13);
        }
        state->diseq_flags &= ~(HAS_LOCK | ATTEMPT_TUNE);
-       dst_i2c_enable(state);
+
+       if ((dst_comm_init(state)) < 0) {
+               dprintk("%s: DST Communication initialization failed.\n", __FUNCTION__);
+               return -1;
+       }
+
        if (state->type_flags & DST_TYPE_HAS_NEWTUNE) {
-               dst_reset8820(state);
                state->tx_tuna[9] = dst_check_sum(&state->tx_tuna[0], 9);
                retval = write_dst(state, &state->tx_tuna[0], 10);
+
        } else {
                state->tx_tuna[9] = dst_check_sum(&state->tx_tuna[2], 7);
-               retval = write_dst(state, &state->tx_tuna[2], 8);
+               retval = write_dst(state, &state->tx_tuna[2], FIXED_COMM);
        }
        if (retval < 0) {
-               dst_i2c_disable(state);
+               dst_pio_disable(state);
                dprintk("%s: write not successful\n", __FUNCTION__);
                return retval;
        }
-       msleep(3);
-       retval = read_dst(state, &reply, 1);
-       dst_i2c_disable(state);
-       if (retval < 0) {
-               dprintk("%s: read verify  not successful\n", __FUNCTION__);
-               return retval;
+
+       if ((dst_pio_disable(state)) < 0) {
+               dprintk("%s: DST PIO disable failed !\n", __FUNCTION__);
+               return -1;
        }
-       if (reply != 0xff) {
-               dprintk("%s: write reply not 0xff 0x%02x \n", __FUNCTION__, reply);
+
+       if ((read_dst(state, &reply, GET_ACK) < 0)) {
+               dprintk("%s: read verify not successful.\n", __FUNCTION__);
+               return -1;
+       }
+       if (reply != ACK) {
+               dprintk("%s: write not acknowledged 0x%02x \n", __FUNCTION__, reply);
                return 0;
        }
        state->diseq_flags |= ATTEMPT_TUNE;
+
        return dst_get_tuna(state);
 }
 
@@ -762,10 +1038,10 @@ static int dst_write_tuna(struct dvb_frontend* fe)
 
 static int dst_set_diseqc(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd)
 {
-       struct dst_state* state = (struct dst_state*) fe->demodulator_priv;
+       struct dst_state* state = fe->demodulator_priv;
        u8 paket[8] = { 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec };
 
-       if (state->dst_type == DST_TYPE_IS_TERR)
+       if (state->dst_type != DST_TYPE_IS_SAT)
                return 0;
 
        if (cmd->msg_len == 0 || cmd->msg_len > 4)
@@ -778,73 +1054,91 @@ static int dst_set_diseqc(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd*
 
 static int dst_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
 {
-       u8 *val;
        int need_cmd;
-       struct dst_state* state = (struct dst_state*) fe->demodulator_priv;
+       struct dst_state* state = fe->demodulator_priv;
 
        state->voltage = voltage;
 
-       if (state->dst_type == DST_TYPE_IS_TERR)
+       if (state->dst_type != DST_TYPE_IS_SAT)
                return 0;
 
        need_cmd = 0;
-       val = &state->tx_tuna[0];
-       val[8] &= ~0x40;
        switch (voltage) {
-       case SEC_VOLTAGE_13:
-               if ((state->diseq_flags & HAS_POWER) == 0)
-                       need_cmd = 1;
-               state->diseq_flags |= HAS_POWER;
-               break;
-       case SEC_VOLTAGE_18:
-               if ((state->diseq_flags & HAS_POWER) == 0)
+               case SEC_VOLTAGE_13:
+               case SEC_VOLTAGE_18:
+                       if ((state->diseq_flags & HAS_POWER) == 0)
+                               need_cmd = 1;
+                       state->diseq_flags |= HAS_POWER;
+                       state->tx_tuna[4] = 0x01;
+                       break;
+
+               case SEC_VOLTAGE_OFF:
                        need_cmd = 1;
-               state->diseq_flags |= HAS_POWER;
-               val[8] |= 0x40;
-               break;
-       case SEC_VOLTAGE_OFF:
-               need_cmd = 1;
-               state->diseq_flags &= ~(HAS_POWER | HAS_LOCK | ATTEMPT_TUNE);
-               break;
-       default:
-               return -EINVAL;
+                       state->diseq_flags &= ~(HAS_POWER | HAS_LOCK | ATTEMPT_TUNE);
+                       state->tx_tuna[4] = 0x00;
+                       break;
+
+               default:
+                       return -EINVAL;
        }
-       if (need_cmd) {
+       if (need_cmd)
                dst_tone_power_cmd(state);
-       }
+
        return 0;
 }
 
 static int dst_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
 {
-       u8 *val;
-       struct dst_state* state = (struct dst_state*) fe->demodulator_priv;
+       struct dst_state* state = fe->demodulator_priv;
 
        state->tone = tone;
 
-       if (state->dst_type == DST_TYPE_IS_TERR)
+       if (state->dst_type != DST_TYPE_IS_SAT)
                return 0;
 
-       val = &state->tx_tuna[0];
+       switch (tone) {
+               case SEC_TONE_OFF:
+                       state->tx_tuna[2] = 0xff;
+                       break;
 
-       val[8] &= ~0x1;
+               case SEC_TONE_ON:
+                       state->tx_tuna[2] = 0x02;
+                       break;
 
-       switch (tone) {
-       case SEC_TONE_OFF:
-               break;
-       case SEC_TONE_ON:
-               val[8] |= 1;
-               break;
-       default:
-               return -EINVAL;
+               default:
+                       return -EINVAL;
        }
        dst_tone_power_cmd(state);
+
+       return 0;
+}
+
+static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd)
+{
+       struct dst_state *state = fe->demodulator_priv;
+
+       if (state->dst_type != DST_TYPE_IS_SAT)
+               return 0;
+
+       state->minicmd = minicmd;
+
+       switch (minicmd) {
+               case SEC_MINI_A:
+                       state->tx_tuna[3] = 0x02;
+                       break;
+               case SEC_MINI_B:
+                       state->tx_tuna[3] = 0xff;
+                       break;
+       }
+       dst_tone_power_cmd(state);
+
        return 0;
 }
 
+
 static int dst_init(struct dvb_frontend* fe)
 {
-       struct dst_state* state = (struct dst_state*) fe->demodulator_priv;
+       struct dst_state* state = fe->demodulator_priv;
        static u8 ini_satci_tuna[] = { 9, 0, 3, 0xb6, 1, 0, 0x73, 0x21, 0, 0 };
        static u8 ini_satfta_tuna[] = { 0, 0, 3, 0xb6, 1, 0x55, 0xbd, 0x50, 0, 0 };
        static u8 ini_tvfta_tuna[] = { 0, 0, 3, 0xb6, 1, 7, 0x0, 0x0, 0, 0 };
@@ -876,7 +1170,7 @@ static int dst_init(struct dvb_frontend* fe)
 
 static int dst_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct dst_state* state = (struct dst_state*) fe->demodulator_priv;
+       struct dst_state* state = fe->demodulator_priv;
 
        *status = 0;
        if (state->diseq_flags & HAS_LOCK) {
@@ -890,7 +1184,7 @@ static int dst_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int dst_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 {
-       struct dst_state* state = (struct dst_state*) fe->demodulator_priv;
+       struct dst_state* state = fe->demodulator_priv;
 
        dst_get_signal(state);
        *strength = state->decode_strength;
@@ -900,7 +1194,7 @@ static int dst_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 
 static int dst_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct dst_state* state = (struct dst_state*) fe->demodulator_priv;
+       struct dst_state* state = fe->demodulator_priv;
 
        dst_get_signal(state);
        *snr = state->decode_snr;
@@ -910,13 +1204,19 @@ static int dst_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int dst_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct dst_state* state = (struct dst_state*) fe->demodulator_priv;
+       struct dst_state* state = fe->demodulator_priv;
 
        dst_set_freq(state, p->frequency);
+       if (verbose > 4)
+               dprintk("Set Frequency = [%d]\n", p->frequency);
+
        dst_set_inversion(state, p->inversion);
        if (state->dst_type == DST_TYPE_IS_SAT) {
                dst_set_fec(state, p->u.qpsk.fec_inner);
                dst_set_symbolrate(state, p->u.qpsk.symbol_rate);
+               if (verbose > 4)
+                       dprintk("Set Symbolrate = [%d]\n", p->u.qpsk.symbol_rate);
+
        } else if (state->dst_type == DST_TYPE_IS_TERR) {
                dst_set_bandwidth(state, p->u.ofdm.bandwidth);
        } else if (state->dst_type == DST_TYPE_IS_CABLE) {
@@ -930,7 +1230,7 @@ static int dst_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_paramet
 
 static int dst_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct dst_state* state = (struct dst_state*) fe->demodulator_priv;
+       struct dst_state* state = fe->demodulator_priv;
 
        p->frequency = state->decode_freq;
        p->inversion = state->inversion;
@@ -950,7 +1250,7 @@ static int dst_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_paramet
 
 static void dst_release(struct dvb_frontend* fe)
 {
-       struct dst_state* state = (struct dst_state*) fe->demodulator_priv;
+       struct dst_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -958,50 +1258,47 @@ static struct dvb_frontend_ops dst_dvbt_ops;
 static struct dvb_frontend_ops dst_dvbs_ops;
 static struct dvb_frontend_ops dst_dvbc_ops;
 
-struct dvb_frontend* dst_attach(const struct dst_config* config,
-                               struct i2c_adapter* i2c,
-                               struct bt878 *bt)
+struct dst_state* dst_attach(struct dst_state *state, struct dvb_adapter *dvb_adapter)
 {
-       struct dst_state* state = NULL;
-
-       /* allocate memory for the internal state */
-       state = (struct dst_state*) kmalloc(sizeof(struct dst_state), GFP_KERNEL);
-       if (state == NULL) goto error;
 
-       /* setup the state */
-       state->config = config;
-       state->i2c = i2c;
-       state->bt = bt;
-
-       /* check if the demod is there */
-       if (dst_check_ci(state) < 0) goto error;
+       /* check if the ASIC is there */
+       if (dst_probe(state) < 0) {
+               if (state)
+                       kfree(state);
 
+               return NULL;
+       }
        /* determine settings based on type */
        switch (state->dst_type) {
        case DST_TYPE_IS_TERR:
                memcpy(&state->ops, &dst_dvbt_ops, sizeof(struct dvb_frontend_ops));
                break;
+
        case DST_TYPE_IS_CABLE:
                memcpy(&state->ops, &dst_dvbc_ops, sizeof(struct dvb_frontend_ops));
                break;
+
        case DST_TYPE_IS_SAT:
                memcpy(&state->ops, &dst_dvbs_ops, sizeof(struct dvb_frontend_ops));
                break;
+
        default:
-               printk("dst: unknown frontend type. please report to the LinuxTV.org DVB mailinglist.\n");
-               goto error;
+               printk("%s: unknown DST type. please report to the LinuxTV.org DVB mailinglist.\n", __FUNCTION__);
+               if (state)
+                       kfree(state);
+
+               return NULL;
        }
 
        /* create dvb_frontend */
        state->frontend.ops = &state->ops;
        state->frontend.demodulator_priv = state;
-       return &state->frontend;
 
-error:
-       kfree(state);
-       return NULL;
+       return state;                           /*      Manu (DST is a card not a frontend)     */
 }
 
+EXPORT_SYMBOL(dst_attach);
+
 static struct dvb_frontend_ops dst_dvbt_ops = {
 
        .info = {
@@ -1051,6 +1348,7 @@ static struct dvb_frontend_ops dst_dvbs_ops = {
        .read_signal_strength = dst_read_signal_strength,
        .read_snr = dst_read_snr,
 
+       .diseqc_send_burst = dst_send_burst,
        .diseqc_send_master_cmd = dst_set_diseqc,
        .set_voltage = dst_set_voltage,
        .set_tone = dst_set_tone,
@@ -1082,8 +1380,7 @@ static struct dvb_frontend_ops dst_dvbc_ops = {
        .read_snr = dst_read_snr,
 };
 
+
 MODULE_DESCRIPTION("DST DVB-S/T/C Combo Frontend driver");
-MODULE_AUTHOR("Jamie Honan");
+MODULE_AUTHOR("Jamie Honan, Manu Abraham");
 MODULE_LICENSE("GPL");
-
-EXPORT_SYMBOL(dst_attach);
diff --git a/drivers/media/dvb/bt8xx/dst.h b/drivers/media/dvb/bt8xx/dst.h
deleted file mode 100644 (file)
index bcb418c..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
-    Frontend-driver for TwinHan DST Frontend
-
-    Copyright (C) 2003 Jamie Honan
-
-    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 DST_H
-#define DST_H
-
-#include <linux/dvb/frontend.h>
-#include <linux/device.h>
-#include "bt878.h"
-
-struct dst_config
-{
-       /* the demodulator's i2c address */
-       u8 demod_address;
-};
-
-extern struct dvb_frontend* dst_attach(const struct dst_config* config,
-                                      struct i2c_adapter* i2c,
-                                      struct bt878 *bt);
-
-#endif // DST_H
diff --git a/drivers/media/dvb/bt8xx/dst_ca.c b/drivers/media/dvb/bt8xx/dst_ca.c
new file mode 100644 (file)
index 0000000..d781504
--- /dev/null
@@ -0,0 +1,861 @@
+/*
+       CA-driver for TwinHan DST Frontend/Card
+
+       Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.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.
+*/
+
+
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/string.h>
+
+#include <linux/dvb/ca.h>
+#include "dvbdev.h"
+#include "dvb_frontend.h"
+
+#include "dst_ca.h"
+#include "dst_common.h"
+
+static unsigned int verbose = 1;
+module_param(verbose, int, 0644);
+MODULE_PARM_DESC(verbose, "verbose startup messages, default is 1 (yes)");
+
+static unsigned int debug = 1;
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug, "debug messages, default is 1 (yes)");
+
+#define dprintk if (debug) printk
+
+/*     Need some more work     */
+static int ca_set_slot_descr(void)
+{
+       /*      We could make this more graceful ?      */
+       return -EOPNOTSUPP;
+}
+
+/*     Need some more work     */
+static int ca_set_pid(void)
+{
+       /*      We could make this more graceful ?      */
+       return -EOPNOTSUPP;
+}
+
+
+static int put_checksum(u8 *check_string, int length)
+{
+       u8 i = 0, checksum = 0;
+
+       if (verbose > 3) {
+               dprintk("%s: ========================= Checksum calculation ===========================\n", __FUNCTION__);
+               dprintk("%s: String Length=[0x%02x]\n", __FUNCTION__, length);
+
+               dprintk("%s: String=[", __FUNCTION__);
+       }
+       while (i < length) {
+               if (verbose > 3)
+                       dprintk(" %02x", check_string[i]);
+               checksum += check_string[i];
+               i++;
+       }
+       if (verbose > 3) {
+               dprintk(" ]\n");
+               dprintk("%s: Sum=[%02x]\n", __FUNCTION__, checksum);
+       }
+       check_string[length] = ~checksum + 1;
+       if (verbose > 3) {
+               dprintk("%s: Checksum=[%02x]\n", __FUNCTION__, check_string[length]);
+               dprintk("%s: ==========================================================================\n", __FUNCTION__);
+       }
+
+       return 0;
+}
+
+static int dst_ci_command(struct dst_state* state, u8 * data, u8 *ca_string, u8 len, int read)
+{
+       u8 reply;
+
+       dst_comm_init(state);
+       msleep(65);
+
+       if (write_dst(state, data, len)) {
+               dprintk("%s: Write not successful, trying to recover\n", __FUNCTION__);
+               dst_error_recovery(state);
+               return -1;
+       }
+
+       if ((dst_pio_disable(state)) < 0) {
+               dprintk("%s: DST PIO disable failed.\n", __FUNCTION__);
+               return -1;
+       }
+
+       if (read_dst(state, &reply, GET_ACK) < 0) {
+               dprintk("%s: Read not successful, trying to recover\n", __FUNCTION__);
+               dst_error_recovery(state);
+               return -1;
+       }
+
+       if (read) {
+               if (! dst_wait_dst_ready(state, LONG_DELAY)) {
+                       dprintk("%s: 8820 not ready\n", __FUNCTION__);
+                       return -1;
+               }
+
+               if (read_dst(state, ca_string, 128) < 0) {      /*      Try to make this dynamic        */
+                       dprintk("%s: Read not successful, trying to recover\n", __FUNCTION__);
+                       dst_error_recovery(state);
+                       return -1;
+               }
+       }
+
+       return 0;
+}
+
+
+static int dst_put_ci(struct dst_state *state, u8 *data, int len, u8 *ca_string, int read)
+{
+       u8 dst_ca_comm_err = 0;
+
+       while (dst_ca_comm_err < RETRIES) {
+               dst_comm_init(state);
+               if (verbose > 2)
+                       dprintk("%s: Put Command\n", __FUNCTION__);
+               if (dst_ci_command(state, data, ca_string, len, read)) {        // If error
+                       dst_error_recovery(state);
+                       dst_ca_comm_err++; // work required here.
+               }
+               break;
+       }
+
+       return 0;
+}
+
+
+
+static int ca_get_app_info(struct dst_state *state)
+{
+       static u8 command[8] = {0x07, 0x40, 0x01, 0x00, 0x01, 0x00, 0x00, 0xff};
+
+       put_checksum(&command[0], command[0]);
+       if ((dst_put_ci(state, command, sizeof(command), state->messages, GET_REPLY)) < 0) {
+               dprintk("%s: -->dst_put_ci FAILED !\n", __FUNCTION__);
+               return -1;
+       }
+       if (verbose > 1) {
+               dprintk("%s: -->dst_put_ci SUCCESS !\n", __FUNCTION__);
+
+               dprintk("%s: ================================ CI Module Application Info ======================================\n", __FUNCTION__);
+               dprintk("%s: Application Type=[%d], Application Vendor=[%d], Vendor Code=[%d]\n%s: Application info=[%s]\n",
+                       __FUNCTION__, state->messages[7], (state->messages[8] << 8) | state->messages[9],
+                       (state->messages[10] << 8) | state->messages[11], __FUNCTION__, (char *)(&state->messages[12]));
+               dprintk("%s: ==================================================================================================\n", __FUNCTION__);
+       }
+
+       return 0;
+}
+
+static int ca_get_slot_caps(struct dst_state *state, struct ca_caps *p_ca_caps, void *arg)
+{
+       int i;
+       u8 slot_cap[256];
+       static u8 slot_command[8] = {0x07, 0x40, 0x02, 0x00, 0x02, 0x00, 0x00, 0xff};
+
+       put_checksum(&slot_command[0], slot_command[0]);
+       if ((dst_put_ci(state, slot_command, sizeof (slot_command), slot_cap, GET_REPLY)) < 0) {
+               dprintk("%s: -->dst_put_ci FAILED !\n", __FUNCTION__);
+               return -1;
+       }
+       if (verbose > 1)
+               dprintk("%s: -->dst_put_ci SUCCESS !\n", __FUNCTION__);
+
+       /*      Will implement the rest soon            */
+
+       if (verbose > 1) {
+               dprintk("%s: Slot cap = [%d]\n", __FUNCTION__, slot_cap[7]);
+               dprintk("===================================\n");
+               for (i = 0; i < 8; i++)
+                       dprintk(" %d", slot_cap[i]);
+               dprintk("\n");
+       }
+
+       p_ca_caps->slot_num = 1;
+       p_ca_caps->slot_type = 1;
+       p_ca_caps->descr_num = slot_cap[7];
+       p_ca_caps->descr_type = 1;
+
+
+       if (copy_to_user((struct ca_caps *)arg, p_ca_caps, sizeof (struct ca_caps))) {
+               return -EFAULT;
+       }
+
+       return 0;
+}
+
+/*     Need some more work     */
+static int ca_get_slot_descr(struct dst_state *state, struct ca_msg *p_ca_message, void *arg)
+{
+       return -EOPNOTSUPP;
+}
+
+
+static int ca_get_slot_info(struct dst_state *state, struct ca_slot_info *p_ca_slot_info, void *arg)
+{
+       int i;
+       static u8 slot_command[8] = {0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff};
+
+       u8 *slot_info = state->rxbuffer;
+
+       put_checksum(&slot_command[0], 7);
+       if ((dst_put_ci(state, slot_command, sizeof (slot_command), slot_info, GET_REPLY)) < 0) {
+               dprintk("%s: -->dst_put_ci FAILED !\n", __FUNCTION__);
+               return -1;
+       }
+       if (verbose > 1)
+               dprintk("%s: -->dst_put_ci SUCCESS !\n", __FUNCTION__);
+
+       /*      Will implement the rest soon            */
+
+       if (verbose > 1) {
+               dprintk("%s: Slot info = [%d]\n", __FUNCTION__, slot_info[3]);
+               dprintk("===================================\n");
+               for (i = 0; i < 8; i++)
+                       dprintk(" %d", slot_info[i]);
+               dprintk("\n");
+       }
+
+       if (slot_info[4] & 0x80) {
+               p_ca_slot_info->flags = CA_CI_MODULE_PRESENT;
+               p_ca_slot_info->num = 1;
+               p_ca_slot_info->type = CA_CI;
+       }
+       else if (slot_info[4] & 0x40) {
+               p_ca_slot_info->flags = CA_CI_MODULE_READY;
+               p_ca_slot_info->num = 1;
+               p_ca_slot_info->type = CA_CI;
+       }
+       else {
+               p_ca_slot_info->flags = 0;
+       }
+
+       if (copy_to_user((struct ca_slot_info *)arg, p_ca_slot_info, sizeof (struct ca_slot_info))) {
+               return -EFAULT;
+       }
+
+       return 0;
+}
+
+
+
+
+static int ca_get_message(struct dst_state *state, struct ca_msg *p_ca_message, void *arg)
+{
+       u8 i = 0;
+       u32 command = 0;
+
+       if (copy_from_user(p_ca_message, (void *)arg, sizeof (struct ca_msg)))
+               return -EFAULT;
+
+
+       if (p_ca_message->msg) {
+               if (verbose > 3)
+                       dprintk("Message = [%02x %02x %02x]\n", p_ca_message->msg[0], p_ca_message->msg[1], p_ca_message->msg[2]);
+
+               for (i = 0; i < 3; i++) {
+                       command = command | p_ca_message->msg[i];
+                       if (i < 2)
+                               command = command << 8;
+               }
+               if (verbose > 3)
+                       dprintk("%s:Command=[0x%x]\n", __FUNCTION__, command);
+
+               switch (command) {
+                       case CA_APP_INFO:
+                               memcpy(p_ca_message->msg, state->messages, 128);
+                               if (copy_to_user((void *)arg, p_ca_message, sizeof (struct ca_msg)) )
+                                       return -EFAULT;
+                       break;
+               }
+       }
+
+       return 0;
+}
+
+static int handle_en50221_tag(struct dst_state *state, struct ca_msg *p_ca_message, struct ca_msg *hw_buffer)
+{
+       if (state->dst_hw_cap & DST_TYPE_HAS_SESSION) {
+               hw_buffer->msg[2] = p_ca_message->msg[1];               /*              MSB                     */
+               hw_buffer->msg[3] = p_ca_message->msg[2];               /*              LSB                     */
+       }
+       else {
+               hw_buffer->msg[2] = 0x03;
+               hw_buffer->msg[3] = 0x00;
+       }
+       return 0;
+}
+
+static int debug_8820_buffer(struct ca_msg *hw_buffer)
+{
+       unsigned int i;
+
+       dprintk("%s:Debug=[", __FUNCTION__);
+       for (i = 0; i < (hw_buffer->msg[0] + 1); i++)
+               dprintk(" %02x", hw_buffer->msg[i]);
+       dprintk("]\n");
+
+       return 0;
+}
+
+static int write_to_8820(struct dst_state *state, struct ca_msg *hw_buffer, u8 reply)
+{
+       if ((dst_put_ci(state, hw_buffer->msg, (hw_buffer->length + 1), hw_buffer->msg, reply)) < 0) {
+               dprintk("%s: DST-CI Command failed.\n", __FUNCTION__);
+               dprintk("%s: Resetting DST.\n", __FUNCTION__);
+               rdc_reset_state(state);
+               return -1;
+       }
+       if (verbose > 2)
+               dprintk("%s: DST-CI Command succes.\n", __FUNCTION__);
+
+       return 0;
+}
+
+
+static int ca_set_pmt(struct dst_state *state, struct ca_msg *p_ca_message, struct ca_msg *hw_buffer, u8 reply, u8 query)
+{
+       u32 hw_offset, buf_offset, i, k;
+       u32 program_info_length = 0, es_info_length = 0, length = 0, words = 0;
+       u8 found_prog_ca_desc = 0, found_stream_ca_desc = 0, error_condition = 0, hw_buffer_length = 0;
+
+       if (verbose > 3)
+               dprintk("%s, p_ca_message length %d (0x%x)\n", __FUNCTION__,p_ca_message->length,p_ca_message->length );
+
+       handle_en50221_tag(state, p_ca_message, hw_buffer);                     /*      EN50221 tag             */
+
+       /*      Handle the length field (variable)      */
+       if (!(p_ca_message->msg[3] & 0x80)) {                           /*      Length = 1              */
+               length = p_ca_message->msg[3] & 0x7f;
+               words = 0;                                              /*      domi's suggestion       */
+       }
+       else {                                                          /*      Length = words          */
+               words = p_ca_message->msg[3] & 0x7f;
+               for (i = 0; i < words; i++) {
+                       length = length << 8;
+                       length = length | p_ca_message->msg[4 + i];
+               }
+       }
+       if (verbose > 4) {
+               dprintk("%s:Length=[%d (0x%x)], Words=[%d]\n", __FUNCTION__, length,length, words);
+
+               /*      Debug Input string              */
+               for (i = 0; i < length; i++)
+                       dprintk(" %02x", p_ca_message->msg[i]);
+               dprintk("]\n");
+       }
+
+       hw_offset = 7;
+       buf_offset = words + 4;
+
+       /*              Program Header                  */
+       if (verbose > 4)
+               dprintk("\n%s:Program Header=[", __FUNCTION__);
+       for (i = 0; i < 6; i++) {
+               hw_buffer->msg[hw_offset] = p_ca_message->msg[buf_offset];
+               if (verbose > 4)
+                       dprintk(" %02x", p_ca_message->msg[buf_offset]);
+               hw_offset++, buf_offset++, hw_buffer_length++;
+       }
+       if (verbose > 4)
+               dprintk("]\n");
+
+       program_info_length = 0;
+       program_info_length = (((program_info_length | p_ca_message->msg[words + 8]) & 0x0f) << 8) | p_ca_message->msg[words + 9];
+       if (verbose > 4)
+               dprintk("%s:Program info Length=[%d][%02x], hw_offset=[%d], buf_offset=[%d] \n",
+                       __FUNCTION__, program_info_length, program_info_length, hw_offset, buf_offset);
+
+       if (program_info_length && (program_info_length < 256)) {       /*      If program_info_length          */
+               hw_buffer->msg[11] = hw_buffer->msg[11] & 0x0f;         /*      req only 4 bits                 */
+               hw_buffer->msg[12] = hw_buffer->msg[12] + 1;            /*      increment! ASIC bug!            */
+
+               if (p_ca_message->msg[buf_offset + 1] == 0x09) {        /*      Check CA descriptor             */
+                       found_prog_ca_desc = 1;
+                       if (verbose > 4)
+                               dprintk("%s: Found CA descriptor @ Program level\n", __FUNCTION__);
+               }
+
+               if (found_prog_ca_desc) {                               /*      Command only if CA descriptor   */
+                       hw_buffer->msg[13] = p_ca_message->msg[buf_offset];     /*      CA PMT command ID       */
+                       hw_offset++, buf_offset++, hw_buffer_length++;
+               }
+
+               /*                      Program descriptors                             */
+               if (verbose > 4) {
+                       dprintk("%s:**********>buf_offset=[%d], hw_offset=[%d]\n", __FUNCTION__, buf_offset, hw_offset);
+                       dprintk("%s:Program descriptors=[", __FUNCTION__);
+               }
+               while (program_info_length && !error_condition) {               /*      Copy prog descriptors   */
+                       if (program_info_length > p_ca_message->length) {       /*      Error situation         */
+                               dprintk ("%s:\"WARNING\" Length error, line=[%d], prog_info_length=[%d]\n",
+                                                               __FUNCTION__, __LINE__, program_info_length);
+                               dprintk("%s:\"WARNING\" Bailing out of possible loop\n", __FUNCTION__);
+                               error_condition = 1;
+                               break;
+                       }
+
+                       hw_buffer->msg[hw_offset] = p_ca_message->msg[buf_offset];
+                       dprintk(" %02x", p_ca_message->msg[buf_offset]);
+                       hw_offset++, buf_offset++, hw_buffer_length++, program_info_length--;
+               }
+               if (verbose > 4) {
+                       dprintk("]\n");
+                       dprintk("%s:**********>buf_offset=[%d], hw_offset=[%d]\n", __FUNCTION__, buf_offset, hw_offset);
+               }
+               if (found_prog_ca_desc) {
+                       if (!reply) {
+                               hw_buffer->msg[13] = 0x01;              /*      OK descrambling                 */
+                               if (verbose > 1)
+                                       dprintk("CA PMT Command = OK Descrambling\n");
+                       }
+                       else {
+                               hw_buffer->msg[13] = 0x02;              /*      Ok MMI                          */
+                               if (verbose > 1)
+                                       dprintk("CA PMT Command = Ok MMI\n");
+                       }
+                       if (query) {
+                               hw_buffer->msg[13] = 0x03;              /*      Query                           */
+                               if (verbose > 1)
+                                       dprintk("CA PMT Command = CA PMT query\n");
+                       }
+               }
+       }
+       else {
+               hw_buffer->msg[11] = hw_buffer->msg[11] & 0xf0;         /*      Don't write to ASIC             */
+               hw_buffer->msg[12] = hw_buffer->msg[12] = 0x00;
+       }
+       if (verbose > 4)
+               dprintk("%s:**********>p_ca_message->length=[%d], buf_offset=[%d], hw_offset=[%d]\n",
+                                       __FUNCTION__, p_ca_message->length, buf_offset, hw_offset);
+
+       while ((buf_offset  < p_ca_message->length)  && !error_condition) {
+               /*      Bail out in case of an indefinite loop          */
+               if ((es_info_length > p_ca_message->length) || (buf_offset > p_ca_message->length)) {
+                       dprintk("%s:\"WARNING\" Length error, line=[%d], prog_info_length=[%d], buf_offset=[%d]\n",
+                                                       __FUNCTION__, __LINE__, program_info_length, buf_offset);
+
+                       dprintk("%s:\"WARNING\" Bailing out of possible loop\n", __FUNCTION__);
+                       error_condition = 1;
+                       break;
+               }
+
+               /*              Stream Header                           */
+
+               for (k = 0; k < 5; k++) {
+                       hw_buffer->msg[hw_offset + k] = p_ca_message->msg[buf_offset + k];
+               }
+
+               es_info_length = 0;
+               es_info_length = (es_info_length | (p_ca_message->msg[buf_offset + 3] & 0x0f)) << 8 | p_ca_message->msg[buf_offset + 4];
+
+               if (verbose > 4) {
+                       dprintk("\n%s:----->Stream header=[%02x %02x %02x %02x %02x]\n", __FUNCTION__,
+                               p_ca_message->msg[buf_offset + 0], p_ca_message->msg[buf_offset + 1],
+                               p_ca_message->msg[buf_offset + 2], p_ca_message->msg[buf_offset + 3],
+                               p_ca_message->msg[buf_offset + 4]);
+
+                       dprintk("%s:----->Stream type=[%02x], es length=[%d (0x%x)], Chars=[%02x] [%02x], buf_offset=[%d]\n", __FUNCTION__,
+                               p_ca_message->msg[buf_offset + 0], es_info_length, es_info_length,
+                               p_ca_message->msg[buf_offset + 3], p_ca_message->msg[buf_offset + 4], buf_offset);
+               }
+
+               hw_buffer->msg[hw_offset + 3] &= 0x0f;                  /*      req only 4 bits                 */
+
+               if (found_prog_ca_desc) {
+                       hw_buffer->msg[hw_offset + 3] = 0x00;
+                       hw_buffer->msg[hw_offset + 4] = 0x00;
+               }
+
+               hw_offset += 5, buf_offset += 5, hw_buffer_length += 5;
+
+               /*              Check for CA descriptor                 */
+               if (p_ca_message->msg[buf_offset + 1] == 0x09) {
+                       if (verbose > 4)
+                               dprintk("%s:Found CA descriptor @ Stream level\n", __FUNCTION__);
+                       found_stream_ca_desc = 1;
+               }
+
+               /*              ES descriptors                          */
+
+               if (es_info_length && !error_condition && !found_prog_ca_desc && found_stream_ca_desc) {
+//                     if (!ca_pmt_done) {
+                               hw_buffer->msg[hw_offset] = p_ca_message->msg[buf_offset];      /*      CA PMT cmd(es)  */
+                               if (verbose > 4)
+                                       printk("%s:----->CA PMT Command ID=[%02x]\n", __FUNCTION__, p_ca_message->msg[buf_offset]);
+//                             hw_offset++, buf_offset++, hw_buffer_length++, es_info_length--, ca_pmt_done = 1;
+                               hw_offset++, buf_offset++, hw_buffer_length++, es_info_length--;
+//                     }
+                       if (verbose > 4)
+                               dprintk("%s:----->ES descriptors=[", __FUNCTION__);
+
+                       while (es_info_length && !error_condition) {    /*      ES descriptors                  */
+                               if ((es_info_length > p_ca_message->length) || (buf_offset > p_ca_message->length)) {
+                                       if (verbose > 4) {
+                                               dprintk("%s:\"WARNING\" ES Length error, line=[%d], es_info_length=[%d], buf_offset=[%d]\n",
+                                                                               __FUNCTION__, __LINE__, es_info_length, buf_offset);
+
+                                               dprintk("%s:\"WARNING\" Bailing out of possible loop\n", __FUNCTION__);
+                                       }
+                                       error_condition = 1;
+                                       break;
+                               }
+
+                               hw_buffer->msg[hw_offset] = p_ca_message->msg[buf_offset];
+                               if (verbose > 3)
+                                       dprintk("%02x ", hw_buffer->msg[hw_offset]);
+                               hw_offset++, buf_offset++, hw_buffer_length++, es_info_length--;
+                       }
+                       found_stream_ca_desc = 0;                       /*      unset for new streams           */
+                       dprintk("]\n");
+               }
+       }
+
+       /*              MCU Magic words                                 */
+
+       hw_buffer_length += 7;
+       hw_buffer->msg[0] = hw_buffer_length;
+       hw_buffer->msg[1] = 64;
+       hw_buffer->msg[4] = 3;
+       hw_buffer->msg[5] = hw_buffer->msg[0] - 7;
+       hw_buffer->msg[6] = 0;
+
+
+       /*      Fix length      */
+       hw_buffer->length = hw_buffer->msg[0];
+
+       put_checksum(&hw_buffer->msg[0], hw_buffer->msg[0]);
+       /*      Do the actual write     */
+       if (verbose > 4) {
+               dprintk("%s:======================DEBUGGING================================\n", __FUNCTION__);
+               dprintk("%s: Actual Length=[%d]\n", __FUNCTION__, hw_buffer_length);
+       }
+       /*      Only for debugging!     */
+       if (verbose > 2)
+               debug_8820_buffer(hw_buffer);
+       if (verbose > 3)
+               dprintk("%s: Reply = [%d]\n", __FUNCTION__, reply);
+       write_to_8820(state, hw_buffer, reply);
+
+       return 0;
+}
+
+/*     Board supports CA PMT reply ?           */
+static int dst_check_ca_pmt(struct dst_state *state, struct ca_msg *p_ca_message, struct ca_msg *hw_buffer)
+{
+       int ca_pmt_reply_test = 0;
+
+       /*      Do test board                   */
+       /*      Not there yet but soon          */
+
+
+       /*      CA PMT Reply capable            */
+       if (ca_pmt_reply_test) {
+               if ((ca_set_pmt(state, p_ca_message, hw_buffer, 1, GET_REPLY)) < 0) {
+                       dprintk("%s: ca_set_pmt.. failed !\n", __FUNCTION__);
+                       return -1;
+               }
+
+       /*      Process CA PMT Reply            */
+       /*      will implement soon             */
+               dprintk("%s: Not there yet\n", __FUNCTION__);
+       }
+       /*      CA PMT Reply not capable        */
+       if (!ca_pmt_reply_test) {
+               if ((ca_set_pmt(state, p_ca_message, hw_buffer, 0, NO_REPLY)) < 0) {
+                       dprintk("%s: ca_set_pmt.. failed !\n", __FUNCTION__);
+                       return -1;
+               }
+               if (verbose > 3)
+                       dprintk("%s: ca_set_pmt.. success !\n", __FUNCTION__);
+       /*      put a dummy message             */
+
+       }
+       return 0;
+}
+
+static int ca_send_message(struct dst_state *state, struct ca_msg *p_ca_message, void *arg)
+{
+       int i = 0;
+       unsigned int ca_message_header_len;
+
+       u32 command = 0;
+       struct ca_msg *hw_buffer;
+
+       if ((hw_buffer = (struct ca_msg *) kmalloc(sizeof (struct ca_msg), GFP_KERNEL)) == NULL) {
+               printk("%s: Memory allocation failure\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+       if (verbose > 3)
+               dprintk("%s\n", __FUNCTION__);
+
+       if (copy_from_user(p_ca_message, (void *)arg, sizeof (struct ca_msg)))
+               return -EFAULT;
+
+       if (p_ca_message->msg) {
+               ca_message_header_len = p_ca_message->length;   /*      Restore it back when you are done       */
+               /*      EN50221 tag     */
+               command = 0;
+
+               for (i = 0; i < 3; i++) {
+                       command = command | p_ca_message->msg[i];
+                       if (i < 2)
+                               command = command << 8;
+               }
+               if (verbose > 3)
+                       dprintk("%s:Command=[0x%x]\n", __FUNCTION__, command);
+
+               switch (command) {
+                       case CA_PMT:
+                               if (verbose > 3)
+                                       dprintk("Command = SEND_CA_PMT\n");
+                               if ((ca_set_pmt(state, p_ca_message, hw_buffer, 0, 0)) < 0) {
+                                       dprintk("%s: -->CA_PMT Failed !\n", __FUNCTION__);
+                                       return -1;
+                               }
+                               if (verbose > 3)
+                                       dprintk("%s: -->CA_PMT Success !\n", __FUNCTION__);
+//                             retval = dummy_set_pmt(state, p_ca_message, hw_buffer, 0, 0);
+
+                               break;
+
+                       case CA_PMT_REPLY:
+                               if (verbose > 3)
+                                       dprintk("Command = CA_PMT_REPLY\n");
+                               /*      Have to handle the 2 basic types of cards here  */
+                               if ((dst_check_ca_pmt(state, p_ca_message, hw_buffer)) < 0) {
+                                       dprintk("%s: -->CA_PMT_REPLY Failed !\n", __FUNCTION__);
+                                       return -1;
+                               }
+                               if (verbose > 3)
+                                       dprintk("%s: -->CA_PMT_REPLY Success !\n", __FUNCTION__);
+
+                               /*      Certain boards do behave different ?            */
+//                             retval = ca_set_pmt(state, p_ca_message, hw_buffer, 1, 1);
+
+                       case CA_APP_INFO_ENQUIRY:               // only for debugging
+                               if (verbose > 3)
+                                       dprintk("%s: Getting Cam Application information\n", __FUNCTION__);
+
+                               if ((ca_get_app_info(state)) < 0) {
+                                       dprintk("%s: -->CA_APP_INFO_ENQUIRY Failed !\n", __FUNCTION__);
+                                       return -1;
+                               }
+                               if (verbose > 3)
+                                       printk("%s: -->CA_APP_INFO_ENQUIRY Success !\n", __FUNCTION__);
+
+                               break;
+               }
+       }
+       return 0;
+}
+
+static int dst_ca_ioctl(struct inode *inode, struct file *file, unsigned int cmd, void *arg)
+{
+       struct dvb_device* dvbdev = (struct dvb_device*) file->private_data;
+       struct dst_state* state = (struct dst_state*) dvbdev->priv;
+       struct ca_slot_info *p_ca_slot_info;
+       struct ca_caps *p_ca_caps;
+       struct ca_msg *p_ca_message;
+
+       if ((p_ca_message = (struct ca_msg *) kmalloc(sizeof (struct ca_msg), GFP_KERNEL)) == NULL) {
+               printk("%s: Memory allocation failure\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+
+       if ((p_ca_slot_info = (struct ca_slot_info *) kmalloc(sizeof (struct ca_slot_info), GFP_KERNEL)) == NULL) {
+               printk("%s: Memory allocation failure\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+
+       if ((p_ca_caps = (struct ca_caps *) kmalloc(sizeof (struct ca_caps), GFP_KERNEL)) == NULL) {
+               printk("%s: Memory allocation failure\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+
+       /*      We have now only the standard ioctl's, the driver is upposed to handle internals.       */
+       switch (cmd) {
+               case CA_SEND_MSG:
+                       if (verbose > 1)
+                               dprintk("%s: Sending message\n", __FUNCTION__);
+                       if ((ca_send_message(state, p_ca_message, arg)) < 0) {
+                               dprintk("%s: -->CA_SEND_MSG Failed !\n", __FUNCTION__);
+                               return -1;
+                       }
+
+                       break;
+
+               case CA_GET_MSG:
+                       if (verbose > 1)
+                               dprintk("%s: Getting message\n", __FUNCTION__);
+                       if ((ca_get_message(state, p_ca_message, arg)) < 0) {
+                               dprintk("%s: -->CA_GET_MSG Failed !\n", __FUNCTION__);
+                               return -1;
+                       }
+                       if (verbose > 1)
+                               dprintk("%s: -->CA_GET_MSG Success !\n", __FUNCTION__);
+
+                       break;
+
+               case CA_RESET:
+                       if (verbose > 1)
+                               dprintk("%s: Resetting DST\n", __FUNCTION__);
+                       dst_error_bailout(state);
+                       msleep(4000);
+
+                       break;
+
+               case CA_GET_SLOT_INFO:
+                       if (verbose > 1)
+                               dprintk("%s: Getting Slot info\n", __FUNCTION__);
+                       if ((ca_get_slot_info(state, p_ca_slot_info, arg)) < 0) {
+                               dprintk("%s: -->CA_GET_SLOT_INFO Failed !\n", __FUNCTION__);
+                               return -1;
+                       }
+                       if (verbose > 1)
+                               dprintk("%s: -->CA_GET_SLOT_INFO Success !\n", __FUNCTION__);
+
+                       break;
+
+               case CA_GET_CAP:
+                       if (verbose > 1)
+                               dprintk("%s: Getting Slot capabilities\n", __FUNCTION__);
+                       if ((ca_get_slot_caps(state, p_ca_caps, arg)) < 0) {
+                               dprintk("%s: -->CA_GET_CAP Failed !\n", __FUNCTION__);
+                               return -1;
+                       }
+                       if (verbose > 1)
+                               dprintk("%s: -->CA_GET_CAP Success !\n", __FUNCTION__);
+
+                       break;
+
+               case CA_GET_DESCR_INFO:
+                       if (verbose > 1)
+                               dprintk("%s: Getting descrambler description\n", __FUNCTION__);
+                       if ((ca_get_slot_descr(state, p_ca_message, arg)) < 0) {
+                               dprintk("%s: -->CA_GET_DESCR_INFO Failed !\n", __FUNCTION__);
+                               return -1;
+                       }
+                       if (verbose > 1)
+                               dprintk("%s: -->CA_GET_DESCR_INFO Success !\n", __FUNCTION__);
+
+                       break;
+
+               case CA_SET_DESCR:
+                       if (verbose > 1)
+                               dprintk("%s: Setting descrambler\n", __FUNCTION__);
+                       if ((ca_set_slot_descr()) < 0) {
+                               dprintk("%s: -->CA_SET_DESCR Failed !\n", __FUNCTION__);
+                               return -1;
+                       }
+                       if (verbose > 1)
+                               dprintk("%s: -->CA_SET_DESCR Success !\n", __FUNCTION__);
+
+                       break;
+
+               case CA_SET_PID:
+                       if (verbose > 1)
+                               dprintk("%s: Setting PID\n", __FUNCTION__);
+                       if ((ca_set_pid()) < 0) {
+                               dprintk("%s: -->CA_SET_PID Failed !\n", __FUNCTION__);
+                               return -1;
+                       }
+                       if (verbose > 1)
+                               dprintk("%s: -->CA_SET_PID Success !\n", __FUNCTION__);
+
+               default:
+                       return -EOPNOTSUPP;
+               };
+
+       return 0;
+}
+
+static int dst_ca_open(struct inode *inode, struct file *file)
+{
+       if (verbose > 4)
+               dprintk("%s:Device opened [%p]\n", __FUNCTION__, file);
+       try_module_get(THIS_MODULE);
+
+       return 0;
+}
+
+static int dst_ca_release(struct inode *inode, struct file *file)
+{
+       if (verbose > 4)
+               dprintk("%s:Device closed.\n", __FUNCTION__);
+       module_put(THIS_MODULE);
+
+       return 0;
+}
+
+static int dst_ca_read(struct file *file, char __user * buffer, size_t length, loff_t * offset)
+{
+       int bytes_read = 0;
+
+       if (verbose > 4)
+               dprintk("%s:Device read.\n", __FUNCTION__);
+
+       return bytes_read;
+}
+
+static int dst_ca_write(struct file *file, const char __user * buffer, size_t length, loff_t * offset)
+{
+       if (verbose > 4)
+               dprintk("%s:Device write.\n", __FUNCTION__);
+
+       return 0;
+}
+
+static struct file_operations dst_ca_fops = {
+       .owner = THIS_MODULE,
+       .ioctl = (void *)dst_ca_ioctl,
+       .open = dst_ca_open,
+       .release = dst_ca_release,
+       .read = dst_ca_read,
+       .write = dst_ca_write
+};
+
+static struct dvb_device dvbdev_ca = {
+       .priv = NULL,
+       .users = 1,
+       .readers = 1,
+       .writers = 1,
+       .fops = &dst_ca_fops
+};
+
+int dst_ca_attach(struct dst_state *dst, struct dvb_adapter *dvb_adapter)
+{
+       struct dvb_device *dvbdev;
+       if (verbose > 4)
+               dprintk("%s:registering DST-CA device\n", __FUNCTION__);
+       dvb_register_device(dvb_adapter, &dvbdev, &dvbdev_ca, dst, DVB_DEVICE_CA);
+       return 0;
+}
+
+EXPORT_SYMBOL(dst_ca_attach);
+
+MODULE_DESCRIPTION("DST DVB-S/T/C Combo CA driver");
+MODULE_AUTHOR("Manu Abraham");
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/bt8xx/dst_ca.h b/drivers/media/dvb/bt8xx/dst_ca.h
new file mode 100644 (file)
index 0000000..59cd0dd
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+       CA-driver for TwinHan DST Frontend/Card
+
+       Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef _DST_CA_H_
+#define _DST_CA_H_
+
+#define RETRIES                        5
+
+
+#define        CA_APP_INFO_ENQUIRY     0x9f8020
+#define        CA_APP_INFO             0x9f8021
+#define        CA_ENTER_MENU           0x9f8022
+#define CA_INFO_ENQUIRY                0x9f8030
+#define        CA_INFO                 0x9f8031
+#define CA_PMT                 0x9f8032
+#define CA_PMT_REPLY           0x9f8033
+
+#define CA_CLOSE_MMI           0x9f8800
+#define CA_DISPLAY_CONTROL     0x9f8801
+#define CA_DISPLAY_REPLY       0x9f8802
+#define CA_TEXT_LAST           0x9f8803
+#define CA_TEXT_MORE           0x9f8804
+#define CA_KEYPAD_CONTROL      0x9f8805
+#define CA_KEYPRESS            0x9f8806
+
+#define CA_ENQUIRY             0x9f8807
+#define CA_ANSWER              0x9f8808
+#define CA_MENU_LAST           0x9f8809
+#define CA_MENU_MORE           0x9f880a
+#define CA_MENU_ANSWER         0x9f880b
+#define CA_LIST_LAST           0x9f880c
+#define CA_LIST_MORE           0x9f880d
+
+
+struct dst_ca_private {
+       struct dst_state *dst;
+       struct dvb_device *dvbdev;
+};
+
+
+#endif
diff --git a/drivers/media/dvb/bt8xx/dst_common.h b/drivers/media/dvb/bt8xx/dst_common.h
new file mode 100644 (file)
index 0000000..0b3da29
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+       Frontend-driver for TwinHan DST Frontend
+
+       Copyright (C) 2003 Jamie Honan
+       Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef DST_COMMON_H
+#define DST_COMMON_H
+
+#include <linux/dvb/frontend.h>
+#include <linux/device.h>
+#include "bt878.h"
+
+#include "dst_ca.h"
+
+
+#define NO_DELAY               0
+#define LONG_DELAY             1
+#define DEVICE_INIT            2
+
+#define DELAY                  1
+
+#define DST_TYPE_IS_SAT                0
+#define DST_TYPE_IS_TERR       1
+#define DST_TYPE_IS_CABLE      2
+#define DST_TYPE_IS_ATSC       3
+
+#define DST_TYPE_HAS_NEWTUNE   1
+#define DST_TYPE_HAS_TS204     2
+#define DST_TYPE_HAS_SYMDIV    4
+#define DST_TYPE_HAS_FW_1      8
+#define DST_TYPE_HAS_FW_2      16
+#define DST_TYPE_HAS_FW_3      32
+#define DST_TYPE_HAS_FW_BUILD  64
+
+/*     Card capability list    */
+
+#define DST_TYPE_HAS_MAC       1
+#define DST_TYPE_HAS_DISEQC3   2
+#define DST_TYPE_HAS_DISEQC4   4
+#define DST_TYPE_HAS_DISEQC5   8
+#define DST_TYPE_HAS_MOTO      16
+#define DST_TYPE_HAS_CA                32
+#define        DST_TYPE_HAS_ANALOG     64      /*      Analog inputs   */
+#define DST_TYPE_HAS_SESSION   128
+
+
+#define RDC_8820_PIO_0_DISABLE 0
+#define RDC_8820_PIO_0_ENABLE  1
+#define RDC_8820_INT           2
+#define RDC_8820_RESET         4
+
+/*     DST Communication       */
+#define GET_REPLY              1
+#define NO_REPLY               0
+
+#define GET_ACK                        1
+#define FIXED_COMM             8
+
+#define ACK                    0xff
+
+struct dst_state {
+
+       struct i2c_adapter* i2c;
+
+       struct bt878* bt;
+
+       struct dvb_frontend_ops ops;
+
+       /* configuration settings */
+       const struct dst_config* config;
+
+       struct dvb_frontend frontend;
+
+       /* private ASIC data */
+       u8 tx_tuna[10];
+       u8 rx_tuna[10];
+       u8 rxbuffer[10];
+       u8 diseq_flags;
+       u8 dst_type;
+       u32 type_flags;
+       u32 frequency;          /* intermediate frequency in kHz for QPSK */
+       fe_spectral_inversion_t inversion;
+       u32 symbol_rate;        /* symbol rate in Symbols per second */
+       fe_code_rate_t fec;
+       fe_sec_voltage_t voltage;
+       fe_sec_tone_mode_t tone;
+       u32 decode_freq;
+       u8 decode_lock;
+       u16 decode_strength;
+       u16 decode_snr;
+       unsigned long cur_jiff;
+       u8 k22;
+       fe_bandwidth_t bandwidth;
+       u32 dst_hw_cap;
+       u8 dst_fw_version;
+       fe_sec_mini_cmd_t minicmd;
+       u8 messages[256];
+};
+
+struct dst_types {
+       char *device_id;
+       int offset;
+       u8 dst_type;
+       u32 type_flags;
+       u32 dst_feature;
+};
+
+
+
+struct dst_config
+{
+       /* the ASIC i2c address */
+       u8 demod_address;
+};
+
+
+int rdc_reset_state(struct dst_state *state);
+int rdc_8820_reset(struct dst_state *state);
+
+int dst_wait_dst_ready(struct dst_state *state, u8 delay_mode);
+int dst_pio_enable(struct dst_state *state);
+int dst_pio_disable(struct dst_state *state);
+int dst_error_recovery(struct dst_state* state);
+int dst_error_bailout(struct dst_state *state);
+int dst_comm_init(struct dst_state* state);
+
+int write_dst(struct dst_state *state, u8 * data, u8 len);
+int read_dst(struct dst_state *state, u8 * ret, u8 len);
+u8 dst_check_sum(u8 * buf, u32 len);
+struct dst_state* dst_attach(struct dst_state* state, struct dvb_adapter *dvb_adapter);
+int dst_ca_attach(struct dst_state *state, struct dvb_adapter *dvb_adapter);
+int dst_gpio_outb(struct dst_state* state, u32 mask, u32 enbb, u32 outhigh, int delay);
+
+int dst_command(struct dst_state* state, u8 * data, u8 len);
+
+
+#endif // DST_COMMON_H
index 80488aa628b40fb785581d76b967079081202242..3974a4c6ebe75c704dc8d4ed5bb87788d5788362 100644 (file)
@@ -33,4 +33,3 @@ union dst_gpio_packet {
 struct bt878;
 
 int bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *mp);
-
index b735397f59aad475beae62dc744badf5633c0799..6f857c6091f34ecbb9c6e5874e0049a3d5406f1e 100644 (file)
@@ -142,7 +142,7 @@ static int thomson_dtt7579_demod_init(struct dvb_frontend* fe)
        mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg));
 
        mt352_write(fe, mt352_agc_cfg, sizeof(mt352_agc_cfg));
-        mt352_write(fe, mt352_gpp_ctl_cfg, sizeof(mt352_gpp_ctl_cfg));
+       mt352_write(fe, mt352_gpp_ctl_cfg, sizeof(mt352_gpp_ctl_cfg));
        mt352_write(fe, mt352_capt_range_cfg, sizeof(mt352_capt_range_cfg));
 
        return 0;
@@ -161,7 +161,7 @@ static int thomson_dtt7579_pll_set(struct dvb_frontend* fe, struct dvb_frontend_
        else if (params->frequency < 771000000) cp = 0xbc;
        else cp = 0xf4;
 
-        if (params->frequency == 0) bs = 0x03;
+       if (params->frequency == 0) bs = 0x03;
        else if (params->frequency < 443250000) bs = 0x02;
        else bs = 0x08;
 
@@ -190,44 +190,44 @@ static int cx24108_pll_set(struct dvb_frontend* fe, struct dvb_frontend_paramete
 
 
    u32 osci[]={950000,1019000,1075000,1178000,1296000,1432000,
-               1576000,1718000,1856000,2036000,2150000};
+              1576000,1718000,1856000,2036000,2150000};
    u32 bandsel[]={0,0x00020000,0x00040000,0x00100800,0x00101000,
-               0x00102000,0x00104000,0x00108000,0x00110000,
-               0x00120000,0x00140000};
+              0x00102000,0x00104000,0x00108000,0x00110000,
+              0x00120000,0x00140000};
 
 #define XTAL 1011100 /* Hz, really 1.0111 MHz and a /10 prescaler */
-        printk("cx24108 debug: entering SetTunerFreq, freq=%d\n",freq);
-
-        /* This is really the bit driving the tuner chip cx24108 */
-
-        if(freq<950000) freq=950000; /* kHz */
-        if(freq>2150000) freq=2150000; /* satellite IF is 950..2150MHz */
-
-        /* decide which VCO to use for the input frequency */
-        for(i=1;(i<sizeof(osci)/sizeof(osci[0]))&&(osci[i]<freq);i++);
-        printk("cx24108 debug: select vco #%d (f=%d)\n",i,freq);
-        band=bandsel[i];
-        /* the gain values must be set by SetSymbolrate */
-        /* compute the pll divider needed, from Conexant data sheet,
-           resolved for (n*32+a), remember f(vco) is f(receive) *2 or *4,
-           depending on the divider bit. It is set to /4 on the 2 lowest
-           bands  */
-        n=((i<=2?2:1)*freq*10L)/(XTAL/100);
-        a=n%32; n/=32; if(a==0) n--;
-        pump=(freq<(osci[i-1]+osci[i])/2);
-        pll=0xf8000000|
-            ((pump?1:2)<<(14+11))|
-            ((n&0x1ff)<<(5+11))|
-            ((a&0x1f)<<11);
-        /* everything is shifted left 11 bits to left-align the bits in the
-           32bit word. Output to the tuner goes MSB-aligned, after all */
-        printk("cx24108 debug: pump=%d, n=%d, a=%d\n",pump,n,a);
-        cx24110_pll_write(fe,band);
-        /* set vga and vca to their widest-band settings, as a precaution.
-           SetSymbolrate might not be called to set this up */
-        cx24110_pll_write(fe,0x500c0000);
-        cx24110_pll_write(fe,0x83f1f800);
-        cx24110_pll_write(fe,pll);
+       printk("cx24108 debug: entering SetTunerFreq, freq=%d\n",freq);
+
+       /* This is really the bit driving the tuner chip cx24108 */
+
+       if(freq<950000) freq=950000; /* kHz */
+       if(freq>2150000) freq=2150000; /* satellite IF is 950..2150MHz */
+
+       /* decide which VCO to use for the input frequency */
+       for(i=1;(i<sizeof(osci)/sizeof(osci[0]))&&(osci[i]<freq);i++);
+       printk("cx24108 debug: select vco #%d (f=%d)\n",i,freq);
+       band=bandsel[i];
+       /* the gain values must be set by SetSymbolrate */
+       /* compute the pll divider needed, from Conexant data sheet,
+          resolved for (n*32+a), remember f(vco) is f(receive) *2 or *4,
+          depending on the divider bit. It is set to /4 on the 2 lowest
+          bands  */
+       n=((i<=2?2:1)*freq*10L)/(XTAL/100);
+       a=n%32; n/=32; if(a==0) n--;
+       pump=(freq<(osci[i-1]+osci[i])/2);
+       pll=0xf8000000|
+           ((pump?1:2)<<(14+11))|
+           ((n&0x1ff)<<(5+11))|
+           ((a&0x1f)<<11);
+       /* everything is shifted left 11 bits to left-align the bits in the
+          32bit word. Output to the tuner goes MSB-aligned, after all */
+       printk("cx24108 debug: pump=%d, n=%d, a=%d\n",pump,n,a);
+       cx24110_pll_write(fe,band);
+       /* set vga and vca to their widest-band settings, as a precaution.
+          SetSymbolrate might not be called to set this up */
+       cx24110_pll_write(fe,0x500c0000);
+       cx24110_pll_write(fe,0x83f1f800);
+       cx24110_pll_write(fe,pll);
 /*        writereg(client,0x56,0x7f);*/
 
        return 0;
@@ -299,7 +299,7 @@ static int advbt771_samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe)
        static u8 mt352_reset [] = { 0x50, 0x80 };
        static u8 mt352_adc_ctl_1_cfg [] = { 0x8E, 0x40 };
        static u8 mt352_agc_cfg [] = { 0x67, 0x10, 0x23, 0x00, 0xFF, 0xFF,
-                                      0x00, 0xFF, 0x00, 0x40, 0x40 };
+                                      0x00, 0xFF, 0x00, 0x40, 0x40 };
        static u8 mt352_av771_extra[] = { 0xB5, 0x7A };
        static u8 mt352_capt_range_cfg[] = { 0x75, 0x32 };
 
@@ -463,6 +463,9 @@ static struct nxt6000_config vp3021_alps_tded4_config = {
 
 static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
 {
+       int ret;
+       struct dst_state* state = NULL;
+
        switch(type) {
 #ifdef BTTV_DVICO_DVBT_LITE
        case BTTV_DVICO_DVBT_LITE:
@@ -503,7 +506,25 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
                break;
 
        case BTTV_TWINHAN_DST:
-               card->fe = dst_attach(&dst_config, card->i2c_adapter, card->bt);
+               /*      DST is not a frontend driver !!!                */
+               state = (struct dst_state *) kmalloc(sizeof (struct dst_state), GFP_KERNEL);
+               /*      Setup the Card                                  */
+               state->config = &dst_config;
+               state->i2c = card->i2c_adapter;
+               state->bt = card->bt;
+
+               /*      DST is not a frontend, attaching the ASIC       */
+               if ((dst_attach(state, &card->dvb_adapter)) == NULL) {
+                       printk("%s: Could not find a Twinhan DST.\n", __FUNCTION__);
+                       break;
+               }
+               card->fe = &state->frontend;
+
+               /*      Attach other DST peripherals if any             */
+               /*      Conditional Access device                       */
+               if (state->dst_hw_cap & DST_TYPE_HAS_CA) {
+                       ret = dst_ca_attach(state, &card->dvb_adapter);
+               }
                if (card->fe != NULL) {
                        break;
                }
@@ -531,7 +552,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
                       card->bt->dev->subsystem_vendor,
                       card->bt->dev->subsystem_device);
        } else {
-               if (dvb_register_frontend(card->dvb_adapter, card->fe)) {
+               if (dvb_register_frontend(&card->dvb_adapter, card->fe)) {
                        printk("dvb-bt8xx: Frontend registration failed!\n");
                        if (card->fe->ops->release)
                                card->fe->ops->release(card->fe);
@@ -550,7 +571,7 @@ static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
                return result;
 
        }
-       card->dvb_adapter->priv = card;
+       card->dvb_adapter.priv = card;
 
        card->bt->adapter = card->i2c_adapter;
 
@@ -568,7 +589,7 @@ static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
        if ((result = dvb_dmx_init(&card->demux)) < 0) {
                printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
 
-               dvb_unregister_adapter(card->dvb_adapter);
+               dvb_unregister_adapter(&card->dvb_adapter);
                return result;
        }
 
@@ -576,11 +597,11 @@ static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
        card->dmxdev.demux = &card->demux.dmx;
        card->dmxdev.capabilities = 0;
 
-       if ((result = dvb_dmxdev_init(&card->dmxdev, card->dvb_adapter)) < 0) {
+       if ((result = dvb_dmxdev_init(&card->dmxdev, &card->dvb_adapter)) < 0) {
                printk("dvb_bt8xx: dvb_dmxdev_init failed (errno = %d)\n", result);
 
                dvb_dmx_release(&card->demux);
-               dvb_unregister_adapter(card->dvb_adapter);
+               dvb_unregister_adapter(&card->dvb_adapter);
                return result;
        }
 
@@ -591,7 +612,7 @@ static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
 
                dvb_dmxdev_release(&card->dmxdev);
                dvb_dmx_release(&card->demux);
-               dvb_unregister_adapter(card->dvb_adapter);
+               dvb_unregister_adapter(&card->dvb_adapter);
                return result;
        }
 
@@ -603,7 +624,7 @@ static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
                card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
                dvb_dmxdev_release(&card->dmxdev);
                dvb_dmx_release(&card->demux);
-               dvb_unregister_adapter(card->dvb_adapter);
+               dvb_unregister_adapter(&card->dvb_adapter);
                return result;
        }
 
@@ -614,11 +635,11 @@ static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
                card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
                dvb_dmxdev_release(&card->dmxdev);
                dvb_dmx_release(&card->demux);
-               dvb_unregister_adapter(card->dvb_adapter);
+               dvb_unregister_adapter(&card->dvb_adapter);
                return result;
        }
 
-       dvb_net_init(card->dvb_adapter, &card->dvbnet, &card->demux.dmx);
+       dvb_net_init(&card->dvb_adapter, &card->dvbnet, &card->demux.dmx);
 
        tasklet_init(&card->bt->tasklet, dvb_bt8xx_task, (unsigned long) card);
 
@@ -648,7 +669,7 @@ static int dvb_bt8xx_probe(struct device *dev)
        case BTTV_PINNACLESAT:
                card->gpio_mode = 0x0400c060;
                /* should be: BT878_A_GAIN=0,BT878_A_PWRDN,BT878_DA_DPM,BT878_DA_SBR,
-                             BT878_DA_IOM=1,BT878_DA_APP to enable serial highspeed mode. */
+                             BT878_DA_IOM=1,BT878_DA_APP to enable serial highspeed mode. */
                card->op_sync_orin = 0;
                card->irq_err_ignore = 0;
                break;
@@ -759,7 +780,7 @@ static int dvb_bt8xx_remove(struct device *dev)
        dvb_dmxdev_release(&card->dmxdev);
        dvb_dmx_release(&card->demux);
        if (card->fe) dvb_unregister_frontend(card->fe);
-       dvb_unregister_adapter(card->dvb_adapter);
+       dvb_unregister_adapter(&card->dvb_adapter);
 
        kfree(card);
 
index 80ef189f930f34cac24662c68b7d7284aaab2466..2923b3b0dd3ce3168d27964d7d78229a80d191fb 100644 (file)
@@ -31,7 +31,7 @@
 #include "bttv.h"
 #include "mt352.h"
 #include "sp887x.h"
-#include "dst.h"
+#include "dst_common.h"
 #include "nxt6000.h"
 #include "cx24110.h"
 #include "or51211.h"
@@ -40,7 +40,7 @@ struct dvb_bt8xx_card {
        struct semaphore lock;
        int nfeeds;
        char card_name[32];
-       struct dvb_adapter *dvb_adapter;
+       struct dvb_adapter dvb_adapter;
        struct bt878 *bt;
        unsigned int bttv_nr;
        struct dvb_demux demux;
index 28d4d926de3e1540ca448eb0b5532ca0838d4ee3..96c57fde95a0da96efd4e16f47c8417837ee7a2c 100644 (file)
@@ -119,7 +119,7 @@ struct cinergyt2 {
        struct dvb_demux demux;
        struct usb_device *udev;
        struct semaphore sem;
-       struct dvb_adapter *adapter;
+       struct dvb_adapter adapter;
        struct dvb_device *fedev;
        struct dmxdev dmxdev;
        struct dvb_net dvbnet;
@@ -813,15 +813,15 @@ static int cinergyt2_probe (struct usb_interface *intf,
        cinergyt2->dmxdev.demux = &cinergyt2->demux.dmx;
        cinergyt2->dmxdev.capabilities = 0;
 
-       if ((err = dvb_dmxdev_init(&cinergyt2->dmxdev, cinergyt2->adapter)) < 0) {
+       if ((err = dvb_dmxdev_init(&cinergyt2->dmxdev, &cinergyt2->adapter)) < 0) {
                dprintk(1, "dvb_dmxdev_init() failed (err = %d)\n", err);
                goto bailout;
        }
 
-       if (dvb_net_init(cinergyt2->adapter, &cinergyt2->dvbnet, &cinergyt2->demux.dmx))
+       if (dvb_net_init(&cinergyt2->adapter, &cinergyt2->dvbnet, &cinergyt2->demux.dmx))
                dprintk(1, "dvb_net_init() failed!\n");
 
-       dvb_register_device(cinergyt2->adapter, &cinergyt2->fedev,
+       dvb_register_device(&cinergyt2->adapter, &cinergyt2->fedev,
                            &cinergyt2_fe_template, cinergyt2,
                            DVB_DEVICE_FRONTEND);
 
@@ -848,7 +848,7 @@ static int cinergyt2_probe (struct usb_interface *intf,
 bailout:
        dvb_dmxdev_release(&cinergyt2->dmxdev);
        dvb_dmx_release(&cinergyt2->demux);
-       dvb_unregister_adapter (cinergyt2->adapter);
+       dvb_unregister_adapter (&cinergyt2->adapter);
        cinergyt2_free_stream_urbs (cinergyt2);
        kfree(cinergyt2);
        return -ENOMEM;
@@ -872,7 +872,7 @@ static void cinergyt2_disconnect (struct usb_interface *intf)
        dvb_dmxdev_release(&cinergyt2->dmxdev);
        dvb_dmx_release(&cinergyt2->demux);
        dvb_unregister_device(cinergyt2->fedev);
-       dvb_unregister_adapter(cinergyt2->adapter);
+       dvb_unregister_adapter(&cinergyt2->adapter);
 
        cinergyt2_free_stream_urbs(cinergyt2);
        up(&cinergyt2->sem);
index 04e54ec093f0b6ea3983b6dfcd2c1ebcefb623bf..400b439e804e991962accef1f01972eb8ca202be 100644 (file)
@@ -131,7 +131,7 @@ int dibusb_dvb_init(struct usb_dibusb *dib)
                deb_info("dvb_register_adapter failed: error %d", ret);
                goto err;
        }
-       dib->adapter->priv = dib;
+       dib->adapter.priv = dib;
        
 /* i2c is done in dibusb_i2c_init */
        
@@ -151,18 +151,18 @@ int dibusb_dvb_init(struct usb_dibusb *dib)
        dib->dmxdev.filternum = dib->demux.filternum;
        dib->dmxdev.demux = &dib->demux.dmx;
        dib->dmxdev.capabilities = 0;
-       if ((ret = dvb_dmxdev_init(&dib->dmxdev, dib->adapter)) < 0) {
+       if ((ret = dvb_dmxdev_init(&dib->dmxdev, &dib->adapter)) < 0) {
                err("dvb_dmxdev_init failed: error %d",ret);
                goto err_dmx_dev;
        }
 
-       dvb_net_init(dib->adapter, &dib->dvb_net, &dib->demux.dmx);
+       dvb_net_init(&dib->adapter, &dib->dvb_net, &dib->demux.dmx);
 
        goto success;
 err_dmx_dev:
        dvb_dmx_release(&dib->demux);
 err_dmx:
-       dvb_unregister_adapter(dib->adapter);
+       dvb_unregister_adapter(&dib->adapter);
 err:
        return ret;
 success:
@@ -179,7 +179,7 @@ int dibusb_dvb_exit(struct usb_dibusb *dib)
                dib->demux.dmx.close(&dib->demux.dmx);
                dvb_dmxdev_release(&dib->dmxdev);
                dvb_dmx_release(&dib->demux);
-               dvb_unregister_adapter(dib->adapter);
+               dvb_unregister_adapter(&dib->adapter);
        }
        return 0;
 }
index 2ed89488c7c49db9a3a0566d38d59344a35a24dd..5a71b88797d9ca0018e505f643e5474f25603110 100644 (file)
@@ -183,7 +183,7 @@ int dibusb_fe_init(struct usb_dibusb* dib)
                       dib->dibdev->name);
                return -ENODEV;
        } else {
-               if (dvb_register_frontend(dib->adapter, dib->fe)) {
+               if (dvb_register_frontend(&dib->adapter, dib->fe)) {
                        err("Frontend registration failed.");
                        if (dib->fe->ops->release)
                                dib->fe->ops->release(dib->fe);
@@ -206,7 +206,7 @@ int dibusb_i2c_init(struct usb_dibusb *dib)
 {
        int ret = 0;
 
-       dib->adapter->priv = dib;
+       dib->adapter.priv = dib;
 
        strncpy(dib->i2c_adap.name,dib->dibdev->name,I2C_NAME_SIZE);
 #ifdef I2C_ADAP_CLASS_TV_DIGITAL
index 52cd35dd9d838e3fe3634f333996de58bc926918..c965b64fb1ab61c37f39f0f8955cbb8d497444cb 100644 (file)
@@ -181,7 +181,7 @@ struct usb_dibusb {
        struct semaphore i2c_sem;
 
        /* dvb */
-       struct dvb_adapter *adapter;
+       struct dvb_adapter adapter;
        struct dmxdev dmxdev;
        struct dvb_demux demux;
        struct dvb_net dvb_net;
index 1863f1dfb00c54f2d7772161b537573c057cefe6..c225de7ffd82429f61103839a4657df49a440a3c 100644 (file)
@@ -175,8 +175,8 @@ static inline void dvb_dmxdev_dvr_state_set(struct dmxdev_dvr *dmxdevdvr, int st
 
 static int dvb_dvr_open(struct inode *inode, struct file *file)
 {
-       struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-       struct dmxdev *dmxdev=(struct dmxdev *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dmxdev *dmxdev = dvbdev->priv;
        struct dmx_frontend *front;
 
        dprintk ("function : %s\n", __FUNCTION__);
@@ -224,8 +224,8 @@ static int dvb_dvr_open(struct inode *inode, struct file *file)
 
 static int dvb_dvr_release(struct inode *inode, struct file *file)
 {
-       struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-       struct dmxdev *dmxdev=(struct dmxdev *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dmxdev *dmxdev = dvbdev->priv;
 
        if (down_interruptible (&dmxdev->mutex))
                return -ERESTARTSYS;
@@ -252,8 +252,8 @@ static int dvb_dvr_release(struct inode *inode, struct file *file)
 static ssize_t dvb_dvr_write(struct file *file, const char __user *buf,
                size_t count, loff_t *ppos)
 {
-       struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-       struct dmxdev *dmxdev=(struct dmxdev *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dmxdev *dmxdev = dvbdev->priv;
        int ret;
 
        if (!dmxdev->demux->write)
@@ -270,8 +270,8 @@ static ssize_t dvb_dvr_write(struct file *file, const char __user *buf,
 static ssize_t dvb_dvr_read(struct file *file, char __user *buf, size_t count,
                loff_t *ppos)
 {
-       struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-       struct dmxdev *dmxdev=(struct dmxdev *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dmxdev *dmxdev = dvbdev->priv;
        int ret;
 
        //down(&dmxdev->mutex);
@@ -345,7 +345,7 @@ static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len,
                            const u8 *buffer2, size_t buffer2_len,
                            struct dmx_section_filter *filter, enum dmx_success success)
 {
-       struct dmxdev_filter *dmxdevfilter=(struct dmxdev_filter *) filter->priv;
+       struct dmxdev_filter *dmxdevfilter = filter->priv;
        int ret;
 
        if (dmxdevfilter->buffer.error) {
@@ -381,7 +381,7 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len,
                       const u8 *buffer2, size_t buffer2_len,
                       struct dmx_ts_feed *feed, enum dmx_success success)
 {
-       struct dmxdev_filter *dmxdevfilter=(struct dmxdev_filter *) feed->priv;
+       struct dmxdev_filter *dmxdevfilter = feed->priv;
        struct dmxdev_buffer *buffer;
        int ret;
 
@@ -684,8 +684,8 @@ static int dvb_dmxdev_filter_start(struct dmxdev_filter *filter)
 
 static int dvb_demux_open(struct inode *inode, struct file *file)
 {
-       struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-       struct dmxdev *dmxdev=(struct dmxdev *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dmxdev *dmxdev = dvbdev->priv;
        int i;
        struct dmxdev_filter *dmxdevfilter;
 
@@ -1013,8 +1013,8 @@ static struct dvb_device dvbdev_demux = {
 static int dvb_dvr_do_ioctl(struct inode *inode, struct file *file,
                     unsigned int cmd, void *parg)
 {
-       struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-       struct dmxdev *dmxdev=(struct dmxdev *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dmxdev *dmxdev = dvbdev->priv;
 
        int ret=0;
 
@@ -1044,8 +1044,8 @@ static int dvb_dvr_ioctl(struct inode *inode, struct file *file,
 
 static unsigned int dvb_dvr_poll (struct file *file, poll_table *wait)
 {
-       struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
-       struct dmxdev *dmxdev = (struct dmxdev *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dmxdev *dmxdev = dvbdev->priv;
        unsigned int mask = 0;
 
        dprintk ("function : %s\n", __FUNCTION__);
index c1ea89f2880ceddf85ea853acaff4b4b5e04c380..0eb9aa711fb0335f44cce5d96faca15de40eb75d 100644 (file)
@@ -829,7 +829,7 @@ EXPORT_SYMBOL(dvb_ca_en50221_camready_irq);
  */
 void dvb_ca_en50221_camchange_irq(struct dvb_ca_en50221 *pubca, int slot, int change_type)
 {
-       struct dvb_ca_private *ca = (struct dvb_ca_private *) pubca->private;
+       struct dvb_ca_private *ca = pubca->private;
 
        dprintk("CAMCHANGE IRQ slot:%i change_type:%i\n", slot, change_type);
 
@@ -857,7 +857,7 @@ EXPORT_SYMBOL(dvb_ca_en50221_frda_irq);
  */
 void dvb_ca_en50221_camready_irq(struct dvb_ca_en50221 *pubca, int slot)
 {
-       struct dvb_ca_private *ca = (struct dvb_ca_private *) pubca->private;
+       struct dvb_ca_private *ca = pubca->private;
 
        dprintk("CAMREADY IRQ slot:%i\n", slot);
 
@@ -876,7 +876,7 @@ void dvb_ca_en50221_camready_irq(struct dvb_ca_en50221 *pubca, int slot)
  */
 void dvb_ca_en50221_frda_irq(struct dvb_ca_en50221 *pubca, int slot)
 {
-       struct dvb_ca_private *ca = (struct dvb_ca_private *) pubca->private;
+       struct dvb_ca_private *ca = pubca->private;
        int flags;
 
        dprintk("FR/DA IRQ slot:%i\n", slot);
@@ -993,7 +993,7 @@ static void dvb_ca_en50221_thread_update_delay(struct dvb_ca_private *ca)
  */
 static int dvb_ca_en50221_thread(void *data)
 {
-       struct dvb_ca_private *ca = (struct dvb_ca_private *) data;
+       struct dvb_ca_private *ca = data;
        char name[15];
        int slot;
        int flags;
@@ -1202,8 +1202,8 @@ static int dvb_ca_en50221_thread(void *data)
 static int dvb_ca_en50221_io_do_ioctl(struct inode *inode, struct file *file,
                                      unsigned int cmd, void *parg)
 {
-       struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
-       struct dvb_ca_private *ca = (struct dvb_ca_private *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dvb_ca_private *ca = dvbdev->priv;
        int err = 0;
        int slot;
 
@@ -1225,7 +1225,7 @@ static int dvb_ca_en50221_io_do_ioctl(struct inode *inode, struct file *file,
                break;
 
        case CA_GET_CAP: {
-               struct ca_caps *caps = (struct ca_caps *) parg;
+               struct ca_caps *caps = parg;
 
                caps->slot_num = ca->slot_count;
                caps->slot_type = CA_CI_LINK;
@@ -1235,7 +1235,7 @@ static int dvb_ca_en50221_io_do_ioctl(struct inode *inode, struct file *file,
        }
 
        case CA_GET_SLOT_INFO: {
-               struct ca_slot_info *info = (struct ca_slot_info *) parg;
+               struct ca_slot_info *info = parg;
 
                if ((info->num > ca->slot_count) || (info->num < 0))
                        return -EINVAL;
@@ -1291,8 +1291,8 @@ static int dvb_ca_en50221_io_ioctl(struct inode *inode, struct file *file,
 static ssize_t dvb_ca_en50221_io_write(struct file *file,
                                       const char __user * buf, size_t count, loff_t * ppos)
 {
-       struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
-       struct dvb_ca_private *ca = (struct dvb_ca_private *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dvb_ca_private *ca = dvbdev->priv;
        u8 slot, connection_id;
        int status;
        char fragbuf[HOST_LINK_BUF_SIZE];
@@ -1428,8 +1428,8 @@ static int dvb_ca_en50221_io_read_condition(struct dvb_ca_private *ca, int *resu
 static ssize_t dvb_ca_en50221_io_read(struct file *file, char __user * buf,
                                      size_t count, loff_t * ppos)
 {
-       struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
-       struct dvb_ca_private *ca = (struct dvb_ca_private *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dvb_ca_private *ca = dvbdev->priv;
        int status;
        int result = 0;
        u8 hdr[2];
@@ -1526,8 +1526,8 @@ static ssize_t dvb_ca_en50221_io_read(struct file *file, char __user * buf,
  */
 static int dvb_ca_en50221_io_open(struct inode *inode, struct file *file)
 {
-       struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
-       struct dvb_ca_private *ca = (struct dvb_ca_private *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dvb_ca_private *ca = dvbdev->priv;
        int err;
        int i;
 
@@ -1569,8 +1569,8 @@ static int dvb_ca_en50221_io_open(struct inode *inode, struct file *file)
  */
 static int dvb_ca_en50221_io_release(struct inode *inode, struct file *file)
 {
-       struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
-       struct dvb_ca_private *ca = (struct dvb_ca_private *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dvb_ca_private *ca = dvbdev->priv;
        int err = 0;
 
        dprintk("%s\n", __FUNCTION__);
@@ -1597,8 +1597,8 @@ static int dvb_ca_en50221_io_release(struct inode *inode, struct file *file)
  */
 static unsigned int dvb_ca_en50221_io_poll(struct file *file, poll_table * wait)
 {
-       struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
-       struct dvb_ca_private *ca = (struct dvb_ca_private *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dvb_ca_private *ca = dvbdev->priv;
        unsigned int mask = 0;
        int slot;
        int result = 0;
@@ -1750,7 +1750,7 @@ EXPORT_SYMBOL(dvb_ca_en50221_release);
  */
 void dvb_ca_en50221_release(struct dvb_ca_en50221 *pubca)
 {
-       struct dvb_ca_private *ca = (struct dvb_ca_private *) pubca->private;
+       struct dvb_ca_private *ca = pubca->private;
        int i;
 
        dprintk("%s\n", __FUNCTION__);
index 59a9adfae1ebc909120ea148f3f5593671f7862f..d19301d90a09937a481ef21666096aa121ebf575 100644 (file)
@@ -48,7 +48,7 @@ static int dvb_override_tune_delay;
 static int dvb_powerdown_on_sleep = 1;
 
 module_param_named(frontend_debug, dvb_frontend_debug, int, 0644);
-MODULE_PARM_DESC(dvb_frontend_debug, "Turn on/off frontend core debugging (default:off).");
+MODULE_PARM_DESC(frontend_debug, "Turn on/off frontend core debugging (default:off).");
 module_param(dvb_shutdown_timeout, int, 0444);
 MODULE_PARM_DESC(dvb_shutdown_timeout, "wait <shutdown_timeout> seconds after close() before suspending hardware");
 module_param(dvb_force_auto_inversion, int, 0444);
@@ -117,7 +117,7 @@ struct dvb_frontend_private {
 
 static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status)
 {
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
        struct dvb_fe_events *events = &fepriv->events;
        struct dvb_frontend_event *e;
        int wp;
@@ -155,7 +155,7 @@ static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status)
 static int dvb_frontend_get_event(struct dvb_frontend *fe,
                            struct dvb_frontend_event *event, int flags)
 {
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
        struct dvb_fe_events *events = &fepriv->events;
 
        dprintk ("%s\n", __FUNCTION__);
@@ -234,7 +234,7 @@ static int dvb_frontend_autotune(struct dvb_frontend *fe, int check_wrapped)
 {
        int autoinversion;
        int ready = 0;
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
        int original_inversion = fepriv->parameters.inversion;
        u32 original_frequency = fepriv->parameters.frequency;
 
@@ -321,7 +321,7 @@ static int dvb_frontend_autotune(struct dvb_frontend *fe, int check_wrapped)
 
 static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
 {
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
 
        if (fepriv->exit)
                return 1;
@@ -335,7 +335,7 @@ static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
 
 static int dvb_frontend_should_wakeup(struct dvb_frontend *fe)
 {
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
 
        if (fepriv->wakeup) {
                fepriv->wakeup = 0;
@@ -346,7 +346,7 @@ static int dvb_frontend_should_wakeup(struct dvb_frontend *fe)
 
 static void dvb_frontend_wakeup(struct dvb_frontend *fe)
 {
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
 
        fepriv->wakeup = 1;
        wake_up_interruptible(&fepriv->wait_queue);
@@ -357,8 +357,8 @@ static void dvb_frontend_wakeup(struct dvb_frontend *fe)
  */
 static int dvb_frontend_thread(void *data)
 {
-       struct dvb_frontend *fe = (struct dvb_frontend *) data;
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend *fe = data;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
        unsigned long timeout;
        char name [15];
        int quality = 0, delay = 3*HZ;
@@ -520,7 +520,7 @@ static int dvb_frontend_thread(void *data)
 static void dvb_frontend_stop(struct dvb_frontend *fe)
 {
        unsigned long ret;
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
 
        dprintk ("%s\n", __FUNCTION__);
 
@@ -559,7 +559,7 @@ static void dvb_frontend_stop(struct dvb_frontend *fe)
 static int dvb_frontend_start(struct dvb_frontend *fe)
 {
        int ret;
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
 
        dprintk ("%s\n", __FUNCTION__);
 
@@ -597,7 +597,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
 {
        struct dvb_device *dvbdev = file->private_data;
        struct dvb_frontend *fe = dvbdev->priv;
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
        int err = -EOPNOTSUPP;
 
        dprintk ("%s\n", __FUNCTION__);
@@ -615,7 +615,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
 
        switch (cmd) {
        case FE_GET_INFO: {
-               struct dvb_frontend_info* info = (struct dvb_frontend_info*) parg;
+               struct dvb_frontend_info* info = parg;
                memcpy(info, &fe->ops->info, sizeof(struct dvb_frontend_info));
 
                /* Force the CAN_INVERSION_AUTO bit on. If the frontend doesn't
@@ -793,7 +793,7 @@ static unsigned int dvb_frontend_poll(struct file *file, struct poll_table_struc
 {
        struct dvb_device *dvbdev = file->private_data;
        struct dvb_frontend *fe = dvbdev->priv;
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
 
        dprintk ("%s\n", __FUNCTION__);
 
@@ -809,7 +809,7 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
 {
        struct dvb_device *dvbdev = file->private_data;
        struct dvb_frontend *fe = dvbdev->priv;
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
        int ret;
 
        dprintk ("%s\n", __FUNCTION__);
@@ -833,7 +833,7 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
 {
        struct dvb_device *dvbdev = file->private_data;
        struct dvb_frontend *fe = dvbdev->priv;
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
 
        dprintk ("%s\n", __FUNCTION__);
 
@@ -873,7 +873,7 @@ int dvb_register_frontend(struct dvb_adapter* dvb,
                up(&frontend_mutex);
                return -ENOMEM;
        }
-       fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       fepriv = fe->frontend_priv;
        memset(fe->frontend_priv, 0, sizeof(struct dvb_frontend_private));
 
        init_MUTEX (&fepriv->sem);
@@ -897,7 +897,7 @@ EXPORT_SYMBOL(dvb_register_frontend);
 
 int dvb_unregister_frontend(struct dvb_frontend* fe)
 {
-       struct dvb_frontend_private *fepriv = (struct dvb_frontend_private*) fe->frontend_priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
        dprintk ("%s\n", __FUNCTION__);
 
        down (&frontend_mutex);
index 44892e7abd3d1cfdb165b578e564e2f91744fff3..6a968c346a367d9595bfbfc979b8203aebc3051e 100644 (file)
@@ -315,7 +315,7 @@ static inline void reset_ule( struct dvb_net_priv *p )
  */
 static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len )
 {
-       struct dvb_net_priv *priv = (struct dvb_net_priv *)dev->priv;
+       struct dvb_net_priv *priv = dev->priv;
        unsigned long skipped = 0L;
        u8 *ts, *ts_end, *from_where = NULL, ts_remain = 0, how_much = 0, new_ts = 1;
        struct ethhdr *ethh = NULL;
@@ -709,7 +709,7 @@ static int dvb_net_ts_callback(const u8 *buffer1, size_t buffer1_len,
                               const u8 *buffer2, size_t buffer2_len,
                               struct dmx_ts_feed *feed, enum dmx_success success)
 {
-       struct net_device *dev = (struct net_device *)feed->priv;
+       struct net_device *dev = feed->priv;
 
        if (buffer2 != 0)
                printk(KERN_WARNING "buffer2 not 0: %p.\n", buffer2);
@@ -727,6 +727,7 @@ static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
         u8 *eth;
         struct sk_buff *skb;
        struct net_device_stats *stats = &(((struct dvb_net_priv *) dev->priv)->stats);
+       int snap = 0;
 
        /* note: pkt_len includes a 32bit checksum */
        if (pkt_len < 16) {
@@ -750,9 +751,12 @@ static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
                return;
        }
        if (pkt[5] & 0x02) {
-               //FIXME: handle LLC/SNAP
-                stats->rx_dropped++;
-                return;
+               /* handle LLC/SNAP, see rfc-1042 */
+               if (pkt_len < 24 || memcmp(&pkt[12], "\xaa\xaa\x03\0\0\0", 6)) {
+                       stats->rx_dropped++;
+                       return;
+               }
+               snap = 8;
         }
        if (pkt[7]) {
                /* FIXME: assemble datagram from multiple sections */
@@ -762,9 +766,9 @@ static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
        }
 
        /* we have 14 byte ethernet header (ip header follows);
-        * 12 byte MPE header; 4 byte checksum; + 2 byte alignment
+        * 12 byte MPE header; 4 byte checksum; + 2 byte alignment, 8 byte LLC/SNAP
         */
-       if (!(skb = dev_alloc_skb(pkt_len - 4 - 12 + 14 + 2))) {
+       if (!(skb = dev_alloc_skb(pkt_len - 4 - 12 + 14 + 2 - snap))) {
                //printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name);
                stats->rx_dropped++;
                return;
@@ -773,8 +777,8 @@ static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
        skb->dev = dev;
 
        /* copy L3 payload */
-       eth = (u8 *) skb_put(skb, pkt_len - 12 - 4 + 14);
-       memcpy(eth + 14, pkt + 12, pkt_len - 12 - 4);
+       eth = (u8 *) skb_put(skb, pkt_len - 12 - 4 + 14 - snap);
+       memcpy(eth + 14, pkt + 12 + snap, pkt_len - 12 - 4 - snap);
 
        /* create ethernet header: */
         eth[0]=pkt[0x0b];
@@ -786,8 +790,21 @@ static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
 
         eth[6]=eth[7]=eth[8]=eth[9]=eth[10]=eth[11]=0;
 
-       eth[12] = 0x08; /* ETH_P_IP */
-       eth[13] = 0x00;
+       if (snap) {
+               eth[12] = pkt[18];
+               eth[13] = pkt[19];
+       } else {
+               /* protocol numbers are from rfc-1700 or
+                * http://www.iana.org/assignments/ethernet-numbers
+                */
+               if (pkt[12] >> 4 == 6) { /* version field from IP header */
+                       eth[12] = 0x86; /* IPv6 */
+                       eth[13] = 0xdd;
+               } else {
+                       eth[12] = 0x08; /* IPv4 */
+                       eth[13] = 0x00;
+               }
+       }
 
        skb->protocol = dvb_net_eth_type_trans(skb, dev);
 
@@ -801,7 +818,7 @@ static int dvb_net_sec_callback(const u8 *buffer1, size_t buffer1_len,
                 struct dmx_section_filter *filter,
                 enum dmx_success success)
 {
-        struct net_device *dev=(struct net_device *) filter->priv;
+        struct net_device *dev = filter->priv;
 
        /**
         * we rely on the DVB API definition where exactly one complete
@@ -826,7 +843,7 @@ static int dvb_net_filter_sec_set(struct net_device *dev,
                   struct dmx_section_filter **secfilter,
                   u8 *mac, u8 *mac_mask)
 {
-       struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+       struct dvb_net_priv *priv = dev->priv;
        int ret;
 
        *secfilter=NULL;
@@ -870,7 +887,7 @@ static int dvb_net_filter_sec_set(struct net_device *dev,
 static int dvb_net_feed_start(struct net_device *dev)
 {
        int ret, i;
-       struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+       struct dvb_net_priv *priv = dev->priv;
         struct dmx_demux *demux = priv->demux;
         unsigned char *mac = (unsigned char *) dev->dev_addr;
 
@@ -965,7 +982,7 @@ static int dvb_net_feed_start(struct net_device *dev)
 
 static int dvb_net_feed_stop(struct net_device *dev)
 {
-       struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+       struct dvb_net_priv *priv = dev->priv;
        int i;
 
        dprintk("%s\n", __FUNCTION__);
@@ -1016,7 +1033,7 @@ static int dvb_net_feed_stop(struct net_device *dev)
 
 static int dvb_set_mc_filter (struct net_device *dev, struct dev_mc_list *mc)
 {
-       struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+       struct dvb_net_priv *priv = dev->priv;
 
        if (priv->multi_num == DVB_NET_MULTICAST_MAX)
                return -ENOMEM;
@@ -1031,7 +1048,7 @@ static int dvb_set_mc_filter (struct net_device *dev, struct dev_mc_list *mc)
 static void wq_set_multicast_list (void *data)
 {
        struct net_device *dev = data;
-       struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+       struct dvb_net_priv *priv = dev->priv;
 
        dvb_net_feed_stop(dev);
 
@@ -1066,7 +1083,7 @@ static void wq_set_multicast_list (void *data)
 
 static void dvb_net_set_multicast_list (struct net_device *dev)
 {
-       struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+       struct dvb_net_priv *priv = dev->priv;
        schedule_work(&priv->set_multicast_list_wq);
 }
 
@@ -1084,7 +1101,7 @@ static void wq_restart_net_feed (void *data)
 
 static int dvb_net_set_mac (struct net_device *dev, void *p)
 {
-       struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+       struct dvb_net_priv *priv = dev->priv;
        struct sockaddr *addr=p;
 
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
@@ -1098,7 +1115,7 @@ static int dvb_net_set_mac (struct net_device *dev, void *p)
 
 static int dvb_net_open(struct net_device *dev)
 {
-       struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+       struct dvb_net_priv *priv = dev->priv;
 
        priv->in_use++;
        dvb_net_feed_start(dev);
@@ -1108,7 +1125,7 @@ static int dvb_net_open(struct net_device *dev)
 
 static int dvb_net_stop(struct net_device *dev)
 {
-       struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+       struct dvb_net_priv *priv = dev->priv;
 
        priv->in_use--;
         return dvb_net_feed_stop(dev);
@@ -1228,8 +1245,8 @@ static int dvb_net_remove_if(struct dvb_net *dvbnet, unsigned int num)
 static int dvb_net_do_ioctl(struct inode *inode, struct file *file,
                  unsigned int cmd, void *parg)
 {
-       struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
-       struct dvb_net *dvbnet = (struct dvb_net *) dvbdev->priv;
+       struct dvb_device *dvbdev = file->private_data;
+       struct dvb_net *dvbnet = dvbdev->priv;
 
        if (((file->f_flags&O_ACCMODE)==O_RDONLY))
                return -EPERM;
@@ -1237,7 +1254,7 @@ static int dvb_net_do_ioctl(struct inode *inode, struct file *file,
        switch (cmd) {
        case NET_ADD_IF:
        {
-               struct dvb_net_if *dvbnetif=(struct dvb_net_if *)parg;
+               struct dvb_net_if *dvbnetif = parg;
                int result;
 
                if (!capable(CAP_SYS_ADMIN))
@@ -1258,7 +1275,7 @@ static int dvb_net_do_ioctl(struct inode *inode, struct file *file,
        {
                struct net_device *netdev;
                struct dvb_net_priv *priv_data;
-               struct dvb_net_if *dvbnetif=(struct dvb_net_if *)parg;
+               struct dvb_net_if *dvbnetif = parg;
 
                if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
                    !dvbnet->state[dvbnetif->if_num])
@@ -1266,7 +1283,7 @@ static int dvb_net_do_ioctl(struct inode *inode, struct file *file,
 
                netdev = dvbnet->device[dvbnetif->if_num];
 
-               priv_data=(struct dvb_net_priv*)netdev->priv;
+               priv_data = netdev->priv;
                dvbnetif->pid=priv_data->pid;
                dvbnetif->feedtype=priv_data->feedtype;
                break;
@@ -1288,7 +1305,7 @@ static int dvb_net_do_ioctl(struct inode *inode, struct file *file,
        /* binary compatiblity cruft */
        case __NET_ADD_IF_OLD:
        {
-               struct __dvb_net_if_old *dvbnetif=(struct __dvb_net_if_old *)parg;
+               struct __dvb_net_if_old *dvbnetif = parg;
                int result;
 
                if (!capable(CAP_SYS_ADMIN))
@@ -1309,7 +1326,7 @@ static int dvb_net_do_ioctl(struct inode *inode, struct file *file,
        {
                struct net_device *netdev;
                struct dvb_net_priv *priv_data;
-               struct __dvb_net_if_old *dvbnetif=(struct __dvb_net_if_old *)parg;
+               struct __dvb_net_if_old *dvbnetif = parg;
 
                if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
                    !dvbnet->state[dvbnetif->if_num])
@@ -1317,7 +1334,7 @@ static int dvb_net_do_ioctl(struct inode *inode, struct file *file,
 
                netdev = dvbnet->device[dvbnetif->if_num];
 
-               priv_data=(struct dvb_net_priv*)netdev->priv;
+               priv_data = netdev->priv;
                dvbnetif->pid=priv_data->pid;
                break;
        }
index cf4ffe38fda375cf3ba3b2998cb2a42798fc7f81..4b7adca3e286d2e5d2707a5795c895d0a59de82e 100644 (file)
@@ -56,8 +56,7 @@ static const char * const dnames[] = {
 #define nums2minor(num,type,id)        ((num << 6) | (id << 4) | type)
 #define MAX_DVB_MINORS         (DVB_MAX_ADAPTERS*64)
 
-struct class_simple *dvb_class;
-EXPORT_SYMBOL(dvb_class);
+static struct class *dvb_class;
 
 static struct dvb_device* dvbdev_find_device (int minor)
 {
@@ -236,8 +235,8 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
                        S_IFCHR | S_IRUSR | S_IWUSR,
                        "dvb/adapter%d/%s%d", adap->num, dnames[type], id);
 
-       class_simple_device_add(dvb_class, MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)),
-                               NULL, "dvb%d.%s%d", adap->num, dnames[type], id);
+       class_device_create(dvb_class, MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)),
+                           NULL, "dvb%d.%s%d", adap->num, dnames[type], id);
 
        dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
                adap->num, dnames[type], id, nums2minor(adap->num, type, id),
@@ -256,7 +255,7 @@ void dvb_unregister_device(struct dvb_device *dvbdev)
        devfs_remove("dvb/adapter%d/%s%d", dvbdev->adapter->num,
                        dnames[dvbdev->type], dvbdev->id);
 
-       class_simple_device_remove(MKDEV(DVB_MAJOR, nums2minor(dvbdev->adapter->num,
+       class_device_destroy(dvb_class, MKDEV(DVB_MAJOR, nums2minor(dvbdev->adapter->num,
                                        dvbdev->type, dvbdev->id)));
 
        list_del (&dvbdev->list_head);
@@ -286,9 +285,8 @@ skip:
 }
 
 
-int dvb_register_adapter(struct dvb_adapter **padap, const char *name, struct module *module)
+int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct module *module)
 {
-       struct dvb_adapter *adap;
        int num;
 
        if (down_interruptible (&dvbdev_register_lock))
@@ -299,11 +297,6 @@ int dvb_register_adapter(struct dvb_adapter **padap, const char *name, struct mo
                return -ENFILE;
        }
 
-       if (!(*padap = adap = kmalloc(sizeof(struct dvb_adapter), GFP_KERNEL))) {
-               up(&dvbdev_register_lock);
-               return -ENOMEM;
-       }
-
        memset (adap, 0, sizeof(struct dvb_adapter));
        INIT_LIST_HEAD (&adap->device_list);
 
@@ -331,7 +324,6 @@ int dvb_unregister_adapter(struct dvb_adapter *adap)
                return -ERESTARTSYS;
        list_del (&adap->list_head);
        up (&dvbdev_register_lock);
-       kfree (adap);
        return 0;
 }
 EXPORT_SYMBOL(dvb_unregister_adapter);
@@ -419,7 +411,7 @@ static int __init init_dvbdev(void)
 
        devfs_mk_dir("dvb");
 
-       dvb_class = class_simple_create(THIS_MODULE, "dvb");
+       dvb_class = class_create(THIS_MODULE, "dvb");
        if (IS_ERR(dvb_class)) {
                retval = PTR_ERR(dvb_class);
                goto error;
@@ -436,7 +428,7 @@ error:
 static void __exit exit_dvbdev(void)
 {
         devfs_remove("dvb");
-       class_simple_destroy(dvb_class);
+       class_destroy(dvb_class);
        cdev_del(&dvb_device_cdev);
         unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
 }
index 184edba3caa7121b64763f93102bd1515f3d31a4..a251867f30f1cfde7cb3523a1eb2a2f9ba36fa7d 100644 (file)
@@ -76,7 +76,7 @@ struct dvb_device {
 };
 
 
-extern int dvb_register_adapter (struct dvb_adapter **padap, const char *name, struct module *module);
+extern int dvb_register_adapter (struct dvb_adapter *adap, const char *name, struct module *module);
 extern int dvb_unregister_adapter (struct dvb_adapter *adap);
 
 extern int dvb_register_device (struct dvb_adapter *adap,
index 0bfd4df17d08d4775a58539e74a22c52892e35a6..75fb556ec01fe32b99d4f7c06d4ea50de758646d 100644 (file)
@@ -12,10 +12,10 @@ config DVB_STV0299
 
 config DVB_CX24110
        tristate "Conexant CX24110 based"
-       depends on DVB_CORE
-       help
+       depends on DVB_CORE
+       help
          A DVB-S tuner module. Say Y when you want to support this frontend.
+
 config DVB_TDA8083
        tristate "Philips TDA8083 based"
        depends on DVB_CORE
@@ -127,8 +127,8 @@ comment "DVB-C (cable) frontends"
 config DVB_ATMEL_AT76C651
        tristate "Atmel AT76C651 based"
        depends on DVB_CORE
-        help
-         A DVB-C tuner module. Say Y when you want to support this frontend.
+       help
+         A DVB-C tuner module. Say Y when you want to support this frontend.
 
 config DVB_VES1820
        tristate "VLSI VES1820 based"
@@ -158,10 +158,6 @@ config DVB_NXT2002
        help
          An ATSC 8VSB tuner module. Say Y when you want to support this frontend.
 
-config DVB_OR51132
-       tristate "OR51132 based (pcHDTV)"
-       depends on DVB_CORE
-
 config DVB_OR51211
        tristate "or51211 based (pcHDTV HD2000 card)"
        depends on DVB_CORE
@@ -169,4 +165,12 @@ config DVB_OR51211
        help
          An ATSC 8VSB tuner module. Say Y when you want to support this frontend.
 
+config DVB_OR51132
+       tristate "OR51132 based (pcHDTV HD3000 card)"
+       depends on DVB_CORE
+       select FW_LOADER
+       help
+         An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want
+         to support this frontend.
+
 endmenu
index ce2eaa1640e87b5cabd8254f0f4126e7f01bba82..72a2b5455b0bfd46873e84eb4ec942547f4f28fa 100644 (file)
@@ -259,7 +259,7 @@ static int at76c651_set_parameters(struct dvb_frontend* fe,
                                   struct dvb_frontend_parameters *p)
 {
        int ret;
-       struct at76c651_state* state = (struct at76c651_state*) fe->demodulator_priv;
+       struct at76c651_state* state = fe->demodulator_priv;
 
        at76c651_writereg(state, 0x0c, 0xc3);
        state->config->pll_set(fe, p);
@@ -276,7 +276,7 @@ static int at76c651_set_parameters(struct dvb_frontend* fe,
 
 static int at76c651_set_defaults(struct dvb_frontend* fe)
 {
-       struct at76c651_state* state = (struct at76c651_state*) fe->demodulator_priv;
+       struct at76c651_state* state = fe->demodulator_priv;
 
        at76c651_set_symbol_rate(state, 6900000);
        at76c651_set_qam(state, QAM_64);
@@ -294,7 +294,7 @@ static int at76c651_set_defaults(struct dvb_frontend* fe)
 
 static int at76c651_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct at76c651_state* state = (struct at76c651_state*) fe->demodulator_priv;
+       struct at76c651_state* state = fe->demodulator_priv;
        u8 sync;
 
        /*
@@ -319,7 +319,7 @@ static int at76c651_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int at76c651_read_ber(struct dvb_frontend* fe, u32* ber)
 {
-       struct at76c651_state* state = (struct at76c651_state*) fe->demodulator_priv;
+       struct at76c651_state* state = fe->demodulator_priv;
 
        *ber = (at76c651_readreg(state, 0x81) & 0x0F) << 16;
        *ber |= at76c651_readreg(state, 0x82) << 8;
@@ -331,7 +331,7 @@ static int at76c651_read_ber(struct dvb_frontend* fe, u32* ber)
 
 static int at76c651_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 {
-       struct at76c651_state* state = (struct at76c651_state*) fe->demodulator_priv;
+       struct at76c651_state* state = fe->demodulator_priv;
 
        u8 gain = ~at76c651_readreg(state, 0x91);
        *strength = (gain << 8) | gain;
@@ -341,7 +341,7 @@ static int at76c651_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 
 static int at76c651_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct at76c651_state* state = (struct at76c651_state*) fe->demodulator_priv;
+       struct at76c651_state* state = fe->demodulator_priv;
 
        *snr = 0xFFFF -
            ((at76c651_readreg(state, 0x8F) << 8) |
@@ -352,7 +352,7 @@ static int at76c651_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int at76c651_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct at76c651_state* state = (struct at76c651_state*) fe->demodulator_priv;
+       struct at76c651_state* state = fe->demodulator_priv;
 
        *ucblocks = at76c651_readreg(state, 0x82);
 
@@ -369,7 +369,7 @@ static int at76c651_get_tune_settings(struct dvb_frontend* fe, struct dvb_fronte
 
 static void at76c651_release(struct dvb_frontend* fe)
 {
-       struct at76c651_state* state = (struct at76c651_state*) fe->demodulator_priv;
+       struct at76c651_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -381,7 +381,7 @@ struct dvb_frontend* at76c651_attach(const struct at76c651_config* config,
        struct at76c651_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct at76c651_state*) kmalloc(sizeof(struct at76c651_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct at76c651_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
index a212279042b8f225454191ad8e0e637002932fb5..0c2ed44386189224518863fb8a28a3e0de5ba8de 100644 (file)
@@ -232,7 +232,7 @@ static int cx22700_get_tps (struct cx22700_state* state, struct dvb_ofdm_paramet
 
 static int cx22700_init (struct dvb_frontend* fe)
 
-{      struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+{      struct cx22700_state* state = fe->demodulator_priv;
        int i;
 
        dprintk("cx22700_init: init chip\n");
@@ -258,7 +258,7 @@ static int cx22700_init (struct dvb_frontend* fe)
 
 static int cx22700_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
 
        u16 rs_ber = (cx22700_readreg (state, 0x0d) << 9)
                   | (cx22700_readreg (state, 0x0e) << 1);
@@ -286,7 +286,7 @@ static int cx22700_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int cx22700_read_ber(struct dvb_frontend* fe, u32* ber)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
 
        *ber = cx22700_readreg (state, 0x0c) & 0x7f;
        cx22700_writereg (state, 0x0c, 0x00);
@@ -296,7 +296,7 @@ static int cx22700_read_ber(struct dvb_frontend* fe, u32* ber)
 
 static int cx22700_read_signal_strength(struct dvb_frontend* fe, u16* signal_strength)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
 
        u16 rs_ber = (cx22700_readreg (state, 0x0d) << 9)
                   | (cx22700_readreg (state, 0x0e) << 1);
@@ -307,7 +307,7 @@ static int cx22700_read_signal_strength(struct dvb_frontend* fe, u16* signal_str
 
 static int cx22700_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
 
        u16 rs_ber = (cx22700_readreg (state, 0x0d) << 9)
                   | (cx22700_readreg (state, 0x0e) << 1);
@@ -318,7 +318,7 @@ static int cx22700_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int cx22700_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
 
        *ucblocks = cx22700_readreg (state, 0x0f);
        cx22700_writereg (state, 0x0f, 0x00);
@@ -328,7 +328,7 @@ static int cx22700_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 static int cx22700_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
 
        cx22700_writereg (state, 0x00, 0x02); /* XXX CHECKME: soft reset*/
        cx22700_writereg (state, 0x00, 0x00);
@@ -346,7 +346,7 @@ static int cx22700_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int cx22700_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
        u8 reg09 = cx22700_readreg (state, 0x09);
 
        p->inversion = reg09 & 0x1 ? INVERSION_ON : INVERSION_OFF;
@@ -363,7 +363,7 @@ static int cx22700_get_tune_settings(struct dvb_frontend* fe, struct dvb_fronten
 
 static void cx22700_release(struct dvb_frontend* fe)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -375,7 +375,7 @@ struct dvb_frontend* cx22700_attach(const struct cx22700_config* config,
        struct cx22700_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct cx22700_state*) kmalloc(sizeof(struct cx22700_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct cx22700_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
index 011860ce36cc8b93894e2876f87c49ef2e12fa87..f4aa44136c7ced10a677e46dbde06cf39a1f9fe2 100644 (file)
@@ -200,7 +200,7 @@ static int cx22702_get_tps (struct cx22702_state *state, struct dvb_ofdm_paramet
 static int cx22702_set_tps (struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
        u8 val;
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
 
        /* set PLL */
         cx22702_writereg (state, 0x0D, cx22702_readreg(state,0x0D) &0xfe);
@@ -338,7 +338,7 @@ static int cx22702_set_tps (struct dvb_frontend* fe, struct dvb_frontend_paramet
 static int cx22702_init (struct dvb_frontend* fe)
 {
        int i;
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
 
        cx22702_writereg (state, 0x00, 0x02);
 
@@ -360,7 +360,7 @@ static int cx22702_init (struct dvb_frontend* fe)
 
 static int cx22702_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
        u8 reg0A;
        u8 reg23;
 
@@ -389,7 +389,7 @@ static int cx22702_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int cx22702_read_ber(struct dvb_frontend* fe, u32* ber)
 {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
 
        if(cx22702_readreg (state, 0xE4) & 0x02) {
                /* Realtime statistics */
@@ -406,7 +406,7 @@ static int cx22702_read_ber(struct dvb_frontend* fe, u32* ber)
 
 static int cx22702_read_signal_strength(struct dvb_frontend* fe, u16* signal_strength)
 {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
 
        *signal_strength = cx22702_readreg (state, 0x23);
 
@@ -415,7 +415,7 @@ static int cx22702_read_signal_strength(struct dvb_frontend* fe, u16* signal_str
 
 static int cx22702_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
 
        u16 rs_ber=0;
        if(cx22702_readreg (state, 0xE4) & 0x02) {
@@ -434,7 +434,7 @@ static int cx22702_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int cx22702_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
 
        u8 _ucblocks;
 
@@ -449,7 +449,7 @@ static int cx22702_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 static int cx22702_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
 
        u8 reg0C = cx22702_readreg (state, 0x0C);
 
@@ -459,7 +459,7 @@ static int cx22702_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static void cx22702_release(struct dvb_frontend* fe)
 {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -471,7 +471,7 @@ struct dvb_frontend* cx22702_attach(const struct cx22702_config* config,
        struct cx22702_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct cx22702_state*) kmalloc(sizeof(struct cx22702_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct cx22702_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
index ae16112a06535b0f7a52b1792f022f47fdc5bfbd..8222b88cb4868fdc8f5dd1ad2abb325c9b4e5a9b 100644 (file)
@@ -315,7 +315,7 @@ dprintk("cx24110 debug: entering %s(%d)\n",__FUNCTION__,srate);
 
 int cx24110_pll_write (struct dvb_frontend* fe, u32 data)
 {
-       struct cx24110_state *state = (struct cx24110_state*) fe->demodulator_priv;
+       struct cx24110_state *state = fe->demodulator_priv;
 
 /* tuner data is 21 bits long, must be left-aligned in data */
 /* tuner cx24108 is written through a dedicated 3wire interface on the demod chip */
@@ -356,7 +356,7 @@ int cx24110_pll_write (struct dvb_frontend* fe, u32 data)
 
 static int cx24110_initfe(struct dvb_frontend* fe)
 {
-       struct cx24110_state *state = (struct cx24110_state*) fe->demodulator_priv;
+       struct cx24110_state *state = fe->demodulator_priv;
 /* fixme (low): error handling */
         int i;
 
@@ -373,7 +373,7 @@ static int cx24110_initfe(struct dvb_frontend* fe)
 
 static int cx24110_set_voltage (struct dvb_frontend* fe, fe_sec_voltage_t voltage)
 {
-       struct cx24110_state *state = (struct cx24110_state*) fe->demodulator_priv;
+       struct cx24110_state *state = fe->demodulator_priv;
 
        switch (voltage) {
        case SEC_VOLTAGE_13:
@@ -385,8 +385,7 @@ static int cx24110_set_voltage (struct dvb_frontend* fe, fe_sec_voltage_t voltag
        };
 }
 
-static int cx24110_diseqc_send_burst(struct dvb_frontend* fe,
-                       fe_sec_mini_cmd_t burst)
+static int cx24110_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t burst)
 {
        int rv, bit, i;
        struct cx24110_state *state = fe->demodulator_priv;
@@ -413,7 +412,7 @@ static int cx24110_send_diseqc_msg(struct dvb_frontend* fe,
                                   struct dvb_diseqc_master_cmd *cmd)
 {
        int i, rv;
-       struct cx24110_state *state = (struct cx24110_state*) fe->demodulator_priv;
+       struct cx24110_state *state = fe->demodulator_priv;
 
        for (i = 0; i < cmd->msg_len; i++)
                cx24110_writereg(state, 0x79 + i, cmd->msg[i]);
@@ -432,7 +431,7 @@ static int cx24110_send_diseqc_msg(struct dvb_frontend* fe,
 
 static int cx24110_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct cx24110_state *state = (struct cx24110_state*) fe->demodulator_priv;
+       struct cx24110_state *state = fe->demodulator_priv;
 
        int sync = cx24110_readreg (state, 0x55);
 
@@ -460,7 +459,7 @@ static int cx24110_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int cx24110_read_ber(struct dvb_frontend* fe, u32* ber)
 {
-       struct cx24110_state *state = (struct cx24110_state*) fe->demodulator_priv;
+       struct cx24110_state *state = fe->demodulator_priv;
 
        /* fixme (maybe): value range is 16 bit. Scale? */
        if(cx24110_readreg(state,0x24)&0x10) {
@@ -478,7 +477,7 @@ static int cx24110_read_ber(struct dvb_frontend* fe, u32* ber)
 
 static int cx24110_read_signal_strength(struct dvb_frontend* fe, u16* signal_strength)
 {
-       struct cx24110_state *state = (struct cx24110_state*) fe->demodulator_priv;
+       struct cx24110_state *state = fe->demodulator_priv;
 
 /* no provision in hardware. Read the frontend AGC accumulator. No idea how to scale this, but I know it is 2s complement */
        u8 signal = cx24110_readreg (state, 0x27)+128;
@@ -489,7 +488,7 @@ static int cx24110_read_signal_strength(struct dvb_frontend* fe, u16* signal_str
 
 static int cx24110_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct cx24110_state *state = (struct cx24110_state*) fe->demodulator_priv;
+       struct cx24110_state *state = fe->demodulator_priv;
 
        /* no provision in hardware. Can be computed from the Es/N0 estimator, but I don't know how. */
        if(cx24110_readreg(state,0x6a)&0x80) {
@@ -505,7 +504,7 @@ static int cx24110_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int cx24110_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct cx24110_state *state = (struct cx24110_state*) fe->demodulator_priv;
+       struct cx24110_state *state = fe->demodulator_priv;
        u32 lastbyer;
 
        if(cx24110_readreg(state,0x10)&0x40) {
@@ -527,7 +526,7 @@ static int cx24110_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 static int cx24110_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct cx24110_state *state = (struct cx24110_state*) fe->demodulator_priv;
+       struct cx24110_state *state = fe->demodulator_priv;
 
        state->config->pll_set(fe, p);
        cx24110_set_inversion (state, p->inversion);
@@ -540,7 +539,7 @@ static int cx24110_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int cx24110_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct cx24110_state *state = (struct cx24110_state*) fe->demodulator_priv;
+       struct cx24110_state *state = fe->demodulator_priv;
        s32 afc; unsigned sclk;
 
 /* cannot read back tuner settings (freq). Need to have some private storage */
@@ -567,14 +566,14 @@ static int cx24110_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int cx24110_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
 {
-       struct cx24110_state *state = (struct cx24110_state*) fe->demodulator_priv;
+       struct cx24110_state *state = fe->demodulator_priv;
 
        return cx24110_writereg(state,0x76,(cx24110_readreg(state,0x76)&~0x10)|(((tone==SEC_TONE_ON))?0x10:0));
 }
 
 static void cx24110_release(struct dvb_frontend* fe)
 {
-       struct cx24110_state* state = (struct cx24110_state*) fe->demodulator_priv;
+       struct cx24110_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -587,7 +586,7 @@ struct dvb_frontend* cx24110_attach(const struct cx24110_config* config,
        int ret;
 
        /* allocate memory for the internal state */
-       state = (struct cx24110_state*) kmalloc(sizeof(struct cx24110_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct cx24110_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
index a853d12a26f1efb82092cd187c5df91b6a292917..6f52d649e97e083b8fcd18a837526aeb5abacfec 100644 (file)
@@ -56,12 +56,12 @@ static int dib3000mb_get_frontend(struct dvb_frontend* fe,
 static int dib3000mb_set_frontend(struct dvb_frontend* fe,
                                  struct dvb_frontend_parameters *fep, int tuner)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        struct dvb_ofdm_parameters *ofdm = &fep->u.ofdm;
        fe_code_rate_t fe_cr = FEC_NONE;
        int search_state, seq;
 
-       if (tuner) {
+       if (tuner && state->config.pll_addr && state->config.pll_set) {
                dib3000mb_tuner_pass_ctrl(fe,1,state->config.pll_addr(fe));
                state->config.pll_set(fe, fep, NULL);
                dib3000mb_tuner_pass_ctrl(fe,0,state->config.pll_addr(fe));
@@ -317,7 +317,7 @@ static int dib3000mb_set_frontend(struct dvb_frontend* fe,
 
 static int dib3000mb_fe_init(struct dvb_frontend* fe, int mobile_mode)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
 
        deb_info("dib3000mb is getting up.\n");
        wr(DIB3000MB_REG_POWER_CONTROL, DIB3000MB_POWER_UP);
@@ -401,7 +401,7 @@ static int dib3000mb_fe_init(struct dvb_frontend* fe, int mobile_mode)
 static int dib3000mb_get_frontend(struct dvb_frontend* fe,
                                  struct dvb_frontend_parameters *fep)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        struct dvb_ofdm_parameters *ofdm = &fep->u.ofdm;
        fe_code_rate_t *cr;
        u16 tps_val;
@@ -562,7 +562,7 @@ static int dib3000mb_get_frontend(struct dvb_frontend* fe,
 
 static int dib3000mb_read_status(struct dvb_frontend* fe, fe_status_t *stat)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
 
        *stat = 0;
 
@@ -594,7 +594,7 @@ static int dib3000mb_read_status(struct dvb_frontend* fe, fe_status_t *stat)
 
 static int dib3000mb_read_ber(struct dvb_frontend* fe, u32 *ber)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
 
        *ber = ((rd(DIB3000MB_REG_BER_MSB) << 16) | rd(DIB3000MB_REG_BER_LSB));
        return 0;
@@ -603,7 +603,7 @@ static int dib3000mb_read_ber(struct dvb_frontend* fe, u32 *ber)
 /* see dib3000-watch dvb-apps for exact calcuations of signal_strength and snr */
 static int dib3000mb_read_signal_strength(struct dvb_frontend* fe, u16 *strength)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
 
        *strength = rd(DIB3000MB_REG_SIGNAL_POWER) * 0xffff / 0x170;
        return 0;
@@ -611,7 +611,7 @@ static int dib3000mb_read_signal_strength(struct dvb_frontend* fe, u16 *strength
 
 static int dib3000mb_read_snr(struct dvb_frontend* fe, u16 *snr)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        short sigpow = rd(DIB3000MB_REG_SIGNAL_POWER);
        int icipow = ((rd(DIB3000MB_REG_NOISE_POWER_MSB) & 0xff) << 16) |
                rd(DIB3000MB_REG_NOISE_POWER_LSB);
@@ -621,7 +621,7 @@ static int dib3000mb_read_snr(struct dvb_frontend* fe, u16 *snr)
 
 static int dib3000mb_read_unc_blocks(struct dvb_frontend* fe, u32 *unc)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
 
        *unc = rd(DIB3000MB_REG_UNC);
        return 0;
@@ -629,7 +629,7 @@ static int dib3000mb_read_unc_blocks(struct dvb_frontend* fe, u32 *unc)
 
 static int dib3000mb_sleep(struct dvb_frontend* fe)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        deb_info("dib3000mb is going to bed.\n");
        wr(DIB3000MB_REG_POWER_CONTROL, DIB3000MB_POWER_DOWN);
        return 0;
@@ -656,7 +656,7 @@ static int dib3000mb_set_frontend_and_tuner(struct dvb_frontend* fe, struct dvb_
 
 static void dib3000mb_release(struct dvb_frontend* fe)
 {
-       struct dib3000_state *state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state *state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -671,7 +671,7 @@ static int dib3000mb_pid_control(struct dvb_frontend *fe,int index, int pid,int
 
 static int dib3000mb_fifo_control(struct dvb_frontend *fe, int onoff)
 {
-       struct dib3000_state *state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state *state = fe->demodulator_priv;
 
        deb_xfer("%s fifo\n",onoff ? "enabling" : "disabling");
        if (onoff) {
@@ -692,7 +692,7 @@ static int dib3000mb_pid_parse(struct dvb_frontend *fe, int onoff)
 
 static int dib3000mb_tuner_pass_ctrl(struct dvb_frontend *fe, int onoff, u8 pll_addr)
 {
-       struct dib3000_state *state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state *state = fe->demodulator_priv;
        if (onoff) {
                wr(DIB3000MB_REG_TUNER, DIB3000_TUNER_WRITE_ENABLE(pll_addr));
        } else {
@@ -709,7 +709,7 @@ struct dvb_frontend* dib3000mb_attach(const struct dib3000_config* config,
        struct dib3000_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct dib3000_state*) kmalloc(sizeof(struct dib3000_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct dib3000_state), GFP_KERNEL);
        if (state == NULL)
                goto error;
        memset(state,0,sizeof(struct dib3000_state));
index 4a31c05eaecd1ae8c3753f599b8feffeabeafbfe..888f10a5e96b28bc469c9d14c4b265b89a527dc0 100644 (file)
@@ -297,7 +297,7 @@ static int dib3000mc_set_general_cfg(struct dib3000_state *state, struct dvb_fro
 static int dib3000mc_get_frontend(struct dvb_frontend* fe,
                                  struct dvb_frontend_parameters *fep)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        struct dvb_ofdm_parameters *ofdm = &fep->u.ofdm;
        fe_code_rate_t *cr;
        u16 tps_val,cr_val;
@@ -458,12 +458,12 @@ static int dib3000mc_get_frontend(struct dvb_frontend* fe,
 static int dib3000mc_set_frontend(struct dvb_frontend* fe,
                                  struct dvb_frontend_parameters *fep, int tuner)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        struct dvb_ofdm_parameters *ofdm = &fep->u.ofdm;
        int search_state,auto_val;
        u16 val;
 
-       if (tuner) { /* initial call from dvb */
+       if (tuner && state->config.pll_addr && state->config.pll_set) { /* initial call from dvb */
                dib3000mc_tuner_pass_ctrl(fe,1,state->config.pll_addr(fe));
                state->config.pll_set(fe,fep,NULL);
                dib3000mc_tuner_pass_ctrl(fe,0,state->config.pll_addr(fe));
@@ -659,7 +659,7 @@ static int dib3000mc_fe_init(struct dvb_frontend* fe, int mobile_mode)
 }
 static int dib3000mc_read_status(struct dvb_frontend* fe, fe_status_t *stat)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        u16 lock = rd(DIB3000MC_REG_LOCKING);
 
        *stat = 0;
@@ -679,14 +679,14 @@ static int dib3000mc_read_status(struct dvb_frontend* fe, fe_status_t *stat)
 
 static int dib3000mc_read_ber(struct dvb_frontend* fe, u32 *ber)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        *ber = ((rd(DIB3000MC_REG_BER_MSB) << 16) | rd(DIB3000MC_REG_BER_LSB));
        return 0;
 }
 
 static int dib3000mc_read_unc_blocks(struct dvb_frontend* fe, u32 *unc)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
 
        *unc = rd(DIB3000MC_REG_PACKET_ERROR_COUNT);
        return 0;
@@ -695,7 +695,7 @@ static int dib3000mc_read_unc_blocks(struct dvb_frontend* fe, u32 *unc)
 /* see dib3000mb.c for calculation comments */
 static int dib3000mc_read_signal_strength(struct dvb_frontend* fe, u16 *strength)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        u16 val = rd(DIB3000MC_REG_SIGNAL_NOISE_LSB);
        *strength = (((val >> 6) & 0xff) << 8) + (val & 0x3f);
 
@@ -706,7 +706,7 @@ static int dib3000mc_read_signal_strength(struct dvb_frontend* fe, u16 *strength
 /* see dib3000mb.c for calculation comments */
 static int dib3000mc_read_snr(struct dvb_frontend* fe, u16 *snr)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        u16 val = rd(DIB3000MC_REG_SIGNAL_NOISE_LSB),
                val2 = rd(DIB3000MC_REG_SIGNAL_NOISE_MSB);
        u16 sig,noise;
@@ -726,7 +726,7 @@ static int dib3000mc_read_snr(struct dvb_frontend* fe, u16 *snr)
 
 static int dib3000mc_sleep(struct dvb_frontend* fe)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
 
        set_or(DIB3000MC_REG_CLK_CFG_7,DIB3000MC_CLK_CFG_7_PWR_DOWN);
        wr(DIB3000MC_REG_CLK_CFG_1,DIB3000MC_CLK_CFG_1_POWER_DOWN);
@@ -756,7 +756,7 @@ static int dib3000mc_set_frontend_and_tuner(struct dvb_frontend* fe, struct dvb_
 
 static void dib3000mc_release(struct dvb_frontend* fe)
 {
-       struct dib3000_state *state = (struct dib3000_state *) fe->demodulator_priv;
+       struct dib3000_state *state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -771,7 +771,7 @@ static int dib3000mc_pid_control(struct dvb_frontend *fe,int index, int pid,int
 
 static int dib3000mc_fifo_control(struct dvb_frontend *fe, int onoff)
 {
-       struct dib3000_state *state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state *state = fe->demodulator_priv;
        u16 tmp = rd(DIB3000MC_REG_SMO_MODE);
 
        deb_xfer("%s fifo\n",onoff ? "enabling" : "disabling");
@@ -803,7 +803,7 @@ static int dib3000mc_pid_parse(struct dvb_frontend *fe, int onoff)
 
 static int dib3000mc_tuner_pass_ctrl(struct dvb_frontend *fe, int onoff, u8 pll_addr)
 {
-       struct dib3000_state *state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state *state = fe->demodulator_priv;
        if (onoff) {
                wr(DIB3000MC_REG_TUNER, DIB3000_TUNER_WRITE_ENABLE(pll_addr));
        } else {
@@ -844,7 +844,7 @@ struct dvb_frontend* dib3000mc_attach(const struct dib3000_config* config,
        u16 devid;
 
        /* allocate memory for the internal state */
-       state = (struct dib3000_state*) kmalloc(sizeof(struct dib3000_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct dib3000_state), GFP_KERNEL);
        if (state == NULL)
                goto error;
        memset(state,0,sizeof(struct dib3000_state));
index 016c794a5677f7209885ebe2cea9e4481d60d708..c4c3c56c4a819769e650ad62199abe431bc7a27f 100644 (file)
@@ -2,6 +2,9 @@
  * $Id: dvb-pll.h,v 1.2 2005/02/10 11:43:41 kraxel Exp $
  */
 
+#ifndef __DVB_PLL_H__
+#define __DVB_PLL_H__
+
 struct dvb_pll_desc {
        char *name;
        u32  min;
@@ -26,9 +29,4 @@ extern struct dvb_pll_desc dvb_pll_unknown_1;
 int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf,
                      u32 freq, int bandwidth);
 
-/*
- * Local variables:
- * c-basic-offset: 8
- * compile-command: "make DVB=1"
- * End:
- */
+#endif
index c05a9b05600c29d9b3033353864171ea5349cf3a..cff93b9d8ab2653e141fdd2ab466ac7b4f5c8bc2 100644 (file)
@@ -100,7 +100,7 @@ static int dvb_dummy_fe_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t vo
 
 static void dvb_dummy_fe_release(struct dvb_frontend* fe)
 {
-       struct dvb_dummy_fe_state* state = (struct dvb_dummy_fe_state*) fe->demodulator_priv;
+       struct dvb_dummy_fe_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -111,7 +111,7 @@ struct dvb_frontend* dvb_dummy_fe_ofdm_attach(void)
        struct dvb_dummy_fe_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct dvb_dummy_fe_state*) kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
@@ -134,7 +134,7 @@ struct dvb_frontend* dvb_dummy_fe_qpsk_attach()
        struct dvb_dummy_fe_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct dvb_dummy_fe_state*) kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
@@ -157,7 +157,7 @@ struct dvb_frontend* dvb_dummy_fe_qam_attach()
        struct dvb_dummy_fe_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct dvb_dummy_fe_state*) kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
index 9ac95de9834d5604afd6de10316c149d3eb6cf07..031a1ddc7d11f16662e3446dd6fe561650959ad0 100644 (file)
@@ -121,7 +121,7 @@ static int reset_and_configure (struct l64781_state* state)
 
 static int apply_frontend_param (struct dvb_frontend* fe, struct dvb_frontend_parameters *param)
 {
-       struct l64781_state* state = (struct l64781_state*) fe->demodulator_priv;
+       struct l64781_state* state = fe->demodulator_priv;
        /* The coderates for FEC_NONE, FEC_4_5 and FEC_FEC_6_7 are arbitrary */
        static const u8 fec_tab[] = { 7, 0, 1, 2, 9, 3, 10, 4 };
        /* QPSK, QAM_16, QAM_64 */
@@ -234,7 +234,7 @@ static int apply_frontend_param (struct dvb_frontend* fe, struct dvb_frontend_pa
 
 static int get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters* param)
 {
-       struct l64781_state* state = (struct l64781_state*) fe->demodulator_priv;
+       struct l64781_state* state = fe->demodulator_priv;
        int tmp;
 
 
@@ -352,7 +352,7 @@ static int get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters*
 
 static int l64781_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct l64781_state* state = (struct l64781_state*) fe->demodulator_priv;
+       struct l64781_state* state = fe->demodulator_priv;
        int sync = l64781_readreg (state, 0x32);
        int gain = l64781_readreg (state, 0x0e);
 
@@ -381,7 +381,7 @@ static int l64781_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int l64781_read_ber(struct dvb_frontend* fe, u32* ber)
 {
-       struct l64781_state* state = (struct l64781_state*) fe->demodulator_priv;
+       struct l64781_state* state = fe->demodulator_priv;
 
        /*   XXX FIXME: set up counting period (reg 0x26...0x28)
         */
@@ -393,7 +393,7 @@ static int l64781_read_ber(struct dvb_frontend* fe, u32* ber)
 
 static int l64781_read_signal_strength(struct dvb_frontend* fe, u16* signal_strength)
 {
-       struct l64781_state* state = (struct l64781_state*) fe->demodulator_priv;
+       struct l64781_state* state = fe->demodulator_priv;
 
        u8 gain = l64781_readreg (state, 0x0e);
        *signal_strength = (gain << 8) | gain;
@@ -403,7 +403,7 @@ static int l64781_read_signal_strength(struct dvb_frontend* fe, u16* signal_stre
 
 static int l64781_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct l64781_state* state = (struct l64781_state*) fe->demodulator_priv;
+       struct l64781_state* state = fe->demodulator_priv;
 
        u8 avg_quality = 0xff - l64781_readreg (state, 0x33);
        *snr = (avg_quality << 8) | avg_quality; /* not exact, but...*/
@@ -413,7 +413,7 @@ static int l64781_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int l64781_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct l64781_state* state = (struct l64781_state*) fe->demodulator_priv;
+       struct l64781_state* state = fe->demodulator_priv;
 
        *ucblocks = l64781_readreg (state, 0x37)
           | (l64781_readreg (state, 0x38) << 8);
@@ -423,7 +423,7 @@ static int l64781_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 static int l64781_sleep(struct dvb_frontend* fe)
 {
-       struct l64781_state* state = (struct l64781_state*) fe->demodulator_priv;
+       struct l64781_state* state = fe->demodulator_priv;
 
        /* Power down */
        return l64781_writereg (state, 0x3e, 0x5a);
@@ -431,7 +431,7 @@ static int l64781_sleep(struct dvb_frontend* fe)
 
 static int l64781_init(struct dvb_frontend* fe)
 {
-       struct l64781_state* state = (struct l64781_state*) fe->demodulator_priv;
+       struct l64781_state* state = fe->demodulator_priv;
 
         reset_and_configure (state);
 
@@ -484,7 +484,7 @@ static int l64781_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend
 
 static void l64781_release(struct dvb_frontend* fe)
 {
-       struct l64781_state* state = (struct l64781_state*) fe->demodulator_priv;
+       struct l64781_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -501,7 +501,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config,
                           { .addr = config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
 
        /* allocate memory for the internal state */
-       state = (struct l64781_state*) kmalloc(sizeof(struct l64781_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct l64781_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
index 176a22e3441bfeb5bd6bbf040214c5be1b6fb8b4..e455aecd76b2f9c6732ff03e07c65fffbbf6dffe 100644 (file)
@@ -226,7 +226,7 @@ static int mt312_get_code_rate(struct mt312_state* state, fe_code_rate_t *cr)
 
 static int mt312_initfe(struct dvb_frontend* fe)
 {
-       struct mt312_state *state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state *state = fe->demodulator_priv;
        int ret;
        u8 buf[2];
 
@@ -287,7 +287,7 @@ static int mt312_initfe(struct dvb_frontend* fe)
 static int mt312_send_master_cmd(struct dvb_frontend* fe,
                                 struct dvb_diseqc_master_cmd *c)
 {
-       struct mt312_state *state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state *state = fe->demodulator_priv;
        int ret;
        u8 diseqc_mode;
 
@@ -318,7 +318,7 @@ static int mt312_send_master_cmd(struct dvb_frontend* fe,
 
 static int mt312_send_burst(struct dvb_frontend* fe, const fe_sec_mini_cmd_t c)
 {
-       struct mt312_state *state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state *state = fe->demodulator_priv;
        const u8 mini_tab[2] = { 0x02, 0x03 };
 
        int ret;
@@ -340,7 +340,7 @@ static int mt312_send_burst(struct dvb_frontend* fe, const fe_sec_mini_cmd_t c)
 
 static int mt312_set_tone(struct dvb_frontend* fe, const fe_sec_tone_mode_t t)
 {
-       struct mt312_state *state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state *state = fe->demodulator_priv;
        const u8 tone_tab[2] = { 0x01, 0x00 };
 
        int ret;
@@ -362,7 +362,7 @@ static int mt312_set_tone(struct dvb_frontend* fe, const fe_sec_tone_mode_t t)
 
 static int mt312_set_voltage(struct dvb_frontend* fe, const fe_sec_voltage_t v)
 {
-       struct mt312_state *state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state *state = fe->demodulator_priv;
        const u8 volt_tab[3] = { 0x00, 0x40, 0x00 };
 
        if (v > SEC_VOLTAGE_OFF)
@@ -373,7 +373,7 @@ static int mt312_set_voltage(struct dvb_frontend* fe, const fe_sec_voltage_t v)
 
 static int mt312_read_status(struct dvb_frontend* fe, fe_status_t *s)
 {
-       struct mt312_state *state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state *state = fe->demodulator_priv;
        int ret;
        u8 status[3];
 
@@ -400,7 +400,7 @@ static int mt312_read_status(struct dvb_frontend* fe, fe_status_t *s)
 
 static int mt312_read_ber(struct dvb_frontend* fe, u32 *ber)
 {
-       struct mt312_state *state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state *state = fe->demodulator_priv;
        int ret;
        u8 buf[3];
 
@@ -414,7 +414,7 @@ static int mt312_read_ber(struct dvb_frontend* fe, u32 *ber)
 
 static int mt312_read_signal_strength(struct dvb_frontend* fe, u16 *signal_strength)
 {
-       struct mt312_state *state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state *state = fe->demodulator_priv;
        int ret;
        u8 buf[3];
        u16 agc;
@@ -435,7 +435,7 @@ static int mt312_read_signal_strength(struct dvb_frontend* fe, u16 *signal_stren
 
 static int mt312_read_snr(struct dvb_frontend* fe, u16 *snr)
 {
-       struct mt312_state *state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state *state = fe->demodulator_priv;
        int ret;
        u8 buf[2];
 
@@ -449,7 +449,7 @@ static int mt312_read_snr(struct dvb_frontend* fe, u16 *snr)
 
 static int mt312_read_ucblocks(struct dvb_frontend* fe, u32 *ubc)
 {
-       struct mt312_state *state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state *state = fe->demodulator_priv;
        int ret;
        u8 buf[2];
 
@@ -464,7 +464,7 @@ static int mt312_read_ucblocks(struct dvb_frontend* fe, u32 *ubc)
 static int mt312_set_frontend(struct dvb_frontend* fe,
                              struct dvb_frontend_parameters *p)
 {
-       struct mt312_state *state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state *state = fe->demodulator_priv;
        int ret;
        u8 buf[5], config_val;
        u16 sr;
@@ -560,7 +560,7 @@ static int mt312_set_frontend(struct dvb_frontend* fe,
 static int mt312_get_frontend(struct dvb_frontend* fe,
                              struct dvb_frontend_parameters *p)
 {
-       struct mt312_state *state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state *state = fe->demodulator_priv;
        int ret;
 
        if ((ret = mt312_get_inversion(state, &p->inversion)) < 0)
@@ -577,7 +577,7 @@ static int mt312_get_frontend(struct dvb_frontend* fe,
 
 static int mt312_sleep(struct dvb_frontend* fe)
 {
-       struct mt312_state *state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state *state = fe->demodulator_priv;
        int ret;
        u8 config;
 
@@ -605,7 +605,7 @@ static int mt312_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_
 
 static void mt312_release(struct dvb_frontend* fe)
 {
-       struct mt312_state* state = (struct mt312_state*) fe->demodulator_priv;
+       struct mt312_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -617,7 +617,7 @@ struct dvb_frontend* vp310_attach(const struct mt312_config* config,
        struct mt312_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct mt312_state*) kmalloc(sizeof(struct mt312_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct mt312_state), GFP_KERNEL);
        if (state == NULL)
                goto error;
 
@@ -651,7 +651,7 @@ struct dvb_frontend* mt312_attach(const struct mt312_config* config,
        struct mt312_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct mt312_state*) kmalloc(sizeof(struct mt312_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct mt312_state), GFP_KERNEL);
        if (state == NULL)
                goto error;
 
index 50326c7248fa3cc1ffa79824cfedde5d6fa90264..d32dc4de9e7f1fafd539e7e9de758705760b3613 100644 (file)
@@ -46,7 +46,7 @@ struct mt352_state {
        struct dvb_frontend_ops ops;
 
        /* configuration settings */
-       const struct mt352_config* config;
+       struct mt352_config config;
 };
 
 static int debug;
@@ -59,7 +59,7 @@ static int mt352_single_write(struct dvb_frontend *fe, u8 reg, u8 val)
 {
        struct mt352_state* state = fe->demodulator_priv;
        u8 buf[2] = { reg, val };
-       struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0,
+       struct i2c_msg msg = { .addr = state->config.demod_address, .flags = 0,
                               .buf = buf, .len = 2 };
        int err = i2c_transfer(state->i2c, &msg, 1);
        if (err != 1) {
@@ -84,10 +84,10 @@ static int mt352_read_register(struct mt352_state* state, u8 reg)
        int ret;
        u8 b0 [] = { reg };
        u8 b1 [] = { 0 };
-       struct i2c_msg msg [] = { { .addr = state->config->demod_address,
+       struct i2c_msg msg [] = { { .addr = state->config.demod_address,
                                    .flags = 0,
                                    .buf = b0, .len = 1 },
-                                 { .addr = state->config->demod_address,
+                                 { .addr = state->config.demod_address,
                                    .flags = I2C_M_RD,
                                    .buf = b1, .len = 1 } };
 
@@ -102,11 +102,6 @@ static int mt352_read_register(struct mt352_state* state, u8 reg)
        return b1[0];
 }
 
-int mt352_read(struct dvb_frontend *fe, u8 reg)
-{
-       return mt352_read_register(fe->demodulator_priv,reg);
-}
-
 static int mt352_sleep(struct dvb_frontend* fe)
 {
        static u8 mt352_softdown[] = { CLOCK_CTL, 0x20, 0x08 };
@@ -134,8 +129,8 @@ static void mt352_calc_nominal_rate(struct mt352_state* state,
                bw = 8;
                break;
        }
-       if (state->config->adc_clock)
-               adc_clock = state->config->adc_clock;
+       if (state->config.adc_clock)
+               adc_clock = state->config.adc_clock;
 
        value = 64 * bw * (1<<16) / (7 * 8);
        value = value * 1000 / adc_clock;
@@ -152,10 +147,10 @@ static void mt352_calc_input_freq(struct mt352_state* state,
        int if2       = 36167; /* 36.166667 MHz */
        int ife,value;
 
-       if (state->config->adc_clock)
-               adc_clock = state->config->adc_clock;
-       if (state->config->if2)
-               if2 = state->config->if2;
+       if (state->config.adc_clock)
+               adc_clock = state->config.adc_clock;
+       if (state->config.if2)
+               if2 = state->config.if2;
 
        ife = (2*adc_clock - if2);
        value = -16374 * ife / adc_clock;
@@ -289,10 +284,10 @@ static int mt352_set_parameters(struct dvb_frontend* fe,
 
        mt352_calc_nominal_rate(state, op->bandwidth, buf+4);
        mt352_calc_input_freq(state, buf+6);
-       state->config->pll_set(fe, param, buf+8);
+       state->config.pll_set(fe, param, buf+8);
 
        mt352_write(fe, buf, sizeof(buf));
-       if (state->config->no_tuner) {
+       if (state->config.no_tuner) {
                /* start decoding */
                mt352_write(fe, fsm_go, 2);
        } else {
@@ -516,7 +511,7 @@ static int mt352_init(struct dvb_frontend* fe)
 
                /* Do a "hard" reset */
                mt352_write(fe, mt352_reset_attach, sizeof(mt352_reset_attach));
-               return state->config->demod_init(fe);
+               return state->config.demod_init(fe);
        }
 
        return 0;
@@ -541,8 +536,8 @@ struct dvb_frontend* mt352_attach(const struct mt352_config* config,
        memset(state,0,sizeof(*state));
 
        /* setup the state */
-       state->config = config;
        state->i2c = i2c;
+       memcpy(&state->config,config,sizeof(struct mt352_config));
        memcpy(&state->ops, &mt352_ops, sizeof(struct dvb_frontend_ops));
 
        /* check if the demod is there */
@@ -601,10 +596,3 @@ MODULE_LICENSE("GPL");
 
 EXPORT_SYMBOL(mt352_attach);
 EXPORT_SYMBOL(mt352_write);
-EXPORT_SYMBOL(mt352_read);
-/*
- * Local variables:
- * c-basic-offset: 8
- * compile-command: "make DVB=1"
- * End:
- */
index f5d8a5aed8a93101c52646a91cefd24246a85d2f..03040cd595bb4b50a0a9cb4d1f4835d663705b02 100644 (file)
@@ -61,12 +61,5 @@ extern struct dvb_frontend* mt352_attach(const struct mt352_config* config,
                                         struct i2c_adapter* i2c);
 
 extern int mt352_write(struct dvb_frontend* fe, u8* ibuf, int ilen);
-extern int mt352_read(struct dvb_frontend *fe, u8 reg);
 
 #endif // MT352_H
-
-/*
- * Local variables:
- * c-basic-offset: 8
- * End:
- */
index 4743aa17406e0b1fa4ffcb36e0e334e936182900..35a1d60f19273023ee5cfab5ce276a7aff74d0ce 100644 (file)
@@ -241,7 +241,7 @@ static void nxt2002_agc_reset(struct nxt2002_state* state)
 static int nxt2002_load_firmware (struct dvb_frontend* fe, const struct firmware *fw)
 {
 
-       struct nxt2002_state* state = (struct nxt2002_state*) fe->demodulator_priv;
+       struct nxt2002_state* state = fe->demodulator_priv;
        u8 buf[256],written = 0,chunkpos = 0;
        u16 rambase,position,crc = 0;
 
@@ -309,7 +309,7 @@ static int nxt2002_load_firmware (struct dvb_frontend* fe, const struct firmware
 static int nxt2002_setup_frontend_parameters (struct dvb_frontend* fe,
                                             struct dvb_frontend_parameters *p)
 {
-       struct nxt2002_state* state = (struct nxt2002_state*) fe->demodulator_priv;
+       struct nxt2002_state* state = fe->demodulator_priv;
        u32 freq = 0;
        u16 tunerfreq = 0;
        u8 buf[4];
@@ -343,8 +343,6 @@ static int nxt2002_setup_frontend_parameters (struct dvb_frontend* fe,
        /* reset the agc now that tuning has been completed */
        nxt2002_agc_reset(state);
 
-
-
        /* set target power level */
        switch (p->u.vsb.modulation) {
                case QAM_64:
@@ -453,7 +451,7 @@ static int nxt2002_setup_frontend_parameters (struct dvb_frontend* fe,
 
 static int nxt2002_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct nxt2002_state* state = (struct nxt2002_state*) fe->demodulator_priv;
+       struct nxt2002_state* state = fe->demodulator_priv;
        u8 lock;
        i2c_readbytes(state,0x31,&lock,1);
 
@@ -470,7 +468,7 @@ static int nxt2002_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int nxt2002_read_ber(struct dvb_frontend* fe, u32* ber)
 {
-       struct nxt2002_state* state = (struct nxt2002_state*) fe->demodulator_priv;
+       struct nxt2002_state* state = fe->demodulator_priv;
        u8 b[3];
 
        nxt2002_readreg_multibyte(state,0xE6,b,3);
@@ -482,7 +480,7 @@ static int nxt2002_read_ber(struct dvb_frontend* fe, u32* ber)
 
 static int nxt2002_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 {
-       struct nxt2002_state* state = (struct nxt2002_state*) fe->demodulator_priv;
+       struct nxt2002_state* state = fe->demodulator_priv;
        u8 b[2];
        u16 temp = 0;
 
@@ -502,7 +500,7 @@ static int nxt2002_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 static int nxt2002_read_snr(struct dvb_frontend* fe, u16* snr)
 {
 
-       struct nxt2002_state* state = (struct nxt2002_state*) fe->demodulator_priv;
+       struct nxt2002_state* state = fe->demodulator_priv;
        u8 b[2];
        u16 temp = 0, temp2;
        u32 snrdb = 0;
@@ -536,7 +534,7 @@ static int nxt2002_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int nxt2002_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct nxt2002_state* state = (struct nxt2002_state*) fe->demodulator_priv;
+       struct nxt2002_state* state = fe->demodulator_priv;
        u8 b[3];
 
        nxt2002_readreg_multibyte(state,0xE6,b,3);
@@ -552,7 +550,7 @@ static int nxt2002_sleep(struct dvb_frontend* fe)
 
 static int nxt2002_init(struct dvb_frontend* fe)
 {
-       struct nxt2002_state* state = (struct nxt2002_state*) fe->demodulator_priv;
+       struct nxt2002_state* state = fe->demodulator_priv;
        const struct firmware *fw;
        int ret;
        u8 buf[2];
@@ -624,7 +622,7 @@ static int nxt2002_get_tune_settings(struct dvb_frontend* fe, struct dvb_fronten
 
 static void nxt2002_release(struct dvb_frontend* fe)
 {
-       struct nxt2002_state* state = (struct nxt2002_state*) fe->demodulator_priv;
+       struct nxt2002_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -637,7 +635,7 @@ struct dvb_frontend* nxt2002_attach(const struct nxt2002_config* config,
        u8 buf [] = {0,0,0,0,0};
 
        /* allocate memory for the internal state */
-       state = (struct nxt2002_state*) kmalloc(sizeof(struct nxt2002_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct nxt2002_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
index a41f7da8b842286b0a9b55636e8d3cf1b241171d..966de9853d18b7e6d9a8eadd768804603218595f 100644 (file)
@@ -176,11 +176,16 @@ static int nxt6000_set_transmission_mode(struct nxt6000_state* state, fe_transmi
 
 static void nxt6000_setup(struct dvb_frontend* fe)
 {
-       struct nxt6000_state* state = (struct nxt6000_state*) fe->demodulator_priv;
+       struct nxt6000_state* state = fe->demodulator_priv;
 
        nxt6000_writereg(state, RS_COR_SYNC_PARAM, SYNC_PARAM);
        nxt6000_writereg(state, BER_CTRL, /*(1 << 2) | */ (0x01 << 1) | 0x01);
-       nxt6000_writereg(state, VIT_COR_CTL, VIT_COR_RESYNC);
+       nxt6000_writereg(state, VIT_BERTIME_2, 0x00);  // BER Timer = 0x000200 * 256 = 131072 bits
+       nxt6000_writereg(state, VIT_BERTIME_1, 0x02);  //
+       nxt6000_writereg(state, VIT_BERTIME_0, 0x00);  //
+       nxt6000_writereg(state, VIT_COR_INTEN, 0x98); // Enable BER interrupts
+       nxt6000_writereg(state, VIT_COR_CTL, 0x82);   // Enable BER measurement
+       nxt6000_writereg(state, VIT_COR_CTL, VIT_COR_RESYNC | 0x02 );
        nxt6000_writereg(state, OFDM_COR_CTL, (0x01 << 5) | (nxt6000_readreg(state, OFDM_COR_CTL) & 0x0F));
        nxt6000_writereg(state, OFDM_COR_MODEGUARD, FORCEMODE8K | 0x02);
        nxt6000_writereg(state, OFDM_AGC_CTL, AGCLAST | INITIAL_AGC_BW);
@@ -422,7 +427,7 @@ static void nxt6000_dump_status(struct nxt6000_state *state)
 static int nxt6000_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
        u8 core_status;
-       struct nxt6000_state* state = (struct nxt6000_state*) fe->demodulator_priv;
+       struct nxt6000_state* state = fe->demodulator_priv;
 
        *status = 0;
 
@@ -451,7 +456,7 @@ static int nxt6000_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int nxt6000_init(struct dvb_frontend* fe)
 {
-       struct nxt6000_state* state = (struct nxt6000_state*) fe->demodulator_priv;
+       struct nxt6000_state* state = fe->demodulator_priv;
 
        nxt6000_reset(state);
        nxt6000_setup(fe);
@@ -461,7 +466,7 @@ static int nxt6000_init(struct dvb_frontend* fe)
 
 static int nxt6000_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *param)
 {
-       struct nxt6000_state* state = (struct nxt6000_state*) fe->demodulator_priv;
+       struct nxt6000_state* state = fe->demodulator_priv;
        int result;
 
        nxt6000_writereg(state, ENABLE_TUNER_IIC, 0x01);        /* open i2c bus switch */
@@ -482,10 +487,44 @@ static int nxt6000_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static void nxt6000_release(struct dvb_frontend* fe)
 {
-       struct nxt6000_state* state = (struct nxt6000_state*) fe->demodulator_priv;
+       struct nxt6000_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
+static int nxt6000_read_snr(struct dvb_frontend* fe, u16* snr)
+{
+       struct nxt6000_state* state = fe->demodulator_priv;
+
+       *snr = nxt6000_readreg( state, OFDM_CHC_SNR) / 8;
+
+       return 0;
+}
+
+static int nxt6000_read_ber(struct dvb_frontend* fe, u32* ber)
+{
+       struct nxt6000_state* state = fe->demodulator_priv;
+
+       nxt6000_writereg( state, VIT_COR_INTSTAT, 0x18 );
+
+       *ber = (nxt6000_readreg( state, VIT_BER_1 ) << 8 ) |
+               nxt6000_readreg( state, VIT_BER_0 );
+
+       nxt6000_writereg( state, VIT_COR_INTSTAT, 0x18); // Clear BER Done interrupts
+
+       return 0;
+}
+
+static int nxt6000_read_signal_strength(struct dvb_frontend* fe, u16* signal_strength)
+{
+       struct nxt6000_state* state = fe->demodulator_priv;
+
+       *signal_strength = (short) (511 -
+               (nxt6000_readreg(state, AGC_GAIN_1) +
+               ((nxt6000_readreg(state, AGC_GAIN_2) & 0x03) << 8)));
+
+       return 0;
+}
+
 static struct dvb_frontend_ops nxt6000_ops;
 
 struct dvb_frontend* nxt6000_attach(const struct nxt6000_config* config,
@@ -494,7 +533,7 @@ struct dvb_frontend* nxt6000_attach(const struct nxt6000_config* config,
        struct nxt6000_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct nxt6000_state*) kmalloc(sizeof(struct nxt6000_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct nxt6000_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
@@ -542,6 +581,9 @@ static struct dvb_frontend_ops nxt6000_ops = {
        .set_frontend = nxt6000_set_frontend,
 
        .read_status = nxt6000_read_status,
+       .read_ber = nxt6000_read_ber,
+       .read_signal_strength = nxt6000_read_signal_strength,
+       .read_snr = nxt6000_read_snr,
 };
 
 module_param(debug, int, 0644);
index 64b1a89b2a22a2026a9bd7a81a7c44788458938f..0422e580038ac14719741c7c53e5b243f919b374 100644 (file)
 #define BER_DONE               (0x08)
 #define BER_OVERFLOW           (0x10)
 
+/* 0x38 VIT_BERTIME_2 */
+#define VIT_BERTIME_2      (0x38)
+
+/* 0x39 VIT_BERTIME_1 */
+#define VIT_BERTIME_1      (0x39)
+
+/* 0x3A VIT_BERTIME_0 */
+#define VIT_BERTIME_0      (0x3a)
+
                             /* 0x38 OFDM_BERTimer *//* Use the alias registers */
 #define A_VIT_BER_TIMER_0      (0x1D)
 
                             /* 0x3A VIT_BER_TIMER_0 *//* Use the alias registers */
 #define A_VIT_BER_0            (0x1B)
 
+/* 0x3B VIT_BER_1 */
+#define VIT_BER_1              (0x3b)
+
+/* 0x3C VIT_BER_0 */
+#define VIT_BER_0              (0x3c)
+
 /* 0x40 OFDM_COR_CTL */
 #define OFDM_COR_CTL           (0x40)
 #define COREACT                (0x20)
 #define OFDM_ITB_CTL           (0x4B)
 #define ITBINV                 (0x01)
 
+/* 0x49 AGC_GAIN_1 */
+#define AGC_GAIN_1             (0x49)
+
+/* 0x4A AGC_GAIN_2 */
+#define AGC_GAIN_2             (0x4A)
+
 /* 0x4C OFDM_ITB_FREQ_1 */
 #define OFDM_ITB_FREQ_1        (0x4C)
 
index df5dee7760a34268f24f313c3923205dcbdc88f1..cc0a77c790f1add3a312e95b1ac442f3340e8955 100644 (file)
@@ -102,7 +102,7 @@ static u8 i2c_readbytes (struct or51132_state* state, u8 reg, u8* buf, int len)
 
 static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware *fw)
 {
-       struct or51132_state* state = (struct or51132_state*) fe->demodulator_priv;
+       struct or51132_state* state = fe->demodulator_priv;
        static u8 run_buf[] = {0x7F,0x01};
        static u8 get_ver_buf[] = {0x04,0x00,0x30,0x00,0x00};
        u8 rec_buf[14];
@@ -240,7 +240,7 @@ static int or51132_sleep(struct dvb_frontend* fe)
 
 static int or51132_setmode(struct dvb_frontend* fe)
 {
-       struct or51132_state* state = (struct or51132_state*) fe->demodulator_priv;
+       struct or51132_state* state = fe->demodulator_priv;
        unsigned char cmd_buf[4];
 
        dprintk("setmode %d\n",(int)state->current_modulation);
@@ -316,7 +316,7 @@ static int or51132_set_parameters(struct dvb_frontend* fe,
 {
        int ret;
        u8 buf[4];
-       struct or51132_state* state = (struct or51132_state*) fe->demodulator_priv;
+       struct or51132_state* state = fe->demodulator_priv;
        const struct firmware *fw;
 
        /* Change only if we are actually changing the modulation */
@@ -391,7 +391,7 @@ static int or51132_set_parameters(struct dvb_frontend* fe,
 
 static int or51132_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct or51132_state* state = (struct or51132_state*) fe->demodulator_priv;
+       struct or51132_state* state = fe->demodulator_priv;
        unsigned char rec_buf[2];
        unsigned char snd_buf[2];
        *status = 0;
@@ -464,7 +464,7 @@ static unsigned int i20Log10(unsigned short val)
 
 static int or51132_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 {
-       struct or51132_state* state = (struct or51132_state*) fe->demodulator_priv;
+       struct or51132_state* state = fe->demodulator_priv;
        unsigned char rec_buf[2];
        unsigned char snd_buf[2];
        u8 rcvr_stat;
@@ -512,7 +512,7 @@ static int or51132_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 
 static int or51132_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct or51132_state* state = (struct or51132_state*) fe->demodulator_priv;
+       struct or51132_state* state = fe->demodulator_priv;
        unsigned char rec_buf[2];
        unsigned char snd_buf[2];
        u16 snr_equ;
@@ -549,7 +549,7 @@ static int or51132_get_tune_settings(struct dvb_frontend* fe, struct dvb_fronten
 
 static void or51132_release(struct dvb_frontend* fe)
 {
-       struct or51132_state* state = (struct or51132_state*) fe->demodulator_priv;
+       struct or51132_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
index 58ad34ef0a00753fd36cd00c3874a9c920a4f76f..764a95a2e212b2972434c743184d1f06002fb1f9 100644 (file)
@@ -248,7 +248,7 @@ static int sp8870_wake_up(struct sp8870_state* state)
 static int sp8870_set_frontend_parameters (struct dvb_frontend* fe,
                                           struct dvb_frontend_parameters *p)
 {
-       struct sp8870_state* state = (struct sp8870_state*) fe->demodulator_priv;
+       struct sp8870_state* state = fe->demodulator_priv;
        int  err;
        u16 reg0xc05;
 
@@ -302,7 +302,7 @@ static int sp8870_set_frontend_parameters (struct dvb_frontend* fe,
 
 static int sp8870_init (struct dvb_frontend* fe)
 {
-       struct sp8870_state* state = (struct sp8870_state*) fe->demodulator_priv;
+       struct sp8870_state* state = fe->demodulator_priv;
         const struct firmware *fw = NULL;
 
        sp8870_wake_up(state);
@@ -358,7 +358,7 @@ static int sp8870_init (struct dvb_frontend* fe)
 
 static int sp8870_read_status (struct dvb_frontend* fe, fe_status_t * fe_status)
 {
-       struct sp8870_state* state = (struct sp8870_state*) fe->demodulator_priv;
+       struct sp8870_state* state = fe->demodulator_priv;
        int status;
        int signal;
 
@@ -384,7 +384,7 @@ static int sp8870_read_status (struct dvb_frontend* fe, fe_status_t * fe_status)
 
 static int sp8870_read_ber (struct dvb_frontend* fe, u32 * ber)
 {
-       struct sp8870_state* state = (struct sp8870_state*) fe->demodulator_priv;
+       struct sp8870_state* state = fe->demodulator_priv;
        int ret;
        u32 tmp;
 
@@ -412,7 +412,7 @@ static int sp8870_read_ber (struct dvb_frontend* fe, u32 * ber)
 
 static int sp8870_read_signal_strength(struct dvb_frontend* fe,  u16 * signal)
 {
-       struct sp8870_state* state = (struct sp8870_state*) fe->demodulator_priv;
+       struct sp8870_state* state = fe->demodulator_priv;
        int ret;
        u16 tmp;
 
@@ -438,7 +438,7 @@ static int sp8870_read_signal_strength(struct dvb_frontend* fe,  u16 * signal)
 
 static int sp8870_read_uncorrected_blocks (struct dvb_frontend* fe, u32* ublocks)
 {
-       struct sp8870_state* state = (struct sp8870_state*) fe->demodulator_priv;
+       struct sp8870_state* state = fe->demodulator_priv;
        int ret;
 
        *ublocks = 0;
@@ -467,7 +467,7 @@ static int switches = 0;
 
 static int sp8870_set_frontend (struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct sp8870_state* state = (struct sp8870_state*) fe->demodulator_priv;
+       struct sp8870_state* state = fe->demodulator_priv;
 
        /*
            The firmware of the sp8870 sometimes locks up after setting frontend parameters.
@@ -524,7 +524,7 @@ static int sp8870_set_frontend (struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int sp8870_sleep(struct dvb_frontend* fe)
 {
-       struct sp8870_state* state = (struct sp8870_state*) fe->demodulator_priv;
+       struct sp8870_state* state = fe->demodulator_priv;
 
        // tristate TS output and disable interface pins
        return sp8870_writereg(state, 0xC18, 0x000);
@@ -540,7 +540,7 @@ static int sp8870_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend
 
 static void sp8870_release(struct dvb_frontend* fe)
 {
-       struct sp8870_state* state = (struct sp8870_state*) fe->demodulator_priv;
+       struct sp8870_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -552,7 +552,7 @@ struct dvb_frontend* sp8870_attach(const struct sp8870_config* config,
        struct sp8870_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct sp8870_state*) kmalloc(sizeof(struct sp8870_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct sp8870_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
index 7eae833ece4909259cde871114881d4e619fe054..d868a6927a16d022d7643f7a4e2b2fc52ec680b2 100644 (file)
@@ -135,7 +135,7 @@ static void sp887x_setup_agc (struct sp887x_state* state)
  */
 static int sp887x_initial_setup (struct dvb_frontend* fe, const struct firmware *fw)
 {
-       struct sp887x_state* state = (struct sp887x_state*) fe->demodulator_priv;
+       struct sp887x_state* state = fe->demodulator_priv;
        u8 buf [BLOCKSIZE+2];
        int i;
        int fw_size = fw->size;
@@ -344,7 +344,7 @@ static void sp887x_correct_offsets (struct sp887x_state* state,
 static int sp887x_setup_frontend_parameters (struct dvb_frontend* fe,
                                             struct dvb_frontend_parameters *p)
 {
-       struct sp887x_state* state = (struct sp887x_state*) fe->demodulator_priv;
+       struct sp887x_state* state = fe->demodulator_priv;
        int actual_freq, err;
        u16 val, reg0xc05;
 
@@ -405,7 +405,7 @@ static int sp887x_setup_frontend_parameters (struct dvb_frontend* fe,
 
 static int sp887x_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct sp887x_state* state = (struct sp887x_state*) fe->demodulator_priv;
+       struct sp887x_state* state = fe->demodulator_priv;
        u16 snr12 = sp887x_readreg(state, 0xf16);
        u16 sync0x200 = sp887x_readreg(state, 0x200);
        u16 sync0xf17 = sp887x_readreg(state, 0xf17);
@@ -439,7 +439,7 @@ static int sp887x_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int sp887x_read_ber(struct dvb_frontend* fe, u32* ber)
 {
-       struct sp887x_state* state = (struct sp887x_state*) fe->demodulator_priv;
+       struct sp887x_state* state = fe->demodulator_priv;
 
        *ber = (sp887x_readreg(state, 0xc08) & 0x3f) |
               (sp887x_readreg(state, 0xc07) << 6);
@@ -453,7 +453,7 @@ static int sp887x_read_ber(struct dvb_frontend* fe, u32* ber)
 
 static int sp887x_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 {
-       struct sp887x_state* state = (struct sp887x_state*) fe->demodulator_priv;
+       struct sp887x_state* state = fe->demodulator_priv;
 
        u16 snr12 = sp887x_readreg(state, 0xf16);
        u32 signal = 3 * (snr12 << 4);
@@ -464,7 +464,7 @@ static int sp887x_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 
 static int sp887x_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct sp887x_state* state = (struct sp887x_state*) fe->demodulator_priv;
+       struct sp887x_state* state = fe->demodulator_priv;
 
        u16 snr12 = sp887x_readreg(state, 0xf16);
        *snr = (snr12 << 4) | (snr12 >> 8);
@@ -474,7 +474,7 @@ static int sp887x_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int sp887x_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct sp887x_state* state = (struct sp887x_state*) fe->demodulator_priv;
+       struct sp887x_state* state = fe->demodulator_priv;
 
        *ucblocks = sp887x_readreg(state, 0xc0c);
        if (*ucblocks == 0xfff)
@@ -485,7 +485,7 @@ static int sp887x_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 static int sp887x_sleep(struct dvb_frontend* fe)
 {
-       struct sp887x_state* state = (struct sp887x_state*) fe->demodulator_priv;
+       struct sp887x_state* state = fe->demodulator_priv;
 
        /* tristate TS output and disable interface pins */
        sp887x_writereg(state, 0xc18, 0x000);
@@ -495,7 +495,7 @@ static int sp887x_sleep(struct dvb_frontend* fe)
 
 static int sp887x_init(struct dvb_frontend* fe)
 {
-       struct sp887x_state* state = (struct sp887x_state*) fe->demodulator_priv;
+       struct sp887x_state* state = fe->demodulator_priv;
         const struct firmware *fw = NULL;
        int ret;
 
@@ -534,7 +534,7 @@ static int sp887x_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend
 
 static void sp887x_release(struct dvb_frontend* fe)
 {
-       struct sp887x_state* state = (struct sp887x_state*) fe->demodulator_priv;
+       struct sp887x_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -546,7 +546,7 @@ struct dvb_frontend* sp887x_attach(const struct sp887x_config* config,
        struct sp887x_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct sp887x_state*) kmalloc(sizeof(struct sp887x_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct sp887x_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
index 502c6403dfc64b87a84183427ebe1b6a6607886d..e681263bf07986bb4252402c185069bf4960aaa3 100644 (file)
@@ -365,7 +365,7 @@ static int stv0297_set_inversion(struct stv0297_state *state, fe_spectral_invers
 
 int stv0297_enable_plli2c(struct dvb_frontend *fe)
 {
-       struct stv0297_state *state = (struct stv0297_state *) fe->demodulator_priv;
+       struct stv0297_state *state = fe->demodulator_priv;
 
        stv0297_writereg(state, 0x87, 0x78);
        stv0297_writereg(state, 0x86, 0xc8);
@@ -375,7 +375,7 @@ int stv0297_enable_plli2c(struct dvb_frontend *fe)
 
 static int stv0297_init(struct dvb_frontend *fe)
 {
-       struct stv0297_state *state = (struct stv0297_state *) fe->demodulator_priv;
+       struct stv0297_state *state = fe->demodulator_priv;
        int i;
 
        /* soft reset */
@@ -416,7 +416,7 @@ static int stv0297_init(struct dvb_frontend *fe)
 
 static int stv0297_sleep(struct dvb_frontend *fe)
 {
-       struct stv0297_state *state = (struct stv0297_state *) fe->demodulator_priv;
+       struct stv0297_state *state = fe->demodulator_priv;
 
        stv0297_writereg_mask(state, 0x80, 1, 1);
 
@@ -425,7 +425,7 @@ static int stv0297_sleep(struct dvb_frontend *fe)
 
 static int stv0297_read_status(struct dvb_frontend *fe, fe_status_t * status)
 {
-       struct stv0297_state *state = (struct stv0297_state *) fe->demodulator_priv;
+       struct stv0297_state *state = fe->demodulator_priv;
 
        u8 sync = stv0297_readreg(state, 0xDF);
 
@@ -438,7 +438,7 @@ static int stv0297_read_status(struct dvb_frontend *fe, fe_status_t * status)
 
 static int stv0297_read_ber(struct dvb_frontend *fe, u32 * ber)
 {
-       struct stv0297_state *state = (struct stv0297_state *) fe->demodulator_priv;
+       struct stv0297_state *state = fe->demodulator_priv;
        u8 BER[3];
 
        stv0297_writereg(state, 0xA0, 0x80);    // Start Counting bit errors for 4096 Bytes
@@ -453,7 +453,7 @@ static int stv0297_read_ber(struct dvb_frontend *fe, u32 * ber)
 
 static int stv0297_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
 {
-       struct stv0297_state *state = (struct stv0297_state *) fe->demodulator_priv;
+       struct stv0297_state *state = fe->demodulator_priv;
        u8 STRENGTH[2];
 
        stv0297_readregs(state, 0x41, STRENGTH, 2);
@@ -464,7 +464,7 @@ static int stv0297_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
 
 static int stv0297_read_snr(struct dvb_frontend *fe, u16 * snr)
 {
-       struct stv0297_state *state = (struct stv0297_state *) fe->demodulator_priv;
+       struct stv0297_state *state = fe->demodulator_priv;
        u8 SNR[2];
 
        stv0297_readregs(state, 0x07, SNR, 2);
@@ -475,7 +475,7 @@ static int stv0297_read_snr(struct dvb_frontend *fe, u16 * snr)
 
 static int stv0297_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks)
 {
-       struct stv0297_state *state = (struct stv0297_state *) fe->demodulator_priv;
+       struct stv0297_state *state = fe->demodulator_priv;
 
        *ucblocks = (stv0297_readreg(state, 0xD5) << 8)
                | stv0297_readreg(state, 0xD4);
@@ -485,7 +485,7 @@ static int stv0297_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks)
 
 static int stv0297_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p)
 {
-       struct stv0297_state *state = (struct stv0297_state *) fe->demodulator_priv;
+       struct stv0297_state *state = fe->demodulator_priv;
        int u_threshold;
        int initial_u;
        int blind_u;
@@ -689,7 +689,7 @@ timeout:
 
 static int stv0297_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p)
 {
-       struct stv0297_state *state = (struct stv0297_state *) fe->demodulator_priv;
+       struct stv0297_state *state = fe->demodulator_priv;
        int reg_00, reg_83;
 
        reg_00 = stv0297_readreg(state, 0x00);
@@ -725,7 +725,7 @@ static int stv0297_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_par
 
 static void stv0297_release(struct dvb_frontend *fe)
 {
-       struct stv0297_state *state = (struct stv0297_state *) fe->demodulator_priv;
+       struct stv0297_state *state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -737,7 +737,7 @@ struct dvb_frontend *stv0297_attach(const struct stv0297_config *config,
        struct stv0297_state *state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct stv0297_state *) kmalloc(sizeof(struct stv0297_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct stv0297_state), GFP_KERNEL);
        if (state == NULL)
                goto error;
 
index 15b40541b62d1c8bb0065f051a382a4e07c198bb..cfa3928bb487bab6d61cb0991833dadf7326819a 100644 (file)
@@ -70,6 +70,7 @@ struct stv0299_state {
 #define STATUS_UCBLOCKS 1
 
 static int debug;
+static int debug_legacy_dish_switch;
 #define dprintk(args...) \
        do { \
                if (debug) printk(KERN_DEBUG "stv0299: " args); \
@@ -93,7 +94,7 @@ static int stv0299_writeregI (struct stv0299_state* state, u8 reg, u8 data)
 
 int stv0299_writereg (struct dvb_frontend* fe, u8 reg, u8 data)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
 
        return stv0299_writeregI(state, reg, data);
 }
@@ -218,7 +219,7 @@ static int stv0299_wait_diseqc_idle (struct stv0299_state* state, int timeout)
 
 static int stv0299_set_symbolrate (struct dvb_frontend* fe, u32 srate)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
        u64 big = srate;
        u32 ratio;
 
@@ -269,7 +270,7 @@ static int stv0299_get_symbolrate (struct stv0299_state* state)
 static int stv0299_send_diseqc_msg (struct dvb_frontend* fe,
                                    struct dvb_diseqc_master_cmd *m)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
        u8 val;
        int i;
 
@@ -299,7 +300,7 @@ static int stv0299_send_diseqc_msg (struct dvb_frontend* fe,
 
 static int stv0299_send_diseqc_burst (struct dvb_frontend* fe, fe_sec_mini_cmd_t burst)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
        u8 val;
 
        dprintk ("%s\n", __FUNCTION__);
@@ -326,7 +327,7 @@ static int stv0299_send_diseqc_burst (struct dvb_frontend* fe, fe_sec_mini_cmd_t
 
 static int stv0299_set_tone (struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
        u8 val;
 
        if (stv0299_wait_diseqc_idle (state, 100) < 0)
@@ -348,7 +349,7 @@ static int stv0299_set_tone (struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
 
 static int stv0299_set_voltage (struct dvb_frontend* fe, fe_sec_voltage_t voltage)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
        u8 reg0x08;
        u8 reg0x0c;
 
@@ -385,34 +386,84 @@ static int stv0299_set_voltage (struct dvb_frontend* fe, fe_sec_voltage_t voltag
        };
 }
 
-static int stv0299_send_legacy_dish_cmd(struct dvb_frontend* fe, u32 cmd)
+static inline s32 stv0299_calc_usec_delay (struct timeval lasttime, struct timeval curtime)
 {
+       return ((curtime.tv_usec < lasttime.tv_usec) ?
+               1000000 - lasttime.tv_usec + curtime.tv_usec :
+               curtime.tv_usec - lasttime.tv_usec);
+}
+
+static void stv0299_sleep_until (struct timeval *waketime, u32 add_usec)
+{
+       struct timeval lasttime;
+       s32 delta, newdelta;
+
+       waketime->tv_usec += add_usec;
+       if (waketime->tv_usec >= 1000000) {
+               waketime->tv_usec -= 1000000;
+               waketime->tv_sec++;
+       }
+
+       do_gettimeofday (&lasttime);
+       delta = stv0299_calc_usec_delay (lasttime, *waketime);
+       if (delta > 2500) {
+               msleep ((delta - 1500) / 1000);
+               do_gettimeofday (&lasttime);
+               newdelta = stv0299_calc_usec_delay (lasttime, *waketime);
+               delta = (newdelta > delta) ? 0 : newdelta;
+       }
+       if (delta > 0)
+               udelay (delta);
+}
+
+static int stv0299_send_legacy_dish_cmd (struct dvb_frontend* fe, u32 cmd)
+{
+       struct stv0299_state* state = fe->demodulator_priv;
+       u8 reg0x08;
+       u8 reg0x0c;
+       u8 lv_mask = 0x40;
        u8 last = 1;
        int i;
+       struct timeval nexttime;
+       struct timeval tv[10];
 
-       /* reset voltage at the end
-       if((0x50 & stv0299_readreg (i2c, 0x0c)) == 0x50)
-               cmd |= 0x80;
-       else
-               cmd &= 0x7F;
-       */
+       reg0x08 = stv0299_readreg (state, 0x08);
+       reg0x0c = stv0299_readreg (state, 0x0c);
+       reg0x0c &= 0x0f;
+       stv0299_writeregI (state, 0x08, (reg0x08 & 0x3f) | (state->config->lock_output << 6));
+       if (state->config->volt13_op0_op1 == STV0299_VOLT13_OP0)
+               lv_mask = 0x10;
 
        cmd = cmd << 1;
-       dprintk("%s switch command: 0x%04x\n",__FUNCTION__, cmd);
+       if (debug_legacy_dish_switch)
+               printk ("%s switch command: 0x%04x\n",__FUNCTION__, cmd);
+
+       do_gettimeofday (&nexttime);
+       if (debug_legacy_dish_switch)
+               memcpy (&tv[0], &nexttime, sizeof (struct timeval));
+       stv0299_writeregI (state, 0x0c, reg0x0c | 0x50); /* set LNB to 18V */
 
-       stv0299_set_voltage(fe,SEC_VOLTAGE_18);
-       msleep(32);
+       stv0299_sleep_until (&nexttime, 32000);
 
        for (i=0; i<9; i++) {
+               if (debug_legacy_dish_switch)
+                       do_gettimeofday (&tv[i+1]);
                if((cmd & 0x01) != last) {
-                       stv0299_set_voltage(fe, last ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);
+                       /* set voltage to (last ? 13V : 18V) */
+                       stv0299_writeregI (state, 0x0c, reg0x0c | (last ? lv_mask : 0x50));
                        last = (last) ? 0 : 1;
                }
 
                cmd = cmd >> 1;
 
                if (i != 8)
-                       msleep(8);
+                       stv0299_sleep_until (&nexttime, 8000);
+       }
+       if (debug_legacy_dish_switch) {
+               printk ("%s(%d): switch delay (should be 32k followed by all 8k\n",
+                       __FUNCTION__, fe->dvb->num);
+               for (i=1; i < 10; i++)
+                       printk ("%d: %d\n", i, stv0299_calc_usec_delay (tv[i-1] , tv[i]));
        }
 
        return 0;
@@ -420,7 +471,7 @@ static int stv0299_send_legacy_dish_cmd(struct dvb_frontend* fe, u32 cmd)
 
 static int stv0299_init (struct dvb_frontend* fe)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
        int i;
 
        dprintk("stv0299: init chip\n");
@@ -439,7 +490,7 @@ static int stv0299_init (struct dvb_frontend* fe)
 
 static int stv0299_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
 
        u8 signal = 0xff - stv0299_readreg (state, 0x18);
        u8 sync = stv0299_readreg (state, 0x1b);
@@ -467,7 +518,7 @@ static int stv0299_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int stv0299_read_ber(struct dvb_frontend* fe, u32* ber)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
 
        if (state->errmode != STATUS_BER) return 0;
        *ber = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e);
@@ -477,7 +528,7 @@ static int stv0299_read_ber(struct dvb_frontend* fe, u32* ber)
 
 static int stv0299_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
 
        s32 signal =  0xffff - ((stv0299_readreg (state, 0x18) << 8)
                               | stv0299_readreg (state, 0x19));
@@ -494,7 +545,7 @@ static int stv0299_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 
 static int stv0299_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
 
        s32 xsnr = 0xffff - ((stv0299_readreg (state, 0x24) << 8)
                           | stv0299_readreg (state, 0x25));
@@ -506,7 +557,7 @@ static int stv0299_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int stv0299_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
 
        if (state->errmode != STATUS_UCBLOCKS) *ucblocks = 0;
        else *ucblocks = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e);
@@ -516,7 +567,7 @@ static int stv0299_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 static int stv0299_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters * p)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
        int invval = 0;
 
        dprintk ("%s : FE_SET_FRONTEND\n", __FUNCTION__);
@@ -584,7 +635,7 @@ static int stv0299_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int stv0299_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters * p)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
        s32 derot_freq;
        int invval;
 
@@ -609,7 +660,7 @@ static int stv0299_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int stv0299_sleep(struct dvb_frontend* fe)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
 
        stv0299_writeregI(state, 0x02, 0x80);
        state->initialised = 0;
@@ -619,7 +670,7 @@ static int stv0299_sleep(struct dvb_frontend* fe)
 
 static int stv0299_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings)
 {
-        struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+        struct stv0299_state* state = fe->demodulator_priv;
 
        fesettings->min_delay_ms = state->config->min_delay_ms;
        if (fesettings->parameters.u.qpsk.symbol_rate < 10000000) {
@@ -634,7 +685,7 @@ static int stv0299_get_tune_settings(struct dvb_frontend* fe, struct dvb_fronten
 
 static void stv0299_release(struct dvb_frontend* fe)
 {
-       struct stv0299_state* state = (struct stv0299_state*) fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -647,7 +698,7 @@ struct dvb_frontend* stv0299_attach(const struct stv0299_config* config,
        int id;
 
        /* allocate memory for the internal state */
-       state = (struct stv0299_state*) kmalloc(sizeof(struct stv0299_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct stv0299_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
@@ -719,6 +770,9 @@ static struct dvb_frontend_ops stv0299_ops = {
        .dishnetwork_send_legacy_command = stv0299_send_legacy_dish_cmd,
 };
 
+module_param(debug_legacy_dish_switch, int, 0444);
+MODULE_PARM_DESC(debug_legacy_dish_switch, "Enable timing analysis for Dish Network legacy switches");
+
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
 
index 4e40d95ee95da02a1d9fcad8c4be55acbf433796..87d5f4d8790ffdfb47d6d78704e48fd699508005 100644 (file)
@@ -205,7 +205,7 @@ static int tda10021_set_symbolrate (struct tda10021_state* state, u32 symbolrate
 
 static int tda10021_init (struct dvb_frontend *fe)
 {
-       struct tda10021_state* state = (struct tda10021_state*) fe->demodulator_priv;
+       struct tda10021_state* state = fe->demodulator_priv;
        int i;
 
        dprintk("DVB: TDA10021(%d): init chip\n", fe->adapter->num);
@@ -238,7 +238,7 @@ static int tda10021_init (struct dvb_frontend *fe)
 static int tda10021_set_parameters (struct dvb_frontend *fe,
                            struct dvb_frontend_parameters *p)
 {
-       struct tda10021_state* state = (struct tda10021_state*) fe->demodulator_priv;
+       struct tda10021_state* state = fe->demodulator_priv;
 
        //table for QAM4-QAM256 ready  QAM4  QAM16 QAM32 QAM64 QAM128 QAM256
        //CONF
@@ -278,7 +278,7 @@ static int tda10021_set_parameters (struct dvb_frontend *fe,
 
 static int tda10021_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct tda10021_state* state = (struct tda10021_state*) fe->demodulator_priv;
+       struct tda10021_state* state = fe->demodulator_priv;
        int sync;
 
        *status = 0;
@@ -303,7 +303,7 @@ static int tda10021_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int tda10021_read_ber(struct dvb_frontend* fe, u32* ber)
 {
-       struct tda10021_state* state = (struct tda10021_state*) fe->demodulator_priv;
+       struct tda10021_state* state = fe->demodulator_priv;
 
        u32 _ber = tda10021_readreg(state, 0x14) |
                (tda10021_readreg(state, 0x15) << 8) |
@@ -315,7 +315,7 @@ static int tda10021_read_ber(struct dvb_frontend* fe, u32* ber)
 
 static int tda10021_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 {
-       struct tda10021_state* state = (struct tda10021_state*) fe->demodulator_priv;
+       struct tda10021_state* state = fe->demodulator_priv;
 
        u8 gain = tda10021_readreg(state, 0x17);
        *strength = (gain << 8) | gain;
@@ -325,7 +325,7 @@ static int tda10021_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 
 static int tda10021_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct tda10021_state* state = (struct tda10021_state*) fe->demodulator_priv;
+       struct tda10021_state* state = fe->demodulator_priv;
 
        u8 quality = ~tda10021_readreg(state, 0x18);
        *snr = (quality << 8) | quality;
@@ -335,7 +335,7 @@ static int tda10021_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int tda10021_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct tda10021_state* state = (struct tda10021_state*) fe->demodulator_priv;
+       struct tda10021_state* state = fe->demodulator_priv;
 
        *ucblocks = tda10021_readreg (state, 0x13) & 0x7f;
        if (*ucblocks == 0x7f)
@@ -350,7 +350,7 @@ static int tda10021_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 static int tda10021_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct tda10021_state* state = (struct tda10021_state*) fe->demodulator_priv;
+       struct tda10021_state* state = fe->demodulator_priv;
        int sync;
        s8 afc = 0;
 
@@ -378,7 +378,7 @@ static int tda10021_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_pa
 
 static int tda10021_sleep(struct dvb_frontend* fe)
 {
-       struct tda10021_state* state = (struct tda10021_state*) fe->demodulator_priv;
+       struct tda10021_state* state = fe->demodulator_priv;
 
        tda10021_writereg (state, 0x1b, 0x02);  /* pdown ADC */
        tda10021_writereg (state, 0x00, 0x80);  /* standby */
@@ -388,7 +388,7 @@ static int tda10021_sleep(struct dvb_frontend* fe)
 
 static void tda10021_release(struct dvb_frontend* fe)
 {
-       struct tda10021_state* state = (struct tda10021_state*) fe->demodulator_priv;
+       struct tda10021_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -401,7 +401,7 @@ struct dvb_frontend* tda10021_attach(const struct tda10021_config* config,
        struct tda10021_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct tda10021_state*) kmalloc(sizeof(struct tda10021_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct tda10021_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
index 687ad9cf3384b3d8630e762d990c61379ccc3d9c..0beb370792ae30584d42398ccdb98273ecb86f91 100644 (file)
 #include "dvb_frontend.h"
 #include "tda1004x.h"
 
-#define TDA1004X_DEMOD_TDA10045 0
-#define TDA1004X_DEMOD_TDA10046 1
-
+enum tda1004x_demod {
+       TDA1004X_DEMOD_TDA10045,
+       TDA1004X_DEMOD_TDA10046,
+};
 
 struct tda1004x_state {
        struct i2c_adapter* i2c;
@@ -46,8 +47,9 @@ struct tda1004x_state {
        struct dvb_frontend frontend;
 
        /* private demod data */
-       u8 initialised:1;
-       u8 demod_type;
+       u8 initialised;
+       enum tda1004x_demod demod_type;
+       u8 fw_version;
 };
 
 
@@ -139,7 +141,7 @@ static int tda1004x_write_byteI(struct tda1004x_state *state, int reg, int data)
 {
        int ret;
        u8 buf[] = { reg, data };
-       struct i2c_msg msg = { .addr=0, .flags=0, .buf=buf, .len=2 };
+       struct i2c_msg msg = { .flags = 0, .buf = buf, .len = 2 };
 
        dprintk("%s: reg=0x%x, data=0x%x\n", __FUNCTION__, reg, data);
 
@@ -160,8 +162,8 @@ static int tda1004x_read_byte(struct tda1004x_state *state, int reg)
        int ret;
        u8 b0[] = { reg };
        u8 b1[] = { 0 };
-       struct i2c_msg msg[] = {{ .addr=0, .flags=0, .buf=b0, .len=1},
-                               { .addr=0, .flags=I2C_M_RD, .buf=b1, .len = 1}};
+       struct i2c_msg msg[] = {{ .flags = 0, .buf = b0, .len = 1 },
+                               { .flags = I2C_M_RD, .buf = b1, .len = 1 }};
 
        dprintk("%s: reg=0x%x\n", __FUNCTION__, reg);
 
@@ -294,7 +296,7 @@ static int tda1004x_do_upload(struct tda1004x_state *state,
                              u8 dspCodeCounterReg, u8 dspCodeInReg)
 {
        u8 buf[65];
-       struct i2c_msg fw_msg = {.addr = 0,.flags = 0,.buf = buf,.len = 0 };
+       struct i2c_msg fw_msg = { .flags = 0, .buf = buf, .len = 0 };
        int tx_size;
        int pos = 0;
 
@@ -304,12 +306,10 @@ static int tda1004x_do_upload(struct tda1004x_state *state,
 
        buf[0] = dspCodeInReg;
        while (pos != len) {
-
                // work out how much to send this time
                tx_size = len - pos;
-               if (tx_size > 0x10) {
+               if (tx_size > 0x10)
                        tx_size = 0x10;
-               }
 
                // send the chunk
                memcpy(buf + 1, mem + pos, tx_size);
@@ -322,6 +322,7 @@ static int tda1004x_do_upload(struct tda1004x_state *state,
 
                dprintk("%s: fw_pos=0x%x\n", __FUNCTION__, pos);
        }
+
        return 0;
 }
 
@@ -335,9 +336,8 @@ static int tda1004x_check_upload_ok(struct tda1004x_state *state, u8 dspVersion)
 
        data1 = tda1004x_read_byte(state, TDA1004X_DSP_DATA1);
        data2 = tda1004x_read_byte(state, TDA1004X_DSP_DATA2);
-       if (data1 != 0x67 || data2 != dspVersion) {
+       if ((data1 != 0x67) || (data2 != dspVersion))
                return -EIO;
-       }
 
        return 0;
 }
@@ -348,9 +348,9 @@ static int tda10045_fwupload(struct dvb_frontend* fe)
        int ret;
        const struct firmware *fw;
 
-
        /* don't re-upload unless necessary */
-       if (tda1004x_check_upload_ok(state, 0x2c) == 0) return 0;
+       if (tda1004x_check_upload_ok(state, 0x2c) == 0)
+               return 0;
 
        /* request the firmware, this will block until someone uploads it */
        printk("tda1004x: waiting for firmware upload (%s)...\n", TDA10045_DEFAULT_FIRMWARE);
@@ -381,6 +381,25 @@ static int tda10045_fwupload(struct dvb_frontend* fe)
        return tda1004x_check_upload_ok(state, 0x2c);
 }
 
+static int tda10046_get_fw_version(struct tda1004x_state *state,
+                                  const struct firmware *fw)
+{
+       const unsigned char pattern[] = { 0x67, 0x00, 0x50, 0x62, 0x5e, 0x18, 0x67 };
+       unsigned int i;
+
+       /* area guessed from firmware v20, v21 and v25 */
+       for (i = 0x660; i < 0x700; i++) {
+               if (!memcmp(&fw->data[i], pattern, sizeof(pattern))) {
+                       state->fw_version = fw->data[i + sizeof(pattern)];
+                       printk(KERN_INFO "tda1004x: using firmware v%02x\n",
+                                       state->fw_version);
+                       return 0;
+               }
+       }
+
+       return -EINVAL;
+}
+
 static int tda10046_fwupload(struct dvb_frontend* fe)
 {
        struct tda1004x_state* state = fe->demodulator_priv;
@@ -394,7 +413,8 @@ static int tda10046_fwupload(struct dvb_frontend* fe)
        msleep(100);
 
        /* don't re-upload unless necessary */
-       if (tda1004x_check_upload_ok(state, 0x20) == 0) return 0;
+       if (tda1004x_check_upload_ok(state, state->fw_version) == 0)
+               return 0;
 
        /* request the firmware, this will block until someone uploads it */
        printk("tda1004x: waiting for firmware upload (%s)...\n", TDA10046_DEFAULT_FIRMWARE);
@@ -404,9 +424,20 @@ static int tda10046_fwupload(struct dvb_frontend* fe)
                return ret;
        }
 
+       if (fw->size < 24478) { /* size of firmware v20, which is the smallest of v20, v21 and v25 */
+               printk("tda1004x: firmware file seems to be too small (%d bytes)\n", fw->size);
+               return -EINVAL;
+       }
+
+       ret = tda10046_get_fw_version(state, fw);
+       if (ret < 0) {
+               printk("tda1004x: unable to find firmware version\n");
+               return ret;
+       }
+
        /* set parameters */
        tda1004x_write_byteI(state, TDA10046H_CONFPLL2, 10);
-       tda1004x_write_byteI(state, TDA10046H_CONFPLL3, 0);
+       tda1004x_write_byteI(state, TDA10046H_CONFPLL3, state->config->n_i2c);
        tda1004x_write_byteI(state, TDA10046H_FREQ_OFFSET, 99);
        tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_MSB, 0xd4);
        tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_LSB, 0x2c);
@@ -419,7 +450,7 @@ static int tda10046_fwupload(struct dvb_frontend* fe)
 
        /* wait for DSP to initialise */
        timeout = jiffies + HZ;
-       while(!(tda1004x_read_byte(state, TDA1004X_STATUS_CD) & 0x20)) {
+       while (!(tda1004x_read_byte(state, TDA1004X_STATUS_CD) & 0x20)) {
                if (time_after(jiffies, timeout)) {
                        printk("tda1004x: DSP failed to initialised.\n");
                        return -EIO;
@@ -427,7 +458,7 @@ static int tda10046_fwupload(struct dvb_frontend* fe)
                msleep(1);
        }
 
-       return tda1004x_check_upload_ok(state, 0x20);
+       return tda1004x_check_upload_ok(state, state->fw_version);
 }
 
 static int tda1004x_encode_fec(int fec)
@@ -483,7 +514,8 @@ static int tda10045_init(struct dvb_frontend* fe)
 
        dprintk("%s\n", __FUNCTION__);
 
-       if (state->initialised) return 0;
+       if (state->initialised)
+               return 0;
 
        if (tda10045_fwupload(fe)) {
                printk("tda1004x: firmware upload failed\n");
@@ -523,7 +555,8 @@ static int tda10046_init(struct dvb_frontend* fe)
        struct tda1004x_state* state = fe->demodulator_priv;
        dprintk("%s\n", __FUNCTION__);
 
-       if (state->initialised) return 0;
+       if (state->initialised)
+               return 0;
 
        if (tda10046_fwupload(fe)) {
                printk("tda1004x: firmware upload failed\n");
@@ -545,7 +578,7 @@ static int tda10046_init(struct dvb_frontend* fe)
        tda1004x_write_mask(state, TDA1004X_AUTO, 8, 0); // select HP stream
        tda1004x_write_mask(state, TDA1004X_CONFC1, 0x80, 0); // disable pulse killer
        tda1004x_write_byteI(state, TDA10046H_CONFPLL2, 10); // PLL M = 10
-       tda1004x_write_byteI(state, TDA10046H_CONFPLL3, 0); // PLL P = N = 0
+       tda1004x_write_byteI(state, TDA10046H_CONFPLL3, state->config->n_i2c); // PLL P = N = 0
        tda1004x_write_byteI(state, TDA10046H_FREQ_OFFSET, 99); // FREQOFFS = 99
        tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_MSB, 0xd4); // } PHY2 = -11221
        tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_LSB, 0x2c); // }
@@ -621,12 +654,14 @@ static int tda1004x_set_fe(struct dvb_frontend* fe,
 
                // set HP FEC
                tmp = tda1004x_encode_fec(fe_params->u.ofdm.code_rate_HP);
-               if (tmp < 0) return tmp;
+               if (tmp < 0)
+                       return tmp;
                tda1004x_write_mask(state, TDA1004X_IN_CONF2, 7, tmp);
 
                // set LP FEC
                tmp = tda1004x_encode_fec(fe_params->u.ofdm.code_rate_LP);
-               if (tmp < 0) return tmp;
+               if (tmp < 0)
+                       return tmp;
                tda1004x_write_mask(state, TDA1004X_IN_CONF2, 0x38, tmp << 3);
 
                // set constellation
@@ -671,7 +706,7 @@ static int tda1004x_set_fe(struct dvb_frontend* fe,
        }
 
        // set bandwidth
-       switch(state->demod_type) {
+       switch (state->demod_type) {
        case TDA1004X_DEMOD_TDA10045:
                tda10045h_set_bandwidth(state, fe_params->u.ofdm.bandwidth);
                break;
@@ -683,7 +718,8 @@ static int tda1004x_set_fe(struct dvb_frontend* fe,
 
        // set inversion
        inversion = fe_params->inversion;
-       if (state->config->invert) inversion = inversion ? INVERSION_OFF : INVERSION_ON;
+       if (state->config->invert)
+               inversion = inversion ? INVERSION_OFF : INVERSION_ON;
        switch (inversion) {
        case INVERSION_OFF:
                tda1004x_write_mask(state, TDA1004X_CONFC1, 0x20, 0);
@@ -750,19 +786,19 @@ static int tda1004x_set_fe(struct dvb_frontend* fe,
        }
 
        // start the lock
-       switch(state->demod_type) {
+       switch (state->demod_type) {
        case TDA1004X_DEMOD_TDA10045:
                tda1004x_write_mask(state, TDA1004X_CONFC4, 8, 8);
                tda1004x_write_mask(state, TDA1004X_CONFC4, 8, 0);
-               msleep(10);
                break;
 
        case TDA1004X_DEMOD_TDA10046:
                tda1004x_write_mask(state, TDA1004X_AUTO, 0x40, 0x40);
-               msleep(10);
                break;
        }
 
+       msleep(10);
+
        return 0;
 }
 
@@ -773,13 +809,13 @@ static int tda1004x_get_fe(struct dvb_frontend* fe, struct dvb_frontend_paramete
 
        // inversion status
        fe_params->inversion = INVERSION_OFF;
-       if (tda1004x_read_byte(state, TDA1004X_CONFC1) & 0x20) {
+       if (tda1004x_read_byte(state, TDA1004X_CONFC1) & 0x20)
                fe_params->inversion = INVERSION_ON;
-       }
-       if (state->config->invert) fe_params->inversion = fe_params->inversion ? INVERSION_OFF : INVERSION_ON;
+       if (state->config->invert)
+               fe_params->inversion = fe_params->inversion ? INVERSION_OFF : INVERSION_ON;
 
        // bandwidth
-       switch(state->demod_type) {
+       switch (state->demod_type) {
        case TDA1004X_DEMOD_TDA10045:
                switch (tda1004x_read_byte(state, TDA10045H_WREF_LSB)) {
                case 0x14:
@@ -830,9 +866,8 @@ static int tda1004x_get_fe(struct dvb_frontend* fe, struct dvb_frontend_paramete
 
        // transmission mode
        fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_2K;
-       if (tda1004x_read_byte(state, TDA1004X_OUT_CONF1) & 0x10) {
+       if (tda1004x_read_byte(state, TDA1004X_OUT_CONF1) & 0x10)
                fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_8K;
-       }
 
        // guard interval
        switch ((tda1004x_read_byte(state, TDA1004X_OUT_CONF1) & 0x0c) >> 2) {
@@ -880,30 +915,33 @@ static int tda1004x_read_status(struct dvb_frontend* fe, fe_status_t * fe_status
 
        // read status
        status = tda1004x_read_byte(state, TDA1004X_STATUS_CD);
-       if (status == -1) {
+       if (status == -1)
                return -EIO;
-       }
 
        // decode
        *fe_status = 0;
-       if (status & 4) *fe_status |= FE_HAS_SIGNAL;
-       if (status & 2) *fe_status |= FE_HAS_CARRIER;
-       if (status & 8) *fe_status |= FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
+       if (status & 4)
+               *fe_status |= FE_HAS_SIGNAL;
+       if (status & 2)
+               *fe_status |= FE_HAS_CARRIER;
+       if (status & 8)
+               *fe_status |= FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
 
        // if we don't already have VITERBI (i.e. not LOCKED), see if the viterbi
        // is getting anything valid
        if (!(*fe_status & FE_HAS_VITERBI)) {
                // read the CBER
                cber = tda1004x_read_byte(state, TDA1004X_CBER_LSB);
-               if (cber == -1) return -EIO;
+               if (cber == -1)
+                       return -EIO;
                status = tda1004x_read_byte(state, TDA1004X_CBER_MSB);
-               if (status == -1) return -EIO;
+               if (status == -1)
+                       return -EIO;
                cber |= (status << 8);
                tda1004x_read_byte(state, TDA1004X_CBER_RESET);
 
-               if (cber != 65535) {
+               if (cber != 65535)
                        *fe_status |= FE_HAS_VITERBI;
-               }
        }
 
        // if we DO have some valid VITERBI output, but don't already have SYNC
@@ -911,20 +949,22 @@ static int tda1004x_read_status(struct dvb_frontend* fe, fe_status_t * fe_status
        if ((*fe_status & FE_HAS_VITERBI) && (!(*fe_status & FE_HAS_SYNC))) {
                // read the VBER
                vber = tda1004x_read_byte(state, TDA1004X_VBER_LSB);
-               if (vber == -1) return -EIO;
+               if (vber == -1)
+                       return -EIO;
                status = tda1004x_read_byte(state, TDA1004X_VBER_MID);
-               if (status == -1) return -EIO;
+               if (status == -1)
+                       return -EIO;
                vber |= (status << 8);
                status = tda1004x_read_byte(state, TDA1004X_VBER_MSB);
-               if (status == -1) return -EIO;
+               if (status == -1)
+                       return -EIO;
                vber |= ((status << 16) & 0x0f);
                tda1004x_read_byte(state, TDA1004X_CVBER_LUT);
 
                // if RS has passed some valid TS packets, then we must be
                // getting some SYNC bytes
-               if (vber < 16632) {
+               if (vber < 16632)
                        *fe_status |= FE_HAS_SYNC;
-               }
        }
 
        // success
@@ -941,7 +981,7 @@ static int tda1004x_read_signal_strength(struct dvb_frontend* fe, u16 * signal)
        dprintk("%s\n", __FUNCTION__);
 
        // determine the register to use
-       switch(state->demod_type) {
+       switch (state->demod_type) {
        case TDA1004X_DEMOD_TDA10045:
                reg = TDA10045H_S_AGC;
                break;
@@ -972,9 +1012,8 @@ static int tda1004x_read_snr(struct dvb_frontend* fe, u16 * snr)
        tmp = tda1004x_read_byte(state, TDA1004X_SNR);
        if (tmp < 0)
                return -EIO;
-       if (tmp) {
+       if (tmp)
                tmp = 255 - tmp;
-       }
 
        *snr = ((tmp << 8) | tmp);
        dprintk("%s: snr=0x%x\n", __FUNCTION__, *snr);
@@ -1009,11 +1048,11 @@ static int tda1004x_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
                        break;
        }
 
-       if (tmp != 0x7f) {
+       if (tmp != 0x7f)
                *ucblocks = tmp;
-       } else {
+       else
                *ucblocks = 0xffffffff;
-       }
+
        dprintk("%s: ucblocks=0x%x\n", __FUNCTION__, *ucblocks);
        return 0;
 }
@@ -1027,10 +1066,12 @@ static int tda1004x_read_ber(struct dvb_frontend* fe, u32* ber)
 
        // read it in
        tmp = tda1004x_read_byte(state, TDA1004X_CBER_LSB);
-       if (tmp < 0) return -EIO;
+       if (tmp < 0)
+               return -EIO;
        *ber = tmp << 1;
        tmp = tda1004x_read_byte(state, TDA1004X_CBER_MSB);
-       if (tmp < 0) return -EIO;
+       if (tmp < 0)
+               return -EIO;
        *ber |= (tmp << 9);
        tda1004x_read_byte(state, TDA1004X_CBER_RESET);
 
@@ -1042,7 +1083,7 @@ static int tda1004x_sleep(struct dvb_frontend* fe)
 {
        struct tda1004x_state* state = fe->demodulator_priv;
 
-       switch(state->demod_type) {
+       switch (state->demod_type) {
        case TDA1004X_DEMOD_TDA10045:
                tda1004x_write_mask(state, TDA1004X_CONFADC1, 0x10, 0x10);
                break;
@@ -1066,74 +1107,11 @@ static int tda1004x_get_tune_settings(struct dvb_frontend* fe, struct dvb_fronte
 
 static void tda1004x_release(struct dvb_frontend* fe)
 {
-       struct tda1004x_state* state = (struct tda1004x_state*) fe->demodulator_priv;
-       kfree(state);
-}
-
-static struct dvb_frontend_ops tda10045_ops;
-
-struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
-                                    struct i2c_adapter* i2c)
-{
-       struct tda1004x_state* state = NULL;
-
-       /* allocate memory for the internal state */
-       state = (struct tda1004x_state*) kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
-       if (state == NULL) goto error;
-
-       /* setup the state */
-       state->config = config;
-       state->i2c = i2c;
-       memcpy(&state->ops, &tda10045_ops, sizeof(struct dvb_frontend_ops));
-       state->initialised = 0;
-       state->demod_type = TDA1004X_DEMOD_TDA10045;
-
-       /* check if the demod is there */
-       if (tda1004x_read_byte(state, TDA1004X_CHIPID) != 0x25) goto error;
-
-       /* create dvb_frontend */
-       state->frontend.ops = &state->ops;
-       state->frontend.demodulator_priv = state;
-       return &state->frontend;
-
-error:
+       struct tda1004x_state *state = fe->demodulator_priv;
        kfree(state);
-       return NULL;
-}
-
-static struct dvb_frontend_ops tda10046_ops;
-
-struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
-                                    struct i2c_adapter* i2c)
-{
-       struct tda1004x_state* state = NULL;
-
-       /* allocate memory for the internal state */
-       state = (struct tda1004x_state*) kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
-       if (state == NULL) goto error;
-
-       /* setup the state */
-       state->config = config;
-       state->i2c = i2c;
-       memcpy(&state->ops, &tda10046_ops, sizeof(struct dvb_frontend_ops));
-       state->initialised = 0;
-       state->demod_type = TDA1004X_DEMOD_TDA10046;
-
-       /* check if the demod is there */
-       if (tda1004x_read_byte(state, TDA1004X_CHIPID) != 0x46) goto error;
-
-       /* create dvb_frontend */
-       state->frontend.ops = &state->ops;
-       state->frontend.demodulator_priv = state;
-       return &state->frontend;
-
-error:
-       if (state) kfree(state);
-       return NULL;
 }
 
 static struct dvb_frontend_ops tda10045_ops = {
-
        .info = {
                .name = "Philips TDA10045H DVB-T",
                .type = FE_OFDM,
@@ -1163,8 +1141,36 @@ static struct dvb_frontend_ops tda10045_ops = {
        .read_ucblocks = tda1004x_read_ucblocks,
 };
 
-static struct dvb_frontend_ops tda10046_ops = {
+struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
+                                    struct i2c_adapter* i2c)
+{
+       struct tda1004x_state *state;
+
+       /* allocate memory for the internal state */
+       state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
+       if (!state)
+               return NULL;
+
+       /* setup the state */
+       state->config = config;
+       state->i2c = i2c;
+       memcpy(&state->ops, &tda10045_ops, sizeof(struct dvb_frontend_ops));
+       state->initialised = 0;
+       state->demod_type = TDA1004X_DEMOD_TDA10045;
+
+       /* check if the demod is there */
+       if (tda1004x_read_byte(state, TDA1004X_CHIPID) != 0x25) {
+               kfree(state);
+               return NULL;
+       }
 
+       /* create dvb_frontend */
+       state->frontend.ops = &state->ops;
+       state->frontend.demodulator_priv = state;
+       return &state->frontend;
+}
+
+static struct dvb_frontend_ops tda10046_ops = {
        .info = {
                .name = "Philips TDA10046H DVB-T",
                .type = FE_OFDM,
@@ -1194,6 +1200,36 @@ static struct dvb_frontend_ops tda10046_ops = {
        .read_ucblocks = tda1004x_read_ucblocks,
 };
 
+struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
+                                    struct i2c_adapter* i2c)
+{
+       struct tda1004x_state *state;
+
+       /* allocate memory for the internal state */
+       state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
+       if (!state)
+               return NULL;
+
+       /* setup the state */
+       state->config = config;
+       state->i2c = i2c;
+       memcpy(&state->ops, &tda10046_ops, sizeof(struct dvb_frontend_ops));
+       state->initialised = 0;
+       state->demod_type = TDA1004X_DEMOD_TDA10046;
+       state->fw_version = 0x20;       /* dummy default value */
+
+       /* check if the demod is there */
+       if (tda1004x_read_byte(state, TDA1004X_CHIPID) != 0x46) {
+               kfree(state);
+               return NULL;
+       }
+
+       /* create dvb_frontend */
+       state->frontend.ops = &state->ops;
+       state->frontend.demodulator_priv = state;
+       return &state->frontend;
+}
+
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
 
index e452fc0bad1153734edf65ac75061a3919c75b7c..c8e1d54ff26283b0b9a475f1fa2a5006d34922a4 100644 (file)
@@ -32,10 +32,13 @@ struct tda1004x_config
        u8 demod_address;
 
        /* does the "inversion" need inverted? */
-       u8 invert:1;
+       u8 invert;
 
        /* Does the OCLK signal need inverted? */
-       u8 invert_oclk:1;
+       u8 invert_oclk;
+
+       /* value of N_I2C of the CONF_PLL3 register */
+       u8 n_i2c;
 
        /* PLL maintenance */
        int (*pll_init)(struct dvb_frontend* fe);
index da82e90d6d136181f2bd5878850da4307c59fc14..168e013d23bd5478f06b048e3185c06e73b72c31 100644 (file)
@@ -226,7 +226,7 @@ static int tda8083_send_diseqc_burst (struct tda8083_state* state, fe_sec_mini_c
 static int tda8083_send_diseqc_msg (struct dvb_frontend* fe,
                                    struct dvb_diseqc_master_cmd *m)
 {
-       struct tda8083_state* state = (struct tda8083_state*) fe->demodulator_priv;
+       struct tda8083_state* state = fe->demodulator_priv;
        int i;
 
        tda8083_writereg (state, 0x29, (m->msg_len - 3) | (1 << 2)); /* enable */
@@ -243,7 +243,7 @@ static int tda8083_send_diseqc_msg (struct dvb_frontend* fe,
 
 static int tda8083_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct tda8083_state* state = (struct tda8083_state*) fe->demodulator_priv;
+       struct tda8083_state* state = fe->demodulator_priv;
 
        u8 signal = ~tda8083_readreg (state, 0x01);
        u8 sync = tda8083_readreg (state, 0x02);
@@ -270,7 +270,7 @@ static int tda8083_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int tda8083_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 {
-       struct tda8083_state* state = (struct tda8083_state*) fe->demodulator_priv;
+       struct tda8083_state* state = fe->demodulator_priv;
 
        u8 signal = ~tda8083_readreg (state, 0x01);
        *strength = (signal << 8) | signal;
@@ -280,7 +280,7 @@ static int tda8083_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 
 static int tda8083_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct tda8083_state* state = (struct tda8083_state*) fe->demodulator_priv;
+       struct tda8083_state* state = fe->demodulator_priv;
 
        u8 _snr = tda8083_readreg (state, 0x08);
        *snr = (_snr << 8) | _snr;
@@ -290,7 +290,7 @@ static int tda8083_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int tda8083_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct tda8083_state* state = (struct tda8083_state*) fe->demodulator_priv;
+       struct tda8083_state* state = fe->demodulator_priv;
 
        state->config->pll_set(fe, p);
        tda8083_set_inversion (state, p->inversion);
@@ -305,7 +305,7 @@ static int tda8083_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int tda8083_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct tda8083_state* state = (struct tda8083_state*) fe->demodulator_priv;
+       struct tda8083_state* state = fe->demodulator_priv;
 
        /*  FIXME: get symbolrate & frequency offset...*/
        /*p->frequency = ???;*/
@@ -319,7 +319,7 @@ static int tda8083_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int tda8083_sleep(struct dvb_frontend* fe)
 {
-       struct tda8083_state* state = (struct tda8083_state*) fe->demodulator_priv;
+       struct tda8083_state* state = fe->demodulator_priv;
 
        tda8083_writereg (state, 0x00, 0x02);
        return 0;
@@ -327,7 +327,7 @@ static int tda8083_sleep(struct dvb_frontend* fe)
 
 static int tda8083_init(struct dvb_frontend* fe)
 {
-       struct tda8083_state* state = (struct tda8083_state*) fe->demodulator_priv;
+       struct tda8083_state* state = fe->demodulator_priv;
        int i;
 
        for (i=0; i<44; i++)
@@ -343,7 +343,7 @@ static int tda8083_init(struct dvb_frontend* fe)
 
 static int tda8083_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t burst)
 {
-       struct tda8083_state* state = (struct tda8083_state*) fe->demodulator_priv;
+       struct tda8083_state* state = fe->demodulator_priv;
 
        tda8083_send_diseqc_burst (state, burst);
        tda8083_writereg (state, 0x00, 0x3c);
@@ -354,7 +354,7 @@ static int tda8083_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t
 
 static int tda8083_diseqc_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
 {
-       struct tda8083_state* state = (struct tda8083_state*) fe->demodulator_priv;
+       struct tda8083_state* state = fe->demodulator_priv;
 
        tda8083_set_tone (state, tone);
        tda8083_writereg (state, 0x00, 0x3c);
@@ -365,7 +365,7 @@ static int tda8083_diseqc_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t t
 
 static int tda8083_diseqc_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
 {
-       struct tda8083_state* state = (struct tda8083_state*) fe->demodulator_priv;
+       struct tda8083_state* state = fe->demodulator_priv;
 
        tda8083_set_voltage (state, voltage);
        tda8083_writereg (state, 0x00, 0x3c);
@@ -376,7 +376,7 @@ static int tda8083_diseqc_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t
 
 static void tda8083_release(struct dvb_frontend* fe)
 {
-       struct tda8083_state* state = (struct tda8083_state*) fe->demodulator_priv;
+       struct tda8083_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -388,7 +388,7 @@ struct dvb_frontend* tda8083_attach(const struct tda8083_config* config,
        struct tda8083_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct tda8083_state*) kmalloc(sizeof(struct tda8083_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct tda8083_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
index c99632114283d9e242615249c17fcdaa2a73122d..032d348dafb749acfb9144453e8400d8666c42a8 100644 (file)
@@ -27,7 +27,7 @@
 #include <linux/spinlock.h>
 #include <linux/threads.h>
 #include <linux/interrupt.h>
-#include <asm/irq.h>
+#include <linux/irq.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/slab.h>
@@ -400,7 +400,7 @@ static void tda80xx_wait_diseqc_fifo(struct tda80xx_state* state)
 
 static int tda8044_init(struct dvb_frontend* fe)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
        int ret;
 
        /*
@@ -432,7 +432,7 @@ static int tda8044_init(struct dvb_frontend* fe)
 
 static int tda8083_init(struct dvb_frontend* fe)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        tda80xx_write(state, 0x00, tda8083_inittab, sizeof(tda8083_inittab));
 
@@ -447,7 +447,7 @@ static int tda8083_init(struct dvb_frontend* fe)
 
 static int tda80xx_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        switch (voltage) {
        case SEC_VOLTAGE_13:
@@ -463,7 +463,7 @@ static int tda80xx_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage
 
 static int tda80xx_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        switch (tone) {
        case SEC_TONE_OFF:
@@ -477,7 +477,7 @@ static int tda80xx_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
 
 static int tda80xx_send_diseqc_msg(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd *cmd)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        if (cmd->msg_len > 6)
                return -EINVAL;
@@ -492,7 +492,7 @@ static int tda80xx_send_diseqc_msg(struct dvb_frontend* fe, struct dvb_diseqc_ma
 
 static int tda80xx_send_diseqc_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t cmd)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        switch (cmd) {
        case SEC_MINI_A:
@@ -512,7 +512,7 @@ static int tda80xx_send_diseqc_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t
 
 static int tda80xx_sleep(struct dvb_frontend* fe)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        tda80xx_writereg(state, 0x00, 0x02);    /* enter standby */
 
@@ -521,7 +521,7 @@ static int tda80xx_sleep(struct dvb_frontend* fe)
 
 static int tda80xx_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        tda80xx_writereg(state, 0x1c, 0x80);
        state->config->pll_set(fe, p);
@@ -537,7 +537,7 @@ static int tda80xx_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int tda80xx_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        if (!state->config->irq)
                tda80xx_read_status_int(state);
@@ -550,7 +550,7 @@ static int tda80xx_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int tda80xx_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        if (!state->config->irq)
                tda80xx_read_status_int(state);
@@ -561,7 +561,7 @@ static int tda80xx_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int tda80xx_read_ber(struct dvb_frontend* fe, u32* ber)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
        int ret;
        u8 buf[3];
 
@@ -575,7 +575,7 @@ static int tda80xx_read_ber(struct dvb_frontend* fe, u32* ber)
 
 static int tda80xx_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        u8 gain = ~tda80xx_readreg(state, 0x01);
        *strength = (gain << 8) | gain;
@@ -585,7 +585,7 @@ static int tda80xx_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 
 static int tda80xx_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        u8 quality = tda80xx_readreg(state, 0x08);
        *snr = (quality << 8) | quality;
@@ -595,7 +595,7 @@ static int tda80xx_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int tda80xx_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        *ucblocks = tda80xx_readreg(state, 0x0f);
        if (*ucblocks == 0xff)
@@ -606,7 +606,7 @@ static int tda80xx_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 static int tda80xx_init(struct dvb_frontend* fe)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        switch(state->id) {
        case ID_TDA8044:
@@ -620,7 +620,7 @@ static int tda80xx_init(struct dvb_frontend* fe)
 
 static void tda80xx_release(struct dvb_frontend* fe)
 {
-       struct tda80xx_state* state = (struct tda80xx_state*) fe->demodulator_priv;
+       struct tda80xx_state* state = fe->demodulator_priv;
 
        if (state->config->irq)
                free_irq(state->config->irq, &state->worklet);
@@ -637,7 +637,7 @@ struct dvb_frontend* tda80xx_attach(const struct tda80xx_config* config,
        int ret;
 
        /* allocate memory for the internal state */
-       state = (struct tda80xx_state*) kmalloc(sizeof(struct tda80xx_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct tda80xx_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
index 9c0d23e1d9e5a89993f47ecaad6d926729944fb6..70fb44b391a75e5877b0622acc30f2ee6e5f1fc4 100644 (file)
@@ -70,7 +70,6 @@ static int ves1820_writereg(struct ves1820_state *state, u8 reg, u8 data)
                printk("ves1820: %s(): writereg error (reg == 0x%02x,"
                        "val == 0x%02x, ret == %i)\n", __FUNCTION__, reg, data, ret);
 
-       msleep(10);
        return (ret != 1) ? -EREMOTEIO : 0;
 }
 
@@ -193,7 +192,7 @@ static int ves1820_set_symbolrate(struct ves1820_state *state, u32 symbolrate)
 
 static int ves1820_init(struct dvb_frontend* fe)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
        int i;
        int val;
 
@@ -214,7 +213,7 @@ static int ves1820_init(struct dvb_frontend* fe)
 
 static int ves1820_set_parameters(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
        static const u8 reg0x00[] = { 0x00, 0x04, 0x08, 0x0c, 0x10 };
        static const u8 reg0x01[] = { 140, 140, 106, 100, 92 };
        static const u8 reg0x05[] = { 135, 100, 70, 54, 38 };
@@ -241,7 +240,7 @@ static int ves1820_set_parameters(struct dvb_frontend* fe, struct dvb_frontend_p
 
 static int ves1820_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
        int sync;
 
        *status = 0;
@@ -267,7 +266,7 @@ static int ves1820_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int ves1820_read_ber(struct dvb_frontend* fe, u32* ber)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
 
        u32 _ber = ves1820_readreg(state, 0x14) |
                        (ves1820_readreg(state, 0x15) << 8) |
@@ -279,7 +278,7 @@ static int ves1820_read_ber(struct dvb_frontend* fe, u32* ber)
 
 static int ves1820_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
 
        u8 gain = ves1820_readreg(state, 0x17);
        *strength = (gain << 8) | gain;
@@ -289,7 +288,7 @@ static int ves1820_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 
 static int ves1820_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
 
        u8 quality = ~ves1820_readreg(state, 0x18);
        *snr = (quality << 8) | quality;
@@ -299,7 +298,7 @@ static int ves1820_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int ves1820_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
 
        *ucblocks = ves1820_readreg(state, 0x13) & 0x7f;
        if (*ucblocks == 0x7f)
@@ -314,7 +313,7 @@ static int ves1820_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 static int ves1820_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
        int sync;
        s8 afc = 0;
 
@@ -345,7 +344,7 @@ static int ves1820_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int ves1820_sleep(struct dvb_frontend* fe)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
 
        ves1820_writereg(state, 0x1b, 0x02);    /* pdown ADC */
        ves1820_writereg(state, 0x00, 0x80);    /* standby */
@@ -364,7 +363,7 @@ static int ves1820_get_tune_settings(struct dvb_frontend* fe, struct dvb_fronten
 
 static void ves1820_release(struct dvb_frontend* fe)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -377,7 +376,7 @@ struct dvb_frontend* ves1820_attach(const struct ves1820_config* config,
        struct ves1820_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct ves1820_state*) kmalloc(sizeof(struct ves1820_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct ves1820_state), GFP_KERNEL);
        if (state == NULL)
                goto error;
 
index edcad283aa86e990a6f3359ba30c5a6671a787eb..821df8e839d056669d594ac1bcf47adb7d65e9b1 100644 (file)
@@ -263,7 +263,7 @@ static int ves1x93_set_symbolrate (struct ves1x93_state* state, u32 srate)
 
 static int ves1x93_init (struct dvb_frontend* fe)
 {
-       struct ves1x93_state* state = (struct ves1x93_state*) fe->demodulator_priv;
+       struct ves1x93_state* state = fe->demodulator_priv;
        int i;
        int val;
 
@@ -289,7 +289,7 @@ static int ves1x93_init (struct dvb_frontend* fe)
 
 static int ves1x93_set_voltage (struct dvb_frontend* fe, fe_sec_voltage_t voltage)
 {
-       struct ves1x93_state* state = (struct ves1x93_state*) fe->demodulator_priv;
+       struct ves1x93_state* state = fe->demodulator_priv;
 
        switch (voltage) {
        case SEC_VOLTAGE_13:
@@ -305,7 +305,7 @@ static int ves1x93_set_voltage (struct dvb_frontend* fe, fe_sec_voltage_t voltag
 
 static int ves1x93_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct ves1x93_state* state = (struct ves1x93_state*) fe->demodulator_priv;
+       struct ves1x93_state* state = fe->demodulator_priv;
 
        u8 sync = ves1x93_readreg (state, 0x0e);
 
@@ -346,7 +346,7 @@ static int ves1x93_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int ves1x93_read_ber(struct dvb_frontend* fe, u32* ber)
 {
-       struct ves1x93_state* state = (struct ves1x93_state*) fe->demodulator_priv;
+       struct ves1x93_state* state = fe->demodulator_priv;
 
        *ber = ves1x93_readreg (state, 0x15);
        *ber |= (ves1x93_readreg (state, 0x16) << 8);
@@ -358,7 +358,7 @@ static int ves1x93_read_ber(struct dvb_frontend* fe, u32* ber)
 
 static int ves1x93_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 {
-       struct ves1x93_state* state = (struct ves1x93_state*) fe->demodulator_priv;
+       struct ves1x93_state* state = fe->demodulator_priv;
 
        u8 signal = ~ves1x93_readreg (state, 0x0b);
        *strength = (signal << 8) | signal;
@@ -368,7 +368,7 @@ static int ves1x93_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 
 static int ves1x93_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct ves1x93_state* state = (struct ves1x93_state*) fe->demodulator_priv;
+       struct ves1x93_state* state = fe->demodulator_priv;
 
        u8 _snr = ~ves1x93_readreg (state, 0x1c);
        *snr = (_snr << 8) | _snr;
@@ -378,7 +378,7 @@ static int ves1x93_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int ves1x93_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct ves1x93_state* state = (struct ves1x93_state*) fe->demodulator_priv;
+       struct ves1x93_state* state = fe->demodulator_priv;
 
        *ucblocks = ves1x93_readreg (state, 0x18) & 0x7f;
 
@@ -393,7 +393,7 @@ static int ves1x93_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 static int ves1x93_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct ves1x93_state* state = (struct ves1x93_state*) fe->demodulator_priv;
+       struct ves1x93_state* state = fe->demodulator_priv;
 
        ves1x93_writereg(state, 0x00, 0x11);
        state->config->pll_set(fe, p);
@@ -408,7 +408,7 @@ static int ves1x93_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int ves1x93_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct ves1x93_state* state = (struct ves1x93_state*) fe->demodulator_priv;
+       struct ves1x93_state* state = fe->demodulator_priv;
        int afc;
 
        afc = ((int)((char)(ves1x93_readreg (state, 0x0a) << 1)))/2;
@@ -431,14 +431,14 @@ static int ves1x93_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int ves1x93_sleep(struct dvb_frontend* fe)
 {
-       struct ves1x93_state* state = (struct ves1x93_state*) fe->demodulator_priv;
+       struct ves1x93_state* state = fe->demodulator_priv;
 
        return ves1x93_writereg (state, 0x00, 0x08);
 }
 
 static void ves1x93_release(struct dvb_frontend* fe)
 {
-       struct ves1x93_state* state = (struct ves1x93_state*) fe->demodulator_priv;
+       struct ves1x93_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -451,7 +451,7 @@ struct dvb_frontend* ves1x93_attach(const struct ves1x93_config* config,
        u8 identity;
 
        /* allocate memory for the internal state */
-       state = (struct ves1x93_state*) kmalloc(sizeof(struct ves1x93_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct ves1x93_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
index 922c205a265227fdf1f5919566174ec83e7f2f50..8e33a850e13ebf4696689664cce737843f3b1239 100644 (file)
@@ -130,7 +130,7 @@ static void init_av7110_av(struct av7110 *av7110)
        av7110->current_input = 0;
        if (i2c_writereg(av7110, 0x20, 0x00, 0x00) == 1) {
                printk ("dvb-ttpci: Crystal audio DAC @ card %d detected\n",
-                       av7110->dvb_adapter->num);
+                       av7110->dvb_adapter.num);
                av7110->adac_type = DVB_ADAC_CRYSTAL;
                i2c_writereg(av7110, 0x20, 0x01, 0xd2);
                i2c_writereg(av7110, 0x20, 0x02, 0x49);
@@ -145,13 +145,13 @@ static void init_av7110_av(struct av7110 *av7110)
        }
        else if (dev->pci->subsystem_vendor == 0x110a) {
                printk("dvb-ttpci: DVB-C w/o analog module @ card %d detected\n",
-                       av7110->dvb_adapter->num);
+                       av7110->dvb_adapter.num);
                av7110->adac_type = DVB_ADAC_NONE;
        }
        else {
                av7110->adac_type = adac;
                printk("dvb-ttpci: adac type set to %d @ card %d\n",
-                       av7110->dvb_adapter->num, av7110->adac_type);
+                       av7110->dvb_adapter.num, av7110->adac_type);
        }
 
        if (av7110->adac_type == DVB_ADAC_NONE || av7110->adac_type == DVB_ADAC_MSP) {
@@ -231,7 +231,7 @@ static int arm_thread(void *data)
 
                if (newloops == av7110->arm_loops) {
                        printk(KERN_ERR "dvb-ttpci: ARM crashed @ card %d\n",
-                              av7110->dvb_adapter->num);
+                              av7110->dvb_adapter.num);
 
                        arm_error(av7110);
                        av7710_set_video_mode(av7110, vidmode);
@@ -1282,7 +1282,7 @@ static int av7110_register(struct av7110 *av7110)
        av7110->dmxdev.demux = &dvbdemux->dmx;
        av7110->dmxdev.capabilities = 0;
 
-       dvb_dmxdev_init(&av7110->dmxdev, av7110->dvb_adapter);
+       dvb_dmxdev_init(&av7110->dmxdev, &av7110->dvb_adapter);
 
        av7110->hw_frontend.source = DMX_FRONTEND_0;
 
@@ -1307,11 +1307,11 @@ static int av7110_register(struct av7110 *av7110)
        av7110_ca_register(av7110);
 
 #ifdef CONFIG_DVB_AV7110_OSD
-       dvb_register_device(av7110->dvb_adapter, &av7110->osd_dev,
+       dvb_register_device(&av7110->dvb_adapter, &av7110->osd_dev,
                            &dvbdev_osd, av7110, DVB_DEVICE_OSD);
 #endif
 
-       dvb_net_init(av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx);
+       dvb_net_init(&av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx);
 
        if (budgetpatch) {
                /* initialize software demux1 without its own frontend
@@ -1334,9 +1334,9 @@ static int av7110_register(struct av7110 *av7110)
                av7110->dmxdev1.demux = &dvbdemux1->dmx;
                av7110->dmxdev1.capabilities = 0;
 
-               dvb_dmxdev_init(&av7110->dmxdev1, av7110->dvb_adapter);
+               dvb_dmxdev_init(&av7110->dmxdev1, &av7110->dvb_adapter);
 
-               dvb_net_init(av7110->dvb_adapter, &av7110->dvb_net1, &dvbdemux1->dmx);
+               dvb_net_init(&av7110->dvb_adapter, &av7110->dvb_net1, &dvbdemux1->dmx);
                printk("dvb-ttpci: additional demux1 for budget-patch registered\n");
        }
        return 0;
@@ -1673,6 +1673,106 @@ static struct stv0299_config alps_bsru6_config = {
 };
 
 
+static u8 alps_bsbe1_inittab[] = {
+       0x01, 0x15,
+       0x02, 0x30,
+       0x03, 0x00,
+       0x04, 0x7d,   /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
+       0x05, 0x35,   /* I2CT = 0, SCLT = 1, SDAT = 1 */
+       0x06, 0x40,   /* DAC not used, set to high impendance mode */
+       0x07, 0x00,   /* DAC LSB */
+       0x08, 0x40,   /* DiSEqC off, LNB power on OP2/LOCK pin on */
+       0x09, 0x00,   /* FIFO */
+       0x0c, 0x51,   /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
+       0x0d, 0x82,   /* DC offset compensation = ON, beta_agc1 = 2 */
+       0x0e, 0x23,   /* alpha_tmg = 2, beta_tmg = 3 */
+       0x10, 0x3f,   // AGC2  0x3d
+       0x11, 0x84,
+       0x12, 0xb5,   // Lock detect: -64  Carrier freq detect:on
+       0x15, 0xc9,   // lock detector threshold
+       0x16, 0x00,
+       0x17, 0x00,
+       0x18, 0x00,
+       0x19, 0x00,
+       0x1a, 0x00,
+       0x1f, 0x50,
+       0x20, 0x00,
+       0x21, 0x00,
+       0x22, 0x00,
+       0x23, 0x00,
+       0x28, 0x00,  // out imp: normal  out type: parallel FEC mode:0
+       0x29, 0x1e,  // 1/2 threshold
+       0x2a, 0x14,  // 2/3 threshold
+       0x2b, 0x0f,  // 3/4 threshold
+       0x2c, 0x09,  // 5/6 threshold
+       0x2d, 0x05,  // 7/8 threshold
+       0x2e, 0x01,
+       0x31, 0x1f,  // test all FECs
+       0x32, 0x19,  // viterbi and synchro search
+       0x33, 0xfc,  // rs control
+       0x34, 0x93,  // error control
+       0x0f, 0x92,
+       0xff, 0xff
+};
+
+static int alps_bsbe1_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
+{
+       struct av7110* av7110 = (struct av7110*) fe->dvb->priv;
+       int ret;
+       u8 data[4];
+       u32 div;
+       struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
+
+       if ((params->frequency < 950000) || (params->frequency > 2150000))
+               return -EINVAL;
+
+       div = (params->frequency + (125 - 1)) / 125; // round correctly
+       data[0] = (div >> 8) & 0x7f;
+       data[1] = div & 0xff;
+       data[2] = 0x80 | ((div & 0x18000) >> 10) | 4;
+       data[3] = (params->frequency > 1530000) ? 0xE0 : 0xE4;
+
+       ret = i2c_transfer(&av7110->i2c_adap, &msg, 1);
+       return (ret != 1) ? -EIO : 0;
+}
+
+static struct stv0299_config alps_bsbe1_config = {
+       .demod_address = 0x68,
+       .inittab = alps_bsbe1_inittab,
+       .mclk = 88000000UL,
+       .invert = 1,
+       .enhanced_tuning = 0,
+       .skip_reinit = 0,
+       .min_delay_ms = 100,
+       .set_symbol_rate = alps_bsru6_set_symbol_rate,
+       .pll_set = alps_bsbe1_pll_set,
+};
+
+static int lnbp21_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
+{
+       struct av7110* av7110 = (struct av7110*) fe->dvb->priv;
+       int ret;
+       u8 data[1];
+       struct i2c_msg msg = { .addr = 0x08, .flags = 0, .buf = data, .len = sizeof(data) };
+
+       switch(voltage) {
+       case SEC_VOLTAGE_OFF:
+               data[0] = 0x00;
+               break;
+       case SEC_VOLTAGE_13:
+               data[0] = 0x44;
+               break;
+       case SEC_VOLTAGE_18:
+               data[0] = 0x4c;
+               break;
+       default:
+               return -EINVAL;
+       };
+
+       ret = i2c_transfer(&av7110->i2c_adap, &msg, 1);
+       return (ret != 1) ? -EIO : 0;
+}
+
 
 static int alps_tdbe2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
 {
@@ -2116,6 +2216,14 @@ static int frontend_init(struct av7110 *av7110)
                                av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240;
                                break;
                        }
+                       break;
+
+               case 0x000E: /* Hauppauge/TT Nexus-S rev 2.3 */
+                       /* ALPS BSBE1 */
+                       av7110->fe = stv0299_attach(&alps_bsbe1_config, &av7110->i2c_adap);
+                       if (av7110->fe)
+                               av7110->fe->ops->set_voltage = lnbp21_set_voltage;
+                       break;
                }
        }
 
@@ -2138,7 +2246,7 @@ static int frontend_init(struct av7110 *av7110)
                FE_FUNC_OVERRIDE(av7110->fe->ops->dishnetwork_send_legacy_command, av7110->fe_dishnetwork_send_legacy_command, av7110_fe_dishnetwork_send_legacy_command);
                FE_FUNC_OVERRIDE(av7110->fe->ops->set_frontend, av7110->fe_set_frontend, av7110_fe_set_frontend);
 
-               ret = dvb_register_frontend(av7110->dvb_adapter, av7110->fe);
+               ret = dvb_register_frontend(&av7110->dvb_adapter, av7110->fe);
                if (ret < 0) {
                        printk("av7110: Frontend registration failed!\n");
                        if (av7110->fe->ops->release)
@@ -2352,7 +2460,7 @@ static int av7110_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_d
                goto err_dvb_unregister_adapter_2;
 
        ttpci_eeprom_parse_mac(&av7110->i2c_adap,
-                              av7110->dvb_adapter->proposed_mac);
+                              av7110->dvb_adapter.proposed_mac);
        ret = -ENOMEM;
 
        if (budgetpatch) {
@@ -2523,7 +2631,7 @@ static int av7110_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_d
        if (ret < 0)
                goto err_av7110_unregister_11;
 
-       av7110->dvb_adapter->priv = av7110;
+       av7110->dvb_adapter.priv = av7110;
        ret = frontend_init(av7110);
        if (ret < 0)
                goto err_av7110_exit_v4l_12;
@@ -2558,7 +2666,7 @@ err_saa71466_vfree_4:
 err_i2c_del_3:
        i2c_del_adapter(&av7110->i2c_adap);
 err_dvb_unregister_adapter_2:
-       dvb_unregister_adapter(av7110->dvb_adapter);
+       dvb_unregister_adapter(&av7110->dvb_adapter);
 err_put_firmware_1:
        put_firmware(av7110);
 err_kfree_0:
@@ -2604,7 +2712,7 @@ static int av7110_detach(struct saa7146_dev* saa)
 
        i2c_del_adapter(&av7110->i2c_adap);
 
-       dvb_unregister_adapter (av7110->dvb_adapter);
+       dvb_unregister_adapter (&av7110->dvb_adapter);
 
        av7110_num--;
 
@@ -2672,21 +2780,23 @@ MAKE_AV7110_INFO(ttt_1_X,    "Technotrend/Hauppauge WinTV DVB-T rev1.X");
 MAKE_AV7110_INFO(ttc_1_X,    "Technotrend/Hauppauge WinTV Nexus-CA rev1.X");
 MAKE_AV7110_INFO(ttc_2_X,    "Technotrend/Hauppauge WinTV DVB-C rev2.X");
 MAKE_AV7110_INFO(tts_2_X,    "Technotrend/Hauppauge WinTV Nexus-S rev2.X");
+MAKE_AV7110_INFO(tts_2_3,    "Technotrend/Hauppauge WinTV Nexus-S rev2.3");
 MAKE_AV7110_INFO(tts_1_3se,  "Technotrend/Hauppauge WinTV DVB-S rev1.3 SE");
 MAKE_AV7110_INFO(ttt,        "Technotrend/Hauppauge DVB-T");
 MAKE_AV7110_INFO(fsc,        "Fujitsu Siemens DVB-C");
 MAKE_AV7110_INFO(fss,        "Fujitsu Siemens DVB-S rev1.6");
 
 static struct pci_device_id pci_tbl[] = {
+       MAKE_EXTENSION_PCI(fsc,       0x110a, 0x0000),
        MAKE_EXTENSION_PCI(tts_1_X,   0x13c2, 0x0000),
        MAKE_EXTENSION_PCI(ttt_1_X,   0x13c2, 0x0001),
        MAKE_EXTENSION_PCI(ttc_2_X,   0x13c2, 0x0002),
        MAKE_EXTENSION_PCI(tts_2_X,   0x13c2, 0x0003),
-       MAKE_EXTENSION_PCI(tts_1_3se, 0x13c2, 0x1002),
-       MAKE_EXTENSION_PCI(fsc,       0x110a, 0x0000),
-       MAKE_EXTENSION_PCI(ttc_1_X,   0x13c2, 0x000a),
        MAKE_EXTENSION_PCI(fss,       0x13c2, 0x0006),
        MAKE_EXTENSION_PCI(ttt,       0x13c2, 0x0008),
+       MAKE_EXTENSION_PCI(ttc_1_X,   0x13c2, 0x000a),
+       MAKE_EXTENSION_PCI(tts_2_3,   0x13c2, 0x000e),
+       MAKE_EXTENSION_PCI(tts_1_3se, 0x13c2, 0x1002),
 
 /*     MAKE_EXTENSION_PCI(???, 0x13c2, 0x0004), UNDEFINED CARD */ // Galaxis DVB PC-Sat-Carte
 /*     MAKE_EXTENSION_PCI(???, 0x13c2, 0x0005), UNDEFINED CARD */ // Technisat SkyStar1
index 5070e0523da71f2e5f8e8d71d6cd53869817dd9d..4f69b4d01479232c6a3eb7e4460aab3290ffd158 100644 (file)
@@ -220,7 +220,7 @@ struct av7110 {
 
        struct audio_mixer      mixer;
 
-       struct dvb_adapter       *dvb_adapter;
+       struct dvb_adapter       dvb_adapter;
        struct dvb_device        *video_dev;
        struct dvb_device        *audio_dev;
        struct dvb_device        *ca_dev;
@@ -274,7 +274,6 @@ extern void av7110_ir_exit (void);
 extern int i2c_writereg(struct av7110 *av7110, u8 id, u8 reg, u8 val);
 extern u8 i2c_readreg(struct av7110 *av7110, u8 id, u8 reg);
 extern int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val);
-extern int msp_readreg(struct av7110 *av7110, u8 dev, u16 reg, u16 *val);
 
 
 extern int av7110_init_analog_module(struct av7110 *av7110);
index d77e8a00688fc9f7daa195a970728a16a5b95ae3..ccf946125d028fb2f22273143d4e62bdfd35fbb9 100644 (file)
@@ -1075,7 +1075,7 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file,
                }
                if (ret < 0)
                        break;
-               av7110->videostate.video_format = format;
+               av7110->videostate.display_format = format;
                ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetPanScanType,
                                    1, (u16) val);
                break;
@@ -1230,14 +1230,20 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file,
                switch(av7110->audiostate.channel_select) {
                case AUDIO_STEREO:
                        audcom(av7110, AUDIO_CMD_STEREO);
+                       if (av7110->adac_type == DVB_ADAC_CRYSTAL)
+                               i2c_writereg(av7110, 0x20, 0x02, 0x49);
                        break;
 
                case AUDIO_MONO_LEFT:
                        audcom(av7110, AUDIO_CMD_MONO_L);
+                       if (av7110->adac_type == DVB_ADAC_CRYSTAL)
+                               i2c_writereg(av7110, 0x20, 0x02, 0x4a);
                        break;
 
                case AUDIO_MONO_RIGHT:
                        audcom(av7110, AUDIO_CMD_MONO_R);
+                       if (av7110->adac_type == DVB_ADAC_CRYSTAL)
+                               i2c_writereg(av7110, 0x20, 0x02, 0x45);
                        break;
 
                default:
@@ -1409,10 +1415,10 @@ int av7110_av_register(struct av7110 *av7110)
        av7110->video_events.overflow = 0;
        memset(&av7110->video_size, 0, sizeof (video_size_t));
 
-       dvb_register_device(av7110->dvb_adapter, &av7110->video_dev,
+       dvb_register_device(&av7110->dvb_adapter, &av7110->video_dev,
                            &dvbdev_video, av7110, DVB_DEVICE_VIDEO);
 
-       dvb_register_device(av7110->dvb_adapter, &av7110->audio_dev,
+       dvb_register_device(&av7110->dvb_adapter, &av7110->audio_dev,
                            &dvbdev_audio, av7110, DVB_DEVICE_AUDIO);
 
        return 0;
index 21f7aacf77266163690eeed7d94b51550fcb6b1b..c3801e328fe912d2caf810e775b8129fd4d78d33 100644 (file)
@@ -123,7 +123,7 @@ static void ci_ll_release(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *
 }
 
 static int ci_ll_reset(struct dvb_ringbuffer *cibuf, struct file *file,
-               int slots, ca_slot_info_t *slot)
+                      int slots, ca_slot_info_t *slot)
 {
        int i;
        int len = 0;
@@ -370,7 +370,7 @@ static struct dvb_device dvbdev_ca = {
 
 int av7110_ca_register(struct av7110 *av7110)
 {
-       return dvb_register_device(av7110->dvb_adapter, &av7110->ca_dev,
+       return dvb_register_device(&av7110->dvb_adapter, &av7110->ca_dev,
                                   &dvbdev_ca, av7110, DVB_DEVICE_CA);
 }
 
index bd6e5ea4aefe3768ab960bff0d1440c5190d6e18..7fa4a0ebe133db1e2976be272245a4ba1dd61efe 100644 (file)
@@ -104,7 +104,7 @@ u32 av7110_debiread(struct av7110 *av7110, u32 config, int addr, int count)
 
 
 /* av7110 ARM core boot stuff */
-
+#if 0
 void av7110_reset_arm(struct av7110 *av7110)
 {
        saa7146_setgpio(av7110->dev, RESET_LINE, SAA7146_GPIO_OUTLO);
@@ -124,7 +124,7 @@ void av7110_reset_arm(struct av7110 *av7110)
        av7110->arm_ready = 1;
        dprintk(1, "reset ARM\n");
 }
-
+#endif  /*  0  */
 
 static int waitdebi(struct av7110 *av7110, int adr, int state)
 {
@@ -335,7 +335,7 @@ int av7110_wait_msgstate(struct av7110 *av7110, u16 flags)
        return 0;
 }
 
-int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
+static int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
 {
        int i;
        unsigned long start;
@@ -455,7 +455,7 @@ int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
        return 0;
 }
 
-int av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
+static int av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
 {
        int ret;
 
@@ -500,6 +500,7 @@ int av7110_fw_cmd(struct av7110 *av7110, int type, int com, int num, ...)
        return ret;
 }
 
+#if 0
 int av7110_send_ci_cmd(struct av7110 *av7110, u8 subcom, u8 *buf, u8 len)
 {
        int i, ret;
@@ -521,6 +522,7 @@ int av7110_send_ci_cmd(struct av7110 *av7110, u8 subcom, u8 *buf, u8 len)
                printk(KERN_ERR "dvb-ttpci: av7110_send_ci_cmd error %d\n", ret);
        return ret;
 }
+#endif  /*  0  */
 
 int av7110_fw_request(struct av7110 *av7110, u16 *request_buf,
                      int request_buf_len, u16 *reply_buf, int reply_buf_len)
@@ -593,7 +595,7 @@ int av7110_fw_request(struct av7110 *av7110, u16 *request_buf,
        return 0;
 }
 
-int av7110_fw_query(struct av7110 *av7110, u16 tag, u16* buf, s16 length)
+static int av7110_fw_query(struct av7110 *av7110, u16 tag, u16* buf, s16 length)
 {
        int ret;
        ret = av7110_fw_request(av7110, &tag, 0, buf, length);
@@ -617,7 +619,7 @@ int av7110_firmversion(struct av7110 *av7110)
 
        if (av7110_fw_query(av7110, tag, buf, 16)) {
                printk("dvb-ttpci: failed to boot firmware @ card %d\n",
-                      av7110->dvb_adapter->num);
+                      av7110->dvb_adapter.num);
                return -EIO;
        }
 
@@ -628,16 +630,16 @@ int av7110_firmversion(struct av7110 *av7110)
        av7110->avtype = (buf[8] << 16) + buf[9];
 
        printk("dvb-ttpci: info @ card %d: firm %08x, rtsl %08x, vid %08x, app %08x\n",
-              av7110->dvb_adapter->num, av7110->arm_fw,
+              av7110->dvb_adapter.num, av7110->arm_fw,
               av7110->arm_rtsl, av7110->arm_vid, av7110->arm_app);
 
        /* print firmware capabilities */
        if (FW_CI_LL_SUPPORT(av7110->arm_app))
                printk("dvb-ttpci: firmware @ card %d supports CI link layer interface\n",
-                      av7110->dvb_adapter->num);
+                      av7110->dvb_adapter.num);
        else
                printk("dvb-ttpci: no firmware support for CI link layer interface @ card %d\n",
-                      av7110->dvb_adapter->num);
+                      av7110->dvb_adapter.num);
 
        return 0;
 }
index bf901c6246821d85965f3eba25809fc7df5f046b..52061e17c6dd8607a2990b2b770a69ea8ba91855 100644 (file)
@@ -364,7 +364,6 @@ enum av7110_command_type {
 
 
 
-extern void av7110_reset_arm(struct av7110 *av7110);
 extern int av7110_bootarm(struct av7110 *av7110);
 extern int av7110_firmversion(struct av7110 *av7110);
 #define FW_CI_LL_SUPPORT(arm_app) ((arm_app) & 0x80000000)
@@ -373,12 +372,8 @@ extern int av7110_firmversion(struct av7110 *av7110);
 
 extern int av7110_wait_msgstate(struct av7110 *av7110, u16 flags);
 extern int av7110_fw_cmd(struct av7110 *av7110, int type, int com, int num, ...);
-extern int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length);
-extern int av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length);
-extern int av7110_send_ci_cmd(struct av7110 *av7110, u8 subcom, u8 *buf, u8 len);
 extern int av7110_fw_request(struct av7110 *av7110, u16 *request_buf,
                             int request_buf_len, u16 *reply_buf, int reply_buf_len);
-extern int av7110_fw_query(struct av7110 *av7110, u16 tag, u16* Buff, s16 length);
 
 
 /* DEBI (saa7146 data extension bus interface) access */
index 6d2256f1e3542511707c519ab7adf80f837a6bc9..665cdb8a3f718db433aa7c3c12c1b549429d3e53 100644 (file)
@@ -10,7 +10,7 @@
 
 #define UP_TIMEOUT (HZ/4)
 
-/* enable ir debugging by or'ing av7110_debug with 16 */
+/* enable ir debugging by or'ing debug with 16 */
 
 static int ir_initialized;
 static struct input_dev input_dev;
index eb84fb08d95cdd0926c20758e5ec7de800604e88..e65fc36e2ce8327884fa02f38d8bfc62bcfba487 100644 (file)
@@ -46,13 +46,13 @@ int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val)
 
        if (i2c_transfer(&av7110->i2c_adap, &msgs, 1) != 1) {
                dprintk(1, "dvb-ttpci: failed @ card %d, %u = %u\n",
-                      av7110->dvb_adapter->num, reg, val);
+                      av7110->dvb_adapter.num, reg, val);
                return -EIO;
        }
        return 0;
 }
 
-int msp_readreg(struct av7110 *av7110, u8 dev, u16 reg, u16 *val)
+static int msp_readreg(struct av7110 *av7110, u8 dev, u16 reg, u16 *val)
 {
        u8 msg1[3] = { dev, reg >> 8, reg & 0xff };
        u8 msg2[2];
@@ -63,7 +63,7 @@ int msp_readreg(struct av7110 *av7110, u8 dev, u16 reg, u16 *val)
 
        if (i2c_transfer(&av7110->i2c_adap, &msgs[0], 2) != 2) {
                dprintk(1, "dvb-ttpci: failed @ card %d, %u\n",
-                      av7110->dvb_adapter->num, reg);
+                      av7110->dvb_adapter.num, reg);
                return -EIO;
        }
        *val = (msg2[0] << 8) | msg2[1];
@@ -552,13 +552,13 @@ int av7110_init_analog_module(struct av7110 *av7110)
                return -ENODEV;
 
        printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3400\n",
-               av7110->dvb_adapter->num);
+               av7110->dvb_adapter.num);
        av7110->adac_type = DVB_ADAC_MSP;
        msleep(100); // the probing above resets the msp...
        msp_readreg(av7110, MSP_RD_DSP, 0x001e, &version1);
        msp_readreg(av7110, MSP_RD_DSP, 0x001f, &version2);
        dprintk(1, "dvb-ttpci: @ card %d MSP3400 version 0x%04x 0x%04x\n",
-               av7110->dvb_adapter->num, version1, version2);
+               av7110->dvb_adapter.num, version1, version2);
        msp_writereg(av7110, MSP_WR_DSP, 0x0013, 0x0c00);
        msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x7f00); // loudspeaker + headphone
        msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220); // loudspeaker source
@@ -596,7 +596,7 @@ int av7110_init_analog_module(struct av7110 *av7110)
                /* init the saa7113 */
                while (*i != 0xff) {
                        if (i2c_writereg(av7110, 0x48, i[0], i[1]) != 1) {
-                               dprintk(1, "saa7113 initialization failed @ card %d", av7110->dvb_adapter->num);
+                               dprintk(1, "saa7113 initialization failed @ card %d", av7110->dvb_adapter.num);
                                break;
                        }
                        i += 2;
@@ -726,11 +726,11 @@ static int std_callback(struct saa7146_dev* dev, struct saa7146_standard *std)
 {
        struct av7110 *av7110 = (struct av7110*) dev->ext_priv;
 
-       if (std->id == V4L2_STD_PAL) {
+       if (std->id & V4L2_STD_PAL) {
                av7110->vidmode = VIDEO_MODE_PAL;
                av7110_set_vidmode(av7110, av7110->vidmode);
        }
-       else if (std->id == V4L2_STD_NTSC) {
+       else if (std->id & V4L2_STD_NTSC) {
                av7110->vidmode = VIDEO_MODE_NTSC;
                av7110_set_vidmode(av7110, av7110->vidmode);
        }
index 14e963206b8901b7baa15d6668a090d36590605e..6e0f5d307c52de21c56ce2fa499272a85a6ed801 100644 (file)
@@ -59,8 +59,12 @@ struct budget_av {
        struct dvb_ca_en50221 ca;
 };
 
-static int enable_ci = 0;
-
+/* GPIO CI Connections:
+ * 0 - Vcc/Reset (Reset is controlled by capacitor)
+ * 1 - Attribute Memory
+ * 2 - Card Enable (Active Low)
+ * 3 - Card Detect
+ */
 
 /****************************************************************************
  * INITIALIZATION
@@ -188,22 +192,35 @@ static int ciintf_slot_reset(struct dvb_ca_en50221 *ca, int slot)
 {
        struct budget_av *budget_av = (struct budget_av *) ca->data;
        struct saa7146_dev *saa = budget_av->budget.dev;
-       int max = 20;
+       int timeout = 50; // 5 seconds (4.4.6 Ready)
 
        if (slot != 0)
                return -EINVAL;
 
        dprintk(1, "ciintf_slot_reset\n");
 
-       /* reset the card */
-       saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTHI);
-       msleep(100);
-       saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTLO);
+       saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTHI); /* disable card */
 
-       while (--max > 0 && ciintf_read_attribute_mem(ca, slot, 0) != 0x1d)
+       saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTHI); /* Vcc off */
+       msleep(2);
+       saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTLO); /* Vcc on */
+       msleep(20); /* 20 ms Vcc settling time */
+
+       saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTLO); /* enable card */
+
+       /* This should have been based on pin 16 READY of the pcmcia port,
+        * but AFAICS it is not routed to the saa7146 */
+       while (--timeout > 0 && ciintf_read_attribute_mem(ca, slot, 0) != 0x1d)
                msleep(100);
 
-       ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTB);
+       if (timeout <= 0)
+       {
+               printk(KERN_ERR "budget-av: cam reset failed (timeout).\n");
+               saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTHI); /* disable card */
+               saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTHI); /* Vcc off */
+               return -ETIMEDOUT;
+       }
+
        return 0;
 }
 
@@ -240,7 +257,6 @@ static int ciintf_poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open
 {
        struct budget_av *budget_av = (struct budget_av *) ca->data;
        struct saa7146_dev *saa = budget_av->budget.dev;
-       int cam = 0;
 
        if (slot != 0)
                return -EINVAL;
@@ -248,15 +264,21 @@ static int ciintf_poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open
        if (!budget_av->slot_status) {
                saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT);
                udelay(1);
-               cam = saa7146_read(saa, PSR) & MASK_06;
-               saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTLO);
-
-               if (cam)
+               if (saa7146_read(saa, PSR) & MASK_06)
+               {
+                       printk(KERN_INFO "budget-av: cam inserted\n");
                        budget_av->slot_status = 1;
+               }
+               saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTLO);
        } else if (!open) {
                saa7146_setgpio(budget_av->budget.dev, 1, SAA7146_GPIO_OUTLO);
                if (ttpci_budget_debiread(&budget_av->budget, DEBICICAM, 0, 1, 0, 1) == -ETIMEDOUT)
+               {
+                       printk(KERN_INFO "budget-av: cam ejected\n");
+                       saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTHI); /* disable card */
+                       saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTHI); /* Vcc off */
                        budget_av->slot_status = 0;
+               }
        }
 
        if (budget_av->slot_status == 1)
@@ -272,17 +294,11 @@ static int ciintf_init(struct budget_av *budget_av)
 
        memset(&budget_av->ca, 0, sizeof(struct dvb_ca_en50221));
 
-       /* setup GPIOs */
-       saa7146_setgpio(saa, 1, SAA7146_GPIO_OUTHI);
+       saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTLO);
+       saa7146_setgpio(saa, 1, SAA7146_GPIO_OUTLO);
        saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTLO);
        saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTLO);
 
-       /* Reset the card */
-       saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTHI);
-       msleep(50);
-       saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTLO);
-       msleep(100);
-
        /* Enable DEBI pins */
        saa7146_write(saa, MC1, saa7146_read(saa, MC1) | (0x800 << 16) | 0x800);
 
@@ -297,13 +313,14 @@ static int ciintf_init(struct budget_av *budget_av)
        budget_av->ca.slot_ts_enable = ciintf_slot_ts_enable;
        budget_av->ca.poll_slot_status = ciintf_poll_slot_status;
        budget_av->ca.data = budget_av;
-       if ((result = dvb_ca_en50221_init(budget_av->budget.dvb_adapter,
+
+       if ((result = dvb_ca_en50221_init(&budget_av->budget.dvb_adapter,
                                          &budget_av->ca, 0, 1)) != 0) {
-               printk("budget_av: CI interface detected, but initialisation failed.\n");
+               printk(KERN_ERR "budget-av: ci initialisation failed.\n");
                goto error;
        }
-       // success!
-       printk("ciintf_init: CI interface initialised\n");
+
+       printk(KERN_INFO "budget-av: ci interface initialised.\n");
        budget_av->budget.ci_present = 1;
        return 0;
 
@@ -361,8 +378,12 @@ static const u8 saa7113_tab[] = {
 static int saa7113_init(struct budget_av *budget_av)
 {
        struct budget *budget = &budget_av->budget;
+       struct saa7146_dev *saa = budget->dev;
        const u8 *data = saa7113_tab;
 
+       saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTHI);
+       msleep(200);
+
        if (i2c_writereg(&budget->i2c_adap, 0x4a, 0x01, 0x08) != 1) {
                dprintk(1, "saa7113 not found on KNC card\n");
                return -ENODEV;
@@ -697,75 +718,90 @@ static u8 read_pwm(struct budget_av *budget_av)
        return pwm;
 }
 
+#define SUBID_DVBS_KNC1                0x0010
+#define SUBID_DVBS_KNC1_PLUS   0x0011
+#define SUBID_DVBS_TYPHOON     0x4f56
+#define SUBID_DVBS_CINERGY1200 0x1154
+
+#define SUBID_DVBC_KNC1                0x0020
+#define SUBID_DVBC_KNC1_PLUS   0x0021
+#define SUBID_DVBC_CINERGY1200 0x1156
+
+#define SUBID_DVBT_KNC1_PLUS   0x0031
+#define SUBID_DVBT_KNC1                0x0030
+#define SUBID_DVBT_CINERGY1200 0x1157
 
 static void frontend_init(struct budget_av *budget_av)
 {
-       switch (budget_av->budget.dev->pci->subsystem_device) {
-       case 0x4f56:            // Typhoon/KNC1 DVB-S budget (stv0299/Philips SU1278(tsa5059))
-               budget_av->budget.dvb_frontend =
-                       stv0299_attach(&typhoon_config, &budget_av->budget.i2c_adap);
-               if (budget_av->budget.dvb_frontend != NULL) {
+       struct saa7146_dev * saa = budget_av->budget.dev;
+       struct dvb_frontend * fe = NULL;
+
+       switch (saa->pci->subsystem_device) {
+               case SUBID_DVBS_KNC1_PLUS:
+               case SUBID_DVBC_KNC1_PLUS:
+               case SUBID_DVBT_KNC1_PLUS:
+                       // Enable / PowerON Frontend
+                       saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTHI);
                        break;
-               }
+       }
+
+       switch (saa->pci->subsystem_device) {
+
+       case SUBID_DVBS_KNC1:
+       case SUBID_DVBS_KNC1_PLUS:
+       case SUBID_DVBS_TYPHOON:
+               fe = stv0299_attach(&typhoon_config,
+                                   &budget_av->budget.i2c_adap);
                break;
 
-       case 0x0020:            // KNC1 DVB-C budget (tda10021/Philips CU1216(tua6034))
-               budget_av->budget.dvb_frontend =
-                       tda10021_attach(&philips_cu1216_config,
-                                       &budget_av->budget.i2c_adap, read_pwm(budget_av));
-               if (budget_av->budget.dvb_frontend != NULL) {
-                       break;
-               }
+       case SUBID_DVBS_CINERGY1200:
+               fe = stv0299_attach(&cinergy_1200s_config,
+                                   &budget_av->budget.i2c_adap);
                break;
 
-       case 0x0030:            // KNC1 DVB-T budget (tda10046/Philips TU1216(tda6651tt))
-               budget_av->budget.dvb_frontend =
-                       tda10046_attach(&philips_tu1216_config, &budget_av->budget.i2c_adap);
-               if (budget_av->budget.dvb_frontend != NULL) {
-                       break;
-               }
+       case SUBID_DVBC_KNC1:
+       case SUBID_DVBC_KNC1_PLUS:
+               fe = tda10021_attach(&philips_cu1216_config,
+                                    &budget_av->budget.i2c_adap,
+                                    read_pwm(budget_av));
                break;
 
-       case 0x1154:            // TerraTec Cinergy 1200 DVB-S (stv0299/Philips SU1278(tsa5059))
-               budget_av->budget.dvb_frontend =
-                       stv0299_attach(&cinergy_1200s_config, &budget_av->budget.i2c_adap);
-               if (budget_av->budget.dvb_frontend != NULL) {
-                       break;
-               }
+       case SUBID_DVBT_KNC1:
+       case SUBID_DVBT_KNC1_PLUS:
+               fe = tda10046_attach(&philips_tu1216_config,
+                                    &budget_av->budget.i2c_adap);
                break;
 
-       case 0x1156:            // Terratec Cinergy 1200 DVB-C (tda10021/Philips CU1216(tua6034))
-               budget_av->budget.dvb_frontend =
-                       tda10021_attach(&philips_cu1216_config,
-                                       &budget_av->budget.i2c_adap, read_pwm(budget_av));
-               if (budget_av->budget.dvb_frontend) {
-                       break;
-               }
+       case SUBID_DVBC_CINERGY1200:
+               fe = tda10021_attach(&philips_cu1216_config,
+                                    &budget_av->budget.i2c_adap,
+                                    read_pwm(budget_av));
                break;
 
-       case 0x1157:            // Terratec Cinergy 1200 DVB-T (tda10046/Philips TU1216(tda6651tt))
-               budget_av->budget.dvb_frontend =
-                       tda10046_attach(&philips_tu1216_config, &budget_av->budget.i2c_adap);
-               if (budget_av->budget.dvb_frontend) {
-                       break;
-               }
+       case SUBID_DVBT_CINERGY1200:
+               fe = tda10046_attach(&philips_tu1216_config,
+                                    &budget_av->budget.i2c_adap);
                break;
        }
 
-       if (budget_av->budget.dvb_frontend == NULL) {
-               printk("budget_av: A frontend driver was not found for device %04x/%04x subsystem %04x/%04x\n",
-                      budget_av->budget.dev->pci->vendor,
-                      budget_av->budget.dev->pci->device,
-                      budget_av->budget.dev->pci->subsystem_vendor,
-                      budget_av->budget.dev->pci->subsystem_device);
-       } else {
-               if (dvb_register_frontend
-                   (budget_av->budget.dvb_adapter, budget_av->budget.dvb_frontend)) {
-                       printk("budget-av: Frontend registration failed!\n");
-                       if (budget_av->budget.dvb_frontend->ops->release)
-                               budget_av->budget.dvb_frontend->ops->release(budget_av->budget.dvb_frontend);
-                       budget_av->budget.dvb_frontend = NULL;
-               }
+       if (fe == NULL) {
+               printk(KERN_ERR "budget-av: A frontend driver was not found "
+                               "for device %04x/%04x subsystem %04x/%04x\n",
+                      saa->pci->vendor,
+                      saa->pci->device,
+                      saa->pci->subsystem_vendor,
+                      saa->pci->subsystem_device);
+               return;
+       }
+
+       budget_av->budget.dvb_frontend = fe;
+
+       if (dvb_register_frontend(&budget_av->budget.dvb_adapter,
+                                 budget_av->budget.dvb_frontend)) {
+               printk(KERN_ERR "budget-av: Frontend registration failed!\n");
+               if (budget_av->budget.dvb_frontend->ops->release)
+                       budget_av->budget.dvb_frontend->ops->release(budget_av->budget.dvb_frontend);
+               budget_av->budget.dvb_frontend = NULL;
        }
 }
 
@@ -822,6 +858,7 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
 
        memset(budget_av, 0, sizeof(struct budget_av));
 
+       budget_av->has_saa7113 = 0;
        budget_av->budget.ci_present = 0;
 
        dev->ext_priv = budget_av;
@@ -836,10 +873,7 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
        saa7146_write(dev, DD1_INIT, 0x07000600);
        saa7146_write(dev, MC2, MASK_09 | MASK_25 | MASK_10 | MASK_26);
 
-       saa7146_setgpio(dev, 0, SAA7146_GPIO_OUTHI);
-       msleep(500);
-
-       if (0 == saa7113_init(budget_av)) {
+       if (saa7113_init(budget_av) == 0) {
                budget_av->has_saa7113 = 1;
 
                if (0 != saa7146_vv_init(dev, &vv_data)) {
@@ -860,31 +894,26 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
 
                saa7113_setinput(budget_av, 0);
        } else {
-               budget_av->has_saa7113 = 0;
-
-               saa7146_setgpio(dev, 0, SAA7146_GPIO_OUTLO);
+               ciintf_init(budget_av);
        }
 
        /* fixme: find some sane values here... */
        saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
 
-       mac = budget_av->budget.dvb_adapter->proposed_mac;
+       mac = budget_av->budget.dvb_adapter.proposed_mac;
        if (i2c_readregs(&budget_av->budget.i2c_adap, 0xa0, 0x30, mac, 6)) {
-               printk("KNC1-%d: Could not read MAC from KNC1 card\n",
-                      budget_av->budget.dvb_adapter->num);
+               printk(KERN_ERR "KNC1-%d: Could not read MAC from KNC1 card\n",
+                      budget_av->budget.dvb_adapter.num);
                memset(mac, 0, 6);
        } else {
-               printk("KNC1-%d: MAC addr = %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
-                      budget_av->budget.dvb_adapter->num,
+               printk(KERN_INFO "KNC1-%d: MAC addr = %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
+                      budget_av->budget.dvb_adapter.num,
                       mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
        }
 
-       budget_av->budget.dvb_adapter->priv = budget_av;
+       budget_av->budget.dvb_adapter.priv = budget_av;
        frontend_init(budget_av);
 
-       if (enable_ci)
-               ciintf_init(budget_av);
-
        return 0;
 }
 
@@ -963,14 +992,21 @@ static struct saa7146_extension budget_extension;
 MAKE_BUDGET_INFO(knc1s, "KNC1 DVB-S", BUDGET_KNC1S);
 MAKE_BUDGET_INFO(knc1c, "KNC1 DVB-C", BUDGET_KNC1C);
 MAKE_BUDGET_INFO(knc1t, "KNC1 DVB-T", BUDGET_KNC1T);
+MAKE_BUDGET_INFO(knc1sp, "KNC1 DVB-S Plus", BUDGET_KNC1SP);
+MAKE_BUDGET_INFO(knc1cp, "KNC1 DVB-C Plus", BUDGET_KNC1CP);
+MAKE_BUDGET_INFO(knc1tp, "KNC1 DVB-T Plus", BUDGET_KNC1TP);
 MAKE_BUDGET_INFO(cin1200s, "TerraTec Cinergy 1200 DVB-S", BUDGET_CIN1200S);
 MAKE_BUDGET_INFO(cin1200c, "Terratec Cinergy 1200 DVB-C", BUDGET_CIN1200C);
 MAKE_BUDGET_INFO(cin1200t, "Terratec Cinergy 1200 DVB-T", BUDGET_CIN1200T);
 
 static struct pci_device_id pci_tbl[] = {
        MAKE_EXTENSION_PCI(knc1s, 0x1131, 0x4f56),
+       MAKE_EXTENSION_PCI(knc1s, 0x1131, 0x0010),
+       MAKE_EXTENSION_PCI(knc1sp, 0x1131, 0x0011),
        MAKE_EXTENSION_PCI(knc1c, 0x1894, 0x0020),
+       MAKE_EXTENSION_PCI(knc1cp, 0x1894, 0x0021),
        MAKE_EXTENSION_PCI(knc1t, 0x1894, 0x0030),
+       MAKE_EXTENSION_PCI(knc1tp, 0x1894, 0x0031),
        MAKE_EXTENSION_PCI(cin1200s, 0x153b, 0x1154),
        MAKE_EXTENSION_PCI(cin1200c, 0x153b, 0x1156),
        MAKE_EXTENSION_PCI(cin1200t, 0x153b, 0x1157),
@@ -1010,5 +1046,3 @@ MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, Michael Hunold, others");
 MODULE_DESCRIPTION("driver for the SAA7146 based so-called "
                   "budget PCI DVB w/ analog input and CI-module (e.g. the KNC cards)");
-module_param_named(enable_ci, enable_ci, int, 0644);
-MODULE_PARM_DESC(enable_ci, "Turn on/off CI module (default:off).");
index 521111be355822e78301f4ff3c54a55fb481848e..dce116111376e8c7322d5c35604e7882c3b67423 100644 (file)
@@ -395,7 +395,7 @@ static int ciintf_init(struct budget_ci *budget_ci)
        budget_ci->ca.slot_shutdown = ciintf_slot_shutdown;
        budget_ci->ca.slot_ts_enable = ciintf_slot_ts_enable;
        budget_ci->ca.data = budget_ci;
-       if ((result = dvb_ca_en50221_init(budget_ci->budget.dvb_adapter,
+       if ((result = dvb_ca_en50221_init(&budget_ci->budget.dvb_adapter,
                                          &budget_ci->ca,
                                          DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE |
                                          DVB_CA_EN50221_FLAG_IRQ_FR |
@@ -881,7 +881,7 @@ static void frontend_init(struct budget_ci *budget_ci)
                       budget_ci->budget.dev->pci->subsystem_device);
        } else {
                if (dvb_register_frontend
-                   (budget_ci->budget.dvb_adapter, budget_ci->budget.dvb_frontend)) {
+                   (&budget_ci->budget.dvb_adapter, budget_ci->budget.dvb_frontend)) {
                        printk("budget-ci: Frontend registration failed!\n");
                        if (budget_ci->budget.dvb_frontend->ops->release)
                                budget_ci->budget.dvb_frontend->ops->release(budget_ci->budget.dvb_frontend);
@@ -916,7 +916,7 @@ static int budget_ci_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
 
        ciintf_init(budget_ci);
 
-       budget_ci->budget.dvb_adapter->priv = budget_ci;
+       budget_ci->budget.dvb_adapter.priv = budget_ci;
        frontend_init(budget_ci);
 
        return 0;
index 93a9b40917e4302f172fde11ed012bcc72fd5dd3..0498a055a4cdfbe2d07df5b782e16c3644d35ebd 100644 (file)
@@ -298,7 +298,7 @@ static int budget_register(struct budget *budget)
        budget->dmxdev.demux = &dvbdemux->dmx;
        budget->dmxdev.capabilities = 0;
 
-       dvb_dmxdev_init(&budget->dmxdev, budget->dvb_adapter);
+       dvb_dmxdev_init(&budget->dmxdev, &budget->dvb_adapter);
 
        budget->hw_frontend.source = DMX_FRONTEND_0;
 
@@ -316,7 +316,7 @@ static int budget_register(struct budget *budget)
        if (ret < 0)
                return ret;
 
-       dvb_net_init(budget->dvb_adapter, &budget->dvb_net, &dvbdemux->dmx);
+       dvb_net_init(&budget->dvb_adapter, &budget->dvb_net, &dvbdemux->dmx);
 
        return 0;
 }
@@ -385,11 +385,11 @@ int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
        strcpy(budget->i2c_adap.name, budget->card->name);
 
        if (i2c_add_adapter(&budget->i2c_adap) < 0) {
-               dvb_unregister_adapter(budget->dvb_adapter);
+               dvb_unregister_adapter(&budget->dvb_adapter);
                return -ENOMEM;
        }
 
-       ttpci_eeprom_parse_mac(&budget->i2c_adap, budget->dvb_adapter->proposed_mac);
+       ttpci_eeprom_parse_mac(&budget->i2c_adap, budget->dvb_adapter.proposed_mac);
 
        if (NULL ==
            (budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci, length, &budget->pt))) {
@@ -417,7 +417,7 @@ err:
 
        vfree(budget->grabbing);
 
-       dvb_unregister_adapter(budget->dvb_adapter);
+       dvb_unregister_adapter(&budget->dvb_adapter);
 
        return ret;
 }
@@ -432,7 +432,7 @@ int ttpci_budget_deinit(struct budget *budget)
 
        i2c_del_adapter(&budget->i2c_adap);
 
-       dvb_unregister_adapter(budget->dvb_adapter);
+       dvb_unregister_adapter(&budget->dvb_adapter);
 
        tasklet_kill(&budget->vpe_tasklet);
 
index 5d524a4f213f3bbfc495b7e7cdf97f2bf4b9d0a6..8142e26b47f5d4bb5e2f460245e48254a2b7f96c 100644 (file)
@@ -453,7 +453,7 @@ static void frontend_init(struct budget_patch* budget)
                       budget->dev->pci->subsystem_vendor,
                       budget->dev->pci->subsystem_device);
        } else {
-               if (dvb_register_frontend(budget->dvb_adapter, budget->dvb_frontend)) {
+               if (dvb_register_frontend(&budget->dvb_adapter, budget->dvb_frontend)) {
                        printk("budget-av: Frontend registration failed!\n");
                        if (budget->dvb_frontend->ops->release)
                                budget->dvb_frontend->ops->release(budget->dvb_frontend);
@@ -702,7 +702,7 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
 
         dev->ext_priv = budget;
 
-       budget->dvb_adapter->priv = budget;
+       budget->dvb_adapter.priv = budget;
        frontend_init(budget);
 
         return 0;
index 5e6a10f4ad95bb84f9181722622dc2da5be13bc2..083fd44e5f905e539abe8e83fe1f3d2f3ec98cdd 100644 (file)
@@ -468,7 +468,7 @@ static void frontend_init(struct budget *budget)
                       budget->dev->pci->subsystem_vendor,
                       budget->dev->pci->subsystem_device);
        } else {
-               if (dvb_register_frontend(budget->dvb_adapter, budget->dvb_frontend)) {
+               if (dvb_register_frontend(&budget->dvb_adapter, budget->dvb_frontend)) {
                        printk("budget: Frontend registration failed!\n");
                        if (budget->dvb_frontend->ops->release)
                                budget->dvb_frontend->ops->release(budget->dvb_frontend);
@@ -497,7 +497,7 @@ static int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_
                return err;
        }
 
-       budget->dvb_adapter->priv = budget;
+       budget->dvb_adapter.priv = budget;
        frontend_init(budget);
 
        return 0;
index 10bd41f0363b05c59567f9b2c48e5f95bffde669..c6ef496ba70a069874cbee3443462f8755cb6691 100644 (file)
@@ -64,7 +64,7 @@ struct budget {
 
        spinlock_t debilock;
 
-       struct dvb_adapter *dvb_adapter;
+       struct dvb_adapter dvb_adapter;
        struct dvb_frontend *dvb_frontend;
        void *priv;
 };
@@ -92,6 +92,9 @@ static struct saa7146_pci_extension_data x_var = { \
 #define BUDGET_KNC1S              8
 #define BUDGET_KNC1C              9
 #define BUDGET_KNC1T              10
+#define BUDGET_KNC1SP             11
+#define BUDGET_KNC1CP             12
+#define BUDGET_KNC1TP             13
 
 #define BUDGET_VIDEO_PORTA         0
 #define BUDGET_VIDEO_PORTB         1
index 4c046ece883a8978c49033934bd1c5b3a39fd1e6..afa0e7a0e5067a68180e595a0cd88b4e8c13b904 100644 (file)
@@ -84,7 +84,7 @@ struct ttusb {
        struct semaphore semi2c;
        struct semaphore semusb;
 
-       struct dvb_adapter *adapter;
+       struct dvb_adapter adapter;
        struct usb_device *dev;
 
        struct i2c_adapter i2c_adap;
@@ -1065,7 +1065,7 @@ static int alps_tdmb7_pll_set(struct dvb_frontend* fe, struct dvb_frontend_param
        return 0;
 }
 
-struct cx22700_config alps_tdmb7_config = {
+static struct cx22700_config alps_tdmb7_config = {
        .demod_address = 0x43,
        .pll_set = alps_tdmb7_pll_set,
 };
@@ -1412,7 +1412,7 @@ static void frontend_init(struct ttusb* ttusb)
                       le16_to_cpu(ttusb->dev->descriptor.idVendor),
                       le16_to_cpu(ttusb->dev->descriptor.idProduct));
        } else {
-               if (dvb_register_frontend(ttusb->adapter, ttusb->fe)) {
+               if (dvb_register_frontend(&ttusb->adapter, ttusb->fe)) {
                        printk("dvb-ttusb-budget: Frontend registration failed!\n");
                        if (ttusb->fe->ops->release)
                                ttusb->fe->ops->release(ttusb->fe);
@@ -1462,7 +1462,7 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i
        up(&ttusb->semi2c);
 
        dvb_register_adapter(&ttusb->adapter, "Technotrend/Hauppauge Nova-USB", THIS_MODULE);
-       ttusb->adapter->priv = ttusb;
+       ttusb->adapter.priv = ttusb;
 
        /* i2c */
        memset(&ttusb->i2c_adap, 0, sizeof(struct i2c_adapter));
@@ -1481,7 +1481,7 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i
 
        result = i2c_add_adapter(&ttusb->i2c_adap);
        if (result) {
-               dvb_unregister_adapter (ttusb->adapter);
+               dvb_unregister_adapter (&ttusb->adapter);
                return result;
        }
 
@@ -1503,7 +1503,7 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i
        if ((result = dvb_dmx_init(&ttusb->dvb_demux)) < 0) {
                printk("ttusb_dvb: dvb_dmx_init failed (errno = %d)\n", result);
                i2c_del_adapter(&ttusb->i2c_adap);
-               dvb_unregister_adapter (ttusb->adapter);
+               dvb_unregister_adapter (&ttusb->adapter);
                return -ENODEV;
        }
 //FIXME dmxdev (nur WAS?)
@@ -1511,21 +1511,21 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i
        ttusb->dmxdev.demux = &ttusb->dvb_demux.dmx;
        ttusb->dmxdev.capabilities = 0;
 
-       if ((result = dvb_dmxdev_init(&ttusb->dmxdev, ttusb->adapter)) < 0) {
+       if ((result = dvb_dmxdev_init(&ttusb->dmxdev, &ttusb->adapter)) < 0) {
                printk("ttusb_dvb: dvb_dmxdev_init failed (errno = %d)\n",
                       result);
                dvb_dmx_release(&ttusb->dvb_demux);
                i2c_del_adapter(&ttusb->i2c_adap);
-               dvb_unregister_adapter (ttusb->adapter);
+               dvb_unregister_adapter (&ttusb->adapter);
                return -ENODEV;
        }
 
-       if (dvb_net_init(ttusb->adapter, &ttusb->dvbnet, &ttusb->dvb_demux.dmx)) {
+       if (dvb_net_init(&ttusb->adapter, &ttusb->dvbnet, &ttusb->dvb_demux.dmx)) {
                printk("ttusb_dvb: dvb_net_init failed!\n");
                dvb_dmxdev_release(&ttusb->dmxdev);
                dvb_dmx_release(&ttusb->dvb_demux);
                i2c_del_adapter(&ttusb->i2c_adap);
-               dvb_unregister_adapter (ttusb->adapter);
+               dvb_unregister_adapter (&ttusb->adapter);
                return -ENODEV;
        }
 
@@ -1559,7 +1559,7 @@ static void ttusb_disconnect(struct usb_interface *intf)
        dvb_dmx_release(&ttusb->dvb_demux);
        if (ttusb->fe != NULL) dvb_unregister_frontend(ttusb->fe);
        i2c_del_adapter(&ttusb->i2c_adap);
-       dvb_unregister_adapter(ttusb->adapter);
+       dvb_unregister_adapter(&ttusb->adapter);
 
        ttusb_free_iso_urbs(ttusb);
 
index 64e771bd890782f51fb836ec29f902d49f651597..505bdaff5a7eea16ff148ba87d9f74d7ea93043b 100644 (file)
@@ -98,7 +98,7 @@ struct ttusb_dec {
        int                             can_playback;
 
        /* DVB bits */
-       struct dvb_adapter              *adapter;
+       struct dvb_adapter              adapter;
        struct dmxdev                   dmxdev;
        struct dvb_demux                demux;
        struct dmx_frontend             frontend;
@@ -1435,7 +1435,7 @@ static int ttusb_dec_init_dvb(struct ttusb_dec *dec)
                printk("%s: dvb_dmx_init failed: error %d\n", __FUNCTION__,
                       result);
 
-               dvb_unregister_adapter(dec->adapter);
+               dvb_unregister_adapter(&dec->adapter);
 
                return result;
        }
@@ -1444,12 +1444,12 @@ static int ttusb_dec_init_dvb(struct ttusb_dec *dec)
        dec->dmxdev.demux = &dec->demux.dmx;
        dec->dmxdev.capabilities = 0;
 
-       if ((result = dvb_dmxdev_init(&dec->dmxdev, dec->adapter)) < 0) {
+       if ((result = dvb_dmxdev_init(&dec->dmxdev, &dec->adapter)) < 0) {
                printk("%s: dvb_dmxdev_init failed: error %d\n",
                       __FUNCTION__, result);
 
                dvb_dmx_release(&dec->demux);
-               dvb_unregister_adapter(dec->adapter);
+               dvb_unregister_adapter(&dec->adapter);
 
                return result;
        }
@@ -1463,7 +1463,7 @@ static int ttusb_dec_init_dvb(struct ttusb_dec *dec)
 
                dvb_dmxdev_release(&dec->dmxdev);
                dvb_dmx_release(&dec->demux);
-               dvb_unregister_adapter(dec->adapter);
+               dvb_unregister_adapter(&dec->adapter);
 
                return result;
        }
@@ -1476,12 +1476,12 @@ static int ttusb_dec_init_dvb(struct ttusb_dec *dec)
                dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
                dvb_dmxdev_release(&dec->dmxdev);
                dvb_dmx_release(&dec->demux);
-               dvb_unregister_adapter(dec->adapter);
+               dvb_unregister_adapter(&dec->adapter);
 
                return result;
        }
 
-       dvb_net_init(dec->adapter, &dec->dvb_net, &dec->demux.dmx);
+       dvb_net_init(&dec->adapter, &dec->dvb_net, &dec->demux.dmx);
 
        return 0;
 }
@@ -1496,7 +1496,7 @@ static void ttusb_dec_exit_dvb(struct ttusb_dec *dec)
        dvb_dmxdev_release(&dec->dmxdev);
        dvb_dmx_release(&dec->demux);
        if (dec->fe) dvb_unregister_frontend(dec->fe);
-       dvb_unregister_adapter(dec->adapter);
+       dvb_unregister_adapter(&dec->adapter);
 }
 
 static void ttusb_dec_exit_rc(struct ttusb_dec *dec)
@@ -1565,15 +1565,15 @@ static void ttusb_dec_exit_filters(struct ttusb_dec *dec)
        }
 }
 
-int fe_send_command(struct dvb_frontend* fe, const u8 command,
-                   int param_length, const u8 params[],
-                   int *result_length, u8 cmd_result[])
+static int fe_send_command(struct dvb_frontend* fe, const u8 command,
+                          int param_length, const u8 params[],
+                          int *result_length, u8 cmd_result[])
 {
        struct ttusb_dec* dec = (struct ttusb_dec*) fe->dvb->priv;
        return ttusb_dec_send_command(dec, command, param_length, params, result_length, cmd_result);
 }
 
-struct ttusbdecfe_config fe_config = {
+static struct ttusbdecfe_config fe_config = {
        .send_command = fe_send_command
 };
 
@@ -1620,7 +1620,7 @@ static int ttusb_dec_probe(struct usb_interface *intf,
        }
        ttusb_dec_init_dvb(dec);
 
-       dec->adapter->priv = dec;
+       dec->adapter.priv = dec;
        switch (le16_to_cpu(id->idProduct)) {
        case 0x1006:
                dec->fe = ttusbdecfe_dvbs_attach(&fe_config);
@@ -1637,7 +1637,7 @@ static int ttusb_dec_probe(struct usb_interface *intf,
                       le16_to_cpu(dec->udev->descriptor.idVendor),
                       le16_to_cpu(dec->udev->descriptor.idProduct));
        } else {
-               if (dvb_register_frontend(dec->adapter, dec->fe)) {
+               if (dvb_register_frontend(&dec->adapter, dec->fe)) {
                        printk("budget-ci: Frontend registration failed!\n");
                        if (dec->fe->ops->release)
                                dec->fe->ops->release(dec->fe);
index d3dd4228b72d46c72a2ee7bbe7c4e6a2dfd03ba0..6c05fddb69ab484841abefdf007e52ebc4d17bf5 100644 (file)
@@ -240,6 +240,7 @@ config VIDEO_SAA7134
        select VIDEO_BUF
        select VIDEO_IR
        select VIDEO_TUNER
+       select CRC32
        ---help---
          This is a video4linux driver for Philips SAA7130/7134 based
          TV cards.
index 85224b90e394643ef40e18deaa146867ae47105f..6334122704aecead4a200695d649c2f544522110 100644 (file)
@@ -1946,7 +1946,6 @@ struct tvcard bttv_tvcards[] = {
         .no_tda9875     = 1,
         .no_tda7432     = 1,
         .tuner_type     = TUNER_ABSENT,
-        .no_video       = 1,
        .pll            = PLL_28,
 },{
        .name           = "Teppro TEV-560/InterVision IV-560",
index e3f477dff82782d865d2cd5173308a2381aae230..c2368bc832edc248978cb646218184da59d0b4bc 100644 (file)
@@ -363,6 +363,9 @@ int bttv_I2CWrite(struct bttv *btv, unsigned char addr, unsigned char b1,
 /* read EEPROM content */
 void __devinit bttv_readee(struct bttv *btv, unsigned char *eedata, int addr)
 {
+       memset(eedata, 0, 256);
+       if (0 != btv->i2c_rc)
+               return;
        btv->i2c_client.addr = addr >> 1;
        tveeprom_read(&btv->i2c_client, eedata, 256);
 }
index fe6abe34168c01539160ecae23a1f48d07a77f1a..1db0226829806af405a786df5d0ae5e20f4beee7 100644 (file)
@@ -43,15 +43,15 @@ enum saa6752hs_videoformat {
 static const struct v4l2_format v4l2_format_table[] =
 {
        [SAA6752HS_VF_D1] = {
-               .fmt.pix.width = 720, .fmt.pix.height = 576 },
+               .fmt = { .pix = { .width = 720, .height = 576 }, }, },
        [SAA6752HS_VF_2_3_D1] = {
-               .fmt.pix.width = 480, .fmt.pix.height = 576 },
+               .fmt = { .pix = { .width = 480, .height = 576 }, }, },
        [SAA6752HS_VF_1_2_D1] = {
-               .fmt.pix.width = 352, .fmt.pix.height = 576 },
+               .fmt = { .pix = { .width = 352, .height = 576 }, }, },
        [SAA6752HS_VF_SIF] = {
-               .fmt.pix.width = 352, .fmt.pix.height = 288 },
+               .fmt = { .pix = { .width = 352, .height = 288 }, }, },
        [SAA6752HS_VF_UNKNOWN] = {
-               .fmt.pix.width = 0, .fmt.pix.height = 0},
+               .fmt = { .pix = { .width = 0, .height = 0 }, }, },
 };
 
 struct saa6752hs_state {
index 31cc4ed9b74730673a550ad2d62a45a9caf0573e..5f870075b55e595df3e8384d0812279092ed3259 100644 (file)
@@ -149,10 +149,10 @@ int videobuf_dvb_register(struct videobuf_dvb *dvb,
                       dvb->name, result);
                goto fail_adapter;
        }
-       dvb->adapter->priv = adapter_priv;
+       dvb->adapter.priv = adapter_priv;
 
        /* register frontend */
-       result = dvb_register_frontend(dvb->adapter, dvb->frontend);
+       result = dvb_register_frontend(&dvb->adapter, dvb->frontend);
        if (result < 0) {
                printk(KERN_WARNING "%s: dvb_register_frontend failed (errno = %d)\n",
                       dvb->name, result);
@@ -178,7 +178,7 @@ int videobuf_dvb_register(struct videobuf_dvb *dvb,
        dvb->dmxdev.filternum    = 256;
        dvb->dmxdev.demux        = &dvb->demux.dmx;
        dvb->dmxdev.capabilities = 0;
-       result = dvb_dmxdev_init(&dvb->dmxdev, dvb->adapter);
+       result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
        if (result < 0) {
                printk(KERN_WARNING "%s: dvb_dmxdev_init failed (errno = %d)\n",
                       dvb->name, result);
@@ -209,7 +209,7 @@ int videobuf_dvb_register(struct videobuf_dvb *dvb,
        }
 
        /* register network adapter */
-       dvb_net_init(dvb->adapter, &dvb->net, &dvb->demux.dmx);
+       dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
        return 0;
 
 fail_fe_conn:
@@ -223,7 +223,7 @@ fail_dmxdev:
 fail_dmx:
        dvb_unregister_frontend(dvb->frontend);
 fail_frontend:
-       dvb_unregister_adapter(dvb->adapter);
+       dvb_unregister_adapter(&dvb->adapter);
 fail_adapter:
        return result;
 }
@@ -236,7 +236,7 @@ void videobuf_dvb_unregister(struct videobuf_dvb *dvb)
        dvb_dmxdev_release(&dvb->dmxdev);
        dvb_dmx_release(&dvb->demux);
        dvb_unregister_frontend(dvb->frontend);
-       dvb_unregister_adapter(dvb->adapter);
+       dvb_unregister_adapter(&dvb->adapter);
 }
 
 EXPORT_SYMBOL(videobuf_dvb_register);
index 452418b24d7baec880ffc9f8d319602299deb0bc..33f209a39cb62263d9f93d5600cdd197d301d77f 100644 (file)
@@ -2,34 +2,54 @@
 menu "Fusion MPT device support"
 
 config FUSION
-       tristate "Fusion MPT (base + ScsiHost) drivers"
+       bool
+       default n
+
+config FUSION_SPI
+       tristate "Fusion MPT ScsiHost drivers for SPI"
+       depends on PCI && SCSI
+       select FUSION
+       ---help---
+         SCSI HOST support for a parallel SCSI host adapters.
+
+         List of supported controllers:
+
+         LSI53C1020
+         LSI53C1020A
+         LSI53C1030
+         LSI53C1035
+
+config FUSION_FC
+       tristate "Fusion MPT ScsiHost drivers for FC"
        depends on PCI && SCSI
+       select FUSION
        ---help---
-         LSI Logic Fusion(TM) Message Passing Technology (MPT) device support
-         provides high performance SCSI host initiator, and LAN [1] interface
-         services to a host system.  The Fusion architecture is capable of
-         duplexing these protocols on high-speed Fibre Channel
-         (up to 2 GHz x 2 ports = 4 GHz) and parallel SCSI (up to Ultra-320)
-         physical medium.
+         SCSI HOST support for a Fiber Channel host adapters.
 
-         [1] LAN is not supported on parallel SCSI medium.
+         List of supported controllers:
+
+         LSIFC909
+         LSIFC919
+         LSIFC919X
+         LSIFC929
+         LSIFC929X
+         LSIFC929XL
 
 config FUSION_MAX_SGE
-       int "Maximum number of scatter gather entries"
+       int "Maximum number of scatter gather entries (16 - 128)"
        depends on FUSION
-       default "40"
+       default "128"
+       range 16 128
        help
          This option allows you to specify the maximum number of scatter-
-         gather entries per I/O. The driver defaults to 40, a reasonable number
-         for most systems. However, the user may increase this up to 128.
-         Increasing this parameter will require significantly more memory 
-         on a per controller instance. Increasing the parameter is not
-         necessary (or recommended) unless the user will be running 
-         large I/O's via the raw interface.
+         gather entries per I/O. The driver default is 128, which matches
+         SCSI_MAX_PHYS_SEGMENTS. However, it may decreased down to 16.
+         Decreasing this parameter will reduce memory requirements
+         on a per controller instance.
 
 config FUSION_CTL
        tristate "Fusion MPT misc device (ioctl) driver"
-       depends on FUSION
+       depends on FUSION_SPI || FUSION_FC
        ---help---
          The Fusion MPT misc device driver provides specialized control
          of MPT adapters via system ioctl calls.  Use of ioctl calls to
@@ -48,7 +68,7 @@ config FUSION_CTL
 
 config FUSION_LAN
        tristate "Fusion MPT LAN driver"
-       depends on FUSION && NET_FC
+       depends on FUSION_FC && NET_FC
        ---help---
          This module supports LAN IP traffic over Fibre Channel port(s)
          on Fusion MPT compatible hardware (LSIFC9xx chips).
index f6fdcaaefc896c1dfa21fe8f865ec48db3d4f7fb..1d2f9db813c15ff9bc7d8b867a4b46fdb0f5c8c4 100644 (file)
@@ -1,52 +1,38 @@
-#
-# Makefile for the LSI Logic Fusion MPT (Message Passing Technology) drivers.
-#
-# Note! If you want to turn on various debug defines for an extended period of
-# time but don't want them lingering around in the Makefile when you pass it on
-# to someone else, use the MPT_CFLAGS env variable (thanks Steve). -nromer
-
-#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-{ LSI_LOGIC
-
-#  Architecture-specific...
-#                      # intel
-#EXTRA_CFLAGS += -g
-#                      # sparc64
-#EXTRA_CFLAGS += -gstabs+
-
-EXTRA_CFLAGS += ${MPT_CFLAGS}
-
 # Fusion MPT drivers; recognized debug defines...
 #  MPT general:
-#EXTRA_CFLAGS += -DMPT_DEBUG_SCSI
 #EXTRA_CFLAGS += -DMPT_DEBUG
 #EXTRA_CFLAGS += -DMPT_DEBUG_MSG_FRAME
 #EXTRA_CFLAGS += -DMPT_DEBUG_SG
+#EXTRA_CFLAGS += -DMPT_DEBUG_EVENTS
+#EXTRA_CFLAGS += -DMPT_DEBUG_INIT
+#EXTRA_CFLAGS += -DMPT_DEBUG_EXIT
+#EXTRA_CFLAGS += -DMPT_DEBUG_FAIL
+
 
 #
 # driver/module specifics...
 #
 #  For mptbase:
 #CFLAGS_mptbase.o += -DMPT_DEBUG_HANDSHAKE
+#CFLAGS_mptbase.o += -DMPT_DEBUG_CONFIG
+#CFLAGS_mptbase.o += -DMPT_DEBUG_DL
 #CFLAGS_mptbase.o += -DMPT_DEBUG_IRQ
+#CFLAGS_mptbase.o += -DMPT_DEBUG_RESET
 #
 #  For mptscsih:
-#CFLAGS_mptscsih.o += -DMPT_DEBUG_SCANDV
-#CFLAGS_mptscsih.o += -DMPT_DEBUG_RESET
-#CFLAGS_mptscsih.o += -DMPT_DEBUG_NEH
+#CFLAGS_mptscsih.o += -DMPT_DEBUG_DV
+#CFLAGS_mptscsih.o += -DMPT_DEBUG_NEGO
+#CFLAGS_mptscsih.o += -DMPT_DEBUG_TM
+#CFLAGS_mptscsih.o += -DMPT_DEBUG_SCSI
+#CFLAGS_mptscsih.o += -DMPT_DEBUG_REPLY
 #
 #  For mptctl:
 #CFLAGS_mptctl.o += -DMPT_DEBUG_IOCTL
 #
-#  For mptlan:
-#CFLAGS_mptlan.o += -DMPT_LAN_IO_DEBUG
-#
-#  For isense:
-
-#  EXP...
-##mptscsih-objs        := scsihost.o scsiherr.o
 
 #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-} LSI_LOGIC
 
-obj-$(CONFIG_FUSION)           += mptbase.o mptscsih.o
+obj-$(CONFIG_FUSION_SPI)       += mptbase.o mptscsih.o mptspi.o
+obj-$(CONFIG_FUSION_FC)                += mptbase.o mptscsih.o mptfc.o
 obj-$(CONFIG_FUSION_CTL)       += mptctl.o
 obj-$(CONFIG_FUSION_LAN)       += mptlan.o
index 9dbb061265feaaf041cbb3de39458fc4ba7fbb4e..9f98334e5076bccd0171325fbf3ad084debba632 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2000-2003 LSI Logic Corporation.
+ *  Copyright (c) 2000-2005 LSI Logic Corporation.
  *
  *
  *           Name:  mpi.h
  *          Title:  MPI Message independent structures and definitions
  *  Creation Date:  July 27, 2000
  *
- *    mpi.h Version:  01.05.xx
+ *    mpi.h Version:  01.05.07
  *
  *  Version History
  *  ---------------
  *                      obsoleted define MPI_IOCSTATUS_TARGET_INVALID_IOCINDEX.
  *  04-01-03  01.02.09  New IOCStatus code: MPI_IOCSTATUS_FC_EXCHANGE_CANCELED
  *  06-26-03  01.02.10  Bumped MPI_HEADER_VERSION_UNIT value.
+ *  01-16-04  01.02.11  Added define for MPI_IOCLOGINFO_TYPE_SHIFT.
+ *  04-29-04  01.02.12  Added function codes for MPI_FUNCTION_DIAG_BUFFER_POST
+ *                      and MPI_FUNCTION_DIAG_RELEASE.
+ *                      Added MPI_IOCSTATUS_DIAGNOSTIC_RELEASED define.
+ *                      Bumped MPI_HEADER_VERSION_UNIT value.
+ *  05-11-04  01.03.01  Bumped MPI_VERSION_MINOR for MPI v1.3.
+ *                      Added codes for Inband.
+ *  08-19-04  01.05.01  Added defines for Host Buffer Access Control doorbell.
+ *                      Added define for offset of High Priority Request Queue.
+ *                      Added new function codes and new IOCStatus codes.
+ *                      Added a IOCLogInfo type of SAS.
+ *  12-07-04  01.05.02  Bumped MPI_HEADER_VERSION_UNIT.
+ *  12-09-04  01.05.03  Bumped MPI_HEADER_VERSION_UNIT.
+ *  01-15-05  01.05.04  Bumped MPI_HEADER_VERSION_UNIT.
+ *  02-09-05  01.05.05  Bumped MPI_HEADER_VERSION_UNIT.
+ *  02-22-05  01.05.06  Bumped MPI_HEADER_VERSION_UNIT.
+ *  03-11-05  01.05.07  Removed function codes for SCSI IO 32 and
+ *                      TargetAssistExtended requests.
+ *                      Removed EEDP IOCStatus codes.
  *  --------------------------------------------------------------------------
  */
 
 /* Note: The major versions of 0xe0 through 0xff are reserved */
 
 /* versioning for this MPI header set */
-#define MPI_HEADER_VERSION_UNIT             (0x00)
+#define MPI_HEADER_VERSION_UNIT             (0x09)
 #define MPI_HEADER_VERSION_DEV              (0x00)
 #define MPI_HEADER_VERSION_UNIT_MASK        (0xFF00)
 #define MPI_HEADER_VERSION_UNIT_SHIFT       (8)
 *
 *****************************************************************************/
 
-/* S y s t e m    D o o r b e l l */
+/*
+ * Defines for working with the System Doorbell register.
+ * Values for doorbell function codes are included in the section that defines
+ * all the function codes (further on in this file).
+ */
 #define MPI_DOORBELL_OFFSET                 (0x00000000)
 #define MPI_DOORBELL_ACTIVE                 (0x08000000) /* DoorbellUsed */
 #define MPI_DOORBELL_USED                   (MPI_DOORBELL_ACTIVE)
 #define MPI_DOORBELL_ADD_DWORDS_MASK        (0x00FF0000)
 #define MPI_DOORBELL_ADD_DWORDS_SHIFT       (16)
 #define MPI_DOORBELL_DATA_MASK              (0x0000FFFF)
+#define MPI_DOORBELL_FUNCTION_SPECIFIC_MASK (0x0000FFFF)
+
+/* values for Host Buffer Access Control doorbell function */
+#define MPI_DB_HPBAC_VALUE_MASK             (0x0000F000)
+#define MPI_DB_HPBAC_ENABLE_ACCESS          (0x01)
+#define MPI_DB_HPBAC_DISABLE_ACCESS         (0x02)
+#define MPI_DB_HPBAC_FREE_BUFFER            (0x03)
 
 
 #define MPI_WRITE_SEQUENCE_OFFSET           (0x00000004)
 
 #define MPI_FUNCTION_SMP_PASSTHROUGH                (0x1A)
 #define MPI_FUNCTION_SAS_IO_UNIT_CONTROL            (0x1B)
+#define MPI_FUNCTION_SATA_PASSTHROUGH               (0x1C)
 
-#define MPI_DIAG_BUFFER_POST                        (0x1D)
-#define MPI_DIAG_RELEASE                            (0x1E)
-
-#define MPI_FUNCTION_SCSI_IO_32                     (0x1F)
+#define MPI_FUNCTION_DIAG_BUFFER_POST               (0x1D)
+#define MPI_FUNCTION_DIAG_RELEASE                   (0x1E)
 
 #define MPI_FUNCTION_LAN_SEND                       (0x20)
 #define MPI_FUNCTION_LAN_RECEIVE                    (0x21)
 #define MPI_FUNCTION_LAN_RESET                      (0x22)
 
+#define MPI_FUNCTION_TARGET_CMD_BUF_BASE_POST       (0x24)
+#define MPI_FUNCTION_TARGET_CMD_BUF_LIST_POST       (0x25)
+
 #define MPI_FUNCTION_INBAND_BUFFER_POST             (0x28)
 #define MPI_FUNCTION_INBAND_SEND                    (0x29)
 #define MPI_FUNCTION_INBAND_RSP                     (0x2A)
 #define MPI_FUNCTION_IO_UNIT_RESET                  (0x41)
 #define MPI_FUNCTION_HANDSHAKE                      (0x42)
 #define MPI_FUNCTION_REPLY_FRAME_REMOVAL            (0x43)
+#define MPI_FUNCTION_HOST_PAGEBUF_ACCESS_CONTROL    (0x44)
 
 
 /* standard version format */
@@ -328,8 +361,8 @@ typedef struct _SGE_SIMPLE_UNION
         U32                 Address32;
         U64                 Address64;
     }u;
-} SGESimpleUnion_t, MPI_POINTER pSGESimpleUnion_t,
-  SGE_SIMPLE_UNION, MPI_POINTER PTR_SGE_SIMPLE_UNION;
+} SGE_SIMPLE_UNION, MPI_POINTER PTR_SGE_SIMPLE_UNION,
+  SGESimpleUnion_t, MPI_POINTER pSGESimpleUnion_t;
 
 /****************************************************************************/
 /*  Chain element structures                                                */
@@ -648,27 +681,21 @@ typedef struct _MSG_DEFAULT_REPLY
 #define MPI_IOCSTATUS_SCSI_EXT_TERMINATED       (0x004C)
 
 /****************************************************************************/
-/*  For use by SCSI Initiator and SCSI Target end-to-end data protection    */
-/****************************************************************************/
-
-#define MPI_IOCSTATUS_EEDP_CRC_ERROR            (0x004D)
-#define MPI_IOCSTATUS_EEDP_LBA_TAG_ERROR        (0x004E)
-#define MPI_IOCSTATUS_EEDP_APP_TAG_ERROR        (0x004F)
-
-
-/****************************************************************************/
-/*  SCSI (SPI & FCP) target values                                          */
+/*  SCSI Target values                                                      */
 /****************************************************************************/
 
 #define MPI_IOCSTATUS_TARGET_PRIORITY_IO         (0x0060)
 #define MPI_IOCSTATUS_TARGET_INVALID_PORT        (0x0061)
-#define MPI_IOCSTATUS_TARGET_INVALID_IOCINDEX    (0x0062)   /* obsolete */
+#define MPI_IOCSTATUS_TARGET_INVALID_IOCINDEX    (0x0062)   /* obsolete name */
 #define MPI_IOCSTATUS_TARGET_INVALID_IO_INDEX    (0x0062)
 #define MPI_IOCSTATUS_TARGET_ABORTED             (0x0063)
 #define MPI_IOCSTATUS_TARGET_NO_CONN_RETRYABLE   (0x0064)
 #define MPI_IOCSTATUS_TARGET_NO_CONNECTION       (0x0065)
 #define MPI_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH (0x006A)
 #define MPI_IOCSTATUS_TARGET_STS_DATA_NOT_SENT   (0x006B)
+#define MPI_IOCSTATUS_TARGET_DATA_OFFSET_ERROR   (0x006D)
+#define MPI_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA (0x006E)
+#define MPI_IOCSTATUS_TARGET_IU_TOO_SHORT        (0x006F)
 
 /****************************************************************************/
 /*  Additional FCP target values (obsolete)                                 */
@@ -707,6 +734,7 @@ typedef struct _MSG_DEFAULT_REPLY
 /****************************************************************************/
 
 #define MPI_IOCSTATUS_SAS_SMP_REQUEST_FAILED    (0x0090)
+#define MPI_IOCSTATUS_SAS_SMP_DATA_OVERRUN      (0x0091)
 
 /****************************************************************************/
 /*  Inband values                                                           */
index a5680d864bf0bf576bf81e2c4afe97da8392a114..15b12b06799d2c4c8d54cb9d215245ee095b1f6d 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2000-2003 LSI Logic Corporation.
+ *  Copyright (c) 2000-2005 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_cnfg.h
  *          Title:  MPI Config message, structures, and Pages
  *  Creation Date:  July 27, 2000
  *
- *    mpi_cnfg.h Version:  01.05.xx
+ *    mpi_cnfg.h Version:  01.05.08
  *
  *  Version History
  *  ---------------
  *                      In CONFIG_PAGE_FC_DEVICE_0, replaced Reserved1 field
  *                      with ADISCHardALPA.
  *                      Added MPI_FC_DEVICE_PAGE0_PROT_FCP_RETRY define.
+ *  01-16-04 01.02.13   Added InitiatorDeviceTimeout and InitiatorIoPendTimeout
+ *                      fields and related defines to CONFIG_PAGE_FC_PORT_1.
+ *                      Added define for
+ *                      MPI_FCPORTPAGE1_FLAGS_SOFT_ALPA_FALLBACK.
+ *                      Added new fields to the substructures of
+ *                      CONFIG_PAGE_FC_PORT_10.
+ *  04-29-04 01.02.14   Added define for IDP bit for CONFIG_PAGE_SCSI_PORT_0,
+ *                      CONFIG_PAGE_SCSI_DEVICE_0, and
+ *                      CONFIG_PAGE_SCSI_DEVICE_1. Also bumped Page Version for
+ *                      these pages.
+ *  05-11-04 01.03.01   Added structure for CONFIG_PAGE_INBAND_0.
+ *  08-19-04 01.05.01   Modified MSG_CONFIG request to support extended config
+ *                      pages.
+ *                      Added a new structure for extended config page header.
+ *                      Added new extended config pages types and structures for
+ *                      SAS IO Unit, SAS Expander, SAS Device, and SAS PHY.
+ *                      Replaced a reserved byte in CONFIG_PAGE_MANUFACTURING_4
+ *                      to add a Flags field.
+ *                      Two new Manufacturing config pages (5 and 6).
+ *                      Two new bits defined for IO Unit Page 1 Flags field.
+ *                      Modified CONFIG_PAGE_IO_UNIT_2 to add three new fields
+ *                      to specify the BIOS boot device.
+ *                      Four new Flags bits defined for IO Unit Page 2.
+ *                      Added IO Unit Page 4.
+ *                      Added EEDP Flags settings to IOC Page 1.
+ *                      Added new BIOS Page 1 config page.
+ *  10-05-04 01.05.02   Added define for
+ *                      MPI_IOCPAGE1_INITIATOR_CONTEXT_REPLY_DISABLE.
+ *                      Added new Flags field to CONFIG_PAGE_MANUFACTURING_5 and
+ *                      associated defines.
+ *                      Added more defines for SAS IO Unit Page 0
+ *                      DiscoveryStatus field.
+ *                      Added define for MPI_SAS_IOUNIT0_DS_SUBTRACTIVE_LINK
+ *                      and MPI_SAS_IOUNIT0_DS_TABLE_LINK.
+ *                      Added defines for Physical Mapping Modes to SAS IO Unit
+ *                      Page 2.
+ *                      Added define for
+ *                      MPI_SAS_DEVICE0_FLAGS_PORT_SELECTOR_ATTACH.
+ *  10-27-04 01.05.03   Added defines for new SAS PHY page addressing mode.
+ *                      Added defines for MaxTargetSpinUp to BIOS Page 1.
+ *                      Added 5 new ControlFlags defines for SAS IO Unit
+ *                      Page 1.
+ *                      Added MaxNumPhysicalMappedIDs field to SAS IO Unit
+ *                      Page 2.
+ *                      Added AccessStatus field to SAS Device Page 0 and added
+ *                      new Flags bits for supported SATA features.
+ *  12-07-04  01.05.04  Added config page structures for BIOS Page 2, RAID
+ *                      Volume Page 1, and RAID Physical Disk Page 1.
+ *                      Replaced IO Unit Page 1 BootTargetID,BootBus, and
+ *                      BootAdapterNum with reserved field.
+ *                      Added DataScrubRate and ResyncRate to RAID Volume
+ *                      Page 0.
+ *                      Added MPI_SAS_IOUNIT2_FLAGS_RESERVE_ID_0_FOR_BOOT
+ *                      define.
+ *  12-09-04  01.05.05  Added Target Mode Large CDB Enable to FC Port Page 1
+ *                      Flags field.
+ *                      Added Auto Port Config flag define for SAS IOUNIT
+ *                      Page 1 ControlFlags.
+ *                      Added Disabled bad Phy define to Expander Page 1
+ *                      Discovery Info field.
+ *                      Added SAS/SATA device support to SAS IOUnit Page 1
+ *                      ControlFlags.
+ *                      Added Unsupported device to SAS Dev Page 0 Flags field
+ *                      Added disable use SATA Hash Address for SAS IOUNIT
+ *                      page 1 in ControlFields.
+ *  01-15-05  01.05.06  Added defaults for data scrub rate and resync rate to
+ *                      Manufacturing Page 4.
+ *                      Added new defines for BIOS Page 1 IOCSettings field.
+ *                      Added ExtDiskIdentifier field to RAID Physical Disk
+ *                      Page 0.
+ *                      Added new defines for SAS IO Unit Page 1 ControlFlags
+ *                      and to SAS Device Page 0 Flags to control SATA devices.
+ *                      Added defines and structures for the new Log Page 0, a
+ *                      new type of configuration page.
+ *  02-09-05  01.05.07  Added InactiveStatus field to RAID Volume Page 0.
+ *                      Added WWID field to RAID Volume Page 1.
+ *                      Added PhysicalPort field to SAS Expander pages 0 and 1.
+ *  03-11-05  01.05.08  Removed the EEDP flags from IOC Page 1.
+ *                      Added Enclosure/Slot boot device format to BIOS Page 2.
+ *                      New status value for RAID Volume Page 0 VolumeStatus
+ *                      (VolumeState subfield).
+ *                      New value for RAID Physical Page 0 InactiveStatus.
+ *                      Added Inactive Volume Member flag RAID Physical Disk
+ *                      Page 0 PhysDiskStatus field.
+ *                      New physical mapping mode in SAS IO Unit Page 2.
+ *                      Added CONFIG_PAGE_SAS_ENCLOSURE_0.
+ *                      Added Slot and Enclosure fields to SAS Device Page 0.
  *  --------------------------------------------------------------------------
  */
 
@@ -164,7 +251,7 @@ typedef struct _CONFIG_PAGE_HEADER
     U8                      PageLength;                 /* 01h */
     U8                      PageNumber;                 /* 02h */
     U8                      PageType;                   /* 03h */
-} fCONFIG_PAGE_HEADER, MPI_POINTER PTR_CONFIG_PAGE_HEADER,
+} CONFIG_PAGE_HEADER, MPI_POINTER PTR_CONFIG_PAGE_HEADER,
   ConfigPageHeader_t, MPI_POINTER pConfigPageHeader_t;
 
 typedef union _CONFIG_PAGE_HEADER_UNION
@@ -174,7 +261,7 @@ typedef union _CONFIG_PAGE_HEADER_UNION
    U16                 Word16[2];
    U32                 Word32;
 } ConfigPageHeaderUnion, MPI_POINTER pConfigPageHeaderUnion,
-  fCONFIG_PAGE_HEADER_UNION, MPI_POINTER PTR_CONFIG_PAGE_HEADER_UNION;
+  CONFIG_PAGE_HEADER_UNION, MPI_POINTER PTR_CONFIG_PAGE_HEADER_UNION;
 
 typedef struct _CONFIG_EXTENDED_PAGE_HEADER
 {
@@ -185,7 +272,7 @@ typedef struct _CONFIG_EXTENDED_PAGE_HEADER
     U16                 ExtPageLength;              /* 04h */
     U8                  ExtPageType;                /* 06h */
     U8                  Reserved2;                  /* 07h */
-} fCONFIG_EXTENDED_PAGE_HEADER, MPI_POINTER PTR_CONFIG_EXTENDED_PAGE_HEADER,
+} CONFIG_EXTENDED_PAGE_HEADER, MPI_POINTER PTR_CONFIG_EXTENDED_PAGE_HEADER,
   ConfigExtendedPageHeader_t, MPI_POINTER pConfigExtendedPageHeader_t;
 
 
@@ -224,6 +311,8 @@ typedef struct _CONFIG_EXTENDED_PAGE_HEADER
 #define MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER         (0x11)
 #define MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE           (0x12)
 #define MPI_CONFIG_EXTPAGETYPE_SAS_PHY              (0x13)
+#define MPI_CONFIG_EXTPAGETYPE_LOG                  (0x14)
+#define MPI_CONFIG_EXTPAGETYPE_ENCLOSURE            (0x15)
 
 
 /****************************************************************************
@@ -231,10 +320,19 @@ typedef struct _CONFIG_EXTENDED_PAGE_HEADER
 ****************************************************************************/
 #define MPI_SCSI_PORT_PGAD_PORT_MASK                (0x000000FF)
 
+#define MPI_SCSI_DEVICE_FORM_MASK                   (0xF0000000)
+#define MPI_SCSI_DEVICE_FORM_BUS_TID                (0x00000000)
 #define MPI_SCSI_DEVICE_TARGET_ID_MASK              (0x000000FF)
 #define MPI_SCSI_DEVICE_TARGET_ID_SHIFT             (0)
 #define MPI_SCSI_DEVICE_BUS_MASK                    (0x0000FF00)
 #define MPI_SCSI_DEVICE_BUS_SHIFT                   (8)
+#define MPI_SCSI_DEVICE_FORM_TARGET_MODE            (0x10000000)
+#define MPI_SCSI_DEVICE_TM_RESPOND_ID_MASK          (0x000000FF)
+#define MPI_SCSI_DEVICE_TM_RESPOND_ID_SHIFT         (0)
+#define MPI_SCSI_DEVICE_TM_BUS_MASK                 (0x0000FF00)
+#define MPI_SCSI_DEVICE_TM_BUS_SHIFT                (8)
+#define MPI_SCSI_DEVICE_TM_INIT_ID_MASK             (0x00FF0000)
+#define MPI_SCSI_DEVICE_TM_INIT_ID_SHIFT            (16)
 
 #define MPI_FC_PORT_PGAD_PORT_MASK                  (0xF0000000)
 #define MPI_FC_PORT_PGAD_PORT_SHIFT                 (28)
@@ -260,6 +358,20 @@ typedef struct _CONFIG_EXTENDED_PAGE_HEADER
 #define MPI_PHYSDISK_PGAD_PHYSDISKNUM_MASK          (0x000000FF)
 #define MPI_PHYSDISK_PGAD_PHYSDISKNUM_SHIFT         (0)
 
+#define MPI_SAS_EXPAND_PGAD_FORM_MASK             (0xF0000000)
+#define MPI_SAS_EXPAND_PGAD_FORM_SHIFT            (28)
+#define MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE  (0x00000000)
+#define MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM   (0x00000001)
+#define MPI_SAS_EXPAND_PGAD_FORM_HANDLE           (0x00000002)
+#define MPI_SAS_EXPAND_PGAD_GNH_MASK_HANDLE       (0x0000FFFF)
+#define MPI_SAS_EXPAND_PGAD_GNH_SHIFT_HANDLE      (0)
+#define MPI_SAS_EXPAND_PGAD_HPN_MASK_PHY          (0x00FF0000)
+#define MPI_SAS_EXPAND_PGAD_HPN_SHIFT_PHY         (16)
+#define MPI_SAS_EXPAND_PGAD_HPN_MASK_HANDLE       (0x0000FFFF)
+#define MPI_SAS_EXPAND_PGAD_HPN_SHIFT_HANDLE      (0)
+#define MPI_SAS_EXPAND_PGAD_H_MASK_HANDLE         (0x0000FFFF)
+#define MPI_SAS_EXPAND_PGAD_H_SHIFT_HANDLE        (0)
+
 #define MPI_SAS_DEVICE_PGAD_FORM_MASK               (0xF0000000)
 #define MPI_SAS_DEVICE_PGAD_FORM_SHIFT              (28)
 #define MPI_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE    (0x00000000)
@@ -274,10 +386,24 @@ typedef struct _CONFIG_EXTENDED_PAGE_HEADER
 #define MPI_SAS_DEVICE_PGAD_H_HANDLE_MASK           (0x0000FFFF)
 #define MPI_SAS_DEVICE_PGAD_H_HANDLE_SHIFT          (0)
 
-#define MPI_SAS_PHY_PGAD_PHY_NUMBER_MASK            (0x00FF0000)
-#define MPI_SAS_PHY_PGAD_PHY_NUMBER_SHIFT           (16)
-#define MPI_SAS_PHY_PGAD_DEVHANDLE_MASK             (0x0000FFFF)
-#define MPI_SAS_PHY_PGAD_DEVHANDLE_SHIFT            (0)
+#define MPI_SAS_PHY_PGAD_FORM_MASK                  (0xF0000000)
+#define MPI_SAS_PHY_PGAD_FORM_SHIFT                 (28)
+#define MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER            (0x0)
+#define MPI_SAS_PHY_PGAD_FORM_PHY_TBL_INDEX         (0x1)
+#define MPI_SAS_PHY_PGAD_PHY_NUMBER_MASK            (0x000000FF)
+#define MPI_SAS_PHY_PGAD_PHY_NUMBER_SHIFT           (0)
+#define MPI_SAS_PHY_PGAD_PHY_TBL_INDEX_MASK         (0x0000FFFF)
+#define MPI_SAS_PHY_PGAD_PHY_TBL_INDEX_SHIFT        (0)
+
+#define MPI_SAS_ENCLOS_PGAD_FORM_MASK               (0xF0000000)
+#define MPI_SAS_ENCLOS_PGAD_FORM_SHIFT              (28)
+#define MPI_SAS_ENCLOS_PGAD_FORM_GET_NEXT_HANDLE    (0x00000000)
+#define MPI_SAS_ENCLOS_PGAD_FORM_HANDLE             (0x00000001)
+#define MPI_SAS_ENCLOS_PGAD_GNH_HANDLE_MASK         (0x0000FFFF)
+#define MPI_SAS_ENCLOS_PGAD_GNH_HANDLE_SHIFT        (0)
+#define MPI_SAS_ENCLOS_PGAD_H_HANDLE_MASK           (0x0000FFFF)
+#define MPI_SAS_ENCLOS_PGAD_H_HANDLE_SHIFT          (0)
+
 
 
 /****************************************************************************
@@ -294,7 +420,7 @@ typedef struct _MSG_CONFIG
     U8                      MsgFlags;                   /* 07h */
     U32                     MsgContext;                 /* 08h */
     U8                      Reserved2[8];               /* 0Ch */
-    fCONFIG_PAGE_HEADER      Header;                     /* 14h */
+    CONFIG_PAGE_HEADER      Header;                     /* 14h */
     U32                     PageAddress;                /* 18h */
     SGE_IO_UNION            PageBufferSGE;              /* 1Ch */
 } MSG_CONFIG, MPI_POINTER PTR_MSG_CONFIG,
@@ -327,7 +453,7 @@ typedef struct _MSG_CONFIG_REPLY
     U8                      Reserved2[2];               /* 0Ch */
     U16                     IOCStatus;                  /* 0Eh */
     U32                     IOCLogInfo;                 /* 10h */
-    fCONFIG_PAGE_HEADER      Header;                     /* 14h */
+    CONFIG_PAGE_HEADER      Header;                     /* 14h */
 } MSG_CONFIG_REPLY, MPI_POINTER PTR_MSG_CONFIG_REPLY,
   ConfigReply_t, MPI_POINTER pConfigReply_t;
 
@@ -349,6 +475,8 @@ typedef struct _MSG_CONFIG_REPLY
 #define MPI_MANUFACTPAGE_DEVICEID_FC929             (0x0622)
 #define MPI_MANUFACTPAGE_DEVICEID_FC919X            (0x0628)
 #define MPI_MANUFACTPAGE_DEVICEID_FC929X            (0x0626)
+#define MPI_MANUFACTPAGE_DEVICEID_FC939X            (0x0642)
+#define MPI_MANUFACTPAGE_DEVICEID_FC949X            (0x0640)
 /* SCSI */
 #define MPI_MANUFACTPAGE_DEVID_53C1030              (0x0030)
 #define MPI_MANUFACTPAGE_DEVID_53C1030ZC            (0x0031)
@@ -358,18 +486,25 @@ typedef struct _MSG_CONFIG_REPLY
 #define MPI_MANUFACTPAGE_DEVID_53C1035ZC            (0x0041)
 /* SAS */
 #define MPI_MANUFACTPAGE_DEVID_SAS1064              (0x0050)
+#define MPI_MANUFACTPAGE_DEVID_SAS1064A             (0x005C)
+#define MPI_MANUFACTPAGE_DEVID_SAS1064E             (0x0056)
+#define MPI_MANUFACTPAGE_DEVID_SAS1066              (0x005E)
+#define MPI_MANUFACTPAGE_DEVID_SAS1066E             (0x005A)
+#define MPI_MANUFACTPAGE_DEVID_SAS1068              (0x0054)
+#define MPI_MANUFACTPAGE_DEVID_SAS1068E             (0x0058)
+#define MPI_MANUFACTPAGE_DEVID_SAS1078              (0x0060)
 
 
 typedef struct _CONFIG_PAGE_MANUFACTURING_0
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U8                      ChipName[16];               /* 04h */
     U8                      ChipRevision[8];            /* 14h */
     U8                      BoardName[16];              /* 1Ch */
     U8                      BoardAssembly[16];          /* 2Ch */
     U8                      BoardTracerNumber[16];      /* 3Ch */
 
-} fCONFIG_PAGE_MANUFACTURING_0, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_0,
+} CONFIG_PAGE_MANUFACTURING_0, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_0,
   ManufacturingPage0_t, MPI_POINTER pManufacturingPage0_t;
 
 #define MPI_MANUFACTURING0_PAGEVERSION                 (0x00)
@@ -377,9 +512,9 @@ typedef struct _CONFIG_PAGE_MANUFACTURING_0
 
 typedef struct _CONFIG_PAGE_MANUFACTURING_1
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U8                      VPD[256];                   /* 04h */
-} fCONFIG_PAGE_MANUFACTURING_1, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_1,
+} CONFIG_PAGE_MANUFACTURING_1, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_1,
   ManufacturingPage1_t, MPI_POINTER pManufacturingPage1_t;
 
 #define MPI_MANUFACTURING1_PAGEVERSION                 (0x00)
@@ -404,10 +539,10 @@ typedef struct _MPI_CHIP_REVISION_ID
 
 typedef struct _CONFIG_PAGE_MANUFACTURING_2
 {
-    fCONFIG_PAGE_HEADER      Header;                                 /* 00h */
+    CONFIG_PAGE_HEADER      Header;                                 /* 00h */
     MPI_CHIP_REVISION_ID    ChipId;                                 /* 04h */
     U32                     HwSettings[MPI_MAN_PAGE_2_HW_SETTINGS_WORDS];/* 08h */
-} fCONFIG_PAGE_MANUFACTURING_2, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_2,
+} CONFIG_PAGE_MANUFACTURING_2, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_2,
   ManufacturingPage2_t, MPI_POINTER pManufacturingPage2_t;
 
 #define MPI_MANUFACTURING2_PAGEVERSION                  (0x00)
@@ -423,10 +558,10 @@ typedef struct _CONFIG_PAGE_MANUFACTURING_2
 
 typedef struct _CONFIG_PAGE_MANUFACTURING_3
 {
-    fCONFIG_PAGE_HEADER                  Header;                     /* 00h */
+    CONFIG_PAGE_HEADER                  Header;                     /* 00h */
     MPI_CHIP_REVISION_ID                ChipId;                     /* 04h */
     U32                                 Info[MPI_MAN_PAGE_3_INFO_WORDS];/* 08h */
-} fCONFIG_PAGE_MANUFACTURING_3, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_3,
+} CONFIG_PAGE_MANUFACTURING_3, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_3,
   ManufacturingPage3_t, MPI_POINTER pManufacturingPage3_t;
 
 #define MPI_MANUFACTURING3_PAGEVERSION                  (0x00)
@@ -434,7 +569,7 @@ typedef struct _CONFIG_PAGE_MANUFACTURING_3
 
 typedef struct _CONFIG_PAGE_MANUFACTURING_4
 {
-    fCONFIG_PAGE_HEADER              Header;             /* 00h */
+    CONFIG_PAGE_HEADER              Header;             /* 00h */
     U32                             Reserved1;          /* 04h */
     U8                              InfoOffset0;        /* 08h */
     U8                              InfoSize0;          /* 09h */
@@ -447,10 +582,23 @@ typedef struct _CONFIG_PAGE_MANUFACTURING_4
     U32                             ISVolumeSettings;   /* 48h */
     U32                             IMEVolumeSettings;  /* 4Ch */
     U32                             IMVolumeSettings;   /* 50h */
-} fCONFIG_PAGE_MANUFACTURING_4, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_4,
+    U32                             Reserved3;          /* 54h */
+    U32                             Reserved4;          /* 58h */
+    U8                              ISDataScrubRate;    /* 5Ch */
+    U8                              ISResyncRate;       /* 5Dh */
+    U16                             Reserved5;          /* 5Eh */
+    U8                              IMEDataScrubRate;   /* 60h */
+    U8                              IMEResyncRate;      /* 61h */
+    U16                             Reserved6;          /* 62h */
+    U8                              IMDataScrubRate;    /* 64h */
+    U8                              IMResyncRate;       /* 65h */
+    U16                             Reserved7;          /* 66h */
+    U32                             Reserved8;          /* 68h */
+    U32                             Reserved9;          /* 6Ch */
+} CONFIG_PAGE_MANUFACTURING_4, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_4,
   ManufacturingPage4_t, MPI_POINTER pManufacturingPage4_t;
 
-#define MPI_MANUFACTURING4_PAGEVERSION                  (0x01)
+#define MPI_MANUFACTURING4_PAGEVERSION                  (0x02)
 
 /* defines for the Flags field */
 #define MPI_MANPAGE4_IR_NO_MIX_SAS_SATA                 (0x01)
@@ -458,19 +606,25 @@ typedef struct _CONFIG_PAGE_MANUFACTURING_4
 
 typedef struct _CONFIG_PAGE_MANUFACTURING_5
 {
-    fCONFIG_PAGE_HEADER              Header;             /* 00h */
+    CONFIG_PAGE_HEADER              Header;             /* 00h */
     U64                             BaseWWID;           /* 04h */
-} fCONFIG_PAGE_MANUFACTURING_5, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_5,
+    U8                              Flags;              /* 0Ch */
+    U8                              Reserved1;          /* 0Dh */
+    U16                             Reserved2;          /* 0Eh */
+} CONFIG_PAGE_MANUFACTURING_5, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_5,
   ManufacturingPage5_t, MPI_POINTER pManufacturingPage5_t;
 
-#define MPI_MANUFACTURING5_PAGEVERSION                  (0x00)
+#define MPI_MANUFACTURING5_PAGEVERSION                  (0x01)
+
+/* defines for the Flags field */
+#define MPI_MANPAGE5_TWO_WWID_PER_PHY                   (0x01)
 
 
 typedef struct _CONFIG_PAGE_MANUFACTURING_6
 {
-    fCONFIG_PAGE_HEADER              Header;             /* 00h */
+    CONFIG_PAGE_HEADER              Header;             /* 00h */
     U32                             ProductSpecificInfo;/* 04h */
-} fCONFIG_PAGE_MANUFACTURING_6, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_6,
+} CONFIG_PAGE_MANUFACTURING_6, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_6,
   ManufacturingPage6_t, MPI_POINTER pManufacturingPage6_t;
 
 #define MPI_MANUFACTURING6_PAGEVERSION                  (0x00)
@@ -482,9 +636,9 @@ typedef struct _CONFIG_PAGE_MANUFACTURING_6
 
 typedef struct _CONFIG_PAGE_IO_UNIT_0
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U64                     UniqueValue;                /* 04h */
-} fCONFIG_PAGE_IO_UNIT_0, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_0,
+} CONFIG_PAGE_IO_UNIT_0, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_0,
   IOUnitPage0_t, MPI_POINTER pIOUnitPage0_t;
 
 #define MPI_IOUNITPAGE0_PAGEVERSION                     (0x00)
@@ -492,9 +646,9 @@ typedef struct _CONFIG_PAGE_IO_UNIT_0
 
 typedef struct _CONFIG_PAGE_IO_UNIT_1
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     Flags;                      /* 04h */
-} fCONFIG_PAGE_IO_UNIT_1, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_1,
+} CONFIG_PAGE_IO_UNIT_1, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_1,
   IOUnitPage1_t, MPI_POINTER pIOUnitPage1_t;
 
 #define MPI_IOUNITPAGE1_PAGEVERSION                     (0x01)
@@ -524,14 +678,15 @@ typedef struct _MPI_ADAPTER_INFO
 
 typedef struct _CONFIG_PAGE_IO_UNIT_2
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     Flags;                      /* 04h */
     U32                     BiosVersion;                /* 08h */
     MPI_ADAPTER_INFO        AdapterOrder[4];            /* 0Ch */
-} fCONFIG_PAGE_IO_UNIT_2, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_2,
+    U32                     Reserved1;                  /* 1Ch */
+} CONFIG_PAGE_IO_UNIT_2, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_2,
   IOUnitPage2_t, MPI_POINTER pIOUnitPage2_t;
 
-#define MPI_IOUNITPAGE2_PAGEVERSION                     (0x00)
+#define MPI_IOUNITPAGE2_PAGEVERSION                     (0x02)
 
 #define MPI_IOUNITPAGE2_FLAGS_PAUSE_ON_ERROR            (0x00000002)
 #define MPI_IOUNITPAGE2_FLAGS_VERBOSE_ENABLE            (0x00000004)
@@ -554,12 +709,12 @@ typedef struct _CONFIG_PAGE_IO_UNIT_2
 
 typedef struct _CONFIG_PAGE_IO_UNIT_3
 {
-    fCONFIG_PAGE_HEADER      Header;                                   /* 00h */
+    CONFIG_PAGE_HEADER      Header;                                   /* 00h */
     U8                      GPIOCount;                                /* 04h */
     U8                      Reserved1;                                /* 05h */
     U16                     Reserved2;                                /* 06h */
     U16                     GPIOVal[MPI_IO_UNIT_PAGE_3_GPIO_VAL_MAX]; /* 08h */
-} fCONFIG_PAGE_IO_UNIT_3, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_3,
+} CONFIG_PAGE_IO_UNIT_3, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_3,
   IOUnitPage3_t, MPI_POINTER pIOUnitPage3_t;
 
 #define MPI_IOUNITPAGE3_PAGEVERSION                     (0x01)
@@ -570,13 +725,24 @@ typedef struct _CONFIG_PAGE_IO_UNIT_3
 #define MPI_IOUNITPAGE3_GPIO_SETTING_ON                 (0x01)
 
 
+typedef struct _CONFIG_PAGE_IO_UNIT_4
+{
+    CONFIG_PAGE_HEADER      Header;                                   /* 00h */
+    U32                     Reserved1;                                /* 04h */
+    SGE_SIMPLE_UNION        FWImageSGE;                               /* 08h */
+} CONFIG_PAGE_IO_UNIT_4, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_4,
+  IOUnitPage4_t, MPI_POINTER pIOUnitPage4_t;
+
+#define MPI_IOUNITPAGE4_PAGEVERSION                     (0x00)
+
+
 /****************************************************************************
 *   IOC Config Pages
 ****************************************************************************/
 
 typedef struct _CONFIG_PAGE_IOC_0
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     TotalNVStore;               /* 04h */
     U32                     FreeNVStore;                /* 08h */
     U16                     VendorID;                   /* 0Ch */
@@ -586,7 +752,7 @@ typedef struct _CONFIG_PAGE_IOC_0
     U32                     ClassCode;                  /* 14h */
     U16                     SubsystemVendorID;          /* 18h */
     U16                     SubsystemID;                /* 1Ah */
-} fCONFIG_PAGE_IOC_0, MPI_POINTER PTR_CONFIG_PAGE_IOC_0,
+} CONFIG_PAGE_IOC_0, MPI_POINTER PTR_CONFIG_PAGE_IOC_0,
   IOCPage0_t, MPI_POINTER pIOCPage0_t;
 
 #define MPI_IOCPAGE0_PAGEVERSION                        (0x01)
@@ -594,23 +760,19 @@ typedef struct _CONFIG_PAGE_IOC_0
 
 typedef struct _CONFIG_PAGE_IOC_1
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     Flags;                      /* 04h */
     U32                     CoalescingTimeout;          /* 08h */
     U8                      CoalescingDepth;            /* 0Ch */
     U8                      PCISlotNum;                 /* 0Dh */
     U8                      Reserved[2];                /* 0Eh */
-} fCONFIG_PAGE_IOC_1, MPI_POINTER PTR_CONFIG_PAGE_IOC_1,
+} CONFIG_PAGE_IOC_1, MPI_POINTER PTR_CONFIG_PAGE_IOC_1,
   IOCPage1_t, MPI_POINTER pIOCPage1_t;
 
-#define MPI_IOCPAGE1_PAGEVERSION                        (0x01)
+#define MPI_IOCPAGE1_PAGEVERSION                        (0x02)
 
 /* defines for the Flags field */
-#define MPI_IOCPAGE1_EEDP_HOST_SUPPORTS_DIF             (0x08000000)
-#define MPI_IOCPAGE1_EEDP_MODE_MASK                     (0x07000000)
-#define MPI_IOCPAGE1_EEDP_MODE_OFF                      (0x00000000)
-#define MPI_IOCPAGE1_EEDP_MODE_T10                      (0x01000000)
-#define MPI_IOCPAGE1_EEDP_MODE_LSI_1                    (0x02000000)
+#define MPI_IOCPAGE1_INITIATOR_CONTEXT_REPLY_DISABLE    (0x00000010)
 #define MPI_IOCPAGE1_REPLY_COALESCING                   (0x00000001)
 
 #define MPI_IOCPAGE1_PCISLOTNUM_UNKNOWN                 (0xFF)
@@ -625,7 +787,7 @@ typedef struct _CONFIG_PAGE_IOC_2_RAID_VOL
     U8                          VolumeType;             /* 04h */
     U8                          Flags;                  /* 05h */
     U16                         Reserved3;              /* 06h */
-} fCONFIG_PAGE_IOC_2_RAID_VOL, MPI_POINTER PTR_CONFIG_PAGE_IOC_2_RAID_VOL,
+} CONFIG_PAGE_IOC_2_RAID_VOL, MPI_POINTER PTR_CONFIG_PAGE_IOC_2_RAID_VOL,
   ConfigPageIoc2RaidVol_t, MPI_POINTER pConfigPageIoc2RaidVol_t;
 
 /* IOC Page 2 Volume RAID Type values, also used in RAID Volume pages */
@@ -648,14 +810,14 @@ typedef struct _CONFIG_PAGE_IOC_2_RAID_VOL
 
 typedef struct _CONFIG_PAGE_IOC_2
 {
-    fCONFIG_PAGE_HEADER          Header;                              /* 00h */
+    CONFIG_PAGE_HEADER          Header;                              /* 00h */
     U32                         CapabilitiesFlags;                   /* 04h */
     U8                          NumActiveVolumes;                    /* 08h */
     U8                          MaxVolumes;                          /* 09h */
     U8                          NumActivePhysDisks;                  /* 0Ah */
     U8                          MaxPhysDisks;                        /* 0Bh */
-    fCONFIG_PAGE_IOC_2_RAID_VOL  RaidVolume[MPI_IOC_PAGE_2_RAID_VOLUME_MAX];/* 0Ch */
-} fCONFIG_PAGE_IOC_2, MPI_POINTER PTR_CONFIG_PAGE_IOC_2,
+    CONFIG_PAGE_IOC_2_RAID_VOL  RaidVolume[MPI_IOC_PAGE_2_RAID_VOLUME_MAX];/* 0Ch */
+} CONFIG_PAGE_IOC_2, MPI_POINTER PTR_CONFIG_PAGE_IOC_2,
   IOCPage2_t, MPI_POINTER pIOCPage2_t;
 
 #define MPI_IOCPAGE2_PAGEVERSION                        (0x02)
@@ -689,12 +851,12 @@ typedef struct _IOC_3_PHYS_DISK
 
 typedef struct _CONFIG_PAGE_IOC_3
 {
-    fCONFIG_PAGE_HEADER          Header;                                /* 00h */
+    CONFIG_PAGE_HEADER          Header;                                /* 00h */
     U8                          NumPhysDisks;                          /* 04h */
     U8                          Reserved1;                             /* 05h */
     U16                         Reserved2;                             /* 06h */
     IOC_3_PHYS_DISK             PhysDisk[MPI_IOC_PAGE_3_PHYSDISK_MAX]; /* 08h */
-} fCONFIG_PAGE_IOC_3, MPI_POINTER PTR_CONFIG_PAGE_IOC_3,
+} CONFIG_PAGE_IOC_3, MPI_POINTER PTR_CONFIG_PAGE_IOC_3,
   IOCPage3_t, MPI_POINTER pIOCPage3_t;
 
 #define MPI_IOCPAGE3_PAGEVERSION                        (0x00)
@@ -718,12 +880,12 @@ typedef struct _IOC_4_SEP
 
 typedef struct _CONFIG_PAGE_IOC_4
 {
-    fCONFIG_PAGE_HEADER          Header;                         /* 00h */
+    CONFIG_PAGE_HEADER          Header;                         /* 00h */
     U8                          ActiveSEP;                      /* 04h */
     U8                          MaxSEP;                         /* 05h */
     U16                         Reserved1;                      /* 06h */
     IOC_4_SEP                   SEP[MPI_IOC_PAGE_4_SEP_MAX];    /* 08h */
-} fCONFIG_PAGE_IOC_4, MPI_POINTER PTR_CONFIG_PAGE_IOC_4,
+} CONFIG_PAGE_IOC_4, MPI_POINTER PTR_CONFIG_PAGE_IOC_4,
   IOCPage4_t, MPI_POINTER pIOCPage4_t;
 
 #define MPI_IOCPAGE4_PAGEVERSION                        (0x00)
@@ -751,25 +913,25 @@ typedef struct _IOC_5_HOT_SPARE
 
 typedef struct _CONFIG_PAGE_IOC_5
 {
-    fCONFIG_PAGE_HEADER          Header;                         /* 00h */
+    CONFIG_PAGE_HEADER          Header;                         /* 00h */
     U32                         Reserved1;                      /* 04h */
     U8                          NumHotSpares;                   /* 08h */
     U8                          Reserved2;                      /* 09h */
     U16                         Reserved3;                      /* 0Ah */
     IOC_5_HOT_SPARE             HotSpare[MPI_IOC_PAGE_5_HOT_SPARE_MAX]; /* 0Ch */
-} fCONFIG_PAGE_IOC_5, MPI_POINTER PTR_CONFIG_PAGE_IOC_5,
+} CONFIG_PAGE_IOC_5, MPI_POINTER PTR_CONFIG_PAGE_IOC_5,
   IOCPage5_t, MPI_POINTER pIOCPage5_t;
 
 #define MPI_IOCPAGE5_PAGEVERSION                        (0x00)
 
 
 /****************************************************************************
-*   BIOS Port Config Pages
+*   BIOS Config Pages
 ****************************************************************************/
 
 typedef struct _CONFIG_PAGE_BIOS_1
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     BiosOptions;                /* 04h */
     U32                     IOCSettings;                /* 08h */
     U32                     Reserved1;                  /* 0Ch */
@@ -780,10 +942,10 @@ typedef struct _CONFIG_PAGE_BIOS_1
     U16                     IOTimeoutSequential;        /* 1Ah */
     U16                     IOTimeoutOther;             /* 1Ch */
     U16                     IOTimeoutBlockDevicesRM;    /* 1Eh */
-} fCONFIG_PAGE_BIOS_1, MPI_POINTER PTR_CONFIG_PAGE_BIOS_1,
+} CONFIG_PAGE_BIOS_1, MPI_POINTER PTR_CONFIG_PAGE_BIOS_1,
   BIOSPage1_t, MPI_POINTER pBIOSPage1_t;
 
-#define MPI_BIOSPAGE1_PAGEVERSION                       (0x00)
+#define MPI_BIOSPAGE1_PAGEVERSION                       (0x01)
 
 /* values for the BiosOptions field */
 #define MPI_BIOSPAGE1_OPTIONS_SPI_ENABLE                (0x00000400)
@@ -792,6 +954,13 @@ typedef struct _CONFIG_PAGE_BIOS_1
 #define MPI_BIOSPAGE1_OPTIONS_DISABLE_BIOS              (0x00000001)
 
 /* values for the IOCSettings field */
+#define MPI_BIOSPAGE1_IOCSET_MASK_BOOT_PREFERENCE       (0x00030000)
+#define MPI_BIOSPAGE1_IOCSET_ENCLOSURE_SLOT_BOOT        (0x00000000)
+#define MPI_BIOSPAGE1_IOCSET_SAS_ADDRESS_BOOT           (0x00010000)
+
+#define MPI_BIOSPAGE1_IOCSET_MASK_MAX_TARGET_SPIN_UP    (0x0000F000)
+#define MPI_BIOSPAGE1_IOCSET_SHIFT_MAX_TARGET_SPIN_UP   (12)
+
 #define MPI_BIOSPAGE1_IOCSET_MASK_SPINUP_DELAY          (0x00000F00)
 #define MPI_BIOSPAGE1_IOCSET_SHIFT_SPINUP_DELAY         (8)
 
@@ -814,6 +983,191 @@ typedef struct _CONFIG_PAGE_BIOS_1
 #define MPI_BIOSPAGE1_DEVSET_DISABLE_NON_RM_LUN         (0x00000002)
 #define MPI_BIOSPAGE1_DEVSET_DISABLE_OTHER_LUN          (0x00000001)
 
+typedef struct _MPI_BOOT_DEVICE_ADAPTER_ORDER
+{
+    U32         Reserved1;                              /* 00h */
+    U32         Reserved2;                              /* 04h */
+    U32         Reserved3;                              /* 08h */
+    U32         Reserved4;                              /* 0Ch */
+    U32         Reserved5;                              /* 10h */
+    U32         Reserved6;                              /* 14h */
+    U32         Reserved7;                              /* 18h */
+    U32         Reserved8;                              /* 1Ch */
+    U32         Reserved9;                              /* 20h */
+    U32         Reserved10;                             /* 24h */
+    U32         Reserved11;                             /* 28h */
+    U32         Reserved12;                             /* 2Ch */
+    U32         Reserved13;                             /* 30h */
+    U32         Reserved14;                             /* 34h */
+    U32         Reserved15;                             /* 38h */
+    U32         Reserved16;                             /* 3Ch */
+    U32         Reserved17;                             /* 40h */
+} MPI_BOOT_DEVICE_ADAPTER_ORDER, MPI_POINTER PTR_MPI_BOOT_DEVICE_ADAPTER_ORDER;
+
+typedef struct _MPI_BOOT_DEVICE_ADAPTER_NUMBER
+{
+    U8          TargetID;                               /* 00h */
+    U8          Bus;                                    /* 01h */
+    U8          AdapterNumber;                          /* 02h */
+    U8          Reserved1;                              /* 03h */
+    U32         Reserved2;                              /* 04h */
+    U32         Reserved3;                              /* 08h */
+    U32         Reserved4;                              /* 0Ch */
+    U8          LUN[8];                                 /* 10h */
+    U32         Reserved5;                              /* 18h */
+    U32         Reserved6;                              /* 1Ch */
+    U32         Reserved7;                              /* 20h */
+    U32         Reserved8;                              /* 24h */
+    U32         Reserved9;                              /* 28h */
+    U32         Reserved10;                             /* 2Ch */
+    U32         Reserved11;                             /* 30h */
+    U32         Reserved12;                             /* 34h */
+    U32         Reserved13;                             /* 38h */
+    U32         Reserved14;                             /* 3Ch */
+    U32         Reserved15;                             /* 40h */
+} MPI_BOOT_DEVICE_ADAPTER_NUMBER, MPI_POINTER PTR_MPI_BOOT_DEVICE_ADAPTER_NUMBER;
+
+typedef struct _MPI_BOOT_DEVICE_PCI_ADDRESS
+{
+    U8          TargetID;                               /* 00h */
+    U8          Bus;                                    /* 01h */
+    U16         PCIAddress;                             /* 02h */
+    U32         Reserved1;                              /* 04h */
+    U32         Reserved2;                              /* 08h */
+    U32         Reserved3;                              /* 0Ch */
+    U8          LUN[8];                                 /* 10h */
+    U32         Reserved4;                              /* 18h */
+    U32         Reserved5;                              /* 1Ch */
+    U32         Reserved6;                              /* 20h */
+    U32         Reserved7;                              /* 24h */
+    U32         Reserved8;                              /* 28h */
+    U32         Reserved9;                              /* 2Ch */
+    U32         Reserved10;                             /* 30h */
+    U32         Reserved11;                             /* 34h */
+    U32         Reserved12;                             /* 38h */
+    U32         Reserved13;                             /* 3Ch */
+    U32         Reserved14;                             /* 40h */
+} MPI_BOOT_DEVICE_PCI_ADDRESS, MPI_POINTER PTR_MPI_BOOT_DEVICE_PCI_ADDRESS;
+
+typedef struct _MPI_BOOT_DEVICE_SLOT_NUMBER
+{
+    U8          TargetID;                               /* 00h */
+    U8          Bus;                                    /* 01h */
+    U8          PCISlotNumber;                          /* 02h */
+    U8          Reserved1;                              /* 03h */
+    U32         Reserved2;                              /* 04h */
+    U32         Reserved3;                              /* 08h */
+    U32         Reserved4;                              /* 0Ch */
+    U8          LUN[8];                                 /* 10h */
+    U32         Reserved5;                              /* 18h */
+    U32         Reserved6;                              /* 1Ch */
+    U32         Reserved7;                              /* 20h */
+    U32         Reserved8;                              /* 24h */
+    U32         Reserved9;                              /* 28h */
+    U32         Reserved10;                             /* 2Ch */
+    U32         Reserved11;                             /* 30h */
+    U32         Reserved12;                             /* 34h */
+    U32         Reserved13;                             /* 38h */
+    U32         Reserved14;                             /* 3Ch */
+    U32         Reserved15;                             /* 40h */
+} MPI_BOOT_DEVICE_PCI_SLOT_NUMBER, MPI_POINTER PTR_MPI_BOOT_DEVICE_PCI_SLOT_NUMBER;
+
+typedef struct _MPI_BOOT_DEVICE_FC_WWN
+{
+    U64         WWPN;                                   /* 00h */
+    U32         Reserved1;                              /* 08h */
+    U32         Reserved2;                              /* 0Ch */
+    U8          LUN[8];                                 /* 10h */
+    U32         Reserved3;                              /* 18h */
+    U32         Reserved4;                              /* 1Ch */
+    U32         Reserved5;                              /* 20h */
+    U32         Reserved6;                              /* 24h */
+    U32         Reserved7;                              /* 28h */
+    U32         Reserved8;                              /* 2Ch */
+    U32         Reserved9;                              /* 30h */
+    U32         Reserved10;                             /* 34h */
+    U32         Reserved11;                             /* 38h */
+    U32         Reserved12;                             /* 3Ch */
+    U32         Reserved13;                             /* 40h */
+} MPI_BOOT_DEVICE_FC_WWN, MPI_POINTER PTR_MPI_BOOT_DEVICE_FC_WWN;
+
+typedef struct _MPI_BOOT_DEVICE_SAS_WWN
+{
+    U64         SASAddress;                             /* 00h */
+    U32         Reserved1;                              /* 08h */
+    U32         Reserved2;                              /* 0Ch */
+    U8          LUN[8];                                 /* 10h */
+    U32         Reserved3;                              /* 18h */
+    U32         Reserved4;                              /* 1Ch */
+    U32         Reserved5;                              /* 20h */
+    U32         Reserved6;                              /* 24h */
+    U32         Reserved7;                              /* 28h */
+    U32         Reserved8;                              /* 2Ch */
+    U32         Reserved9;                              /* 30h */
+    U32         Reserved10;                             /* 34h */
+    U32         Reserved11;                             /* 38h */
+    U32         Reserved12;                             /* 3Ch */
+    U32         Reserved13;                             /* 40h */
+} MPI_BOOT_DEVICE_SAS_WWN, MPI_POINTER PTR_MPI_BOOT_DEVICE_SAS_WWN;
+
+typedef struct _MPI_BOOT_DEVICE_ENCLOSURE_SLOT
+{
+    U64         EnclosureLogicalID;                     /* 00h */
+    U32         Reserved1;                              /* 08h */
+    U32         Reserved2;                              /* 0Ch */
+    U8          LUN[8];                                 /* 10h */
+    U16         SlotNumber;                             /* 18h */
+    U16         Reserved3;                              /* 1Ah */
+    U32         Reserved4;                              /* 1Ch */
+    U32         Reserved5;                              /* 20h */
+    U32         Reserved6;                              /* 24h */
+    U32         Reserved7;                              /* 28h */
+    U32         Reserved8;                              /* 2Ch */
+    U32         Reserved9;                              /* 30h */
+    U32         Reserved10;                             /* 34h */
+    U32         Reserved11;                             /* 38h */
+    U32         Reserved12;                             /* 3Ch */
+    U32         Reserved13;                             /* 40h */
+} MPI_BOOT_DEVICE_ENCLOSURE_SLOT,
+  MPI_POINTER PTR_MPI_BOOT_DEVICE_ENCLOSURE_SLOT;
+
+typedef union _MPI_BIOSPAGE2_BOOT_DEVICE
+{
+    MPI_BOOT_DEVICE_ADAPTER_ORDER   AdapterOrder;
+    MPI_BOOT_DEVICE_ADAPTER_NUMBER  AdapterNumber;
+    MPI_BOOT_DEVICE_PCI_ADDRESS     PCIAddress;
+    MPI_BOOT_DEVICE_PCI_SLOT_NUMBER PCISlotNumber;
+    MPI_BOOT_DEVICE_FC_WWN          FcWwn;
+    MPI_BOOT_DEVICE_SAS_WWN         SasWwn;
+    MPI_BOOT_DEVICE_ENCLOSURE_SLOT  EnclosureSlot;
+} MPI_BIOSPAGE2_BOOT_DEVICE, MPI_POINTER PTR_MPI_BIOSPAGE2_BOOT_DEVICE;
+
+typedef struct _CONFIG_PAGE_BIOS_2
+{
+    CONFIG_PAGE_HEADER          Header;                 /* 00h */
+    U32                         Reserved1;              /* 04h */
+    U32                         Reserved2;              /* 08h */
+    U32                         Reserved3;              /* 0Ch */
+    U32                         Reserved4;              /* 10h */
+    U32                         Reserved5;              /* 14h */
+    U32                         Reserved6;              /* 18h */
+    U8                          BootDeviceForm;         /* 1Ch */
+    U8                          Reserved7;              /* 1Dh */
+    U16                         Reserved8;              /* 1Eh */
+    MPI_BIOSPAGE2_BOOT_DEVICE   BootDevice;             /* 20h */
+} CONFIG_PAGE_BIOS_2, MPI_POINTER PTR_CONFIG_PAGE_BIOS_2,
+  BIOSPage2_t, MPI_POINTER pBIOSPage2_t;
+
+#define MPI_BIOSPAGE2_PAGEVERSION                       (0x01)
+
+#define MPI_BIOSPAGE2_FORM_MASK                         (0x0F)
+#define MPI_BIOSPAGE2_FORM_ADAPTER_ORDER                (0x00)
+#define MPI_BIOSPAGE2_FORM_ADAPTER_NUMBER               (0x01)
+#define MPI_BIOSPAGE2_FORM_PCI_ADDRESS                  (0x02)
+#define MPI_BIOSPAGE2_FORM_PCI_SLOT_NUMBER              (0x03)
+#define MPI_BIOSPAGE2_FORM_FC_WWN                       (0x04)
+#define MPI_BIOSPAGE2_FORM_SAS_WWN                      (0x05)
+
 
 /****************************************************************************
 *   SCSI Port Config Pages
@@ -821,13 +1175,13 @@ typedef struct _CONFIG_PAGE_BIOS_1
 
 typedef struct _CONFIG_PAGE_SCSI_PORT_0
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     Capabilities;               /* 04h */
     U32                     PhysicalInterface;          /* 08h */
-} fCONFIG_PAGE_SCSI_PORT_0, MPI_POINTER PTR_CONFIG_PAGE_SCSI_PORT_0,
+} CONFIG_PAGE_SCSI_PORT_0, MPI_POINTER PTR_CONFIG_PAGE_SCSI_PORT_0,
   SCSIPortPage0_t, MPI_POINTER pSCSIPortPage0_t;
 
-#define MPI_SCSIPORTPAGE0_PAGEVERSION                   (0x01)
+#define MPI_SCSIPORTPAGE0_PAGEVERSION                   (0x02)
 
 #define MPI_SCSIPORTPAGE0_CAP_IU                        (0x00000001)
 #define MPI_SCSIPORTPAGE0_CAP_DT                        (0x00000002)
@@ -854,6 +1208,7 @@ typedef struct _CONFIG_PAGE_SCSI_PORT_0
     (  ((Cap) & MPI_SCSIPORTPAGE0_CAP_MASK_MAX_SYNC_OFFSET) \
     >> MPI_SCSIPORTPAGE0_CAP_SHIFT_MAX_SYNC_OFFSET          \
     )
+#define MPI_SCSIPORTPAGE0_CAP_IDP                       (0x08000000)
 #define MPI_SCSIPORTPAGE0_CAP_WIDE                      (0x20000000)
 #define MPI_SCSIPORTPAGE0_CAP_AIP                       (0x80000000)
 
@@ -869,13 +1224,13 @@ typedef struct _CONFIG_PAGE_SCSI_PORT_0
 
 typedef struct _CONFIG_PAGE_SCSI_PORT_1
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     Configuration;              /* 04h */
     U32                     OnBusTimerValue;            /* 08h */
     U8                      TargetConfig;               /* 0Ch */
     U8                      Reserved1;                  /* 0Dh */
     U16                     IDConfig;                   /* 0Eh */
-} fCONFIG_PAGE_SCSI_PORT_1, MPI_POINTER PTR_CONFIG_PAGE_SCSI_PORT_1,
+} CONFIG_PAGE_SCSI_PORT_1, MPI_POINTER PTR_CONFIG_PAGE_SCSI_PORT_1,
   SCSIPortPage1_t, MPI_POINTER pSCSIPortPage1_t;
 
 #define MPI_SCSIPORTPAGE1_PAGEVERSION                   (0x03)
@@ -900,11 +1255,11 @@ typedef struct _MPI_DEVICE_INFO
 
 typedef struct _CONFIG_PAGE_SCSI_PORT_2
 {
-    fCONFIG_PAGE_HEADER  Header;                         /* 00h */
+    CONFIG_PAGE_HEADER  Header;                         /* 00h */
     U32                 PortFlags;                      /* 04h */
     U32                 PortSettings;                   /* 08h */
     MPI_DEVICE_INFO     DeviceSettings[16];             /* 0Ch */
-} fCONFIG_PAGE_SCSI_PORT_2, MPI_POINTER PTR_CONFIG_PAGE_SCSI_PORT_2,
+} CONFIG_PAGE_SCSI_PORT_2, MPI_POINTER PTR_CONFIG_PAGE_SCSI_PORT_2,
   SCSIPortPage2_t, MPI_POINTER pSCSIPortPage2_t;
 
 #define MPI_SCSIPORTPAGE2_PAGEVERSION                       (0x02)
@@ -953,13 +1308,13 @@ typedef struct _CONFIG_PAGE_SCSI_PORT_2
 
 typedef struct _CONFIG_PAGE_SCSI_DEVICE_0
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     NegotiatedParameters;       /* 04h */
     U32                     Information;                /* 08h */
-} fCONFIG_PAGE_SCSI_DEVICE_0, MPI_POINTER PTR_CONFIG_PAGE_SCSI_DEVICE_0,
+} CONFIG_PAGE_SCSI_DEVICE_0, MPI_POINTER PTR_CONFIG_PAGE_SCSI_DEVICE_0,
   SCSIDevicePage0_t, MPI_POINTER pSCSIDevicePage0_t;
 
-#define MPI_SCSIDEVPAGE0_PAGEVERSION                    (0x03)
+#define MPI_SCSIDEVPAGE0_PAGEVERSION                    (0x04)
 
 #define MPI_SCSIDEVPAGE0_NP_IU                          (0x00000001)
 #define MPI_SCSIDEVPAGE0_NP_DT                          (0x00000002)
@@ -973,6 +1328,7 @@ typedef struct _CONFIG_PAGE_SCSI_DEVICE_0
 #define MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_PERIOD           (8)
 #define MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK        (0x00FF0000)
 #define MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_OFFSET           (16)
+#define MPI_SCSIDEVPAGE0_NP_IDP                         (0x08000000)
 #define MPI_SCSIDEVPAGE0_NP_WIDE                        (0x20000000)
 #define MPI_SCSIDEVPAGE0_NP_AIP                         (0x80000000)
 
@@ -984,14 +1340,14 @@ typedef struct _CONFIG_PAGE_SCSI_DEVICE_0
 
 typedef struct _CONFIG_PAGE_SCSI_DEVICE_1
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     RequestedParameters;        /* 04h */
     U32                     Reserved;                   /* 08h */
     U32                     Configuration;              /* 0Ch */
-} fCONFIG_PAGE_SCSI_DEVICE_1, MPI_POINTER PTR_CONFIG_PAGE_SCSI_DEVICE_1,
+} CONFIG_PAGE_SCSI_DEVICE_1, MPI_POINTER PTR_CONFIG_PAGE_SCSI_DEVICE_1,
   SCSIDevicePage1_t, MPI_POINTER pSCSIDevicePage1_t;
 
-#define MPI_SCSIDEVPAGE1_PAGEVERSION                    (0x04)
+#define MPI_SCSIDEVPAGE1_PAGEVERSION                    (0x05)
 
 #define MPI_SCSIDEVPAGE1_RP_IU                          (0x00000001)
 #define MPI_SCSIDEVPAGE1_RP_DT                          (0x00000002)
@@ -1005,6 +1361,7 @@ typedef struct _CONFIG_PAGE_SCSI_DEVICE_1
 #define MPI_SCSIDEVPAGE1_RP_SHIFT_MIN_SYNC_PERIOD       (8)
 #define MPI_SCSIDEVPAGE1_RP_MAX_SYNC_OFFSET_MASK        (0x00FF0000)
 #define MPI_SCSIDEVPAGE1_RP_SHIFT_MAX_SYNC_OFFSET       (16)
+#define MPI_SCSIDEVPAGE1_RP_IDP                         (0x08000000)
 #define MPI_SCSIDEVPAGE1_RP_WIDE                        (0x20000000)
 #define MPI_SCSIDEVPAGE1_RP_AIP                         (0x80000000)
 
@@ -1016,11 +1373,11 @@ typedef struct _CONFIG_PAGE_SCSI_DEVICE_1
 
 typedef struct _CONFIG_PAGE_SCSI_DEVICE_2
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     DomainValidation;           /* 04h */
     U32                     ParityPipeSelect;           /* 08h */
     U32                     DataPipeSelect;             /* 0Ch */
-} fCONFIG_PAGE_SCSI_DEVICE_2, MPI_POINTER PTR_CONFIG_PAGE_SCSI_DEVICE_2,
+} CONFIG_PAGE_SCSI_DEVICE_2, MPI_POINTER PTR_CONFIG_PAGE_SCSI_DEVICE_2,
   SCSIDevicePage2_t, MPI_POINTER pSCSIDevicePage2_t;
 
 #define MPI_SCSIDEVPAGE2_PAGEVERSION                    (0x01)
@@ -1057,12 +1414,12 @@ typedef struct _CONFIG_PAGE_SCSI_DEVICE_2
 
 typedef struct _CONFIG_PAGE_SCSI_DEVICE_3
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U16                     MsgRejectCount;             /* 04h */
     U16                     PhaseErrorCount;            /* 06h */
     U16                     ParityErrorCount;           /* 08h */
     U16                     Reserved;                   /* 0Ah */
-} fCONFIG_PAGE_SCSI_DEVICE_3, MPI_POINTER PTR_CONFIG_PAGE_SCSI_DEVICE_3,
+} CONFIG_PAGE_SCSI_DEVICE_3, MPI_POINTER PTR_CONFIG_PAGE_SCSI_DEVICE_3,
   SCSIDevicePage3_t, MPI_POINTER pSCSIDevicePage3_t;
 
 #define MPI_SCSIDEVPAGE3_PAGEVERSION                    (0x00)
@@ -1077,7 +1434,7 @@ typedef struct _CONFIG_PAGE_SCSI_DEVICE_3
 
 typedef struct _CONFIG_PAGE_FC_PORT_0
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     Flags;                      /* 04h */
     U8                      MPIPortNumber;              /* 08h */
     U8                      LinkType;                   /* 09h */
@@ -1098,7 +1455,7 @@ typedef struct _CONFIG_PAGE_FC_PORT_0
     U8                      MaxHardAliasesSupported;    /* 49h */
     U8                      NumCurrentAliases;          /* 4Ah */
     U8                      Reserved1;                  /* 4Bh */
-} fCONFIG_PAGE_FC_PORT_0, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_0,
+} CONFIG_PAGE_FC_PORT_0, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_0,
   FCPortPage0_t, MPI_POINTER pFCPortPage0_t;
 
 #define MPI_FCPORTPAGE0_PAGEVERSION                     (0x02)
@@ -1164,10 +1521,9 @@ typedef struct _CONFIG_PAGE_FC_PORT_0
 #define MPI_FCPORTPAGE0_CURRENT_SPEED_NOT_NEGOTIATED    (0x00008000)        /* (SNIA)HBA_PORTSPEED_NOT_NEGOTIATED (1<<15) Speed not established */
 
 
-
 typedef struct _CONFIG_PAGE_FC_PORT_1
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     Flags;                      /* 04h */
     U64                     NoSEEPROMWWNN;              /* 08h */
     U64                     NoSEEPROMWWPN;              /* 10h */
@@ -1179,7 +1535,7 @@ typedef struct _CONFIG_PAGE_FC_PORT_1
     U8                      RR_TOV;                     /* 1Dh */
     U8                      InitiatorDeviceTimeout;     /* 1Eh */
     U8                      InitiatorIoPendTimeout;     /* 1Fh */
-} fCONFIG_PAGE_FC_PORT_1, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_1,
+} CONFIG_PAGE_FC_PORT_1, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_1,
   FCPortPage1_t, MPI_POINTER pFCPortPage1_t;
 
 #define MPI_FCPORTPAGE1_PAGEVERSION                     (0x06)
@@ -1191,6 +1547,7 @@ typedef struct _CONFIG_PAGE_FC_PORT_1
 #define MPI_FCPORTPAGE1_FLAGS_TARGET_MODE_OXID          (0x00800000)
 #define MPI_FCPORTPAGE1_FLAGS_PORT_OFFLINE              (0x00400000)
 #define MPI_FCPORTPAGE1_FLAGS_SOFT_ALPA_FALLBACK        (0x00200000)
+#define MPI_FCPORTPAGE1_FLAGS_TARGET_LARGE_CDB_ENABLE   (0x00000080)
 #define MPI_FCPORTPAGE1_FLAGS_MASK_RR_TOV_UNITS         (0x00000070)
 #define MPI_FCPORTPAGE1_FLAGS_SUPPRESS_PROT_REG         (0x00000008)
 #define MPI_FCPORTPAGE1_FLAGS_PLOGI_ON_LOGO             (0x00000004)
@@ -1227,14 +1584,15 @@ typedef struct _CONFIG_PAGE_FC_PORT_1
 #define MPI_FCPORTPAGE1_ALT_CONN_UNKNOWN                (0x00)
 
 #define MPI_FCPORTPAGE1_INITIATOR_DEV_TIMEOUT_MASK      (0x7F)
+#define MPI_FCPORTPAGE1_INITIATOR_DEV_UNIT_16           (0x80)
 
 
 typedef struct _CONFIG_PAGE_FC_PORT_2
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U8                      NumberActive;               /* 04h */
     U8                      ALPA[127];                  /* 05h */
-} fCONFIG_PAGE_FC_PORT_2, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_2,
+} CONFIG_PAGE_FC_PORT_2, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_2,
   FCPortPage2_t, MPI_POINTER pFCPortPage2_t;
 
 #define MPI_FCPORTPAGE2_PAGEVERSION                     (0x01)
@@ -1280,9 +1638,9 @@ typedef struct _FC_PORT_PERSISTENT
 
 typedef struct _CONFIG_PAGE_FC_PORT_3
 {
-    fCONFIG_PAGE_HEADER      Header;                                 /* 00h */
+    CONFIG_PAGE_HEADER      Header;                                 /* 00h */
     FC_PORT_PERSISTENT      Entry[MPI_FC_PORT_PAGE_3_ENTRY_MAX];    /* 04h */
-} fCONFIG_PAGE_FC_PORT_3, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_3,
+} CONFIG_PAGE_FC_PORT_3, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_3,
   FCPortPage3_t, MPI_POINTER pFCPortPage3_t;
 
 #define MPI_FCPORTPAGE3_PAGEVERSION                     (0x01)
@@ -1290,10 +1648,10 @@ typedef struct _CONFIG_PAGE_FC_PORT_3
 
 typedef struct _CONFIG_PAGE_FC_PORT_4
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     PortFlags;                  /* 04h */
     U32                     PortSettings;               /* 08h */
-} fCONFIG_PAGE_FC_PORT_4, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_4,
+} CONFIG_PAGE_FC_PORT_4, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_4,
   FCPortPage4_t, MPI_POINTER pFCPortPage4_t;
 
 #define MPI_FCPORTPAGE4_PAGEVERSION                     (0x00)
@@ -1316,15 +1674,15 @@ typedef struct _CONFIG_PAGE_FC_PORT_5_ALIAS_INFO
     U16     Reserved;                                   /* 02h */
     U64     AliasWWNN;                                  /* 04h */
     U64     AliasWWPN;                                  /* 0Ch */
-} fCONFIG_PAGE_FC_PORT_5_ALIAS_INFO,
+} CONFIG_PAGE_FC_PORT_5_ALIAS_INFO,
   MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_5_ALIAS_INFO,
   FcPortPage5AliasInfo_t, MPI_POINTER pFcPortPage5AliasInfo_t;
 
 typedef struct _CONFIG_PAGE_FC_PORT_5
 {
-    fCONFIG_PAGE_HEADER                  Header;         /* 00h */
-    fCONFIG_PAGE_FC_PORT_5_ALIAS_INFO    AliasInfo;      /* 04h */
-} fCONFIG_PAGE_FC_PORT_5, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_5,
+    CONFIG_PAGE_HEADER                  Header;         /* 00h */
+    CONFIG_PAGE_FC_PORT_5_ALIAS_INFO    AliasInfo;      /* 04h */
+} CONFIG_PAGE_FC_PORT_5, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_5,
   FCPortPage5_t, MPI_POINTER pFCPortPage5_t;
 
 #define MPI_FCPORTPAGE5_PAGEVERSION                     (0x02)
@@ -1337,7 +1695,7 @@ typedef struct _CONFIG_PAGE_FC_PORT_5
 
 typedef struct _CONFIG_PAGE_FC_PORT_6
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     Reserved;                   /* 04h */
     U64                     TimeSinceReset;             /* 08h */
     U64                     TxFrames;                   /* 10h */
@@ -1355,7 +1713,7 @@ typedef struct _CONFIG_PAGE_FC_PORT_6
     U64                     InvalidTxWordCount;         /* 70h */
     U64                     InvalidCrcCount;            /* 78h */
     U64                     FcpInitiatorIoCount;        /* 80h */
-} fCONFIG_PAGE_FC_PORT_6, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_6,
+} CONFIG_PAGE_FC_PORT_6, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_6,
   FCPortPage6_t, MPI_POINTER pFCPortPage6_t;
 
 #define MPI_FCPORTPAGE6_PAGEVERSION                     (0x00)
@@ -1363,10 +1721,10 @@ typedef struct _CONFIG_PAGE_FC_PORT_6
 
 typedef struct _CONFIG_PAGE_FC_PORT_7
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     Reserved;                   /* 04h */
     U8                      PortSymbolicName[256];      /* 08h */
-} fCONFIG_PAGE_FC_PORT_7, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_7,
+} CONFIG_PAGE_FC_PORT_7, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_7,
   FCPortPage7_t, MPI_POINTER pFCPortPage7_t;
 
 #define MPI_FCPORTPAGE7_PAGEVERSION                     (0x00)
@@ -1374,9 +1732,9 @@ typedef struct _CONFIG_PAGE_FC_PORT_7
 
 typedef struct _CONFIG_PAGE_FC_PORT_8
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     BitVector[8];               /* 04h */
-} fCONFIG_PAGE_FC_PORT_8, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_8,
+} CONFIG_PAGE_FC_PORT_8, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_8,
   FCPortPage8_t, MPI_POINTER pFCPortPage8_t;
 
 #define MPI_FCPORTPAGE8_PAGEVERSION                     (0x00)
@@ -1384,7 +1742,7 @@ typedef struct _CONFIG_PAGE_FC_PORT_8
 
 typedef struct _CONFIG_PAGE_FC_PORT_9
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U32                     Reserved;                   /* 04h */
     U64                     GlobalWWPN;                 /* 08h */
     U64                     GlobalWWNN;                 /* 10h */
@@ -1396,7 +1754,7 @@ typedef struct _CONFIG_PAGE_FC_PORT_9
     U8                      IPAddress[16];              /* 28h */
     U16                     Reserved1;                  /* 38h */
     U16                     TopologyDiscoveryFlags;     /* 3Ah */
-} fCONFIG_PAGE_FC_PORT_9, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_9,
+} CONFIG_PAGE_FC_PORT_9, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_9,
   FCPortPage9_t, MPI_POINTER pFCPortPage9_t;
 
 #define MPI_FCPORTPAGE9_PAGEVERSION                     (0x00)
@@ -1422,10 +1780,10 @@ typedef struct _CONFIG_PAGE_FC_PORT_10_BASE_SFP_DATA
     U8                      VendorOUI[3];               /* 35h */
     U8                      VendorPN[16];               /* 38h */
     U8                      VendorRev[4];               /* 48h */
-    U16                     Reserved4;                  /* 4Ch */
-    U8                      Reserved5;                  /* 4Eh */
+    U16                     Wavelength;                 /* 4Ch */
+    U8                      Reserved4;                  /* 4Eh */
     U8                      CC_BASE;                    /* 4Fh */
-} fCONFIG_PAGE_FC_PORT_10_BASE_SFP_DATA,
+} CONFIG_PAGE_FC_PORT_10_BASE_SFP_DATA,
   MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_10_BASE_SFP_DATA,
   FCPortPage10BaseSfpData_t, MPI_POINTER pFCPortPage10BaseSfpData_t;
 
@@ -1481,9 +1839,11 @@ typedef struct _CONFIG_PAGE_FC_PORT_10_EXTENDED_SFP_DATA
     U8                      BitRateMin;                 /* 53h */
     U8                      VendorSN[16];               /* 54h */
     U8                      DateCode[8];                /* 64h */
-    U8                      Reserved5[3];               /* 6Ch */
+    U8                      DiagMonitoringType;         /* 6Ch */
+    U8                      EnhancedOptions;            /* 6Dh */
+    U8                      SFF8472Compliance;          /* 6Eh */
     U8                      CC_EXT;                     /* 6Fh */
-} fCONFIG_PAGE_FC_PORT_10_EXTENDED_SFP_DATA,
+} CONFIG_PAGE_FC_PORT_10_EXTENDED_SFP_DATA,
   MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_10_EXTENDED_SFP_DATA,
   FCPortPage10ExtendedSfpData_t, MPI_POINTER pFCPortPage10ExtendedSfpData_t;
 
@@ -1496,19 +1856,19 @@ typedef struct _CONFIG_PAGE_FC_PORT_10_EXTENDED_SFP_DATA
 
 typedef struct _CONFIG_PAGE_FC_PORT_10
 {
-    fCONFIG_PAGE_HEADER                          Header;             /* 00h */
+    CONFIG_PAGE_HEADER                          Header;             /* 00h */
     U8                                          Flags;              /* 04h */
     U8                                          Reserved1;          /* 05h */
     U16                                         Reserved2;          /* 06h */
     U32                                         HwConfig1;          /* 08h */
     U32                                         HwConfig2;          /* 0Ch */
-    fCONFIG_PAGE_FC_PORT_10_BASE_SFP_DATA        Base;               /* 10h */
-    fCONFIG_PAGE_FC_PORT_10_EXTENDED_SFP_DATA    Extended;           /* 50h */
+    CONFIG_PAGE_FC_PORT_10_BASE_SFP_DATA        Base;               /* 10h */
+    CONFIG_PAGE_FC_PORT_10_EXTENDED_SFP_DATA    Extended;           /* 50h */
     U8                                          VendorSpecific[32]; /* 70h */
-} fCONFIG_PAGE_FC_PORT_10, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_10,
+} CONFIG_PAGE_FC_PORT_10, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_10,
   FCPortPage10_t, MPI_POINTER pFCPortPage10_t;
 
-#define MPI_FCPORTPAGE10_PAGEVERSION                    (0x00)
+#define MPI_FCPORTPAGE10_PAGEVERSION                    (0x01)
 
 /* standard MODDEF pin definitions (from GBIC spec.) */
 #define MPI_FCPORTPAGE10_FLAGS_MODDEF_MASK              (0x00000007)
@@ -1534,7 +1894,7 @@ typedef struct _CONFIG_PAGE_FC_PORT_10
 
 typedef struct _CONFIG_PAGE_FC_DEVICE_0
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     U64                     WWNN;                       /* 04h */
     U64                     WWPN;                       /* 0Ch */
     U32                     PortIdentifier;             /* 14h */
@@ -1548,7 +1908,7 @@ typedef struct _CONFIG_PAGE_FC_DEVICE_0
     U8                      FcPhHighestVersion;         /* 21h */
     U8                      CurrentTargetID;            /* 22h */
     U8                      CurrentBus;                 /* 23h */
-} fCONFIG_PAGE_FC_DEVICE_0, MPI_POINTER PTR_CONFIG_PAGE_FC_DEVICE_0,
+} CONFIG_PAGE_FC_DEVICE_0, MPI_POINTER PTR_CONFIG_PAGE_FC_DEVICE_0,
   FCDevicePage0_t, MPI_POINTER pFCDevicePage0_t;
 
 #define MPI_FC_DEVICE_PAGE0_PAGEVERSION                 (0x03)
@@ -1606,6 +1966,7 @@ typedef struct _RAID_VOL0_STATUS
 #define MPI_RAIDVOL0_STATUS_STATE_OPTIMAL               (0x00)
 #define MPI_RAIDVOL0_STATUS_STATE_DEGRADED              (0x01)
 #define MPI_RAIDVOL0_STATUS_STATE_FAILED                (0x02)
+#define MPI_RAIDVOL0_STATUS_STATE_MISSING               (0x03)
 
 typedef struct _RAID_VOL0_SETTINGS
 {
@@ -1616,11 +1977,11 @@ typedef struct _RAID_VOL0_SETTINGS
   RaidVol0Settings, MPI_POINTER pRaidVol0Settings;
 
 /* RAID Volume Page 0 VolumeSettings defines */
-
 #define MPI_RAIDVOL0_SETTING_WRITE_CACHING_ENABLE       (0x0001)
 #define MPI_RAIDVOL0_SETTING_OFFLINE_ON_SMART           (0x0002)
 #define MPI_RAIDVOL0_SETTING_AUTO_CONFIGURE             (0x0004)
 #define MPI_RAIDVOL0_SETTING_PRIORITY_RESYNC            (0x0008)
+#define MPI_RAIDVOL0_SETTING_FAST_DATA_SCRUBBING_0102   (0x0020) /* obsolete */
 #define MPI_RAIDVOL0_SETTING_USE_PRODUCT_ID_SUFFIX      (0x0010)
 #define MPI_RAIDVOL0_SETTING_USE_DEFAULTS               (0x8000)
 
@@ -1644,7 +2005,7 @@ typedef struct _RAID_VOL0_SETTINGS
 
 typedef struct _CONFIG_PAGE_RAID_VOL_0
 {
-    fCONFIG_PAGE_HEADER      Header;         /* 00h */
+    CONFIG_PAGE_HEADER      Header;         /* 00h */
     U8                      VolumeID;       /* 04h */
     U8                      VolumeBus;      /* 05h */
     U8                      VolumeIOC;      /* 06h */
@@ -1657,13 +2018,41 @@ typedef struct _CONFIG_PAGE_RAID_VOL_0
     U32                     Reserved2;      /* 1Ch */
     U32                     Reserved3;      /* 20h */
     U8                      NumPhysDisks;   /* 24h */
-    U8                      Reserved4;      /* 25h */
-    U16                     Reserved5;      /* 26h */
+    U8                      DataScrubRate;  /* 25h */
+    U8                      ResyncRate;     /* 26h */
+    U8                      InactiveStatus; /* 27h */
     RAID_VOL0_PHYS_DISK     PhysDisk[MPI_RAID_VOL_PAGE_0_PHYSDISK_MAX];/* 28h */
-} fCONFIG_PAGE_RAID_VOL_0, MPI_POINTER PTR_CONFIG_PAGE_RAID_VOL_0,
+} CONFIG_PAGE_RAID_VOL_0, MPI_POINTER PTR_CONFIG_PAGE_RAID_VOL_0,
   RaidVolumePage0_t, MPI_POINTER pRaidVolumePage0_t;
 
-#define MPI_RAIDVOLPAGE0_PAGEVERSION                    (0x01)
+#define MPI_RAIDVOLPAGE0_PAGEVERSION                    (0x04)
+
+/* values for RAID Volume Page 0 InactiveStatus field */
+#define MPI_RAIDVOLPAGE0_UNKNOWN_INACTIVE               (0x00)
+#define MPI_RAIDVOLPAGE0_STALE_METADATA_INACTIVE        (0x01)
+#define MPI_RAIDVOLPAGE0_FOREIGN_VOLUME_INACTIVE        (0x02)
+#define MPI_RAIDVOLPAGE0_INSUFFICIENT_RESOURCE_INACTIVE (0x03)
+#define MPI_RAIDVOLPAGE0_CLONE_VOLUME_INACTIVE          (0x04)
+#define MPI_RAIDVOLPAGE0_INSUFFICIENT_METADATA_INACTIVE (0x05)
+#define MPI_RAIDVOLPAGE0_PREVIOUSLY_DELETED             (0x06)
+
+
+typedef struct _CONFIG_PAGE_RAID_VOL_1
+{
+    CONFIG_PAGE_HEADER      Header;         /* 00h */
+    U8                      VolumeID;       /* 01h */
+    U8                      VolumeBus;      /* 02h */
+    U8                      VolumeIOC;      /* 03h */
+    U8                      Reserved0;      /* 04h */
+    U8                      GUID[24];       /* 05h */
+    U8                      Name[32];       /* 20h */
+    U64                     WWID;           /* 40h */
+    U32                     Reserved1;      /* 48h */
+    U32                     Reserved2;      /* 4Ch */
+} CONFIG_PAGE_RAID_VOL_1, MPI_POINTER PTR_CONFIG_PAGE_RAID_VOL_1,
+  RaidVolumePage1_t, MPI_POINTER pRaidVolumePage1_t;
+
+#define MPI_RAIDVOLPAGE1_PAGEVERSION                    (0x01)
 
 
 /****************************************************************************
@@ -1714,6 +2103,7 @@ typedef struct _RAID_PHYS_DISK0_STATUS
 
 #define MPI_PHYSDISK0_STATUS_FLAG_OUT_OF_SYNC           (0x01)
 #define MPI_PHYSDISK0_STATUS_FLAG_QUIESCED              (0x02)
+#define MPI_PHYSDISK0_STATUS_FLAG_INACTIVE_VOLUME       (0x04)
 
 #define MPI_PHYSDISK0_STATUS_ONLINE                     (0x00)
 #define MPI_PHYSDISK0_STATUS_MISSING                    (0x01)
@@ -1726,24 +2116,54 @@ typedef struct _RAID_PHYS_DISK0_STATUS
 
 typedef struct _CONFIG_PAGE_RAID_PHYS_DISK_0
 {
-    fCONFIG_PAGE_HEADER              Header;             /* 00h */
+    CONFIG_PAGE_HEADER              Header;             /* 00h */
     U8                              PhysDiskID;         /* 04h */
     U8                              PhysDiskBus;        /* 05h */
     U8                              PhysDiskIOC;        /* 06h */
     U8                              PhysDiskNum;        /* 07h */
     RAID_PHYS_DISK0_SETTINGS        PhysDiskSettings;   /* 08h */
     U32                             Reserved1;          /* 0Ch */
-    U32                             Reserved2;          /* 10h */
-    U32                             Reserved3;          /* 14h */
+    U8                              ExtDiskIdentifier[8]; /* 10h */
     U8                              DiskIdentifier[16]; /* 18h */
     RAID_PHYS_DISK0_INQUIRY_DATA    InquiryData;        /* 28h */
     RAID_PHYS_DISK0_STATUS          PhysDiskStatus;     /* 64h */
     U32                             MaxLBA;             /* 68h */
     RAID_PHYS_DISK0_ERROR_DATA      ErrorData;          /* 6Ch */
-} fCONFIG_PAGE_RAID_PHYS_DISK_0, MPI_POINTER PTR_CONFIG_PAGE_RAID_PHYS_DISK_0,
+} CONFIG_PAGE_RAID_PHYS_DISK_0, MPI_POINTER PTR_CONFIG_PAGE_RAID_PHYS_DISK_0,
   RaidPhysDiskPage0_t, MPI_POINTER pRaidPhysDiskPage0_t;
 
-#define MPI_RAIDPHYSDISKPAGE0_PAGEVERSION           (0x00)
+#define MPI_RAIDPHYSDISKPAGE0_PAGEVERSION           (0x01)
+
+
+typedef struct _RAID_PHYS_DISK1_PATH
+{
+    U8                              PhysDiskID;         /* 00h */
+    U8                              PhysDiskBus;        /* 01h */
+    U16                             Reserved1;          /* 02h */
+    U64                             WWID;               /* 04h */
+    U64                             OwnerWWID;          /* 0Ch */
+    U8                              OwnerIdentifier;    /* 14h */
+    U8                              Reserved2;          /* 15h */
+    U16                             Flags;              /* 16h */
+} RAID_PHYS_DISK1_PATH, MPI_POINTER PTR_RAID_PHYS_DISK1_PATH,
+  RaidPhysDisk1Path_t, MPI_POINTER pRaidPhysDisk1Path_t;
+
+/* RAID Physical Disk Page 1 Flags field defines */
+#define MPI_RAID_PHYSDISK1_FLAG_BROKEN          (0x0002)
+#define MPI_RAID_PHYSDISK1_FLAG_INVALID         (0x0001)
+
+typedef struct _CONFIG_PAGE_RAID_PHYS_DISK_1
+{
+    CONFIG_PAGE_HEADER              Header;             /* 00h */
+    U8                              NumPhysDiskPaths;   /* 04h */
+    U8                              PhysDiskNum;        /* 05h */
+    U16                             Reserved2;          /* 06h */
+    U32                             Reserved1;          /* 08h */
+    RAID_PHYS_DISK1_PATH            Path[1];            /* 0Ch */
+} CONFIG_PAGE_RAID_PHYS_DISK_1, MPI_POINTER PTR_CONFIG_PAGE_RAID_PHYS_DISK_1,
+  RaidPhysDiskPage1_t, MPI_POINTER pRaidPhysDiskPage1_t;
+
+#define MPI_RAIDPHYSDISKPAGE1_PAGEVERSION       (0x00)
 
 
 /****************************************************************************
@@ -1756,7 +2176,7 @@ typedef struct _CONFIG_PAGE_LAN_0
     U16                     TxRxModes;                  /* 04h */
     U16                     Reserved;                   /* 06h */
     U32                     PacketPrePad;               /* 08h */
-} fCONFIG_PAGE_LAN_0, MPI_POINTER PTR_CONFIG_PAGE_LAN_0,
+} CONFIG_PAGE_LAN_0, MPI_POINTER PTR_CONFIG_PAGE_LAN_0,
   LANPage0_t, MPI_POINTER pLANPage0_t;
 
 #define MPI_LAN_PAGE0_PAGEVERSION                       (0x01)
@@ -1781,7 +2201,7 @@ typedef struct _CONFIG_PAGE_LAN_1
     U32                     MaxReplySize;               /* 24h */
     U32                     NegWireSpeedLow;            /* 28h */
     U32                     NegWireSpeedHigh;           /* 2Ch */
-} fCONFIG_PAGE_LAN_1, MPI_POINTER PTR_CONFIG_PAGE_LAN_1,
+} CONFIG_PAGE_LAN_1, MPI_POINTER PTR_CONFIG_PAGE_LAN_1,
   LANPage1_t, MPI_POINTER pLANPage1_t;
 
 #define MPI_LAN_PAGE1_PAGEVERSION                       (0x03)
@@ -1796,11 +2216,11 @@ typedef struct _CONFIG_PAGE_LAN_1
 
 typedef struct _CONFIG_PAGE_INBAND_0
 {
-    fCONFIG_PAGE_HEADER      Header;                     /* 00h */
+    CONFIG_PAGE_HEADER      Header;                     /* 00h */
     MPI_VERSION_FORMAT      InbandVersion;              /* 04h */
     U16                     MaximumBuffers;             /* 08h */
     U16                     Reserved1;                  /* 0Ah */
-} fCONFIG_PAGE_INBAND_0, MPI_POINTER PTR_CONFIG_PAGE_INBAND_0,
+} CONFIG_PAGE_INBAND_0, MPI_POINTER PTR_CONFIG_PAGE_INBAND_0,
   InbandPage0_t, MPI_POINTER pInbandPage0_t;
 
 #define MPI_INBAND_PAGEVERSION          (0x00)
@@ -1820,7 +2240,7 @@ typedef struct _MPI_SAS_IO_UNIT0_PHY_DATA
     U32         ControllerPhyDeviceInfo;/* 04h */
     U16         AttachedDeviceHandle;   /* 08h */
     U16         ControllerDevHandle;    /* 0Ah */
-    U32         Reserved2;              /* 0Ch */
+    U32         DiscoveryStatus;        /* 0Ch */
 } MPI_SAS_IO_UNIT0_PHY_DATA, MPI_POINTER PTR_MPI_SAS_IO_UNIT0_PHY_DATA,
   SasIOUnit0PhyData, MPI_POINTER pSasIOUnit0PhyData;
 
@@ -1834,22 +2254,21 @@ typedef struct _MPI_SAS_IO_UNIT0_PHY_DATA
 
 typedef struct _CONFIG_PAGE_SAS_IO_UNIT_0
 {
-    fCONFIG_EXTENDED_PAGE_HEADER     Header;                             /* 00h */
+    CONFIG_EXTENDED_PAGE_HEADER     Header;                             /* 00h */
     U32                             Reserved1;                          /* 08h */
     U8                              NumPhys;                            /* 0Ch */
     U8                              Reserved2;                          /* 0Dh */
     U16                             Reserved3;                          /* 0Eh */
     MPI_SAS_IO_UNIT0_PHY_DATA       PhyData[MPI_SAS_IOUNIT0_PHY_MAX];   /* 10h */
-} fCONFIG_PAGE_SAS_IO_UNIT_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_0,
+} CONFIG_PAGE_SAS_IO_UNIT_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_0,
   SasIOUnitPage0_t, MPI_POINTER pSasIOUnitPage0_t;
 
-#define MPI_SASIOUNITPAGE0_PAGEVERSION      (0x00)
+#define MPI_SASIOUNITPAGE0_PAGEVERSION      (0x02)
 
 /* values for SAS IO Unit Page 0 PortFlags */
 #define MPI_SAS_IOUNIT0_PORT_FLAGS_DISCOVERY_IN_PROGRESS    (0x08)
 #define MPI_SAS_IOUNIT0_PORT_FLAGS_0_TARGET_IOC_NUM         (0x00)
 #define MPI_SAS_IOUNIT0_PORT_FLAGS_1_TARGET_IOC_NUM         (0x04)
-#define MPI_SAS_IOUNIT0_PORT_FLAGS_WAIT_FOR_PORTENABLE      (0x02)
 #define MPI_SAS_IOUNIT0_PORT_FLAGS_AUTO_PORT_CONFIG         (0x01)
 
 /* values for SAS IO Unit Page 0 PhyFlags */
@@ -1867,6 +2286,20 @@ typedef struct _CONFIG_PAGE_SAS_IO_UNIT_0
 
 /* see mpi_sas.h for values for SAS IO Unit Page 0 ControllerPhyDeviceInfo values */
 
+/* values for SAS IO Unit Page 0 DiscoveryStatus */
+#define MPI_SAS_IOUNIT0_DS_LOOP_DETECTED                    (0x00000001)
+#define MPI_SAS_IOUNIT0_DS_UNADDRESSABLE_DEVICE             (0x00000002)
+#define MPI_SAS_IOUNIT0_DS_MULTIPLE_PORTS                   (0x00000004)
+#define MPI_SAS_IOUNIT0_DS_EXPANDER_ERR                     (0x00000008)
+#define MPI_SAS_IOUNIT0_DS_SMP_TIMEOUT                      (0x00000010)
+#define MPI_SAS_IOUNIT0_DS_OUT_ROUTE_ENTRIES                (0x00000020)
+#define MPI_SAS_IOUNIT0_DS_INDEX_NOT_EXIST                  (0x00000040)
+#define MPI_SAS_IOUNIT0_DS_SMP_FUNCTION_FAILED              (0x00000080)
+#define MPI_SAS_IOUNIT0_DS_SMP_CRC_ERROR                    (0x00000100)
+#define MPI_SAS_IOUNIT0_DS_SUBTRACTIVE_LINK                 (0x00000200)
+#define MPI_SAS_IOUNIT0_DS_TABLE_LINK                       (0x00000400)
+#define MPI_SAS_IOUNIT0_DS_UNSUPPORTED_DEVICE               (0x00000800)
+
 
 typedef struct _MPI_SAS_IO_UNIT1_PHY_DATA
 {
@@ -1889,52 +2322,75 @@ typedef struct _MPI_SAS_IO_UNIT1_PHY_DATA
 
 typedef struct _CONFIG_PAGE_SAS_IO_UNIT_1
 {
-    fCONFIG_EXTENDED_PAGE_HEADER Header;                             /* 00h */
-    U32                         Reserved1;                          /* 08h */
-    U8                          NumPhys;                            /* 0Ch */
-    U8                          Reserved2;                          /* 0Dh */
-    U16                         Reserved3;                          /* 0Eh */
-    MPI_SAS_IO_UNIT1_PHY_DATA   PhyData[MPI_SAS_IOUNIT1_PHY_MAX];   /* 10h */
-} fCONFIG_PAGE_SAS_IO_UNIT_1, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_1,
+    CONFIG_EXTENDED_PAGE_HEADER Header;                             /* 00h */
+    U16                         ControlFlags;                       /* 08h */
+    U16                         MaxNumSATATargets;                  /* 0Ah */
+    U32                         Reserved1;                          /* 0Ch */
+    U8                          NumPhys;                            /* 10h */
+    U8                          SATAMaxQDepth;                      /* 11h */
+    U16                         Reserved2;                          /* 12h */
+    MPI_SAS_IO_UNIT1_PHY_DATA   PhyData[MPI_SAS_IOUNIT1_PHY_MAX];   /* 14h */
+} CONFIG_PAGE_SAS_IO_UNIT_1, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_1,
   SasIOUnitPage1_t, MPI_POINTER pSasIOUnitPage1_t;
 
-#define MPI_SASIOUNITPAGE1_PAGEVERSION      (0x00)
-
-/* values for SAS IO Unit Page 0 PortFlags */
-#define MPI_SAS_IOUNIT1_PORT_FLAGS_0_TARGET_IOC_NUM         (0x00)
-#define MPI_SAS_IOUNIT1_PORT_FLAGS_1_TARGET_IOC_NUM         (0x04)
-#define MPI_SAS_IOUNIT1_PORT_FLAGS_WAIT_FOR_PORTENABLE      (0x02)
-#define MPI_SAS_IOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG         (0x01)
+#define MPI_SASIOUNITPAGE1_PAGEVERSION      (0x04)
+
+/* values for SAS IO Unit Page 1 ControlFlags */
+#define MPI_SAS_IOUNIT1_CONTROL_SATA_3_0_MAX            (0x4000)
+#define MPI_SAS_IOUNIT1_CONTROL_SATA_1_5_MAX            (0x2000)
+#define MPI_SAS_IOUNIT1_CONTROL_SATA_SW_PRESERVE        (0x1000)
+#define MPI_SAS_IOUNIT1_CONTROL_DISABLE_SAS_HASH        (0x0800)
+
+#define MPI_SAS_IOUNIT1_CONTROL_MASK_DEV_SUPPORT        (0x0600)
+#define MPI_SAS_IOUNIT1_CONTROL_SHIFT_DEV_SUPPORT       (9)
+#define MPI_SAS_IOUNIT1_CONTROL_DEV_SUPPORT_BOTH        (0x00)
+#define MPI_SAS_IOUNIT1_CONTROL_DEV_SAS_SUPPORT         (0x01)
+#define MPI_SAS_IOUNIT1_CONTROL_DEV_SATA_SUPPORT        (0x10)
+
+#define MPI_SAS_IOUNIT1_CONTROL_AUTO_PORT_SAME_SAS_ADDR (0x0100)
+#define MPI_SAS_IOUNIT1_CONTROL_SATA_48BIT_LBA_REQUIRED (0x0080)
+#define MPI_SAS_IOUNIT1_CONTROL_SATA_SMART_REQUIRED     (0x0040)
+#define MPI_SAS_IOUNIT1_CONTROL_SATA_NCQ_REQUIRED       (0x0020)
+#define MPI_SAS_IOUNIT1_CONTROL_SATA_FUA_REQUIRED       (0x0010)
+#define MPI_SAS_IOUNIT1_CONTROL_PHY_ENABLE_ORDER_HIGH   (0x0008)
+#define MPI_SAS_IOUNIT1_CONTROL_SUBTRACTIVE_ILLEGAL     (0x0004)
+#define MPI_SAS_IOUNIT1_CONTROL_FIRST_LVL_DISC_ONLY     (0x0002)
+#define MPI_SAS_IOUNIT1_CONTROL_CLEAR_AFFILIATION       (0x0001)
+
+/* values for SAS IO Unit Page 1 PortFlags */
+#define MPI_SAS_IOUNIT1_PORT_FLAGS_0_TARGET_IOC_NUM     (0x00)
+#define MPI_SAS_IOUNIT1_PORT_FLAGS_1_TARGET_IOC_NUM     (0x04)
+#define MPI_SAS_IOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG     (0x01)
 
 /* values for SAS IO Unit Page 0 PhyFlags */
-#define MPI_SAS_IOUNIT1_PHY_FLAGS_PHY_DISABLE               (0x04)
-#define MPI_SAS_IOUNIT1_PHY_FLAGS_TX_INVERT                 (0x02)
-#define MPI_SAS_IOUNIT1_PHY_FLAGS_RX_INVERT                 (0x01)
+#define MPI_SAS_IOUNIT1_PHY_FLAGS_PHY_DISABLE           (0x04)
+#define MPI_SAS_IOUNIT1_PHY_FLAGS_TX_INVERT             (0x02)
+#define MPI_SAS_IOUNIT1_PHY_FLAGS_RX_INVERT             (0x01)
 
 /* values for SAS IO Unit Page 0 MaxMinLinkRate */
-#define MPI_SAS_IOUNIT1_MAX_RATE_MASK                       (0xF0)
-#define MPI_SAS_IOUNIT1_MAX_RATE_1_5                        (0x80)
-#define MPI_SAS_IOUNIT1_MAX_RATE_3_0                        (0x90)
-#define MPI_SAS_IOUNIT1_MIN_RATE_MASK                       (0x0F)
-#define MPI_SAS_IOUNIT1_MIN_RATE_1_5                        (0x08)
-#define MPI_SAS_IOUNIT1_MIN_RATE_3_0                        (0x09)
+#define MPI_SAS_IOUNIT1_MAX_RATE_MASK                   (0xF0)
+#define MPI_SAS_IOUNIT1_MAX_RATE_1_5                    (0x80)
+#define MPI_SAS_IOUNIT1_MAX_RATE_3_0                    (0x90)
+#define MPI_SAS_IOUNIT1_MIN_RATE_MASK                   (0x0F)
+#define MPI_SAS_IOUNIT1_MIN_RATE_1_5                    (0x08)
+#define MPI_SAS_IOUNIT1_MIN_RATE_3_0                    (0x09)
 
 /* see mpi_sas.h for values for SAS IO Unit Page 1 ControllerPhyDeviceInfo values */
 
 
 typedef struct _CONFIG_PAGE_SAS_IO_UNIT_2
 {
-    fCONFIG_EXTENDED_PAGE_HEADER         Header;                 /* 00h */
+    CONFIG_EXTENDED_PAGE_HEADER         Header;                 /* 00h */
     U32                                 Reserved1;              /* 08h */
     U16                                 MaxPersistentIDs;       /* 0Ch */
     U16                                 NumPersistentIDsUsed;   /* 0Eh */
     U8                                  Status;                 /* 10h */
     U8                                  Flags;                  /* 11h */
-    U16                                 Reserved2;              /* 12h */
-} fCONFIG_PAGE_SAS_IO_UNIT_2, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_2,
+    U16                                 MaxNumPhysicalMappedIDs;/* 12h */              /* 12h */
+} CONFIG_PAGE_SAS_IO_UNIT_2, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_2,
   SasIOUnitPage2_t, MPI_POINTER pSasIOUnitPage2_t;
 
-#define MPI_SASIOUNITPAGE2_PAGEVERSION      (0x00)
+#define MPI_SASIOUNITPAGE2_PAGEVERSION      (0x03)
 
 /* values for SAS IO Unit Page 2 Status field */
 #define MPI_SAS_IOUNIT2_STATUS_DISABLED_PERSISTENT_MAPPINGS (0x02)
@@ -1942,11 +2398,19 @@ typedef struct _CONFIG_PAGE_SAS_IO_UNIT_2
 
 /* values for SAS IO Unit Page 2 Flags field */
 #define MPI_SAS_IOUNIT2_FLAGS_DISABLE_PERSISTENT_MAPPINGS   (0x01)
+/* Physical Mapping Modes */
+#define MPI_SAS_IOUNIT2_FLAGS_MASK_PHYS_MAP_MODE            (0x0E)
+#define MPI_SAS_IOUNIT2_FLAGS_SHIFT_PHYS_MAP_MODE           (1)
+#define MPI_SAS_IOUNIT2_FLAGS_NO_PHYS_MAP                   (0x00)
+#define MPI_SAS_IOUNIT2_FLAGS_DIRECT_ATTACH_PHYS_MAP        (0x01)
+#define MPI_SAS_IOUNIT2_FLAGS_ENCLOSURE_SLOT_PHYS_MAP       (0x02)
+
+#define MPI_SAS_IOUNIT2_FLAGS_RESERVE_ID_0_FOR_BOOT         (0x10)
 
 
 typedef struct _CONFIG_PAGE_SAS_IO_UNIT_3
 {
-    fCONFIG_EXTENDED_PAGE_HEADER Header;                         /* 00h */
+    CONFIG_EXTENDED_PAGE_HEADER Header;                         /* 00h */
     U32                         Reserved1;                      /* 08h */
     U32                         MaxInvalidDwordCount;           /* 0Ch */
     U32                         InvalidDwordCountTime;          /* 10h */
@@ -1956,18 +2420,24 @@ typedef struct _CONFIG_PAGE_SAS_IO_UNIT_3
     U32                         LossDwordSynchCountTime;        /* 20h */
     U32                         MaxPhyResetProblemCount;        /* 24h */
     U32                         PhyResetProblemTime;            /* 28h */
-} fCONFIG_PAGE_SAS_IO_UNIT_3, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_3,
+} CONFIG_PAGE_SAS_IO_UNIT_3, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_3,
   SasIOUnitPage3_t, MPI_POINTER pSasIOUnitPage3_t;
 
 #define MPI_SASIOUNITPAGE3_PAGEVERSION      (0x00)
 
 
+/****************************************************************************
+*   SAS Expander Config Pages
+****************************************************************************/
+
 typedef struct _CONFIG_PAGE_SAS_EXPANDER_0
 {
-    fCONFIG_EXTENDED_PAGE_HEADER         Header;                 /* 00h */
-    U32                                 Reserved1;              /* 08h */
+    CONFIG_EXTENDED_PAGE_HEADER         Header;                 /* 00h */
+    U8                                  PhysicalPort;           /* 08h */
+    U8                                  Reserved1;              /* 09h */
+    U16                                 Reserved2;              /* 0Ah */
     U64                                 SASAddress;             /* 0Ch */
-    U32                                 Reserved2;              /* 14h */
+    U32                                 DiscoveryStatus;        /* 14h */
     U16                                 DevHandle;              /* 18h */
     U16                                 ParentDevHandle;        /* 1Ah */
     U16                                 ExpanderChangeCount;    /* 1Ch */
@@ -1976,45 +2446,127 @@ typedef struct _CONFIG_PAGE_SAS_EXPANDER_0
     U8                                  SASLevel;               /* 21h */
     U8                                  Flags;                  /* 22h */
     U8                                  Reserved3;              /* 23h */
-} fCONFIG_PAGE_SAS_EXPANDER_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_EXPANDER_0,
+} CONFIG_PAGE_SAS_EXPANDER_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_EXPANDER_0,
   SasExpanderPage0_t, MPI_POINTER pSasExpanderPage0_t;
 
-#define MPI_SASEXPANDER0_PAGEVERSION        (0x00)
+#define MPI_SASEXPANDER0_PAGEVERSION        (0x02)
+
+/* values for SAS Expander Page 0 DiscoveryStatus field */
+#define MPI_SAS_EXPANDER0_DS_LOOP_DETECTED              (0x00000001)
+#define MPI_SAS_EXPANDER0_DS_UNADDRESSABLE_DEVICE       (0x00000002)
+#define MPI_SAS_EXPANDER0_DS_MULTIPLE_PORTS             (0x00000004)
+#define MPI_SAS_EXPANDER0_DS_EXPANDER_ERR               (0x00000008)
+#define MPI_SAS_EXPANDER0_DS_SMP_TIMEOUT                (0x00000010)
+#define MPI_SAS_EXPANDER0_DS_OUT_ROUTE_ENTRIES          (0x00000020)
+#define MPI_SAS_EXPANDER0_DS_INDEX_NOT_EXIST            (0x00000040)
+#define MPI_SAS_EXPANDER0_DS_SMP_FUNCTION_FAILED        (0x00000080)
+#define MPI_SAS_EXPANDER0_DS_SMP_CRC_ERROR              (0x00000100)
+#define MPI_SAS_EXPANDER0_DS_SUBTRACTIVE_LINK           (0x00000200)
+#define MPI_SAS_EXPANDER0_DS_TABLE_LINK                 (0x00000400)
+#define MPI_SAS_EXPANDER0_DS_UNSUPPORTED_DEVICE         (0x00000800)
 
 /* values for SAS Expander Page 0 Flags field */
 #define MPI_SAS_EXPANDER0_FLAGS_ROUTE_TABLE_CONFIG      (0x02)
 #define MPI_SAS_EXPANDER0_FLAGS_CONFIG_IN_PROGRESS      (0x01)
 
 
+typedef struct _CONFIG_PAGE_SAS_EXPANDER_1
+{
+    CONFIG_EXTENDED_PAGE_HEADER Header;                 /* 00h */
+    U8                          PhysicalPort;           /* 08h */
+    U8                          Reserved1;              /* 09h */
+    U16                         Reserved2;              /* 0Ah */
+    U8                          NumPhys;                /* 0Ch */
+    U8                          Phy;                    /* 0Dh */
+    U16                         NumTableEntriesProgrammed; /* 0Eh */
+    U8                          ProgrammedLinkRate;     /* 10h */
+    U8                          HwLinkRate;             /* 11h */
+    U16                         AttachedDevHandle;      /* 12h */
+    U32                         PhyInfo;                /* 14h */
+    U32                         AttachedDeviceInfo;     /* 18h */
+    U16                         OwnerDevHandle;         /* 1Ch */
+    U8                          ChangeCount;            /* 1Eh */
+    U8                          NegotiatedLinkRate;     /* 1Fh */
+    U8                          PhyIdentifier;          /* 20h */
+    U8                          AttachedPhyIdentifier;  /* 21h */
+    U8                          NumTableEntriesProg;    /* 22h */
+    U8                          DiscoveryInfo;          /* 23h */
+    U32                         Reserved3;              /* 24h */
+} CONFIG_PAGE_SAS_EXPANDER_1, MPI_POINTER PTR_CONFIG_PAGE_SAS_EXPANDER_1,
+  SasExpanderPage1_t, MPI_POINTER pSasExpanderPage1_t;
+
+#define MPI_SASEXPANDER1_PAGEVERSION        (0x01)
+
+/* use MPI_SAS_PHY0_PRATE_ defines for ProgrammedLinkRate */
+
+/* use MPI_SAS_PHY0_HWRATE_ defines for HwLinkRate */
+
+/* use MPI_SAS_PHY0_PHYINFO_ defines for PhyInfo */
+
+/* see mpi_sas.h for values for SAS Expander Page 1 AttachedDeviceInfo values */
+
+/* values for SAS Expander Page 1 DiscoveryInfo field */
+#define MPI_SAS_EXPANDER1_DISCINFO_BAD_PHY DISABLED     (0x04)
+#define MPI_SAS_EXPANDER1_DISCINFO_LINK_STATUS_CHANGE   (0x02)
+#define MPI_SAS_EXPANDER1_DISCINFO_NO_ROUTING_ENTRIES   (0x01)
+
+/* values for SAS Expander Page 1 NegotiatedLinkRate field */
+#define MPI_SAS_EXPANDER1_NEG_RATE_UNKNOWN              (0x00)
+#define MPI_SAS_EXPANDER1_NEG_RATE_PHY_DISABLED         (0x01)
+#define MPI_SAS_EXPANDER1_NEG_RATE_FAILED_NEGOTIATION   (0x02)
+#define MPI_SAS_EXPANDER1_NEG_RATE_SATA_OOB_COMPLETE    (0x03)
+#define MPI_SAS_EXPANDER1_NEG_RATE_1_5                  (0x08)
+#define MPI_SAS_EXPANDER1_NEG_RATE_3_0                  (0x09)
+
+
+/****************************************************************************
+*   SAS Device Config Pages
+****************************************************************************/
+
 typedef struct _CONFIG_PAGE_SAS_DEVICE_0
 {
-    fCONFIG_EXTENDED_PAGE_HEADER         Header;                 /* 00h */
-    U32                                 Reserved1;              /* 08h */
+    CONFIG_EXTENDED_PAGE_HEADER         Header;                 /* 00h */
+    U16                                 Slot;                   /* 08h */
+    U16                                 EnclosureHandle;        /* 0Ah */
     U64                                 SASAddress;             /* 0Ch */
-    U32                                 Reserved2;              /* 14h */
+    U16                                 ParentDevHandle;        /* 14h */
+    U8                                  PhyNum;                 /* 16h */
+    U8                                  AccessStatus;           /* 17h */
     U16                                 DevHandle;              /* 18h */
     U8                                  TargetID;               /* 1Ah */
     U8                                  Bus;                    /* 1Bh */
     U32                                 DeviceInfo;             /* 1Ch */
     U16                                 Flags;                  /* 20h */
     U8                                  PhysicalPort;           /* 22h */
-    U8                                  Reserved3;              /* 23h */
-} fCONFIG_PAGE_SAS_DEVICE_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_DEVICE_0,
+    U8                                  Reserved2;              /* 23h */
+} CONFIG_PAGE_SAS_DEVICE_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_DEVICE_0,
   SasDevicePage0_t, MPI_POINTER pSasDevicePage0_t;
 
-#define MPI_SASDEVICE0_PAGEVERSION          (0x00)
+#define MPI_SASDEVICE0_PAGEVERSION          (0x04)
+
+/* values for SAS Device Page 0 AccessStatus field */
+#define MPI_SAS_DEVICE0_ASTATUS_NO_ERRORS               (0x00)
+#define MPI_SAS_DEVICE0_ASTATUS_SATA_INIT_FAILED        (0x01)
+#define MPI_SAS_DEVICE0_ASTATUS_SATA_CAPABILITY_FAILED  (0x02)
 
 /* values for SAS Device Page 0 Flags field */
-#define MPI_SAS_DEVICE0_FLAGS_MAPPING_PERSISTENT    (0x04)
-#define MPI_SAS_DEVICE0_FLAGS_DEVICE_MAPPED         (0x02)
-#define MPI_SAS_DEVICE0_FLAGS_DEVICE_PRESENT        (0x01)
+#define MPI_SAS_DEVICE0_FLAGS_SATA_SW_PRESERVE          (0x0200)
+#define MPI_SAS_DEVICE0_FLAGS_UNSUPPORTED_DEVICE        (0x0100)
+#define MPI_SAS_DEVICE0_FLAGS_SATA_48BIT_LBA_SUPPORTED  (0x0080)
+#define MPI_SAS_DEVICE0_FLAGS_SATA_SMART_SUPPORTED      (0x0040)
+#define MPI_SAS_DEVICE0_FLAGS_SATA_NCQ_SUPPORTED        (0x0020)
+#define MPI_SAS_DEVICE0_FLAGS_SATA_FUA_SUPPORTED        (0x0010)
+#define MPI_SAS_DEVICE0_FLAGS_PORT_SELECTOR_ATTACH      (0x0008)
+#define MPI_SAS_DEVICE0_FLAGS_MAPPING_PERSISTENT        (0x0004)
+#define MPI_SAS_DEVICE0_FLAGS_DEVICE_MAPPED             (0x0002)
+#define MPI_SAS_DEVICE0_FLAGS_DEVICE_PRESENT            (0x0001)
 
 /* see mpi_sas.h for values for SAS Device Page 0 DeviceInfo values */
 
 
 typedef struct _CONFIG_PAGE_SAS_DEVICE_1
 {
-    fCONFIG_EXTENDED_PAGE_HEADER         Header;                 /* 00h */
+    CONFIG_EXTENDED_PAGE_HEADER         Header;                 /* 00h */
     U32                                 Reserved1;              /* 08h */
     U64                                 SASAddress;             /* 0Ch */
     U32                                 Reserved2;              /* 14h */
@@ -2022,15 +2574,30 @@ typedef struct _CONFIG_PAGE_SAS_DEVICE_1
     U8                                  TargetID;               /* 1Ah */
     U8                                  Bus;                    /* 1Bh */
     U8                                  InitialRegDeviceFIS[20];/* 1Ch */
-} fCONFIG_PAGE_SAS_DEVICE_1, MPI_POINTER PTR_CONFIG_PAGE_SAS_DEVICE_1,
+} CONFIG_PAGE_SAS_DEVICE_1, MPI_POINTER PTR_CONFIG_PAGE_SAS_DEVICE_1,
   SasDevicePage1_t, MPI_POINTER pSasDevicePage1_t;
 
 #define MPI_SASDEVICE1_PAGEVERSION          (0x00)
 
 
+typedef struct _CONFIG_PAGE_SAS_DEVICE_2
+{
+    CONFIG_EXTENDED_PAGE_HEADER         Header;                 /* 00h */
+    U64                                 PhysicalIdentifier;     /* 08h */
+    U32                                 Reserved1;              /* 10h */
+} CONFIG_PAGE_SAS_DEVICE_2, MPI_POINTER PTR_CONFIG_PAGE_SAS_DEVICE_2,
+  SasDevicePage2_t, MPI_POINTER pSasDevicePage2_t;
+
+#define MPI_SASDEVICE2_PAGEVERSION          (0x00)
+
+
+/****************************************************************************
+*   SAS PHY Config Pages
+****************************************************************************/
+
 typedef struct _CONFIG_PAGE_SAS_PHY_0
 {
-    fCONFIG_EXTENDED_PAGE_HEADER         Header;                 /* 00h */
+    CONFIG_EXTENDED_PAGE_HEADER         Header;                 /* 00h */
     U32                                 Reserved1;              /* 08h */
     U64                                 SASAddress;             /* 0Ch */
     U16                                 AttachedDevHandle;      /* 14h */
@@ -2042,7 +2609,7 @@ typedef struct _CONFIG_PAGE_SAS_PHY_0
     U8                                  ChangeCount;            /* 22h */
     U8                                  Reserved3;              /* 23h */
     U32                                 PhyInfo;                /* 24h */
-} fCONFIG_PAGE_SAS_PHY_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_PHY_0,
+} CONFIG_PAGE_SAS_PHY_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_PHY_0,
   SasPhyPage0_t, MPI_POINTER pSasPhyPage0_t;
 
 #define MPI_SASPHY0_PAGEVERSION             (0x00)
@@ -2089,17 +2656,95 @@ typedef struct _CONFIG_PAGE_SAS_PHY_0
 
 typedef struct _CONFIG_PAGE_SAS_PHY_1
 {
-    fCONFIG_EXTENDED_PAGE_HEADER Header;                     /* 00h */
+    CONFIG_EXTENDED_PAGE_HEADER Header;                     /* 00h */
     U32                         Reserved1;                  /* 08h */
     U32                         InvalidDwordCount;          /* 0Ch */
     U32                         RunningDisparityErrorCount; /* 10h */
     U32                         LossDwordSynchCount;        /* 14h */
     U32                         PhyResetProblemCount;       /* 18h */
-} fCONFIG_PAGE_SAS_PHY_1, MPI_POINTER PTR_CONFIG_PAGE_SAS_PHY_1,
+} CONFIG_PAGE_SAS_PHY_1, MPI_POINTER PTR_CONFIG_PAGE_SAS_PHY_1,
   SasPhyPage1_t, MPI_POINTER pSasPhyPage1_t;
 
 #define MPI_SASPHY1_PAGEVERSION             (0x00)
 
 
+/****************************************************************************
+*   SAS Enclosure Config Pages
+****************************************************************************/
+
+typedef struct _CONFIG_PAGE_SAS_ENCLOSURE_0
+{
+    CONFIG_EXTENDED_PAGE_HEADER         Header;                 /* 00h */
+    U32                                 Reserved1;              /* 08h */
+    U64                                 EnclosureLogicalID;     /* 0Ch */
+    U16                                 Flags;                  /* 14h */
+    U16                                 EnclosureHandle;        /* 16h */
+    U16                                 NumSlots;               /* 18h */
+    U16                                 StartSlot;              /* 1Ah */
+    U8                                  StartTargetID;          /* 1Ch */
+    U8                                  StartBus;               /* 1Dh */
+    U8                                  SEPTargetID;            /* 1Eh */
+    U8                                  SEPBus;                 /* 1Fh */
+    U32                                 Reserved2;              /* 20h */
+    U32                                 Reserved3;              /* 24h */
+} CONFIG_PAGE_SAS_ENCLOSURE_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_ENCLOSURE_0,
+  SasEnclosurePage0_t, MPI_POINTER pSasEnclosurePage0_t;
+
+#define MPI_SASENCLOSURE0_PAGEVERSION       (0x00)
+
+/* values for SAS Enclosure Page 0 Flags field */
+#define MPI_SAS_ENCLS0_FLAGS_SEP_BUS_ID_VALID       (0x0020)
+#define MPI_SAS_ENCLS0_FLAGS_START_BUS_ID_VALID     (0x0010)
+
+#define MPI_SAS_ENCLS0_FLAGS_MNG_MASK               (0x000F)
+#define MPI_SAS_ENCLS0_FLAGS_MNG_UNKNOWN            (0x0000)
+#define MPI_SAS_ENCLS0_FLAGS_MNG_IOC_SES            (0x0001)
+#define MPI_SAS_ENCLS0_FLAGS_MNG_IOC_SGPIO          (0x0002)
+#define MPI_SAS_ENCLS0_FLAGS_MNG_EXP_SGPIO          (0x0003)
+#define MPI_SAS_ENCLS0_FLAGS_MNG_SES_ENCLOSURE      (0x0004)
+
+
+/****************************************************************************
+*   Log Config Pages
+****************************************************************************/
+/*
+ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to
+ * one and check NumLogEntries at runtime.
+ */
+#ifndef MPI_LOG_0_NUM_LOG_ENTRIES
+#define MPI_LOG_0_NUM_LOG_ENTRIES        (1)
+#endif
+
+#define MPI_LOG_0_LOG_DATA_LENGTH        (20)
+
+typedef struct _MPI_LOG_0_ENTRY
+{
+    U64         WWID;                               /* 00h */
+    U32         TimeStamp;                          /* 08h */
+    U32         Reserved1;                          /* 0Ch */
+    U16         LogSequence;                        /* 10h */
+    U16         LogEntryQualifier;                  /* 12h */
+    U8          LogData[MPI_LOG_0_LOG_DATA_LENGTH]; /* 14h */
+} MPI_LOG_0_ENTRY, MPI_POINTER PTR_MPI_LOG_0_ENTRY,
+  MpiLog0Entry_t, MPI_POINTER pMpiLog0Entry_t;
+
+/* values for Log Page 0 LogEntry LogEntryQualifier field */
+#define MPI_LOG_0_ENTRY_QUAL_ENTRY_UNUSED           (0x0000)
+#define MPI_LOG_0_ENTRY_QUAL_POWER_ON_RESET         (0x0001)
+
+typedef struct _CONFIG_PAGE_LOG_0
+{
+    CONFIG_EXTENDED_PAGE_HEADER Header;                     /* 00h */
+    U32                         Reserved1;                  /* 08h */
+    U32                         Reserved2;                  /* 0Ch */
+    U16                         NumLogEntries;              /* 10h */
+    U16                         Reserved3;                  /* 12h */
+    MPI_LOG_0_ENTRY             LogEntry[MPI_LOG_0_NUM_LOG_ENTRIES]; /* 14h */
+} CONFIG_PAGE_LOG_0, MPI_POINTER PTR_CONFIG_PAGE_LOG_0,
+  LogPage0_t, MPI_POINTER pLogPage0_t;
+
+#define MPI_LOG_0_PAGEVERSION               (0x00)
+
+
 #endif
 
index ea266b236c1fe9eddb1f1c9d03b8c2f8fe6bb12c..51a6aeb990ba0bc5c8580b38dad8b72d4ab4bb0f 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2000-2003 LSI Logic Corporation.
+ *  Copyright (c) 2000-2004 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_fc.h
  *          Title:  MPI Fibre Channel messages and structures
  *  Creation Date:  June 12, 2000
  *
- *    mpi_fc.h Version:  01.05.xx
+ *    mpi_fc.h Version:  01.05.01
  *
  *  Version History
  *  ---------------
@@ -36,6 +36,9 @@
  *  09-28-01  01.02.02  Change name of reserved field in
  *                      MSG_LINK_SERVICE_RSP_REPLY.
  *  05-31-02  01.02.03  Adding AliasIndex to FC Direct Access requests.
+ *  01-16-04  01.02.04  Added define for MPI_FC_PRIM_SEND_FLAGS_ML_RESET_LINK.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Original release for MPI v1.5.
  *  --------------------------------------------------------------------------
  */
 
index 0deb7721e9362835b6c9d11b8d620ecd93b462c6..c9edbee41edff1a103a8c8267214529be5f7925e 100644 (file)
@@ -3,25 +3,28 @@
  MPI Header File Change History
  ==============================
 
- Copyright (c) 2000-2001 LSI Logic Corporation.
+ Copyright (c) 2000-2005 LSI Logic Corporation.
 
  ---------------------------------------
- Header Set Release Version:    01.01.10
- Header Set Release Date:       04-09-01
+ Header Set Release Version:    01.05.09
+ Header Set Release Date:       03-11-05
  ---------------------------------------
 
  Filename               Current version     Prior version
  ----------             ---------------     -------------
- mpi.h                  01.01.07            01.01.06
- mpi_ioc.h              01.01.07            01.01.06
- mpi_cnfg.h             01.01.11            01.01.10
- mpi_init.h             01.01.05            01.01.04
- mpi_targ.h             01.01.04            01.01.04
- mpi_fc.h               01.01.07            01.01.06
- mpi_lan.h              01.01.03            01.01.03
- mpi_raid.h             01.01.02            01.01.02
- mpi_type.h             01.01.02            01.01.02
- mpi_history.txt        01.01.09            01.01.09
+ mpi.h                  01.05.07            01.05.06
+ mpi_ioc.h              01.05.08            01.05.07
+ mpi_cnfg.h             01.05.08            01.05.07
+ mpi_init.h             01.05.04            01.05.03
+ mpi_targ.h             01.05.04            01.05.03
+ mpi_fc.h               01.05.01            01.05.01
+ mpi_lan.h              01.05.01            01.05.01
+ mpi_raid.h             01.05.02            01.05.02
+ mpi_tool.h             01.05.03            01.05.03
+ mpi_inb.h              01.05.01            01.05.01
+ mpi_sas.h              01.05.01            01.05.01
+ mpi_type.h             01.05.01            01.05.01
+ mpi_history.txt        01.05.09            01.05.08
 
 
  *  Date      Version   Description
@@ -53,6 +56,38 @@ mpi.h
  *                      Added function codes for RAID.
  *  04-09-01  01.01.07  Added alternate define for MPI_DOORBELL_ACTIVE,
  *                      MPI_DOORBELL_USED, to better match the spec.
+ *  08-08-01  01.02.01  Original release for v1.2 work.
+ *                      Changed MPI_VERSION_MINOR from 0x01 to 0x02.
+ *                      Added define MPI_FUNCTION_TOOLBOX.
+ *  09-28-01  01.02.02  New function code MPI_SCSI_ENCLOSURE_PROCESSOR.
+ *  11-01-01  01.02.03  Changed name to MPI_FUNCTION_SCSI_ENCLOSURE_PROCESSOR.
+ *  03-14-02  01.02.04  Added MPI_HEADER_VERSION_ defines.
+ *  05-31-02  01.02.05  Bumped MPI_HEADER_VERSION_UNIT.
+ *  07-12-02  01.02.06  Added define for MPI_FUNCTION_MAILBOX.
+ *  09-16-02  01.02.07  Bumped value for MPI_HEADER_VERSION_UNIT.
+ *  11-15-02  01.02.08  Added define MPI_IOCSTATUS_TARGET_INVALID_IO_INDEX and
+ *                      obsoleted define MPI_IOCSTATUS_TARGET_INVALID_IOCINDEX.
+ *  04-01-03  01.02.09  New IOCStatus code: MPI_IOCSTATUS_FC_EXCHANGE_CANCELED
+ *  06-26-03  01.02.10  Bumped MPI_HEADER_VERSION_UNIT value.
+ *  01-16-04  01.02.11  Added define for MPI_IOCLOGINFO_TYPE_SHIFT.
+ *  04-29-04  01.02.12  Added function codes for MPI_FUNCTION_DIAG_BUFFER_POST
+ *                      and MPI_FUNCTION_DIAG_RELEASE.
+ *                      Added MPI_IOCSTATUS_DIAGNOSTIC_RELEASED define.
+ *                      Bumped MPI_HEADER_VERSION_UNIT value.
+ *  05-11-04  01.03.01  Bumped MPI_VERSION_MINOR for MPI v1.3.
+ *                      Added codes for Inband.
+ *  08-19-04  01.05.01  Added defines for Host Buffer Access Control doorbell.
+ *                      Added define for offset of High Priority Request Queue.
+ *                      Added new function codes and new IOCStatus codes.
+ *                      Added a IOCLogInfo type of SAS.
+ *  12-07-04  01.05.02  Bumped MPI_HEADER_VERSION_UNIT.
+ *  12-09-04  01.05.03  Bumped MPI_HEADER_VERSION_UNIT.
+ *  01-15-05  01.05.04  Bumped MPI_HEADER_VERSION_UNIT.
+ *  02-09-05  01.05.05  Bumped MPI_HEADER_VERSION_UNIT.
+ *  02-22-05  01.05.06  Bumped MPI_HEADER_VERSION_UNIT.
+ *  03-11-05  01.05.07  Removed function codes for SCSI IO 32 and
+ *                      TargetAssistExtended requests.
+ *                      Removed EEDP IOCStatus codes.
  *  --------------------------------------------------------------------------
 
 mpi_ioc.h
@@ -81,6 +116,49 @@ mpi_ioc.h
  *  03-27-01  01.01.06  Added defines for ProductId field of MPI_FW_HEADER.
  *                      Added structure offset comments.
  *  04-09-01  01.01.07  Added structure EVENT_DATA_EVENT_CHANGE.
+ *  08-08-01  01.02.01  Original release for v1.2 work.
+ *                      New format for FWVersion and ProductId in
+ *                      MSG_IOC_FACTS_REPLY and MPI_FW_HEADER.
+ *  08-31-01  01.02.02  Addded event MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE and
+ *                      related structure and defines.
+ *                      Added event MPI_EVENT_ON_BUS_TIMER_EXPIRED.
+ *                      Added MPI_IOCINIT_FLAGS_DISCARD_FW_IMAGE.
+ *                      Replaced a reserved field in MSG_IOC_FACTS_REPLY with
+ *                      IOCExceptions and changed DataImageSize to reserved.
+ *                      Added MPI_FW_DOWNLOAD_ITYPE_NVSTORE_DATA and
+ *                      MPI_FW_UPLOAD_ITYPE_NVDATA.
+ *  09-28-01  01.02.03  Modified Event Data for Integrated RAID.
+ *  11-01-01  01.02.04  Added defines for MPI_EXT_IMAGE_HEADER ImageType field.
+ *  03-14-02  01.02.05  Added HeaderVersion field to MSG_IOC_FACTS_REPLY.
+ *  05-31-02  01.02.06  Added define for
+ *                      MPI_IOCFACTS_EXCEPT_RAID_CONFIG_INVALID.
+ *                      Added AliasIndex to EVENT_DATA_LOGOUT structure.
+ *  04-01-03  01.02.07  Added defines for MPI_FW_HEADER_SIGNATURE_.
+ *  06-26-03  01.02.08  Added new values to the product family defines.
+ *  04-29-04  01.02.09  Added IOCCapabilities field to MSG_IOC_FACTS_REPLY and
+ *                      added related defines.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Added four new fields to MSG_IOC_INIT.
+ *                      Added three new fields to MSG_IOC_FACTS_REPLY.
+ *                      Defined four new bits for the IOCCapabilities field of
+ *                      the IOCFacts reply.
+ *                      Added two new PortTypes for the PortFacts reply.
+ *                      Added six new events along with their EventData
+ *                      structures.
+ *                      Added a new MsgFlag to the FwDownload request to
+ *                      indicate last segment.
+ *                      Defined a new image type of boot loader.
+ *                      Added FW family codes for SAS product families.
+ *  10-05-04  01.05.02  Added ReplyFifoHostSignalingAddr field to
+ *                      MSG_IOC_FACTS_REPLY.
+ *  12-07-04  01.05.03  Added more defines for SAS Discovery Error event.
+ *  12-09-04  01.05.04  Added Unsupported device to SAS Device event.
+ *  01-15-05  01.05.05  Added event data for SAS SES Event.
+ *  02-09-05  01.05.06  Added MPI_FW_UPLOAD_ITYPE_FW_BACKUP define.
+ *  02-22-05  01.05.07  Added Host Page Buffer Persistent flag to IOC Facts
+ *                      Reply and IOC Init Request.
+ *  03-11-05  01.05.08  Added family code for 1068E family.
+ *                      Removed IOCFacts Reply EEDP Capability bit.
  *  --------------------------------------------------------------------------
 
 mpi_cnfg.h
@@ -142,6 +220,166 @@ mpi_cnfg.h
  *                      Added IO Unit Page 3.
  *                      Modified defines for Scsi Port Page 2.
  *                      Modified RAID Volume Pages.
+ *  08-08-01  01.02.01  Original release for v1.2 work.
+ *                      Added SepID and SepBus to RVP2 IMPhysicalDisk struct.
+ *                      Added defines for the SEP bits in RVP2 VolumeSettings.
+ *                      Modified the DeviceSettings field in RVP2 to use the
+ *                      proper structure.
+ *                      Added defines for SES, SAF-TE, and cross channel for
+ *                      IOCPage2 CapabilitiesFlags.
+ *                      Removed define for MPI_IOUNITPAGE2_FLAGS_RAID_DISABLE.
+ *                      Removed define for
+ *                      MPI_SCSIPORTPAGE2_PORT_FLAGS_PARITY_ENABLE.
+ *                      Added define for MPI_CONFIG_PAGEATTR_RO_PERSISTENT.
+ *  08-29-01 01.02.02   Fixed value for MPI_MANUFACTPAGE_DEVID_53C1035.
+ *                      Added defines for MPI_FCPORTPAGE1_FLAGS_HARD_ALPA_ONLY
+ *                      and MPI_FCPORTPAGE1_FLAGS_IMMEDIATE_ERROR_REPLY.
+ *                      Removed MPI_SCSIPORTPAGE0_CAP_PACING_TRANSFERS,
+ *                      MPI_SCSIDEVPAGE0_NP_PACING_TRANSFERS, and
+ *                      MPI_SCSIDEVPAGE1_RP_PACING_TRANSFERS, and
+ *                      MPI_SCSIDEVPAGE1_CONF_PPR_ALLOWED.
+ *                      Added defines for MPI_SCSIDEVPAGE1_CONF_WDTR_DISALLOWED
+ *                      and MPI_SCSIDEVPAGE1_CONF_SDTR_DISALLOWED.
+ *                      Added OnBusTimerValue to CONFIG_PAGE_SCSI_PORT_1.
+ *                      Added rejected bits to SCSI Device Page 0 Information.
+ *                      Increased size of ALPA array in FC Port Page 2 by one
+ *                      and removed a one byte reserved field.
+ *  09-28-01 01.02.03   Swapped NegWireSpeedLow and NegWireSpeedLow in
+ *                      CONFIG_PAGE_LAN_1 to match preferred 64-bit ordering.
+ *                      Added structures for Manufacturing Page 4, IO Unit
+ *                      Page 3, IOC Page 3, IOC Page 4, RAID Volume Page 0, and
+ *                      RAID PhysDisk Page 0.
+ *  10-04-01 01.02.04   Added define for MPI_CONFIG_PAGETYPE_RAID_PHYSDISK.
+ *                      Modified some of the new defines to make them 32
+ *                      character unique.
+ *                      Modified how variable length pages (arrays) are defined.
+ *                      Added generic defines for hot spare pools and RAID
+ *                      volume types.
+ *  11-01-01 01.02.05   Added define for MPI_IOUNITPAGE1_DISABLE_IR.
+ *  03-14-02 01.02.06   Added PCISlotNum field to CONFIG_PAGE_IOC_1 along with
+ *                      related define, and bumped the page version define.
+ *  05-31-02 01.02.07   Added a Flags field to CONFIG_PAGE_IOC_2_RAID_VOL in a
+ *                      reserved byte and added a define.
+ *                      Added define for
+ *                      MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE.
+ *                      Added new config page: CONFIG_PAGE_IOC_5.
+ *                      Added MaxAliases, MaxHardAliases, and NumCurrentAliases
+ *                      fields to CONFIG_PAGE_FC_PORT_0.
+ *                      Added AltConnector and NumRequestedAliases fields to
+ *                      CONFIG_PAGE_FC_PORT_1.
+ *                      Added new config page: CONFIG_PAGE_FC_PORT_10.
+ *  07-12-02 01.02.08   Added more MPI_MANUFACTPAGE_DEVID_ defines.
+ *                      Added additional MPI_SCSIDEVPAGE0_NP_ defines.
+ *                      Added more MPI_SCSIDEVPAGE1_RP_ defines.
+ *                      Added define for
+ *                      MPI_SCSIDEVPAGE1_CONF_EXTENDED_PARAMS_ENABLE.
+ *                      Added new config page: CONFIG_PAGE_SCSI_DEVICE_3.
+ *                      Modified MPI_FCPORTPAGE5_FLAGS_ defines.
+ *  09-16-02 01.02.09   Added MPI_SCSIDEVPAGE1_CONF_FORCE_PPR_MSG define.
+ *  11-15-02 01.02.10   Added ConnectedID defines for CONFIG_PAGE_SCSI_PORT_0.
+ *                      Added more Flags defines for CONFIG_PAGE_FC_PORT_1.
+ *                      Added more Flags defines for CONFIG_PAGE_FC_DEVICE_0.
+ *  04-01-03 01.02.11   Added RR_TOV field and additional Flags defines for
+ *                      CONFIG_PAGE_FC_PORT_1.
+ *                      Added define MPI_FCPORTPAGE5_FLAGS_DISABLE to disable
+ *                      an alias.
+ *                      Added more device id defines.
+ *  06-26-03 01.02.12   Added MPI_IOUNITPAGE1_IR_USE_STATIC_VOLUME_ID define.
+ *                      Added TargetConfig and IDConfig fields to
+ *                      CONFIG_PAGE_SCSI_PORT_1.
+ *                      Added more PortFlags defines for CONFIG_PAGE_SCSI_PORT_2
+ *                      to control DV.
+ *                      Added more Flags defines for CONFIG_PAGE_FC_PORT_1.
+ *                      In CONFIG_PAGE_FC_DEVICE_0, replaced Reserved1 field
+ *                      with ADISCHardALPA.
+ *                      Added MPI_FC_DEVICE_PAGE0_PROT_FCP_RETRY define.
+ *  01-16-04  01.02.13  Added InitiatorDeviceTimeout and InitiatorIoPendTimeout
+ *                      fields and related defines to CONFIG_PAGE_FC_PORT_1.
+ *                      Added define for
+ *                      MPI_FCPORTPAGE1_FLAGS_SOFT_ALPA_FALLBACK.
+ *                      Added new fields to the substructures of
+ *                      CONFIG_PAGE_FC_PORT_10.
+ *  04-29-04 01.02.14   Added define for IDP bit for CONFIG_PAGE_SCSI_PORT_0,
+ *                      CONFIG_PAGE_SCSI_DEVICE_0, and
+ *                      CONFIG_PAGE_SCSI_DEVICE_1. Also bumped Page Version for
+ *                      these pages.
+ *  05-11-04 01.03.01   Added structure for CONFIG_PAGE_INBAND_0.
+ *  08-19-04 01.05.01   Modified MSG_CONFIG request to support extended config
+ *                      pages.
+ *                      Added a new structure for extended config page header.
+ *                      Added new extended config pages types and structures for
+ *                      SAS IO Unit, SAS Expander, SAS Device, and SAS PHY.
+ *                      Replaced a reserved byte in CONFIG_PAGE_MANUFACTURING_4
+ *                      to add a Flags field.
+ *                      Two new Manufacturing config pages (5 and 6).
+ *                      Two new bits defined for IO Unit Page 1 Flags field.
+ *                      Modified CONFIG_PAGE_IO_UNIT_2 to add three new fields
+ *                      to specify the BIOS boot device.
+ *                      Four new Flags bits defined for IO Unit Page 2.
+ *                      Added IO Unit Page 4.
+ *                      Added EEDP Flags settings to IOC Page 1.
+ *                      Added new BIOS Page 1 config page.
+ *  10-05-04 01.05.02   Added define for
+ *                      MPI_IOCPAGE1_INITIATOR_CONTEXT_REPLY_DISABLE.
+ *                      Added new Flags field to CONFIG_PAGE_MANUFACTURING_5 and
+ *                      associated defines.
+ *                      Added more defines for SAS IO Unit Page 0
+ *                      DiscoveryStatus field.
+ *                      Added define for MPI_SAS_IOUNIT0_DS_SUBTRACTIVE_LINK
+ *                      and MPI_SAS_IOUNIT0_DS_TABLE_LINK.
+ *                      Added defines for Physical Mapping Modes to SAS IO Unit
+ *                      Page 2.
+ *                      Added define for
+ *                      MPI_SAS_DEVICE0_FLAGS_PORT_SELECTOR_ATTACH.
+ *  10-27-04 01.05.03   Added defines for new SAS PHY page addressing mode.
+ *                      Added defines for MaxTargetSpinUp to BIOS Page 1.
+ *                      Added 5 new ControlFlags defines for SAS IO Unit
+ *                      Page 1.
+ *                      Added MaxNumPhysicalMappedIDs field to SAS IO Unit
+ *                      Page 2.
+ *                      Added AccessStatus field to SAS Device Page 0 and added
+ *                      new Flags bits for supported SATA features.
+ *  12-07-04  01.05.04  Added config page structures for BIOS Page 2, RAID
+ *                      Volume Page 1, and RAID Physical Disk Page 1.
+ *                      Replaced IO Unit Page 1 BootTargetID,BootBus, and
+ *                      BootAdapterNum with reserved field.
+ *                      Added DataScrubRate and ResyncRate to RAID Volume
+ *                      Page 0.
+ *                      Added MPI_SAS_IOUNIT2_FLAGS_RESERVE_ID_0_FOR_BOOT
+ *                      define.
+ *  12-09-04  01.05.05  Added Target Mode Large CDB Enable to FC Port Page 1
+ *                      Flags field.
+ *                      Added Auto Port Config flag define for SAS IOUNIT
+ *                      Page 1 ControlFlags.
+ *                      Added Disabled bad Phy define to Expander Page 1
+ *                      Discovery Info field.
+ *                      Added SAS/SATA device support to SAS IOUnit Page 1
+ *                      ControlFlags.
+ *                      Added Unsupported device to SAS Dev Page 0 Flags field
+ *                      Added disable use SATA Hash Address for SAS IOUNIT
+ *                      page 1 in ControlFields.
+ *  01-15-05  01.05.06  Added defaults for data scrub rate and resync rate to
+ *                      Manufacturing Page 4.
+ *                      Added new defines for BIOS Page 1 IOCSettings field.
+ *                      Added ExtDiskIdentifier field to RAID Physical Disk
+ *                      Page 0.
+ *                      Added new defines for SAS IO Unit Page 1 ControlFlags
+ *                      and to SAS Device Page 0 Flags to control SATA devices.
+ *                      Added defines and structures for the new Log Page 0, a
+ *                      new type of configuration page.
+ *  02-09-05  01.05.07  Added InactiveStatus field to RAID Volume Page 0.
+ *                      Added WWID field to RAID Volume Page 1.
+ *                      Added PhysicalPort field to SAS Expander pages 0 and 1.
+ *  03-11-05  01.05.08  Removed the EEDP flags from IOC Page 1.
+ *                      Added Enclosure/Slot boot device format to BIOS Page 2.
+ *                      New status value for RAID Volume Page 0 VolumeStatus
+ *                      (VolumeState subfield).
+ *                      New value for RAID Physical Page 0 InactiveStatus.
+ *                      Added Inactive Volume Member flag RAID Physical Disk
+ *                      Page 0 PhysDiskStatus field.
+ *                      New physical mapping mode in SAS IO Unit Page 2.
+ *                      Added CONFIG_PAGE_SAS_ENCLOSURE_0.
+ *                      Added Slot and Enclosure fields to SAS Device Page 0.
  *  --------------------------------------------------------------------------
 
 mpi_init.h
@@ -154,6 +392,32 @@ mpi_init.h
  *  02-20-01  01.01.03  Started using MPI_POINTER.
  *  03-27-01  01.01.04  Added structure offset comments.
  *  04-10-01  01.01.05  Added new MsgFlag for MSG_SCSI_TASK_MGMT.
+ *  08-08-01  01.02.01  Original release for v1.2 work.
+ *  08-29-01  01.02.02  Added MPI_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET.
+ *                      Added MPI_SCSI_STATE_QUEUE_TAG_REJECTED for
+ *                      MSG_SCSI_IO_REPLY.
+ *  09-28-01  01.02.03  Added structures and defines for SCSI Enclosure
+ *                      Processor messages.
+ *  10-04-01  01.02.04  Added defines for SEP request Action field.
+ *  05-31-02  01.02.05  Added MPI_SCSIIO_MSGFLGS_CMD_DETERMINES_DATA_DIR define
+ *                      for SCSI IO requests.
+ *  11-15-02  01.02.06  Added special extended SCSI Status defines for FCP.
+ *  06-26-03  01.02.07  Added MPI_SCSI_STATUS_FCPEXT_UNASSIGNED define.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Added MsgFlags defines for EEDP to SCSI IO request.
+ *                      Added new word to MSG_SCSI_IO_REPLY to add TaskTag field
+ *                      and a reserved U16.
+ *                      Added new MSG_SCSI_IO32_REQUEST structure.
+ *                      Added a TaskType of Clear Task Set to SCSI
+ *                      Task Management request.
+ *  12-07-04  01.05.02  Added support for Task Management Query Task.
+ *  01-15-05  01.05.03  Modified SCSI Enclosure Processor Request to support
+ *                      WWID addressing.
+ *  03-11-05  01.05.04  Removed EEDP flags from SCSI IO Request.
+ *                      Removed SCSI IO 32 Request.
+ *                      Modified SCSI Enclosure Processor Request and Reply to
+ *                      support Enclosure/Slot addressing rather than WWID
+ *                      addressing.
  *  --------------------------------------------------------------------------
 
 mpi_targ.h
@@ -170,6 +434,33 @@ mpi_targ.h
  *                      Added structures for MPI_TARGET_SCSI_SPI_CMD_BUFFER and
  *                      MPI_TARGET_FCP_CMD_BUFFER.
  *  03-27-01  01.01.04  Added structure offset comments.
+ *  08-08-01  01.02.01  Original release for v1.2 work.
+ *  09-28-01  01.02.02  Added structure for MPI_TARGET_SCSI_SPI_STATUS_IU.
+ *                      Added PriorityReason field to some replies and
+ *                      defined more PriorityReason codes.
+ *                      Added some defines for to support previous version
+ *                      of MPI.
+ *  10-04-01  01.02.03  Added PriorityReason to MSG_TARGET_ERROR_REPLY.
+ *  11-01-01  01.02.04  Added define for TARGET_STATUS_SEND_FLAGS_HIGH_PRIORITY.
+ *  03-14-02  01.02.05  Modified MPI_TARGET_FCP_RSP_BUFFER to get the proper
+ *                      byte ordering.
+ *  05-31-02  01.02.06  Modified TARGET_MODE_REPLY_ALIAS_MASK to only include
+ *                      one bit.
+ *                      Added AliasIndex field to MPI_TARGET_FCP_CMD_BUFFER.
+ *  09-16-02  01.02.07  Added flags for confirmed completion.
+ *                      Added PRIORITY_REASON_TARGET_BUSY.
+ *  11-15-02  01.02.08  Added AliasID field to MPI_TARGET_SCSI_SPI_CMD_BUFFER.
+ *  04-01-03  01.02.09  Added OptionalOxid field to MPI_TARGET_FCP_CMD_BUFFER.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Added new request message structures for
+ *                      MSG_TARGET_CMD_BUF_POST_BASE_REQUEST,
+ *                      MSG_TARGET_CMD_BUF_POST_LIST_REQUEST, and
+ *                      MSG_TARGET_ASSIST_EXT_REQUEST.
+ *                      Added new structures for SAS SSP Command buffer, SSP
+ *                      Task buffer, and SSP Status IU.
+ *  10-05-04  01.05.02  MSG_TARGET_CMD_BUFFER_POST_BASE_LIST_REPLY added.
+ *  02-22-05  01.05.03  Changed a comment.
+ *  03-11-05  01.05.04  Removed TargetAssistExtended Request.
  *  --------------------------------------------------------------------------
 
 mpi_fc.h
@@ -192,6 +483,13 @@ mpi_fc.h
  *                      Added MPI_FC_PRIM_SEND_FLAGS_RESET_LINK define.
  *                      Added structure offset comments.
  *  04-09-01  01.01.07  Added RspLength field to MSG_LINK_SERVICE_RSP_REQUEST.
+ *  08-08-01  01.02.01  Original release for v1.2 work.
+ *  09-28-01  01.02.02  Change name of reserved field in
+ *                      MSG_LINK_SERVICE_RSP_REPLY.
+ *  05-31-02  01.02.03  Adding AliasIndex to FC Direct Access requests.
+ *  01-16-04  01.02.04  Added define for MPI_FC_PRIM_SEND_FLAGS_ML_RESET_LINK.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Original release for MPI v1.5.
  *  --------------------------------------------------------------------------
 
 mpi_lan.h
@@ -209,11 +507,56 @@ mpi_lan.h
  *  11-02-00  01.01.01  Original release for post 1.0 work
  *  02-20-01  01.01.02  Started using MPI_POINTER.
  *  03-27-01  01.01.03  Added structure offset comments.
+ *  08-08-01  01.02.01  Original release for v1.2 work.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Original release for MPI v1.5.
  *  --------------------------------------------------------------------------
 
 mpi_raid.h
  *  02-27-01  01.01.01  Original release for this file.
  *  03-27-01  01.01.02  Added structure offset comments.
+ *  08-08-01  01.02.01  Original release for v1.2 work.
+ *  08-29-01  01.02.02  Added DIAG_DATA_UPLOAD_HEADER and related defines.
+ *  09-28-01  01.02.02  Major rework for MPI v1.2 Integrated RAID changes.
+ *  10-04-01  01.02.03  Added ActionData defines for
+ *                      MPI_RAID_ACTION_DELETE_VOLUME action.
+ *  11-01-01  01.02.04  Added define for MPI_RAID_ACTION_ADATA_DO_NOT_SYNC.
+ *  03-14-02  01.02.05  Added define for MPI_RAID_ACTION_ADATA_LOW_LEVEL_INIT.
+ *  05-07-02  01.02.06  Added define for MPI_RAID_ACTION_ACTIVATE_VOLUME,
+ *                      MPI_RAID_ACTION_INACTIVATE_VOLUME, and
+ *                      MPI_RAID_ACTION_ADATA_INACTIVATE_ALL.
+ *  07-12-02  01.02.07  Added structures for Mailbox request and reply.
+ *  11-15-02  01.02.08  Added missing MsgContext field to MSG_MAILBOX_REQUEST.
+ *  04-01-03  01.02.09  New action data option flag for
+ *                      MPI_RAID_ACTION_DELETE_VOLUME.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Original release for MPI v1.5.
+ *  01-15-05  01.05.02  Added defines for the two new RAID Actions for
+ *                      _SET_RESYNC_RATE and _SET_DATA_SCRUB_RATE.
+ *  --------------------------------------------------------------------------
+
+mpi_tool.h
+ *  08-08-01  01.02.01  Original release.
+ *  08-29-01  01.02.02  Added DIAG_DATA_UPLOAD_HEADER and related defines.
+ *  01-16-04  01.02.03  Added defines and structures for new tools
+ *.                     MPI_TOOLBOX_ISTWI_READ_WRITE_TOOL and
+ *                      MPI_TOOLBOX_FC_MANAGEMENT_TOOL.
+ *  04-29-04  01.02.04  Added message structures for Diagnostic Buffer Post and
+ *                      Diagnostic Release requests and replies.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Original release for MPI v1.5.
+ *  10-06-04  01.05.02  Added define for MPI_DIAG_BUF_TYPE_COUNT.
+ *  02-09-05  01.05.03  Added frame size option to FC management tool.
+ *                      Added Beacon tool to the Toolbox.
+ *  --------------------------------------------------------------------------
+
+mpi_inb.h
+ *  05-11-04  01.03.01  Original release.
+ *  08-19-04  01.05.01  Original release for MPI v1.5.
+ *  --------------------------------------------------------------------------
+
+mpi_sas.h
+ *  08-19-04  01.05.01  Original release.
  *  --------------------------------------------------------------------------
 
 mpi_type.h
@@ -221,21 +564,83 @@ mpi_type.h
  *  06-06-00  01.00.01  Update version number for 1.0 release.
  *  11-02-00  01.01.01  Original release for post 1.0 work
  *  02-20-01  01.01.02  Added define and ifdef for MPI_POINTER.
+ *  08-08-01  01.02.01  Original release for v1.2 work.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Original release for MPI v1.5.
  *  --------------------------------------------------------------------------
 
 mpi_history.txt         Parts list history
 
-Filename    01.01.10
+Filename    01.05.09
 ----------  --------
-mpi.h       01.01.07
-mpi_ioc.h   01.01.07
-mpi_cnfg.h  01.01.11
-mpi_init.h  01.01.05
-mpi_targ.h  01.01.04
-mpi_fc.h    01.01.07
-mpi_lan.h   01.01.03
-mpi_raid.h  01.01.02
-mpi_type.h  01.01.02
+mpi.h       01.05.07
+mpi_ioc.h   01.05.08
+mpi_cnfg.h  01.05.08
+mpi_init.h  01.05.04
+mpi_targ.h  01.05.04
+mpi_fc.h    01.05.01
+mpi_lan.h   01.05.01
+mpi_raid.h  01.05.02
+mpi_tool.h  01.05.03
+mpi_inb.h   01.05.01
+mpi_sas.h   01.05.01
+mpi_type.h  01.05.01
+
+Filename    01.05.08   01.05.07   01.05.06   01.05.05   01.05.04   01.05.03
+----------  --------   --------   --------   --------   --------   --------
+mpi.h       01.05.06   01.05.05   01.05.04   01.05.03   01.05.02   01.05.01
+mpi_ioc.h   01.05.07   01.05.06   01.05.05   01.05.04   01.05.03   01.05.02
+mpi_cnfg.h  01.05.07   01.05.07   01.05.06   01.05.05   01.05.04   01.05.03
+mpi_init.h  01.05.03   01.05.03   01.05.03   01.05.02   01.05.02   01.05.01
+mpi_targ.h  01.05.03   01.05.02   01.05.02   01.05.02   01.05.02   01.05.02
+mpi_fc.h    01.05.01   01.05.01   01.05.01   01.05.01   01.05.01   01.05.01
+mpi_lan.h   01.05.01   01.05.01   01.05.01   01.05.01   01.05.01   01.05.01
+mpi_raid.h  01.05.02   01.05.02   01.05.02   01.05.01   01.05.01   01.05.01
+mpi_tool.h  01.05.03   01.05.03   01.05.02   01.05.02   01.05.02   01.05.02
+mpi_inb.h   01.05.01   01.05.01   01.05.01   01.05.01   01.05.01   01.05.01
+mpi_sas.h   01.05.01   01.05.01   01.05.01   01.05.01   01.05.01   01.05.01
+mpi_type.h  01.05.01   01.05.01   01.05.01   01.05.01   01.05.01   01.05.01
+
+Filename    01.05.02   01.05.01   01.03.01   01.02.14   01.02.13   01.02.12
+----------  --------   --------   --------   --------   --------   --------
+mpi.h       01.05.01   01.05.01   01.03.01   01.02.12   01.02.11   01.02.10
+mpi_ioc.h   01.05.02   01.05.01   01.03.01   01.02.09   01.02.08   01.02.08
+mpi_cnfg.h  01.05.02   01.05.01   01.03.01   01.02.14   01.02.13   01.02.12
+mpi_init.h  01.05.01   01.05.01   01.03.01   01.02.07   01.02.07   01.02.07
+mpi_targ.h  01.05.02   01.05.01   01.03.01   01.02.09   01.02.09   01.02.09
+mpi_fc.h    01.05.01   01.05.01   01.03.01   01.02.04   01.02.04   01.02.03
+mpi_lan.h   01.05.01   01.05.01   01.03.01   01.02.01   01.02.01   01.02.01
+mpi_raid.h  01.05.01   01.05.01   01.03.01   01.02.09   01.02.09   01.02.09
+mpi_tool.h  01.05.02   01.05.01   01.03.01   01.02.01   01.02.01   01.02.01
+mpi_inb.h   01.05.01   01.05.01   01.03.01
+mpi_sas.h   01.05.01   01.05.01
+mpi_type.h  01.05.01   01.05.01   01.03.01   01.02.04   01.02.03   01.02.02
+
+Filename    01.02.11   01.02.10   01.02.09   01.02.08   01.02.07   01.02.06
+----------  --------   --------   --------   --------   --------   --------
+mpi.h       01.02.09   01.02.08   01.02.07   01.02.06   01.02.05   01.02.04
+mpi_ioc.h   01.02.07   01.02.06   01.02.06   01.02.06   01.02.06   01.02.05
+mpi_cnfg.h  01.02.11   01.02.10   01.02.09   01.02.08   01.02.07   01.02.06
+mpi_init.h  01.02.06   01.02.06   01.02.05   01.02.05   01.02.05   01.02.04
+mpi_targ.h  01.02.09   01.02.08   01.02.07   01.02.06   01.02.06   01.02.05
+mpi_fc.h    01.02.03   01.02.03   01.02.03   01.02.03   01.02.03   01.02.02
+mpi_lan.h   01.02.01   01.02.01   01.02.01   01.02.01   01.02.01   01.02.01
+mpi_raid.h  01.02.09   01.02.08   01.02.07   01.02.07   01.02.06   01.02.05
+mpi_tool.h  01.02.01   01.02.01   01.02.01   01.02.01   01.02.01   01.02.01
+mpi_type.h  01.02.02   01.02.02   01.02.02   01.02.02   01.02.02   01.02.02
+
+Filename    01.02.05   01.02.04   01.02.03   01.02.02   01.02.01   01.01.10
+----------  --------   --------   --------   --------   --------   --------
+mpi.h       01.02.03   01.02.02   01.02.02   01.02.01   01.02.01   01.01.07
+mpi_ioc.h   01.02.04   01.02.03   01.02.03   01.02.02   01.02.01   01.01.07
+mpi_cnfg.h  01.02.05   01.02.04   01.02.03   01.02.02   01.02.01   01.01.11
+mpi_init.h  01.02.04   01.02.04   01.02.03   01.02.02   01.02.01   01.01.05
+mpi_targ.h  01.02.04   01.02.03   01.02.02   01.02.01   01.02.01   01.01.04
+mpi_fc.h    01.02.02   01.02.02   01.02.02   01.02.01   01.02.01   01.01.07
+mpi_lan.h   01.02.01   01.02.01   01.02.01   01.02.01   01.02.01   01.01.03
+mpi_raid.h  01.02.04   01.02.03   01.02.02   01.02.01   01.02.01   01.01.02
+mpi_tool.h  01.02.02   01.02.02   01.02.02   01.02.02   01.02.01
+mpi_type.h  01.02.02   01.02.02   01.02.02   01.02.02   01.02.01   01.01.02
 
 Filename    01.01.09   01.01.08   01.01.07   01.01.06   01.01.05   01.01.04
 ----------  --------   --------   --------   --------   --------   --------
index dae29fbed56ffc283bd0af4d20fca496ef34ee11..ff167309ba2700cbbae8f95c487170f271a78b8f 100644 (file)
@@ -1,19 +1,20 @@
 /*
- *  Copyright (c) 2003 LSI Logic Corporation.
+ *  Copyright (c) 2003-2004 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_inb.h
  *          Title:  MPI Inband structures and definitions
  *  Creation Date:  September 30, 2003
  *
- *    mpi_inb.h Version:  01.03.xx
+ *    mpi_inb.h Version:  01.05.01
  *
  *  Version History
  *  ---------------
  *
  *  Date      Version   Description
  *  --------  --------  ------------------------------------------------------
- *  ??-??-??  01.03.01  Original release.
+ *  05-11-04  01.03.01  Original release.
+ *  08-19-04  01.05.01  Original release for MPI v1.5.
  *  --------------------------------------------------------------------------
  */
 
index b3c95fd7256fb037f2b67fe39bf2257b6e655ec9..aca035801a86ca77a076f0b4c1e338f6aa5c8beb 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2000-2003 LSI Logic Corporation.
+ *  Copyright (c) 2000-2005 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_init.h
  *          Title:  MPI initiator mode messages and structures
  *  Creation Date:  June 8, 2000
  *
- *    mpi_init.h Version:  01.05.xx
+ *    mpi_init.h Version:  01.05.04
  *
  *  Version History
  *  ---------------
  *                      for SCSI IO requests.
  *  11-15-02  01.02.06  Added special extended SCSI Status defines for FCP.
  *  06-26-03  01.02.07  Added MPI_SCSI_STATUS_FCPEXT_UNASSIGNED define.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Added MsgFlags defines for EEDP to SCSI IO request.
+ *                      Added new word to MSG_SCSI_IO_REPLY to add TaskTag field
+ *                      and a reserved U16.
+ *                      Added new MSG_SCSI_IO32_REQUEST structure.
+ *                      Added a TaskType of Clear Task Set to SCSI
+ *                      Task Management request.
+ *  12-07-04  01.05.02  Added support for Task Management Query Task.
+ *  01-15-05  01.05.03  Modified SCSI Enclosure Processor Request to support
+ *                      WWID addressing.
+ *  03-11-05  01.05.04  Removed EEDP flags from SCSI IO Request.
+ *                      Removed SCSI IO 32 Request.
+ *                      Modified SCSI Enclosure Processor Request and Reply to
+ *                      support Enclosure/Slot addressing rather than WWID
+ *                      addressing.
  *  --------------------------------------------------------------------------
  */
 
@@ -76,20 +91,12 @@ typedef struct _MSG_SCSI_IO_REQUEST
 #define MPI_SCSIIO_MSGFLGS_SENSE_WIDTH              (0x01)
 #define MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_32           (0x00)
 #define MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_64           (0x01)
+
 #define MPI_SCSIIO_MSGFLGS_SENSE_LOCATION           (0x02)
 #define MPI_SCSIIO_MSGFLGS_SENSE_LOC_HOST           (0x00)
 #define MPI_SCSIIO_MSGFLGS_SENSE_LOC_IOC            (0x02)
-#define MPI_SCSIIO_MSGFLGS_CMD_DETERMINES_DATA_DIR  (0x04)
-#define MPI_SCSIIO_MSGFLGS_EEDP_TYPE_MASK           (0xE0)
-#define MPI_SCSIIO_MSGFLGS_EEDP_NONE                (0x00)
-#define MPI_SCSIIO_MSGFLGS_EEDP_RDPROTECT_T10       (0x20)
-#define MPI_SCSIIO_MSGFLGS_EEDP_VRPROTECT_T10       (0x40)
-#define MPI_SCSIIO_MSGFLGS_EEDP_WRPROTECT_T10       (0x60)
-#define MPI_SCSIIO_MSGFLGS_EEDP_520_READ_MODE1      (0x20)
-#define MPI_SCSIIO_MSGFLGS_EEDP_520_WRITE_MODE1     (0x40)
-#define MPI_SCSIIO_MSGFLGS_EEDP_8_9_READ_MODE1      (0x60)
-#define MPI_SCSIIO_MSGFLGS_EEDP_8_9_WRITE_MODE1     (0x80)
 
+#define MPI_SCSIIO_MSGFLGS_CMD_DETERMINES_DATA_DIR  (0x04)
 
 /* SCSI IO LUN fields */
 
@@ -148,6 +155,8 @@ typedef struct _MSG_SCSI_IO_REPLY
     U32                     TransferCount;      /* 14h */
     U32                     SenseCount;         /* 18h */
     U32                     ResponseInfo;       /* 1Ch */
+    U16                     TaskTag;            /* 20h */
+    U16                     Reserved1;          /* 22h */
 } MSG_SCSI_IO_REPLY, MPI_POINTER PTR_MSG_SCSI_IO_REPLY,
   SCSIIOReply_t, MPI_POINTER pSCSIIOReply_t;
 
@@ -190,32 +199,7 @@ typedef struct _MSG_SCSI_IO_REPLY
 #define MPI_SCSI_RSP_INFO_TASK_MGMT_FAILED      (0x05000000)
 #define MPI_SCSI_RSP_INFO_SPI_LQ_INVALID_TYPE   (0x06000000)
 
-
-/****************************************************************************/
-/*  SCSI IO 32 Request message structure                                    */
-/****************************************************************************/
-
-typedef struct _MSG_SCSI_IO32_REQUEST
-{
-    U8                      TargetID;           /* 00h */
-    U8                      Bus;                /* 01h */
-    U8                      ChainOffset;        /* 02h */
-    U8                      Function;           /* 03h */
-    U8                      CDBLength;          /* 04h */
-    U8                      SenseBufferLength;  /* 05h */
-    U8                      Reserved;           /* 06h */
-    U8                      MsgFlags;           /* 07h */
-    U32                     MsgContext;         /* 08h */
-    U8                      LUN[8];             /* 0Ch */
-    U32                     Control;            /* 14h */
-    U8                      CDB[32];            /* 18h */
-    U32                     DataLength;         /* 38h */
-    U32                     SenseBufferLowAddr; /* 3Ch */
-    SGE_IO_UNION            SGL;                /* 40h */
-} MSG_SCSI_IO32_REQUEST, MPI_POINTER PTR_MSG_SCSI_IO32_REQUEST,
-  SCSIIO32Request_t, MPI_POINTER pSCSIIO32Request_t;
-
-/* SCSI IO 32 uses the same defines as above for SCSI IO */
+#define MPI_SCSI_TASKTAG_UNKNOWN                (0xFFFF)
 
 
 /****************************************************************************/
@@ -247,6 +231,7 @@ typedef struct _MSG_SCSI_TASK_MGMT
 #define MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS             (0x04)
 #define MPI_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET    (0x05)
 #define MPI_SCSITASKMGMT_TASKTYPE_CLEAR_TASK_SET        (0x06)
+#define MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK            (0x07)
 
 /* MsgFlags bits */
 #define MPI_SCSITASKMGMT_MSGFLAGS_TARGET_RESET_OPTION   (0x00)
@@ -260,7 +245,7 @@ typedef struct _MSG_SCSI_TASK_MGMT_REPLY
     U8                      Bus;                /* 01h */
     U8                      MsgLength;          /* 02h */
     U8                      Function;           /* 03h */
-    U8                      Reserved;           /* 04h */
+    U8                      ResponseCode;       /* 04h */
     U8                      TaskType;           /* 05h */
     U8                      Reserved1;          /* 06h */
     U8                      MsgFlags;           /* 07h */
@@ -272,6 +257,15 @@ typedef struct _MSG_SCSI_TASK_MGMT_REPLY
 } MSG_SCSI_TASK_MGMT_REPLY, MPI_POINTER PTR_MSG_SCSI_TASK_MGMT_REPLY,
   SCSITaskMgmtReply_t, MPI_POINTER pSCSITaskMgmtReply_t;
 
+/* ResponseCode values */
+#define MPI_SCSITASKMGMT_RSP_TM_COMPLETE                (0x00)
+#define MPI_SCSITASKMGMT_RSP_INVALID_FRAME              (0x02)
+#define MPI_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED           (0x04)
+#define MPI_SCSITASKMGMT_RSP_TM_FAILED                  (0x05)
+#define MPI_SCSITASKMGMT_RSP_TM_SUCCEEDED               (0x08)
+#define MPI_SCSITASKMGMT_RSP_TM_INVALID_LUN             (0x09)
+#define MPI_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC           (0x80)
+
 
 /****************************************************************************/
 /*  SCSI Enclosure Processor messages                                       */
@@ -284,11 +278,16 @@ typedef struct _MSG_SEP_REQUEST
     U8                      ChainOffset;        /* 02h */
     U8                      Function;           /* 03h */
     U8                      Action;             /* 04h */
-    U8                      Reserved1;          /* 05h */
-    U8                      Reserved2;          /* 06h */
+    U8                      Flags;              /* 05h */
+    U8                      Reserved1;          /* 06h */
     U8                      MsgFlags;           /* 07h */
     U32                     MsgContext;         /* 08h */
     U32                     SlotStatus;         /* 0Ch */
+    U32                     Reserved2;          /* 10h */
+    U32                     Reserved3;          /* 14h */
+    U32                     Reserved4;          /* 18h */
+    U16                     Slot;               /* 1Ch */
+    U16                     EnclosureHandle;    /* 1Eh */
 } MSG_SEP_REQUEST, MPI_POINTER PTR_MSG_SEP_REQUEST,
   SEPRequest_t, MPI_POINTER pSEPRequest_t;
 
@@ -296,6 +295,10 @@ typedef struct _MSG_SEP_REQUEST
 #define MPI_SEP_REQ_ACTION_WRITE_STATUS                 (0x00)
 #define MPI_SEP_REQ_ACTION_READ_STATUS                  (0x01)
 
+/* Flags defines */
+#define MPI_SEP_REQ_FLAGS_ENCLOSURE_SLOT_ADDRESS        (0x01)
+#define MPI_SEP_REQ_FLAGS_BUS_TARGETID_ADDRESS          (0x00)
+
 /* SlotStatus bits for MSG_SEP_REQUEST */
 #define MPI_SEP_REQ_SLOTSTATUS_NO_ERROR                 (0x00000001)
 #define MPI_SEP_REQ_SLOTSTATUS_DEV_FAULTY               (0x00000002)
@@ -332,6 +335,9 @@ typedef struct _MSG_SEP_REPLY
     U16                     IOCStatus;          /* 0Eh */
     U32                     IOCLogInfo;         /* 10h */
     U32                     SlotStatus;         /* 14h */
+    U32                     Reserved4;          /* 18h */
+    U16                     Slot;               /* 1Ch */
+    U16                     EnclosureHandle;    /* 1Eh */
 } MSG_SEP_REPLY, MPI_POINTER PTR_MSG_SEP_REPLY,
   SEPReply_t, MPI_POINTER pSEPReply_t;
 
index 82445d18b4d533e6432353122103f5886d3381d7..f91eb4efe8cc043f6bcec48bad7f8b78bd05b369 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2000-2003 LSI Logic Corporation.
+ *  Copyright (c) 2000-2005 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_ioc.h
  *          Title:  MPI IOC, Port, Event, FW Download, and FW Upload messages
  *  Creation Date:  August 11, 2000
  *
- *    mpi_ioc.h Version:  01.05.xx
+ *    mpi_ioc.h Version:  01.05.08
  *
  *  Version History
  *  ---------------
  *                      Added AliasIndex to EVENT_DATA_LOGOUT structure.
  *  04-01-03  01.02.07  Added defines for MPI_FW_HEADER_SIGNATURE_.
  *  06-26-03  01.02.08  Added new values to the product family defines.
+ *  04-29-04  01.02.09  Added IOCCapabilities field to MSG_IOC_FACTS_REPLY and
+ *                      added related defines.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Added four new fields to MSG_IOC_INIT.
+ *                      Added three new fields to MSG_IOC_FACTS_REPLY.
+ *                      Defined four new bits for the IOCCapabilities field of
+ *                      the IOCFacts reply.
+ *                      Added two new PortTypes for the PortFacts reply.
+ *                      Added six new events along with their EventData
+ *                      structures.
+ *                      Added a new MsgFlag to the FwDownload request to
+ *                      indicate last segment.
+ *                      Defined a new image type of boot loader.
+ *                      Added FW family codes for SAS product families.
+ *  10-05-04  01.05.02  Added ReplyFifoHostSignalingAddr field to
+ *                      MSG_IOC_FACTS_REPLY.
+ *  12-07-04  01.05.03  Added more defines for SAS Discovery Error event.
+ *  12-09-04  01.05.04  Added Unsupported device to SAS Device event.
+ *  01-15-05  01.05.05  Added event data for SAS SES Event.
+ *  02-09-05  01.05.06  Added MPI_FW_UPLOAD_ITYPE_FW_BACKUP define.
+ *  02-22-05  01.05.07  Added Host Page Buffer Persistent flag to IOC Facts
+ *                      Reply and IOC Init Request.
+ *  03-11-05  01.05.08  Added family code for 1068E family.
+ *                      Removed IOCFacts Reply EEDP Capability bit.
  *  --------------------------------------------------------------------------
  */
 
@@ -90,20 +114,37 @@ typedef struct _MSG_IOC_INIT
     U32                     HostMfaHighAddr;            /* 10h */
     U32                     SenseBufferHighAddr;        /* 14h */
     U32                     ReplyFifoHostSignalingAddr; /* 18h */
+    SGE_SIMPLE_UNION        HostPageBufferSGE;          /* 1Ch */
+    U16                     MsgVersion;                 /* 28h */
+    U16                     HeaderVersion;              /* 2Ah */
 } MSG_IOC_INIT, MPI_POINTER PTR_MSG_IOC_INIT,
   IOCInit_t, MPI_POINTER pIOCInit_t;
 
 /* WhoInit values */
-#define MPI_WHOINIT_NO_ONE                          (0x00)
-#define MPI_WHOINIT_SYSTEM_BIOS                     (0x01)
-#define MPI_WHOINIT_ROM_BIOS                        (0x02)
-#define MPI_WHOINIT_PCI_PEER                        (0x03)
-#define MPI_WHOINIT_HOST_DRIVER                     (0x04)
-#define MPI_WHOINIT_MANUFACTURER                    (0x05)
+#define MPI_WHOINIT_NO_ONE                              (0x00)
+#define MPI_WHOINIT_SYSTEM_BIOS                         (0x01)
+#define MPI_WHOINIT_ROM_BIOS                            (0x02)
+#define MPI_WHOINIT_PCI_PEER                            (0x03)
+#define MPI_WHOINIT_HOST_DRIVER                         (0x04)
+#define MPI_WHOINIT_MANUFACTURER                        (0x05)
 
 /* Flags values */
-#define MPI_IOCINIT_FLAGS_DISCARD_FW_IMAGE          (0x01)
-#define MPI_IOCINIT_FLAGS_REPLY_FIFO_HOST_SIGNAL    (0x02)
+#define MPI_IOCINIT_FLAGS_HOST_PAGE_BUFFER_PERSISTENT   (0x04)
+#define MPI_IOCINIT_FLAGS_REPLY_FIFO_HOST_SIGNAL        (0x02)
+#define MPI_IOCINIT_FLAGS_DISCARD_FW_IMAGE              (0x01)
+
+/* MsgVersion */
+#define MPI_IOCINIT_MSGVERSION_MAJOR_MASK               (0xFF00)
+#define MPI_IOCINIT_MSGVERSION_MAJOR_SHIFT              (8)
+#define MPI_IOCINIT_MSGVERSION_MINOR_MASK               (0x00FF)
+#define MPI_IOCINIT_MSGVERSION_MINOR_SHIFT              (0)
+
+/* HeaderVersion */
+#define MPI_IOCINIT_HEADERVERSION_UNIT_MASK             (0xFF00)
+#define MPI_IOCINIT_HEADERVERSION_UNIT_SHIFT            (8)
+#define MPI_IOCINIT_HEADERVERSION_DEV_MASK              (0x00FF)
+#define MPI_IOCINIT_HEADERVERSION_DEV_SHIFT             (0)
+
 
 typedef struct _MSG_IOC_INIT_REPLY
 {
@@ -187,32 +228,39 @@ typedef struct _MSG_IOC_FACTS_REPLY
     MPI_FW_VERSION          FWVersion;                  /* 38h */
     U16                     HighPriorityQueueDepth;     /* 3Ch */
     U16                     Reserved2;                  /* 3Eh */
+    SGE_SIMPLE_UNION        HostPageBufferSGE;          /* 40h */
+    U32                     ReplyFifoHostSignalingAddr; /* 4Ch */
 } MSG_IOC_FACTS_REPLY, MPI_POINTER PTR_MSG_IOC_FACTS_REPLY,
   IOCFactsReply_t, MPI_POINTER pIOCFactsReply_t;
 
-#define MPI_IOCFACTS_MSGVERSION_MAJOR_MASK          (0xFF00)
-#define MPI_IOCFACTS_MSGVERSION_MINOR_MASK          (0x00FF)
+#define MPI_IOCFACTS_MSGVERSION_MAJOR_MASK              (0xFF00)
+#define MPI_IOCFACTS_MSGVERSION_MAJOR_SHIFT             (8)
+#define MPI_IOCFACTS_MSGVERSION_MINOR_MASK              (0x00FF)
+#define MPI_IOCFACTS_MSGVERSION_MINOR_SHIFT             (0)
 
-#define MPI_IOCFACTS_HEADERVERSION_UNIT_MASK        (0xFF00)
-#define MPI_IOCFACTS_HEADERVERSION_DEV_MASK         (0x00FF)
+#define MPI_IOCFACTS_HDRVERSION_UNIT_MASK               (0xFF00)
+#define MPI_IOCFACTS_HDRVERSION_UNIT_SHIFT              (8)
+#define MPI_IOCFACTS_HDRVERSION_DEV_MASK                (0x00FF)
+#define MPI_IOCFACTS_HDRVERSION_DEV_SHIFT               (0)
 
-#define MPI_IOCFACTS_EXCEPT_CONFIG_CHECKSUM_FAIL    (0x0001)
-#define MPI_IOCFACTS_EXCEPT_RAID_CONFIG_INVALID     (0x0002)
-#define MPI_IOCFACTS_EXCEPT_FW_CHECKSUM_FAIL        (0x0004)
-#define MPI_IOCFACTS_EXCEPT_PERSISTENT_TABLE_FULL   (0x0008)
+#define MPI_IOCFACTS_EXCEPT_CONFIG_CHECKSUM_FAIL        (0x0001)
+#define MPI_IOCFACTS_EXCEPT_RAID_CONFIG_INVALID         (0x0002)
+#define MPI_IOCFACTS_EXCEPT_FW_CHECKSUM_FAIL            (0x0004)
+#define MPI_IOCFACTS_EXCEPT_PERSISTENT_TABLE_FULL       (0x0008)
 
-#define MPI_IOCFACTS_FLAGS_FW_DOWNLOAD_BOOT         (0x01)
+#define MPI_IOCFACTS_FLAGS_FW_DOWNLOAD_BOOT             (0x01)
+#define MPI_IOCFACTS_FLAGS_REPLY_FIFO_HOST_SIGNAL       (0x02)
+#define MPI_IOCFACTS_FLAGS_HOST_PAGE_BUFFER_PERSISTENT  (0x04)
 
-#define MPI_IOCFACTS_EVENTSTATE_DISABLED            (0x00)
-#define MPI_IOCFACTS_EVENTSTATE_ENABLED             (0x01)
+#define MPI_IOCFACTS_EVENTSTATE_DISABLED                (0x00)
+#define MPI_IOCFACTS_EVENTSTATE_ENABLED                 (0x01)
 
-#define MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q          (0x00000001)
-#define MPI_IOCFACTS_CAPABILITY_REPLY_HOST_SIGNAL   (0x00000002)
-#define MPI_IOCFACTS_CAPABILITY_QUEUE_FULL_HANDLING (0x00000004)
-#define MPI_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER   (0x00000008)
-#define MPI_IOCFACTS_CAPABILITY_SNAPSHOT_BUFFER     (0x00000010)
-#define MPI_IOCFACTS_CAPABILITY_EXTENDED_BUFFER     (0x00000020)
-#define MPI_IOCFACTS_CAPABILITY_EEDP                (0x00000040)
+#define MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q              (0x00000001)
+#define MPI_IOCFACTS_CAPABILITY_REPLY_HOST_SIGNAL       (0x00000002)
+#define MPI_IOCFACTS_CAPABILITY_QUEUE_FULL_HANDLING     (0x00000004)
+#define MPI_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER       (0x00000008)
+#define MPI_IOCFACTS_CAPABILITY_SNAPSHOT_BUFFER         (0x00000010)
+#define MPI_IOCFACTS_CAPABILITY_EXTENDED_BUFFER         (0x00000020)
 
 
 
@@ -408,6 +456,8 @@ typedef struct _MSG_EVENT_ACK_REPLY
 #define MPI_EVENT_SAS_DEVICE_STATUS_CHANGE  (0x0000000F)
 #define MPI_EVENT_SAS_SES                   (0x00000010)
 #define MPI_EVENT_PERSISTENT_TABLE_FULL     (0x00000011)
+#define MPI_EVENT_SAS_PHY_LINK_STATUS       (0x00000012)
+#define MPI_EVENT_SAS_DISCOVERY_ERROR       (0x00000013)
 
 /* AckRequired field values */
 
@@ -467,6 +517,10 @@ typedef struct _EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
     U8                      ASCQ;                       /* 05h */
     U16                     DevHandle;                  /* 06h */
     U32                     DeviceInfo;                 /* 08h */
+    U16                     ParentDevHandle;            /* 0Ch */
+    U8                      PhyNum;                     /* 0Eh */
+    U8                      Reserved1;                  /* 0Fh */
+    U64                     SASAddress;                 /* 10h */
 } EVENT_DATA_SAS_DEVICE_STATUS_CHANGE,
   MPI_POINTER PTR_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE,
   MpiEventDataSasDeviceStatusChange_t,
@@ -477,6 +531,8 @@ typedef struct _EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
 #define MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING        (0x04)
 #define MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA            (0x05)
 #define MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED      (0x06)
+#define MPI_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED           (0x07)
+
 
 /* SCSI Event data for Queue Full event */
 
@@ -488,6 +544,35 @@ typedef struct _EVENT_DATA_QUEUE_FULL
 } EVENT_DATA_QUEUE_FULL, MPI_POINTER PTR_EVENT_DATA_QUEUE_FULL,
   EventDataQueueFull_t, MPI_POINTER pEventDataQueueFull_t;
 
+/* MPI Integrated RAID Event data */
+
+typedef struct _EVENT_DATA_RAID
+{
+    U8                      VolumeID;                   /* 00h */
+    U8                      VolumeBus;                  /* 01h */
+    U8                      ReasonCode;                 /* 02h */
+    U8                      PhysDiskNum;                /* 03h */
+    U8                      ASC;                        /* 04h */
+    U8                      ASCQ;                       /* 05h */
+    U16                     Reserved;                   /* 06h */
+    U32                     SettingsStatus;             /* 08h */
+} EVENT_DATA_RAID, MPI_POINTER PTR_EVENT_DATA_RAID,
+  MpiEventDataRaid_t, MPI_POINTER pMpiEventDataRaid_t;
+
+/* MPI Integrated RAID Event data ReasonCode values */
+#define MPI_EVENT_RAID_RC_VOLUME_CREATED                (0x00)
+#define MPI_EVENT_RAID_RC_VOLUME_DELETED                (0x01)
+#define MPI_EVENT_RAID_RC_VOLUME_SETTINGS_CHANGED       (0x02)
+#define MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED         (0x03)
+#define MPI_EVENT_RAID_RC_VOLUME_PHYSDISK_CHANGED       (0x04)
+#define MPI_EVENT_RAID_RC_PHYSDISK_CREATED              (0x05)
+#define MPI_EVENT_RAID_RC_PHYSDISK_DELETED              (0x06)
+#define MPI_EVENT_RAID_RC_PHYSDISK_SETTINGS_CHANGED     (0x07)
+#define MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED       (0x08)
+#define MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED             (0x09)
+#define MPI_EVENT_RAID_RC_SMART_DATA                    (0x0A)
+#define MPI_EVENT_RAID_RC_REPLACE_ACTION_STARTED        (0x0B)
+
 /* MPI Link Status Change Event data */
 
 typedef struct _EVENT_DATA_LINK_STATUS
@@ -535,35 +620,63 @@ typedef struct _EVENT_DATA_LOGOUT
 
 #define MPI_EVENT_LOGOUT_ALL_ALIASES        (0xFF)
 
+/* SAS SES Event data */
 
-/* MPI Integrated RAID Event data */
-
-typedef struct _EVENT_DATA_RAID
+typedef struct _EVENT_DATA_SAS_SES
 {
-    U8                      VolumeID;                   /* 00h */
-    U8                      VolumeBus;                  /* 01h */
-    U8                      ReasonCode;                 /* 02h */
-    U8                      PhysDiskNum;                /* 03h */
-    U8                      ASC;                        /* 04h */
-    U8                      ASCQ;                       /* 05h */
-    U16                     Reserved;                   /* 06h */
-    U32                     SettingsStatus;             /* 08h */
-} EVENT_DATA_RAID, MPI_POINTER PTR_EVENT_DATA_RAID,
-  MpiEventDataRaid_t, MPI_POINTER pMpiEventDataRaid_t;
+    U8                      PhyNum;                     /* 00h */
+    U8                      Port;                       /* 01h */
+    U8                      PortWidth;                  /* 02h */
+    U8                      Reserved1;                  /* 04h */
+} EVENT_DATA_SAS_SES, MPI_POINTER PTR_EVENT_DATA_SAS_SES,
+  MpiEventDataSasSes_t, MPI_POINTER pMpiEventDataSasSes_t;
 
-/* MPI Integrated RAID Event data ReasonCode values */
-#define MPI_EVENT_RAID_RC_VOLUME_CREATED                (0x00)
-#define MPI_EVENT_RAID_RC_VOLUME_DELETED                (0x01)
-#define MPI_EVENT_RAID_RC_VOLUME_SETTINGS_CHANGED       (0x02)
-#define MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED         (0x03)
-#define MPI_EVENT_RAID_RC_VOLUME_PHYSDISK_CHANGED       (0x04)
-#define MPI_EVENT_RAID_RC_PHYSDISK_CREATED              (0x05)
-#define MPI_EVENT_RAID_RC_PHYSDISK_DELETED              (0x06)
-#define MPI_EVENT_RAID_RC_PHYSDISK_SETTINGS_CHANGED     (0x07)
-#define MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED       (0x08)
-#define MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED             (0x09)
-#define MPI_EVENT_RAID_RC_SMART_DATA                    (0x0A)
-#define MPI_EVENT_RAID_RC_REPLACE_ACTION_STARTED        (0x0B)
+/* SAS Phy Link Status Event data */
+
+typedef struct _EVENT_DATA_SAS_PHY_LINK_STATUS
+{
+    U8                      PhyNum;                     /* 00h */
+    U8                      LinkRates;                  /* 01h */
+    U16                     DevHandle;                  /* 02h */
+    U64                     SASAddress;                 /* 04h */
+} EVENT_DATA_SAS_PHY_LINK_STATUS, MPI_POINTER PTR_EVENT_DATA_SAS_PHY_LINK_STATUS,
+  MpiEventDataSasPhyLinkStatus_t, MPI_POINTER pMpiEventDataSasPhyLinkStatus_t;
+
+/* defines for the LinkRates field of the SAS PHY Link Status event */
+#define MPI_EVENT_SAS_PLS_LR_CURRENT_MASK                   (0xF0)
+#define MPI_EVENT_SAS_PLS_LR_CURRENT_SHIFT                  (4)
+#define MPI_EVENT_SAS_PLS_LR_PREVIOUS_MASK                  (0x0F)
+#define MPI_EVENT_SAS_PLS_LR_PREVIOUS_SHIFT                 (0)
+#define MPI_EVENT_SAS_PLS_LR_RATE_UNKNOWN                   (0x00)
+#define MPI_EVENT_SAS_PLS_LR_RATE_PHY_DISABLED              (0x01)
+#define MPI_EVENT_SAS_PLS_LR_RATE_FAILED_SPEED_NEGOTIATION  (0x02)
+#define MPI_EVENT_SAS_PLS_LR_RATE_SATA_OOB_COMPLETE         (0x03)
+#define MPI_EVENT_SAS_PLS_LR_RATE_1_5                       (0x08)
+#define MPI_EVENT_SAS_PLS_LR_RATE_3_0                       (0x09)
+
+/* SAS Discovery Errror Event data */
+
+typedef struct _EVENT_DATA_DISCOVERY_ERROR
+{
+    U32                     DiscoveryStatus;            /* 00h */
+    U8                      Port;                       /* 04h */
+    U8                      Reserved1;                  /* 05h */
+    U16                     Reserved2;                  /* 06h */
+} EVENT_DATA_DISCOVERY_ERROR, MPI_POINTER PTR_EVENT_DATA_DISCOVERY_ERROR,
+  EventDataDiscoveryError_t, MPI_POINTER pEventDataDiscoveryError_t;
+
+#define MPI_EVENT_DSCVRY_ERR_DS_LOOP_DETECTED               (0x00000001)
+#define MPI_EVENT_DSCVRY_ERR_DS_UNADDRESSABLE_DEVICE        (0x00000002)
+#define MPI_EVENT_DSCVRY_ERR_DS_MULTIPLE_PORTS              (0x00000004)
+#define MPI_EVENT_DSCVRY_ERR_DS_EXPANDER_ERR                (0x00000008)
+#define MPI_EVENT_DSCVRY_ERR_DS_SMP_TIMEOUT                 (0x00000010)
+#define MPI_EVENT_DSCVRY_ERR_DS_OUT_ROUTE_ENTRIES           (0x00000020)
+#define MPI_EVENT_DSCVRY_ERR_DS_INDEX_NOT_EXIST             (0x00000040)
+#define MPI_EVENT_DSCVRY_ERR_DS_SMP_FUNCTION_FAILED         (0x00000080)
+#define MPI_EVENT_DSCVRY_ERR_DS_SMP_CRC_ERROR               (0x00000100)
+#define MPI_EVENT_DSCVRY_ERR_DS_MULTPL_SUBTRACTIVE          (0x00000200)
+#define MPI_EVENT_DSCVRY_ERR_DS_TABLE_TO_TABLE              (0x00000400)
+#define MPI_EVENT_DSCVRY_ERR_DS_MULTPL_PATHS                (0x00000800)
 
 
 /*****************************************************************************
@@ -589,11 +702,13 @@ typedef struct _MSG_FW_DOWNLOAD
 } MSG_FW_DOWNLOAD, MPI_POINTER PTR_MSG_FW_DOWNLOAD,
   FWDownload_t, MPI_POINTER pFWDownload_t;
 
-#define MPI_FW_DOWNLOAD_ITYPE_RESERVED      (0x00)
-#define MPI_FW_DOWNLOAD_ITYPE_FW            (0x01)
-#define MPI_FW_DOWNLOAD_ITYPE_BIOS          (0x02)
-#define MPI_FW_DOWNLOAD_ITYPE_NVDATA        (0x03)
-#define MPI_FW_DOWNLOAD_ITYPE_BOOTLOADER    (0x04)
+#define MPI_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT    (0x01)
+
+#define MPI_FW_DOWNLOAD_ITYPE_RESERVED          (0x00)
+#define MPI_FW_DOWNLOAD_ITYPE_FW                (0x01)
+#define MPI_FW_DOWNLOAD_ITYPE_BIOS              (0x02)
+#define MPI_FW_DOWNLOAD_ITYPE_NVDATA            (0x03)
+#define MPI_FW_DOWNLOAD_ITYPE_BOOTLOADER        (0x04)
 
 
 typedef struct _FWDownloadTCSGE
@@ -647,6 +762,7 @@ typedef struct _MSG_FW_UPLOAD
 #define MPI_FW_UPLOAD_ITYPE_BIOS_FLASH      (0x02)
 #define MPI_FW_UPLOAD_ITYPE_NVDATA          (0x03)
 #define MPI_FW_UPLOAD_ITYPE_BOOTLOADER      (0x04)
+#define MPI_FW_UPLOAD_ITYPE_FW_BACKUP       (0x05)
 
 typedef struct _FWUploadTCSGE
 {
@@ -723,6 +839,7 @@ typedef struct _MPI_FW_HEADER
 #define MPI_FW_HEADER_PID_PROD_IM_SCSI                  (0x0400)
 #define MPI_FW_HEADER_PID_PROD_IS_SCSI                  (0x0500)
 #define MPI_FW_HEADER_PID_PROD_CTX_SCSI                 (0x0600)
+#define MPI_FW_HEADER_PID_PROD_IR_SCSI                  (0x0700)
 
 #define MPI_FW_HEADER_PID_FAMILY_MASK           (0x00FF)
 /* SCSI */
@@ -740,13 +857,16 @@ typedef struct _MPI_FW_HEADER
 #define MPI_FW_HEADER_PID_FAMILY_1020TA0_SCSI   (0x000C)
 /* Fibre Channel */
 #define MPI_FW_HEADER_PID_FAMILY_909_FC         (0x0000)
-#define MPI_FW_HEADER_PID_FAMILY_919_FC         (0x0001)
-#define MPI_FW_HEADER_PID_FAMILY_919X_FC        (0x0002)
-#define MPI_FW_HEADER_PID_FAMILY_919XL_FC       (0x0003)
-#define MPI_FW_HEADER_PID_FAMILY_949_FC         (0x0004)
+#define MPI_FW_HEADER_PID_FAMILY_919_FC         (0x0001) /* 919 and 929     */
+#define MPI_FW_HEADER_PID_FAMILY_919X_FC        (0x0002) /* 919X and 929X   */
+#define MPI_FW_HEADER_PID_FAMILY_919XL_FC       (0x0003) /* 919XL and 929XL */
+#define MPI_FW_HEADER_PID_FAMILY_939X_FC        (0x0004) /* 939X and 949X   */
 #define MPI_FW_HEADER_PID_FAMILY_959_FC         (0x0005)
 /* SAS */
 #define MPI_FW_HEADER_PID_FAMILY_1064_SAS       (0x0001)
+#define MPI_FW_HEADER_PID_FAMILY_1068_SAS       (0x0002)
+#define MPI_FW_HEADER_PID_FAMILY_1078_SAS       (0x0003)
+#define MPI_FW_HEADER_PID_FAMILY_106xE_SAS      (0x0004) /* 1068E, 1066E, and 1064E */
 
 typedef struct _MPI_EXT_IMAGE_HEADER
 {
index 3ced12784ee80781c04ee71fd15c69f7b051879b..dc0b52ae83ddae767d8920adc839fcb72b415a28 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2000-2003 LSI Logic Corporation.
+ *  Copyright (c) 2000-2004 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_lan.h
  *          Title:  MPI LAN messages and structures
  *  Creation Date:  June 30, 2000
  *
- *    mpi_lan.h Version:  01.05.xx
+ *    mpi_lan.h Version:  01.05.01
  *
  *  Version History
  *  ---------------
@@ -28,6 +28,8 @@
  *  02-20-01  01.01.02  Started using MPI_POINTER.
  *  03-27-01  01.01.03  Added structure offset comments.
  *  08-08-01  01.02.01  Original release for v1.2 work.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Original release for MPI v1.5.
  *  --------------------------------------------------------------------------
  */
 
index 9580a9de7fd2ad735f170a691f498286be095f0b..802255d2747c0c64ce519f67de0606c8fb7b4841 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2001-2003 LSI Logic Corporation.
+ *  Copyright (c) 2001-2005 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_raid.h
  *          Title:  MPI RAID message and structures
  *  Creation Date:  February 27, 2001
  *
- *    mpi_raid.h Version:  01.05.xx
+ *    mpi_raid.h Version:  01.05.02
  *
  *  Version History
  *  ---------------
  *  11-15-02  01.02.08  Added missing MsgContext field to MSG_MAILBOX_REQUEST.
  *  04-01-03  01.02.09  New action data option flag for
  *                      MPI_RAID_ACTION_DELETE_VOLUME.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Original release for MPI v1.5.
+ *  01-15-05  01.05.02  Added defines for the two new RAID Actions for
+ *                      _SET_RESYNC_RATE and _SET_DATA_SCRUB_RATE.
  *  --------------------------------------------------------------------------
  */
 
@@ -84,6 +88,8 @@ typedef struct _MSG_RAID_ACTION
 #define MPI_RAID_ACTION_REPLACE_PHYSDISK            (0x10)
 #define MPI_RAID_ACTION_ACTIVATE_VOLUME             (0x11)
 #define MPI_RAID_ACTION_INACTIVATE_VOLUME           (0x12)
+#define MPI_RAID_ACTION_SET_RESYNC_RATE             (0x13)
+#define MPI_RAID_ACTION_SET_DATA_SCRUB_RATE         (0x14)
 
 /* ActionDataWord defines for use with MPI_RAID_ACTION_CREATE_VOLUME action */
 #define MPI_RAID_ACTION_ADATA_DO_NOT_SYNC           (0x00000001)
@@ -99,6 +105,13 @@ typedef struct _MSG_RAID_ACTION
 /* ActionDataWord defines for use with MPI_RAID_ACTION_ACTIVATE_VOLUME action */
 #define MPI_RAID_ACTION_ADATA_INACTIVATE_ALL        (0x00000001)
 
+/* ActionDataWord defines for use with MPI_RAID_ACTION_SET_RESYNC_RATE action */
+#define MPI_RAID_ACTION_ADATA_RESYNC_RATE_MASK      (0x000000FF)
+
+/* ActionDataWord defines for use with MPI_RAID_ACTION_SET_DATA_SCRUB_RATE action */
+#define MPI_RAID_ACTION_ADATA_DATA_SCRUB_RATE_MASK  (0x000000FF)
+
+
 
 /* RAID Action reply message */
 
index cb878f9c65de183e0fa720da3e8d463a37f27bbc..230fa69b5353426566599270d0ce117d8a7c4279 100644 (file)
@@ -1,25 +1,76 @@
 /*
- *  Copyright (c) 2003 LSI Logic Corporation.
+ *  Copyright (c) 2004 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_sas.h
  *          Title:  MPI Serial Attached SCSI structures and definitions
- *  Creation Date:  April 23, 2003
+ *  Creation Date:  August 19, 2004
  *
- *    mpi_sas.h Version:  01.05.xx
+ *    mpi_sas.h Version:  01.05.01
  *
  *  Version History
  *  ---------------
  *
  *  Date      Version   Description
  *  --------  --------  ------------------------------------------------------
- *  xx-yy-zz  01.05.01  Original release.
+ *  08-19-04  01.05.01  Original release.
  *  --------------------------------------------------------------------------
  */
 
 #ifndef MPI_SAS_H
 #define MPI_SAS_H
 
+
+/*
+ * Values for SASStatus.
+ */
+#define MPI_SASSTATUS_SUCCESS                           (0x00)
+#define MPI_SASSTATUS_UNKNOWN_ERROR                     (0x01)
+#define MPI_SASSTATUS_INVALID_FRAME                     (0x02)
+#define MPI_SASSTATUS_UTC_BAD_DEST                      (0x03)
+#define MPI_SASSTATUS_UTC_BREAK_RECEIVED                (0x04)
+#define MPI_SASSTATUS_UTC_CONNECT_RATE_NOT_SUPPORTED    (0x05)
+#define MPI_SASSTATUS_UTC_PORT_LAYER_REQUEST            (0x06)
+#define MPI_SASSTATUS_UTC_PROTOCOL_NOT_SUPPORTED        (0x07)
+#define MPI_SASSTATUS_UTC_STP_RESOURCES_BUSY            (0x08)
+#define MPI_SASSTATUS_UTC_WRONG_DESTINATION             (0x09)
+#define MPI_SASSTATUS_SHORT_INFORMATION_UNIT            (0x0A)
+#define MPI_SASSTATUS_LONG_INFORMATION_UNIT             (0x0B)
+#define MPI_SASSTATUS_XFER_RDY_INCORRECT_WRITE_DATA     (0x0C)
+#define MPI_SASSTATUS_XFER_RDY_REQUEST_OFFSET_ERROR     (0x0D)
+#define MPI_SASSTATUS_XFER_RDY_NOT_EXPECTED             (0x0E)
+#define MPI_SASSTATUS_DATA_INCORRECT_DATA_LENGTH        (0x0F)
+#define MPI_SASSTATUS_DATA_TOO_MUCH_READ_DATA           (0x10)
+#define MPI_SASSTATUS_DATA_OFFSET_ERROR                 (0x11)
+#define MPI_SASSTATUS_SDSF_NAK_RECEIVED                 (0x12)
+#define MPI_SASSTATUS_SDSF_CONNECTION_FAILED            (0x13)
+#define MPI_SASSTATUS_INITIATOR_RESPONSE_TIMEOUT        (0x14)
+
+
+/*
+ * Values for the SAS DeviceInfo field used in SAS Device Status Change Event
+ * data and SAS IO Unit Configuration pages.
+ */
+#define MPI_SAS_DEVICE_INFO_ATAPI_DEVICE        (0x00002000)
+#define MPI_SAS_DEVICE_INFO_LSI_DEVICE          (0x00001000)
+#define MPI_SAS_DEVICE_INFO_DIRECT_ATTACH       (0x00000800)
+#define MPI_SAS_DEVICE_INFO_SSP_TARGET          (0x00000400)
+#define MPI_SAS_DEVICE_INFO_STP_TARGET          (0x00000200)
+#define MPI_SAS_DEVICE_INFO_SMP_TARGET          (0x00000100)
+#define MPI_SAS_DEVICE_INFO_SATA_DEVICE         (0x00000080)
+#define MPI_SAS_DEVICE_INFO_SSP_INITIATOR       (0x00000040)
+#define MPI_SAS_DEVICE_INFO_STP_INITIATOR       (0x00000020)
+#define MPI_SAS_DEVICE_INFO_SMP_INITIATOR       (0x00000010)
+#define MPI_SAS_DEVICE_INFO_SATA_HOST           (0x00000008)
+
+#define MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE    (0x00000007)
+#define MPI_SAS_DEVICE_INFO_NO_DEVICE           (0x00000000)
+#define MPI_SAS_DEVICE_INFO_END_DEVICE          (0x00000001)
+#define MPI_SAS_DEVICE_INFO_EDGE_EXPANDER       (0x00000002)
+#define MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER     (0x00000003)
+
+
+
 /*****************************************************************************
 *
 *        S e r i a l    A t t a c h e d    S C S I     M e s s a g e s
@@ -48,8 +99,10 @@ typedef struct _MSG_SMP_PASSTHROUGH_REQUEST
 } MSG_SMP_PASSTHROUGH_REQUEST, MPI_POINTER PTR_MSG_SMP_PASSTHROUGH_REQUEST,
   SmpPassthroughRequest_t, MPI_POINTER pSmpPassthroughRequest_t;
 
+/* values for PassthroughFlags field */
 #define MPI_SMP_PT_REQ_PT_FLAGS_IMMEDIATE       (0x80)
 
+/* values for ConnectionRate field */
 #define MPI_SMP_PT_REQ_CONNECT_RATE_NEGOTIATED  (0x00)
 #define MPI_SMP_PT_REQ_CONNECT_RATE_1_5         (0x08)
 #define MPI_SMP_PT_REQ_CONNECT_RATE_3_0         (0x09)
@@ -77,51 +130,69 @@ typedef struct _MSG_SMP_PASSTHROUGH_REPLY
 
 #define MPI_SMP_PT_REPLY_PT_FLAGS_IMMEDIATE     (0x80)
 
-/* values for the SASStatus field */
-#define MPI_SASSTATUS_SUCCESS                           (0x00)
-#define MPI_SASSTATUS_UNKNOWN_ERROR                     (0x01)
-#define MPI_SASSTATUS_INVALID_FRAME                     (0x02)
-#define MPI_SASSTATUS_UTC_BAD_DEST                      (0x03)
-#define MPI_SASSTATUS_UTC_BREAK_RECEIVED                (0x04)
-#define MPI_SASSTATUS_UTC_CONNECT_RATE_NOT_SUPPORTED    (0x05)
-#define MPI_SASSTATUS_UTC_PORT_LAYER_REQUEST            (0x06)
-#define MPI_SASSTATUS_UTC_PROTOCOL_NOT_SUPPORTED        (0x07)
-#define MPI_SASSTATUS_UTC_STP_RESOURCES_BUSY            (0x08)
-#define MPI_SASSTATUS_UTC_WRONG_DESTINATION             (0x09)
-#define MPI_SASSTATUS_SHORT_INFORMATION_UNIT            (0x0A)
-#define MPI_SASSTATUS_LONG_INFORMATION_UNIT             (0x0B)
-#define MPI_SASSTATUS_XFER_RDY_INCORRECT_WRITE_DATA     (0x0C)
-#define MPI_SASSTATUS_XFER_RDY_REQUEST_OFFSET_ERROR     (0x0D)
-#define MPI_SASSTATUS_XFER_RDY_NOT_EXPECTED             (0x0E)
-#define MPI_SASSTATUS_DATA_INCORRECT_DATA_LENGTH        (0x0F)
-#define MPI_SASSTATUS_DATA_TOO_MUCH_READ_DATA           (0x10)
-#define MPI_SASSTATUS_DATA_OFFSET_ERROR                 (0x11)
-#define MPI_SASSTATUS_SDSF_NAK_RECEIVED                 (0x12)
-#define MPI_SASSTATUS_SDSF_CONNECTION_FAILED            (0x13)
-#define MPI_SASSTATUS_INITIATOR_RESPONSE_TIMEOUT        (0x14)
 
+/****************************************************************************/
+/* SATA Passthrough Request                                                 */
+/****************************************************************************/
+
+typedef struct _MSG_SATA_PASSTHROUGH_REQUEST
+{
+    U8                      TargetID;           /* 00h */
+    U8                      Bus;                /* 01h */
+    U8                      ChainOffset;        /* 02h */
+    U8                      Function;           /* 03h */
+    U16                     PassthroughFlags;   /* 04h */
+    U8                      ConnectionRate;     /* 06h */
+    U8                      MsgFlags;           /* 07h */
+    U32                     MsgContext;         /* 08h */
+    U32                     Reserved1;          /* 0Ch */
+    U32                     Reserved2;          /* 10h */
+    U32                     Reserved3;          /* 14h */
+    U32                     DataLength;         /* 18h */
+    U8                      CommandFIS[20];     /* 1Ch */
+    SGE_SIMPLE_UNION        SGL;                /* 30h */
+} MSG_SATA_PASSTHROUGH_REQUEST, MPI_POINTER PTR_MSG_SATA_PASSTHROUGH_REQUEST,
+  SataPassthroughRequest_t, MPI_POINTER pSataPassthroughRequest_t;
+
+/* values for PassthroughFlags field */
+#define MPI_SATA_PT_REQ_PT_FLAGS_RESET_DEVICE   (0x0200)
+#define MPI_SATA_PT_REQ_PT_FLAGS_EXECUTE_DIAG   (0x0100)
+#define MPI_SATA_PT_REQ_PT_FLAGS_DMA_QUEUED     (0x0080)
+#define MPI_SATA_PT_REQ_PT_FLAGS_PACKET_COMMAND (0x0040)
+#define MPI_SATA_PT_REQ_PT_FLAGS_DMA            (0x0020)
+#define MPI_SATA_PT_REQ_PT_FLAGS_PIO            (0x0010)
+#define MPI_SATA_PT_REQ_PT_FLAGS_UNSPECIFIED_VU (0x0004)
+#define MPI_SATA_PT_REQ_PT_FLAGS_WRITE          (0x0002)
+#define MPI_SATA_PT_REQ_PT_FLAGS_READ           (0x0001)
+
+/* values for ConnectionRate field */
+#define MPI_SATA_PT_REQ_CONNECT_RATE_NEGOTIATED (0x00)
+#define MPI_SATA_PT_REQ_CONNECT_RATE_1_5        (0x08)
+#define MPI_SATA_PT_REQ_CONNECT_RATE_3_0        (0x09)
+
+
+/* SATA Passthrough Reply */
+typedef struct _MSG_SATA_PASSTHROUGH_REPLY
+{
+    U8                      TargetID;           /* 00h */
+    U8                      Bus;                /* 01h */
+    U8                      MsgLength;          /* 02h */
+    U8                      Function;           /* 03h */
+    U16                     PassthroughFlags;   /* 04h */
+    U8                      Reserved1;          /* 06h */
+    U8                      MsgFlags;           /* 07h */
+    U32                     MsgContext;         /* 08h */
+    U8                      Reserved2;          /* 0Ch */
+    U8                      SASStatus;          /* 0Dh */
+    U16                     IOCStatus;          /* 0Eh */
+    U32                     IOCLogInfo;         /* 10h */
+    U8                      StatusFIS[20];      /* 14h */
+    U32                     StatusControlRegisters; /* 28h */
+    U32                     TransferCount;      /* 2Ch */
+} MSG_SATA_PASSTHROUGH_REPLY, MPI_POINTER PTR_MSG_SATA_PASSTHROUGH_REPLY,
+  SataPassthroughReply_t, MPI_POINTER pSataPassthroughReply_t;
 
-/*
- * Values for the SAS DeviceInfo field used in SAS Device Status Change Event
- * data and SAS IO Unit Configuration pages.
- */
-#define MPI_SAS_DEVICE_INFO_ATAPI_DEVICE        (0x00002000)
-#define MPI_SAS_DEVICE_INFO_LSI_DEVICE          (0x00001000)
-#define MPI_SAS_DEVICE_INFO_DIRECT_ATTACH       (0x00000800)
-#define MPI_SAS_DEVICE_INFO_SSP_TARGET          (0x00000400)
-#define MPI_SAS_DEVICE_INFO_STP_TARGET          (0x00000200)
-#define MPI_SAS_DEVICE_INFO_SMP_TARGET          (0x00000100)
-#define MPI_SAS_DEVICE_INFO_SATA_DEVICE         (0x00000080)
-#define MPI_SAS_DEVICE_INFO_SSP_INITIATOR       (0x00000040)
-#define MPI_SAS_DEVICE_INFO_STP_INITIATOR       (0x00000020)
-#define MPI_SAS_DEVICE_INFO_SMP_INITIATOR       (0x00000010)
-#define MPI_SAS_DEVICE_INFO_SATA_HOST           (0x00000008)
 
-#define MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE    (0x00000007)
-#define MPI_SAS_DEVICE_INFO_NO_DEVICE           (0x00000000)
-#define MPI_SAS_DEVICE_INFO_END_DEVICE          (0x00000001)
-#define MPI_SAS_DEVICE_INFO_EDGE_EXPANDER       (0x00000002)
-#define MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER     (0x00000003)
 
 
 /****************************************************************************/
@@ -148,15 +219,13 @@ typedef struct _MSG_SAS_IOUNIT_CONTROL_REQUEST
 } MSG_SAS_IOUNIT_CONTROL_REQUEST, MPI_POINTER PTR_MSG_SAS_IOUNIT_CONTROL_REQUEST,
   SasIoUnitControlRequest_t, MPI_POINTER pSasIoUnitControlRequest_t;
 
-/* values for the ... field */
+/* values for the Operation field */
 #define MPI_SAS_OP_CLEAR_NOT_PRESENT             (0x01)
-#define MPI_SAS_OP_CLEAR_ALL                     (0x02)
-#define MPI_SAS_OP_MAP                           (0x03)
-#define MPI_SAS_OP_MOVE                          (0x04)
-#define MPI_SAS_OP_CLEAR                         (0x05)
+#define MPI_SAS_OP_CLEAR_ALL_PERSISTENT          (0x02)
 #define MPI_SAS_OP_PHY_LINK_RESET                (0x06)
 #define MPI_SAS_OP_PHY_HARD_RESET                (0x07)
 #define MPI_SAS_OP_PHY_CLEAR_ERROR_LOG           (0x08)
+#define MPI_SAS_OP_MAP_CURRENT                   (0x09)
 
 
 /* SAS IO Unit Control Reply */
index 804dc85426c15aa00b0539f2d0a7ae26c90d8ace..623901fd82be3a05a0197744baaecc11c25f4f65 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2000-2003 LSI Logic Corporation.
+ *  Copyright (c) 2000-2004 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_targ.h
  *          Title:  MPI Target mode messages and structures
  *  Creation Date:  June 22, 2000
  *
- *    mpi_targ.h Version:  01.05.xx
+ *    mpi_targ.h Version:  01.05.04
  *
  *  Version History
  *  ---------------
  *                      Added PRIORITY_REASON_TARGET_BUSY.
  *  11-15-02  01.02.08  Added AliasID field to MPI_TARGET_SCSI_SPI_CMD_BUFFER.
  *  04-01-03  01.02.09  Added OptionalOxid field to MPI_TARGET_FCP_CMD_BUFFER.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Added new request message structures for
+ *                      MSG_TARGET_CMD_BUF_POST_BASE_REQUEST,
+ *                      MSG_TARGET_CMD_BUF_POST_LIST_REQUEST, and
+ *                      MSG_TARGET_ASSIST_EXT_REQUEST.
+ *                      Added new structures for SAS SSP Command buffer, SSP
+ *                      Task buffer, and SSP Status IU.
+ *  10-05-04  01.05.02  MSG_TARGET_CMD_BUFFER_POST_BASE_LIST_REPLY added.
+ *  02-22-05  01.05.03  Changed a comment.
+ *  03-11-05  01.05.04  Removed TargetAssistExtended Request.
  *  --------------------------------------------------------------------------
  */
 
@@ -133,6 +143,25 @@ typedef struct _MSG_PRIORITY_CMD_RECEIVED_REPLY
 } MSG_PRIORITY_CMD_RECEIVED_REPLY, MPI_POINTER PTR_MSG_PRIORITY_CMD_RECEIVED_REPLY,
   PriorityCommandReceivedReply_t, MPI_POINTER pPriorityCommandReceivedReply_t;
 
+
+typedef struct _MSG_TARGET_CMD_BUFFER_POST_ERROR_REPLY
+{
+    U16                     Reserved;                   /* 00h */
+    U8                      MsgLength;                  /* 02h */
+    U8                      Function;                   /* 03h */
+    U16                     Reserved1;                  /* 04h */
+    U8                      Reserved2;                  /* 06h */
+    U8                      MsgFlags;                   /* 07h */
+    U32                     MsgContext;                 /* 08h */
+    U8                      PriorityReason;             /* 0Ch */
+    U8                      Reserved3;                  /* 0Dh */
+    U16                     IOCStatus;                  /* 0Eh */
+    U32                     IOCLogInfo;                 /* 10h */
+    U32                     ReplyWord;                  /* 14h */
+} MSG_TARGET_CMD_BUFFER_POST_ERROR_REPLY,
+  MPI_POINTER PTR_MSG_TARGET_CMD_BUFFER_POST_ERROR_REPLY,
+  TargetCmdBufferPostErrorReply_t, MPI_POINTER pTargetCmdBufferPostErrorReply_t;
+
 #define PRIORITY_REASON_NO_DISCONNECT           (0x00)
 #define PRIORITY_REASON_SCSI_TASK_MANAGEMENT    (0x01)
 #define PRIORITY_REASON_CMD_PARITY_ERR          (0x02)
@@ -146,7 +175,34 @@ typedef struct _MSG_PRIORITY_CMD_RECEIVED_REPLY
 #define PRIORITY_REASON_UNKNOWN                 (0xFF)
 
 
-typedef struct _MSG_TARGET_CMD_BUFFER_POST_ERROR_REPLY
+/****************************************************************************/
+/* Target Command Buffer Post Base Request                                  */
+/****************************************************************************/
+
+typedef struct _MSG_TARGET_CMD_BUF_POST_BASE_REQUEST
+{
+    U8                      BufferPostFlags;            /* 00h */
+    U8                      PortNumber;                 /* 01h */
+    U8                      ChainOffset;                /* 02h */
+    U8                      Function;                   /* 03h */
+    U16                     TotalCmdBuffers;            /* 04h */
+    U8                      Reserved;                   /* 06h */
+    U8                      MsgFlags;                   /* 07h */
+    U32                     MsgContext;                 /* 08h */
+    U32                     Reserved1;                  /* 0Ch */
+    U16                     CmdBufferLength;            /* 10h */
+    U16                     NextCmdBufferOffset;        /* 12h */
+    U32                     BaseAddressLow;             /* 14h */
+    U32                     BaseAddressHigh;            /* 18h */
+} MSG_TARGET_CMD_BUF_POST_BASE_REQUEST,
+  MPI_POINTER PTR__MSG_TARGET_CMD_BUF_POST_BASE_REQUEST,
+  TargetCmdBufferPostBaseRequest_t,
+  MPI_POINTER pTargetCmdBufferPostBaseRequest_t;
+
+#define CMD_BUFFER_POST_BASE_FLAGS_AUTO_POST_ALL    (0x01)
+
+
+typedef struct _MSG_TARGET_CMD_BUFFER_POST_BASE_LIST_REPLY
 {
     U16                     Reserved;                   /* 00h */
     U8                      MsgLength;                  /* 02h */
@@ -155,16 +211,41 @@ typedef struct _MSG_TARGET_CMD_BUFFER_POST_ERROR_REPLY
     U8                      Reserved2;                  /* 06h */
     U8                      MsgFlags;                   /* 07h */
     U32                     MsgContext;                 /* 08h */
-    U8                      PriorityReason;             /* 0Ch */
-    U8                      Reserved3;                  /* 0Dh */
+    U16                     Reserved3;                  /* 0Ch */
     U16                     IOCStatus;                  /* 0Eh */
     U32                     IOCLogInfo;                 /* 10h */
-    U32                     ReplyWord;                  /* 14h */
-} MSG_TARGET_CMD_BUFFER_POST_ERROR_REPLY,
-  MPI_POINTER PTR_MSG_TARGET_CMD_BUFFER_POST_ERROR_REPLY,
-  TargetCmdBufferPostErrorReply_t, MPI_POINTER pTargetCmdBufferPostErrorReply_t;
+} MSG_TARGET_CMD_BUFFER_POST_BASE_LIST_REPLY,
+  MPI_POINTER PTR_MSG_TARGET_CMD_BUFFER_POST_BASE_LIST_REPLY,
+  TargetCmdBufferPostBaseListReply_t,
+  MPI_POINTER pTargetCmdBufferPostBaseListReply_t;
+
+
+/****************************************************************************/
+/* Target Command Buffer Post List Request                                  */
+/****************************************************************************/
+
+typedef struct _MSG_TARGET_CMD_BUF_POST_LIST_REQUEST
+{
+    U8                      Reserved;                   /* 00h */
+    U8                      PortNumber;                 /* 01h */
+    U8                      ChainOffset;                /* 02h */
+    U8                      Function;                   /* 03h */
+    U16                     CmdBufferCount;             /* 04h */
+    U8                      Reserved1;                  /* 06h */
+    U8                      MsgFlags;                   /* 07h */
+    U32                     MsgContext;                 /* 08h */
+    U32                     Reserved2;                  /* 0Ch */
+    U16                     IoIndex[2];                 /* 10h */
+} MSG_TARGET_CMD_BUF_POST_LIST_REQUEST,
+  MPI_POINTER PTR_MSG_TARGET_CMD_BUF_POST_LIST_REQUEST,
+  TargetCmdBufferPostListRequest_t,
+  MPI_POINTER pTargetCmdBufferPostListRequest_t;
 
 
+/****************************************************************************/
+/* Command Buffer Formats (with 16 byte CDB)                                */
+/****************************************************************************/
+
 typedef struct _MPI_TARGET_FCP_CMD_BUFFER
 {
     U8      FcpLun[8];                                  /* 00h */
@@ -201,6 +282,46 @@ typedef struct _MPI_TARGET_SCSI_SPI_CMD_BUFFER
   MpiTargetScsiSpiCmdBuffer, MPI_POINTER pMpiTargetScsiSpiCmdBuffer;
 
 
+typedef struct _MPI_TARGET_SSP_CMD_BUFFER
+{
+    U8      FrameType;                                  /* 00h */
+    U8      Reserved1;                                  /* 01h */
+    U16     Reserved2;                                  /* 02h */
+    U16     InitiatorTag;                               /* 04h */
+    U16     DevHandle;                                  /* 06h */
+    /* COMMAND information unit starts here */
+    U8      LogicalUnitNumber[8];                       /* 08h */
+    U8      Reserved3;                                  /* 10h */
+    U8      TaskAttribute; /* lower 3 bits */           /* 11h */
+    U8      Reserved4;                                  /* 12h */
+    U8      AdditionalCDBLength; /* upper 5 bits */     /* 13h */
+    U8      CDB[16];                                    /* 14h */
+    /* Additional CDB bytes extend past the CDB field */
+} MPI_TARGET_SSP_CMD_BUFFER, MPI_POINTER PTR_MPI_TARGET_SSP_CMD_BUFFER,
+  MpiTargetSspCmdBuffer, MPI_POINTER pMpiTargetSspCmdBuffer;
+
+typedef struct _MPI_TARGET_SSP_TASK_BUFFER
+{
+    U8      FrameType;                                  /* 00h */
+    U8      Reserved1;                                  /* 01h */
+    U16     Reserved2;                                  /* 02h */
+    U16     InitiatorTag;                               /* 04h */
+    U16     DevHandle;                                  /* 06h */
+    /* TASK information unit starts here */
+    U8      LogicalUnitNumber[8];                       /* 08h */
+    U8      Reserved3;                                  /* 10h */
+    U8      Reserved4;                                  /* 11h */
+    U8      TaskManagementFunction;                     /* 12h */
+    U8      Reserved5;                                  /* 13h */
+    U16     ManagedTaskTag;                             /* 14h */
+    U16     Reserved6;                                  /* 16h */
+    U32     Reserved7;                                  /* 18h */
+    U32     Reserved8;                                  /* 1Ch */
+    U32     Reserved9;                                  /* 20h */
+} MPI_TARGET_SSP_TASK_BUFFER, MPI_POINTER PTR_MPI_TARGET_SSP_TASK_BUFFER,
+  MpiTargetSspTaskBuffer, MPI_POINTER pMpiTargetSspTaskBuffer;
+
+
 /****************************************************************************/
 /* Target Assist Request                                                    */
 /****************************************************************************/
@@ -308,6 +429,27 @@ typedef struct _MPI_TARGET_SCSI_SPI_STATUS_IU
 } MPI_TARGET_SCSI_SPI_STATUS_IU, MPI_POINTER PTR_MPI_TARGET_SCSI_SPI_STATUS_IU,
   TargetScsiSpiStatusIU_t, MPI_POINTER pTargetScsiSpiStatusIU_t;
 
+/*
+ * NOTE: The SSP status IU is big-endian. When used on a little-endian system,
+ * this structure properly orders the bytes.
+ */
+typedef struct _MPI_TARGET_SSP_RSP_IU
+{
+    U32     Reserved0[6]; /* reserved for SSP header */ /* 00h */
+    /* start of RESPONSE information unit */
+    U32     Reserved1;                                  /* 18h */
+    U32     Reserved2;                                  /* 1Ch */
+    U16     Reserved3;                                  /* 20h */
+    U8      DataPres; /* lower 2 bits */                /* 22h */
+    U8      Status;                                     /* 23h */
+    U32     Reserved4;                                  /* 24h */
+    U32     SenseDataLength;                            /* 28h */
+    U32     ResponseDataLength;                         /* 2Ch */
+    U8      ResponseSenseData[4];                       /* 30h */
+} MPI_TARGET_SSP_RSP_IU, MPI_POINTER PTR_MPI_TARGET_SSP_RSP_IU,
+  MpiTargetSspRspIu_t, MPI_POINTER pMpiTargetSspRspIu_t;
+
+
 /****************************************************************************/
 /* Target Mode Abort Request                                                */
 /****************************************************************************/
index 536d197c4142f3239e440d4c8206486915f010f2..aa9053da1f58c580b767410b508db6a41a7dd679 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2001-2003 LSI Logic Corporation.
+ *  Copyright (c) 2001-2005 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_tool.h
  *          Title:  MPI Toolbox structures and definitions
  *  Creation Date:  July 30, 2001
  *
- *    mpi_tool.h Version:  01.05.xx
+ *    mpi_tool.h Version:  01.05.03
  *
  *  Version History
  *  ---------------
  *  --------  --------  ------------------------------------------------------
  *  08-08-01  01.02.01  Original release.
  *  08-29-01  01.02.02  Added DIAG_DATA_UPLOAD_HEADER and related defines.
+ *  01-16-04  01.02.03  Added defines and structures for new tools
+ *.                     MPI_TOOLBOX_ISTWI_READ_WRITE_TOOL and
+ *                      MPI_TOOLBOX_FC_MANAGEMENT_TOOL.
+ *  04-29-04  01.02.04  Added message structures for Diagnostic Buffer Post and
+ *                      Diagnostic Release requests and replies.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Original release for MPI v1.5.
+ *  10-06-04  01.05.02  Added define for MPI_DIAG_BUF_TYPE_COUNT.
+ *  02-09-05  01.05.03  Added frame size option to FC management tool.
+ *                      Added Beacon tool to the Toolbox.
  *  --------------------------------------------------------------------------
  */
 
@@ -26,6 +36,7 @@
 #define MPI_TOOLBOX_DIAG_DATA_UPLOAD_TOOL           (0x02)
 #define MPI_TOOLBOX_ISTWI_READ_WRITE_TOOL           (0x03)
 #define MPI_TOOLBOX_FC_MANAGEMENT_TOOL              (0x04)
+#define MPI_TOOLBOX_BEACON_TOOL                     (0x05)
 
 
 /****************************************************************************/
@@ -185,11 +196,21 @@ typedef struct _MPI_TB_FC_MANAGE_PID_AI
 } MPI_TB_FC_MANAGE_PID_AI, MPI_POINTER PTR_MPI_TB_FC_MANAGE_PID_AI,
   MpiTbFcManagePidAi_t, MPI_POINTER pMpiTbFcManagePidAi_t;
 
+/* ActionInfo for set max frame size */
+typedef struct _MPI_TB_FC_MANAGE_FRAME_SIZE_AI
+{
+    U16                     FrameSize;                  /* 00h */
+    U8                      PortNum;                    /* 02h */
+    U8                      Reserved1;                  /* 03h */
+} MPI_TB_FC_MANAGE_FRAME_SIZE_AI, MPI_POINTER PTR_MPI_TB_FC_MANAGE_FRAME_SIZE_AI,
+  MpiTbFcManageFrameSizeAi_t, MPI_POINTER pMpiTbFcManageFrameSizeAi_t;
+
 /* union of ActionInfo */
 typedef union _MPI_TB_FC_MANAGE_AI_UNION
 {
     MPI_TB_FC_MANAGE_BUS_TID_AI     BusTid;
     MPI_TB_FC_MANAGE_PID_AI         Port;
+    MPI_TB_FC_MANAGE_FRAME_SIZE_AI  FrameSize;
 } MPI_TB_FC_MANAGE_AI_UNION, MPI_POINTER PTR_MPI_TB_FC_MANAGE_AI_UNION,
   MpiTbFcManageAiUnion_t, MPI_POINTER pMpiTbFcManageAiUnion_t;
 
@@ -214,6 +235,32 @@ typedef struct _MSG_TOOLBOX_FC_MANAGE_REQUEST
 #define MPI_TB_FC_MANAGE_ACTION_DISC_ALL            (0x00)
 #define MPI_TB_FC_MANAGE_ACTION_DISC_PID            (0x01)
 #define MPI_TB_FC_MANAGE_ACTION_DISC_BUS_TID        (0x02)
+#define MPI_TB_FC_MANAGE_ACTION_SET_MAX_FRAME_SIZE  (0x03)
+
+
+/****************************************************************************/
+/* Toolbox Beacon Tool request                                               */
+/****************************************************************************/
+
+typedef struct _MSG_TOOLBOX_BEACON_REQUEST
+{
+    U8                      Tool;                       /* 00h */
+    U8                      Reserved;                   /* 01h */
+    U8                      ChainOffset;                /* 02h */
+    U8                      Function;                   /* 03h */
+    U16                     Reserved1;                  /* 04h */
+    U8                      Reserved2;                  /* 06h */
+    U8                      MsgFlags;                   /* 07h */
+    U32                     MsgContext;                 /* 08h */
+    U8                      ConnectNum;                 /* 0Ch */
+    U8                      PortNum;                    /* 0Dh */
+    U8                      Reserved3;                  /* 0Eh */
+    U8                      Flags;                      /* 0Fh */
+} MSG_TOOLBOX_BEACON_REQUEST, MPI_POINTER PTR_MSG_TOOLBOX_BEACON_REQUEST,
+  ToolboxBeaconRequest_t, MPI_POINTER pToolboxBeaconRequest_t;
+
+#define MPI_TOOLBOX_FLAGS_BEACON_MODE_OFF       (0x00)
+#define MPI_TOOLBOX_FLAGS_BEACON_MODE_ON        (0x01)
 
 
 /****************************************************************************/
@@ -233,14 +280,16 @@ typedef struct _MSG_DIAG_BUFFER_POST_REQUEST
     U32                     ExtendedType;               /* 0Ch */
     U32                     BufferLength;               /* 10h */
     U32                     ProductSpecific[4];         /* 14h */
-    U32                     Reserved3;                  /* 18h */
-    SGE_SIMPLE_UNION        SGL;                        /* 28h */
+    U32                     Reserved3;                  /* 24h */
+    U64                     BufferAddress;              /* 28h */
 } MSG_DIAG_BUFFER_POST_REQUEST, MPI_POINTER PTR_MSG_DIAG_BUFFER_POST_REQUEST,
   DiagBufferPostRequest_t, MPI_POINTER pDiagBufferPostRequest_t;
 
 #define MPI_DIAG_BUF_TYPE_TRACE                     (0x00)
 #define MPI_DIAG_BUF_TYPE_SNAPSHOT                  (0x01)
 #define MPI_DIAG_BUF_TYPE_EXTENDED                  (0x02)
+/* count of the number of buffer types */
+#define MPI_DIAG_BUF_TYPE_COUNT                     (0x03)
 
 #define MPI_DIAG_EXTENDED_QTAG                      (0x00000001)
 
index 239328a7689c915f85317507203f5aedca9c412d..32cc9b1151b8b2bdfdb5294463c8388e95322db0 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2000-2003 LSI Logic Corporation.
+ *  Copyright (c) 2000-2004 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_type.h
  *          Title:  MPI Basic type definitions
  *  Creation Date:  June 6, 2000
  *
- *    mpi_type.h Version:  01.05.xx
+ *    mpi_type.h Version:  01.05.01
  *
  *  Version History
  *  ---------------
@@ -18,6 +18,8 @@
  *  11-02-00  01.01.01  Original release for post 1.0 work
  *  02-20-01  01.01.02  Added define and ifdef for MPI_POINTER.
  *  08-08-01  01.02.01  Original release for v1.2 work.
+ *  05-11-04  01.03.01  Original release for MPI v1.3.
+ *  08-19-04  01.05.01  Original release for MPI v1.5.
  *  --------------------------------------------------------------------------
  */
 
@@ -50,11 +52,6 @@ typedef unsigned short  U16;
 typedef int32_t   S32;
 typedef u_int32_t U32;
 
-/*
- *  The only way crap below could work on big-endian boxen would be if it
- *  wasn't used at all.
- */
-
 typedef struct _S64
 {
     U32          Low;
index 8b22630f1aef18c8b400b6a2cebf42b736e0b583..8b623278ccd24f90e9966d13b508d35136923329 100644 (file)
@@ -1,55 +1,13 @@
 /*
  *  linux/drivers/message/fusion/mptbase.c
- *      High performance SCSI + LAN / Fibre Channel device drivers.
  *      This is the Fusion MPT base driver which supports multiple
  *      (SCSI + LAN) specialized protocol drivers.
- *      For use with PCI chip/adapter(s):
- *          LSIFC9xx/LSI409xx Fibre Channel
+ *      For use with LSI Logic PCI chip/adapter(s)
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
- *  Credits:
- *      There are lots of people not mentioned below that deserve credit
- *      and thanks but won't get it here - sorry in advance that you
- *      got overlooked.
- *
- *      This driver would not exist if not for Alan Cox's development
- *      of the linux i2o driver.
- *
- *      A special thanks to Noah Romer (LSI Logic) for tons of work
- *      and tough debugging on the LAN driver, especially early on;-)
- *      And to Roger Hickerson (LSI Logic) for tirelessly supporting
- *      this driver project.
- *
- *      A special thanks to Pamela Delaney (LSI Logic) for tons of work
- *      and countless enhancements while adding support for the 1030
- *      chip family.  Pam has been instrumental in the development of
- *      of the 2.xx.xx series fusion drivers, and her contributions are
- *      far too numerous to hope to list in one place.
- *
- *      All manner of help from Stephen Shirron (LSI Logic):
- *      low-level FC analysis, debug + various fixes in FCxx firmware,
- *      initial port to alpha platform, various driver code optimizations,
- *      being a faithful sounding board on all sorts of issues & ideas,
- *      etc.
- *
- *      A huge debt of gratitude is owed to David S. Miller (DaveM)
- *      for fixing much of the stupid and broken stuff in the early
- *      driver while porting to sparc64 platform.  THANK YOU!
- *
- *      Special thanks goes to the I2O LAN driver people at the
- *      University of Helsinki, who, unbeknownst to them, provided
- *      the inspiration and initial structure for this driver.
- *
- *      A really huge debt of gratitude is owed to Eddie C. Dost
- *      for gobs of hard work fixing and optimizing LAN code.
- *      THANK YOU!
- *
- *  Copyright (c) 1999-2004 LSI Logic Corporation
- *  Originally By: Steven J. Ralston
- *  (mailto:sjralston1@netscape.net)
+ *  Copyright (c) 1999-2005 LSI Logic Corporation
  *  (mailto:mpt_linux_developer@lsil.com)
  *
- *  $Id: mptbase.c,v 1.126 2002/12/16 15:28:45 pdelaney Exp $
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>           /* needed for in_interrupt() proto */
+#include <linux/dma-mapping.h>
 #include <asm/io.h>
 #ifdef CONFIG_MTRR
 #include <asm/mtrr.h>
@@ -218,41 +177,35 @@ static void       mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info);
 static void    mpt_sp_log_info(MPT_ADAPTER *ioc, u32 log_info);
 
 /* module entry point */
-static int  __devinit mptbase_probe (struct pci_dev *, const struct pci_device_id *);
-static void __devexit mptbase_remove(struct pci_dev *);
-static void mptbase_shutdown(struct device * );
 static int  __init    fusion_init  (void);
 static void __exit    fusion_exit  (void);
 
-/****************************************************************************
- * Supported hardware
- */
-
-static struct pci_device_id mptbase_pci_table[] = {
-       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC909,
-               PCI_ANY_ID, PCI_ANY_ID },
-       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC929,
-               PCI_ANY_ID, PCI_ANY_ID },
-       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC919,
-               PCI_ANY_ID, PCI_ANY_ID },
-       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC929X,
-               PCI_ANY_ID, PCI_ANY_ID },
-       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC919X,
-               PCI_ANY_ID, PCI_ANY_ID },
-       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C1030,
-               PCI_ANY_ID, PCI_ANY_ID },
-       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_1030_53C1035,
-               PCI_ANY_ID, PCI_ANY_ID },
-       {0}     /* Terminating entry */
-};
-MODULE_DEVICE_TABLE(pci, mptbase_pci_table);
-
 #define CHIPREG_READ32(addr)           readl_relaxed(addr)
 #define CHIPREG_READ32_dmasync(addr)   readl(addr)
 #define CHIPREG_WRITE32(addr,val)      writel(val, addr)
 #define CHIPREG_PIO_WRITE32(addr,val)  outl(val, (unsigned long)addr)
 #define CHIPREG_PIO_READ32(addr)       inl((unsigned long)addr)
 
+static void
+pci_disable_io_access(struct pci_dev *pdev)
+{
+       u16 command_reg;
+
+       pci_read_config_word(pdev, PCI_COMMAND, &command_reg);
+       command_reg &= ~1;
+       pci_write_config_word(pdev, PCI_COMMAND, command_reg);
+}
+
+static void
+pci_enable_io_access(struct pci_dev *pdev)
+{
+       u16 command_reg;
+
+       pci_read_config_word(pdev, PCI_COMMAND, &command_reg);
+       command_reg |= 1;
+       pci_write_config_word(pdev, PCI_COMMAND, command_reg);
+}
+
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
  *     mpt_interrupt - MPT adapter (IOC) specific interrupt handler.
@@ -330,8 +283,7 @@ mpt_interrupt(int irq, void *bus_id, struct pt_regs *r)
                                        ioc->name, mr, req_idx));
                        DBG_DUMP_REPLY_FRAME(mr)
 
-                       /* NEW!  20010301 -sralston
-                        *  Check/log IOC log info
+                       /*  Check/log IOC log info
                         */
                        ioc_stat = le16_to_cpu(mr->u.reply.IOCStatus);
                        if (ioc_stat & MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) {
@@ -357,9 +309,7 @@ mpt_interrupt(int irq, void *bus_id, struct pt_regs *r)
                                mr = (MPT_FRAME_HDR *) CAST_U32_TO_PTR(pa);
                        } else if (type == MPI_CONTEXT_REPLY_TYPE_LAN) {
                                cb_idx = mpt_lan_index;
-                               /*
-                                * BUG FIX!  20001218 -sralston
-                                *  Blind set of mf to NULL here was fatal
+                                /*  Blind set of mf to NULL here was fatal
                                 *  after lan_reply says "freeme"
                                 *  Fix sort of combined with an optimization here;
                                 *  added explicit check for case where lan_reply
@@ -430,15 +380,8 @@ mpt_interrupt(int irq, void *bus_id, struct pt_regs *r)
                }
 
                if (freeme) {
-                       unsigned long flags;
-
                        /*  Put Request back on FreeQ!  */
-                       spin_lock_irqsave(&ioc->FreeQlock, flags);
-                       list_add_tail(&mf->u.frame.linkage.list, &ioc->FreeQ);
-#ifdef MFCNT
-                       ioc->mfcnt--;
-#endif
-                       spin_unlock_irqrestore(&ioc->FreeQlock, flags);
+                       mpt_free_msg_frame(ioc, mf);
                }
 
                mb();
@@ -725,11 +668,9 @@ int
 mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx)
 {
        MPT_ADAPTER     *ioc;
-       int             error=0;
 
        if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) {
-               error= -EINVAL;
-               return error;
+               return -EINVAL;
        }
 
        MptDeviceDriverHandlers[cb_idx] = dd_cbfunc;
@@ -737,14 +678,12 @@ mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx)
        /* call per pci device probe entry point */
        list_for_each_entry(ioc, &ioc_list, list) {
                if(dd_cbfunc->probe) {
-                       error = dd_cbfunc->probe(ioc->pcidev,
+                       dd_cbfunc->probe(ioc->pcidev,
                          ioc->pcidev->driver->id_table);
-                       if(error != 0)
-                               return error;
                }
         }
 
-       return error;
+       return 0;
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -809,8 +748,8 @@ mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc)
                mf->u.frame.hwhdr.msgctxu.fld.cb_idx = handle;  /* byte */
                req_offset = (u8 *)mf - (u8 *)ioc->req_frames;
                                                                /* u16! */
-               req_idx = cpu_to_le16(req_offset / ioc->req_sz);
-               mf->u.frame.hwhdr.msgctxu.fld.req_idx = req_idx;
+               req_idx = req_offset / ioc->req_sz;
+               mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(req_idx);
                mf->u.frame.hwhdr.msgctxu.fld.rsvd = 0;
                ioc->RequestNB[req_idx] = ioc->NB_for_64_byte_frame; /* Default, will be changed if necessary in SG generation */
 #ifdef MFCNT
@@ -856,8 +795,8 @@ mpt_put_msg_frame(int handle, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)
        mf->u.frame.hwhdr.msgctxu.fld.cb_idx = handle;          /* byte */
        req_offset = (u8 *)mf - (u8 *)ioc->req_frames;
                                                                /* u16! */
-       req_idx = cpu_to_le16(req_offset / ioc->req_sz);
-       mf->u.frame.hwhdr.msgctxu.fld.req_idx = req_idx;
+       req_idx = req_offset / ioc->req_sz;
+       mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(req_idx);
        mf->u.frame.hwhdr.msgctxu.fld.rsvd = 0;
 
 #ifdef MPT_DEBUG_MSG_FRAME
@@ -1058,7 +997,7 @@ mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp)
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
- *     mptbase_probe - Install a PCI intelligent MPT adapter.
+ *     mpt_attach - Install a PCI intelligent MPT adapter.
  *     @pdev: Pointer to pci_dev structure
  *
  *     This routine performs all the steps necessary to bring the IOC of
@@ -1073,8 +1012,8 @@ mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp)
  *
  *     TODO: Add support for polled controllers
  */
-static int __devinit
-mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+int
+mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        MPT_ADAPTER     *ioc;
        u8              __iomem *mem;
@@ -1084,7 +1023,6 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        u32              psize;
        int              ii;
        int              r = -ENODEV;
-       u64              mask = 0xffffffffffffffffULL;
        u8               revision;
        u8               pcixcmd;
        static int       mpt_ids = 0;
@@ -1097,15 +1035,15 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        
        dinitprintk((KERN_WARNING MYNAM ": mpt_adapter_install\n"));
        
-       if (!pci_set_dma_mask(pdev, mask)) {
+       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
                dprintk((KERN_INFO MYNAM
                        ": 64 BIT PCI BUS DMA ADDRESSING SUPPORTED\n"));
-       } else if (pci_set_dma_mask(pdev, (u64) 0xffffffff)) {
+       } else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
                printk(KERN_WARNING MYNAM ": 32 BIT PCI BUS DMA ADDRESSING NOT SUPPORTED\n");
                return r;
        }
 
-       if (!pci_set_consistent_dma_mask(pdev, mask))
+       if (!pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))
                dprintk((KERN_INFO MYNAM
                        ": Using 64 bit consistent mask\n"));
        else
@@ -1243,6 +1181,16 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                pcixcmd &= 0x8F;
                pci_write_config_byte(pdev, 0x6a, pcixcmd);
        }
+       else if (pdev->device == MPI_MANUFACTPAGE_DEVICEID_FC939X) {
+               ioc->prod_name = "LSIFC939X";
+               ioc->bus_type = FC;
+               ioc->errata_flag_1064 = 1;
+       }
+       else if (pdev->device == MPI_MANUFACTPAGE_DEVICEID_FC949X) {
+               ioc->prod_name = "LSIFC949X";
+               ioc->bus_type = FC;
+               ioc->errata_flag_1064 = 1;
+       }
        else if (pdev->device == MPI_MANUFACTPAGE_DEVID_53C1030) {
                ioc->prod_name = "LSI53C1030";
                ioc->bus_type = SCSI;
@@ -1261,6 +1209,9 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                ioc->bus_type = SCSI;
        }
 
+       if (ioc->errata_flag_1064)
+               pci_disable_io_access(pdev);
+
        sprintf(ioc->name, "ioc%d", ioc->id);
 
        spin_lock_init(&ioc->FreeQlock);
@@ -1303,8 +1254,7 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 #endif
        }
 
-       /* NEW!  20010220 -sralston
-        * Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets.
+       /* Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets.
         */
        mpt_detect_bound_ports(ioc, pdev);
 
@@ -1354,13 +1304,13 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
- *     mptbase_remove - Remove a PCI intelligent MPT adapter.
+ *     mpt_detach - Remove a PCI intelligent MPT adapter.
  *     @pdev: Pointer to pci_dev structure
  *
  */
 
-static void __devexit
-mptbase_remove(struct pci_dev *pdev)
+void
+mpt_detach(struct pci_dev *pdev)
 {
        MPT_ADAPTER     *ioc = pci_get_drvdata(pdev);
        char pname[32];
@@ -1397,43 +1347,21 @@ mptbase_remove(struct pci_dev *pdev)
        pci_set_drvdata(pdev, NULL);
 }
 
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*
- *     mptbase_shutdown -
- *
- */
-static void
-mptbase_shutdown(struct device * dev)
-{
-       int ii;
-
-       /* call per device driver shutdown entry point */
-       for(ii=0; ii<MPT_MAX_PROTOCOL_DRIVERS; ii++) {
-               if(MptDeviceDriverHandlers[ii] &&
-                 MptDeviceDriverHandlers[ii]->shutdown) {
-                       MptDeviceDriverHandlers[ii]->shutdown(dev);
-               }
-       }
-
-}
-
-
 /**************************************************************************
  * Power Management
  */
 #ifdef CONFIG_PM
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
- *     mptbase_suspend - Fusion MPT base driver suspend routine.
+ *     mpt_suspend - Fusion MPT base driver suspend routine.
  *
  *
  */
-static int
-mptbase_suspend(struct pci_dev *pdev, pm_message_t state)
+int
+mpt_suspend(struct pci_dev *pdev, pm_message_t state)
 {
        u32 device_state;
        MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
-       int ii;
 
        switch(state)
        {
@@ -1453,14 +1381,6 @@ mptbase_suspend(struct pci_dev *pdev, pm_message_t state)
        "pci-suspend: pdev=0x%p, slot=%s, Entering operating state [D%d]\n",
                ioc->name, pdev, pci_name(pdev), device_state);
 
-       /* call per device driver suspend entry point */
-       for(ii=0; ii<MPT_MAX_PROTOCOL_DRIVERS; ii++) {
-               if(MptDeviceDriverHandlers[ii] &&
-                 MptDeviceDriverHandlers[ii]->suspend) {
-                       MptDeviceDriverHandlers[ii]->suspend(pdev, state);
-               }
-       }
-
        pci_save_state(pdev);
 
        /* put ioc into READY_STATE */
@@ -1484,18 +1404,18 @@ mptbase_suspend(struct pci_dev *pdev, pm_message_t state)
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
- *     mptbase_resume - Fusion MPT base driver resume routine.
+ *     mpt_resume - Fusion MPT base driver resume routine.
  *
  *
  */
-static int
-mptbase_resume(struct pci_dev *pdev)
+int
+mpt_resume(struct pci_dev *pdev)
 {
        MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
        u32 device_state = pdev->current_state;
        int recovery_state;
        int ii;
-
+       
        printk(MYIOC_s_INFO_FMT
        "pci-resume: pdev=0x%p, slot=%s, Previous operating state [D%d]\n",
                ioc->name, pdev, pci_name(pdev), device_state);
@@ -1533,14 +1453,6 @@ mptbase_resume(struct pci_dev *pdev)
                        "pci-resume: success\n", ioc->name);
        }
 
-       /* call per device driver resume entry point */
-       for(ii=0; ii<MPT_MAX_PROTOCOL_DRIVERS; ii++) {
-               if(MptDeviceDriverHandlers[ii] &&
-                 MptDeviceDriverHandlers[ii]->resume) {
-                       MptDeviceDriverHandlers[ii]->resume(pdev);
-               }
-       }
-
        return 0;
 }
 #endif
@@ -1719,8 +1631,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
                ioc->alt_ioc->active = 1;
        }
 
-       /* NEW!  20010120 -sralston
-        *  Enable MPT base driver management of EventNotification
+       /*  Enable MPT base driver management of EventNotification
         *  and EventAck handling.
         */
        if ((ret == 0) && (!ioc->facts.EventState))
@@ -1729,9 +1640,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
        if (ioc->alt_ioc && alt_ioc_ready && !ioc->alt_ioc->facts.EventState)
                (void) SendEventNotification(ioc->alt_ioc, 1);  /* 1=Enable EventNotification */
 
-       /* (Bugzilla:fibrebugs, #513)
-        * Bug fix (part 2)!  20010905 -sralston
-        *      Add additional "reason" check before call to GetLanConfigPages
+       /*      Add additional "reason" check before call to GetLanConfigPages
         *      (combined with GetIoUnitPage2 call).  This prevents a somewhat
         *      recursive scenario; GetLanConfigPages times out, timer expired
         *      routine calls HardResetHandler, which calls into here again,
@@ -1829,37 +1738,43 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
 static void
 mpt_detect_bound_ports(MPT_ADAPTER *ioc, struct pci_dev *pdev)
 {
-       unsigned int match_lo, match_hi;
+       struct pci_dev *peer=NULL;
+       unsigned int slot = PCI_SLOT(pdev->devfn);
+       unsigned int func = PCI_FUNC(pdev->devfn);
        MPT_ADAPTER *ioc_srch;
 
-       match_lo = pdev->devfn-1;
-       match_hi = pdev->devfn+1;
-       dprintk((MYIOC_s_INFO_FMT "PCI bus/devfn=%x/%x, searching for devfn match on %x or %x\n",
-                       ioc->name, pdev->bus->number, pdev->devfn, match_lo, match_hi));
+       dprintk((MYIOC_s_INFO_FMT "PCI device %s devfn=%x/%x,"
+           " searching for devfn match on %x or %x\n",
+               ioc->name, pci_name(pdev), pdev->devfn,
+               func-1, func+1));
+
+       peer = pci_get_slot(pdev->bus, PCI_DEVFN(slot,func-1));
+       if (!peer) {
+               peer = pci_get_slot(pdev->bus, PCI_DEVFN(slot,func+1));
+               if (!peer)
+                       return;
+       }
 
        list_for_each_entry(ioc_srch, &ioc_list, list) {
                struct pci_dev *_pcidev = ioc_srch->pcidev;
-
-               if ((_pcidev->device == pdev->device) &&
-                   (_pcidev->bus->number == pdev->bus->number) &&
-                   (_pcidev->devfn == match_lo || _pcidev->devfn == match_hi) ) {
+               if (_pcidev == peer) {
                        /* Paranoia checks */
                        if (ioc->alt_ioc != NULL) {
                                printk(KERN_WARNING MYNAM ": Oops, already bound (%s <==> %s)!\n",
-                                               ioc->name, ioc->alt_ioc->name);
+                                       ioc->name, ioc->alt_ioc->name);
                                break;
                        } else if (ioc_srch->alt_ioc != NULL) {
                                printk(KERN_WARNING MYNAM ": Oops, already bound (%s <==> %s)!\n",
-                                               ioc_srch->name, ioc_srch->alt_ioc->name);
+                                       ioc_srch->name, ioc_srch->alt_ioc->name);
                                break;
                        }
                        dprintk((KERN_INFO MYNAM ": FOUND! binding %s <==> %s\n",
-                                       ioc->name, ioc_srch->name));
+                               ioc->name, ioc_srch->name));
                        ioc_srch->alt_ioc = ioc;
                        ioc->alt_ioc = ioc_srch;
-                       break;
                }
        }
+       pci_dev_put(peer);
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -1922,15 +1837,10 @@ mpt_adapter_disable(MPT_ADAPTER *ioc)
                ioc->alloc_total -= sz;
        }
 
-       if (ioc->spi_data.nvram != NULL) {
-               kfree(ioc->spi_data.nvram);
-               ioc->spi_data.nvram = NULL;
-       }
-
-       if (ioc->spi_data.pIocPg3 != NULL) {
-               kfree(ioc->spi_data.pIocPg3);
-               ioc->spi_data.pIocPg3 = NULL;
-       }
+       kfree(ioc->spi_data.nvram);
+       kfree(ioc->spi_data.pIocPg3);
+       ioc->spi_data.nvram = NULL;
+       ioc->spi_data.pIocPg3 = NULL;
 
        if (ioc->spi_data.pIocPg4 != NULL) {
                sz = ioc->spi_data.IocPg4Sz;
@@ -1947,10 +1857,8 @@ mpt_adapter_disable(MPT_ADAPTER *ioc)
                ioc->ReqToChain = NULL;
        }
 
-       if (ioc->ChainToChain != NULL) {
-               kfree(ioc->ChainToChain);
-               ioc->ChainToChain = NULL;
-       }
+       kfree(ioc->ChainToChain);
+       ioc->ChainToChain = NULL;
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -2333,7 +2241,7 @@ GetIocFacts(MPT_ADAPTER *ioc, int sleepFlag, int reason)
                        return -55;
                }
 
-               r = sz = le32_to_cpu(facts->BlockSize);
+               r = sz = facts->BlockSize;
                vv = ((63 / (sz * 4)) + 1) & 0x03;
                ioc->NB_for_64_byte_frame = vv;
                while ( sz )
@@ -2785,7 +2693,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, int sleepFlag)
        /* prevent a second downloadboot and memory free with alt_ioc */
        if (ioc->alt_ioc && ioc->alt_ioc->cached_fw)
                ioc->alt_ioc->cached_fw = NULL;
-       
+
        CHIPREG_WRITE32(&ioc->chip->WriteSequence, 0xFF);
        CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_1ST_KEY_VALUE);
        CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_2ND_KEY_VALUE);
@@ -2843,6 +2751,9 @@ mpt_downloadboot(MPT_ADAPTER *ioc, int sleepFlag)
        /* Write the LoadStartAddress to the DiagRw Address Register
         * using Programmed IO
         */
+       if (ioc->errata_flag_1064)
+               pci_enable_io_access(ioc->pcidev);
+
        CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwAddress, pFwHeader->LoadStartAddress);
        ddlprintk((MYIOC_s_INFO_FMT "LoadStart addr written 0x%x \n",
                ioc->name, pFwHeader->LoadStartAddress));
@@ -2889,6 +2800,9 @@ mpt_downloadboot(MPT_ADAPTER *ioc, int sleepFlag)
        CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwAddress, 0x3F000000);
        CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwData, diagRwData);
 
+       if (ioc->errata_flag_1064)
+               pci_disable_io_access(ioc->pcidev);
+
        diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic);
        ddlprintk((MYIOC_s_INFO_FMT "downloadboot diag0val=%x, turning off PREVENT_IOC_BOOT, DISABLE_ARM\n",
                ioc->name, diag0val));
@@ -4250,7 +4164,7 @@ mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum)
                                if ((ioc->spi_data.busType == MPI_SCSIPORTPAGE0_PHY_SIGNAL_HVD) ||
                                        (ioc->spi_data.busType == MPI_SCSIPORTPAGE0_PHY_SIGNAL_SE))  {
 
-                                       if (ioc->spi_data.minSyncFactor < MPT_ULTRA)
+                               if (ioc->spi_data.minSyncFactor < MPT_ULTRA)
                                                ioc->spi_data.minSyncFactor = MPT_ULTRA;
                                }
                        }
@@ -4482,10 +4396,8 @@ mpt_read_ioc_pg_3(MPT_ADAPTER *ioc)
 
        /* Free the old page
         */
-       if (ioc->spi_data.pIocPg3) {
-               kfree(ioc->spi_data.pIocPg3);
-               ioc->spi_data.pIocPg3 = NULL;
-       }
+       kfree(ioc->spi_data.pIocPg3);
+       ioc->spi_data.pIocPg3 = NULL;
 
        /* There is at least one physical disk.
         * Read and save IOC Page 3
@@ -4753,9 +4665,7 @@ mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg)
        u32              flagsLength;
        int              in_isr;
 
-       /* (Bugzilla:fibrebugs, #513)
-        * Bug fix (part 1)!  20010905 -sralston
-        *      Prevent calling wait_event() (below), if caller happens
+       /*      Prevent calling wait_event() (below), if caller happens
         *      to be in ISR context, because that is fatal!
         */
        in_isr = in_interrupt();
@@ -4861,9 +4771,7 @@ mpt_toolbox(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg)
        u32              flagsLength;
        int              in_isr;
 
-       /* (Bugzilla:fibrebugs, #513)
-        * Bug fix (part 1)!  20010905 -sralston
-        *      Prevent calling wait_event() (below), if caller happens
+       /*      Prevent calling wait_event() (below), if caller happens
         *      to be in ISR context, because that is fatal!
         */
        in_isr = in_interrupt();
@@ -5130,20 +5038,26 @@ static int
 procmpt_version_read(char *buf, char **start, off_t offset, int request, int *eof, void *data)
 {
        int      ii;
-       int      scsi, lan, ctl, targ, dmp;
+       int      scsi, fc, sas, lan, ctl, targ, dmp;
        char    *drvname;
        int      len;
 
        len = sprintf(buf, "%s-%s\n", "mptlinux", MPT_LINUX_VERSION_COMMON);
        len += sprintf(buf+len, "  Fusion MPT base driver\n");
 
-       scsi = lan = ctl = targ = dmp = 0;
+       scsi = fc = sas = lan = ctl = targ = dmp = 0;
        for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) {
                drvname = NULL;
                if (MptCallbacks[ii]) {
                        switch (MptDriverClass[ii]) {
-                       case MPTSCSIH_DRIVER:
-                               if (!scsi++) drvname = "SCSI host";
+                       case MPTSPI_DRIVER:
+                               if (!scsi++) drvname = "SPI host";
+                               break;
+                       case MPTFC_DRIVER:
+                               if (!fc++) drvname = "FC host";
+                               break;
+                       case MPTSAS_DRIVER:
+                               if (!sas++) drvname = "SAS host";
                                break;
                        case MPTLAN_DRIVER:
                                if (!lan++) drvname = "LAN";
@@ -5832,6 +5746,12 @@ mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+EXPORT_SYMBOL(mpt_attach);
+EXPORT_SYMBOL(mpt_detach);
+#ifdef CONFIG_PM
+EXPORT_SYMBOL(mpt_resume);
+EXPORT_SYMBOL(mpt_suspend);
+#endif
 EXPORT_SYMBOL(ioc_list);
 EXPORT_SYMBOL(mpt_proc_root_dir);
 EXPORT_SYMBOL(mpt_register);
@@ -5860,19 +5780,6 @@ EXPORT_SYMBOL(mpt_read_ioc_pg_3);
 EXPORT_SYMBOL(mpt_alloc_fw_memory);
 EXPORT_SYMBOL(mpt_free_fw_memory);
 
-static struct pci_driver mptbase_driver = {
-       .name           = "mptbase",
-       .id_table       = mptbase_pci_table,
-       .probe          = mptbase_probe,
-       .remove         = __devexit_p(mptbase_remove),
-       .driver         = {
-               .shutdown = mptbase_shutdown,
-        },
-#ifdef CONFIG_PM
-       .suspend        = mptbase_suspend,
-       .resume         = mptbase_resume,
-#endif
-};
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
@@ -5884,7 +5791,6 @@ static int __init
 fusion_init(void)
 {
        int i;
-       int r;
 
        show_mptmod_ver(my_NAME, my_VERSION);
        printk(KERN_INFO COPYRIGHT "\n");
@@ -5896,8 +5802,7 @@ fusion_init(void)
                MptResetHandlers[i] = NULL;
        }
 
-       /* NEW!  20010120 -sralston
-        *  Register ourselves (mptbase) in order to facilitate
+       /*  Register ourselves (mptbase) in order to facilitate
         *  EventNotification handling.
         */
        mpt_base_index = mpt_register(mpt_base_reply, MPTBASE_DRIVER);
@@ -5913,11 +5818,7 @@ fusion_init(void)
 #ifdef CONFIG_PROC_FS
        (void) procmpt_create();
 #endif
-       r = pci_register_driver(&mptbase_driver);
-       if(r)
-               return(r);
-
-       return r;
+       return 0;
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -5933,7 +5834,6 @@ fusion_exit(void)
 
        dexitprintk((KERN_INFO MYNAM ": fusion_exit() called!\n"));
 
-       pci_unregister_driver(&mptbase_driver);
        mpt_reset_deregister(mpt_base_index);
 
 #ifdef CONFIG_PROC_FS
@@ -5941,6 +5841,5 @@ fusion_exit(void)
 #endif
 }
 
-
 module_init(fusion_init);
 module_exit(fusion_exit);
index 6d16acc7a179e6e1f8ba83a44cd696a53e0497f8..848fb236b175b94dc8213fc926f8be6a022360b1 100644 (file)
@@ -5,15 +5,9 @@
  *          LSIFC9xx/LSI409xx Fibre Channel
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
- *  Credits:
- *     (see mptbase.c)
- *
- *  Copyright (c) 1999-2004 LSI Logic Corporation
- *  Originally By: Steven J. Ralston
- *  (mailto:sjralston1@netscape.net)
+ *  Copyright (c) 1999-2005 LSI Logic Corporation
  *  (mailto:mpt_linux_developer@lsil.com)
  *
- *  $Id: mptbase.h,v 1.144 2003/01/28 21:31:56 pdelaney Exp $
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
@@ -71,7 +65,6 @@
 #include "lsi/mpi_fc.h"                /* Fibre Channel (lowlevel) support */
 #include "lsi/mpi_targ.h"      /* SCSI/FCP Target protcol support */
 #include "lsi/mpi_tool.h"      /* Tools support */
-#include "lsi/fc_log.h"
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 
 #endif
 
 #ifndef COPYRIGHT
-#define COPYRIGHT      "Copyright (c) 1999-2004 " MODULEAUTHOR
+#define COPYRIGHT      "Copyright (c) 1999-2005 " MODULEAUTHOR
 #endif
 
-#define MPT_LINUX_VERSION_COMMON       "3.01.20"
-#define MPT_LINUX_PACKAGE_NAME         "@(#)mptlinux-3.01.20"
+#define MPT_LINUX_VERSION_COMMON       "3.03.02"
+#define MPT_LINUX_PACKAGE_NAME         "@(#)mptlinux-3.03.02"
 #define WHAT_MAGIC_STRING              "@" "(" "#" ")"
 
 #define show_mptmod_ver(s,ver)  \
 typedef enum {
        MPTBASE_DRIVER,         /* MPT base class */
        MPTCTL_DRIVER,          /* MPT ioctl class */
-       MPTSCSIH_DRIVER,        /* MPT SCSI host (initiator) class */
+       MPTSPI_DRIVER,          /* MPT SPI host class */
+       MPTFC_DRIVER,           /* MPT FC host class */
+       MPTSAS_DRIVER,          /* MPT SAS host class */
        MPTLAN_DRIVER,          /* MPT LAN class */
        MPTSTM_DRIVER,          /* MPT SCSI target mode class */
        MPTUNKNOWN_DRIVER
@@ -212,11 +207,6 @@ typedef enum {
 struct mpt_pci_driver{
        int  (*probe) (struct pci_dev *dev, const struct pci_device_id *id);
        void (*remove) (struct pci_dev *dev);
-       void (*shutdown) (struct device * dev);
-#ifdef CONFIG_PM
-       int  (*resume) (struct pci_dev *dev);
-       int  (*suspend) (struct pci_dev *dev, pm_message_t state);
-#endif
 };
 
 /*
@@ -483,6 +473,7 @@ typedef     struct _ScsiCfgData {
        u8               forceDv;               /* 1 to force DV scheduling */
        u8               noQas;                 /* Disable QAS for this adapter */
        u8               Saf_Te;                /* 1 to force all Processors as SAF-TE if Inquiry data length is too short to check for SAF-TE */
+       u8               mpt_dv;                /* command line option: enhanced=1, basic=0 */
        u8               rsvd[1];
 } ScsiCfgData;
 
@@ -571,11 +562,21 @@ typedef struct _MPT_ADAPTER
        FCPortPage0_t            fc_port_page0[2];
        LANPage0_t               lan_cnfg_page0;
        LANPage1_t               lan_cnfg_page1;
+       /*  
+        * Description: errata_flag_1064
+        * If a PCIX read occurs within 1 or 2 cycles after the chip receives
+        * a split completion for a read data, an internal address pointer incorrectly
+        * increments by 32 bytes
+        */
+       int                      errata_flag_1064;      
        u8                       FirstWhoInit;
        u8                       upload_fw;     /* If set, do a fw upload */
        u8                       reload_fw;     /* Force a FW Reload on next reset */
        u8                       NBShiftFactor;  /* NB Shift Factor based on Block Size (Facts)  */     
        u8                       pad1[4];
+       int                      DoneCtx;
+       int                      TaskCtx;
+       int                      InternalCtx;
        struct list_head         list; 
        struct net_device       *netdev;
 } MPT_ADAPTER;
@@ -773,12 +774,6 @@ typedef struct _mpt_sge {
 #define DBG_DUMP_TM_REPLY_FRAME(mfp)
 #endif
 
-#ifdef MPT_DEBUG_NEH
-#define nehprintk(x) printk x
-#else
-#define nehprintk(x)
-#endif
-
 #if defined(MPT_DEBUG_CONFIG) || defined(MPT_DEBUG)
 #define dcprintk(x) printk x
 #else
@@ -898,6 +893,11 @@ typedef struct _MPT_SCSI_HOST {
        unsigned long             soft_resets;          /* fw/external bus resets count */
        unsigned long             timeouts;             /* cmd timeouts */
        ushort                    sel_timeout[MPT_MAX_FC_DEVICES];
+       char                      *info_kbuf;
+       wait_queue_head_t         scandv_waitq;
+       int                       scandv_wait_done;
+       long                      last_queue_full;
+       u8                        mpt_pq_filter;
 } MPT_SCSI_HOST;
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -931,6 +931,12 @@ typedef struct _x_config_parms {
 /*
  *  Public entry points...
  */
+extern int      mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id);
+extern void     mpt_detach(struct pci_dev *pdev);
+#ifdef CONFIG_PM
+extern int      mpt_suspend(struct pci_dev *pdev, pm_message_t state);
+extern int      mpt_resume(struct pci_dev *pdev);
+#endif
 extern int      mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass);
 extern void     mpt_deregister(int cb_idx);
 extern int      mpt_event_register(int cb_idx, MPT_EVHANDLER ev_cbfunc);
index 70b0cfb5ac5c12956e4afcb171bd528221b821ee..05ea5944c487d7f893c097beee21ef84e0409e50 100644 (file)
@@ -1,40 +1,12 @@
 /*
  *  linux/drivers/message/fusion/mptctl.c
- *      Fusion MPT misc device (ioctl) driver.
- *      For use with PCI chip/adapter(s):
- *          LSIFC9xx/LSI409xx Fibre Channel
+ *      mpt Ioctl driver.
+ *      For use with LSI Logic PCI chip/adapters
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
- *  Credits:
- *      This driver would not exist if not for Alan Cox's development
- *      of the linux i2o driver.
- *
- *      A special thanks to Pamela Delaney (LSI Logic) for tons of work
- *      and countless enhancements while adding support for the 1030
- *      chip family.  Pam has been instrumental in the development of
- *      of the 2.xx.xx series fusion drivers, and her contributions are
- *      far too numerous to hope to list in one place.
- *
- *      A huge debt of gratitude is owed to David S. Miller (DaveM)
- *      for fixing much of the stupid and broken stuff in the early
- *      driver while porting to sparc64 platform.  THANK YOU!
- *
- *      A big THANKS to Eddie C. Dost for fixing the ioctl path
- *      and most importantly f/w download on sparc64 platform!
- *      (plus Eddie's other helpful hints and insights)
- *
- *      Thanks to Arnaldo Carvalho de Melo for finding and patching
- *      a potential memory leak in mptctl_do_fw_download(),
- *      and for some kmalloc insight:-)
- *
- *      (see also mptbase.c)
- *
- *  Copyright (c) 1999-2004 LSI Logic Corporation
- *  Originally By: Steven J. Ralston, Noah Romer
- *  (mailto:sjralston1@netscape.net)
+ *  Copyright (c) 1999-2005 LSI Logic Corporation
  *  (mailto:mpt_linux_developer@lsil.com)
  *
- *  $Id: mptctl.c,v 1.63 2002/12/03 21:26:33 pdelaney Exp $
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
@@ -95,8 +67,8 @@
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_tcq.h>
 
-#define COPYRIGHT      "Copyright (c) 1999-2004 LSI Logic Corporation"
-#define MODULEAUTHOR   "Steven J. Ralston, Noah Romer, Pamela Delaney"
+#define COPYRIGHT      "Copyright (c) 1999-2005 LSI Logic Corporation"
+#define MODULEAUTHOR   "LSI Logic Corporation"
 #include "mptbase.h"
 #include "mptctl.h"
 
@@ -127,14 +99,14 @@ struct buflist {
  * arg contents specific to function.
  */
 static int mptctl_fw_download(unsigned long arg);
-static int mptctl_getiocinfo (unsigned long arg, unsigned int cmd);
-static int mptctl_gettargetinfo (unsigned long arg);
-static int mptctl_readtest (unsigned long arg);
-static int mptctl_mpt_command (unsigned long arg);
-static int mptctl_eventquery (unsigned long arg);
-static int mptctl_eventenable (unsigned long arg);
-static int mptctl_eventreport (unsigned long arg);
-static int mptctl_replace_fw (unsigned long arg);
+static int mptctl_getiocinfo(unsigned long arg, unsigned int cmd);
+static int mptctl_gettargetinfo(unsigned long arg);
+static int mptctl_readtest(unsigned long arg);
+static int mptctl_mpt_command(unsigned long arg);
+static int mptctl_eventquery(unsigned long arg);
+static int mptctl_eventenable(unsigned long arg);
+static int mptctl_eventreport(unsigned long arg);
+static int mptctl_replace_fw(unsigned long arg);
 
 static int mptctl_do_reset(unsigned long arg);
 static int mptctl_hp_hostinfo(unsigned long arg, unsigned int cmd);
@@ -149,11 +121,11 @@ static long compat_mpctl_ioctl(struct file *f, unsigned cmd, unsigned long arg);
 /*
  * Private function calls.
  */
-static int mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr);
+static int mptctl_do_mpt_command(struct mpt_ioctl_command karg, void __user *mfPtr);
 static int mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen);
-static MptSge_t *kbuf_alloc_2_sgl( int bytes, u32 dir, int sge_offset, int *frags,
+static MptSge_t *kbuf_alloc_2_sgl(int bytes, u32 dir, int sge_offset, int *frags,
                struct buflist **blp, dma_addr_t *sglbuf_dma, MPT_ADAPTER *ioc);
-static void kfree_sgl( MptSge_t *sgl, dma_addr_t sgl_dma,
+static void kfree_sgl(MptSge_t *sgl, dma_addr_t sgl_dma,
                struct buflist *buflist, MPT_ADAPTER *ioc);
 static void mptctl_timeout_expired (MPT_IOCTL *ioctl);
 static int  mptctl_bus_reset(MPT_IOCTL *ioctl);
@@ -1119,7 +1091,7 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
        int                     numDevices = 0;
        unsigned int            max_id;
        int                     ii;
-       int                     port;
+       unsigned int            port;
        int                     cim_rev;
        u8                      revision;
 
@@ -1162,9 +1134,7 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
                return -ENODEV;
        }
 
-       /* Verify the data transfer size is correct.
-        * Ignore the port setting.
-        */
+       /* Verify the data transfer size is correct. */
        if (karg->hdr.maxDataSize != data_size) {
                printk(KERN_ERR "%s@%d::mptctl_getiocinfo - "
                        "Structure size mismatch. Command not completed.\n",
@@ -1181,6 +1151,8 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
        else
                karg->adapterType = MPT_IOCTL_INTERFACE_SCSI;
 
+       if (karg->hdr.port > 1)
+               return -EINVAL;
        port = karg->hdr.port;
 
        karg->port = port;
index cc4ecf0382df2c29edf15e5659c5cddcd18d0c5a..28754a9cb8036a93cec4fa962e2e1cbeeb5e98af 100644 (file)
@@ -5,22 +5,9 @@
  *          LSIFC9xx/LSI409xx Fibre Channel
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
- *  Credits:
- *      This driver would not exist if not for Alan Cox's development
- *      of the linux i2o driver.
- *
- *      A huge debt of gratitude is owed to David S. Miller (DaveM)
- *      for fixing much of the stupid and broken stuff in the early
- *      driver while porting to sparc64 platform.  THANK YOU!
- *
- *      (see also mptbase.c)
- *
- *  Copyright (c) 1999-2004 LSI Logic Corporation
- *  Originally By: Steven J. Ralston
- *  (mailto:sjralston1@netscape.net)
+ *  Copyright (c) 1999-2005 LSI Logic Corporation
  *  (mailto:mpt_linux_developer@lsil.com)
  *
- *  $Id: mptctl.h,v 1.13 2002/12/03 21:26:33 pdelaney Exp $
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c
new file mode 100644 (file)
index 0000000..d8d6539
--- /dev/null
@@ -0,0 +1,431 @@
+/*
+ *  linux/drivers/message/fusion/mptfc.c
+ *      For use with LSI Logic PCI chip/adapter(s)
+ *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
+ *
+ *  Copyright (c) 1999-2005 LSI Logic Corporation
+ *  (mailto:mpt_linux_developer@lsil.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; version 2 of the License.
+
+    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.
+
+    NO WARRANTY
+    THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
+    CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
+    LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
+    solely responsible for determining the appropriateness of using and
+    distributing the Program and assumes all risks associated with its
+    exercise of rights under this Agreement, including but not limited to
+    the risks and costs of program errors, damage to or loss of data,
+    programs or equipment, and unavailability or interruption of operations.
+
+    DISCLAIMER OF LIABILITY
+    NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+    DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+    USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+    HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+#include "linux_compat.h"      /* linux-2.6 tweaks */
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/kdev_t.h>
+#include <linux/blkdev.h>
+#include <linux/delay.h>       /* for mdelay */
+#include <linux/interrupt.h>   /* needed for in_interrupt() proto */
+#include <linux/reboot.h>      /* notifier code */
+#include <linux/sched.h>
+#include <linux/workqueue.h>
+
+#include <scsi/scsi.h>
+#include <scsi/scsi_cmnd.h>
+#include <scsi/scsi_device.h>
+#include <scsi/scsi_host.h>
+#include <scsi/scsi_tcq.h>
+
+#include "mptbase.h"
+#include "mptscsih.h"
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+#define my_NAME                "Fusion MPT FC Host driver"
+#define my_VERSION     MPT_LINUX_VERSION_COMMON
+#define MYNAM          "mptfc"
+
+MODULE_AUTHOR(MODULEAUTHOR);
+MODULE_DESCRIPTION(my_NAME);
+MODULE_LICENSE("GPL");
+
+/* Command line args */
+static int mpt_pq_filter = 0;
+module_param(mpt_pq_filter, int, 0);
+MODULE_PARM_DESC(mpt_pq_filter, " Enable peripheral qualifier filter: enable=1  (default=0)");
+
+static int     mptfcDoneCtx = -1;
+static int     mptfcTaskCtx = -1;
+static int     mptfcInternalCtx = -1; /* Used only for internal commands */
+
+static struct device_attribute mptfc_queue_depth_attr = {
+       .attr = {
+               .name =         "queue_depth",
+               .mode =         S_IWUSR,
+       },
+       .store = mptscsih_store_queue_depth,
+};
+
+static struct device_attribute *mptfc_dev_attrs[] = {
+       &mptfc_queue_depth_attr,
+       NULL,
+};
+
+static struct scsi_host_template mptfc_driver_template = {
+       .proc_name                      = "mptfc",
+       .proc_info                      = mptscsih_proc_info,
+       .name                           = "MPT FC Host",
+       .info                           = mptscsih_info,
+       .queuecommand                   = mptscsih_qcmd,
+       .slave_alloc                    = mptscsih_slave_alloc,
+       .slave_configure                = mptscsih_slave_configure,
+       .slave_destroy                  = mptscsih_slave_destroy,
+       .eh_abort_handler               = mptscsih_abort,
+       .eh_device_reset_handler        = mptscsih_dev_reset,
+       .eh_bus_reset_handler           = mptscsih_bus_reset,
+       .eh_host_reset_handler          = mptscsih_host_reset,
+       .bios_param                     = mptscsih_bios_param,
+       .can_queue                      = MPT_FC_CAN_QUEUE,
+       .this_id                        = -1,
+       .sg_tablesize                   = MPT_SCSI_SG_DEPTH,
+       .max_sectors                    = 8192,
+       .cmd_per_lun                    = 7,
+       .use_clustering                 = ENABLE_CLUSTERING,
+       .sdev_attrs                     = mptfc_dev_attrs,
+};
+
+/****************************************************************************
+ * Supported hardware
+ */
+
+static struct pci_device_id mptfc_pci_table[] = {
+       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC909,
+               PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC919,
+               PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC929,
+               PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC919X,
+               PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC929X,
+               PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC939X,
+               PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC949X,
+               PCI_ANY_ID, PCI_ANY_ID },
+       {0}     /* Terminating entry */
+};
+MODULE_DEVICE_TABLE(pci, mptfc_pci_table);
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*
+ *     mptfc_probe - Installs scsi devices per bus.
+ *     @pdev: Pointer to pci_dev structure
+ *
+ *     Returns 0 for success, non-zero for failure.
+ *
+ */
+static int
+mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+{
+       struct Scsi_Host        *sh;
+       MPT_SCSI_HOST           *hd;
+       MPT_ADAPTER             *ioc;
+       unsigned long            flags;
+       int                      sz, ii;
+       int                      numSGE = 0;
+       int                      scale;
+       int                      ioc_cap;
+       u8                      *mem;
+       int                     error=0;
+       int                     r;
+               
+       if ((r = mpt_attach(pdev,id)) != 0)
+               return r;
+       
+       ioc = pci_get_drvdata(pdev);
+       ioc->DoneCtx = mptfcDoneCtx;
+       ioc->TaskCtx = mptfcTaskCtx;
+       ioc->InternalCtx = mptfcInternalCtx;
+
+       /*  Added sanity check on readiness of the MPT adapter.
+        */
+       if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
+               printk(MYIOC_s_WARN_FMT
+                 "Skipping because it's not operational!\n",
+                 ioc->name);
+               return -ENODEV;
+       }
+
+       if (!ioc->active) {
+               printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
+                 ioc->name);
+               return -ENODEV;
+       }
+
+       /*  Sanity check - ensure at least 1 port is INITIATOR capable
+        */
+       ioc_cap = 0;
+       for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
+               if (ioc->pfacts[ii].ProtocolFlags &
+                   MPI_PORTFACTS_PROTOCOL_INITIATOR)
+                       ioc_cap ++;
+       }
+
+       if (!ioc_cap) {
+               printk(MYIOC_s_WARN_FMT
+                       "Skipping ioc=%p because SCSI Initiator mode is NOT enabled!\n",
+                       ioc->name, ioc);
+               return -ENODEV;
+       }
+
+       sh = scsi_host_alloc(&mptfc_driver_template, sizeof(MPT_SCSI_HOST));
+
+       if (!sh) {
+               printk(MYIOC_s_WARN_FMT
+                       "Unable to register controller with SCSI subsystem\n",
+                       ioc->name);
+                return -1;
+        }
+
+       spin_lock_irqsave(&ioc->FreeQlock, flags);
+
+       /* Attach the SCSI Host to the IOC structure
+        */
+       ioc->sh = sh;
+
+       sh->io_port = 0;
+       sh->n_io_port = 0;
+       sh->irq = 0;
+
+       /* set 16 byte cdb's */
+       sh->max_cmd_len = 16;
+
+       sh->max_id = MPT_MAX_FC_DEVICES<256 ? MPT_MAX_FC_DEVICES : 255;
+
+       sh->max_lun = MPT_LAST_LUN + 1;
+       sh->max_channel = 0;
+       sh->this_id = ioc->pfacts[0].PortSCSIID;
+
+       /* Required entry.
+        */
+       sh->unique_id = ioc->id;
+
+       /* Verify that we won't exceed the maximum
+        * number of chain buffers
+        * We can optimize:  ZZ = req_sz/sizeof(SGE)
+        * For 32bit SGE's:
+        *  numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
+        *               + (req_sz - 64)/sizeof(SGE)
+        * A slightly different algorithm is required for
+        * 64bit SGEs.
+        */
+       scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
+       if (sizeof(dma_addr_t) == sizeof(u64)) {
+               numSGE = (scale - 1) *
+                 (ioc->facts.MaxChainDepth-1) + scale +
+                 (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
+                 sizeof(u32));
+       } else {
+               numSGE = 1 + (scale - 1) *
+                 (ioc->facts.MaxChainDepth-1) + scale +
+                 (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
+                 sizeof(u32));
+       }
+
+       if (numSGE < sh->sg_tablesize) {
+               /* Reset this value */
+               dprintk((MYIOC_s_INFO_FMT
+                 "Resetting sg_tablesize to %d from %d\n",
+                 ioc->name, numSGE, sh->sg_tablesize));
+               sh->sg_tablesize = numSGE;
+       }
+
+       /* Set the pci device pointer in Scsi_Host structure.
+        */
+       scsi_set_device(sh, &ioc->pcidev->dev);
+
+       spin_unlock_irqrestore(&ioc->FreeQlock, flags);
+
+       hd = (MPT_SCSI_HOST *) sh->hostdata;
+       hd->ioc = ioc;
+
+       /* SCSI needs scsi_cmnd lookup table!
+        * (with size equal to req_depth*PtrSz!)
+        */
+       sz = ioc->req_depth * sizeof(void *);
+       mem = kmalloc(sz, GFP_ATOMIC);
+       if (mem == NULL) {
+               error = -ENOMEM;
+               goto mptfc_probe_failed;
+       }
+
+       memset(mem, 0, sz);
+       hd->ScsiLookup = (struct scsi_cmnd **) mem;
+
+       dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p, sz=%d\n",
+                ioc->name, hd->ScsiLookup, sz));
+
+       /* Allocate memory for the device structures.
+        * A non-Null pointer at an offset
+        * indicates a device exists.
+        * max_id = 1 + maximum id (hosts.h)
+        */
+       sz = sh->max_id * sizeof(void *);
+       mem = kmalloc(sz, GFP_ATOMIC);
+       if (mem == NULL) {
+               error = -ENOMEM;
+               goto mptfc_probe_failed;
+       }
+
+       memset(mem, 0, sz);
+       hd->Targets = (VirtDevice **) mem;
+
+       dprintk((KERN_INFO
+         "  Targets @ %p, sz=%d\n", hd->Targets, sz));
+
+       /* Clear the TM flags
+        */
+       hd->tmPending = 0;
+       hd->tmState = TM_STATE_NONE;
+       hd->resetPending = 0;
+       hd->abortSCpnt = NULL;
+
+       /* Clear the pointer used to store
+        * single-threaded commands, i.e., those
+        * issued during a bus scan, dv and
+        * configuration pages.
+        */
+       hd->cmdPtr = NULL;
+
+       /* Initialize this SCSI Hosts' timers
+        * To use, set the timer expires field
+        * and add_timer
+        */
+       init_timer(&hd->timer);
+       hd->timer.data = (unsigned long) hd;
+       hd->timer.function = mptscsih_timer_expired;
+
+       hd->mpt_pq_filter = mpt_pq_filter;
+
+       ddvprintk((MYIOC_s_INFO_FMT
+               "mpt_pq_filter %x\n",
+               ioc->name, 
+               mpt_pq_filter));
+
+       init_waitqueue_head(&hd->scandv_waitq);
+       hd->scandv_wait_done = 0;
+       hd->last_queue_full = 0;
+
+       error = scsi_add_host (sh, &ioc->pcidev->dev);
+       if(error) {
+               dprintk((KERN_ERR MYNAM
+                 "scsi_add_host failed\n"));
+               goto mptfc_probe_failed;
+       }
+
+       scsi_scan_host(sh);
+       return 0;
+
+mptfc_probe_failed:
+
+       mptscsih_remove(pdev);
+       return error;
+}
+
+static struct pci_driver mptfc_driver = {
+       .name           = "mptfc",
+       .id_table       = mptfc_pci_table,
+       .probe          = mptfc_probe,
+       .remove         = __devexit_p(mptscsih_remove),
+       .driver         = {
+               .shutdown = mptscsih_shutdown,
+        },
+#ifdef CONFIG_PM
+       .suspend        = mptscsih_suspend,
+       .resume         = mptscsih_resume,
+#endif
+};
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/**
+ *     mptfc_init - Register MPT adapter(s) as SCSI host(s) with
+ *     linux scsi mid-layer.
+ *
+ *     Returns 0 for success, non-zero for failure.
+ */
+static int __init
+mptfc_init(void)
+{
+
+       show_mptmod_ver(my_NAME, my_VERSION);
+
+       mptfcDoneCtx = mpt_register(mptscsih_io_done, MPTFC_DRIVER);
+       mptfcTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTFC_DRIVER);
+       mptfcInternalCtx = mpt_register(mptscsih_scandv_complete, MPTFC_DRIVER);
+
+       if (mpt_event_register(mptfcDoneCtx, mptscsih_event_process) == 0) {
+               devtprintk((KERN_INFO MYNAM
+                 ": Registered for IOC event notifications\n"));
+       }
+
+       if (mpt_reset_register(mptfcDoneCtx, mptscsih_ioc_reset) == 0) {
+               dprintk((KERN_INFO MYNAM
+                 ": Registered for IOC reset notifications\n"));
+       }
+
+       return pci_register_driver(&mptfc_driver);
+}
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/**
+ *     mptfc_exit - Unregisters MPT adapter(s)
+ *
+ */
+static void __exit
+mptfc_exit(void)
+{
+       pci_unregister_driver(&mptfc_driver);
+       
+       mpt_reset_deregister(mptfcDoneCtx);
+       dprintk((KERN_INFO MYNAM
+         ": Deregistered for IOC reset notifications\n"));
+
+       mpt_event_deregister(mptfcDoneCtx);
+       dprintk((KERN_INFO MYNAM
+         ": Deregistered for IOC event notifications\n"));
+
+       mpt_deregister(mptfcInternalCtx);
+       mpt_deregister(mptfcTaskCtx);
+       mpt_deregister(mptfcDoneCtx);
+}
+
+module_init(mptfc_init);
+module_exit(mptfc_exit);
index ef2713b93fab2ff35414fe620edeb5147b1af786..52794be5a95c87a1b0d7f1d5b937e85266bbe97e 100644 (file)
@@ -1,33 +1,11 @@
 /*
  *  linux/drivers/message/fusion/mptlan.c
  *      IP Over Fibre Channel device driver.
- *      For use with PCI chip/adapter(s):
- *          LSIFC9xx/LSI409xx Fibre Channel
+ *      For use with LSI Logic Fibre Channel PCI chip/adapters
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
- *  Credits:
- *      This driver would not exist if not for Alan Cox's development
- *      of the linux i2o driver.
+ *  Copyright (c) 2000-2005 LSI Logic Corporation
  *
- *      Special thanks goes to the I2O LAN driver people at the
- *      University of Helsinki, who, unbeknownst to them, provided
- *      the inspiration and initial structure for this driver.
- *
- *      A huge debt of gratitude is owed to David S. Miller (DaveM)
- *      for fixing much of the stupid and broken stuff in the early
- *      driver while porting to sparc64 platform.  THANK YOU!
- *
- *      A really huge debt of gratitude is owed to Eddie C. Dost
- *      for gobs of hard work fixing and optimizing LAN code.
- *      THANK YOU!
- *
- *      (see also mptbase.c)
- *
- *  Copyright (c) 2000-2004 LSI Logic Corporation
- *  Originally By: Noah Romer
- *  (mailto:mpt_linux_developer@lsil.com)
- *
- *  $Id: mptlan.c,v 1.53 2002/10/17 20:15:58 pdelaney Exp $
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
@@ -221,7 +199,7 @@ lan_reply (MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)
 
                // NOTE!  (Optimization) First case here is now caught in
                //  mptbase.c::mpt_interrupt() routine and callcack here
-               //  is now skipped for this case!  20001218 -sralston
+               //  is now skipped for this case!
 #if 0
                case LAN_REPLY_FORM_MESSAGE_CONTEXT:
 //                     dioprintk((KERN_INFO MYNAM "/lan_reply: "
@@ -234,7 +212,7 @@ lan_reply (MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)
 //                     dioprintk((MYNAM "/lan_reply: "
 //                               "calling mpt_lan_send_reply (turbo)\n"));
 
-                       // Potential BUG here?  -sralston
+                       // Potential BUG here?
                        //      FreeReqFrame = mpt_lan_send_turbo(dev, tmsg);
                        //  If/when mpt_lan_send_turbo would return 1 here,
                        //  calling routine (mptbase.c|mpt_interrupt)
@@ -310,8 +288,7 @@ lan_reply (MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)
 
        case MPI_FUNCTION_EVENT_NOTIFICATION:
        case MPI_FUNCTION_EVENT_ACK:
-               /* UPDATE!  20010120 -sralston
-                *  _EVENT_NOTIFICATION should NOT come down this path any more.
+               /*  _EVENT_NOTIFICATION should NOT come down this path any more.
                 *  Should be routed to mpt_lan_event_process(), but just in case...
                 */
                FreeReqFrame = 1;
@@ -561,8 +538,8 @@ mpt_lan_close(struct net_device *dev)
                }
        }
 
-       kfree (priv->RcvCtl);
-       kfree (priv->mpt_rxfidx);
+       kfree(priv->RcvCtl);
+       kfree(priv->mpt_rxfidx);
 
        for (i = 0; i < priv->tx_max_out; i++) {
                if (priv->SendCtl[i].skb != NULL) {
index 057904260ab18f0e17c0c6885da40bdd7750a261..750e343eb98143bbdd76687dea3d070c705ac8a1 100644 (file)
@@ -1,3 +1,49 @@
+/*
+ *  linux/drivers/message/fusion/mptlan.h
+ *      IP Over Fibre Channel device driver.
+ *      For use with LSI Logic Fibre Channel PCI chip/adapters
+ *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
+ *
+ *  Copyright (c) 2000-2005 LSI Logic Corporation
+ *
+ */
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*
+    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.
+
+    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.
+
+    NO WARRANTY
+    THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
+    CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
+    LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
+    solely responsible for determining the appropriateness of using and
+    distributing the Program and assumes all risks associated with its
+    exercise of rights under this Agreement, including but not limited to
+    the risks and costs of program errors, damage to or loss of data,
+    programs or equipment, and unavailability or interruption of operations.
+
+    DISCLAIMER OF LIABILITY
+    NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+    DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+    USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+    HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+
 /* mptlan.h */
 
 #ifndef LINUX_MPTLAN_H_INCLUDED
@@ -29,7 +75,7 @@
 #include <asm/io.h>
 
     /* Override mptbase.h by pre-defining these! */
-    #define MODULEAUTHOR "Noah Romer, Eddie C. Dost"
+#define MODULEAUTHOR   "LSI Logic Corporation"
 
 #include "mptbase.h"
 
index 3a3ef127df040c6ac6f7cb593223e515d1a2fa3c..a0078ae5b9b84587a0d8ed0de8f78f71755d5fc6 100644 (file)
@@ -1,32 +1,11 @@
 /*
  *  linux/drivers/message/fusion/mptscsih.c
- *      High performance SCSI / Fibre Channel SCSI Host device driver.
- *      For use with PCI chip/adapter(s):
- *          LSIFC9xx/LSI409xx Fibre Channel
+ *      For use with LSI Logic PCI chip/adapter(s)
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
- *  Credits:
- *      This driver would not exist if not for Alan Cox's development
- *      of the linux i2o driver.
- *
- *      A special thanks to Pamela Delaney (LSI Logic) for tons of work
- *      and countless enhancements while adding support for the 1030
- *      chip family.  Pam has been instrumental in the development of
- *      of the 2.xx.xx series fusion drivers, and her contributions are
- *      far too numerous to hope to list in one place.
- *
- *      A huge debt of gratitude is owed to David S. Miller (DaveM)
- *      for fixing much of the stupid and broken stuff in the early
- *      driver while porting to sparc64 platform.  THANK YOU!
- *
- *      (see mptbase.c)
- *
- *  Copyright (c) 1999-2004 LSI Logic Corporation
- *  Original author: Steven J. Ralston
- *  (mailto:sjralston1@netscape.net)
+ *  Copyright (c) 1999-2005 LSI Logic Corporation
  *  (mailto:mpt_linux_developer@lsil.com)
  *
- *  $Id: mptscsih.c,v 1.104 2002/12/03 21:26:34 pdelaney Exp $
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
@@ -96,27 +75,6 @@ MODULE_AUTHOR(MODULEAUTHOR);
 MODULE_DESCRIPTION(my_NAME);
 MODULE_LICENSE("GPL");
 
-/* Command line args */
-static int mpt_dv = MPTSCSIH_DOMAIN_VALIDATION;
-MODULE_PARM(mpt_dv, "i");
-MODULE_PARM_DESC(mpt_dv, " DV Algorithm: enhanced=1, basic=0 (default=MPTSCSIH_DOMAIN_VALIDATION=1)");
-
-static int mpt_width = MPTSCSIH_MAX_WIDTH;
-MODULE_PARM(mpt_width, "i");
-MODULE_PARM_DESC(mpt_width, " Max Bus Width: wide=1, narrow=0 (default=MPTSCSIH_MAX_WIDTH=1)");
-
-static int mpt_factor = MPTSCSIH_MIN_SYNC;
-MODULE_PARM(mpt_factor, "h");
-MODULE_PARM_DESC(mpt_factor, " Min Sync Factor (default=MPTSCSIH_MIN_SYNC=0x08)");
-
-static int mpt_saf_te = MPTSCSIH_SAF_TE;
-MODULE_PARM(mpt_saf_te, "i");
-MODULE_PARM_DESC(mpt_saf_te, " Force enabling SEP Processor: enable=1  (default=MPTSCSIH_SAF_TE=0)");
-
-static int mpt_pq_filter = 0;
-MODULE_PARM(mpt_pq_filter, "i");
-MODULE_PARM_DESC(mpt_pq_filter, " Enable peripheral qualifier filter: enable=1  (default=0)");
-
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 
 typedef struct _BIG_SENSE_BUF {
@@ -169,18 +127,17 @@ typedef struct _dv_parameters {
        u16              pad1;
 } DVPARAMETERS;
 
-
 /*
  *  Other private/forward protos...
  */
-static int     mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r);
+int            mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r);
 static void    mptscsih_report_queue_full(struct scsi_cmnd *sc, SCSIIOReply_t *pScsiReply, SCSIIORequest_t *pScsiReq);
-static int     mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r);
+int            mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r);
 
 static int     mptscsih_AddSGE(MPT_ADAPTER *ioc, struct scsi_cmnd *SCpnt,
                                 SCSIIORequest_t *pReq, int req_idx);
 static void    mptscsih_freeChainBuffers(MPT_ADAPTER *ioc, int req_idx);
-static void    copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR *mf, SCSIIOReply_t *pScsiReply);
+static void    mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR *mf, SCSIIOReply_t *pScsiReply);
 static int     mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd);
 static int     mptscsih_tm_wait_for_completion(MPT_SCSI_HOST * hd, ulong timeout );
 static u32     SCPNT_TO_LOOKUP_IDX(struct scsi_cmnd *sc);
@@ -188,8 +145,8 @@ static u32  SCPNT_TO_LOOKUP_IDX(struct scsi_cmnd *sc);
 static int     mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, int ctx2abort, ulong timeout);
 static int     mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, int ctx2abort, ulong timeout);
 
-static int     mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset);
-static int     mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply);
+int            mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset);
+int            mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply);
 
 static void    mptscsih_initTarget(MPT_SCSI_HOST *hd, int bus_id, int target_id, u8 lun, char *data, int dlen);
 static void    mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtDevice *target, char byte56);
@@ -198,8 +155,7 @@ static void mptscsih_setDevicePage1Flags (u8 width, u8 factor, u8 offset, int *r
 static void    mptscsih_no_negotiate(MPT_SCSI_HOST *hd, int target_id);
 static int     mptscsih_writeSDP1(MPT_SCSI_HOST *hd, int portnum, int target, int flags);
 static int     mptscsih_writeIOCPage4(MPT_SCSI_HOST *hd, int target_id, int bus);
-static int     mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r);
-static void    mptscsih_timer_expired(unsigned long data);
+int            mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r);
 static int     mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *iocmd);
 static int     mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, int portnum);
 
@@ -212,29 +168,14 @@ static int        mptscsih_doDv(MPT_SCSI_HOST *hd, int channel, int target);
 static void    mptscsih_dv_parms(MPT_SCSI_HOST *hd, DVPARAMETERS *dv,void *pPage);
 static void    mptscsih_fillbuf(char *buffer, int size, int index, int width);
 #endif
-/* module entry point */
-static int  __init   mptscsih_init  (void);
-static void __exit   mptscsih_exit  (void);
 
-static int  mptscsih_probe (struct pci_dev *, const struct pci_device_id *);
-static void mptscsih_remove(struct pci_dev *);
-static void mptscsih_shutdown(struct device *);
+void           mptscsih_remove(struct pci_dev *);
+void           mptscsih_shutdown(struct device *);
 #ifdef CONFIG_PM
-static int mptscsih_suspend(struct pci_dev *pdev, pm_message_t state);
-static int mptscsih_resume(struct pci_dev *pdev);
+int            mptscsih_suspend(struct pci_dev *pdev, pm_message_t state);
+int            mptscsih_resume(struct pci_dev *pdev);
 #endif
 
-
-/*
- *     Private data...
- */
-
-static int     mpt_scsi_hosts = 0;
-
-static int     ScsiDoneCtx = -1;
-static int     ScsiTaskCtx = -1;
-static int     ScsiScanDvCtx = -1; /* Used only for bus scan and dv */
-
 #define SNS_LEN(scp)   sizeof((scp)->sense_buffer)
 
 #ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
@@ -244,20 +185,9 @@ static int ScsiScanDvCtx = -1; /* Used only for bus scan and dv */
 static DEFINE_SPINLOCK(dvtaskQ_lock);
 static int dvtaskQ_active = 0;
 static int dvtaskQ_release = 0;
-static struct work_struct      mptscsih_dvTask;
+static struct work_struct      dvTaskQ_task;
 #endif
 
-/*
- * Wait Queue setup
- */
-static DECLARE_WAIT_QUEUE_HEAD (scandv_waitq);
-static int scandv_wait_done = 1;
-
-
-/* Driver command line structure
- */
-static struct scsi_host_template driver_template;
-
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**
  *     mptscsih_add_sge - Place a simple SGE at address pAddr.
@@ -619,7 +549,7 @@ nextSGEset:
  *
  *     Returns 1 indicating alloc'd request frame ptr should be freed.
  */
-static int
+int
 mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
 {
        struct scsi_cmnd        *sc;
@@ -677,8 +607,8 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                        sc->request_bufflen, xfer_cnt));
 
                if (scsi_state & MPI_SCSI_STATE_AUTOSENSE_VALID)
-                       copy_sense_data(sc, hd, mf, pScsiReply);
-                
+                       mptscsih_copy_sense_data(sc, hd, mf, pScsiReply);
+
                /*
                 *  Look for + dump FCP ResponseInfo[]!
                 */
@@ -740,7 +670,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                        }
                        dreplyprintk((KERN_NOTICE "RESIDUAL_MISMATCH: result=%x on id=%d\n", sc->result, sc->target));
                        break;
-               
+
                case MPI_IOCSTATUS_SCSI_DATA_UNDERRUN:          /* 0x0045 */
                        /*
                         *  Do upfront check for valid SenseData and give it
@@ -773,7 +703,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                         */
                        if (scsi_status == MPI_SCSI_STATUS_TASK_SET_FULL)
                                mptscsih_report_queue_full(sc, pScsiReply, pScsiReq);
-                       
+
                        break;
 
                case MPI_IOCSTATUS_SCSI_RECOVERED_ERROR:        /* 0x0040 */
@@ -905,18 +835,16 @@ mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd)
                         * Do OS callback
                         * Free driver resources (chain, msg buffers)
                         */
-                       if (scsi_device_online(SCpnt->device)) {
-                               if (SCpnt->use_sg) {
-                                       pci_unmap_sg(ioc->pcidev,
-                                               (struct scatterlist *) SCpnt->request_buffer,
-                                               SCpnt->use_sg,
-                                               SCpnt->sc_data_direction);
-                               } else if (SCpnt->request_bufflen) {
-                                       pci_unmap_single(ioc->pcidev,
-                                               SCpnt->SCp.dma_handle,
-                                               SCpnt->request_bufflen,
-                                               SCpnt->sc_data_direction);
-                               }
+                       if (SCpnt->use_sg) {
+                               pci_unmap_sg(ioc->pcidev,
+                                       (struct scatterlist *) SCpnt->request_buffer,
+                                       SCpnt->use_sg,
+                                       SCpnt->sc_data_direction);
+                       } else if (SCpnt->request_bufflen) {
+                               pci_unmap_single(ioc->pcidev,
+                                       SCpnt->SCp.dma_handle,
+                                       SCpnt->request_bufflen,
+                                       SCpnt->sc_data_direction);
                        }
                        SCpnt->result = DID_RESET << 16;
                        SCpnt->host_scribble = NULL;
@@ -981,11 +909,6 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, uint target, uint lun)
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*
- *  Hack! It might be nice to report if a device is returning QUEUE_FULL
- *  but maybe not each and every time...
- */
-static long last_queue_full = 0;
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
@@ -1003,280 +926,20 @@ static void
 mptscsih_report_queue_full(struct scsi_cmnd *sc, SCSIIOReply_t *pScsiReply, SCSIIORequest_t *pScsiReq)
 {
        long time = jiffies;
-
-       if (time - last_queue_full > 10 * HZ) {
-               char *ioc_str = "ioc?";
-
-               if (sc->device && sc->device->host != NULL && sc->device->host->hostdata != NULL)
-                       ioc_str = ((MPT_SCSI_HOST *)sc->device->host->hostdata)->ioc->name;
-               dprintk((MYIOC_s_WARN_FMT "Device (%d:%d:%d) reported QUEUE_FULL!\n",
-                               ioc_str, 0, sc->device->id, sc->device->lun));
-               last_queue_full = time;
-       }
-}
-
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-static char *info_kbuf = NULL;
-
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*
- *     mptscsih_probe - Installs scsi devices per bus.
- *     @pdev: Pointer to pci_dev structure
- *
- *     Returns 0 for success, non-zero for failure.
- *
- */
-
-static int
-mptscsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
-{
-       struct Scsi_Host        *sh;
        MPT_SCSI_HOST           *hd;
-       MPT_ADAPTER             *ioc = pci_get_drvdata(pdev);
-       unsigned long            flags;
-       int                      sz, ii;
-       int                      numSGE = 0;
-       int                      scale;
-       int                      ioc_cap;
-       u8                      *mem;
-       int                     error=0;
-
-
-       /* 20010202 -sralston
-        *  Added sanity check on readiness of the MPT adapter.
-        */
-       if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
-               printk(MYIOC_s_WARN_FMT
-                 "Skipping because it's not operational!\n",
-                 ioc->name);
-               return -ENODEV;
-       }
-
-       if (!ioc->active) {
-               printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
-                 ioc->name);
-               return -ENODEV;
-       }
-
-       /*  Sanity check - ensure at least 1 port is INITIATOR capable
-        */
-       ioc_cap = 0;
-       for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
-               if (ioc->pfacts[ii].ProtocolFlags &
-                   MPI_PORTFACTS_PROTOCOL_INITIATOR)
-                       ioc_cap ++;
-       }
-
-       if (!ioc_cap) {
-               printk(MYIOC_s_WARN_FMT
-                       "Skipping ioc=%p because SCSI Initiator mode is NOT enabled!\n",
-                       ioc->name, ioc);
-               return -ENODEV;
-       }
-
-       sh = scsi_host_alloc(&driver_template, sizeof(MPT_SCSI_HOST));
-        
-       if (!sh) {
-               printk(MYIOC_s_WARN_FMT
-                       "Unable to register controller with SCSI subsystem\n",
-                       ioc->name);
-                return -1;
-        }
-       
-       spin_lock_irqsave(&ioc->FreeQlock, flags);
-
-       /* Attach the SCSI Host to the IOC structure
-        */
-       ioc->sh = sh;
-
-       sh->io_port = 0;
-       sh->n_io_port = 0;
-       sh->irq = 0;
-
-       /* set 16 byte cdb's */
-       sh->max_cmd_len = 16;
-
-       /* Yikes!  This is important!
-        * Otherwise, by default, linux
-        * only scans target IDs 0-7!
-        * pfactsN->MaxDevices unreliable
-        * (not supported in early
-        *      versions of the FW).
-        * max_id = 1 + actual max id,
-        * max_lun = 1 + actual last lun,
-        *      see hosts.h :o(
-        */
-       if (ioc->bus_type == SCSI) {
-               sh->max_id = MPT_MAX_SCSI_DEVICES;
-       } else {
-       /* For FC, increase the queue depth
-        * from MPT_SCSI_CAN_QUEUE (31)
-        * to MPT_FC_CAN_QUEUE (63).
-        */
-               sh->can_queue = MPT_FC_CAN_QUEUE;
-               sh->max_id =
-                 MPT_MAX_FC_DEVICES<256 ? MPT_MAX_FC_DEVICES : 255;
-       }
-               
-       sh->max_lun = MPT_LAST_LUN + 1;
-       sh->max_channel = 0;
-       sh->this_id = ioc->pfacts[0].PortSCSIID;
-               
-       /* Required entry.
-        */
-       sh->unique_id = ioc->id;
-
-       /* Verify that we won't exceed the maximum
-        * number of chain buffers
-        * We can optimize:  ZZ = req_sz/sizeof(SGE)
-        * For 32bit SGE's:
-        *  numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
-        *               + (req_sz - 64)/sizeof(SGE)
-        * A slightly different algorithm is required for
-        * 64bit SGEs.
-        */
-       scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
-       if (sizeof(dma_addr_t) == sizeof(u64)) {
-               numSGE = (scale - 1) *
-                 (ioc->facts.MaxChainDepth-1) + scale +
-                 (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
-                 sizeof(u32));
-       } else {
-               numSGE = 1 + (scale - 1) *
-                 (ioc->facts.MaxChainDepth-1) + scale +
-                 (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
-                 sizeof(u32));
-       }
-               
-       if (numSGE < sh->sg_tablesize) {
-               /* Reset this value */
-               dprintk((MYIOC_s_INFO_FMT
-                 "Resetting sg_tablesize to %d from %d\n",
-                 ioc->name, numSGE, sh->sg_tablesize));
-               sh->sg_tablesize = numSGE;
-       }
-
-       /* Set the pci device pointer in Scsi_Host structure.
-        */
-       scsi_set_device(sh, &ioc->pcidev->dev);
-
-       spin_unlock_irqrestore(&ioc->FreeQlock, flags);
-
-       hd = (MPT_SCSI_HOST *) sh->hostdata;
-       hd->ioc = ioc;
-
-       /* SCSI needs scsi_cmnd lookup table!
-        * (with size equal to req_depth*PtrSz!)
-        */
-       sz = ioc->req_depth * sizeof(void *);
-       mem = kmalloc(sz, GFP_ATOMIC);
-       if (mem == NULL) {
-               error = -ENOMEM;
-               goto mptscsih_probe_failed;
-       }
-
-       memset(mem, 0, sz);
-       hd->ScsiLookup = (struct scsi_cmnd **) mem;
-
-       dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p, sz=%d\n",
-                ioc->name, hd->ScsiLookup, sz));
-               
-       /* Allocate memory for the device structures.
-        * A non-Null pointer at an offset
-        * indicates a device exists.
-        * max_id = 1 + maximum id (hosts.h)
-        */
-       sz = sh->max_id * sizeof(void *);
-       mem = kmalloc(sz, GFP_ATOMIC);
-       if (mem == NULL) {
-               error = -ENOMEM;
-               goto mptscsih_probe_failed;
-       }
-
-       memset(mem, 0, sz);
-       hd->Targets = (VirtDevice **) mem;
-
-       dprintk((KERN_INFO
-         "  Targets @ %p, sz=%d\n", hd->Targets, sz));
-
-       /* Clear the TM flags
-        */
-       hd->tmPending = 0;
-       hd->tmState = TM_STATE_NONE;
-       hd->resetPending = 0;
-       hd->abortSCpnt = NULL;
-
-       /* Clear the pointer used to store
-        * single-threaded commands, i.e., those
-        * issued during a bus scan, dv and
-        * configuration pages.
-        */
-       hd->cmdPtr = NULL;
 
-       /* Initialize this SCSI Hosts' timers
-        * To use, set the timer expires field
-        * and add_timer
-        */
-       init_timer(&hd->timer);
-       hd->timer.data = (unsigned long) hd;
-       hd->timer.function = mptscsih_timer_expired;
-
-       if (ioc->bus_type == SCSI) {
-               /* Update with the driver setup
-                * values.
-                */
-               if (ioc->spi_data.maxBusWidth > mpt_width)
-                       ioc->spi_data.maxBusWidth = mpt_width;
-               if (ioc->spi_data.minSyncFactor < mpt_factor)
-                       ioc->spi_data.minSyncFactor = mpt_factor;
-
-               if (ioc->spi_data.minSyncFactor == MPT_ASYNC) {
-                       ioc->spi_data.maxSyncOffset = 0;
-               }
-
-               ioc->spi_data.Saf_Te = mpt_saf_te;
-
-               hd->negoNvram = 0;
-#ifndef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
-               hd->negoNvram = MPT_SCSICFG_USE_NVRAM;
-#endif
-               ioc->spi_data.forceDv = 0;
-               ioc->spi_data.noQas = 0;
-               for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) {
-                       ioc->spi_data.dvStatus[ii] =
-                         MPT_SCSICFG_NEGOTIATE;
-               }
-
-               for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++)
-                       ioc->spi_data.dvStatus[ii] |=
-                         MPT_SCSICFG_DV_NOT_DONE;
-
-               dinitprintk((MYIOC_s_INFO_FMT
-                       "dv %x width %x factor %x saf_te %x\n",
-                       ioc->name, mpt_dv,
-                       mpt_width,
-                       mpt_factor,
-                       mpt_saf_te));
-       }
-
-       mpt_scsi_hosts++;
+       if (sc->device == NULL)
+               return;
+       if (sc->device->host == NULL)
+               return;
+       if ((hd = (MPT_SCSI_HOST *)sc->device->host->hostdata) == NULL)
+               return;
 
-       error = scsi_add_host (sh, &ioc->pcidev->dev);
-       if(error) {
-               dprintk((KERN_ERR MYNAM
-                 "scsi_add_host failed\n"));
-               goto mptscsih_probe_failed;
+       if (time - hd->last_queue_full > 10 * HZ) {
+               dprintk((MYIOC_s_WARN_FMT "Device (%d:%d:%d) reported QUEUE_FULL!\n",
+                               hd->ioc->name, 0, sc->device->id, sc->device->lun));
+               hd->last_queue_full = time;
        }
-
-       scsi_scan_host(sh);
-       return 0;
-
-mptscsih_probe_failed:
-
-       mptscsih_remove(pdev);
-       return error;
-
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -1286,7 +949,7 @@ mptscsih_probe_failed:
  *
  *
  */
-static void
+void
 mptscsih_remove(struct pci_dev *pdev)
 {
        MPT_ADAPTER             *ioc = pci_get_drvdata(pdev);
@@ -1294,12 +957,16 @@ mptscsih_remove(struct pci_dev *pdev)
        MPT_SCSI_HOST           *hd;
        int                     count;
        unsigned long           flags;
+       int sz1;
 
        if(!host)
                return;
 
        scsi_remove_host(host);
 
+       if((hd = (MPT_SCSI_HOST *)host->hostdata) == NULL)
+               return;
+
 #ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
        /* Check DV thread active */
        count = 10 * HZ;
@@ -1321,40 +988,36 @@ mptscsih_remove(struct pci_dev *pdev)
 #endif
 #endif
 
-       hd = (MPT_SCSI_HOST *)host->hostdata;
-       if (hd != NULL) {
-               int sz1;
+       mptscsih_shutdown(&pdev->dev);
 
-               mptscsih_shutdown(&pdev->dev);
+       sz1=0;
 
-               sz1=0;
+       if (hd->ScsiLookup != NULL) {
+               sz1 = hd->ioc->req_depth * sizeof(void *);
+               kfree(hd->ScsiLookup);
+               hd->ScsiLookup = NULL;
+       }
 
-               if (hd->ScsiLookup != NULL) {
-                       sz1 = hd->ioc->req_depth * sizeof(void *);
-                       kfree(hd->ScsiLookup);
-                       hd->ScsiLookup = NULL;
-               }
+       /*
+        * Free pointer array.
+        */
+       kfree(hd->Targets);
+       hd->Targets = NULL;
 
-               if (hd->Targets != NULL) {
-                       /*
-                        * Free pointer array.
-                        */
-                       kfree(hd->Targets);
-                       hd->Targets = NULL;
-               }
+       dprintk((MYIOC_s_INFO_FMT
+           "Free'd ScsiLookup (%d) memory\n",
+           hd->ioc->name, sz1));
 
-               dprintk((MYIOC_s_INFO_FMT 
-                   "Free'd ScsiLookup (%d) memory\n",
-                   hd->ioc->name, sz1));
+       kfree(hd->info_kbuf);
 
-               /* NULL the Scsi_Host pointer
-                */
-               hd->ioc->sh = NULL;
-       }
+       /* NULL the Scsi_Host pointer
+        */
+       hd->ioc->sh = NULL;
 
        scsi_host_put(host);
-       mpt_scsi_hosts--;
 
+       mpt_detach(pdev);
+       
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -1362,7 +1025,7 @@ mptscsih_remove(struct pci_dev *pdev)
  *     mptscsih_shutdown - reboot notifier
  *
  */
-static void
+void
 mptscsih_shutdown(struct device * dev)
 {
        MPT_ADAPTER             *ioc = pci_get_drvdata(to_pci_dev(dev));
@@ -1384,15 +1047,15 @@ mptscsih_shutdown(struct device * dev)
 #ifdef CONFIG_PM
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
- *     mptscsih_suspend - Fusion MPT scsie driver suspend routine.
+ *     mptscsih_suspend - Fusion MPT scsi driver suspend routine.
  *
  *
  */
-static int
+int
 mptscsih_suspend(struct pci_dev *pdev, pm_message_t state)
 {
        mptscsih_shutdown(&pdev->dev);
-       return 0;
+       return mpt_suspend(pdev,state);
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -1401,13 +1064,15 @@ mptscsih_suspend(struct pci_dev *pdev, pm_message_t state)
  *
  *
  */
-static int
+int
 mptscsih_resume(struct pci_dev *pdev)
 {
        MPT_ADAPTER             *ioc = pci_get_drvdata(pdev);
        struct Scsi_Host        *host = ioc->sh;
        MPT_SCSI_HOST           *hd;
 
+       mpt_resume(pdev);
+       
        if(!host)
                return 0;
 
@@ -1422,9 +1087,9 @@ mptscsih_resume(struct pci_dev *pdev)
        if (!dvtaskQ_active) {
                dvtaskQ_active = 1;
                spin_unlock_irqrestore(&dvtaskQ_lock, lflags);
-               INIT_WORK(&mptscsih_dvTask,
+               INIT_WORK(&dvTaskQ_task,
                  mptscsih_domainValidation, (void *) hd);
-               schedule_work(&mptscsih_dvTask);
+               schedule_work(&dvTaskQ_task);
        } else {
                spin_unlock_irqrestore(&dvtaskQ_lock, lflags);
        }
@@ -1435,82 +1100,6 @@ mptscsih_resume(struct pci_dev *pdev)
 
 #endif
 
-static struct mpt_pci_driver mptscsih_driver = {
-       .probe          = mptscsih_probe,
-       .remove         = mptscsih_remove,
-       .shutdown       = mptscsih_shutdown,
-#ifdef CONFIG_PM
-       .suspend        = mptscsih_suspend,
-       .resume         = mptscsih_resume,
-#endif
-};
-
-/*  SCSI host fops start here...  */
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/**
- *     mptscsih_init - Register MPT adapter(s) as SCSI host(s) with
- *     linux scsi mid-layer.
- *
- *     Returns 0 for success, non-zero for failure.
- */
-static int __init
-mptscsih_init(void)
-{
-
-       show_mptmod_ver(my_NAME, my_VERSION);
-
-       ScsiDoneCtx = mpt_register(mptscsih_io_done, MPTSCSIH_DRIVER);
-       ScsiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSCSIH_DRIVER);
-       ScsiScanDvCtx = mpt_register(mptscsih_scandv_complete, MPTSCSIH_DRIVER);
-
-       if (mpt_event_register(ScsiDoneCtx, mptscsih_event_process) == 0) {
-               devtprintk((KERN_INFO MYNAM
-                 ": Registered for IOC event notifications\n"));
-       }
-
-       if (mpt_reset_register(ScsiDoneCtx, mptscsih_ioc_reset) == 0) {
-               dprintk((KERN_INFO MYNAM
-                 ": Registered for IOC reset notifications\n"));
-       }
-
-       if(mpt_device_driver_register(&mptscsih_driver,
-         MPTSCSIH_DRIVER) != 0 ) {
-               dprintk((KERN_INFO MYNAM
-               ": failed to register dd callbacks\n"));
-       }
-
-       return 0;
-
-}
-
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/**
- *     mptscsih_exit - Unregisters MPT adapter(s)
- *
- */
-static void __exit
-mptscsih_exit(void)
-{
-       mpt_device_driver_deregister(MPTSCSIH_DRIVER);
-
-       mpt_reset_deregister(ScsiDoneCtx);
-       dprintk((KERN_INFO MYNAM
-         ": Deregistered for IOC reset notifications\n"));
-
-       mpt_event_deregister(ScsiDoneCtx);
-       dprintk((KERN_INFO MYNAM
-         ": Deregistered for IOC event notifications\n"));
-
-       mpt_deregister(ScsiScanDvCtx);
-       mpt_deregister(ScsiTaskCtx);
-       mpt_deregister(ScsiDoneCtx);
-
-       if (info_kbuf != NULL)
-               kfree(info_kbuf);
-
-}
-
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**
  *     mptscsih_info - Return information about MPT adapter
@@ -1520,24 +1109,25 @@ mptscsih_exit(void)
  *
  *     Returns pointer to buffer where information was written.
  */
-static const char *
+const char *
 mptscsih_info(struct Scsi_Host *SChost)
 {
        MPT_SCSI_HOST *h;
        int size = 0;
 
-       if (info_kbuf == NULL)
-               if ((info_kbuf = kmalloc(0x1000 /* 4Kb */, GFP_KERNEL)) == NULL)
-                       return info_kbuf;
-
        h = (MPT_SCSI_HOST *)SChost->hostdata;
-       info_kbuf[0] = '\0';
+
        if (h) {
-               mpt_print_ioc_summary(h->ioc, info_kbuf, &size, 0, 0);
-               info_kbuf[size-1] = '\0';
+               if (h->info_kbuf == NULL)
+                       if ((h->info_kbuf = kmalloc(0x1000 /* 4Kb */, GFP_KERNEL)) == NULL)
+                               return h->info_kbuf;
+               h->info_kbuf[0] = '\0';
+
+               mpt_print_ioc_summary(h->ioc, h->info_kbuf, &size, 0, 0);
+               h->info_kbuf[size-1] = '\0';
        }
 
-       return info_kbuf;
+       return h->info_kbuf;
 }
 
 struct info_str {
@@ -1547,7 +1137,8 @@ struct info_str {
        int   pos;
 };
 
-static void copy_mem_info(struct info_str *info, char *data, int len)
+static void
+mptscsih_copy_mem_info(struct info_str *info, char *data, int len)
 {
        if (info->pos + len > info->length)
                len = info->length - info->pos;
@@ -1568,7 +1159,8 @@ static void copy_mem_info(struct info_str *info, char *data, int len)
        }
 }
 
-static int copy_info(struct info_str *info, char *fmt, ...)
+static int
+mptscsih_copy_info(struct info_str *info, char *fmt, ...)
 {
        va_list args;
        char buf[81];
@@ -1578,11 +1170,12 @@ static int copy_info(struct info_str *info, char *fmt, ...)
        len = vsprintf(buf, fmt, args);
        va_end(args);
 
-       copy_mem_info(info, buf, len);
+       mptscsih_copy_mem_info(info, buf, len);
        return len;
 }
 
-static int mptscsih_host_info(MPT_ADAPTER *ioc, char *pbuf, off_t offset, int len)
+static int
+mptscsih_host_info(MPT_ADAPTER *ioc, char *pbuf, off_t offset, int len)
 {
        struct info_str info;
 
@@ -1591,10 +1184,10 @@ static int mptscsih_host_info(MPT_ADAPTER *ioc, char *pbuf, off_t offset, int le
        info.offset     = offset;
        info.pos        = 0;
 
-       copy_info(&info, "%s: %s, ", ioc->name, ioc->prod_name);
-       copy_info(&info, "%s%08xh, ", MPT_FW_REV_MAGIC_ID_STRING, ioc->facts.FWVersion.Word);
-       copy_info(&info, "Ports=%d, ", ioc->facts.NumberOfPorts);
-       copy_info(&info, "MaxQ=%d\n", ioc->req_depth);
+       mptscsih_copy_info(&info, "%s: %s, ", ioc->name, ioc->prod_name);
+       mptscsih_copy_info(&info, "%s%08xh, ", MPT_FW_REV_MAGIC_ID_STRING, ioc->facts.FWVersion.Word);
+       mptscsih_copy_info(&info, "Ports=%d, ", ioc->facts.NumberOfPorts);
+       mptscsih_copy_info(&info, "MaxQ=%d\n", ioc->req_depth);
 
        return ((info.pos > info.offset) ? info.pos - info.offset : 0);
 }
@@ -1612,7 +1205,7 @@ static int mptscsih_host_info(MPT_ADAPTER *ioc, char *pbuf, off_t offset, int le
  *     hostno: scsi host number
  *     func:   if write = 1; if read = 0
  */
-static int
+int
 mptscsih_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
                        int length, int func)
 {
@@ -1649,7 +1242,7 @@ mptscsih_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t off
  *
  *     Returns 0. (rtn value discarded by linux scsi mid-layer)
  */
-static int
+int
 mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
 {
        MPT_SCSI_HOST           *hd;
@@ -1684,7 +1277,7 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
        /*
         *  Put together a MPT SCSI request...
         */
-       if ((mf = mpt_get_msg_frame(ScsiDoneCtx, hd->ioc)) == NULL) {
+       if ((mf = mpt_get_msg_frame(hd->ioc->DoneCtx, hd->ioc)) == NULL) {
                dprintk((MYIOC_s_WARN_FMT "QueueCmd, no msg frames!!\n",
                                hd->ioc->name));
                return SCSI_MLQUEUE_HOST_BUSY;
@@ -1696,8 +1289,7 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
 
        ADD_INDEX_LOG(my_idx);
 
-       /*  BUG FIX!  19991030 -sralston
-        *    TUR's being issued with scsictl=0x02000000 (DATA_IN)!
+       /*    TUR's being issued with scsictl=0x02000000 (DATA_IN)!
         *    Seems we may receive a buffer (datalen>0) even when there
         *    will be no data transfer!  GRRRRR...
         */
@@ -1791,9 +1383,9 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
                                if (!dvtaskQ_active) {
                                        dvtaskQ_active = 1;
                                        spin_unlock_irqrestore(&dvtaskQ_lock, lflags);
-                                       INIT_WORK(&mptscsih_dvTask, mptscsih_domainValidation, (void *) hd);
+                                       INIT_WORK(&dvTaskQ_task, mptscsih_domainValidation, (void *) hd);
 
-                                       schedule_work(&mptscsih_dvTask);
+                                       schedule_work(&dvTaskQ_task);
                                } else {
                                        spin_unlock_irqrestore(&dvtaskQ_lock, lflags);
                                }
@@ -1819,7 +1411,7 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
        }
 #endif
 
-       mpt_put_msg_frame(ScsiDoneCtx, hd->ioc, mf);
+       mpt_put_msg_frame(hd->ioc->DoneCtx, hd->ioc, mf);
        dmfprintk((MYIOC_s_INFO_FMT "Issued SCSI cmd (%p) mf=%p idx=%d\n",
                        hd->ioc->name, SCpnt, mf, my_idx));
        DBG_DUMP_REQUEST_FRAME(mf)
@@ -2036,7 +1628,7 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun
 
        /* Return Fail to calling function if no message frames available.
         */
-       if ((mf = mpt_get_msg_frame(ScsiTaskCtx, hd->ioc)) == NULL) {
+       if ((mf = mpt_get_msg_frame(hd->ioc->TaskCtx, hd->ioc)) == NULL) {
                dfailprintk((MYIOC_s_ERR_FMT "IssueTaskMgmt, no msg frames!!\n",
                                hd->ioc->name));
                //return FAILED;
@@ -2075,7 +1667,7 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun
 
        DBG_DUMP_TM_REQUEST_FRAME((u32 *)pScsiTm);
 
-       if ((retval = mpt_send_handshake_request(ScsiTaskCtx, hd->ioc,
+       if ((retval = mpt_send_handshake_request(hd->ioc->TaskCtx, hd->ioc,
                sizeof(SCSITaskMgmt_t), (u32*)pScsiTm,
                CAN_SLEEP)) != 0) {
                dfailprintk((MYIOC_s_ERR_FMT "_send_handshake FAILED!"
@@ -2107,7 +1699,7 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun
  *
  *     Returns SUCCESS or FAILED.
  */
-static int
+int
 mptscsih_abort(struct scsi_cmnd * SCpnt)
 {
        MPT_SCSI_HOST   *hd;
@@ -2115,7 +1707,6 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
        MPT_FRAME_HDR   *mf;
        u32              ctx2abort;
        int              scpnt_idx;
-       spinlock_t      *host_lock = SCpnt->device->host->host_lock;
 
        /* If we can't locate our host adapter structure, return FAILED status.
         */
@@ -2163,7 +1754,6 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
 
        hd->abortSCpnt = SCpnt;
 
-       spin_unlock_irq(host_lock);
        if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK,
                SCpnt->device->channel, SCpnt->device->id, SCpnt->device->lun,
                ctx2abort, 2 /* 2 second timeout */)
@@ -2180,8 +1770,6 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
                hd->tmPending = 0;
                hd->tmState = TM_STATE_NONE;
 
-               spin_lock_irq(host_lock);
-
                /* Unmap the DMA buffers, if any. */
                if (SCpnt->use_sg) {
                        pci_unmap_sg(ioc->pcidev, (struct scatterlist *) SCpnt->request_buffer,
@@ -2197,7 +1785,6 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
                mpt_free_msg_frame(ioc, mf);
                return FAILED;
        }
-       spin_lock_irq(host_lock);
        return SUCCESS;
 }
 
@@ -2210,11 +1797,10 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
  *
  *     Returns SUCCESS or FAILED.
  */
-static int
+int
 mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
 {
        MPT_SCSI_HOST   *hd;
-       spinlock_t      *host_lock = SCpnt->device->host->host_lock;
 
        /* If we can't locate our host adapter structure, return FAILED status.
         */
@@ -2231,7 +1817,6 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
        printk(KERN_WARNING MYNAM ": %s: >> Attempting target reset! (sc=%p)\n",
               hd->ioc->name, SCpnt);
 
-       spin_unlock_irq(host_lock);
        if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET,
                SCpnt->device->channel, SCpnt->device->id,
                0, 0, 5 /* 5 second timeout */)
@@ -2243,12 +1828,10 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
                                hd->ioc->name, SCpnt);
                hd->tmPending = 0;
                hd->tmState = TM_STATE_NONE;
-               spin_lock_irq(host_lock);
                return FAILED;
        }
-       spin_lock_irq(host_lock);
-       return SUCCESS;
 
+       return SUCCESS;
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -2260,7 +1843,7 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
  *
  *     Returns SUCCESS or FAILED.
  */
-static int
+int
 mptscsih_bus_reset(struct scsi_cmnd * SCpnt)
 {
        MPT_SCSI_HOST   *hd;
@@ -2282,7 +1865,6 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt)
                hd->timeouts++;
 
        /* We are now ready to execute the task management request. */
-       spin_unlock_irq(host_lock);
        if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
                SCpnt->device->channel, 0, 0, 0, 5 /* 5 second timeout */)
            < 0){
@@ -2298,7 +1880,7 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt)
                spin_lock_irq(host_lock);
                return FAILED;
        }
-       spin_lock_irq(host_lock);
+
        return SUCCESS;
 }
 
@@ -2312,12 +1894,11 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt)
  *
  *     Returns SUCCESS or FAILED.
  */
-static int
+int
 mptscsih_host_reset(struct scsi_cmnd *SCpnt)
 {
        MPT_SCSI_HOST *  hd;
        int              status = SUCCESS;
-       spinlock_t      *host_lock = SCpnt->device->host->host_lock;
 
        /*  If we can't locate the host to reset, then we failed. */
        if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){
@@ -2333,7 +1914,6 @@ mptscsih_host_reset(struct scsi_cmnd *SCpnt)
        /*  If our attempts to reset the host failed, then return a failed
         *  status.  The host will be taken off line by the SCSI mid-layer.
         */
-       spin_unlock_irq(host_lock);
        if (mpt_HardResetHandler(hd->ioc, CAN_SLEEP) < 0){
                status = FAILED;
        } else {
@@ -2343,8 +1923,6 @@ mptscsih_host_reset(struct scsi_cmnd *SCpnt)
                hd->tmPending = 0;
                hd->tmState = TM_STATE_NONE;
        }
-       spin_lock_irq(host_lock);
-
 
        dtmprintk( ( KERN_WARNING MYNAM ": mptscsih_host_reset: "
                     "Status = %s\n",
@@ -2426,7 +2004,7 @@ mptscsih_tm_wait_for_completion(MPT_SCSI_HOST * hd, ulong timeout )
  *
  *     Returns 1 indicating alloc'd request frame ptr should be freed.
  */
-static int
+int
 mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
 {
        SCSITaskMgmtReply_t     *pScsiTmReply;
@@ -2509,7 +2087,7 @@ mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *m
 /*
  *     This is anyones guess quite frankly.
  */
-static int
+int
 mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev,
                sector_t capacity, int geom[])
 {
@@ -2556,7 +2134,7 @@ mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev,
  *     Return non-zero if allocation fails.
  *     Init memory once per id (not LUN).
  */
-static int
+int
 mptscsih_slave_alloc(struct scsi_device *device)
 {
        struct Scsi_Host        *host = device->host;
@@ -2599,7 +2177,8 @@ mptscsih_slave_alloc(struct scsi_device *device)
        return 0;
 }
 
-static int mptscsih_is_raid_volume(MPT_SCSI_HOST *hd, uint id)
+static int 
+mptscsih_is_raid_volume(MPT_SCSI_HOST *hd, uint id)
 {
        int i;
 
@@ -2618,7 +2197,7 @@ static int mptscsih_is_raid_volume(MPT_SCSI_HOST *hd, uint id)
  *     OS entry point to allow for host driver to free allocated memory
  *     Called if no device present or device being unloaded
  */
-static void
+void
 mptscsih_slave_destroy(struct scsi_device *device)
 {
        struct Scsi_Host        *host = device->host;
@@ -2639,7 +2218,7 @@ mptscsih_slave_destroy(struct scsi_device *device)
 
        kfree(hd->Targets[target]);
        hd->Targets[target] = NULL;
-       
+
        if (hd->ioc->bus_type == SCSI) {
                if (mptscsih_is_raid_volume(hd, target)) {
                        hd->ioc->spi_data.forceDv |= MPT_SCSICFG_RELOAD_IOC_PG3;
@@ -2695,7 +2274,7 @@ mptscsih_set_queue_depth(struct scsi_device *device, MPT_SCSI_HOST *hd,
  *     member to 1 if a device does not support Q tags.
  *     Return non-zero if fails.
  */
-static int
+int
 mptscsih_slave_configure(struct scsi_device *device)
 {
        struct Scsi_Host        *sh = device->host;
@@ -2758,8 +2337,8 @@ slave_configure_exit:
        return 0;
 }
 
-static ssize_t
-mptscsih_store_queue_depth(struct device *dev, const char *buf, size_t count)
+ssize_t
+mptscsih_store_queue_depth(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        int                      depth;
        struct scsi_device      *sdev = to_scsi_device(dev);
@@ -2788,7 +2367,7 @@ mptscsih_store_queue_depth(struct device *dev, const char *buf, size_t count)
  *
  */
 static void
-copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR *mf, SCSIIOReply_t *pScsiReply)
+mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR *mf, SCSIIOReply_t *pScsiReply)
 {
        VirtDevice      *target;
        SCSIIORequest_t *pReq;
@@ -2854,7 +2433,7 @@ SCPNT_TO_LOOKUP_IDX(struct scsi_cmnd *sc)
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-static int
+int
 mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
 {
        MPT_SCSI_HOST   *hd;
@@ -2949,8 +2528,8 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
                         */
                        hd->pLocal = &hd->localReply;
                        hd->pLocal->completion = MPT_SCANDV_DID_RESET;
-                       scandv_wait_done = 1;
-                       wake_up(&scandv_waitq);
+                       hd->scandv_wait_done = 1;
+                       wake_up(&hd->scandv_waitq);
                        hd->cmdPtr = NULL;
                }
 
@@ -2969,7 +2548,7 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-static int
+int
 mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
 {
        MPT_SCSI_HOST *hd;
@@ -3085,42 +2664,6 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
        return 1;               /* currently means nothing really */
 }
 
-static struct device_attribute mptscsih_queue_depth_attr = {
-       .attr = {
-               .name =         "queue_depth",
-               .mode =         S_IWUSR,
-       },
-       .store = mptscsih_store_queue_depth,
-};
-
-static struct device_attribute *mptscsih_dev_attrs[] = {
-       &mptscsih_queue_depth_attr,
-       NULL,
-};
-
-static struct scsi_host_template driver_template = {
-       .proc_name                      = "mptscsih",
-       .proc_info                      = mptscsih_proc_info,
-       .name                           = "MPT SCSI Host",
-       .info                           = mptscsih_info,
-       .queuecommand                   = mptscsih_qcmd,
-       .slave_alloc                    = mptscsih_slave_alloc,
-       .slave_configure                = mptscsih_slave_configure,
-       .slave_destroy                  = mptscsih_slave_destroy,
-       .eh_abort_handler               = mptscsih_abort,
-       .eh_device_reset_handler        = mptscsih_dev_reset,
-       .eh_bus_reset_handler           = mptscsih_bus_reset,
-       .eh_host_reset_handler          = mptscsih_host_reset,
-       .bios_param                     = mptscsih_bios_param,
-       .can_queue                      = MPT_SCSI_CAN_QUEUE,
-       .this_id                        = -1,
-       .sg_tablesize                   = MPT_SCSI_SG_DEPTH,
-       .max_sectors                    = 8192,
-       .cmd_per_lun                    = 7,
-       .use_clustering                 = ENABLE_CLUSTERING,
-       .sdev_attrs                     = mptscsih_dev_attrs,
-};
-
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
  *     mptscsih_initTarget - Target, LUN alloc/free functionality.
@@ -3158,9 +2701,9 @@ mptscsih_initTarget(MPT_SCSI_HOST *hd, int bus_id, int target_id, u8 lun, char *
         * around a bug in th emid-layer in some distributions in which the mid-layer will
         * continue to try to communicate to the LUN and evntually create a dummy LUN.
        */
-       if (mpt_pq_filter && dlen && (data[0] & 0xE0))
+       if (hd->mpt_pq_filter && dlen && (data[0] & 0xE0))
                data[0] |= 0x40;
-       
+
        /* Is LUN supported? If so, upper 2 bits will be 0
        * in first byte of inquiry data.
        */
@@ -3307,7 +2850,7 @@ mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtDevice *target, char byte56)
                                ddvtprintk((KERN_INFO "Enabling QAS on id=%d due to ~TARGET_FLAGS_VALID_56!\n", id));
                                noQas = 0;
                        }
-                               
+
                        offset = pspi_data->maxSyncOffset;
 
                        /* If RAID, never disable QAS
@@ -3401,7 +2944,7 @@ mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtDevice *target, char byte56)
                                if ( (vdev = hd->Targets[ii]) ) {
                                        vdev->negoFlags |= MPT_TARGET_NO_NEGO_QAS;
                                        mptscsih_writeSDP1(hd, 0, ii, vdev->negoFlags);
-                               }       
+                               }
                        }
                }
        }
@@ -3426,14 +2969,15 @@ mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtDevice *target, char byte56)
  * Tapes, initTarget will set this flag on completion of Inquiry command.
  * Called only if DV_NOT_DONE flag is set
  */
-static void mptscsih_set_dvflags(MPT_SCSI_HOST *hd, SCSIIORequest_t *pReq)
+static void
+mptscsih_set_dvflags(MPT_SCSI_HOST *hd, SCSIIORequest_t *pReq)
 {
        u8 cmd;
        ScsiCfgData *pSpi;
 
        ddvtprintk((" set_dvflags: id=%d lun=%d negoNvram=%x cmd=%x\n", 
                pReq->TargetID, pReq->LUN[1], hd->negoNvram, pReq->CDB[0]));
-       
+
        if ((pReq->LUN[1] != 0) || (hd->negoNvram != 0))
                return;
 
@@ -3464,7 +3008,8 @@ static void mptscsih_set_dvflags(MPT_SCSI_HOST *hd, SCSIIORequest_t *pReq)
  * If no Target, bus reset on 1st I/O. Set the flag to
  * prevent any future negotiations to this device.
  */
-static void mptscsih_no_negotiate(MPT_SCSI_HOST *hd, int target_id)
+static void
+mptscsih_no_negotiate(MPT_SCSI_HOST *hd, int target_id)
 {
 
        if ((hd->Targets) && (hd->Targets[target_id] == NULL))
@@ -3631,7 +3176,7 @@ mptscsih_writeSDP1(MPT_SCSI_HOST *hd, int portnum, int target_id, int flags)
                        offset = pTarget->maxOffset;
                        negoFlags = pTarget->negoFlags;
                }
-               
+
 #ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
                /* Force to async and narrow if DV has not been executed
                 * for this ID
@@ -3653,7 +3198,7 @@ mptscsih_writeSDP1(MPT_SCSI_HOST *hd, int portnum, int target_id, int flags)
 
                /* Get a MF for this command.
                 */
-               if ((mf = mpt_get_msg_frame(ScsiDoneCtx, ioc)) == NULL) {
+               if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) {
                        dprintk((MYIOC_s_WARN_FMT "write SDP1: no msg frames!\n",
                                                ioc->name));
                        return -EAGAIN;
@@ -3717,7 +3262,7 @@ mptscsih_writeSDP1(MPT_SCSI_HOST *hd, int portnum, int target_id, int flags)
                                ioc->name, id, (id | (bus<<8)),
                                requested, configuration));
 
-               mpt_put_msg_frame(ScsiDoneCtx, ioc, mf);
+               mpt_put_msg_frame(ioc->DoneCtx, ioc, mf);
        }
 
        return 0;
@@ -3748,7 +3293,7 @@ mptscsih_writeIOCPage4(MPT_SCSI_HOST *hd, int target_id, int bus)
 
        /* Get a MF for this command.
         */
-       if ((mf = mpt_get_msg_frame(ScsiDoneCtx, ioc)) == NULL) {
+       if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) {
                dprintk((MYIOC_s_WARN_FMT "writeIOCPage4 : no msg frames!\n",
                                        ioc->name));
                return -EAGAIN;
@@ -3794,7 +3339,7 @@ mptscsih_writeIOCPage4(MPT_SCSI_HOST *hd, int target_id, int bus)
                "writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n",
                        ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, target_id, bus));
 
-       mpt_put_msg_frame(ScsiDoneCtx, ioc, mf);
+       mpt_put_msg_frame(ioc->DoneCtx, ioc, mf);
 
        return 0;
 }
@@ -3824,7 +3369,7 @@ mptscsih_writeIOCPage4(MPT_SCSI_HOST *hd, int target_id, int bus)
  *     in the IOC member localReply structure.
  *     Used ONLY for DV and other internal commands.
  */
-static int
+int
 mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
 {
        MPT_SCSI_HOST   *hd;
@@ -3832,6 +3377,8 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
        int              completionCode;
        u16              req_idx;
 
+       hd = (MPT_SCSI_HOST *) ioc->sh->hostdata;
+
        if ((mf == NULL) ||
            (mf >= MPT_INDEX_2_MFPTR(ioc, ioc->req_depth))) {
                printk(MYIOC_s_ERR_FMT
@@ -3840,7 +3387,6 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                goto wakeup;
        }
 
-       hd = (MPT_SCSI_HOST *) ioc->sh->hostdata;
        del_timer(&hd->timer);
        req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx);
        hd->ScsiLookup[req_idx] = NULL;
@@ -3972,8 +3518,8 @@ wakeup:
        /*
         * Wake up the original calling thread
         */
-       scandv_wait_done = 1;
-       wake_up(&scandv_waitq);
+       hd->scandv_wait_done = 1;
+       wake_up(&hd->scandv_waitq);
 
        return 1;
 }
@@ -3984,7 +3530,8 @@ wakeup:
  *     @data: Pointer to MPT_SCSI_HOST recast as an unsigned long
  *
  */
-static void mptscsih_timer_expired(unsigned long data)
+void
+mptscsih_timer_expired(unsigned long data)
 {
        MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) data;
 
@@ -4051,7 +3598,7 @@ mptscsih_do_raid(MPT_SCSI_HOST *hd, u8 action, INTERNAL_CMD *io)
 
        /* Get and Populate a free Frame
         */
-       if ((mf = mpt_get_msg_frame(ScsiScanDvCtx, hd->ioc)) == NULL) {
+       if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) {
                ddvprintk((MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n",
                                        hd->ioc->name));
                return -EAGAIN;
@@ -4077,7 +3624,7 @@ mptscsih_do_raid(MPT_SCSI_HOST *hd, u8 action, INTERNAL_CMD *io)
 
        hd->pLocal = NULL;
        hd->timer.expires = jiffies + HZ*10; /* 10 second timeout */
-       scandv_wait_done = 0;
+       hd->scandv_wait_done = 0;
 
        /* Save cmd pointer, for resource free if timeout or
         * FW reload occurs
@@ -4085,8 +3632,8 @@ mptscsih_do_raid(MPT_SCSI_HOST *hd, u8 action, INTERNAL_CMD *io)
        hd->cmdPtr = mf;
 
        add_timer(&hd->timer);
-       mpt_put_msg_frame(ScsiScanDvCtx, hd->ioc, mf);
-       wait_event(scandv_waitq, scandv_wait_done);
+       mpt_put_msg_frame(hd->ioc->InternalCtx, hd->ioc, mf);
+       wait_event(hd->scandv_waitq, hd->scandv_wait_done);
 
        if ((hd->pLocal == NULL) || (hd->pLocal->completion != MPT_SCANDV_GOOD))
                return -1;
@@ -4232,7 +3779,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
 
        /* Get and Populate a free Frame
         */
-       if ((mf = mpt_get_msg_frame(ScsiScanDvCtx, hd->ioc)) == NULL) {
+       if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) {
                ddvprintk((MYIOC_s_WARN_FMT "No msg frames!\n",
                                        hd->ioc->name));
                return -EBUSY;
@@ -4314,7 +3861,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
         */
        hd->pLocal = NULL;
        hd->timer.expires = jiffies + HZ*cmdTimeout;
-       scandv_wait_done = 0;
+       hd->scandv_wait_done = 0;
 
        /* Save cmd pointer, for resource free if timeout or
         * FW reload occurs
@@ -4322,8 +3869,8 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
        hd->cmdPtr = mf;
 
        add_timer(&hd->timer);
-       mpt_put_msg_frame(ScsiScanDvCtx, hd->ioc, mf);
-       wait_event(scandv_waitq, scandv_wait_done);
+       mpt_put_msg_frame(hd->ioc->InternalCtx, hd->ioc, mf);
+       wait_event(hd->scandv_waitq, hd->scandv_wait_done);
 
        if (hd->pLocal) {
                rc = hd->pLocal->completion;
@@ -4640,7 +4187,8 @@ mptscsih_domainValidation(void *arg)
 
 /* Search IOC page 3 to determine if this is hidden physical disk
  */
-static int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id)
+static int 
+mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id)
 {
        if (ioc->spi_data.pIocPg3) {
                Ioc3PhysDisk_t *pPDisk =  ioc->spi_data.pIocPg3->PhysDisk;
@@ -4659,7 +4207,8 @@ static int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id)
 
 /* Write SDP1 if no QAS has been enabled
  */
-static void mptscsih_qas_check(MPT_SCSI_HOST *hd, int id)
+static void
+mptscsih_qas_check(MPT_SCSI_HOST *hd, int id)
 {
        VirtDevice *pTarget;
        int ii;
@@ -5157,7 +4706,7 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id)
        }
        ddvprintk((MYIOC_s_NOTE_FMT "DV: Basic test on id=%d completed OK.\n", ioc->name, id));
 
-       if (mpt_dv == 0)
+       if (ioc->spi_data.mpt_dv == 0)
                goto target_done;
 
        inq0 = (*pbuf1) & 0x1F;
@@ -6015,7 +5564,29 @@ mptscsih_fillbuf(char *buffer, int size, int index, int width)
 }
 #endif /* ~MPTSCSIH_ENABLE_DOMAIN_VALIDATION */
 
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+EXPORT_SYMBOL(mptscsih_remove);
+EXPORT_SYMBOL(mptscsih_shutdown);
+#ifdef CONFIG_PM
+EXPORT_SYMBOL(mptscsih_suspend);
+EXPORT_SYMBOL(mptscsih_resume);
+#endif
+EXPORT_SYMBOL(mptscsih_proc_info);
+EXPORT_SYMBOL(mptscsih_info);
+EXPORT_SYMBOL(mptscsih_qcmd);
+EXPORT_SYMBOL(mptscsih_slave_alloc);
+EXPORT_SYMBOL(mptscsih_slave_destroy);
+EXPORT_SYMBOL(mptscsih_slave_configure);
+EXPORT_SYMBOL(mptscsih_abort);
+EXPORT_SYMBOL(mptscsih_dev_reset);
+EXPORT_SYMBOL(mptscsih_bus_reset);
+EXPORT_SYMBOL(mptscsih_host_reset);
+EXPORT_SYMBOL(mptscsih_bios_param);
+EXPORT_SYMBOL(mptscsih_io_done);
+EXPORT_SYMBOL(mptscsih_taskmgmt_complete);
+EXPORT_SYMBOL(mptscsih_scandv_complete);
+EXPORT_SYMBOL(mptscsih_event_process);
+EXPORT_SYMBOL(mptscsih_ioc_reset);
+EXPORT_SYMBOL(mptscsih_store_queue_depth);
+EXPORT_SYMBOL(mptscsih_timer_expired);
 
-module_init(mptscsih_init);
-module_exit(mptscsih_exit);
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
index 5cb2fd45c38f18e21596f3f11ebefe618423ebd1..d73aec33e16a35ee3bac0b3109d8a6ae4739b706 100644 (file)
@@ -1,26 +1,13 @@
 /*
- *  linux/drivers/message/fusion/mptscsih.h
+ *  linux/drivers/message/fusion/mptscsi.h
  *      High performance SCSI / Fibre Channel SCSI Host device driver.
  *      For use with PCI chip/adapter(s):
  *          LSIFC9xx/LSI409xx Fibre Channel
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
- *  Credits:
- *      This driver would not exist if not for Alan Cox's development
- *      of the linux i2o driver.
- *
- *      A huge debt of gratitude is owed to David S. Miller (DaveM)
- *      for fixing much of the stupid and broken stuff in the early
- *      driver while porting to sparc64 platform.  THANK YOU!
- *
- *      (see also mptbase.c)
- *
- *  Copyright (c) 1999-2004 LSI Logic Corporation
- *  Originally By: Steven J. Ralston
- *  (mailto:netscape.net)
+ *  Copyright (c) 1999-2005 LSI Logic Corporation
  *  (mailto:mpt_linux_developer@lsil.com)
  *
- *  $Id: mptscsih.h,v 1.21 2002/12/03 21:26:35 pdelaney Exp $
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
 #define MPTSCSIH_MIN_SYNC               0x08
 #define MPTSCSIH_SAF_TE                 0
 
+
+#endif
+
+extern void mptscsih_remove(struct pci_dev *);
+extern void mptscsih_shutdown(struct device *);
+#ifdef CONFIG_PM
+extern int mptscsih_suspend(struct pci_dev *pdev, u32 state);
+extern int mptscsih_resume(struct pci_dev *pdev);
 #endif
+extern int mptscsih_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, int func);
+extern const char * mptscsih_info(struct Scsi_Host *SChost);
+extern int mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *));
+extern int mptscsih_slave_alloc(struct scsi_device *device);
+extern void mptscsih_slave_destroy(struct scsi_device *device);
+extern int mptscsih_slave_configure(struct scsi_device *device);
+extern int mptscsih_abort(struct scsi_cmnd * SCpnt);
+extern int mptscsih_dev_reset(struct scsi_cmnd * SCpnt);
+extern int mptscsih_bus_reset(struct scsi_cmnd * SCpnt);
+extern int mptscsih_host_reset(struct scsi_cmnd *SCpnt);
+extern int mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev, sector_t capacity, int geom[]);
+extern int mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r);
+extern int mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r);
+extern int mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r);
+extern int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply);
+extern int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset);
+extern ssize_t mptscsih_store_queue_depth(struct device *dev, struct device_attribute *attr, const char *buf, size_t count);
+extern void mptscsih_timer_expired(unsigned long data);
diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c
new file mode 100644 (file)
index 0000000..5f9a61b
--- /dev/null
@@ -0,0 +1,486 @@
+/*
+ *  linux/drivers/message/fusion/mptspi.c
+ *      For use with LSI Logic PCI chip/adapter(s)
+ *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
+ *
+ *  Copyright (c) 1999-2005 LSI Logic Corporation
+ *  (mailto:mpt_linux_developer@lsil.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; version 2 of the License.
+
+    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.
+
+    NO WARRANTY
+    THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
+    CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
+    LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
+    solely responsible for determining the appropriateness of using and
+    distributing the Program and assumes all risks associated with its
+    exercise of rights under this Agreement, including but not limited to
+    the risks and costs of program errors, damage to or loss of data,
+    programs or equipment, and unavailability or interruption of operations.
+
+    DISCLAIMER OF LIABILITY
+    NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+    DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+    USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+    HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+
+#include "linux_compat.h"      /* linux-2.6 tweaks */
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/kdev_t.h>
+#include <linux/blkdev.h>
+#include <linux/delay.h>       /* for mdelay */
+#include <linux/interrupt.h>   /* needed for in_interrupt() proto */
+#include <linux/reboot.h>      /* notifier code */
+#include <linux/sched.h>
+#include <linux/workqueue.h>
+
+#include <scsi/scsi.h>
+#include <scsi/scsi_cmnd.h>
+#include <scsi/scsi_device.h>
+#include <scsi/scsi_host.h>
+#include <scsi/scsi_tcq.h>
+
+#include "mptbase.h"
+#include "mptscsih.h"
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+#define my_NAME                "Fusion MPT SPI Host driver"
+#define my_VERSION     MPT_LINUX_VERSION_COMMON
+#define MYNAM          "mptspi"
+
+MODULE_AUTHOR(MODULEAUTHOR);
+MODULE_DESCRIPTION(my_NAME);
+MODULE_LICENSE("GPL");
+
+/* Command line args */
+#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
+static int mpt_dv = MPTSCSIH_DOMAIN_VALIDATION;
+module_param(mpt_dv, int, 0);
+MODULE_PARM_DESC(mpt_dv, " DV Algorithm: enhanced=1, basic=0 (default=MPTSCSIH_DOMAIN_VALIDATION=1)");
+
+static int mpt_width = MPTSCSIH_MAX_WIDTH;
+module_param(mpt_width, int, 0);
+MODULE_PARM_DESC(mpt_width, " Max Bus Width: wide=1, narrow=0 (default=MPTSCSIH_MAX_WIDTH=1)");
+
+static ushort mpt_factor = MPTSCSIH_MIN_SYNC;
+module_param(mpt_factor, ushort, 0);
+MODULE_PARM_DESC(mpt_factor, " Min Sync Factor (default=MPTSCSIH_MIN_SYNC=0x08)");
+#endif
+
+static int mpt_saf_te = MPTSCSIH_SAF_TE;
+module_param(mpt_saf_te, int, 0);
+MODULE_PARM_DESC(mpt_saf_te, " Force enabling SEP Processor: enable=1  (default=MPTSCSIH_SAF_TE=0)");
+
+static int mpt_pq_filter = 0;
+module_param(mpt_pq_filter, int, 0);
+MODULE_PARM_DESC(mpt_pq_filter, " Enable peripheral qualifier filter: enable=1  (default=0)");
+
+static int     mptspiDoneCtx = -1;
+static int     mptspiTaskCtx = -1;
+static int     mptspiInternalCtx = -1; /* Used only for internal commands */
+
+static struct device_attribute mptspi_queue_depth_attr = {
+       .attr = {
+               .name =         "queue_depth",
+               .mode =         S_IWUSR,
+       },
+       .store = mptscsih_store_queue_depth,
+};
+
+static struct device_attribute *mptspi_dev_attrs[] = {
+       &mptspi_queue_depth_attr,
+       NULL,
+};
+
+static struct scsi_host_template mptspi_driver_template = {
+       .proc_name                      = "mptspi",
+       .proc_info                      = mptscsih_proc_info,
+       .name                           = "MPT SPI Host",
+       .info                           = mptscsih_info,
+       .queuecommand                   = mptscsih_qcmd,
+       .slave_alloc                    = mptscsih_slave_alloc,
+       .slave_configure                = mptscsih_slave_configure,
+       .slave_destroy                  = mptscsih_slave_destroy,
+       .eh_abort_handler               = mptscsih_abort,
+       .eh_device_reset_handler        = mptscsih_dev_reset,
+       .eh_bus_reset_handler           = mptscsih_bus_reset,
+       .eh_host_reset_handler          = mptscsih_host_reset,
+       .bios_param                     = mptscsih_bios_param,
+       .can_queue                      = MPT_SCSI_CAN_QUEUE,
+       .this_id                        = -1,
+       .sg_tablesize                   = MPT_SCSI_SG_DEPTH,
+       .max_sectors                    = 8192,
+       .cmd_per_lun                    = 7,
+       .use_clustering                 = ENABLE_CLUSTERING,
+       .sdev_attrs                     = mptspi_dev_attrs,
+};
+
+
+/****************************************************************************
+ * Supported hardware
+ */
+
+static struct pci_device_id mptspi_pci_table[] = {
+       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C1030,
+               PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_1030_53C1035,
+               PCI_ANY_ID, PCI_ANY_ID },
+       {0}     /* Terminating entry */
+};
+MODULE_DEVICE_TABLE(pci, mptspi_pci_table);
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*
+ *     mptspi_probe - Installs scsi devices per bus.
+ *     @pdev: Pointer to pci_dev structure
+ *
+ *     Returns 0 for success, non-zero for failure.
+ *
+ */
+static int
+mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+{
+       struct Scsi_Host        *sh;
+       MPT_SCSI_HOST           *hd;
+       MPT_ADAPTER             *ioc;
+       unsigned long            flags;
+       int                      sz, ii;
+       int                      numSGE = 0;
+       int                      scale;
+       int                      ioc_cap;
+       u8                      *mem;
+       int                     error=0;
+       int                     r;
+       
+       if ((r = mpt_attach(pdev,id)) != 0)
+               return r;
+       
+       ioc = pci_get_drvdata(pdev);
+       ioc->DoneCtx = mptspiDoneCtx;
+       ioc->TaskCtx = mptspiTaskCtx;
+       ioc->InternalCtx = mptspiInternalCtx;
+       
+       /*  Added sanity check on readiness of the MPT adapter.
+        */
+       if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
+               printk(MYIOC_s_WARN_FMT
+                 "Skipping because it's not operational!\n",
+                 ioc->name);
+               return -ENODEV;
+       }
+
+       if (!ioc->active) {
+               printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
+                 ioc->name);
+               return -ENODEV;
+       }
+
+       /*  Sanity check - ensure at least 1 port is INITIATOR capable
+        */
+       ioc_cap = 0;
+       for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
+               if (ioc->pfacts[ii].ProtocolFlags &
+                   MPI_PORTFACTS_PROTOCOL_INITIATOR)
+                       ioc_cap ++;
+       }
+
+       if (!ioc_cap) {
+               printk(MYIOC_s_WARN_FMT
+                       "Skipping ioc=%p because SCSI Initiator mode is NOT enabled!\n",
+                       ioc->name, ioc);
+               return -ENODEV;
+       }
+
+       sh = scsi_host_alloc(&mptspi_driver_template, sizeof(MPT_SCSI_HOST));
+
+       if (!sh) {
+               printk(MYIOC_s_WARN_FMT
+                       "Unable to register controller with SCSI subsystem\n",
+                       ioc->name);
+                return -1;
+        }
+
+       spin_lock_irqsave(&ioc->FreeQlock, flags);
+
+       /* Attach the SCSI Host to the IOC structure
+        */
+       ioc->sh = sh;
+
+       sh->io_port = 0;
+       sh->n_io_port = 0;
+       sh->irq = 0;
+
+       /* set 16 byte cdb's */
+       sh->max_cmd_len = 16;
+
+       /* Yikes!  This is important!
+        * Otherwise, by default, linux
+        * only scans target IDs 0-7!
+        * pfactsN->MaxDevices unreliable
+        * (not supported in early
+        *      versions of the FW).
+        * max_id = 1 + actual max id,
+        * max_lun = 1 + actual last lun,
+        *      see hosts.h :o(
+        */
+       sh->max_id = MPT_MAX_SCSI_DEVICES;
+
+       sh->max_lun = MPT_LAST_LUN + 1;
+       sh->max_channel = 0;
+       sh->this_id = ioc->pfacts[0].PortSCSIID;
+
+       /* Required entry.
+        */
+       sh->unique_id = ioc->id;
+
+       /* Verify that we won't exceed the maximum
+        * number of chain buffers
+        * We can optimize:  ZZ = req_sz/sizeof(SGE)
+        * For 32bit SGE's:
+        *  numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
+        *               + (req_sz - 64)/sizeof(SGE)
+        * A slightly different algorithm is required for
+        * 64bit SGEs.
+        */
+       scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
+       if (sizeof(dma_addr_t) == sizeof(u64)) {
+               numSGE = (scale - 1) *
+                 (ioc->facts.MaxChainDepth-1) + scale +
+                 (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
+                 sizeof(u32));
+       } else {
+               numSGE = 1 + (scale - 1) *
+                 (ioc->facts.MaxChainDepth-1) + scale +
+                 (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
+                 sizeof(u32));
+       }
+
+       if (numSGE < sh->sg_tablesize) {
+               /* Reset this value */
+               dprintk((MYIOC_s_INFO_FMT
+                 "Resetting sg_tablesize to %d from %d\n",
+                 ioc->name, numSGE, sh->sg_tablesize));
+               sh->sg_tablesize = numSGE;
+       }
+
+       /* Set the pci device pointer in Scsi_Host structure.
+        */
+       scsi_set_device(sh, &ioc->pcidev->dev);
+
+       spin_unlock_irqrestore(&ioc->FreeQlock, flags);
+
+       hd = (MPT_SCSI_HOST *) sh->hostdata;
+       hd->ioc = ioc;
+
+       /* SCSI needs scsi_cmnd lookup table!
+        * (with size equal to req_depth*PtrSz!)
+        */
+       sz = ioc->req_depth * sizeof(void *);
+       mem = kmalloc(sz, GFP_ATOMIC);
+       if (mem == NULL) {
+               error = -ENOMEM;
+               goto mptspi_probe_failed;
+       }
+
+       memset(mem, 0, sz);
+       hd->ScsiLookup = (struct scsi_cmnd **) mem;
+
+       dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p, sz=%d\n",
+                ioc->name, hd->ScsiLookup, sz));
+
+       /* Allocate memory for the device structures.
+        * A non-Null pointer at an offset
+        * indicates a device exists.
+        * max_id = 1 + maximum id (hosts.h)
+        */
+       sz = sh->max_id * sizeof(void *);
+       mem = kmalloc(sz, GFP_ATOMIC);
+       if (mem == NULL) {
+               error = -ENOMEM;
+               goto mptspi_probe_failed;
+       }
+
+       memset(mem, 0, sz);
+       hd->Targets = (VirtDevice **) mem;
+
+       dprintk((KERN_INFO
+         "  Targets @ %p, sz=%d\n", hd->Targets, sz));
+
+       /* Clear the TM flags
+        */
+       hd->tmPending = 0;
+       hd->tmState = TM_STATE_NONE;
+       hd->resetPending = 0;
+       hd->abortSCpnt = NULL;
+
+       /* Clear the pointer used to store
+        * single-threaded commands, i.e., those
+        * issued during a bus scan, dv and
+        * configuration pages.
+        */
+       hd->cmdPtr = NULL;
+
+       /* Initialize this SCSI Hosts' timers
+        * To use, set the timer expires field
+        * and add_timer
+        */
+       init_timer(&hd->timer);
+       hd->timer.data = (unsigned long) hd;
+       hd->timer.function = mptscsih_timer_expired;
+
+       ioc->spi_data.Saf_Te = mpt_saf_te;
+       hd->mpt_pq_filter = mpt_pq_filter;
+
+#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
+       if (ioc->spi_data.maxBusWidth > mpt_width)
+               ioc->spi_data.maxBusWidth = mpt_width;
+       if (ioc->spi_data.minSyncFactor < mpt_factor)
+               ioc->spi_data.minSyncFactor = mpt_factor;
+       if (ioc->spi_data.minSyncFactor == MPT_ASYNC) {
+               ioc->spi_data.maxSyncOffset = 0;
+       }
+       ioc->spi_data.mpt_dv = mpt_dv;
+       hd->negoNvram = 0;
+
+       ddvprintk((MYIOC_s_INFO_FMT
+               "dv %x width %x factor %x saf_te %x mpt_pq_filter %x\n",
+               ioc->name,
+               mpt_dv,
+               mpt_width,
+               mpt_factor,
+               mpt_saf_te,
+               mpt_pq_filter));
+#else
+       hd->negoNvram = MPT_SCSICFG_USE_NVRAM;
+       ddvprintk((MYIOC_s_INFO_FMT
+               "saf_te %x mpt_pq_filter %x\n",
+               ioc->name,
+               mpt_saf_te,
+               mpt_pq_filter));
+#endif
+
+       ioc->spi_data.forceDv = 0;
+       ioc->spi_data.noQas = 0;
+
+       for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++)
+               ioc->spi_data.dvStatus[ii] =
+                 MPT_SCSICFG_NEGOTIATE;
+
+       for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++)
+               ioc->spi_data.dvStatus[ii] |=
+                 MPT_SCSICFG_DV_NOT_DONE;
+
+       init_waitqueue_head(&hd->scandv_waitq);
+       hd->scandv_wait_done = 0;
+       hd->last_queue_full = 0;
+
+       error = scsi_add_host (sh, &ioc->pcidev->dev);
+       if(error) {
+               dprintk((KERN_ERR MYNAM
+                 "scsi_add_host failed\n"));
+               goto mptspi_probe_failed;
+       }
+
+       scsi_scan_host(sh);
+       return 0;
+
+mptspi_probe_failed:
+
+       mptscsih_remove(pdev);
+       return error;
+}
+
+static struct pci_driver mptspi_driver = {
+       .name           = "mptspi",
+       .id_table       = mptspi_pci_table,
+       .probe          = mptspi_probe,
+       .remove         = __devexit_p(mptscsih_remove),
+       .driver         = {
+               .shutdown = mptscsih_shutdown,
+        },
+#ifdef CONFIG_PM
+       .suspend        = mptscsih_suspend,
+       .resume         = mptscsih_resume,
+#endif
+};
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/**
+ *     mptspi_init - Register MPT adapter(s) as SCSI host(s) with
+ *     linux scsi mid-layer.
+ *
+ *     Returns 0 for success, non-zero for failure.
+ */
+static int __init
+mptspi_init(void)
+{
+
+       show_mptmod_ver(my_NAME, my_VERSION);
+
+       mptspiDoneCtx = mpt_register(mptscsih_io_done, MPTSPI_DRIVER);
+       mptspiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSPI_DRIVER);
+       mptspiInternalCtx = mpt_register(mptscsih_scandv_complete, MPTSPI_DRIVER);
+
+       if (mpt_event_register(mptspiDoneCtx, mptscsih_event_process) == 0) {
+               devtprintk((KERN_INFO MYNAM
+                 ": Registered for IOC event notifications\n"));
+       }
+
+       if (mpt_reset_register(mptspiDoneCtx, mptscsih_ioc_reset) == 0) {
+               dprintk((KERN_INFO MYNAM
+                 ": Registered for IOC reset notifications\n"));
+       }
+
+       return pci_register_driver(&mptspi_driver);
+}
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/**
+ *     mptspi_exit - Unregisters MPT adapter(s)
+ *
+ */
+static void __exit
+mptspi_exit(void)
+{
+       pci_unregister_driver(&mptspi_driver);
+       
+       mpt_reset_deregister(mptspiDoneCtx);
+       dprintk((KERN_INFO MYNAM
+         ": Deregistered for IOC reset notifications\n"));
+
+       mpt_event_deregister(mptspiDoneCtx);
+       dprintk((KERN_INFO MYNAM
+         ": Deregistered for IOC event notifications\n"));
+
+       mpt_deregister(mptspiInternalCtx);
+       mpt_deregister(mptspiTaskCtx);
+       mpt_deregister(mptspiDoneCtx);
+}
+
+module_init(mptspi_init);
+module_exit(mptspi_exit);
index 7b74c87b569e77869cbbe72a8c574c1a258059f7..4830b775906104d718b882c720a3ea1d306b96f3 100644 (file)
@@ -573,6 +573,7 @@ static int i2o_block_reply(struct i2o_controller *c, u32 m,
 static void i2o_block_event(struct i2o_event *evt)
 {
        osm_info("block-osm: event received\n");
+       kfree(evt);
 };
 
 /*
index 245b0058381ddd9e2494e4eb2550e215f021abf5..07a085ccbd5b5db673ac2eff7fcc929e6e3c8a20 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 #include "ibmasm.h"
+#include "lowlevel.h"
 
 static void exec_next_command(struct service_processor *sp);
 static void free_command(struct kobject *kobj);
@@ -31,8 +32,9 @@ static struct kobj_type ibmasm_cmd_kobj_type = {
        .release = free_command,
 };
 
+static atomic_t command_count = ATOMIC_INIT(0);
 
-struct command *ibmasm_new_command(size_t buffer_size)
+struct command *ibmasm_new_command(struct service_processor *sp, size_t buffer_size)
 {
        struct command *cmd;
 
@@ -55,11 +57,15 @@ struct command *ibmasm_new_command(size_t buffer_size)
 
        kobject_init(&cmd->kobj);
        cmd->kobj.ktype = &ibmasm_cmd_kobj_type;
+       cmd->lock = &sp->lock;
 
        cmd->status = IBMASM_CMD_PENDING;
        init_waitqueue_head(&cmd->wait);
        INIT_LIST_HEAD(&cmd->queue_node);
 
+       atomic_inc(&command_count);
+       dbg("command count: %d\n", atomic_read(&command_count));
+
        return cmd;
 }
 
@@ -68,6 +74,8 @@ static void free_command(struct kobject *kobj)
        struct command *cmd = to_command(kobj);
  
        list_del(&cmd->queue_node);
+       atomic_dec(&command_count);
+       dbg("command count: %d\n", atomic_read(&command_count));
        kfree(cmd->buffer);
        kfree(cmd);
 }
@@ -94,8 +102,14 @@ static struct command *dequeue_command(struct service_processor *sp)
 
 static inline void do_exec_command(struct service_processor *sp)
 {
+       char tsbuf[32];
+
+       dbg("%s:%d at %s\n", __FUNCTION__, __LINE__, get_timestamp(tsbuf));
+
        if (ibmasm_send_i2o_message(sp)) {
                sp->current_command->status = IBMASM_CMD_FAILED;
+               wake_up(&sp->current_command->wait);
+               command_put(sp->current_command);
                exec_next_command(sp);
        }
 }
@@ -111,14 +125,16 @@ static inline void do_exec_command(struct service_processor *sp)
 void ibmasm_exec_command(struct service_processor *sp, struct command *cmd)
 {
        unsigned long flags;
+       char tsbuf[32];
+
+       dbg("%s:%d at %s\n", __FUNCTION__, __LINE__, get_timestamp(tsbuf));
 
        spin_lock_irqsave(&sp->lock, flags);
 
        if (!sp->current_command) {
-               command_get(cmd);
                sp->current_command = cmd;
+               command_get(sp->current_command);
                spin_unlock_irqrestore(&sp->lock, flags);
-
                do_exec_command(sp);
        } else {
                enqueue_command(sp, cmd);
@@ -129,9 +145,9 @@ void ibmasm_exec_command(struct service_processor *sp, struct command *cmd)
 static void exec_next_command(struct service_processor *sp)
 {
        unsigned long flags;
+       char tsbuf[32];
 
-       wake_up(&sp->current_command->wait);
-       command_put(sp->current_command);
+       dbg("%s:%d at %s\n", __FUNCTION__, __LINE__, get_timestamp(tsbuf));
 
        spin_lock_irqsave(&sp->lock, flags);
        sp->current_command = dequeue_command(sp);
@@ -169,7 +185,9 @@ void ibmasm_receive_command_response(struct service_processor *sp, void *respons
        if (!sp->current_command) 
                return; 
 
-       memcpy(cmd->buffer, response, min(size, cmd->buffer_size));
+       memcpy_fromio(cmd->buffer, response, min(size, cmd->buffer_size));
        cmd->status = IBMASM_CMD_COMPLETE;
+       wake_up(&sp->current_command->wait);
+       command_put(sp->current_command);
        exec_next_command(sp);
 }
index 478a8d898fc1e4b5f9ac9f12edb66cbfe745466a..13c52f866e2e8c1b6cb9a9c815ed86981e5ed4e1 100644 (file)
@@ -33,7 +33,13 @@ void ibmasm_receive_message(struct service_processor *sp, void *message, int mes
        u32 size;
        struct dot_command_header *header = (struct dot_command_header *)message;
 
+       if (message_size == 0)
+               return;
+
        size = get_dot_command_size(message);
+       if (size == 0)
+               return;
+
        if (size > message_size)
                size = message_size;
 
@@ -67,7 +73,7 @@ int ibmasm_send_driver_vpd(struct service_processor *sp)
        u8 *vpd_data;
        int result = 0;
 
-       command = ibmasm_new_command(INIT_BUFFER_SIZE);
+       command = ibmasm_new_command(sp, INIT_BUFFER_SIZE);
        if (command == NULL)
                return -ENOMEM;
 
@@ -121,7 +127,7 @@ int ibmasm_send_os_state(struct service_processor *sp, int os_state)
        struct os_state_command *os_state_cmd;
        int result = 0;
 
-       cmd = ibmasm_new_command(sizeof(struct os_state_command));
+       cmd = ibmasm_new_command(sp, sizeof(struct os_state_command));
        if (cmd == NULL)
                return -ENOMEM;
 
index e100f34f158733b60322acb6aee4e282db162ce4..fe1e819235a49c18938a775d4f9d2fb75176abfc 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 #include "ibmasm.h"
+#include "lowlevel.h"
 
 /*
  * ASM service processor event handling routines.
@@ -34,7 +35,6 @@
  * circular buffer.
  */
 
-
 static void wake_up_event_readers(struct service_processor *sp)
 {
        struct event_reader *reader;
@@ -63,7 +63,7 @@ void ibmasm_receive_event(struct service_processor *sp, void *data, unsigned int
        spin_lock_irqsave(&sp->lock, flags);
        /* copy the event into the next slot in the circular buffer */
        event = &buffer->events[buffer->next_index];
-       memcpy(event->data, data, data_size);
+       memcpy_fromio(event->data, data, data_size);
        event->data_size = data_size;
        event->serial_number = buffer->next_serial_number;
 
@@ -93,7 +93,10 @@ int ibmasm_get_next_event(struct service_processor *sp, struct event_reader *rea
        unsigned int index;
        unsigned long flags;
 
-       if (wait_event_interruptible(reader->wait, event_available(buffer, reader)))
+       reader->cancelled = 0;
+
+       if (wait_event_interruptible(reader->wait,
+                       event_available(buffer, reader) || reader->cancelled))
                return -ERESTARTSYS;
 
        if (!event_available(buffer, reader))
@@ -116,6 +119,12 @@ int ibmasm_get_next_event(struct service_processor *sp, struct event_reader *rea
        return event->data_size;
 }
 
+void ibmasm_cancel_next_event(struct event_reader *reader)
+{
+        reader->cancelled = 1;
+        wake_up_interruptible(&reader->wait);
+}
+
 void ibmasm_event_reader_register(struct service_processor *sp, struct event_reader *reader)
 {
        unsigned long flags;
@@ -131,8 +140,6 @@ void ibmasm_event_reader_unregister(struct service_processor *sp, struct event_r
 {
        unsigned long flags;
 
-       wake_up_interruptible(&reader->wait);
-
        spin_lock_irqsave(&sp->lock, flags);
        list_del(&reader->node);
        spin_unlock_irqrestore(&sp->lock, flags);
@@ -164,6 +171,5 @@ int ibmasm_event_buffer_init(struct service_processor *sp)
 
 void ibmasm_event_buffer_exit(struct service_processor *sp)
 {
-       wake_up_event_readers(sp);
        kfree(sp->event_buffer);
 }
index ce09309174d68a3b2e38b3f8a47ecccf5f32e740..f295401fac21cb9f492fb3f75eb89e53dd4b6b4a 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/notifier.h>
 #include "ibmasm.h"
 #include "dot_command.h"
+#include "lowlevel.h"
 
 static int suspend_heartbeats = 0;
 
@@ -62,7 +63,7 @@ void ibmasm_unregister_panic_notifier(void)
 
 int ibmasm_heartbeat_init(struct service_processor *sp)
 {
-       sp->heartbeat = ibmasm_new_command(HEARTBEAT_BUFFER_SIZE);
+       sp->heartbeat = ibmasm_new_command(sp, HEARTBEAT_BUFFER_SIZE);
        if (sp->heartbeat == NULL)
                return -ENOMEM;
 
@@ -71,6 +72,12 @@ int ibmasm_heartbeat_init(struct service_processor *sp)
 
 void ibmasm_heartbeat_exit(struct service_processor *sp)
 {
+       char tsbuf[32];
+
+       dbg("%s:%d at %s\n", __FUNCTION__, __LINE__, get_timestamp(tsbuf));
+       ibmasm_wait_for_response(sp->heartbeat, IBMASM_CMD_TIMEOUT_NORMAL);
+       dbg("%s:%d at %s\n", __FUNCTION__, __LINE__, get_timestamp(tsbuf));
+       suspend_heartbeats = 1;
        command_put(sp->heartbeat);
 }
 
@@ -78,14 +85,16 @@ void ibmasm_receive_heartbeat(struct service_processor *sp,  void *message, size
 {
        struct command *cmd = sp->heartbeat;
        struct dot_command_header *header = (struct dot_command_header *)cmd->buffer;
+       char tsbuf[32];
 
+       dbg("%s:%d at %s\n", __FUNCTION__, __LINE__, get_timestamp(tsbuf));
        if (suspend_heartbeats)
                return;
 
        /* return the received dot command to sender */
        cmd->status = IBMASM_CMD_PENDING;
        size = min(size, cmd->buffer_size);
-       memcpy(cmd->buffer, message, size);
+       memcpy_fromio(cmd->buffer, message, size);
        header->type = sp_write;
        ibmasm_exec_command(sp, cmd);
 }
index 6fec7fd8cd1aae3d83530aefaa33a83ffc6f51b3..ecce4ffd3e23f21877df72759efba566c30e1bfe 100644 (file)
 #include <linux/version.h>
 #include <linux/interrupt.h>
 #include <linux/device.h>
+#include <linux/input.h>
 
 /* Driver identification */
 #define DRIVER_NAME    "ibmasm"
-#define DRIVER_VERSION  "0.4"
-#define DRIVER_AUTHOR   "Max Asbock"
+#define DRIVER_VERSION  "1.0"
+#define DRIVER_AUTHOR   "Max Asbock <masbock@us.ibm.com>, Vernon Mauery <vernux@us.ibm.com>"
 #define DRIVER_DESC     "IBM ASM Service Processor Driver"
 
 #define err(msg) printk(KERN_ERR "%s: " msg "\n", DRIVER_NAME)
 #define info(msg) printk(KERN_INFO "%s: " msg "\n", DRIVER_NAME)
 
+extern int ibmasm_debug;
+#define dbg(STR, ARGS...)                                      \
+       do {                                                    \
+               if (ibmasm_debug)                               \
+                       printk(KERN_DEBUG STR , ##ARGS);        \
+       } while (0)
+
+static inline char *get_timestamp(char *buf)
+{
+       struct timeval now;
+       do_gettimeofday(&now);
+       sprintf(buf, "%lu.%lu", now.tv_sec, now.tv_usec);
+       return buf;
+}
 
 #define IBMASM_CMD_PENDING     0       
 #define IBMASM_CMD_COMPLETE    1       
@@ -52,7 +67,7 @@
 #define IBMASM_CMD_TIMEOUT_NORMAL      45
 #define IBMASM_CMD_TIMEOUT_EXTRA       240
 
-#define IBMASM_CMD_MAX_BUFFER_SIZE     0x4000
+#define IBMASM_CMD_MAX_BUFFER_SIZE     0x8000
 
 #define REVERSE_HEARTBEAT_TIMEOUT      120
 
@@ -80,12 +95,17 @@ struct command {
        size_t                  buffer_size;
        int                     status;
        struct kobject          kobj;
+       spinlock_t              *lock;
 };
 #define to_command(c) container_of(c, struct command, kobj)
 
 static inline void command_put(struct command *cmd)
 {
+       unsigned long flags;
+
+       spin_lock_irqsave(cmd->lock, flags);
         kobject_put(&cmd->kobj);
+       spin_unlock_irqrestore(cmd->lock, flags);
 }
 
 static inline void command_get(struct command *cmd)
@@ -108,6 +128,7 @@ struct event_buffer {
 };
 
 struct event_reader {
+       int                     cancelled;
        unsigned int            next_serial_number;
        wait_queue_head_t       wait;
        struct list_head        node;
@@ -120,41 +141,11 @@ struct reverse_heartbeat {
        unsigned int            stopped;
 };
 
-
-/* remote console events */
-struct mouse_event {
-       long            x;
-       long            y;
-       unsigned char   buttons;
-       unsigned char   transitions;
-};
-
-struct keyboard_event {
-       unsigned long   key_code;
-       unsigned char   key_down;
+struct ibmasm_remote {
+       struct input_dev keybd_dev;
+       struct input_dev mouse_dev;
 };
 
-struct remote_event {
-       unsigned long   type;
-       union {
-               struct mouse_event      mouse;
-               struct keyboard_event   keyboard;
-       } data;
-};
-
-#define DRIVER_REMOTE_QUEUE_SIZE 240
-
-struct remote_queue {
-       struct remote_event     *start;
-       struct remote_event     *end;
-       struct remote_event     *reader;
-       struct remote_event     *writer;
-       unsigned int            size;
-       int                     open;
-       wait_queue_head_t       wait;
-};
-
-
 struct service_processor {
        struct list_head        node;
        spinlock_t              lock;
@@ -167,13 +158,13 @@ struct service_processor {
        char                    dirname[IBMASM_NAME_SIZE];
        char                    devname[IBMASM_NAME_SIZE];
        unsigned int            number;
-       struct remote_queue     remote_queue;
+       struct ibmasm_remote    *remote;
        int                     serial_line;
        struct device           *dev;
 };
 
 /* command processing */
-extern struct command *ibmasm_new_command(size_t buffer_size);
+extern struct command *ibmasm_new_command(struct service_processor *sp, size_t buffer_size);
 extern void ibmasm_exec_command(struct service_processor *sp, struct command *cmd);
 extern void ibmasm_wait_for_response(struct command *cmd, int timeout);
 extern void ibmasm_receive_command_response(struct service_processor *sp, void *response,  size_t size);
@@ -185,6 +176,7 @@ extern void ibmasm_receive_event(struct service_processor *sp, void *data,  unsi
 extern void ibmasm_event_reader_register(struct service_processor *sp, struct event_reader *reader);
 extern void ibmasm_event_reader_unregister(struct service_processor *sp, struct event_reader *reader);
 extern int ibmasm_get_next_event(struct service_processor *sp, struct event_reader *reader);
+extern void ibmasm_cancel_next_event(struct event_reader *reader);
 
 /* heartbeat - from SP to OS */
 extern void ibmasm_register_panic_notifier(void);
@@ -208,11 +200,9 @@ extern int ibmasm_send_i2o_message(struct service_processor *sp);
 extern irqreturn_t ibmasm_interrupt_handler(int irq, void * dev_id, struct pt_regs *regs);
 
 /* remote console */
-extern void ibmasm_handle_mouse_interrupt(struct service_processor *sp);
-extern int ibmasm_init_remote_queue(struct service_processor *sp);
-extern void ibmasm_free_remote_queue(struct service_processor *sp);
-extern void ibmasm_advance_reader(struct remote_queue *q, unsigned int n);
-extern size_t ibmasm_events_available(struct remote_queue *q);
+extern void ibmasm_handle_mouse_interrupt(struct service_processor *sp, struct pt_regs *regs);
+extern int ibmasm_init_remote_input_dev(struct service_processor *sp);
+extern void ibmasm_free_remote_input_dev(struct service_processor *sp);
 
 /* file system */
 extern int ibmasmfs_register(void);
index 866e867e68f2ac95f853747f443471c9f4c425f4..5c550fcac2c487f176ba6a2881d41d1449423a15 100644 (file)
@@ -37,9 +37,7 @@
  *    |   |-- event
  *    |   |-- reverse_heartbeat
  *    |   `-- remote_video
- *    |       |-- connected
  *    |       |-- depth
- *    |       |-- events
  *    |       |-- height
  *    |       `-- width
  *    .
@@ -50,9 +48,7 @@
  *        |-- event
  *        |-- reverse_heartbeat
  *        `-- remote_video
- *            |-- connected
  *            |-- depth
- *            |-- events
  *            |-- height
  *            `-- width
  *
  * remote_video/width: control remote display settings
  *     write: set value
  *     read: read value
- *
- * remote_video/connected
- *     read: return "1" if web browser VNC java applet is connected, 
- *             "0" otherwise
- *
- * remote_video/events
- *     read: sleep until a remote mouse or keyboard event occurs, then return
- *             then event.
  */
 
 #include <linux/fs.h>
@@ -333,7 +321,7 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
        if (command_data->command)
                return -EAGAIN;
 
-       cmd = ibmasm_new_command(count);
+       cmd = ibmasm_new_command(command_data->sp, count);
        if (!cmd)
                return -ENOMEM;
 
@@ -374,6 +362,7 @@ static int event_file_open(struct inode *inode, struct file *file)
        ibmasm_event_reader_register(sp, &event_data->reader);
 
        event_data->sp = sp;
+       event_data->active = 0;
        file->private_data = event_data;
        return 0;
 }
@@ -391,7 +380,9 @@ static ssize_t event_file_read(struct file *file, char __user *buf, size_t count
 {
        struct ibmasmfs_event_data *event_data = file->private_data;
        struct event_reader *reader = &event_data->reader;
+       struct service_processor *sp = event_data->sp;
        int ret;
+       unsigned long flags;
 
        if (*offset < 0)
                return -EINVAL;
@@ -400,17 +391,32 @@ static ssize_t event_file_read(struct file *file, char __user *buf, size_t count
        if (*offset != 0)
                return 0;
 
-       ret = ibmasm_get_next_event(event_data->sp, reader);
+       spin_lock_irqsave(&sp->lock, flags);
+       if (event_data->active) {
+               spin_unlock_irqrestore(&sp->lock, flags);
+               return -EBUSY;
+       }
+       event_data->active = 1;
+       spin_unlock_irqrestore(&sp->lock, flags);
+
+       ret = ibmasm_get_next_event(sp, reader);
        if (ret <= 0)
-               return ret;
+               goto out;
 
-       if (count < reader->data_size)
-               return -EINVAL;
+       if (count < reader->data_size) {
+               ret = -EINVAL;
+               goto out;
+       }
 
-        if (copy_to_user(buf, reader->data, reader->data_size))
-               return -EFAULT;
+        if (copy_to_user(buf, reader->data, reader->data_size)) {
+               ret = -EFAULT;
+               goto out;
+       }
+       ret = reader->data_size;
 
-       return reader->data_size;
+out:
+       event_data->active = 0;
+       return ret;
 }
 
 static ssize_t event_file_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)
@@ -424,7 +430,7 @@ static ssize_t event_file_write(struct file *file, const char __user *buf, size_
        if (*offset != 0)
                return 0;
 
-       wake_up_interruptible(&event_data->reader.wait);
+       ibmasm_cancel_next_event(&event_data->reader);
        return 0;
 }
 
@@ -575,75 +581,6 @@ static ssize_t remote_settings_file_write(struct file *file, const char __user *
        return count;
 }
 
-static int remote_event_file_open(struct inode *inode, struct file *file)
-{
-       struct service_processor *sp;
-       unsigned long flags;
-       struct remote_queue *q;
-       
-       file->private_data = inode->u.generic_ip;
-       sp = file->private_data;
-       q = &sp->remote_queue;
-
-       /* allow only one event reader */
-       spin_lock_irqsave(&sp->lock, flags);
-       if (q->open) {
-               spin_unlock_irqrestore(&sp->lock, flags);
-               return -EBUSY;
-       }
-       q->open = 1;
-       spin_unlock_irqrestore(&sp->lock, flags);
-
-       enable_mouse_interrupts(sp);
-       
-       return 0;
-}
-
-static int remote_event_file_close(struct inode *inode, struct file *file)
-{
-       struct service_processor *sp = file->private_data;
-
-       disable_mouse_interrupts(sp);
-       wake_up_interruptible(&sp->remote_queue.wait);
-       sp->remote_queue.open = 0;
-
-       return 0;
-}
-
-static ssize_t remote_event_file_read(struct file *file, char __user *buf, size_t count, loff_t *offset)
-{
-       struct service_processor *sp = file->private_data;
-       struct remote_queue *q = &sp->remote_queue;
-       size_t data_size;
-       struct remote_event *reader = q->reader;
-       size_t num_events;
-
-       if (*offset < 0)
-               return -EINVAL;
-       if (count == 0 || count > 1024)
-               return 0;
-       if (*offset != 0)
-               return 0;
-
-       if (wait_event_interruptible(q->wait, q->reader != q->writer))
-               return -ERESTARTSYS;
-
-       /* only get multiples of struct remote_event */
-       num_events = min((count/sizeof(struct remote_event)), ibmasm_events_available(q));
-       if (!num_events)
-               return 0;
-
-       data_size = num_events * sizeof(struct remote_event);
-
-       if (copy_to_user(buf, reader, data_size))
-               return -EFAULT;
-
-       ibmasm_advance_reader(q, num_events);
-
-       return data_size;
-}
-
-
 static struct file_operations command_fops = {
        .open =         command_file_open,
        .release =      command_file_close,
@@ -672,12 +609,6 @@ static struct file_operations remote_settings_fops = {
        .write =        remote_settings_file_write,
 };
 
-static struct file_operations remote_event_fops = {
-       .open =         remote_event_file_open,
-       .release =      remote_event_file_close,
-       .read =         remote_event_file_read,
-};
-
 
 static void ibmasmfs_create_files (struct super_block *sb, struct dentry *root)
 {
@@ -703,7 +634,5 @@ static void ibmasmfs_create_files (struct super_block *sb, struct dentry *root)
                ibmasmfs_create_file(sb, remote_dir, "width", &remote_settings_fops, (void *)display_width(sp), S_IRUSR|S_IWUSR);
                ibmasmfs_create_file(sb, remote_dir, "height", &remote_settings_fops, (void *)display_height(sp), S_IRUSR|S_IWUSR);
                ibmasmfs_create_file(sb, remote_dir, "depth", &remote_settings_fops, (void *)display_depth(sp), S_IRUSR|S_IWUSR);
-               ibmasmfs_create_file(sb, remote_dir, "connected", &remote_settings_fops, (void *)vnc_status(sp), S_IRUSR);
-               ibmasmfs_create_file(sb, remote_dir, "events", &remote_event_fops, (void *)sp, S_IRUSR);
        }
 }
index 5156de2759d864751bc8e9b4dcd12773070957a1..47949a2c7e94f752e737e4e7b0be00e6aee5ff39 100644 (file)
@@ -46,8 +46,8 @@ int ibmasm_send_i2o_message(struct service_processor *sp)
 
        message = get_i2o_message(sp->base_address, mfa);
 
-       memcpy(&message->header, &header, sizeof(struct i2o_header));
-       memcpy(&message->data, command->buffer, command_size);
+       memcpy_toio(&message->header, &header, sizeof(struct i2o_header));
+       memcpy_toio(&message->data, command->buffer, command_size);
 
        set_mfa_inbound(sp->base_address, mfa);
 
@@ -59,23 +59,27 @@ irqreturn_t ibmasm_interrupt_handler(int irq, void * dev_id, struct pt_regs *reg
        u32     mfa;
        struct service_processor *sp = (struct service_processor *)dev_id;
        void __iomem *base_address = sp->base_address;
+       char tsbuf[32];
 
        if (!sp_interrupt_pending(base_address))
                return IRQ_NONE;
 
+       dbg("respond to interrupt at %s\n", get_timestamp(tsbuf));
+
        if (mouse_interrupt_pending(sp)) {
-               ibmasm_handle_mouse_interrupt(sp);
-               mfa = get_mfa_outbound(base_address);
+               ibmasm_handle_mouse_interrupt(sp, regs);
                clear_mouse_interrupt(sp);
-               set_mfa_outbound(base_address, mfa);
-               return IRQ_HANDLED;
        }
 
        mfa = get_mfa_outbound(base_address);
        if (valid_mfa(mfa)) {
                struct i2o_message *msg = get_i2o_message(base_address, mfa);
                ibmasm_receive_message(sp, &msg->data, incoming_data_size(msg));
-       }
+       } else
+               dbg("didn't get a valid MFA\n");
+
        set_mfa_outbound(base_address, mfa);
+       dbg("finished interrupt at   %s\n", get_timestamp(tsbuf));
+
        return IRQ_HANDLED;
 }
index 777432ae764aadeadfb645967d687e4309b18400..1fdf03fd2da751181c1226d6441de7dab786b6e2 100644 (file)
 #include "lowlevel.h"
 #include "remote.h"
 
+int ibmasm_debug = 0;
+module_param(ibmasm_debug, int , S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(ibmasm_debug, " Set debug mode on or off");
+
 
 static int __devinit ibmasm_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
-       int err, result = -ENOMEM;
+       int result;
        struct service_processor *sp;
 
-       if ((err = pci_enable_device(pdev))) {
-               printk(KERN_ERR "%s: can't enable PCI device at %s\n",
-                       DRIVER_NAME, pci_name(pdev));
-               return err;
+       if ((result = pci_enable_device(pdev))) {
+               dev_err(&pdev->dev, "Failed to enable PCI device\n");
+               return result;
        }
+       if ((result = pci_request_regions(pdev, DRIVER_NAME))) {
+               dev_err(&pdev->dev, "Failed to allocate PCI resources\n");
+               goto error_resources;
+       }
+       /* vnc client won't work without bus-mastering */
+       pci_set_master(pdev);
 
        sp = kmalloc(sizeof(struct service_processor), GFP_KERNEL);
        if (sp == NULL) {
@@ -76,6 +85,9 @@ static int __devinit ibmasm_init_one(struct pci_dev *pdev, const struct pci_devi
        }
        memset(sp, 0, sizeof(struct service_processor));
 
+       sp->lock = SPIN_LOCK_UNLOCKED;
+       INIT_LIST_HEAD(&sp->command_queue);
+
        pci_set_drvdata(pdev, (void *)sp);
        sp->dev = &pdev->dev;
        sp->number = pdev->bus->number;
@@ -101,15 +113,6 @@ static int __devinit ibmasm_init_one(struct pci_dev *pdev, const struct pci_devi
                goto error_ioremap;
        }
 
-       result = ibmasm_init_remote_queue(sp);
-       if (result) {
-               dev_err(sp->dev, "Failed to initialize remote queue\n");
-               goto error_remote_queue;
-       }
-
-       spin_lock_init(&sp->lock);
-       INIT_LIST_HEAD(&sp->command_queue);
-
        result = request_irq(sp->irq, ibmasm_interrupt_handler, SA_SHIRQ, sp->devname, (void*)sp);
        if (result) {
                dev_err(sp->dev, "Failed to register interrupt handler\n");
@@ -117,7 +120,12 @@ static int __devinit ibmasm_init_one(struct pci_dev *pdev, const struct pci_devi
        }
 
        enable_sp_interrupts(sp->base_address);
-       disable_mouse_interrupts(sp);
+
+       result = ibmasm_init_remote_input_dev(sp);
+       if (result) {
+               dev_err(sp->dev, "Failed to initialize remote queue\n");
+               goto error_send_message;
+       }
 
        result = ibmasm_send_driver_vpd(sp);
        if (result) {
@@ -133,30 +141,25 @@ static int __devinit ibmasm_init_one(struct pci_dev *pdev, const struct pci_devi
 
        ibmasm_register_uart(sp);
 
-       dev_printk(KERN_DEBUG, &pdev->dev, "WARNING: This software may not be supported or function\n");
-       dev_printk(KERN_DEBUG, &pdev->dev, "correctly on your IBM server. Please consult the IBM\n");
-       dev_printk(KERN_DEBUG, &pdev->dev, "ServerProven website\n");
-       dev_printk(KERN_DEBUG, &pdev->dev, "http://www.pc.ibm.com/ww/eserver/xseries/serverproven\n");
-       dev_printk(KERN_DEBUG, &pdev->dev, "for information on the specific driver level and support\n");
-       dev_printk(KERN_DEBUG, &pdev->dev, "statement for your IBM server.\n");
-
        return 0;
 
 error_send_message:
        disable_sp_interrupts(sp->base_address);
+       ibmasm_free_remote_input_dev(sp);
        free_irq(sp->irq, (void *)sp);
 error_request_irq:
-       ibmasm_free_remote_queue(sp);
-error_remote_queue:
        iounmap(sp->base_address);
 error_ioremap:
        ibmasm_heartbeat_exit(sp);
 error_heartbeat:
        ibmasm_event_buffer_exit(sp);
 error_eventbuffer:
+       pci_set_drvdata(pdev, NULL);
        kfree(sp);
 error_kmalloc:
-       pci_disable_device(pdev);
+        pci_release_regions(pdev);
+error_resources:
+        pci_disable_device(pdev);
 
        return result;
 }
@@ -165,16 +168,24 @@ static void __devexit ibmasm_remove_one(struct pci_dev *pdev)
 {
        struct service_processor *sp = (struct service_processor *)pci_get_drvdata(pdev);
 
+       dbg("Unregistering UART\n");
        ibmasm_unregister_uart(sp);
-       ibmasm_send_os_state(sp, SYSTEM_STATE_OS_DOWN);
+       dbg("Sending OS down message\n");
+       if (ibmasm_send_os_state(sp, SYSTEM_STATE_OS_DOWN))
+               err("failed to get repsonse to 'Send OS State' command\n");
+       dbg("Disabling heartbeats\n");
+       ibmasm_heartbeat_exit(sp);
+       dbg("Disabling interrupts\n");
        disable_sp_interrupts(sp->base_address);
-       disable_mouse_interrupts(sp);
+       dbg("Freeing SP irq\n");
        free_irq(sp->irq, (void *)sp);
-       ibmasm_heartbeat_exit(sp);
-       ibmasm_free_remote_queue(sp);
+       dbg("Cleaning up\n");
+       ibmasm_free_remote_input_dev(sp);
        iounmap(sp->base_address);
        ibmasm_event_buffer_exit(sp);
+       pci_set_drvdata(pdev, NULL);
        kfree(sp);
+       pci_release_regions(pdev);
        pci_disable_device(pdev);
 }
 
index 93d9c1b2ad6f0de596adf483b8a57f19f9a2af6e..f8fdb2d5417ef3a31c15cb4d761c2319b0ad8011 100644 (file)
@@ -63,7 +63,7 @@ int ibmasm_start_reverse_heartbeat(struct service_processor *sp, struct reverse_
        int times_failed = 0;
        int result = 1;
 
-       cmd = ibmasm_new_command(sizeof rhb_dot_cmd);
+       cmd = ibmasm_new_command(sp, sizeof rhb_dot_cmd);
        if (!cmd)
                return -ENOMEM;
 
index 520c3f10c271e0cc928ae96e51cc032631b105d8..d3c48d23ee5110e2740975d320a7c9cf6d0410d4 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * IBM ASM Service Processor Device Driver
  *
  *
  * Copyright (C) IBM Corporation, 2004
  *
- * Author: Max Asböck <amax@us.ibm.com> 
+ * Authors: Max Asböck <amax@us.ibm.com>
+ *          Vernon Mauery <vernux@us.ibm.com>
  *
  */
 
 /* Remote mouse and keyboard event handling functions */
 
+#include <linux/pci.h>
 #include "ibmasm.h"
 #include "remote.h"
 
-int ibmasm_init_remote_queue(struct service_processor *sp)
-{
-       struct remote_queue *q = &sp->remote_queue;
-
-       disable_mouse_interrupts(sp);
+static int xmax = 1600;
+static int ymax = 1200;
 
-       q->open = 0;
-       q->size = 0;
 
-       q->start = kmalloc(DRIVER_REMOTE_QUEUE_SIZE * sizeof(struct remote_event), GFP_KERNEL);
-        if (q->start == 0)
-                return -ENOMEM;
+static unsigned short xlate_high[XLATE_SIZE] = {
+       [KEY_SYM_ENTER & 0xff] = KEY_ENTER,
+       [KEY_SYM_KPSLASH & 0xff] = KEY_KPSLASH,
+       [KEY_SYM_KPSTAR & 0xff] = KEY_KPASTERISK,
+       [KEY_SYM_KPMINUS & 0xff] = KEY_KPMINUS,
+       [KEY_SYM_KPDOT & 0xff] = KEY_KPDOT,
+       [KEY_SYM_KPPLUS & 0xff] = KEY_KPPLUS,
+       [KEY_SYM_KP0 & 0xff] = KEY_KP0,
+       [KEY_SYM_KP1 & 0xff] = KEY_KP1,
+       [KEY_SYM_KP2 & 0xff] = KEY_KP2, [KEY_SYM_KPDOWN & 0xff] = KEY_KP2,
+       [KEY_SYM_KP3 & 0xff] = KEY_KP3,
+       [KEY_SYM_KP4 & 0xff] = KEY_KP4, [KEY_SYM_KPLEFT & 0xff] = KEY_KP4,
+       [KEY_SYM_KP5 & 0xff] = KEY_KP5,
+       [KEY_SYM_KP6 & 0xff] = KEY_KP6, [KEY_SYM_KPRIGHT & 0xff] = KEY_KP6,
+       [KEY_SYM_KP7 & 0xff] = KEY_KP7,
+       [KEY_SYM_KP8 & 0xff] = KEY_KP8, [KEY_SYM_KPUP & 0xff] = KEY_KP8,
+       [KEY_SYM_KP9 & 0xff] = KEY_KP9,
+       [KEY_SYM_BK_SPC & 0xff] = KEY_BACKSPACE,
+       [KEY_SYM_TAB & 0xff] = KEY_TAB,
+       [KEY_SYM_CTRL & 0xff] = KEY_LEFTCTRL,
+       [KEY_SYM_ALT & 0xff] = KEY_LEFTALT,
+       [KEY_SYM_INSERT & 0xff] = KEY_INSERT,
+       [KEY_SYM_DELETE & 0xff] = KEY_DELETE,
+       [KEY_SYM_SHIFT & 0xff] = KEY_LEFTSHIFT,
+       [KEY_SYM_UARROW & 0xff] = KEY_UP,
+       [KEY_SYM_DARROW & 0xff] = KEY_DOWN,
+       [KEY_SYM_LARROW & 0xff] = KEY_LEFT,
+       [KEY_SYM_RARROW & 0xff] = KEY_RIGHT,
+       [KEY_SYM_ESCAPE & 0xff] = KEY_ESC,
+        [KEY_SYM_PAGEUP & 0xff] = KEY_PAGEUP,
+        [KEY_SYM_PAGEDOWN & 0xff] = KEY_PAGEDOWN,
+        [KEY_SYM_HOME & 0xff] = KEY_HOME,
+        [KEY_SYM_END & 0xff] = KEY_END,
+       [KEY_SYM_F1 & 0xff] = KEY_F1,
+       [KEY_SYM_F2 & 0xff] = KEY_F2,
+       [KEY_SYM_F3 & 0xff] = KEY_F3,
+       [KEY_SYM_F4 & 0xff] = KEY_F4,
+       [KEY_SYM_F5 & 0xff] = KEY_F5,
+       [KEY_SYM_F6 & 0xff] = KEY_F6,
+       [KEY_SYM_F7 & 0xff] = KEY_F7,
+       [KEY_SYM_F8 & 0xff] = KEY_F8,
+       [KEY_SYM_F9 & 0xff] = KEY_F9,
+       [KEY_SYM_F10 & 0xff] = KEY_F10,
+       [KEY_SYM_F11 & 0xff] = KEY_F11,
+       [KEY_SYM_F12 & 0xff] = KEY_F12,
+       [KEY_SYM_CAP_LOCK & 0xff] = KEY_CAPSLOCK,
+       [KEY_SYM_NUM_LOCK & 0xff] = KEY_NUMLOCK,
+       [KEY_SYM_SCR_LOCK & 0xff] = KEY_SCROLLLOCK,
+};
+static unsigned short xlate[XLATE_SIZE] = {
+       [NO_KEYCODE] = KEY_RESERVED,
+       [KEY_SYM_SPACE] = KEY_SPACE,
+       [KEY_SYM_TILDE] = KEY_GRAVE,        [KEY_SYM_BKTIC] = KEY_GRAVE,
+       [KEY_SYM_ONE] = KEY_1,              [KEY_SYM_BANG] = KEY_1,
+       [KEY_SYM_TWO] = KEY_2,              [KEY_SYM_AT] = KEY_2,
+       [KEY_SYM_THREE] = KEY_3,            [KEY_SYM_POUND] = KEY_3,
+       [KEY_SYM_FOUR] = KEY_4,             [KEY_SYM_DOLLAR] = KEY_4,
+       [KEY_SYM_FIVE] = KEY_5,             [KEY_SYM_PERCENT] = KEY_5,
+       [KEY_SYM_SIX] = KEY_6,              [KEY_SYM_CARAT] = KEY_6,
+       [KEY_SYM_SEVEN] = KEY_7,            [KEY_SYM_AMPER] = KEY_7,
+       [KEY_SYM_EIGHT] = KEY_8,            [KEY_SYM_STAR] = KEY_8,
+       [KEY_SYM_NINE] = KEY_9,             [KEY_SYM_LPAREN] = KEY_9,
+       [KEY_SYM_ZERO] = KEY_0,             [KEY_SYM_RPAREN] = KEY_0,
+       [KEY_SYM_MINUS] = KEY_MINUS,        [KEY_SYM_USCORE] = KEY_MINUS,
+       [KEY_SYM_EQUAL] = KEY_EQUAL,        [KEY_SYM_PLUS] = KEY_EQUAL,
+       [KEY_SYM_LBRKT] = KEY_LEFTBRACE,    [KEY_SYM_LCURLY] = KEY_LEFTBRACE,
+       [KEY_SYM_RBRKT] = KEY_RIGHTBRACE,   [KEY_SYM_RCURLY] = KEY_RIGHTBRACE,
+       [KEY_SYM_SLASH] = KEY_BACKSLASH,    [KEY_SYM_PIPE] = KEY_BACKSLASH,
+       [KEY_SYM_TIC] = KEY_APOSTROPHE,     [KEY_SYM_QUOTE] = KEY_APOSTROPHE,
+       [KEY_SYM_SEMIC] = KEY_SEMICOLON,    [KEY_SYM_COLON] = KEY_SEMICOLON,
+       [KEY_SYM_COMMA] = KEY_COMMA,        [KEY_SYM_LT] = KEY_COMMA,
+       [KEY_SYM_PERIOD] = KEY_DOT,         [KEY_SYM_GT] = KEY_DOT,
+       [KEY_SYM_BSLASH] = KEY_SLASH,       [KEY_SYM_QMARK] = KEY_SLASH,
+       [KEY_SYM_A] = KEY_A,                [KEY_SYM_a] = KEY_A,
+       [KEY_SYM_B] = KEY_B,                [KEY_SYM_b] = KEY_B,
+       [KEY_SYM_C] = KEY_C,                [KEY_SYM_c] = KEY_C,
+       [KEY_SYM_D] = KEY_D,                [KEY_SYM_d] = KEY_D,
+       [KEY_SYM_E] = KEY_E,                [KEY_SYM_e] = KEY_E,
+       [KEY_SYM_F] = KEY_F,                [KEY_SYM_f] = KEY_F,
+       [KEY_SYM_G] = KEY_G,                [KEY_SYM_g] = KEY_G,
+       [KEY_SYM_H] = KEY_H,                [KEY_SYM_h] = KEY_H,
+       [KEY_SYM_I] = KEY_I,                [KEY_SYM_i] = KEY_I,
+       [KEY_SYM_J] = KEY_J,                [KEY_SYM_j] = KEY_J,
+       [KEY_SYM_K] = KEY_K,                [KEY_SYM_k] = KEY_K,
+       [KEY_SYM_L] = KEY_L,                [KEY_SYM_l] = KEY_L,
+       [KEY_SYM_M] = KEY_M,                [KEY_SYM_m] = KEY_M,
+       [KEY_SYM_N] = KEY_N,                [KEY_SYM_n] = KEY_N,
+       [KEY_SYM_O] = KEY_O,                [KEY_SYM_o] = KEY_O,
+       [KEY_SYM_P] = KEY_P,                [KEY_SYM_p] = KEY_P,
+       [KEY_SYM_Q] = KEY_Q,                [KEY_SYM_q] = KEY_Q,
+       [KEY_SYM_R] = KEY_R,                [KEY_SYM_r] = KEY_R,
+       [KEY_SYM_S] = KEY_S,                [KEY_SYM_s] = KEY_S,
+       [KEY_SYM_T] = KEY_T,                [KEY_SYM_t] = KEY_T,
+       [KEY_SYM_U] = KEY_U,                [KEY_SYM_u] = KEY_U,
+       [KEY_SYM_V] = KEY_V,                [KEY_SYM_v] = KEY_V,
+       [KEY_SYM_W] = KEY_W,                [KEY_SYM_w] = KEY_W,
+       [KEY_SYM_X] = KEY_X,                [KEY_SYM_x] = KEY_X,
+       [KEY_SYM_Y] = KEY_Y,                [KEY_SYM_y] = KEY_Y,
+       [KEY_SYM_Z] = KEY_Z,                [KEY_SYM_z] = KEY_Z,
+};
 
-       q->end = q->start + DRIVER_REMOTE_QUEUE_SIZE;
-       q->reader = q->start;
-       q->writer = q->start;
-       q->size = DRIVER_REMOTE_QUEUE_SIZE;
-       init_waitqueue_head(&q->wait);
+static char remote_mouse_name[] = "ibmasm RSA I remote mouse";
+static char remote_keybd_name[] = "ibmasm RSA I remote keyboard";
 
-       return 0;
-}
-
-void ibmasm_free_remote_queue(struct service_processor *sp)
+static void print_input(struct remote_input *input)
 {
-       kfree(sp->remote_queue.start);
+       if (input->type == INPUT_TYPE_MOUSE) {
+               unsigned char buttons = input->mouse_buttons;
+               dbg("remote mouse movement: (x,y)=(%d,%d)%s%s%s%s\n",
+                       input->data.mouse.x, input->data.mouse.y,
+                       (buttons)?" -- buttons:":"",
+                       (buttons & REMOTE_BUTTON_LEFT)?"left ":"",
+                       (buttons & REMOTE_BUTTON_MIDDLE)?"middle ":"",
+                       (buttons & REMOTE_BUTTON_RIGHT)?"right":""
+                     );
+       } else {
+               dbg("remote keypress (code, flag, down):"
+                          "%d (0x%x) [0x%x] [0x%x]\n",
+                               input->data.keyboard.key_code,
+                               input->data.keyboard.key_code,
+                               input->data.keyboard.key_flag,
+                               input->data.keyboard.key_down
+                     );
+       }
 }
 
-void ibmasm_advance_reader(struct remote_queue *q, unsigned int n)
+static void send_mouse_event(struct input_dev *dev, struct pt_regs *regs,
+               struct remote_input *input)
 {
-       q->reader += n;
-       if (q->reader >= q->end)
-               q->reader -= q->size;
-}
+       unsigned char buttons = input->mouse_buttons;
 
-size_t ibmasm_events_available(struct remote_queue *q)
-{
-       ssize_t diff = q->writer - q->reader;
-       return (diff >= 0) ? diff : q->end - q->reader; 
+       input_regs(dev, regs);
+       input_report_abs(dev, ABS_X, input->data.mouse.x);
+       input_report_abs(dev, ABS_Y, input->data.mouse.y);
+       input_report_key(dev, BTN_LEFT, buttons & REMOTE_BUTTON_LEFT);
+       input_report_key(dev, BTN_MIDDLE, buttons & REMOTE_BUTTON_MIDDLE);
+       input_report_key(dev, BTN_RIGHT, buttons & REMOTE_BUTTON_RIGHT);
+       input_sync(dev);
 }
-       
 
-static int space_free(struct remote_queue *q)
+static void send_keyboard_event(struct input_dev *dev, struct pt_regs *regs,
+               struct remote_input *input)
 {
-       if (q->reader == q->writer)
-               return q->size - 1;
+       unsigned int key;
+       unsigned short code = input->data.keyboard.key_code;
 
-       return ( (q->reader + q->size - q->writer) % q->size ) - 1;
+       if (code & 0xff00)
+               key = xlate_high[code & 0xff];
+       else
+               key = xlate[code];
+       input_regs(dev, regs);
+       input_report_key(dev, key, (input->data.keyboard.key_down) ? 1 : 0);
+       input_sync(dev);
 }
 
-static void set_mouse_event(struct remote_input *input, struct mouse_event *mouse)
+void ibmasm_handle_mouse_interrupt(struct service_processor *sp,
+               struct pt_regs *regs)
 {
-       static char last_buttons = 0;
+       unsigned long reader;
+       unsigned long writer;
+       struct remote_input input;
 
-       mouse->x = input->data.mouse.x;
-       mouse->y = input->data.mouse.y;
+       reader = get_queue_reader(sp);
+       writer = get_queue_writer(sp);
 
-       if (input->mouse_buttons == REMOTE_MOUSE_DOUBLE_CLICK) {
-               mouse->buttons = REMOTE_MOUSE_DOUBLE_CLICK;
-               last_buttons = 0;
-               return;
-       }
-       mouse->transitions = last_buttons ^ input->mouse_buttons;
-       mouse->buttons = input->mouse_buttons;
+       while (reader != writer) {
+               memcpy_fromio(&input, get_queue_entry(sp, reader),
+                               sizeof(struct remote_input));
 
-       last_buttons = input->mouse_buttons;
-}
+               print_input(&input);
+               if (input.type == INPUT_TYPE_MOUSE) {
+                       send_mouse_event(&sp->remote->mouse_dev, regs, &input);
+               } else if (input.type == INPUT_TYPE_KEYBOARD) {
+                       send_keyboard_event(&sp->remote->keybd_dev, regs, &input);
+               } else
+                       break;
 
-static void set_keyboard_event(struct remote_input *input, struct keyboard_event *keyboard)
-{
-       keyboard->key_code = input->data.keyboard.key_code;
-       keyboard->key_down = input->data.keyboard.key_down;
+               reader = advance_queue_reader(sp, reader);
+               writer = get_queue_writer(sp);
+       }
 }
 
-static int add_to_driver_queue(struct remote_queue *q, struct remote_input *input)
+int ibmasm_init_remote_input_dev(struct service_processor *sp)
 {
-       struct remote_event *event = q->writer;
+       /* set up the mouse input device */
+       struct ibmasm_remote *remote;
+       struct pci_dev *pdev = to_pci_dev(sp->dev);
+       int i;
 
-       if (space_free(q) < 1) {
-               return 1;
-       }
+       sp->remote = remote = kmalloc(sizeof(*remote), GFP_KERNEL);
+       if (!remote)
+               return -ENOMEM;
 
-       switch(input->type) {
-       case (INPUT_TYPE_MOUSE):
-               event->type = INPUT_TYPE_MOUSE;
-               set_mouse_event(input, &event->data.mouse);
-               break;
-       case (INPUT_TYPE_KEYBOARD):
-               event->type = INPUT_TYPE_KEYBOARD;
-               set_keyboard_event(input, &event->data.keyboard);
-               break;
-       default:
-               return 0;
-       }
-       event->type = input->type;
+       memset(remote, 0, sizeof(*remote));
 
-       q->writer++;
-       if (q->writer == q->end)
-               q->writer = q->start;
+       remote->mouse_dev.private = remote;
+       init_input_dev(&remote->mouse_dev);
+       remote->mouse_dev.id.vendor = pdev->vendor;
+       remote->mouse_dev.id.product = pdev->device;
+       remote->mouse_dev.evbit[0]  = BIT(EV_KEY) | BIT(EV_ABS);
+       remote->mouse_dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) |
+               BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
+       set_bit(BTN_TOUCH, remote->mouse_dev.keybit);
+       remote->mouse_dev.name = remote_mouse_name;
+       input_set_abs_params(&remote->mouse_dev, ABS_X, 0, xmax, 0, 0);
+       input_set_abs_params(&remote->mouse_dev, ABS_Y, 0, ymax, 0, 0);
 
-       return 0;
-}
-       
+       remote->keybd_dev.private = remote;
+       init_input_dev(&remote->keybd_dev);
+       remote->keybd_dev.id.vendor = pdev->vendor;
+       remote->keybd_dev.id.product = pdev->device;
+       remote->keybd_dev.evbit[0]  = BIT(EV_KEY);
+       remote->keybd_dev.name = remote_keybd_name;
 
-void ibmasm_handle_mouse_interrupt(struct service_processor *sp)
-{
-       unsigned long reader;
-       unsigned long writer;
-       struct remote_input input;
+       for (i=0; i<XLATE_SIZE; i++) {
+               if (xlate_high[i])
+                       set_bit(xlate_high[i], remote->keybd_dev.keybit);
+               if (xlate[i])
+                       set_bit(xlate[i], remote->keybd_dev.keybit);
+       }
 
-       reader = get_queue_reader(sp);
-       writer = get_queue_writer(sp);
+       input_register_device(&remote->mouse_dev);
+       input_register_device(&remote->keybd_dev);
+       enable_mouse_interrupts(sp);
 
-       while (reader != writer) {
-               memcpy(&input, (void *)get_queue_entry(sp, reader), sizeof(struct remote_input));
+       printk(KERN_INFO "ibmasm remote responding to events on RSA card %d\n", sp->number);
 
-               if (add_to_driver_queue(&sp->remote_queue, &input))
-                       break;
+       return 0;
+}
 
-               reader = advance_queue_reader(sp, reader);
-       }
-       wake_up_interruptible(&sp->remote_queue.wait);
+void ibmasm_free_remote_input_dev(struct service_processor *sp)
+{
+       disable_mouse_interrupts(sp);
+       input_unregister_device(&sp->remote->keybd_dev);
+       input_unregister_device(&sp->remote->mouse_dev);
+       kfree(sp->remote);
 }
+
index a8eb19f02d3f5010b8eadc5e3735018a85091023..b7076a8442d2be8cb4a0967d0a645f14626c4f00 100644 (file)
 
 
 /* mouse button states received from SP */
-#define REMOTE_MOUSE_DOUBLE_CLICK      0xF0
-#define REMOTE_MOUSE_BUTTON_LEFT       0x01
-#define REMOTE_MOUSE_BUTTON_MIDDLE     0x02
-#define REMOTE_MOUSE_BUTTON_RIGHT      0x04
+#define REMOTE_DOUBLE_CLICK    0xF0
+#define REMOTE_BUTTON_LEFT     0x01
+#define REMOTE_BUTTON_MIDDLE   0x02
+#define REMOTE_BUTTON_RIGHT    0x04
 
+/* size of keysym/keycode translation matricies */
+#define XLATE_SIZE 256
 
 struct mouse_input {
        unsigned short  y;
@@ -83,11 +85,13 @@ struct remote_input {
        unsigned char   pad3;
 };
 
-#define mouse_addr(sp)                 sp->base_address + CONDOR_MOUSE_DATA
-#define display_width(sp)      mouse_addr(sp) + CONDOR_INPUT_DISPLAY_RESX
-#define display_height(sp)     mouse_addr(sp) + CONDOR_INPUT_DISPLAY_RESY
-#define display_depth(sp)      mouse_addr(sp) + CONDOR_INPUT_DISPLAY_BITS
-#define vnc_status(sp)         mouse_addr(sp) + CONDOR_OUTPUT_VNC_STATUS
+#define mouse_addr(sp)                 (sp->base_address + CONDOR_MOUSE_DATA)
+#define display_width(sp)      (mouse_addr(sp) + CONDOR_INPUT_DISPLAY_RESX)
+#define display_height(sp)     (mouse_addr(sp) + CONDOR_INPUT_DISPLAY_RESY)
+#define display_depth(sp)      (mouse_addr(sp) + CONDOR_INPUT_DISPLAY_BITS)
+#define desktop_info(sp)       (mouse_addr(sp) + CONDOR_INPUT_DESKTOP_INFO)
+#define vnc_status(sp)         (mouse_addr(sp) + CONDOR_OUTPUT_VNC_STATUS)
+#define isr_control(sp)                (mouse_addr(sp) + CONDOR_MOUSE_ISR_CONTROL)
 
 #define mouse_interrupt_pending(sp)    readl(mouse_addr(sp) + CONDOR_MOUSE_ISR_STATUS)
 #define clear_mouse_interrupt(sp)      writel(0, mouse_addr(sp) + CONDOR_MOUSE_ISR_STATUS)
@@ -101,10 +105,10 @@ struct remote_input {
 #define get_queue_reader(sp)   readl(mouse_addr(sp) + CONDOR_MOUSE_Q_READER)
 #define set_queue_reader(sp, reader)   writel(reader, mouse_addr(sp) + CONDOR_MOUSE_Q_READER)
 
-#define queue_begin    mouse_addr(sp) + CONDOR_MOUSE_Q_BEGIN
+#define queue_begin    (mouse_addr(sp) + CONDOR_MOUSE_Q_BEGIN)
 
 #define get_queue_entry(sp, read_index) \
-       queue_begin + read_index * sizeof(struct remote_input)
+       ((void*)(queue_begin + read_index * sizeof(struct remote_input)))
 
 static inline int advance_queue_reader(struct service_processor *sp, unsigned long reader)
 {
@@ -116,4 +120,151 @@ static inline int advance_queue_reader(struct service_processor *sp, unsigned lo
        return reader;
 }
 
+#define NO_KEYCODE 0
+#define KEY_SYM_BK_SPC   0xFF08
+#define KEY_SYM_TAB      0xFF09
+#define KEY_SYM_ENTER    0xFF0D
+#define KEY_SYM_SCR_LOCK 0xFF14
+#define KEY_SYM_ESCAPE   0xFF1B
+#define KEY_SYM_HOME     0xFF50
+#define KEY_SYM_LARROW   0xFF51
+#define KEY_SYM_UARROW   0xFF52
+#define KEY_SYM_RARROW   0xFF53
+#define KEY_SYM_DARROW   0xFF54
+#define KEY_SYM_PAGEUP   0xFF55
+#define KEY_SYM_PAGEDOWN 0xFF56
+#define KEY_SYM_END      0xFF57
+#define KEY_SYM_INSERT   0xFF63
+#define KEY_SYM_NUM_LOCK 0xFF7F
+#define KEY_SYM_KPSTAR   0xFFAA
+#define KEY_SYM_KPPLUS   0xFFAB
+#define KEY_SYM_KPMINUS  0xFFAD
+#define KEY_SYM_KPDOT    0xFFAE
+#define KEY_SYM_KPSLASH  0xFFAF
+#define KEY_SYM_KPRIGHT  0xFF96
+#define KEY_SYM_KPUP     0xFF97
+#define KEY_SYM_KPLEFT   0xFF98
+#define KEY_SYM_KPDOWN   0xFF99
+#define KEY_SYM_KP0      0xFFB0
+#define KEY_SYM_KP1      0xFFB1
+#define KEY_SYM_KP2      0xFFB2
+#define KEY_SYM_KP3      0xFFB3
+#define KEY_SYM_KP4      0xFFB4
+#define KEY_SYM_KP5      0xFFB5
+#define KEY_SYM_KP6      0xFFB6
+#define KEY_SYM_KP7      0xFFB7
+#define KEY_SYM_KP8      0xFFB8
+#define KEY_SYM_KP9      0xFFB9
+#define KEY_SYM_F1       0xFFBE      // 1B 5B 5B 41
+#define KEY_SYM_F2       0xFFBF      // 1B 5B 5B 42
+#define KEY_SYM_F3       0xFFC0      // 1B 5B 5B 43
+#define KEY_SYM_F4       0xFFC1      // 1B 5B 5B 44
+#define KEY_SYM_F5       0xFFC2      // 1B 5B 5B 45
+#define KEY_SYM_F6       0xFFC3      // 1B 5B 31 37 7E
+#define KEY_SYM_F7       0xFFC4      // 1B 5B 31 38 7E
+#define KEY_SYM_F8       0xFFC5      // 1B 5B 31 39 7E
+#define KEY_SYM_F9       0xFFC6      // 1B 5B 32 30 7E
+#define KEY_SYM_F10      0xFFC7      // 1B 5B 32 31 7E
+#define KEY_SYM_F11      0xFFC8      // 1B 5B 32 33 7E
+#define KEY_SYM_F12      0xFFC9      // 1B 5B 32 34 7E
+#define KEY_SYM_SHIFT    0xFFE1
+#define KEY_SYM_CTRL     0xFFE3
+#define KEY_SYM_ALT      0xFFE9
+#define KEY_SYM_CAP_LOCK 0xFFE5
+#define KEY_SYM_DELETE   0xFFFF
+#define KEY_SYM_TILDE    0x60
+#define KEY_SYM_BKTIC    0x7E
+#define KEY_SYM_ONE      0x31
+#define KEY_SYM_BANG     0x21
+#define KEY_SYM_TWO      0x32
+#define KEY_SYM_AT       0x40
+#define KEY_SYM_THREE    0x33
+#define KEY_SYM_POUND    0x23
+#define KEY_SYM_FOUR     0x34
+#define KEY_SYM_DOLLAR   0x24
+#define KEY_SYM_FIVE     0x35
+#define KEY_SYM_PERCENT  0x25
+#define KEY_SYM_SIX      0x36
+#define KEY_SYM_CARAT    0x5E
+#define KEY_SYM_SEVEN    0x37
+#define KEY_SYM_AMPER    0x26
+#define KEY_SYM_EIGHT    0x38
+#define KEY_SYM_STAR     0x2A
+#define KEY_SYM_NINE     0x39
+#define KEY_SYM_LPAREN   0x28
+#define KEY_SYM_ZERO     0x30
+#define KEY_SYM_RPAREN   0x29
+#define KEY_SYM_MINUS    0x2D
+#define KEY_SYM_USCORE   0x5F
+#define KEY_SYM_EQUAL    0x2B
+#define KEY_SYM_PLUS     0x3D
+#define KEY_SYM_LBRKT    0x5B
+#define KEY_SYM_LCURLY   0x7B
+#define KEY_SYM_RBRKT    0x5D
+#define KEY_SYM_RCURLY   0x7D
+#define KEY_SYM_SLASH    0x5C
+#define KEY_SYM_PIPE     0x7C
+#define KEY_SYM_TIC      0x27
+#define KEY_SYM_QUOTE    0x22
+#define KEY_SYM_SEMIC    0x3B
+#define KEY_SYM_COLON    0x3A
+#define KEY_SYM_COMMA    0x2C
+#define KEY_SYM_LT       0x3C
+#define KEY_SYM_PERIOD   0x2E
+#define KEY_SYM_GT       0x3E
+#define KEY_SYM_BSLASH   0x2F
+#define KEY_SYM_QMARK    0x3F
+#define KEY_SYM_A        0x41
+#define KEY_SYM_B        0x42
+#define KEY_SYM_C        0x43
+#define KEY_SYM_D        0x44
+#define KEY_SYM_E        0x45
+#define KEY_SYM_F        0x46
+#define KEY_SYM_G        0x47
+#define KEY_SYM_H        0x48
+#define KEY_SYM_I        0x49
+#define KEY_SYM_J        0x4A
+#define KEY_SYM_K        0x4B
+#define KEY_SYM_L        0x4C
+#define KEY_SYM_M        0x4D
+#define KEY_SYM_N        0x4E
+#define KEY_SYM_O        0x4F
+#define KEY_SYM_P        0x50
+#define KEY_SYM_Q        0x51
+#define KEY_SYM_R        0x52
+#define KEY_SYM_S        0x53
+#define KEY_SYM_T        0x54
+#define KEY_SYM_U        0x55
+#define KEY_SYM_V        0x56
+#define KEY_SYM_W        0x57
+#define KEY_SYM_X        0x58
+#define KEY_SYM_Y        0x59
+#define KEY_SYM_Z        0x5A
+#define KEY_SYM_a        0x61
+#define KEY_SYM_b        0x62
+#define KEY_SYM_c        0x63
+#define KEY_SYM_d        0x64
+#define KEY_SYM_e        0x65
+#define KEY_SYM_f        0x66
+#define KEY_SYM_g        0x67
+#define KEY_SYM_h        0x68
+#define KEY_SYM_i        0x69
+#define KEY_SYM_j        0x6A
+#define KEY_SYM_k        0x6B
+#define KEY_SYM_l        0x6C
+#define KEY_SYM_m        0x6D
+#define KEY_SYM_n        0x6E
+#define KEY_SYM_o        0x6F
+#define KEY_SYM_p        0x70
+#define KEY_SYM_q        0x71
+#define KEY_SYM_r        0x72
+#define KEY_SYM_s        0x73
+#define KEY_SYM_t        0x74
+#define KEY_SYM_u        0x75
+#define KEY_SYM_v        0x76
+#define KEY_SYM_w        0x77
+#define KEY_SYM_x        0x78
+#define KEY_SYM_y        0x79
+#define KEY_SYM_z        0x7A
+#define KEY_SYM_SPACE    0x20
 #endif /* _IBMASM_REMOTE_H_ */
index 2e70d74fbdee2d8bffa3a7a4d01de57061d317a1..4991bbd054f31fcbc86b4b0871dec7777d00154c 100644 (file)
@@ -51,7 +51,7 @@ config MMC_PXA
 
 config MMC_WBSD
        tristate "Winbond W83L51xD SD/MMC Card Interface support"
-       depends on MMC && ISA && ISA_DMA_API
+       depends on MMC && ISA_DMA_API
        help
          This selects the Winbond(R) W83L51xD Secure digital and
           Multimedia card Interface.
index b5b4a7b1190349236fd42f073eb522da471177d1..d4eee99c2bf65ffe86798deb86cdd5ef0a2e81da 100644 (file)
@@ -383,7 +383,10 @@ static int mmc_blk_probe(struct mmc_card *card)
        struct mmc_blk_data *md;
        int err;
 
-       if (card->csd.cmdclass & ~0x1ff)
+       /*
+        * Check that the card supports the command class(es) we need.
+        */
+       if (!(card->csd.cmdclass & CCC_BLOCK_READ))
                return -ENODEV;
 
        if (card->csd.read_blkbits < 9) {
index 29a56e9cd5b3a5ad35e879845930143475130c4e..5556cd3b555917768f7fc4d341e4b8c93f63db80 100644 (file)
@@ -22,7 +22,7 @@
 #define to_mmc_driver(d)       container_of(d, struct mmc_driver, drv)
 
 #define MMC_ATTR(name, fmt, args...)                                   \
-static ssize_t mmc_##name##_show (struct device *dev, char *buf)       \
+static ssize_t mmc_##name##_show (struct device *dev, struct device_attribute *attr, char *buf)        \
 {                                                                      \
        struct mmc_card *card = dev_to_mmc_card(dev);                   \
        return sprintf(buf, fmt, args);                                 \
index 39747526c719ff1f93241e08206e7fd61884b673..b7fbd30b49a0de18d1b05cf30bcfe62c0f64efac 100644 (file)
@@ -28,7 +28,9 @@
 #include <linux/ioport.h>
 #include <linux/device.h>
 #include <linux/interrupt.h>
+#include <linux/dma-mapping.h>
 #include <linux/delay.h>
+#include <linux/pnp.h>
 #include <linux/highmem.h>
 #include <linux/mmc/host.h>
 #include <linux/mmc/protocol.h>
@@ -40,7 +42,7 @@
 #include "wbsd.h"
 
 #define DRIVER_NAME "wbsd"
-#define DRIVER_VERSION "1.1"
+#define DRIVER_VERSION "1.2"
 
 #ifdef CONFIG_MMC_DEBUG
 #define DBG(x...) \
 #define DBGF(x...)     do { } while (0)
 #endif
 
-static unsigned int io = 0x248;
-static unsigned int irq = 6;
-static int dma = 2;
-
 #ifdef CONFIG_MMC_DEBUG
 void DBG_REG(int reg, u8 value)
 {
@@ -78,29 +76,62 @@ void DBG_REG(int reg, u8 value)
 #define DBG_REG(r, v) do {}  while (0)
 #endif
 
+/*
+ * Device resources
+ */
+
+#ifdef CONFIG_PNP
+
+static const struct pnp_device_id pnp_dev_table[] = {
+       { "WEC0517", 0 },
+       { "WEC0518", 0 },
+       { "", 0 },
+};
+
+MODULE_DEVICE_TABLE(pnp, pnp_dev_table);
+
+#endif /* CONFIG_PNP */
+
+#ifdef CONFIG_PNP
+static unsigned int nopnp = 0;
+#else
+static const unsigned int nopnp = 1;
+#endif
+static unsigned int io = 0x248;
+static unsigned int irq = 6;
+static int dma = 2;
+
 /*
  * Basic functions
  */
 
 static inline void wbsd_unlock_config(struct wbsd_host* host)
 {
+       BUG_ON(host->config == 0);
+       
        outb(host->unlock_code, host->config);
        outb(host->unlock_code, host->config);
 }
 
 static inline void wbsd_lock_config(struct wbsd_host* host)
 {
+       BUG_ON(host->config == 0);
+       
        outb(LOCK_CODE, host->config);
 }
 
 static inline void wbsd_write_config(struct wbsd_host* host, u8 reg, u8 value)
 {
+       BUG_ON(host->config == 0);
+       
        outb(reg, host->config);
        outb(value, host->config + 1);
 }
 
 static inline u8 wbsd_read_config(struct wbsd_host* host, u8 reg)
 {
+       BUG_ON(host->config == 0);
+       
        outb(reg, host->config);
        return inb(host->config + 1);
 }
@@ -132,6 +163,13 @@ static void wbsd_init_device(struct wbsd_host* host)
        setup |= WBSD_FIFO_RESET | WBSD_SOFT_RESET;
        wbsd_write_index(host, WBSD_IDX_SETUP, setup);
        
+       /*
+        * Set DAT3 to input
+        */
+       setup &= ~WBSD_DAT3_H;
+       wbsd_write_index(host, WBSD_IDX_SETUP, setup);
+       host->flags &= ~WBSD_FIGNORE_DETECT;
+       
        /*
         * Read back default clock.
         */
@@ -147,6 +185,14 @@ static void wbsd_init_device(struct wbsd_host* host)
         */
        wbsd_write_index(host, WBSD_IDX_TAAC, 0x7F);
        
+       /*
+        * Test for card presence
+        */
+       if (inb(host->base + WBSD_CSR) & WBSD_CARDPRESENT)
+               host->flags |= WBSD_FCARD_PRESENT;
+       else
+               host->flags &= ~WBSD_FCARD_PRESENT;
+       
        /*
         * Enable interesting interrupts.
         */
@@ -407,8 +453,6 @@ static inline void wbsd_get_long_reply(struct wbsd_host* host,
        }
 }
 
-static irqreturn_t wbsd_irq(int irq, void *dev_id, struct pt_regs *regs);
-
 static void wbsd_send_command(struct wbsd_host* host, struct mmc_command* cmd)
 {
        int i;
@@ -646,6 +690,13 @@ static void wbsd_fill_fifo(struct wbsd_host* host)
        }
        
        wbsd_kunmap_sg(host);
+       
+       /*
+        * The controller stops sending interrupts for
+        * 'FIFO empty' under certain conditions. So we
+        * need to be a bit more pro-active.
+        */
+       tasklet_schedule(&host->fifo_tasklet);
 }
 
 static void wbsd_prepare_data(struct wbsd_host* host, struct mmc_data* data)
@@ -850,9 +901,11 @@ static void wbsd_finish_data(struct wbsd_host* host, struct mmc_data* data)
        wbsd_request_end(host, host->mrq);
 }
 
-/*
- * MMC Callbacks
- */
+/*****************************************************************************\
+ *                                                                           *
+ * MMC layer callbacks                                                       *
+ *                                                                           *
+\*****************************************************************************/
 
 static void wbsd_request(struct mmc_host* mmc, struct mmc_request* mrq)
 {
@@ -874,7 +927,7 @@ static void wbsd_request(struct mmc_host* mmc, struct mmc_request* mrq)
         * If there is no card in the slot then
         * timeout immediatly.
         */
-       if (!(inb(host->base + WBSD_CSR) & WBSD_CARDPRESENT))
+       if (!(host->flags & WBSD_FCARD_PRESENT))
        {
                cmd->error = MMC_ERR_TIMEOUT;
                goto done;
@@ -953,33 +1006,50 @@ static void wbsd_set_ios(struct mmc_host* mmc, struct mmc_ios* ios)
                host->clk = clk;
        }
 
+       /*
+        * Power up card.
+        */
        if (ios->power_mode != MMC_POWER_OFF)
        {
-               /*
-                * Power up card.
-                */
                pwr = inb(host->base + WBSD_CSR);
                pwr &= ~WBSD_POWER_N;
                outb(pwr, host->base + WBSD_CSR);
-
-               /*
-                * This behaviour is stolen from the
-                * Windows driver. Don't know why, but
-                * it is needed.
-                */
-               setup = wbsd_read_index(host, WBSD_IDX_SETUP);
-               if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
-                       setup |= WBSD_DAT3_H;
-               else
-                       setup &= ~WBSD_DAT3_H;
-               wbsd_write_index(host, WBSD_IDX_SETUP, setup);
-
-               mdelay(1);
        }
 
+       /*
+        * MMC cards need to have pin 1 high during init.
+        * Init time corresponds rather nicely with the bus mode.
+        * It wreaks havoc with the card detection though so
+        * that needs to be disabed.
+        */
+       setup = wbsd_read_index(host, WBSD_IDX_SETUP);
+       if ((ios->power_mode == MMC_POWER_ON) &&
+               (ios->bus_mode == MMC_BUSMODE_OPENDRAIN))
+       {
+               setup |= WBSD_DAT3_H;
+               host->flags |= WBSD_FIGNORE_DETECT;
+       }
+       else
+       {
+               setup &= ~WBSD_DAT3_H;
+               host->flags &= ~WBSD_FIGNORE_DETECT;
+       }
+       wbsd_write_index(host, WBSD_IDX_SETUP, setup);
+       
        spin_unlock_bh(&host->lock);
 }
 
+static struct mmc_host_ops wbsd_ops = {
+       .request        = wbsd_request,
+       .set_ios        = wbsd_set_ios,
+};
+
+/*****************************************************************************\
+ *                                                                           *
+ * Interrupt handling                                                        *
+ *                                                                           *
+\*****************************************************************************/
+
 /*
  * Tasklets
  */
@@ -1005,17 +1075,33 @@ static void wbsd_tasklet_card(unsigned long param)
 {
        struct wbsd_host* host = (struct wbsd_host*)param;
        u8 csr;
+       int change = 0;
        
        spin_lock(&host->lock);
        
+       if (host->flags & WBSD_FIGNORE_DETECT)
+       {
+               spin_unlock(&host->lock);
+               return;
+       }
+       
        csr = inb(host->base + WBSD_CSR);
        WARN_ON(csr == 0xff);
        
        if (csr & WBSD_CARDPRESENT)
-               DBG("Card inserted\n");
-       else
+       {
+               if (!(host->flags & WBSD_FCARD_PRESENT))
+               {
+                       DBG("Card inserted\n");
+                       host->flags |= WBSD_FCARD_PRESENT;
+                       change = 1;
+               }
+       }
+       else if (host->flags & WBSD_FCARD_PRESENT)
        {
                DBG("Card removed\n");
+               host->flags &= ~WBSD_FCARD_PRESENT;
+               change = 1;
                
                if (host->mrq)
                {
@@ -1033,7 +1119,8 @@ static void wbsd_tasklet_card(unsigned long param)
         */
        spin_unlock(&host->lock);
 
-       mmc_detect_change(host->mmc);
+       if (change)
+               mmc_detect_change(host->mmc);
 }
 
 static void wbsd_tasklet_fifo(unsigned long param)
@@ -1200,11 +1287,85 @@ static irqreturn_t wbsd_irq(int irq, void *dev_id, struct pt_regs *regs)
        return IRQ_HANDLED;
 }
 
+/*****************************************************************************\
+ *                                                                           *
+ * Device initialisation and shutdown                                        *
+ *                                                                           *
+\*****************************************************************************/
+
 /*
- * Support functions for probe
+ * Allocate/free MMC structure.
  */
 
-static int wbsd_scan(struct wbsd_host* host)
+static int __devinit wbsd_alloc_mmc(struct device* dev)
+{
+       struct mmc_host* mmc;
+       struct wbsd_host* host;
+       
+       /*
+        * Allocate MMC structure.
+        */
+       mmc = mmc_alloc_host(sizeof(struct wbsd_host), dev);
+       if (!mmc)
+               return -ENOMEM;
+       
+       host = mmc_priv(mmc);
+       host->mmc = mmc;
+
+       host->dma = -1;
+
+       /*
+        * Set host parameters.
+        */
+       mmc->ops = &wbsd_ops;
+       mmc->f_min = 375000;
+       mmc->f_max = 24000000;
+       mmc->ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34;
+       
+       spin_lock_init(&host->lock);
+       
+       /*
+        * Maximum number of segments. Worst case is one sector per segment
+        * so this will be 64kB/512.
+        */
+       mmc->max_hw_segs = 128;
+       mmc->max_phys_segs = 128;
+       
+       /*
+        * Maximum number of sectors in one transfer. Also limited by 64kB
+        * buffer.
+        */
+       mmc->max_sectors = 128;
+       
+       /*
+        * Maximum segment size. Could be one segment with the maximum number
+        * of segments.
+        */
+       mmc->max_seg_size = mmc->max_sectors * 512;
+       
+       dev_set_drvdata(dev, mmc);
+       
+       return 0;
+}
+
+static void __devexit wbsd_free_mmc(struct device* dev)
+{
+       struct mmc_host* mmc;
+       
+       mmc = dev_get_drvdata(dev);
+       if (!mmc)
+               return;
+       
+       mmc_free_host(mmc);
+       
+       dev_set_drvdata(dev, NULL);
+}
+
+/*
+ * Scan for known chip id:s
+ */
+
+static int __devinit wbsd_scan(struct wbsd_host* host)
 {
        int i, j, k;
        int id;
@@ -1258,12 +1419,16 @@ static int wbsd_scan(struct wbsd_host* host)
        return -ENODEV;
 }
 
-static int wbsd_request_regions(struct wbsd_host* host)
+/*
+ * Allocate/free io port ranges
+ */
+
+static int __devinit wbsd_request_region(struct wbsd_host* host, int base)
 {
        if (io & 0x7)
                return -EINVAL;
        
-       if (!request_region(io, 8, DRIVER_NAME))
+       if (!request_region(base, 8, DRIVER_NAME))
                return -EIO;
        
        host->base = io;
@@ -1271,19 +1436,25 @@ static int wbsd_request_regions(struct wbsd_host* host)
        return 0;
 }
 
-static void wbsd_release_regions(struct wbsd_host* host)
+static void __devexit wbsd_release_regions(struct wbsd_host* host)
 {
        if (host->base)
                release_region(host->base, 8);
+       
+       host->base = 0;
 
        if (host->config)
                release_region(host->config, 2);
+       
+       host->config = 0;
 }
 
-static void wbsd_init_dma(struct wbsd_host* host)
+/*
+ * Allocate/free DMA port and buffer
+ */
+
+static void __devinit wbsd_request_dma(struct wbsd_host* host, int dma)
 {
-       host->dma = -1;
-       
        if (dma < 0)
                return;
        
@@ -1294,7 +1465,7 @@ static void wbsd_init_dma(struct wbsd_host* host)
         * We need to allocate a special buffer in
         * order for ISA to be able to DMA to it.
         */
-       host->dma_buffer = kmalloc(65536,
+       host->dma_buffer = kmalloc(WBSD_DMA_SIZE,
                GFP_NOIO | GFP_DMA | __GFP_REPEAT | __GFP_NOWARN);
        if (!host->dma_buffer)
                goto free;
@@ -1302,7 +1473,8 @@ static void wbsd_init_dma(struct wbsd_host* host)
        /*
         * Translate the address to a physical address.
         */
-       host->dma_addr = isa_virt_to_bus(host->dma_buffer);
+       host->dma_addr = dma_map_single(host->mmc->dev, host->dma_buffer,
+               WBSD_DMA_SIZE, DMA_BIDIRECTIONAL);
                        
        /*
         * ISA DMA must be aligned on a 64k basis.
@@ -1325,6 +1497,10 @@ kfree:
         */
        BUG_ON(1);
        
+       dma_unmap_single(host->mmc->dev, host->dma_addr, WBSD_DMA_SIZE,
+               DMA_BIDIRECTIONAL);
+       host->dma_addr = (dma_addr_t)NULL;
+       
        kfree(host->dma_buffer);
        host->dma_buffer = NULL;
 
@@ -1336,60 +1512,122 @@ err:
                "Falling back on FIFO.\n", dma);
 }
 
-static struct mmc_host_ops wbsd_ops = {
-       .request        = wbsd_request,
-       .set_ios        = wbsd_set_ios,
-};
+static void __devexit wbsd_release_dma(struct wbsd_host* host)
+{
+       if (host->dma_addr)
+               dma_unmap_single(host->mmc->dev, host->dma_addr, WBSD_DMA_SIZE,
+                       DMA_BIDIRECTIONAL);
+       if (host->dma_buffer)
+               kfree(host->dma_buffer);
+       if (host->dma >= 0)
+               free_dma(host->dma);
+       
+       host->dma = -1;
+       host->dma_buffer = NULL;
+       host->dma_addr = (dma_addr_t)NULL;
+}
 
 /*
- * Device probe
+ * Allocate/free IRQ.
  */
 
-static int wbsd_probe(struct device* dev)
+static int __devinit wbsd_request_irq(struct wbsd_host* host, int irq)
 {
-       struct wbsd_host* host = NULL;
-       struct mmc_host* mmc = NULL;
        int ret;
        
        /*
-        * Allocate MMC structure.
+        * Allocate interrupt.
         */
-       mmc = mmc_alloc_host(sizeof(struct wbsd_host), dev);
-       if (!mmc)
-               return -ENOMEM;
-       
-       host = mmc_priv(mmc);
-       host->mmc = mmc;
+
+       ret = request_irq(irq, wbsd_irq, SA_SHIRQ, DRIVER_NAME, host);
+       if (ret)
+               return ret;
        
+       host->irq = irq;
+
        /*
-        * Scan for hardware.
+        * Set up tasklets.
         */
-       ret = wbsd_scan(host);
-       if (ret)
-               goto freemmc;
+       tasklet_init(&host->card_tasklet, wbsd_tasklet_card, (unsigned long)host);
+       tasklet_init(&host->fifo_tasklet, wbsd_tasklet_fifo, (unsigned long)host);
+       tasklet_init(&host->crc_tasklet, wbsd_tasklet_crc, (unsigned long)host);
+       tasklet_init(&host->timeout_tasklet, wbsd_tasklet_timeout, (unsigned long)host);
+       tasklet_init(&host->finish_tasklet, wbsd_tasklet_finish, (unsigned long)host);
+       tasklet_init(&host->block_tasklet, wbsd_tasklet_block, (unsigned long)host);
+       
+       return 0;
+}
 
-       /*
-        * Reset the chip.
-        */     
-       wbsd_write_config(host, WBSD_CONF_SWRST, 1);
-       wbsd_write_config(host, WBSD_CONF_SWRST, 0);
+static void __devexit wbsd_release_irq(struct wbsd_host* host)
+{
+       if (!host->irq)
+               return;
 
+       free_irq(host->irq, host);
+       
+       host->irq = 0;
+               
+       tasklet_kill(&host->card_tasklet);
+       tasklet_kill(&host->fifo_tasklet);
+       tasklet_kill(&host->crc_tasklet);
+       tasklet_kill(&host->timeout_tasklet);
+       tasklet_kill(&host->finish_tasklet);
+       tasklet_kill(&host->block_tasklet);
+}
+
+/*
+ * Allocate all resources for the host.
+ */
+
+static int __devinit wbsd_request_resources(struct wbsd_host* host,
+       int base, int irq, int dma)
+{
+       int ret;
+       
        /*
         * Allocate I/O ports.
         */
-       ret = wbsd_request_regions(host);
+       ret = wbsd_request_region(host, base);
        if (ret)
-               goto release;
+               return ret;
 
        /*
-        * Set host parameters.
+        * Allocate interrupt.
         */
-       mmc->ops = &wbsd_ops;
-       mmc->f_min = 375000;
-       mmc->f_max = 24000000;
-       mmc->ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34;
+       ret = wbsd_request_irq(host, irq);
+       if (ret)
+               return ret;
+
+       /*
+        * Allocate DMA.
+        */
+       wbsd_request_dma(host, dma);
        
-       spin_lock_init(&host->lock);
+       return 0;
+}
+
+/*
+ * Release all resources for the host.
+ */
+
+static void __devexit wbsd_release_resources(struct wbsd_host* host)
+{
+       wbsd_release_dma(host);
+       wbsd_release_irq(host);
+       wbsd_release_regions(host);
+}
+
+/*
+ * Configure the resources the chip should use.
+ */
+
+static void __devinit wbsd_chip_config(struct wbsd_host* host)
+{
+       /*
+        * Reset the chip.
+        */     
+       wbsd_write_config(host, WBSD_CONF_SWRST, 1);
+       wbsd_write_config(host, WBSD_CONF_SWRST, 0);
 
        /*
         * Select SD/MMC function.
@@ -1399,165 +1637,241 @@ static int wbsd_probe(struct device* dev)
        /*
         * Set up card detection.
         */
-       wbsd_write_config(host, WBSD_CONF_PINS, 0x02);
+       wbsd_write_config(host, WBSD_CONF_PINS, WBSD_PINS_DETECT_GP11);
        
        /*
-        * Configure I/O port.
+        * Configure chip
         */
        wbsd_write_config(host, WBSD_CONF_PORT_HI, host->base >> 8);
        wbsd_write_config(host, WBSD_CONF_PORT_LO, host->base & 0xff);
-
-       /*
-        * Allocate interrupt.
-        */
-       ret = request_irq(irq, wbsd_irq, SA_SHIRQ, DRIVER_NAME, host);
-       if (ret)
-               goto release;
        
-       host->irq = irq;
+       wbsd_write_config(host, WBSD_CONF_IRQ, host->irq);
        
-       /*
-        * Set up tasklets.
-        */
-       tasklet_init(&host->card_tasklet, wbsd_tasklet_card, (unsigned long)host);
-       tasklet_init(&host->fifo_tasklet, wbsd_tasklet_fifo, (unsigned long)host);
-       tasklet_init(&host->crc_tasklet, wbsd_tasklet_crc, (unsigned long)host);
-       tasklet_init(&host->timeout_tasklet, wbsd_tasklet_timeout, (unsigned long)host);
-       tasklet_init(&host->finish_tasklet, wbsd_tasklet_finish, (unsigned long)host);
-       tasklet_init(&host->block_tasklet, wbsd_tasklet_block, (unsigned long)host);
+       if (host->dma >= 0)
+               wbsd_write_config(host, WBSD_CONF_DRQ, host->dma);
        
        /*
-        * Configure interrupt.
+        * Enable and power up chip.
         */
-       wbsd_write_config(host, WBSD_CONF_IRQ, host->irq);
+       wbsd_write_config(host, WBSD_CONF_ENABLE, 1);
+       wbsd_write_config(host, WBSD_CONF_POWER, 0x20);
+}
+
+/*
+ * Check that configured resources are correct.
+ */
+static int __devinit wbsd_chip_validate(struct wbsd_host* host)
+{
+       int base, irq, dma;
        
        /*
-        * Allocate DMA.
+        * Select SD/MMC function.
         */
-       wbsd_init_dma(host);
+       wbsd_write_config(host, WBSD_CONF_DEVICE, DEVICE_SD);
        
        /*
-        * If all went well, then configure DMA.
+        * Read configuration.
         */
-       if (host->dma >= 0)
-               wbsd_write_config(host, WBSD_CONF_DRQ, host->dma);
+       base = wbsd_read_config(host, WBSD_CONF_PORT_HI) << 8;
+       base |= wbsd_read_config(host, WBSD_CONF_PORT_LO);
        
-       /*
-        * Maximum number of segments. Worst case is one sector per segment
-        * so this will be 64kB/512.
-        */
-       mmc->max_hw_segs = 128;
-       mmc->max_phys_segs = 128;
+       irq = wbsd_read_config(host, WBSD_CONF_IRQ);
+       
+       dma = wbsd_read_config(host, WBSD_CONF_DRQ);
        
        /*
-        * Maximum number of sectors in one transfer. Also limited by 64kB
-        * buffer.
+        * Validate against given configuration.
         */
-       mmc->max_sectors = 128;
+       if (base != host->base)
+               return 0;
+       if (irq != host->irq)
+               return 0;
+       if ((dma != host->dma) && (host->dma != -1))
+               return 0;
+       
+       return 1;
+}
+
+/*****************************************************************************\
+ *                                                                           *
+ * Devices setup and shutdown                                                *
+ *                                                                           *
+\*****************************************************************************/
+
+static int __devinit wbsd_init(struct device* dev, int base, int irq, int dma,
+       int pnp)
+{
+       struct wbsd_host* host = NULL;
+       struct mmc_host* mmc = NULL;
+       int ret;
+       
+       ret = wbsd_alloc_mmc(dev);
+       if (ret)
+               return ret;
+       
+       mmc = dev_get_drvdata(dev);
+       host = mmc_priv(mmc);
        
        /*
-        * Maximum segment size. Could be one segment with the maximum number
-        * of segments.
+        * Scan for hardware.
         */
-       mmc->max_seg_size = mmc->max_sectors * 512;
+       ret = wbsd_scan(host);
+       if (ret)
+       {
+               if (pnp && (ret == -ENODEV))
+               {
+                       printk(KERN_WARNING DRIVER_NAME
+                               ": Unable to confirm device presence. You may "
+                               "experience lock-ups.\n");
+               }
+               else
+               {
+                       wbsd_free_mmc(dev);
+                       return ret;
+               }
+       }
        
        /*
-        * Enable chip.
+        * Request resources.
         */
-       wbsd_write_config(host, WBSD_CONF_ENABLE, 1);
+       ret = wbsd_request_resources(host, io, irq, dma);
+       if (ret)
+       {
+               wbsd_release_resources(host);
+               wbsd_free_mmc(dev);
+               return ret;
+       }
        
        /*
-        * Power up chip.
+        * See if chip needs to be configured.
         */
-       wbsd_write_config(host, WBSD_CONF_POWER, 0x20);
+       if (pnp && (host->config != 0))
+       {
+               if (!wbsd_chip_validate(host))
+               {
+                       printk(KERN_WARNING DRIVER_NAME
+                               ": PnP active but chip not configured! "
+                               "You probably have a buggy BIOS. "
+                               "Configuring chip manually.\n");
+                       wbsd_chip_config(host);
+               }
+       }
+       else
+               wbsd_chip_config(host);
        
        /*
         * Power Management stuff. No idea how this works.
         * Not tested.
         */
 #ifdef CONFIG_PM
-       wbsd_write_config(host, WBSD_CONF_PME, 0xA0);
+       if (host->config)
+               wbsd_write_config(host, WBSD_CONF_PME, 0xA0);
 #endif
+       /*
+        * Allow device to initialise itself properly.
+        */
+       mdelay(5);
 
        /*
         * Reset the chip into a known state.
         */
        wbsd_init_device(host);
        
-       dev_set_drvdata(dev, mmc);
-       
-       /*
-        * Add host to MMC layer.
-        */
        mmc_add_host(mmc);
 
-       printk(KERN_INFO "%s: W83L51xD id %x at 0x%x irq %d dma %d\n",
-               mmc->host_name, (int)host->chip_id, (int)host->base,
-               (int)host->irq, (int)host->dma);
+       printk(KERN_INFO "%s: W83L51xD", mmc->host_name);
+       if (host->chip_id != 0)
+               printk(" id %x", (int)host->chip_id);
+       printk(" at 0x%x irq %d", (int)host->base, (int)host->irq);
+       if (host->dma >= 0)
+               printk(" dma %d", (int)host->dma);
+       else
+               printk(" FIFO");
+       if (pnp)
+               printk(" PnP");
+       printk("\n");
 
        return 0;
-
-release:
-       wbsd_release_regions(host);
-
-freemmc:
-       mmc_free_host(mmc);
-
-       return ret;
 }
 
-/*
- * Device remove
- */
-
-static int wbsd_remove(struct device* dev)
+static void __devexit wbsd_shutdown(struct device* dev, int pnp)
 {
        struct mmc_host* mmc = dev_get_drvdata(dev);
        struct wbsd_host* host;
        
        if (!mmc)
-               return 0;
+               return;
 
        host = mmc_priv(mmc);
        
-       /*
-        * Unregister host with MMC layer.
-        */
        mmc_remove_host(mmc);
 
-       /*
-        * Power down the SD/MMC function.
-        */
-       wbsd_unlock_config(host);
-       wbsd_write_config(host, WBSD_CONF_DEVICE, DEVICE_SD);
-       wbsd_write_config(host, WBSD_CONF_ENABLE, 0);
-       wbsd_lock_config(host);
+       if (!pnp)
+       {
+               /*
+                * Power down the SD/MMC function.
+                */
+               wbsd_unlock_config(host);
+               wbsd_write_config(host, WBSD_CONF_DEVICE, DEVICE_SD);
+               wbsd_write_config(host, WBSD_CONF_ENABLE, 0);
+               wbsd_lock_config(host);
+       }
        
-       /*
-        * Free resources.
-        */
-       if (host->dma_buffer)
-               kfree(host->dma_buffer);
+       wbsd_release_resources(host);
        
-       if (host->dma >= 0)
-               free_dma(host->dma);
+       wbsd_free_mmc(dev);
+}
 
-       free_irq(host->irq, host);
+/*
+ * Non-PnP
+ */
+
+static int __devinit wbsd_probe(struct device* dev)
+{
+       return wbsd_init(dev, io, irq, dma, 0);
+}
+
+static int __devexit wbsd_remove(struct device* dev)
+{
+       wbsd_shutdown(dev, 0);
+
+       return 0;
+}
+
+/*
+ * PnP
+ */
+
+#ifdef CONFIG_PNP
+
+static int __devinit
+wbsd_pnp_probe(struct pnp_dev * pnpdev, const struct pnp_device_id *dev_id)
+{
+       int io, irq, dma;
        
-       tasklet_kill(&host->card_tasklet);
-       tasklet_kill(&host->fifo_tasklet);
-       tasklet_kill(&host->crc_tasklet);
-       tasklet_kill(&host->timeout_tasklet);
-       tasklet_kill(&host->finish_tasklet);
-       tasklet_kill(&host->block_tasklet);
+       /*
+        * Get resources from PnP layer.
+        */
+       io = pnp_port_start(pnpdev, 0);
+       irq = pnp_irq(pnpdev, 0);
+       if (pnp_dma_valid(pnpdev, 0))
+               dma = pnp_dma(pnpdev, 0);
+       else
+               dma = -1;
        
-       wbsd_release_regions(host);
+       DBGF("PnP resources: port %3x irq %d dma %d\n", io, irq, dma);
        
-       mmc_free_host(mmc);
+       return wbsd_init(&pnpdev->dev, io, irq, dma, 1);
+}
 
-       return 0;
+static void __devexit wbsd_pnp_remove(struct pnp_dev * dev)
+{
+       wbsd_shutdown(&dev->dev, 1);
 }
 
+#endif /* CONFIG_PNP */
+
 /*
  * Power management
  */
@@ -1581,17 +1895,7 @@ static int wbsd_resume(struct device *dev, u32 level)
 #define wbsd_resume NULL
 #endif
 
-static void wbsd_release(struct device *dev)
-{
-}
-
-static struct platform_device wbsd_device = {
-       .name           = DRIVER_NAME,
-       .id                     = -1,
-       .dev            = {
-               .release = wbsd_release,
-       },
-};
+static struct platform_device *wbsd_device;
 
 static struct device_driver wbsd_driver = {
        .name           = DRIVER_NAME,
@@ -1603,6 +1907,17 @@ static struct device_driver wbsd_driver = {
        .resume         = wbsd_resume,
 };
 
+#ifdef CONFIG_PNP
+
+static struct pnp_driver wbsd_pnp_driver = {
+       .name           = DRIVER_NAME,
+       .id_table       = pnp_dev_table,
+       .probe          = wbsd_pnp_probe,
+       .remove         = wbsd_pnp_remove,
+};
+
+#endif /* CONFIG_PNP */
+
 /*
  * Module loading/unloading
  */
@@ -1615,29 +1930,57 @@ static int __init wbsd_drv_init(void)
                ": Winbond W83L51xD SD/MMC card interface driver, "
                DRIVER_VERSION "\n");
        printk(KERN_INFO DRIVER_NAME ": Copyright(c) Pierre Ossman\n");
-       
-       result = driver_register(&wbsd_driver);
-       if (result < 0)
-               return result;
 
-       result = platform_device_register(&wbsd_device);
-       if (result < 0)
-               return result;
+#ifdef CONFIG_PNP
+
+       if (!nopnp)
+       {
+               result = pnp_register_driver(&wbsd_pnp_driver);
+               if (result < 0)
+                       return result;
+       }
+
+#endif /* CONFIG_PNP */        
+       
+       if (nopnp)
+       {
+               result = driver_register(&wbsd_driver);
+               if (result < 0)
+                       return result;
+
+               wbsd_device = platform_device_register_simple(DRIVER_NAME, -1,
+                       NULL, 0);
+               if (IS_ERR(wbsd_device))
+                       return PTR_ERR(wbsd_device);
+       }
 
        return 0;
 }
 
 static void __exit wbsd_drv_exit(void)
 {
-       platform_device_unregister(&wbsd_device);
+#ifdef CONFIG_PNP
+
+       if (!nopnp)
+               pnp_unregister_driver(&wbsd_pnp_driver);
        
-       driver_unregister(&wbsd_driver);
+#endif /* CONFIG_PNP */        
+
+       if (nopnp)
+       {
+               platform_device_unregister(wbsd_device);
+       
+               driver_unregister(&wbsd_driver);
+       }
 
        DBG("unloaded\n");
 }
 
 module_init(wbsd_drv_init);
 module_exit(wbsd_drv_exit);
+#ifdef CONFIG_PNP
+module_param(nopnp, uint, 0444);
+#endif
 module_param(io, uint, 0444);
 module_param(irq, uint, 0444);
 module_param(dma, int, 0444);
@@ -1646,6 +1989,9 @@ MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("Winbond W83L51xD SD/MMC card interface driver");
 MODULE_VERSION(DRIVER_VERSION);
 
+#ifdef CONFIG_PNP
+MODULE_PARM_DESC(nopnp, "Scan for device instead of relying on PNP. (default 0)");
+#endif
 MODULE_PARM_DESC(io, "I/O base to allocate. Must be 8 byte aligned. (default 0x248)");
 MODULE_PARM_DESC(irq, "IRQ to allocate. (default 6)");
 MODULE_PARM_DESC(dma, "DMA channel to allocate. -1 for no DMA. (default 2)");
index fdc03b56a81fbdecb38b0a394927efcc750ba442..864f30828d01fe4f52da21502c91f3cec18e6ed4 100644 (file)
@@ -35,6 +35,12 @@ const int valid_ids[] = {
 
 #define DEVICE_SD              0x03
 
+#define WBSD_PINS_DAT3_HI      0x20
+#define WBSD_PINS_DAT3_OUT     0x10
+#define WBSD_PINS_GP11_HI      0x04
+#define WBSD_PINS_DETECT_GP11  0x02
+#define WBSD_PINS_DETECT_DAT3  0x01
+
 #define WBSD_CMDR              0x00
 #define WBSD_DFR               0x01
 #define WBSD_EIR               0x02
@@ -133,6 +139,7 @@ const int valid_ids[] = {
 #define WBSD_CRC_OK            0x05 /* S010E (00101) */
 #define WBSD_CRC_FAIL          0x0B /* S101E (01011) */
 
+#define WBSD_DMA_SIZE          65536
 
 struct wbsd_host
 {
@@ -140,6 +147,11 @@ struct wbsd_host
        
        spinlock_t              lock;           /* Mutex */
 
+       int                     flags;          /* Driver states */
+
+#define WBSD_FCARD_PRESENT     (1<<0)          /* Card is present */
+#define WBSD_FIGNORE_DETECT    (1<<1)          /* Ignore card detection */
+       
        struct mmc_request*     mrq;            /* Current request */
        
        u8                      isr;            /* Accumulated ISR */
index b5e076043431aa69769503a41486c591aa7d23ea..80ec9aa575bb5df228428afb5d84ae42c3407c35 100644 (file)
@@ -2202,9 +2202,8 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
        if (vortex_debug > 6) {
                printk(KERN_DEBUG "boomerang_start_xmit()\n");
-               if (vortex_debug > 3)
-                       printk(KERN_DEBUG "%s: Trying to send a packet, Tx index %d.\n",
-                                  dev->name, vp->cur_tx);
+               printk(KERN_DEBUG "%s: Trying to send a packet, Tx index %d.\n",
+                          dev->name, vp->cur_tx);
        }
 
        if (vp->cur_tx - vp->dirty_tx >= TX_RING_SIZE) {
index d639cb8dc461c85ccf04cc2da6cfd4f8c7b963c1..72cdf19e1be1fd6358c39718ea534e73e5531b87 100644 (file)
@@ -54,6 +54,7 @@
 
 #include <linux/config.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/kernel.h>
 #include <linux/compiler.h>
 #include <linux/netdevice.h>
@@ -91,16 +92,17 @@ KERN_INFO DRV_NAME ": 10/100 PCI Ethernet driver v" DRV_VERSION " (" DRV_RELDATE
 
 MODULE_AUTHOR("Jeff Garzik <jgarzik@pobox.com>");
 MODULE_DESCRIPTION("RealTek RTL-8139C+ series 10/100 PCI Ethernet driver");
+MODULE_VERSION(DRV_VERSION);
 MODULE_LICENSE("GPL");
 
 static int debug = -1;
-MODULE_PARM (debug, "i");
+module_param(debug, int, 0);
 MODULE_PARM_DESC (debug, "8139cp: bitmapped message enable number");
 
 /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
    The RTL chips use a 64 element hash table based on the Ethernet CRC.  */
 static int multicast_filter_limit = 32;
-MODULE_PARM (multicast_filter_limit, "i");
+module_param(multicast_filter_limit, int, 0);
 MODULE_PARM_DESC (multicast_filter_limit, "8139cp: maximum number of filtered multicast addresses");
 
 #define PFX                    DRV_NAME ": "
@@ -186,6 +188,9 @@ enum {
        RingEnd         = (1 << 30), /* End of descriptor ring */
        FirstFrag       = (1 << 29), /* First segment of a packet */
        LastFrag        = (1 << 28), /* Final segment of a packet */
+       LargeSend       = (1 << 27), /* TCP Large Send Offload (TSO) */
+       MSSShift        = 16,        /* MSS value position */
+       MSSMask         = 0xfff,     /* MSS value: 11 bits */
        TxError         = (1 << 23), /* Tx error summary */
        RxError         = (1 << 20), /* Rx error summary */
        IPCS            = (1 << 18), /* Calculate IP checksum */
@@ -312,7 +317,7 @@ struct cp_desc {
 struct ring_info {
        struct sk_buff          *skb;
        dma_addr_t              mapping;
-       unsigned                frag;
+       u32                     len;
 };
 
 struct cp_dma_stats {
@@ -394,6 +399,9 @@ struct cp_private {
 static void __cp_set_rx_mode (struct net_device *dev);
 static void cp_tx (struct cp_private *cp);
 static void cp_clean_rings (struct cp_private *cp);
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void cp_poll_controller(struct net_device *dev);
+#endif
 
 static struct pci_device_id cp_pci_tbl[] = {
        { PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8139,
@@ -688,6 +696,19 @@ cp_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
        return IRQ_HANDLED;
 }
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+/*
+ * Polling receive - used by netconsole and other diagnostic tools
+ * to allow network i/o with interrupts disabled.
+ */
+static void cp_poll_controller(struct net_device *dev)
+{
+       disable_irq(dev->irq);
+       cp_interrupt(dev->irq, dev, NULL);
+       enable_irq(dev->irq);
+}
+#endif
+
 static void cp_tx (struct cp_private *cp)
 {
        unsigned tx_head = cp->tx_head;
@@ -707,7 +728,7 @@ static void cp_tx (struct cp_private *cp)
                        BUG();
 
                pci_unmap_single(cp->pdev, cp->tx_skb[tx_tail].mapping,
-                                       skb->len, PCI_DMA_TODEVICE);
+                                cp->tx_skb[tx_tail].len, PCI_DMA_TODEVICE);
 
                if (status & LastFrag) {
                        if (status & (TxError | TxFIFOUnder)) {
@@ -749,10 +770,11 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
 {
        struct cp_private *cp = netdev_priv(dev);
        unsigned entry;
-       u32 eor;
+       u32 eor, flags;
 #if CP_VLAN_TAG_USED
        u32 vlan_tag = 0;
 #endif
+       int mss = 0;
 
        spin_lock_irq(&cp->lock);
 
@@ -772,6 +794,9 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
 
        entry = cp->tx_head;
        eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0;
+       if (dev->features & NETIF_F_TSO)
+               mss = skb_shinfo(skb)->tso_size;
+
        if (skb_shinfo(skb)->nr_frags == 0) {
                struct cp_desc *txd = &cp->tx_ring[entry];
                u32 len;
@@ -783,26 +808,26 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
                txd->addr = cpu_to_le64(mapping);
                wmb();
 
-               if (skb->ip_summed == CHECKSUM_HW) {
+               flags = eor | len | DescOwn | FirstFrag | LastFrag;
+
+               if (mss)
+                       flags |= LargeSend | ((mss & MSSMask) << MSSShift);
+               else if (skb->ip_summed == CHECKSUM_HW) {
                        const struct iphdr *ip = skb->nh.iph;
                        if (ip->protocol == IPPROTO_TCP)
-                               txd->opts1 = cpu_to_le32(eor | len | DescOwn |
-                                                        FirstFrag | LastFrag |
-                                                        IPCS | TCPCS);
+                               flags |= IPCS | TCPCS;
                        else if (ip->protocol == IPPROTO_UDP)
-                               txd->opts1 = cpu_to_le32(eor | len | DescOwn |
-                                                        FirstFrag | LastFrag |
-                                                        IPCS | UDPCS);
+                               flags |= IPCS | UDPCS;
                        else
-                               BUG();
-               } else
-                       txd->opts1 = cpu_to_le32(eor | len | DescOwn |
-                                                FirstFrag | LastFrag);
+                               WARN_ON(1);     /* we need a WARN() */
+               }
+
+               txd->opts1 = cpu_to_le32(flags);
                wmb();
 
                cp->tx_skb[entry].skb = skb;
                cp->tx_skb[entry].mapping = mapping;
-               cp->tx_skb[entry].frag = 0;
+               cp->tx_skb[entry].len = len;
                entry = NEXT_TX(entry);
        } else {
                struct cp_desc *txd;
@@ -820,7 +845,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
                                               first_len, PCI_DMA_TODEVICE);
                cp->tx_skb[entry].skb = skb;
                cp->tx_skb[entry].mapping = first_mapping;
-               cp->tx_skb[entry].frag = 1;
+               cp->tx_skb[entry].len = first_len;
                entry = NEXT_TX(entry);
 
                for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) {
@@ -836,16 +861,19 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
                                                 len, PCI_DMA_TODEVICE);
                        eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0;
 
-                       if (skb->ip_summed == CHECKSUM_HW) {
-                               ctrl = eor | len | DescOwn | IPCS;
+                       ctrl = eor | len | DescOwn;
+
+                       if (mss)
+                               ctrl |= LargeSend |
+                                       ((mss & MSSMask) << MSSShift);
+                       else if (skb->ip_summed == CHECKSUM_HW) {
                                if (ip->protocol == IPPROTO_TCP)
-                                       ctrl |= TCPCS;
+                                       ctrl |= IPCS | TCPCS;
                                else if (ip->protocol == IPPROTO_UDP)
-                                       ctrl |= UDPCS;
+                                       ctrl |= IPCS | UDPCS;
                                else
                                        BUG();
-                       } else
-                               ctrl = eor | len | DescOwn;
+                       }
 
                        if (frag == skb_shinfo(skb)->nr_frags - 1)
                                ctrl |= LastFrag;
@@ -860,7 +888,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
 
                        cp->tx_skb[entry].skb = skb;
                        cp->tx_skb[entry].mapping = mapping;
-                       cp->tx_skb[entry].frag = frag + 2;
+                       cp->tx_skb[entry].len = len;
                        entry = NEXT_TX(entry);
                }
 
@@ -1074,7 +1102,6 @@ static int cp_refill_rx (struct cp_private *cp)
                cp->rx_skb[i].mapping = pci_map_single(cp->pdev,
                        skb->tail, cp->rx_buf_sz, PCI_DMA_FROMDEVICE);
                cp->rx_skb[i].skb = skb;
-               cp->rx_skb[i].frag = 0;
 
                cp->rx_ring[i].opts2 = 0;
                cp->rx_ring[i].addr = cpu_to_le64(cp->rx_skb[i].mapping);
@@ -1126,9 +1153,6 @@ static void cp_clean_rings (struct cp_private *cp)
 {
        unsigned i;
 
-       memset(cp->rx_ring, 0, sizeof(struct cp_desc) * CP_RX_RING_SIZE);
-       memset(cp->tx_ring, 0, sizeof(struct cp_desc) * CP_TX_RING_SIZE);
-
        for (i = 0; i < CP_RX_RING_SIZE; i++) {
                if (cp->rx_skb[i].skb) {
                        pci_unmap_single(cp->pdev, cp->rx_skb[i].mapping,
@@ -1140,13 +1164,18 @@ static void cp_clean_rings (struct cp_private *cp)
        for (i = 0; i < CP_TX_RING_SIZE; i++) {
                if (cp->tx_skb[i].skb) {
                        struct sk_buff *skb = cp->tx_skb[i].skb;
+
                        pci_unmap_single(cp->pdev, cp->tx_skb[i].mapping,
-                                        skb->len, PCI_DMA_TODEVICE);
-                       dev_kfree_skb(skb);
+                                        cp->tx_skb[i].len, PCI_DMA_TODEVICE);
+                       if (le32_to_cpu(cp->tx_ring[i].opts1) & LastFrag)
+                               dev_kfree_skb(skb);
                        cp->net_stats.tx_dropped++;
                }
        }
 
+       memset(cp->rx_ring, 0, sizeof(struct cp_desc) * CP_RX_RING_SIZE);
+       memset(cp->tx_ring, 0, sizeof(struct cp_desc) * CP_TX_RING_SIZE);
+
        memset(&cp->rx_skb, 0, sizeof(struct ring_info) * CP_RX_RING_SIZE);
        memset(&cp->tx_skb, 0, sizeof(struct ring_info) * CP_TX_RING_SIZE);
 }
@@ -1538,6 +1567,8 @@ static struct ethtool_ops cp_ethtool_ops = {
        .set_tx_csum            = ethtool_op_set_tx_csum, /* local! */
        .get_sg                 = ethtool_op_get_sg,
        .set_sg                 = ethtool_op_set_sg,
+       .get_tso                = ethtool_op_get_tso,
+       .set_tso                = ethtool_op_set_tso,
        .get_regs               = cp_get_regs,
        .get_wol                = cp_get_wol,
        .set_wol                = cp_set_wol,
@@ -1749,6 +1780,9 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        dev->get_stats = cp_get_stats;
        dev->do_ioctl = cp_ioctl;
        dev->poll = cp_rx_poll;
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       dev->poll_controller = cp_poll_controller;
+#endif
        dev->weight = 16;       /* arbitrary? from NAPI_HOWTO.txt. */
 #ifdef BROKEN
        dev->change_mtu = cp_change_mtu;
@@ -1768,6 +1802,10 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        if (pci_using_dac)
                dev->features |= NETIF_F_HIGHDMA;
 
+#if 0 /* disabled by default until verified */
+       dev->features |= NETIF_F_TSO;
+#endif
+
        dev->irq = pdev->irq;
 
        rc = register_netdev(dev);
index d4bd20c21a1f26a0a9e928d609d00817f9d1fc0f..047202c4d9a8b23bd150eae38654c211485f3ccf 100644 (file)
@@ -569,7 +569,7 @@ struct rtl_extra_stats {
 };
 
 struct rtl8139_private {
-       void *mmio_addr;
+       void __iomem *mmio_addr;
        int drv_flags;
        struct pci_dev *pci_dev;
        u32 msg_enable;
@@ -614,7 +614,7 @@ MODULE_PARM_DESC (multicast_filter_limit, "8139too maximum number of filtered mu
 MODULE_PARM_DESC (media, "8139too: Bits 4+9: force full duplex, bit 5: 100Mbps");
 MODULE_PARM_DESC (full_duplex, "8139too: Force full duplex for board(s) (1)");
 
-static int read_eeprom (void *ioaddr, int location, int addr_len);
+static int read_eeprom (void __iomem *ioaddr, int location, int addr_len);
 static int rtl8139_open (struct net_device *dev);
 static int mdio_read (struct net_device *dev, int phy_id, int location);
 static void mdio_write (struct net_device *dev, int phy_id, int location,
@@ -638,46 +638,20 @@ static void __set_rx_mode (struct net_device *dev);
 static void rtl8139_hw_start (struct net_device *dev);
 static struct ethtool_ops rtl8139_ethtool_ops;
 
-#ifdef USE_IO_OPS
-
-#define RTL_R8(reg)            inb (((unsigned long)ioaddr) + (reg))
-#define RTL_R16(reg)           inw (((unsigned long)ioaddr) + (reg))
-#define RTL_R32(reg)           ((unsigned long) inl (((unsigned long)ioaddr) + (reg)))
-#define RTL_W8(reg, val8)      outb ((val8), ((unsigned long)ioaddr) + (reg))
-#define RTL_W16(reg, val16)    outw ((val16), ((unsigned long)ioaddr) + (reg))
-#define RTL_W32(reg, val32)    outl ((val32), ((unsigned long)ioaddr) + (reg))
-#define RTL_W8_F               RTL_W8
-#define RTL_W16_F              RTL_W16
-#define RTL_W32_F              RTL_W32
-#undef readb
-#undef readw
-#undef readl
-#undef writeb
-#undef writew
-#undef writel
-#define readb(addr) inb((unsigned long)(addr))
-#define readw(addr) inw((unsigned long)(addr))
-#define readl(addr) inl((unsigned long)(addr))
-#define writeb(val,addr) outb((val),(unsigned long)(addr))
-#define writew(val,addr) outw((val),(unsigned long)(addr))
-#define writel(val,addr) outl((val),(unsigned long)(addr))
-
-#else
-
 /* write MMIO register, with flush */
 /* Flush avoids rtl8139 bug w/ posted MMIO writes */
-#define RTL_W8_F(reg, val8)    do { writeb ((val8), ioaddr + (reg)); readb (ioaddr + (reg)); } while (0)
-#define RTL_W16_F(reg, val16)  do { writew ((val16), ioaddr + (reg)); readw (ioaddr + (reg)); } while (0)
-#define RTL_W32_F(reg, val32)  do { writel ((val32), ioaddr + (reg)); readl (ioaddr + (reg)); } while (0)
+#define RTL_W8_F(reg, val8)    do { iowrite8 ((val8), ioaddr + (reg)); ioread8 (ioaddr + (reg)); } while (0)
+#define RTL_W16_F(reg, val16)  do { iowrite16 ((val16), ioaddr + (reg)); ioread16 (ioaddr + (reg)); } while (0)
+#define RTL_W32_F(reg, val32)  do { iowrite32 ((val32), ioaddr + (reg)); ioread32 (ioaddr + (reg)); } while (0)
 
 
 #define MMIO_FLUSH_AUDIT_COMPLETE 1
 #if MMIO_FLUSH_AUDIT_COMPLETE
 
 /* write MMIO register */
-#define RTL_W8(reg, val8)      writeb ((val8), ioaddr + (reg))
-#define RTL_W16(reg, val16)    writew ((val16), ioaddr + (reg))
-#define RTL_W32(reg, val32)    writel ((val32), ioaddr + (reg))
+#define RTL_W8(reg, val8)      iowrite8 ((val8), ioaddr + (reg))
+#define RTL_W16(reg, val16)    iowrite16 ((val16), ioaddr + (reg))
+#define RTL_W32(reg, val32)    iowrite32 ((val32), ioaddr + (reg))
 
 #else
 
@@ -689,11 +663,9 @@ static struct ethtool_ops rtl8139_ethtool_ops;
 #endif /* MMIO_FLUSH_AUDIT_COMPLETE */
 
 /* read MMIO register */
-#define RTL_R8(reg)            readb (ioaddr + (reg))
-#define RTL_R16(reg)           readw (ioaddr + (reg))
-#define RTL_R32(reg)           ((unsigned long) readl (ioaddr + (reg)))
-
-#endif /* USE_IO_OPS */
+#define RTL_R8(reg)            ioread8 (ioaddr + (reg))
+#define RTL_R16(reg)           ioread16 (ioaddr + (reg))
+#define RTL_R32(reg)           ((unsigned long) ioread32 (ioaddr + (reg)))
 
 
 static const u16 rtl8139_intr_mask =
@@ -740,10 +712,13 @@ static void __rtl8139_cleanup_dev (struct net_device *dev)
        assert (tp->pci_dev != NULL);
        pdev = tp->pci_dev;
 
-#ifndef USE_IO_OPS
+#ifdef USE_IO_OPS
+       if (tp->mmio_addr)
+               ioport_unmap (tp->mmio_addr);
+#else
        if (tp->mmio_addr)
-               iounmap (tp->mmio_addr);
-#endif /* !USE_IO_OPS */
+               pci_iounmap (pdev, tp->mmio_addr);
+#endif /* USE_IO_OPS */
 
        /* it's ok to call this even if we have no regions to free */
        pci_release_regions (pdev);
@@ -753,7 +728,7 @@ static void __rtl8139_cleanup_dev (struct net_device *dev)
 }
 
 
-static void rtl8139_chip_reset (void *ioaddr)
+static void rtl8139_chip_reset (void __iomem *ioaddr)
 {
        int i;
 
@@ -773,7 +748,7 @@ static void rtl8139_chip_reset (void *ioaddr)
 static int __devinit rtl8139_init_board (struct pci_dev *pdev,
                                         struct net_device **dev_out)
 {
-       void *ioaddr;
+       void __iomem *ioaddr;
        struct net_device *dev;
        struct rtl8139_private *tp;
        u8 tmp8;
@@ -855,13 +830,18 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev,
        pci_set_master (pdev);
 
 #ifdef USE_IO_OPS
-       ioaddr = (void *) pio_start;
+       ioaddr = ioport_map(pio_start, pio_len);
+       if (!ioaddr) {
+               printk (KERN_ERR PFX "%s: cannot map PIO, aborting\n", pci_name(pdev));
+               rc = -EIO;
+               goto err_out;
+       }
        dev->base_addr = pio_start;
        tp->mmio_addr = ioaddr;
        tp->regs_len = pio_len;
 #else
        /* ioremap MMIO region */
-       ioaddr = ioremap (mmio_start, mmio_len);
+       ioaddr = pci_iomap(pdev, 1, 0);
        if (ioaddr == NULL) {
                printk (KERN_ERR PFX "%s: cannot remap MMIO, aborting\n", pci_name(pdev));
                rc = -EIO;
@@ -947,7 +927,7 @@ static int __devinit rtl8139_init_one (struct pci_dev *pdev,
        struct net_device *dev = NULL;
        struct rtl8139_private *tp;
        int i, addr_len, option;
-       void *ioaddr;
+       void __iomem *ioaddr;
        static int board_idx = -1;
        u8 pci_rev;
 
@@ -1147,47 +1127,46 @@ static void __devexit rtl8139_remove_one (struct pci_dev *pdev)
    No extra delay is needed with 33Mhz PCI, but 66Mhz may change this.
  */
 
-#define eeprom_delay() readl(ee_addr)
+#define eeprom_delay() RTL_R32(Cfg9346)
 
 /* The EEPROM commands include the alway-set leading bit. */
 #define EE_WRITE_CMD   (5)
 #define EE_READ_CMD            (6)
 #define EE_ERASE_CMD   (7)
 
-static int __devinit read_eeprom (void *ioaddr, int location, int addr_len)
+static int __devinit read_eeprom (void __iomem *ioaddr, int location, int addr_len)
 {
        int i;
        unsigned retval = 0;
-       void *ee_addr = ioaddr + Cfg9346;
        int read_cmd = location | (EE_READ_CMD << addr_len);
 
-       writeb (EE_ENB & ~EE_CS, ee_addr);
-       writeb (EE_ENB, ee_addr);
+       RTL_W8 (Cfg9346, EE_ENB & ~EE_CS);
+       RTL_W8 (Cfg9346, EE_ENB);
        eeprom_delay ();
 
        /* Shift the read command bits out. */
        for (i = 4 + addr_len; i >= 0; i--) {
                int dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
-               writeb (EE_ENB | dataval, ee_addr);
+               RTL_W8 (Cfg9346, EE_ENB | dataval);
                eeprom_delay ();
-               writeb (EE_ENB | dataval | EE_SHIFT_CLK, ee_addr);
+               RTL_W8 (Cfg9346, EE_ENB | dataval | EE_SHIFT_CLK);
                eeprom_delay ();
        }
-       writeb (EE_ENB, ee_addr);
+       RTL_W8 (Cfg9346, EE_ENB);
        eeprom_delay ();
 
        for (i = 16; i > 0; i--) {
-               writeb (EE_ENB | EE_SHIFT_CLK, ee_addr);
+               RTL_W8 (Cfg9346, EE_ENB | EE_SHIFT_CLK);
                eeprom_delay ();
                retval =
-                   (retval << 1) | ((readb (ee_addr) & EE_DATA_READ) ? 1 :
+                   (retval << 1) | ((RTL_R8 (Cfg9346) & EE_DATA_READ) ? 1 :
                                     0);
-               writeb (EE_ENB, ee_addr);
+               RTL_W8 (Cfg9346, EE_ENB);
                eeprom_delay ();
        }
 
        /* Terminate the EEPROM access. */
-       writeb (~EE_CS, ee_addr);
+       RTL_W8 (Cfg9346, ~EE_CS);
        eeprom_delay ();
 
        return retval;
@@ -1206,7 +1185,7 @@ static int __devinit read_eeprom (void *ioaddr, int location, int addr_len)
 #define MDIO_WRITE0 (MDIO_DIR)
 #define MDIO_WRITE1 (MDIO_DIR | MDIO_DATA_OUT)
 
-#define mdio_delay(mdio_addr)  readb(mdio_addr)
+#define mdio_delay()   RTL_R8(Config4)
 
 
 static char mii_2_8139_map[8] = {
@@ -1223,15 +1202,15 @@ static char mii_2_8139_map[8] = {
 
 #ifdef CONFIG_8139TOO_8129
 /* Syncronize the MII management interface by shifting 32 one bits out. */
-static void mdio_sync (void *mdio_addr)
+static void mdio_sync (void __iomem *ioaddr)
 {
        int i;
 
        for (i = 32; i >= 0; i--) {
-               writeb (MDIO_WRITE1, mdio_addr);
-               mdio_delay (mdio_addr);
-               writeb (MDIO_WRITE1 | MDIO_CLK, mdio_addr);
-               mdio_delay (mdio_addr);
+               RTL_W8 (Config4, MDIO_WRITE1);
+               mdio_delay ();
+               RTL_W8 (Config4, MDIO_WRITE1 | MDIO_CLK);
+               mdio_delay ();
        }
 }
 #endif
@@ -1241,35 +1220,36 @@ static int mdio_read (struct net_device *dev, int phy_id, int location)
        struct rtl8139_private *tp = netdev_priv(dev);
        int retval = 0;
 #ifdef CONFIG_8139TOO_8129
-       void *mdio_addr = tp->mmio_addr + Config4;
+       void __iomem *ioaddr = tp->mmio_addr;
        int mii_cmd = (0xf6 << 10) | (phy_id << 5) | location;
        int i;
 #endif
 
        if (phy_id > 31) {      /* Really a 8139.  Use internal registers. */
+               void __iomem *ioaddr = tp->mmio_addr;
                return location < 8 && mii_2_8139_map[location] ?
-                   readw (tp->mmio_addr + mii_2_8139_map[location]) : 0;
+                   RTL_R16 (mii_2_8139_map[location]) : 0;
        }
 
 #ifdef CONFIG_8139TOO_8129
-       mdio_sync (mdio_addr);
+       mdio_sync (ioaddr);
        /* Shift the read command bits out. */
        for (i = 15; i >= 0; i--) {
                int dataval = (mii_cmd & (1 << i)) ? MDIO_DATA_OUT : 0;
 
-               writeb (MDIO_DIR | dataval, mdio_addr);
-               mdio_delay (mdio_addr);
-               writeb (MDIO_DIR | dataval | MDIO_CLK, mdio_addr);
-               mdio_delay (mdio_addr);
+               RTL_W8 (Config4, MDIO_DIR | dataval);
+               mdio_delay ();
+               RTL_W8 (Config4, MDIO_DIR | dataval | MDIO_CLK);
+               mdio_delay ();
        }
 
        /* Read the two transition, 16 data, and wire-idle bits. */
        for (i = 19; i > 0; i--) {
-               writeb (0, mdio_addr);
-               mdio_delay (mdio_addr);
-               retval = (retval << 1) | ((readb (mdio_addr) & MDIO_DATA_IN) ? 1 : 0);
-               writeb (MDIO_CLK, mdio_addr);
-               mdio_delay (mdio_addr);
+               RTL_W8 (Config4, 0);
+               mdio_delay ();
+               retval = (retval << 1) | ((RTL_R8 (Config4) & MDIO_DATA_IN) ? 1 : 0);
+               RTL_W8 (Config4, MDIO_CLK);
+               mdio_delay ();
        }
 #endif
 
@@ -1282,13 +1262,13 @@ static void mdio_write (struct net_device *dev, int phy_id, int location,
 {
        struct rtl8139_private *tp = netdev_priv(dev);
 #ifdef CONFIG_8139TOO_8129
-       void *mdio_addr = tp->mmio_addr + Config4;
+       void __iomem *ioaddr = tp->mmio_addr;
        int mii_cmd = (0x5002 << 16) | (phy_id << 23) | (location << 18) | value;
        int i;
 #endif
 
        if (phy_id > 31) {      /* Really a 8139.  Use internal registers. */
-               void *ioaddr = tp->mmio_addr;
+               void __iomem *ioaddr = tp->mmio_addr;
                if (location == 0) {
                        RTL_W8 (Cfg9346, Cfg9346_Unlock);
                        RTL_W16 (BasicModeCtrl, value);
@@ -1299,23 +1279,23 @@ static void mdio_write (struct net_device *dev, int phy_id, int location,
        }
 
 #ifdef CONFIG_8139TOO_8129
-       mdio_sync (mdio_addr);
+       mdio_sync (ioaddr);
 
        /* Shift the command bits out. */
        for (i = 31; i >= 0; i--) {
                int dataval =
                    (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0;
-               writeb (dataval, mdio_addr);
-               mdio_delay (mdio_addr);
-               writeb (dataval | MDIO_CLK, mdio_addr);
-               mdio_delay (mdio_addr);
+               RTL_W8 (Config4, dataval);
+               mdio_delay ();
+               RTL_W8 (Config4, dataval | MDIO_CLK);
+               mdio_delay ();
        }
        /* Clear out extra bits. */
        for (i = 2; i > 0; i--) {
-               writeb (0, mdio_addr);
-               mdio_delay (mdio_addr);
-               writeb (MDIO_CLK, mdio_addr);
-               mdio_delay (mdio_addr);
+               RTL_W8 (Config4, 0);
+               mdio_delay ();
+               RTL_W8 (Config4, MDIO_CLK);
+               mdio_delay ();
        }
 #endif
 }
@@ -1325,7 +1305,7 @@ static int rtl8139_open (struct net_device *dev)
 {
        struct rtl8139_private *tp = netdev_priv(dev);
        int retval;
-       void *ioaddr = tp->mmio_addr;
+       void __iomem *ioaddr = tp->mmio_addr;
 
        retval = request_irq (dev->irq, rtl8139_interrupt, SA_SHIRQ, dev->name, dev);
        if (retval)
@@ -1382,7 +1362,7 @@ static void rtl_check_media (struct net_device *dev, unsigned int init_media)
 static void rtl8139_hw_start (struct net_device *dev)
 {
        struct rtl8139_private *tp = netdev_priv(dev);
-       void *ioaddr = tp->mmio_addr;
+       void __iomem *ioaddr = tp->mmio_addr;
        u32 i;
        u8 tmp;
 
@@ -1484,7 +1464,7 @@ static void rtl8139_tune_twister (struct net_device *dev,
                                  struct rtl8139_private *tp)
 {
        int linkcase;
-       void *ioaddr = tp->mmio_addr;
+       void __iomem *ioaddr = tp->mmio_addr;
 
        /* This is a complicated state machine to configure the "twister" for
           impedance/echos based on the cable length.
@@ -1568,7 +1548,7 @@ static void rtl8139_tune_twister (struct net_device *dev,
 
 static inline void rtl8139_thread_iter (struct net_device *dev,
                                 struct rtl8139_private *tp,
-                                void *ioaddr)
+                                void __iomem *ioaddr)
 {
        int mii_lpa;
 
@@ -1676,7 +1656,7 @@ static inline void rtl8139_tx_clear (struct rtl8139_private *tp)
 static void rtl8139_tx_timeout (struct net_device *dev)
 {
        struct rtl8139_private *tp = netdev_priv(dev);
-       void *ioaddr = tp->mmio_addr;
+       void __iomem *ioaddr = tp->mmio_addr;
        int i;
        u8 tmp8;
        unsigned long flags;
@@ -1721,7 +1701,7 @@ static void rtl8139_tx_timeout (struct net_device *dev)
 static int rtl8139_start_xmit (struct sk_buff *skb, struct net_device *dev)
 {
        struct rtl8139_private *tp = netdev_priv(dev);
-       void *ioaddr = tp->mmio_addr;
+       void __iomem *ioaddr = tp->mmio_addr;
        unsigned int entry;
        unsigned int len = skb->len;
 
@@ -1763,7 +1743,7 @@ static int rtl8139_start_xmit (struct sk_buff *skb, struct net_device *dev)
 
 static void rtl8139_tx_interrupt (struct net_device *dev,
                                  struct rtl8139_private *tp,
-                                 void *ioaddr)
+                                 void __iomem *ioaddr)
 {
        unsigned long dirty_tx, tx_left;
 
@@ -1833,7 +1813,7 @@ static void rtl8139_tx_interrupt (struct net_device *dev,
 
 /* TODO: clean this up!  Rx reset need not be this intensive */
 static void rtl8139_rx_err (u32 rx_status, struct net_device *dev,
-                           struct rtl8139_private *tp, void *ioaddr)
+                           struct rtl8139_private *tp, void __iomem *ioaddr)
 {
        u8 tmp8;
 #ifdef CONFIG_8139_OLD_RX_RESET
@@ -1930,7 +1910,7 @@ static __inline__ void wrap_copy(struct sk_buff *skb, const unsigned char *ring,
 
 static void rtl8139_isr_ack(struct rtl8139_private *tp)
 {
-       void *ioaddr = tp->mmio_addr;
+       void __iomem *ioaddr = tp->mmio_addr;
        u16 status;
 
        status = RTL_R16 (IntrStatus) & RxAckBits;
@@ -1949,7 +1929,7 @@ static void rtl8139_isr_ack(struct rtl8139_private *tp)
 static int rtl8139_rx(struct net_device *dev, struct rtl8139_private *tp,
                      int budget)
 {
-       void *ioaddr = tp->mmio_addr;
+       void __iomem *ioaddr = tp->mmio_addr;
        int received = 0;
        unsigned char *rx_ring = tp->rx_ring;
        unsigned int cur_rx = tp->cur_rx;
@@ -2087,7 +2067,7 @@ out:
 
 static void rtl8139_weird_interrupt (struct net_device *dev,
                                     struct rtl8139_private *tp,
-                                    void *ioaddr,
+                                    void __iomem *ioaddr,
                                     int status, int link_changed)
 {
        DPRINTK ("%s: Abnormal interrupt, status %8.8x.\n",
@@ -2127,7 +2107,7 @@ static void rtl8139_weird_interrupt (struct net_device *dev,
 static int rtl8139_poll(struct net_device *dev, int *budget)
 {
        struct rtl8139_private *tp = netdev_priv(dev);
-       void *ioaddr = tp->mmio_addr;
+       void __iomem *ioaddr = tp->mmio_addr;
        int orig_budget = min(*budget, dev->quota);
        int done = 1;
 
@@ -2165,7 +2145,7 @@ static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance,
 {
        struct net_device *dev = (struct net_device *) dev_instance;
        struct rtl8139_private *tp = netdev_priv(dev);
-       void *ioaddr = tp->mmio_addr;
+       void __iomem *ioaddr = tp->mmio_addr;
        u16 status, ackstat;
        int link_changed = 0; /* avoid bogus "uninit" warning */
        int handled = 0;
@@ -2241,7 +2221,7 @@ static void rtl8139_poll_controller(struct net_device *dev)
 static int rtl8139_close (struct net_device *dev)
 {
        struct rtl8139_private *tp = netdev_priv(dev);
-       void *ioaddr = tp->mmio_addr;
+       void __iomem *ioaddr = tp->mmio_addr;
        int ret = 0;
        unsigned long flags;
 
@@ -2304,7 +2284,7 @@ static int rtl8139_close (struct net_device *dev)
 static void rtl8139_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 {
        struct rtl8139_private *np = netdev_priv(dev);
-       void *ioaddr = np->mmio_addr;
+       void __iomem *ioaddr = np->mmio_addr;
 
        spin_lock_irq(&np->lock);
        if (rtl_chip_info[np->chipset].flags & HasLWake) {
@@ -2338,7 +2318,7 @@ static void rtl8139_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 static int rtl8139_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 {
        struct rtl8139_private *np = netdev_priv(dev);
-       void *ioaddr = np->mmio_addr;
+       void __iomem *ioaddr = np->mmio_addr;
        u32 support;
        u8 cfg3, cfg5;
 
@@ -2506,7 +2486,7 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 static struct net_device_stats *rtl8139_get_stats (struct net_device *dev)
 {
        struct rtl8139_private *tp = netdev_priv(dev);
-       void *ioaddr = tp->mmio_addr;
+       void __iomem *ioaddr = tp->mmio_addr;
        unsigned long flags;
 
        if (netif_running(dev)) {
@@ -2525,7 +2505,7 @@ static struct net_device_stats *rtl8139_get_stats (struct net_device *dev)
 static void __set_rx_mode (struct net_device *dev)
 {
        struct rtl8139_private *tp = netdev_priv(dev);
-       void *ioaddr = tp->mmio_addr;
+       void __iomem *ioaddr = tp->mmio_addr;
        u32 mc_filter[2];       /* Multicast hash filter */
        int i, rx_mode;
        u32 tmp;
@@ -2586,7 +2566,7 @@ static int rtl8139_suspend (struct pci_dev *pdev, pm_message_t state)
 {
        struct net_device *dev = pci_get_drvdata (pdev);
        struct rtl8139_private *tp = netdev_priv(dev);
-       void *ioaddr = tp->mmio_addr;
+       void __iomem *ioaddr = tp->mmio_addr;
        unsigned long flags;
 
        pci_save_state (pdev);
index bab16bcc9ae5df82cc4197bf255926ae76acdc1d..6d76f3a99b175f533d06451a76f773f692f8cc8d 100644 (file)
@@ -225,9 +225,9 @@ void ei_tx_timeout(struct net_device *dev)
        unsigned long icucr;
 
        local_irq_save(flags);
-       icucr = inl(ICUCR1);
+       icucr = inl(M32R_ICU_CR1_PORTL);
        icucr |= M32R_ICUCR_ISMOD11;
-       outl(icucr, ICUCR1);
+       outl(icucr, M32R_ICU_CR1_PORTL);
        local_irq_restore(flags);
 #endif
        ei_local->stat.tx_errors++;
index 3a0a55b62aaff83280434ee5a493f4fc1b5a2a36..fa9f76c953ddaf930ca929f05c1d3702bf4088c7 100644 (file)
@@ -824,6 +824,18 @@ config SMC9194
          <file:Documentation/networking/net-modules.txt>. The module
          will be called smc9194.
 
+config DM9000
+       tristate "DM9000 support"
+       depends on ARM && NET_ETHERNET
+       select CRC32
+       select MII
+       ---help---
+         Support for DM9000 chipset.
+
+         To compile this driver as a module, choose M here and read
+         <file:Documentation/networking/net-modules.txt>.  The module will be
+         called dm9000.
+
 config NET_VENDOR_RACAL
        bool "Racal-Interlan (Micom) NI cards"
        depends on NET_ETHERNET && ISA
@@ -989,21 +1001,6 @@ config EEXPRESS_PRO
          <file:Documentation/networking/net-modules.txt>. The module
          will be called eepro.
 
-config FMV18X
-       tristate "FMV-181/182/183/184 support (OBSOLETE)"
-       depends on NET_ISA && OBSOLETE
-       ---help---
-         If you have a Fujitsu FMV-181/182/183/184 network (Ethernet) card,
-         say Y and read the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         If you use an FMV-183 or FMV-184 and it is not working, you may need
-         to disable Plug & Play mode of the card.
-
-         To compile this driver as a module, choose M here and read
-         <file:Documentation/networking/net-modules.txt>. The module
-         will be called fmv18x.
-
 config HPLAN_PLUS
        tristate "HP PCLAN+ (27247B and 27252A) support"
        depends on NET_ISA
@@ -1092,14 +1089,6 @@ config SEEQ8005
          <file:Documentation/networking/net-modules.txt>. The module
          will be called seeq8005.
 
-config SK_G16
-       tristate "SK_G16 support (OBSOLETE)"
-       depends on NET_ISA && OBSOLETE
-       help
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
 config SKMC
        tristate "SKnet MCA support"
        depends on NET_ETHERNET && MCA && BROKEN
@@ -1555,6 +1544,7 @@ config SIS900
        tristate "SiS 900/7016 PCI Fast Ethernet Adapter support"
        depends on NET_PCI && PCI
        select CRC32
+       select MII
        ---help---
          This is a driver for the Fast Ethernet PCI network cards based on
          the SiS 900 and SiS 7016 chips. The SiS 900 core is also embedded in
@@ -1931,6 +1921,18 @@ config R8169_VLAN
          
          If in doubt, say Y.
 
+config SKGE
+       tristate "New SysKonnect GigaEthernet support (EXPERIMENTAL)"
+       depends on PCI && EXPERIMENTAL
+       select CRC32
+       ---help---
+         This driver support the Marvell Yukon or SysKonnect SK-98xx/SK-95xx
+         and related Gigabit Ethernet adapters. It is a new smaller driver
+         driver with better performance and more complete ethtool support.
+
+         It does not support the link failover and network management 
+         features that "portable" vendor supplied sk98lin driver does.
+       
 config SK98LIN
        tristate "Marvell Yukon Chipset / SysKonnect SK-98xx Support"
        depends on PCI
@@ -2031,6 +2033,15 @@ config TIGON3
          To compile this driver as a module, choose M here: the module
          will be called tg3.  This is recommended.
 
+config BNX2
+       tristate "Broadcom NetXtremeII support"
+       depends on PCI
+       help
+         This driver supports Broadcom NetXtremeII gigabit Ethernet cards.
+
+         To compile this driver as a module, choose M here: the module
+         will be called bnx2.  This is recommended.
+
 config GIANFAR
        tristate "Gianfar Ethernet"
        depends on 85xx || 83xx
index 6202b10dbb4df11c92119b253fc7281fe5bbf41d..63c6d1e6d4d982937ada0fdaca07003ec29ef9e6 100644 (file)
@@ -51,7 +51,9 @@ obj-$(CONFIG_NS83820) += ns83820.o
 obj-$(CONFIG_STNIC) += stnic.o 8390.o
 obj-$(CONFIG_FEALNX) += fealnx.o
 obj-$(CONFIG_TIGON3) += tg3.o
+obj-$(CONFIG_BNX2) += bnx2.o
 obj-$(CONFIG_TC35815) += tc35815.o
+obj-$(CONFIG_SKGE) += skge.o
 obj-$(CONFIG_SK98LIN) += sk98lin/
 obj-$(CONFIG_SKFP) += skfp/
 obj-$(CONFIG_VIA_RHINE) += via-rhine.o
@@ -73,7 +75,6 @@ obj-$(CONFIG_MAC8390) += mac8390.o 8390.o
 obj-$(CONFIG_APNE) += apne.o 8390.o
 obj-$(CONFIG_PCMCIA_PCNET) += 8390.o
 obj-$(CONFIG_SHAPER) += shaper.o
-obj-$(CONFIG_SK_G16) += sk_g16.o
 obj-$(CONFIG_HP100) += hp100.o
 obj-$(CONFIG_SMC9194) += smc9194.o
 obj-$(CONFIG_FEC) += fec.o
@@ -121,7 +122,6 @@ obj-$(CONFIG_DEFXX) += defxx.o
 obj-$(CONFIG_SGISEEQ) += sgiseeq.o
 obj-$(CONFIG_SGI_O2MACE_ETH) += meth.o
 obj-$(CONFIG_AT1700) += at1700.o
-obj-$(CONFIG_FMV18X) += fmv18x.o
 obj-$(CONFIG_EL1) += 3c501.o
 obj-$(CONFIG_EL16) += 3c507.o
 obj-$(CONFIG_ELMC) += 3c523.o
@@ -179,6 +179,7 @@ obj-$(CONFIG_AMD8111_ETH) += amd8111e.o
 obj-$(CONFIG_IBMVETH) += ibmveth.o
 obj-$(CONFIG_S2IO) += s2io.o
 obj-$(CONFIG_SMC91X) += smc91x.o
+obj-$(CONFIG_DM9000) += dm9000.o
 obj-$(CONFIG_FEC_8XX) += fec_8xx/
 
 obj-$(CONFIG_ARM) += arm/
@@ -187,7 +188,7 @@ obj-$(CONFIG_TR) += tokenring/
 obj-$(CONFIG_WAN) += wan/
 obj-$(CONFIG_ARCNET) += arcnet/
 obj-$(CONFIG_NET_PCMCIA) += pcmcia/
-obj-$(CONFIG_NET_WIRELESS) += wireless/
+obj-$(CONFIG_NET_RADIO) += wireless/
 obj-$(CONFIG_NET_TULIP) += tulip/
 obj-$(CONFIG_HAMRADIO) += hamradio/
 obj-$(CONFIG_IRDA) += irda/
index fb433325aa277e7dec82aa526c233a093b10f145..3707df6b0cfaf5a734ef7de6e636fd8a1aecaa76 100644 (file)
@@ -210,9 +210,6 @@ static struct devprobe2 isa_probes[] __initdata = {
 #ifdef CONFIG_AT1700
        {at1700_probe, 0},
 #endif
-#ifdef CONFIG_FMV18X           /* Fujitsu FMV-181/182 */
-       {fmv18x_probe, 0},
-#endif
 #ifdef CONFIG_ETH16I
        {eth16i_probe, 0},      /* ICL EtherTeam 16i/32 */
 #endif
@@ -243,9 +240,6 @@ static struct devprobe2 isa_probes[] __initdata = {
 #ifdef CONFIG_ELPLUS           /* 3c505 */
        {elplus_probe, 0},
 #endif
-#ifdef CONFIG_SK_G16
-       {SK_init, 0},
-#endif
 #ifdef CONFIG_NI5010
        {ni5010_probe, 0},
 #endif
index f2e937abf7b4d8c639675100dd5ffc74c5323ebe..b7dd7260cafbf137656a3f50059a7136b55ec661 100755 (executable)
@@ -738,6 +738,7 @@ static int amd8111e_rx_poll(struct net_device *dev, int * budget)
        short vtag;
 #endif
        int rx_pkt_limit = dev->quota;
+       unsigned long flags;
        
        do{   
                /* process receive packets until we use the quota*/
@@ -841,18 +842,19 @@ static int amd8111e_rx_poll(struct net_device *dev, int * budget)
        /* Receive descriptor is empty now */
        dev->quota -= num_rx_pkt;
        *budget -= num_rx_pkt;
+
+       spin_lock_irqsave(&lp->lock, flags);
        netif_rx_complete(dev);
-       /* enable receive interrupt */
        writel(VAL0|RINTEN0, mmio + INTEN0);
        writel(VAL2 | RDMD0, mmio + CMD0);
+       spin_unlock_irqrestore(&lp->lock, flags);
        return 0;
+
 rx_not_empty:
        /* Do not call a netif_rx_complete */
        dev->quota -= num_rx_pkt;       
        *budget -= num_rx_pkt;
        return 1;
-
-       
 }
 
 #else
@@ -1261,18 +1263,20 @@ static irqreturn_t amd8111e_interrupt(int irq, void *dev_id, struct pt_regs *reg
        struct net_device * dev = (struct net_device *) dev_id;
        struct amd8111e_priv *lp = netdev_priv(dev);
        void __iomem *mmio = lp->mmio;
-       unsigned int intr0;
+       unsigned int intr0, intren0;
        unsigned int handled = 1;
 
-       if(dev == NULL)
+       if(unlikely(dev == NULL))
                return IRQ_NONE;
 
-       if (regs) spin_lock (&lp->lock);
+       spin_lock(&lp->lock);
+
        /* disabling interrupt */
        writel(INTREN, mmio + CMD0);
 
        /* Read interrupt status */
        intr0 = readl(mmio + INT0);
+       intren0 = readl(mmio + INTEN0);
 
        /* Process all the INT event until INTR bit is clear. */
 
@@ -1293,11 +1297,11 @@ static irqreturn_t amd8111e_interrupt(int irq, void *dev_id, struct pt_regs *reg
                        /* Schedule a polling routine */
                        __netif_rx_schedule(dev);
                }
-               else {
+               else if (intren0 & RINTEN0) {
                        printk("************Driver bug! \
                                interrupt while in poll\n");
-                       /* Fix by disabling interrupts */
-                       writel(RINT0, mmio + INT0);
+                       /* Fix by disable receive interrupts */
+                       writel(RINTEN0, mmio + INTEN0);
                }
        }
 #else
@@ -1321,7 +1325,7 @@ static irqreturn_t amd8111e_interrupt(int irq, void *dev_id, struct pt_regs *reg
 err_no_interrupt:
        writel( VAL0 | INTREN,mmio + CMD0);
        
-       if (regs) spin_unlock(&lp->lock);
+       spin_unlock(&lp->lock);
        
        return IRQ_RETVAL(handled);
 }
index 942a2819576c2efe229c6c6cb71fc4a9c9d79b4f..2e28c201dcc01722a4d39db05c16de45f0f2129f 100644 (file)
@@ -68,6 +68,7 @@ struct etherh_priv {
        void __iomem    *dma_base;
        unsigned int    id;
        void __iomem    *ctrl_port;
+       void __iomem    *base;
        unsigned char   ctrl;
        u32             supported;
 };
@@ -177,7 +178,7 @@ etherh_setif(struct net_device *dev)
        switch (etherh_priv(dev)->id) {
        case PROD_I3_ETHERLAN600:
        case PROD_I3_ETHERLAN600A:
-               addr = (void *)dev->base_addr + EN0_RCNTHI;
+               addr = etherh_priv(dev)->base + EN0_RCNTHI;
 
                switch (dev->if_port) {
                case IF_PORT_10BASE2:
@@ -218,7 +219,7 @@ etherh_getifstat(struct net_device *dev)
        switch (etherh_priv(dev)->id) {
        case PROD_I3_ETHERLAN600:
        case PROD_I3_ETHERLAN600A:
-               addr = (void *)dev->base_addr + EN0_RCNTHI;
+               addr = etherh_priv(dev)->base + EN0_RCNTHI;
                switch (dev->if_port) {
                case IF_PORT_10BASE2:
                        stat = 1;
@@ -281,7 +282,7 @@ static void
 etherh_reset(struct net_device *dev)
 {
        struct ei_device *ei_local = netdev_priv(dev);
-       void __iomem *addr = (void *)dev->base_addr;
+       void __iomem *addr = etherh_priv(dev)->base;
 
        writeb(E8390_NODMA+E8390_PAGE0+E8390_STOP, addr);
 
@@ -327,7 +328,7 @@ etherh_block_output (struct net_device *dev, int count, const unsigned char *buf
 
        ei_local->dmaing = 1;
 
-       addr = (void *)dev->base_addr;
+       addr = etherh_priv(dev)->base;
        dma_base = etherh_priv(dev)->dma_base;
 
        count = (count + 1) & ~1;
@@ -387,7 +388,7 @@ etherh_block_input (struct net_device *dev, int count, struct sk_buff *skb, int
 
        ei_local->dmaing = 1;
 
-       addr = (void *)dev->base_addr;
+       addr = etherh_priv(dev)->base;
        dma_base = etherh_priv(dev)->dma_base;
 
        buf = skb->data;
@@ -427,7 +428,7 @@ etherh_get_header (struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_p
 
        ei_local->dmaing = 1;
 
-       addr = (void *)dev->base_addr;
+       addr = etherh_priv(dev)->base;
        dma_base = etherh_priv(dev)->dma_base;
 
        writeb (E8390_NODMA | E8390_PAGE0 | E8390_START, addr + E8390_CMD);
@@ -696,7 +697,8 @@ etherh_probe(struct expansion_card *ec, const struct ecard_id *id)
                eh->ctrl_port = eh->ioc_fast;
        }
 
-       dev->base_addr = (unsigned long)eh->memc + data->ns8390_offset;
+       eh->base = eh->memc + data->ns8390_offset;
+       dev->base_addr = (unsigned long)eh->base;
        eh->dma_base = eh->memc + data->dataport_offset;
        eh->ctrl_port += data->ctrlport_offset;
 
index 5a2efd343db48be907bdfecfc34d6633f4370c37..c82b9cd1c9246c1b1660a059757fd0764912ee5b 100644 (file)
@@ -1681,10 +1681,6 @@ static int au1000_init(struct net_device *dev)
                control |= MAC_FULL_DUPLEX;
        }
 
-       /* fix for startup without cable */
-       if (!link) 
-               dev->flags &= ~IFF_RUNNING;
-
        aup->mac->control = control;
        aup->mac->vlan1_tag = 0x8100; /* activate vlan support */
        au_sync();
@@ -1709,16 +1705,14 @@ static void au1000_timer(unsigned long data)
        if_port = dev->if_port;
        if (aup->phy_ops->phy_status(dev, aup->phy_addr, &link, &speed) == 0) {
                if (link) {
-                       if (!(dev->flags & IFF_RUNNING)) {
+                       if (!netif_carrier_ok(dev)) {
                                netif_carrier_on(dev);
-                               dev->flags |= IFF_RUNNING;
                                printk(KERN_INFO "%s: link up\n", dev->name);
                        }
                }
                else {
-                       if (dev->flags & IFF_RUNNING) {
+                       if (netif_carrier_ok(dev)) {
                                netif_carrier_off(dev);
-                               dev->flags &= ~IFF_RUNNING;
                                dev->if_port = 0;
                                printk(KERN_INFO "%s: link down\n", dev->name);
                        }
index 734bd4ee3f9b99f8dbe867b36e5a010dfd633632..00e5257b176f835a2842d7dd0ff854eeabc9c5b5 100644 (file)
@@ -1412,7 +1412,6 @@ static int bmac_open(struct net_device *dev)
        bp->opened = 1;
        bmac_reset_and_enable(dev);
        enable_irq(dev->irq);
-       dev->flags |= IFF_RUNNING;
        return 0;
 }
 
@@ -1425,7 +1424,6 @@ static int bmac_close(struct net_device *dev)
        int i;
 
        bp->sleeping = 1;
-       dev->flags &= ~(IFF_UP | IFF_RUNNING);
 
        /* disable rx and tx */
        config = bmread(dev, RXCFG);
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
new file mode 100644 (file)
index 0000000..8acc655
--- /dev/null
@@ -0,0 +1,5530 @@
+/* bnx2.c: Broadcom NX2 network driver.
+ *
+ * Copyright (c) 2004, 2005 Broadcom Corporation
+ *
+ * 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.
+ *
+ * Written by: Michael Chan  (mchan@broadcom.com)
+ */
+
+#include "bnx2.h"
+#include "bnx2_fw.h"
+
+#define DRV_MODULE_NAME                "bnx2"
+#define PFX DRV_MODULE_NAME    ": "
+#define DRV_MODULE_VERSION     "1.2.19"
+#define DRV_MODULE_RELDATE     "May 23, 2005"
+
+#define RUN_AT(x) (jiffies + (x))
+
+/* Time in jiffies before concluding the transmitter is hung. */
+#define TX_TIMEOUT  (5*HZ)
+
+static char version[] __devinitdata =
+       "Broadcom NetXtreme II Gigabit Ethernet Driver " DRV_MODULE_NAME " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
+
+MODULE_AUTHOR("Michael Chan <mchan@broadcom.com>");
+MODULE_DESCRIPTION("Broadcom NetXtreme II BCM5706 Driver");
+MODULE_LICENSE("GPL");
+MODULE_VERSION(DRV_MODULE_VERSION);
+
+static int disable_msi = 0;
+
+module_param(disable_msi, int, 0);
+MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");
+
+typedef enum {
+       BCM5706 = 0,
+       NC370T,
+       NC370I,
+       BCM5706S,
+       NC370F,
+} board_t;
+
+/* indexed by board_t, above */
+static struct {
+       char *name;
+} board_info[] __devinitdata = {
+       { "Broadcom NetXtreme II BCM5706 1000Base-T" },
+       { "HP NC370T Multifunction Gigabit Server Adapter" },
+       { "HP NC370i Multifunction Gigabit Server Adapter" },
+       { "Broadcom NetXtreme II BCM5706 1000Base-SX" },
+       { "HP NC370F Multifunction Gigabit Server Adapter" },
+       { 0 },
+       };
+
+static struct pci_device_id bnx2_pci_tbl[] = {
+       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
+         PCI_VENDOR_ID_HP, 0x3101, 0, 0, NC370T },
+       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
+         PCI_VENDOR_ID_HP, 0x3106, 0, 0, NC370I },
+       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
+         PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5706 },
+       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S,
+         PCI_VENDOR_ID_HP, 0x3102, 0, 0, NC370F },
+       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S,
+         PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5706S },
+       { 0, }
+};
+
+static struct flash_spec flash_table[] =
+{
+       /* Slow EEPROM */
+       {0x00000000, 0x40030380, 0x009f0081, 0xa184a053, 0xaf000400,
+        1, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
+        SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
+        "EEPROM - slow"},
+       /* Fast EEPROM */
+       {0x02000000, 0x62008380, 0x009f0081, 0xa184a053, 0xaf000400,
+        1, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
+        SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
+        "EEPROM - fast"},
+       /* ATMEL AT45DB011B (buffered flash) */
+       {0x02000003, 0x6e008173, 0x00570081, 0x68848353, 0xaf000400,
+        1, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
+        BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE,
+        "Buffered flash"},
+       /* Saifun SA25F005 (non-buffered flash) */
+               /* strap, cfg1, & write1 need updates */
+       {0x01000003, 0x5f008081, 0x00050081, 0x03840253, 0xaf020406,
+        0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
+        SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE,
+        "Non-buffered flash (64kB)"},
+       /* Saifun SA25F010 (non-buffered flash) */
+       /* strap, cfg1, & write1 need updates */
+       {0x00000001, 0x47008081, 0x00050081, 0x03840253, 0xaf020406,
+        0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
+        SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*2,
+        "Non-buffered flash (128kB)"},
+       /* Saifun SA25F020 (non-buffered flash) */
+       /* strap, cfg1, & write1 need updates */
+       {0x00000003, 0x4f008081, 0x00050081, 0x03840253, 0xaf020406,
+        0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
+        SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*4,
+        "Non-buffered flash (256kB)"},
+};
+
+MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl);
+
+static u32
+bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset)
+{
+       REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
+       return (REG_RD(bp, BNX2_PCICFG_REG_WINDOW));
+}
+
+static void
+bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val)
+{
+       REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
+       REG_WR(bp, BNX2_PCICFG_REG_WINDOW, val);
+}
+
+static void
+bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val)
+{
+       offset += cid_addr;
+       REG_WR(bp, BNX2_CTX_DATA_ADR, offset);
+       REG_WR(bp, BNX2_CTX_DATA, val);
+}
+
+static int
+bnx2_read_phy(struct bnx2 *bp, u32 reg, u32 *val)
+{
+       u32 val1;
+       int i, ret;
+
+       if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
+               val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
+               val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
+
+               REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
+               REG_RD(bp, BNX2_EMAC_MDIO_MODE);
+
+               udelay(40);
+       }
+
+       val1 = (bp->phy_addr << 21) | (reg << 16) |
+               BNX2_EMAC_MDIO_COMM_COMMAND_READ | BNX2_EMAC_MDIO_COMM_DISEXT |
+               BNX2_EMAC_MDIO_COMM_START_BUSY;
+       REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
+
+       for (i = 0; i < 50; i++) {
+               udelay(10);
+
+               val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
+               if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
+                       udelay(5);
+
+                       val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
+                       val1 &= BNX2_EMAC_MDIO_COMM_DATA;
+
+                       break;
+               }
+       }
+
+       if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY) {
+               *val = 0x0;
+               ret = -EBUSY;
+       }
+       else {
+               *val = val1;
+               ret = 0;
+       }
+
+       if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
+               val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
+               val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
+
+               REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
+               REG_RD(bp, BNX2_EMAC_MDIO_MODE);
+
+               udelay(40);
+       }
+
+       return ret;
+}
+
+static int
+bnx2_write_phy(struct bnx2 *bp, u32 reg, u32 val)
+{
+       u32 val1;
+       int i, ret;
+
+       if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
+               val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
+               val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
+
+               REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
+               REG_RD(bp, BNX2_EMAC_MDIO_MODE);
+
+               udelay(40);
+       }
+
+       val1 = (bp->phy_addr << 21) | (reg << 16) | val |
+               BNX2_EMAC_MDIO_COMM_COMMAND_WRITE |
+               BNX2_EMAC_MDIO_COMM_START_BUSY | BNX2_EMAC_MDIO_COMM_DISEXT;
+       REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
+    
+       for (i = 0; i < 50; i++) {
+               udelay(10);
+
+               val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
+               if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
+                       udelay(5);
+                       break;
+               }
+       }
+
+       if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)
+               ret = -EBUSY;
+       else
+               ret = 0;
+
+       if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
+               val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
+               val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
+
+               REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
+               REG_RD(bp, BNX2_EMAC_MDIO_MODE);
+
+               udelay(40);
+       }
+
+       return ret;
+}
+
+static void
+bnx2_disable_int(struct bnx2 *bp)
+{
+       REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
+              BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
+       REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD);
+}
+
+static void
+bnx2_enable_int(struct bnx2 *bp)
+{
+       u32 val;
+
+       REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
+              BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | bp->last_status_idx);
+
+       val = REG_RD(bp, BNX2_HC_COMMAND);
+       REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW);
+}
+
+static void
+bnx2_disable_int_sync(struct bnx2 *bp)
+{
+       atomic_inc(&bp->intr_sem);
+       bnx2_disable_int(bp);
+       synchronize_irq(bp->pdev->irq);
+}
+
+static void
+bnx2_netif_stop(struct bnx2 *bp)
+{
+       bnx2_disable_int_sync(bp);
+       if (netif_running(bp->dev)) {
+               netif_poll_disable(bp->dev);
+               netif_tx_disable(bp->dev);
+               bp->dev->trans_start = jiffies; /* prevent tx timeout */
+       }
+}
+
+static void
+bnx2_netif_start(struct bnx2 *bp)
+{
+       if (atomic_dec_and_test(&bp->intr_sem)) {
+               if (netif_running(bp->dev)) {
+                       netif_wake_queue(bp->dev);
+                       netif_poll_enable(bp->dev);
+                       bnx2_enable_int(bp);
+               }
+       }
+}
+
+static void
+bnx2_free_mem(struct bnx2 *bp)
+{
+       if (bp->stats_blk) {
+               pci_free_consistent(bp->pdev, sizeof(struct statistics_block),
+                                   bp->stats_blk, bp->stats_blk_mapping);
+               bp->stats_blk = NULL;
+       }
+       if (bp->status_blk) {
+               pci_free_consistent(bp->pdev, sizeof(struct status_block),
+                                   bp->status_blk, bp->status_blk_mapping);
+               bp->status_blk = NULL;
+       }
+       if (bp->tx_desc_ring) {
+               pci_free_consistent(bp->pdev,
+                                   sizeof(struct tx_bd) * TX_DESC_CNT,
+                                   bp->tx_desc_ring, bp->tx_desc_mapping);
+               bp->tx_desc_ring = NULL;
+       }
+       if (bp->tx_buf_ring) {
+               kfree(bp->tx_buf_ring);
+               bp->tx_buf_ring = NULL;
+       }
+       if (bp->rx_desc_ring) {
+               pci_free_consistent(bp->pdev,
+                                   sizeof(struct rx_bd) * RX_DESC_CNT,
+                                   bp->rx_desc_ring, bp->rx_desc_mapping);
+               bp->rx_desc_ring = NULL;
+       }
+       if (bp->rx_buf_ring) {
+               kfree(bp->rx_buf_ring);
+               bp->rx_buf_ring = NULL;
+       }
+}
+
+static int
+bnx2_alloc_mem(struct bnx2 *bp)
+{
+       bp->tx_buf_ring = kmalloc(sizeof(struct sw_bd) * TX_DESC_CNT,
+                                    GFP_KERNEL);
+       if (bp->tx_buf_ring == NULL)
+               return -ENOMEM;
+
+       memset(bp->tx_buf_ring, 0, sizeof(struct sw_bd) * TX_DESC_CNT);
+       bp->tx_desc_ring = pci_alloc_consistent(bp->pdev,
+                                               sizeof(struct tx_bd) *
+                                               TX_DESC_CNT,
+                                               &bp->tx_desc_mapping);
+       if (bp->tx_desc_ring == NULL)
+               goto alloc_mem_err;
+
+       bp->rx_buf_ring = kmalloc(sizeof(struct sw_bd) * RX_DESC_CNT,
+                                    GFP_KERNEL);
+       if (bp->rx_buf_ring == NULL)
+               goto alloc_mem_err;
+
+       memset(bp->rx_buf_ring, 0, sizeof(struct sw_bd) * RX_DESC_CNT);
+       bp->rx_desc_ring = pci_alloc_consistent(bp->pdev,
+                                               sizeof(struct rx_bd) *
+                                               RX_DESC_CNT,
+                                               &bp->rx_desc_mapping);
+       if (bp->rx_desc_ring == NULL)
+               goto alloc_mem_err;
+
+       bp->status_blk = pci_alloc_consistent(bp->pdev,
+                                             sizeof(struct status_block),
+                                             &bp->status_blk_mapping);
+       if (bp->status_blk == NULL)
+               goto alloc_mem_err;
+
+       memset(bp->status_blk, 0, sizeof(struct status_block));
+
+       bp->stats_blk = pci_alloc_consistent(bp->pdev,
+                                            sizeof(struct statistics_block),
+                                            &bp->stats_blk_mapping);
+       if (bp->stats_blk == NULL)
+               goto alloc_mem_err;
+
+       memset(bp->stats_blk, 0, sizeof(struct statistics_block));
+
+       return 0;
+
+alloc_mem_err:
+       bnx2_free_mem(bp);
+       return -ENOMEM;
+}
+
+static void
+bnx2_report_link(struct bnx2 *bp)
+{
+       if (bp->link_up) {
+               netif_carrier_on(bp->dev);
+               printk(KERN_INFO PFX "%s NIC Link is Up, ", bp->dev->name);
+
+               printk("%d Mbps ", bp->line_speed);
+
+               if (bp->duplex == DUPLEX_FULL)
+                       printk("full duplex");
+               else
+                       printk("half duplex");
+
+               if (bp->flow_ctrl) {
+                       if (bp->flow_ctrl & FLOW_CTRL_RX) {
+                               printk(", receive ");
+                               if (bp->flow_ctrl & FLOW_CTRL_TX)
+                                       printk("& transmit ");
+                       }
+                       else {
+                               printk(", transmit ");
+                       }
+                       printk("flow control ON");
+               }
+               printk("\n");
+       }
+       else {
+               netif_carrier_off(bp->dev);
+               printk(KERN_ERR PFX "%s NIC Link is Down\n", bp->dev->name);
+       }
+}
+
+static void
+bnx2_resolve_flow_ctrl(struct bnx2 *bp)
+{
+       u32 local_adv, remote_adv;
+
+       bp->flow_ctrl = 0;
+       if ((bp->autoneg & (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) != 
+               (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) {
+
+               if (bp->duplex == DUPLEX_FULL) {
+                       bp->flow_ctrl = bp->req_flow_ctrl;
+               }
+               return;
+       }
+
+       if (bp->duplex != DUPLEX_FULL) {
+               return;
+       }
+
+       bnx2_read_phy(bp, MII_ADVERTISE, &local_adv);
+       bnx2_read_phy(bp, MII_LPA, &remote_adv);
+
+       if (bp->phy_flags & PHY_SERDES_FLAG) {
+               u32 new_local_adv = 0;
+               u32 new_remote_adv = 0;
+
+               if (local_adv & ADVERTISE_1000XPAUSE)
+                       new_local_adv |= ADVERTISE_PAUSE_CAP;
+               if (local_adv & ADVERTISE_1000XPSE_ASYM)
+                       new_local_adv |= ADVERTISE_PAUSE_ASYM;
+               if (remote_adv & ADVERTISE_1000XPAUSE)
+                       new_remote_adv |= ADVERTISE_PAUSE_CAP;
+               if (remote_adv & ADVERTISE_1000XPSE_ASYM)
+                       new_remote_adv |= ADVERTISE_PAUSE_ASYM;
+
+               local_adv = new_local_adv;
+               remote_adv = new_remote_adv;
+       }
+
+       /* See Table 28B-3 of 802.3ab-1999 spec. */
+       if (local_adv & ADVERTISE_PAUSE_CAP) {
+               if(local_adv & ADVERTISE_PAUSE_ASYM) {
+                       if (remote_adv & ADVERTISE_PAUSE_CAP) {
+                               bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
+                       }
+                       else if (remote_adv & ADVERTISE_PAUSE_ASYM) {
+                               bp->flow_ctrl = FLOW_CTRL_RX;
+                       }
+               }
+               else {
+                       if (remote_adv & ADVERTISE_PAUSE_CAP) {
+                               bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
+                       }
+               }
+       }
+       else if (local_adv & ADVERTISE_PAUSE_ASYM) {
+               if ((remote_adv & ADVERTISE_PAUSE_CAP) &&
+                       (remote_adv & ADVERTISE_PAUSE_ASYM)) {
+
+                       bp->flow_ctrl = FLOW_CTRL_TX;
+               }
+       }
+}
+
+static int
+bnx2_serdes_linkup(struct bnx2 *bp)
+{
+       u32 bmcr, local_adv, remote_adv, common;
+
+       bp->link_up = 1;
+       bp->line_speed = SPEED_1000;
+
+       bnx2_read_phy(bp, MII_BMCR, &bmcr);
+       if (bmcr & BMCR_FULLDPLX) {
+               bp->duplex = DUPLEX_FULL;
+       }
+       else {
+               bp->duplex = DUPLEX_HALF;
+       }
+
+       if (!(bmcr & BMCR_ANENABLE)) {
+               return 0;
+       }
+
+       bnx2_read_phy(bp, MII_ADVERTISE, &local_adv);
+       bnx2_read_phy(bp, MII_LPA, &remote_adv);
+
+       common = local_adv & remote_adv;
+       if (common & (ADVERTISE_1000XHALF | ADVERTISE_1000XFULL)) {
+
+               if (common & ADVERTISE_1000XFULL) {
+                       bp->duplex = DUPLEX_FULL;
+               }
+               else {
+                       bp->duplex = DUPLEX_HALF;
+               }
+       }
+
+       return 0;
+}
+
+static int
+bnx2_copper_linkup(struct bnx2 *bp)
+{
+       u32 bmcr;
+
+       bnx2_read_phy(bp, MII_BMCR, &bmcr);
+       if (bmcr & BMCR_ANENABLE) {
+               u32 local_adv, remote_adv, common;
+
+               bnx2_read_phy(bp, MII_CTRL1000, &local_adv);
+               bnx2_read_phy(bp, MII_STAT1000, &remote_adv);
+
+               common = local_adv & (remote_adv >> 2);
+               if (common & ADVERTISE_1000FULL) {
+                       bp->line_speed = SPEED_1000;
+                       bp->duplex = DUPLEX_FULL;
+               }
+               else if (common & ADVERTISE_1000HALF) {
+                       bp->line_speed = SPEED_1000;
+                       bp->duplex = DUPLEX_HALF;
+               }
+               else {
+                       bnx2_read_phy(bp, MII_ADVERTISE, &local_adv);
+                       bnx2_read_phy(bp, MII_LPA, &remote_adv);
+
+                       common = local_adv & remote_adv;
+                       if (common & ADVERTISE_100FULL) {
+                               bp->line_speed = SPEED_100;
+                               bp->duplex = DUPLEX_FULL;
+                       }
+                       else if (common & ADVERTISE_100HALF) {
+                               bp->line_speed = SPEED_100;
+                               bp->duplex = DUPLEX_HALF;
+                       }
+                       else if (common & ADVERTISE_10FULL) {
+                               bp->line_speed = SPEED_10;
+                               bp->duplex = DUPLEX_FULL;
+                       }
+                       else if (common & ADVERTISE_10HALF) {
+                               bp->line_speed = SPEED_10;
+                               bp->duplex = DUPLEX_HALF;
+                       }
+                       else {
+                               bp->line_speed = 0;
+                               bp->link_up = 0;
+                       }
+               }
+       }
+       else {
+               if (bmcr & BMCR_SPEED100) {
+                       bp->line_speed = SPEED_100;
+               }
+               else {
+                       bp->line_speed = SPEED_10;
+               }
+               if (bmcr & BMCR_FULLDPLX) {
+                       bp->duplex = DUPLEX_FULL;
+               }
+               else {
+                       bp->duplex = DUPLEX_HALF;
+               }
+       }
+
+       return 0;
+}
+
+static int
+bnx2_set_mac_link(struct bnx2 *bp)
+{
+       u32 val;
+
+       REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x2620);
+       if (bp->link_up && (bp->line_speed == SPEED_1000) &&
+               (bp->duplex == DUPLEX_HALF)) {
+               REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x26ff);
+       }
+
+       /* Configure the EMAC mode register. */
+       val = REG_RD(bp, BNX2_EMAC_MODE);
+
+       val &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX |
+               BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK);
+
+       if (bp->link_up) {
+               if (bp->line_speed != SPEED_1000)
+                       val |= BNX2_EMAC_MODE_PORT_MII;
+               else
+                       val |= BNX2_EMAC_MODE_PORT_GMII;
+       }
+       else {
+               val |= BNX2_EMAC_MODE_PORT_GMII;
+       }
+
+       /* Set the MAC to operate in the appropriate duplex mode. */
+       if (bp->duplex == DUPLEX_HALF)
+               val |= BNX2_EMAC_MODE_HALF_DUPLEX;
+       REG_WR(bp, BNX2_EMAC_MODE, val);
+
+       /* Enable/disable rx PAUSE. */
+       bp->rx_mode &= ~BNX2_EMAC_RX_MODE_FLOW_EN;
+
+       if (bp->flow_ctrl & FLOW_CTRL_RX)
+               bp->rx_mode |= BNX2_EMAC_RX_MODE_FLOW_EN;
+       REG_WR(bp, BNX2_EMAC_RX_MODE, bp->rx_mode);
+
+       /* Enable/disable tx PAUSE. */
+       val = REG_RD(bp, BNX2_EMAC_TX_MODE);
+       val &= ~BNX2_EMAC_TX_MODE_FLOW_EN;
+
+       if (bp->flow_ctrl & FLOW_CTRL_TX)
+               val |= BNX2_EMAC_TX_MODE_FLOW_EN;
+       REG_WR(bp, BNX2_EMAC_TX_MODE, val);
+
+       /* Acknowledge the interrupt. */
+       REG_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE);
+
+       return 0;
+}
+
+static int
+bnx2_set_link(struct bnx2 *bp)
+{
+       u32 bmsr;
+       u8 link_up;
+
+       if (bp->loopback == MAC_LOOPBACK) {
+               bp->link_up = 1;
+               return 0;
+       }
+
+       link_up = bp->link_up;
+
+       bnx2_read_phy(bp, MII_BMSR, &bmsr);
+       bnx2_read_phy(bp, MII_BMSR, &bmsr);
+
+       if ((bp->phy_flags & PHY_SERDES_FLAG) &&
+           (CHIP_NUM(bp) == CHIP_NUM_5706)) {
+               u32 val;
+
+               val = REG_RD(bp, BNX2_EMAC_STATUS);
+               if (val & BNX2_EMAC_STATUS_LINK)
+                       bmsr |= BMSR_LSTATUS;
+               else
+                       bmsr &= ~BMSR_LSTATUS;
+       }
+
+       if (bmsr & BMSR_LSTATUS) {
+               bp->link_up = 1;
+
+               if (bp->phy_flags & PHY_SERDES_FLAG) {
+                       bnx2_serdes_linkup(bp);
+               }
+               else {
+                       bnx2_copper_linkup(bp);
+               }
+               bnx2_resolve_flow_ctrl(bp);
+       }
+       else {
+               if ((bp->phy_flags & PHY_SERDES_FLAG) &&
+                       (bp->autoneg & AUTONEG_SPEED)) {
+
+                       u32 bmcr;
+
+                       bnx2_read_phy(bp, MII_BMCR, &bmcr);
+                       if (!(bmcr & BMCR_ANENABLE)) {
+                               bnx2_write_phy(bp, MII_BMCR, bmcr |
+                                       BMCR_ANENABLE);
+                       }
+               }
+               bp->phy_flags &= ~PHY_PARALLEL_DETECT_FLAG;
+               bp->link_up = 0;
+       }
+
+       if (bp->link_up != link_up) {
+               bnx2_report_link(bp);
+       }
+
+       bnx2_set_mac_link(bp);
+
+       return 0;
+}
+
+static int
+bnx2_reset_phy(struct bnx2 *bp)
+{
+       int i;
+       u32 reg;
+
+        bnx2_write_phy(bp, MII_BMCR, BMCR_RESET);
+
+#define PHY_RESET_MAX_WAIT 100
+       for (i = 0; i < PHY_RESET_MAX_WAIT; i++) {
+               udelay(10);
+
+               bnx2_read_phy(bp, MII_BMCR, &reg);
+               if (!(reg & BMCR_RESET)) {
+                       udelay(20);
+                       break;
+               }
+       }
+       if (i == PHY_RESET_MAX_WAIT) {
+               return -EBUSY;
+       }
+       return 0;
+}
+
+static u32
+bnx2_phy_get_pause_adv(struct bnx2 *bp)
+{
+       u32 adv = 0;
+
+       if ((bp->req_flow_ctrl & (FLOW_CTRL_RX | FLOW_CTRL_TX)) ==
+               (FLOW_CTRL_RX | FLOW_CTRL_TX)) {
+
+               if (bp->phy_flags & PHY_SERDES_FLAG) {
+                       adv = ADVERTISE_1000XPAUSE;
+               }
+               else {
+                       adv = ADVERTISE_PAUSE_CAP;
+               }
+       }
+       else if (bp->req_flow_ctrl & FLOW_CTRL_TX) {
+               if (bp->phy_flags & PHY_SERDES_FLAG) {
+                       adv = ADVERTISE_1000XPSE_ASYM;
+               }
+               else {
+                       adv = ADVERTISE_PAUSE_ASYM;
+               }
+       }
+       else if (bp->req_flow_ctrl & FLOW_CTRL_RX) {
+               if (bp->phy_flags & PHY_SERDES_FLAG) {
+                       adv = ADVERTISE_1000XPAUSE | ADVERTISE_1000XPSE_ASYM;
+               }
+               else {
+                       adv = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
+               }
+       }
+       return adv;
+}
+
+static int
+bnx2_setup_serdes_phy(struct bnx2 *bp)
+{
+       u32 adv, bmcr;
+       u32 new_adv = 0;
+
+       if (!(bp->autoneg & AUTONEG_SPEED)) {
+               u32 new_bmcr;
+
+               bnx2_read_phy(bp, MII_BMCR, &bmcr);
+               new_bmcr = bmcr & ~BMCR_ANENABLE;
+               new_bmcr |= BMCR_SPEED1000;
+               if (bp->req_duplex == DUPLEX_FULL) {
+                       new_bmcr |= BMCR_FULLDPLX;
+               }
+               else {
+                       new_bmcr &= ~BMCR_FULLDPLX;
+               }
+               if (new_bmcr != bmcr) {
+                       /* Force a link down visible on the other side */
+                       if (bp->link_up) {
+                               bnx2_read_phy(bp, MII_ADVERTISE, &adv);
+                               adv &= ~(ADVERTISE_1000XFULL |
+                                       ADVERTISE_1000XHALF);
+                               bnx2_write_phy(bp, MII_ADVERTISE, adv);
+                               bnx2_write_phy(bp, MII_BMCR, bmcr |
+                                       BMCR_ANRESTART | BMCR_ANENABLE);
+
+                               bp->link_up = 0;
+                               netif_carrier_off(bp->dev);
+                       }
+                       bnx2_write_phy(bp, MII_BMCR, new_bmcr);
+               }
+               return 0;
+       }
+
+       if (bp->advertising & ADVERTISED_1000baseT_Full)
+               new_adv |= ADVERTISE_1000XFULL;
+
+       new_adv |= bnx2_phy_get_pause_adv(bp);
+
+       bnx2_read_phy(bp, MII_ADVERTISE, &adv);
+       bnx2_read_phy(bp, MII_BMCR, &bmcr);
+
+       bp->serdes_an_pending = 0;
+       if ((adv != new_adv) || ((bmcr & BMCR_ANENABLE) == 0)) {
+               /* Force a link down visible on the other side */
+               if (bp->link_up) {
+                       int i;
+
+                       bnx2_write_phy(bp, MII_BMCR, BMCR_LOOPBACK);
+                       for (i = 0; i < 110; i++) {
+                               udelay(100);
+                       }
+               }
+
+               bnx2_write_phy(bp, MII_ADVERTISE, new_adv);
+               bnx2_write_phy(bp, MII_BMCR, bmcr | BMCR_ANRESTART |
+                       BMCR_ANENABLE);
+               bp->serdes_an_pending = SERDES_AN_TIMEOUT / bp->timer_interval;
+       }
+
+       return 0;
+}
+
+#define ETHTOOL_ALL_FIBRE_SPEED                                                \
+       (ADVERTISED_1000baseT_Full)
+
+#define ETHTOOL_ALL_COPPER_SPEED                                       \
+       (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |            \
+       ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |           \
+       ADVERTISED_1000baseT_Full)
+
+#define PHY_ALL_10_100_SPEED (ADVERTISE_10HALF | ADVERTISE_10FULL | \
+       ADVERTISE_100HALF | ADVERTISE_100FULL | ADVERTISE_CSMA)
+       
+#define PHY_ALL_1000_SPEED (ADVERTISE_1000HALF | ADVERTISE_1000FULL)
+
+static int
+bnx2_setup_copper_phy(struct bnx2 *bp)
+{
+       u32 bmcr;
+       u32 new_bmcr;
+
+       bnx2_read_phy(bp, MII_BMCR, &bmcr);
+
+       if (bp->autoneg & AUTONEG_SPEED) {
+               u32 adv_reg, adv1000_reg;
+               u32 new_adv_reg = 0;
+               u32 new_adv1000_reg = 0;
+
+               bnx2_read_phy(bp, MII_ADVERTISE, &adv_reg);
+               adv_reg &= (PHY_ALL_10_100_SPEED | ADVERTISE_PAUSE_CAP |
+                       ADVERTISE_PAUSE_ASYM);
+
+               bnx2_read_phy(bp, MII_CTRL1000, &adv1000_reg);
+               adv1000_reg &= PHY_ALL_1000_SPEED;
+
+               if (bp->advertising & ADVERTISED_10baseT_Half)
+                       new_adv_reg |= ADVERTISE_10HALF;
+               if (bp->advertising & ADVERTISED_10baseT_Full)
+                       new_adv_reg |= ADVERTISE_10FULL;
+               if (bp->advertising & ADVERTISED_100baseT_Half)
+                       new_adv_reg |= ADVERTISE_100HALF;
+               if (bp->advertising & ADVERTISED_100baseT_Full)
+                       new_adv_reg |= ADVERTISE_100FULL;
+               if (bp->advertising & ADVERTISED_1000baseT_Full)
+                       new_adv1000_reg |= ADVERTISE_1000FULL;
+               
+               new_adv_reg |= ADVERTISE_CSMA;
+
+               new_adv_reg |= bnx2_phy_get_pause_adv(bp);
+
+               if ((adv1000_reg != new_adv1000_reg) ||
+                       (adv_reg != new_adv_reg) ||
+                       ((bmcr & BMCR_ANENABLE) == 0)) {
+
+                       bnx2_write_phy(bp, MII_ADVERTISE, new_adv_reg);
+                       bnx2_write_phy(bp, MII_CTRL1000, new_adv1000_reg);
+                       bnx2_write_phy(bp, MII_BMCR, BMCR_ANRESTART |
+                               BMCR_ANENABLE);
+               }
+               else if (bp->link_up) {
+                       /* Flow ctrl may have changed from auto to forced */
+                       /* or vice-versa. */
+
+                       bnx2_resolve_flow_ctrl(bp);
+                       bnx2_set_mac_link(bp);
+               }
+               return 0;
+       }
+
+       new_bmcr = 0;
+       if (bp->req_line_speed == SPEED_100) {
+               new_bmcr |= BMCR_SPEED100;
+       }
+       if (bp->req_duplex == DUPLEX_FULL) {
+               new_bmcr |= BMCR_FULLDPLX;
+       }
+       if (new_bmcr != bmcr) {
+               u32 bmsr;
+               int i = 0;
+
+               bnx2_read_phy(bp, MII_BMSR, &bmsr);
+               bnx2_read_phy(bp, MII_BMSR, &bmsr);
+               
+               if (bmsr & BMSR_LSTATUS) {
+                       /* Force link down */
+                       bnx2_write_phy(bp, MII_BMCR, BMCR_LOOPBACK);
+                       do {
+                               udelay(100);
+                               bnx2_read_phy(bp, MII_BMSR, &bmsr);
+                               bnx2_read_phy(bp, MII_BMSR, &bmsr);
+                               i++;
+                       } while ((bmsr & BMSR_LSTATUS) && (i < 620));
+               }
+
+               bnx2_write_phy(bp, MII_BMCR, new_bmcr);
+
+               /* Normally, the new speed is setup after the link has
+                * gone down and up again. In some cases, link will not go
+                * down so we need to set up the new speed here.
+                */
+               if (bmsr & BMSR_LSTATUS) {
+                       bp->line_speed = bp->req_line_speed;
+                       bp->duplex = bp->req_duplex;
+                       bnx2_resolve_flow_ctrl(bp);
+                       bnx2_set_mac_link(bp);
+               }
+       }
+       return 0;
+}
+
+static int
+bnx2_setup_phy(struct bnx2 *bp)
+{
+       if (bp->loopback == MAC_LOOPBACK)
+               return 0;
+
+       if (bp->phy_flags & PHY_SERDES_FLAG) {
+               return (bnx2_setup_serdes_phy(bp));
+       }
+       else {
+               return (bnx2_setup_copper_phy(bp));
+       }
+}
+
+static int
+bnx2_init_serdes_phy(struct bnx2 *bp)
+{
+       bp->phy_flags &= ~PHY_PARALLEL_DETECT_FLAG;
+
+       if (CHIP_NUM(bp) == CHIP_NUM_5706) {
+               REG_WR(bp, BNX2_MISC_UNUSED0, 0x300);
+       }
+
+       if (bp->dev->mtu > 1500) {
+               u32 val;
+
+               /* Set extended packet length bit */
+               bnx2_write_phy(bp, 0x18, 0x7);
+               bnx2_read_phy(bp, 0x18, &val);
+               bnx2_write_phy(bp, 0x18, (val & 0xfff8) | 0x4000);
+
+               bnx2_write_phy(bp, 0x1c, 0x6c00);
+               bnx2_read_phy(bp, 0x1c, &val);
+               bnx2_write_phy(bp, 0x1c, (val & 0x3ff) | 0xec02);
+       }
+       else {
+               u32 val;
+
+               bnx2_write_phy(bp, 0x18, 0x7);
+               bnx2_read_phy(bp, 0x18, &val);
+               bnx2_write_phy(bp, 0x18, val & ~0x4007);
+
+               bnx2_write_phy(bp, 0x1c, 0x6c00);
+               bnx2_read_phy(bp, 0x1c, &val);
+               bnx2_write_phy(bp, 0x1c, (val & 0x3fd) | 0xec00);
+       }
+
+       return 0;
+}
+
+static int
+bnx2_init_copper_phy(struct bnx2 *bp)
+{
+       bp->phy_flags |= PHY_CRC_FIX_FLAG;
+
+       if (bp->phy_flags & PHY_CRC_FIX_FLAG) {
+               bnx2_write_phy(bp, 0x18, 0x0c00);
+               bnx2_write_phy(bp, 0x17, 0x000a);
+               bnx2_write_phy(bp, 0x15, 0x310b);
+               bnx2_write_phy(bp, 0x17, 0x201f);
+               bnx2_write_phy(bp, 0x15, 0x9506);
+               bnx2_write_phy(bp, 0x17, 0x401f);
+               bnx2_write_phy(bp, 0x15, 0x14e2);
+               bnx2_write_phy(bp, 0x18, 0x0400);
+       }
+
+       if (bp->dev->mtu > 1500) {
+               u32 val;
+
+               /* Set extended packet length bit */
+               bnx2_write_phy(bp, 0x18, 0x7);
+               bnx2_read_phy(bp, 0x18, &val);
+               bnx2_write_phy(bp, 0x18, val | 0x4000);
+
+               bnx2_read_phy(bp, 0x10, &val);
+               bnx2_write_phy(bp, 0x10, val | 0x1);
+       }
+       else {
+               u32 val;
+
+               bnx2_write_phy(bp, 0x18, 0x7);
+               bnx2_read_phy(bp, 0x18, &val);
+               bnx2_write_phy(bp, 0x18, val & ~0x4007);
+
+               bnx2_read_phy(bp, 0x10, &val);
+               bnx2_write_phy(bp, 0x10, val & ~0x1);
+       }
+
+       return 0;
+}
+
+
+static int
+bnx2_init_phy(struct bnx2 *bp)
+{
+       u32 val;
+       int rc = 0;
+
+       bp->phy_flags &= ~PHY_INT_MODE_MASK_FLAG;
+       bp->phy_flags |= PHY_INT_MODE_LINK_READY_FLAG;
+
+        REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);
+
+       bnx2_reset_phy(bp);
+
+       bnx2_read_phy(bp, MII_PHYSID1, &val);
+       bp->phy_id = val << 16;
+       bnx2_read_phy(bp, MII_PHYSID2, &val);
+       bp->phy_id |= val & 0xffff;
+
+       if (bp->phy_flags & PHY_SERDES_FLAG) {
+               rc = bnx2_init_serdes_phy(bp);
+       }
+       else {
+               rc = bnx2_init_copper_phy(bp);
+       }
+
+       bnx2_setup_phy(bp);
+
+       return rc;
+}
+
+static int
+bnx2_set_mac_loopback(struct bnx2 *bp)
+{
+       u32 mac_mode;
+
+       mac_mode = REG_RD(bp, BNX2_EMAC_MODE);
+       mac_mode &= ~BNX2_EMAC_MODE_PORT;
+       mac_mode |= BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK;
+       REG_WR(bp, BNX2_EMAC_MODE, mac_mode);
+       bp->link_up = 1;
+       return 0;
+}
+
+static int
+bnx2_fw_sync(struct bnx2 *bp, u32 msg_data)
+{
+       int i;
+       u32 val;
+
+       if (bp->fw_timed_out)
+               return -EBUSY;
+
+       bp->fw_wr_seq++;
+       msg_data |= bp->fw_wr_seq;
+
+       REG_WR_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_DRV_MB, msg_data);
+
+       /* wait for an acknowledgement. */
+       for (i = 0; i < (FW_ACK_TIME_OUT_MS * 1000)/5; i++) {
+               udelay(5);
+
+               val = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_FW_MB);
+
+               if ((val & BNX2_FW_MSG_ACK) == (msg_data & BNX2_DRV_MSG_SEQ))
+                       break;
+       }
+
+       /* If we timed out, inform the firmware that this is the case. */
+       if (((val & BNX2_FW_MSG_ACK) != (msg_data & BNX2_DRV_MSG_SEQ)) &&
+               ((msg_data & BNX2_DRV_MSG_DATA) != BNX2_DRV_MSG_DATA_WAIT0)) {
+
+               msg_data &= ~BNX2_DRV_MSG_CODE;
+               msg_data |= BNX2_DRV_MSG_CODE_FW_TIMEOUT;
+
+               REG_WR_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_DRV_MB, msg_data);
+
+               bp->fw_timed_out = 1;
+
+               return -EBUSY;
+       }
+
+       return 0;
+}
+
+static void
+bnx2_init_context(struct bnx2 *bp)
+{
+       u32 vcid;
+
+       vcid = 96;
+       while (vcid) {
+               u32 vcid_addr, pcid_addr, offset;
+
+               vcid--;
+
+               if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
+                       u32 new_vcid;
+
+                       vcid_addr = GET_PCID_ADDR(vcid);
+                       if (vcid & 0x8) {
+                               new_vcid = 0x60 + (vcid & 0xf0) + (vcid & 0x7);
+                       }
+                       else {
+                               new_vcid = vcid;
+                       }
+                       pcid_addr = GET_PCID_ADDR(new_vcid);
+               }
+               else {
+                       vcid_addr = GET_CID_ADDR(vcid);
+                       pcid_addr = vcid_addr;
+               }
+
+               REG_WR(bp, BNX2_CTX_VIRT_ADDR, 0x00);
+               REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);
+
+               /* Zero out the context. */
+               for (offset = 0; offset < PHY_CTX_SIZE; offset += 4) {
+                       CTX_WR(bp, 0x00, offset, 0);
+               }
+
+               REG_WR(bp, BNX2_CTX_VIRT_ADDR, vcid_addr);
+               REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);
+       }
+}
+
+static int
+bnx2_alloc_bad_rbuf(struct bnx2 *bp)
+{
+       u16 *good_mbuf;
+       u32 good_mbuf_cnt;
+       u32 val;
+
+       good_mbuf = kmalloc(512 * sizeof(u16), GFP_KERNEL);
+       if (good_mbuf == NULL) {
+               printk(KERN_ERR PFX "Failed to allocate memory in "
+                                   "bnx2_alloc_bad_rbuf\n");
+               return -ENOMEM;
+       }
+
+       REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
+               BNX2_MISC_ENABLE_SET_BITS_RX_MBUF_ENABLE);
+
+       good_mbuf_cnt = 0;
+
+       /* Allocate a bunch of mbufs and save the good ones in an array. */
+       val = REG_RD_IND(bp, BNX2_RBUF_STATUS1);
+       while (val & BNX2_RBUF_STATUS1_FREE_COUNT) {
+               REG_WR_IND(bp, BNX2_RBUF_COMMAND, BNX2_RBUF_COMMAND_ALLOC_REQ);
+
+               val = REG_RD_IND(bp, BNX2_RBUF_FW_BUF_ALLOC);
+
+               val &= BNX2_RBUF_FW_BUF_ALLOC_VALUE;
+
+               /* The addresses with Bit 9 set are bad memory blocks. */
+               if (!(val & (1 << 9))) {
+                       good_mbuf[good_mbuf_cnt] = (u16) val;
+                       good_mbuf_cnt++;
+               }
+
+               val = REG_RD_IND(bp, BNX2_RBUF_STATUS1);
+       }
+
+       /* Free the good ones back to the mbuf pool thus discarding
+        * all the bad ones. */
+       while (good_mbuf_cnt) {
+               good_mbuf_cnt--;
+
+               val = good_mbuf[good_mbuf_cnt];
+               val = (val << 9) | val | 1;
+
+               REG_WR_IND(bp, BNX2_RBUF_FW_BUF_FREE, val);
+       }
+       kfree(good_mbuf);
+       return 0;
+}
+
+static void
+bnx2_set_mac_addr(struct bnx2 *bp) 
+{
+       u32 val;
+       u8 *mac_addr = bp->dev->dev_addr;
+
+       val = (mac_addr[0] << 8) | mac_addr[1];
+
+       REG_WR(bp, BNX2_EMAC_MAC_MATCH0, val);
+
+       val = (mac_addr[2] << 24) | (mac_addr[3] << 16) | 
+               (mac_addr[4] << 8) | mac_addr[5];
+
+       REG_WR(bp, BNX2_EMAC_MAC_MATCH1, val);
+}
+
+static inline int
+bnx2_alloc_rx_skb(struct bnx2 *bp, u16 index)
+{
+       struct sk_buff *skb;
+       struct sw_bd *rx_buf = &bp->rx_buf_ring[index];
+       dma_addr_t mapping;
+       struct rx_bd *rxbd = &bp->rx_desc_ring[index];
+       unsigned long align;
+
+       skb = dev_alloc_skb(bp->rx_buf_size);
+       if (skb == NULL) {
+               return -ENOMEM;
+       }
+
+       if (unlikely((align = (unsigned long) skb->data & 0x7))) {
+               skb_reserve(skb, 8 - align);
+       }
+
+       skb->dev = bp->dev;
+       mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size,
+               PCI_DMA_FROMDEVICE);
+
+       rx_buf->skb = skb;
+       pci_unmap_addr_set(rx_buf, mapping, mapping);
+
+       rxbd->rx_bd_haddr_hi = (u64) mapping >> 32;
+       rxbd->rx_bd_haddr_lo = (u64) mapping & 0xffffffff;
+
+       bp->rx_prod_bseq += bp->rx_buf_use_size;
+
+       return 0;
+}
+
+static void
+bnx2_phy_int(struct bnx2 *bp)
+{
+       u32 new_link_state, old_link_state;
+
+       new_link_state = bp->status_blk->status_attn_bits &
+               STATUS_ATTN_BITS_LINK_STATE;
+       old_link_state = bp->status_blk->status_attn_bits_ack &
+               STATUS_ATTN_BITS_LINK_STATE;
+       if (new_link_state != old_link_state) {
+               if (new_link_state) {
+                       REG_WR(bp, BNX2_PCICFG_STATUS_BIT_SET_CMD,
+                               STATUS_ATTN_BITS_LINK_STATE);
+               }
+               else {
+                       REG_WR(bp, BNX2_PCICFG_STATUS_BIT_CLEAR_CMD,
+                               STATUS_ATTN_BITS_LINK_STATE);
+               }
+               bnx2_set_link(bp);
+       }
+}
+
+static void
+bnx2_tx_int(struct bnx2 *bp)
+{
+       u16 hw_cons, sw_cons, sw_ring_cons;
+       int tx_free_bd = 0;
+
+       hw_cons = bp->status_blk->status_tx_quick_consumer_index0;
+       if ((hw_cons & MAX_TX_DESC_CNT) == MAX_TX_DESC_CNT) {
+               hw_cons++;
+       }
+       sw_cons = bp->tx_cons;
+
+       while (sw_cons != hw_cons) {
+               struct sw_bd *tx_buf;
+               struct sk_buff *skb;
+               int i, last;
+
+               sw_ring_cons = TX_RING_IDX(sw_cons);
+
+               tx_buf = &bp->tx_buf_ring[sw_ring_cons];
+               skb = tx_buf->skb;
+#ifdef BCM_TSO 
+               /* partial BD completions possible with TSO packets */
+               if (skb_shinfo(skb)->tso_size) {
+                       u16 last_idx, last_ring_idx;
+
+                       last_idx = sw_cons +
+                               skb_shinfo(skb)->nr_frags + 1;
+                       last_ring_idx = sw_ring_cons +
+                               skb_shinfo(skb)->nr_frags + 1;
+                       if (unlikely(last_ring_idx >= MAX_TX_DESC_CNT)) {
+                               last_idx++;
+                       }
+                       if (((s16) ((s16) last_idx - (s16) hw_cons)) > 0) {
+                               break;
+                       }
+               }
+#endif
+               pci_unmap_single(bp->pdev, pci_unmap_addr(tx_buf, mapping),
+                       skb_headlen(skb), PCI_DMA_TODEVICE);
+
+               tx_buf->skb = NULL;
+               last = skb_shinfo(skb)->nr_frags;
+
+               for (i = 0; i < last; i++) {
+                       sw_cons = NEXT_TX_BD(sw_cons);
+
+                       pci_unmap_page(bp->pdev,
+                               pci_unmap_addr(
+                                       &bp->tx_buf_ring[TX_RING_IDX(sw_cons)],
+                                       mapping),
+                               skb_shinfo(skb)->frags[i].size,
+                               PCI_DMA_TODEVICE);
+               }
+
+               sw_cons = NEXT_TX_BD(sw_cons);
+
+               tx_free_bd += last + 1;
+
+               dev_kfree_skb_irq(skb);
+
+               hw_cons = bp->status_blk->status_tx_quick_consumer_index0;
+               if ((hw_cons & MAX_TX_DESC_CNT) == MAX_TX_DESC_CNT) {
+                       hw_cons++;
+               }
+       }
+
+       atomic_add(tx_free_bd, &bp->tx_avail_bd);
+
+       if (unlikely(netif_queue_stopped(bp->dev))) {
+               unsigned long flags;
+
+               spin_lock_irqsave(&bp->tx_lock, flags);
+               if ((netif_queue_stopped(bp->dev)) &&
+                       (atomic_read(&bp->tx_avail_bd) > MAX_SKB_FRAGS)) {
+
+                       netif_wake_queue(bp->dev);
+               }
+               spin_unlock_irqrestore(&bp->tx_lock, flags);
+       }
+
+       bp->tx_cons = sw_cons;
+
+}
+
+static inline void
+bnx2_reuse_rx_skb(struct bnx2 *bp, struct sk_buff *skb,
+       u16 cons, u16 prod)
+{
+       struct sw_bd *cons_rx_buf = &bp->rx_buf_ring[cons];
+       struct sw_bd *prod_rx_buf = &bp->rx_buf_ring[prod];
+       struct rx_bd *cons_bd = &bp->rx_desc_ring[cons];
+       struct rx_bd *prod_bd = &bp->rx_desc_ring[prod];
+
+       pci_dma_sync_single_for_device(bp->pdev,
+               pci_unmap_addr(cons_rx_buf, mapping),
+               bp->rx_offset + RX_COPY_THRESH, PCI_DMA_FROMDEVICE);
+
+       prod_rx_buf->skb = cons_rx_buf->skb;
+       pci_unmap_addr_set(prod_rx_buf, mapping,
+                       pci_unmap_addr(cons_rx_buf, mapping));
+
+       memcpy(prod_bd, cons_bd, 8);
+
+       bp->rx_prod_bseq += bp->rx_buf_use_size;
+
+}
+
+static int
+bnx2_rx_int(struct bnx2 *bp, int budget)
+{
+       u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod;
+       struct l2_fhdr *rx_hdr;
+       int rx_pkt = 0;
+
+       hw_cons = bp->status_blk->status_rx_quick_consumer_index0;
+       if ((hw_cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT) {
+               hw_cons++;
+       }
+       sw_cons = bp->rx_cons;
+       sw_prod = bp->rx_prod;
+
+       /* Memory barrier necessary as speculative reads of the rx
+        * buffer can be ahead of the index in the status block
+        */
+       rmb();
+       while (sw_cons != hw_cons) {
+               unsigned int len;
+               u16 status;
+               struct sw_bd *rx_buf;
+               struct sk_buff *skb;
+
+               sw_ring_cons = RX_RING_IDX(sw_cons);
+               sw_ring_prod = RX_RING_IDX(sw_prod);
+
+               rx_buf = &bp->rx_buf_ring[sw_ring_cons];
+               skb = rx_buf->skb;
+               pci_dma_sync_single_for_cpu(bp->pdev,
+                       pci_unmap_addr(rx_buf, mapping),
+                       bp->rx_offset + RX_COPY_THRESH, PCI_DMA_FROMDEVICE);
+
+               rx_hdr = (struct l2_fhdr *) skb->data;
+               len = rx_hdr->l2_fhdr_pkt_len - 4;
+
+               if (rx_hdr->l2_fhdr_errors &
+                       (L2_FHDR_ERRORS_BAD_CRC |
+                       L2_FHDR_ERRORS_PHY_DECODE |
+                       L2_FHDR_ERRORS_ALIGNMENT |
+                       L2_FHDR_ERRORS_TOO_SHORT |
+                       L2_FHDR_ERRORS_GIANT_FRAME)) {
+
+                       goto reuse_rx;
+               }
+
+               /* Since we don't have a jumbo ring, copy small packets
+                * if mtu > 1500
+                */
+               if ((bp->dev->mtu > 1500) && (len <= RX_COPY_THRESH)) {
+                       struct sk_buff *new_skb;
+
+                       new_skb = dev_alloc_skb(len + 2);
+                       if (new_skb == NULL)
+                               goto reuse_rx;
+
+                       /* aligned copy */
+                       memcpy(new_skb->data,
+                               skb->data + bp->rx_offset - 2,
+                               len + 2);
+
+                       skb_reserve(new_skb, 2);
+                       skb_put(new_skb, len);
+                       new_skb->dev = bp->dev;
+
+                       bnx2_reuse_rx_skb(bp, skb,
+                               sw_ring_cons, sw_ring_prod);
+
+                       skb = new_skb;
+               }
+               else if (bnx2_alloc_rx_skb(bp, sw_ring_prod) == 0) {
+                       pci_unmap_single(bp->pdev,
+                               pci_unmap_addr(rx_buf, mapping),
+                               bp->rx_buf_use_size, PCI_DMA_FROMDEVICE);
+
+                       skb_reserve(skb, bp->rx_offset);
+                       skb_put(skb, len);
+               }
+               else {
+reuse_rx:
+                       bnx2_reuse_rx_skb(bp, skb,
+                               sw_ring_cons, sw_ring_prod);
+                       goto next_rx;
+               }
+
+               skb->protocol = eth_type_trans(skb, bp->dev);
+
+               if ((len > (bp->dev->mtu + ETH_HLEN)) &&
+                       (htons(skb->protocol) != 0x8100)) {
+
+                       dev_kfree_skb_irq(skb);
+                       goto next_rx;
+
+               }
+
+               status = rx_hdr->l2_fhdr_status;
+               skb->ip_summed = CHECKSUM_NONE;
+               if (bp->rx_csum &&
+                       (status & (L2_FHDR_STATUS_TCP_SEGMENT |
+                       L2_FHDR_STATUS_UDP_DATAGRAM))) {
+
+                       u16 cksum = rx_hdr->l2_fhdr_tcp_udp_xsum;
+
+                       if (cksum == 0xffff)
+                               skb->ip_summed = CHECKSUM_UNNECESSARY;
+               }
+
+#ifdef BCM_VLAN
+               if ((status & L2_FHDR_STATUS_L2_VLAN_TAG) && (bp->vlgrp != 0)) {
+                       vlan_hwaccel_receive_skb(skb, bp->vlgrp,
+                               rx_hdr->l2_fhdr_vlan_tag);
+               }
+               else
+#endif
+                       netif_receive_skb(skb);
+
+               bp->dev->last_rx = jiffies;
+               rx_pkt++;
+
+next_rx:
+               rx_buf->skb = NULL;
+
+               sw_cons = NEXT_RX_BD(sw_cons);
+               sw_prod = NEXT_RX_BD(sw_prod);
+
+               if ((rx_pkt == budget))
+                       break;
+       }
+       bp->rx_cons = sw_cons;
+       bp->rx_prod = sw_prod;
+
+       REG_WR16(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BDIDX, sw_prod);
+
+       REG_WR(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BSEQ, bp->rx_prod_bseq);
+
+       mmiowb();
+
+       return rx_pkt;
+
+}
+
+/* MSI ISR - The only difference between this and the INTx ISR
+ * is that the MSI interrupt is always serviced.
+ */
+static irqreturn_t
+bnx2_msi(int irq, void *dev_instance, struct pt_regs *regs)
+{
+       struct net_device *dev = dev_instance;
+       struct bnx2 *bp = dev->priv;
+
+       REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
+               BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |
+               BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
+
+       /* Return here if interrupt is disabled. */
+       if (unlikely(atomic_read(&bp->intr_sem) != 0)) {
+               return IRQ_RETVAL(1);
+       }
+
+       if (netif_rx_schedule_prep(dev)) {
+               __netif_rx_schedule(dev);
+       }
+
+       return IRQ_RETVAL(1);
+}
+
+static irqreturn_t
+bnx2_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
+{
+       struct net_device *dev = dev_instance;
+       struct bnx2 *bp = dev->priv;
+
+       /* When using INTx, it is possible for the interrupt to arrive
+        * at the CPU before the status block posted prior to the
+        * interrupt. Reading a register will flush the status block.
+        * When using MSI, the MSI message will always complete after
+        * the status block write.
+        */
+       if ((bp->status_blk->status_idx == bp->last_status_idx) ||
+           (REG_RD(bp, BNX2_PCICFG_MISC_STATUS) &
+            BNX2_PCICFG_MISC_STATUS_INTA_VALUE))
+               return IRQ_RETVAL(0);
+
+       REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
+               BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |
+               BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
+
+       /* Return here if interrupt is shared and is disabled. */
+       if (unlikely(atomic_read(&bp->intr_sem) != 0)) {
+               return IRQ_RETVAL(1);
+       }
+
+       if (netif_rx_schedule_prep(dev)) {
+               __netif_rx_schedule(dev);
+       }
+
+       return IRQ_RETVAL(1);
+}
+
+static int
+bnx2_poll(struct net_device *dev, int *budget)
+{
+       struct bnx2 *bp = dev->priv;
+       int rx_done = 1;
+
+       bp->last_status_idx = bp->status_blk->status_idx;
+
+       rmb();
+       if ((bp->status_blk->status_attn_bits &
+               STATUS_ATTN_BITS_LINK_STATE) !=
+               (bp->status_blk->status_attn_bits_ack &
+               STATUS_ATTN_BITS_LINK_STATE)) {
+
+               unsigned long flags;
+
+               spin_lock_irqsave(&bp->phy_lock, flags);
+               bnx2_phy_int(bp);
+               spin_unlock_irqrestore(&bp->phy_lock, flags);
+       }
+
+       if (bp->status_blk->status_tx_quick_consumer_index0 != bp->tx_cons) {
+               bnx2_tx_int(bp);
+       }
+
+       if (bp->status_blk->status_rx_quick_consumer_index0 != bp->rx_cons) {
+               int orig_budget = *budget;
+               int work_done;
+
+               if (orig_budget > dev->quota)
+                       orig_budget = dev->quota;
+               
+               work_done = bnx2_rx_int(bp, orig_budget);
+               *budget -= work_done;
+               dev->quota -= work_done;
+               
+               if (work_done >= orig_budget) {
+                       rx_done = 0;
+               }
+       }
+       
+       if (rx_done) {
+               netif_rx_complete(dev);
+               REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
+                       BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
+                       bp->last_status_idx);
+               return 0;
+       }
+
+       return 1;
+}
+
+/* Called with rtnl_lock from vlan functions and also dev->xmit_lock
+ * from set_multicast.
+ */
+static void
+bnx2_set_rx_mode(struct net_device *dev)
+{
+       struct bnx2 *bp = dev->priv;
+       u32 rx_mode, sort_mode;
+       int i;
+       unsigned long flags;
+
+       spin_lock_irqsave(&bp->phy_lock, flags);
+
+       rx_mode = bp->rx_mode & ~(BNX2_EMAC_RX_MODE_PROMISCUOUS |
+                                 BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG);
+       sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN;
+#ifdef BCM_VLAN
+       if (!bp->vlgrp) {
+               rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG;
+       }
+#else
+       rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG;
+#endif
+       if (dev->flags & IFF_PROMISC) {
+               /* Promiscuous mode. */
+               rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS;
+               sort_mode |= BNX2_RPM_SORT_USER0_PROM_EN;
+       }
+       else if (dev->flags & IFF_ALLMULTI) {
+               for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
+                       REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
+                              0xffffffff);
+               }
+               sort_mode |= BNX2_RPM_SORT_USER0_MC_EN;
+       }
+       else {
+               /* Accept one or more multicast(s). */
+               struct dev_mc_list *mclist;
+               u32 mc_filter[NUM_MC_HASH_REGISTERS];
+               u32 regidx;
+               u32 bit;
+               u32 crc;
+
+               memset(mc_filter, 0, 4 * NUM_MC_HASH_REGISTERS);
+
+               for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
+                    i++, mclist = mclist->next) {
+
+                       crc = ether_crc_le(ETH_ALEN, mclist->dmi_addr);
+                       bit = crc & 0xff;
+                       regidx = (bit & 0xe0) >> 5;
+                       bit &= 0x1f;
+                       mc_filter[regidx] |= (1 << bit);
+               }
+
+               for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
+                       REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
+                              mc_filter[i]);
+               }
+
+               sort_mode |= BNX2_RPM_SORT_USER0_MC_HSH_EN;
+       }
+
+       if (rx_mode != bp->rx_mode) {
+               bp->rx_mode = rx_mode;
+               REG_WR(bp, BNX2_EMAC_RX_MODE, rx_mode);
+       }
+
+       REG_WR(bp, BNX2_RPM_SORT_USER0, 0x0);
+       REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode);
+       REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode | BNX2_RPM_SORT_USER0_ENA);
+
+       spin_unlock_irqrestore(&bp->phy_lock, flags);
+}
+
+static void
+load_rv2p_fw(struct bnx2 *bp, u32 *rv2p_code, u32 rv2p_code_len,
+       u32 rv2p_proc)
+{
+       int i;
+       u32 val;
+
+
+       for (i = 0; i < rv2p_code_len; i += 8) {
+               REG_WR(bp, BNX2_RV2P_INSTR_HIGH, *rv2p_code);
+               rv2p_code++;
+               REG_WR(bp, BNX2_RV2P_INSTR_LOW, *rv2p_code);
+               rv2p_code++;
+
+               if (rv2p_proc == RV2P_PROC1) {
+                       val = (i / 8) | BNX2_RV2P_PROC1_ADDR_CMD_RDWR;
+                       REG_WR(bp, BNX2_RV2P_PROC1_ADDR_CMD, val);
+               }
+               else {
+                       val = (i / 8) | BNX2_RV2P_PROC2_ADDR_CMD_RDWR;
+                       REG_WR(bp, BNX2_RV2P_PROC2_ADDR_CMD, val);
+               }
+       }
+
+       /* Reset the processor, un-stall is done later. */
+       if (rv2p_proc == RV2P_PROC1) {
+               REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC1_RESET);
+       }
+       else {
+               REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC2_RESET);
+       }
+}
+
+static void
+load_cpu_fw(struct bnx2 *bp, struct cpu_reg *cpu_reg, struct fw_info *fw)
+{
+       u32 offset;
+       u32 val;
+
+       /* Halt the CPU. */
+       val = REG_RD_IND(bp, cpu_reg->mode);
+       val |= cpu_reg->mode_value_halt;
+       REG_WR_IND(bp, cpu_reg->mode, val);
+       REG_WR_IND(bp, cpu_reg->state, cpu_reg->state_value_clear);
+
+       /* Load the Text area. */
+       offset = cpu_reg->spad_base + (fw->text_addr - cpu_reg->mips_view_base);
+       if (fw->text) {
+               int j;
+
+               for (j = 0; j < (fw->text_len / 4); j++, offset += 4) {
+                       REG_WR_IND(bp, offset, fw->text[j]);
+               }
+       }
+
+       /* Load the Data area. */
+       offset = cpu_reg->spad_base + (fw->data_addr - cpu_reg->mips_view_base);
+       if (fw->data) {
+               int j;
+
+               for (j = 0; j < (fw->data_len / 4); j++, offset += 4) {
+                       REG_WR_IND(bp, offset, fw->data[j]);
+               }
+       }
+
+       /* Load the SBSS area. */
+       offset = cpu_reg->spad_base + (fw->sbss_addr - cpu_reg->mips_view_base);
+       if (fw->sbss) {
+               int j;
+
+               for (j = 0; j < (fw->sbss_len / 4); j++, offset += 4) {
+                       REG_WR_IND(bp, offset, fw->sbss[j]);
+               }
+       }
+
+       /* Load the BSS area. */
+       offset = cpu_reg->spad_base + (fw->bss_addr - cpu_reg->mips_view_base);
+       if (fw->bss) {
+               int j;
+
+               for (j = 0; j < (fw->bss_len/4); j++, offset += 4) {
+                       REG_WR_IND(bp, offset, fw->bss[j]);
+               }
+       }
+
+       /* Load the Read-Only area. */
+       offset = cpu_reg->spad_base +
+               (fw->rodata_addr - cpu_reg->mips_view_base);
+       if (fw->rodata) {
+               int j;
+
+               for (j = 0; j < (fw->rodata_len / 4); j++, offset += 4) {
+                       REG_WR_IND(bp, offset, fw->rodata[j]);
+               }
+       }
+
+       /* Clear the pre-fetch instruction. */
+       REG_WR_IND(bp, cpu_reg->inst, 0);
+       REG_WR_IND(bp, cpu_reg->pc, fw->start_addr);
+
+       /* Start the CPU. */
+       val = REG_RD_IND(bp, cpu_reg->mode);
+       val &= ~cpu_reg->mode_value_halt;
+       REG_WR_IND(bp, cpu_reg->state, cpu_reg->state_value_clear);
+       REG_WR_IND(bp, cpu_reg->mode, val);
+}
+
+static void
+bnx2_init_cpus(struct bnx2 *bp)
+{
+       struct cpu_reg cpu_reg;
+       struct fw_info fw;
+
+       /* Initialize the RV2P processor. */
+       load_rv2p_fw(bp, bnx2_rv2p_proc1, sizeof(bnx2_rv2p_proc1), RV2P_PROC1);
+       load_rv2p_fw(bp, bnx2_rv2p_proc2, sizeof(bnx2_rv2p_proc2), RV2P_PROC2);
+
+       /* Initialize the RX Processor. */
+       cpu_reg.mode = BNX2_RXP_CPU_MODE;
+       cpu_reg.mode_value_halt = BNX2_RXP_CPU_MODE_SOFT_HALT;
+       cpu_reg.mode_value_sstep = BNX2_RXP_CPU_MODE_STEP_ENA;
+       cpu_reg.state = BNX2_RXP_CPU_STATE;
+       cpu_reg.state_value_clear = 0xffffff;
+       cpu_reg.gpr0 = BNX2_RXP_CPU_REG_FILE;
+       cpu_reg.evmask = BNX2_RXP_CPU_EVENT_MASK;
+       cpu_reg.pc = BNX2_RXP_CPU_PROGRAM_COUNTER;
+       cpu_reg.inst = BNX2_RXP_CPU_INSTRUCTION;
+       cpu_reg.bp = BNX2_RXP_CPU_HW_BREAKPOINT;
+       cpu_reg.spad_base = BNX2_RXP_SCRATCH;
+       cpu_reg.mips_view_base = 0x8000000;
+    
+       fw.ver_major = bnx2_RXP_b06FwReleaseMajor;
+       fw.ver_minor = bnx2_RXP_b06FwReleaseMinor;
+       fw.ver_fix = bnx2_RXP_b06FwReleaseFix;
+       fw.start_addr = bnx2_RXP_b06FwStartAddr;
+
+       fw.text_addr = bnx2_RXP_b06FwTextAddr;
+       fw.text_len = bnx2_RXP_b06FwTextLen;
+       fw.text_index = 0;
+       fw.text = bnx2_RXP_b06FwText;
+
+       fw.data_addr = bnx2_RXP_b06FwDataAddr;
+       fw.data_len = bnx2_RXP_b06FwDataLen;
+       fw.data_index = 0;
+       fw.data = bnx2_RXP_b06FwData;
+
+       fw.sbss_addr = bnx2_RXP_b06FwSbssAddr;
+       fw.sbss_len = bnx2_RXP_b06FwSbssLen;
+       fw.sbss_index = 0;
+       fw.sbss = bnx2_RXP_b06FwSbss;
+
+       fw.bss_addr = bnx2_RXP_b06FwBssAddr;
+       fw.bss_len = bnx2_RXP_b06FwBssLen;
+       fw.bss_index = 0;
+       fw.bss = bnx2_RXP_b06FwBss;
+
+       fw.rodata_addr = bnx2_RXP_b06FwRodataAddr;
+       fw.rodata_len = bnx2_RXP_b06FwRodataLen;
+       fw.rodata_index = 0;
+       fw.rodata = bnx2_RXP_b06FwRodata;
+
+       load_cpu_fw(bp, &cpu_reg, &fw);
+
+       /* Initialize the TX Processor. */
+       cpu_reg.mode = BNX2_TXP_CPU_MODE;
+       cpu_reg.mode_value_halt = BNX2_TXP_CPU_MODE_SOFT_HALT;
+       cpu_reg.mode_value_sstep = BNX2_TXP_CPU_MODE_STEP_ENA;
+       cpu_reg.state = BNX2_TXP_CPU_STATE;
+       cpu_reg.state_value_clear = 0xffffff;
+       cpu_reg.gpr0 = BNX2_TXP_CPU_REG_FILE;
+       cpu_reg.evmask = BNX2_TXP_CPU_EVENT_MASK;
+       cpu_reg.pc = BNX2_TXP_CPU_PROGRAM_COUNTER;
+       cpu_reg.inst = BNX2_TXP_CPU_INSTRUCTION;
+       cpu_reg.bp = BNX2_TXP_CPU_HW_BREAKPOINT;
+       cpu_reg.spad_base = BNX2_TXP_SCRATCH;
+       cpu_reg.mips_view_base = 0x8000000;
+    
+       fw.ver_major = bnx2_TXP_b06FwReleaseMajor;
+       fw.ver_minor = bnx2_TXP_b06FwReleaseMinor;
+       fw.ver_fix = bnx2_TXP_b06FwReleaseFix;
+       fw.start_addr = bnx2_TXP_b06FwStartAddr;
+
+       fw.text_addr = bnx2_TXP_b06FwTextAddr;
+       fw.text_len = bnx2_TXP_b06FwTextLen;
+       fw.text_index = 0;
+       fw.text = bnx2_TXP_b06FwText;
+
+       fw.data_addr = bnx2_TXP_b06FwDataAddr;
+       fw.data_len = bnx2_TXP_b06FwDataLen;
+       fw.data_index = 0;
+       fw.data = bnx2_TXP_b06FwData;
+
+       fw.sbss_addr = bnx2_TXP_b06FwSbssAddr;
+       fw.sbss_len = bnx2_TXP_b06FwSbssLen;
+       fw.sbss_index = 0;
+       fw.sbss = bnx2_TXP_b06FwSbss;
+
+       fw.bss_addr = bnx2_TXP_b06FwBssAddr;
+       fw.bss_len = bnx2_TXP_b06FwBssLen;
+       fw.bss_index = 0;
+       fw.bss = bnx2_TXP_b06FwBss;
+
+       fw.rodata_addr = bnx2_TXP_b06FwRodataAddr;
+       fw.rodata_len = bnx2_TXP_b06FwRodataLen;
+       fw.rodata_index = 0;
+       fw.rodata = bnx2_TXP_b06FwRodata;
+
+       load_cpu_fw(bp, &cpu_reg, &fw);
+
+       /* Initialize the TX Patch-up Processor. */
+       cpu_reg.mode = BNX2_TPAT_CPU_MODE;
+       cpu_reg.mode_value_halt = BNX2_TPAT_CPU_MODE_SOFT_HALT;
+       cpu_reg.mode_value_sstep = BNX2_TPAT_CPU_MODE_STEP_ENA;
+       cpu_reg.state = BNX2_TPAT_CPU_STATE;
+       cpu_reg.state_value_clear = 0xffffff;
+       cpu_reg.gpr0 = BNX2_TPAT_CPU_REG_FILE;
+       cpu_reg.evmask = BNX2_TPAT_CPU_EVENT_MASK;
+       cpu_reg.pc = BNX2_TPAT_CPU_PROGRAM_COUNTER;
+       cpu_reg.inst = BNX2_TPAT_CPU_INSTRUCTION;
+       cpu_reg.bp = BNX2_TPAT_CPU_HW_BREAKPOINT;
+       cpu_reg.spad_base = BNX2_TPAT_SCRATCH;
+       cpu_reg.mips_view_base = 0x8000000;
+    
+       fw.ver_major = bnx2_TPAT_b06FwReleaseMajor;
+       fw.ver_minor = bnx2_TPAT_b06FwReleaseMinor;
+       fw.ver_fix = bnx2_TPAT_b06FwReleaseFix;
+       fw.start_addr = bnx2_TPAT_b06FwStartAddr;
+
+       fw.text_addr = bnx2_TPAT_b06FwTextAddr;
+       fw.text_len = bnx2_TPAT_b06FwTextLen;
+       fw.text_index = 0;
+       fw.text = bnx2_TPAT_b06FwText;
+
+       fw.data_addr = bnx2_TPAT_b06FwDataAddr;
+       fw.data_len = bnx2_TPAT_b06FwDataLen;
+       fw.data_index = 0;
+       fw.data = bnx2_TPAT_b06FwData;
+
+       fw.sbss_addr = bnx2_TPAT_b06FwSbssAddr;
+       fw.sbss_len = bnx2_TPAT_b06FwSbssLen;
+       fw.sbss_index = 0;
+       fw.sbss = bnx2_TPAT_b06FwSbss;
+
+       fw.bss_addr = bnx2_TPAT_b06FwBssAddr;
+       fw.bss_len = bnx2_TPAT_b06FwBssLen;
+       fw.bss_index = 0;
+       fw.bss = bnx2_TPAT_b06FwBss;
+
+       fw.rodata_addr = bnx2_TPAT_b06FwRodataAddr;
+       fw.rodata_len = bnx2_TPAT_b06FwRodataLen;
+       fw.rodata_index = 0;
+       fw.rodata = bnx2_TPAT_b06FwRodata;
+
+       load_cpu_fw(bp, &cpu_reg, &fw);
+
+       /* Initialize the Completion Processor. */
+       cpu_reg.mode = BNX2_COM_CPU_MODE;
+       cpu_reg.mode_value_halt = BNX2_COM_CPU_MODE_SOFT_HALT;
+       cpu_reg.mode_value_sstep = BNX2_COM_CPU_MODE_STEP_ENA;
+       cpu_reg.state = BNX2_COM_CPU_STATE;
+       cpu_reg.state_value_clear = 0xffffff;
+       cpu_reg.gpr0 = BNX2_COM_CPU_REG_FILE;
+       cpu_reg.evmask = BNX2_COM_CPU_EVENT_MASK;
+       cpu_reg.pc = BNX2_COM_CPU_PROGRAM_COUNTER;
+       cpu_reg.inst = BNX2_COM_CPU_INSTRUCTION;
+       cpu_reg.bp = BNX2_COM_CPU_HW_BREAKPOINT;
+       cpu_reg.spad_base = BNX2_COM_SCRATCH;
+       cpu_reg.mips_view_base = 0x8000000;
+    
+       fw.ver_major = bnx2_COM_b06FwReleaseMajor;
+       fw.ver_minor = bnx2_COM_b06FwReleaseMinor;
+       fw.ver_fix = bnx2_COM_b06FwReleaseFix;
+       fw.start_addr = bnx2_COM_b06FwStartAddr;
+
+       fw.text_addr = bnx2_COM_b06FwTextAddr;
+       fw.text_len = bnx2_COM_b06FwTextLen;
+       fw.text_index = 0;
+       fw.text = bnx2_COM_b06FwText;
+
+       fw.data_addr = bnx2_COM_b06FwDataAddr;
+       fw.data_len = bnx2_COM_b06FwDataLen;
+       fw.data_index = 0;
+       fw.data = bnx2_COM_b06FwData;
+
+       fw.sbss_addr = bnx2_COM_b06FwSbssAddr;
+       fw.sbss_len = bnx2_COM_b06FwSbssLen;
+       fw.sbss_index = 0;
+       fw.sbss = bnx2_COM_b06FwSbss;
+
+       fw.bss_addr = bnx2_COM_b06FwBssAddr;
+       fw.bss_len = bnx2_COM_b06FwBssLen;
+       fw.bss_index = 0;
+       fw.bss = bnx2_COM_b06FwBss;
+
+       fw.rodata_addr = bnx2_COM_b06FwRodataAddr;
+       fw.rodata_len = bnx2_COM_b06FwRodataLen;
+       fw.rodata_index = 0;
+       fw.rodata = bnx2_COM_b06FwRodata;
+
+       load_cpu_fw(bp, &cpu_reg, &fw);
+
+}
+
+static int
+bnx2_set_power_state(struct bnx2 *bp, int state)
+{
+       u16 pmcsr;
+
+       pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, &pmcsr);
+
+       switch (state) {
+       case 0: {
+               u32 val;
+
+               pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL,
+                       (pmcsr & ~PCI_PM_CTRL_STATE_MASK) |
+                       PCI_PM_CTRL_PME_STATUS);
+
+               if (pmcsr & PCI_PM_CTRL_STATE_MASK)
+                       /* delay required during transition out of D3hot */
+                       msleep(20);
+
+               val = REG_RD(bp, BNX2_EMAC_MODE);
+               val |= BNX2_EMAC_MODE_MPKT_RCVD | BNX2_EMAC_MODE_ACPI_RCVD;
+               val &= ~BNX2_EMAC_MODE_MPKT;
+               REG_WR(bp, BNX2_EMAC_MODE, val);
+
+               val = REG_RD(bp, BNX2_RPM_CONFIG);
+               val &= ~BNX2_RPM_CONFIG_ACPI_ENA;
+               REG_WR(bp, BNX2_RPM_CONFIG, val);
+               break;
+       }
+       case 3: {
+               int i;
+               u32 val, wol_msg;
+
+               if (bp->wol) {
+                       u32 advertising;
+                       u8 autoneg;
+
+                       autoneg = bp->autoneg;
+                       advertising = bp->advertising;
+
+                       bp->autoneg = AUTONEG_SPEED;
+                       bp->advertising = ADVERTISED_10baseT_Half |
+                               ADVERTISED_10baseT_Full |
+                               ADVERTISED_100baseT_Half |
+                               ADVERTISED_100baseT_Full |
+                               ADVERTISED_Autoneg;
+
+                       bnx2_setup_copper_phy(bp);
+
+                       bp->autoneg = autoneg;
+                       bp->advertising = advertising;
+
+                       bnx2_set_mac_addr(bp);
+
+                       val = REG_RD(bp, BNX2_EMAC_MODE);
+
+                       /* Enable port mode. */
+                       val &= ~BNX2_EMAC_MODE_PORT;
+                       val |= BNX2_EMAC_MODE_PORT_MII |
+                              BNX2_EMAC_MODE_MPKT_RCVD |
+                              BNX2_EMAC_MODE_ACPI_RCVD |
+                              BNX2_EMAC_MODE_FORCE_LINK |
+                              BNX2_EMAC_MODE_MPKT;
+
+                       REG_WR(bp, BNX2_EMAC_MODE, val);
+
+                       /* receive all multicast */
+                       for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
+                               REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
+                                      0xffffffff);
+                       }
+                       REG_WR(bp, BNX2_EMAC_RX_MODE,
+                              BNX2_EMAC_RX_MODE_SORT_MODE);
+
+                       val = 1 | BNX2_RPM_SORT_USER0_BC_EN |
+                             BNX2_RPM_SORT_USER0_MC_EN;
+                       REG_WR(bp, BNX2_RPM_SORT_USER0, 0x0);
+                       REG_WR(bp, BNX2_RPM_SORT_USER0, val);
+                       REG_WR(bp, BNX2_RPM_SORT_USER0, val |
+                              BNX2_RPM_SORT_USER0_ENA);
+
+                       /* Need to enable EMAC and RPM for WOL. */
+                       REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
+                              BNX2_MISC_ENABLE_SET_BITS_RX_PARSER_MAC_ENABLE |
+                              BNX2_MISC_ENABLE_SET_BITS_TX_HEADER_Q_ENABLE |
+                              BNX2_MISC_ENABLE_SET_BITS_EMAC_ENABLE);
+
+                       val = REG_RD(bp, BNX2_RPM_CONFIG);
+                       val &= ~BNX2_RPM_CONFIG_ACPI_ENA;
+                       REG_WR(bp, BNX2_RPM_CONFIG, val);
+
+                       wol_msg = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
+               }
+               else {
+                       wol_msg = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL;
+               }
+
+               bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT3 | wol_msg);
+
+               pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
+               if ((CHIP_ID(bp) == CHIP_ID_5706_A0) ||
+                   (CHIP_ID(bp) == CHIP_ID_5706_A1)) {
+
+                       if (bp->wol)
+                               pmcsr |= 3;
+               }
+               else {
+                       pmcsr |= 3;
+               }
+               if (bp->wol) {
+                       pmcsr |= PCI_PM_CTRL_PME_ENABLE;
+               }
+               pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL,
+                                     pmcsr);
+
+               /* No more memory access after this point until
+                * device is brought back to D0.
+                */
+               udelay(50);
+               break;
+       }
+       default:
+               return -EINVAL;
+       }
+       return 0;
+}
+
+static int
+bnx2_acquire_nvram_lock(struct bnx2 *bp)
+{
+       u32 val;
+       int j;
+
+       /* Request access to the flash interface. */
+       REG_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_SET2);
+       for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
+               val = REG_RD(bp, BNX2_NVM_SW_ARB);
+               if (val & BNX2_NVM_SW_ARB_ARB_ARB2)
+                       break;
+
+               udelay(5);
+       }
+
+       if (j >= NVRAM_TIMEOUT_COUNT)
+               return -EBUSY;
+
+       return 0;
+}
+
+static int
+bnx2_release_nvram_lock(struct bnx2 *bp)
+{
+       int j;
+       u32 val;
+
+       /* Relinquish nvram interface. */
+       REG_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_CLR2);
+
+       for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
+               val = REG_RD(bp, BNX2_NVM_SW_ARB);
+               if (!(val & BNX2_NVM_SW_ARB_ARB_ARB2))
+                       break;
+
+               udelay(5);
+       }
+
+       if (j >= NVRAM_TIMEOUT_COUNT)
+               return -EBUSY;
+
+       return 0;
+}
+
+
+static int
+bnx2_enable_nvram_write(struct bnx2 *bp)
+{
+       u32 val;
+
+       val = REG_RD(bp, BNX2_MISC_CFG);
+       REG_WR(bp, BNX2_MISC_CFG, val | BNX2_MISC_CFG_NVM_WR_EN_PCI);
+
+       if (!bp->flash_info->buffered) {
+               int j;
+
+               REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
+               REG_WR(bp, BNX2_NVM_COMMAND,
+                      BNX2_NVM_COMMAND_WREN | BNX2_NVM_COMMAND_DOIT);
+
+               for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
+                       udelay(5);
+
+                       val = REG_RD(bp, BNX2_NVM_COMMAND);
+                       if (val & BNX2_NVM_COMMAND_DONE)
+                               break;
+               }
+
+               if (j >= NVRAM_TIMEOUT_COUNT)
+                       return -EBUSY;
+       }
+       return 0;
+}
+
+static void
+bnx2_disable_nvram_write(struct bnx2 *bp)
+{
+       u32 val;
+
+       val = REG_RD(bp, BNX2_MISC_CFG);
+       REG_WR(bp, BNX2_MISC_CFG, val & ~BNX2_MISC_CFG_NVM_WR_EN);
+}
+
+
+static void
+bnx2_enable_nvram_access(struct bnx2 *bp)
+{
+       u32 val;
+
+       val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE);
+       /* Enable both bits, even on read. */
+       REG_WR(bp, BNX2_NVM_ACCESS_ENABLE, 
+              val | BNX2_NVM_ACCESS_ENABLE_EN | BNX2_NVM_ACCESS_ENABLE_WR_EN);
+}
+
+static void
+bnx2_disable_nvram_access(struct bnx2 *bp)
+{
+       u32 val;
+
+       val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE);
+       /* Disable both bits, even after read. */
+       REG_WR(bp, BNX2_NVM_ACCESS_ENABLE, 
+               val & ~(BNX2_NVM_ACCESS_ENABLE_EN |
+                       BNX2_NVM_ACCESS_ENABLE_WR_EN));
+}
+
+static int
+bnx2_nvram_erase_page(struct bnx2 *bp, u32 offset)
+{
+       u32 cmd;
+       int j;
+
+       if (bp->flash_info->buffered)
+               /* Buffered flash, no erase needed */
+               return 0;
+
+       /* Build an erase command */
+       cmd = BNX2_NVM_COMMAND_ERASE | BNX2_NVM_COMMAND_WR |
+             BNX2_NVM_COMMAND_DOIT;
+
+       /* Need to clear DONE bit separately. */
+       REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
+
+       /* Address of the NVRAM to read from. */
+       REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);
+
+       /* Issue an erase command. */
+       REG_WR(bp, BNX2_NVM_COMMAND, cmd);
+
+       /* Wait for completion. */
+       for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
+               u32 val;
+
+               udelay(5);
+
+               val = REG_RD(bp, BNX2_NVM_COMMAND);
+               if (val & BNX2_NVM_COMMAND_DONE)
+                       break;
+       }
+
+       if (j >= NVRAM_TIMEOUT_COUNT)
+               return -EBUSY;
+
+       return 0;
+}
+
+static int
+bnx2_nvram_read_dword(struct bnx2 *bp, u32 offset, u8 *ret_val, u32 cmd_flags)
+{
+       u32 cmd;
+       int j;
+
+       /* Build the command word. */
+       cmd = BNX2_NVM_COMMAND_DOIT | cmd_flags;
+
+       /* Calculate an offset of a buffered flash. */
+       if (bp->flash_info->buffered) {
+               offset = ((offset / bp->flash_info->page_size) <<
+                          bp->flash_info->page_bits) +
+                         (offset % bp->flash_info->page_size);
+       }
+
+       /* Need to clear DONE bit separately. */
+       REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
+
+       /* Address of the NVRAM to read from. */
+       REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);
+
+       /* Issue a read command. */
+       REG_WR(bp, BNX2_NVM_COMMAND, cmd);
+
+       /* Wait for completion. */
+       for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
+               u32 val;
+
+               udelay(5);
+
+               val = REG_RD(bp, BNX2_NVM_COMMAND);
+               if (val & BNX2_NVM_COMMAND_DONE) {
+                       val = REG_RD(bp, BNX2_NVM_READ);
+
+                       val = be32_to_cpu(val);
+                       memcpy(ret_val, &val, 4);
+                       break;
+               }
+       }
+       if (j >= NVRAM_TIMEOUT_COUNT)
+               return -EBUSY;
+
+       return 0;
+}
+
+
+static int
+bnx2_nvram_write_dword(struct bnx2 *bp, u32 offset, u8 *val, u32 cmd_flags)
+{
+       u32 cmd, val32;
+       int j;
+
+       /* Build the command word. */
+       cmd = BNX2_NVM_COMMAND_DOIT | BNX2_NVM_COMMAND_WR | cmd_flags;
+
+       /* Calculate an offset of a buffered flash. */
+       if (bp->flash_info->buffered) {
+               offset = ((offset / bp->flash_info->page_size) <<
+                         bp->flash_info->page_bits) +
+                        (offset % bp->flash_info->page_size);
+       }
+
+       /* Need to clear DONE bit separately. */
+       REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
+
+       memcpy(&val32, val, 4);
+       val32 = cpu_to_be32(val32);
+
+       /* Write the data. */
+       REG_WR(bp, BNX2_NVM_WRITE, val32);
+
+       /* Address of the NVRAM to write to. */
+       REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);
+
+       /* Issue the write command. */
+       REG_WR(bp, BNX2_NVM_COMMAND, cmd);
+
+       /* Wait for completion. */
+       for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
+               udelay(5);
+
+               if (REG_RD(bp, BNX2_NVM_COMMAND) & BNX2_NVM_COMMAND_DONE)
+                       break;
+       }
+       if (j >= NVRAM_TIMEOUT_COUNT)
+               return -EBUSY;
+
+       return 0;
+}
+
+static int
+bnx2_init_nvram(struct bnx2 *bp)
+{
+       u32 val;
+       int j, entry_count, rc;
+       struct flash_spec *flash;
+
+       /* Determine the selected interface. */
+       val = REG_RD(bp, BNX2_NVM_CFG1);
+
+       entry_count = sizeof(flash_table) / sizeof(struct flash_spec);
+
+       rc = 0;
+       if (val & 0x40000000) {
+
+               /* Flash interface has been reconfigured */
+               for (j = 0, flash = &flash_table[0]; j < entry_count;
+                       j++, flash++) {
+
+                       if (val == flash->config1) {
+                               bp->flash_info = flash;
+                               break;
+                       }
+               }
+       }
+       else {
+               /* Not yet been reconfigured */
+
+               for (j = 0, flash = &flash_table[0]; j < entry_count;
+                       j++, flash++) {
+
+                       if ((val & FLASH_STRAP_MASK) == flash->strapping) {
+                               bp->flash_info = flash;
+
+                               /* Request access to the flash interface. */
+                               if ((rc = bnx2_acquire_nvram_lock(bp)) != 0)
+                                       return rc;
+
+                               /* Enable access to flash interface */
+                               bnx2_enable_nvram_access(bp);
+
+                               /* Reconfigure the flash interface */
+                               REG_WR(bp, BNX2_NVM_CFG1, flash->config1);
+                               REG_WR(bp, BNX2_NVM_CFG2, flash->config2);
+                               REG_WR(bp, BNX2_NVM_CFG3, flash->config3);
+                               REG_WR(bp, BNX2_NVM_WRITE1, flash->write1);
+
+                               /* Disable access to flash interface */
+                               bnx2_disable_nvram_access(bp);
+                               bnx2_release_nvram_lock(bp);
+
+                               break;
+                       }
+               }
+       } /* if (val & 0x40000000) */
+
+       if (j == entry_count) {
+               bp->flash_info = NULL;
+               printk(KERN_ALERT "Unknown flash/EEPROM type.\n");
+               rc = -ENODEV;
+       }
+
+       return rc;
+}
+
+static int
+bnx2_nvram_read(struct bnx2 *bp, u32 offset, u8 *ret_buf,
+               int buf_size)
+{
+       int rc = 0;
+       u32 cmd_flags, offset32, len32, extra;
+
+       if (buf_size == 0)
+               return 0;
+
+       /* Request access to the flash interface. */
+       if ((rc = bnx2_acquire_nvram_lock(bp)) != 0)
+               return rc;
+
+       /* Enable access to flash interface */
+       bnx2_enable_nvram_access(bp);
+
+       len32 = buf_size;
+       offset32 = offset;
+       extra = 0;
+
+       cmd_flags = 0;
+
+       if (offset32 & 3) {
+               u8 buf[4];
+               u32 pre_len;
+
+               offset32 &= ~3;
+               pre_len = 4 - (offset & 3);
+
+               if (pre_len >= len32) {
+                       pre_len = len32;
+                       cmd_flags = BNX2_NVM_COMMAND_FIRST |
+                                   BNX2_NVM_COMMAND_LAST;
+               }
+               else {
+                       cmd_flags = BNX2_NVM_COMMAND_FIRST;
+               }
+
+               rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags);
+
+               if (rc)
+                       return rc;
+
+               memcpy(ret_buf, buf + (offset & 3), pre_len);
+
+               offset32 += 4;
+               ret_buf += pre_len;
+               len32 -= pre_len;
+       }
+       if (len32 & 3) {
+               extra = 4 - (len32 & 3);
+               len32 = (len32 + 4) & ~3;
+       }
+
+       if (len32 == 4) {
+               u8 buf[4];
+
+               if (cmd_flags)
+                       cmd_flags = BNX2_NVM_COMMAND_LAST;
+               else
+                       cmd_flags = BNX2_NVM_COMMAND_FIRST |
+                                   BNX2_NVM_COMMAND_LAST;
+
+               rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags);
+
+               memcpy(ret_buf, buf, 4 - extra);
+       }
+       else if (len32 > 0) {
+               u8 buf[4];
+
+               /* Read the first word. */
+               if (cmd_flags)
+                       cmd_flags = 0;
+               else
+                       cmd_flags = BNX2_NVM_COMMAND_FIRST;
+
+               rc = bnx2_nvram_read_dword(bp, offset32, ret_buf, cmd_flags);
+
+               /* Advance to the next dword. */
+               offset32 += 4;
+               ret_buf += 4;
+               len32 -= 4;
+
+               while (len32 > 4 && rc == 0) {
+                       rc = bnx2_nvram_read_dword(bp, offset32, ret_buf, 0);
+
+                       /* Advance to the next dword. */
+                       offset32 += 4;
+                       ret_buf += 4;
+                       len32 -= 4;
+               }
+
+               if (rc)
+                       return rc;
+
+               cmd_flags = BNX2_NVM_COMMAND_LAST;
+               rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags);
+
+               memcpy(ret_buf, buf, 4 - extra);
+       }
+
+       /* Disable access to flash interface */
+       bnx2_disable_nvram_access(bp);
+
+       bnx2_release_nvram_lock(bp);
+
+       return rc;
+}
+
+static int
+bnx2_nvram_write(struct bnx2 *bp, u32 offset, u8 *data_buf,
+               int buf_size)
+{
+       u32 written, offset32, len32;
+       u8 *buf, start[4], end[4];
+       int rc = 0;
+       int align_start, align_end;
+
+       buf = data_buf;
+       offset32 = offset;
+       len32 = buf_size;
+       align_start = align_end = 0;
+
+       if ((align_start = (offset32 & 3))) {
+               offset32 &= ~3;
+               len32 += align_start;
+               if ((rc = bnx2_nvram_read(bp, offset32, start, 4)))
+                       return rc;
+       }
+
+       if (len32 & 3) {
+               if ((len32 > 4) || !align_start) {
+                       align_end = 4 - (len32 & 3);
+                       len32 += align_end;
+                       if ((rc = bnx2_nvram_read(bp, offset32 + len32 - 4,
+                               end, 4))) {
+                               return rc;
+                       }
+               }
+       }
+
+       if (align_start || align_end) {
+               buf = kmalloc(len32, GFP_KERNEL);
+               if (buf == 0)
+                       return -ENOMEM;
+               if (align_start) {
+                       memcpy(buf, start, 4);
+               }
+               if (align_end) {
+                       memcpy(buf + len32 - 4, end, 4);
+               }
+               memcpy(buf + align_start, data_buf, buf_size);
+       }
+
+       written = 0;
+       while ((written < len32) && (rc == 0)) {
+               u32 page_start, page_end, data_start, data_end;
+               u32 addr, cmd_flags;
+               int i;
+               u8 flash_buffer[264];
+
+               /* Find the page_start addr */
+               page_start = offset32 + written;
+               page_start -= (page_start % bp->flash_info->page_size);
+               /* Find the page_end addr */
+               page_end = page_start + bp->flash_info->page_size;
+               /* Find the data_start addr */
+               data_start = (written == 0) ? offset32 : page_start;
+               /* Find the data_end addr */
+               data_end = (page_end > offset32 + len32) ? 
+                       (offset32 + len32) : page_end;
+
+               /* Request access to the flash interface. */
+               if ((rc = bnx2_acquire_nvram_lock(bp)) != 0)
+                       goto nvram_write_end;
+
+               /* Enable access to flash interface */
+               bnx2_enable_nvram_access(bp);
+
+               cmd_flags = BNX2_NVM_COMMAND_FIRST;
+               if (bp->flash_info->buffered == 0) {
+                       int j;
+
+                       /* Read the whole page into the buffer
+                        * (non-buffer flash only) */
+                       for (j = 0; j < bp->flash_info->page_size; j += 4) {
+                               if (j == (bp->flash_info->page_size - 4)) {
+                                       cmd_flags |= BNX2_NVM_COMMAND_LAST;
+                               }
+                               rc = bnx2_nvram_read_dword(bp,
+                                       page_start + j, 
+                                       &flash_buffer[j], 
+                                       cmd_flags);
+
+                               if (rc)
+                                       goto nvram_write_end;
+
+                               cmd_flags = 0;
+                       }
+               }
+
+               /* Enable writes to flash interface (unlock write-protect) */
+               if ((rc = bnx2_enable_nvram_write(bp)) != 0)
+                       goto nvram_write_end;
+
+               /* Erase the page */
+               if ((rc = bnx2_nvram_erase_page(bp, page_start)) != 0)
+                       goto nvram_write_end;
+
+               /* Re-enable the write again for the actual write */
+               bnx2_enable_nvram_write(bp);
+
+               /* Loop to write back the buffer data from page_start to
+                * data_start */
+               i = 0;
+               if (bp->flash_info->buffered == 0) {
+                       for (addr = page_start; addr < data_start;
+                               addr += 4, i += 4) {
+                               
+                               rc = bnx2_nvram_write_dword(bp, addr,
+                                       &flash_buffer[i], cmd_flags);
+
+                               if (rc != 0)
+                                       goto nvram_write_end;
+
+                               cmd_flags = 0;
+                       }
+               }
+
+               /* Loop to write the new data from data_start to data_end */
+               for (addr = data_start; addr < data_end; addr += 4, i++) {
+                       if ((addr == page_end - 4) ||
+                               ((bp->flash_info->buffered) &&
+                                (addr == data_end - 4))) {
+
+                               cmd_flags |= BNX2_NVM_COMMAND_LAST;
+                       }
+                       rc = bnx2_nvram_write_dword(bp, addr, buf,
+                               cmd_flags);
+
+                       if (rc != 0)
+                               goto nvram_write_end;
+
+                       cmd_flags = 0;
+                       buf += 4;
+               }
+
+               /* Loop to write back the buffer data from data_end
+                * to page_end */
+               if (bp->flash_info->buffered == 0) {
+                       for (addr = data_end; addr < page_end;
+                               addr += 4, i += 4) {
+                       
+                               if (addr == page_end-4) {
+                                       cmd_flags = BNX2_NVM_COMMAND_LAST;
+                               }
+                               rc = bnx2_nvram_write_dword(bp, addr,
+                                       &flash_buffer[i], cmd_flags);
+
+                               if (rc != 0)
+                                       goto nvram_write_end;
+
+                               cmd_flags = 0;
+                       }
+               }
+
+               /* Disable writes to flash interface (lock write-protect) */
+               bnx2_disable_nvram_write(bp);
+
+               /* Disable access to flash interface */
+               bnx2_disable_nvram_access(bp);
+               bnx2_release_nvram_lock(bp);
+
+               /* Increment written */
+               written += data_end - data_start;
+       }
+
+nvram_write_end:
+       if (align_start || align_end)
+               kfree(buf);
+       return rc;
+}
+
+static int
+bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
+{
+       u32 val;
+       int i, rc = 0;
+
+       /* Wait for the current PCI transaction to complete before
+        * issuing a reset. */
+       REG_WR(bp, BNX2_MISC_ENABLE_CLR_BITS,
+              BNX2_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE |
+              BNX2_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE |
+              BNX2_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE |
+              BNX2_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE);
+       val = REG_RD(bp, BNX2_MISC_ENABLE_CLR_BITS);
+       udelay(5);
+
+       /* Deposit a driver reset signature so the firmware knows that
+        * this is a soft reset. */
+       REG_WR_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_DRV_RESET_SIGNATURE,
+                  BNX2_DRV_RESET_SIGNATURE_MAGIC);
+
+       bp->fw_timed_out = 0;
+
+       /* Wait for the firmware to tell us it is ok to issue a reset. */
+       bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT0 | reset_code);
+
+       /* Do a dummy read to force the chip to complete all current transaction
+        * before we issue a reset. */
+       val = REG_RD(bp, BNX2_MISC_ID);
+
+       val = BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
+             BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
+             BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP;
+
+       /* Chip reset. */
+       REG_WR(bp, BNX2_PCICFG_MISC_CONFIG, val);
+
+       if ((CHIP_ID(bp) == CHIP_ID_5706_A0) ||
+           (CHIP_ID(bp) == CHIP_ID_5706_A1))
+               msleep(15);
+
+       /* Reset takes approximate 30 usec */
+       for (i = 0; i < 10; i++) {
+               val = REG_RD(bp, BNX2_PCICFG_MISC_CONFIG);
+               if ((val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
+                           BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) == 0) {
+                       break;
+               }
+               udelay(10);
+       }
+
+       if (val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
+                  BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) {
+               printk(KERN_ERR PFX "Chip reset did not complete\n");
+               return -EBUSY;
+       }
+
+       /* Make sure byte swapping is properly configured. */
+       val = REG_RD(bp, BNX2_PCI_SWAP_DIAG0);
+       if (val != 0x01020304) {
+               printk(KERN_ERR PFX "Chip not in correct endian mode\n");
+               return -ENODEV;
+       }
+
+       bp->fw_timed_out = 0;
+
+       /* Wait for the firmware to finish its initialization. */
+       bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT1 | reset_code);
+
+       if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
+               /* Adjust the voltage regular to two steps lower.  The default
+                * of this register is 0x0000000e. */
+               REG_WR(bp, BNX2_MISC_VREG_CONTROL, 0x000000fa);
+
+               /* Remove bad rbuf memory from the free pool. */
+               rc = bnx2_alloc_bad_rbuf(bp);
+       }
+
+       return rc;
+}
+
+static int
+bnx2_init_chip(struct bnx2 *bp)
+{
+       u32 val;
+
+       /* Make sure the interrupt is not active. */
+       REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
+
+       val = BNX2_DMA_CONFIG_DATA_BYTE_SWAP |
+             BNX2_DMA_CONFIG_DATA_WORD_SWAP |
+#ifdef __BIG_ENDIAN
+             BNX2_DMA_CONFIG_CNTL_BYTE_SWAP | 
+#endif
+             BNX2_DMA_CONFIG_CNTL_WORD_SWAP | 
+             DMA_READ_CHANS << 12 |
+             DMA_WRITE_CHANS << 16;
+
+       val |= (0x2 << 20) | (1 << 11);
+
+       if ((bp->flags & PCIX_FLAG) && (bp->bus_speed_mhz = 133))
+               val |= (1 << 23);
+
+       if ((CHIP_NUM(bp) == CHIP_NUM_5706) &&
+           (CHIP_ID(bp) != CHIP_ID_5706_A0) && !(bp->flags & PCIX_FLAG))
+               val |= BNX2_DMA_CONFIG_CNTL_PING_PONG_DMA;
+
+       REG_WR(bp, BNX2_DMA_CONFIG, val);
+
+       if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
+               val = REG_RD(bp, BNX2_TDMA_CONFIG);
+               val |= BNX2_TDMA_CONFIG_ONE_DMA;
+               REG_WR(bp, BNX2_TDMA_CONFIG, val);
+       }
+
+       if (bp->flags & PCIX_FLAG) {
+               u16 val16;
+
+               pci_read_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD,
+                                    &val16);
+               pci_write_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD,
+                                     val16 & ~PCI_X_CMD_ERO);
+       }
+
+       REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
+              BNX2_MISC_ENABLE_SET_BITS_HOST_COALESCE_ENABLE |
+              BNX2_MISC_ENABLE_STATUS_BITS_RX_V2P_ENABLE |
+              BNX2_MISC_ENABLE_STATUS_BITS_CONTEXT_ENABLE);
+
+       /* Initialize context mapping and zero out the quick contexts.  The
+        * context block must have already been enabled. */
+       bnx2_init_context(bp);
+
+       bnx2_init_cpus(bp);
+       bnx2_init_nvram(bp);
+
+       bnx2_set_mac_addr(bp);
+
+       val = REG_RD(bp, BNX2_MQ_CONFIG);
+       val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE;
+       val |= BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_256;
+       REG_WR(bp, BNX2_MQ_CONFIG, val);
+
+       val = 0x10000 + (MAX_CID_CNT * MB_KERNEL_CTX_SIZE);
+       REG_WR(bp, BNX2_MQ_KNL_BYP_WIND_START, val);
+       REG_WR(bp, BNX2_MQ_KNL_WIND_END, val);
+
+       val = (BCM_PAGE_BITS - 8) << 24;
+       REG_WR(bp, BNX2_RV2P_CONFIG, val);
+
+       /* Configure page size. */
+       val = REG_RD(bp, BNX2_TBDR_CONFIG);
+       val &= ~BNX2_TBDR_CONFIG_PAGE_SIZE;
+       val |= (BCM_PAGE_BITS - 8) << 24 | 0x40;
+       REG_WR(bp, BNX2_TBDR_CONFIG, val);
+
+       val = bp->mac_addr[0] +
+             (bp->mac_addr[1] << 8) +
+             (bp->mac_addr[2] << 16) +
+             bp->mac_addr[3] +
+             (bp->mac_addr[4] << 8) +
+             (bp->mac_addr[5] << 16);
+       REG_WR(bp, BNX2_EMAC_BACKOFF_SEED, val);
+
+       /* Program the MTU.  Also include 4 bytes for CRC32. */
+       val = bp->dev->mtu + ETH_HLEN + 4;
+       if (val > (MAX_ETHERNET_PACKET_SIZE + 4))
+               val |= BNX2_EMAC_RX_MTU_SIZE_JUMBO_ENA;
+       REG_WR(bp, BNX2_EMAC_RX_MTU_SIZE, val);
+
+       bp->last_status_idx = 0;
+       bp->rx_mode = BNX2_EMAC_RX_MODE_SORT_MODE;
+
+       /* Set up how to generate a link change interrupt. */
+       REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);
+
+       REG_WR(bp, BNX2_HC_STATUS_ADDR_L,
+              (u64) bp->status_blk_mapping & 0xffffffff);
+       REG_WR(bp, BNX2_HC_STATUS_ADDR_H, (u64) bp->status_blk_mapping >> 32);
+
+       REG_WR(bp, BNX2_HC_STATISTICS_ADDR_L,
+              (u64) bp->stats_blk_mapping & 0xffffffff);
+       REG_WR(bp, BNX2_HC_STATISTICS_ADDR_H,
+              (u64) bp->stats_blk_mapping >> 32);
+
+       REG_WR(bp, BNX2_HC_TX_QUICK_CONS_TRIP, 
+              (bp->tx_quick_cons_trip_int << 16) | bp->tx_quick_cons_trip);
+
+       REG_WR(bp, BNX2_HC_RX_QUICK_CONS_TRIP,
+              (bp->rx_quick_cons_trip_int << 16) | bp->rx_quick_cons_trip);
+
+       REG_WR(bp, BNX2_HC_COMP_PROD_TRIP,
+              (bp->comp_prod_trip_int << 16) | bp->comp_prod_trip);
+
+       REG_WR(bp, BNX2_HC_TX_TICKS, (bp->tx_ticks_int << 16) | bp->tx_ticks);
+
+       REG_WR(bp, BNX2_HC_RX_TICKS, (bp->rx_ticks_int << 16) | bp->rx_ticks);
+
+       REG_WR(bp, BNX2_HC_COM_TICKS,
+              (bp->com_ticks_int << 16) | bp->com_ticks);
+
+       REG_WR(bp, BNX2_HC_CMD_TICKS,
+              (bp->cmd_ticks_int << 16) | bp->cmd_ticks);
+
+       REG_WR(bp, BNX2_HC_STATS_TICKS, bp->stats_ticks & 0xffff00);
+       REG_WR(bp, BNX2_HC_STAT_COLLECT_TICKS, 0xbb8);  /* 3ms */
+
+       if (CHIP_ID(bp) == CHIP_ID_5706_A1)
+               REG_WR(bp, BNX2_HC_CONFIG, BNX2_HC_CONFIG_COLLECT_STATS);
+       else {
+               REG_WR(bp, BNX2_HC_CONFIG, BNX2_HC_CONFIG_RX_TMR_MODE |
+                      BNX2_HC_CONFIG_TX_TMR_MODE |
+                      BNX2_HC_CONFIG_COLLECT_STATS);
+       }
+
+       /* Clear internal stats counters. */
+       REG_WR(bp, BNX2_HC_COMMAND, BNX2_HC_COMMAND_CLR_STAT_NOW);
+
+       REG_WR(bp, BNX2_HC_ATTN_BITS_ENABLE, STATUS_ATTN_BITS_LINK_STATE);
+
+       /* Initialize the receive filter. */
+       bnx2_set_rx_mode(bp->dev);
+
+       bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT2 | BNX2_DRV_MSG_CODE_RESET);
+
+       REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, 0x5ffffff);
+       REG_RD(bp, BNX2_MISC_ENABLE_SET_BITS);
+
+       udelay(20);
+
+       return 0;
+}
+
+
+static void
+bnx2_init_tx_ring(struct bnx2 *bp)
+{
+       struct tx_bd *txbd;
+       u32 val;
+
+       txbd = &bp->tx_desc_ring[MAX_TX_DESC_CNT];
+               
+       txbd->tx_bd_haddr_hi = (u64) bp->tx_desc_mapping >> 32;
+       txbd->tx_bd_haddr_lo = (u64) bp->tx_desc_mapping & 0xffffffff;
+
+       bp->tx_prod = 0;
+       bp->tx_cons = 0;
+       bp->tx_prod_bseq = 0;
+       atomic_set(&bp->tx_avail_bd, bp->tx_ring_size);
+       
+       val = BNX2_L2CTX_TYPE_TYPE_L2;
+       val |= BNX2_L2CTX_TYPE_SIZE_L2;
+       CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_TYPE, val);
+
+       val = BNX2_L2CTX_CMD_TYPE_TYPE_L2;
+       val |= 8 << 16;
+       CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_CMD_TYPE, val);
+
+       val = (u64) bp->tx_desc_mapping >> 32;
+       CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_TBDR_BHADDR_HI, val);
+
+       val = (u64) bp->tx_desc_mapping & 0xffffffff;
+       CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_TBDR_BHADDR_LO, val);
+}
+
+static void
+bnx2_init_rx_ring(struct bnx2 *bp)
+{
+       struct rx_bd *rxbd;
+       int i;
+       u16 prod, ring_prod; 
+       u32 val;
+
+       /* 8 for CRC and VLAN */
+       bp->rx_buf_use_size = bp->dev->mtu + ETH_HLEN + bp->rx_offset + 8;
+       /* 8 for alignment */
+       bp->rx_buf_size = bp->rx_buf_use_size + 8;
+
+       ring_prod = prod = bp->rx_prod = 0;
+       bp->rx_cons = 0;
+       bp->rx_prod_bseq = 0;
+               
+       rxbd = &bp->rx_desc_ring[0];
+       for (i = 0; i < MAX_RX_DESC_CNT; i++, rxbd++) {
+               rxbd->rx_bd_len = bp->rx_buf_use_size;
+               rxbd->rx_bd_flags = RX_BD_FLAGS_START | RX_BD_FLAGS_END;
+       }
+
+       rxbd->rx_bd_haddr_hi = (u64) bp->rx_desc_mapping >> 32;
+       rxbd->rx_bd_haddr_lo = (u64) bp->rx_desc_mapping & 0xffffffff;
+
+       val = BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE;
+       val |= BNX2_L2CTX_CTX_TYPE_SIZE_L2;
+       val |= 0x02 << 8;
+       CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_CTX_TYPE, val);
+
+       val = (u64) bp->rx_desc_mapping >> 32;
+       CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_NX_BDHADDR_HI, val);
+
+       val = (u64) bp->rx_desc_mapping & 0xffffffff;
+       CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_NX_BDHADDR_LO, val);
+
+       for ( ;ring_prod < bp->rx_ring_size; ) {
+               if (bnx2_alloc_rx_skb(bp, ring_prod) < 0) {
+                       break;
+               }
+               prod = NEXT_RX_BD(prod);
+               ring_prod = RX_RING_IDX(prod);
+       }
+       bp->rx_prod = prod;
+
+       REG_WR16(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BDIDX, prod);
+
+       REG_WR(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BSEQ, bp->rx_prod_bseq);
+}
+
+static void
+bnx2_free_tx_skbs(struct bnx2 *bp)
+{
+       int i;
+
+       if (bp->tx_buf_ring == NULL)
+               return;
+
+       for (i = 0; i < TX_DESC_CNT; ) {
+               struct sw_bd *tx_buf = &bp->tx_buf_ring[i];
+               struct sk_buff *skb = tx_buf->skb;
+               int j, last;
+
+               if (skb == NULL) {
+                       i++;
+                       continue;
+               }
+
+               pci_unmap_single(bp->pdev, pci_unmap_addr(tx_buf, mapping),
+                       skb_headlen(skb), PCI_DMA_TODEVICE);
+
+               tx_buf->skb = NULL;
+
+               last = skb_shinfo(skb)->nr_frags;
+               for (j = 0; j < last; j++) {
+                       tx_buf = &bp->tx_buf_ring[i + j + 1];
+                       pci_unmap_page(bp->pdev,
+                               pci_unmap_addr(tx_buf, mapping),
+                               skb_shinfo(skb)->frags[j].size,
+                               PCI_DMA_TODEVICE);
+               }
+               dev_kfree_skb_any(skb);
+               i += j + 1;
+       }
+
+}
+
+static void
+bnx2_free_rx_skbs(struct bnx2 *bp)
+{
+       int i;
+
+       if (bp->rx_buf_ring == NULL)
+               return;
+
+       for (i = 0; i < RX_DESC_CNT; i++) {
+               struct sw_bd *rx_buf = &bp->rx_buf_ring[i];
+               struct sk_buff *skb = rx_buf->skb;
+
+               if (skb == 0)
+                       continue;
+
+               pci_unmap_single(bp->pdev, pci_unmap_addr(rx_buf, mapping),
+                       bp->rx_buf_use_size, PCI_DMA_FROMDEVICE);
+
+               rx_buf->skb = NULL;
+
+               dev_kfree_skb_any(skb);
+       }
+}
+
+static void
+bnx2_free_skbs(struct bnx2 *bp)
+{
+       bnx2_free_tx_skbs(bp);
+       bnx2_free_rx_skbs(bp);
+}
+
+static int
+bnx2_reset_nic(struct bnx2 *bp, u32 reset_code)
+{
+       int rc;
+
+       rc = bnx2_reset_chip(bp, reset_code);
+       bnx2_free_skbs(bp);
+       if (rc)
+               return rc;
+
+       bnx2_init_chip(bp);
+       bnx2_init_tx_ring(bp);
+       bnx2_init_rx_ring(bp);
+       return 0;
+}
+
+static int
+bnx2_init_nic(struct bnx2 *bp)
+{
+       int rc;
+
+       if ((rc = bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET)) != 0)
+               return rc;
+
+       bnx2_init_phy(bp);
+       bnx2_set_link(bp);
+       return 0;
+}
+
+static int
+bnx2_test_registers(struct bnx2 *bp)
+{
+       int ret;
+       int i;
+       static struct {
+               u16   offset;
+               u16   flags;
+               u32   rw_mask;
+               u32   ro_mask;
+       } reg_tbl[] = {
+               { 0x006c, 0, 0x00000000, 0x0000003f },
+               { 0x0090, 0, 0xffffffff, 0x00000000 },
+               { 0x0094, 0, 0x00000000, 0x00000000 },
+
+               { 0x0404, 0, 0x00003f00, 0x00000000 },
+               { 0x0418, 0, 0x00000000, 0xffffffff },
+               { 0x041c, 0, 0x00000000, 0xffffffff },
+               { 0x0420, 0, 0x00000000, 0x80ffffff },
+               { 0x0424, 0, 0x00000000, 0x00000000 },
+               { 0x0428, 0, 0x00000000, 0x00000001 },
+               { 0x0450, 0, 0x00000000, 0x0000ffff },
+               { 0x0454, 0, 0x00000000, 0xffffffff },
+               { 0x0458, 0, 0x00000000, 0xffffffff },
+
+               { 0x0808, 0, 0x00000000, 0xffffffff },
+               { 0x0854, 0, 0x00000000, 0xffffffff },
+               { 0x0868, 0, 0x00000000, 0x77777777 },
+               { 0x086c, 0, 0x00000000, 0x77777777 },
+               { 0x0870, 0, 0x00000000, 0x77777777 },
+               { 0x0874, 0, 0x00000000, 0x77777777 },
+
+               { 0x0c00, 0, 0x00000000, 0x00000001 },
+               { 0x0c04, 0, 0x00000000, 0x03ff0001 },
+               { 0x0c08, 0, 0x0f0ff073, 0x00000000 },
+               { 0x0c0c, 0, 0x00ffffff, 0x00000000 },
+               { 0x0c30, 0, 0x00000000, 0xffffffff },
+               { 0x0c34, 0, 0x00000000, 0xffffffff },
+               { 0x0c38, 0, 0x00000000, 0xffffffff },
+               { 0x0c3c, 0, 0x00000000, 0xffffffff },
+               { 0x0c40, 0, 0x00000000, 0xffffffff },
+               { 0x0c44, 0, 0x00000000, 0xffffffff },
+               { 0x0c48, 0, 0x00000000, 0x0007ffff },
+               { 0x0c4c, 0, 0x00000000, 0xffffffff },
+               { 0x0c50, 0, 0x00000000, 0xffffffff },
+               { 0x0c54, 0, 0x00000000, 0xffffffff },
+               { 0x0c58, 0, 0x00000000, 0xffffffff },
+               { 0x0c5c, 0, 0x00000000, 0xffffffff },
+               { 0x0c60, 0, 0x00000000, 0xffffffff },
+               { 0x0c64, 0, 0x00000000, 0xffffffff },
+               { 0x0c68, 0, 0x00000000, 0xffffffff },
+               { 0x0c6c, 0, 0x00000000, 0xffffffff },
+               { 0x0c70, 0, 0x00000000, 0xffffffff },
+               { 0x0c74, 0, 0x00000000, 0xffffffff },
+               { 0x0c78, 0, 0x00000000, 0xffffffff },
+               { 0x0c7c, 0, 0x00000000, 0xffffffff },
+               { 0x0c80, 0, 0x00000000, 0xffffffff },
+               { 0x0c84, 0, 0x00000000, 0xffffffff },
+               { 0x0c88, 0, 0x00000000, 0xffffffff },
+               { 0x0c8c, 0, 0x00000000, 0xffffffff },
+               { 0x0c90, 0, 0x00000000, 0xffffffff },
+               { 0x0c94, 0, 0x00000000, 0xffffffff },
+               { 0x0c98, 0, 0x00000000, 0xffffffff },
+               { 0x0c9c, 0, 0x00000000, 0xffffffff },
+               { 0x0ca0, 0, 0x00000000, 0xffffffff },
+               { 0x0ca4, 0, 0x00000000, 0xffffffff },
+               { 0x0ca8, 0, 0x00000000, 0x0007ffff },
+               { 0x0cac, 0, 0x00000000, 0xffffffff },
+               { 0x0cb0, 0, 0x00000000, 0xffffffff },
+               { 0x0cb4, 0, 0x00000000, 0xffffffff },
+               { 0x0cb8, 0, 0x00000000, 0xffffffff },
+               { 0x0cbc, 0, 0x00000000, 0xffffffff },
+               { 0x0cc0, 0, 0x00000000, 0xffffffff },
+               { 0x0cc4, 0, 0x00000000, 0xffffffff },
+               { 0x0cc8, 0, 0x00000000, 0xffffffff },
+               { 0x0ccc, 0, 0x00000000, 0xffffffff },
+               { 0x0cd0, 0, 0x00000000, 0xffffffff },
+               { 0x0cd4, 0, 0x00000000, 0xffffffff },
+               { 0x0cd8, 0, 0x00000000, 0xffffffff },
+               { 0x0cdc, 0, 0x00000000, 0xffffffff },
+               { 0x0ce0, 0, 0x00000000, 0xffffffff },
+               { 0x0ce4, 0, 0x00000000, 0xffffffff },
+               { 0x0ce8, 0, 0x00000000, 0xffffffff },
+               { 0x0cec, 0, 0x00000000, 0xffffffff },
+               { 0x0cf0, 0, 0x00000000, 0xffffffff },
+               { 0x0cf4, 0, 0x00000000, 0xffffffff },
+               { 0x0cf8, 0, 0x00000000, 0xffffffff },
+               { 0x0cfc, 0, 0x00000000, 0xffffffff },
+               { 0x0d00, 0, 0x00000000, 0xffffffff },
+               { 0x0d04, 0, 0x00000000, 0xffffffff },
+
+               { 0x1000, 0, 0x00000000, 0x00000001 },
+               { 0x1004, 0, 0x00000000, 0x000f0001 },
+               { 0x1044, 0, 0x00000000, 0xffc003ff },
+               { 0x1080, 0, 0x00000000, 0x0001ffff },
+               { 0x1084, 0, 0x00000000, 0xffffffff },
+               { 0x1088, 0, 0x00000000, 0xffffffff },
+               { 0x108c, 0, 0x00000000, 0xffffffff },
+               { 0x1090, 0, 0x00000000, 0xffffffff },
+               { 0x1094, 0, 0x00000000, 0xffffffff },
+               { 0x1098, 0, 0x00000000, 0xffffffff },
+               { 0x109c, 0, 0x00000000, 0xffffffff },
+               { 0x10a0, 0, 0x00000000, 0xffffffff },
+
+               { 0x1408, 0, 0x01c00800, 0x00000000 },
+               { 0x149c, 0, 0x8000ffff, 0x00000000 },
+               { 0x14a8, 0, 0x00000000, 0x000001ff },
+               { 0x14ac, 0, 0x4fffffff, 0x10000000 },
+               { 0x14b0, 0, 0x00000002, 0x00000001 },
+               { 0x14b8, 0, 0x00000000, 0x00000000 },
+               { 0x14c0, 0, 0x00000000, 0x00000009 },
+               { 0x14c4, 0, 0x00003fff, 0x00000000 },
+               { 0x14cc, 0, 0x00000000, 0x00000001 },
+               { 0x14d0, 0, 0xffffffff, 0x00000000 },
+               { 0x1500, 0, 0x00000000, 0xffffffff },
+               { 0x1504, 0, 0x00000000, 0xffffffff },
+               { 0x1508, 0, 0x00000000, 0xffffffff },
+               { 0x150c, 0, 0x00000000, 0xffffffff },
+               { 0x1510, 0, 0x00000000, 0xffffffff },
+               { 0x1514, 0, 0x00000000, 0xffffffff },
+               { 0x1518, 0, 0x00000000, 0xffffffff },
+               { 0x151c, 0, 0x00000000, 0xffffffff },
+               { 0x1520, 0, 0x00000000, 0xffffffff },
+               { 0x1524, 0, 0x00000000, 0xffffffff },
+               { 0x1528, 0, 0x00000000, 0xffffffff },
+               { 0x152c, 0, 0x00000000, 0xffffffff },
+               { 0x1530, 0, 0x00000000, 0xffffffff },
+               { 0x1534, 0, 0x00000000, 0xffffffff },
+               { 0x1538, 0, 0x00000000, 0xffffffff },
+               { 0x153c, 0, 0x00000000, 0xffffffff },
+               { 0x1540, 0, 0x00000000, 0xffffffff },
+               { 0x1544, 0, 0x00000000, 0xffffffff },
+               { 0x1548, 0, 0x00000000, 0xffffffff },
+               { 0x154c, 0, 0x00000000, 0xffffffff },
+               { 0x1550, 0, 0x00000000, 0xffffffff },
+               { 0x1554, 0, 0x00000000, 0xffffffff },
+               { 0x1558, 0, 0x00000000, 0xffffffff },
+               { 0x1600, 0, 0x00000000, 0xffffffff },
+               { 0x1604, 0, 0x00000000, 0xffffffff },
+               { 0x1608, 0, 0x00000000, 0xffffffff },
+               { 0x160c, 0, 0x00000000, 0xffffffff },
+               { 0x1610, 0, 0x00000000, 0xffffffff },
+               { 0x1614, 0, 0x00000000, 0xffffffff },
+               { 0x1618, 0, 0x00000000, 0xffffffff },
+               { 0x161c, 0, 0x00000000, 0xffffffff },
+               { 0x1620, 0, 0x00000000, 0xffffffff },
+               { 0x1624, 0, 0x00000000, 0xffffffff },
+               { 0x1628, 0, 0x00000000, 0xffffffff },
+               { 0x162c, 0, 0x00000000, 0xffffffff },
+               { 0x1630, 0, 0x00000000, 0xffffffff },
+               { 0x1634, 0, 0x00000000, 0xffffffff },
+               { 0x1638, 0, 0x00000000, 0xffffffff },
+               { 0x163c, 0, 0x00000000, 0xffffffff },
+               { 0x1640, 0, 0x00000000, 0xffffffff },
+               { 0x1644, 0, 0x00000000, 0xffffffff },
+               { 0x1648, 0, 0x00000000, 0xffffffff },
+               { 0x164c, 0, 0x00000000, 0xffffffff },
+               { 0x1650, 0, 0x00000000, 0xffffffff },
+               { 0x1654, 0, 0x00000000, 0xffffffff },
+
+               { 0x1800, 0, 0x00000000, 0x00000001 },
+               { 0x1804, 0, 0x00000000, 0x00000003 },
+               { 0x1840, 0, 0x00000000, 0xffffffff },
+               { 0x1844, 0, 0x00000000, 0xffffffff },
+               { 0x1848, 0, 0x00000000, 0xffffffff },
+               { 0x184c, 0, 0x00000000, 0xffffffff },
+               { 0x1850, 0, 0x00000000, 0xffffffff },
+               { 0x1900, 0, 0x7ffbffff, 0x00000000 },
+               { 0x1904, 0, 0xffffffff, 0x00000000 },
+               { 0x190c, 0, 0xffffffff, 0x00000000 },
+               { 0x1914, 0, 0xffffffff, 0x00000000 },
+               { 0x191c, 0, 0xffffffff, 0x00000000 },
+               { 0x1924, 0, 0xffffffff, 0x00000000 },
+               { 0x192c, 0, 0xffffffff, 0x00000000 },
+               { 0x1934, 0, 0xffffffff, 0x00000000 },
+               { 0x193c, 0, 0xffffffff, 0x00000000 },
+               { 0x1944, 0, 0xffffffff, 0x00000000 },
+               { 0x194c, 0, 0xffffffff, 0x00000000 },
+               { 0x1954, 0, 0xffffffff, 0x00000000 },
+               { 0x195c, 0, 0xffffffff, 0x00000000 },
+               { 0x1964, 0, 0xffffffff, 0x00000000 },
+               { 0x196c, 0, 0xffffffff, 0x00000000 },
+               { 0x1974, 0, 0xffffffff, 0x00000000 },
+               { 0x197c, 0, 0xffffffff, 0x00000000 },
+               { 0x1980, 0, 0x0700ffff, 0x00000000 },
+
+               { 0x1c00, 0, 0x00000000, 0x00000001 },
+               { 0x1c04, 0, 0x00000000, 0x00000003 },
+               { 0x1c08, 0, 0x0000000f, 0x00000000 },
+               { 0x1c40, 0, 0x00000000, 0xffffffff },
+               { 0x1c44, 0, 0x00000000, 0xffffffff },
+               { 0x1c48, 0, 0x00000000, 0xffffffff },
+               { 0x1c4c, 0, 0x00000000, 0xffffffff },
+               { 0x1c50, 0, 0x00000000, 0xffffffff },
+               { 0x1d00, 0, 0x7ffbffff, 0x00000000 },
+               { 0x1d04, 0, 0xffffffff, 0x00000000 },
+               { 0x1d0c, 0, 0xffffffff, 0x00000000 },
+               { 0x1d14, 0, 0xffffffff, 0x00000000 },
+               { 0x1d1c, 0, 0xffffffff, 0x00000000 },
+               { 0x1d24, 0, 0xffffffff, 0x00000000 },
+               { 0x1d2c, 0, 0xffffffff, 0x00000000 },
+               { 0x1d34, 0, 0xffffffff, 0x00000000 },
+               { 0x1d3c, 0, 0xffffffff, 0x00000000 },
+               { 0x1d44, 0, 0xffffffff, 0x00000000 },
+               { 0x1d4c, 0, 0xffffffff, 0x00000000 },
+               { 0x1d54, 0, 0xffffffff, 0x00000000 },
+               { 0x1d5c, 0, 0xffffffff, 0x00000000 },
+               { 0x1d64, 0, 0xffffffff, 0x00000000 },
+               { 0x1d6c, 0, 0xffffffff, 0x00000000 },
+               { 0x1d74, 0, 0xffffffff, 0x00000000 },
+               { 0x1d7c, 0, 0xffffffff, 0x00000000 },
+               { 0x1d80, 0, 0x0700ffff, 0x00000000 },
+
+               { 0x2004, 0, 0x00000000, 0x0337000f },
+               { 0x2008, 0, 0xffffffff, 0x00000000 },
+               { 0x200c, 0, 0xffffffff, 0x00000000 },
+               { 0x2010, 0, 0xffffffff, 0x00000000 },
+               { 0x2014, 0, 0x801fff80, 0x00000000 },
+               { 0x2018, 0, 0x000003ff, 0x00000000 },
+
+               { 0x2800, 0, 0x00000000, 0x00000001 },
+               { 0x2804, 0, 0x00000000, 0x00003f01 },
+               { 0x2808, 0, 0x0f3f3f03, 0x00000000 },
+               { 0x2810, 0, 0xffff0000, 0x00000000 },
+               { 0x2814, 0, 0xffff0000, 0x00000000 },
+               { 0x2818, 0, 0xffff0000, 0x00000000 },
+               { 0x281c, 0, 0xffff0000, 0x00000000 },
+               { 0x2834, 0, 0xffffffff, 0x00000000 },
+               { 0x2840, 0, 0x00000000, 0xffffffff },
+               { 0x2844, 0, 0x00000000, 0xffffffff },
+               { 0x2848, 0, 0xffffffff, 0x00000000 },
+               { 0x284c, 0, 0xf800f800, 0x07ff07ff },
+
+               { 0x2c00, 0, 0x00000000, 0x00000011 },
+               { 0x2c04, 0, 0x00000000, 0x00030007 },
+
+               { 0x3000, 0, 0x00000000, 0x00000001 },
+               { 0x3004, 0, 0x00000000, 0x007007ff },
+               { 0x3008, 0, 0x00000003, 0x00000000 },
+               { 0x300c, 0, 0xffffffff, 0x00000000 },
+               { 0x3010, 0, 0xffffffff, 0x00000000 },
+               { 0x3014, 0, 0xffffffff, 0x00000000 },
+               { 0x3034, 0, 0xffffffff, 0x00000000 },
+               { 0x3038, 0, 0xffffffff, 0x00000000 },
+               { 0x3050, 0, 0x00000001, 0x00000000 },
+
+               { 0x3c00, 0, 0x00000000, 0x00000001 },
+               { 0x3c04, 0, 0x00000000, 0x00070000 },
+               { 0x3c08, 0, 0x00007f71, 0x07f00000 },
+               { 0x3c0c, 0, 0x1f3ffffc, 0x00000000 },
+               { 0x3c10, 0, 0xffffffff, 0x00000000 },
+               { 0x3c14, 0, 0x00000000, 0xffffffff },
+               { 0x3c18, 0, 0x00000000, 0xffffffff },
+               { 0x3c1c, 0, 0xfffff000, 0x00000000 },
+               { 0x3c20, 0, 0xffffff00, 0x00000000 },
+               { 0x3c24, 0, 0xffffffff, 0x00000000 },
+               { 0x3c28, 0, 0xffffffff, 0x00000000 },
+               { 0x3c2c, 0, 0xffffffff, 0x00000000 },
+               { 0x3c30, 0, 0xffffffff, 0x00000000 },
+               { 0x3c34, 0, 0xffffffff, 0x00000000 },
+               { 0x3c38, 0, 0xffffffff, 0x00000000 },
+               { 0x3c3c, 0, 0xffffffff, 0x00000000 },
+               { 0x3c40, 0, 0xffffffff, 0x00000000 },
+               { 0x3c44, 0, 0xffffffff, 0x00000000 },
+               { 0x3c48, 0, 0xffffffff, 0x00000000 },
+               { 0x3c4c, 0, 0xffffffff, 0x00000000 },
+               { 0x3c50, 0, 0xffffffff, 0x00000000 },
+               { 0x3c54, 0, 0xffffffff, 0x00000000 },
+               { 0x3c58, 0, 0xffffffff, 0x00000000 },
+               { 0x3c5c, 0, 0xffffffff, 0x00000000 },
+               { 0x3c60, 0, 0xffffffff, 0x00000000 },
+               { 0x3c64, 0, 0xffffffff, 0x00000000 },
+               { 0x3c68, 0, 0xffffffff, 0x00000000 },
+               { 0x3c6c, 0, 0xffffffff, 0x00000000 },
+               { 0x3c70, 0, 0xffffffff, 0x00000000 },
+               { 0x3c74, 0, 0x0000003f, 0x00000000 },
+               { 0x3c78, 0, 0x00000000, 0x00000000 },
+               { 0x3c7c, 0, 0x00000000, 0x00000000 },
+               { 0x3c80, 0, 0x3fffffff, 0x00000000 },
+               { 0x3c84, 0, 0x0000003f, 0x00000000 },
+               { 0x3c88, 0, 0x00000000, 0xffffffff },
+               { 0x3c8c, 0, 0x00000000, 0xffffffff },
+
+               { 0x4000, 0, 0x00000000, 0x00000001 },
+               { 0x4004, 0, 0x00000000, 0x00030000 },
+               { 0x4008, 0, 0x00000ff0, 0x00000000 },
+               { 0x400c, 0, 0xffffffff, 0x00000000 },
+               { 0x4088, 0, 0x00000000, 0x00070303 },
+
+               { 0x4400, 0, 0x00000000, 0x00000001 },
+               { 0x4404, 0, 0x00000000, 0x00003f01 },
+               { 0x4408, 0, 0x7fff00ff, 0x00000000 },
+               { 0x440c, 0, 0xffffffff, 0x00000000 },
+               { 0x4410, 0, 0xffff,     0x0000 },
+               { 0x4414, 0, 0xffff,     0x0000 },
+               { 0x4418, 0, 0xffff,     0x0000 },
+               { 0x441c, 0, 0xffff,     0x0000 },
+               { 0x4428, 0, 0xffffffff, 0x00000000 },
+               { 0x442c, 0, 0xffffffff, 0x00000000 },
+               { 0x4430, 0, 0xffffffff, 0x00000000 },
+               { 0x4434, 0, 0xffffffff, 0x00000000 },
+               { 0x4438, 0, 0xffffffff, 0x00000000 },
+               { 0x443c, 0, 0xffffffff, 0x00000000 },
+               { 0x4440, 0, 0xffffffff, 0x00000000 },
+               { 0x4444, 0, 0xffffffff, 0x00000000 },
+
+               { 0x4c00, 0, 0x00000000, 0x00000001 },
+               { 0x4c04, 0, 0x00000000, 0x0000003f },
+               { 0x4c08, 0, 0xffffffff, 0x00000000 },
+               { 0x4c0c, 0, 0x0007fc00, 0x00000000 },
+               { 0x4c10, 0, 0x80003fe0, 0x00000000 },
+               { 0x4c14, 0, 0xffffffff, 0x00000000 },
+               { 0x4c44, 0, 0x00000000, 0x9fff9fff },
+               { 0x4c48, 0, 0x00000000, 0xb3009fff },
+               { 0x4c4c, 0, 0x00000000, 0x77f33b30 },
+               { 0x4c50, 0, 0x00000000, 0xffffffff },
+
+               { 0x5004, 0, 0x00000000, 0x0000007f },
+               { 0x5008, 0, 0x0f0007ff, 0x00000000 },
+               { 0x500c, 0, 0xf800f800, 0x07ff07ff },
+
+               { 0x5400, 0, 0x00000008, 0x00000001 },
+               { 0x5404, 0, 0x00000000, 0x0000003f },
+               { 0x5408, 0, 0x0000001f, 0x00000000 },
+               { 0x540c, 0, 0xffffffff, 0x00000000 },
+               { 0x5410, 0, 0xffffffff, 0x00000000 },
+               { 0x5414, 0, 0x0000ffff, 0x00000000 },
+               { 0x5418, 0, 0x0000ffff, 0x00000000 },
+               { 0x541c, 0, 0x0000ffff, 0x00000000 },
+               { 0x5420, 0, 0x0000ffff, 0x00000000 },
+               { 0x5428, 0, 0x000000ff, 0x00000000 },
+               { 0x542c, 0, 0xff00ffff, 0x00000000 },
+               { 0x5430, 0, 0x001fff80, 0x00000000 },
+               { 0x5438, 0, 0xffffffff, 0x00000000 },
+               { 0x543c, 0, 0xffffffff, 0x00000000 },
+               { 0x5440, 0, 0xf800f800, 0x07ff07ff },
+
+               { 0x5c00, 0, 0x00000000, 0x00000001 },
+               { 0x5c04, 0, 0x00000000, 0x0003000f },
+               { 0x5c08, 0, 0x00000003, 0x00000000 },
+               { 0x5c0c, 0, 0x0000fff8, 0x00000000 },
+               { 0x5c10, 0, 0x00000000, 0xffffffff },
+               { 0x5c80, 0, 0x00000000, 0x0f7113f1 },
+               { 0x5c84, 0, 0x00000000, 0x0000f333 },
+               { 0x5c88, 0, 0x00000000, 0x00077373 },
+               { 0x5c8c, 0, 0x00000000, 0x0007f737 },
+
+               { 0x6808, 0, 0x0000ff7f, 0x00000000 },
+               { 0x680c, 0, 0xffffffff, 0x00000000 },
+               { 0x6810, 0, 0xffffffff, 0x00000000 },
+               { 0x6814, 0, 0xffffffff, 0x00000000 },
+               { 0x6818, 0, 0xffffffff, 0x00000000 },
+               { 0x681c, 0, 0xffffffff, 0x00000000 },
+               { 0x6820, 0, 0x00ff00ff, 0x00000000 },
+               { 0x6824, 0, 0x00ff00ff, 0x00000000 },
+               { 0x6828, 0, 0x00ff00ff, 0x00000000 },
+               { 0x682c, 0, 0x03ff03ff, 0x00000000 },
+               { 0x6830, 0, 0x03ff03ff, 0x00000000 },
+               { 0x6834, 0, 0x03ff03ff, 0x00000000 },
+               { 0x6838, 0, 0x03ff03ff, 0x00000000 },
+               { 0x683c, 0, 0x0000ffff, 0x00000000 },
+               { 0x6840, 0, 0x00000ff0, 0x00000000 },
+               { 0x6844, 0, 0x00ffff00, 0x00000000 },
+               { 0x684c, 0, 0xffffffff, 0x00000000 },
+               { 0x6850, 0, 0x7f7f7f7f, 0x00000000 },
+               { 0x6854, 0, 0x7f7f7f7f, 0x00000000 },
+               { 0x6858, 0, 0x7f7f7f7f, 0x00000000 },
+               { 0x685c, 0, 0x7f7f7f7f, 0x00000000 },
+               { 0x6908, 0, 0x00000000, 0x0001ff0f },
+               { 0x690c, 0, 0x00000000, 0x0ffe00f0 },
+
+               { 0xffff, 0, 0x00000000, 0x00000000 },
+       };
+
+       ret = 0;
+       for (i = 0; reg_tbl[i].offset != 0xffff; i++) {
+               u32 offset, rw_mask, ro_mask, save_val, val;
+
+               offset = (u32) reg_tbl[i].offset;
+               rw_mask = reg_tbl[i].rw_mask;
+               ro_mask = reg_tbl[i].ro_mask;
+
+               save_val = readl((u8 *) bp->regview + offset);
+
+               writel(0, (u8 *) bp->regview + offset);
+
+               val = readl((u8 *) bp->regview + offset);
+               if ((val & rw_mask) != 0) {
+                       goto reg_test_err;
+               }
+
+               if ((val & ro_mask) != (save_val & ro_mask)) {
+                       goto reg_test_err;
+               }
+
+               writel(0xffffffff, (u8 *) bp->regview + offset);
+
+               val = readl((u8 *) bp->regview + offset);
+               if ((val & rw_mask) != rw_mask) {
+                       goto reg_test_err;
+               }
+
+               if ((val & ro_mask) != (save_val & ro_mask)) {
+                       goto reg_test_err;
+               }
+
+               writel(save_val, (u8 *) bp->regview + offset);
+               continue;
+
+reg_test_err:
+               writel(save_val, (u8 *) bp->regview + offset);
+               ret = -ENODEV;
+               break;
+       }
+       return ret;
+}
+
+static int
+bnx2_do_mem_test(struct bnx2 *bp, u32 start, u32 size)
+{
+       static u32 test_pattern[] = { 0x00000000, 0xffffffff, 0x55555555,
+               0xaaaaaaaa , 0xaa55aa55, 0x55aa55aa };
+       int i;
+
+       for (i = 0; i < sizeof(test_pattern) / 4; i++) {
+               u32 offset;
+
+               for (offset = 0; offset < size; offset += 4) {
+
+                       REG_WR_IND(bp, start + offset, test_pattern[i]);
+
+                       if (REG_RD_IND(bp, start + offset) !=
+                               test_pattern[i]) {
+                               return -ENODEV;
+                       }
+               }
+       }
+       return 0;
+}
+
+static int
+bnx2_test_memory(struct bnx2 *bp)
+{
+       int ret = 0;
+       int i;
+       static struct {
+               u32   offset;
+               u32   len;
+       } mem_tbl[] = {
+               { 0x60000,  0x4000 },
+               { 0xa0000,  0x4000 },
+               { 0xe0000,  0x4000 },
+               { 0x120000, 0x4000 },
+               { 0x1a0000, 0x4000 },
+               { 0x160000, 0x4000 },
+               { 0xffffffff, 0    },
+       };
+
+       for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) {
+               if ((ret = bnx2_do_mem_test(bp, mem_tbl[i].offset,
+                       mem_tbl[i].len)) != 0) {
+                       return ret;
+               }
+       }
+       
+       return ret;
+}
+
+static int
+bnx2_test_loopback(struct bnx2 *bp)
+{
+       unsigned int pkt_size, num_pkts, i;
+       struct sk_buff *skb, *rx_skb;
+       unsigned char *packet;
+       u16 rx_start_idx, rx_idx, send_idx;
+       u32 send_bseq, val;
+       dma_addr_t map;
+       struct tx_bd *txbd;
+       struct sw_bd *rx_buf;
+       struct l2_fhdr *rx_hdr;
+       int ret = -ENODEV;
+
+       if (!netif_running(bp->dev))
+               return -ENODEV;
+
+       bp->loopback = MAC_LOOPBACK;
+       bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_DIAG);
+       bnx2_set_mac_loopback(bp);
+
+       pkt_size = 1514;
+       skb = dev_alloc_skb(pkt_size);
+       packet = skb_put(skb, pkt_size);
+       memcpy(packet, bp->mac_addr, 6);
+       memset(packet + 6, 0x0, 8);
+       for (i = 14; i < pkt_size; i++)
+               packet[i] = (unsigned char) (i & 0xff);
+
+       map = pci_map_single(bp->pdev, skb->data, pkt_size,
+               PCI_DMA_TODEVICE);
+
+       val = REG_RD(bp, BNX2_HC_COMMAND);
+       REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
+       REG_RD(bp, BNX2_HC_COMMAND);
+
+       udelay(5);
+       rx_start_idx = bp->status_blk->status_rx_quick_consumer_index0;
+
+       send_idx = 0;
+       send_bseq = 0;
+       num_pkts = 0;
+
+       txbd = &bp->tx_desc_ring[send_idx];
+
+       txbd->tx_bd_haddr_hi = (u64) map >> 32;
+       txbd->tx_bd_haddr_lo = (u64) map & 0xffffffff;
+       txbd->tx_bd_mss_nbytes = pkt_size;
+       txbd->tx_bd_vlan_tag_flags = TX_BD_FLAGS_START | TX_BD_FLAGS_END;
+
+       num_pkts++;
+       send_idx = NEXT_TX_BD(send_idx);
+
+       send_bseq += pkt_size;
+
+       REG_WR16(bp, MB_TX_CID_ADDR + BNX2_L2CTX_TX_HOST_BIDX, send_idx);
+       REG_WR(bp, MB_TX_CID_ADDR + BNX2_L2CTX_TX_HOST_BSEQ, send_bseq);
+
+
+       udelay(100);
+
+       val = REG_RD(bp, BNX2_HC_COMMAND);
+       REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
+       REG_RD(bp, BNX2_HC_COMMAND);
+
+       udelay(5);
+
+       pci_unmap_single(bp->pdev, map, pkt_size, PCI_DMA_TODEVICE);
+       dev_kfree_skb_irq(skb);
+
+       if (bp->status_blk->status_tx_quick_consumer_index0 != send_idx) {
+               goto loopback_test_done;
+       }
+
+       rx_idx = bp->status_blk->status_rx_quick_consumer_index0;
+       if (rx_idx != rx_start_idx + num_pkts) {
+               goto loopback_test_done;
+       }
+
+       rx_buf = &bp->rx_buf_ring[rx_start_idx];
+       rx_skb = rx_buf->skb;
+
+       rx_hdr = (struct l2_fhdr *) rx_skb->data;
+       skb_reserve(rx_skb, bp->rx_offset);
+
+       pci_dma_sync_single_for_cpu(bp->pdev,
+               pci_unmap_addr(rx_buf, mapping),
+               bp->rx_buf_size, PCI_DMA_FROMDEVICE);
+
+       if (rx_hdr->l2_fhdr_errors &
+               (L2_FHDR_ERRORS_BAD_CRC |
+               L2_FHDR_ERRORS_PHY_DECODE |
+               L2_FHDR_ERRORS_ALIGNMENT |
+               L2_FHDR_ERRORS_TOO_SHORT |
+               L2_FHDR_ERRORS_GIANT_FRAME)) {
+
+               goto loopback_test_done;
+       }
+
+       if ((rx_hdr->l2_fhdr_pkt_len - 4) != pkt_size) {
+               goto loopback_test_done;
+       }
+
+       for (i = 14; i < pkt_size; i++) {
+               if (*(rx_skb->data + i) != (unsigned char) (i & 0xff)) {
+                       goto loopback_test_done;
+               }
+       }
+
+       ret = 0;
+
+loopback_test_done:
+       bp->loopback = 0;
+       return ret;
+}
+
+#define NVRAM_SIZE 0x200
+#define CRC32_RESIDUAL 0xdebb20e3
+
+static int
+bnx2_test_nvram(struct bnx2 *bp)
+{
+       u32 buf[NVRAM_SIZE / 4];
+       u8 *data = (u8 *) buf;
+       int rc = 0;
+       u32 magic, csum;
+
+       if ((rc = bnx2_nvram_read(bp, 0, data, 4)) != 0)
+               goto test_nvram_done;
+
+        magic = be32_to_cpu(buf[0]);
+       if (magic != 0x669955aa) {
+               rc = -ENODEV;
+               goto test_nvram_done;
+       }
+
+       if ((rc = bnx2_nvram_read(bp, 0x100, data, NVRAM_SIZE)) != 0)
+               goto test_nvram_done;
+
+       csum = ether_crc_le(0x100, data);
+       if (csum != CRC32_RESIDUAL) {
+               rc = -ENODEV;
+               goto test_nvram_done;
+       }
+
+       csum = ether_crc_le(0x100, data + 0x100);
+       if (csum != CRC32_RESIDUAL) {
+               rc = -ENODEV;
+       }
+
+test_nvram_done:
+       return rc;
+}
+
+static int
+bnx2_test_link(struct bnx2 *bp)
+{
+       u32 bmsr;
+
+       spin_lock_irq(&bp->phy_lock);
+       bnx2_read_phy(bp, MII_BMSR, &bmsr);
+       bnx2_read_phy(bp, MII_BMSR, &bmsr);
+       spin_unlock_irq(&bp->phy_lock);
+               
+       if (bmsr & BMSR_LSTATUS) {
+               return 0;
+       }
+       return -ENODEV;
+}
+
+static int
+bnx2_test_intr(struct bnx2 *bp)
+{
+       int i;
+       u32 val;
+       u16 status_idx;
+
+       if (!netif_running(bp->dev))
+               return -ENODEV;
+
+       status_idx = REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff;
+
+       /* This register is not touched during run-time. */
+       val = REG_RD(bp, BNX2_HC_COMMAND);
+       REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW);
+       REG_RD(bp, BNX2_HC_COMMAND);
+
+       for (i = 0; i < 10; i++) {
+               if ((REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff) !=
+                       status_idx) {
+
+                       break;
+               }
+
+               msleep_interruptible(10);
+       }
+       if (i < 10)
+               return 0;
+
+       return -ENODEV;
+}
+
+static void
+bnx2_timer(unsigned long data)
+{
+       struct bnx2 *bp = (struct bnx2 *) data;
+       u32 msg;
+
+       if (atomic_read(&bp->intr_sem) != 0)
+               goto bnx2_restart_timer;
+
+       msg = (u32) ++bp->fw_drv_pulse_wr_seq;
+       REG_WR_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_DRV_PULSE_MB, msg);
+
+       if ((bp->phy_flags & PHY_SERDES_FLAG) &&
+           (CHIP_NUM(bp) == CHIP_NUM_5706)) {
+               unsigned long flags;
+
+               spin_lock_irqsave(&bp->phy_lock, flags);
+               if (bp->serdes_an_pending) {
+                       bp->serdes_an_pending--;
+               }
+               else if ((bp->link_up == 0) && (bp->autoneg & AUTONEG_SPEED)) {
+                       u32 bmcr;
+
+                       bnx2_read_phy(bp, MII_BMCR, &bmcr);
+
+                       if (bmcr & BMCR_ANENABLE) {
+                               u32 phy1, phy2;
+
+                               bnx2_write_phy(bp, 0x1c, 0x7c00);
+                               bnx2_read_phy(bp, 0x1c, &phy1);
+
+                               bnx2_write_phy(bp, 0x17, 0x0f01);
+                               bnx2_read_phy(bp, 0x15, &phy2);
+                               bnx2_write_phy(bp, 0x17, 0x0f01);
+                               bnx2_read_phy(bp, 0x15, &phy2);
+
+                               if ((phy1 & 0x10) &&    /* SIGNAL DETECT */
+                                       !(phy2 & 0x20)) {       /* no CONFIG */
+
+                                       bmcr &= ~BMCR_ANENABLE;
+                                       bmcr |= BMCR_SPEED1000 |
+                                               BMCR_FULLDPLX;
+                                       bnx2_write_phy(bp, MII_BMCR, bmcr);
+                                       bp->phy_flags |=
+                                               PHY_PARALLEL_DETECT_FLAG;
+                               }
+                       }
+               }
+               else if ((bp->link_up) && (bp->autoneg & AUTONEG_SPEED) &&
+                       (bp->phy_flags & PHY_PARALLEL_DETECT_FLAG)) {
+                       u32 phy2;
+
+                       bnx2_write_phy(bp, 0x17, 0x0f01);
+                       bnx2_read_phy(bp, 0x15, &phy2);
+                       if (phy2 & 0x20) {
+                               u32 bmcr;
+
+                               bnx2_read_phy(bp, MII_BMCR, &bmcr);
+                               bmcr |= BMCR_ANENABLE;
+                               bnx2_write_phy(bp, MII_BMCR, bmcr);
+
+                               bp->phy_flags &= ~PHY_PARALLEL_DETECT_FLAG;
+
+                       }
+               }
+
+               spin_unlock_irqrestore(&bp->phy_lock, flags);
+       }
+
+bnx2_restart_timer:
+       bp->timer.expires = RUN_AT(bp->timer_interval);
+
+       add_timer(&bp->timer);
+}
+
+/* Called with rtnl_lock */
+static int
+bnx2_open(struct net_device *dev)
+{
+       struct bnx2 *bp = dev->priv;
+       int rc;
+
+       bnx2_set_power_state(bp, 0);
+       bnx2_disable_int(bp);
+
+       rc = bnx2_alloc_mem(bp);
+       if (rc)
+               return rc;
+
+       if ((CHIP_ID(bp) != CHIP_ID_5706_A0) &&
+               (CHIP_ID(bp) != CHIP_ID_5706_A1) &&
+               !disable_msi) {
+
+               if (pci_enable_msi(bp->pdev) == 0) {
+                       bp->flags |= USING_MSI_FLAG;
+                       rc = request_irq(bp->pdev->irq, bnx2_msi, 0, dev->name,
+                                       dev);
+               }
+               else {
+                       rc = request_irq(bp->pdev->irq, bnx2_interrupt,
+                                       SA_SHIRQ, dev->name, dev);
+               }
+       }
+       else {
+               rc = request_irq(bp->pdev->irq, bnx2_interrupt, SA_SHIRQ,
+                               dev->name, dev);
+       }
+       if (rc) {
+               bnx2_free_mem(bp);
+               return rc;
+       }
+
+       rc = bnx2_init_nic(bp);
+
+       if (rc) {
+               free_irq(bp->pdev->irq, dev);
+               if (bp->flags & USING_MSI_FLAG) {
+                       pci_disable_msi(bp->pdev);
+                       bp->flags &= ~USING_MSI_FLAG;
+               }
+               bnx2_free_skbs(bp);
+               bnx2_free_mem(bp);
+               return rc;
+       }
+       
+       init_timer(&bp->timer);
+
+       bp->timer.expires = RUN_AT(bp->timer_interval);
+       bp->timer.data = (unsigned long) bp;
+       bp->timer.function = bnx2_timer;
+       add_timer(&bp->timer);
+
+       atomic_set(&bp->intr_sem, 0);
+
+       bnx2_enable_int(bp);
+
+       if (bp->flags & USING_MSI_FLAG) {
+               /* Test MSI to make sure it is working
+                * If MSI test fails, go back to INTx mode
+                */
+               if (bnx2_test_intr(bp) != 0) {
+                       printk(KERN_WARNING PFX "%s: No interrupt was generated"
+                              " using MSI, switching to INTx mode. Please"
+                              " report this failure to the PCI maintainer"
+                              " and include system chipset information.\n",
+                              bp->dev->name);
+
+                       bnx2_disable_int(bp);
+                       free_irq(bp->pdev->irq, dev);
+                       pci_disable_msi(bp->pdev);
+                       bp->flags &= ~USING_MSI_FLAG;
+
+                       rc = bnx2_init_nic(bp);
+
+                       if (!rc) {
+                               rc = request_irq(bp->pdev->irq, bnx2_interrupt,
+                                       SA_SHIRQ, dev->name, dev);
+                       }
+                       if (rc) {
+                               bnx2_free_skbs(bp);
+                               bnx2_free_mem(bp);
+                               del_timer_sync(&bp->timer);
+                               return rc;
+                       }
+                       bnx2_enable_int(bp);
+               }
+       }
+       if (bp->flags & USING_MSI_FLAG) {
+               printk(KERN_INFO PFX "%s: using MSI\n", dev->name);
+       }
+
+       netif_start_queue(dev);
+
+       return 0;
+}
+
+static void
+bnx2_reset_task(void *data)
+{
+       struct bnx2 *bp = data;
+
+       bnx2_netif_stop(bp);
+
+       bnx2_init_nic(bp);
+
+       atomic_set(&bp->intr_sem, 1);
+       bnx2_netif_start(bp);
+}
+
+static void
+bnx2_tx_timeout(struct net_device *dev)
+{
+       struct bnx2 *bp = dev->priv;
+
+       /* This allows the netif to be shutdown gracefully before resetting */
+       schedule_work(&bp->reset_task);
+}
+
+#ifdef BCM_VLAN
+/* Called with rtnl_lock */
+static void
+bnx2_vlan_rx_register(struct net_device *dev, struct vlan_group *vlgrp)
+{
+       struct bnx2 *bp = dev->priv;
+
+       bnx2_netif_stop(bp);
+
+       bp->vlgrp = vlgrp;
+       bnx2_set_rx_mode(dev);
+
+       bnx2_netif_start(bp);
+}
+
+/* Called with rtnl_lock */
+static void
+bnx2_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid)
+{
+       struct bnx2 *bp = dev->priv;
+
+       bnx2_netif_stop(bp);
+
+       if (bp->vlgrp)
+               bp->vlgrp->vlan_devices[vid] = NULL;
+       bnx2_set_rx_mode(dev);
+
+       bnx2_netif_start(bp);
+}
+#endif
+
+/* Called with dev->xmit_lock.
+ * hard_start_xmit is pseudo-lockless - a lock is only required when
+ * the tx queue is full. This way, we get the benefit of lockless
+ * operations most of the time without the complexities to handle
+ * netif_stop_queue/wake_queue race conditions.
+ */
+static int
+bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+       struct bnx2 *bp = dev->priv;
+       dma_addr_t mapping;
+       struct tx_bd *txbd;
+       struct sw_bd *tx_buf;
+       u32 len, vlan_tag_flags, last_frag, mss;
+       u16 prod, ring_prod;
+       int i;
+
+       if (unlikely(atomic_read(&bp->tx_avail_bd) <
+               (skb_shinfo(skb)->nr_frags + 1))) {
+
+               netif_stop_queue(dev);
+               printk(KERN_ERR PFX "%s: BUG! Tx ring full when queue awake!\n",
+                       dev->name);
+
+               return NETDEV_TX_BUSY;
+       }
+       len = skb_headlen(skb);
+       prod = bp->tx_prod;
+       ring_prod = TX_RING_IDX(prod);
+
+       vlan_tag_flags = 0;
+       if (skb->ip_summed == CHECKSUM_HW) {
+               vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM;
+       }
+
+       if (bp->vlgrp != 0 && vlan_tx_tag_present(skb)) {
+               vlan_tag_flags |=
+                       (TX_BD_FLAGS_VLAN_TAG | (vlan_tx_tag_get(skb) << 16));
+       }
+#ifdef BCM_TSO 
+       if ((mss = skb_shinfo(skb)->tso_size) &&
+               (skb->len > (bp->dev->mtu + ETH_HLEN))) {
+               u32 tcp_opt_len, ip_tcp_len;
+
+               if (skb_header_cloned(skb) &&
+                   pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
+                       dev_kfree_skb(skb);
+                       return NETDEV_TX_OK;
+               }
+
+               tcp_opt_len = ((skb->h.th->doff - 5) * 4);
+               vlan_tag_flags |= TX_BD_FLAGS_SW_LSO;
+
+               tcp_opt_len = 0;
+               if (skb->h.th->doff > 5) {
+                       tcp_opt_len = (skb->h.th->doff - 5) << 2;
+               }
+               ip_tcp_len = (skb->nh.iph->ihl << 2) + sizeof(struct tcphdr);
+
+               skb->nh.iph->check = 0;
+               skb->nh.iph->tot_len = ntohs(mss + ip_tcp_len + tcp_opt_len);
+               skb->h.th->check =
+                       ~csum_tcpudp_magic(skb->nh.iph->saddr,
+                                           skb->nh.iph->daddr,
+                                           0, IPPROTO_TCP, 0);
+
+               if (tcp_opt_len || (skb->nh.iph->ihl > 5)) {
+                       vlan_tag_flags |= ((skb->nh.iph->ihl - 5) +
+                               (tcp_opt_len >> 2)) << 8;
+               }
+       }
+       else
+#endif
+       {
+               mss = 0;
+       }
+
+       mapping = pci_map_single(bp->pdev, skb->data, len, PCI_DMA_TODEVICE);
+       
+       tx_buf = &bp->tx_buf_ring[ring_prod];
+       tx_buf->skb = skb;
+       pci_unmap_addr_set(tx_buf, mapping, mapping);
+
+       txbd = &bp->tx_desc_ring[ring_prod];
+
+       txbd->tx_bd_haddr_hi = (u64) mapping >> 32;
+       txbd->tx_bd_haddr_lo = (u64) mapping & 0xffffffff;
+       txbd->tx_bd_mss_nbytes = len | (mss << 16);
+       txbd->tx_bd_vlan_tag_flags = vlan_tag_flags | TX_BD_FLAGS_START;
+
+       last_frag = skb_shinfo(skb)->nr_frags;
+
+       for (i = 0; i < last_frag; i++) {
+               skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
+
+               prod = NEXT_TX_BD(prod);
+               ring_prod = TX_RING_IDX(prod);
+               txbd = &bp->tx_desc_ring[ring_prod];
+
+               len = frag->size;
+               mapping = pci_map_page(bp->pdev, frag->page, frag->page_offset,
+                       len, PCI_DMA_TODEVICE);
+               pci_unmap_addr_set(&bp->tx_buf_ring[ring_prod],
+                               mapping, mapping);
+
+               txbd->tx_bd_haddr_hi = (u64) mapping >> 32;
+               txbd->tx_bd_haddr_lo = (u64) mapping & 0xffffffff;
+               txbd->tx_bd_mss_nbytes = len | (mss << 16);
+               txbd->tx_bd_vlan_tag_flags = vlan_tag_flags;
+
+       }
+       txbd->tx_bd_vlan_tag_flags |= TX_BD_FLAGS_END;
+
+       prod = NEXT_TX_BD(prod);
+       bp->tx_prod_bseq += skb->len;
+
+       atomic_sub(last_frag + 1, &bp->tx_avail_bd);
+
+       REG_WR16(bp, MB_TX_CID_ADDR + BNX2_L2CTX_TX_HOST_BIDX, prod);
+       REG_WR(bp, MB_TX_CID_ADDR + BNX2_L2CTX_TX_HOST_BSEQ, bp->tx_prod_bseq);
+
+       mmiowb();
+
+       bp->tx_prod = prod;
+       dev->trans_start = jiffies;
+
+       if (unlikely(atomic_read(&bp->tx_avail_bd) <= MAX_SKB_FRAGS)) {
+               unsigned long flags;
+
+               spin_lock_irqsave(&bp->tx_lock, flags);
+               if (atomic_read(&bp->tx_avail_bd) <= MAX_SKB_FRAGS) {
+                       netif_stop_queue(dev);
+
+                       if (atomic_read(&bp->tx_avail_bd) > MAX_SKB_FRAGS)
+                               netif_wake_queue(dev);
+               }
+               spin_unlock_irqrestore(&bp->tx_lock, flags);
+       }
+
+       return NETDEV_TX_OK;
+}
+
+/* Called with rtnl_lock */
+static int
+bnx2_close(struct net_device *dev)
+{
+       struct bnx2 *bp = dev->priv;
+       u32 reset_code;
+
+       flush_scheduled_work();
+       bnx2_netif_stop(bp);
+       del_timer_sync(&bp->timer);
+       if (bp->wol)
+               reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
+       else
+               reset_code = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL;
+       bnx2_reset_chip(bp, reset_code);
+       free_irq(bp->pdev->irq, dev);
+       if (bp->flags & USING_MSI_FLAG) {
+               pci_disable_msi(bp->pdev);
+               bp->flags &= ~USING_MSI_FLAG;
+       }
+       bnx2_free_skbs(bp);
+       bnx2_free_mem(bp);
+       bp->link_up = 0;
+       netif_carrier_off(bp->dev);
+       bnx2_set_power_state(bp, 3);
+       return 0;
+}
+
+#define GET_NET_STATS64(ctr)                                   \
+       (unsigned long) ((unsigned long) (ctr##_hi) << 32) +    \
+       (unsigned long) (ctr##_lo)
+
+#define GET_NET_STATS32(ctr)           \
+       (ctr##_lo)
+
+#if (BITS_PER_LONG == 64)
+#define GET_NET_STATS  GET_NET_STATS64
+#else
+#define GET_NET_STATS  GET_NET_STATS32
+#endif
+
+static struct net_device_stats *
+bnx2_get_stats(struct net_device *dev)
+{
+       struct bnx2 *bp = dev->priv;
+       struct statistics_block *stats_blk = bp->stats_blk;
+       struct net_device_stats *net_stats = &bp->net_stats;
+
+       if (bp->stats_blk == NULL) {
+               return net_stats;
+       }
+       net_stats->rx_packets =
+               GET_NET_STATS(stats_blk->stat_IfHCInUcastPkts) +
+               GET_NET_STATS(stats_blk->stat_IfHCInMulticastPkts) +
+               GET_NET_STATS(stats_blk->stat_IfHCInBroadcastPkts);
+
+       net_stats->tx_packets =
+               GET_NET_STATS(stats_blk->stat_IfHCOutUcastPkts) +
+               GET_NET_STATS(stats_blk->stat_IfHCOutMulticastPkts) +
+               GET_NET_STATS(stats_blk->stat_IfHCOutBroadcastPkts);
+
+       net_stats->rx_bytes =
+               GET_NET_STATS(stats_blk->stat_IfHCInOctets);
+
+       net_stats->tx_bytes =
+               GET_NET_STATS(stats_blk->stat_IfHCOutOctets);
+
+       net_stats->multicast = 
+               GET_NET_STATS(stats_blk->stat_IfHCOutMulticastPkts);
+
+       net_stats->collisions = 
+               (unsigned long) stats_blk->stat_EtherStatsCollisions;
+
+       net_stats->rx_length_errors = 
+               (unsigned long) (stats_blk->stat_EtherStatsUndersizePkts +
+               stats_blk->stat_EtherStatsOverrsizePkts);
+
+       net_stats->rx_over_errors = 
+               (unsigned long) stats_blk->stat_IfInMBUFDiscards;
+
+       net_stats->rx_frame_errors = 
+               (unsigned long) stats_blk->stat_Dot3StatsAlignmentErrors;
+
+       net_stats->rx_crc_errors = 
+               (unsigned long) stats_blk->stat_Dot3StatsFCSErrors;
+
+       net_stats->rx_errors = net_stats->rx_length_errors +
+               net_stats->rx_over_errors + net_stats->rx_frame_errors +
+               net_stats->rx_crc_errors;
+
+       net_stats->tx_aborted_errors =
+               (unsigned long) (stats_blk->stat_Dot3StatsExcessiveCollisions +
+               stats_blk->stat_Dot3StatsLateCollisions);
+
+       if (CHIP_NUM(bp) == CHIP_NUM_5706)
+               net_stats->tx_carrier_errors = 0;
+       else {
+               net_stats->tx_carrier_errors =
+                       (unsigned long)
+                       stats_blk->stat_Dot3StatsCarrierSenseErrors;
+       }
+
+       net_stats->tx_errors =
+               (unsigned long) 
+               stats_blk->stat_emac_tx_stat_dot3statsinternalmactransmiterrors
+               +
+               net_stats->tx_aborted_errors +
+               net_stats->tx_carrier_errors;
+
+       return net_stats;
+}
+
+/* All ethtool functions called with rtnl_lock */
+
+static int
+bnx2_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+{
+       struct bnx2 *bp = dev->priv;
+
+       cmd->supported = SUPPORTED_Autoneg;
+       if (bp->phy_flags & PHY_SERDES_FLAG) {
+               cmd->supported |= SUPPORTED_1000baseT_Full |
+                       SUPPORTED_FIBRE;
+
+               cmd->port = PORT_FIBRE;
+       }
+       else {
+               cmd->supported |= SUPPORTED_10baseT_Half |
+                       SUPPORTED_10baseT_Full |
+                       SUPPORTED_100baseT_Half |
+                       SUPPORTED_100baseT_Full |
+                       SUPPORTED_1000baseT_Full |
+                       SUPPORTED_TP;
+
+               cmd->port = PORT_TP;
+       }
+
+       cmd->advertising = bp->advertising;
+
+       if (bp->autoneg & AUTONEG_SPEED) {
+               cmd->autoneg = AUTONEG_ENABLE;
+       }
+       else {
+               cmd->autoneg = AUTONEG_DISABLE;
+       }
+
+       if (netif_carrier_ok(dev)) {
+               cmd->speed = bp->line_speed;
+               cmd->duplex = bp->duplex;
+       }
+       else {
+               cmd->speed = -1;
+               cmd->duplex = -1;
+       }
+
+       cmd->transceiver = XCVR_INTERNAL;
+       cmd->phy_address = bp->phy_addr;
+
+       return 0;
+}
+  
+static int
+bnx2_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+{
+       struct bnx2 *bp = dev->priv;
+       u8 autoneg = bp->autoneg;
+       u8 req_duplex = bp->req_duplex;
+       u16 req_line_speed = bp->req_line_speed;
+       u32 advertising = bp->advertising;
+
+       if (cmd->autoneg == AUTONEG_ENABLE) {
+               autoneg |= AUTONEG_SPEED;
+
+               cmd->advertising &= ETHTOOL_ALL_COPPER_SPEED; 
+
+               /* allow advertising 1 speed */
+               if ((cmd->advertising == ADVERTISED_10baseT_Half) ||
+                       (cmd->advertising == ADVERTISED_10baseT_Full) ||
+                       (cmd->advertising == ADVERTISED_100baseT_Half) ||
+                       (cmd->advertising == ADVERTISED_100baseT_Full)) {
+
+                       if (bp->phy_flags & PHY_SERDES_FLAG)
+                               return -EINVAL;
+
+                       advertising = cmd->advertising;
+
+               }
+               else if (cmd->advertising == ADVERTISED_1000baseT_Full) {
+                       advertising = cmd->advertising;
+               }
+               else if (cmd->advertising == ADVERTISED_1000baseT_Half) {
+                       return -EINVAL;
+               }
+               else {
+                       if (bp->phy_flags & PHY_SERDES_FLAG) {
+                               advertising = ETHTOOL_ALL_FIBRE_SPEED;
+                       }
+                       else {
+                               advertising = ETHTOOL_ALL_COPPER_SPEED;
+                       }
+               }
+               advertising |= ADVERTISED_Autoneg;
+       }
+       else {
+               if (bp->phy_flags & PHY_SERDES_FLAG) {
+                       if ((cmd->speed != SPEED_1000) ||
+                               (cmd->duplex != DUPLEX_FULL)) {
+                               return -EINVAL;
+                       }
+               }
+               else if (cmd->speed == SPEED_1000) {
+                       return -EINVAL;
+               }
+               autoneg &= ~AUTONEG_SPEED;
+               req_line_speed = cmd->speed;
+               req_duplex = cmd->duplex;
+               advertising = 0;
+       }
+
+       bp->autoneg = autoneg;
+       bp->advertising = advertising;
+       bp->req_line_speed = req_line_speed;
+       bp->req_duplex = req_duplex;
+
+       spin_lock_irq(&bp->phy_lock);
+
+       bnx2_setup_phy(bp);
+
+       spin_unlock_irq(&bp->phy_lock);
+
+       return 0;
+}
+
+static void
+bnx2_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
+{
+       struct bnx2 *bp = dev->priv;
+
+       strcpy(info->driver, DRV_MODULE_NAME);
+       strcpy(info->version, DRV_MODULE_VERSION);
+       strcpy(info->bus_info, pci_name(bp->pdev));
+       info->fw_version[0] = ((bp->fw_ver & 0xff000000) >> 24) + '0';
+       info->fw_version[2] = ((bp->fw_ver & 0xff0000) >> 16) + '0';
+       info->fw_version[4] = ((bp->fw_ver & 0xff00) >> 8) + '0';
+       info->fw_version[6] = (bp->fw_ver & 0xff) + '0';
+       info->fw_version[1] = info->fw_version[3] = info->fw_version[5] = '.';
+       info->fw_version[7] = 0;
+}
+
+static void
+bnx2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+{
+       struct bnx2 *bp = dev->priv;
+
+       if (bp->flags & NO_WOL_FLAG) {
+               wol->supported = 0;
+               wol->wolopts = 0;
+       }
+       else {
+               wol->supported = WAKE_MAGIC;
+               if (bp->wol)
+                       wol->wolopts = WAKE_MAGIC;
+               else
+                       wol->wolopts = 0;
+       }
+       memset(&wol->sopass, 0, sizeof(wol->sopass));
+}
+
+static int
+bnx2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+{
+       struct bnx2 *bp = dev->priv;
+
+       if (wol->wolopts & ~WAKE_MAGIC)
+               return -EINVAL;
+
+       if (wol->wolopts & WAKE_MAGIC) {
+               if (bp->flags & NO_WOL_FLAG)
+                       return -EINVAL;
+
+               bp->wol = 1;
+       }
+       else {
+               bp->wol = 0;
+       }
+       return 0;
+}
+
+static int
+bnx2_nway_reset(struct net_device *dev)
+{
+       struct bnx2 *bp = dev->priv;
+       u32 bmcr;
+
+       if (!(bp->autoneg & AUTONEG_SPEED)) {
+               return -EINVAL;
+       }
+
+       spin_lock_irq(&bp->phy_lock);
+
+       /* Force a link down visible on the other side */
+       if (bp->phy_flags & PHY_SERDES_FLAG) {
+               bnx2_write_phy(bp, MII_BMCR, BMCR_LOOPBACK);
+               spin_unlock_irq(&bp->phy_lock);
+
+               msleep(20);
+
+               spin_lock_irq(&bp->phy_lock);
+               if (CHIP_NUM(bp) == CHIP_NUM_5706) {
+                       bp->serdes_an_pending = SERDES_AN_TIMEOUT /
+                               bp->timer_interval;
+               }
+       }
+
+       bnx2_read_phy(bp, MII_BMCR, &bmcr);
+       bmcr &= ~BMCR_LOOPBACK;
+       bnx2_write_phy(bp, MII_BMCR, bmcr | BMCR_ANRESTART | BMCR_ANENABLE);
+
+       spin_unlock_irq(&bp->phy_lock);
+
+       return 0;
+}
+
+static int
+bnx2_get_eeprom_len(struct net_device *dev)
+{
+       struct bnx2 *bp = dev->priv;
+
+       if (bp->flash_info == 0)
+               return 0;
+
+       return (int) bp->flash_info->total_size;
+}
+
+static int
+bnx2_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
+               u8 *eebuf)
+{
+       struct bnx2 *bp = dev->priv;
+       int rc;
+
+       if (eeprom->offset > bp->flash_info->total_size)
+               return -EINVAL;
+
+       if ((eeprom->offset + eeprom->len) > bp->flash_info->total_size)
+               eeprom->len = bp->flash_info->total_size - eeprom->offset;
+
+       rc = bnx2_nvram_read(bp, eeprom->offset, eebuf, eeprom->len);
+
+       return rc;
+}
+
+static int
+bnx2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
+               u8 *eebuf)
+{
+       struct bnx2 *bp = dev->priv;
+       int rc;
+
+       if (eeprom->offset > bp->flash_info->total_size)
+               return -EINVAL;
+
+       if ((eeprom->offset + eeprom->len) > bp->flash_info->total_size)
+               eeprom->len = bp->flash_info->total_size - eeprom->offset;
+
+       rc = bnx2_nvram_write(bp, eeprom->offset, eebuf, eeprom->len);
+
+       return rc;
+}
+
+static int
+bnx2_get_coalesce(struct net_device *dev, struct ethtool_coalesce *coal)
+{
+       struct bnx2 *bp = dev->priv;
+
+       memset(coal, 0, sizeof(struct ethtool_coalesce));
+
+       coal->rx_coalesce_usecs = bp->rx_ticks;
+       coal->rx_max_coalesced_frames = bp->rx_quick_cons_trip;
+       coal->rx_coalesce_usecs_irq = bp->rx_ticks_int;
+       coal->rx_max_coalesced_frames_irq = bp->rx_quick_cons_trip_int;
+
+       coal->tx_coalesce_usecs = bp->tx_ticks;
+       coal->tx_max_coalesced_frames = bp->tx_quick_cons_trip;
+       coal->tx_coalesce_usecs_irq = bp->tx_ticks_int;
+       coal->tx_max_coalesced_frames_irq = bp->tx_quick_cons_trip_int;
+
+       coal->stats_block_coalesce_usecs = bp->stats_ticks;
+
+       return 0;
+}
+
+static int
+bnx2_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal)
+{
+       struct bnx2 *bp = dev->priv;
+
+       bp->rx_ticks = (u16) coal->rx_coalesce_usecs;
+       if (bp->rx_ticks > 0x3ff) bp->rx_ticks = 0x3ff;
+
+       bp->rx_quick_cons_trip = (u16) coal->rx_max_coalesced_frames; 
+       if (bp->rx_quick_cons_trip > 0xff) bp->rx_quick_cons_trip = 0xff;
+
+       bp->rx_ticks_int = (u16) coal->rx_coalesce_usecs_irq;
+       if (bp->rx_ticks_int > 0x3ff) bp->rx_ticks_int = 0x3ff;
+
+       bp->rx_quick_cons_trip_int = (u16) coal->rx_max_coalesced_frames_irq;
+       if (bp->rx_quick_cons_trip_int > 0xff)
+               bp->rx_quick_cons_trip_int = 0xff;
+
+       bp->tx_ticks = (u16) coal->tx_coalesce_usecs;
+       if (bp->tx_ticks > 0x3ff) bp->tx_ticks = 0x3ff;
+
+       bp->tx_quick_cons_trip = (u16) coal->tx_max_coalesced_frames;
+       if (bp->tx_quick_cons_trip > 0xff) bp->tx_quick_cons_trip = 0xff;
+
+       bp->tx_ticks_int = (u16) coal->tx_coalesce_usecs_irq;
+       if (bp->tx_ticks_int > 0x3ff) bp->tx_ticks_int = 0x3ff;
+
+       bp->tx_quick_cons_trip_int = (u16) coal->tx_max_coalesced_frames_irq;
+       if (bp->tx_quick_cons_trip_int > 0xff) bp->tx_quick_cons_trip_int =
+               0xff;
+
+       bp->stats_ticks = coal->stats_block_coalesce_usecs;
+       if (bp->stats_ticks > 0xffff00) bp->stats_ticks = 0xffff00;
+       bp->stats_ticks &= 0xffff00;
+
+       if (netif_running(bp->dev)) {
+               bnx2_netif_stop(bp);
+               bnx2_init_nic(bp);
+               bnx2_netif_start(bp);
+       }
+
+       return 0;
+}
+
+static void
+bnx2_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
+{
+       struct bnx2 *bp = dev->priv;
+
+       ering->rx_max_pending = MAX_RX_DESC_CNT;
+       ering->rx_mini_max_pending = 0;
+       ering->rx_jumbo_max_pending = 0;
+
+       ering->rx_pending = bp->rx_ring_size;
+       ering->rx_mini_pending = 0;
+       ering->rx_jumbo_pending = 0;
+
+       ering->tx_max_pending = MAX_TX_DESC_CNT;
+       ering->tx_pending = bp->tx_ring_size;
+}
+
+static int
+bnx2_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
+{
+       struct bnx2 *bp = dev->priv;
+
+       if ((ering->rx_pending > MAX_RX_DESC_CNT) ||
+               (ering->tx_pending > MAX_TX_DESC_CNT) ||
+               (ering->tx_pending <= MAX_SKB_FRAGS)) {
+
+               return -EINVAL;
+       }
+       bp->rx_ring_size = ering->rx_pending;
+       bp->tx_ring_size = ering->tx_pending;
+
+       if (netif_running(bp->dev)) {
+               bnx2_netif_stop(bp);
+               bnx2_init_nic(bp);
+               bnx2_netif_start(bp);
+       }
+
+       return 0;
+}
+
+static void
+bnx2_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
+{
+       struct bnx2 *bp = dev->priv;
+
+       epause->autoneg = ((bp->autoneg & AUTONEG_FLOW_CTRL) != 0);
+       epause->rx_pause = ((bp->flow_ctrl & FLOW_CTRL_RX) != 0);
+       epause->tx_pause = ((bp->flow_ctrl & FLOW_CTRL_TX) != 0);
+}
+
+static int
+bnx2_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
+{
+       struct bnx2 *bp = dev->priv;
+
+       bp->req_flow_ctrl = 0;
+       if (epause->rx_pause)
+               bp->req_flow_ctrl |= FLOW_CTRL_RX;
+       if (epause->tx_pause)
+               bp->req_flow_ctrl |= FLOW_CTRL_TX;
+
+       if (epause->autoneg) {
+               bp->autoneg |= AUTONEG_FLOW_CTRL;
+       }
+       else {
+               bp->autoneg &= ~AUTONEG_FLOW_CTRL;
+       }
+
+       spin_lock_irq(&bp->phy_lock);
+
+       bnx2_setup_phy(bp);
+
+       spin_unlock_irq(&bp->phy_lock);
+
+       return 0;
+}
+
+static u32
+bnx2_get_rx_csum(struct net_device *dev)
+{
+       struct bnx2 *bp = dev->priv;
+
+       return bp->rx_csum;
+}
+
+static int
+bnx2_set_rx_csum(struct net_device *dev, u32 data)
+{
+       struct bnx2 *bp = dev->priv;
+
+       bp->rx_csum = data;
+       return 0;
+}
+
+#define BNX2_NUM_STATS 45
+
+struct {
+       char string[ETH_GSTRING_LEN];
+} bnx2_stats_str_arr[BNX2_NUM_STATS] = {
+       { "rx_bytes" },
+       { "rx_error_bytes" },
+       { "tx_bytes" },
+       { "tx_error_bytes" },
+       { "rx_ucast_packets" },
+       { "rx_mcast_packets" },
+       { "rx_bcast_packets" },
+       { "tx_ucast_packets" },
+       { "tx_mcast_packets" },
+       { "tx_bcast_packets" },
+       { "tx_mac_errors" },
+       { "tx_carrier_errors" },
+       { "rx_crc_errors" },
+       { "rx_align_errors" },
+       { "tx_single_collisions" },
+       { "tx_multi_collisions" },
+       { "tx_deferred" },
+       { "tx_excess_collisions" },
+       { "tx_late_collisions" },
+       { "tx_total_collisions" },
+       { "rx_fragments" },
+       { "rx_jabbers" },
+       { "rx_undersize_packets" },
+       { "rx_oversize_packets" },
+       { "rx_64_byte_packets" },
+       { "rx_65_to_127_byte_packets" },
+       { "rx_128_to_255_byte_packets" },
+       { "rx_256_to_511_byte_packets" },
+       { "rx_512_to_1023_byte_packets" },
+       { "rx_1024_to_1522_byte_packets" },
+       { "rx_1523_to_9022_byte_packets" },
+       { "tx_64_byte_packets" },
+       { "tx_65_to_127_byte_packets" },
+       { "tx_128_to_255_byte_packets" },
+       { "tx_256_to_511_byte_packets" },
+       { "tx_512_to_1023_byte_packets" },
+       { "tx_1024_to_1522_byte_packets" },
+       { "tx_1523_to_9022_byte_packets" },
+       { "rx_xon_frames" },
+       { "rx_xoff_frames" },
+       { "tx_xon_frames" },
+       { "tx_xoff_frames" },
+       { "rx_mac_ctrl_frames" },
+       { "rx_filtered_packets" },
+       { "rx_discards" },
+};
+
+#define STATS_OFFSET32(offset_name) (offsetof(struct statistics_block, offset_name) / 4)
+
+unsigned long bnx2_stats_offset_arr[BNX2_NUM_STATS] = {
+    STATS_OFFSET32(stat_IfHCInOctets_hi),
+    STATS_OFFSET32(stat_IfHCInBadOctets_hi),
+    STATS_OFFSET32(stat_IfHCOutOctets_hi),
+    STATS_OFFSET32(stat_IfHCOutBadOctets_hi),
+    STATS_OFFSET32(stat_IfHCInUcastPkts_hi),
+    STATS_OFFSET32(stat_IfHCInMulticastPkts_hi),
+    STATS_OFFSET32(stat_IfHCInBroadcastPkts_hi),
+    STATS_OFFSET32(stat_IfHCOutUcastPkts_hi),
+    STATS_OFFSET32(stat_IfHCOutMulticastPkts_hi),
+    STATS_OFFSET32(stat_IfHCOutBroadcastPkts_hi),
+    STATS_OFFSET32(stat_emac_tx_stat_dot3statsinternalmactransmiterrors),
+    STATS_OFFSET32(stat_Dot3StatsCarrierSenseErrors),                 
+    STATS_OFFSET32(stat_Dot3StatsFCSErrors),                          
+    STATS_OFFSET32(stat_Dot3StatsAlignmentErrors),                    
+    STATS_OFFSET32(stat_Dot3StatsSingleCollisionFrames),              
+    STATS_OFFSET32(stat_Dot3StatsMultipleCollisionFrames),            
+    STATS_OFFSET32(stat_Dot3StatsDeferredTransmissions),              
+    STATS_OFFSET32(stat_Dot3StatsExcessiveCollisions),                
+    STATS_OFFSET32(stat_Dot3StatsLateCollisions),                     
+    STATS_OFFSET32(stat_EtherStatsCollisions),                        
+    STATS_OFFSET32(stat_EtherStatsFragments),                         
+    STATS_OFFSET32(stat_EtherStatsJabbers),                           
+    STATS_OFFSET32(stat_EtherStatsUndersizePkts),                     
+    STATS_OFFSET32(stat_EtherStatsOverrsizePkts),                     
+    STATS_OFFSET32(stat_EtherStatsPktsRx64Octets),                    
+    STATS_OFFSET32(stat_EtherStatsPktsRx65Octetsto127Octets),         
+    STATS_OFFSET32(stat_EtherStatsPktsRx128Octetsto255Octets),        
+    STATS_OFFSET32(stat_EtherStatsPktsRx256Octetsto511Octets),        
+    STATS_OFFSET32(stat_EtherStatsPktsRx512Octetsto1023Octets),       
+    STATS_OFFSET32(stat_EtherStatsPktsRx1024Octetsto1522Octets),      
+    STATS_OFFSET32(stat_EtherStatsPktsRx1523Octetsto9022Octets),      
+    STATS_OFFSET32(stat_EtherStatsPktsTx64Octets),                    
+    STATS_OFFSET32(stat_EtherStatsPktsTx65Octetsto127Octets),         
+    STATS_OFFSET32(stat_EtherStatsPktsTx128Octetsto255Octets),        
+    STATS_OFFSET32(stat_EtherStatsPktsTx256Octetsto511Octets),        
+    STATS_OFFSET32(stat_EtherStatsPktsTx512Octetsto1023Octets),       
+    STATS_OFFSET32(stat_EtherStatsPktsTx1024Octetsto1522Octets),      
+    STATS_OFFSET32(stat_EtherStatsPktsTx1523Octetsto9022Octets),      
+    STATS_OFFSET32(stat_XonPauseFramesReceived),                      
+    STATS_OFFSET32(stat_XoffPauseFramesReceived),                     
+    STATS_OFFSET32(stat_OutXonSent),                                  
+    STATS_OFFSET32(stat_OutXoffSent),                                 
+    STATS_OFFSET32(stat_MacControlFramesReceived),                    
+    STATS_OFFSET32(stat_IfInFramesL2FilterDiscards),                  
+    STATS_OFFSET32(stat_IfInMBUFDiscards),                            
+};
+
+/* stat_IfHCInBadOctets and stat_Dot3StatsCarrierSenseErrors are
+ * skipped because of errata.
+ */               
+u8 bnx2_5706_stats_len_arr[BNX2_NUM_STATS] = {
+       8,0,8,8,8,8,8,8,8,8,
+       4,0,4,4,4,4,4,4,4,4,
+       4,4,4,4,4,4,4,4,4,4,
+       4,4,4,4,4,4,4,4,4,4,
+       4,4,4,4,4,
+};
+
+#define BNX2_NUM_TESTS 6
+
+struct {
+       char string[ETH_GSTRING_LEN];
+} bnx2_tests_str_arr[BNX2_NUM_TESTS] = {
+       { "register_test (offline)" },
+       { "memory_test (offline)" },
+       { "loopback_test (offline)" },
+       { "nvram_test (online)" },
+       { "interrupt_test (online)" },
+       { "link_test (online)" },
+};
+
+static int
+bnx2_self_test_count(struct net_device *dev)
+{
+       return BNX2_NUM_TESTS;
+}
+
+static void
+bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf)
+{
+       struct bnx2 *bp = dev->priv;
+
+       memset(buf, 0, sizeof(u64) * BNX2_NUM_TESTS);
+       if (etest->flags & ETH_TEST_FL_OFFLINE) {
+               bnx2_netif_stop(bp);
+               bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_DIAG);
+               bnx2_free_skbs(bp);
+
+               if (bnx2_test_registers(bp) != 0) {
+                       buf[0] = 1;
+                       etest->flags |= ETH_TEST_FL_FAILED;
+               }
+               if (bnx2_test_memory(bp) != 0) {
+                       buf[1] = 1;
+                       etest->flags |= ETH_TEST_FL_FAILED;
+               }
+               if (bnx2_test_loopback(bp) != 0) {
+                       buf[2] = 1;
+                       etest->flags |= ETH_TEST_FL_FAILED;
+               }
+
+               if (!netif_running(bp->dev)) {
+                       bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET);
+               }
+               else {
+                       bnx2_init_nic(bp);
+                       bnx2_netif_start(bp);
+               }
+
+               /* wait for link up */
+               msleep_interruptible(3000);
+               if ((!bp->link_up) && !(bp->phy_flags & PHY_SERDES_FLAG))
+                       msleep_interruptible(4000);
+       }
+
+       if (bnx2_test_nvram(bp) != 0) {
+               buf[3] = 1;
+               etest->flags |= ETH_TEST_FL_FAILED;
+       }
+       if (bnx2_test_intr(bp) != 0) {
+               buf[4] = 1;
+               etest->flags |= ETH_TEST_FL_FAILED;
+       }
+
+       if (bnx2_test_link(bp) != 0) {
+               buf[5] = 1;
+               etest->flags |= ETH_TEST_FL_FAILED;
+
+       }
+}
+
+static void
+bnx2_get_strings(struct net_device *dev, u32 stringset, u8 *buf)
+{
+       switch (stringset) {
+       case ETH_SS_STATS:
+               memcpy(buf, bnx2_stats_str_arr,
+                       sizeof(bnx2_stats_str_arr));
+               break;
+       case ETH_SS_TEST:
+               memcpy(buf, bnx2_tests_str_arr,
+                       sizeof(bnx2_tests_str_arr));
+               break;
+       }
+}
+
+static int
+bnx2_get_stats_count(struct net_device *dev)
+{
+       return BNX2_NUM_STATS;
+}
+
+static void
+bnx2_get_ethtool_stats(struct net_device *dev,
+               struct ethtool_stats *stats, u64 *buf)
+{
+       struct bnx2 *bp = dev->priv;
+       int i;
+       u32 *hw_stats = (u32 *) bp->stats_blk;
+       u8 *stats_len_arr = 0;
+
+       if (hw_stats == NULL) {
+               memset(buf, 0, sizeof(u64) * BNX2_NUM_STATS);
+               return;
+       }
+
+       if (CHIP_NUM(bp) == CHIP_NUM_5706)
+               stats_len_arr = bnx2_5706_stats_len_arr;
+
+       for (i = 0; i < BNX2_NUM_STATS; i++) {
+               if (stats_len_arr[i] == 0) {
+                       /* skip this counter */
+                       buf[i] = 0;
+                       continue;
+               }
+               if (stats_len_arr[i] == 4) {
+                       /* 4-byte counter */
+                       buf[i] = (u64)
+                               *(hw_stats + bnx2_stats_offset_arr[i]);
+                       continue;
+               }
+               /* 8-byte counter */
+               buf[i] = (((u64) *(hw_stats +
+                                       bnx2_stats_offset_arr[i])) << 32) +
+                               *(hw_stats + bnx2_stats_offset_arr[i] + 1);
+       }
+}
+
+static int
+bnx2_phys_id(struct net_device *dev, u32 data)
+{
+       struct bnx2 *bp = dev->priv;
+       int i;
+       u32 save;
+
+       if (data == 0)
+               data = 2;
+
+       save = REG_RD(bp, BNX2_MISC_CFG);
+       REG_WR(bp, BNX2_MISC_CFG, BNX2_MISC_CFG_LEDMODE_MAC);
+
+       for (i = 0; i < (data * 2); i++) {
+               if ((i % 2) == 0) {
+                       REG_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE);
+               }
+               else {
+                       REG_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE |
+                               BNX2_EMAC_LED_1000MB_OVERRIDE |
+                               BNX2_EMAC_LED_100MB_OVERRIDE |
+                               BNX2_EMAC_LED_10MB_OVERRIDE |
+                               BNX2_EMAC_LED_TRAFFIC_OVERRIDE |
+                               BNX2_EMAC_LED_TRAFFIC);
+               }
+               msleep_interruptible(500);
+               if (signal_pending(current))
+                       break;
+       }
+       REG_WR(bp, BNX2_EMAC_LED, 0);
+       REG_WR(bp, BNX2_MISC_CFG, save);
+       return 0;
+}
+
+static struct ethtool_ops bnx2_ethtool_ops = {
+       .get_settings           = bnx2_get_settings,
+       .set_settings           = bnx2_set_settings,
+       .get_drvinfo            = bnx2_get_drvinfo,
+       .get_wol                = bnx2_get_wol,
+       .set_wol                = bnx2_set_wol,
+       .nway_reset             = bnx2_nway_reset,
+       .get_link               = ethtool_op_get_link,
+       .get_eeprom_len         = bnx2_get_eeprom_len,
+       .get_eeprom             = bnx2_get_eeprom,
+       .set_eeprom             = bnx2_set_eeprom,
+       .get_coalesce           = bnx2_get_coalesce,
+       .set_coalesce           = bnx2_set_coalesce,
+       .get_ringparam          = bnx2_get_ringparam,
+       .set_ringparam          = bnx2_set_ringparam,
+       .get_pauseparam         = bnx2_get_pauseparam,
+       .set_pauseparam         = bnx2_set_pauseparam,
+       .get_rx_csum            = bnx2_get_rx_csum,
+       .set_rx_csum            = bnx2_set_rx_csum,
+       .get_tx_csum            = ethtool_op_get_tx_csum,
+       .set_tx_csum            = ethtool_op_set_tx_csum,
+       .get_sg                 = ethtool_op_get_sg,
+       .set_sg                 = ethtool_op_set_sg,
+#ifdef BCM_TSO
+       .get_tso                = ethtool_op_get_tso,
+       .set_tso                = ethtool_op_set_tso,
+#endif
+       .self_test_count        = bnx2_self_test_count,
+       .self_test              = bnx2_self_test,
+       .get_strings            = bnx2_get_strings,
+       .phys_id                = bnx2_phys_id,
+       .get_stats_count        = bnx2_get_stats_count,
+       .get_ethtool_stats      = bnx2_get_ethtool_stats,
+};
+
+/* Called with rtnl_lock */
+static int
+bnx2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+       struct mii_ioctl_data *data = (struct mii_ioctl_data *)&ifr->ifr_data;
+       struct bnx2 *bp = dev->priv;
+       int err;
+
+       switch(cmd) {
+       case SIOCGMIIPHY:
+               data->phy_id = bp->phy_addr;
+
+               /* fallthru */
+       case SIOCGMIIREG: {
+               u32 mii_regval;
+
+               spin_lock_irq(&bp->phy_lock);
+               err = bnx2_read_phy(bp, data->reg_num & 0x1f, &mii_regval);
+               spin_unlock_irq(&bp->phy_lock);
+
+               data->val_out = mii_regval;
+
+               return err;
+       }
+
+       case SIOCSMIIREG:
+               if (!capable(CAP_NET_ADMIN))
+                       return -EPERM;
+
+               spin_lock_irq(&bp->phy_lock);
+               err = bnx2_write_phy(bp, data->reg_num & 0x1f, data->val_in);
+               spin_unlock_irq(&bp->phy_lock);
+
+               return err;
+
+       default:
+               /* do nothing */
+               break;
+       }
+       return -EOPNOTSUPP;
+}
+
+/* Called with rtnl_lock */
+static int
+bnx2_change_mac_addr(struct net_device *dev, void *p)
+{
+       struct sockaddr *addr = p;
+       struct bnx2 *bp = dev->priv;
+
+       memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
+       if (netif_running(dev))
+               bnx2_set_mac_addr(bp);
+
+       return 0;
+}
+
+/* Called with rtnl_lock */
+static int
+bnx2_change_mtu(struct net_device *dev, int new_mtu)
+{
+       struct bnx2 *bp = dev->priv;
+
+       if (((new_mtu + ETH_HLEN) > MAX_ETHERNET_JUMBO_PACKET_SIZE) ||
+               ((new_mtu + ETH_HLEN) < MIN_ETHERNET_PACKET_SIZE))
+               return -EINVAL;
+
+       dev->mtu = new_mtu;
+       if (netif_running(dev)) {
+               bnx2_netif_stop(bp);
+
+               bnx2_init_nic(bp);
+
+               bnx2_netif_start(bp);
+       }
+       return 0;
+}
+
+#if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER)
+static void
+poll_bnx2(struct net_device *dev)
+{
+       struct bnx2 *bp = dev->priv;
+
+       disable_irq(bp->pdev->irq);
+       bnx2_interrupt(bp->pdev->irq, dev, NULL);
+       enable_irq(bp->pdev->irq);
+}
+#endif
+
+static int __devinit
+bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
+{
+       struct bnx2 *bp;
+       unsigned long mem_len;
+       int rc;
+       u32 reg;
+
+       SET_MODULE_OWNER(dev);
+       SET_NETDEV_DEV(dev, &pdev->dev);
+       bp = dev->priv;
+
+       bp->flags = 0;
+       bp->phy_flags = 0;
+
+       /* enable device (incl. PCI PM wakeup), and bus-mastering */
+       rc = pci_enable_device(pdev);
+       if (rc) {
+               printk(KERN_ERR PFX "Cannot enable PCI device, aborting.");
+               goto err_out;
+       }
+
+       if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
+               printk(KERN_ERR PFX "Cannot find PCI device base address, "
+                      "aborting.\n");
+               rc = -ENODEV;
+               goto err_out_disable;
+       }
+
+       rc = pci_request_regions(pdev, DRV_MODULE_NAME);
+       if (rc) {
+               printk(KERN_ERR PFX "Cannot obtain PCI resources, aborting.\n");
+               goto err_out_disable;
+       }
+
+       pci_set_master(pdev);
+
+       bp->pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
+       if (bp->pm_cap == 0) {
+               printk(KERN_ERR PFX "Cannot find power management capability, "
+                              "aborting.\n");
+               rc = -EIO;
+               goto err_out_release;
+       }
+
+       bp->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX);
+       if (bp->pcix_cap == 0) {
+               printk(KERN_ERR PFX "Cannot find PCIX capability, aborting.\n");
+               rc = -EIO;
+               goto err_out_release;
+       }
+
+       if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) == 0) {
+               bp->flags |= USING_DAC_FLAG;
+               if (pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK) != 0) {
+                       printk(KERN_ERR PFX "pci_set_consistent_dma_mask "
+                              "failed, aborting.\n");
+                       rc = -EIO;
+                       goto err_out_release;
+               }
+       }
+       else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) {
+               printk(KERN_ERR PFX "System does not support DMA, aborting.\n");
+               rc = -EIO;
+               goto err_out_release;
+       }
+
+       bp->dev = dev;
+       bp->pdev = pdev;
+
+       spin_lock_init(&bp->phy_lock);
+       spin_lock_init(&bp->tx_lock);
+       INIT_WORK(&bp->reset_task, bnx2_reset_task, bp);
+
+       dev->base_addr = dev->mem_start = pci_resource_start(pdev, 0);
+       mem_len = MB_GET_CID_ADDR(17);
+       dev->mem_end = dev->mem_start + mem_len;
+       dev->irq = pdev->irq;
+
+       bp->regview = ioremap_nocache(dev->base_addr, mem_len);
+
+       if (!bp->regview) {
+               printk(KERN_ERR PFX "Cannot map register space, aborting.\n");
+               rc = -ENOMEM;
+               goto err_out_release;
+       }
+
+       /* Configure byte swap and enable write to the reg_window registers.
+        * Rely on CPU to do target byte swapping on big endian systems
+        * The chip's target access swapping will not swap all accesses
+        */
+       pci_write_config_dword(bp->pdev, BNX2_PCICFG_MISC_CONFIG,
+                              BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
+                              BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP);
+
+       bnx2_set_power_state(bp, 0);
+
+       bp->chip_id = REG_RD(bp, BNX2_MISC_ID);
+
+       bp->phy_addr = 1;
+
+       /* Get bus information. */
+       reg = REG_RD(bp, BNX2_PCICFG_MISC_STATUS);
+       if (reg & BNX2_PCICFG_MISC_STATUS_PCIX_DET) {
+               u32 clkreg;
+
+               bp->flags |= PCIX_FLAG;
+
+               clkreg = REG_RD(bp, BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS);
+               
+               clkreg &= BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET;
+               switch (clkreg) {
+               case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_133MHZ:
+                       bp->bus_speed_mhz = 133;
+                       break;
+
+               case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_95MHZ:
+                       bp->bus_speed_mhz = 100;
+                       break;
+
+               case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_66MHZ:
+               case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_80MHZ:
+                       bp->bus_speed_mhz = 66;
+                       break;
+
+               case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_48MHZ:
+               case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_55MHZ:
+                       bp->bus_speed_mhz = 50;
+                       break;
+
+               case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_LOW:
+               case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_32MHZ:
+               case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_38MHZ:
+                       bp->bus_speed_mhz = 33;
+                       break;
+               }
+       }
+       else {
+               if (reg & BNX2_PCICFG_MISC_STATUS_M66EN)
+                       bp->bus_speed_mhz = 66;
+               else
+                       bp->bus_speed_mhz = 33;
+       }
+
+       if (reg & BNX2_PCICFG_MISC_STATUS_32BIT_DET)
+               bp->flags |= PCI_32BIT_FLAG;
+
+       /* 5706A0 may falsely detect SERR and PERR. */
+       if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
+               reg = REG_RD(bp, PCI_COMMAND);
+               reg &= ~(PCI_COMMAND_SERR | PCI_COMMAND_PARITY);
+               REG_WR(bp, PCI_COMMAND, reg);
+       }
+       else if ((CHIP_ID(bp) == CHIP_ID_5706_A1) &&
+               !(bp->flags & PCIX_FLAG)) {
+
+               printk(KERN_ERR PFX "5706 A1 can only be used in a PCIX bus, "
+                      "aborting.\n");
+               goto err_out_unmap;
+       }
+
+       bnx2_init_nvram(bp);
+
+       /* Get the permanent MAC address.  First we need to make sure the
+        * firmware is actually running.
+        */
+       reg = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_DEV_INFO_SIGNATURE);
+
+       if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) !=
+           BNX2_DEV_INFO_SIGNATURE_MAGIC) {
+               printk(KERN_ERR PFX "Firmware not running, aborting.\n");
+               rc = -ENODEV;
+               goto err_out_unmap;
+       }
+
+       bp->fw_ver = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE +
+                               BNX2_DEV_INFO_BC_REV);
+
+       reg = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_PORT_HW_CFG_MAC_UPPER);
+       bp->mac_addr[0] = (u8) (reg >> 8);
+       bp->mac_addr[1] = (u8) reg;
+
+       reg = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_PORT_HW_CFG_MAC_LOWER);
+       bp->mac_addr[2] = (u8) (reg >> 24);
+       bp->mac_addr[3] = (u8) (reg >> 16);
+       bp->mac_addr[4] = (u8) (reg >> 8);
+       bp->mac_addr[5] = (u8) reg;
+
+       bp->tx_ring_size = MAX_TX_DESC_CNT;
+       bp->rx_ring_size = 100;
+
+       bp->rx_csum = 1;
+
+       bp->rx_offset = sizeof(struct l2_fhdr) + 2;
+
+       bp->tx_quick_cons_trip_int = 20;
+       bp->tx_quick_cons_trip = 20;
+       bp->tx_ticks_int = 80;
+       bp->tx_ticks = 80;
+               
+       bp->rx_quick_cons_trip_int = 6;
+       bp->rx_quick_cons_trip = 6;
+       bp->rx_ticks_int = 18;
+       bp->rx_ticks = 18;
+
+       bp->stats_ticks = 1000000 & 0xffff00;
+
+       bp->timer_interval =  HZ;
+
+       /* Disable WOL support if we are running on a SERDES chip. */
+       if (CHIP_BOND_ID(bp) & CHIP_BOND_ID_SERDES_BIT) {
+               bp->phy_flags |= PHY_SERDES_FLAG;
+               bp->flags |= NO_WOL_FLAG;
+       }
+
+       if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
+               bp->tx_quick_cons_trip_int =
+                       bp->tx_quick_cons_trip;
+               bp->tx_ticks_int = bp->tx_ticks;
+               bp->rx_quick_cons_trip_int =
+                       bp->rx_quick_cons_trip;
+               bp->rx_ticks_int = bp->rx_ticks;
+               bp->comp_prod_trip_int = bp->comp_prod_trip;
+               bp->com_ticks_int = bp->com_ticks;
+               bp->cmd_ticks_int = bp->cmd_ticks;
+       }
+
+       bp->autoneg = AUTONEG_SPEED | AUTONEG_FLOW_CTRL;
+       bp->req_line_speed = 0;
+       if (bp->phy_flags & PHY_SERDES_FLAG) {
+               bp->advertising = ETHTOOL_ALL_FIBRE_SPEED | ADVERTISED_Autoneg;
+       }
+       else {
+               bp->advertising = ETHTOOL_ALL_COPPER_SPEED | ADVERTISED_Autoneg;
+       }
+
+       bp->req_flow_ctrl = FLOW_CTRL_RX | FLOW_CTRL_TX;
+
+       return 0;
+
+err_out_unmap:
+       if (bp->regview) {
+               iounmap(bp->regview);
+       }
+
+err_out_release:
+       pci_release_regions(pdev);
+
+err_out_disable:
+       pci_disable_device(pdev);
+       pci_set_drvdata(pdev, NULL);
+
+err_out:
+       return rc;
+}
+
+static int __devinit
+bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+{
+       static int version_printed = 0;
+       struct net_device *dev = NULL;
+       struct bnx2 *bp;
+       int rc, i;
+
+       if (version_printed++ == 0)
+               printk(KERN_INFO "%s", version);
+
+       /* dev zeroed in init_etherdev */
+       dev = alloc_etherdev(sizeof(*bp));
+
+       if (!dev)
+               return -ENOMEM;
+
+       rc = bnx2_init_board(pdev, dev);
+       if (rc < 0) {
+               free_netdev(dev);
+               return rc;
+       }
+
+       dev->open = bnx2_open;
+       dev->hard_start_xmit = bnx2_start_xmit;
+       dev->stop = bnx2_close;
+       dev->get_stats = bnx2_get_stats;
+       dev->set_multicast_list = bnx2_set_rx_mode;
+       dev->do_ioctl = bnx2_ioctl;
+       dev->set_mac_address = bnx2_change_mac_addr;
+       dev->change_mtu = bnx2_change_mtu;
+       dev->tx_timeout = bnx2_tx_timeout;
+       dev->watchdog_timeo = TX_TIMEOUT;
+#ifdef BCM_VLAN
+       dev->vlan_rx_register = bnx2_vlan_rx_register;
+       dev->vlan_rx_kill_vid = bnx2_vlan_rx_kill_vid;
+#endif
+       dev->poll = bnx2_poll;
+       dev->ethtool_ops = &bnx2_ethtool_ops;
+       dev->weight = 64;
+
+       bp = dev->priv;
+
+#if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER)
+       dev->poll_controller = poll_bnx2;
+#endif
+
+       if ((rc = register_netdev(dev))) {
+               printk(KERN_ERR PFX "Cannot register net device\n");
+               if (bp->regview)
+                       iounmap(bp->regview);
+               pci_release_regions(pdev);
+               pci_disable_device(pdev);
+               pci_set_drvdata(pdev, NULL);
+               free_netdev(dev);
+               return rc;
+       }
+
+       pci_set_drvdata(pdev, dev);
+
+       memcpy(dev->dev_addr, bp->mac_addr, 6);
+       bp->name = board_info[ent->driver_data].name,
+       printk(KERN_INFO "%s: %s (%c%d) PCI%s %s %dMHz found at mem %lx, "
+               "IRQ %d, ",
+               dev->name,
+               bp->name,
+               ((CHIP_ID(bp) & 0xf000) >> 12) + 'A',
+               ((CHIP_ID(bp) & 0x0ff0) >> 4),
+               ((bp->flags & PCIX_FLAG) ? "-X" : ""),
+               ((bp->flags & PCI_32BIT_FLAG) ? "32-bit" : "64-bit"),
+               bp->bus_speed_mhz,
+               dev->base_addr,
+               bp->pdev->irq);
+
+       printk("node addr ");
+       for (i = 0; i < 6; i++)
+               printk("%2.2x", dev->dev_addr[i]);
+       printk("\n");
+
+       dev->features |= NETIF_F_SG;
+       if (bp->flags & USING_DAC_FLAG)
+               dev->features |= NETIF_F_HIGHDMA;
+       dev->features |= NETIF_F_IP_CSUM;
+#ifdef BCM_VLAN
+       dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+#endif
+#ifdef BCM_TSO
+       dev->features |= NETIF_F_TSO;
+#endif
+
+       netif_carrier_off(bp->dev);
+
+       return 0;
+}
+
+static void __devexit
+bnx2_remove_one(struct pci_dev *pdev)
+{
+       struct net_device *dev = pci_get_drvdata(pdev);
+       struct bnx2 *bp = dev->priv;
+
+       unregister_netdev(dev);
+
+       if (bp->regview)
+               iounmap(bp->regview);
+
+       free_netdev(dev);
+       pci_release_regions(pdev);
+       pci_disable_device(pdev);
+       pci_set_drvdata(pdev, NULL);
+}
+
+static int
+bnx2_suspend(struct pci_dev *pdev, u32 state)
+{
+       struct net_device *dev = pci_get_drvdata(pdev);
+       struct bnx2 *bp = dev->priv;
+       u32 reset_code;
+
+       if (!netif_running(dev))
+               return 0;
+
+       bnx2_netif_stop(bp);
+       netif_device_detach(dev);
+       del_timer_sync(&bp->timer);
+       if (bp->wol)
+               reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
+       else
+               reset_code = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL;
+       bnx2_reset_chip(bp, reset_code);
+       bnx2_free_skbs(bp);
+       bnx2_set_power_state(bp, state);
+       return 0;
+}
+
+static int
+bnx2_resume(struct pci_dev *pdev)
+{
+       struct net_device *dev = pci_get_drvdata(pdev);
+       struct bnx2 *bp = dev->priv;
+
+       if (!netif_running(dev))
+               return 0;
+
+       bnx2_set_power_state(bp, 0);
+       netif_device_attach(dev);
+       bnx2_init_nic(bp);
+       bnx2_netif_start(bp);
+       return 0;
+}
+
+static struct pci_driver bnx2_pci_driver = {
+       name:           DRV_MODULE_NAME,
+       id_table:       bnx2_pci_tbl,
+       probe:          bnx2_init_one,
+       remove:         __devexit_p(bnx2_remove_one),
+       suspend:        bnx2_suspend,
+       resume:         bnx2_resume,
+};
+
+static int __init bnx2_init(void)
+{
+       return pci_module_init(&bnx2_pci_driver);
+}
+
+static void __exit bnx2_cleanup(void)
+{
+       pci_unregister_driver(&bnx2_pci_driver);
+}
+
+module_init(bnx2_init);
+module_exit(bnx2_cleanup);
+
+
+
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h
new file mode 100644 (file)
index 0000000..8214a28
--- /dev/null
@@ -0,0 +1,4352 @@
+/* bnx2.h: Broadcom NX2 network driver.
+ *
+ * Copyright (c) 2004, 2005 Broadcom Corporation
+ *
+ * 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.
+ *
+ * Written by: Michael Chan  (mchan@broadcom.com)
+ */
+
+
+#ifndef BNX2_H
+#define BNX2_H
+
+#include <linux/config.h>
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+
+#include <linux/kernel.h>
+#include <linux/timer.h>
+#include <linux/errno.h>
+#include <linux/ioport.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/skbuff.h>
+#include <linux/dma-mapping.h>
+#include <asm/bitops.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <linux/delay.h>
+#include <asm/byteorder.h>
+#include <linux/time.h>
+#include <linux/ethtool.h>
+#include <linux/mii.h>
+#ifdef NETIF_F_HW_VLAN_TX
+#include <linux/if_vlan.h>
+#define BCM_VLAN 1
+#endif
+#ifdef NETIF_F_TSO
+#include <net/ip.h>
+#include <net/tcp.h>
+#include <net/checksum.h>
+#define BCM_TSO 1
+#endif
+#include <linux/workqueue.h>
+#include <linux/crc32.h>
+
+/* Hardware data structures and register definitions automatically
+ * generated from RTL code. Do not modify.
+ */
+
+/*
+ *  tx_bd definition
+ */
+struct tx_bd {
+       u32 tx_bd_haddr_hi;
+       u32 tx_bd_haddr_lo;                                   
+       u32 tx_bd_mss_nbytes;                                     
+       u32 tx_bd_vlan_tag_flags;                                      
+               #define TX_BD_FLAGS_CONN_FAULT          (1<<0)
+               #define TX_BD_FLAGS_TCP_UDP_CKSUM       (1<<1)
+               #define TX_BD_FLAGS_IP_CKSUM            (1<<2)
+               #define TX_BD_FLAGS_VLAN_TAG            (1<<3)
+               #define TX_BD_FLAGS_COAL_NOW            (1<<4)
+               #define TX_BD_FLAGS_DONT_GEN_CRC        (1<<5)
+               #define TX_BD_FLAGS_END                 (1<<6)
+               #define TX_BD_FLAGS_START               (1<<7)
+               #define TX_BD_FLAGS_SW_OPTION_WORD      (0x1f<<8)
+               #define TX_BD_FLAGS_SW_FLAGS            (1<<13)
+               #define TX_BD_FLAGS_SW_SNAP             (1<<14)
+               #define TX_BD_FLAGS_SW_LSO              (1<<15)
+
+};
+
+
+/*
+ *  rx_bd definition
+ */
+struct rx_bd {
+       u32 rx_bd_haddr_hi;
+       u32 rx_bd_haddr_lo;
+       u32 rx_bd_len;
+       u32 rx_bd_flags;
+               #define RX_BD_FLAGS_NOPUSH              (1<<0)
+               #define RX_BD_FLAGS_DUMMY               (1<<1)
+               #define RX_BD_FLAGS_END                 (1<<2)
+               #define RX_BD_FLAGS_START               (1<<3)
+
+};
+
+
+/*
+ *  status_block definition
+ */
+struct status_block {
+       u32 status_attn_bits;
+               #define STATUS_ATTN_BITS_LINK_STATE             (1L<<0)
+               #define STATUS_ATTN_BITS_TX_SCHEDULER_ABORT     (1L<<1)
+               #define STATUS_ATTN_BITS_TX_BD_READ_ABORT       (1L<<2)
+               #define STATUS_ATTN_BITS_TX_BD_CACHE_ABORT      (1L<<3)
+               #define STATUS_ATTN_BITS_TX_PROCESSOR_ABORT     (1L<<4)
+               #define STATUS_ATTN_BITS_TX_DMA_ABORT           (1L<<5)
+               #define STATUS_ATTN_BITS_TX_PATCHUP_ABORT       (1L<<6)
+               #define STATUS_ATTN_BITS_TX_ASSEMBLER_ABORT     (1L<<7)
+               #define STATUS_ATTN_BITS_RX_PARSER_MAC_ABORT    (1L<<8)
+               #define STATUS_ATTN_BITS_RX_PARSER_CATCHUP_ABORT        (1L<<9)
+               #define STATUS_ATTN_BITS_RX_MBUF_ABORT          (1L<<10)
+               #define STATUS_ATTN_BITS_RX_LOOKUP_ABORT        (1L<<11)
+               #define STATUS_ATTN_BITS_RX_PROCESSOR_ABORT     (1L<<12)
+               #define STATUS_ATTN_BITS_RX_V2P_ABORT           (1L<<13)
+               #define STATUS_ATTN_BITS_RX_BD_CACHE_ABORT      (1L<<14)
+               #define STATUS_ATTN_BITS_RX_DMA_ABORT           (1L<<15)
+               #define STATUS_ATTN_BITS_COMPLETION_ABORT       (1L<<16)
+               #define STATUS_ATTN_BITS_HOST_COALESCE_ABORT    (1L<<17)
+               #define STATUS_ATTN_BITS_MAILBOX_QUEUE_ABORT    (1L<<18)
+               #define STATUS_ATTN_BITS_CONTEXT_ABORT          (1L<<19)
+               #define STATUS_ATTN_BITS_CMD_SCHEDULER_ABORT    (1L<<20)
+               #define STATUS_ATTN_BITS_CMD_PROCESSOR_ABORT    (1L<<21)
+               #define STATUS_ATTN_BITS_MGMT_PROCESSOR_ABORT   (1L<<22)
+               #define STATUS_ATTN_BITS_MAC_ABORT              (1L<<23)
+               #define STATUS_ATTN_BITS_TIMER_ABORT            (1L<<24)
+               #define STATUS_ATTN_BITS_DMAE_ABORT             (1L<<25)
+               #define STATUS_ATTN_BITS_FLSH_ABORT             (1L<<26)
+               #define STATUS_ATTN_BITS_GRC_ABORT              (1L<<27)
+               #define STATUS_ATTN_BITS_PARITY_ERROR           (1L<<31)
+
+       u32 status_attn_bits_ack;
+#if defined(__BIG_ENDIAN)
+       u16 status_tx_quick_consumer_index0;
+       u16 status_tx_quick_consumer_index1;
+       u16 status_tx_quick_consumer_index2;
+       u16 status_tx_quick_consumer_index3;
+       u16 status_rx_quick_consumer_index0;
+       u16 status_rx_quick_consumer_index1;
+       u16 status_rx_quick_consumer_index2;
+       u16 status_rx_quick_consumer_index3;
+       u16 status_rx_quick_consumer_index4;
+       u16 status_rx_quick_consumer_index5;
+       u16 status_rx_quick_consumer_index6;
+       u16 status_rx_quick_consumer_index7;
+       u16 status_rx_quick_consumer_index8;
+       u16 status_rx_quick_consumer_index9;
+       u16 status_rx_quick_consumer_index10;
+       u16 status_rx_quick_consumer_index11;
+       u16 status_rx_quick_consumer_index12;
+       u16 status_rx_quick_consumer_index13;
+       u16 status_rx_quick_consumer_index14;
+       u16 status_rx_quick_consumer_index15;
+       u16 status_completion_producer_index;
+       u16 status_cmd_consumer_index;
+       u16 status_idx;
+       u16 status_unused;
+#elif defined(__LITTLE_ENDIAN)
+       u16 status_tx_quick_consumer_index1;
+       u16 status_tx_quick_consumer_index0;
+       u16 status_tx_quick_consumer_index3;
+       u16 status_tx_quick_consumer_index2;
+       u16 status_rx_quick_consumer_index1;
+       u16 status_rx_quick_consumer_index0;
+       u16 status_rx_quick_consumer_index3;
+       u16 status_rx_quick_consumer_index2;
+       u16 status_rx_quick_consumer_index5;
+       u16 status_rx_quick_consumer_index4;
+       u16 status_rx_quick_consumer_index7;
+       u16 status_rx_quick_consumer_index6;
+       u16 status_rx_quick_consumer_index9;
+       u16 status_rx_quick_consumer_index8;
+       u16 status_rx_quick_consumer_index11;
+       u16 status_rx_quick_consumer_index10;
+       u16 status_rx_quick_consumer_index13;
+       u16 status_rx_quick_consumer_index12;
+       u16 status_rx_quick_consumer_index15;
+       u16 status_rx_quick_consumer_index14;
+       u16 status_cmd_consumer_index;
+       u16 status_completion_producer_index;
+       u16 status_unused;
+       u16 status_idx;
+#endif
+};
+
+
+/*
+ *  statistics_block definition
+ */
+struct statistics_block {
+       u32 stat_IfHCInOctets_hi;
+       u32 stat_IfHCInOctets_lo;
+       u32 stat_IfHCInBadOctets_hi;
+       u32 stat_IfHCInBadOctets_lo;
+       u32 stat_IfHCOutOctets_hi;
+       u32 stat_IfHCOutOctets_lo;
+       u32 stat_IfHCOutBadOctets_hi;
+       u32 stat_IfHCOutBadOctets_lo;
+       u32 stat_IfHCInUcastPkts_hi;
+       u32 stat_IfHCInUcastPkts_lo;
+       u32 stat_IfHCInMulticastPkts_hi;
+       u32 stat_IfHCInMulticastPkts_lo;
+       u32 stat_IfHCInBroadcastPkts_hi;
+       u32 stat_IfHCInBroadcastPkts_lo;
+       u32 stat_IfHCOutUcastPkts_hi;
+       u32 stat_IfHCOutUcastPkts_lo;
+       u32 stat_IfHCOutMulticastPkts_hi;
+       u32 stat_IfHCOutMulticastPkts_lo;
+       u32 stat_IfHCOutBroadcastPkts_hi;
+       u32 stat_IfHCOutBroadcastPkts_lo;
+       u32 stat_emac_tx_stat_dot3statsinternalmactransmiterrors;
+       u32 stat_Dot3StatsCarrierSenseErrors;
+       u32 stat_Dot3StatsFCSErrors;
+       u32 stat_Dot3StatsAlignmentErrors;
+       u32 stat_Dot3StatsSingleCollisionFrames;
+       u32 stat_Dot3StatsMultipleCollisionFrames;
+       u32 stat_Dot3StatsDeferredTransmissions;
+       u32 stat_Dot3StatsExcessiveCollisions;
+       u32 stat_Dot3StatsLateCollisions;
+       u32 stat_EtherStatsCollisions;
+       u32 stat_EtherStatsFragments;
+       u32 stat_EtherStatsJabbers;
+       u32 stat_EtherStatsUndersizePkts;
+       u32 stat_EtherStatsOverrsizePkts;
+       u32 stat_EtherStatsPktsRx64Octets;
+       u32 stat_EtherStatsPktsRx65Octetsto127Octets;
+       u32 stat_EtherStatsPktsRx128Octetsto255Octets;
+       u32 stat_EtherStatsPktsRx256Octetsto511Octets;
+       u32 stat_EtherStatsPktsRx512Octetsto1023Octets;
+       u32 stat_EtherStatsPktsRx1024Octetsto1522Octets;
+       u32 stat_EtherStatsPktsRx1523Octetsto9022Octets;
+       u32 stat_EtherStatsPktsTx64Octets;
+       u32 stat_EtherStatsPktsTx65Octetsto127Octets;
+       u32 stat_EtherStatsPktsTx128Octetsto255Octets;
+       u32 stat_EtherStatsPktsTx256Octetsto511Octets;
+       u32 stat_EtherStatsPktsTx512Octetsto1023Octets;
+       u32 stat_EtherStatsPktsTx1024Octetsto1522Octets;
+       u32 stat_EtherStatsPktsTx1523Octetsto9022Octets;
+       u32 stat_XonPauseFramesReceived;
+       u32 stat_XoffPauseFramesReceived;
+       u32 stat_OutXonSent;
+       u32 stat_OutXoffSent;
+       u32 stat_FlowControlDone;
+       u32 stat_MacControlFramesReceived;
+       u32 stat_XoffStateEntered;
+       u32 stat_IfInFramesL2FilterDiscards;
+       u32 stat_IfInRuleCheckerDiscards;
+       u32 stat_IfInFTQDiscards;
+       u32 stat_IfInMBUFDiscards;
+       u32 stat_IfInRuleCheckerP4Hit;
+       u32 stat_CatchupInRuleCheckerDiscards;
+       u32 stat_CatchupInFTQDiscards;
+       u32 stat_CatchupInMBUFDiscards;
+       u32 stat_CatchupInRuleCheckerP4Hit;
+       u32 stat_GenStat00;
+       u32 stat_GenStat01;
+       u32 stat_GenStat02;
+       u32 stat_GenStat03;
+       u32 stat_GenStat04;
+       u32 stat_GenStat05;
+       u32 stat_GenStat06;
+       u32 stat_GenStat07;
+       u32 stat_GenStat08;
+       u32 stat_GenStat09;
+       u32 stat_GenStat10;
+       u32 stat_GenStat11;
+       u32 stat_GenStat12;
+       u32 stat_GenStat13;
+       u32 stat_GenStat14;
+       u32 stat_GenStat15;
+};
+
+
+/*
+ *  l2_fhdr definition
+ */
+struct l2_fhdr {
+#if defined(__BIG_ENDIAN)
+       u16 l2_fhdr_errors;
+       u16 l2_fhdr_status;
+#elif defined(__LITTLE_ENDIAN)
+       u16 l2_fhdr_status;
+       u16 l2_fhdr_errors;
+#endif
+               #define L2_FHDR_ERRORS_BAD_CRC          (1<<1)
+               #define L2_FHDR_ERRORS_PHY_DECODE       (1<<2)
+               #define L2_FHDR_ERRORS_ALIGNMENT        (1<<3)
+               #define L2_FHDR_ERRORS_TOO_SHORT        (1<<4)
+               #define L2_FHDR_ERRORS_GIANT_FRAME      (1<<5)
+
+               #define L2_FHDR_STATUS_RULE_CLASS       (0x7<<0)
+               #define L2_FHDR_STATUS_RULE_P2          (1<<3)
+               #define L2_FHDR_STATUS_RULE_P3          (1<<4)
+               #define L2_FHDR_STATUS_RULE_P4          (1<<5)
+               #define L2_FHDR_STATUS_L2_VLAN_TAG      (1<<6)
+               #define L2_FHDR_STATUS_L2_LLC_SNAP      (1<<7)
+               #define L2_FHDR_STATUS_RSS_HASH         (1<<8)
+               #define L2_FHDR_STATUS_IP_DATAGRAM      (1<<13)
+               #define L2_FHDR_STATUS_TCP_SEGMENT      (1<<14)
+               #define L2_FHDR_STATUS_UDP_DATAGRAM     (1<<15)
+
+       u32 l2_fhdr_hash;
+#if defined(__BIG_ENDIAN)
+       u16 l2_fhdr_pkt_len;
+       u16 l2_fhdr_vlan_tag;
+       u16 l2_fhdr_ip_xsum;
+       u16 l2_fhdr_tcp_udp_xsum;
+#elif defined(__LITTLE_ENDIAN)
+       u16 l2_fhdr_vlan_tag;
+       u16 l2_fhdr_pkt_len;
+       u16 l2_fhdr_tcp_udp_xsum;
+       u16 l2_fhdr_ip_xsum;
+#endif
+};
+
+
+/*
+ *  l2_context definition
+ */
+#define BNX2_L2CTX_TYPE                                        0x00000000
+#define BNX2_L2CTX_TYPE_SIZE_L2                                 ((0xc0/0x20)<<16)
+#define BNX2_L2CTX_TYPE_TYPE                            (0xf<<28)
+#define BNX2_L2CTX_TYPE_TYPE_EMPTY                      (0<<28)
+#define BNX2_L2CTX_TYPE_TYPE_L2                                 (1<<28)
+
+#define BNX2_L2CTX_TX_HOST_BIDX                                0x00000088
+#define BNX2_L2CTX_EST_NBD                             0x00000088
+#define BNX2_L2CTX_CMD_TYPE                            0x00000088
+#define BNX2_L2CTX_CMD_TYPE_TYPE                        (0xf<<24)
+#define BNX2_L2CTX_CMD_TYPE_TYPE_L2                     (0<<24)
+#define BNX2_L2CTX_CMD_TYPE_TYPE_TCP                    (1<<24)
+
+#define BNX2_L2CTX_TX_HOST_BSEQ                                0x00000090
+#define BNX2_L2CTX_TSCH_BSEQ                           0x00000094
+#define BNX2_L2CTX_TBDR_BSEQ                           0x00000098
+#define BNX2_L2CTX_TBDR_BOFF                           0x0000009c
+#define BNX2_L2CTX_TBDR_BIDX                           0x0000009c
+#define BNX2_L2CTX_TBDR_BHADDR_HI                      0x000000a0
+#define BNX2_L2CTX_TBDR_BHADDR_LO                      0x000000a4
+#define BNX2_L2CTX_TXP_BOFF                            0x000000a8
+#define BNX2_L2CTX_TXP_BIDX                            0x000000a8
+#define BNX2_L2CTX_TXP_BSEQ                            0x000000ac
+
+
+/*
+ *  l2_bd_chain_context definition
+ */
+#define BNX2_L2CTX_BD_PRE_READ                         0x00000000
+#define BNX2_L2CTX_CTX_SIZE                            0x00000000
+#define BNX2_L2CTX_CTX_TYPE                            0x00000000
+#define BNX2_L2CTX_CTX_TYPE_SIZE_L2                     ((0x20/20)<<16)
+#define BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE             (0xf<<28)
+#define BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_UNDEFINED   (0<<28)
+#define BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE       (1<<28)
+
+#define BNX2_L2CTX_HOST_BDIDX                          0x00000004
+#define BNX2_L2CTX_HOST_BSEQ                           0x00000008
+#define BNX2_L2CTX_NX_BSEQ                             0x0000000c
+#define BNX2_L2CTX_NX_BDHADDR_HI                       0x00000010
+#define BNX2_L2CTX_NX_BDHADDR_LO                       0x00000014
+#define BNX2_L2CTX_NX_BDIDX                            0x00000018
+
+
+/*
+ *  pci_config_l definition
+ *  offset: 0000
+ */
+#define BNX2_PCICFG_MISC_CONFIG                                0x00000068
+#define BNX2_PCICFG_MISC_CONFIG_TARGET_BYTE_SWAP        (1L<<2)
+#define BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP     (1L<<3)
+#define BNX2_PCICFG_MISC_CONFIG_CLOCK_CTL_ENA           (1L<<5)
+#define BNX2_PCICFG_MISC_CONFIG_TARGET_GRC_WORD_SWAP    (1L<<6)
+#define BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA          (1L<<7)
+#define BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ            (1L<<8)
+#define BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY            (1L<<9)
+#define BNX2_PCICFG_MISC_CONFIG_ASIC_METAL_REV          (0xffL<<16)
+#define BNX2_PCICFG_MISC_CONFIG_ASIC_BASE_REV           (0xfL<<24)
+#define BNX2_PCICFG_MISC_CONFIG_ASIC_ID                         (0xfL<<28)
+
+#define BNX2_PCICFG_MISC_STATUS                                0x0000006c
+#define BNX2_PCICFG_MISC_STATUS_INTA_VALUE              (1L<<0)
+#define BNX2_PCICFG_MISC_STATUS_32BIT_DET               (1L<<1)
+#define BNX2_PCICFG_MISC_STATUS_M66EN                   (1L<<2)
+#define BNX2_PCICFG_MISC_STATUS_PCIX_DET                (1L<<3)
+#define BNX2_PCICFG_MISC_STATUS_PCIX_SPEED              (0x3L<<4)
+#define BNX2_PCICFG_MISC_STATUS_PCIX_SPEED_66           (0L<<4)
+#define BNX2_PCICFG_MISC_STATUS_PCIX_SPEED_100          (1L<<4)
+#define BNX2_PCICFG_MISC_STATUS_PCIX_SPEED_133          (2L<<4)
+#define BNX2_PCICFG_MISC_STATUS_PCIX_SPEED_PCI_MODE     (3L<<4)
+
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS             0x00000070
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET      (0xfL<<0)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_32MHZ        (0L<<0)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_38MHZ        (1L<<0)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_48MHZ        (2L<<0)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_55MHZ        (3L<<0)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_66MHZ        (4L<<0)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_80MHZ        (5L<<0)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_95MHZ        (6L<<0)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_133MHZ       (7L<<0)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_LOW  (0xfL<<0)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_DISABLE     (1L<<6)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_ALT         (1L<<7)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC     (0x7L<<8)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_UNDEF       (0L<<8)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_12  (1L<<8)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_6   (2L<<8)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_62  (4L<<8)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PLAY_DEAD    (1L<<11)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED   (0xfL<<12)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_100       (0L<<12)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_80        (1L<<12)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_50        (2L<<12)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_40        (4L<<12)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_25        (8L<<12)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_STOP    (1L<<16)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_PLL_STOP         (1L<<17)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_RESERVED_18  (1L<<18)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_USE_SPD_DET  (1L<<19)
+#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_RESERVED     (0xfffL<<20)
+
+#define BNX2_PCICFG_REG_WINDOW_ADDRESS                 0x00000078
+#define BNX2_PCICFG_REG_WINDOW                         0x00000080
+#define BNX2_PCICFG_INT_ACK_CMD                                0x00000084
+#define BNX2_PCICFG_INT_ACK_CMD_INDEX                   (0xffffL<<0)
+#define BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID             (1L<<16)
+#define BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM        (1L<<17)
+#define BNX2_PCICFG_INT_ACK_CMD_MASK_INT                (1L<<18)
+
+#define BNX2_PCICFG_STATUS_BIT_SET_CMD                 0x00000088
+#define BNX2_PCICFG_STATUS_BIT_CLEAR_CMD               0x0000008c
+#define BNX2_PCICFG_MAILBOX_QUEUE_ADDR                 0x00000090
+#define BNX2_PCICFG_MAILBOX_QUEUE_DATA                 0x00000094
+
+
+/*
+ *  pci_reg definition
+ *  offset: 0x400
+ */
+#define BNX2_PCI_GRC_WINDOW_ADDR                       0x00000400
+#define BNX2_PCI_GRC_WINDOW_ADDR_PCI_GRC_WINDOW_ADDR_VALUE      (0x3ffffL<<8)
+
+#define BNX2_PCI_CONFIG_1                              0x00000404
+#define BNX2_PCI_CONFIG_1_READ_BOUNDARY                         (0x7L<<8)
+#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_OFF             (0L<<8)
+#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_16              (1L<<8)
+#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_32              (2L<<8)
+#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_64              (3L<<8)
+#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_128             (4L<<8)
+#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_256             (5L<<8)
+#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_512             (6L<<8)
+#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_1024            (7L<<8)
+#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY                (0x7L<<11)
+#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_OFF            (0L<<11)
+#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_16             (1L<<11)
+#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_32             (2L<<11)
+#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_64             (3L<<11)
+#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_128            (4L<<11)
+#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_256            (5L<<11)
+#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_512            (6L<<11)
+#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_1024           (7L<<11)
+
+#define BNX2_PCI_CONFIG_2                              0x00000408
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE                     (0xfL<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_DISABLED            (0L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_64K                         (1L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_128K                (2L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_256K                (3L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_512K                (4L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_1M                  (5L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_2M                  (6L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_4M                  (7L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_8M                  (8L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_16M                         (9L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_32M                         (10L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_64M                         (11L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_128M                (12L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_256M                (13L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_512M                (14L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_SIZE_1G                  (15L<<0)
+#define BNX2_PCI_CONFIG_2_BAR1_64ENA                    (1L<<4)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_RETRY                         (1L<<5)
+#define BNX2_PCI_CONFIG_2_CFG_CYCLE_RETRY               (1L<<6)
+#define BNX2_PCI_CONFIG_2_FIRST_CFG_DONE                (1L<<7)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE                  (0xffL<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_DISABLED                 (0L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_1K               (1L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_2K               (2L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_4K               (3L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_8K               (4L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_16K              (5L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_32K              (6L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_64K              (7L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_128K             (8L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_256K             (9L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_512K             (10L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_1M               (11L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_2M               (12L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_4M               (13L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_8M               (14L<<8)
+#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_16M              (15L<<8)
+#define BNX2_PCI_CONFIG_2_MAX_SPLIT_LIMIT               (0x1fL<<16)
+#define BNX2_PCI_CONFIG_2_MAX_READ_LIMIT                (0x3L<<21)
+#define BNX2_PCI_CONFIG_2_MAX_READ_LIMIT_512            (0L<<21)
+#define BNX2_PCI_CONFIG_2_MAX_READ_LIMIT_1K             (1L<<21)
+#define BNX2_PCI_CONFIG_2_MAX_READ_LIMIT_2K             (2L<<21)
+#define BNX2_PCI_CONFIG_2_MAX_READ_LIMIT_4K             (3L<<21)
+#define BNX2_PCI_CONFIG_2_FORCE_32_BIT_MSTR             (1L<<23)
+#define BNX2_PCI_CONFIG_2_FORCE_32_BIT_TGT              (1L<<24)
+#define BNX2_PCI_CONFIG_2_KEEP_REQ_ASSERT               (1L<<25)
+
+#define BNX2_PCI_CONFIG_3                              0x0000040c
+#define BNX2_PCI_CONFIG_3_STICKY_BYTE                   (0xffL<<0)
+#define BNX2_PCI_CONFIG_3_FORCE_PME                     (1L<<24)
+#define BNX2_PCI_CONFIG_3_PME_STATUS                    (1L<<25)
+#define BNX2_PCI_CONFIG_3_PME_ENABLE                    (1L<<26)
+#define BNX2_PCI_CONFIG_3_PM_STATE                      (0x3L<<27)
+#define BNX2_PCI_CONFIG_3_VAUX_PRESET                   (1L<<30)
+#define BNX2_PCI_CONFIG_3_PCI_POWER                     (1L<<31)
+
+#define BNX2_PCI_PM_DATA_A                             0x00000410
+#define BNX2_PCI_PM_DATA_A_PM_DATA_0_PRG                (0xffL<<0)
+#define BNX2_PCI_PM_DATA_A_PM_DATA_1_PRG                (0xffL<<8)
+#define BNX2_PCI_PM_DATA_A_PM_DATA_2_PRG                (0xffL<<16)
+#define BNX2_PCI_PM_DATA_A_PM_DATA_3_PRG                (0xffL<<24)
+
+#define BNX2_PCI_PM_DATA_B                             0x00000414
+#define BNX2_PCI_PM_DATA_B_PM_DATA_4_PRG                (0xffL<<0)
+#define BNX2_PCI_PM_DATA_B_PM_DATA_5_PRG                (0xffL<<8)
+#define BNX2_PCI_PM_DATA_B_PM_DATA_6_PRG                (0xffL<<16)
+#define BNX2_PCI_PM_DATA_B_PM_DATA_7_PRG                (0xffL<<24)
+
+#define BNX2_PCI_SWAP_DIAG0                            0x00000418
+#define BNX2_PCI_SWAP_DIAG1                            0x0000041c
+#define BNX2_PCI_EXP_ROM_ADDR                          0x00000420
+#define BNX2_PCI_EXP_ROM_ADDR_ADDRESS                   (0x3fffffL<<2)
+#define BNX2_PCI_EXP_ROM_ADDR_REQ                       (1L<<31)
+
+#define BNX2_PCI_EXP_ROM_DATA                          0x00000424
+#define BNX2_PCI_VPD_INTF                              0x00000428
+#define BNX2_PCI_VPD_INTF_INTF_REQ                      (1L<<0)
+
+#define BNX2_PCI_VPD_ADDR_FLAG                         0x0000042c
+#define BNX2_PCI_VPD_ADDR_FLAG_ADDRESS                  (0x1fff<<2)
+#define BNX2_PCI_VPD_ADDR_FLAG_WR                       (1<<15)
+
+#define BNX2_PCI_VPD_DATA                              0x00000430
+#define BNX2_PCI_ID_VAL1                               0x00000434
+#define BNX2_PCI_ID_VAL1_DEVICE_ID                      (0xffffL<<0)
+#define BNX2_PCI_ID_VAL1_VENDOR_ID                      (0xffffL<<16)
+
+#define BNX2_PCI_ID_VAL2                               0x00000438
+#define BNX2_PCI_ID_VAL2_SUBSYSTEM_VENDOR_ID            (0xffffL<<0)
+#define BNX2_PCI_ID_VAL2_SUBSYSTEM_ID                   (0xffffL<<16)
+
+#define BNX2_PCI_ID_VAL3                               0x0000043c
+#define BNX2_PCI_ID_VAL3_CLASS_CODE                     (0xffffffL<<0)
+#define BNX2_PCI_ID_VAL3_REVISION_ID                    (0xffL<<24)
+
+#define BNX2_PCI_ID_VAL4                               0x00000440
+#define BNX2_PCI_ID_VAL4_CAP_ENA                        (0xfL<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_0                      (0L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_1                      (1L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_2                      (2L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_3                      (3L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_4                      (4L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_5                      (5L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_6                      (6L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_7                      (7L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_8                      (8L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_9                      (9L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_10                     (10L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_11                     (11L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_12                     (12L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_13                     (13L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_14                     (14L<<0)
+#define BNX2_PCI_ID_VAL4_CAP_ENA_15                     (15L<<0)
+#define BNX2_PCI_ID_VAL4_PM_SCALE_PRG                   (0x3L<<6)
+#define BNX2_PCI_ID_VAL4_PM_SCALE_PRG_0                         (0L<<6)
+#define BNX2_PCI_ID_VAL4_PM_SCALE_PRG_1                         (1L<<6)
+#define BNX2_PCI_ID_VAL4_PM_SCALE_PRG_2                         (2L<<6)
+#define BNX2_PCI_ID_VAL4_PM_SCALE_PRG_3                         (3L<<6)
+#define BNX2_PCI_ID_VAL4_MSI_LIMIT                      (0x7L<<9)
+#define BNX2_PCI_ID_VAL4_MSI_ADVERTIZE                  (0x7L<<12)
+#define BNX2_PCI_ID_VAL4_MSI_ENABLE                     (1L<<15)
+#define BNX2_PCI_ID_VAL4_MAX_64_ADVERTIZE               (1L<<16)
+#define BNX2_PCI_ID_VAL4_MAX_133_ADVERTIZE              (1L<<17)
+#define BNX2_PCI_ID_VAL4_MAX_MEM_READ_SIZE              (0x3L<<21)
+#define BNX2_PCI_ID_VAL4_MAX_SPLIT_SIZE                         (0x7L<<23)
+#define BNX2_PCI_ID_VAL4_MAX_CUMULATIVE_SIZE            (0x7L<<26)
+
+#define BNX2_PCI_ID_VAL5                               0x00000444
+#define BNX2_PCI_ID_VAL5_D1_SUPPORT                     (1L<<0)
+#define BNX2_PCI_ID_VAL5_D2_SUPPORT                     (1L<<1)
+#define BNX2_PCI_ID_VAL5_PME_IN_D0                      (1L<<2)
+#define BNX2_PCI_ID_VAL5_PME_IN_D1                      (1L<<3)
+#define BNX2_PCI_ID_VAL5_PME_IN_D2                      (1L<<4)
+#define BNX2_PCI_ID_VAL5_PME_IN_D3_HOT                  (1L<<5)
+
+#define BNX2_PCI_PCIX_EXTENDED_STATUS                  0x00000448
+#define BNX2_PCI_PCIX_EXTENDED_STATUS_NO_SNOOP          (1L<<8)
+#define BNX2_PCI_PCIX_EXTENDED_STATUS_LONG_BURST        (1L<<9)
+#define BNX2_PCI_PCIX_EXTENDED_STATUS_SPLIT_COMP_MSG_CLASS      (0xfL<<16)
+#define BNX2_PCI_PCIX_EXTENDED_STATUS_SPLIT_COMP_MSG_IDX        (0xffL<<24)
+
+#define BNX2_PCI_ID_VAL6                               0x0000044c
+#define BNX2_PCI_ID_VAL6_MAX_LAT                        (0xffL<<0)
+#define BNX2_PCI_ID_VAL6_MIN_GNT                        (0xffL<<8)
+#define BNX2_PCI_ID_VAL6_BIST                           (0xffL<<16)
+
+#define BNX2_PCI_MSI_DATA                              0x00000450
+#define BNX2_PCI_MSI_DATA_PCI_MSI_DATA                  (0xffffL<<0)
+
+#define BNX2_PCI_MSI_ADDR_H                            0x00000454
+#define BNX2_PCI_MSI_ADDR_L                            0x00000458
+
+
+/*
+ *  misc_reg definition
+ *  offset: 0x800
+ */
+#define BNX2_MISC_COMMAND                              0x00000800
+#define BNX2_MISC_COMMAND_ENABLE_ALL                    (1L<<0)
+#define BNX2_MISC_COMMAND_DISABLE_ALL                   (1L<<1)
+#define BNX2_MISC_COMMAND_CORE_RESET                    (1L<<4)
+#define BNX2_MISC_COMMAND_HARD_RESET                    (1L<<5)
+#define BNX2_MISC_COMMAND_PAR_ERROR                     (1L<<8)
+#define BNX2_MISC_COMMAND_PAR_ERR_RAM                   (0x7fL<<16)
+
+#define BNX2_MISC_CFG                                  0x00000804
+#define BNX2_MISC_CFG_PCI_GRC_TMOUT                     (1L<<0)
+#define BNX2_MISC_CFG_NVM_WR_EN                                 (0x3L<<1)
+#define BNX2_MISC_CFG_NVM_WR_EN_PROTECT                         (0L<<1)
+#define BNX2_MISC_CFG_NVM_WR_EN_PCI                     (1L<<1)
+#define BNX2_MISC_CFG_NVM_WR_EN_ALLOW                   (2L<<1)
+#define BNX2_MISC_CFG_NVM_WR_EN_ALLOW2                  (3L<<1)
+#define BNX2_MISC_CFG_BIST_EN                           (1L<<3)
+#define BNX2_MISC_CFG_CK25_OUT_ALT_SRC                  (1L<<4)
+#define BNX2_MISC_CFG_BYPASS_BSCAN                      (1L<<5)
+#define BNX2_MISC_CFG_BYPASS_EJTAG                      (1L<<6)
+#define BNX2_MISC_CFG_CLK_CTL_OVERRIDE                  (1L<<7)
+#define BNX2_MISC_CFG_LEDMODE                           (0x3L<<8)
+#define BNX2_MISC_CFG_LEDMODE_MAC                       (0L<<8)
+#define BNX2_MISC_CFG_LEDMODE_GPHY1                     (1L<<8)
+#define BNX2_MISC_CFG_LEDMODE_GPHY2                     (2L<<8)
+
+#define BNX2_MISC_ID                                   0x00000808
+#define BNX2_MISC_ID_BOND_ID                            (0xfL<<0)
+#define BNX2_MISC_ID_CHIP_METAL                                 (0xffL<<4)
+#define BNX2_MISC_ID_CHIP_REV                           (0xfL<<12)
+#define BNX2_MISC_ID_CHIP_NUM                           (0xffffL<<16)
+
+#define BNX2_MISC_ENABLE_STATUS_BITS                   0x0000080c
+#define BNX2_MISC_ENABLE_STATUS_BITS_TX_SCHEDULER_ENABLE        (1L<<0)
+#define BNX2_MISC_ENABLE_STATUS_BITS_TX_BD_READ_ENABLE  (1L<<1)
+#define BNX2_MISC_ENABLE_STATUS_BITS_TX_BD_CACHE_ENABLE         (1L<<2)
+#define BNX2_MISC_ENABLE_STATUS_BITS_TX_PROCESSOR_ENABLE        (1L<<3)
+#define BNX2_MISC_ENABLE_STATUS_BITS_TX_DMA_ENABLE      (1L<<4)
+#define BNX2_MISC_ENABLE_STATUS_BITS_TX_PATCHUP_ENABLE  (1L<<5)
+#define BNX2_MISC_ENABLE_STATUS_BITS_TX_PAYLOAD_Q_ENABLE        (1L<<6)
+#define BNX2_MISC_ENABLE_STATUS_BITS_TX_HEADER_Q_ENABLE         (1L<<7)
+#define BNX2_MISC_ENABLE_STATUS_BITS_TX_ASSEMBLER_ENABLE        (1L<<8)
+#define BNX2_MISC_ENABLE_STATUS_BITS_EMAC_ENABLE        (1L<<9)
+#define BNX2_MISC_ENABLE_STATUS_BITS_RX_PARSER_MAC_ENABLE       (1L<<10)
+#define BNX2_MISC_ENABLE_STATUS_BITS_RX_PARSER_CATCHUP_ENABLE   (1L<<11)
+#define BNX2_MISC_ENABLE_STATUS_BITS_RX_MBUF_ENABLE     (1L<<12)
+#define BNX2_MISC_ENABLE_STATUS_BITS_RX_LOOKUP_ENABLE   (1L<<13)
+#define BNX2_MISC_ENABLE_STATUS_BITS_RX_PROCESSOR_ENABLE        (1L<<14)
+#define BNX2_MISC_ENABLE_STATUS_BITS_RX_V2P_ENABLE      (1L<<15)
+#define BNX2_MISC_ENABLE_STATUS_BITS_RX_BD_CACHE_ENABLE         (1L<<16)
+#define BNX2_MISC_ENABLE_STATUS_BITS_RX_DMA_ENABLE      (1L<<17)
+#define BNX2_MISC_ENABLE_STATUS_BITS_COMPLETION_ENABLE  (1L<<18)
+#define BNX2_MISC_ENABLE_STATUS_BITS_HOST_COALESCE_ENABLE       (1L<<19)
+#define BNX2_MISC_ENABLE_STATUS_BITS_MAILBOX_QUEUE_ENABLE       (1L<<20)
+#define BNX2_MISC_ENABLE_STATUS_BITS_CONTEXT_ENABLE     (1L<<21)
+#define BNX2_MISC_ENABLE_STATUS_BITS_CMD_SCHEDULER_ENABLE       (1L<<22)
+#define BNX2_MISC_ENABLE_STATUS_BITS_CMD_PROCESSOR_ENABLE       (1L<<23)
+#define BNX2_MISC_ENABLE_STATUS_BITS_MGMT_PROCESSOR_ENABLE      (1L<<24)
+#define BNX2_MISC_ENABLE_STATUS_BITS_TIMER_ENABLE       (1L<<25)
+#define BNX2_MISC_ENABLE_STATUS_BITS_DMA_ENGINE_ENABLE  (1L<<26)
+#define BNX2_MISC_ENABLE_STATUS_BITS_UMP_ENABLE                 (1L<<27)
+
+#define BNX2_MISC_ENABLE_SET_BITS                      0x00000810
+#define BNX2_MISC_ENABLE_SET_BITS_TX_SCHEDULER_ENABLE   (1L<<0)
+#define BNX2_MISC_ENABLE_SET_BITS_TX_BD_READ_ENABLE     (1L<<1)
+#define BNX2_MISC_ENABLE_SET_BITS_TX_BD_CACHE_ENABLE    (1L<<2)
+#define BNX2_MISC_ENABLE_SET_BITS_TX_PROCESSOR_ENABLE   (1L<<3)
+#define BNX2_MISC_ENABLE_SET_BITS_TX_DMA_ENABLE                 (1L<<4)
+#define BNX2_MISC_ENABLE_SET_BITS_TX_PATCHUP_ENABLE     (1L<<5)
+#define BNX2_MISC_ENABLE_SET_BITS_TX_PAYLOAD_Q_ENABLE   (1L<<6)
+#define BNX2_MISC_ENABLE_SET_BITS_TX_HEADER_Q_ENABLE    (1L<<7)
+#define BNX2_MISC_ENABLE_SET_BITS_TX_ASSEMBLER_ENABLE   (1L<<8)
+#define BNX2_MISC_ENABLE_SET_BITS_EMAC_ENABLE           (1L<<9)
+#define BNX2_MISC_ENABLE_SET_BITS_RX_PARSER_MAC_ENABLE  (1L<<10)
+#define BNX2_MISC_ENABLE_SET_BITS_RX_PARSER_CATCHUP_ENABLE      (1L<<11)
+#define BNX2_MISC_ENABLE_SET_BITS_RX_MBUF_ENABLE        (1L<<12)
+#define BNX2_MISC_ENABLE_SET_BITS_RX_LOOKUP_ENABLE      (1L<<13)
+#define BNX2_MISC_ENABLE_SET_BITS_RX_PROCESSOR_ENABLE   (1L<<14)
+#define BNX2_MISC_ENABLE_SET_BITS_RX_V2P_ENABLE                 (1L<<15)
+#define BNX2_MISC_ENABLE_SET_BITS_RX_BD_CACHE_ENABLE    (1L<<16)
+#define BNX2_MISC_ENABLE_SET_BITS_RX_DMA_ENABLE                 (1L<<17)
+#define BNX2_MISC_ENABLE_SET_BITS_COMPLETION_ENABLE     (1L<<18)
+#define BNX2_MISC_ENABLE_SET_BITS_HOST_COALESCE_ENABLE  (1L<<19)
+#define BNX2_MISC_ENABLE_SET_BITS_MAILBOX_QUEUE_ENABLE  (1L<<20)
+#define BNX2_MISC_ENABLE_SET_BITS_CONTEXT_ENABLE        (1L<<21)
+#define BNX2_MISC_ENABLE_SET_BITS_CMD_SCHEDULER_ENABLE  (1L<<22)
+#define BNX2_MISC_ENABLE_SET_BITS_CMD_PROCESSOR_ENABLE  (1L<<23)
+#define BNX2_MISC_ENABLE_SET_BITS_MGMT_PROCESSOR_ENABLE         (1L<<24)
+#define BNX2_MISC_ENABLE_SET_BITS_TIMER_ENABLE          (1L<<25)
+#define BNX2_MISC_ENABLE_SET_BITS_DMA_ENGINE_ENABLE     (1L<<26)
+#define BNX2_MISC_ENABLE_SET_BITS_UMP_ENABLE            (1L<<27)
+
+#define BNX2_MISC_ENABLE_CLR_BITS                      0x00000814
+#define BNX2_MISC_ENABLE_CLR_BITS_TX_SCHEDULER_ENABLE   (1L<<0)
+#define BNX2_MISC_ENABLE_CLR_BITS_TX_BD_READ_ENABLE     (1L<<1)
+#define BNX2_MISC_ENABLE_CLR_BITS_TX_BD_CACHE_ENABLE    (1L<<2)
+#define BNX2_MISC_ENABLE_CLR_BITS_TX_PROCESSOR_ENABLE   (1L<<3)
+#define BNX2_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE                 (1L<<4)
+#define BNX2_MISC_ENABLE_CLR_BITS_TX_PATCHUP_ENABLE     (1L<<5)
+#define BNX2_MISC_ENABLE_CLR_BITS_TX_PAYLOAD_Q_ENABLE   (1L<<6)
+#define BNX2_MISC_ENABLE_CLR_BITS_TX_HEADER_Q_ENABLE    (1L<<7)
+#define BNX2_MISC_ENABLE_CLR_BITS_TX_ASSEMBLER_ENABLE   (1L<<8)
+#define BNX2_MISC_ENABLE_CLR_BITS_EMAC_ENABLE           (1L<<9)
+#define BNX2_MISC_ENABLE_CLR_BITS_RX_PARSER_MAC_ENABLE  (1L<<10)
+#define BNX2_MISC_ENABLE_CLR_BITS_RX_PARSER_CATCHUP_ENABLE      (1L<<11)
+#define BNX2_MISC_ENABLE_CLR_BITS_RX_MBUF_ENABLE        (1L<<12)
+#define BNX2_MISC_ENABLE_CLR_BITS_RX_LOOKUP_ENABLE      (1L<<13)
+#define BNX2_MISC_ENABLE_CLR_BITS_RX_PROCESSOR_ENABLE   (1L<<14)
+#define BNX2_MISC_ENABLE_CLR_BITS_RX_V2P_ENABLE                 (1L<<15)
+#define BNX2_MISC_ENABLE_CLR_BITS_RX_BD_CACHE_ENABLE    (1L<<16)
+#define BNX2_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE                 (1L<<17)
+#define BNX2_MISC_ENABLE_CLR_BITS_COMPLETION_ENABLE     (1L<<18)
+#define BNX2_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE  (1L<<19)
+#define BNX2_MISC_ENABLE_CLR_BITS_MAILBOX_QUEUE_ENABLE  (1L<<20)
+#define BNX2_MISC_ENABLE_CLR_BITS_CONTEXT_ENABLE        (1L<<21)
+#define BNX2_MISC_ENABLE_CLR_BITS_CMD_SCHEDULER_ENABLE  (1L<<22)
+#define BNX2_MISC_ENABLE_CLR_BITS_CMD_PROCESSOR_ENABLE  (1L<<23)
+#define BNX2_MISC_ENABLE_CLR_BITS_MGMT_PROCESSOR_ENABLE         (1L<<24)
+#define BNX2_MISC_ENABLE_CLR_BITS_TIMER_ENABLE          (1L<<25)
+#define BNX2_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE     (1L<<26)
+#define BNX2_MISC_ENABLE_CLR_BITS_UMP_ENABLE            (1L<<27)
+
+#define BNX2_MISC_CLOCK_CONTROL_BITS                   0x00000818
+#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET    (0xfL<<0)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_32MHZ      (0L<<0)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_38MHZ      (1L<<0)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_48MHZ      (2L<<0)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_55MHZ      (3L<<0)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_66MHZ      (4L<<0)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_80MHZ      (5L<<0)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_95MHZ      (6L<<0)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_133MHZ     (7L<<0)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_LOW        (0xfL<<0)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_DISABLE   (1L<<6)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_ALT       (1L<<7)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC   (0x7L<<8)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_UNDEF     (0L<<8)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_12        (1L<<8)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_6         (2L<<8)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_62        (4L<<8)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_PLAY_DEAD          (1L<<11)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED         (0xfL<<12)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_100     (0L<<12)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_80      (1L<<12)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_50      (2L<<12)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_40      (4L<<12)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_25      (8L<<12)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_STOP  (1L<<16)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_PLL_STOP       (1L<<17)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_RESERVED_18        (1L<<18)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_USE_SPD_DET        (1L<<19)
+#define BNX2_MISC_CLOCK_CONTROL_BITS_RESERVED           (0xfffL<<20)
+
+#define BNX2_MISC_GPIO                                 0x0000081c
+#define BNX2_MISC_GPIO_VALUE                            (0xffL<<0)
+#define BNX2_MISC_GPIO_SET                              (0xffL<<8)
+#define BNX2_MISC_GPIO_CLR                              (0xffL<<16)
+#define BNX2_MISC_GPIO_FLOAT                            (0xffL<<24)
+
+#define BNX2_MISC_GPIO_INT                             0x00000820
+#define BNX2_MISC_GPIO_INT_INT_STATE                    (0xfL<<0)
+#define BNX2_MISC_GPIO_INT_OLD_VALUE                    (0xfL<<8)
+#define BNX2_MISC_GPIO_INT_OLD_SET                      (0xfL<<16)
+#define BNX2_MISC_GPIO_INT_OLD_CLR                      (0xfL<<24)
+
+#define BNX2_MISC_CONFIG_LFSR                          0x00000824
+#define BNX2_MISC_CONFIG_LFSR_DIV                       (0xffffL<<0)
+
+#define BNX2_MISC_LFSR_MASK_BITS                       0x00000828
+#define BNX2_MISC_LFSR_MASK_BITS_TX_SCHEDULER_ENABLE    (1L<<0)
+#define BNX2_MISC_LFSR_MASK_BITS_TX_BD_READ_ENABLE      (1L<<1)
+#define BNX2_MISC_LFSR_MASK_BITS_TX_BD_CACHE_ENABLE     (1L<<2)
+#define BNX2_MISC_LFSR_MASK_BITS_TX_PROCESSOR_ENABLE    (1L<<3)
+#define BNX2_MISC_LFSR_MASK_BITS_TX_DMA_ENABLE          (1L<<4)
+#define BNX2_MISC_LFSR_MASK_BITS_TX_PATCHUP_ENABLE      (1L<<5)
+#define BNX2_MISC_LFSR_MASK_BITS_TX_PAYLOAD_Q_ENABLE    (1L<<6)
+#define BNX2_MISC_LFSR_MASK_BITS_TX_HEADER_Q_ENABLE     (1L<<7)
+#define BNX2_MISC_LFSR_MASK_BITS_TX_ASSEMBLER_ENABLE    (1L<<8)
+#define BNX2_MISC_LFSR_MASK_BITS_EMAC_ENABLE            (1L<<9)
+#define BNX2_MISC_LFSR_MASK_BITS_RX_PARSER_MAC_ENABLE   (1L<<10)
+#define BNX2_MISC_LFSR_MASK_BITS_RX_PARSER_CATCHUP_ENABLE       (1L<<11)
+#define BNX2_MISC_LFSR_MASK_BITS_RX_MBUF_ENABLE                 (1L<<12)
+#define BNX2_MISC_LFSR_MASK_BITS_RX_LOOKUP_ENABLE       (1L<<13)
+#define BNX2_MISC_LFSR_MASK_BITS_RX_PROCESSOR_ENABLE    (1L<<14)
+#define BNX2_MISC_LFSR_MASK_BITS_RX_V2P_ENABLE          (1L<<15)
+#define BNX2_MISC_LFSR_MASK_BITS_RX_BD_CACHE_ENABLE     (1L<<16)
+#define BNX2_MISC_LFSR_MASK_BITS_RX_DMA_ENABLE          (1L<<17)
+#define BNX2_MISC_LFSR_MASK_BITS_COMPLETION_ENABLE      (1L<<18)
+#define BNX2_MISC_LFSR_MASK_BITS_HOST_COALESCE_ENABLE   (1L<<19)
+#define BNX2_MISC_LFSR_MASK_BITS_MAILBOX_QUEUE_ENABLE   (1L<<20)
+#define BNX2_MISC_LFSR_MASK_BITS_CONTEXT_ENABLE                 (1L<<21)
+#define BNX2_MISC_LFSR_MASK_BITS_CMD_SCHEDULER_ENABLE   (1L<<22)
+#define BNX2_MISC_LFSR_MASK_BITS_CMD_PROCESSOR_ENABLE   (1L<<23)
+#define BNX2_MISC_LFSR_MASK_BITS_MGMT_PROCESSOR_ENABLE  (1L<<24)
+#define BNX2_MISC_LFSR_MASK_BITS_TIMER_ENABLE           (1L<<25)
+#define BNX2_MISC_LFSR_MASK_BITS_DMA_ENGINE_ENABLE      (1L<<26)
+#define BNX2_MISC_LFSR_MASK_BITS_UMP_ENABLE             (1L<<27)
+
+#define BNX2_MISC_ARB_REQ0                             0x0000082c
+#define BNX2_MISC_ARB_REQ1                             0x00000830
+#define BNX2_MISC_ARB_REQ2                             0x00000834
+#define BNX2_MISC_ARB_REQ3                             0x00000838
+#define BNX2_MISC_ARB_REQ4                             0x0000083c
+#define BNX2_MISC_ARB_FREE0                            0x00000840
+#define BNX2_MISC_ARB_FREE1                            0x00000844
+#define BNX2_MISC_ARB_FREE2                            0x00000848
+#define BNX2_MISC_ARB_FREE3                            0x0000084c
+#define BNX2_MISC_ARB_FREE4                            0x00000850
+#define BNX2_MISC_ARB_REQ_STATUS0                      0x00000854
+#define BNX2_MISC_ARB_REQ_STATUS1                      0x00000858
+#define BNX2_MISC_ARB_REQ_STATUS2                      0x0000085c
+#define BNX2_MISC_ARB_REQ_STATUS3                      0x00000860
+#define BNX2_MISC_ARB_REQ_STATUS4                      0x00000864
+#define BNX2_MISC_ARB_GNT0                             0x00000868
+#define BNX2_MISC_ARB_GNT0_0                            (0x7L<<0)
+#define BNX2_MISC_ARB_GNT0_1                            (0x7L<<4)
+#define BNX2_MISC_ARB_GNT0_2                            (0x7L<<8)
+#define BNX2_MISC_ARB_GNT0_3                            (0x7L<<12)
+#define BNX2_MISC_ARB_GNT0_4                            (0x7L<<16)
+#define BNX2_MISC_ARB_GNT0_5                            (0x7L<<20)
+#define BNX2_MISC_ARB_GNT0_6                            (0x7L<<24)
+#define BNX2_MISC_ARB_GNT0_7                            (0x7L<<28)
+
+#define BNX2_MISC_ARB_GNT1                             0x0000086c
+#define BNX2_MISC_ARB_GNT1_8                            (0x7L<<0)
+#define BNX2_MISC_ARB_GNT1_9                            (0x7L<<4)
+#define BNX2_MISC_ARB_GNT1_10                           (0x7L<<8)
+#define BNX2_MISC_ARB_GNT1_11                           (0x7L<<12)
+#define BNX2_MISC_ARB_GNT1_12                           (0x7L<<16)
+#define BNX2_MISC_ARB_GNT1_13                           (0x7L<<20)
+#define BNX2_MISC_ARB_GNT1_14                           (0x7L<<24)
+#define BNX2_MISC_ARB_GNT1_15                           (0x7L<<28)
+
+#define BNX2_MISC_ARB_GNT2                             0x00000870
+#define BNX2_MISC_ARB_GNT2_16                           (0x7L<<0)
+#define BNX2_MISC_ARB_GNT2_17                           (0x7L<<4)
+#define BNX2_MISC_ARB_GNT2_18                           (0x7L<<8)
+#define BNX2_MISC_ARB_GNT2_19                           (0x7L<<12)
+#define BNX2_MISC_ARB_GNT2_20                           (0x7L<<16)
+#define BNX2_MISC_ARB_GNT2_21                           (0x7L<<20)
+#define BNX2_MISC_ARB_GNT2_22                           (0x7L<<24)
+#define BNX2_MISC_ARB_GNT2_23                           (0x7L<<28)
+
+#define BNX2_MISC_ARB_GNT3                             0x00000874
+#define BNX2_MISC_ARB_GNT3_24                           (0x7L<<0)
+#define BNX2_MISC_ARB_GNT3_25                           (0x7L<<4)
+#define BNX2_MISC_ARB_GNT3_26                           (0x7L<<8)
+#define BNX2_MISC_ARB_GNT3_27                           (0x7L<<12)
+#define BNX2_MISC_ARB_GNT3_28                           (0x7L<<16)
+#define BNX2_MISC_ARB_GNT3_29                           (0x7L<<20)
+#define BNX2_MISC_ARB_GNT3_30                           (0x7L<<24)
+#define BNX2_MISC_ARB_GNT3_31                           (0x7L<<28)
+
+#define BNX2_MISC_PRBS_CONTROL                         0x00000878
+#define BNX2_MISC_PRBS_CONTROL_EN                       (1L<<0)
+#define BNX2_MISC_PRBS_CONTROL_RSTB                     (1L<<1)
+#define BNX2_MISC_PRBS_CONTROL_INV                      (1L<<2)
+#define BNX2_MISC_PRBS_CONTROL_ERR_CLR                  (1L<<3)
+#define BNX2_MISC_PRBS_CONTROL_ORDER                    (0x3L<<4)
+#define BNX2_MISC_PRBS_CONTROL_ORDER_7TH                (0L<<4)
+#define BNX2_MISC_PRBS_CONTROL_ORDER_15TH               (1L<<4)
+#define BNX2_MISC_PRBS_CONTROL_ORDER_23RD               (2L<<4)
+#define BNX2_MISC_PRBS_CONTROL_ORDER_31ST               (3L<<4)
+
+#define BNX2_MISC_PRBS_STATUS                          0x0000087c
+#define BNX2_MISC_PRBS_STATUS_LOCK                      (1L<<0)
+#define BNX2_MISC_PRBS_STATUS_STKY                      (1L<<1)
+#define BNX2_MISC_PRBS_STATUS_ERRORS                    (0x3fffL<<2)
+#define BNX2_MISC_PRBS_STATUS_STATE                     (0xfL<<16)
+
+#define BNX2_MISC_SM_ASF_CONTROL                       0x00000880
+#define BNX2_MISC_SM_ASF_CONTROL_ASF_RST                (1L<<0)
+#define BNX2_MISC_SM_ASF_CONTROL_TSC_EN                         (1L<<1)
+#define BNX2_MISC_SM_ASF_CONTROL_WG_TO                  (1L<<2)
+#define BNX2_MISC_SM_ASF_CONTROL_HB_TO                  (1L<<3)
+#define BNX2_MISC_SM_ASF_CONTROL_PA_TO                  (1L<<4)
+#define BNX2_MISC_SM_ASF_CONTROL_PL_TO                  (1L<<5)
+#define BNX2_MISC_SM_ASF_CONTROL_RT_TO                  (1L<<6)
+#define BNX2_MISC_SM_ASF_CONTROL_SMB_EVENT              (1L<<7)
+#define BNX2_MISC_SM_ASF_CONTROL_RES                    (0xfL<<8)
+#define BNX2_MISC_SM_ASF_CONTROL_SMB_EN                         (1L<<12)
+#define BNX2_MISC_SM_ASF_CONTROL_SMB_BB_EN              (1L<<13)
+#define BNX2_MISC_SM_ASF_CONTROL_SMB_NO_ADDR_FILT       (1L<<14)
+#define BNX2_MISC_SM_ASF_CONTROL_SMB_AUTOREAD           (1L<<15)
+#define BNX2_MISC_SM_ASF_CONTROL_NIC_SMB_ADDR1          (0x3fL<<16)
+#define BNX2_MISC_SM_ASF_CONTROL_NIC_SMB_ADDR2          (0x3fL<<24)
+#define BNX2_MISC_SM_ASF_CONTROL_EN_NIC_SMB_ADDR_0      (1L<<30)
+#define BNX2_MISC_SM_ASF_CONTROL_SMB_EARLY_ATTN                 (1L<<31)
+
+#define BNX2_MISC_SMB_IN                               0x00000884
+#define BNX2_MISC_SMB_IN_DAT_IN                                 (0xffL<<0)
+#define BNX2_MISC_SMB_IN_RDY                            (1L<<8)
+#define BNX2_MISC_SMB_IN_DONE                           (1L<<9)
+#define BNX2_MISC_SMB_IN_FIRSTBYTE                      (1L<<10)
+#define BNX2_MISC_SMB_IN_STATUS                                 (0x7L<<11)
+#define BNX2_MISC_SMB_IN_STATUS_OK                      (0x0L<<11)
+#define BNX2_MISC_SMB_IN_STATUS_PEC                     (0x1L<<11)
+#define BNX2_MISC_SMB_IN_STATUS_OFLOW                   (0x2L<<11)
+#define BNX2_MISC_SMB_IN_STATUS_STOP                    (0x3L<<11)
+#define BNX2_MISC_SMB_IN_STATUS_TIMEOUT                         (0x4L<<11)
+
+#define BNX2_MISC_SMB_OUT                              0x00000888
+#define BNX2_MISC_SMB_OUT_DAT_OUT                       (0xffL<<0)
+#define BNX2_MISC_SMB_OUT_RDY                           (1L<<8)
+#define BNX2_MISC_SMB_OUT_START                                 (1L<<9)
+#define BNX2_MISC_SMB_OUT_LAST                          (1L<<10)
+#define BNX2_MISC_SMB_OUT_ACC_TYPE                      (1L<<11)
+#define BNX2_MISC_SMB_OUT_ENB_PEC                       (1L<<12)
+#define BNX2_MISC_SMB_OUT_GET_RX_LEN                    (1L<<13)
+#define BNX2_MISC_SMB_OUT_SMB_READ_LEN                  (0x3fL<<14)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS                (0xfL<<20)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_OK             (0L<<20)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_FIRST_NACK     (1L<<20)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_SUB_NACK       (9L<<20)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_UFLOW          (2L<<20)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_STOP           (3L<<20)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_TIMEOUT        (4L<<20)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_FIRST_LOST     (5L<<20)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_SUB_LOST       (0xdL<<20)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_BADACK                 (0x6L<<20)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_SLAVEMODE             (1L<<24)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_DAT_EN                (1L<<25)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_DAT_IN                (1L<<26)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_CLK_EN                (1L<<27)
+#define BNX2_MISC_SMB_OUT_SMB_OUT_CLK_IN                (1L<<28)
+
+#define BNX2_MISC_SMB_WATCHDOG                         0x0000088c
+#define BNX2_MISC_SMB_WATCHDOG_WATCHDOG                         (0xffffL<<0)
+
+#define BNX2_MISC_SMB_HEARTBEAT                                0x00000890
+#define BNX2_MISC_SMB_HEARTBEAT_HEARTBEAT               (0xffffL<<0)
+
+#define BNX2_MISC_SMB_POLL_ASF                         0x00000894
+#define BNX2_MISC_SMB_POLL_ASF_POLL_ASF                         (0xffffL<<0)
+
+#define BNX2_MISC_SMB_POLL_LEGACY                      0x00000898
+#define BNX2_MISC_SMB_POLL_LEGACY_POLL_LEGACY           (0xffffL<<0)
+
+#define BNX2_MISC_SMB_RETRAN                           0x0000089c
+#define BNX2_MISC_SMB_RETRAN_RETRAN                     (0xffL<<0)
+
+#define BNX2_MISC_SMB_TIMESTAMP                                0x000008a0
+#define BNX2_MISC_SMB_TIMESTAMP_TIMESTAMP               (0xffffffffL<<0)
+
+#define BNX2_MISC_PERR_ENA0                            0x000008a4
+#define BNX2_MISC_PERR_ENA0_COM_MISC_CTXC               (1L<<0)
+#define BNX2_MISC_PERR_ENA0_COM_MISC_REGF               (1L<<1)
+#define BNX2_MISC_PERR_ENA0_COM_MISC_SCPAD              (1L<<2)
+#define BNX2_MISC_PERR_ENA0_CP_MISC_CTXC                (1L<<3)
+#define BNX2_MISC_PERR_ENA0_CP_MISC_REGF                (1L<<4)
+#define BNX2_MISC_PERR_ENA0_CP_MISC_SCPAD               (1L<<5)
+#define BNX2_MISC_PERR_ENA0_CS_MISC_TMEM                (1L<<6)
+#define BNX2_MISC_PERR_ENA0_CTX_MISC_ACCM0              (1L<<7)
+#define BNX2_MISC_PERR_ENA0_CTX_MISC_ACCM1              (1L<<8)
+#define BNX2_MISC_PERR_ENA0_CTX_MISC_ACCM2              (1L<<9)
+#define BNX2_MISC_PERR_ENA0_CTX_MISC_ACCM3              (1L<<10)
+#define BNX2_MISC_PERR_ENA0_CTX_MISC_ACCM4              (1L<<11)
+#define BNX2_MISC_PERR_ENA0_CTX_MISC_ACCM5              (1L<<12)
+#define BNX2_MISC_PERR_ENA0_CTX_MISC_PGTBL              (1L<<13)
+#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DR0               (1L<<14)
+#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DR1               (1L<<15)
+#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DR2               (1L<<16)
+#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DR3               (1L<<17)
+#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DR4               (1L<<18)
+#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DW0               (1L<<19)
+#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DW1               (1L<<20)
+#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DW2               (1L<<21)
+#define BNX2_MISC_PERR_ENA0_HC_MISC_DMA                         (1L<<22)
+#define BNX2_MISC_PERR_ENA0_MCP_MISC_REGF               (1L<<23)
+#define BNX2_MISC_PERR_ENA0_MCP_MISC_SCPAD              (1L<<24)
+#define BNX2_MISC_PERR_ENA0_MQ_MISC_CTX                         (1L<<25)
+#define BNX2_MISC_PERR_ENA0_RBDC_MISC                   (1L<<26)
+#define BNX2_MISC_PERR_ENA0_RBUF_MISC_MB                (1L<<27)
+#define BNX2_MISC_PERR_ENA0_RBUF_MISC_PTR               (1L<<28)
+#define BNX2_MISC_PERR_ENA0_RDE_MISC_RPC                (1L<<29)
+#define BNX2_MISC_PERR_ENA0_RDE_MISC_RPM                (1L<<30)
+#define BNX2_MISC_PERR_ENA0_RV2P_MISC_CB0REGS           (1L<<31)
+
+#define BNX2_MISC_PERR_ENA1                            0x000008a8
+#define BNX2_MISC_PERR_ENA1_RV2P_MISC_CB1REGS           (1L<<0)
+#define BNX2_MISC_PERR_ENA1_RV2P_MISC_P1IRAM            (1L<<1)
+#define BNX2_MISC_PERR_ENA1_RV2P_MISC_P2IRAM            (1L<<2)
+#define BNX2_MISC_PERR_ENA1_RXP_MISC_CTXC               (1L<<3)
+#define BNX2_MISC_PERR_ENA1_RXP_MISC_REGF               (1L<<4)
+#define BNX2_MISC_PERR_ENA1_RXP_MISC_SCPAD              (1L<<5)
+#define BNX2_MISC_PERR_ENA1_RXP_MISC_RBUFC              (1L<<6)
+#define BNX2_MISC_PERR_ENA1_TBDC_MISC                   (1L<<7)
+#define BNX2_MISC_PERR_ENA1_TDMA_MISC                   (1L<<8)
+#define BNX2_MISC_PERR_ENA1_THBUF_MISC_MB0              (1L<<9)
+#define BNX2_MISC_PERR_ENA1_THBUF_MISC_MB1              (1L<<10)
+#define BNX2_MISC_PERR_ENA1_TPAT_MISC_REGF              (1L<<11)
+#define BNX2_MISC_PERR_ENA1_TPAT_MISC_SCPAD             (1L<<12)
+#define BNX2_MISC_PERR_ENA1_TPBUF_MISC_MB               (1L<<13)
+#define BNX2_MISC_PERR_ENA1_TSCH_MISC_LR                (1L<<14)
+#define BNX2_MISC_PERR_ENA1_TXP_MISC_CTXC               (1L<<15)
+#define BNX2_MISC_PERR_ENA1_TXP_MISC_REGF               (1L<<16)
+#define BNX2_MISC_PERR_ENA1_TXP_MISC_SCPAD              (1L<<17)
+#define BNX2_MISC_PERR_ENA1_UMP_MISC_FIORX              (1L<<18)
+#define BNX2_MISC_PERR_ENA1_UMP_MISC_FIOTX              (1L<<19)
+#define BNX2_MISC_PERR_ENA1_UMP_MISC_RX                         (1L<<20)
+#define BNX2_MISC_PERR_ENA1_UMP_MISC_TX                         (1L<<21)
+#define BNX2_MISC_PERR_ENA1_RDMAQ_MISC                  (1L<<22)
+#define BNX2_MISC_PERR_ENA1_CSQ_MISC                    (1L<<23)
+#define BNX2_MISC_PERR_ENA1_CPQ_MISC                    (1L<<24)
+#define BNX2_MISC_PERR_ENA1_MCPQ_MISC                   (1L<<25)
+#define BNX2_MISC_PERR_ENA1_RV2PMQ_MISC                         (1L<<26)
+#define BNX2_MISC_PERR_ENA1_RV2PPQ_MISC                         (1L<<27)
+#define BNX2_MISC_PERR_ENA1_RV2PTQ_MISC                         (1L<<28)
+#define BNX2_MISC_PERR_ENA1_RXPQ_MISC                   (1L<<29)
+#define BNX2_MISC_PERR_ENA1_RXPCQ_MISC                  (1L<<30)
+#define BNX2_MISC_PERR_ENA1_RLUPQ_MISC                  (1L<<31)
+
+#define BNX2_MISC_PERR_ENA2                            0x000008ac
+#define BNX2_MISC_PERR_ENA2_COMQ_MISC                   (1L<<0)
+#define BNX2_MISC_PERR_ENA2_COMXQ_MISC                  (1L<<1)
+#define BNX2_MISC_PERR_ENA2_COMTQ_MISC                  (1L<<2)
+#define BNX2_MISC_PERR_ENA2_TSCHQ_MISC                  (1L<<3)
+#define BNX2_MISC_PERR_ENA2_TBDRQ_MISC                  (1L<<4)
+#define BNX2_MISC_PERR_ENA2_TXPQ_MISC                   (1L<<5)
+#define BNX2_MISC_PERR_ENA2_TDMAQ_MISC                  (1L<<6)
+#define BNX2_MISC_PERR_ENA2_TPATQ_MISC                  (1L<<7)
+#define BNX2_MISC_PERR_ENA2_TASQ_MISC                   (1L<<8)
+
+#define BNX2_MISC_DEBUG_VECTOR_SEL                     0x000008b0
+#define BNX2_MISC_DEBUG_VECTOR_SEL_0                    (0xfffL<<0)
+#define BNX2_MISC_DEBUG_VECTOR_SEL_1                    (0xfffL<<12)
+
+#define BNX2_MISC_VREG_CONTROL                         0x000008b4
+#define BNX2_MISC_VREG_CONTROL_1_2                      (0xfL<<0)
+#define BNX2_MISC_VREG_CONTROL_2_5                      (0xfL<<4)
+
+#define BNX2_MISC_FINAL_CLK_CTL_VAL                    0x000008b8
+#define BNX2_MISC_FINAL_CLK_CTL_VAL_MISC_FINAL_CLK_CTL_VAL      (0x3ffffffL<<6)
+
+#define BNX2_MISC_UNUSED0                              0x000008bc
+
+
+/*
+ *  nvm_reg definition
+ *  offset: 0x6400
+ */
+#define BNX2_NVM_COMMAND                               0x00006400
+#define BNX2_NVM_COMMAND_RST                            (1L<<0)
+#define BNX2_NVM_COMMAND_DONE                           (1L<<3)
+#define BNX2_NVM_COMMAND_DOIT                           (1L<<4)
+#define BNX2_NVM_COMMAND_WR                             (1L<<5)
+#define BNX2_NVM_COMMAND_ERASE                          (1L<<6)
+#define BNX2_NVM_COMMAND_FIRST                          (1L<<7)
+#define BNX2_NVM_COMMAND_LAST                           (1L<<8)
+#define BNX2_NVM_COMMAND_WREN                           (1L<<16)
+#define BNX2_NVM_COMMAND_WRDI                           (1L<<17)
+#define BNX2_NVM_COMMAND_EWSR                           (1L<<18)
+#define BNX2_NVM_COMMAND_WRSR                           (1L<<19)
+
+#define BNX2_NVM_STATUS                                        0x00006404
+#define BNX2_NVM_STATUS_PI_FSM_STATE                    (0xfL<<0)
+#define BNX2_NVM_STATUS_EE_FSM_STATE                    (0xfL<<4)
+#define BNX2_NVM_STATUS_EQ_FSM_STATE                    (0xfL<<8)
+
+#define BNX2_NVM_WRITE                                 0x00006408
+#define BNX2_NVM_WRITE_NVM_WRITE_VALUE                  (0xffffffffL<<0)
+#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_BIT_BANG                 (0L<<0)
+#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_EECLK            (1L<<0)
+#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_EEDATA           (2L<<0)
+#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_SCLK             (4L<<0)
+#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_CS_B             (8L<<0)
+#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_SO               (16L<<0)
+#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_SI               (32L<<0)
+
+#define BNX2_NVM_ADDR                                  0x0000640c
+#define BNX2_NVM_ADDR_NVM_ADDR_VALUE                    (0xffffffL<<0)
+#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_BIT_BANG           (0L<<0)
+#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_EECLK              (1L<<0)
+#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_EEDATA             (2L<<0)
+#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_SCLK               (4L<<0)
+#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_CS_B               (8L<<0)
+#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_SO                         (16L<<0)
+#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_SI                         (32L<<0)
+
+#define BNX2_NVM_READ                                  0x00006410
+#define BNX2_NVM_READ_NVM_READ_VALUE                    (0xffffffffL<<0)
+#define BNX2_NVM_READ_NVM_READ_VALUE_BIT_BANG           (0L<<0)
+#define BNX2_NVM_READ_NVM_READ_VALUE_EECLK              (1L<<0)
+#define BNX2_NVM_READ_NVM_READ_VALUE_EEDATA             (2L<<0)
+#define BNX2_NVM_READ_NVM_READ_VALUE_SCLK               (4L<<0)
+#define BNX2_NVM_READ_NVM_READ_VALUE_CS_B               (8L<<0)
+#define BNX2_NVM_READ_NVM_READ_VALUE_SO                         (16L<<0)
+#define BNX2_NVM_READ_NVM_READ_VALUE_SI                         (32L<<0)
+
+#define BNX2_NVM_CFG1                                  0x00006414
+#define BNX2_NVM_CFG1_FLASH_MODE                        (1L<<0)
+#define BNX2_NVM_CFG1_BUFFER_MODE                       (1L<<1)
+#define BNX2_NVM_CFG1_PASS_MODE                                 (1L<<2)
+#define BNX2_NVM_CFG1_BITBANG_MODE                      (1L<<3)
+#define BNX2_NVM_CFG1_STATUS_BIT                        (0x7L<<4)
+#define BNX2_NVM_CFG1_STATUS_BIT_FLASH_RDY              (0L<<4)
+#define BNX2_NVM_CFG1_STATUS_BIT_BUFFER_RDY             (7L<<4)
+#define BNX2_NVM_CFG1_SPI_CLK_DIV                       (0xfL<<7)
+#define BNX2_NVM_CFG1_SEE_CLK_DIV                       (0x7ffL<<11)
+#define BNX2_NVM_CFG1_PROTECT_MODE                      (1L<<24)
+#define BNX2_NVM_CFG1_FLASH_SIZE                        (1L<<25)
+#define BNX2_NVM_CFG1_COMPAT_BYPASSS                    (1L<<31)
+
+#define BNX2_NVM_CFG2                                  0x00006418
+#define BNX2_NVM_CFG2_ERASE_CMD                                 (0xffL<<0)
+#define BNX2_NVM_CFG2_DUMMY                             (0xffL<<8)
+#define BNX2_NVM_CFG2_STATUS_CMD                        (0xffL<<16)
+
+#define BNX2_NVM_CFG3                                  0x0000641c
+#define BNX2_NVM_CFG3_BUFFER_RD_CMD                     (0xffL<<0)
+#define BNX2_NVM_CFG3_WRITE_CMD                                 (0xffL<<8)
+#define BNX2_NVM_CFG3_BUFFER_WRITE_CMD                  (0xffL<<16)
+#define BNX2_NVM_CFG3_READ_CMD                          (0xffL<<24)
+
+#define BNX2_NVM_SW_ARB                                        0x00006420
+#define BNX2_NVM_SW_ARB_ARB_REQ_SET0                    (1L<<0)
+#define BNX2_NVM_SW_ARB_ARB_REQ_SET1                    (1L<<1)
+#define BNX2_NVM_SW_ARB_ARB_REQ_SET2                    (1L<<2)
+#define BNX2_NVM_SW_ARB_ARB_REQ_SET3                    (1L<<3)
+#define BNX2_NVM_SW_ARB_ARB_REQ_CLR0                    (1L<<4)
+#define BNX2_NVM_SW_ARB_ARB_REQ_CLR1                    (1L<<5)
+#define BNX2_NVM_SW_ARB_ARB_REQ_CLR2                    (1L<<6)
+#define BNX2_NVM_SW_ARB_ARB_REQ_CLR3                    (1L<<7)
+#define BNX2_NVM_SW_ARB_ARB_ARB0                        (1L<<8)
+#define BNX2_NVM_SW_ARB_ARB_ARB1                        (1L<<9)
+#define BNX2_NVM_SW_ARB_ARB_ARB2                        (1L<<10)
+#define BNX2_NVM_SW_ARB_ARB_ARB3                        (1L<<11)
+#define BNX2_NVM_SW_ARB_REQ0                            (1L<<12)
+#define BNX2_NVM_SW_ARB_REQ1                            (1L<<13)
+#define BNX2_NVM_SW_ARB_REQ2                            (1L<<14)
+#define BNX2_NVM_SW_ARB_REQ3                            (1L<<15)
+
+#define BNX2_NVM_ACCESS_ENABLE                         0x00006424
+#define BNX2_NVM_ACCESS_ENABLE_EN                       (1L<<0)
+#define BNX2_NVM_ACCESS_ENABLE_WR_EN                    (1L<<1)
+
+#define BNX2_NVM_WRITE1                                        0x00006428
+#define BNX2_NVM_WRITE1_WREN_CMD                        (0xffL<<0)
+#define BNX2_NVM_WRITE1_WRDI_CMD                        (0xffL<<8)
+#define BNX2_NVM_WRITE1_SR_DATA                                 (0xffL<<16)
+
+
+
+/*
+ *  dma_reg definition
+ *  offset: 0xc00
+ */
+#define BNX2_DMA_COMMAND                               0x00000c00
+#define BNX2_DMA_COMMAND_ENABLE                                 (1L<<0)
+
+#define BNX2_DMA_STATUS                                        0x00000c04
+#define BNX2_DMA_STATUS_PAR_ERROR_STATE                         (1L<<0)
+#define BNX2_DMA_STATUS_READ_TRANSFERS_STAT             (1L<<16)
+#define BNX2_DMA_STATUS_READ_DELAY_PCI_CLKS_STAT        (1L<<17)
+#define BNX2_DMA_STATUS_BIG_READ_TRANSFERS_STAT                 (1L<<18)
+#define BNX2_DMA_STATUS_BIG_READ_DELAY_PCI_CLKS_STAT    (1L<<19)
+#define BNX2_DMA_STATUS_BIG_READ_RETRY_AFTER_DATA_STAT  (1L<<20)
+#define BNX2_DMA_STATUS_WRITE_TRANSFERS_STAT            (1L<<21)
+#define BNX2_DMA_STATUS_WRITE_DELAY_PCI_CLKS_STAT       (1L<<22)
+#define BNX2_DMA_STATUS_BIG_WRITE_TRANSFERS_STAT        (1L<<23)
+#define BNX2_DMA_STATUS_BIG_WRITE_DELAY_PCI_CLKS_STAT   (1L<<24)
+#define BNX2_DMA_STATUS_BIG_WRITE_RETRY_AFTER_DATA_STAT         (1L<<25)
+
+#define BNX2_DMA_CONFIG                                        0x00000c08
+#define BNX2_DMA_CONFIG_DATA_BYTE_SWAP                  (1L<<0)
+#define BNX2_DMA_CONFIG_DATA_WORD_SWAP                  (1L<<1)
+#define BNX2_DMA_CONFIG_CNTL_BYTE_SWAP                  (1L<<4)
+#define BNX2_DMA_CONFIG_CNTL_WORD_SWAP                  (1L<<5)
+#define BNX2_DMA_CONFIG_ONE_DMA                                 (1L<<6)
+#define BNX2_DMA_CONFIG_CNTL_TWO_DMA                    (1L<<7)
+#define BNX2_DMA_CONFIG_CNTL_FPGA_MODE                  (1L<<8)
+#define BNX2_DMA_CONFIG_CNTL_PING_PONG_DMA              (1L<<10)
+#define BNX2_DMA_CONFIG_CNTL_PCI_COMP_DLY               (1L<<11)
+#define BNX2_DMA_CONFIG_NO_RCHANS_IN_USE                (0xfL<<12)
+#define BNX2_DMA_CONFIG_NO_WCHANS_IN_USE                (0xfL<<16)
+#define BNX2_DMA_CONFIG_PCI_CLK_CMP_BITS                (0x7L<<20)
+#define BNX2_DMA_CONFIG_PCI_FAST_CLK_CMP                (1L<<23)
+#define BNX2_DMA_CONFIG_BIG_SIZE                        (0xfL<<24)
+#define BNX2_DMA_CONFIG_BIG_SIZE_NONE                   (0x0L<<24)
+#define BNX2_DMA_CONFIG_BIG_SIZE_64                     (0x1L<<24)
+#define BNX2_DMA_CONFIG_BIG_SIZE_128                    (0x2L<<24)
+#define BNX2_DMA_CONFIG_BIG_SIZE_256                    (0x4L<<24)
+#define BNX2_DMA_CONFIG_BIG_SIZE_512                    (0x8L<<24)
+
+#define BNX2_DMA_BLACKOUT                              0x00000c0c
+#define BNX2_DMA_BLACKOUT_RD_RETRY_BLACKOUT             (0xffL<<0)
+#define BNX2_DMA_BLACKOUT_2ND_RD_RETRY_BLACKOUT                 (0xffL<<8)
+#define BNX2_DMA_BLACKOUT_WR_RETRY_BLACKOUT             (0xffL<<16)
+
+#define BNX2_DMA_RCHAN_STAT                            0x00000c30
+#define BNX2_DMA_RCHAN_STAT_COMP_CODE_0                         (0x7L<<0)
+#define BNX2_DMA_RCHAN_STAT_PAR_ERR_0                   (1L<<3)
+#define BNX2_DMA_RCHAN_STAT_COMP_CODE_1                         (0x7L<<4)
+#define BNX2_DMA_RCHAN_STAT_PAR_ERR_1                   (1L<<7)
+#define BNX2_DMA_RCHAN_STAT_COMP_CODE_2                         (0x7L<<8)
+#define BNX2_DMA_RCHAN_STAT_PAR_ERR_2                   (1L<<11)
+#define BNX2_DMA_RCHAN_STAT_COMP_CODE_3                         (0x7L<<12)
+#define BNX2_DMA_RCHAN_STAT_PAR_ERR_3                   (1L<<15)
+#define BNX2_DMA_RCHAN_STAT_COMP_CODE_4                         (0x7L<<16)
+#define BNX2_DMA_RCHAN_STAT_PAR_ERR_4                   (1L<<19)
+#define BNX2_DMA_RCHAN_STAT_COMP_CODE_5                         (0x7L<<20)
+#define BNX2_DMA_RCHAN_STAT_PAR_ERR_5                   (1L<<23)
+#define BNX2_DMA_RCHAN_STAT_COMP_CODE_6                         (0x7L<<24)
+#define BNX2_DMA_RCHAN_STAT_PAR_ERR_6                   (1L<<27)
+#define BNX2_DMA_RCHAN_STAT_COMP_CODE_7                         (0x7L<<28)
+#define BNX2_DMA_RCHAN_STAT_PAR_ERR_7                   (1L<<31)
+
+#define BNX2_DMA_WCHAN_STAT                            0x00000c34
+#define BNX2_DMA_WCHAN_STAT_COMP_CODE_0                         (0x7L<<0)
+#define BNX2_DMA_WCHAN_STAT_PAR_ERR_0                   (1L<<3)
+#define BNX2_DMA_WCHAN_STAT_COMP_CODE_1                         (0x7L<<4)
+#define BNX2_DMA_WCHAN_STAT_PAR_ERR_1                   (1L<<7)
+#define BNX2_DMA_WCHAN_STAT_COMP_CODE_2                         (0x7L<<8)
+#define BNX2_DMA_WCHAN_STAT_PAR_ERR_2                   (1L<<11)
+#define BNX2_DMA_WCHAN_STAT_COMP_CODE_3                         (0x7L<<12)
+#define BNX2_DMA_WCHAN_STAT_PAR_ERR_3                   (1L<<15)
+#define BNX2_DMA_WCHAN_STAT_COMP_CODE_4                         (0x7L<<16)
+#define BNX2_DMA_WCHAN_STAT_PAR_ERR_4                   (1L<<19)
+#define BNX2_DMA_WCHAN_STAT_COMP_CODE_5                         (0x7L<<20)
+#define BNX2_DMA_WCHAN_STAT_PAR_ERR_5                   (1L<<23)
+#define BNX2_DMA_WCHAN_STAT_COMP_CODE_6                         (0x7L<<24)
+#define BNX2_DMA_WCHAN_STAT_PAR_ERR_6                   (1L<<27)
+#define BNX2_DMA_WCHAN_STAT_COMP_CODE_7                         (0x7L<<28)
+#define BNX2_DMA_WCHAN_STAT_PAR_ERR_7                   (1L<<31)
+
+#define BNX2_DMA_RCHAN_ASSIGNMENT                      0x00000c38
+#define BNX2_DMA_RCHAN_ASSIGNMENT_0                     (0xfL<<0)
+#define BNX2_DMA_RCHAN_ASSIGNMENT_1                     (0xfL<<4)
+#define BNX2_DMA_RCHAN_ASSIGNMENT_2                     (0xfL<<8)
+#define BNX2_DMA_RCHAN_ASSIGNMENT_3                     (0xfL<<12)
+#define BNX2_DMA_RCHAN_ASSIGNMENT_4                     (0xfL<<16)
+#define BNX2_DMA_RCHAN_ASSIGNMENT_5                     (0xfL<<20)
+#define BNX2_DMA_RCHAN_ASSIGNMENT_6                     (0xfL<<24)
+#define BNX2_DMA_RCHAN_ASSIGNMENT_7                     (0xfL<<28)
+
+#define BNX2_DMA_WCHAN_ASSIGNMENT                      0x00000c3c
+#define BNX2_DMA_WCHAN_ASSIGNMENT_0                     (0xfL<<0)
+#define BNX2_DMA_WCHAN_ASSIGNMENT_1                     (0xfL<<4)
+#define BNX2_DMA_WCHAN_ASSIGNMENT_2                     (0xfL<<8)
+#define BNX2_DMA_WCHAN_ASSIGNMENT_3                     (0xfL<<12)
+#define BNX2_DMA_WCHAN_ASSIGNMENT_4                     (0xfL<<16)
+#define BNX2_DMA_WCHAN_ASSIGNMENT_5                     (0xfL<<20)
+#define BNX2_DMA_WCHAN_ASSIGNMENT_6                     (0xfL<<24)
+#define BNX2_DMA_WCHAN_ASSIGNMENT_7                     (0xfL<<28)
+
+#define BNX2_DMA_RCHAN_STAT_00                         0x00000c40
+#define BNX2_DMA_RCHAN_STAT_00_RCHAN_STA_HOST_ADDR_LOW  (0xffffffffL<<0)
+
+#define BNX2_DMA_RCHAN_STAT_01                         0x00000c44
+#define BNX2_DMA_RCHAN_STAT_01_RCHAN_STA_HOST_ADDR_HIGH         (0xffffffffL<<0)
+
+#define BNX2_DMA_RCHAN_STAT_02                         0x00000c48
+#define BNX2_DMA_RCHAN_STAT_02_LENGTH                   (0xffffL<<0)
+#define BNX2_DMA_RCHAN_STAT_02_WORD_SWAP                (1L<<16)
+#define BNX2_DMA_RCHAN_STAT_02_BYTE_SWAP                (1L<<17)
+#define BNX2_DMA_RCHAN_STAT_02_PRIORITY_LVL             (1L<<18)
+
+#define BNX2_DMA_RCHAN_STAT_10                         0x00000c4c
+#define BNX2_DMA_RCHAN_STAT_11                         0x00000c50
+#define BNX2_DMA_RCHAN_STAT_12                         0x00000c54
+#define BNX2_DMA_RCHAN_STAT_20                         0x00000c58
+#define BNX2_DMA_RCHAN_STAT_21                         0x00000c5c
+#define BNX2_DMA_RCHAN_STAT_22                         0x00000c60
+#define BNX2_DMA_RCHAN_STAT_30                         0x00000c64
+#define BNX2_DMA_RCHAN_STAT_31                         0x00000c68
+#define BNX2_DMA_RCHAN_STAT_32                         0x00000c6c
+#define BNX2_DMA_RCHAN_STAT_40                         0x00000c70
+#define BNX2_DMA_RCHAN_STAT_41                         0x00000c74
+#define BNX2_DMA_RCHAN_STAT_42                         0x00000c78
+#define BNX2_DMA_RCHAN_STAT_50                         0x00000c7c
+#define BNX2_DMA_RCHAN_STAT_51                         0x00000c80
+#define BNX2_DMA_RCHAN_STAT_52                         0x00000c84
+#define BNX2_DMA_RCHAN_STAT_60                         0x00000c88
+#define BNX2_DMA_RCHAN_STAT_61                         0x00000c8c
+#define BNX2_DMA_RCHAN_STAT_62                         0x00000c90
+#define BNX2_DMA_RCHAN_STAT_70                         0x00000c94
+#define BNX2_DMA_RCHAN_STAT_71                         0x00000c98
+#define BNX2_DMA_RCHAN_STAT_72                         0x00000c9c
+#define BNX2_DMA_WCHAN_STAT_00                         0x00000ca0
+#define BNX2_DMA_WCHAN_STAT_00_WCHAN_STA_HOST_ADDR_LOW  (0xffffffffL<<0)
+
+#define BNX2_DMA_WCHAN_STAT_01                         0x00000ca4
+#define BNX2_DMA_WCHAN_STAT_01_WCHAN_STA_HOST_ADDR_HIGH         (0xffffffffL<<0)
+
+#define BNX2_DMA_WCHAN_STAT_02                         0x00000ca8
+#define BNX2_DMA_WCHAN_STAT_02_LENGTH                   (0xffffL<<0)
+#define BNX2_DMA_WCHAN_STAT_02_WORD_SWAP                (1L<<16)
+#define BNX2_DMA_WCHAN_STAT_02_BYTE_SWAP                (1L<<17)
+#define BNX2_DMA_WCHAN_STAT_02_PRIORITY_LVL             (1L<<18)
+
+#define BNX2_DMA_WCHAN_STAT_10                         0x00000cac
+#define BNX2_DMA_WCHAN_STAT_11                         0x00000cb0
+#define BNX2_DMA_WCHAN_STAT_12                         0x00000cb4
+#define BNX2_DMA_WCHAN_STAT_20                         0x00000cb8
+#define BNX2_DMA_WCHAN_STAT_21                         0x00000cbc
+#define BNX2_DMA_WCHAN_STAT_22                         0x00000cc0
+#define BNX2_DMA_WCHAN_STAT_30                         0x00000cc4
+#define BNX2_DMA_WCHAN_STAT_31                         0x00000cc8
+#define BNX2_DMA_WCHAN_STAT_32                         0x00000ccc
+#define BNX2_DMA_WCHAN_STAT_40                         0x00000cd0
+#define BNX2_DMA_WCHAN_STAT_41                         0x00000cd4
+#define BNX2_DMA_WCHAN_STAT_42                         0x00000cd8
+#define BNX2_DMA_WCHAN_STAT_50                         0x00000cdc
+#define BNX2_DMA_WCHAN_STAT_51                         0x00000ce0
+#define BNX2_DMA_WCHAN_STAT_52                         0x00000ce4
+#define BNX2_DMA_WCHAN_STAT_60                         0x00000ce8
+#define BNX2_DMA_WCHAN_STAT_61                         0x00000cec
+#define BNX2_DMA_WCHAN_STAT_62                         0x00000cf0
+#define BNX2_DMA_WCHAN_STAT_70                         0x00000cf4
+#define BNX2_DMA_WCHAN_STAT_71                         0x00000cf8
+#define BNX2_DMA_WCHAN_STAT_72                         0x00000cfc
+#define BNX2_DMA_ARB_STAT_00                           0x00000d00
+#define BNX2_DMA_ARB_STAT_00_MASTER                     (0xffffL<<0)
+#define BNX2_DMA_ARB_STAT_00_MASTER_ENC                         (0xffL<<16)
+#define BNX2_DMA_ARB_STAT_00_CUR_BINMSTR                (0xffL<<24)
+
+#define BNX2_DMA_ARB_STAT_01                           0x00000d04
+#define BNX2_DMA_ARB_STAT_01_LPR_RPTR                   (0xfL<<0)
+#define BNX2_DMA_ARB_STAT_01_LPR_WPTR                   (0xfL<<4)
+#define BNX2_DMA_ARB_STAT_01_LPB_RPTR                   (0xfL<<8)
+#define BNX2_DMA_ARB_STAT_01_LPB_WPTR                   (0xfL<<12)
+#define BNX2_DMA_ARB_STAT_01_HPR_RPTR                   (0xfL<<16)
+#define BNX2_DMA_ARB_STAT_01_HPR_WPTR                   (0xfL<<20)
+#define BNX2_DMA_ARB_STAT_01_HPB_RPTR                   (0xfL<<24)
+#define BNX2_DMA_ARB_STAT_01_HPB_WPTR                   (0xfL<<28)
+
+#define BNX2_DMA_FUSE_CTRL0_CMD                                0x00000f00
+#define BNX2_DMA_FUSE_CTRL0_CMD_PWRUP_DONE              (1L<<0)
+#define BNX2_DMA_FUSE_CTRL0_CMD_SHIFT_DONE              (1L<<1)
+#define BNX2_DMA_FUSE_CTRL0_CMD_SHIFT                   (1L<<2)
+#define BNX2_DMA_FUSE_CTRL0_CMD_LOAD                    (1L<<3)
+#define BNX2_DMA_FUSE_CTRL0_CMD_SEL                     (0xfL<<8)
+
+#define BNX2_DMA_FUSE_CTRL0_DATA                       0x00000f04
+#define BNX2_DMA_FUSE_CTRL1_CMD                                0x00000f08
+#define BNX2_DMA_FUSE_CTRL1_CMD_PWRUP_DONE              (1L<<0)
+#define BNX2_DMA_FUSE_CTRL1_CMD_SHIFT_DONE              (1L<<1)
+#define BNX2_DMA_FUSE_CTRL1_CMD_SHIFT                   (1L<<2)
+#define BNX2_DMA_FUSE_CTRL1_CMD_LOAD                    (1L<<3)
+#define BNX2_DMA_FUSE_CTRL1_CMD_SEL                     (0xfL<<8)
+
+#define BNX2_DMA_FUSE_CTRL1_DATA                       0x00000f0c
+#define BNX2_DMA_FUSE_CTRL2_CMD                                0x00000f10
+#define BNX2_DMA_FUSE_CTRL2_CMD_PWRUP_DONE              (1L<<0)
+#define BNX2_DMA_FUSE_CTRL2_CMD_SHIFT_DONE              (1L<<1)
+#define BNX2_DMA_FUSE_CTRL2_CMD_SHIFT                   (1L<<2)
+#define BNX2_DMA_FUSE_CTRL2_CMD_LOAD                    (1L<<3)
+#define BNX2_DMA_FUSE_CTRL2_CMD_SEL                     (0xfL<<8)
+
+#define BNX2_DMA_FUSE_CTRL2_DATA                       0x00000f14
+
+
+/*
+ *  context_reg definition
+ *  offset: 0x1000
+ */
+#define BNX2_CTX_COMMAND                               0x00001000
+#define BNX2_CTX_COMMAND_ENABLED                        (1L<<0)
+
+#define BNX2_CTX_STATUS                                        0x00001004
+#define BNX2_CTX_STATUS_LOCK_WAIT                       (1L<<0)
+#define BNX2_CTX_STATUS_READ_STAT                       (1L<<16)
+#define BNX2_CTX_STATUS_WRITE_STAT                      (1L<<17)
+#define BNX2_CTX_STATUS_ACC_STALL_STAT                  (1L<<18)
+#define BNX2_CTX_STATUS_LOCK_STALL_STAT                         (1L<<19)
+
+#define BNX2_CTX_VIRT_ADDR                             0x00001008
+#define BNX2_CTX_VIRT_ADDR_VIRT_ADDR                    (0x7fffL<<6)
+
+#define BNX2_CTX_PAGE_TBL                              0x0000100c
+#define BNX2_CTX_PAGE_TBL_PAGE_TBL                      (0x3fffL<<6)
+
+#define BNX2_CTX_DATA_ADR                              0x00001010
+#define BNX2_CTX_DATA_ADR_DATA_ADR                      (0x7ffffL<<2)
+
+#define BNX2_CTX_DATA                                  0x00001014
+#define BNX2_CTX_LOCK                                  0x00001018
+#define BNX2_CTX_LOCK_TYPE                              (0x7L<<0)
+#define BNX2_CTX_LOCK_TYPE_LOCK_TYPE_VOID               (0x0L<<0)
+#define BNX2_CTX_LOCK_TYPE_LOCK_TYPE_COMPLETE           (0x7L<<0)
+#define BNX2_CTX_LOCK_TYPE_LOCK_TYPE_PROTOCOL           (0x1L<<0)
+#define BNX2_CTX_LOCK_TYPE_LOCK_TYPE_TX                         (0x2L<<0)
+#define BNX2_CTX_LOCK_TYPE_LOCK_TYPE_TIMER              (0x4L<<0)
+#define BNX2_CTX_LOCK_CID_VALUE                                 (0x3fffL<<7)
+#define BNX2_CTX_LOCK_GRANTED                           (1L<<26)
+#define BNX2_CTX_LOCK_MODE                              (0x7L<<27)
+#define BNX2_CTX_LOCK_MODE_UNLOCK                       (0x0L<<27)
+#define BNX2_CTX_LOCK_MODE_IMMEDIATE                    (0x1L<<27)
+#define BNX2_CTX_LOCK_MODE_SURE                                 (0x2L<<27)
+#define BNX2_CTX_LOCK_STATUS                            (1L<<30)
+#define BNX2_CTX_LOCK_REQ                               (1L<<31)
+
+#define BNX2_CTX_ACCESS_STATUS                         0x00001040
+#define BNX2_CTX_ACCESS_STATUS_MASTERENCODED            (0xfL<<0)
+#define BNX2_CTX_ACCESS_STATUS_ACCESSMEMORYSM           (0x3L<<10)
+#define BNX2_CTX_ACCESS_STATUS_PAGETABLEINITSM          (0x3L<<12)
+#define BNX2_CTX_ACCESS_STATUS_ACCESSMEMORYINITSM       (0x3L<<14)
+#define BNX2_CTX_ACCESS_STATUS_QUALIFIED_REQUEST        (0x7ffL<<17)
+
+#define BNX2_CTX_DBG_LOCK_STATUS                       0x00001044
+#define BNX2_CTX_DBG_LOCK_STATUS_SM                     (0x3ffL<<0)
+#define BNX2_CTX_DBG_LOCK_STATUS_MATCH                  (0x3ffL<<22)
+
+#define BNX2_CTX_CHNL_LOCK_STATUS_0                    0x00001080
+#define BNX2_CTX_CHNL_LOCK_STATUS_0_CID                         (0x3fffL<<0)
+#define BNX2_CTX_CHNL_LOCK_STATUS_0_TYPE                (0x3L<<14)
+#define BNX2_CTX_CHNL_LOCK_STATUS_0_MODE                (1L<<16)
+
+#define BNX2_CTX_CHNL_LOCK_STATUS_1                    0x00001084
+#define BNX2_CTX_CHNL_LOCK_STATUS_2                    0x00001088
+#define BNX2_CTX_CHNL_LOCK_STATUS_3                    0x0000108c
+#define BNX2_CTX_CHNL_LOCK_STATUS_4                    0x00001090
+#define BNX2_CTX_CHNL_LOCK_STATUS_5                    0x00001094
+#define BNX2_CTX_CHNL_LOCK_STATUS_6                    0x00001098
+#define BNX2_CTX_CHNL_LOCK_STATUS_7                    0x0000109c
+#define BNX2_CTX_CHNL_LOCK_STATUS_8                    0x000010a0
+
+
+/*
+ *  emac_reg definition
+ *  offset: 0x1400
+ */
+#define BNX2_EMAC_MODE                                 0x00001400
+#define BNX2_EMAC_MODE_RESET                            (1L<<0)
+#define BNX2_EMAC_MODE_HALF_DUPLEX                      (1L<<1)
+#define BNX2_EMAC_MODE_PORT                             (0x3L<<2)
+#define BNX2_EMAC_MODE_PORT_NONE                        (0L<<2)
+#define BNX2_EMAC_MODE_PORT_MII                                 (1L<<2)
+#define BNX2_EMAC_MODE_PORT_GMII                        (2L<<2)
+#define BNX2_EMAC_MODE_PORT_UNDEF                       (3L<<2)
+#define BNX2_EMAC_MODE_MAC_LOOP                                 (1L<<4)
+#define BNX2_EMAC_MODE_TAGGED_MAC_CTL                   (1L<<7)
+#define BNX2_EMAC_MODE_TX_BURST                                 (1L<<8)
+#define BNX2_EMAC_MODE_MAX_DEFER_DROP_ENA               (1L<<9)
+#define BNX2_EMAC_MODE_EXT_LINK_POL                     (1L<<10)
+#define BNX2_EMAC_MODE_FORCE_LINK                       (1L<<11)
+#define BNX2_EMAC_MODE_MPKT                             (1L<<18)
+#define BNX2_EMAC_MODE_MPKT_RCVD                        (1L<<19)
+#define BNX2_EMAC_MODE_ACPI_RCVD                        (1L<<20)
+
+#define BNX2_EMAC_STATUS                               0x00001404
+#define BNX2_EMAC_STATUS_LINK                           (1L<<11)
+#define BNX2_EMAC_STATUS_LINK_CHANGE                    (1L<<12)
+#define BNX2_EMAC_STATUS_MI_COMPLETE                    (1L<<22)
+#define BNX2_EMAC_STATUS_MI_INT                                 (1L<<23)
+#define BNX2_EMAC_STATUS_AP_ERROR                       (1L<<24)
+#define BNX2_EMAC_STATUS_PARITY_ERROR_STATE             (1L<<31)
+
+#define BNX2_EMAC_ATTENTION_ENA                                0x00001408
+#define BNX2_EMAC_ATTENTION_ENA_LINK                    (1L<<11)
+#define BNX2_EMAC_ATTENTION_ENA_MI_COMPLETE             (1L<<22)
+#define BNX2_EMAC_ATTENTION_ENA_MI_INT                  (1L<<23)
+#define BNX2_EMAC_ATTENTION_ENA_AP_ERROR                (1L<<24)
+
+#define BNX2_EMAC_LED                                  0x0000140c
+#define BNX2_EMAC_LED_OVERRIDE                          (1L<<0)
+#define BNX2_EMAC_LED_1000MB_OVERRIDE                   (1L<<1)
+#define BNX2_EMAC_LED_100MB_OVERRIDE                    (1L<<2)
+#define BNX2_EMAC_LED_10MB_OVERRIDE                     (1L<<3)
+#define BNX2_EMAC_LED_TRAFFIC_OVERRIDE                  (1L<<4)
+#define BNX2_EMAC_LED_BLNK_TRAFFIC                      (1L<<5)
+#define BNX2_EMAC_LED_TRAFFIC                           (1L<<6)
+#define BNX2_EMAC_LED_1000MB                            (1L<<7)
+#define BNX2_EMAC_LED_100MB                             (1L<<8)
+#define BNX2_EMAC_LED_10MB                              (1L<<9)
+#define BNX2_EMAC_LED_TRAFFIC_STAT                      (1L<<10)
+#define BNX2_EMAC_LED_BLNK_RATE                                 (0xfffL<<19)
+#define BNX2_EMAC_LED_BLNK_RATE_ENA                     (1L<<31)
+
+#define BNX2_EMAC_MAC_MATCH0                           0x00001410
+#define BNX2_EMAC_MAC_MATCH1                           0x00001414
+#define BNX2_EMAC_MAC_MATCH2                           0x00001418
+#define BNX2_EMAC_MAC_MATCH3                           0x0000141c
+#define BNX2_EMAC_MAC_MATCH4                           0x00001420
+#define BNX2_EMAC_MAC_MATCH5                           0x00001424
+#define BNX2_EMAC_MAC_MATCH6                           0x00001428
+#define BNX2_EMAC_MAC_MATCH7                           0x0000142c
+#define BNX2_EMAC_MAC_MATCH8                           0x00001430
+#define BNX2_EMAC_MAC_MATCH9                           0x00001434
+#define BNX2_EMAC_MAC_MATCH10                          0x00001438
+#define BNX2_EMAC_MAC_MATCH11                          0x0000143c
+#define BNX2_EMAC_MAC_MATCH12                          0x00001440
+#define BNX2_EMAC_MAC_MATCH13                          0x00001444
+#define BNX2_EMAC_MAC_MATCH14                          0x00001448
+#define BNX2_EMAC_MAC_MATCH15                          0x0000144c
+#define BNX2_EMAC_MAC_MATCH16                          0x00001450
+#define BNX2_EMAC_MAC_MATCH17                          0x00001454
+#define BNX2_EMAC_MAC_MATCH18                          0x00001458
+#define BNX2_EMAC_MAC_MATCH19                          0x0000145c
+#define BNX2_EMAC_MAC_MATCH20                          0x00001460
+#define BNX2_EMAC_MAC_MATCH21                          0x00001464
+#define BNX2_EMAC_MAC_MATCH22                          0x00001468
+#define BNX2_EMAC_MAC_MATCH23                          0x0000146c
+#define BNX2_EMAC_MAC_MATCH24                          0x00001470
+#define BNX2_EMAC_MAC_MATCH25                          0x00001474
+#define BNX2_EMAC_MAC_MATCH26                          0x00001478
+#define BNX2_EMAC_MAC_MATCH27                          0x0000147c
+#define BNX2_EMAC_MAC_MATCH28                          0x00001480
+#define BNX2_EMAC_MAC_MATCH29                          0x00001484
+#define BNX2_EMAC_MAC_MATCH30                          0x00001488
+#define BNX2_EMAC_MAC_MATCH31                          0x0000148c
+#define BNX2_EMAC_BACKOFF_SEED                         0x00001498
+#define BNX2_EMAC_BACKOFF_SEED_EMAC_BACKOFF_SEED        (0x3ffL<<0)
+
+#define BNX2_EMAC_RX_MTU_SIZE                          0x0000149c
+#define BNX2_EMAC_RX_MTU_SIZE_MTU_SIZE                  (0xffffL<<0)
+#define BNX2_EMAC_RX_MTU_SIZE_JUMBO_ENA                         (1L<<31)
+
+#define BNX2_EMAC_SERDES_CNTL                          0x000014a4
+#define BNX2_EMAC_SERDES_CNTL_RXR                       (0x7L<<0)
+#define BNX2_EMAC_SERDES_CNTL_RXG                       (0x3L<<3)
+#define BNX2_EMAC_SERDES_CNTL_RXCKSEL                   (1L<<6)
+#define BNX2_EMAC_SERDES_CNTL_TXBIAS                    (0x7L<<7)
+#define BNX2_EMAC_SERDES_CNTL_BGMAX                     (1L<<10)
+#define BNX2_EMAC_SERDES_CNTL_BGMIN                     (1L<<11)
+#define BNX2_EMAC_SERDES_CNTL_TXMODE                    (1L<<12)
+#define BNX2_EMAC_SERDES_CNTL_TXEDGE                    (1L<<13)
+#define BNX2_EMAC_SERDES_CNTL_SERDES_MODE               (1L<<14)
+#define BNX2_EMAC_SERDES_CNTL_PLLTEST                   (1L<<15)
+#define BNX2_EMAC_SERDES_CNTL_CDET_EN                   (1L<<16)
+#define BNX2_EMAC_SERDES_CNTL_TBI_LBK                   (1L<<17)
+#define BNX2_EMAC_SERDES_CNTL_REMOTE_LBK                (1L<<18)
+#define BNX2_EMAC_SERDES_CNTL_REV_PHASE                         (1L<<19)
+#define BNX2_EMAC_SERDES_CNTL_REGCTL12                  (0x3L<<20)
+#define BNX2_EMAC_SERDES_CNTL_REGCTL25                  (0x3L<<22)
+
+#define BNX2_EMAC_SERDES_STATUS                                0x000014a8
+#define BNX2_EMAC_SERDES_STATUS_RX_STAT                         (0xffL<<0)
+#define BNX2_EMAC_SERDES_STATUS_COMMA_DET               (1L<<8)
+
+#define BNX2_EMAC_MDIO_COMM                            0x000014ac
+#define BNX2_EMAC_MDIO_COMM_DATA                        (0xffffL<<0)
+#define BNX2_EMAC_MDIO_COMM_REG_ADDR                    (0x1fL<<16)
+#define BNX2_EMAC_MDIO_COMM_PHY_ADDR                    (0x1fL<<21)
+#define BNX2_EMAC_MDIO_COMM_COMMAND                     (0x3L<<26)
+#define BNX2_EMAC_MDIO_COMM_COMMAND_UNDEFINED_0                 (0L<<26)
+#define BNX2_EMAC_MDIO_COMM_COMMAND_WRITE               (1L<<26)
+#define BNX2_EMAC_MDIO_COMM_COMMAND_READ                (2L<<26)
+#define BNX2_EMAC_MDIO_COMM_COMMAND_UNDEFINED_3                 (3L<<26)
+#define BNX2_EMAC_MDIO_COMM_FAIL                        (1L<<28)
+#define BNX2_EMAC_MDIO_COMM_START_BUSY                  (1L<<29)
+#define BNX2_EMAC_MDIO_COMM_DISEXT                      (1L<<30)
+
+#define BNX2_EMAC_MDIO_STATUS                          0x000014b0
+#define BNX2_EMAC_MDIO_STATUS_LINK                      (1L<<0)
+#define BNX2_EMAC_MDIO_STATUS_10MB                      (1L<<1)
+
+#define BNX2_EMAC_MDIO_MODE                            0x000014b4
+#define BNX2_EMAC_MDIO_MODE_SHORT_PREAMBLE              (1L<<1)
+#define BNX2_EMAC_MDIO_MODE_AUTO_POLL                   (1L<<4)
+#define BNX2_EMAC_MDIO_MODE_BIT_BANG                    (1L<<8)
+#define BNX2_EMAC_MDIO_MODE_MDIO                        (1L<<9)
+#define BNX2_EMAC_MDIO_MODE_MDIO_OE                     (1L<<10)
+#define BNX2_EMAC_MDIO_MODE_MDC                                 (1L<<11)
+#define BNX2_EMAC_MDIO_MODE_MDINT                       (1L<<12)
+#define BNX2_EMAC_MDIO_MODE_CLOCK_CNT                   (0x1fL<<16)
+
+#define BNX2_EMAC_MDIO_AUTO_STATUS                     0x000014b8
+#define BNX2_EMAC_MDIO_AUTO_STATUS_AUTO_ERR             (1L<<0)
+
+#define BNX2_EMAC_TX_MODE                              0x000014bc
+#define BNX2_EMAC_TX_MODE_RESET                                 (1L<<0)
+#define BNX2_EMAC_TX_MODE_EXT_PAUSE_EN                  (1L<<3)
+#define BNX2_EMAC_TX_MODE_FLOW_EN                       (1L<<4)
+#define BNX2_EMAC_TX_MODE_BIG_BACKOFF                   (1L<<5)
+#define BNX2_EMAC_TX_MODE_LONG_PAUSE                    (1L<<6)
+#define BNX2_EMAC_TX_MODE_LINK_AWARE                    (1L<<7)
+
+#define BNX2_EMAC_TX_STATUS                            0x000014c0
+#define BNX2_EMAC_TX_STATUS_XOFFED                      (1L<<0)
+#define BNX2_EMAC_TX_STATUS_XOFF_SENT                   (1L<<1)
+#define BNX2_EMAC_TX_STATUS_XON_SENT                    (1L<<2)
+#define BNX2_EMAC_TX_STATUS_LINK_UP                     (1L<<3)
+#define BNX2_EMAC_TX_STATUS_UNDERRUN                    (1L<<4)
+
+#define BNX2_EMAC_TX_LENGTHS                           0x000014c4
+#define BNX2_EMAC_TX_LENGTHS_SLOT                       (0xffL<<0)
+#define BNX2_EMAC_TX_LENGTHS_IPG                        (0xfL<<8)
+#define BNX2_EMAC_TX_LENGTHS_IPG_CRS                    (0x3L<<12)
+
+#define BNX2_EMAC_RX_MODE                              0x000014c8
+#define BNX2_EMAC_RX_MODE_RESET                                 (1L<<0)
+#define BNX2_EMAC_RX_MODE_FLOW_EN                       (1L<<2)
+#define BNX2_EMAC_RX_MODE_KEEP_MAC_CONTROL              (1L<<3)
+#define BNX2_EMAC_RX_MODE_KEEP_PAUSE                    (1L<<4)
+#define BNX2_EMAC_RX_MODE_ACCEPT_OVERSIZE               (1L<<5)
+#define BNX2_EMAC_RX_MODE_ACCEPT_RUNTS                  (1L<<6)
+#define BNX2_EMAC_RX_MODE_LLC_CHK                       (1L<<7)
+#define BNX2_EMAC_RX_MODE_PROMISCUOUS                   (1L<<8)
+#define BNX2_EMAC_RX_MODE_NO_CRC_CHK                    (1L<<9)
+#define BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG                         (1L<<10)
+#define BNX2_EMAC_RX_MODE_FILT_BROADCAST                (1L<<11)
+#define BNX2_EMAC_RX_MODE_SORT_MODE                     (1L<<12)
+
+#define BNX2_EMAC_RX_STATUS                            0x000014cc
+#define BNX2_EMAC_RX_STATUS_FFED                        (1L<<0)
+#define BNX2_EMAC_RX_STATUS_FF_RECEIVED                         (1L<<1)
+#define BNX2_EMAC_RX_STATUS_N_RECEIVED                  (1L<<2)
+
+#define BNX2_EMAC_MULTICAST_HASH0                      0x000014d0
+#define BNX2_EMAC_MULTICAST_HASH1                      0x000014d4
+#define BNX2_EMAC_MULTICAST_HASH2                      0x000014d8
+#define BNX2_EMAC_MULTICAST_HASH3                      0x000014dc
+#define BNX2_EMAC_MULTICAST_HASH4                      0x000014e0
+#define BNX2_EMAC_MULTICAST_HASH5                      0x000014e4
+#define BNX2_EMAC_MULTICAST_HASH6                      0x000014e8
+#define BNX2_EMAC_MULTICAST_HASH7                      0x000014ec
+#define BNX2_EMAC_RX_STAT_IFHCINOCTETS                 0x00001500
+#define BNX2_EMAC_RX_STAT_IFHCINBADOCTETS              0x00001504
+#define BNX2_EMAC_RX_STAT_ETHERSTATSFRAGMENTS          0x00001508
+#define BNX2_EMAC_RX_STAT_IFHCINUCASTPKTS              0x0000150c
+#define BNX2_EMAC_RX_STAT_IFHCINMULTICASTPKTS          0x00001510
+#define BNX2_EMAC_RX_STAT_IFHCINBROADCASTPKTS          0x00001514
+#define BNX2_EMAC_RX_STAT_DOT3STATSFCSERRORS           0x00001518
+#define BNX2_EMAC_RX_STAT_DOT3STATSALIGNMENTERRORS     0x0000151c
+#define BNX2_EMAC_RX_STAT_DOT3STATSCARRIERSENSEERRORS  0x00001520
+#define BNX2_EMAC_RX_STAT_XONPAUSEFRAMESRECEIVED       0x00001524
+#define BNX2_EMAC_RX_STAT_XOFFPAUSEFRAMESRECEIVED      0x00001528
+#define BNX2_EMAC_RX_STAT_MACCONTROLFRAMESRECEIVED     0x0000152c
+#define BNX2_EMAC_RX_STAT_XOFFSTATEENTERED             0x00001530
+#define BNX2_EMAC_RX_STAT_DOT3STATSFRAMESTOOLONG       0x00001534
+#define BNX2_EMAC_RX_STAT_ETHERSTATSJABBERS            0x00001538
+#define BNX2_EMAC_RX_STAT_ETHERSTATSUNDERSIZEPKTS      0x0000153c
+#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTS64OCTETS       0x00001540
+#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTS65OCTETSTO127OCTETS    0x00001544
+#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTS128OCTETSTO255OCTETS   0x00001548
+#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTS256OCTETSTO511OCTETS   0x0000154c
+#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTS512OCTETSTO1023OCTETS  0x00001550
+#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTS1024OCTETSTO1522OCTETS 0x00001554
+#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTS1523OCTETSTO9022OCTETS 0x00001558
+#define BNX2_EMAC_RXMAC_DEBUG0                         0x0000155c
+#define BNX2_EMAC_RXMAC_DEBUG1                         0x00001560
+#define BNX2_EMAC_RXMAC_DEBUG1_LENGTH_NE_BYTE_COUNT     (1L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG1_LENGTH_OUT_RANGE                 (1L<<1)
+#define BNX2_EMAC_RXMAC_DEBUG1_BAD_CRC                  (1L<<2)
+#define BNX2_EMAC_RXMAC_DEBUG1_RX_ERROR                         (1L<<3)
+#define BNX2_EMAC_RXMAC_DEBUG1_ALIGN_ERROR              (1L<<4)
+#define BNX2_EMAC_RXMAC_DEBUG1_LAST_DATA                (1L<<5)
+#define BNX2_EMAC_RXMAC_DEBUG1_ODD_BYTE_START           (1L<<6)
+#define BNX2_EMAC_RXMAC_DEBUG1_BYTE_COUNT               (0xffffL<<7)
+#define BNX2_EMAC_RXMAC_DEBUG1_SLOT_TIME                (0xffL<<23)
+
+#define BNX2_EMAC_RXMAC_DEBUG2                         0x00001564
+#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE                         (0x7L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_IDLE            (0x0L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_SFD             (0x1L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_DATA            (0x2L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_SKEEP           (0x3L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_EXT             (0x4L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_DROP            (0x5L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_SDROP           (0x6L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_FC              (0x7L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE                (0xfL<<3)
+#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_IDLE           (0x0L<<3)
+#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_DATA0          (0x1L<<3)
+#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_DATA1          (0x2L<<3)
+#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_DATA2          (0x3L<<3)
+#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_DATA3          (0x4L<<3)
+#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_ABORT          (0x5L<<3)
+#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_WAIT           (0x6L<<3)
+#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_STATUS                 (0x7L<<3)
+#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_LAST           (0x8L<<3)
+#define BNX2_EMAC_RXMAC_DEBUG2_BYTE_IN                  (0xffL<<7)
+#define BNX2_EMAC_RXMAC_DEBUG2_FALSEC                   (1L<<15)
+#define BNX2_EMAC_RXMAC_DEBUG2_TAGGED                   (1L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG2_PAUSE_STATE              (1L<<18)
+#define BNX2_EMAC_RXMAC_DEBUG2_PAUSE_STATE_IDLE                 (0L<<18)
+#define BNX2_EMAC_RXMAC_DEBUG2_PAUSE_STATE_PAUSED       (1L<<18)
+#define BNX2_EMAC_RXMAC_DEBUG2_SE_COUNTER               (0xfL<<19)
+#define BNX2_EMAC_RXMAC_DEBUG2_QUANTA                   (0x1fL<<23)
+
+#define BNX2_EMAC_RXMAC_DEBUG3                         0x00001568
+#define BNX2_EMAC_RXMAC_DEBUG3_PAUSE_CTR                (0xffffL<<0)
+#define BNX2_EMAC_RXMAC_DEBUG3_TMP_PAUSE_CTR            (0xffffL<<16)
+
+#define BNX2_EMAC_RXMAC_DEBUG4                         0x0000156c
+#define BNX2_EMAC_RXMAC_DEBUG4_TYPE_FIELD               (0xffffL<<0)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE               (0x3fL<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_IDLE          (0x0L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_UMAC2                 (0x1L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_UMAC3                 (0x2L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_UNI           (0x3L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MMAC2                 (0x7L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MMAC3                 (0x5L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_PSA1          (0x6L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_PSA2          (0x7L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_PSA3          (0x8L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MC2           (0x9L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MC3           (0xaL<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MWAIT1        (0xeL<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MWAIT2        (0xfL<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MCHECK        (0x10L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MC            (0x11L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BC2           (0x12L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BC3           (0x13L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BSA1          (0x14L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BSA2          (0x15L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BSA3          (0x16L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BTYPE                 (0x17L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BC            (0x18L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_PTYPE                 (0x19L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_CMD           (0x1aL<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MAC           (0x1bL<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_LATCH                 (0x1cL<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_XOFF          (0x1dL<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_XON           (0x1eL<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_PAUSED        (0x1fL<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_NPAUSED       (0x20L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_TTYPE                 (0x21L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_TVAL          (0x22L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_USA1          (0x23L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_USA2          (0x24L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_USA3          (0x25L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_UTYPE                 (0x26L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_UTTYPE        (0x27L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_UTVAL                 (0x28L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MTYPE                 (0x29L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_DROP          (0x2aL<<16)
+#define BNX2_EMAC_RXMAC_DEBUG4_DROP_PKT                         (1L<<22)
+#define BNX2_EMAC_RXMAC_DEBUG4_SLOT_FILLED              (1L<<23)
+#define BNX2_EMAC_RXMAC_DEBUG4_FALSE_CARRIER            (1L<<24)
+#define BNX2_EMAC_RXMAC_DEBUG4_LAST_DATA                (1L<<25)
+#define BNX2_EMAC_RXMAC_DEBUG4_sfd_FOUND                (1L<<26)
+#define BNX2_EMAC_RXMAC_DEBUG4_ADVANCE                  (1L<<27)
+#define BNX2_EMAC_RXMAC_DEBUG4_START                    (1L<<28)
+
+#define BNX2_EMAC_RXMAC_DEBUG5                         0x00001570
+#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM                         (0x7L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_IDLE            (0L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_WAIT_EOF        (1L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_WAIT_STAT       (2L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_SET_EOF4FCRC    (3L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_SET_EOF4RDE     (4L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_SET_EOF4ALL     (5L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_1WD_WAIT_STAT   (6L<<0)
+#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1               (0x7L<<4)
+#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_VDW           (0x0L<<4)
+#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_STAT          (0x1L<<4)
+#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_AEOF          (0x2L<<4)
+#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_NEOF          (0x3L<<4)
+#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_SOF           (0x4L<<4)
+#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_SAEOF                 (0x6L<<4)
+#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_SNEOF                 (0x7L<<4)
+#define BNX2_EMAC_RXMAC_DEBUG5_EOF_DETECTED             (1L<<7)
+#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF0               (0x7L<<8)
+#define BNX2_EMAC_RXMAC_DEBUG5_RPM_IDI_FIFO_FULL        (1L<<11)
+#define BNX2_EMAC_RXMAC_DEBUG5_LOAD_CCODE               (1L<<12)
+#define BNX2_EMAC_RXMAC_DEBUG5_LOAD_DATA                (1L<<13)
+#define BNX2_EMAC_RXMAC_DEBUG5_LOAD_STAT                (1L<<14)
+#define BNX2_EMAC_RXMAC_DEBUG5_CLR_STAT                         (1L<<15)
+#define BNX2_EMAC_RXMAC_DEBUG5_IDI_RPM_CCODE            (0x3L<<16)
+#define BNX2_EMAC_RXMAC_DEBUG5_IDI_RPM_ACCEPT           (1L<<19)
+#define BNX2_EMAC_RXMAC_DEBUG5_FMLEN                    (0xfffL<<20)
+
+#define BNX2_EMAC_RX_STAT_AC0                          0x00001580
+#define BNX2_EMAC_RX_STAT_AC1                          0x00001584
+#define BNX2_EMAC_RX_STAT_AC2                          0x00001588
+#define BNX2_EMAC_RX_STAT_AC3                          0x0000158c
+#define BNX2_EMAC_RX_STAT_AC4                          0x00001590
+#define BNX2_EMAC_RX_STAT_AC5                          0x00001594
+#define BNX2_EMAC_RX_STAT_AC6                          0x00001598
+#define BNX2_EMAC_RX_STAT_AC7                          0x0000159c
+#define BNX2_EMAC_RX_STAT_AC8                          0x000015a0
+#define BNX2_EMAC_RX_STAT_AC9                          0x000015a4
+#define BNX2_EMAC_RX_STAT_AC10                         0x000015a8
+#define BNX2_EMAC_RX_STAT_AC11                         0x000015ac
+#define BNX2_EMAC_RX_STAT_AC12                         0x000015b0
+#define BNX2_EMAC_RX_STAT_AC13                         0x000015b4
+#define BNX2_EMAC_RX_STAT_AC14                         0x000015b8
+#define BNX2_EMAC_RX_STAT_AC15                         0x000015bc
+#define BNX2_EMAC_RX_STAT_AC16                         0x000015c0
+#define BNX2_EMAC_RX_STAT_AC17                         0x000015c4
+#define BNX2_EMAC_RX_STAT_AC18                         0x000015c8
+#define BNX2_EMAC_RX_STAT_AC19                         0x000015cc
+#define BNX2_EMAC_RX_STAT_AC20                         0x000015d0
+#define BNX2_EMAC_RX_STAT_AC21                         0x000015d4
+#define BNX2_EMAC_RX_STAT_AC22                         0x000015d8
+#define BNX2_EMAC_RXMAC_SUC_DBG_OVERRUNVEC             0x000015dc
+#define BNX2_EMAC_TX_STAT_IFHCOUTOCTETS                        0x00001600
+#define BNX2_EMAC_TX_STAT_IFHCOUTBADOCTETS             0x00001604
+#define BNX2_EMAC_TX_STAT_ETHERSTATSCOLLISIONS         0x00001608
+#define BNX2_EMAC_TX_STAT_OUTXONSENT                   0x0000160c
+#define BNX2_EMAC_TX_STAT_OUTXOFFSENT                  0x00001610
+#define BNX2_EMAC_TX_STAT_FLOWCONTROLDONE              0x00001614
+#define BNX2_EMAC_TX_STAT_DOT3STATSSINGLECOLLISIONFRAMES       0x00001618
+#define BNX2_EMAC_TX_STAT_DOT3STATSMULTIPLECOLLISIONFRAMES     0x0000161c
+#define BNX2_EMAC_TX_STAT_DOT3STATSDEFERREDTRANSMISSIONS       0x00001620
+#define BNX2_EMAC_TX_STAT_DOT3STATSEXCESSIVECOLLISIONS 0x00001624
+#define BNX2_EMAC_TX_STAT_DOT3STATSLATECOLLISIONS      0x00001628
+#define BNX2_EMAC_TX_STAT_IFHCOUTUCASTPKTS             0x0000162c
+#define BNX2_EMAC_TX_STAT_IFHCOUTMULTICASTPKTS         0x00001630
+#define BNX2_EMAC_TX_STAT_IFHCOUTBROADCASTPKTS         0x00001634
+#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTS64OCTETS       0x00001638
+#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTS65OCTETSTO127OCTETS    0x0000163c
+#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTS128OCTETSTO255OCTETS   0x00001640
+#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTS256OCTETSTO511OCTETS   0x00001644
+#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTS512OCTETSTO1023OCTETS  0x00001648
+#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTS1024OCTETSTO1522OCTETS 0x0000164c
+#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTS1523OCTETSTO9022OCTETS 0x00001650
+#define BNX2_EMAC_TX_STAT_DOT3STATSINTERNALMACTRANSMITERRORS   0x00001654
+#define BNX2_EMAC_TXMAC_DEBUG0                         0x00001658
+#define BNX2_EMAC_TXMAC_DEBUG1                         0x0000165c
+#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE                (0xfL<<0)
+#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_IDLE           (0x0L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_START0                 (0x1L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_DATA0          (0x4L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_DATA1          (0x5L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_DATA2          (0x6L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_DATA3          (0x7L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_WAIT0          (0x8L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_WAIT1          (0x9L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG1_CRS_ENABLE               (1L<<4)
+#define BNX2_EMAC_TXMAC_DEBUG1_BAD_CRC                  (1L<<5)
+#define BNX2_EMAC_TXMAC_DEBUG1_SE_COUNTER               (0xfL<<6)
+#define BNX2_EMAC_TXMAC_DEBUG1_SEND_PAUSE               (1L<<10)
+#define BNX2_EMAC_TXMAC_DEBUG1_LATE_COLLISION           (1L<<11)
+#define BNX2_EMAC_TXMAC_DEBUG1_MAX_DEFER                (1L<<12)
+#define BNX2_EMAC_TXMAC_DEBUG1_DEFERRED                         (1L<<13)
+#define BNX2_EMAC_TXMAC_DEBUG1_ONE_BYTE                         (1L<<14)
+#define BNX2_EMAC_TXMAC_DEBUG1_IPG_TIME                         (0xfL<<15)
+#define BNX2_EMAC_TXMAC_DEBUG1_SLOT_TIME                (0xffL<<19)
+
+#define BNX2_EMAC_TXMAC_DEBUG2                         0x00001660
+#define BNX2_EMAC_TXMAC_DEBUG2_BACK_OFF                         (0x3ffL<<0)
+#define BNX2_EMAC_TXMAC_DEBUG2_BYTE_COUNT               (0xffffL<<10)
+#define BNX2_EMAC_TXMAC_DEBUG2_COL_COUNT                (0x1fL<<26)
+#define BNX2_EMAC_TXMAC_DEBUG2_COL_BIT                  (1L<<31)
+
+#define BNX2_EMAC_TXMAC_DEBUG3                         0x00001664
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE                         (0xfL<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_IDLE            (0x0L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_PRE1            (0x1L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_PRE2            (0x2L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_SFD             (0x3L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_DATA            (0x4L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_CRC1            (0x5L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_CRC2            (0x6L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_EXT             (0x7L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_STATB           (0x8L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_STATG           (0x9L<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_JAM             (0xaL<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_EJAM            (0xbL<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_BJAM            (0xcL<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_SWAIT           (0xdL<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_BACKOFF                 (0xeL<<0)
+#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE               (0x7L<<4)
+#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_IDLE          (0x0L<<4)
+#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_WAIT          (0x1L<<4)
+#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_UNI           (0x2L<<4)
+#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_MC            (0x3L<<4)
+#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_BC2           (0x4L<<4)
+#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_BC3           (0x5L<<4)
+#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_BC            (0x6L<<4)
+#define BNX2_EMAC_TXMAC_DEBUG3_CRS_DONE                         (1L<<7)
+#define BNX2_EMAC_TXMAC_DEBUG3_XOFF                     (1L<<8)
+#define BNX2_EMAC_TXMAC_DEBUG3_SE_COUNTER               (0xfL<<9)
+#define BNX2_EMAC_TXMAC_DEBUG3_QUANTA_COUNTER           (0x1fL<<13)
+
+#define BNX2_EMAC_TXMAC_DEBUG4                         0x00001668
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_COUNTER            (0xffffL<<0)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE              (0xfL<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_IDLE                 (0x0L<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_MCA1                 (0x2L<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_MCA2                 (0x3L<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_MCA3                 (0x6L<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_SRC1                 (0x7L<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_SRC2                 (0x5L<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_SRC3                 (0x4L<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_TYPE                 (0xcL<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_CMD          (0xeL<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_TIME                 (0xaL<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_CRC1                 (0x8L<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_CRC2                 (0x9L<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_WAIT                 (0xdL<<16)
+#define BNX2_EMAC_TXMAC_DEBUG4_STATS0_VALID             (1L<<20)
+#define BNX2_EMAC_TXMAC_DEBUG4_APPEND_CRC               (1L<<21)
+#define BNX2_EMAC_TXMAC_DEBUG4_SLOT_FILLED              (1L<<22)
+#define BNX2_EMAC_TXMAC_DEBUG4_MAX_DEFER                (1L<<23)
+#define BNX2_EMAC_TXMAC_DEBUG4_SEND_EXTEND              (1L<<24)
+#define BNX2_EMAC_TXMAC_DEBUG4_SEND_PADDING             (1L<<25)
+#define BNX2_EMAC_TXMAC_DEBUG4_EOF_LOC                  (1L<<26)
+#define BNX2_EMAC_TXMAC_DEBUG4_COLLIDING                (1L<<27)
+#define BNX2_EMAC_TXMAC_DEBUG4_COL_IN                   (1L<<28)
+#define BNX2_EMAC_TXMAC_DEBUG4_BURSTING                         (1L<<29)
+#define BNX2_EMAC_TXMAC_DEBUG4_ADVANCE                  (1L<<30)
+#define BNX2_EMAC_TXMAC_DEBUG4_GO                       (1L<<31)
+
+#define BNX2_EMAC_TX_STAT_AC0                          0x00001680
+#define BNX2_EMAC_TX_STAT_AC1                          0x00001684
+#define BNX2_EMAC_TX_STAT_AC2                          0x00001688
+#define BNX2_EMAC_TX_STAT_AC3                          0x0000168c
+#define BNX2_EMAC_TX_STAT_AC4                          0x00001690
+#define BNX2_EMAC_TX_STAT_AC5                          0x00001694
+#define BNX2_EMAC_TX_STAT_AC6                          0x00001698
+#define BNX2_EMAC_TX_STAT_AC7                          0x0000169c
+#define BNX2_EMAC_TX_STAT_AC8                          0x000016a0
+#define BNX2_EMAC_TX_STAT_AC9                          0x000016a4
+#define BNX2_EMAC_TX_STAT_AC10                         0x000016a8
+#define BNX2_EMAC_TX_STAT_AC11                         0x000016ac
+#define BNX2_EMAC_TX_STAT_AC12                         0x000016b0
+#define BNX2_EMAC_TX_STAT_AC13                         0x000016b4
+#define BNX2_EMAC_TX_STAT_AC14                         0x000016b8
+#define BNX2_EMAC_TX_STAT_AC15                         0x000016bc
+#define BNX2_EMAC_TX_STAT_AC16                         0x000016c0
+#define BNX2_EMAC_TX_STAT_AC17                         0x000016c4
+#define BNX2_EMAC_TX_STAT_AC18                         0x000016c8
+#define BNX2_EMAC_TX_STAT_AC19                         0x000016cc
+#define BNX2_EMAC_TX_STAT_AC20                         0x000016d0
+#define BNX2_EMAC_TX_STAT_AC21                         0x000016d4
+#define BNX2_EMAC_TXMAC_SUC_DBG_OVERRUNVEC             0x000016d8
+
+
+/*
+ *  rpm_reg definition
+ *  offset: 0x1800
+ */
+#define BNX2_RPM_COMMAND                               0x00001800
+#define BNX2_RPM_COMMAND_ENABLED                        (1L<<0)
+#define BNX2_RPM_COMMAND_OVERRUN_ABORT                  (1L<<4)
+
+#define BNX2_RPM_STATUS                                        0x00001804
+#define BNX2_RPM_STATUS_MBUF_WAIT                       (1L<<0)
+#define BNX2_RPM_STATUS_FREE_WAIT                       (1L<<1)
+
+#define BNX2_RPM_CONFIG                                        0x00001808
+#define BNX2_RPM_CONFIG_NO_PSD_HDR_CKSUM                (1L<<0)
+#define BNX2_RPM_CONFIG_ACPI_ENA                        (1L<<1)
+#define BNX2_RPM_CONFIG_ACPI_KEEP                       (1L<<2)
+#define BNX2_RPM_CONFIG_MP_KEEP                                 (1L<<3)
+#define BNX2_RPM_CONFIG_SORT_VECT_VAL                   (0xfL<<4)
+#define BNX2_RPM_CONFIG_IGNORE_VLAN                     (1L<<31)
+
+#define BNX2_RPM_VLAN_MATCH0                           0x00001810
+#define BNX2_RPM_VLAN_MATCH0_RPM_VLAN_MTCH0_VALUE       (0xfffL<<0)
+
+#define BNX2_RPM_VLAN_MATCH1                           0x00001814
+#define BNX2_RPM_VLAN_MATCH1_RPM_VLAN_MTCH1_VALUE       (0xfffL<<0)
+
+#define BNX2_RPM_VLAN_MATCH2                           0x00001818
+#define BNX2_RPM_VLAN_MATCH2_RPM_VLAN_MTCH2_VALUE       (0xfffL<<0)
+
+#define BNX2_RPM_VLAN_MATCH3                           0x0000181c
+#define BNX2_RPM_VLAN_MATCH3_RPM_VLAN_MTCH3_VALUE       (0xfffL<<0)
+
+#define BNX2_RPM_SORT_USER0                            0x00001820
+#define BNX2_RPM_SORT_USER0_PM_EN                       (0xffffL<<0)
+#define BNX2_RPM_SORT_USER0_BC_EN                       (1L<<16)
+#define BNX2_RPM_SORT_USER0_MC_EN                       (1L<<17)
+#define BNX2_RPM_SORT_USER0_MC_HSH_EN                   (1L<<18)
+#define BNX2_RPM_SORT_USER0_PROM_EN                     (1L<<19)
+#define BNX2_RPM_SORT_USER0_VLAN_EN                     (0xfL<<20)
+#define BNX2_RPM_SORT_USER0_PROM_VLAN                   (1L<<24)
+#define BNX2_RPM_SORT_USER0_ENA                                 (1L<<31)
+
+#define BNX2_RPM_SORT_USER1                            0x00001824
+#define BNX2_RPM_SORT_USER1_PM_EN                       (0xffffL<<0)
+#define BNX2_RPM_SORT_USER1_BC_EN                       (1L<<16)
+#define BNX2_RPM_SORT_USER1_MC_EN                       (1L<<17)
+#define BNX2_RPM_SORT_USER1_MC_HSH_EN                   (1L<<18)
+#define BNX2_RPM_SORT_USER1_PROM_EN                     (1L<<19)
+#define BNX2_RPM_SORT_USER1_VLAN_EN                     (0xfL<<20)
+#define BNX2_RPM_SORT_USER1_PROM_VLAN                   (1L<<24)
+#define BNX2_RPM_SORT_USER1_ENA                                 (1L<<31)
+
+#define BNX2_RPM_SORT_USER2                            0x00001828
+#define BNX2_RPM_SORT_USER2_PM_EN                       (0xffffL<<0)
+#define BNX2_RPM_SORT_USER2_BC_EN                       (1L<<16)
+#define BNX2_RPM_SORT_USER2_MC_EN                       (1L<<17)
+#define BNX2_RPM_SORT_USER2_MC_HSH_EN                   (1L<<18)
+#define BNX2_RPM_SORT_USER2_PROM_EN                     (1L<<19)
+#define BNX2_RPM_SORT_USER2_VLAN_EN                     (0xfL<<20)
+#define BNX2_RPM_SORT_USER2_PROM_VLAN                   (1L<<24)
+#define BNX2_RPM_SORT_USER2_ENA                                 (1L<<31)
+
+#define BNX2_RPM_SORT_USER3                            0x0000182c
+#define BNX2_RPM_SORT_USER3_PM_EN                       (0xffffL<<0)
+#define BNX2_RPM_SORT_USER3_BC_EN                       (1L<<16)
+#define BNX2_RPM_SORT_USER3_MC_EN                       (1L<<17)
+#define BNX2_RPM_SORT_USER3_MC_HSH_EN                   (1L<<18)
+#define BNX2_RPM_SORT_USER3_PROM_EN                     (1L<<19)
+#define BNX2_RPM_SORT_USER3_VLAN_EN                     (0xfL<<20)
+#define BNX2_RPM_SORT_USER3_PROM_VLAN                   (1L<<24)
+#define BNX2_RPM_SORT_USER3_ENA                                 (1L<<31)
+
+#define BNX2_RPM_STAT_L2_FILTER_DISCARDS               0x00001840
+#define BNX2_RPM_STAT_RULE_CHECKER_DISCARDS            0x00001844
+#define BNX2_RPM_STAT_IFINFTQDISCARDS                  0x00001848
+#define BNX2_RPM_STAT_IFINMBUFDISCARD                  0x0000184c
+#define BNX2_RPM_STAT_RULE_CHECKER_P4_HIT              0x00001850
+#define BNX2_RPM_STAT_AC0                              0x00001880
+#define BNX2_RPM_STAT_AC1                              0x00001884
+#define BNX2_RPM_STAT_AC2                              0x00001888
+#define BNX2_RPM_STAT_AC3                              0x0000188c
+#define BNX2_RPM_STAT_AC4                              0x00001890
+#define BNX2_RPM_RC_CNTL_0                             0x00001900
+#define BNX2_RPM_RC_CNTL_0_OFFSET                       (0xffL<<0)
+#define BNX2_RPM_RC_CNTL_0_CLASS                        (0x7L<<8)
+#define BNX2_RPM_RC_CNTL_0_PRIORITY                     (1L<<11)
+#define BNX2_RPM_RC_CNTL_0_P4                           (1L<<12)
+#define BNX2_RPM_RC_CNTL_0_HDR_TYPE                     (0x7L<<13)
+#define BNX2_RPM_RC_CNTL_0_HDR_TYPE_START               (0L<<13)
+#define BNX2_RPM_RC_CNTL_0_HDR_TYPE_IP                  (1L<<13)
+#define BNX2_RPM_RC_CNTL_0_HDR_TYPE_TCP                         (2L<<13)
+#define BNX2_RPM_RC_CNTL_0_HDR_TYPE_UDP                         (3L<<13)
+#define BNX2_RPM_RC_CNTL_0_HDR_TYPE_DATA                (4L<<13)
+#define BNX2_RPM_RC_CNTL_0_COMP                                 (0x3L<<16)
+#define BNX2_RPM_RC_CNTL_0_COMP_EQUAL                   (0L<<16)
+#define BNX2_RPM_RC_CNTL_0_COMP_NEQUAL                  (1L<<16)
+#define BNX2_RPM_RC_CNTL_0_COMP_GREATER                         (2L<<16)
+#define BNX2_RPM_RC_CNTL_0_COMP_LESS                    (3L<<16)
+#define BNX2_RPM_RC_CNTL_0_SBIT                                 (1L<<19)
+#define BNX2_RPM_RC_CNTL_0_CMDSEL                       (0xfL<<20)
+#define BNX2_RPM_RC_CNTL_0_MAP                          (1L<<24)
+#define BNX2_RPM_RC_CNTL_0_DISCARD                      (1L<<25)
+#define BNX2_RPM_RC_CNTL_0_MASK                                 (1L<<26)
+#define BNX2_RPM_RC_CNTL_0_P1                           (1L<<27)
+#define BNX2_RPM_RC_CNTL_0_P2                           (1L<<28)
+#define BNX2_RPM_RC_CNTL_0_P3                           (1L<<29)
+#define BNX2_RPM_RC_CNTL_0_NBIT                                 (1L<<30)
+
+#define BNX2_RPM_RC_VALUE_MASK_0                       0x00001904
+#define BNX2_RPM_RC_VALUE_MASK_0_VALUE                  (0xffffL<<0)
+#define BNX2_RPM_RC_VALUE_MASK_0_MASK                   (0xffffL<<16)
+
+#define BNX2_RPM_RC_CNTL_1                             0x00001908
+#define BNX2_RPM_RC_CNTL_1_A                            (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_1_B                            (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_1                       0x0000190c
+#define BNX2_RPM_RC_CNTL_2                             0x00001910
+#define BNX2_RPM_RC_CNTL_2_A                            (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_2_B                            (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_2                       0x00001914
+#define BNX2_RPM_RC_CNTL_3                             0x00001918
+#define BNX2_RPM_RC_CNTL_3_A                            (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_3_B                            (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_3                       0x0000191c
+#define BNX2_RPM_RC_CNTL_4                             0x00001920
+#define BNX2_RPM_RC_CNTL_4_A                            (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_4_B                            (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_4                       0x00001924
+#define BNX2_RPM_RC_CNTL_5                             0x00001928
+#define BNX2_RPM_RC_CNTL_5_A                            (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_5_B                            (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_5                       0x0000192c
+#define BNX2_RPM_RC_CNTL_6                             0x00001930
+#define BNX2_RPM_RC_CNTL_6_A                            (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_6_B                            (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_6                       0x00001934
+#define BNX2_RPM_RC_CNTL_7                             0x00001938
+#define BNX2_RPM_RC_CNTL_7_A                            (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_7_B                            (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_7                       0x0000193c
+#define BNX2_RPM_RC_CNTL_8                             0x00001940
+#define BNX2_RPM_RC_CNTL_8_A                            (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_8_B                            (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_8                       0x00001944
+#define BNX2_RPM_RC_CNTL_9                             0x00001948
+#define BNX2_RPM_RC_CNTL_9_A                            (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_9_B                            (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_9                       0x0000194c
+#define BNX2_RPM_RC_CNTL_10                            0x00001950
+#define BNX2_RPM_RC_CNTL_10_A                           (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_10_B                           (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_10                      0x00001954
+#define BNX2_RPM_RC_CNTL_11                            0x00001958
+#define BNX2_RPM_RC_CNTL_11_A                           (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_11_B                           (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_11                      0x0000195c
+#define BNX2_RPM_RC_CNTL_12                            0x00001960
+#define BNX2_RPM_RC_CNTL_12_A                           (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_12_B                           (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_12                      0x00001964
+#define BNX2_RPM_RC_CNTL_13                            0x00001968
+#define BNX2_RPM_RC_CNTL_13_A                           (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_13_B                           (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_13                      0x0000196c
+#define BNX2_RPM_RC_CNTL_14                            0x00001970
+#define BNX2_RPM_RC_CNTL_14_A                           (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_14_B                           (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_14                      0x00001974
+#define BNX2_RPM_RC_CNTL_15                            0x00001978
+#define BNX2_RPM_RC_CNTL_15_A                           (0x3ffffL<<0)
+#define BNX2_RPM_RC_CNTL_15_B                           (0xfffL<<19)
+
+#define BNX2_RPM_RC_VALUE_MASK_15                      0x0000197c
+#define BNX2_RPM_RC_CONFIG                             0x00001980
+#define BNX2_RPM_RC_CONFIG_RULE_ENABLE                  (0xffffL<<0)
+#define BNX2_RPM_RC_CONFIG_DEF_CLASS                    (0x7L<<24)
+
+#define BNX2_RPM_DEBUG0                                        0x00001984
+#define BNX2_RPM_DEBUG0_FM_BCNT                                 (0xffffL<<0)
+#define BNX2_RPM_DEBUG0_T_DATA_OFST_VLD                         (1L<<16)
+#define BNX2_RPM_DEBUG0_T_UDP_OFST_VLD                  (1L<<17)
+#define BNX2_RPM_DEBUG0_T_TCP_OFST_VLD                  (1L<<18)
+#define BNX2_RPM_DEBUG0_T_IP_OFST_VLD                   (1L<<19)
+#define BNX2_RPM_DEBUG0_IP_MORE_FRGMT                   (1L<<20)
+#define BNX2_RPM_DEBUG0_T_IP_NO_TCP_UDP_HDR             (1L<<21)
+#define BNX2_RPM_DEBUG0_LLC_SNAP                        (1L<<22)
+#define BNX2_RPM_DEBUG0_FM_STARTED                      (1L<<23)
+#define BNX2_RPM_DEBUG0_DONE                            (1L<<24)
+#define BNX2_RPM_DEBUG0_WAIT_4_DONE                     (1L<<25)
+#define BNX2_RPM_DEBUG0_USE_TPBUF_CKSUM                         (1L<<26)
+#define BNX2_RPM_DEBUG0_RX_NO_PSD_HDR_CKSUM             (1L<<27)
+#define BNX2_RPM_DEBUG0_IGNORE_VLAN                     (1L<<28)
+#define BNX2_RPM_DEBUG0_RP_ENA_ACTIVE                   (1L<<31)
+
+#define BNX2_RPM_DEBUG1                                        0x00001988
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST                      (0xffffL<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_IDLE                         (0L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ETYPE_B6_ALL                 (1L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ETYPE_B2_IPLLC       (2L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ETYPE_B6_IP          (4L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ETYPE_B2_IP          (8L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_IP_START             (16L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_IP                   (32L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_TCP                  (64L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_UDP                  (128L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_AH                   (256L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ESP                  (512L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ESP_PAYLOAD          (1024L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_DATA                         (2048L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ADD_CARRY            (0x2000L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ADD_CARRYOUT                 (0x4000L<<0)
+#define BNX2_RPM_DEBUG1_FSM_CUR_ST_LATCH_RESULT                 (0x8000L<<0)
+#define BNX2_RPM_DEBUG1_HDR_BCNT                        (0x7ffL<<16)
+#define BNX2_RPM_DEBUG1_UNKNOWN_ETYPE_D                         (1L<<28)
+#define BNX2_RPM_DEBUG1_VLAN_REMOVED_D2                         (1L<<29)
+#define BNX2_RPM_DEBUG1_VLAN_REMOVED_D1                         (1L<<30)
+#define BNX2_RPM_DEBUG1_EOF_0XTRA_WD                    (1L<<31)
+
+#define BNX2_RPM_DEBUG2                                        0x0000198c
+#define BNX2_RPM_DEBUG2_CMD_HIT_VEC                     (0xffffL<<0)
+#define BNX2_RPM_DEBUG2_IP_BCNT                                 (0xffL<<16)
+#define BNX2_RPM_DEBUG2_THIS_CMD_M4                     (1L<<24)
+#define BNX2_RPM_DEBUG2_THIS_CMD_M3                     (1L<<25)
+#define BNX2_RPM_DEBUG2_THIS_CMD_M2                     (1L<<26)
+#define BNX2_RPM_DEBUG2_THIS_CMD_M1                     (1L<<27)
+#define BNX2_RPM_DEBUG2_IPIPE_EMPTY                     (1L<<28)
+#define BNX2_RPM_DEBUG2_FM_DISCARD                      (1L<<29)
+#define BNX2_RPM_DEBUG2_LAST_RULE_IN_FM_D2              (1L<<30)
+#define BNX2_RPM_DEBUG2_LAST_RULE_IN_FM_D1              (1L<<31)
+
+#define BNX2_RPM_DEBUG3                                        0x00001990
+#define BNX2_RPM_DEBUG3_AVAIL_MBUF_PTR                  (0x1ffL<<0)
+#define BNX2_RPM_DEBUG3_RDE_RLUPQ_WR_REQ_INT            (1L<<9)
+#define BNX2_RPM_DEBUG3_RDE_RBUF_WR_LAST_INT            (1L<<10)
+#define BNX2_RPM_DEBUG3_RDE_RBUF_WR_REQ_INT             (1L<<11)
+#define BNX2_RPM_DEBUG3_RDE_RBUF_FREE_REQ               (1L<<12)
+#define BNX2_RPM_DEBUG3_RDE_RBUF_ALLOC_REQ              (1L<<13)
+#define BNX2_RPM_DEBUG3_DFSM_MBUF_NOTAVAIL              (1L<<14)
+#define BNX2_RPM_DEBUG3_RBUF_RDE_SOF_DROP               (1L<<15)
+#define BNX2_RPM_DEBUG3_DFIFO_VLD_ENTRY_CT              (0xfL<<16)
+#define BNX2_RPM_DEBUG3_RDE_SRC_FIFO_ALMFULL            (1L<<21)
+#define BNX2_RPM_DEBUG3_DROP_NXT_VLD                    (1L<<22)
+#define BNX2_RPM_DEBUG3_DROP_NXT                        (1L<<23)
+#define BNX2_RPM_DEBUG3_FTQ_FSM                                 (0x3L<<24)
+#define BNX2_RPM_DEBUG3_FTQ_FSM_IDLE                    (0x0L<<24)
+#define BNX2_RPM_DEBUG3_FTQ_FSM_WAIT_ACK                (0x1L<<24)
+#define BNX2_RPM_DEBUG3_FTQ_FSM_WAIT_FREE               (0x2L<<24)
+#define BNX2_RPM_DEBUG3_MBWRITE_FSM                     (0x3L<<26)
+#define BNX2_RPM_DEBUG3_MBWRITE_FSM_WAIT_SOF            (0x0L<<26)
+#define BNX2_RPM_DEBUG3_MBWRITE_FSM_GET_MBUF            (0x1L<<26)
+#define BNX2_RPM_DEBUG3_MBWRITE_FSM_DMA_DATA            (0x2L<<26)
+#define BNX2_RPM_DEBUG3_MBWRITE_FSM_WAIT_DATA           (0x3L<<26)
+#define BNX2_RPM_DEBUG3_MBWRITE_FSM_WAIT_EOF            (0x4L<<26)
+#define BNX2_RPM_DEBUG3_MBWRITE_FSM_WAIT_MF_ACK                 (0x5L<<26)
+#define BNX2_RPM_DEBUG3_MBWRITE_FSM_WAIT_DROP_NXT_VLD   (0x6L<<26)
+#define BNX2_RPM_DEBUG3_MBWRITE_FSM_DONE                (0x7L<<26)
+#define BNX2_RPM_DEBUG3_MBFREE_FSM                      (1L<<29)
+#define BNX2_RPM_DEBUG3_MBFREE_FSM_IDLE                         (0L<<29)
+#define BNX2_RPM_DEBUG3_MBFREE_FSM_WAIT_ACK             (1L<<29)
+#define BNX2_RPM_DEBUG3_MBALLOC_FSM                     (1L<<30)
+#define BNX2_RPM_DEBUG3_MBALLOC_FSM_ET_MBUF             (0x0L<<30)
+#define BNX2_RPM_DEBUG3_MBALLOC_FSM_IVE_MBUF            (0x1L<<30)
+#define BNX2_RPM_DEBUG3_CCODE_EOF_ERROR                         (1L<<31)
+
+#define BNX2_RPM_DEBUG4                                        0x00001994
+#define BNX2_RPM_DEBUG4_DFSM_MBUF_CLUSTER               (0x1ffffffL<<0)
+#define BNX2_RPM_DEBUG4_DFIFO_CUR_CCODE                         (0x7L<<25)
+#define BNX2_RPM_DEBUG4_MBWRITE_FSM                     (0x7L<<28)
+#define BNX2_RPM_DEBUG4_DFIFO_EMPTY                     (1L<<31)
+
+#define BNX2_RPM_DEBUG5                                        0x00001998
+#define BNX2_RPM_DEBUG5_RDROP_WPTR                      (0x1fL<<0)
+#define BNX2_RPM_DEBUG5_RDROP_ACPI_RPTR                         (0x1fL<<5)
+#define BNX2_RPM_DEBUG5_RDROP_MC_RPTR                   (0x1fL<<10)
+#define BNX2_RPM_DEBUG5_RDROP_RC_RPTR                   (0x1fL<<15)
+#define BNX2_RPM_DEBUG5_RDROP_ACPI_EMPTY                (1L<<20)
+#define BNX2_RPM_DEBUG5_RDROP_MC_EMPTY                  (1L<<21)
+#define BNX2_RPM_DEBUG5_RDROP_AEOF_VEC_AT_RDROP_MC_RPTR         (1L<<22)
+#define BNX2_RPM_DEBUG5_HOLDREG_WOL_DROP_INT            (1L<<23)
+#define BNX2_RPM_DEBUG5_HOLDREG_DISCARD                         (1L<<24)
+#define BNX2_RPM_DEBUG5_HOLDREG_MBUF_NOTAVAIL           (1L<<25)
+#define BNX2_RPM_DEBUG5_HOLDREG_MC_EMPTY                (1L<<26)
+#define BNX2_RPM_DEBUG5_HOLDREG_RC_EMPTY                (1L<<27)
+#define BNX2_RPM_DEBUG5_HOLDREG_FC_EMPTY                (1L<<28)
+#define BNX2_RPM_DEBUG5_HOLDREG_ACPI_EMPTY              (1L<<29)
+#define BNX2_RPM_DEBUG5_HOLDREG_FULL_T                  (1L<<30)
+#define BNX2_RPM_DEBUG5_HOLDREG_RD                      (1L<<31)
+
+#define BNX2_RPM_DEBUG6                                        0x0000199c
+#define BNX2_RPM_DEBUG6_ACPI_VEC                        (0xffffL<<0)
+#define BNX2_RPM_DEBUG6_VEC                             (0xffffL<<16)
+
+#define BNX2_RPM_DEBUG7                                        0x000019a0
+#define BNX2_RPM_DEBUG7_RPM_DBG7_LAST_CRC               (0xffffffffL<<0)
+
+#define BNX2_RPM_DEBUG8                                        0x000019a4
+#define BNX2_RPM_DEBUG8_PS_ACPI_FSM                     (0xfL<<0)
+#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_IDLE                (0L<<0)
+#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_SOF_W1_ADDR                 (1L<<0)
+#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_SOF_W2_ADDR                 (2L<<0)
+#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_SOF_W3_ADDR                 (3L<<0)
+#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_SOF_WAIT_THBUF      (4L<<0)
+#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_W3_DATA             (5L<<0)
+#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_W0_ADDR             (6L<<0)
+#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_W1_ADDR             (7L<<0)
+#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_W2_ADDR             (8L<<0)
+#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_W3_ADDR             (9L<<0)
+#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_WAIT_THBUF          (10L<<0)
+#define BNX2_RPM_DEBUG8_COMPARE_AT_W0                   (1L<<4)
+#define BNX2_RPM_DEBUG8_COMPARE_AT_W3_DATA              (1L<<5)
+#define BNX2_RPM_DEBUG8_COMPARE_AT_SOF_WAIT             (1L<<6)
+#define BNX2_RPM_DEBUG8_COMPARE_AT_SOF_W3               (1L<<7)
+#define BNX2_RPM_DEBUG8_COMPARE_AT_SOF_W2               (1L<<8)
+#define BNX2_RPM_DEBUG8_EOF_W_LTEQ6_VLDBYTES            (1L<<9)
+#define BNX2_RPM_DEBUG8_EOF_W_LTEQ4_VLDBYTES            (1L<<10)
+#define BNX2_RPM_DEBUG8_NXT_EOF_W_12_VLDBYTES           (1L<<11)
+#define BNX2_RPM_DEBUG8_EOF_DET                                 (1L<<12)
+#define BNX2_RPM_DEBUG8_SOF_DET                                 (1L<<13)
+#define BNX2_RPM_DEBUG8_WAIT_4_SOF                      (1L<<14)
+#define BNX2_RPM_DEBUG8_ALL_DONE                        (1L<<15)
+#define BNX2_RPM_DEBUG8_THBUF_ADDR                      (0x7fL<<16)
+#define BNX2_RPM_DEBUG8_BYTE_CTR                        (0xffL<<24)
+
+#define BNX2_RPM_DEBUG9                                        0x000019a8
+#define BNX2_RPM_DEBUG9_OUTFIFO_COUNT                   (0x7L<<0)
+#define BNX2_RPM_DEBUG9_RDE_ACPI_RDY                    (1L<<3)
+#define BNX2_RPM_DEBUG9_VLD_RD_ENTRY_CT                         (0x7L<<4)
+#define BNX2_RPM_DEBUG9_OUTFIFO_OVERRUN_OCCURRED        (1L<<28)
+#define BNX2_RPM_DEBUG9_INFIFO_OVERRUN_OCCURRED                 (1L<<29)
+#define BNX2_RPM_DEBUG9_ACPI_MATCH_INT                  (1L<<30)
+#define BNX2_RPM_DEBUG9_ACPI_ENABLE_SYN                         (1L<<31)
+
+#define BNX2_RPM_ACPI_DBG_BUF_W00                      0x000019c0
+#define BNX2_RPM_ACPI_DBG_BUF_W01                      0x000019c4
+#define BNX2_RPM_ACPI_DBG_BUF_W02                      0x000019c8
+#define BNX2_RPM_ACPI_DBG_BUF_W03                      0x000019cc
+#define BNX2_RPM_ACPI_DBG_BUF_W10                      0x000019d0
+#define BNX2_RPM_ACPI_DBG_BUF_W11                      0x000019d4
+#define BNX2_RPM_ACPI_DBG_BUF_W12                      0x000019d8
+#define BNX2_RPM_ACPI_DBG_BUF_W13                      0x000019dc
+#define BNX2_RPM_ACPI_DBG_BUF_W20                      0x000019e0
+#define BNX2_RPM_ACPI_DBG_BUF_W21                      0x000019e4
+#define BNX2_RPM_ACPI_DBG_BUF_W22                      0x000019e8
+#define BNX2_RPM_ACPI_DBG_BUF_W23                      0x000019ec
+#define BNX2_RPM_ACPI_DBG_BUF_W30                      0x000019f0
+#define BNX2_RPM_ACPI_DBG_BUF_W31                      0x000019f4
+#define BNX2_RPM_ACPI_DBG_BUF_W32                      0x000019f8
+#define BNX2_RPM_ACPI_DBG_BUF_W33                      0x000019fc
+
+
+/*
+ *  rbuf_reg definition
+ *  offset: 0x200000
+ */
+#define BNX2_RBUF_COMMAND                              0x00200000
+#define BNX2_RBUF_COMMAND_ENABLED                       (1L<<0)
+#define BNX2_RBUF_COMMAND_FREE_INIT                     (1L<<1)
+#define BNX2_RBUF_COMMAND_RAM_INIT                      (1L<<2)
+#define BNX2_RBUF_COMMAND_OVER_FREE                     (1L<<4)
+#define BNX2_RBUF_COMMAND_ALLOC_REQ                     (1L<<5)
+
+#define BNX2_RBUF_STATUS1                              0x00200004
+#define BNX2_RBUF_STATUS1_FREE_COUNT                    (0x3ffL<<0)
+
+#define BNX2_RBUF_STATUS2                              0x00200008
+#define BNX2_RBUF_STATUS2_FREE_TAIL                     (0x3ffL<<0)
+#define BNX2_RBUF_STATUS2_FREE_HEAD                     (0x3ffL<<16)
+
+#define BNX2_RBUF_CONFIG                               0x0020000c
+#define BNX2_RBUF_CONFIG_XOFF_TRIP                      (0x3ffL<<0)
+#define BNX2_RBUF_CONFIG_XON_TRIP                       (0x3ffL<<16)
+
+#define BNX2_RBUF_FW_BUF_ALLOC                         0x00200010
+#define BNX2_RBUF_FW_BUF_ALLOC_VALUE                    (0x1ffL<<7)
+
+#define BNX2_RBUF_FW_BUF_FREE                          0x00200014
+#define BNX2_RBUF_FW_BUF_FREE_COUNT                     (0x7fL<<0)
+#define BNX2_RBUF_FW_BUF_FREE_TAIL                      (0x1ffL<<7)
+#define BNX2_RBUF_FW_BUF_FREE_HEAD                      (0x1ffL<<16)
+
+#define BNX2_RBUF_FW_BUF_SEL                           0x00200018
+#define BNX2_RBUF_FW_BUF_SEL_COUNT                      (0x7fL<<0)
+#define BNX2_RBUF_FW_BUF_SEL_TAIL                       (0x1ffL<<7)
+#define BNX2_RBUF_FW_BUF_SEL_HEAD                       (0x1ffL<<16)
+
+#define BNX2_RBUF_CONFIG2                              0x0020001c
+#define BNX2_RBUF_CONFIG2_MAC_DROP_TRIP                         (0x3ffL<<0)
+#define BNX2_RBUF_CONFIG2_MAC_KEEP_TRIP                         (0x3ffL<<16)
+
+#define BNX2_RBUF_CONFIG3                              0x00200020
+#define BNX2_RBUF_CONFIG3_CU_DROP_TRIP                  (0x3ffL<<0)
+#define BNX2_RBUF_CONFIG3_CU_KEEP_TRIP                  (0x3ffL<<16)
+
+#define BNX2_RBUF_PKT_DATA                             0x00208000
+#define BNX2_RBUF_CLIST_DATA                           0x00210000
+#define BNX2_RBUF_BUF_DATA                             0x00220000
+
+
+/*
+ *  rv2p_reg definition
+ *  offset: 0x2800
+ */
+#define BNX2_RV2P_COMMAND                              0x00002800
+#define BNX2_RV2P_COMMAND_ENABLED                       (1L<<0)
+#define BNX2_RV2P_COMMAND_PROC1_INTRPT                  (1L<<1)
+#define BNX2_RV2P_COMMAND_PROC2_INTRPT                  (1L<<2)
+#define BNX2_RV2P_COMMAND_ABORT0                        (1L<<4)
+#define BNX2_RV2P_COMMAND_ABORT1                        (1L<<5)
+#define BNX2_RV2P_COMMAND_ABORT2                        (1L<<6)
+#define BNX2_RV2P_COMMAND_ABORT3                        (1L<<7)
+#define BNX2_RV2P_COMMAND_ABORT4                        (1L<<8)
+#define BNX2_RV2P_COMMAND_ABORT5                        (1L<<9)
+#define BNX2_RV2P_COMMAND_PROC1_RESET                   (1L<<16)
+#define BNX2_RV2P_COMMAND_PROC2_RESET                   (1L<<17)
+#define BNX2_RV2P_COMMAND_CTXIF_RESET                   (1L<<18)
+
+#define BNX2_RV2P_STATUS                               0x00002804
+#define BNX2_RV2P_STATUS_ALWAYS_0                       (1L<<0)
+#define BNX2_RV2P_STATUS_RV2P_GEN_STAT0_CNT             (1L<<8)
+#define BNX2_RV2P_STATUS_RV2P_GEN_STAT1_CNT             (1L<<9)
+#define BNX2_RV2P_STATUS_RV2P_GEN_STAT2_CNT             (1L<<10)
+#define BNX2_RV2P_STATUS_RV2P_GEN_STAT3_CNT             (1L<<11)
+#define BNX2_RV2P_STATUS_RV2P_GEN_STAT4_CNT             (1L<<12)
+#define BNX2_RV2P_STATUS_RV2P_GEN_STAT5_CNT             (1L<<13)
+
+#define BNX2_RV2P_CONFIG                               0x00002808
+#define BNX2_RV2P_CONFIG_STALL_PROC1                    (1L<<0)
+#define BNX2_RV2P_CONFIG_STALL_PROC2                    (1L<<1)
+#define BNX2_RV2P_CONFIG_PROC1_STALL_ON_ABORT0          (1L<<8)
+#define BNX2_RV2P_CONFIG_PROC1_STALL_ON_ABORT1          (1L<<9)
+#define BNX2_RV2P_CONFIG_PROC1_STALL_ON_ABORT2          (1L<<10)
+#define BNX2_RV2P_CONFIG_PROC1_STALL_ON_ABORT3          (1L<<11)
+#define BNX2_RV2P_CONFIG_PROC1_STALL_ON_ABORT4          (1L<<12)
+#define BNX2_RV2P_CONFIG_PROC1_STALL_ON_ABORT5          (1L<<13)
+#define BNX2_RV2P_CONFIG_PROC2_STALL_ON_ABORT0          (1L<<16)
+#define BNX2_RV2P_CONFIG_PROC2_STALL_ON_ABORT1          (1L<<17)
+#define BNX2_RV2P_CONFIG_PROC2_STALL_ON_ABORT2          (1L<<18)
+#define BNX2_RV2P_CONFIG_PROC2_STALL_ON_ABORT3          (1L<<19)
+#define BNX2_RV2P_CONFIG_PROC2_STALL_ON_ABORT4          (1L<<20)
+#define BNX2_RV2P_CONFIG_PROC2_STALL_ON_ABORT5          (1L<<21)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE                      (0xfL<<24)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE_256                  (0L<<24)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE_512                  (1L<<24)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE_1K                   (2L<<24)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE_2K                   (3L<<24)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE_4K                   (4L<<24)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE_8K                   (5L<<24)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE_16K                  (6L<<24)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE_32K                  (7L<<24)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE_64K                  (8L<<24)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE_128K                         (9L<<24)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE_256K                         (10L<<24)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE_512K                         (11L<<24)
+#define BNX2_RV2P_CONFIG_PAGE_SIZE_1M                   (12L<<24)
+
+#define BNX2_RV2P_GEN_BFR_ADDR_0                       0x00002810
+#define BNX2_RV2P_GEN_BFR_ADDR_0_VALUE                  (0xffffL<<16)
+
+#define BNX2_RV2P_GEN_BFR_ADDR_1                       0x00002814
+#define BNX2_RV2P_GEN_BFR_ADDR_1_VALUE                  (0xffffL<<16)
+
+#define BNX2_RV2P_GEN_BFR_ADDR_2                       0x00002818
+#define BNX2_RV2P_GEN_BFR_ADDR_2_VALUE                  (0xffffL<<16)
+
+#define BNX2_RV2P_GEN_BFR_ADDR_3                       0x0000281c
+#define BNX2_RV2P_GEN_BFR_ADDR_3_VALUE                  (0xffffL<<16)
+
+#define BNX2_RV2P_INSTR_HIGH                           0x00002830
+#define BNX2_RV2P_INSTR_HIGH_HIGH                       (0x1fL<<0)
+
+#define BNX2_RV2P_INSTR_LOW                            0x00002834
+#define BNX2_RV2P_PROC1_ADDR_CMD                       0x00002838
+#define BNX2_RV2P_PROC1_ADDR_CMD_ADD                    (0x3ffL<<0)
+#define BNX2_RV2P_PROC1_ADDR_CMD_RDWR                   (1L<<31)
+
+#define BNX2_RV2P_PROC2_ADDR_CMD                       0x0000283c
+#define BNX2_RV2P_PROC2_ADDR_CMD_ADD                    (0x3ffL<<0)
+#define BNX2_RV2P_PROC2_ADDR_CMD_RDWR                   (1L<<31)
+
+#define BNX2_RV2P_PROC1_GRC_DEBUG                      0x00002840
+#define BNX2_RV2P_PROC2_GRC_DEBUG                      0x00002844
+#define BNX2_RV2P_GRC_PROC_DEBUG                       0x00002848
+#define BNX2_RV2P_DEBUG_VECT_PEEK                      0x0000284c
+#define BNX2_RV2P_DEBUG_VECT_PEEK_1_VALUE               (0x7ffL<<0)
+#define BNX2_RV2P_DEBUG_VECT_PEEK_1_PEEK_EN             (1L<<11)
+#define BNX2_RV2P_DEBUG_VECT_PEEK_1_SEL                         (0xfL<<12)
+#define BNX2_RV2P_DEBUG_VECT_PEEK_2_VALUE               (0x7ffL<<16)
+#define BNX2_RV2P_DEBUG_VECT_PEEK_2_PEEK_EN             (1L<<27)
+#define BNX2_RV2P_DEBUG_VECT_PEEK_2_SEL                         (0xfL<<28)
+
+#define BNX2_RV2P_PFTQ_DATA                            0x00002b40
+#define BNX2_RV2P_PFTQ_CMD                             0x00002b78
+#define BNX2_RV2P_PFTQ_CMD_OFFSET                       (0x3ffL<<0)
+#define BNX2_RV2P_PFTQ_CMD_WR_TOP                       (1L<<10)
+#define BNX2_RV2P_PFTQ_CMD_WR_TOP_0                     (0L<<10)
+#define BNX2_RV2P_PFTQ_CMD_WR_TOP_1                     (1L<<10)
+#define BNX2_RV2P_PFTQ_CMD_SFT_RESET                    (1L<<25)
+#define BNX2_RV2P_PFTQ_CMD_RD_DATA                      (1L<<26)
+#define BNX2_RV2P_PFTQ_CMD_ADD_INTERVEN                         (1L<<27)
+#define BNX2_RV2P_PFTQ_CMD_ADD_DATA                     (1L<<28)
+#define BNX2_RV2P_PFTQ_CMD_INTERVENE_CLR                (1L<<29)
+#define BNX2_RV2P_PFTQ_CMD_POP                          (1L<<30)
+#define BNX2_RV2P_PFTQ_CMD_BUSY                                 (1L<<31)
+
+#define BNX2_RV2P_PFTQ_CTL                             0x00002b7c
+#define BNX2_RV2P_PFTQ_CTL_INTERVENE                    (1L<<0)
+#define BNX2_RV2P_PFTQ_CTL_OVERFLOW                     (1L<<1)
+#define BNX2_RV2P_PFTQ_CTL_FORCE_INTERVENE              (1L<<2)
+#define BNX2_RV2P_PFTQ_CTL_MAX_DEPTH                    (0x3ffL<<12)
+#define BNX2_RV2P_PFTQ_CTL_CUR_DEPTH                    (0x3ffL<<22)
+
+#define BNX2_RV2P_TFTQ_DATA                            0x00002b80
+#define BNX2_RV2P_TFTQ_CMD                             0x00002bb8
+#define BNX2_RV2P_TFTQ_CMD_OFFSET                       (0x3ffL<<0)
+#define BNX2_RV2P_TFTQ_CMD_WR_TOP                       (1L<<10)
+#define BNX2_RV2P_TFTQ_CMD_WR_TOP_0                     (0L<<10)
+#define BNX2_RV2P_TFTQ_CMD_WR_TOP_1                     (1L<<10)
+#define BNX2_RV2P_TFTQ_CMD_SFT_RESET                    (1L<<25)
+#define BNX2_RV2P_TFTQ_CMD_RD_DATA                      (1L<<26)
+#define BNX2_RV2P_TFTQ_CMD_ADD_INTERVEN                         (1L<<27)
+#define BNX2_RV2P_TFTQ_CMD_ADD_DATA                     (1L<<28)
+#define BNX2_RV2P_TFTQ_CMD_INTERVENE_CLR                (1L<<29)
+#define BNX2_RV2P_TFTQ_CMD_POP                          (1L<<30)
+#define BNX2_RV2P_TFTQ_CMD_BUSY                                 (1L<<31)
+
+#define BNX2_RV2P_TFTQ_CTL                             0x00002bbc
+#define BNX2_RV2P_TFTQ_CTL_INTERVENE                    (1L<<0)
+#define BNX2_RV2P_TFTQ_CTL_OVERFLOW                     (1L<<1)
+#define BNX2_RV2P_TFTQ_CTL_FORCE_INTERVENE              (1L<<2)
+#define BNX2_RV2P_TFTQ_CTL_MAX_DEPTH                    (0x3ffL<<12)
+#define BNX2_RV2P_TFTQ_CTL_CUR_DEPTH                    (0x3ffL<<22)
+
+#define BNX2_RV2P_MFTQ_DATA                            0x00002bc0
+#define BNX2_RV2P_MFTQ_CMD                             0x00002bf8
+#define BNX2_RV2P_MFTQ_CMD_OFFSET                       (0x3ffL<<0)
+#define BNX2_RV2P_MFTQ_CMD_WR_TOP                       (1L<<10)
+#define BNX2_RV2P_MFTQ_CMD_WR_TOP_0                     (0L<<10)
+#define BNX2_RV2P_MFTQ_CMD_WR_TOP_1                     (1L<<10)
+#define BNX2_RV2P_MFTQ_CMD_SFT_RESET                    (1L<<25)
+#define BNX2_RV2P_MFTQ_CMD_RD_DATA                      (1L<<26)
+#define BNX2_RV2P_MFTQ_CMD_ADD_INTERVEN                         (1L<<27)
+#define BNX2_RV2P_MFTQ_CMD_ADD_DATA                     (1L<<28)
+#define BNX2_RV2P_MFTQ_CMD_INTERVENE_CLR                (1L<<29)
+#define BNX2_RV2P_MFTQ_CMD_POP                          (1L<<30)
+#define BNX2_RV2P_MFTQ_CMD_BUSY                                 (1L<<31)
+
+#define BNX2_RV2P_MFTQ_CTL                             0x00002bfc
+#define BNX2_RV2P_MFTQ_CTL_INTERVENE                    (1L<<0)
+#define BNX2_RV2P_MFTQ_CTL_OVERFLOW                     (1L<<1)
+#define BNX2_RV2P_MFTQ_CTL_FORCE_INTERVENE              (1L<<2)
+#define BNX2_RV2P_MFTQ_CTL_MAX_DEPTH                    (0x3ffL<<12)
+#define BNX2_RV2P_MFTQ_CTL_CUR_DEPTH                    (0x3ffL<<22)
+
+
+
+/*
+ *  mq_reg definition
+ *  offset: 0x3c00
+ */
+#define BNX2_MQ_COMMAND                                        0x00003c00
+#define BNX2_MQ_COMMAND_ENABLED                                 (1L<<0)
+#define BNX2_MQ_COMMAND_OVERFLOW                        (1L<<4)
+#define BNX2_MQ_COMMAND_WR_ERROR                        (1L<<5)
+#define BNX2_MQ_COMMAND_RD_ERROR                        (1L<<6)
+
+#define BNX2_MQ_STATUS                                 0x00003c04
+#define BNX2_MQ_STATUS_CTX_ACCESS_STAT                  (1L<<16)
+#define BNX2_MQ_STATUS_CTX_ACCESS64_STAT                (1L<<17)
+#define BNX2_MQ_STATUS_PCI_STALL_STAT                   (1L<<18)
+
+#define BNX2_MQ_CONFIG                                 0x00003c08
+#define BNX2_MQ_CONFIG_TX_HIGH_PRI                      (1L<<0)
+#define BNX2_MQ_CONFIG_HALT_DIS                                 (1L<<1)
+#define BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE                         (0x7L<<4)
+#define BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_256             (0L<<4)
+#define BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_512             (1L<<4)
+#define BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_1K              (2L<<4)
+#define BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_2K              (3L<<4)
+#define BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_4K              (4L<<4)
+#define BNX2_MQ_CONFIG_MAX_DEPTH                        (0x7fL<<8)
+#define BNX2_MQ_CONFIG_CUR_DEPTH                        (0x7fL<<20)
+
+#define BNX2_MQ_ENQUEUE1                               0x00003c0c
+#define BNX2_MQ_ENQUEUE1_OFFSET                                 (0x3fL<<2)
+#define BNX2_MQ_ENQUEUE1_CID                            (0x3fffL<<8)
+#define BNX2_MQ_ENQUEUE1_BYTE_MASK                      (0xfL<<24)
+#define BNX2_MQ_ENQUEUE1_KNL_MODE                       (1L<<28)
+
+#define BNX2_MQ_ENQUEUE2                               0x00003c10
+#define BNX2_MQ_BAD_WR_ADDR                            0x00003c14
+#define BNX2_MQ_BAD_RD_ADDR                            0x00003c18
+#define BNX2_MQ_KNL_BYP_WIND_START                     0x00003c1c
+#define BNX2_MQ_KNL_BYP_WIND_START_VALUE                (0xfffffL<<12)
+
+#define BNX2_MQ_KNL_WIND_END                           0x00003c20
+#define BNX2_MQ_KNL_WIND_END_VALUE                      (0xffffffL<<8)
+
+#define BNX2_MQ_KNL_WRITE_MASK1                                0x00003c24
+#define BNX2_MQ_KNL_TX_MASK1                           0x00003c28
+#define BNX2_MQ_KNL_CMD_MASK1                          0x00003c2c
+#define BNX2_MQ_KNL_COND_ENQUEUE_MASK1                 0x00003c30
+#define BNX2_MQ_KNL_RX_V2P_MASK1                       0x00003c34
+#define BNX2_MQ_KNL_WRITE_MASK2                                0x00003c38
+#define BNX2_MQ_KNL_TX_MASK2                           0x00003c3c
+#define BNX2_MQ_KNL_CMD_MASK2                          0x00003c40
+#define BNX2_MQ_KNL_COND_ENQUEUE_MASK2                 0x00003c44
+#define BNX2_MQ_KNL_RX_V2P_MASK2                       0x00003c48
+#define BNX2_MQ_KNL_BYP_WRITE_MASK1                    0x00003c4c
+#define BNX2_MQ_KNL_BYP_TX_MASK1                       0x00003c50
+#define BNX2_MQ_KNL_BYP_CMD_MASK1                      0x00003c54
+#define BNX2_MQ_KNL_BYP_COND_ENQUEUE_MASK1             0x00003c58
+#define BNX2_MQ_KNL_BYP_RX_V2P_MASK1                   0x00003c5c
+#define BNX2_MQ_KNL_BYP_WRITE_MASK2                    0x00003c60
+#define BNX2_MQ_KNL_BYP_TX_MASK2                       0x00003c64
+#define BNX2_MQ_KNL_BYP_CMD_MASK2                      0x00003c68
+#define BNX2_MQ_KNL_BYP_COND_ENQUEUE_MASK2             0x00003c6c
+#define BNX2_MQ_KNL_BYP_RX_V2P_MASK2                   0x00003c70
+#define BNX2_MQ_MEM_WR_ADDR                            0x00003c74
+#define BNX2_MQ_MEM_WR_ADDR_VALUE                       (0x3fL<<0)
+
+#define BNX2_MQ_MEM_WR_DATA0                           0x00003c78
+#define BNX2_MQ_MEM_WR_DATA0_VALUE                      (0xffffffffL<<0)
+
+#define BNX2_MQ_MEM_WR_DATA1                           0x00003c7c
+#define BNX2_MQ_MEM_WR_DATA1_VALUE                      (0xffffffffL<<0)
+
+#define BNX2_MQ_MEM_WR_DATA2                           0x00003c80
+#define BNX2_MQ_MEM_WR_DATA2_VALUE                      (0x3fffffffL<<0)
+
+#define BNX2_MQ_MEM_RD_ADDR                            0x00003c84
+#define BNX2_MQ_MEM_RD_ADDR_VALUE                       (0x3fL<<0)
+
+#define BNX2_MQ_MEM_RD_DATA0                           0x00003c88
+#define BNX2_MQ_MEM_RD_DATA0_VALUE                      (0xffffffffL<<0)
+
+#define BNX2_MQ_MEM_RD_DATA1                           0x00003c8c
+#define BNX2_MQ_MEM_RD_DATA1_VALUE                      (0xffffffffL<<0)
+
+#define BNX2_MQ_MEM_RD_DATA2                           0x00003c90
+#define BNX2_MQ_MEM_RD_DATA2_VALUE                      (0x3fffffffL<<0)
+
+
+
+/*
+ *  tbdr_reg definition
+ *  offset: 0x5000
+ */
+#define BNX2_TBDR_COMMAND                              0x00005000
+#define BNX2_TBDR_COMMAND_ENABLE                        (1L<<0)
+#define BNX2_TBDR_COMMAND_SOFT_RST                      (1L<<1)
+#define BNX2_TBDR_COMMAND_MSTR_ABORT                    (1L<<4)
+
+#define BNX2_TBDR_STATUS                               0x00005004
+#define BNX2_TBDR_STATUS_DMA_WAIT                       (1L<<0)
+#define BNX2_TBDR_STATUS_FTQ_WAIT                       (1L<<1)
+#define BNX2_TBDR_STATUS_FIFO_OVERFLOW                  (1L<<2)
+#define BNX2_TBDR_STATUS_FIFO_UNDERFLOW                         (1L<<3)
+#define BNX2_TBDR_STATUS_SEARCHMISS_ERROR               (1L<<4)
+#define BNX2_TBDR_STATUS_FTQ_ENTRY_CNT                  (1L<<5)
+#define BNX2_TBDR_STATUS_BURST_CNT                      (1L<<6)
+
+#define BNX2_TBDR_CONFIG                               0x00005008
+#define BNX2_TBDR_CONFIG_MAX_BDS                        (0xffL<<0)
+#define BNX2_TBDR_CONFIG_SWAP_MODE                      (1L<<8)
+#define BNX2_TBDR_CONFIG_PRIORITY                       (1L<<9)
+#define BNX2_TBDR_CONFIG_CACHE_NEXT_PAGE_PTRS           (1L<<10)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE                      (0xfL<<24)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE_256                  (0L<<24)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE_512                  (1L<<24)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE_1K                   (2L<<24)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE_2K                   (3L<<24)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE_4K                   (4L<<24)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE_8K                   (5L<<24)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE_16K                  (6L<<24)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE_32K                  (7L<<24)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE_64K                  (8L<<24)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE_128K                         (9L<<24)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE_256K                         (10L<<24)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE_512K                         (11L<<24)
+#define BNX2_TBDR_CONFIG_PAGE_SIZE_1M                   (12L<<24)
+
+#define BNX2_TBDR_DEBUG_VECT_PEEK                      0x0000500c
+#define BNX2_TBDR_DEBUG_VECT_PEEK_1_VALUE               (0x7ffL<<0)
+#define BNX2_TBDR_DEBUG_VECT_PEEK_1_PEEK_EN             (1L<<11)
+#define BNX2_TBDR_DEBUG_VECT_PEEK_1_SEL                         (0xfL<<12)
+#define BNX2_TBDR_DEBUG_VECT_PEEK_2_VALUE               (0x7ffL<<16)
+#define BNX2_TBDR_DEBUG_VECT_PEEK_2_PEEK_EN             (1L<<27)
+#define BNX2_TBDR_DEBUG_VECT_PEEK_2_SEL                         (0xfL<<28)
+
+#define BNX2_TBDR_FTQ_DATA                             0x000053c0
+#define BNX2_TBDR_FTQ_CMD                              0x000053f8
+#define BNX2_TBDR_FTQ_CMD_OFFSET                        (0x3ffL<<0)
+#define BNX2_TBDR_FTQ_CMD_WR_TOP                        (1L<<10)
+#define BNX2_TBDR_FTQ_CMD_WR_TOP_0                      (0L<<10)
+#define BNX2_TBDR_FTQ_CMD_WR_TOP_1                      (1L<<10)
+#define BNX2_TBDR_FTQ_CMD_SFT_RESET                     (1L<<25)
+#define BNX2_TBDR_FTQ_CMD_RD_DATA                       (1L<<26)
+#define BNX2_TBDR_FTQ_CMD_ADD_INTERVEN                  (1L<<27)
+#define BNX2_TBDR_FTQ_CMD_ADD_DATA                      (1L<<28)
+#define BNX2_TBDR_FTQ_CMD_INTERVENE_CLR                         (1L<<29)
+#define BNX2_TBDR_FTQ_CMD_POP                           (1L<<30)
+#define BNX2_TBDR_FTQ_CMD_BUSY                          (1L<<31)
+
+#define BNX2_TBDR_FTQ_CTL                              0x000053fc
+#define BNX2_TBDR_FTQ_CTL_INTERVENE                     (1L<<0)
+#define BNX2_TBDR_FTQ_CTL_OVERFLOW                      (1L<<1)
+#define BNX2_TBDR_FTQ_CTL_FORCE_INTERVENE               (1L<<2)
+#define BNX2_TBDR_FTQ_CTL_MAX_DEPTH                     (0x3ffL<<12)
+#define BNX2_TBDR_FTQ_CTL_CUR_DEPTH                     (0x3ffL<<22)
+
+
+
+/*
+ *  tdma_reg definition
+ *  offset: 0x5c00
+ */
+#define BNX2_TDMA_COMMAND                              0x00005c00
+#define BNX2_TDMA_COMMAND_ENABLED                       (1L<<0)
+#define BNX2_TDMA_COMMAND_MASTER_ABORT                  (1L<<4)
+#define BNX2_TDMA_COMMAND_BAD_L2_LENGTH_ABORT           (1L<<7)
+
+#define BNX2_TDMA_STATUS                               0x00005c04
+#define BNX2_TDMA_STATUS_DMA_WAIT                       (1L<<0)
+#define BNX2_TDMA_STATUS_PAYLOAD_WAIT                   (1L<<1)
+#define BNX2_TDMA_STATUS_PATCH_FTQ_WAIT                         (1L<<2)
+#define BNX2_TDMA_STATUS_LOCK_WAIT                      (1L<<3)
+#define BNX2_TDMA_STATUS_FTQ_ENTRY_CNT                  (1L<<16)
+#define BNX2_TDMA_STATUS_BURST_CNT                      (1L<<17)
+
+#define BNX2_TDMA_CONFIG                               0x00005c08
+#define BNX2_TDMA_CONFIG_ONE_DMA                        (1L<<0)
+#define BNX2_TDMA_CONFIG_ONE_RECORD                     (1L<<1)
+#define BNX2_TDMA_CONFIG_LIMIT_SZ                       (0xfL<<4)
+#define BNX2_TDMA_CONFIG_LIMIT_SZ_64                    (0L<<4)
+#define BNX2_TDMA_CONFIG_LIMIT_SZ_128                   (0x4L<<4)
+#define BNX2_TDMA_CONFIG_LIMIT_SZ_256                   (0x6L<<4)
+#define BNX2_TDMA_CONFIG_LIMIT_SZ_512                   (0x8L<<4)
+#define BNX2_TDMA_CONFIG_LINE_SZ                        (0xfL<<8)
+#define BNX2_TDMA_CONFIG_LINE_SZ_64                     (0L<<8)
+#define BNX2_TDMA_CONFIG_LINE_SZ_128                    (4L<<8)
+#define BNX2_TDMA_CONFIG_LINE_SZ_256                    (6L<<8)
+#define BNX2_TDMA_CONFIG_LINE_SZ_512                    (8L<<8)
+#define BNX2_TDMA_CONFIG_ALIGN_ENA                      (1L<<15)
+#define BNX2_TDMA_CONFIG_CHK_L2_BD                      (1L<<16)
+#define BNX2_TDMA_CONFIG_FIFO_CMP                       (0xfL<<20)
+
+#define BNX2_TDMA_PAYLOAD_PROD                         0x00005c0c
+#define BNX2_TDMA_PAYLOAD_PROD_VALUE                    (0x1fffL<<3)
+
+#define BNX2_TDMA_DBG_WATCHDOG                         0x00005c10
+#define BNX2_TDMA_DBG_TRIGGER                          0x00005c14
+#define BNX2_TDMA_DMAD_FSM                             0x00005c80
+#define BNX2_TDMA_DMAD_FSM_BD_INVLD                     (1L<<0)
+#define BNX2_TDMA_DMAD_FSM_PUSH                                 (0xfL<<4)
+#define BNX2_TDMA_DMAD_FSM_ARB_TBDC                     (0x3L<<8)
+#define BNX2_TDMA_DMAD_FSM_ARB_CTX                      (1L<<12)
+#define BNX2_TDMA_DMAD_FSM_DR_INTF                      (1L<<16)
+#define BNX2_TDMA_DMAD_FSM_DMAD                                 (0x7L<<20)
+#define BNX2_TDMA_DMAD_FSM_BD                           (0xfL<<24)
+
+#define BNX2_TDMA_DMAD_STATUS                          0x00005c84
+#define BNX2_TDMA_DMAD_STATUS_RHOLD_PUSH_ENTRY          (0x3L<<0)
+#define BNX2_TDMA_DMAD_STATUS_RHOLD_DMAD_ENTRY          (0x3L<<4)
+#define BNX2_TDMA_DMAD_STATUS_RHOLD_BD_ENTRY            (0x3L<<8)
+#define BNX2_TDMA_DMAD_STATUS_IFTQ_ENUM                         (0xfL<<12)
+
+#define BNX2_TDMA_DR_INTF_FSM                          0x00005c88
+#define BNX2_TDMA_DR_INTF_FSM_L2_COMP                   (0x3L<<0)
+#define BNX2_TDMA_DR_INTF_FSM_TPATQ                     (0x7L<<4)
+#define BNX2_TDMA_DR_INTF_FSM_TPBUF                     (0x3L<<8)
+#define BNX2_TDMA_DR_INTF_FSM_DR_BUF                    (0x7L<<12)
+#define BNX2_TDMA_DR_INTF_FSM_DMAD                      (0x7L<<16)
+
+#define BNX2_TDMA_DR_INTF_STATUS                       0x00005c8c
+#define BNX2_TDMA_DR_INTF_STATUS_HOLE_PHASE             (0x7L<<0)
+#define BNX2_TDMA_DR_INTF_STATUS_DATA_AVAIL             (0x3L<<4)
+#define BNX2_TDMA_DR_INTF_STATUS_SHIFT_ADDR             (0x7L<<8)
+#define BNX2_TDMA_DR_INTF_STATUS_NXT_PNTR               (0xfL<<12)
+#define BNX2_TDMA_DR_INTF_STATUS_BYTE_COUNT             (0x7L<<16)
+
+#define BNX2_TDMA_FTQ_DATA                             0x00005fc0
+#define BNX2_TDMA_FTQ_CMD                              0x00005ff8
+#define BNX2_TDMA_FTQ_CMD_OFFSET                        (0x3ffL<<0)
+#define BNX2_TDMA_FTQ_CMD_WR_TOP                        (1L<<10)
+#define BNX2_TDMA_FTQ_CMD_WR_TOP_0                      (0L<<10)
+#define BNX2_TDMA_FTQ_CMD_WR_TOP_1                      (1L<<10)
+#define BNX2_TDMA_FTQ_CMD_SFT_RESET                     (1L<<25)
+#define BNX2_TDMA_FTQ_CMD_RD_DATA                       (1L<<26)
+#define BNX2_TDMA_FTQ_CMD_ADD_INTERVEN                  (1L<<27)
+#define BNX2_TDMA_FTQ_CMD_ADD_DATA                      (1L<<28)
+#define BNX2_TDMA_FTQ_CMD_INTERVENE_CLR                         (1L<<29)
+#define BNX2_TDMA_FTQ_CMD_POP                           (1L<<30)
+#define BNX2_TDMA_FTQ_CMD_BUSY                          (1L<<31)
+
+#define BNX2_TDMA_FTQ_CTL                              0x00005ffc
+#define BNX2_TDMA_FTQ_CTL_INTERVENE                     (1L<<0)
+#define BNX2_TDMA_FTQ_CTL_OVERFLOW                      (1L<<1)
+#define BNX2_TDMA_FTQ_CTL_FORCE_INTERVENE               (1L<<2)
+#define BNX2_TDMA_FTQ_CTL_MAX_DEPTH                     (0x3ffL<<12)
+#define BNX2_TDMA_FTQ_CTL_CUR_DEPTH                     (0x3ffL<<22)
+
+
+
+/*
+ *  hc_reg definition
+ *  offset: 0x6800
+ */
+#define BNX2_HC_COMMAND                                        0x00006800
+#define BNX2_HC_COMMAND_ENABLE                          (1L<<0)
+#define BNX2_HC_COMMAND_SKIP_ABORT                      (1L<<4)
+#define BNX2_HC_COMMAND_COAL_NOW                        (1L<<16)
+#define BNX2_HC_COMMAND_COAL_NOW_WO_INT                         (1L<<17)
+#define BNX2_HC_COMMAND_STATS_NOW                       (1L<<18)
+#define BNX2_HC_COMMAND_FORCE_INT                       (0x3L<<19)
+#define BNX2_HC_COMMAND_FORCE_INT_NULL                  (0L<<19)
+#define BNX2_HC_COMMAND_FORCE_INT_HIGH                  (1L<<19)
+#define BNX2_HC_COMMAND_FORCE_INT_LOW                   (2L<<19)
+#define BNX2_HC_COMMAND_FORCE_INT_FREE                  (3L<<19)
+#define BNX2_HC_COMMAND_CLR_STAT_NOW                    (1L<<21)
+
+#define BNX2_HC_STATUS                                 0x00006804
+#define BNX2_HC_STATUS_MASTER_ABORT                     (1L<<0)
+#define BNX2_HC_STATUS_PARITY_ERROR_STATE               (1L<<1)
+#define BNX2_HC_STATUS_PCI_CLK_CNT_STAT                         (1L<<16)
+#define BNX2_HC_STATUS_CORE_CLK_CNT_STAT                (1L<<17)
+#define BNX2_HC_STATUS_NUM_STATUS_BLOCKS_STAT           (1L<<18)
+#define BNX2_HC_STATUS_NUM_INT_GEN_STAT                         (1L<<19)
+#define BNX2_HC_STATUS_NUM_INT_MBOX_WR_STAT             (1L<<20)
+#define BNX2_HC_STATUS_CORE_CLKS_TO_HW_INTACK_STAT      (1L<<23)
+#define BNX2_HC_STATUS_CORE_CLKS_TO_SW_INTACK_STAT      (1L<<24)
+#define BNX2_HC_STATUS_CORE_CLKS_DURING_SW_INTACK_STAT  (1L<<25)
+
+#define BNX2_HC_CONFIG                                 0x00006808
+#define BNX2_HC_CONFIG_COLLECT_STATS                    (1L<<0)
+#define BNX2_HC_CONFIG_RX_TMR_MODE                      (1L<<1)
+#define BNX2_HC_CONFIG_TX_TMR_MODE                      (1L<<2)
+#define BNX2_HC_CONFIG_COM_TMR_MODE                     (1L<<3)
+#define BNX2_HC_CONFIG_CMD_TMR_MODE                     (1L<<4)
+#define BNX2_HC_CONFIG_STATISTIC_PRIORITY               (1L<<5)
+#define BNX2_HC_CONFIG_STATUS_PRIORITY                  (1L<<6)
+#define BNX2_HC_CONFIG_STAT_MEM_ADDR                    (0xffL<<8)
+
+#define BNX2_HC_ATTN_BITS_ENABLE                       0x0000680c
+#define BNX2_HC_STATUS_ADDR_L                          0x00006810
+#define BNX2_HC_STATUS_ADDR_H                          0x00006814
+#define BNX2_HC_STATISTICS_ADDR_L                      0x00006818
+#define BNX2_HC_STATISTICS_ADDR_H                      0x0000681c
+#define BNX2_HC_TX_QUICK_CONS_TRIP                     0x00006820
+#define BNX2_HC_TX_QUICK_CONS_TRIP_VALUE                (0xffL<<0)
+#define BNX2_HC_TX_QUICK_CONS_TRIP_INT                  (0xffL<<16)
+
+#define BNX2_HC_COMP_PROD_TRIP                         0x00006824
+#define BNX2_HC_COMP_PROD_TRIP_VALUE                    (0xffL<<0)
+#define BNX2_HC_COMP_PROD_TRIP_INT                      (0xffL<<16)
+
+#define BNX2_HC_RX_QUICK_CONS_TRIP                     0x00006828
+#define BNX2_HC_RX_QUICK_CONS_TRIP_VALUE                (0xffL<<0)
+#define BNX2_HC_RX_QUICK_CONS_TRIP_INT                  (0xffL<<16)
+
+#define BNX2_HC_RX_TICKS                               0x0000682c
+#define BNX2_HC_RX_TICKS_VALUE                          (0x3ffL<<0)
+#define BNX2_HC_RX_TICKS_INT                            (0x3ffL<<16)
+
+#define BNX2_HC_TX_TICKS                               0x00006830
+#define BNX2_HC_TX_TICKS_VALUE                          (0x3ffL<<0)
+#define BNX2_HC_TX_TICKS_INT                            (0x3ffL<<16)
+
+#define BNX2_HC_COM_TICKS                              0x00006834
+#define BNX2_HC_COM_TICKS_VALUE                                 (0x3ffL<<0)
+#define BNX2_HC_COM_TICKS_INT                           (0x3ffL<<16)
+
+#define BNX2_HC_CMD_TICKS                              0x00006838
+#define BNX2_HC_CMD_TICKS_VALUE                                 (0x3ffL<<0)
+#define BNX2_HC_CMD_TICKS_INT                           (0x3ffL<<16)
+
+#define BNX2_HC_PERIODIC_TICKS                         0x0000683c
+#define BNX2_HC_PERIODIC_TICKS_HC_PERIODIC_TICKS        (0xffffL<<0)
+
+#define BNX2_HC_STAT_COLLECT_TICKS                     0x00006840
+#define BNX2_HC_STAT_COLLECT_TICKS_HC_STAT_COLL_TICKS   (0xffL<<4)
+
+#define BNX2_HC_STATS_TICKS                            0x00006844
+#define BNX2_HC_STATS_TICKS_HC_STAT_TICKS               (0xffffL<<8)
+
+#define BNX2_HC_STAT_MEM_DATA                          0x0000684c
+#define BNX2_HC_STAT_GEN_SEL_0                         0x00006850
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0                (0x7fL<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT0      (0L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT1      (1L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT2      (2L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT3      (3L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT4      (4L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT5      (5L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT6      (6L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT7      (7L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT8      (8L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT9      (9L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT10     (10L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT11     (11L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT0      (12L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT1      (13L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT2      (14L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT3      (15L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT4      (16L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT5      (17L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT6      (18L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT7      (19L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT0      (20L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT1      (21L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT2      (22L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT3      (23L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT4      (24L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT5      (25L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT6      (26L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT7      (27L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT8      (28L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT9      (29L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT10     (30L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT11     (31L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TPAT_STAT0     (32L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TPAT_STAT1     (33L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TPAT_STAT2     (34L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TPAT_STAT3     (35L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT0       (36L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT1       (37L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT2       (38L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT3       (39L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT4       (40L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT5       (41L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT6       (42L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT7       (43L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT0      (44L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT1      (45L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT2      (46L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT3      (47L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT4      (48L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT5      (49L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT6      (50L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT7      (51L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_PCI_CLK_CNT    (52L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CORE_CLK_CNT   (53L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_STATUS_BLOCKS   (54L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_GEN         (55L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_MBOX_WR     (56L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_HW_INTACK      (59L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_SW_INTACK      (60L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_DURING_SW_INTACK  (61L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TSCH_CMD_CNT   (62L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TSCH_SLOT_CNT  (63L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CSCH_CMD_CNT   (64L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CSCH_SLOT_CNT  (65L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RLUPQ_VALID_CNT        (66L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXPQ_VALID_CNT         (67L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXPCQ_VALID_CNT        (68L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2PPQ_VALID_CNT       (69L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2PMQ_VALID_CNT       (70L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2PTQ_VALID_CNT       (71L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RDMAQ_VALID_CNT        (72L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TSCHQ_VALID_CNT        (73L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TBDRQ_VALID_CNT        (74L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXPQ_VALID_CNT         (75L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TDMAQ_VALID_CNT        (76L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TPATQ_VALID_CNT        (77L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TASQ_VALID_CNT         (78L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CSQ_VALID_CNT  (79L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CPQ_VALID_CNT  (80L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COMXQ_VALID_CNT        (81L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COMTQ_VALID_CNT        (82L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COMQ_VALID_CNT         (83L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MGMQ_VALID_CNT         (84L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_READ_TRANSFERS_CNT        (85L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_READ_DELAY_PCI_CLKS_CNT   (86L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_BIG_READ_TRANSFERS_CNT    (87L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_BIG_READ_DELAY_PCI_CLKS_CNT       (88L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_BIG_READ_RETRY_AFTER_DATA_CNT     (89L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_WRITE_TRANSFERS_CNT       (90L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_WRITE_DELAY_PCI_CLKS_CNT  (91L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_BIG_WRITE_TRANSFERS_CNT   (92L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_BIG_WRITE_DELAY_PCI_CLKS_CNT      (93L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_BIG_WRITE_RETRY_AFTER_DATA_CNT    (94L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CTX_WR_CNT64   (95L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CTX_RD_CNT64   (96L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CTX_ACC_STALL_CLKS     (97L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CTX_LOCK_STALL_CLKS    (98L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MBQ_CTX_ACCESS_STAT    (99L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MBQ_CTX_ACCESS64_STAT  (100L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MBQ_PCI_STALL_STAT     (101L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TBDR_FTQ_ENTRY_CNT     (102L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TBDR_BURST_CNT         (103L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TDMA_FTQ_ENTRY_CNT     (104L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TDMA_BURST_CNT         (105L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RDMA_FTQ_ENTRY_CNT     (106L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RDMA_BURST_CNT         (107L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RLUP_MATCH_CNT         (108L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TMR_POLL_PASS_CNT      (109L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TMR_TMR1_CNT   (110L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TMR_TMR2_CNT   (111L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TMR_TMR3_CNT   (112L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TMR_TMR4_CNT   (113L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TMR_TMR5_CNT   (114L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2P_STAT0     (115L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2P_STAT1     (116L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2P_STAT2     (117L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2P_STAT3     (118L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2P_STAT4     (119L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2P_STAT5     (120L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RBDC_PROC1_MISS        (121L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RBDC_PROC2_MISS        (122L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RBDC_BURST_CNT         (127L<<0)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_1                (0x7fL<<8)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_2                (0x7fL<<16)
+#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_3                (0x7fL<<24)
+
+#define BNX2_HC_STAT_GEN_SEL_1                         0x00006854
+#define BNX2_HC_STAT_GEN_SEL_1_GEN_SEL_4                (0x7fL<<0)
+#define BNX2_HC_STAT_GEN_SEL_1_GEN_SEL_5                (0x7fL<<8)
+#define BNX2_HC_STAT_GEN_SEL_1_GEN_SEL_6                (0x7fL<<16)
+#define BNX2_HC_STAT_GEN_SEL_1_GEN_SEL_7                (0x7fL<<24)
+
+#define BNX2_HC_STAT_GEN_SEL_2                         0x00006858
+#define BNX2_HC_STAT_GEN_SEL_2_GEN_SEL_8                (0x7fL<<0)
+#define BNX2_HC_STAT_GEN_SEL_2_GEN_SEL_9                (0x7fL<<8)
+#define BNX2_HC_STAT_GEN_SEL_2_GEN_SEL_10               (0x7fL<<16)
+#define BNX2_HC_STAT_GEN_SEL_2_GEN_SEL_11               (0x7fL<<24)
+
+#define BNX2_HC_STAT_GEN_SEL_3                         0x0000685c
+#define BNX2_HC_STAT_GEN_SEL_3_GEN_SEL_12               (0x7fL<<0)
+#define BNX2_HC_STAT_GEN_SEL_3_GEN_SEL_13               (0x7fL<<8)
+#define BNX2_HC_STAT_GEN_SEL_3_GEN_SEL_14               (0x7fL<<16)
+#define BNX2_HC_STAT_GEN_SEL_3_GEN_SEL_15               (0x7fL<<24)
+
+#define BNX2_HC_STAT_GEN_STAT0                         0x00006888
+#define BNX2_HC_STAT_GEN_STAT1                         0x0000688c
+#define BNX2_HC_STAT_GEN_STAT2                         0x00006890
+#define BNX2_HC_STAT_GEN_STAT3                         0x00006894
+#define BNX2_HC_STAT_GEN_STAT4                         0x00006898
+#define BNX2_HC_STAT_GEN_STAT5                         0x0000689c
+#define BNX2_HC_STAT_GEN_STAT6                         0x000068a0
+#define BNX2_HC_STAT_GEN_STAT7                         0x000068a4
+#define BNX2_HC_STAT_GEN_STAT8                         0x000068a8
+#define BNX2_HC_STAT_GEN_STAT9                         0x000068ac
+#define BNX2_HC_STAT_GEN_STAT10                                0x000068b0
+#define BNX2_HC_STAT_GEN_STAT11                                0x000068b4
+#define BNX2_HC_STAT_GEN_STAT12                                0x000068b8
+#define BNX2_HC_STAT_GEN_STAT13                                0x000068bc
+#define BNX2_HC_STAT_GEN_STAT14                                0x000068c0
+#define BNX2_HC_STAT_GEN_STAT15                                0x000068c4
+#define BNX2_HC_STAT_GEN_STAT_AC0                      0x000068c8
+#define BNX2_HC_STAT_GEN_STAT_AC1                      0x000068cc
+#define BNX2_HC_STAT_GEN_STAT_AC2                      0x000068d0
+#define BNX2_HC_STAT_GEN_STAT_AC3                      0x000068d4
+#define BNX2_HC_STAT_GEN_STAT_AC4                      0x000068d8
+#define BNX2_HC_STAT_GEN_STAT_AC5                      0x000068dc
+#define BNX2_HC_STAT_GEN_STAT_AC6                      0x000068e0
+#define BNX2_HC_STAT_GEN_STAT_AC7                      0x000068e4
+#define BNX2_HC_STAT_GEN_STAT_AC8                      0x000068e8
+#define BNX2_HC_STAT_GEN_STAT_AC9                      0x000068ec
+#define BNX2_HC_STAT_GEN_STAT_AC10                     0x000068f0
+#define BNX2_HC_STAT_GEN_STAT_AC11                     0x000068f4
+#define BNX2_HC_STAT_GEN_STAT_AC12                     0x000068f8
+#define BNX2_HC_STAT_GEN_STAT_AC13                     0x000068fc
+#define BNX2_HC_STAT_GEN_STAT_AC14                     0x00006900
+#define BNX2_HC_STAT_GEN_STAT_AC15                     0x00006904
+#define BNX2_HC_VIS                                    0x00006908
+#define BNX2_HC_VIS_STAT_BUILD_STATE                    (0xfL<<0)
+#define BNX2_HC_VIS_STAT_BUILD_STATE_IDLE               (0L<<0)
+#define BNX2_HC_VIS_STAT_BUILD_STATE_START              (1L<<0)
+#define BNX2_HC_VIS_STAT_BUILD_STATE_REQUEST            (2L<<0)
+#define BNX2_HC_VIS_STAT_BUILD_STATE_UPDATE64           (3L<<0)
+#define BNX2_HC_VIS_STAT_BUILD_STATE_UPDATE32           (4L<<0)
+#define BNX2_HC_VIS_STAT_BUILD_STATE_UPDATE_DONE        (5L<<0)
+#define BNX2_HC_VIS_STAT_BUILD_STATE_DMA                (6L<<0)
+#define BNX2_HC_VIS_STAT_BUILD_STATE_MSI_CONTROL        (7L<<0)
+#define BNX2_HC_VIS_STAT_BUILD_STATE_MSI_LOW            (8L<<0)
+#define BNX2_HC_VIS_STAT_BUILD_STATE_MSI_HIGH           (9L<<0)
+#define BNX2_HC_VIS_STAT_BUILD_STATE_MSI_DATA           (10L<<0)
+#define BNX2_HC_VIS_DMA_STAT_STATE                      (0xfL<<8)
+#define BNX2_HC_VIS_DMA_STAT_STATE_IDLE                         (0L<<8)
+#define BNX2_HC_VIS_DMA_STAT_STATE_STATUS_PARAM                 (1L<<8)
+#define BNX2_HC_VIS_DMA_STAT_STATE_STATUS_DMA           (2L<<8)
+#define BNX2_HC_VIS_DMA_STAT_STATE_WRITE_COMP           (3L<<8)
+#define BNX2_HC_VIS_DMA_STAT_STATE_COMP                         (4L<<8)
+#define BNX2_HC_VIS_DMA_STAT_STATE_STATISTIC_PARAM      (5L<<8)
+#define BNX2_HC_VIS_DMA_STAT_STATE_STATISTIC_DMA        (6L<<8)
+#define BNX2_HC_VIS_DMA_STAT_STATE_WRITE_COMP_1                 (7L<<8)
+#define BNX2_HC_VIS_DMA_STAT_STATE_WRITE_COMP_2                 (8L<<8)
+#define BNX2_HC_VIS_DMA_STAT_STATE_WAIT                         (9L<<8)
+#define BNX2_HC_VIS_DMA_STAT_STATE_ABORT                (15L<<8)
+#define BNX2_HC_VIS_DMA_MSI_STATE                       (0x7L<<12)
+#define BNX2_HC_VIS_STATISTIC_DMA_EN_STATE              (0x3L<<15)
+#define BNX2_HC_VIS_STATISTIC_DMA_EN_STATE_IDLE                 (0L<<15)
+#define BNX2_HC_VIS_STATISTIC_DMA_EN_STATE_COUNT        (1L<<15)
+#define BNX2_HC_VIS_STATISTIC_DMA_EN_STATE_START        (2L<<15)
+
+#define BNX2_HC_VIS_1                                  0x0000690c
+#define BNX2_HC_VIS_1_HW_INTACK_STATE                   (1L<<4)
+#define BNX2_HC_VIS_1_HW_INTACK_STATE_IDLE              (0L<<4)
+#define BNX2_HC_VIS_1_HW_INTACK_STATE_COUNT             (1L<<4)
+#define BNX2_HC_VIS_1_SW_INTACK_STATE                   (1L<<5)
+#define BNX2_HC_VIS_1_SW_INTACK_STATE_IDLE              (0L<<5)
+#define BNX2_HC_VIS_1_SW_INTACK_STATE_COUNT             (1L<<5)
+#define BNX2_HC_VIS_1_DURING_SW_INTACK_STATE            (1L<<6)
+#define BNX2_HC_VIS_1_DURING_SW_INTACK_STATE_IDLE       (0L<<6)
+#define BNX2_HC_VIS_1_DURING_SW_INTACK_STATE_COUNT      (1L<<6)
+#define BNX2_HC_VIS_1_MAILBOX_COUNT_STATE               (1L<<7)
+#define BNX2_HC_VIS_1_MAILBOX_COUNT_STATE_IDLE          (0L<<7)
+#define BNX2_HC_VIS_1_MAILBOX_COUNT_STATE_COUNT                 (1L<<7)
+#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE                  (0xfL<<17)
+#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_IDLE             (0L<<17)
+#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_DMA              (1L<<17)
+#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_UPDATE           (2L<<17)
+#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_ASSIGN           (3L<<17)
+#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_WAIT             (4L<<17)
+#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_REG_UPDATE       (5L<<17)
+#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_REG_ASSIGN       (6L<<17)
+#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_REG_WAIT                 (7L<<17)
+#define BNX2_HC_VIS_1_RAM_WR_ARB_STATE                  (0x3L<<21)
+#define BNX2_HC_VIS_1_RAM_WR_ARB_STATE_NORMAL           (0L<<21)
+#define BNX2_HC_VIS_1_RAM_WR_ARB_STATE_CLEAR            (1L<<21)
+#define BNX2_HC_VIS_1_INT_GEN_STATE                     (1L<<23)
+#define BNX2_HC_VIS_1_INT_GEN_STATE_DLE                         (0L<<23)
+#define BNX2_HC_VIS_1_INT_GEN_STATE_NTERRUPT            (1L<<23)
+#define BNX2_HC_VIS_1_STAT_CHAN_ID                      (0x7L<<24)
+#define BNX2_HC_VIS_1_INT_B                             (1L<<27)
+
+#define BNX2_HC_DEBUG_VECT_PEEK                                0x00006910
+#define BNX2_HC_DEBUG_VECT_PEEK_1_VALUE                         (0x7ffL<<0)
+#define BNX2_HC_DEBUG_VECT_PEEK_1_PEEK_EN               (1L<<11)
+#define BNX2_HC_DEBUG_VECT_PEEK_1_SEL                   (0xfL<<12)
+#define BNX2_HC_DEBUG_VECT_PEEK_2_VALUE                         (0x7ffL<<16)
+#define BNX2_HC_DEBUG_VECT_PEEK_2_PEEK_EN               (1L<<27)
+#define BNX2_HC_DEBUG_VECT_PEEK_2_SEL                   (0xfL<<28)
+
+
+
+/*
+ *  txp_reg definition
+ *  offset: 0x40000
+ */
+#define BNX2_TXP_CPU_MODE                              0x00045000
+#define BNX2_TXP_CPU_MODE_LOCAL_RST                     (1L<<0)
+#define BNX2_TXP_CPU_MODE_STEP_ENA                      (1L<<1)
+#define BNX2_TXP_CPU_MODE_PAGE_0_DATA_ENA               (1L<<2)
+#define BNX2_TXP_CPU_MODE_PAGE_0_INST_ENA               (1L<<3)
+#define BNX2_TXP_CPU_MODE_MSG_BIT1                      (1L<<6)
+#define BNX2_TXP_CPU_MODE_INTERRUPT_ENA                         (1L<<7)
+#define BNX2_TXP_CPU_MODE_SOFT_HALT                     (1L<<10)
+#define BNX2_TXP_CPU_MODE_BAD_DATA_HALT_ENA             (1L<<11)
+#define BNX2_TXP_CPU_MODE_BAD_INST_HALT_ENA             (1L<<12)
+#define BNX2_TXP_CPU_MODE_FIO_ABORT_HALT_ENA            (1L<<13)
+#define BNX2_TXP_CPU_MODE_SPAD_UNDERFLOW_HALT_ENA       (1L<<15)
+
+#define BNX2_TXP_CPU_STATE                             0x00045004
+#define BNX2_TXP_CPU_STATE_BREAKPOINT                   (1L<<0)
+#define BNX2_TXP_CPU_STATE_BAD_INST_HALTED              (1L<<2)
+#define BNX2_TXP_CPU_STATE_PAGE_0_DATA_HALTED           (1L<<3)
+#define BNX2_TXP_CPU_STATE_PAGE_0_INST_HALTED           (1L<<4)
+#define BNX2_TXP_CPU_STATE_BAD_DATA_ADDR_HALTED                 (1L<<5)
+#define BNX2_TXP_CPU_STATE_BAD_pc_HALTED                (1L<<6)
+#define BNX2_TXP_CPU_STATE_ALIGN_HALTED                         (1L<<7)
+#define BNX2_TXP_CPU_STATE_FIO_ABORT_HALTED             (1L<<8)
+#define BNX2_TXP_CPU_STATE_SOFT_HALTED                  (1L<<10)
+#define BNX2_TXP_CPU_STATE_SPAD_UNDERFLOW               (1L<<11)
+#define BNX2_TXP_CPU_STATE_INTERRRUPT                   (1L<<12)
+#define BNX2_TXP_CPU_STATE_DATA_ACCESS_STALL            (1L<<14)
+#define BNX2_TXP_CPU_STATE_INST_FETCH_STALL             (1L<<15)
+#define BNX2_TXP_CPU_STATE_BLOCKED_READ                         (1L<<31)
+
+#define BNX2_TXP_CPU_EVENT_MASK                                0x00045008
+#define BNX2_TXP_CPU_EVENT_MASK_BREAKPOINT_MASK                 (1L<<0)
+#define BNX2_TXP_CPU_EVENT_MASK_BAD_INST_HALTED_MASK    (1L<<2)
+#define BNX2_TXP_CPU_EVENT_MASK_PAGE_0_DATA_HALTED_MASK         (1L<<3)
+#define BNX2_TXP_CPU_EVENT_MASK_PAGE_0_INST_HALTED_MASK         (1L<<4)
+#define BNX2_TXP_CPU_EVENT_MASK_BAD_DATA_ADDR_HALTED_MASK       (1L<<5)
+#define BNX2_TXP_CPU_EVENT_MASK_BAD_PC_HALTED_MASK      (1L<<6)
+#define BNX2_TXP_CPU_EVENT_MASK_ALIGN_HALTED_MASK       (1L<<7)
+#define BNX2_TXP_CPU_EVENT_MASK_FIO_ABORT_MASK          (1L<<8)
+#define BNX2_TXP_CPU_EVENT_MASK_SOFT_HALTED_MASK        (1L<<10)
+#define BNX2_TXP_CPU_EVENT_MASK_SPAD_UNDERFLOW_MASK     (1L<<11)
+#define BNX2_TXP_CPU_EVENT_MASK_INTERRUPT_MASK          (1L<<12)
+
+#define BNX2_TXP_CPU_PROGRAM_COUNTER                   0x0004501c
+#define BNX2_TXP_CPU_INSTRUCTION                       0x00045020
+#define BNX2_TXP_CPU_DATA_ACCESS                       0x00045024
+#define BNX2_TXP_CPU_INTERRUPT_ENABLE                  0x00045028
+#define BNX2_TXP_CPU_INTERRUPT_VECTOR                  0x0004502c
+#define BNX2_TXP_CPU_INTERRUPT_SAVED_PC                        0x00045030
+#define BNX2_TXP_CPU_HW_BREAKPOINT                     0x00045034
+#define BNX2_TXP_CPU_HW_BREAKPOINT_DISABLE              (1L<<0)
+#define BNX2_TXP_CPU_HW_BREAKPOINT_ADDRESS              (0x3fffffffL<<2)
+
+#define BNX2_TXP_CPU_DEBUG_VECT_PEEK                   0x00045038
+#define BNX2_TXP_CPU_DEBUG_VECT_PEEK_1_VALUE            (0x7ffL<<0)
+#define BNX2_TXP_CPU_DEBUG_VECT_PEEK_1_PEEK_EN          (1L<<11)
+#define BNX2_TXP_CPU_DEBUG_VECT_PEEK_1_SEL              (0xfL<<12)
+#define BNX2_TXP_CPU_DEBUG_VECT_PEEK_2_VALUE            (0x7ffL<<16)
+#define BNX2_TXP_CPU_DEBUG_VECT_PEEK_2_PEEK_EN          (1L<<27)
+#define BNX2_TXP_CPU_DEBUG_VECT_PEEK_2_SEL              (0xfL<<28)
+
+#define BNX2_TXP_CPU_LAST_BRANCH_ADDR                  0x00045048
+#define BNX2_TXP_CPU_LAST_BRANCH_ADDR_TYPE              (1L<<1)
+#define BNX2_TXP_CPU_LAST_BRANCH_ADDR_TYPE_JUMP                 (0L<<1)
+#define BNX2_TXP_CPU_LAST_BRANCH_ADDR_TYPE_BRANCH       (1L<<1)
+#define BNX2_TXP_CPU_LAST_BRANCH_ADDR_LBA               (0x3fffffffL<<2)
+
+#define BNX2_TXP_CPU_REG_FILE                          0x00045200
+#define BNX2_TXP_FTQ_DATA                              0x000453c0
+#define BNX2_TXP_FTQ_CMD                               0x000453f8
+#define BNX2_TXP_FTQ_CMD_OFFSET                                 (0x3ffL<<0)
+#define BNX2_TXP_FTQ_CMD_WR_TOP                                 (1L<<10)
+#define BNX2_TXP_FTQ_CMD_WR_TOP_0                       (0L<<10)
+#define BNX2_TXP_FTQ_CMD_WR_TOP_1                       (1L<<10)
+#define BNX2_TXP_FTQ_CMD_SFT_RESET                      (1L<<25)
+#define BNX2_TXP_FTQ_CMD_RD_DATA                        (1L<<26)
+#define BNX2_TXP_FTQ_CMD_ADD_INTERVEN                   (1L<<27)
+#define BNX2_TXP_FTQ_CMD_ADD_DATA                       (1L<<28)
+#define BNX2_TXP_FTQ_CMD_INTERVENE_CLR                  (1L<<29)
+#define BNX2_TXP_FTQ_CMD_POP                            (1L<<30)
+#define BNX2_TXP_FTQ_CMD_BUSY                           (1L<<31)
+
+#define BNX2_TXP_FTQ_CTL                               0x000453fc
+#define BNX2_TXP_FTQ_CTL_INTERVENE                      (1L<<0)
+#define BNX2_TXP_FTQ_CTL_OVERFLOW                       (1L<<1)
+#define BNX2_TXP_FTQ_CTL_FORCE_INTERVENE                (1L<<2)
+#define BNX2_TXP_FTQ_CTL_MAX_DEPTH                      (0x3ffL<<12)
+#define BNX2_TXP_FTQ_CTL_CUR_DEPTH                      (0x3ffL<<22)
+
+#define BNX2_TXP_SCRATCH                               0x00060000
+
+
+/*
+ *  tpat_reg definition
+ *  offset: 0x80000
+ */
+#define BNX2_TPAT_CPU_MODE                             0x00085000
+#define BNX2_TPAT_CPU_MODE_LOCAL_RST                    (1L<<0)
+#define BNX2_TPAT_CPU_MODE_STEP_ENA                     (1L<<1)
+#define BNX2_TPAT_CPU_MODE_PAGE_0_DATA_ENA              (1L<<2)
+#define BNX2_TPAT_CPU_MODE_PAGE_0_INST_ENA              (1L<<3)
+#define BNX2_TPAT_CPU_MODE_MSG_BIT1                     (1L<<6)
+#define BNX2_TPAT_CPU_MODE_INTERRUPT_ENA                (1L<<7)
+#define BNX2_TPAT_CPU_MODE_SOFT_HALT                    (1L<<10)
+#define BNX2_TPAT_CPU_MODE_BAD_DATA_HALT_ENA            (1L<<11)
+#define BNX2_TPAT_CPU_MODE_BAD_INST_HALT_ENA            (1L<<12)
+#define BNX2_TPAT_CPU_MODE_FIO_ABORT_HALT_ENA           (1L<<13)
+#define BNX2_TPAT_CPU_MODE_SPAD_UNDERFLOW_HALT_ENA      (1L<<15)
+
+#define BNX2_TPAT_CPU_STATE                            0x00085004
+#define BNX2_TPAT_CPU_STATE_BREAKPOINT                  (1L<<0)
+#define BNX2_TPAT_CPU_STATE_BAD_INST_HALTED             (1L<<2)
+#define BNX2_TPAT_CPU_STATE_PAGE_0_DATA_HALTED          (1L<<3)
+#define BNX2_TPAT_CPU_STATE_PAGE_0_INST_HALTED          (1L<<4)
+#define BNX2_TPAT_CPU_STATE_BAD_DATA_ADDR_HALTED        (1L<<5)
+#define BNX2_TPAT_CPU_STATE_BAD_pc_HALTED               (1L<<6)
+#define BNX2_TPAT_CPU_STATE_ALIGN_HALTED                (1L<<7)
+#define BNX2_TPAT_CPU_STATE_FIO_ABORT_HALTED            (1L<<8)
+#define BNX2_TPAT_CPU_STATE_SOFT_HALTED                         (1L<<10)
+#define BNX2_TPAT_CPU_STATE_SPAD_UNDERFLOW              (1L<<11)
+#define BNX2_TPAT_CPU_STATE_INTERRRUPT                  (1L<<12)
+#define BNX2_TPAT_CPU_STATE_DATA_ACCESS_STALL           (1L<<14)
+#define BNX2_TPAT_CPU_STATE_INST_FETCH_STALL            (1L<<15)
+#define BNX2_TPAT_CPU_STATE_BLOCKED_READ                (1L<<31)
+
+#define BNX2_TPAT_CPU_EVENT_MASK                       0x00085008
+#define BNX2_TPAT_CPU_EVENT_MASK_BREAKPOINT_MASK        (1L<<0)
+#define BNX2_TPAT_CPU_EVENT_MASK_BAD_INST_HALTED_MASK   (1L<<2)
+#define BNX2_TPAT_CPU_EVENT_MASK_PAGE_0_DATA_HALTED_MASK        (1L<<3)
+#define BNX2_TPAT_CPU_EVENT_MASK_PAGE_0_INST_HALTED_MASK        (1L<<4)
+#define BNX2_TPAT_CPU_EVENT_MASK_BAD_DATA_ADDR_HALTED_MASK      (1L<<5)
+#define BNX2_TPAT_CPU_EVENT_MASK_BAD_PC_HALTED_MASK     (1L<<6)
+#define BNX2_TPAT_CPU_EVENT_MASK_ALIGN_HALTED_MASK      (1L<<7)
+#define BNX2_TPAT_CPU_EVENT_MASK_FIO_ABORT_MASK                 (1L<<8)
+#define BNX2_TPAT_CPU_EVENT_MASK_SOFT_HALTED_MASK       (1L<<10)
+#define BNX2_TPAT_CPU_EVENT_MASK_SPAD_UNDERFLOW_MASK    (1L<<11)
+#define BNX2_TPAT_CPU_EVENT_MASK_INTERRUPT_MASK                 (1L<<12)
+
+#define BNX2_TPAT_CPU_PROGRAM_COUNTER                  0x0008501c
+#define BNX2_TPAT_CPU_INSTRUCTION                      0x00085020
+#define BNX2_TPAT_CPU_DATA_ACCESS                      0x00085024
+#define BNX2_TPAT_CPU_INTERRUPT_ENABLE                 0x00085028
+#define BNX2_TPAT_CPU_INTERRUPT_VECTOR                 0x0008502c
+#define BNX2_TPAT_CPU_INTERRUPT_SAVED_PC               0x00085030
+#define BNX2_TPAT_CPU_HW_BREAKPOINT                    0x00085034
+#define BNX2_TPAT_CPU_HW_BREAKPOINT_DISABLE             (1L<<0)
+#define BNX2_TPAT_CPU_HW_BREAKPOINT_ADDRESS             (0x3fffffffL<<2)
+
+#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK                  0x00085038
+#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK_1_VALUE           (0x7ffL<<0)
+#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK_1_PEEK_EN                 (1L<<11)
+#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK_1_SEL             (0xfL<<12)
+#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK_2_VALUE           (0x7ffL<<16)
+#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK_2_PEEK_EN                 (1L<<27)
+#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK_2_SEL             (0xfL<<28)
+
+#define BNX2_TPAT_CPU_LAST_BRANCH_ADDR                 0x00085048
+#define BNX2_TPAT_CPU_LAST_BRANCH_ADDR_TYPE             (1L<<1)
+#define BNX2_TPAT_CPU_LAST_BRANCH_ADDR_TYPE_JUMP        (0L<<1)
+#define BNX2_TPAT_CPU_LAST_BRANCH_ADDR_TYPE_BRANCH      (1L<<1)
+#define BNX2_TPAT_CPU_LAST_BRANCH_ADDR_LBA              (0x3fffffffL<<2)
+
+#define BNX2_TPAT_CPU_REG_FILE                         0x00085200
+#define BNX2_TPAT_FTQ_DATA                             0x000853c0
+#define BNX2_TPAT_FTQ_CMD                              0x000853f8
+#define BNX2_TPAT_FTQ_CMD_OFFSET                        (0x3ffL<<0)
+#define BNX2_TPAT_FTQ_CMD_WR_TOP                        (1L<<10)
+#define BNX2_TPAT_FTQ_CMD_WR_TOP_0                      (0L<<10)
+#define BNX2_TPAT_FTQ_CMD_WR_TOP_1                      (1L<<10)
+#define BNX2_TPAT_FTQ_CMD_SFT_RESET                     (1L<<25)
+#define BNX2_TPAT_FTQ_CMD_RD_DATA                       (1L<<26)
+#define BNX2_TPAT_FTQ_CMD_ADD_INTERVEN                  (1L<<27)
+#define BNX2_TPAT_FTQ_CMD_ADD_DATA                      (1L<<28)
+#define BNX2_TPAT_FTQ_CMD_INTERVENE_CLR                         (1L<<29)
+#define BNX2_TPAT_FTQ_CMD_POP                           (1L<<30)
+#define BNX2_TPAT_FTQ_CMD_BUSY                          (1L<<31)
+
+#define BNX2_TPAT_FTQ_CTL                              0x000853fc
+#define BNX2_TPAT_FTQ_CTL_INTERVENE                     (1L<<0)
+#define BNX2_TPAT_FTQ_CTL_OVERFLOW                      (1L<<1)
+#define BNX2_TPAT_FTQ_CTL_FORCE_INTERVENE               (1L<<2)
+#define BNX2_TPAT_FTQ_CTL_MAX_DEPTH                     (0x3ffL<<12)
+#define BNX2_TPAT_FTQ_CTL_CUR_DEPTH                     (0x3ffL<<22)
+
+#define BNX2_TPAT_SCRATCH                              0x000a0000
+
+
+/*
+ *  rxp_reg definition
+ *  offset: 0xc0000
+ */
+#define BNX2_RXP_CPU_MODE                              0x000c5000
+#define BNX2_RXP_CPU_MODE_LOCAL_RST                     (1L<<0)
+#define BNX2_RXP_CPU_MODE_STEP_ENA                      (1L<<1)
+#define BNX2_RXP_CPU_MODE_PAGE_0_DATA_ENA               (1L<<2)
+#define BNX2_RXP_CPU_MODE_PAGE_0_INST_ENA               (1L<<3)
+#define BNX2_RXP_CPU_MODE_MSG_BIT1                      (1L<<6)
+#define BNX2_RXP_CPU_MODE_INTERRUPT_ENA                         (1L<<7)
+#define BNX2_RXP_CPU_MODE_SOFT_HALT                     (1L<<10)
+#define BNX2_RXP_CPU_MODE_BAD_DATA_HALT_ENA             (1L<<11)
+#define BNX2_RXP_CPU_MODE_BAD_INST_HALT_ENA             (1L<<12)
+#define BNX2_RXP_CPU_MODE_FIO_ABORT_HALT_ENA            (1L<<13)
+#define BNX2_RXP_CPU_MODE_SPAD_UNDERFLOW_HALT_ENA       (1L<<15)
+
+#define BNX2_RXP_CPU_STATE                             0x000c5004
+#define BNX2_RXP_CPU_STATE_BREAKPOINT                   (1L<<0)
+#define BNX2_RXP_CPU_STATE_BAD_INST_HALTED              (1L<<2)
+#define BNX2_RXP_CPU_STATE_PAGE_0_DATA_HALTED           (1L<<3)
+#define BNX2_RXP_CPU_STATE_PAGE_0_INST_HALTED           (1L<<4)
+#define BNX2_RXP_CPU_STATE_BAD_DATA_ADDR_HALTED                 (1L<<5)
+#define BNX2_RXP_CPU_STATE_BAD_pc_HALTED                (1L<<6)
+#define BNX2_RXP_CPU_STATE_ALIGN_HALTED                         (1L<<7)
+#define BNX2_RXP_CPU_STATE_FIO_ABORT_HALTED             (1L<<8)
+#define BNX2_RXP_CPU_STATE_SOFT_HALTED                  (1L<<10)
+#define BNX2_RXP_CPU_STATE_SPAD_UNDERFLOW               (1L<<11)
+#define BNX2_RXP_CPU_STATE_INTERRRUPT                   (1L<<12)
+#define BNX2_RXP_CPU_STATE_DATA_ACCESS_STALL            (1L<<14)
+#define BNX2_RXP_CPU_STATE_INST_FETCH_STALL             (1L<<15)
+#define BNX2_RXP_CPU_STATE_BLOCKED_READ                         (1L<<31)
+
+#define BNX2_RXP_CPU_EVENT_MASK                                0x000c5008
+#define BNX2_RXP_CPU_EVENT_MASK_BREAKPOINT_MASK                 (1L<<0)
+#define BNX2_RXP_CPU_EVENT_MASK_BAD_INST_HALTED_MASK    (1L<<2)
+#define BNX2_RXP_CPU_EVENT_MASK_PAGE_0_DATA_HALTED_MASK         (1L<<3)
+#define BNX2_RXP_CPU_EVENT_MASK_PAGE_0_INST_HALTED_MASK         (1L<<4)
+#define BNX2_RXP_CPU_EVENT_MASK_BAD_DATA_ADDR_HALTED_MASK       (1L<<5)
+#define BNX2_RXP_CPU_EVENT_MASK_BAD_PC_HALTED_MASK      (1L<<6)
+#define BNX2_RXP_CPU_EVENT_MASK_ALIGN_HALTED_MASK       (1L<<7)
+#define BNX2_RXP_CPU_EVENT_MASK_FIO_ABORT_MASK          (1L<<8)
+#define BNX2_RXP_CPU_EVENT_MASK_SOFT_HALTED_MASK        (1L<<10)
+#define BNX2_RXP_CPU_EVENT_MASK_SPAD_UNDERFLOW_MASK     (1L<<11)
+#define BNX2_RXP_CPU_EVENT_MASK_INTERRUPT_MASK          (1L<<12)
+
+#define BNX2_RXP_CPU_PROGRAM_COUNTER                   0x000c501c
+#define BNX2_RXP_CPU_INSTRUCTION                       0x000c5020
+#define BNX2_RXP_CPU_DATA_ACCESS                       0x000c5024
+#define BNX2_RXP_CPU_INTERRUPT_ENABLE                  0x000c5028
+#define BNX2_RXP_CPU_INTERRUPT_VECTOR                  0x000c502c
+#define BNX2_RXP_CPU_INTERRUPT_SAVED_PC                        0x000c5030
+#define BNX2_RXP_CPU_HW_BREAKPOINT                     0x000c5034
+#define BNX2_RXP_CPU_HW_BREAKPOINT_DISABLE              (1L<<0)
+#define BNX2_RXP_CPU_HW_BREAKPOINT_ADDRESS              (0x3fffffffL<<2)
+
+#define BNX2_RXP_CPU_DEBUG_VECT_PEEK                   0x000c5038
+#define BNX2_RXP_CPU_DEBUG_VECT_PEEK_1_VALUE            (0x7ffL<<0)
+#define BNX2_RXP_CPU_DEBUG_VECT_PEEK_1_PEEK_EN          (1L<<11)
+#define BNX2_RXP_CPU_DEBUG_VECT_PEEK_1_SEL              (0xfL<<12)
+#define BNX2_RXP_CPU_DEBUG_VECT_PEEK_2_VALUE            (0x7ffL<<16)
+#define BNX2_RXP_CPU_DEBUG_VECT_PEEK_2_PEEK_EN          (1L<<27)
+#define BNX2_RXP_CPU_DEBUG_VECT_PEEK_2_SEL              (0xfL<<28)
+
+#define BNX2_RXP_CPU_LAST_BRANCH_ADDR                  0x000c5048
+#define BNX2_RXP_CPU_LAST_BRANCH_ADDR_TYPE              (1L<<1)
+#define BNX2_RXP_CPU_LAST_BRANCH_ADDR_TYPE_JUMP                 (0L<<1)
+#define BNX2_RXP_CPU_LAST_BRANCH_ADDR_TYPE_BRANCH       (1L<<1)
+#define BNX2_RXP_CPU_LAST_BRANCH_ADDR_LBA               (0x3fffffffL<<2)
+
+#define BNX2_RXP_CPU_REG_FILE                          0x000c5200
+#define BNX2_RXP_CFTQ_DATA                             0x000c5380
+#define BNX2_RXP_CFTQ_CMD                              0x000c53b8
+#define BNX2_RXP_CFTQ_CMD_OFFSET                        (0x3ffL<<0)
+#define BNX2_RXP_CFTQ_CMD_WR_TOP                        (1L<<10)
+#define BNX2_RXP_CFTQ_CMD_WR_TOP_0                      (0L<<10)
+#define BNX2_RXP_CFTQ_CMD_WR_TOP_1                      (1L<<10)
+#define BNX2_RXP_CFTQ_CMD_SFT_RESET                     (1L<<25)
+#define BNX2_RXP_CFTQ_CMD_RD_DATA                       (1L<<26)
+#define BNX2_RXP_CFTQ_CMD_ADD_INTERVEN                  (1L<<27)
+#define BNX2_RXP_CFTQ_CMD_ADD_DATA                      (1L<<28)
+#define BNX2_RXP_CFTQ_CMD_INTERVENE_CLR                         (1L<<29)
+#define BNX2_RXP_CFTQ_CMD_POP                           (1L<<30)
+#define BNX2_RXP_CFTQ_CMD_BUSY                          (1L<<31)
+
+#define BNX2_RXP_CFTQ_CTL                              0x000c53bc
+#define BNX2_RXP_CFTQ_CTL_INTERVENE                     (1L<<0)
+#define BNX2_RXP_CFTQ_CTL_OVERFLOW                      (1L<<1)
+#define BNX2_RXP_CFTQ_CTL_FORCE_INTERVENE               (1L<<2)
+#define BNX2_RXP_CFTQ_CTL_MAX_DEPTH                     (0x3ffL<<12)
+#define BNX2_RXP_CFTQ_CTL_CUR_DEPTH                     (0x3ffL<<22)
+
+#define BNX2_RXP_FTQ_DATA                              0x000c53c0
+#define BNX2_RXP_FTQ_CMD                               0x000c53f8
+#define BNX2_RXP_FTQ_CMD_OFFSET                                 (0x3ffL<<0)
+#define BNX2_RXP_FTQ_CMD_WR_TOP                                 (1L<<10)
+#define BNX2_RXP_FTQ_CMD_WR_TOP_0                       (0L<<10)
+#define BNX2_RXP_FTQ_CMD_WR_TOP_1                       (1L<<10)
+#define BNX2_RXP_FTQ_CMD_SFT_RESET                      (1L<<25)
+#define BNX2_RXP_FTQ_CMD_RD_DATA                        (1L<<26)
+#define BNX2_RXP_FTQ_CMD_ADD_INTERVEN                   (1L<<27)
+#define BNX2_RXP_FTQ_CMD_ADD_DATA                       (1L<<28)
+#define BNX2_RXP_FTQ_CMD_INTERVENE_CLR                  (1L<<29)
+#define BNX2_RXP_FTQ_CMD_POP                            (1L<<30)
+#define BNX2_RXP_FTQ_CMD_BUSY                           (1L<<31)
+
+#define BNX2_RXP_FTQ_CTL                               0x000c53fc
+#define BNX2_RXP_FTQ_CTL_INTERVENE                      (1L<<0)
+#define BNX2_RXP_FTQ_CTL_OVERFLOW                       (1L<<1)
+#define BNX2_RXP_FTQ_CTL_FORCE_INTERVENE                (1L<<2)
+#define BNX2_RXP_FTQ_CTL_MAX_DEPTH                      (0x3ffL<<12)
+#define BNX2_RXP_FTQ_CTL_CUR_DEPTH                      (0x3ffL<<22)
+
+#define BNX2_RXP_SCRATCH                               0x000e0000
+
+
+/*
+ *  com_reg definition
+ *  offset: 0x100000
+ */
+#define BNX2_COM_CPU_MODE                              0x00105000
+#define BNX2_COM_CPU_MODE_LOCAL_RST                     (1L<<0)
+#define BNX2_COM_CPU_MODE_STEP_ENA                      (1L<<1)
+#define BNX2_COM_CPU_MODE_PAGE_0_DATA_ENA               (1L<<2)
+#define BNX2_COM_CPU_MODE_PAGE_0_INST_ENA               (1L<<3)
+#define BNX2_COM_CPU_MODE_MSG_BIT1                      (1L<<6)
+#define BNX2_COM_CPU_MODE_INTERRUPT_ENA                         (1L<<7)
+#define BNX2_COM_CPU_MODE_SOFT_HALT                     (1L<<10)
+#define BNX2_COM_CPU_MODE_BAD_DATA_HALT_ENA             (1L<<11)
+#define BNX2_COM_CPU_MODE_BAD_INST_HALT_ENA             (1L<<12)
+#define BNX2_COM_CPU_MODE_FIO_ABORT_HALT_ENA            (1L<<13)
+#define BNX2_COM_CPU_MODE_SPAD_UNDERFLOW_HALT_ENA       (1L<<15)
+
+#define BNX2_COM_CPU_STATE                             0x00105004
+#define BNX2_COM_CPU_STATE_BREAKPOINT                   (1L<<0)
+#define BNX2_COM_CPU_STATE_BAD_INST_HALTED              (1L<<2)
+#define BNX2_COM_CPU_STATE_PAGE_0_DATA_HALTED           (1L<<3)
+#define BNX2_COM_CPU_STATE_PAGE_0_INST_HALTED           (1L<<4)
+#define BNX2_COM_CPU_STATE_BAD_DATA_ADDR_HALTED                 (1L<<5)
+#define BNX2_COM_CPU_STATE_BAD_pc_HALTED                (1L<<6)
+#define BNX2_COM_CPU_STATE_ALIGN_HALTED                         (1L<<7)
+#define BNX2_COM_CPU_STATE_FIO_ABORT_HALTED             (1L<<8)
+#define BNX2_COM_CPU_STATE_SOFT_HALTED                  (1L<<10)
+#define BNX2_COM_CPU_STATE_SPAD_UNDERFLOW               (1L<<11)
+#define BNX2_COM_CPU_STATE_INTERRRUPT                   (1L<<12)
+#define BNX2_COM_CPU_STATE_DATA_ACCESS_STALL            (1L<<14)
+#define BNX2_COM_CPU_STATE_INST_FETCH_STALL             (1L<<15)
+#define BNX2_COM_CPU_STATE_BLOCKED_READ                         (1L<<31)
+
+#define BNX2_COM_CPU_EVENT_MASK                                0x00105008
+#define BNX2_COM_CPU_EVENT_MASK_BREAKPOINT_MASK                 (1L<<0)
+#define BNX2_COM_CPU_EVENT_MASK_BAD_INST_HALTED_MASK    (1L<<2)
+#define BNX2_COM_CPU_EVENT_MASK_PAGE_0_DATA_HALTED_MASK         (1L<<3)
+#define BNX2_COM_CPU_EVENT_MASK_PAGE_0_INST_HALTED_MASK         (1L<<4)
+#define BNX2_COM_CPU_EVENT_MASK_BAD_DATA_ADDR_HALTED_MASK       (1L<<5)
+#define BNX2_COM_CPU_EVENT_MASK_BAD_PC_HALTED_MASK      (1L<<6)
+#define BNX2_COM_CPU_EVENT_MASK_ALIGN_HALTED_MASK       (1L<<7)
+#define BNX2_COM_CPU_EVENT_MASK_FIO_ABORT_MASK          (1L<<8)
+#define BNX2_COM_CPU_EVENT_MASK_SOFT_HALTED_MASK        (1L<<10)
+#define BNX2_COM_CPU_EVENT_MASK_SPAD_UNDERFLOW_MASK     (1L<<11)
+#define BNX2_COM_CPU_EVENT_MASK_INTERRUPT_MASK          (1L<<12)
+
+#define BNX2_COM_CPU_PROGRAM_COUNTER                   0x0010501c
+#define BNX2_COM_CPU_INSTRUCTION                       0x00105020
+#define BNX2_COM_CPU_DATA_ACCESS                       0x00105024
+#define BNX2_COM_CPU_INTERRUPT_ENABLE                  0x00105028
+#define BNX2_COM_CPU_INTERRUPT_VECTOR                  0x0010502c
+#define BNX2_COM_CPU_INTERRUPT_SAVED_PC                        0x00105030
+#define BNX2_COM_CPU_HW_BREAKPOINT                     0x00105034
+#define BNX2_COM_CPU_HW_BREAKPOINT_DISABLE              (1L<<0)
+#define BNX2_COM_CPU_HW_BREAKPOINT_ADDRESS              (0x3fffffffL<<2)
+
+#define BNX2_COM_CPU_DEBUG_VECT_PEEK                   0x00105038
+#define BNX2_COM_CPU_DEBUG_VECT_PEEK_1_VALUE            (0x7ffL<<0)
+#define BNX2_COM_CPU_DEBUG_VECT_PEEK_1_PEEK_EN          (1L<<11)
+#define BNX2_COM_CPU_DEBUG_VECT_PEEK_1_SEL              (0xfL<<12)
+#define BNX2_COM_CPU_DEBUG_VECT_PEEK_2_VALUE            (0x7ffL<<16)
+#define BNX2_COM_CPU_DEBUG_VECT_PEEK_2_PEEK_EN          (1L<<27)
+#define BNX2_COM_CPU_DEBUG_VECT_PEEK_2_SEL              (0xfL<<28)
+
+#define BNX2_COM_CPU_LAST_BRANCH_ADDR                  0x00105048
+#define BNX2_COM_CPU_LAST_BRANCH_ADDR_TYPE              (1L<<1)
+#define BNX2_COM_CPU_LAST_BRANCH_ADDR_TYPE_JUMP                 (0L<<1)
+#define BNX2_COM_CPU_LAST_BRANCH_ADDR_TYPE_BRANCH       (1L<<1)
+#define BNX2_COM_CPU_LAST_BRANCH_ADDR_LBA               (0x3fffffffL<<2)
+
+#define BNX2_COM_CPU_REG_FILE                          0x00105200
+#define BNX2_COM_COMXQ_FTQ_DATA                                0x00105340
+#define BNX2_COM_COMXQ_FTQ_CMD                         0x00105378
+#define BNX2_COM_COMXQ_FTQ_CMD_OFFSET                   (0x3ffL<<0)
+#define BNX2_COM_COMXQ_FTQ_CMD_WR_TOP                   (1L<<10)
+#define BNX2_COM_COMXQ_FTQ_CMD_WR_TOP_0                         (0L<<10)
+#define BNX2_COM_COMXQ_FTQ_CMD_WR_TOP_1                         (1L<<10)
+#define BNX2_COM_COMXQ_FTQ_CMD_SFT_RESET                (1L<<25)
+#define BNX2_COM_COMXQ_FTQ_CMD_RD_DATA                  (1L<<26)
+#define BNX2_COM_COMXQ_FTQ_CMD_ADD_INTERVEN             (1L<<27)
+#define BNX2_COM_COMXQ_FTQ_CMD_ADD_DATA                         (1L<<28)
+#define BNX2_COM_COMXQ_FTQ_CMD_INTERVENE_CLR            (1L<<29)
+#define BNX2_COM_COMXQ_FTQ_CMD_POP                      (1L<<30)
+#define BNX2_COM_COMXQ_FTQ_CMD_BUSY                     (1L<<31)
+
+#define BNX2_COM_COMXQ_FTQ_CTL                         0x0010537c
+#define BNX2_COM_COMXQ_FTQ_CTL_INTERVENE                (1L<<0)
+#define BNX2_COM_COMXQ_FTQ_CTL_OVERFLOW                         (1L<<1)
+#define BNX2_COM_COMXQ_FTQ_CTL_FORCE_INTERVENE          (1L<<2)
+#define BNX2_COM_COMXQ_FTQ_CTL_MAX_DEPTH                (0x3ffL<<12)
+#define BNX2_COM_COMXQ_FTQ_CTL_CUR_DEPTH                (0x3ffL<<22)
+
+#define BNX2_COM_COMTQ_FTQ_DATA                                0x00105380
+#define BNX2_COM_COMTQ_FTQ_CMD                         0x001053b8
+#define BNX2_COM_COMTQ_FTQ_CMD_OFFSET                   (0x3ffL<<0)
+#define BNX2_COM_COMTQ_FTQ_CMD_WR_TOP                   (1L<<10)
+#define BNX2_COM_COMTQ_FTQ_CMD_WR_TOP_0                         (0L<<10)
+#define BNX2_COM_COMTQ_FTQ_CMD_WR_TOP_1                         (1L<<10)
+#define BNX2_COM_COMTQ_FTQ_CMD_SFT_RESET                (1L<<25)
+#define BNX2_COM_COMTQ_FTQ_CMD_RD_DATA                  (1L<<26)
+#define BNX2_COM_COMTQ_FTQ_CMD_ADD_INTERVEN             (1L<<27)
+#define BNX2_COM_COMTQ_FTQ_CMD_ADD_DATA                         (1L<<28)
+#define BNX2_COM_COMTQ_FTQ_CMD_INTERVENE_CLR            (1L<<29)
+#define BNX2_COM_COMTQ_FTQ_CMD_POP                      (1L<<30)
+#define BNX2_COM_COMTQ_FTQ_CMD_BUSY                     (1L<<31)
+
+#define BNX2_COM_COMTQ_FTQ_CTL                         0x001053bc
+#define BNX2_COM_COMTQ_FTQ_CTL_INTERVENE                (1L<<0)
+#define BNX2_COM_COMTQ_FTQ_CTL_OVERFLOW                         (1L<<1)
+#define BNX2_COM_COMTQ_FTQ_CTL_FORCE_INTERVENE          (1L<<2)
+#define BNX2_COM_COMTQ_FTQ_CTL_MAX_DEPTH                (0x3ffL<<12)
+#define BNX2_COM_COMTQ_FTQ_CTL_CUR_DEPTH                (0x3ffL<<22)
+
+#define BNX2_COM_COMQ_FTQ_DATA                         0x001053c0
+#define BNX2_COM_COMQ_FTQ_CMD                          0x001053f8
+#define BNX2_COM_COMQ_FTQ_CMD_OFFSET                    (0x3ffL<<0)
+#define BNX2_COM_COMQ_FTQ_CMD_WR_TOP                    (1L<<10)
+#define BNX2_COM_COMQ_FTQ_CMD_WR_TOP_0                  (0L<<10)
+#define BNX2_COM_COMQ_FTQ_CMD_WR_TOP_1                  (1L<<10)
+#define BNX2_COM_COMQ_FTQ_CMD_SFT_RESET                         (1L<<25)
+#define BNX2_COM_COMQ_FTQ_CMD_RD_DATA                   (1L<<26)
+#define BNX2_COM_COMQ_FTQ_CMD_ADD_INTERVEN              (1L<<27)
+#define BNX2_COM_COMQ_FTQ_CMD_ADD_DATA                  (1L<<28)
+#define BNX2_COM_COMQ_FTQ_CMD_INTERVENE_CLR             (1L<<29)
+#define BNX2_COM_COMQ_FTQ_CMD_POP                       (1L<<30)
+#define BNX2_COM_COMQ_FTQ_CMD_BUSY                      (1L<<31)
+
+#define BNX2_COM_COMQ_FTQ_CTL                          0x001053fc
+#define BNX2_COM_COMQ_FTQ_CTL_INTERVENE                         (1L<<0)
+#define BNX2_COM_COMQ_FTQ_CTL_OVERFLOW                  (1L<<1)
+#define BNX2_COM_COMQ_FTQ_CTL_FORCE_INTERVENE           (1L<<2)
+#define BNX2_COM_COMQ_FTQ_CTL_MAX_DEPTH                         (0x3ffL<<12)
+#define BNX2_COM_COMQ_FTQ_CTL_CUR_DEPTH                         (0x3ffL<<22)
+
+#define BNX2_COM_SCRATCH                               0x00120000
+
+
+/*
+ *  cp_reg definition
+ *  offset: 0x180000
+ */
+#define BNX2_CP_CPU_MODE                               0x00185000
+#define BNX2_CP_CPU_MODE_LOCAL_RST                      (1L<<0)
+#define BNX2_CP_CPU_MODE_STEP_ENA                       (1L<<1)
+#define BNX2_CP_CPU_MODE_PAGE_0_DATA_ENA                (1L<<2)
+#define BNX2_CP_CPU_MODE_PAGE_0_INST_ENA                (1L<<3)
+#define BNX2_CP_CPU_MODE_MSG_BIT1                       (1L<<6)
+#define BNX2_CP_CPU_MODE_INTERRUPT_ENA                  (1L<<7)
+#define BNX2_CP_CPU_MODE_SOFT_HALT                      (1L<<10)
+#define BNX2_CP_CPU_MODE_BAD_DATA_HALT_ENA              (1L<<11)
+#define BNX2_CP_CPU_MODE_BAD_INST_HALT_ENA              (1L<<12)
+#define BNX2_CP_CPU_MODE_FIO_ABORT_HALT_ENA             (1L<<13)
+#define BNX2_CP_CPU_MODE_SPAD_UNDERFLOW_HALT_ENA        (1L<<15)
+
+#define BNX2_CP_CPU_STATE                              0x00185004
+#define BNX2_CP_CPU_STATE_BREAKPOINT                    (1L<<0)
+#define BNX2_CP_CPU_STATE_BAD_INST_HALTED               (1L<<2)
+#define BNX2_CP_CPU_STATE_PAGE_0_DATA_HALTED            (1L<<3)
+#define BNX2_CP_CPU_STATE_PAGE_0_INST_HALTED            (1L<<4)
+#define BNX2_CP_CPU_STATE_BAD_DATA_ADDR_HALTED          (1L<<5)
+#define BNX2_CP_CPU_STATE_BAD_pc_HALTED                         (1L<<6)
+#define BNX2_CP_CPU_STATE_ALIGN_HALTED                  (1L<<7)
+#define BNX2_CP_CPU_STATE_FIO_ABORT_HALTED              (1L<<8)
+#define BNX2_CP_CPU_STATE_SOFT_HALTED                   (1L<<10)
+#define BNX2_CP_CPU_STATE_SPAD_UNDERFLOW                (1L<<11)
+#define BNX2_CP_CPU_STATE_INTERRRUPT                    (1L<<12)
+#define BNX2_CP_CPU_STATE_DATA_ACCESS_STALL             (1L<<14)
+#define BNX2_CP_CPU_STATE_INST_FETCH_STALL              (1L<<15)
+#define BNX2_CP_CPU_STATE_BLOCKED_READ                  (1L<<31)
+
+#define BNX2_CP_CPU_EVENT_MASK                         0x00185008
+#define BNX2_CP_CPU_EVENT_MASK_BREAKPOINT_MASK          (1L<<0)
+#define BNX2_CP_CPU_EVENT_MASK_BAD_INST_HALTED_MASK     (1L<<2)
+#define BNX2_CP_CPU_EVENT_MASK_PAGE_0_DATA_HALTED_MASK  (1L<<3)
+#define BNX2_CP_CPU_EVENT_MASK_PAGE_0_INST_HALTED_MASK  (1L<<4)
+#define BNX2_CP_CPU_EVENT_MASK_BAD_DATA_ADDR_HALTED_MASK        (1L<<5)
+#define BNX2_CP_CPU_EVENT_MASK_BAD_PC_HALTED_MASK       (1L<<6)
+#define BNX2_CP_CPU_EVENT_MASK_ALIGN_HALTED_MASK        (1L<<7)
+#define BNX2_CP_CPU_EVENT_MASK_FIO_ABORT_MASK           (1L<<8)
+#define BNX2_CP_CPU_EVENT_MASK_SOFT_HALTED_MASK                 (1L<<10)
+#define BNX2_CP_CPU_EVENT_MASK_SPAD_UNDERFLOW_MASK      (1L<<11)
+#define BNX2_CP_CPU_EVENT_MASK_INTERRUPT_MASK           (1L<<12)
+
+#define BNX2_CP_CPU_PROGRAM_COUNTER                    0x0018501c
+#define BNX2_CP_CPU_INSTRUCTION                                0x00185020
+#define BNX2_CP_CPU_DATA_ACCESS                                0x00185024
+#define BNX2_CP_CPU_INTERRUPT_ENABLE                   0x00185028
+#define BNX2_CP_CPU_INTERRUPT_VECTOR                   0x0018502c
+#define BNX2_CP_CPU_INTERRUPT_SAVED_PC                 0x00185030
+#define BNX2_CP_CPU_HW_BREAKPOINT                      0x00185034
+#define BNX2_CP_CPU_HW_BREAKPOINT_DISABLE               (1L<<0)
+#define BNX2_CP_CPU_HW_BREAKPOINT_ADDRESS               (0x3fffffffL<<2)
+
+#define BNX2_CP_CPU_DEBUG_VECT_PEEK                    0x00185038
+#define BNX2_CP_CPU_DEBUG_VECT_PEEK_1_VALUE             (0x7ffL<<0)
+#define BNX2_CP_CPU_DEBUG_VECT_PEEK_1_PEEK_EN           (1L<<11)
+#define BNX2_CP_CPU_DEBUG_VECT_PEEK_1_SEL               (0xfL<<12)
+#define BNX2_CP_CPU_DEBUG_VECT_PEEK_2_VALUE             (0x7ffL<<16)
+#define BNX2_CP_CPU_DEBUG_VECT_PEEK_2_PEEK_EN           (1L<<27)
+#define BNX2_CP_CPU_DEBUG_VECT_PEEK_2_SEL               (0xfL<<28)
+
+#define BNX2_CP_CPU_LAST_BRANCH_ADDR                   0x00185048
+#define BNX2_CP_CPU_LAST_BRANCH_ADDR_TYPE               (1L<<1)
+#define BNX2_CP_CPU_LAST_BRANCH_ADDR_TYPE_JUMP          (0L<<1)
+#define BNX2_CP_CPU_LAST_BRANCH_ADDR_TYPE_BRANCH        (1L<<1)
+#define BNX2_CP_CPU_LAST_BRANCH_ADDR_LBA                (0x3fffffffL<<2)
+
+#define BNX2_CP_CPU_REG_FILE                           0x00185200
+#define BNX2_CP_CPQ_FTQ_DATA                           0x001853c0
+#define BNX2_CP_CPQ_FTQ_CMD                            0x001853f8
+#define BNX2_CP_CPQ_FTQ_CMD_OFFSET                      (0x3ffL<<0)
+#define BNX2_CP_CPQ_FTQ_CMD_WR_TOP                      (1L<<10)
+#define BNX2_CP_CPQ_FTQ_CMD_WR_TOP_0                    (0L<<10)
+#define BNX2_CP_CPQ_FTQ_CMD_WR_TOP_1                    (1L<<10)
+#define BNX2_CP_CPQ_FTQ_CMD_SFT_RESET                   (1L<<25)
+#define BNX2_CP_CPQ_FTQ_CMD_RD_DATA                     (1L<<26)
+#define BNX2_CP_CPQ_FTQ_CMD_ADD_INTERVEN                (1L<<27)
+#define BNX2_CP_CPQ_FTQ_CMD_ADD_DATA                    (1L<<28)
+#define BNX2_CP_CPQ_FTQ_CMD_INTERVENE_CLR               (1L<<29)
+#define BNX2_CP_CPQ_FTQ_CMD_POP                                 (1L<<30)
+#define BNX2_CP_CPQ_FTQ_CMD_BUSY                        (1L<<31)
+
+#define BNX2_CP_CPQ_FTQ_CTL                            0x001853fc
+#define BNX2_CP_CPQ_FTQ_CTL_INTERVENE                   (1L<<0)
+#define BNX2_CP_CPQ_FTQ_CTL_OVERFLOW                    (1L<<1)
+#define BNX2_CP_CPQ_FTQ_CTL_FORCE_INTERVENE             (1L<<2)
+#define BNX2_CP_CPQ_FTQ_CTL_MAX_DEPTH                   (0x3ffL<<12)
+#define BNX2_CP_CPQ_FTQ_CTL_CUR_DEPTH                   (0x3ffL<<22)
+
+#define BNX2_CP_SCRATCH                                        0x001a0000
+
+
+/*
+ *  mcp_reg definition
+ *  offset: 0x140000
+ */
+#define BNX2_MCP_CPU_MODE                              0x00145000
+#define BNX2_MCP_CPU_MODE_LOCAL_RST                     (1L<<0)
+#define BNX2_MCP_CPU_MODE_STEP_ENA                      (1L<<1)
+#define BNX2_MCP_CPU_MODE_PAGE_0_DATA_ENA               (1L<<2)
+#define BNX2_MCP_CPU_MODE_PAGE_0_INST_ENA               (1L<<3)
+#define BNX2_MCP_CPU_MODE_MSG_BIT1                      (1L<<6)
+#define BNX2_MCP_CPU_MODE_INTERRUPT_ENA                         (1L<<7)
+#define BNX2_MCP_CPU_MODE_SOFT_HALT                     (1L<<10)
+#define BNX2_MCP_CPU_MODE_BAD_DATA_HALT_ENA             (1L<<11)
+#define BNX2_MCP_CPU_MODE_BAD_INST_HALT_ENA             (1L<<12)
+#define BNX2_MCP_CPU_MODE_FIO_ABORT_HALT_ENA            (1L<<13)
+#define BNX2_MCP_CPU_MODE_SPAD_UNDERFLOW_HALT_ENA       (1L<<15)
+
+#define BNX2_MCP_CPU_STATE                             0x00145004
+#define BNX2_MCP_CPU_STATE_BREAKPOINT                   (1L<<0)
+#define BNX2_MCP_CPU_STATE_BAD_INST_HALTED              (1L<<2)
+#define BNX2_MCP_CPU_STATE_PAGE_0_DATA_HALTED           (1L<<3)
+#define BNX2_MCP_CPU_STATE_PAGE_0_INST_HALTED           (1L<<4)
+#define BNX2_MCP_CPU_STATE_BAD_DATA_ADDR_HALTED                 (1L<<5)
+#define BNX2_MCP_CPU_STATE_BAD_pc_HALTED                (1L<<6)
+#define BNX2_MCP_CPU_STATE_ALIGN_HALTED                         (1L<<7)
+#define BNX2_MCP_CPU_STATE_FIO_ABORT_HALTED             (1L<<8)
+#define BNX2_MCP_CPU_STATE_SOFT_HALTED                  (1L<<10)
+#define BNX2_MCP_CPU_STATE_SPAD_UNDERFLOW               (1L<<11)
+#define BNX2_MCP_CPU_STATE_INTERRRUPT                   (1L<<12)
+#define BNX2_MCP_CPU_STATE_DATA_ACCESS_STALL            (1L<<14)
+#define BNX2_MCP_CPU_STATE_INST_FETCH_STALL             (1L<<15)
+#define BNX2_MCP_CPU_STATE_BLOCKED_READ                         (1L<<31)
+
+#define BNX2_MCP_CPU_EVENT_MASK                                0x00145008
+#define BNX2_MCP_CPU_EVENT_MASK_BREAKPOINT_MASK                 (1L<<0)
+#define BNX2_MCP_CPU_EVENT_MASK_BAD_INST_HALTED_MASK    (1L<<2)
+#define BNX2_MCP_CPU_EVENT_MASK_PAGE_0_DATA_HALTED_MASK         (1L<<3)
+#define BNX2_MCP_CPU_EVENT_MASK_PAGE_0_INST_HALTED_MASK         (1L<<4)
+#define BNX2_MCP_CPU_EVENT_MASK_BAD_DATA_ADDR_HALTED_MASK       (1L<<5)
+#define BNX2_MCP_CPU_EVENT_MASK_BAD_PC_HALTED_MASK      (1L<<6)
+#define BNX2_MCP_CPU_EVENT_MASK_ALIGN_HALTED_MASK       (1L<<7)
+#define BNX2_MCP_CPU_EVENT_MASK_FIO_ABORT_MASK          (1L<<8)
+#define BNX2_MCP_CPU_EVENT_MASK_SOFT_HALTED_MASK        (1L<<10)
+#define BNX2_MCP_CPU_EVENT_MASK_SPAD_UNDERFLOW_MASK     (1L<<11)
+#define BNX2_MCP_CPU_EVENT_MASK_INTERRUPT_MASK          (1L<<12)
+
+#define BNX2_MCP_CPU_PROGRAM_COUNTER                   0x0014501c
+#define BNX2_MCP_CPU_INSTRUCTION                       0x00145020
+#define BNX2_MCP_CPU_DATA_ACCESS                       0x00145024
+#define BNX2_MCP_CPU_INTERRUPT_ENABLE                  0x00145028
+#define BNX2_MCP_CPU_INTERRUPT_VECTOR                  0x0014502c
+#define BNX2_MCP_CPU_INTERRUPT_SAVED_PC                        0x00145030
+#define BNX2_MCP_CPU_HW_BREAKPOINT                     0x00145034
+#define BNX2_MCP_CPU_HW_BREAKPOINT_DISABLE              (1L<<0)
+#define BNX2_MCP_CPU_HW_BREAKPOINT_ADDRESS              (0x3fffffffL<<2)
+
+#define BNX2_MCP_CPU_DEBUG_VECT_PEEK                   0x00145038
+#define BNX2_MCP_CPU_DEBUG_VECT_PEEK_1_VALUE            (0x7ffL<<0)
+#define BNX2_MCP_CPU_DEBUG_VECT_PEEK_1_PEEK_EN          (1L<<11)
+#define BNX2_MCP_CPU_DEBUG_VECT_PEEK_1_SEL              (0xfL<<12)
+#define BNX2_MCP_CPU_DEBUG_VECT_PEEK_2_VALUE            (0x7ffL<<16)
+#define BNX2_MCP_CPU_DEBUG_VECT_PEEK_2_PEEK_EN          (1L<<27)
+#define BNX2_MCP_CPU_DEBUG_VECT_PEEK_2_SEL              (0xfL<<28)
+
+#define BNX2_MCP_CPU_LAST_BRANCH_ADDR                  0x00145048
+#define BNX2_MCP_CPU_LAST_BRANCH_ADDR_TYPE              (1L<<1)
+#define BNX2_MCP_CPU_LAST_BRANCH_ADDR_TYPE_JUMP                 (0L<<1)
+#define BNX2_MCP_CPU_LAST_BRANCH_ADDR_TYPE_BRANCH       (1L<<1)
+#define BNX2_MCP_CPU_LAST_BRANCH_ADDR_LBA               (0x3fffffffL<<2)
+
+#define BNX2_MCP_CPU_REG_FILE                          0x00145200
+#define BNX2_MCP_MCPQ_FTQ_DATA                         0x001453c0
+#define BNX2_MCP_MCPQ_FTQ_CMD                          0x001453f8
+#define BNX2_MCP_MCPQ_FTQ_CMD_OFFSET                    (0x3ffL<<0)
+#define BNX2_MCP_MCPQ_FTQ_CMD_WR_TOP                    (1L<<10)
+#define BNX2_MCP_MCPQ_FTQ_CMD_WR_TOP_0                  (0L<<10)
+#define BNX2_MCP_MCPQ_FTQ_CMD_WR_TOP_1                  (1L<<10)
+#define BNX2_MCP_MCPQ_FTQ_CMD_SFT_RESET                         (1L<<25)
+#define BNX2_MCP_MCPQ_FTQ_CMD_RD_DATA                   (1L<<26)
+#define BNX2_MCP_MCPQ_FTQ_CMD_ADD_INTERVEN              (1L<<27)
+#define BNX2_MCP_MCPQ_FTQ_CMD_ADD_DATA                  (1L<<28)
+#define BNX2_MCP_MCPQ_FTQ_CMD_INTERVENE_CLR             (1L<<29)
+#define BNX2_MCP_MCPQ_FTQ_CMD_POP                       (1L<<30)
+#define BNX2_MCP_MCPQ_FTQ_CMD_BUSY                      (1L<<31)
+
+#define BNX2_MCP_MCPQ_FTQ_CTL                          0x001453fc
+#define BNX2_MCP_MCPQ_FTQ_CTL_INTERVENE                         (1L<<0)
+#define BNX2_MCP_MCPQ_FTQ_CTL_OVERFLOW                  (1L<<1)
+#define BNX2_MCP_MCPQ_FTQ_CTL_FORCE_INTERVENE           (1L<<2)
+#define BNX2_MCP_MCPQ_FTQ_CTL_MAX_DEPTH                         (0x3ffL<<12)
+#define BNX2_MCP_MCPQ_FTQ_CTL_CUR_DEPTH                         (0x3ffL<<22)
+
+#define BNX2_MCP_ROM                                   0x00150000
+#define BNX2_MCP_SCRATCH                               0x00160000
+
+
+#define NUM_MC_HASH_REGISTERS   8
+
+
+/* PHY_ID1: bits 31-16; PHY_ID2: bits 15-0.  */
+#define PHY_BCM5706_PHY_ID                          0x00206160
+
+#define PHY_ID(id)                                  ((id) & 0xfffffff0)
+#define PHY_REV_ID(id)                              ((id) & 0xf)
+
+#define MIN_ETHERNET_PACKET_SIZE       60
+#define MAX_ETHERNET_PACKET_SIZE       1514
+#define MAX_ETHERNET_JUMBO_PACKET_SIZE 9014
+
+#define RX_COPY_THRESH                 92
+
+#define DMA_READ_CHANS 5
+#define DMA_WRITE_CHANS        3
+
+#define BCM_PAGE_BITS  12
+#define BCM_PAGE_SIZE  (1 << BCM_PAGE_BITS)
+
+#define TX_DESC_CNT  (BCM_PAGE_SIZE / sizeof(struct tx_bd))
+#define MAX_TX_DESC_CNT (TX_DESC_CNT - 1)
+
+#define RX_DESC_CNT  (BCM_PAGE_SIZE / sizeof(struct rx_bd))
+#define MAX_RX_DESC_CNT (RX_DESC_CNT - 1)
+
+#define NEXT_TX_BD(x) (((x) & (MAX_TX_DESC_CNT - 1)) ==                        \
+               (MAX_TX_DESC_CNT - 1)) ?                                \
+       (x) + 2 : (x) + 1
+
+#define TX_RING_IDX(x) ((x) & MAX_TX_DESC_CNT)
+
+#define NEXT_RX_BD(x) (((x) & (MAX_RX_DESC_CNT - 1)) ==                        \
+               (MAX_RX_DESC_CNT - 1)) ?                                \
+       (x) + 2 : (x) + 1
+
+#define RX_RING_IDX(x) ((x) & MAX_RX_DESC_CNT)
+
+
+/* Context size. */
+#define CTX_SHIFT                   7
+#define CTX_SIZE                    (1 << CTX_SHIFT)
+#define CTX_MASK                    (CTX_SIZE - 1)
+#define GET_CID_ADDR(_cid)          ((_cid) << CTX_SHIFT)
+#define GET_CID(_cid_addr)          ((_cid_addr) >> CTX_SHIFT)
+
+#define PHY_CTX_SHIFT               6
+#define PHY_CTX_SIZE                (1 << PHY_CTX_SHIFT)
+#define PHY_CTX_MASK                (PHY_CTX_SIZE - 1)
+#define GET_PCID_ADDR(_pcid)        ((_pcid) << PHY_CTX_SHIFT)
+#define GET_PCID(_pcid_addr)        ((_pcid_addr) >> PHY_CTX_SHIFT)
+
+#define MB_KERNEL_CTX_SHIFT         8
+#define MB_KERNEL_CTX_SIZE          (1 << MB_KERNEL_CTX_SHIFT)
+#define MB_KERNEL_CTX_MASK          (MB_KERNEL_CTX_SIZE - 1)
+#define MB_GET_CID_ADDR(_cid)       (0x10000 + ((_cid) << MB_KERNEL_CTX_SHIFT))
+
+#define MAX_CID_CNT                 0x4000
+#define MAX_CID_ADDR                (GET_CID_ADDR(MAX_CID_CNT))
+#define INVALID_CID_ADDR            0xffffffff
+
+#define TX_CID         16
+#define RX_CID         0
+
+#define MB_TX_CID_ADDR MB_GET_CID_ADDR(TX_CID)
+#define MB_RX_CID_ADDR MB_GET_CID_ADDR(RX_CID)
+
+struct sw_bd {
+       struct sk_buff          *skb;
+       DECLARE_PCI_UNMAP_ADDR(mapping)
+};
+
+/* Buffered flash (Atmel: AT45DB011B) specific information */
+#define SEEPROM_PAGE_BITS                      2
+#define SEEPROM_PHY_PAGE_SIZE                  (1 << SEEPROM_PAGE_BITS)
+#define SEEPROM_BYTE_ADDR_MASK                 (SEEPROM_PHY_PAGE_SIZE-1)
+#define SEEPROM_PAGE_SIZE                      4
+#define SEEPROM_TOTAL_SIZE                     65536
+
+#define BUFFERED_FLASH_PAGE_BITS               9
+#define BUFFERED_FLASH_PHY_PAGE_SIZE           (1 << BUFFERED_FLASH_PAGE_BITS)
+#define BUFFERED_FLASH_BYTE_ADDR_MASK          (BUFFERED_FLASH_PHY_PAGE_SIZE-1)
+#define BUFFERED_FLASH_PAGE_SIZE               264
+#define BUFFERED_FLASH_TOTAL_SIZE              131072
+
+#define SAIFUN_FLASH_PAGE_BITS                 8
+#define SAIFUN_FLASH_PHY_PAGE_SIZE             (1 << SAIFUN_FLASH_PAGE_BITS)
+#define SAIFUN_FLASH_BYTE_ADDR_MASK            (SAIFUN_FLASH_PHY_PAGE_SIZE-1)
+#define SAIFUN_FLASH_PAGE_SIZE                 256
+#define SAIFUN_FLASH_BASE_TOTAL_SIZE           65536
+
+#define NVRAM_TIMEOUT_COUNT                    30000
+
+
+#define FLASH_STRAP_MASK                       (BNX2_NVM_CFG1_FLASH_MODE   | \
+                                                BNX2_NVM_CFG1_BUFFER_MODE  | \
+                                                BNX2_NVM_CFG1_PROTECT_MODE | \
+                                                BNX2_NVM_CFG1_FLASH_SIZE)
+
+struct flash_spec {
+       u32 strapping;
+       u32 config1;
+       u32 config2;
+       u32 config3;
+       u32 write1;
+       u32 buffered;
+       u32 page_bits;
+       u32 page_size;
+       u32 addr_mask;
+       u32 total_size;
+       u8  *name;
+};
+
+struct bnx2 {
+       /* Fields used in the tx and intr/napi performance paths are grouped */
+       /* together in the beginning of the structure. */
+       void __iomem            *regview;
+
+       struct net_device       *dev;
+       struct pci_dev          *pdev;
+
+       atomic_t                intr_sem;
+
+       struct status_block     *status_blk;
+       u32                     last_status_idx;
+
+       atomic_t                tx_avail_bd;
+       struct tx_bd            *tx_desc_ring;
+       struct sw_bd            *tx_buf_ring;
+       u32                     tx_prod_bseq;
+       u16                     tx_prod;
+       u16                     tx_cons;
+
+#ifdef BCM_VLAN 
+       struct                  vlan_group *vlgrp;
+#endif
+
+       u32                     rx_offset;
+       u32                     rx_buf_use_size;        /* useable size */
+       u32                     rx_buf_size;            /* with alignment */
+       struct rx_bd            *rx_desc_ring;
+       struct sw_bd            *rx_buf_ring;
+       u32                     rx_prod_bseq;
+       u16                     rx_prod;
+       u16                     rx_cons;
+
+       u32                     rx_csum;
+
+       /* Only used to synchronize netif_stop_queue/wake_queue when tx */
+       /* ring is full */
+       spinlock_t              tx_lock;
+
+       /* End of fileds used in the performance code paths. */
+
+       char                    *name;
+
+       int                     timer_interval;
+       struct                  timer_list timer;
+       struct work_struct      reset_task;
+
+       /* Used to synchronize phy accesses. */
+       spinlock_t              phy_lock;
+
+       u32                     flags;
+#define PCIX_FLAG                      1
+#define PCI_32BIT_FLAG                 2
+#define ONE_TDMA_FLAG                  4       /* no longer used */
+#define NO_WOL_FLAG                    8
+#define USING_DAC_FLAG                 0x10
+#define USING_MSI_FLAG                 0x20
+
+       u32                     phy_flags;
+#define PHY_SERDES_FLAG                        1
+#define PHY_CRC_FIX_FLAG               2
+#define PHY_PARALLEL_DETECT_FLAG       4
+#define PHY_INT_MODE_MASK_FLAG         0x300
+#define PHY_INT_MODE_AUTO_POLLING_FLAG 0x100
+#define PHY_INT_MODE_LINK_READY_FLAG   0x200
+
+       u32                     chip_id;
+       /* chip num:16-31, rev:12-15, metal:4-11, bond_id:0-3 */
+#define CHIP_NUM(bp)                   (((bp)->chip_id) & 0xffff0000)
+#define CHIP_NUM_5706                  0x57060000
+
+#define CHIP_REV(bp)                   (((bp)->chip_id) & 0x0000f000)
+#define CHIP_REV_Ax                    0x00000000
+#define CHIP_REV_Bx                    0x00001000
+#define CHIP_REV_Cx                    0x00002000
+    
+#define CHIP_METAL(bp)                 (((bp)->chip_id) & 0x00000ff0)
+#define CHIP_BONDING(bp)               (((bp)->chip_id) & 0x0000000f)
+
+#define CHIP_ID(bp)                    (((bp)->chip_id) & 0xfffffff0)
+#define CHIP_ID_5706_A0                        0x57060000
+#define CHIP_ID_5706_A1                        0x57060010
+
+#define CHIP_BOND_ID(bp)               (((bp)->chip_id) & 0xf)
+
+/* A serdes chip will have the first bit of the bond id set. */
+#define CHIP_BOND_ID_SERDES_BIT                0x01
+
+       u32                     phy_addr;
+       u32                     phy_id;
+       
+       u16                     bus_speed_mhz;
+       u8                      wol;
+
+       u8                      fw_timed_out;
+
+       u16                     fw_wr_seq;
+       u16                     fw_drv_pulse_wr_seq;
+
+       int                     tx_ring_size;
+       dma_addr_t              tx_desc_mapping;
+
+
+       int                     rx_ring_size;
+       dma_addr_t              rx_desc_mapping;
+
+       u16                     tx_quick_cons_trip;
+       u16                     tx_quick_cons_trip_int;
+       u16                     rx_quick_cons_trip;
+       u16                     rx_quick_cons_trip_int;
+       u16                     comp_prod_trip;
+       u16                     comp_prod_trip_int;
+       u16                     tx_ticks;
+       u16                     tx_ticks_int;
+       u16                     com_ticks;
+       u16                     com_ticks_int;
+       u16                     cmd_ticks;
+       u16                     cmd_ticks_int;
+       u16                     rx_ticks;
+       u16                     rx_ticks_int;
+
+       u32                     stats_ticks;
+
+       dma_addr_t              status_blk_mapping;
+
+       struct statistics_block *stats_blk;
+       dma_addr_t              stats_blk_mapping;
+
+       u32                     rx_mode;
+
+       u16                     req_line_speed;
+       u8                      req_duplex;
+
+       u8                      link_up;
+
+       u16                     line_speed;
+       u8                      duplex;
+       u8                      flow_ctrl;      /* actual flow ctrl settings */
+                                               /* may be different from     */
+                                               /* req_flow_ctrl if autoneg  */
+#define FLOW_CTRL_TX           1
+#define FLOW_CTRL_RX           2
+
+       u32                     advertising;
+
+       u8                      req_flow_ctrl;  /* flow ctrl advertisement */ 
+                                               /* settings or forced      */
+                                               /* settings                */
+       u8                      autoneg;
+#define AUTONEG_SPEED          1
+#define AUTONEG_FLOW_CTRL      2
+
+       u8                      loopback;
+#define MAC_LOOPBACK           1
+#define PHY_LOOPBACK           2
+
+       u8                      serdes_an_pending;
+#define SERDES_AN_TIMEOUT      (2 * HZ)
+
+       u8                      mac_addr[8];
+
+       u32                     fw_ver;
+
+       int                     pm_cap;
+       int                     pcix_cap;
+
+       struct net_device_stats net_stats;
+
+       struct flash_spec       *flash_info;
+};
+
+static u32 bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset);
+static void bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val);
+
+#define REG_RD(bp, offset)                                     \
+       readl(bp->regview + offset)
+
+#define REG_WR(bp, offset, val)                                        \
+       writel(val, bp->regview + offset)
+
+#define REG_WR16(bp, offset, val)                              \
+       writew(val, bp->regview + offset)
+
+#define REG_RD_IND(bp, offset)                                 \
+       bnx2_reg_rd_ind(bp, offset)
+
+#define REG_WR_IND(bp, offset, val)                            \
+       bnx2_reg_wr_ind(bp, offset, val)
+
+/* Indirect context access.  Unlike the MBQ_WR, these macros will not
+ * trigger a chip event. */
+static void bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val);
+
+#define CTX_WR(bp, cid_addr, offset, val)                      \
+       bnx2_ctx_wr(bp, cid_addr, offset, val)
+
+struct cpu_reg {
+       u32 mode;
+       u32 mode_value_halt;
+       u32 mode_value_sstep;
+
+       u32 state;
+       u32 state_value_clear;
+
+       u32 gpr0;
+       u32 evmask;
+       u32 pc;
+       u32 inst;
+       u32 bp;
+
+       u32 spad_base;
+
+       u32 mips_view_base;
+};
+
+struct fw_info {
+       u32 ver_major;
+       u32 ver_minor;
+       u32 ver_fix;
+
+       u32 start_addr;
+
+       /* Text section. */
+       u32 text_addr;
+       u32 text_len;
+       u32 text_index;
+       u32 *text;
+
+       /* Data section. */
+       u32 data_addr;
+       u32 data_len;
+       u32 data_index;
+       u32 *data;
+
+       /* SBSS section. */
+       u32 sbss_addr;
+       u32 sbss_len;
+       u32 sbss_index;
+       u32 *sbss;
+
+       /* BSS section. */
+       u32 bss_addr;
+       u32 bss_len;
+       u32 bss_index;
+       u32 *bss;
+
+       /* Read-only section. */
+       u32 rodata_addr;
+       u32 rodata_len;
+       u32 rodata_index;
+       u32 *rodata;
+};
+
+#define RV2P_PROC1                              0
+#define RV2P_PROC2                              1
+
+
+/* This value (in milliseconds) determines the frequency of the driver
+ * issuing the PULSE message code.  The firmware monitors this periodic
+ * pulse to determine when to switch to an OS-absent mode. */
+#define DRV_PULSE_PERIOD_MS                 250
+
+/* This value (in milliseconds) determines how long the driver should
+ * wait for an acknowledgement from the firmware before timing out.  Once
+ * the firmware has timed out, the driver will assume there is no firmware
+ * running and there won't be any firmware-driver synchronization during a
+ * driver reset. */
+#define FW_ACK_TIME_OUT_MS                  50
+
+
+#define BNX2_DRV_RESET_SIGNATURE               0x00000000
+#define BNX2_DRV_RESET_SIGNATURE_MAGIC          0x4841564b /* HAVK */
+//#define DRV_RESET_SIGNATURE_MAGIC             0x47495352 /* RSIG */
+
+#define BNX2_DRV_MB                            0x00000004
+#define BNX2_DRV_MSG_CODE                       0xff000000
+#define BNX2_DRV_MSG_CODE_RESET                         0x01000000
+#define BNX2_DRV_MSG_CODE_UNLOAD                0x02000000
+#define BNX2_DRV_MSG_CODE_SHUTDOWN              0x03000000
+#define BNX2_DRV_MSG_CODE_SUSPEND_WOL           0x04000000
+#define BNX2_DRV_MSG_CODE_FW_TIMEOUT            0x05000000
+#define BNX2_DRV_MSG_CODE_PULSE                         0x06000000
+#define BNX2_DRV_MSG_CODE_DIAG                  0x07000000
+#define BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL        0x09000000
+
+#define BNX2_DRV_MSG_DATA                       0x00ff0000
+#define BNX2_DRV_MSG_DATA_WAIT0                         0x00010000
+#define BNX2_DRV_MSG_DATA_WAIT1                         0x00020000
+#define BNX2_DRV_MSG_DATA_WAIT2                         0x00030000
+#define BNX2_DRV_MSG_DATA_WAIT3                         0x00040000
+        
+#define BNX2_DRV_MSG_SEQ                        0x0000ffff
+
+#define BNX2_FW_MB                             0x00000008
+#define BNX2_FW_MSG_ACK                                 0x0000ffff
+#define BNX2_FW_MSG_STATUS_MASK                         0x00ff0000
+#define BNX2_FW_MSG_STATUS_OK                   0x00000000
+#define BNX2_FW_MSG_STATUS_FAILURE              0x00ff0000
+
+#define BNX2_LINK_STATUS                       0x0000000c
+
+#define BNX2_DRV_PULSE_MB                      0x00000010
+#define BNX2_DRV_PULSE_SEQ_MASK                         0x0000ffff
+
+/* Indicate to the firmware not to go into the
+ * OS absent when it is not getting driver pulse.
+ * This is used for debugging. */
+#define BNX2_DRV_MSG_DATA_PULSE_CODE_ALWAYS_ALIVE       0x00010000
+
+#define BNX2_DEV_INFO_SIGNATURE                        0x00000020
+#define BNX2_DEV_INFO_SIGNATURE_MAGIC           0x44564900
+#define BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK      0xffffff00
+#define BNX2_DEV_INFO_FEATURE_CFG_VALID                 0x01
+#define BNX2_DEV_INFO_SECONDARY_PORT            0x80
+#define BNX2_DEV_INFO_DRV_ALWAYS_ALIVE          0x40
+
+#define BNX2_SHARED_HW_CFG_PART_NUM            0x00000024
+
+#define BNX2_SHARED_HW_CFG_POWER_DISSIPATED    0x00000034
+#define BNX2_SHARED_HW_CFG_POWER_STATE_D3_MASK  0xff000000
+#define BNX2_SHARED_HW_CFG_POWER_STATE_D2_MASK  0xff0000
+#define BNX2_SHARED_HW_CFG_POWER_STATE_D1_MASK  0xff00
+#define BNX2_SHARED_HW_CFG_POWER_STATE_D0_MASK  0xff
+
+#define BNX2_SHARED_HW_CFG POWER_CONSUMED      0x00000038
+#define BNX2_SHARED_HW_CFG_CONFIG              0x0000003c
+#define BNX2_SHARED_HW_CFG_DESIGN_NIC           0
+#define BNX2_SHARED_HW_CFG_DESIGN_LOM           0x1
+#define BNX2_SHARED_HW_CFG_PHY_COPPER           0
+#define BNX2_SHARED_HW_CFG_PHY_FIBER            0x2
+#define BNX2_SHARED_HW_CFG_LED_MODE_SHIFT_BITS  8
+#define BNX2_SHARED_HW_CFG_LED_MODE_MASK        0x300
+#define BNX2_SHARED_HW_CFG_LED_MODE_MAC                 0
+#define BNX2_SHARED_HW_CFG_LED_MODE_GPHY1       0x100
+#define BNX2_SHARED_HW_CFG_LED_MODE_GPHY2       0x200
+
+#define BNX2_DEV_INFO_BC_REV                   0x0000004c
+
+#define BNX2_PORT_HW_CFG_MAC_UPPER             0x00000050
+#define BNX2_PORT_HW_CFG_UPPERMAC_MASK          0xffff
+
+#define BNX2_PORT_HW_CFG_MAC_LOWER             0x00000054
+#define BNX2_PORT_HW_CFG_CONFIG                        0x00000058
+
+#define BNX2_PORT_HW_CFG_IMD_MAC_A_UPPER       0x00000068
+#define BNX2_PORT_HW_CFG_IMD_MAC_A_LOWER       0x0000006c
+#define BNX2_PORT_HW_CFG_IMD_MAC_B_UPPER       0x00000070
+#define BNX2_PORT_HW_CFG_IMD_MAC_B_LOWER       0x00000074
+#define BNX2_PORT_HW_CFG_ISCSI_MAC_UPPER       0x00000078
+#define BNX2_PORT_HW_CFG_ISCSI_MAC_LOWER       0x0000007c
+
+#define BNX2_DEV_INFO_PER_PORT_HW_CONFIG2      0x000000b4
+
+#define BNX2_DEV_INFO_FORMAT_REV               0x000000c4
+#define BNX2_DEV_INFO_FORMAT_REV_MASK           0xff000000
+#define BNX2_DEV_INFO_FORMAT_REV_ID             ('A' << 24)
+
+#define BNX2_SHARED_FEATURE                    0x000000c8
+#define BNX2_SHARED_FEATURE_MASK                0xffffffff
+
+#define BNX2_PORT_FEATURE                      0x000000d8
+#define BNX2_PORT2_FEATURE                     0x00000014c
+#define BNX2_PORT_FEATURE_WOL_ENABLED           0x01000000
+#define BNX2_PORT_FEATURE_MBA_ENABLED           0x02000000
+#define BNX2_PORT_FEATURE_ASF_ENABLED           0x04000000
+#define BNX2_PORT_FEATURE_IMD_ENABLED           0x08000000
+#define BNX2_PORT_FEATURE_BAR1_SIZE_MASK        0xf
+#define BNX2_PORT_FEATURE_BAR1_SIZE_DISABLED    0x0
+#define BNX2_PORT_FEATURE_BAR1_SIZE_64K                 0x1
+#define BNX2_PORT_FEATURE_BAR1_SIZE_128K        0x2
+#define BNX2_PORT_FEATURE_BAR1_SIZE_256K        0x3
+#define BNX2_PORT_FEATURE_BAR1_SIZE_512K        0x4
+#define BNX2_PORT_FEATURE_BAR1_SIZE_1M          0x5
+#define BNX2_PORT_FEATURE_BAR1_SIZE_2M          0x6
+#define BNX2_PORT_FEATURE_BAR1_SIZE_4M          0x7
+#define BNX2_PORT_FEATURE_BAR1_SIZE_8M          0x8
+#define BNX2_PORT_FEATURE_BAR1_SIZE_16M                 0x9
+#define BNX2_PORT_FEATURE_BAR1_SIZE_32M                 0xa
+#define BNX2_PORT_FEATURE_BAR1_SIZE_64M                 0xb
+#define BNX2_PORT_FEATURE_BAR1_SIZE_128M        0xc
+#define BNX2_PORT_FEATURE_BAR1_SIZE_256M        0xd
+#define BNX2_PORT_FEATURE_BAR1_SIZE_512M        0xe
+#define BNX2_PORT_FEATURE_BAR1_SIZE_1G          0xf
+
+#define BNX2_PORT_FEATURE_WOL                  0xdc
+#define BNX2_PORT2_FEATURE_WOL                 0x150
+#define BNX2_PORT_FEATURE_WOL_DEFAULT_SHIFT_BITS        4
+#define BNX2_PORT_FEATURE_WOL_DEFAULT_MASK      0x30
+#define BNX2_PORT_FEATURE_WOL_DEFAULT_DISABLE   0
+#define BNX2_PORT_FEATURE_WOL_DEFAULT_MAGIC     0x10
+#define BNX2_PORT_FEATURE_WOL_DEFAULT_ACPI      0x20
+#define BNX2_PORT_FEATURE_WOL_DEFAULT_MAGIC_AND_ACPI    0x30
+#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_MASK   0xf
+#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_AUTONEG        0
+#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_10HALF         1
+#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_10FULL         2
+#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_100HALF 3
+#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_100FULL 4
+#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_1000HALF       5
+#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_1000FULL       6
+#define BNX2_PORT_FEATURE_WOL_AUTONEG_ADVERTISE_1000    0x40
+#define BNX2_PORT_FEATURE_WOL_RESERVED_PAUSE_CAP 0x400
+#define BNX2_PORT_FEATURE_WOL_RESERVED_ASYM_PAUSE_CAP   0x800
+
+#define BNX2_PORT_FEATURE_MBA                  0xe0
+#define BNX2_PORT2_FEATURE_MBA                 0x154
+#define BNX2_PORT_FEATURE_MBA_BOOT_AGENT_TYPE_SHIFT_BITS        0
+#define BNX2_PORT_FEATURE_MBA_BOOT_AGENT_TYPE_MASK      0x3
+#define BNX2_PORT_FEATURE_MBA_BOOT_AGENT_TYPE_PXE       0
+#define BNX2_PORT_FEATURE_MBA_BOOT_AGENT_TYPE_RPL       1
+#define BNX2_PORT_FEATURE_MBA_BOOT_AGENT_TYPE_BOOTP     2
+#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_SHIFT_BITS     2
+#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_MASK   0x3c
+#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_AUTONEG        0
+#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_10HALF         0x4
+#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_10FULL         0x8
+#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_100HALF        0xc
+#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_100FULL        0x10
+#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_1000HALF       0x14
+#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_1000FULL       0x18
+#define BNX2_PORT_FEATURE_MBA_SETUP_PROMPT_ENABLE       0x40
+#define BNX2_PORT_FEATURE_MBA_HOTKEY_CTRL_S     0
+#define BNX2_PORT_FEATURE_MBA_HOTKEY_CTRL_B     0x80
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_SHIFT_BITS   8
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_MASK         0xff00
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_DISABLED     0
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_1K   0x100
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_2K   0x200
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_4K   0x300
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_8K   0x400
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_16K  0x500
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_32K  0x600
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_64K  0x700
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_128K         0x800
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_256K         0x900
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_512K         0xa00
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_1M   0xb00
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_2M   0xc00
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_4M   0xd00
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_8M   0xe00
+#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_16M  0xf00
+#define BNX2_PORT_FEATURE_MBA_MSG_TIMEOUT_SHIFT_BITS    16
+#define BNX2_PORT_FEATURE_MBA_MSG_TIMEOUT_MASK  0xf0000
+#define BNX2_PORT_FEATURE_MBA_BIOS_BOOTSTRAP_SHIFT_BITS         20
+#define BNX2_PORT_FEATURE_MBA_BIOS_BOOTSTRAP_MASK       0x300000
+#define BNX2_PORT_FEATURE_MBA_BIOS_BOOTSTRAP_AUTO       0
+#define BNX2_PORT_FEATURE_MBA_BIOS_BOOTSTRAP_BBS        0x100000
+#define BNX2_PORT_FEATURE_MBA_BIOS_BOOTSTRAP_INT18H     0x200000
+#define BNX2_PORT_FEATURE_MBA_BIOS_BOOTSTRAP_INT19H     0x300000
+
+#define BNX2_PORT_FEATURE_IMD                  0xe4
+#define BNX2_PORT2_FEATURE_IMD                 0x158
+#define BNX2_PORT_FEATURE_IMD_LINK_OVERRIDE_DEFAULT     0
+#define BNX2_PORT_FEATURE_IMD_LINK_OVERRIDE_ENABLE      1
+
+#define BNX2_PORT_FEATURE_VLAN                 0xe8
+#define BNX2_PORT2_FEATURE_VLAN                        0x15c
+#define BNX2_PORT_FEATURE_MBA_VLAN_TAG_MASK     0xffff
+#define BNX2_PORT_FEATURE_MBA_VLAN_ENABLE       0x10000
+
+#define BNX2_BC_STATE_RESET_TYPE               0x000001c0
+#define BNX2_BC_STATE_RESET_TYPE_SIG            0x00005254
+#define BNX2_BC_STATE_RESET_TYPE_SIG_MASK       0x0000ffff
+#define BNX2_BC_STATE_RESET_TYPE_NONE   (BNX2_BC_STATE_RESET_TYPE_SIG | \
+                                         0x00010000)
+#define BNX2_BC_STATE_RESET_TYPE_PCI    (BNX2_BC_STATE_RESET_TYPE_SIG | \
+                                         0x00020000)
+#define BNX2_BC_STATE_RESET_TYPE_VAUX   (BNX2_BC_STATE_RESET_TYPE_SIG | \
+                                         0x00030000)
+#define BNX2_BC_STATE_RESET_TYPE_DRV_MASK       DRV_MSG_CODE         
+#define BNX2_BC_STATE_RESET_TYPE_DRV_RESET (BNX2_BC_STATE_RESET_TYPE_SIG | \
+                                           DRV_MSG_CODE_RESET)
+#define BNX2_BC_STATE_RESET_TYPE_DRV_UNLOAD (BNX2_BC_STATE_RESET_TYPE_SIG | \
+                                            DRV_MSG_CODE_UNLOAD)
+#define BNX2_BC_STATE_RESET_TYPE_DRV_SHUTDOWN (BNX2_BC_STATE_RESET_TYPE_SIG | \
+                                              DRV_MSG_CODE_SHUTDOWN)
+#define BNX2_BC_STATE_RESET_TYPE_DRV_WOL (BNX2_BC_STATE_RESET_TYPE_SIG | \
+                                         DRV_MSG_CODE_WOL)
+#define BNX2_BC_STATE_RESET_TYPE_DRV_DIAG (BNX2_BC_STATE_RESET_TYPE_SIG | \
+                                          DRV_MSG_CODE_DIAG)
+#define BNX2_BC_STATE_RESET_TYPE_VALUE(msg) (BNX2_BC_STATE_RESET_TYPE_SIG | \
+                                            (msg))
+
+#define BNX2_BC_STATE                          0x000001c4
+#define BNX2_BC_STATE_ERR_MASK                  0x0000ff00
+#define BNX2_BC_STATE_SIGN                      0x42530000
+#define BNX2_BC_STATE_SIGN_MASK                         0xffff0000
+#define BNX2_BC_STATE_BC1_START                         (BNX2_BC_STATE_SIGN | 0x1)
+#define BNX2_BC_STATE_GET_NVM_CFG1              (BNX2_BC_STATE_SIGN | 0x2)
+#define BNX2_BC_STATE_PROG_BAR                  (BNX2_BC_STATE_SIGN | 0x3)
+#define BNX2_BC_STATE_INIT_VID                  (BNX2_BC_STATE_SIGN | 0x4)
+#define BNX2_BC_STATE_GET_NVM_CFG2              (BNX2_BC_STATE_SIGN | 0x5)
+#define BNX2_BC_STATE_APPLY_WKARND              (BNX2_BC_STATE_SIGN | 0x6)
+#define BNX2_BC_STATE_LOAD_BC2                  (BNX2_BC_STATE_SIGN | 0x7)
+#define BNX2_BC_STATE_GOING_BC2                         (BNX2_BC_STATE_SIGN | 0x8)
+#define BNX2_BC_STATE_GOING_DIAG                (BNX2_BC_STATE_SIGN | 0x9)
+#define BNX2_BC_STATE_RT_FINAL_INIT             (BNX2_BC_STATE_SIGN | 0x81)
+#define BNX2_BC_STATE_RT_WKARND                         (BNX2_BC_STATE_SIGN | 0x82)
+#define BNX2_BC_STATE_RT_DRV_PULSE              (BNX2_BC_STATE_SIGN | 0x83)
+#define BNX2_BC_STATE_RT_FIOEVTS                (BNX2_BC_STATE_SIGN | 0x84)
+#define BNX2_BC_STATE_RT_DRV_CMD                (BNX2_BC_STATE_SIGN | 0x85)
+#define BNX2_BC_STATE_RT_LOW_POWER              (BNX2_BC_STATE_SIGN | 0x86)
+#define BNX2_BC_STATE_RT_SET_WOL                (BNX2_BC_STATE_SIGN | 0x87)
+#define BNX2_BC_STATE_RT_OTHER_FW               (BNX2_BC_STATE_SIGN | 0x88)
+#define BNX2_BC_STATE_RT_GOING_D3               (BNX2_BC_STATE_SIGN | 0x89)
+#define BNX2_BC_STATE_ERR_BAD_VERSION           (BNX2_BC_STATE_SIGN | 0x0100)
+#define BNX2_BC_STATE_ERR_BAD_BC2_CRC           (BNX2_BC_STATE_SIGN | 0x0200)
+#define BNX2_BC_STATE_ERR_BC1_LOOP              (BNX2_BC_STATE_SIGN | 0x0300)
+#define BNX2_BC_STATE_ERR_UNKNOWN_CMD           (BNX2_BC_STATE_SIGN | 0x0400)
+#define BNX2_BC_STATE_ERR_DRV_DEAD              (BNX2_BC_STATE_SIGN | 0x0500)
+#define BNX2_BC_STATE_ERR_NO_RXP                (BNX2_BC_STATE_SIGN | 0x0600)
+#define BNX2_BC_STATE_ERR_TOO_MANY_RBUF                 (BNX2_BC_STATE_SIGN | 0x0700)
+       
+#define BNX2_BC_STATE_DEBUG_CMD                        0x1dc
+#define BNX2_BC_STATE_BC_DBG_CMD_SIGNATURE      0x42440000
+#define BNX2_BC_STATE_BC_DBG_CMD_SIGNATURE_MASK         0xffff0000
+#define BNX2_BC_STATE_BC_DBG_CMD_LOOP_CNT_MASK  0xffff
+#define BNX2_BC_STATE_BC_DBG_CMD_LOOP_INFINITE  0xffff
+
+#define HOST_VIEW_SHMEM_BASE                   0x167c00
+
+#endif
diff --git a/drivers/net/bnx2_fw.h b/drivers/net/bnx2_fw.h
new file mode 100644 (file)
index 0000000..35f3a2a
--- /dev/null
@@ -0,0 +1,2468 @@
+/* bnx2_fw.h: Broadcom NX2 network driver.
+ *
+ * Copyright (c) 2004, 2005 Broadcom Corporation
+ *
+ * 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, except as noted below.
+ *
+ * This file contains firmware data derived from proprietary unpublished
+ * source code, Copyright (c) 2004, 2005 Broadcom Corporation.
+ *
+ * Permission is hereby granted for the distribution of this firmware data
+ * in hexadecimal or equivalent format, provided this copyright notice is
+ * accompanying it.
+ */
+
+
+static int bnx2_COM_b06FwReleaseMajor = 0x0;
+static int bnx2_COM_b06FwReleaseMinor = 0x0;
+static int bnx2_COM_b06FwReleaseFix = 0x0;
+static u32 bnx2_COM_b06FwStartAddr = 0x080004a0;
+static u32 bnx2_COM_b06FwTextAddr = 0x08000000;
+static int bnx2_COM_b06FwTextLen = 0x4594;
+static u32 bnx2_COM_b06FwDataAddr = 0x080045e0;
+static int bnx2_COM_b06FwDataLen = 0x0;
+static u32 bnx2_COM_b06FwRodataAddr = 0x08004598;
+static int bnx2_COM_b06FwRodataLen = 0x18;
+static u32 bnx2_COM_b06FwBssAddr = 0x08004600;
+static int bnx2_COM_b06FwBssLen = 0x88;
+static u32 bnx2_COM_b06FwSbssAddr = 0x080045e0;
+static int bnx2_COM_b06FwSbssLen = 0x1c;
+static u32 bnx2_COM_b06FwText[(0x4594/4) + 1] = {
+       0x0a000128, 0x00000000, 0x00000000, 0x0000000d, 0x636f6d20, 0x302e362e,
+       0x39000000, 0x00060902, 0x00000000, 0x00000003, 0x00000014, 0x00000032,
+       0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000010, 0x000003e8, 0x0000ea60, 0x00000001, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x0000ffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000002, 0x00000020, 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,
+       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, 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, 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,
+       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, 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, 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,
+       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, 0x00000000, 0x10000003, 0x00000000, 0x0000000d,
+       0x0000000d, 0x3c020800, 0x244245e0, 0x3c030800, 0x24634688, 0xac400000,
+       0x0043202b, 0x1480fffd, 0x24420004, 0x3c1d0800, 0x37bd7ffc, 0x03a0f021,
+       0x3c100800, 0x261004a0, 0x3c1c0800, 0x279c45e0, 0x0e0001f2, 0x00000000,
+       0x0000000d, 0x27bdffe8, 0x3c1a8000, 0x3c020008, 0x0342d825, 0x3c036010,
+       0xafbf0010, 0x8c655000, 0x3c020800, 0x24470ac8, 0x3c040800, 0x24864600,
+       0x2402ff7f, 0x00a22824, 0x34a5380c, 0xac655000, 0x00002821, 0x24020037,
+       0x24030c80, 0xaf420008, 0xaf430024, 0xacc70000, 0x24a50001, 0x2ca20016,
+       0x1440fffc, 0x24c60004, 0x24844600, 0x3c020800, 0x24420ad4, 0x3c030800,
+       0x246309d4, 0xac820004, 0x3c020800, 0x24420618, 0x3c050800, 0x24a50ca0,
+       0xac82000c, 0x3c020800, 0x24423100, 0xac830008, 0x3c030800, 0x246325c8,
+       0xac820014, 0x3c020800, 0x24422b0c, 0xac830018, 0xac83001c, 0x3c030800,
+       0x24630adc, 0xac820024, 0x3c020800, 0x24423040, 0xac83002c, 0x3c030800,
+       0x24633060, 0xac820030, 0x3c020800, 0x24422f6c, 0xac830034, 0x3c030800,
+       0x24632c60, 0xac82003c, 0x3c020800, 0x24420b6c, 0xac850010, 0xac850020,
+       0xac830040, 0x0e000bd6, 0xac820050, 0x8fbf0010, 0x03e00008, 0x27bd0018,
+       0x27bdffe0, 0xafb00010, 0x27500100, 0xafbf0018, 0xafb10014, 0x9203000b,
+       0x24020003, 0x1462005b, 0x96110008, 0x32220001, 0x10400009, 0x27430080,
+       0x8e020000, 0x96040014, 0x000211c2, 0x00021040, 0x00621821, 0xa4640000,
+       0x0a0001cb, 0x3c020800, 0x3c020800, 0x8c430020, 0x1060002a, 0x3c030800,
+       0x0e001006, 0x00000000, 0x97420108, 0x8f850018, 0x9743010c, 0x3042003e,
+       0x00021400, 0x00621825, 0xaca30000, 0x8f840018, 0x8f420100, 0xac820004,
+       0x97430116, 0x9742010e, 0x8f840018, 0x00031c00, 0x00431025, 0xac820008,
+       0x97430110, 0x97440112, 0x8f850018, 0x00031c00, 0x00832025, 0xaca4000c,
+       0x97420114, 0x8f840018, 0x3042ffff, 0xac820010, 0x8f830018, 0xac600014,
+       0x8f820018, 0x3c030800, 0xac400018, 0x9462466e, 0x8f840018, 0x3c032000,
+       0x00431025, 0xac82001c, 0x0e001044, 0x24040001, 0x3c030800, 0x8c620040,
+       0x24420001, 0xac620040, 0x3c020800, 0x8c430044, 0x32240004, 0x24630001,
+       0x10800017, 0xac430044, 0x8f4202b8, 0x04430007, 0x8e020020, 0x3c040800,
+       0x8c830060, 0x24020001, 0x24630001, 0x0a0001ed, 0xac830060, 0x3c060800,
+       0x8cc4005c, 0xaf420280, 0x96030016, 0x00001021, 0xa7430284, 0x8e050004,
+       0x24840001, 0x3c031000, 0xaf450288, 0xaf4302b8, 0x0a0001ed, 0xacc4005c,
+       0x32220002, 0x0a0001ed, 0x0002102b, 0x3c026000, 0xac400808, 0x0000000d,
+       0x00001021, 0x8fbf0018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020,
+       0x27bdffc8, 0xafbf0034, 0xafbe0030, 0xafb7002c, 0xafb60028, 0xafb50024,
+       0xafb40020, 0xafb3001c, 0xafb20018, 0xafb10014, 0x0e00013f, 0xafb00010,
+       0x24110020, 0x24150030, 0x2794000c, 0x27930008, 0x3c124000, 0x3c1e0800,
+       0x3c170800, 0x3c160800, 0x8f820004, 0x3c040800, 0x8c830020, 0x10430004,
+       0x00000000, 0xaf830004, 0x0e00110b, 0x00000000, 0x8f500000, 0x32020007,
+       0x1040fff5, 0x32020001, 0x1040002b, 0x32020002, 0x8f420100, 0xaf420020,
+       0x8f430104, 0xaf4300a8, 0x9342010b, 0x93630000, 0x306300ff, 0x10710005,
+       0x304400ff, 0x10750006, 0x2c820016, 0x0a000227, 0x00000000, 0xaf940000,
+       0x0a000228, 0x2c820016, 0xaf930000, 0x0a000228, 0x00000000, 0xaf800000,
+       0x14400005, 0x00041880, 0x0e0002b2, 0x00000000, 0x0a000234, 0x00000000,
+       0x3c020800, 0x24424600, 0x00621821, 0x8c620000, 0x0040f809, 0x00000000,
+       0x10400005, 0x8fc20034, 0x8f420104, 0x3c016020, 0xac220014, 0x8fc20034,
+       0xaf520138, 0x24420001, 0xafc20034, 0x32020002, 0x10400019, 0x32020004,
+       0x8f420140, 0xaf420020, 0x93630000, 0x306300ff, 0x10710005, 0x00000000,
+       0x10750006, 0x00000000, 0x0a000250, 0x00000000, 0xaf940000, 0x0a000251,
+       0x00000000, 0xaf930000, 0x0a000251, 0x00000000, 0xaf800000, 0x0e0008b9,
+       0x00000000, 0x8ee20038, 0xaf520178, 0x24420001, 0xaee20038, 0x32020004,
+       0x1040ffad, 0x00000000, 0x8f420180, 0xaf420020, 0x93630000, 0x306300ff,
+       0x10710005, 0x00000000, 0x10750006, 0x00000000, 0x0a00026a, 0x00000000,
+       0xaf940000, 0x0a00026b, 0x00000000, 0xaf930000, 0x0a00026b, 0x00000000,
+       0xaf800000, 0x93620000, 0x14510004, 0x8ec2003c, 0x0e000835, 0x00000000,
+       0x8ec2003c, 0xaf5201b8, 0x24420001, 0x0a000206, 0xaec2003c, 0x27bdffe8,
+       0xafbf0010, 0x97420108, 0x24033000, 0x30447000, 0x10830012, 0x28823001,
+       0x10400007, 0x24024000, 0x1080000b, 0x24022000, 0x1082001a, 0x24020001,
+       0x0a000299, 0x00000000, 0x1082000c, 0x24025000, 0x1082000e, 0x00000000,
+       0x0a000299, 0x00000000, 0x0000000d, 0x0a00029b, 0x00001021, 0x0e000300,
+       0x00000000, 0x0a00029b, 0x00001021, 0x0e00048f, 0x00000000, 0x0a00029b,
+       0x00001021, 0x0e000fdf, 0x00000000, 0x0a00029b, 0x00001021, 0x0000000d,
+       0x00001021, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x93620000, 0x24030020,
+       0x304400ff, 0x10830005, 0x24020030, 0x10820007, 0x00000000, 0x0a0002af,
+       0x00000000, 0x2782000c, 0xaf820000, 0x03e00008, 0x00000000, 0x27820008,
+       0xaf820000, 0x03e00008, 0x00000000, 0xaf800000, 0x03e00008, 0x00000000,
+       0x0000000d, 0x03e00008, 0x00001021, 0x03e00008, 0x00001021, 0x27440100,
+       0x94830008, 0x30620004, 0x10400017, 0x30620002, 0x8f4202b8, 0x04430007,
+       0x8c820020, 0x3c040800, 0x8c830060, 0x24020001, 0x24630001, 0x03e00008,
+       0xac830060, 0xaf420280, 0x94830016, 0x3c060800, 0xa7430284, 0x8c850004,
+       0x8cc4005c, 0x00001021, 0x3c031000, 0x24840001, 0xaf450288, 0xaf4302b8,
+       0x03e00008, 0xacc4005c, 0x14400003, 0x3c040800, 0x03e00008, 0x00001021,
+       0x8c830084, 0x24020001, 0x24630001, 0x03e00008, 0xac830084, 0x27450100,
+       0x3c040800, 0x8c820088, 0x94a3000c, 0x24420001, 0x007a1821, 0xac820088,
+       0x8ca40018, 0x90664000, 0xaf440038, 0x8ca2001c, 0x2403fff8, 0x00063600,
+       0x00431024, 0x34420004, 0x3c030005, 0xaf42003c, 0xaf430030, 0x00000000,
+       0x00000000, 0x00000000, 0xaf460404, 0x00000000, 0x00000000, 0x00000000,
+       0x3c020006, 0x34420001, 0xaf420030, 0x00000000, 0x00000000, 0x00000000,
+       0x8f420000, 0x30420010, 0x1040fffd, 0x00001021, 0x03e00008, 0x00000000,
+       0x3c020800, 0x8c430020, 0x27bdffe8, 0xafb00010, 0x27500100, 0x1060001e,
+       0xafbf0014, 0x0e001006, 0x00000000, 0x8f830018, 0x8e020018, 0xac620000,
+       0x8f840018, 0x9602000c, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018,
+       0xac40000c, 0x8f830018, 0xac600010, 0x8f820018, 0xac400014, 0x8f840018,
+       0x3c026000, 0x8c434448, 0xac830018, 0x96020008, 0x3c030800, 0x9464466e,
+       0x8f850018, 0x00021400, 0x00441025, 0x24040001, 0x0e001044, 0xaca2001c,
+       0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x27bdffc8, 0xafb3001c,
+       0x00009821, 0xafb7002c, 0x0000b821, 0xafbe0030, 0x0000f021, 0xafb50024,
+       0x27550100, 0xafbf0034, 0xafb60028, 0xafb40020, 0xafb20018, 0xafb10014,
+       0xafb00010, 0x96a20008, 0x8f540100, 0x8eb20018, 0x30420001, 0x10400037,
+       0x02a0b021, 0x8f630054, 0x2642ffff, 0x00431023, 0x18400006, 0x00000000,
+       0x0000000d, 0x00000000, 0x24000128, 0x0a000372, 0x00002021, 0x8f62004c,
+       0x02421023, 0x18400028, 0x00002021, 0x93650120, 0x93640121, 0x3c030800,
+       0x8c62008c, 0x308400ff, 0x24420001, 0x30a500ff, 0x00803821, 0x1485000b,
+       0xac62008c, 0x3c040800, 0x8c830090, 0x24630001, 0xac830090, 0x93620122,
+       0x30420001, 0x00021023, 0x30420005, 0x0a000372, 0x34440004, 0x27660100,
+       0x00041080, 0x00c21021, 0x8c430000, 0x02431823, 0x04600004, 0x24820001,
+       0x30440007, 0x1485fff9, 0x00041080, 0x10870007, 0x3c030800, 0xa3640121,
+       0x8c620094, 0x24040005, 0x24420001, 0x0a000372, 0xac620094, 0x24040004,
+       0x00809821, 0x9362003f, 0x304400ff, 0x38830016, 0x2c630001, 0x38820010,
+       0x2c420001, 0x00621825, 0x1460000c, 0x24020001, 0x38830008, 0x2c630001,
+       0x38820014, 0x2c420001, 0x00621825, 0x14600005, 0x24020001, 0x24020012,
+       0x14820002, 0x00001021, 0x24020001, 0x50400007, 0x8eb10020, 0x8ea20020,
+       0x8f630040, 0x00408821, 0x00431023, 0x5c400001, 0x8f710040, 0x9343010b,
+       0x24020004, 0x54620005, 0x36730080, 0x96a20008, 0x36730002, 0x24170001,
+       0x305e0020, 0x2402fffb, 0x02628024, 0x1200002a, 0x3c030800, 0x8c620030,
+       0x02021024, 0x10400026, 0x3c020800, 0x8c430020, 0x10600024, 0x32620004,
+       0x0e001006, 0x00000000, 0x8f830018, 0x8f420100, 0xac620000, 0x8f840018,
+       0x02201821, 0x32620002, 0xac900004, 0x8f840018, 0x50400001, 0x8ec30014,
+       0xac830008, 0x8f830018, 0x8ec20020, 0xac62000c, 0x8f840018, 0x8f620040,
+       0xac820010, 0x8f830018, 0x8ec20018, 0xac620014, 0x8f840018, 0x3c026000,
+       0x8c434448, 0x3c020800, 0xac830018, 0x9443466e, 0x8f840018, 0x3c024010,
+       0x00621825, 0xac83001c, 0x0e001044, 0x24040001, 0x32620004, 0x10400076,
+       0x00003821, 0x3c029000, 0x34420001, 0x3c038000, 0x02821025, 0xa360007c,
+       0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620023,
+       0x30420080, 0x10400011, 0x00000000, 0x8f65005c, 0x8f63004c, 0x9764003c,
+       0x8f620064, 0x00a32823, 0x00852821, 0x00a2102b, 0x54400006, 0x3c023fff,
+       0x93620023, 0x3042007f, 0xa3620023, 0xaf720064, 0x3c023fff, 0x0a0003f1,
+       0x3442ffff, 0x8f62005c, 0x02421023, 0x04400011, 0x00000000, 0x8f65005c,
+       0x8f630064, 0x9764003c, 0x3c023fff, 0x3442ffff, 0xaf720064, 0x00a32823,
+       0x00852821, 0x0045102b, 0x10400004, 0x02451021, 0x3c053fff, 0x34a5ffff,
+       0x02451021, 0xaf62005c, 0x24070001, 0xaf72004c, 0x8f620054, 0x16420005,
+       0x00000000, 0x93620023, 0x30420040, 0x10400017, 0x24020001, 0x9762006a,
+       0x00022880, 0x50a00001, 0x24050001, 0x97630068, 0x93640081, 0x3c020800,
+       0x8c46004c, 0x00652821, 0x00852804, 0x00c5102b, 0x54400001, 0x00a03021,
+       0x3c020800, 0x8c440050, 0x00c4182b, 0x54600001, 0x00c02021, 0x8f420074,
+       0x2403fffe, 0x00832824, 0x00a21021, 0xaf62000c, 0x3c028000, 0x34420001,
+       0x02821025, 0xa3600081, 0xaf420020, 0x9363007e, 0x9362007a, 0x10620004,
+       0x00000000, 0x0e000f2a, 0x00000000, 0x00403821, 0x10e00017, 0x3c029000,
+       0x34420001, 0x02821025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024,
+       0x1440fffd, 0x3c028000, 0x9363007d, 0x34420001, 0x3c048000, 0x02821025,
+       0xa363007d, 0xaf420020, 0x8f4201f8, 0x00441024, 0x1440fffd, 0x24020002,
+       0x3c031000, 0xaf5401c0, 0xa34201c4, 0xaf4301f8, 0x8ea30014, 0x8f620040,
+       0x14430003, 0x00431023, 0x0a000443, 0x00001021, 0x28420001, 0x10400034,
+       0x00000000, 0x8f620040, 0xaf630040, 0x9362003e, 0x30420001, 0x1440000b,
+       0x3c029000, 0x93620022, 0x24420001, 0xa3620022, 0x93630022, 0x3c020800,
+       0x8c440098, 0x0064182b, 0x1460001e, 0x3c020800, 0x3c029000, 0x34420001,
+       0x02821025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd,
+       0x00000000, 0x3c038000, 0x9362007d, 0x34630001, 0x3c048000, 0x02831825,
+       0x34420001, 0xa362007d, 0xaf430020, 0x8f4201f8, 0x00441024, 0x1440fffd,
+       0x24020002, 0x3c031000, 0xaf5401c0, 0xa34201c4, 0x24020001, 0xaf4301f8,
+       0xa7620012, 0x0a000476, 0xa3600022, 0x9743007a, 0x9444002a, 0x00641821,
+       0x3063fffe, 0xa7630012, 0x0e000b68, 0x00000000, 0x12e00003, 0x00000000,
+       0x0e000f27, 0x00000000, 0x53c00004, 0x96a20008, 0x0e000c10, 0x00000000,
+       0x96a20008, 0x8fbf0034, 0x8fbe0030, 0x8fb7002c, 0x8fb60028, 0x8fb50024,
+       0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x00021042,
+       0x30420001, 0x03e00008, 0x27bd0038, 0x27bdffe8, 0xafbf0010, 0x97420108,
+       0x2403000b, 0x304400ff, 0x1083004e, 0x2882000c, 0x10400011, 0x24020006,
+       0x1082003e, 0x28820007, 0x10400007, 0x28820008, 0x1080002b, 0x24020001,
+       0x1082002e, 0x3c026000, 0x0a000504, 0x00000000, 0x14400061, 0x2882000a,
+       0x1440002b, 0x00000000, 0x0a0004ec, 0x00000000, 0x2402001c, 0x1082004e,
+       0x2882001d, 0x1040000e, 0x24020019, 0x10820041, 0x2882001a, 0x10400005,
+       0x2402000e, 0x10820036, 0x00000000, 0x0a000504, 0x00000000, 0x2402001b,
+       0x1082003c, 0x00000000, 0x0a000504, 0x00000000, 0x240200c1, 0x10820040,
+       0x288200c2, 0x10400005, 0x24020080, 0x1082001f, 0x00000000, 0x0a000504,
+       0x00000000, 0x240200c2, 0x1082003b, 0x00000000, 0x0a000504, 0x00000000,
+       0x3c026000, 0x0e000c7d, 0xac400808, 0x0a000506, 0x8fbf0010, 0x8c444448,
+       0x3c030800, 0xac640064, 0x0e000c7d, 0x00000000, 0x3c026000, 0x8c444448,
+       0x3c030800, 0x0a000505, 0xac640068, 0x8f440100, 0x0e000508, 0x00000000,
+       0x3c026000, 0x8c444448, 0x3c030800, 0x0a000505, 0xac64006c, 0x0e000cab,
+       0x00000000, 0x0a000506, 0x8fbf0010, 0x8f440100, 0x0e000cd5, 0x00000000,
+       0x0a000506, 0x8fbf0010, 0x0e000d1c, 0x00000000, 0x0a000506, 0x8fbf0010,
+       0x0000000d, 0x0a000506, 0x8fbf0010, 0x0e0005d7, 0x00000000, 0x0a000506,
+       0x8fbf0010, 0x8f440100, 0x0e000d7e, 0x00000000, 0x0a000506, 0x8fbf0010,
+       0x0e000e95, 0x00000000, 0x0a000506, 0x8fbf0010, 0x0e000626, 0x00000000,
+       0x0a000506, 0x8fbf0010, 0x0e000b68, 0x00000000, 0x0a000506, 0x8fbf0010,
+       0x0000000d, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x27bdffe8, 0x3c029000,
+       0x34420001, 0xafb00010, 0x00808021, 0x02021025, 0x3c038000, 0xafbf0014,
+       0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620005,
+       0x34420001, 0xa3620005, 0x8f63004c, 0x8f620054, 0x10620019, 0x3c028000,
+       0x9762006a, 0x00022880, 0x50a00001, 0x24050001, 0x97630068, 0x93640081,
+       0x3c020800, 0x8c46004c, 0x00652821, 0x00852804, 0x00c5102b, 0x54400001,
+       0x00a03021, 0x3c020800, 0x8c440050, 0x00c4182b, 0x54600001, 0x00c02021,
+       0x8f420074, 0x2403fffe, 0x00832824, 0x00a21021, 0xaf62000c, 0x3c028000,
+       0x34420001, 0x02021025, 0x0e000c7d, 0xaf420020, 0x3c029000, 0x34420001,
+       0x3c038000, 0x02021025, 0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd,
+       0x3c028000, 0x9363007d, 0x34420001, 0x3c048000, 0x02021025, 0xa363007d,
+       0xaf420020, 0x8f4201f8, 0x00441024, 0x1440fffd, 0x8fbf0014, 0xaf5001c0,
+       0x8fb00010, 0x24020002, 0x3c031000, 0xa34201c4, 0xaf4301f8, 0x03e00008,
+       0x27bd0018, 0x27bdffd8, 0xafbf0020, 0xafb3001c, 0xafb20018, 0xafb10014,
+       0xafb00010, 0x93630005, 0x00809021, 0x24020030, 0x30630030, 0x14620072,
+       0x00a09821, 0x3c020800, 0x8c430020, 0x1060006c, 0x00000000, 0x0e001006,
+       0x00000000, 0x8f820018, 0xac520000, 0x9363003e, 0x9362003f, 0x8f840018,
+       0x00031a00, 0x00431025, 0xac820004, 0x93630081, 0x93620082, 0x8f850018,
+       0x00031e00, 0x00021400, 0x00621825, 0xaca30008, 0x8f840018, 0x8f620040,
+       0xac82000c, 0x8f830018, 0x8f620048, 0xac620010, 0x8f840018, 0x8f62004c,
+       0x3c110800, 0xac820014, 0x8f830018, 0x8f620050, 0x26304660, 0x00002021,
+       0xac620018, 0x9602000e, 0x8f850018, 0x3c03c00b, 0x00431025, 0x0e001044,
+       0xaca2001c, 0x8f830018, 0x8f620054, 0xac620000, 0x8f840018, 0x8f620058,
+       0xac820004, 0x8f830018, 0x8f62005c, 0xac620008, 0x8f840018, 0x8f620060,
+       0xac82000c, 0x8f850018, 0x8f620064, 0xaca20010, 0x97630068, 0x9762006a,
+       0x8f840018, 0x00031c00, 0x00431025, 0xac820014, 0x8f830018, 0x00002021,
+       0xac600018, 0x9602000e, 0x8f850018, 0x3c03c00c, 0x00431025, 0x0e001044,
+       0xaca2001c, 0x8f840018, 0x8f630018, 0xac830000, 0x936200c4, 0x30420002,
+       0x10400006, 0x00000000, 0x976200c8, 0x8f830018, 0x3042ffff, 0x0a0005b5,
+       0xac620004, 0x8f820018, 0xac400004, 0x8f830018, 0x8f62006c, 0xac620008,
+       0x8f840018, 0x8f6200dc, 0xac82000c, 0x8f830018, 0xac600010, 0x93620005,
+       0x8f830018, 0x00021600, 0x00531025, 0xac620014, 0x8f850018, 0x3c026000,
+       0x8c434448, 0x24040001, 0x26224660, 0xaca30018, 0x9443000e, 0x8f850018,
+       0x3c02400d, 0x00621825, 0x0e001044, 0xaca3001c, 0x0e000d48, 0x02402021,
+       0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008,
+       0x27bd0028, 0x27bdffe0, 0xafb00010, 0x27500100, 0xafbf0018, 0xafb10014,
+       0x9603000c, 0x240200c1, 0x5462001d, 0x8e040000, 0x3c029000, 0x8f440100,
+       0x34420001, 0x3c038000, 0x00821025, 0xaf420020, 0x8f420020, 0x00431024,
+       0x1440fffd, 0x00000000, 0x3c038000, 0x9362007d, 0x34630001, 0x3c058000,
+       0x00831825, 0x34420004, 0xa362007d, 0xaf430020, 0x8f4201f8, 0x00451024,
+       0x1440fffd, 0x24020002, 0x3c031000, 0xaf4401c0, 0xa34201c4, 0xaf4301f8,
+       0x0a000622, 0x8fbf0018, 0x8f65004c, 0x24060001, 0x0e000db5, 0x2407049f,
+       0x3c020800, 0x8c430020, 0x9611000c, 0x1060001d, 0x8e100000, 0x0e001006,
+       0x00000000, 0x8f820018, 0xac500000, 0x8f840018, 0x00111400, 0xac820004,
+       0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010,
+       0x8f840018, 0x240204a2, 0xac820014, 0x8f850018, 0x3c026000, 0x8c434448,
+       0x24040001, 0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018, 0x3c024019,
+       0x00621825, 0x0e001044, 0xaca3001c, 0x8fbf0018, 0x8fb10014, 0x8fb00010,
+       0x03e00008, 0x27bd0020, 0x27bdffb0, 0xafb1002c, 0x27510100, 0xafbf004c,
+       0xafbe0048, 0xafb70044, 0xafb60040, 0xafb5003c, 0xafb40038, 0xafb30034,
+       0xafb20030, 0xafb00028, 0x8e350000, 0x9634000c, 0x3c026000, 0x8c434448,
+       0x0000f021, 0xaf630170, 0x8f620040, 0x8e230014, 0x0000b821, 0x00431023,
+       0x044001ec, 0x0000b021, 0x32820010, 0x1040002e, 0x3c026000, 0x9363003f,
+       0x9222000e, 0x10430006, 0x2402000c, 0x9223000f, 0x10620003, 0x24020014,
+       0x14620025, 0x3c026000, 0x32820004, 0x10400007, 0x241e0001, 0x8f620050,
+       0x24420001, 0xaf620050, 0x8f630054, 0x24630001, 0xaf630054, 0x32830102,
+       0x24020002, 0x5462000d, 0x9222000f, 0x8f620040, 0x24420001, 0xaf620040,
+       0x8f630048, 0x8f620040, 0x24630001, 0x54620005, 0x9222000f, 0x8f620048,
+       0x24420001, 0xaf620048, 0x9222000f, 0xa362003f, 0x9223000f, 0x24020012,
+       0x14620007, 0x3c026000, 0x3c030800, 0x8c620074, 0x24420001, 0x0e000f6e,
+       0xac620074, 0x3c026000, 0x8c434448, 0x32820040, 0xaf630174, 0x32830020,
+       0xafa30010, 0x32830080, 0xafa30014, 0x32830001, 0xafa3001c, 0x32830008,
+       0xafa30020, 0x32830100, 0x104000bb, 0xafa30018, 0x8e260010, 0x8f630054,
+       0x24c2ffff, 0x00431023, 0x18400006, 0x00000000, 0x0000000d, 0x00000000,
+       0x24000128, 0x0a0006b2, 0x00009021, 0x8f62004c, 0x00c21023, 0x18400028,
+       0x00009021, 0x93650120, 0x93640121, 0x3c030800, 0x8c62008c, 0x308400ff,
+       0x24420001, 0x30a500ff, 0x00804021, 0x1485000b, 0xac62008c, 0x3c040800,
+       0x8c830090, 0x24630001, 0xac830090, 0x93620122, 0x30420001, 0x00021023,
+       0x30420005, 0x0a0006b2, 0x34520004, 0x27670100, 0x00041080, 0x00e21021,
+       0x8c430000, 0x00c31823, 0x04600004, 0x24820001, 0x30440007, 0x1485fff9,
+       0x00041080, 0x10880007, 0x3c030800, 0xa3640121, 0x8c620094, 0x24120005,
+       0x24420001, 0x0a0006b2, 0xac620094, 0x24120004, 0x32420001, 0x10400020,
+       0x3c020800, 0x8c430020, 0x8e300000, 0x1060001c, 0x8e330010, 0x0e001006,
+       0x00000000, 0x8f820018, 0xac500000, 0x8f840018, 0x24020001, 0xac820004,
+       0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010,
+       0x8f820018, 0xac530014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001,
+       0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018, 0x3c024010, 0x00621825,
+       0x0e001044, 0xaca3001c, 0x32420004, 0x10400060, 0x00003821, 0x3c029000,
+       0x8e260010, 0x34420001, 0x3c038000, 0x02a21025, 0xa360007c, 0xaf420020,
+       0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620023, 0x30420080,
+       0x10400011, 0x00000000, 0x8f65005c, 0x8f63004c, 0x9764003c, 0x8f620064,
+       0x00a32823, 0x00852821, 0x00a2102b, 0x54400006, 0x3c023fff, 0x93620023,
+       0x3042007f, 0xa3620023, 0xaf660064, 0x3c023fff, 0x0a000702, 0x3442ffff,
+       0x8f62005c, 0x00c21023, 0x04400011, 0x00000000, 0x8f65005c, 0x8f630064,
+       0x9764003c, 0x3c023fff, 0x3442ffff, 0xaf660064, 0x00a32823, 0x00852821,
+       0x0045102b, 0x10400004, 0x00c51021, 0x3c053fff, 0x34a5ffff, 0x00c51021,
+       0xaf62005c, 0x24070001, 0xaf66004c, 0x8f620054, 0x14c20005, 0x00000000,
+       0x93620023, 0x30420040, 0x10400017, 0x24020001, 0x9762006a, 0x00022880,
+       0x50a00001, 0x24050001, 0x97630068, 0x93640081, 0x3c020800, 0x8c46004c,
+       0x00652821, 0x00852804, 0x00c5102b, 0x54400001, 0x00a03021, 0x3c020800,
+       0x8c440050, 0x00c4182b, 0x54600001, 0x00c02021, 0x8f420074, 0x2403fffe,
+       0x00832824, 0x00a21021, 0xaf62000c, 0x3c028000, 0x34420001, 0x02a21025,
+       0xa3600081, 0xaf420020, 0x9363007e, 0x9362007a, 0x10620005, 0x00e0b021,
+       0x0e000f2a, 0x00000000, 0x00403821, 0x00e0b021, 0x8fa20010, 0x10400008,
+       0x00000000, 0x8e220018, 0xaf620018, 0x8e23001c, 0xaf63001c, 0x8e220020,
+       0x24160001, 0xaf620058, 0x13c00036, 0x32820004, 0x10400035, 0x8fa30014,
+       0x93620023, 0x30420040, 0x10400031, 0x3c020800, 0x8c430020, 0x1060001c,
+       0x8e300000, 0x0e001006, 0x00000000, 0x8f820018, 0xac500000, 0x8f830018,
+       0xac600004, 0x8f820018, 0xac400008, 0x8f830018, 0xac60000c, 0x8f820018,
+       0xac400010, 0x8f830018, 0x24020587, 0xac620014, 0x8f850018, 0x3c026000,
+       0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018,
+       0x3c024019, 0x00621825, 0x0e001044, 0xaca3001c, 0x3c029000, 0x34420001,
+       0x02a21025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd,
+       0x24020001, 0xaf62000c, 0x93630023, 0x3c028000, 0x34420001, 0x02a21025,
+       0x306300bf, 0xa3630023, 0xaf420020, 0x8fa30014, 0x10600012, 0x8fa3001c,
+       0x9362007c, 0x24420001, 0xa362007c, 0x9363007e, 0x9362007a, 0x1462000b,
+       0x8fa3001c, 0x9362007c, 0x3c030800, 0x8c640024, 0x0044102b, 0x14400005,
+       0x8fa3001c, 0x0e000f2a, 0x00000000, 0x02c2b025, 0x8fa3001c, 0x3062ffff,
+       0x10400003, 0x32820200, 0x0a000793, 0x24170004, 0x10400003, 0x00000000,
+       0x24170040, 0x24160001, 0x13c0005d, 0x32820002, 0x1040005c, 0x8fa20020,
+       0x9222000a, 0x30420020, 0x10400033, 0x3c100800, 0x93620023, 0x30420040,
+       0x1040002f, 0x8e020020, 0x1040001e, 0x3c029000, 0x0e001006, 0x00000000,
+       0x8f820018, 0xac550000, 0x8f840018, 0x3c02008d, 0xac820004, 0x8f830018,
+       0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, 0x8f840018,
+       0x240205bf, 0xac820014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001,
+       0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018, 0x3c024019, 0x00621825,
+       0x0e001044, 0xaca3001c, 0x3c029000, 0x34420001, 0x02a21025, 0xaf420020,
+       0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93630023,
+       0x3c028000, 0x34420001, 0x02a21025, 0x306300bf, 0xa3630023, 0xaf420020,
+       0x8e020020, 0x10400023, 0x8fa20020, 0x0e001006, 0x00000000, 0x8f840018,
+       0x8e230000, 0xac830000, 0x9222000a, 0x8f830018, 0x00021600, 0xac620004,
+       0x8f840018, 0x8f620040, 0xac820008, 0x8f850018, 0x8f63004c, 0xaca3000c,
+       0x9362003f, 0x8f840018, 0x304200ff, 0xac820010, 0x8f830018, 0x3c026000,
+       0xac600014, 0x8f850018, 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018,
+       0x9443466e, 0x8f850018, 0x3c02401a, 0x00621825, 0x0e001044, 0xaca3001c,
+       0x8fa20020, 0x1040000e, 0x8fa20018, 0x9222000a, 0xa3620082, 0x56e00005,
+       0x36f70008, 0x8fa30018, 0x10600004, 0x00000000, 0x36f70008, 0x0a000801,
+       0x24160001, 0x0e000de1, 0x02a02021, 0x8fa20018, 0x10400003, 0x00000000,
+       0x36f70010, 0x24160001, 0x12c00019, 0x3c029000, 0x34420001, 0x02a21025,
+       0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000,
+       0x3c038000, 0x9362007d, 0x34630001, 0x3c048000, 0x02a31825, 0x02e21025,
+       0xa362007d, 0xaf430020, 0x8f4201f8, 0x00441024, 0x1440fffd, 0x24020002,
+       0x3c031000, 0xaf5501c0, 0xa34201c4, 0xaf4301f8, 0x9363003f, 0x24020012,
+       0x14620004, 0x3c026000, 0x0e000f6e, 0x00000000, 0x3c026000, 0x8c434448,
+       0xaf630178, 0x8fbf004c, 0x8fbe0048, 0x8fb70044, 0x8fb60040, 0x8fb5003c,
+       0x8fb40038, 0x8fb30034, 0x8fb20030, 0x8fb1002c, 0x8fb00028, 0x03e00008,
+       0x27bd0050, 0x27bdffe8, 0xafbf0014, 0xafb00010, 0x8f500180, 0x97420184,
+       0x30420200, 0x14400015, 0x00000000, 0x8f430188, 0x3c02ff00, 0x00621824,
+       0x3c020200, 0x10620031, 0x0043102b, 0x14400007, 0x3c020300, 0x1060000b,
+       0x3c020100, 0x1062000d, 0x00000000, 0x0a0008b4, 0x00000000, 0x10620027,
+       0x3c020400, 0x1062003e, 0x02002021, 0x0a0008b4, 0x00000000, 0x0e000e1e,
+       0x02002021, 0x0a0008b6, 0x8fbf0014, 0x93620005, 0x30420020, 0x1440005e,
+       0x8fbf0014, 0x3c029000, 0x34420001, 0x02021025, 0xaf420020, 0x3c038000,
+       0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620005, 0x3c038000,
+       0x34630001, 0x02031825, 0x34420020, 0xa3620005, 0xaf430020, 0x93620005,
+       0x30420020, 0x14400003, 0x02002021, 0x0000000d, 0x02002021, 0x0e000553,
+       0x24055854, 0x0a0008b6, 0x8fbf0014, 0x93620005, 0x30420001, 0x1040003f,
+       0x3c029000, 0x34420001, 0x02021025, 0xaf420020, 0x3c038000, 0x8f420020,
+       0x00431024, 0x1440fffd, 0x00000000, 0x93620005, 0x3c048000, 0x3c030800,
+       0x304200fe, 0xa3620005, 0x8c620020, 0x34840001, 0x02042025, 0xaf440020,
+       0x1040002d, 0x8fbf0014, 0x0a000894, 0x00000000, 0x00002821, 0x00003021,
+       0x0e000f78, 0x240706a4, 0x3c020800, 0x8c430020, 0x10600023, 0x8fbf0014,
+       0x0e001006, 0x00000000, 0x8f820018, 0xac500000, 0x93630082, 0x9362003f,
+       0x8f840018, 0x00031a00, 0x00431025, 0xac820004, 0x8f830018, 0xac600008,
+       0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, 0x8f820018, 0xac400014,
+       0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018,
+       0x9443466e, 0x8f850018, 0x3c02400a, 0x00621825, 0x0e001044, 0xaca3001c,
+       0x0a0008b6, 0x8fbf0014, 0x0000000d, 0x8fbf0014, 0x8fb00010, 0x03e00008,
+       0x27bd0018, 0x27bdffe8, 0xafbf0010, 0x93420148, 0x2444ffff, 0x2c830005,
+       0x10600047, 0x3c020800, 0x24424598, 0x00041880, 0x00621821, 0x8c640000,
+       0x00800008, 0x00000000, 0x8f430144, 0x8f62000c, 0x14620006, 0x24020001,
+       0xaf62000c, 0x0e000909, 0x00000000, 0x0a000907, 0x8fbf0010, 0x8f62000c,
+       0x0a000900, 0x00000000, 0x97630010, 0x8f420144, 0x14430006, 0x24020001,
+       0xa7620010, 0x0e000eeb, 0x00000000, 0x0a000907, 0x8fbf0010, 0x97620010,
+       0x0a000900, 0x00000000, 0x97630012, 0x8f420144, 0x14430006, 0x24020001,
+       0xa7620012, 0x0e000f06, 0x00000000, 0x0a000907, 0x8fbf0010, 0x97620012,
+       0x0a000900, 0x00000000, 0x97630014, 0x8f420144, 0x14430006, 0x24020001,
+       0xa7620014, 0x0e000f21, 0x00000000, 0x0a000907, 0x8fbf0010, 0x97620014,
+       0x0a000900, 0x00000000, 0x97630016, 0x8f420144, 0x14430006, 0x24020001,
+       0xa7620016, 0x0e000f24, 0x00000000, 0x0a000907, 0x8fbf0010, 0x97620016,
+       0x14400006, 0x8fbf0010, 0x3c030800, 0x8c620070, 0x24420001, 0xac620070,
+       0x8fbf0010, 0x03e00008, 0x27bd0018, 0x27bdffe8, 0xafbf0010, 0x93620081,
+       0x3c030800, 0x8c640048, 0x0044102b, 0x14400028, 0x3c029000, 0x8f460140,
+       0x34420001, 0x3c038000, 0x00c21025, 0xaf420020, 0x8f420020, 0x00431024,
+       0x1440fffd, 0x3c048000, 0x34840001, 0x3c059000, 0x34a50001, 0x3c078000,
+       0x24020012, 0x24030080, 0x00c42025, 0x00c52825, 0xa362003f, 0xa3630082,
+       0xaf440020, 0xaf450020, 0x8f420020, 0x00471024, 0x1440fffd, 0x3c038000,
+       0x9362007d, 0x34630001, 0x3c048000, 0x00c31825, 0x34420020, 0xa362007d,
+       0xaf430020, 0x8f4201f8, 0x00441024, 0x1440fffd, 0x24020002, 0x3c031000,
+       0x0a00096d, 0xaf4601c0, 0x93620081, 0x24420001, 0x0e000f2a, 0xa3620081,
+       0x9763006a, 0x00032880, 0x14a00002, 0x00403821, 0x24050001, 0x97630068,
+       0x93640081, 0x3c020800, 0x8c46004c, 0x00652821, 0x00852804, 0x00c5102b,
+       0x54400001, 0x00a03021, 0x3c020800, 0x8c440050, 0x00c4182b, 0x54600001,
+       0x00c02021, 0x8f420074, 0x2403fffe, 0x00832824, 0x00a21021, 0xaf62000c,
+       0x10e0001a, 0x3c029000, 0x8f440140, 0x34420001, 0x3c038000, 0x00821025,
+       0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x3c038000,
+       0x9362007d, 0x34630001, 0x3c058000, 0x00831825, 0x34420004, 0xa362007d,
+       0xaf430020, 0x8f4201f8, 0x00451024, 0x1440fffd, 0x24020002, 0x3c031000,
+       0xaf4401c0, 0xa34201c4, 0xaf4301f8, 0x8fbf0010, 0x03e00008, 0x27bd0018,
+       0x27bdffd8, 0xafb3001c, 0x27530100, 0xafbf0024, 0xafb40020, 0xafb20018,
+       0xafb10014, 0xafb00010, 0x96620008, 0x3c140800, 0x8f520100, 0x30420001,
+       0x104000cf, 0x00000000, 0x8e700018, 0x8f630054, 0x2602ffff, 0x00431023,
+       0x18400006, 0x00000000, 0x0000000d, 0x00000000, 0x24000128, 0x0a0009b6,
+       0x00008821, 0x8f62004c, 0x02021023, 0x18400028, 0x00008821, 0x93650120,
+       0x93640121, 0x3c030800, 0x8c62008c, 0x308400ff, 0x24420001, 0x30a500ff,
+       0x00803821, 0x1485000b, 0xac62008c, 0x3c040800, 0x8c830090, 0x24630001,
+       0xac830090, 0x93620122, 0x30420001, 0x00021023, 0x30420005, 0x0a0009b6,
+       0x34510004, 0x27660100, 0x00041080, 0x00c21021, 0x8c430000, 0x02031823,
+       0x04600004, 0x24820001, 0x30440007, 0x1485fff9, 0x00041080, 0x10870007,
+       0x3c030800, 0xa3640121, 0x8c620094, 0x24110005, 0x24420001, 0x0a0009b6,
+       0xac620094, 0x24110004, 0x32220001, 0x1040001e, 0x8e820020, 0x1040001d,
+       0x32220004, 0x0e001006, 0x00000000, 0x8f820018, 0xac520000, 0x8f840018,
+       0x24020001, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c,
+       0x8f830018, 0xac600010, 0x8f820018, 0xac500014, 0x8f850018, 0x3c026000,
+       0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018,
+       0x3c024010, 0x00621825, 0x0e001044, 0xaca3001c, 0x32220004, 0x10400076,
+       0x00003821, 0x3c029000, 0x34420001, 0x3c038000, 0x02421025, 0xa360007c,
+       0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620023,
+       0x30420080, 0x10400011, 0x00000000, 0x8f65005c, 0x8f63004c, 0x9764003c,
+       0x8f620064, 0x00a32823, 0x00852821, 0x00a2102b, 0x54400006, 0x3c023fff,
+       0x93620023, 0x3042007f, 0xa3620023, 0xaf700064, 0x3c023fff, 0x0a000a03,
+       0x3442ffff, 0x8f62005c, 0x02021023, 0x04400011, 0x00000000, 0x8f65005c,
+       0x8f630064, 0x9764003c, 0x3c023fff, 0x3442ffff, 0xaf700064, 0x00a32823,
+       0x00852821, 0x0045102b, 0x10400004, 0x02051021, 0x3c053fff, 0x34a5ffff,
+       0x02051021, 0xaf62005c, 0x24070001, 0xaf70004c, 0x8f620054, 0x16020005,
+       0x00000000, 0x93620023, 0x30420040, 0x10400017, 0x24020001, 0x9762006a,
+       0x00022880, 0x50a00001, 0x24050001, 0x97630068, 0x93640081, 0x3c020800,
+       0x8c46004c, 0x00652821, 0x00852804, 0x00c5102b, 0x54400001, 0x00a03021,
+       0x3c020800, 0x8c440050, 0x00c4182b, 0x54600001, 0x00c02021, 0x8f420074,
+       0x2403fffe, 0x00832824, 0x00a21021, 0xaf62000c, 0x3c028000, 0x34420001,
+       0x02421025, 0xa3600081, 0xaf420020, 0x9363007e, 0x9362007a, 0x10620004,
+       0x00000000, 0x0e000f2a, 0x00000000, 0x00403821, 0x10e00017, 0x3c029000,
+       0x34420001, 0x02421025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024,
+       0x1440fffd, 0x3c028000, 0x9363007d, 0x34420001, 0x3c048000, 0x02421025,
+       0xa363007d, 0xaf420020, 0x8f4201f8, 0x00441024, 0x1440fffd, 0x24020002,
+       0x3c031000, 0xaf5201c0, 0xa34201c4, 0xaf4301f8, 0x9342010b, 0x8e830020,
+       0x27500100, 0x38420006, 0x10600029, 0x2c510001, 0x0e001006, 0x00000000,
+       0x8f830018, 0x8e020000, 0xac620000, 0x8f840018, 0x96020008, 0xac820004,
+       0x8f830018, 0x8e020014, 0xac620008, 0x8f850018, 0x3c026000, 0x8c434448,
+       0xaca3000c, 0x8f840018, 0x96020012, 0xac820010, 0x8f850018, 0x8e030020,
+       0xaca30014, 0x9602000c, 0x9603000e, 0x8f840018, 0x00021400, 0x00431025,
+       0xac820018, 0x12200005, 0x3c020800, 0x9443466e, 0x8f840018, 0x0a000a78,
+       0x3c024013, 0x9443466e, 0x8f840018, 0x3c024014, 0x00621825, 0xac83001c,
+       0x0e001044, 0x24040001, 0x8e630014, 0x8f620040, 0x14430003, 0x00431023,
+       0x0a000a83, 0x00001021, 0x28420001, 0x10400034, 0x00000000, 0x8f620040,
+       0xaf630040, 0x9362003e, 0x30420001, 0x1440000b, 0x3c029000, 0x93620022,
+       0x24420001, 0xa3620022, 0x93630022, 0x3c020800, 0x8c440098, 0x0064182b,
+       0x1460001e, 0x3c020800, 0x3c029000, 0x34420001, 0x02421025, 0xaf420020,
+       0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x3c038000,
+       0x9362007d, 0x34630001, 0x3c048000, 0x02431825, 0x34420001, 0xa362007d,
+       0xaf430020, 0x8f4201f8, 0x00441024, 0x1440fffd, 0x24020002, 0x3c031000,
+       0xaf5201c0, 0xa34201c4, 0x24020001, 0xaf4301f8, 0xa7620012, 0x0a000ab6,
+       0xa3600022, 0x9743007a, 0x9444002a, 0x00641821, 0x3063fffe, 0xa7630012,
+       0x0e000b68, 0x00000000, 0x97420108, 0x8fbf0024, 0x8fb40020, 0x8fb3001c,
+       0x8fb20018, 0x8fb10014, 0x8fb00010, 0x00021042, 0x30420001, 0x03e00008,
+       0x27bd0028, 0x27bdffe0, 0xafb20018, 0x3c120800, 0x8e420020, 0xafb00010,
+       0x27500100, 0xafbf001c, 0x10400046, 0xafb10014, 0x0e001006, 0x00000000,
+       0x8f840018, 0x8e020000, 0xac820000, 0x936300b1, 0x936200c5, 0x8f850018,
+       0x00031e00, 0x00021400, 0x34420100, 0x00621825, 0xaca30004, 0x8f840018,
+       0x8e02001c, 0xac820008, 0x8f830018, 0x8f620048, 0xac62000c, 0x8f840018,
+       0x96020012, 0xac820010, 0x8f830018, 0x8f620040, 0x24040001, 0xac620014,
+       0x8f850018, 0x3c026000, 0x8c434448, 0x3c020800, 0x24514660, 0xaca30018,
+       0x9623000e, 0x8f850018, 0x3c024016, 0x00621825, 0x0e001044, 0xaca3001c,
+       0x96030008, 0x30630010, 0x1060001c, 0x8e420020, 0x1040001a, 0x8e100000,
+       0x0e001006, 0x00000000, 0x8f820018, 0xac500000, 0x8f830018, 0xac600004,
+       0x8f820018, 0xac400008, 0x8f830018, 0xac60000c, 0x8f820018, 0xac400010,
+       0x8f830018, 0xac600014, 0x8f850018, 0x3c036000, 0x8c634448, 0x24040001,
+       0xaca30018, 0x9622000e, 0x8f850018, 0x3c034015, 0x00431025, 0x0e001044,
+       0xaca2001c, 0x00001021, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010,
+       0x03e00008, 0x27bd0020, 0x27bdffe0, 0xafb20018, 0x3c120800, 0x8e420020,
+       0xafb00010, 0x27500100, 0xafbf001c, 0x10400041, 0xafb10014, 0x0e001006,
+       0x00000000, 0x8f830018, 0x8e020000, 0xac620000, 0x8f840018, 0x24020100,
+       0xac820004, 0x8f830018, 0x8e02001c, 0xac620008, 0x8f840018, 0x8e020018,
+       0xac82000c, 0x8f830018, 0x96020012, 0xac620010, 0x8f840018, 0x96020008,
+       0xac820014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, 0x3c020800,
+       0x24514660, 0xaca30018, 0x9623000e, 0x8f850018, 0x3c024017, 0x00621825,
+       0x0e001044, 0xaca3001c, 0x96030008, 0x30630010, 0x1060001c, 0x8e420020,
+       0x1040001a, 0x8e100000, 0x0e001006, 0x00000000, 0x8f820018, 0xac500000,
+       0x8f830018, 0xac600004, 0x8f820018, 0xac400008, 0x8f830018, 0xac60000c,
+       0x8f820018, 0xac400010, 0x8f830018, 0xac600014, 0x8f850018, 0x3c036000,
+       0x8c634448, 0x24040001, 0xaca30018, 0x9622000e, 0x8f850018, 0x3c034015,
+       0x00431025, 0x0e001044, 0xaca2001c, 0x00001021, 0x8fbf001c, 0x8fb20018,
+       0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffe8, 0xafbf0010,
+       0x936200c4, 0x30420002, 0x10400019, 0x00000000, 0x936200c5, 0x936300b1,
+       0x00431023, 0x304400ff, 0x30830080, 0x10600004, 0x00000000, 0x0000000d,
+       0x00000000, 0x24000a6a, 0x93620004, 0x00441023, 0x304400ff, 0x30830080,
+       0x10600004, 0x2482ffff, 0x8f650024, 0x0a000b82, 0x00000000, 0x00022b00,
+       0x8f620024, 0x0045102b, 0x10400002, 0x00000000, 0x8f650024, 0x8f620048,
+       0x8f630040, 0x00431823, 0x0065202b, 0x10800004, 0x00000000, 0x8f620040,
+       0x00451021, 0xaf620048, 0x9762003c, 0x0062102b, 0x10400041, 0x8fbf0010,
+       0x10a0003f, 0x3c029000, 0x34420001, 0x3c040800, 0x8c830080, 0x8f450100,
+       0x3c068000, 0x24630001, 0x00a21025, 0xac830080, 0xaf420020, 0x8f420020,
+       0x00461024, 0x1440fffd, 0x3c038000, 0x9362007d, 0x34630001, 0x3c048000,
+       0x00a31825, 0x34420004, 0xa362007d, 0xaf430020, 0x8f4201f8, 0x00441024,
+       0x1440fffd, 0x24020002, 0x3c030800, 0xaf4501c0, 0xa34201c4, 0x8c640020,
+       0x3c021000, 0xaf4201f8, 0x1080001f, 0x8fbf0010, 0x0e001006, 0x00000000,
+       0x8f830018, 0x8f420100, 0xac620000, 0x8f840018, 0x8f620040, 0xac820004,
+       0x8f850018, 0x8f620048, 0xaca20008, 0x8f830018, 0xac60000c, 0x8f820018,
+       0xac400010, 0x8f830018, 0x3c026000, 0xac600014, 0x8f840018, 0x8c434448,
+       0x3c020800, 0xac830018, 0x9443466e, 0x8f840018, 0x3c0240c2, 0x00621825,
+       0xac83001c, 0x0e001044, 0x24040001, 0x8fbf0010, 0x03e00008, 0x27bd0018,
+       0x3c020800, 0x24423958, 0xaf82000c, 0x03e00008, 0x00000000, 0x27bdffe8,
+       0xafb00010, 0x27500100, 0xafbf0014, 0x8e02001c, 0x14400003, 0x3c020800,
+       0x0000000d, 0x3c020800, 0x8c430020, 0x10600026, 0x00001021, 0x0e001006,
+       0x00000000, 0x8f830018, 0x8e020000, 0xac620000, 0x8f840018, 0x8e02001c,
+       0xac820004, 0x8f830018, 0xac600008, 0x8f840018, 0x8e020018, 0xac82000c,
+       0x8f850018, 0x96020012, 0xaca20010, 0x8f830018, 0x3c106000, 0xac600014,
+       0x8f840018, 0x8e024448, 0x3c030800, 0xac820018, 0x9462466e, 0x8f840018,
+       0x3c034012, 0x00431025, 0xac82001c, 0x0e001044, 0x24040001, 0x8e036800,
+       0x00001021, 0x3c040001, 0x00641825, 0xae036800, 0x0a000c0d, 0x8fbf0014,
+       0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c020800, 0x97430078,
+       0x9444002e, 0x00001021, 0x00641821, 0x3063fffe, 0x03e00008, 0xa7630010,
+       0x27450100, 0x8f640048, 0x8ca30018, 0x00641023, 0x18400021, 0x00000000,
+       0xaf630048, 0x8f620040, 0x9763003c, 0x00821023, 0x0043102a, 0x1040001a,
+       0x3c029000, 0x8ca40000, 0x34420001, 0x3c038000, 0x00821025, 0xaf420020,
+       0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x3c038000, 0x9362007d,
+       0x34630001, 0x3c058000, 0x00831825, 0x34420004, 0xa362007d, 0xaf430020,
+       0x8f4201f8, 0x00451024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4401c0,
+       0xa34201c4, 0xaf4301f8, 0x03e00008, 0x00001021, 0x8f420100, 0x34420001,
+       0xaf4200a4, 0x03e00008, 0x00001021, 0x27bdffe0, 0xafbf0018, 0xafb10014,
+       0xafb00010, 0x9362007e, 0x30d000ff, 0x16020029, 0x00808821, 0x93620080,
+       0x16020026, 0x00000000, 0x9362007f, 0x16020023, 0x00000000, 0x9362007a,
+       0x16020004, 0x00000000, 0x0000000d, 0x00000000, 0x24000771, 0x0e000f49,
+       0x00000000, 0x3c039000, 0x34630001, 0x3c048000, 0x02231825, 0xa370007a,
+       0xaf430020, 0x8f420020, 0x00441024, 0x1440fffd, 0x3c028000, 0x9363007d,
+       0x34420001, 0x3c048000, 0x02221025, 0xa363007d, 0xaf420020, 0x8f4201f8,
+       0x00441024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf5101c0, 0xa34201c4,
+       0xaf4301f8, 0x0a000c79, 0x8fbf0018, 0x0000000d, 0x00000000, 0x24000781,
+       0x8fbf0018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x3c020800,
+       0x8c430020, 0x27bdffe8, 0xafb00010, 0x27500100, 0x10600024, 0xafbf0014,
+       0x0e001006, 0x00000000, 0x8f830018, 0x8e020000, 0xac620000, 0x8f840018,
+       0x8e020004, 0xac820004, 0x8f830018, 0x8e020018, 0xac620008, 0x8f840018,
+       0x8e03001c, 0xac83000c, 0x9602000c, 0x9203000a, 0x8f840018, 0x00021400,
+       0x00431025, 0xac820010, 0x8f830018, 0x3c026000, 0xac600014, 0x8f840018,
+       0x8c434448, 0xac830018, 0x96020008, 0x3c030800, 0x9464466e, 0x8f850018,
+       0x00021400, 0x00441025, 0x24040001, 0x0e001044, 0xaca2001c, 0x8fbf0014,
+       0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c020800, 0x8c430020, 0x27bdffe8,
+       0xafb00010, 0x27500100, 0x10600020, 0xafbf0014, 0x0e001006, 0x00000000,
+       0x8f820018, 0xac400000, 0x8f830018, 0xac600004, 0x8f820018, 0xac400008,
+       0x8f830018, 0xac60000c, 0x9602000c, 0x9603000e, 0x8f840018, 0x00021400,
+       0x00431025, 0xac820010, 0x8f830018, 0x3c026000, 0xac600014, 0x8f840018,
+       0x8c434448, 0xac830018, 0x96020008, 0x3c030800, 0x9464466e, 0x8f850018,
+       0x00021400, 0x00441025, 0x24040001, 0x0e001044, 0xaca2001c, 0x8fbf0014,
+       0x8fb00010, 0x03e00008, 0x27bd0018, 0x27bdffe8, 0xafb00010, 0x27500100,
+       0xafbf0014, 0x9602000c, 0x10400024, 0x00802821, 0x3c020800, 0x8c430020,
+       0x1060003a, 0x8fbf0014, 0x0e001006, 0x00000000, 0x8f840018, 0x8e030000,
+       0xac830000, 0x9602000c, 0x8f840018, 0x00021400, 0xac820004, 0x8f830018,
+       0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, 0x8f820018,
+       0xac400014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, 0x3c020800,
+       0xaca30018, 0x9443466e, 0x8f850018, 0x3c02400b, 0x00621825, 0x0e001044,
+       0xaca3001c, 0x0a000d19, 0x8fbf0014, 0x93620005, 0x30420010, 0x14400015,
+       0x3c029000, 0x34420001, 0x00a21025, 0xaf420020, 0x3c038000, 0x8f420020,
+       0x00431024, 0x1440fffd, 0x00000000, 0x3c038000, 0x93620005, 0x34630001,
+       0x00a02021, 0x00a31825, 0x24055852, 0x34420010, 0xa3620005, 0x0e000553,
+       0xaf430020, 0x0a000d19, 0x8fbf0014, 0x0000000d, 0x8fbf0014, 0x8fb00010,
+       0x03e00008, 0x27bd0018, 0x3c020800, 0x8c430020, 0x27bdffe8, 0xafb00010,
+       0x27500100, 0x10600022, 0xafbf0014, 0x0e001006, 0x00000000, 0x8f840018,
+       0x8e020004, 0xac820000, 0x9603000c, 0x9762002c, 0x8f840018, 0x00031c00,
+       0x00431025, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c,
+       0x8f830018, 0xac600010, 0x8f820018, 0xac400014, 0x8f850018, 0x3c026000,
+       0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018,
+       0x3c02400e, 0x00621825, 0x0e001044, 0xaca3001c, 0x0e000d48, 0x8e040000,
+       0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c038000, 0x8f420278,
+       0x00431024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf440240, 0xa3420244,
+       0x03e00008, 0xaf430278, 0x3c020800, 0x8c430020, 0x27bdffe0, 0xafb10014,
+       0x00808821, 0xafb20018, 0x00c09021, 0xafb00010, 0x30b0ffff, 0x1060001c,
+       0xafbf001c, 0x0e001006, 0x00000000, 0x8f820018, 0xac510000, 0x8f840018,
+       0x00101400, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c,
+       0x8f830018, 0xac600010, 0x8f820018, 0xac520014, 0x8f840018, 0x3c026000,
+       0x8c434448, 0x3c020800, 0xac830018, 0x9443466e, 0x8f840018, 0x3c024019,
+       0x00621825, 0xac83001c, 0x0e001044, 0x24040001, 0x8fbf001c, 0x8fb20018,
+       0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffe8, 0x27450100,
+       0xafbf0010, 0x94a3000c, 0x240200c1, 0x14620029, 0x00803021, 0x3c029000,
+       0x34420001, 0x00c21025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024,
+       0x1440fffd, 0x3c028000, 0x34420001, 0x3c049000, 0x34840001, 0x3c058000,
+       0x24030012, 0x00c21025, 0x00c42025, 0xa363003f, 0xaf420020, 0xaf440020,
+       0x8f420020, 0x00451024, 0x1440fffd, 0x3c038000, 0x9362007d, 0x34630001,
+       0x3c048000, 0x00c31825, 0x34420020, 0xa362007d, 0xaf430020, 0x8f4201f8,
+       0x00441024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4601c0, 0xa34201c4,
+       0xaf4301f8, 0x0a000db3, 0x8fbf0010, 0x00c02021, 0x94a5000c, 0x24060001,
+       0x0e000f78, 0x240706d8, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x3c020800,
+       0x8c430020, 0x27bdffe0, 0xafb00010, 0x00808021, 0xafb20018, 0x00a09021,
+       0xafb10014, 0x30d100ff, 0x1060001c, 0xafbf001c, 0x0e001006, 0x00000000,
+       0x8f820018, 0xac500000, 0x8f840018, 0x24020001, 0xac820004, 0x8f830018,
+       0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, 0x8f820018,
+       0xac520014, 0x8f840018, 0x3c026000, 0x8c434448, 0x3c020800, 0xac830018,
+       0x9443466e, 0x8f840018, 0x3c024010, 0x00621825, 0xac83001c, 0x0e001044,
+       0x02202021, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008,
+       0x27bd0020, 0x27bdffe8, 0xafbf0014, 0xafb00010, 0x93620005, 0x30420001,
+       0x10400033, 0x00808021, 0x3c029000, 0x34420001, 0x02021025, 0xaf420020,
+       0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620005,
+       0x3c048000, 0x3c030800, 0x304200fe, 0xa3620005, 0x8c620020, 0x34840001,
+       0x02042025, 0xaf440020, 0x10400020, 0x8fbf0014, 0x0e001006, 0x00000000,
+       0x8f820018, 0xac500000, 0x93630082, 0x9362003f, 0x8f840018, 0x00031a00,
+       0x00431025, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c,
+       0x8f830018, 0xac600010, 0x8f820018, 0xac400014, 0x8f840018, 0x3c026000,
+       0x8c434448, 0x3c020800, 0xac830018, 0x9443466e, 0x8f840018, 0x3c02400a,
+       0x00621825, 0xac83001c, 0x0e001044, 0x24040001, 0x8fbf0014, 0x8fb00010,
+       0x03e00008, 0x27bd0018, 0x27bdffe8, 0xafbf0010, 0x8f420188, 0x00803021,
+       0x9364003f, 0x24030012, 0x00021402, 0x1483001c, 0x304500ff, 0x3c029000,
+       0x34420001, 0x3c038000, 0x00c21025, 0xa3650080, 0xa365007a, 0xaf420020,
+       0x8f420020, 0x00431024, 0x1440fffd, 0x3c028000, 0x9363007d, 0x34420001,
+       0x3c048000, 0x00c21025, 0xa363007d, 0xaf420020, 0x8f4201f8, 0x00441024,
+       0x1440fffd, 0x24020002, 0x3c031000, 0xaf4601c0, 0xa34201c4, 0xaf4301f8,
+       0x0a000e54, 0x8fbf0010, 0x9362007e, 0x1445000e, 0x00000000, 0x93620080,
+       0x1045000b, 0x00000000, 0xa3650080, 0x8f820000, 0x93660080, 0x8f440180,
+       0x8f65004c, 0x8c430000, 0x0060f809, 0x00000000, 0x0a000e54, 0x8fbf0010,
+       0xa3650080, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x3c020800, 0x8c430020,
+       0x27bdffe0, 0xafb10014, 0x00808821, 0xafb20018, 0x00a09021, 0xafb00010,
+       0x30d000ff, 0x1060002f, 0xafbf001c, 0x0e001006, 0x00000000, 0x8f820018,
+       0xac510000, 0x8f830018, 0xac700004, 0x8f820018, 0xac520008, 0x8f830018,
+       0xac60000c, 0x8f820018, 0xac400010, 0x9763006a, 0x00032880, 0x50a00001,
+       0x24050001, 0x97630068, 0x93640081, 0x3c020800, 0x8c46004c, 0x00652821,
+       0x00852804, 0x00c5102b, 0x54400001, 0x00a03021, 0x3c020800, 0x8c440050,
+       0x00c4182b, 0x54600001, 0x00c02021, 0x8f830018, 0x2402fffe, 0x00822824,
+       0x3c026000, 0xac650014, 0x8f840018, 0x8c434448, 0x3c020800, 0xac830018,
+       0x9443466e, 0x8f840018, 0x3c024011, 0x00621825, 0xac83001c, 0x0e001044,
+       0x24040001, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008,
+       0x27bd0020, 0x27bdffe8, 0xafbf0014, 0xafb00010, 0x8f440100, 0x27500100,
+       0x8f650050, 0x0e000c45, 0x9206001b, 0x3c020800, 0x8c430020, 0x1060001d,
+       0x8e100018, 0x0e001006, 0x00000000, 0x8f840018, 0x8f420100, 0xac820000,
+       0x8f830018, 0xac700004, 0x8f840018, 0x8f620050, 0xac820008, 0x8f830018,
+       0xac60000c, 0x8f820018, 0xac400010, 0x8f830018, 0x3c026000, 0xac600014,
+       0x8f850018, 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x9443466e,
+       0x8f850018, 0x3c02401c, 0x00621825, 0x0e001044, 0xaca3001c, 0x8fbf0014,
+       0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c029000, 0x8f460140, 0x34420001,
+       0x3c038000, 0x00c21025, 0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd,
+       0x3c048000, 0x34840001, 0x3c059000, 0x34a50001, 0x3c078000, 0x24020012,
+       0x24030080, 0x00c42025, 0x00c52825, 0xa362003f, 0xa3630082, 0xaf440020,
+       0xaf450020, 0x8f420020, 0x00471024, 0x1440fffd, 0x3c038000, 0x9362007d,
+       0x34630001, 0x3c048000, 0x00c31825, 0x34420020, 0xa362007d, 0xaf430020,
+       0x8f4201f8, 0x00441024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4601c0,
+       0xa34201c4, 0x03e00008, 0xaf4301f8, 0x8f430238, 0x3c020800, 0x04610013,
+       0x8c44009c, 0x2406fffe, 0x3c050800, 0x3c038000, 0x2484ffff, 0x14800009,
+       0x00000000, 0x97420078, 0x8ca3007c, 0x24420001, 0x00461024, 0x24630001,
+       0xa7620010, 0x03e00008, 0xaca3007c, 0x8f420238, 0x00431024, 0x1440fff3,
+       0x2484ffff, 0x8f420140, 0x3c031000, 0xaf420200, 0x03e00008, 0xaf430238,
+       0x3c029000, 0x8f440140, 0x34420001, 0x3c038000, 0x00821025, 0xaf420020,
+       0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x3c038000, 0x9362007d,
+       0x34630001, 0x3c058000, 0x00831825, 0x34420001, 0xa362007d, 0xaf430020,
+       0x8f4201f8, 0x00451024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4401c0,
+       0xa34201c4, 0x03e00008, 0xaf4301f8, 0x0000000d, 0x03e00008, 0x00000000,
+       0x0000000d, 0x03e00008, 0x00000000, 0x24020001, 0x03e00008, 0xa7620010,
+       0x9362003f, 0x304400ff, 0x3883000e, 0x2c630001, 0x38820010, 0x2c420001,
+       0x00621825, 0x14600003, 0x24020012, 0x14820003, 0x00000000, 0x03e00008,
+       0x00001021, 0x9363007e, 0x9362007a, 0x14620006, 0x00000000, 0x9363007e,
+       0x24020001, 0x24630001, 0x03e00008, 0xa363007e, 0x9363007e, 0x93620080,
+       0x14620004, 0x24020001, 0xa362000b, 0x03e00008, 0x24020001, 0x03e00008,
+       0x00001021, 0x9362000b, 0x10400021, 0x00001021, 0xa360000b, 0x9362003f,
+       0x304400ff, 0x3883000e, 0x2c630001, 0x38820010, 0x2c420001, 0x00621825,
+       0x14600015, 0x00001821, 0x24020012, 0x10820012, 0x00000000, 0x9363007e,
+       0x9362007a, 0x14620007, 0x00000000, 0x9362007e, 0x24030001, 0x24420001,
+       0xa362007e, 0x03e00008, 0x00601021, 0x9363007e, 0x93620080, 0x14620004,
+       0x00001821, 0x24020001, 0xa362000b, 0x24030001, 0x03e00008, 0x00601021,
+       0x03e00008, 0x00000000, 0x24040001, 0xaf64000c, 0x8f6300dc, 0x8f6200cc,
+       0x50620001, 0xa7640010, 0xa7640012, 0xa7640014, 0x03e00008, 0xa7640016,
+       0x27bdffd8, 0xafb00010, 0x00808021, 0xafb3001c, 0x00c09821, 0xafbf0020,
+       0xafb20018, 0xafb10014, 0x93620023, 0x00e09021, 0x30420040, 0x10400020,
+       0x30b1ffff, 0x3c020800, 0x8c430020, 0x1060001c, 0x00000000, 0x0e001006,
+       0x00000000, 0x8f820018, 0xac500000, 0x8f840018, 0x3c02008d, 0xac820004,
+       0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010,
+       0x8f820018, 0xac520014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001,
+       0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018, 0x3c024019, 0x00621825,
+       0x0e001044, 0xaca3001c, 0x93620023, 0x30420020, 0x14400003, 0x3c020800,
+       0x52600020, 0x3c029000, 0x8c430020, 0x1060001d, 0x3c029000, 0x0e001006,
+       0x00000000, 0x8f820018, 0xac500000, 0x8f840018, 0x00111400, 0xac820004,
+       0x8f830018, 0xac720008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010,
+       0x8f820018, 0xac400014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001,
+       0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018, 0x3c02401b, 0x00621825,
+       0x0e001044, 0xaca3001c, 0x3c029000, 0x34420001, 0x02021025, 0xaf420020,
+       0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93630023,
+       0x3c028000, 0x34420001, 0x02021025, 0x8fbf0020, 0x8fb3001c, 0x8fb20018,
+       0x8fb10014, 0x8fb00010, 0x3063009f, 0xa3630023, 0xaf420020, 0x03e00008,
+       0x27bd0028, 0x3c020800, 0x8c430020, 0x27bdffe8, 0xafb00010, 0x27500100,
+       0x1060001d, 0xafbf0014, 0x0e001006, 0x00000000, 0x8f830018, 0x8e020004,
+       0xac620000, 0x8f840018, 0x8e020018, 0xac820004, 0x8f850018, 0x8e020000,
+       0xaca20008, 0x8f830018, 0xac60000c, 0x8f820018, 0xac400010, 0x8f830018,
+       0xac600014, 0x8f820018, 0xac400018, 0x96030008, 0x3c020800, 0x9444466e,
+       0x8f850018, 0x00031c00, 0x00641825, 0x24040001, 0x0e001044, 0xaca3001c,
+       0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c060800, 0x24c54660,
+       0x3c02000a, 0x03421821, 0x94640006, 0x94a2000a, 0x00441023, 0x00021400,
+       0x00021c03, 0x04610006, 0xa4a40006, 0x0000000d, 0x00000000, 0x2400005a,
+       0x0a00101b, 0x24020001, 0x8f820014, 0x0062102b, 0x14400002, 0x00001021,
+       0x24020001, 0x304200ff, 0x1040001c, 0x274a0400, 0x3c07000a, 0x3c020800,
+       0x24454660, 0x94a9000a, 0x8f880014, 0x03471021, 0x94430006, 0x00402021,
+       0xa4a30006, 0x94820006, 0xa4a20006, 0x01221023, 0x00021400, 0x00021403,
+       0x04410006, 0x0048102b, 0x0000000d, 0x00000000, 0x2400005a, 0x0a001036,
+       0x24020001, 0x14400002, 0x00001021, 0x24020001, 0x304200ff, 0x1440ffec,
+       0x03471021, 0x24c44660, 0x8c820010, 0xaf420038, 0x8c830014, 0x3c020005,
+       0xaf43003c, 0xaf420030, 0xaf800010, 0xaf8a0018, 0x03e00008, 0x00000000,
+       0x27bdffe0, 0x8f820010, 0x8f850018, 0x3c070800, 0x24e84660, 0xafbf001c,
+       0xafb20018, 0xafb10014, 0xafb00010, 0x9503000a, 0x8d060014, 0x00009021,
+       0x309000ff, 0x00e08821, 0x24420001, 0x24a50020, 0x24630001, 0xaf820010,
+       0xaf850018, 0xa503000a, 0x24c30020, 0x3c028000, 0x04c10007, 0xad030014,
+       0x00621024, 0x14400005, 0x26224660, 0x8d020010, 0x24420001, 0xad020010,
+       0x26224660, 0x9444000a, 0x94450018, 0x0010102b, 0x00a41826, 0x2c630001,
+       0x00621825, 0x1060001c, 0x3c030006, 0x8f820010, 0x24120001, 0x00021140,
+       0x00431025, 0xaf420030, 0x00000000, 0x00000000, 0x00000000, 0x27450400,
+       0x8f420000, 0x30420010, 0x1040fffd, 0x26224660, 0x9444000a, 0x94430018,
+       0xaf800010, 0xaf850018, 0x14830012, 0x26274660, 0x0e0010d2, 0x00000000,
+       0x1600000e, 0x26274660, 0x0e001006, 0x00000000, 0x0a00108f, 0x26274660,
+       0x00041c00, 0x00031c03, 0x00051400, 0x00021403, 0x00621823, 0x18600002,
+       0x3c026000, 0xac400808, 0x26274660, 0x94e2000e, 0x94e3000c, 0x24420001,
+       0xa4e2000e, 0x3042ffff, 0x50430001, 0xa4e0000e, 0x12000005, 0x3c02000a,
+       0x94e2000a, 0xa74200a2, 0x0a0010cc, 0x02401021, 0x03421821, 0x94640006,
+       0x94e2000a, 0x00441023, 0x00021400, 0x00021c03, 0x04610006, 0xa4e40006,
+       0x0000000d, 0x00000000, 0x2400005a, 0x0a0010ae, 0x24020001, 0x8f820014,
+       0x0062102b, 0x14400002, 0x00001021, 0x24020001, 0x304200ff, 0x1040001b,
+       0x3c020800, 0x3c06000a, 0x24454660, 0x94a8000a, 0x8f870014, 0x03461021,
+       0x94430006, 0x00402021, 0xa4a30006, 0x94820006, 0xa4a20006, 0x01021023,
+       0x00021400, 0x00021403, 0x04410006, 0x0047102b, 0x0000000d, 0x00000000,
+       0x2400005a, 0x0a0010c8, 0x24020001, 0x14400002, 0x00001021, 0x24020001,
+       0x304200ff, 0x1440ffec, 0x03461021, 0x02401021, 0x8fbf001c, 0x8fb20018,
+       0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x3c020800, 0x24454660,
+       0x94a3001a, 0x8ca40024, 0x00403021, 0x000318c0, 0x00832021, 0xaf44003c,
+       0x8ca20020, 0xaf420038, 0x3c020050, 0x34420008, 0xaf420030, 0x00000000,
+       0x00000000, 0x00000000, 0x8f420000, 0x30420020, 0x1040fffd, 0x00000000,
+       0x8f430400, 0x24c64660, 0xacc30010, 0x8f420404, 0x3c030020, 0xacc20014,
+       0xaf430030, 0x94c40018, 0x94c3001c, 0x94c2001a, 0x94c5001e, 0x00832021,
+       0x24420001, 0xa4c2001a, 0x3042ffff, 0x14450002, 0xa4c40018, 0xa4c0001a,
+       0x03e00008, 0x00000000, 0x8f820010, 0x3c030006, 0x00021140, 0x00431025,
+       0xaf420030, 0x00000000, 0x00000000, 0x00000000, 0x27430400, 0x8f420000,
+       0x30420010, 0x1040fffd, 0x00000000, 0xaf800010, 0xaf830018, 0x03e00008,
+       0x00000000, 0x27bdffe8, 0xafb00010, 0x3c100800, 0x26104660, 0x3c05000a,
+       0x02002021, 0x03452821, 0xafbf0014, 0x0e001128, 0x2406000a, 0x96020002,
+       0x9603001e, 0x3042000f, 0x24420003, 0x00431804, 0x24027fff, 0x0043102b,
+       0xaf830014, 0x10400004, 0x00000000, 0x0000000d, 0x00000000, 0x24000043,
+       0x0e0010d2, 0x00000000, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018,
+       0x10c00007, 0x00000000, 0x8ca20000, 0x24c6ffff, 0x24a50004, 0xac820000,
+       0x14c0fffb, 0x24840004, 0x03e00008, 0x00000000, 0x0a001137, 0x00a01021,
+       0xac860000, 0x24840004, 0x00a01021, 0x1440fffc, 0x24a5ffff, 0x03e00008,
+       0x00000000, 0x3c036000, 0x8c642b7c, 0x3c036010, 0x8c6553fc, 0x00041582,
+       0x00042302, 0x308403ff, 0x00052d82, 0x00441026, 0x0002102b, 0x0005282b,
+       0x00451025, 0x1440000d, 0x3c020050, 0x34420004, 0xaf400038, 0xaf40003c,
+       0xaf420030, 0x00000000, 0x00000000, 0x8f420000, 0x30420020, 0x1040fffd,
+       0x3c020020, 0xaf420030, 0x0000000d, 0x03e00008, 0x00000000, 0x3c020050,
+       0x34420004, 0xaf440038, 0xaf45003c, 0xaf420030, 0x00000000, 0x00000000,
+       0x8f420000, 0x30420020, 0x1040fffd, 0x3c020020, 0xaf420030, 0x03e00008,
+       0x00000000, 0x00000000 };
+
+static u32 bnx2_COM_b06FwData[(0x0/4) + 1] = { 0x00000000 };
+static u32 bnx2_COM_b06FwRodata[(0x18/4) + 1] = {
+       0x08002318, 0x08002348, 0x08002378, 0x080023a8, 0x080023d8, 0x00000000,
+       0x00000000 };
+
+static u32 bnx2_COM_b06FwBss[(0x88/4) + 1] = { 0x00000000 };
+static u32 bnx2_COM_b06FwSbss[(0x1c/4) + 1] = { 0x00000000 };
+
+static int bnx2_RXP_b06FwReleaseMajor = 0x0;
+static int bnx2_RXP_b06FwReleaseMinor = 0x0;
+static int bnx2_RXP_b06FwReleaseFix = 0x0;
+static u32 bnx2_RXP_b06FwStartAddr = 0x08000060;
+static u32 bnx2_RXP_b06FwTextAddr = 0x08000000;
+static int bnx2_RXP_b06FwTextLen = 0x20b8;
+static u32 bnx2_RXP_b06FwDataAddr = 0x080020e0;
+static int bnx2_RXP_b06FwDataLen = 0x0;
+static u32 bnx2_RXP_b06FwRodataAddr = 0x00000000;
+static int bnx2_RXP_b06FwRodataLen = 0x0;
+static u32 bnx2_RXP_b06FwBssAddr = 0x08002100;
+static int bnx2_RXP_b06FwBssLen = 0x239c;
+static u32 bnx2_RXP_b06FwSbssAddr = 0x080020e0;
+static int bnx2_RXP_b06FwSbssLen = 0x14;
+
+static u32 bnx2_RXP_b06FwText[(0x20b8/4) + 1] = {
+       0x0a000018, 0x00000000, 0x00000000, 0x0000000d, 0x72787020, 0x302e362e,
+       0x39000000, 0x00060903, 0x00000000, 0x0000000d, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x10000003, 0x00000000, 0x0000000d, 0x0000000d, 0x3c020800,
+       0x244220e0, 0x3c030800, 0x2463449c, 0xac400000, 0x0043202b, 0x1480fffd,
+       0x24420004, 0x3c1d0800, 0x37bd3ffc, 0x03a0f021, 0x3c100800, 0x26100060,
+       0x3c1c0800, 0x279c20e0, 0x0e000329, 0x00000000, 0x0000000d, 0x8f870008,
+       0x2ce20080, 0x10400018, 0x3c030800, 0x24633490, 0x8f460100, 0x00072140,
+       0x00831021, 0xac460000, 0x8f450104, 0x00641021, 0xac450004, 0x8f460108,
+       0xac460008, 0x8f45010c, 0xac45000c, 0x8f460114, 0xac460010, 0x8f450118,
+       0xac450014, 0x8f460124, 0xac460018, 0x8f450128, 0x00641821, 0x24e20001,
+       0xaf820008, 0xac65001c, 0x03e00008, 0x00000000, 0x00804021, 0x8f830000,
+       0x24070001, 0x3c020001, 0x00621024, 0x10400037, 0x00603021, 0x9742010e,
+       0x3c038000, 0x3045ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003,
+       0xa342018b, 0x8f840004, 0x24020080, 0x24030002, 0xaf420180, 0xa743018c,
+       0x10800005, 0xa745018e, 0x9743011c, 0x9742011e, 0x0a000069, 0x00021400,
+       0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c,
+       0x24020003, 0x30838000, 0x1060000d, 0xa7420188, 0x93420116, 0x304200fc,
+       0x005a1021, 0x24424004, 0x8c430000, 0x3063ffff, 0x14600005, 0x00000000,
+       0x3c02ffff, 0x34427fff, 0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c,
+       0x8f440104, 0x3042bfff, 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6,
+       0xaf4301ac, 0x3c021000, 0xaf4201b8, 0x03e00008, 0x00001021, 0x30c21000,
+       0x1040000f, 0x00000000, 0x9742010c, 0x3042fc00, 0x5440000b, 0x24070005,
+       0x3c021000, 0x00c21024, 0x10400007, 0x3c030dff, 0x3463ffff, 0x3c020e00,
+       0x00c21024, 0x0062182b, 0x54600001, 0x24070005, 0x8f82000c, 0x30434000,
+       0x10600016, 0x00404821, 0x3c020f00, 0x00c21024, 0x14400012, 0x00000000,
+       0x93420116, 0x34424000, 0x03421821, 0x94650002, 0x2ca21389, 0x1040000b,
+       0x3c020800, 0x24422100, 0x00051942, 0x00031880, 0x00621821, 0x30a5001f,
+       0x8c640000, 0x24020001, 0x00a21004, 0x00822024, 0x01044025, 0x11000037,
+       0x3c021000, 0x9742010e, 0x34e60002, 0x3c038000, 0x24420004, 0x3045ffff,
+       0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, 0xa342018b, 0x8f840004,
+       0x24020180, 0x24030002, 0xaf420180, 0xa743018c, 0x10800005, 0xa745018e,
+       0x9743011c, 0x9742011e, 0x0a0000cd, 0x00021400, 0x9743011e, 0x9742011c,
+       0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c, 0x30828000, 0x1040000c,
+       0xa7460188, 0x93420116, 0x304200fc, 0x005a1021, 0x24424004, 0x8c430000,
+       0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, 0x00821024, 0xaf82000c,
+       0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff, 0x00031c00, 0x3084ffff,
+       0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, 0xaf4201b8, 0x03e00008,
+       0x00001021, 0x00c21024, 0x104000ba, 0x3c020800, 0x8c430030, 0x1060003e,
+       0x31224000, 0x1040003c, 0x3c030f00, 0x00c31824, 0x3c020100, 0x0043102b,
+       0x14400038, 0x3c030800, 0x9742010e, 0x34e60002, 0x3c038000, 0x24420004,
+       0x3045ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, 0xa342018b,
+       0x8f840004, 0x24020080, 0x24030002, 0xaf420180, 0xa743018c, 0x10800005,
+       0xa745018e, 0x9743011c, 0x9742011e, 0x0a000110, 0x00021400, 0x9743011e,
+       0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c, 0x30828000,
+       0x1040000c, 0xa7460188, 0x93420116, 0x304200fc, 0x005a1021, 0x24424004,
+       0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, 0x00821024,
+       0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff, 0x00031c00,
+       0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, 0xaf4201b8,
+       0x03e00008, 0x00001021, 0x3c030800, 0x8c620024, 0x30420008, 0x1040003d,
+       0x34e80002, 0x3c020f00, 0x00c21024, 0x5440003a, 0x3107ffff, 0x9742010c,
+       0x30420200, 0x50400036, 0x3107ffff, 0x9742010e, 0x30e6fffb, 0x3c038000,
+       0x24420004, 0x3045ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003,
+       0xa342018b, 0x8f840004, 0x24020180, 0x24030002, 0xaf420180, 0xa743018c,
+       0x10800005, 0xa745018e, 0x9743011c, 0x9742011e, 0x0a000153, 0x00021400,
+       0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c,
+       0x30828000, 0x1040000c, 0xa7460188, 0x93420116, 0x304200fc, 0x005a1021,
+       0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff,
+       0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff,
+       0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000,
+       0xaf4201b8, 0x3107ffff, 0x8f820000, 0x3c068000, 0x9743010e, 0x00021442,
+       0x30440780, 0x24630004, 0x3065ffff, 0x8f4201b8, 0x00461024, 0x1440fffd,
+       0x24020003, 0xa342018b, 0x8f830004, 0x24020002, 0xaf440180, 0xa742018c,
+       0x10600005, 0xa745018e, 0x9743011c, 0x9742011e, 0x0a000189, 0x00021400,
+       0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c,
+       0x30828000, 0x1040000c, 0xa7470188, 0x93420116, 0x304200fc, 0x005a1021,
+       0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff,
+       0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff,
+       0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000,
+       0xaf4201b8, 0x03e00008, 0x00001021, 0x8f424000, 0x30420100, 0x104000ef,
+       0x3c020800, 0x8c440024, 0x24030001, 0x14830036, 0x00404021, 0x9742010e,
+       0x34e50002, 0x3c038000, 0x24420004, 0x3044ffff, 0x8f4201b8, 0x00431024,
+       0x1440fffd, 0x24020003, 0xa342018b, 0x8f830004, 0x24020002, 0xaf400180,
+       0xa742018c, 0x10600005, 0xa744018e, 0x9743011c, 0x9742011e, 0x0a0001c6,
+       0x00021400, 0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8,
+       0x8f84000c, 0x30828000, 0x1040000c, 0xa7450188, 0x93420116, 0x304200fc,
+       0x005a1021, 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff,
+       0x34427fff, 0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104,
+       0x3042bfff, 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac,
+       0x3c021000, 0xaf4201b8, 0x03e00008, 0x00001021, 0x30820001, 0x10400035,
+       0x30e90004, 0x9742010e, 0x30e6fffb, 0x3c038000, 0x24420004, 0x3044ffff,
+       0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, 0xa342018b, 0x8f830004,
+       0x24020002, 0xaf400180, 0xa742018c, 0x10600005, 0xa744018e, 0x9743011c,
+       0x9742011e, 0x0a0001fe, 0x00021400, 0x9743011e, 0x9742011c, 0x00021400,
+       0x00621825, 0xaf4301a8, 0x8f84000c, 0x30828000, 0x1040000c, 0xa7470188,
+       0x93420116, 0x304200fc, 0x005a1021, 0x24424004, 0x8c430000, 0x3063ffff,
+       0x14600004, 0x3c02ffff, 0x34427fff, 0x00821024, 0xaf82000c, 0x9782000e,
+       0x9743010c, 0x8f440104, 0x3042bfff, 0x00031c00, 0x3084ffff, 0x00641825,
+       0xa74201a6, 0xaf4301ac, 0x3c021000, 0xaf4201b8, 0x30c7ffff, 0x8d020024,
+       0x30420004, 0x10400037, 0x8d020024, 0x9742010e, 0x30e6fffb, 0x3c038000,
+       0x24420004, 0x3045ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003,
+       0xa342018b, 0x8f840004, 0x24020100, 0x24030002, 0xaf420180, 0xa743018c,
+       0x10800005, 0xa745018e, 0x9743011c, 0x9742011e, 0x0a000237, 0x00021400,
+       0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c,
+       0x30828000, 0x1040000c, 0xa7470188, 0x93420116, 0x304200fc, 0x005a1021,
+       0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff,
+       0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff,
+       0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000,
+       0xaf4201b8, 0x30c7ffff, 0x8d020024, 0x30420008, 0x10400034, 0x00000000,
+       0x9742010e, 0x3c038000, 0x24420004, 0x3045ffff, 0x8f4201b8, 0x00431024,
+       0x1440fffd, 0x24020003, 0xa342018b, 0x8f840004, 0x24020180, 0x24030002,
+       0xaf420180, 0xa743018c, 0x10800005, 0xa745018e, 0x9743011c, 0x9742011e,
+       0x0a00026f, 0x00021400, 0x9743011e, 0x9742011c, 0x00021400, 0x00621825,
+       0xaf4301a8, 0x8f84000c, 0x30828000, 0x1040000c, 0xa7470188, 0x93420116,
+       0x304200fc, 0x005a1021, 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004,
+       0x3c02ffff, 0x34427fff, 0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c,
+       0x8f440104, 0x3042bfff, 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6,
+       0xaf4301ac, 0x3c021000, 0xaf4201b8, 0x15200046, 0x00001021, 0x3c038000,
+       0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020002, 0x24032000, 0xa342018b,
+       0xa7430188, 0x3c021000, 0xaf4201b8, 0x03e00008, 0x00001021, 0x3c030800,
+       0x8c620024, 0x30420001, 0x10400035, 0x00001021, 0x9742010e, 0x34e50002,
+       0x3c038000, 0x24420004, 0x3044ffff, 0x8f4201b8, 0x00431024, 0x1440fffd,
+       0x24020003, 0xa342018b, 0x8f830004, 0x24020002, 0xaf400180, 0xa742018c,
+       0x10600005, 0xa744018e, 0x9743011c, 0x9742011e, 0x0a0002b5, 0x00021400,
+       0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c,
+       0x30828000, 0x1040000c, 0xa7450188, 0x93420116, 0x304200fc, 0x005a1021,
+       0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff,
+       0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff,
+       0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000,
+       0xaf4201b8, 0x00001021, 0x03e00008, 0x00000000, 0x27bdffe0, 0xafbf0018,
+       0xafb10014, 0xafb00010, 0x8f420140, 0xaf420020, 0x8f430148, 0x3c027000,
+       0x00621824, 0x3c024000, 0x1062000c, 0x0043102b, 0x14400006, 0x3c025000,
+       0x3c023000, 0x1062000b, 0x3c024000, 0x0a00031f, 0x00000000, 0x10620034,
+       0x3c024000, 0x0a00031f, 0x00000000, 0x0e00067c, 0x00000000, 0x0a00031f,
+       0x3c024000, 0x8f420148, 0x24030002, 0x3044ffff, 0x00021402, 0x305000ff,
+       0x1203000c, 0x27510180, 0x2a020003, 0x10400005, 0x24020003, 0x0600001d,
+       0x36053000, 0x0a00030a, 0x3c038000, 0x12020007, 0x00000000, 0x0a000317,
+       0x00000000, 0x0e000423, 0x00000000, 0x0a000308, 0x00402021, 0x0e000435,
+       0x00000000, 0x00402021, 0x36053000, 0x3c038000, 0x8f4201b8, 0x00431024,
+       0x1440fffd, 0x24020002, 0xa6250008, 0xa222000b, 0xa6240010, 0x8f420144,
+       0x3c031000, 0xae220024, 0xaf4301b8, 0x0a00031f, 0x3c024000, 0x0000000d,
+       0x00000000, 0x240001c3, 0x0a00031f, 0x3c024000, 0x0e0007f7, 0x00000000,
+       0x3c024000, 0xaf420178, 0x00000000, 0x8fbf0018, 0x8fb10014, 0x8fb00010,
+       0x03e00008, 0x27bd0020, 0x24020800, 0x03e00008, 0xaf4201b8, 0x27bdffe8,
+       0x3c04600c, 0xafbf0014, 0xafb00010, 0x8c825000, 0x3c1a8000, 0x2403ff7f,
+       0x3c106000, 0x00431024, 0x3442380c, 0x24030003, 0xac825000, 0x3c040008,
+       0xaf430008, 0x8e020808, 0x3c030800, 0xac600020, 0x3042fff0, 0x2c420001,
+       0xaf820004, 0x0e000819, 0x0344d825, 0x0e000781, 0x00000000, 0x3c020400,
+       0x3442000c, 0x3c03ffff, 0x34630806, 0xae021948, 0xae03194c, 0x8e021980,
+       0x34420200, 0xae021980, 0x8f500000, 0x32020003, 0x1040fffd, 0x32020001,
+       0x10400004, 0x32020002, 0x0e0003bd, 0x00000000, 0x32020002, 0x1040fff6,
+       0x00000000, 0x0e0002d4, 0x00000000, 0x0a00034a, 0x00000000, 0x27bdffe8,
+       0x3c04600c, 0xafbf0014, 0xafb00010, 0x8c825000, 0x3c1a8000, 0x2403ff7f,
+       0x3c106000, 0x00431024, 0x3442380c, 0x24030003, 0xac825000, 0x3c040008,
+       0xaf430008, 0x8e020808, 0x3c030800, 0xac600020, 0x3042fff0, 0x2c420001,
+       0xaf820004, 0x0e000819, 0x0344d825, 0x0e000781, 0x00000000, 0x3c020400,
+       0x3442000c, 0x3c03ffff, 0x34630806, 0xae021948, 0xae03194c, 0x8e021980,
+       0x8fbf0014, 0x34420200, 0xae021980, 0x8fb00010, 0x03e00008, 0x27bd0018,
+       0x30a5ffff, 0x30c6ffff, 0x30e7ffff, 0x3c038000, 0x8f4201b8, 0x00431024,
+       0x1440fffd, 0x24020003, 0xa342018b, 0x8f830004, 0xaf440180, 0xa745018c,
+       0x10600005, 0xa746018e, 0x9743011c, 0x9742011e, 0x0a000393, 0x00021400,
+       0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c,
+       0x30828000, 0x1040000c, 0xa7470188, 0x93420116, 0x304200fc, 0x005a1021,
+       0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff,
+       0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff,
+       0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000,
+       0xaf4201b8, 0x03e00008, 0x00000000, 0x3c038000, 0x8f4201b8, 0x00431024,
+       0x1440fffd, 0x24020002, 0x24032000, 0xa342018b, 0xa7430188, 0x3c021000,
+       0xaf4201b8, 0x03e00008, 0x00000000, 0x27bdffe8, 0xafbf0010, 0x8f460128,
+       0xaf460020, 0x8f420104, 0x8f450100, 0x24030800, 0x3c040010, 0xaf820000,
+       0x00441024, 0xaf85000c, 0xaf4301b8, 0x14400005, 0x3c02001f, 0x3c030800,
+       0x8c620020, 0x0a0003d5, 0x00002021, 0x3442ff00, 0x14c20009, 0x2402bfff,
+       0x3c030800, 0x8c620020, 0x24040001, 0x24420001, 0x0e00004c, 0xac620020,
+       0x0a0003e4, 0x00000000, 0x00a21024, 0x14400006, 0x00000000, 0xaf400048,
+       0x0e000448, 0xaf400040, 0x0a0003e4, 0x00000000, 0x0e000783, 0x00000000,
+       0x10400005, 0x3c024000, 0x8f430124, 0x3c026020, 0xac430014, 0x3c024000,
+       0xaf420138, 0x00000000, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x27bdffe0,
+       0xafbf0018, 0xafb10014, 0xafb00010, 0x8f420148, 0x24030002, 0x3044ffff,
+       0x00021402, 0x305000ff, 0x1203000c, 0x27510180, 0x2a020003, 0x10400005,
+       0x24020003, 0x0600001d, 0x36053000, 0x0a00040e, 0x3c038000, 0x12020007,
+       0x00000000, 0x0a00041b, 0x00000000, 0x0e000423, 0x00000000, 0x0a00040c,
+       0x00402021, 0x0e000435, 0x00000000, 0x00402021, 0x36053000, 0x3c038000,
+       0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020002, 0xa6250008, 0xa222000b,
+       0xa6240010, 0x8f420144, 0x3c031000, 0xae220024, 0xaf4301b8, 0x0a00041f,
+       0x8fbf0018, 0x0000000d, 0x00000000, 0x240001c3, 0x8fbf0018, 0x8fb10014,
+       0x8fb00010, 0x03e00008, 0x27bd0020, 0x3084ffff, 0x2c821389, 0x1040000d,
+       0x00001021, 0x3c030800, 0x24632100, 0x00042942, 0x00052880, 0x00a32821,
+       0x3086001f, 0x8ca40000, 0x24030001, 0x00c31804, 0x00832025, 0x03e00008,
+       0xaca40000, 0x03e00008, 0x24020091, 0x3084ffff, 0x2c821389, 0x1040000e,
+       0x00001021, 0x3c030800, 0x24632100, 0x00042942, 0x00052880, 0x00a32821,
+       0x3086001f, 0x24030001, 0x8ca40000, 0x00c31804, 0x00031827, 0x00832024,
+       0x03e00008, 0xaca40000, 0x03e00008, 0x24020091, 0x27bdffb0, 0x3c026000,
+       0xafbf0048, 0x8c434448, 0xaf630140, 0x93620005, 0x30420001, 0x14400005,
+       0x00000000, 0x0e0007ed, 0x00000000, 0x0a00067a, 0x8fbf0048, 0x93420116,
+       0x93430112, 0x8f430104, 0x3c040020, 0x34424000, 0x00641824, 0x1060000d,
+       0x03426021, 0x8f430128, 0x27420180, 0xac430000, 0x8f650040, 0x24040008,
+       0x240340c1, 0xa4430008, 0x24030002, 0xa043000b, 0x3c031000, 0x0a000563,
+       0xa044000a, 0x8f420104, 0x3c030040, 0x00431024, 0x10400007, 0x00000000,
+       0x8f430128, 0x27420180, 0xac430000, 0x8f650040, 0x0a00055c, 0x24040010,
+       0xaf400048, 0xaf400054, 0xaf400040, 0x8f630048, 0x8f620040, 0x00624823,
+       0x05210004, 0x00000000, 0x0000000d, 0x00000000, 0x24000132, 0x9742011a,
+       0x3046ffff, 0x10c00004, 0x8d880004, 0x01061021, 0x0a000487, 0x2445ffff,
+       0x01002821, 0x918a000d, 0xa7a00020, 0xafa00028, 0x9364003f, 0x3c026000,
+       0x8c434448, 0x308700ff, 0x31420004, 0x10400033, 0xaf630144, 0x24090012,
+       0x14e90006, 0x3c040800, 0x8c830028, 0x24020001, 0x24630001, 0x0a00054e,
+       0xac830028, 0x8f620044, 0x15020012, 0x97a20020, 0x27a60010, 0x27450180,
+       0x3442001a, 0xa7a20020, 0x8f630040, 0x3c048000, 0x24020020, 0xa3a70022,
+       0xa3a90023, 0xa3a2001a, 0xafa30028, 0x8f4201b8, 0x00441024, 0x1440fffd,
+       0x00000000, 0x0a000533, 0x00000000, 0x8f620044, 0x01021023, 0x0440009e,
+       0x24020001, 0x8f620048, 0x01021023, 0x0441009a, 0x24020001, 0x97a20020,
+       0x27a60010, 0x34420001, 0xa7a20020, 0x8f630040, 0x27450180, 0x3c048000,
+       0xafa30028, 0x8f4201b8, 0x00441024, 0x1440fffd, 0x00000000, 0x0a000533,
+       0x00000000, 0x3c026000, 0x8c424448, 0xaf620148, 0x8f630040, 0x00685823,
+       0x19600013, 0x00cb102a, 0x54400007, 0x314a00fe, 0x5566000c, 0x010b4021,
+       0x31420001, 0x54400009, 0x010b4021, 0x314a00fe, 0x24020001, 0xa7a20020,
+       0x8f630040, 0x00c05821, 0x00003021, 0x0a0004dd, 0xafa30028, 0x00cb1023,
+       0x0a0004dd, 0x3046ffff, 0x00005821, 0x8f620048, 0x2442ffff, 0x00a21823,
+       0x18600019, 0x0066102a, 0x14400013, 0x24020001, 0xa7a20020, 0x8f630040,
+       0xafa30028, 0x8f620040, 0x55020005, 0x27a60010, 0x55200003, 0x27a60010,
+       0x0a0004f6, 0x00c01821, 0x27450180, 0x3c038000, 0x8f4201b8, 0x00431024,
+       0x1440fffd, 0x00000000, 0x0a000533, 0x00000000, 0x8f650048, 0x00c31023,
+       0x3046ffff, 0x314a00f6, 0x3c046000, 0x8c824448, 0x31430002, 0x1060001e,
+       0xaf62014c, 0x8f620044, 0x1502000e, 0x97a20020, 0x27a60010, 0x34420200,
+       0xa7a20020, 0x8f630040, 0x27450180, 0x3c048000, 0xafa30028, 0x8f4201b8,
+       0x00441024, 0x1440fffd, 0x00000000, 0x0a000533, 0x00000000, 0x27a60010,
+       0x34420001, 0xa7a20020, 0x8f630040, 0x27450180, 0x3c048000, 0xafa30028,
+       0x8f4201b8, 0x00441024, 0x1440fffd, 0x00000000, 0x0a000533, 0x00000000,
+       0x3c026000, 0x8c424448, 0x31430010, 0xaf620150, 0x54600003, 0x8d890008,
+       0x0a00054e, 0x24020001, 0x8f630054, 0x2522ffff, 0x00431023, 0x1840002a,
+       0x24020001, 0x27a60010, 0xa7a20020, 0x8f630040, 0x27450180, 0x3c048000,
+       0xafa30028, 0x8f4201b8, 0x00441024, 0x1440fffd, 0x00000000, 0x8f420128,
+       0xaca20000, 0x8cc30018, 0x240240c1, 0xa4a20008, 0xaca30018, 0x90c4000a,
+       0x24020002, 0xa0a2000b, 0xa0a4000a, 0x94c20010, 0xa4a20010, 0x90c30012,
+       0xa0a30012, 0x90c20013, 0xa0a20013, 0x8cc30014, 0xaca30014, 0x8cc20024,
+       0xaca20024, 0x8cc30028, 0xaca30028, 0x8cc4002c, 0x24020001, 0x3c031000,
+       0xaca4002c, 0xaf4301b8, 0xaf400044, 0xaf400050, 0x0a00067a, 0x8fbf0048,
+       0x3c026000, 0x8c424448, 0x31430020, 0x10600019, 0xaf620154, 0x8f430128,
+       0x27420180, 0xac430000, 0x8f650040, 0x24040004, 0x240340c1, 0xa4430008,
+       0x24030002, 0xa044000a, 0x24040008, 0xa043000b, 0x3c031000, 0xa4440010,
+       0xa0400012, 0xa0400013, 0xac400014, 0xac400024, 0xac400028, 0xac40002c,
+       0xac450018, 0x0e0007ed, 0xaf4301b8, 0x0a00067a, 0x8fbf0048, 0x8f430104,
+       0x8c824448, 0x38e3000a, 0x2c630001, 0xaf620158, 0x38e2000c, 0x2c420001,
+       0x00621825, 0x14600003, 0x2402000e, 0x14e2002a, 0x00000000, 0x50c00008,
+       0x9584000e, 0x10c00004, 0xa7a60040, 0x01061021, 0x0a000583, 0x2445ffff,
+       0x01002821, 0x9584000e, 0x93630035, 0x8f62004c, 0x00642004, 0x00892021,
+       0x00821023, 0x1840001f, 0x3c026000, 0x8f620018, 0x01021023, 0x1c40000f,
+       0x97a20020, 0x8f620018, 0x15020018, 0x3c026000, 0x8f62001c, 0x01221023,
+       0x1c400008, 0x97a20020, 0x8f62001c, 0x15220011, 0x3c026000, 0x8f620058,
+       0x00821023, 0x1840000c, 0x97a20020, 0xafa50028, 0xafa80034, 0xafa90038,
+       0xafa4003c, 0x34420020, 0x0a0005a8, 0xa7a20020, 0x8f680040, 0x00003021,
+       0x8f640058, 0x01002821, 0x3c026000, 0x8c434448, 0xaf63015c, 0x8f62004c,
+       0x01221023, 0x18400009, 0x00000000, 0x8f620054, 0x01221023, 0x1c400005,
+       0x97a20020, 0xafa50028, 0xafa90024, 0x0a0005c3, 0x34420040, 0x9742011a,
+       0x1440000c, 0x24020014, 0x8f620058, 0x14820009, 0x24020014, 0x8f63004c,
+       0x8f620054, 0x10620004, 0x97a20020, 0xafa50028, 0x34420080, 0xa7a20020,
+       0x24020014, 0x10e2000a, 0x28e20015, 0x10400005, 0x2402000c, 0x10e20006,
+       0x3c026000, 0x0a000600, 0x00000000, 0x24020016, 0x14e20031, 0x3c026000,
+       0x8f620054, 0x24420001, 0x1522002d, 0x3c026000, 0x24020014, 0x10e2001e,
+       0x28e20015, 0x10400005, 0x2402000c, 0x10e20008, 0x3c026000, 0x0a000600,
+       0x00000000, 0x24020016, 0x10e2000c, 0x97a20020, 0x0a000600, 0x3c026000,
+       0x97a30020, 0x2402000e, 0xafa50028, 0xa3a70022, 0xa3a20023, 0xafa90024,
+       0x34630054, 0x0a0005ff, 0xa7a30020, 0x24030010, 0x24040002, 0xafa50028,
+       0xa3a70022, 0xa3a30023, 0xa3a4001a, 0xafa90024, 0x0a0005fe, 0x3442005d,
+       0x97a20020, 0x24030012, 0x24040002, 0xafa50028, 0xa3a70022, 0xa3a30023,
+       0xa3a4001a, 0xafa90024, 0x3042fffe, 0x3442005c, 0xa7a20020, 0x3c026000,
+       0x8c434448, 0x31420001, 0xaf630160, 0x1040002c, 0x2402000c, 0x10e20014,
+       0x28e2000d, 0x10400005, 0x2402000a, 0x10e20008, 0x97a20020, 0x0a000631,
+       0x3c026000, 0x2402000e, 0x10e20018, 0x3c026000, 0x0a000631, 0x00000000,
+       0x24030008, 0x24040002, 0xafa50028, 0xa3a70022, 0xa3a30023, 0xa3a4001a,
+       0x0a00062f, 0x34420013, 0x97a30020, 0x30620004, 0x1440000b, 0x97a20020,
+       0x3462001b, 0xa7a20020, 0x24020016, 0x24030002, 0xafa50028, 0xa3a70022,
+       0xa3a20023, 0x0a000630, 0xa3a3001a, 0x97a20020, 0x24030010, 0x24040002,
+       0xafa50028, 0xa3a70022, 0xa3a30023, 0xa3a4001a, 0x3442001b, 0xa7a20020,
+       0x3c026000, 0x8c434448, 0x31420009, 0x0002102b, 0x00021023, 0x30420007,
+       0x34440003, 0xaf630164, 0x10c00016, 0x24030800, 0x8f820010, 0x27450180,
+       0x24420001, 0xaf820010, 0x24020004, 0xaf4301b8, 0xa4a40008, 0xa0a2000b,
+       0x93440120, 0x3c031000, 0xa4a6000e, 0xaca90024, 0xaca80028, 0x008b2021,
+       0xa4a4000c, 0xaf4301b8, 0x97a20020, 0x00003021, 0x3042ffbf, 0x0a000650,
+       0xa7a20020, 0x24060001, 0x3c026000, 0x8c434448, 0xaf630168, 0x97a20020,
+       0x10400020, 0x27450180, 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd,
+       0x00000000, 0x8f420128, 0xaca20000, 0x8fa30028, 0x240240c1, 0xa4a20008,
+       0xaca30018, 0x93a4001a, 0x24020002, 0xa0a2000b, 0xa0a4000a, 0x97a20020,
+       0xa4a20010, 0x93a30022, 0xa0a30012, 0x93a20023, 0xa0a20013, 0x8fa30024,
+       0xaca30014, 0x8fa20034, 0xaca20024, 0x8fa30038, 0xaca30028, 0x8fa2003c,
+       0x3c031000, 0xaca2002c, 0xaf4301b8, 0x3c026000, 0x8c434448, 0x00c01021,
+       0xaf63016c, 0x8fbf0048, 0x03e00008, 0x27bd0050, 0x8f460140, 0x8f470148,
+       0x3c028000, 0x00e24024, 0x00072c02, 0x30a300ff, 0x2402000b, 0x1062008f,
+       0x27440180, 0x2862000c, 0x10400011, 0x24020006, 0x1062005a, 0x28620007,
+       0x10400007, 0x24020008, 0x10600024, 0x24020001, 0x10620037, 0x00000000,
+       0x0a00077e, 0x00000000, 0x106200a9, 0x24020009, 0x106200bb, 0x00071c02,
+       0x0a00077e, 0x00000000, 0x2402001b, 0x106200c7, 0x2862001c, 0x10400007,
+       0x2402000e, 0x106200b1, 0x24020019, 0x106200c2, 0x00071c02, 0x0a00077e,
+       0x00000000, 0x24020080, 0x10620060, 0x28620081, 0x10400005, 0x2402001c,
+       0x10620094, 0x00071c02, 0x0a00077e, 0x00000000, 0x240200c2, 0x106200c5,
+       0x00a01821, 0x0a00077e, 0x00000000, 0x00a01821, 0x3c058000, 0x8f4201b8,
+       0x00451024, 0x1440fffd, 0x24020001, 0xa4830008, 0x24030002, 0xac860000,
+       0xac800004, 0xa082000a, 0xa083000b, 0xa4870010, 0x8f430144, 0x3c021000,
+       0xac800028, 0xac830024, 0x3c036000, 0xaf4201b8, 0x03e00008, 0xac600808,
+       0x11000009, 0x00a01821, 0x3c020800, 0x24030002, 0xa0434490, 0x24424490,
+       0xac460008, 0x8f430144, 0x03e00008, 0xac430004, 0x3c058000, 0x8f4201b8,
+       0x00451024, 0x1440fffd, 0x24020002, 0xac800000, 0xac860004, 0xa4830008,
+       0xa082000a, 0xa082000b, 0xa4870010, 0xac800024, 0x8f420144, 0x3c031000,
+       0xac820028, 0x3c026000, 0xaf4301b8, 0x03e00008, 0xac400808, 0x00a01821,
+       0x3c080800, 0x3c058000, 0x8f4201b8, 0x00451024, 0x1440fffd, 0x00000000,
+       0xac860000, 0x91024490, 0x00002821, 0x10400002, 0x25064490, 0x8cc50008,
+       0xac850004, 0xa4830008, 0x91034490, 0x24020002, 0xa082000b, 0xa4870010,
+       0x34630001, 0xa083000a, 0x8f420144, 0xac820024, 0x91034490, 0x10600002,
+       0x00001021, 0x8cc20004, 0xac820028, 0x3c021000, 0xaf4201b8, 0x3c026000,
+       0xa1004490, 0x03e00008, 0xac400808, 0x00a01821, 0x3c058000, 0x8f4201b8,
+       0x00451024, 0x1440fffd, 0x24020002, 0xa082000b, 0xa4830008, 0xa4870010,
+       0x8f420144, 0x3c031000, 0xa4820012, 0x03e00008, 0xaf4301b8, 0x30e2ffff,
+       0x14400028, 0x00071c02, 0x93620005, 0x30420004, 0x14400020, 0x3c029000,
+       0x34420001, 0x00c21025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024,
+       0x1440fffd, 0x00000000, 0x93620005, 0x3c038000, 0x34630001, 0x00c31825,
+       0x34420004, 0xa3620005, 0xaf430020, 0x93620005, 0x30420004, 0x14400003,
+       0x3c038000, 0x0000000d, 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd,
+       0x24020005, 0x3c031000, 0xac860000, 0xa082000b, 0xaf4301b8, 0x0a00073d,
+       0x00071c02, 0x0000000d, 0x03e00008, 0x00000000, 0x00071c02, 0x3c058000,
+       0x8f4201b8, 0x00451024, 0x1440fffd, 0x24020001, 0xa4830008, 0x24030002,
+       0xac860000, 0xac800004, 0xa082000a, 0xa083000b, 0xa4870010, 0x8f430144,
+       0x3c021000, 0xac800028, 0xac830024, 0x03e00008, 0xaf4201b8, 0x00071c02,
+       0x3c058000, 0x8f4201b8, 0x00451024, 0x1440fffd, 0x24020002, 0xac800000,
+       0xac860004, 0xa4830008, 0xa082000a, 0xa082000b, 0xa4870010, 0xac800024,
+       0x8f420144, 0x3c031000, 0xac820028, 0x03e00008, 0xaf4301b8, 0x00071c02,
+       0x3c058000, 0x8f4201b8, 0x00451024, 0x1440fffd, 0x24020001, 0xa4830008,
+       0x24030002, 0xa082000a, 0x3c021000, 0xac860000, 0xac800004, 0xa083000b,
+       0xa4870010, 0xac800024, 0xac800028, 0x03e00008, 0xaf4201b8, 0x3c058000,
+       0x8f4201b8, 0x00451024, 0x1440fffd, 0x24020002, 0xac860000, 0xac800004,
+       0xa4830008, 0xa080000a, 0x0a000748, 0xa082000b, 0x0000000d, 0x03e00008,
+       0x00000000, 0x03e00008, 0x00000000, 0x8f420100, 0x3042003e, 0x14400011,
+       0x24020001, 0xaf400048, 0x8f420100, 0x304207c0, 0x10400005, 0x00000000,
+       0xaf40004c, 0xaf400050, 0x03e00008, 0x24020001, 0xaf400054, 0xaf400040,
+       0x8f420100, 0x30423800, 0x54400001, 0xaf400044, 0x24020001, 0x03e00008,
+       0x00000000, 0x3c029000, 0x34420001, 0x00822025, 0xaf440020, 0x3c038000,
+       0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x03e00008, 0x00000000,
+       0x3c028000, 0x34420001, 0x00822025, 0x03e00008, 0xaf440020, 0x8f430128,
+       0x27420180, 0xac430000, 0x8f650040, 0x240340c1, 0xa4430008, 0x24030002,
+       0xa044000a, 0x24040008, 0xa043000b, 0x3c031000, 0xa4440010, 0xa0400012,
+       0xa0400013, 0xac400014, 0xac400024, 0xac400028, 0xac40002c, 0xac450018,
+       0x03e00008, 0xaf4301b8, 0x24020001, 0xacc40000, 0x03e00008, 0xa4e50000,
+       0x03e00008, 0x24020001, 0x24020001, 0xaf400044, 0x03e00008, 0xaf400050,
+       0x00803021, 0x27450180, 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd,
+       0x00000000, 0x8f420128, 0xaca20000, 0x8cc30018, 0x240240c1, 0xa4a20008,
+       0xaca30018, 0x90c4000a, 0x24020002, 0xa0a2000b, 0xa0a4000a, 0x94c20010,
+       0xa4a20010, 0x90c30012, 0xa0a30012, 0x90c20013, 0xa0a20013, 0x8cc30014,
+       0xaca30014, 0x8cc20024, 0xaca20024, 0x8cc30028, 0xaca30028, 0x8cc2002c,
+       0x3c031000, 0xaca2002c, 0x24020001, 0xaf4301b8, 0xaf400044, 0x03e00008,
+       0xaf400050, 0x27bdffe8, 0xafbf0010, 0x0e000326, 0x00000000, 0x00002021,
+       0x0e00004c, 0xaf400180, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x8f460148,
+       0x27450180, 0x3c038000, 0x00061402, 0x304700ff, 0x8f4201b8, 0x00431024,
+       0x1440fffd, 0x00000000, 0x8f440140, 0x00061202, 0x304200ff, 0x00061c02,
+       0xaca20004, 0x24020002, 0xa4a30008, 0x30c300ff, 0xa0a2000b, 0xaca30024,
+       0x10e0000a, 0xaca40000, 0x28e20004, 0x14400005, 0x24020001, 0x24020005,
+       0x54e20005, 0xa0a0000a, 0x24020001, 0x0a000816, 0xa0a2000a, 0xa0a0000a,
+       0x3c021000, 0x03e00008, 0xaf4201b8, 0x03e00008, 0x00001021, 0x10c00007,
+       0x00000000, 0x8ca20000, 0x24c6ffff, 0x24a50004, 0xac820000, 0x14c0fffb,
+       0x24840004, 0x03e00008, 0x00000000, 0x0a00082a, 0x00a01021, 0xac860000,
+       0x24840004, 0x00a01021, 0x1440fffc, 0x24a5ffff, 0x03e00008, 0x00000000,
+       0x00000000 }; 
+
+static u32 bnx2_RXP_b06FwData[(0x0/4) + 1] = { 0x00000000 };
+static u32 bnx2_RXP_b06FwRodata[(0x0/4) + 1] = { 0x00000000 };
+static u32 bnx2_RXP_b06FwBss[(0x239c/4) + 1] = { 0x00000000 };
+static u32 bnx2_RXP_b06FwSbss[(0x14/4) + 1] = { 0x00000000 };
+
+static u32 bnx2_rv2p_proc1[] = {
+       0x00000008, 0xac000001, 0x0000000c, 0x2f800001, 0x00000010, 0x213f0004,
+       0x00000010, 0x20bf002c, 0x00000010, 0x203f0143, 0x00000018, 0x8000fffd,
+       0x00000010, 0xb1b8b017, 0x0000000b, 0x2fdf0002, 0x00000000, 0x03d80000,
+       0x00000000, 0x2c380000, 0x00000008, 0x2c800000, 0x00000008, 0x2d000000,
+       0x00000010, 0x91d40000, 0x00000008, 0x2d800108, 0x00000008, 0x02000002,
+       0x00000010, 0x91de0000, 0x0000000f, 0x42e0001c, 0x00000010, 0x91840a08,
+       0x00000008, 0x2c8000b0, 0x00000008, 0x2d000008, 0x00000008, 0x2d800150,
+       0x00000000, 0x00000000, 0x00000010, 0x91de0000, 0x00000010, 0x2c620002,
+       0x00000018, 0x80000012, 0x0000000b, 0x2fdf0002, 0x0000000c, 0x1f800002,
+       0x00000000, 0x2c070000, 0x00000018, 0x8000ffe6, 0x00000008, 0x02000002,
+       0x0000000f, 0x42e0001c, 0x00000010, 0x91840a08, 0x00000008, 0x2c8000b0,
+       0x00000008, 0x2d000008, 0x00000010, 0x91d40000, 0x00000008, 0x2d800108,
+       0x00000000, 0x00000000, 0x00000010, 0x91de0000, 0x00000018, 0x80000004,
+       0x0000000c, 0x1f800002, 0x00000000, 0x00000000, 0x00000018, 0x8000ffd9,
+       0x0000000c, 0x29800002, 0x0000000c, 0x1f800002, 0x00000000, 0x2adf0000,
+       0x00000008, 0x2a000005, 0x00000018, 0x8000ffd4, 0x00000008, 0x02240030,
+       0x00000018, 0x00040000, 0x00000018, 0x80000015, 0x00000018, 0x80000017,
+       0x00000018, 0x8000001b, 0x00000018, 0x8000004c, 0x00000018, 0x8000008c,
+       0x00000018, 0x8000000f, 0x00000018, 0x8000000e, 0x00000018, 0x8000000d,
+       0x00000018, 0x8000000c, 0x00000018, 0x800000c2, 0x00000018, 0x8000000a,
+       0x00000018, 0x80000009, 0x00000018, 0x80000008, 0x00000018, 0x800000fd,
+       0x00000018, 0x80000006, 0x00000018, 0x80000005, 0x00000018, 0x800000ff,
+       0x00000018, 0x80000104, 0x00000018, 0x80000002, 0x00000018, 0x80000098,
+       0x00000018, 0x80000000, 0x0000000c, 0x1f800001, 0x00000000, 0x00000000,
+       0x00000018, 0x8000ffba, 0x00000010, 0x91d40000, 0x0000000c, 0x29800001,
+       0x0000000c, 0x1f800001, 0x00000008, 0x2a000002, 0x00000018, 0x8000ffb5,
+       0x00000010, 0xb1a0b012, 0x0000000b, 0x2fdf0002, 0x00000000, 0x2c200000,
+       0x00000008, 0x2c800000, 0x00000008, 0x2d000000, 0x00000010, 0x91d40000,
+       0x00000008, 0x2d80011c, 0x00000000, 0x00000000, 0x00000010, 0x91de0000,
+       0x0000000f, 0x47600008, 0x0000000f, 0x060e0001, 0x00000010, 0x001f0000,
+       0x00000000, 0x0f580000, 0x00000000, 0x0a640000, 0x00000000, 0x0ae50000,
+       0x00000000, 0x0b660000, 0x00000000, 0x0d610000, 0x00000018, 0x80000013,
+       0x0000000f, 0x47600008, 0x0000000b, 0x2fdf0002, 0x00000008, 0x2c800000,
+       0x00000008, 0x2d000000, 0x00000010, 0x91d40000, 0x00000008, 0x2d80011c,
+       0x0000000f, 0x060e0001, 0x00000010, 0x001f0000, 0x00000000, 0x0f580000,
+       0x00000010, 0x91de0000, 0x00000000, 0x0a640000, 0x00000000, 0x0ae50000,
+       0x00000000, 0x0b660000, 0x00000000, 0x0d610000, 0x00000000, 0x02620000,
+       0x0000000b, 0x2fdf0002, 0x00000000, 0x309a0000, 0x00000000, 0x31040000,
+       0x00000000, 0x0c961800, 0x00000009, 0x0c99ffff, 0x00000004, 0xcc993400,
+       0x00000010, 0xb1963202, 0x00000008, 0x0f800000, 0x0000000c, 0x29800001,
+       0x00000010, 0x00220002, 0x0000000c, 0x29520001, 0x0000000c, 0x29520000,
+       0x00000008, 0x22000001, 0x0000000c, 0x1f800001, 0x00000000, 0x2adf0000,
+       0x00000008, 0x2a000003, 0x00000018, 0x8000ff83, 0x00000010, 0xb1a0b01d,
+       0x0000000b, 0x2fdf0002, 0x00000000, 0x2c200000, 0x00000008, 0x2c8000b0,
+       0x00000008, 0x2d000008, 0x00000010, 0x91d40000, 0x00000008, 0x2d800150,
+       0x00000000, 0x00000000, 0x00000010, 0x205f0000, 0x00000008, 0x2c800000,
+       0x00000008, 0x2d000000, 0x00000008, 0x2d800108, 0x00000000, 0x00000000,
+       0x00000010, 0x91de0000, 0x0000000f, 0x47600008, 0x00000000, 0x060e0000,
+       0x00000010, 0x001f0000, 0x00000000, 0x0f580000, 0x00000010, 0x91de0000,
+       0x00000000, 0x0a640000, 0x00000000, 0x0ae50000, 0x00000000, 0x0b670000,
+       0x00000000, 0x0d620000, 0x00000000, 0x0ce71800, 0x00000009, 0x0c99ffff,
+       0x00000004, 0xcc993400, 0x00000010, 0xb1963220, 0x00000008, 0x0f800000,
+       0x00000018, 0x8000001e, 0x0000000f, 0x47600008, 0x0000000b, 0x2fdf0002,
+       0x00000008, 0x2c8000b0, 0x00000008, 0x2d000008, 0x00000010, 0x91d40000,
+       0x00000008, 0x2d80012c, 0x0000000f, 0x060e0001, 0x00000010, 0x001f0000,
+       0x00000000, 0x0f580000, 0x00000010, 0x91de0000, 0x00000000, 0x0a640000,
+       0x00000000, 0x0ae50000, 0x00000000, 0x0b670000, 0x00000000, 0x0d620000,
+       0x00000000, 0x02630000, 0x0000000f, 0x47620010, 0x00000000, 0x0ce71800,
+       0x0000000b, 0x2fdf0002, 0x00000000, 0x311a0000, 0x00000000, 0x31840000,
+       0x0000000b, 0xc20000ff, 0x00000002, 0x42040000, 0x00000001, 0x31620800,
+       0x0000000f, 0x020e0010, 0x00000002, 0x31620800, 0x00000009, 0x0c99ffff,
+       0x00000004, 0xcc993400, 0x00000010, 0xb1963202, 0x00000008, 0x0f800000,
+       0x0000000c, 0x29800001, 0x0000000c, 0x1f800001, 0x0000000c, 0x61420006,
+       0x00000008, 0x22000008, 0x00000000, 0x2adf0000, 0x00000008, 0x2a000004,
+       0x00000018, 0x8000ff42, 0x00000008, 0x2c8000b0, 0x00000008, 0x2d000008,
+       0x00000010, 0x91a0b008, 0x00000010, 0x91d40000, 0x0000000c, 0x31620018,
+       0x00000008, 0x2d800001, 0x00000000, 0x00000000, 0x00000010, 0x91de0000,
+       0x00000008, 0xac000001, 0x00000018, 0x8000000e, 0x00000000, 0x0380b000,
+       0x0000000b, 0x2fdf0002, 0x00000000, 0x2c004000, 0x00000010, 0x91d40000,
+       0x00000008, 0x2d800101, 0x00000000, 0x00000000, 0x00000010, 0x91de0000,
+       0x0000000c, 0x31620018, 0x00000008, 0x2d800001, 0x00000000, 0x00000000,
+       0x00000010, 0x91de0000, 0x0000000b, 0x2fdf0002, 0x00000000, 0x2c000e00,
+       0x0000000c, 0x29800001, 0x0000000c, 0x1f800001, 0x00000008, 0x2a000007,
+       0x00000018, 0x8000ff27, 0x00000010, 0xb1a0b016, 0x0000000b, 0x2fdf0002,
+       0x00000000, 0x03d80000, 0x00000000, 0x2c200000, 0x00000008, 0x2c8000b0,
+       0x00000008, 0x2d000008, 0x00000010, 0x91d40000, 0x00000008, 0x2d800150,
+       0x00000000, 0x00000000, 0x00000010, 0x205f0000, 0x00000008, 0x2c800000,
+       0x00000008, 0x2d000000, 0x00000008, 0x2d800108, 0x00000008, 0x07000001,
+       0x00000010, 0xb5de1c00, 0x00000010, 0x2c620002, 0x00000018, 0x8000000a,
+       0x0000000b, 0x2fdf0002, 0x00000000, 0x2c070000, 0x0000000c, 0x1f800001,
+       0x00000010, 0x91de0000, 0x00000018, 0x8000ff11, 0x00000008, 0x2c8000b0,
+       0x00000008, 0x2d000008, 0x00000010, 0x91d40000, 0x00000008, 0x2d800108,
+       0x0000000c, 0x29800001, 0x0000000c, 0x1f800001, 0x00000010, 0x91de0000,
+       0x00000000, 0x2adf0000, 0x00000008, 0x2a00000a, 0x00000018, 0x8000ff07,
+       0x00000000, 0x82265600, 0x0000000f, 0x47220008, 0x00000009, 0x070e000f,
+       0x00000008, 0x070e0008, 0x00000008, 0x02800001, 0x00000007, 0x02851c00,
+       0x00000008, 0x82850001, 0x00000000, 0x02840a00, 0x00000007, 0x42851c00,
+       0x00000003, 0xc3aa5200, 0x00000000, 0x03b10e00, 0x00000010, 0x001f0000,
+       0x0000000f, 0x0f280007, 0x00000007, 0x4b071c00, 0x00000000, 0x00000000,
+       0x0000000f, 0x0a960003, 0x00000000, 0x0a955c00, 0x00000000, 0x4a005a00,
+       0x00000000, 0x0c960a00, 0x00000009, 0x0c99ffff, 0x00000008, 0x0d00ffff,
+       0x00000010, 0xb1963202, 0x00000008, 0x0f800005, 0x00000010, 0x00220020,
+       0x00000000, 0x02a70000, 0x00000010, 0xb1850002, 0x00000008, 0x82850200,
+       0x00000000, 0x02000000, 0x00000000, 0x03a60000, 0x00000018, 0x8000004e,
+       0x00000000, 0x072b0000, 0x00000001, 0x878c1c00, 0x00000000, 0x870e1e00,
+       0x00000000, 0x860c1e00, 0x00000000, 0x03061e00, 0x00000010, 0xb18e0003,
+       0x00000018, 0x80000047, 0x00000018, 0x8000fffa, 0x00000010, 0x918c0003,
+       0x00000010, 0xb1870002, 0x00000018, 0x80000043, 0x00000010, 0x91d40000,
+       0x0000000c, 0x29800001, 0x00000000, 0x2a860000, 0x00000000, 0x230c0000,
+       0x00000000, 0x2b070000, 0x00000010, 0xb187000e, 0x00000008, 0x2a000008,
+       0x00000018, 0x8000003b, 0x00000010, 0x91d40000, 0x00000000, 0x28d18c00,
+       0x00000000, 0x2a860000, 0x00000000, 0x230c0000, 0x00000000, 0x2b070000,
+       0x00000018, 0x8000fff8, 0x00000010, 0x91d40000, 0x0000000c, 0x29800001,
+       0x00000000, 0x2aab0000, 0x00000000, 0xa3265600, 0x00000000, 0x2b000000,
+       0x0000000c, 0x1f800001, 0x00000008, 0x2a000008, 0x00000018, 0x8000fec8,
+       0x00000010, 0x91d40000, 0x0000000c, 0x29800001, 0x0000000c, 0x1f800001,
+       0x00000008, 0x2a000009, 0x00000018, 0x8000fec3, 0x00000010, 0x91d40000,
+       0x0000000c, 0x29800001, 0x0000000c, 0x1f800001, 0x00000000, 0x29420000,
+       0x00000008, 0x2a000002, 0x00000018, 0x8000febd, 0x00000018, 0x8000febc,
+       0x00000010, 0xb1bcb016, 0x0000000b, 0x2fdf0002, 0x00000000, 0x03d80000,
+       0x00000000, 0x2c3c0000, 0x00000008, 0x2c8000b0, 0x00000008, 0x2d000008,
+       0x00000010, 0x91d40000, 0x00000008, 0x2d800150, 0x00000000, 0x00000000,
+       0x00000010, 0x205f0000, 0x00000008, 0x2c800000, 0x00000008, 0x2d000000,
+       0x00000008, 0x2d800108, 0x00000008, 0x07000001, 0x00000010, 0xb5de1c00,
+       0x00000010, 0x2c620002, 0x00000018, 0x8000000a, 0x0000000b, 0x2fdf0002,
+       0x00000000, 0x2c070000, 0x0000000c, 0x1f800000, 0x00000010, 0x91de0000,
+       0x00000018, 0x8000fea6, 0x00000008, 0x2c8000b0, 0x00000008, 0x2d000008,
+       0x00000010, 0x91d40000, 0x00000008, 0x2d800108, 0x0000000c, 0x29800000,
+       0x0000000c, 0x1f800000, 0x00000010, 0x91de0000, 0x00000000, 0x2adf0000,
+       0x00000008, 0x2a000006, 0x00000018, 0x8000fe9c, 0x00000008, 0x03050004,
+       0x00000006, 0x83040c00, 0x00000008, 0x02850200, 0x00000000, 0x86050c00,
+       0x00000001, 0x860c0e00, 0x00000008, 0x02040004, 0x00000000, 0x02041800,
+       0x00000000, 0x83871800, 0x00000018, 0x00020000 };
+
+static u32 bnx2_rv2p_proc2[] = {
+       0x00000000, 0x2a000000, 0x00000010, 0xb1d40000, 0x00000008, 0x02540003,
+       0x00000018, 0x00040000, 0x00000018, 0x8000000a, 0x00000018, 0x8000000a,
+       0x00000018, 0x8000000e, 0x00000018, 0x80000056, 0x00000018, 0x800001b9,
+       0x00000018, 0x800001e1, 0x00000018, 0x8000019b, 0x00000018, 0x800001f9,
+       0x00000018, 0x8000019f, 0x00000018, 0x800001a6, 0x00000018, 0x80000000,
+       0x0000000c, 0x29800001, 0x00000000, 0x2a000000, 0x0000000c, 0x29800000,
+       0x00000010, 0x20530000, 0x00000018, 0x8000ffee, 0x0000000c, 0x29800001,
+       0x00000010, 0x91de0000, 0x00000010, 0x001f0000, 0x00000000, 0x2f80aa00,
+       0x00000000, 0x2a000000, 0x00000000, 0x0d610000, 0x00000000, 0x03620000,
+       0x00000000, 0x2c400000, 0x00000000, 0x02638c00, 0x00000000, 0x26460000,
+       0x00000010, 0x00420002, 0x00000008, 0x02040012, 0x00000010, 0xb9060836,
+       0x00000000, 0x0f580000, 0x00000000, 0x0a640000, 0x00000000, 0x0ae50000,
+       0x00000000, 0x0b660000, 0x00000000, 0x0c000000, 0x00000000, 0x0b800000,
+       0x00000010, 0x00420009, 0x00000008, 0x0cc60012, 0x00000008, 0x0f800003,
+       0x00000000, 0x00000000, 0x00000010, 0x009f0000, 0x00000008, 0x27110012,
+       0x00000000, 0x66900000, 0x00000008, 0xa31b0012, 0x00000018, 0x80000008,
+       0x00000000, 0x0cc60000, 0x00000008, 0x0f800003, 0x00000000, 0x00000000,
+       0x00000010, 0x009f0000, 0x00000000, 0x27110000, 0x00000000, 0x66900000,
+       0x00000000, 0x231b0000, 0x00000010, 0xb197320e, 0x00000000, 0x25960000,
+       0x00000000, 0x021b0000, 0x00000010, 0x001f0000, 0x00000008, 0x0f800003,
+       0x0000000c, 0x29800000, 0x00000010, 0x20530000, 0x00000000, 0x22c50800,
+       0x00000010, 0x009f0000, 0x00000000, 0x27002200, 0x00000000, 0x26802000,
+       0x00000000, 0x231b0000, 0x0000000c, 0x69520001, 0x00000018, 0x8000fff3,
+       0x00000010, 0x01130002, 0x00000010, 0xb1980003, 0x00000010, 0x001f0000,
+       0x00000008, 0x0f800004, 0x00000008, 0x22000003, 0x00000008, 0x2c80000c,
+       0x00000008, 0x2d00000c, 0x00000010, 0x009f0000, 0x00000000, 0x25960000,
+       0x0000000c, 0x29800000, 0x00000000, 0x32140000, 0x00000000, 0x32950000,
+       0x00000000, 0x33160000, 0x00000000, 0x31e32e00, 0x00000008, 0x2d800010,
+       0x00000010, 0x20530000, 0x00000018, 0x8000ffac, 0x00000000, 0x23000000,
+       0x00000000, 0x25e60000, 0x00000008, 0x2200000b, 0x0000000c, 0x69520000,
+       0x0000000c, 0x29800000, 0x00000010, 0x20530000, 0x00000018, 0x8000ffa5,
+       0x0000000c, 0x29800001, 0x00000010, 0x91de0000, 0x00000000, 0x2fd50000,
+       0x00000010, 0x001f0000, 0x00000000, 0x02700000, 0x00000000, 0x0d620000,
+       0x00000000, 0xbb630800, 0x00000000, 0x2a000000, 0x00000009, 0x076000ff,
+       0x0000000f, 0x2c0e0007, 0x00000008, 0x2c800000, 0x00000008, 0x2d000064,
+       0x00000008, 0x2d80011c, 0x00000009, 0x06420002, 0x0000000c, 0x61420001,
+       0x00000000, 0x0f400000, 0x00000000, 0x02d08c00, 0x00000000, 0x23000000,
+       0x00000004, 0x826da000, 0x00000000, 0x8304a000, 0x00000000, 0x22c50c00,
+       0x00000000, 0x03760000, 0x00000004, 0x83860a00, 0x00000000, 0x83870c00,
+       0x00000010, 0x91de0000, 0x00000000, 0x037c0000, 0x00000000, 0x837b0c00,
+       0x00000001, 0x83060e00, 0x00000000, 0x83870c00, 0x00000000, 0x82850e00,
+       0x00000010, 0xb1860016, 0x0000000f, 0x47610018, 0x00000000, 0x068e0000,
+       0x0000000f, 0x47670010, 0x0000000f, 0x47e20010, 0x00000000, 0x870e1e00,
+       0x00000010, 0xb70e1a10, 0x00000010, 0x0ce7000e, 0x00000008, 0x22000009,
+       0x00000000, 0x286d0000, 0x0000000f, 0x65680010, 0x00000003, 0xf66c9400,
+       0x00000010, 0xb972a003, 0x0000000c, 0x73e70019, 0x0000000c, 0x21420004,
+       0x00000018, 0x8000023f, 0x00000000, 0x37ed0000, 0x0000000c, 0x73e7001a,
+       0x00000010, 0x20530000, 0x00000008, 0x22000008, 0x0000000c, 0x61420004,
+       0x00000000, 0x02f60000, 0x00000004, 0x82840a00, 0x00000010, 0xb1840a2b,
+       0x00000010, 0x2d67000a, 0x00000010, 0xb96d0804, 0x00000004, 0xb6ed0a00,
+       0x00000000, 0x37ed0000, 0x00000018, 0x80000029, 0x0000000c, 0x61420000,
+       0x00000000, 0x37040000, 0x00000000, 0x37850000, 0x0000000c, 0x33e7001a,
+       0x00000018, 0x80000024, 0x00000010, 0xb96d0809, 0x00000004, 0xb6ed0a00,
+       0x00000000, 0x036d0000, 0x00000004, 0xb76e0c00, 0x00000010, 0x91ee0c1f,
+       0x0000000c, 0x73e7001a, 0x00000004, 0xb6ef0c00, 0x00000000, 0x37ed0000,
+       0x00000018, 0x8000001b, 0x0000000c, 0x61420000, 0x00000010, 0xb7ee0a05,
+       0x00000010, 0xb96f0815, 0x00000003, 0xb76e0800, 0x00000004, 0xb7ef0a00,
+       0x00000018, 0x80000015, 0x00000010, 0x0ce7000c, 0x00000008, 0x22000009,
+       0x00000000, 0x286d0000, 0x0000000f, 0x65680010, 0x00000003, 0xf66c9400,
+       0x00000010, 0xb972a003, 0x0000000c, 0x73e70019, 0x0000000c, 0x21420004,
+       0x00000018, 0x80000215, 0x00000010, 0x20530000, 0x00000008, 0x22000008,
+       0x0000000c, 0x61420004, 0x00000000, 0x37040000, 0x00000000, 0x37850000,
+       0x00000000, 0x036d0000, 0x00000003, 0xb8f10c00, 0x00000018, 0x80000004,
+       0x00000000, 0x02840000, 0x00000002, 0x21421800, 0x0000000c, 0x61420000,
+       0x00000000, 0x286d0000, 0x0000000f, 0x65ed0010, 0x00000009, 0x266dffff,
+       0x00000000, 0x23000000, 0x00000010, 0xb1840a3d, 0x00000010, 0x01420002,
+       0x00000004, 0xb8f10a00, 0x00000003, 0x83760a00, 0x00000010, 0xb8040c39,
+       0x00000010, 0xb7e6080a, 0x00000000, 0x0a640000, 0x00000000, 0x0ae50000,
+       0x00000009, 0x0c68ffff, 0x00000009, 0x0b67ffff, 0x00000000, 0x0be60000,
+       0x00000000, 0x0c840000, 0x00000010, 0xb197320c, 0x00000008, 0x0f800002,
+       0x00000018, 0x8000000a, 0x00000000, 0x0a6a0000, 0x00000000, 0x0aeb0000,
+       0x00000000, 0x0c000000, 0x00000009, 0x0b6cffff, 0x00000000, 0x0be90000,
+       0x00000000, 0x0c840000, 0x00000010, 0xb1973203, 0x00000008, 0x0f800002,
+       0x00000018, 0x80000001, 0x00000010, 0x001f0000, 0x00000000, 0x0c860000,
+       0x00000000, 0x06980000, 0x00000008, 0x0f800003, 0x00000000, 0x00000000,
+       0x00000010, 0x009f0000, 0x00000010, 0xb1973210, 0x00000000, 0x231b0000,
+       0x00000000, 0x02043600, 0x00000003, 0x8384a000, 0x0000000f, 0x65870010,
+       0x00000009, 0x2607ffff, 0x00000000, 0x27111a00, 0x00000000, 0x66900000,
+       0x0000000c, 0x29000000, 0x00000018, 0x800001de, 0x00000000, 0x06980000,
+       0x00000010, 0x20530000, 0x00000000, 0x22c58c00, 0x00000010, 0x001f0000,
+       0x00000008, 0x0f800003, 0x00000018, 0x8000fff0, 0x00000000, 0x02043600,
+       0x00000000, 0x231b0000, 0x00000003, 0x8384a000, 0x0000000f, 0x65870010,
+       0x00000009, 0x2607ffff, 0x00000000, 0x27111a00, 0x00000000, 0x66900000,
+       0x0000000c, 0x29000000, 0x00000010, 0x91840a02, 0x00000002, 0x21421800,
+       0x00000000, 0x32140000, 0x00000000, 0x32950000, 0x00000005, 0x73e72c00,
+       0x00000005, 0x74683000, 0x00000000, 0x33170000, 0x00000018, 0x80000138,
+       0x00000010, 0x91c60004, 0x00000008, 0x07000004, 0x00000010, 0xb1c41c02,
+       0x00000010, 0x91840a04, 0x00000018, 0x800001c3, 0x00000010, 0x20530000,
+       0x00000000, 0x22c58c00, 0x00000010, 0xb1840a8e, 0x0000000c, 0x21420006,
+       0x00000010, 0x0ce7001a, 0x0000000f, 0x43680010, 0x00000000, 0x03f30c00,
+       0x00000010, 0x91870850, 0x0000000f, 0x46ec0010, 0x00000010, 0xb68d0c4e,
+       0x00000000, 0x838d0c00, 0x00000000, 0xa3050800, 0x00000001, 0xa3460e00,
+       0x00000000, 0x02048c00, 0x00000010, 0x91840a02, 0x00000002, 0x21421800,
+       0x00000010, 0x001f0000, 0x00000008, 0x22000008, 0x00000003, 0x8384a000,
+       0x0000000f, 0x65870010, 0x00000009, 0x2607ffff, 0x00000000, 0x27750c00,
+       0x00000000, 0x66f40000, 0x0000000c, 0x29000000, 0x00000018, 0x800001aa,
+       0x00000000, 0x03068c00, 0x00000003, 0xf4680c00, 0x00000010, 0x20530000,
+       0x00000000, 0x22c58c00, 0x00000018, 0x8000ffe5, 0x00000000, 0x39760000,
+       0x00000000, 0x39840000, 0x0000000c, 0x33e70019, 0x00000010, 0x001f0000,
+       0x00000000, 0x031e0000, 0x00000000, 0x0760fe00, 0x0000000f, 0x0f0e0007,
+       0x00000000, 0x83850800, 0x00000000, 0x0a7d0000, 0x00000000, 0x0afe0000,
+       0x00000000, 0x0b7f0000, 0x00000000, 0x0d7a0000, 0x00000000, 0x0c000000,
+       0x00000000, 0x0bfc0000, 0x00000000, 0x0c970e00, 0x00000008, 0x0f800003,
+       0x0000000f, 0x47670010, 0x00000008, 0x070e0001, 0x0000000b, 0xc38000ff,
+       0x00000002, 0x43870000, 0x00000001, 0x33e70e00, 0x0000000f, 0x038e0010,
+       0x00000002, 0x33e70e00, 0x00000000, 0x28f30000, 0x00000010, 0x009f0000,
+       0x00000000, 0x02043600, 0x00000010, 0x91840a02, 0x00000002, 0x21421800,
+       0x00000008, 0x22000006, 0x00000000, 0x231b0000, 0x00000000, 0x23ff0000,
+       0x00000000, 0x241b0000, 0x00000003, 0x8384a000, 0x0000000f, 0x65870010,
+       0x00000009, 0x2607ffff, 0x00000000, 0x27110000, 0x00000000, 0x26900000,
+       0x0000000c, 0x29000000, 0x00000018, 0x8000017e, 0x00000003, 0xf4683600,
+       0x00000000, 0x3a100000, 0x00000000, 0x3a910000, 0x00000003, 0xf66c2400,
+       0x00000010, 0x001f0000, 0x00000010, 0xb1923604, 0x00000008, 0x0f800004,
+       0x00000000, 0x00000000, 0x00000010, 0x009f0000, 0x00000000, 0x3e170000,
+       0x00000000, 0x3e940000, 0x00000000, 0x3f150000, 0x00000000, 0x3f960000,
+       0x00000010, 0x001f0000, 0x00000000, 0x0f060000, 0x00000010, 0x20530000,
+       0x00000000, 0x22c53600, 0x00000018, 0x8000ffac, 0x00000010, 0x001f0000,
+       0x00000000, 0x031e0000, 0x00000000, 0x83850800, 0x00000009, 0x076000ff,
+       0x0000000f, 0x0f0e0007, 0x00000000, 0x0c000000, 0x00000000, 0x0a7d0000,
+       0x00000000, 0x0afe0000, 0x00000000, 0x0b7f0000, 0x00000000, 0x0d7a0000,
+       0x00000000, 0x0bfc0000, 0x00000000, 0x0c970e00, 0x00000008, 0x0f800003,
+       0x0000000f, 0x47670010, 0x00000008, 0x070e0001, 0x0000000b, 0xc38000ff,
+       0x00000002, 0x43870000, 0x00000001, 0x33e70e00, 0x0000000f, 0x038e0010,
+       0x00000002, 0x33e70e00, 0x00000000, 0x39840000, 0x00000003, 0xb9720800,
+       0x00000000, 0x28f30000, 0x0000000f, 0x65680010, 0x00000010, 0x009f0000,
+       0x00000000, 0x02043600, 0x00000010, 0x91840a02, 0x00000002, 0x21421800,
+       0x00000008, 0x22000007, 0x00000000, 0x231b0000, 0x00000000, 0x23ff0000,
+       0x00000000, 0x241b0000, 0x00000003, 0x8384a000, 0x0000000f, 0x65870010,
+       0x00000009, 0x2607ffff, 0x00000000, 0x27110000, 0x00000000, 0x26900000,
+       0x0000000c, 0x29000000, 0x00000018, 0x80000145, 0x00000003, 0xf4683600,
+       0x00000000, 0x3a100000, 0x00000000, 0x3a910000, 0x00000003, 0xf66c2400,
+       0x00000010, 0x001f0000, 0x00000010, 0xb1923604, 0x00000008, 0x0f800004,
+       0x00000000, 0x00000000, 0x00000010, 0x009f0000, 0x00000000, 0x3e170000,
+       0x00000000, 0x3e940000, 0x00000000, 0x3f150000, 0x00000000, 0x3f960000,
+       0x00000010, 0x001f0000, 0x00000000, 0x0f060000, 0x00000010, 0x20530000,
+       0x00000000, 0x22c53600, 0x00000018, 0x8000ff73, 0x00000010, 0x0ce70005,
+       0x00000008, 0x2c80000c, 0x00000008, 0x2d000070, 0x00000008, 0x2d800010,
+       0x00000000, 0x00000000, 0x00000010, 0x205f0000, 0x00000018, 0x8000011d,
+       0x00000000, 0x2c1e0000, 0x00000008, 0x2c8000b8, 0x00000008, 0x2d000010,
+       0x00000008, 0x2d800048, 0x00000000, 0x00000000, 0x00000010, 0x91de0000,
+       0x00000018, 0x8000fe5d, 0x0000000c, 0x29800001, 0x00000000, 0x2a000000,
+       0x00000010, 0x001f0000, 0x00000000, 0x0f008000, 0x00000008, 0x0f800007,
+       0x00000018, 0x80000006, 0x0000000c, 0x29800001, 0x00000000, 0x2a000000,
+       0x00000010, 0x001f0000, 0x0000000f, 0x0f470007, 0x00000008, 0x0f800008,
+       0x00000018, 0x80000119, 0x00000010, 0x20530000, 0x00000018, 0x8000fe4f,
+       0x0000000c, 0x29800001, 0x00000010, 0x91de0000, 0x00000000, 0x2fd50000,
+       0x00000000, 0x2a000000, 0x00000009, 0x0261ffff, 0x0000000d, 0x70e10001,
+       0x00000018, 0x80000101, 0x00000000, 0x2c400000, 0x00000008, 0x2c8000c4,
+       0x00000008, 0x2d00001c, 0x00000008, 0x2d800001, 0x00000005, 0x70e10800,
+       0x00000010, 0x91de0000, 0x00000018, 0x8000fe41, 0x0000000c, 0x29800001,
+       0x00000010, 0x91de0000, 0x00000000, 0x2fd50000, 0x00000010, 0x001f0000,
+       0x00000000, 0x02700000, 0x00000000, 0x0d620000, 0x00000000, 0xbb630800,
+       0x00000000, 0x2a000000, 0x00000000, 0x0f400000, 0x00000000, 0x2c400000,
+       0x0000000c, 0x73e7001b, 0x00000010, 0x0ce7000e, 0x00000000, 0x286d0000,
+       0x0000000f, 0x65ed0010, 0x00000009, 0x266dffff, 0x00000018, 0x80000069,
+       0x00000008, 0x02000004, 0x00000010, 0x91c40803, 0x00000018, 0x800000f6,
+       0x00000010, 0x20530000, 0x00000018, 0x800000e5, 0x00000008, 0x2c8000b8,
+       0x00000008, 0x2d000010, 0x00000008, 0x2d800048, 0x00000018, 0x80000005,
+       0x00000008, 0x2c8000c4, 0x00000008, 0x2d00001c, 0x00000008, 0x2d800001,
+       0x00000000, 0x00000000, 0x00000010, 0x205f0000, 0x00000008, 0x2c800048,
+       0x00000008, 0x2d000068, 0x00000008, 0x2d800104, 0x00000000, 0x00000000,
+       0x00000010, 0x91de0000, 0x00000000, 0x27f60000, 0x00000010, 0xb87a9e04,
+       0x00000008, 0x2200000d, 0x00000018, 0x800000e2, 0x00000010, 0x20530000,
+       0x00000018, 0x8000fe18, 0x0000000c, 0x29800001, 0x00000010, 0x91de0000,
+       0x00000000, 0x2fd50000, 0x00000010, 0x001f0000, 0x00000000, 0x02700000,
+       0x00000000, 0x0d620000, 0x00000000, 0xbb630800, 0x00000000, 0x2a000000,
+       0x00000010, 0x0e670011, 0x00000000, 0x286d0000, 0x0000000f, 0x65ed0010,
+       0x00000009, 0x266dffff, 0x00000004, 0xb8f1a000, 0x00000000, 0x0f400000,
+       0x0000000c, 0x73e7001c, 0x00000018, 0x80000040, 0x00000008, 0x02000004,
+       0x00000010, 0x91c40802, 0x00000018, 0x800000cd, 0x00000000, 0x2c1e0000,
+       0x00000008, 0x2c8000b8, 0x00000008, 0x2d000010, 0x00000008, 0x2d800048,
+       0x00000010, 0x20530000, 0x00000010, 0x91de0000, 0x00000018, 0x8000fdfe,
+       0x0000000c, 0x29800001, 0x00000000, 0x03550000, 0x00000000, 0x06460000,
+       0x00000000, 0x03d60000, 0x00000000, 0x2a000000, 0x0000000f, 0x0f480007,
+       0x00000010, 0xb18c0027, 0x0000000f, 0x47420008, 0x00000009, 0x070e000f,
+       0x00000008, 0x070e0008, 0x00000010, 0x001f0000, 0x00000008, 0x09000001,
+       0x00000007, 0x09121c00, 0x00000003, 0xcbca9200, 0x00000000, 0x0b97a200,
+       0x00000007, 0x4b171c00, 0x0000000f, 0x0a960003, 0x00000000, 0x0a959c00,
+       0x00000000, 0x4a009a00, 0x00000008, 0x82120001, 0x00000001, 0x0c170800,
+       0x00000000, 0x02180000, 0x00000000, 0x0c971800, 0x00000008, 0x0d00ffff,
+       0x00000008, 0x0f800006, 0x0000000c, 0x29000000, 0x00000008, 0x22000001,
+       0x00000000, 0x22c50c00, 0x00000010, 0x009f0000, 0x00000010, 0xb197320b,
+       0x00000000, 0x231b0000, 0x00000000, 0x27110800, 0x00000000, 0x66900000,
+       0x00000018, 0x800000a4, 0x00000000, 0x02180000, 0x00000010, 0x20530000,
+       0x00000000, 0x22c53600, 0x00000010, 0x001f0000, 0x00000008, 0x0f800006,
+       0x00000018, 0x8000fff5, 0x00000010, 0x91870002, 0x00000008, 0x2200000a,
+       0x00000000, 0x231b0000, 0x00000000, 0x27110800, 0x00000000, 0x66900000,
+       0x00000018, 0x80000098, 0x00000008, 0x0200000a, 0x00000010, 0x91c40804,
+       0x00000010, 0x02c20003, 0x00000010, 0x001f0000, 0x00000008, 0x0f800008,
+       0x00000010, 0x20530000, 0x00000018, 0x8000fdc9, 0x00000000, 0x06820000,
+       0x00000010, 0x001f0000, 0x00000010, 0x0ce70028, 0x00000000, 0x03720000,
+       0x00000000, 0xa8760c00, 0x00000000, 0x0cf60000, 0x00000010, 0xb8723224,
+       0x00000000, 0x03440000, 0x00000008, 0x22000010, 0x00000000, 0x03ca0000,
+       0x0000000f, 0x65680010, 0x00000000, 0x0bcf0000, 0x00000000, 0x27f20000,
+       0x00000010, 0xb7ef3203, 0x0000000c, 0x21420004, 0x0000000c, 0x73e70019,
+       0x00000000, 0x07520000, 0x00000000, 0x29000000, 0x00000018, 0x8000007e,
+       0x00000004, 0xb9723200, 0x00000010, 0x20530000, 0x00000000, 0x22060000,
+       0x0000000c, 0x61420004, 0x00000000, 0x25070000, 0x00000000, 0x27970000,
+       0x00000000, 0x290e0000, 0x00000010, 0x0ce70010, 0x00000010, 0xb873320f,
+       0x0000000f, 0x436c0010, 0x00000000, 0x03f30c00, 0x00000000, 0x03f30000,
+       0x00000000, 0x83990e00, 0x00000001, 0x83860e00, 0x00000000, 0x83060e00,
+       0x00000003, 0xf66c0c00, 0x00000000, 0x39f30e00, 0x00000000, 0x3af50e00,
+       0x00000000, 0x7a740000, 0x0000000f, 0x43680010, 0x00000001, 0x83860e00,
+       0x00000000, 0x83060e00, 0x00000003, 0xf4680c00, 0x00000000, 0x286d0000,
+       0x00000000, 0x03690000, 0x00000010, 0xb1f60c54, 0x00000000, 0x0a6a0000,
+       0x00000000, 0x0aeb0000, 0x00000009, 0x0b6cffff, 0x00000000, 0x0c000000,
+       0x00000000, 0x0be90000, 0x00000003, 0x8cf6a000, 0x0000000c, 0x09800002,
+       0x00000010, 0x009f0000, 0x00000010, 0xb8173209, 0x00000000, 0x35140000,
+       0x00000000, 0x35950000, 0x00000005, 0x766c2c00, 0x00000000, 0x34970000,
+       0x00000004, 0xb8f12e00, 0x00000010, 0x001f0000, 0x00000008, 0x0f800004,
+       0x00000018, 0x8000fff7, 0x00000000, 0x03e90000, 0x00000010, 0xb8f6a01a,
+       0x00000010, 0x20130019, 0x00000010, 0xb1f10e18, 0x00000000, 0x83973200,
+       0x00000000, 0x38700e00, 0x00000000, 0xbb760e00, 0x00000000, 0x37d00000,
+       0x0000000c, 0x73e7001a, 0x00000003, 0xb8f1a000, 0x00000000, 0x32140000,
+       0x00000000, 0x32950000, 0x00000005, 0x73e72c00, 0x00000000, 0x33190000,
+       0x00000005, 0x74680000, 0x00000010, 0x0ce7000d, 0x00000008, 0x22000009,
+       0x00000000, 0x07520000, 0x00000000, 0x29000000, 0x0000000c, 0x73e70019,
+       0x0000000f, 0x65680010, 0x0000000c, 0x21420004, 0x00000018, 0x8000003c,
+       0x00000010, 0x20530000, 0x0000000c, 0x61420004, 0x00000000, 0x290e0000,
+       0x00000018, 0x80000002, 0x00000010, 0x91973206, 0x00000000, 0x35140000,
+       0x00000000, 0x35950000, 0x00000005, 0x766c2c00, 0x00000000, 0x34990000,
+       0x00000004, 0xb8f13200, 0x00000000, 0x83690c00, 0x00000010, 0xb1860013,
+       0x00000000, 0x28e90000, 0x00000008, 0x22000004, 0x00000000, 0x23ec0000,
+       0x00000000, 0x03690000, 0x00000010, 0xb8660c07, 0x00000009, 0x036cffff,
+       0x00000000, 0x326a0000, 0x00000000, 0x32eb0000, 0x00000005, 0x73e70c00,
+       0x00000000, 0x33690000, 0x00000005, 0x74680000, 0x0000000c, 0x73e7001c,
+       0x00000000, 0x03690000, 0x00000010, 0xb1f60c12, 0x00000010, 0xb1d00c11,
+       0x0000000c, 0x21420005, 0x0000000c, 0x33e7001c, 0x00000018, 0x8000000e,
+       0x00000010, 0x2e67000d, 0x00000000, 0x03690000, 0x00000010, 0xb1f60c0b,
+       0x00000010, 0xb1d00c0a, 0x00000000, 0x03440000, 0x00000008, 0x2200000c,
+       0x00000000, 0x07520000, 0x00000000, 0x29000000, 0x00000018, 0x80000015,
+       0x0000000c, 0x33e7001c, 0x00000010, 0x20530000, 0x00000000, 0x22060000,
+       0x00000000, 0x290e0000, 0x00000018, 0x000d0000, 0x00000000, 0x06820000,
+       0x00000010, 0x2de7000d, 0x00000010, 0x0ce7000c, 0x00000000, 0x27f20000,
+       0x00000010, 0xb96d9e0a, 0x00000000, 0xa86d9e00, 0x00000009, 0x0361ffff,
+       0x00000010, 0xb7500c07, 0x00000008, 0x2200000f, 0x0000000f, 0x65680010,
+       0x00000000, 0x29000000, 0x00000018, 0x80000004, 0x0000000c, 0x33e7001b,
+       0x00000010, 0x20530000, 0x00000018, 0x000d0000, 0x00000000, 0x2b820000,
+       0x00000010, 0x20d2002f, 0x00000010, 0x0052002e, 0x00000009, 0x054e0007,
+       0x00000010, 0xb18a002c, 0x00000000, 0x050a8c00, 0x00000008, 0x850a0008,
+       0x00000010, 0x918a0029, 0x00000003, 0xc5008800, 0x00000008, 0xa3460001,
+       0x00000010, 0xb1c60007, 0x00000008, 0x22000001, 0x0000000c, 0x29800000,
+       0x00000010, 0x20530000, 0x00000000, 0x274e8c00, 0x00000000, 0x66cd0000,
+       0x00000000, 0x22c58c00, 0x00000008, 0x22000014, 0x00000003, 0x22c58e00,
+       0x00000003, 0x23c58e00, 0x00000003, 0x22c58e00, 0x00000003, 0x26cd9e00,
+       0x00000003, 0x27cd9e00, 0x00000003, 0x26cd9e00, 0x00000003, 0x274ea000,
+       0x00000003, 0x284ea000, 0x00000003, 0x274ea000, 0x0000000c, 0x69520000,
+       0x0000000c, 0x29800000, 0x00000010, 0x20530000, 0x00000003, 0x22c58e00,
+       0x00000003, 0x23c58e00, 0x00000003, 0x22c58e00, 0x00000003, 0x26cd9e00,
+       0x00000003, 0x27cd9e00, 0x00000003, 0x26cd9e00, 0x00000003, 0x274ea000,
+       0x00000003, 0x284ea000, 0x00000003, 0x274ea000, 0x00000000, 0xa2c58c00,
+       0x00000000, 0xa74e8c00, 0x00000000, 0xe6cd0000, 0x0000000f, 0x620a0010,
+       0x00000008, 0x23460001, 0x0000000c, 0x29800000, 0x00000010, 0x20530000,
+       0x0000000c, 0x29520000, 0x00000018, 0x80000002, 0x0000000c, 0x29800000,
+       0x00000018, 0x00570000 };
+
+static int bnx2_TPAT_b06FwReleaseMajor = 0x0;
+static int bnx2_TPAT_b06FwReleaseMinor = 0x0;
+static int bnx2_TPAT_b06FwReleaseFix = 0x0;
+static u32 bnx2_TPAT_b06FwStartAddr = 0x08000858;
+static u32 bnx2_TPAT_b06FwTextAddr = 0x08000800;
+static int bnx2_TPAT_b06FwTextLen = 0x1314;
+static u32 bnx2_TPAT_b06FwDataAddr = 0x08001b40;
+static int bnx2_TPAT_b06FwDataLen = 0x0;
+static u32 bnx2_TPAT_b06FwRodataAddr = 0x00000000;
+static int bnx2_TPAT_b06FwRodataLen = 0x0;
+static u32 bnx2_TPAT_b06FwBssAddr = 0x08001b90;
+static int bnx2_TPAT_b06FwBssLen = 0x80;
+static u32 bnx2_TPAT_b06FwSbssAddr = 0x08001b40;
+static int bnx2_TPAT_b06FwSbssLen = 0x48;
+
+static u32 bnx2_TPAT_b06FwText[(0x1314/4) + 1] = {
+       0x0a000216, 0x00000000, 0x00000000, 0x0000000d, 0x74706174, 0x20302e36,
+       0x2e390000, 0x00060901, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000003,
+       0x00000000, 0x0000000d, 0x0000000d, 0x3c020800, 0x24421b40, 0x3c030800,
+       0x24631c10, 0xac400000, 0x0043202b, 0x1480fffd, 0x24420004, 0x3c1d0800,
+       0x37bd3ffc, 0x03a0f021, 0x3c100800, 0x26100858, 0x3c1c0800, 0x279c1b40,
+       0x0e00051f, 0x00000000, 0x0000000d, 0x8f820024, 0x27bdffe8, 0xafbf0014,
+       0x10400004, 0xafb00010, 0x0000000d, 0x00000000, 0x2400015f, 0x8f82001c,
+       0x8c450008, 0x24030800, 0xaf430178, 0x97430104, 0x3c020008, 0xaf420140,
+       0x8f820034, 0x30420001, 0x10400006, 0x3070ffff, 0x24020002, 0x2603fffe,
+       0xa7420146, 0x0a000246, 0xa7430148, 0xa7400146, 0x8f850034, 0x30a20020,
+       0x0002102b, 0x00021023, 0x30460009, 0x30a30c00, 0x24020400, 0x14620002,
+       0x34c40001, 0x34c40005, 0xa744014a, 0x3c020800, 0x8c440820, 0x3c030048,
+       0x24020002, 0x00832025, 0x30a30006, 0x1062000d, 0x2c620003, 0x50400005,
+       0x24020004, 0x10600012, 0x3c020001, 0x0a000271, 0x00000000, 0x10620007,
+       0x24020006, 0x1462000f, 0x3c020111, 0x0a000269, 0x00821025, 0x0a000268,
+       0x3c020101, 0x3c020011, 0x00821025, 0x24030001, 0xaf421000, 0xaf830030,
+       0x0a000271, 0x00000000, 0x00821025, 0xaf421000, 0xaf800030, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x8f830030, 0x1060003f, 0x3c048000,
+       0x8f421000, 0x00441024, 0x1040fffd, 0x00000000, 0x10600039, 0x00000000,
+       0x8f421000, 0x3c030020, 0x00431024, 0x10400034, 0x00000000, 0x97421014,
+       0x14400031, 0x00000000, 0x97421008, 0x8f84001c, 0x24420006, 0x00024082,
+       0x00081880, 0x00643821, 0x8ce50000, 0x30430003, 0x30420001, 0x10400004,
+       0x00000000, 0x0000000d, 0x0a0002b0, 0x00081080, 0x5460000f, 0x30a5ffff,
+       0x3c06ffff, 0x00a62824, 0x0005182b, 0x00a61026, 0x0002102b, 0x00621824,
+       0x10600004, 0x00000000, 0x0000000d, 0x00000000, 0x240001fc, 0x8ce20000,
+       0x0a0002af, 0x00462825, 0x0005182b, 0x38a2ffff, 0x0002102b, 0x00621824,
+       0x10600004, 0x00000000, 0x0000000d, 0x00000000, 0x24000206, 0x8ce20000,
+       0x3445ffff, 0x00081080, 0x00441021, 0x3c030800, 0xac450000, 0x8c620840,
+       0x24420001, 0xac620840, 0x8f820008, 0x10400003, 0x00000000, 0x0e000660,
+       0x00000000, 0x8f840028, 0x02002821, 0x24820008, 0x30421fff, 0x24434000,
+       0x0343d821, 0x30a30007, 0xaf840018, 0xaf820028, 0xaf420084, 0x10600002,
+       0x24a20007, 0x3045fff8, 0x8f820044, 0x8f840004, 0x00451821, 0xaf82002c,
+       0x0064102b, 0xaf830044, 0x14400002, 0x00641023, 0xaf820044, 0x8f840044,
+       0x34028000, 0x8fbf0014, 0x8fb00010, 0x00821021, 0x03421821, 0x3c021000,
+       0xaf83001c, 0xaf440080, 0xaf420178, 0x03e00008, 0x27bd0018, 0x8f820024,
+       0x27bdffe8, 0xafbf0014, 0x10400004, 0xafb00010, 0x0000000d, 0x00000000,
+       0x24000249, 0x8f85001c, 0x24020001, 0xaf820024, 0x8ca70008, 0xa3800023,
+       0x8f620004, 0x3c100800, 0x26041b90, 0x00021402, 0xa3820010, 0x304600ff,
+       0x24c60005, 0x0e00064a, 0x00063082, 0x8f640004, 0x8f430108, 0x3c021000,
+       0x00621824, 0xa7840020, 0x10600008, 0x00000000, 0x97420104, 0x93830023,
+       0x2442ffec, 0x34630002, 0xa3830023, 0x0a000304, 0x3045ffff, 0x97420104,
+       0x2442fff0, 0x3045ffff, 0x8f620004, 0x3042ffff, 0x2c420013, 0x14400004,
+       0x00000000, 0x93820023, 0x34420001, 0xa3820023, 0x93830023, 0x24020001,
+       0x10620009, 0x28620002, 0x14400014, 0x24020002, 0x10620012, 0x24020003,
+       0x1062000a, 0x00000000, 0x0a000325, 0x00000000, 0x8f82001c, 0x8c43000c,
+       0x3c04ffff, 0x00641824, 0x00651825, 0x0a000325, 0xac43000c, 0x8f82001c,
+       0x8c430010, 0x3c04ffff, 0x00641824, 0x00651825, 0xac430010, 0x8f620004,
+       0x3042ffff, 0x24420002, 0x00021083, 0xa3820038, 0x304500ff, 0x8f82001c,
+       0x3c04ffff, 0x00052880, 0x00a22821, 0x8ca70000, 0x97820020, 0x97430104,
+       0x00e42024, 0x24420002, 0x00621823, 0x00833825, 0xaca70000, 0x93840038,
+       0x26061b90, 0x00041080, 0x00461021, 0x90430000, 0x3063000f, 0x00832021,
+       0xa3840022, 0x308200ff, 0x3c04fff6, 0x24420003, 0x00021080, 0x00461021,
+       0x8c450000, 0x93830022, 0x8f82001c, 0x3484ffff, 0x00a43824, 0x00031880,
+       0x00621821, 0xaf850000, 0xac67000c, 0x93820022, 0x93830022, 0x8f84001c,
+       0x24420003, 0x00021080, 0x00461021, 0x24630004, 0x00031880, 0xac470000,
+       0x93820022, 0x00661821, 0x94670002, 0x00021080, 0x00441021, 0xac670000,
+       0x24030010, 0xac470010, 0xa7430140, 0x24030002, 0xa7400142, 0xa7400144,
+       0xa7430146, 0x97420104, 0x8f840034, 0x24030001, 0x2442fffe, 0x30840006,
+       0xa7420148, 0x24020002, 0xa743014a, 0x1082000d, 0x2c820003, 0x10400005,
+       0x24020004, 0x10800011, 0x3c020009, 0x0a000383, 0x00000000, 0x10820007,
+       0x24020006, 0x1482000d, 0x3c020119, 0x0a00037d, 0x24030001, 0x0a00037c,
+       0x3c020109, 0x3c020019, 0x24030001, 0xaf421000, 0xaf830030, 0x0a000383,
+       0x00000000, 0xaf421000, 0xaf800030, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x93820010, 0x24030008, 0x8f840030, 0x24420002, 0x30420007,
+       0x00621823, 0x30630007, 0xaf83000c, 0x10800005, 0x3c038000, 0x8f421000,
+       0x00431024, 0x1040fffd, 0x00000000, 0x8f820028, 0xaf820018, 0x24420010,
+       0x30421fff, 0xaf820028, 0xaf420084, 0x97430104, 0x24424000, 0x0342d821,
+       0x3063ffff, 0x30620007, 0x10400002, 0x24620007, 0x3043fff8, 0x8f820044,
+       0x8f840004, 0x00431821, 0xaf82002c, 0x0064102b, 0xaf830044, 0x14400002,
+       0x00641023, 0xaf820044, 0x8f840044, 0x34028000, 0x8fbf0014, 0x8fb00010,
+       0x00821021, 0x03421821, 0x3c021000, 0xaf83001c, 0xaf440080, 0xaf420178,
+       0x03e00008, 0x27bd0018, 0x8f820024, 0x27bdffe8, 0xafbf0014, 0x14400004,
+       0xafb00010, 0x0000000d, 0x00000000, 0x240002db, 0x8f620004, 0x04410009,
+       0x3c050800, 0x93820022, 0x8f830000, 0x24a41b90, 0xaf800024, 0x24420003,
+       0x00021080, 0x00441021, 0xac430000, 0x93820038, 0x24a51b90, 0x93860010,
+       0x3c040001, 0x27700008, 0x24420001, 0x00021080, 0x00451021, 0x8c430000,
+       0x24c60005, 0x00063082, 0x00641821, 0x02002021, 0x0e00064a, 0xac430000,
+       0x93840022, 0x3c057fff, 0x8f620004, 0x00042080, 0x00902021, 0x8c830004,
+       0x34a5ffff, 0x00451024, 0x00621821, 0xac830004, 0x93850038, 0x3c07ffff,
+       0x93840010, 0x00052880, 0x00b02821, 0x8ca30000, 0x97420104, 0x97860020,
+       0x00671824, 0x00441021, 0x00461023, 0x3042ffff, 0x00621825, 0xaca30000,
+       0x93830023, 0x24020001, 0x10620009, 0x28620002, 0x1440001a, 0x24020002,
+       0x10620018, 0x24020003, 0x1062000d, 0x00000000, 0x0a000411, 0x00000000,
+       0x93820010, 0x97430104, 0x8e04000c, 0x00621821, 0x2463fff2, 0x3063ffff,
+       0x00872024, 0x00832025, 0x0a000411, 0xae04000c, 0x93820010, 0x97430104,
+       0x8e040010, 0x00621821, 0x2463ffee, 0x3063ffff, 0x00872024, 0x00832025,
+       0xae040010, 0x9783000e, 0x8f840034, 0x2402000a, 0xa7420140, 0xa7430142,
+       0x93820010, 0xa7420144, 0xa7400146, 0x97430104, 0x30840006, 0x24020001,
+       0xa7430148, 0xa742014a, 0x24020002, 0x1082000d, 0x2c820003, 0x10400005,
+       0x24020004, 0x10800011, 0x3c020041, 0x0a000437, 0x00000000, 0x10820007,
+       0x24020006, 0x1482000d, 0x3c020151, 0x0a000431, 0x24030001, 0x0a000430,
+       0x3c020141, 0x3c020051, 0x24030001, 0xaf421000, 0xaf830030, 0x0a000437,
+       0x00000000, 0xaf421000, 0xaf800030, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x8f820030, 0x93840010, 0x8f850028, 0x10400005, 0x3c038000,
+       0x8f421000, 0x00431024, 0x1040fffd, 0x00000000, 0x2483000a, 0x30620007,
+       0x10400002, 0x24620007, 0x304303f8, 0x00a31021, 0x30421fff, 0xaf850018,
+       0xaf820028, 0xaf420084, 0x97430104, 0x24424000, 0x0342d821, 0x3063ffff,
+       0x30620007, 0x10400002, 0x24620007, 0x3043fff8, 0x8f820044, 0x8f840004,
+       0x00431821, 0xaf82002c, 0x0064102b, 0xaf830044, 0x14400002, 0x00641023,
+       0xaf820044, 0x8f840044, 0x34028000, 0x8fbf0014, 0x8fb00010, 0x00821021,
+       0x03421821, 0x3c021000, 0xaf83001c, 0xaf440080, 0xaf420178, 0x03e00008,
+       0x27bd0018, 0x3c026000, 0x8c444448, 0x3c030800, 0xac64082c, 0x8f620000,
+       0x97430104, 0x3c048000, 0x3046ffff, 0x3067ffff, 0x8f420178, 0x00441024,
+       0x1440fffd, 0x2402000a, 0x30c30007, 0xa7420140, 0x24020008, 0x00431023,
+       0x30420007, 0x24c3fffe, 0xa7420142, 0xa7430144, 0xa7400146, 0xa7470148,
+       0x8f420108, 0x3c036000, 0x8f850034, 0x30420020, 0x0002102b, 0x00021023,
+       0x30420009, 0x34420001, 0xa742014a, 0x8c644448, 0x3c020800, 0x30a50006,
+       0xac440830, 0x24020002, 0x10a2000d, 0x2ca20003, 0x10400005, 0x24020004,
+       0x10a00011, 0x3c020041, 0x0a0004a8, 0x00000000, 0x10a20007, 0x24020006,
+       0x14a2000d, 0x3c020151, 0x0a0004a2, 0x24030001, 0x0a0004a1, 0x3c020141,
+       0x3c020051, 0x24030001, 0xaf421000, 0xaf830030, 0x0a0004a8, 0x00000000,
+       0xaf421000, 0xaf800030, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x8f820030, 0x24c30008, 0x10400006, 0x30e6ffff, 0x3c048000, 0x8f421000,
+       0x00441024, 0x1040fffd, 0x00000000, 0x3c026000, 0x8c444448, 0x3065ffff,
+       0x3c020800, 0x30a30007, 0x10600003, 0xac440834, 0x24a20007, 0x3045fff8,
+       0x8f840028, 0x00851021, 0x30421fff, 0x24434000, 0x0343d821, 0x30c30007,
+       0xaf840018, 0xaf820028, 0xaf420084, 0x10600002, 0x24c20007, 0x3046fff8,
+       0x8f820044, 0x8f840004, 0x00461821, 0xaf82002c, 0x0064102b, 0xaf830044,
+       0x14400002, 0x00641023, 0xaf820044, 0x8f840044, 0x34028000, 0x3c030800,
+       0x8c650844, 0x00821021, 0x03421821, 0xaf83001c, 0xaf440080, 0x10a00006,
+       0x2402000e, 0x93830043, 0x14620004, 0x3c021000, 0x2402043f, 0xa7420148,
+       0x3c021000, 0x3c036000, 0xaf420178, 0x8c644448, 0x3c020800, 0x03e00008,
+       0xac440838, 0x8f820034, 0x30424000, 0x10400005, 0x24020800, 0x0000000d,
+       0x00000000, 0x24000405, 0x24020800, 0xaf420178, 0x97440104, 0x3c030008,
+       0xaf430140, 0x8f820034, 0x30420001, 0x10400006, 0x3085ffff, 0x24020002,
+       0x24a3fffe, 0xa7420146, 0x0a0004ff, 0xa7430148, 0xa7400146, 0x8f840028,
+       0x2402000d, 0xa742014a, 0x24830008, 0x30631fff, 0x24624000, 0x0342d821,
+       0x30a20007, 0xaf840018, 0xaf830028, 0xaf430084, 0x10400002, 0x24a20007,
+       0x3045fff8, 0x8f820044, 0x8f840004, 0x00451821, 0xaf82002c, 0x0064102b,
+       0xaf830044, 0x14400002, 0x00641023, 0xaf820044, 0x8f840044, 0x34028000,
+       0x00821021, 0x03421821, 0x3c021000, 0xaf83001c, 0xaf440080, 0x03e00008,
+       0xaf420178, 0x27bdffe8, 0x3c046008, 0xafbf0014, 0xafb00010, 0x8c825000,
+       0x3c1a8000, 0x2403ff7f, 0x375b4000, 0x00431024, 0x3442380c, 0xac825000,
+       0x8f430008, 0x3c100800, 0x37428000, 0x34630001, 0xaf430008, 0xaf82001c,
+       0x3c02601c, 0xaf800028, 0xaf400080, 0xaf400084, 0x8c450008, 0x3c036000,
+       0x8c620808, 0x3c040800, 0x3c030080, 0xac830820, 0x3042fff0, 0x38420010,
+       0x2c420001, 0xaf850004, 0xaf820008, 0x0e00062f, 0x00000000, 0x8f420000,
+       0x30420001, 0x1040fffb, 0x00000000, 0x8f440108, 0x30822000, 0xaf840034,
+       0x10400004, 0x8e02083c, 0x24420001, 0x0a00059d, 0xae02083c, 0x30820200,
+       0x10400027, 0x00000000, 0x97420104, 0x1040001c, 0x30824000, 0x14400005,
+       0x00000000, 0x0e00022d, 0x00000000, 0x0a000592, 0x00000000, 0x8f620008,
+       0x8f630000, 0x24020030, 0x00031e02, 0x306300f0, 0x10620007, 0x28620031,
+       0x14400031, 0x24020040, 0x10620007, 0x00000000, 0x0a000592, 0x00000000,
+       0x0e0002dd, 0x00000000, 0x0a000592, 0x00000000, 0x0e0003b8, 0x00000000,
+       0x0a000592, 0x00000000, 0x30820040, 0x1440002d, 0x00000000, 0x0000000d,
+       0x00000000, 0x240004a6, 0x0a00059d, 0x00000000, 0x8f430100, 0x24020d00,
+       0x1462000f, 0x30820006, 0x97420104, 0x10400005, 0x30820040, 0x0e0004e9,
+       0x00000000, 0x0a000592, 0x00000000, 0x1440001b, 0x00000000, 0x0000000d,
+       0x00000000, 0x240004b8, 0x0a00059d, 0x00000000, 0x1040000e, 0x30821000,
+       0x10400005, 0x00000000, 0x0e00065d, 0x00000000, 0x0a000592, 0x00000000,
+       0x0e00046b, 0x00000000, 0x8f820040, 0x24420001, 0xaf820040, 0x0a00059d,
+       0x00000000, 0x30820040, 0x14400004, 0x00000000, 0x0000000d, 0x00000000,
+       0x240004cf, 0x8f420138, 0x3c034000, 0x00431025, 0xaf420138, 0x0a00053f,
+       0x00000000, 0x3c046008, 0x8c835000, 0x3c1a8000, 0x2402ff7f, 0x375b4000,
+       0x00621824, 0x3463380c, 0xac835000, 0x8f420008, 0x3c056000, 0x3c03601c,
+       0x34420001, 0xaf420008, 0x37428000, 0xaf800028, 0xaf82001c, 0xaf400080,
+       0xaf400084, 0x8c660008, 0x8ca20808, 0x3c040800, 0x3c030080, 0xac830820,
+       0x3042fff0, 0x38420010, 0x2c420001, 0xaf860004, 0xaf820008, 0x03e00008,
+       0x00000000, 0x3084ffff, 0x30820007, 0x10400002, 0x24820007, 0x3044fff8,
+       0x8f820028, 0x00441821, 0x30631fff, 0x24644000, 0x0344d821, 0xaf820018,
+       0xaf830028, 0x03e00008, 0xaf430084, 0x3084ffff, 0x30820007, 0x10400002,
+       0x24820007, 0x3044fff8, 0x8f820044, 0x8f830004, 0x00442021, 0xaf82002c,
+       0x0083102b, 0xaf840044, 0x14400002, 0x00831023, 0xaf820044, 0x8f820044,
+       0x34038000, 0x00431821, 0x03432021, 0xaf84001c, 0x03e00008, 0xaf420080,
+       0x8f830034, 0x24020002, 0x30630006, 0x1062000d, 0x2c620003, 0x50400005,
+       0x24020004, 0x10600012, 0x3c020001, 0x0a000601, 0x00000000, 0x10620007,
+       0x24020006, 0x1462000f, 0x3c020111, 0x0a0005f9, 0x00821025, 0x0a0005f8,
+       0x3c020101, 0x3c020011, 0x00821025, 0x24030001, 0xaf421000, 0xaf830030,
+       0x0a000601, 0x00000000, 0x00821025, 0xaf421000, 0xaf800030, 0x00000000,
+       0x00000000, 0x00000000, 0x03e00008, 0x00000000, 0x8f820030, 0x10400005,
+       0x3c038000, 0x8f421000, 0x00431024, 0x1040fffd, 0x00000000, 0x03e00008,
+       0x00000000, 0x8f820034, 0x27bdffe8, 0x30424000, 0x14400005, 0xafbf0010,
+       0x0e00022d, 0x00000000, 0x0a00062d, 0x8fbf0010, 0x8f620008, 0x8f630000,
+       0x24020030, 0x00031e02, 0x306300f0, 0x10620008, 0x28620031, 0x1440000d,
+       0x8fbf0010, 0x24020040, 0x10620007, 0x00000000, 0x0a00062d, 0x00000000,
+       0x0e0002dd, 0x00000000, 0x0a00062d, 0x8fbf0010, 0x0e0003b8, 0x00000000,
+       0x8fbf0010, 0x03e00008, 0x27bd0018, 0x8f84003c, 0x1080000f, 0x3c026000,
+       0x8c430c3c, 0x30630fff, 0xaf830014, 0x14600011, 0x3082000f, 0x10400005,
+       0x308200f0, 0x10400003, 0x30820f00, 0x14400006, 0x00000000, 0x0000000d,
+       0x00000000, 0x2400050e, 0x03e00008, 0x00000000, 0x0000000d, 0x00000000,
+       0x24000513, 0x03e00008, 0x00000000, 0xaf83003c, 0x03e00008, 0x00000000,
+       0x10c00007, 0x00000000, 0x8ca20000, 0x24c6ffff, 0x24a50004, 0xac820000,
+       0x14c0fffb, 0x24840004, 0x03e00008, 0x00000000, 0x0a000659, 0x00a01021,
+       0xac860000, 0x24840004, 0x00a01021, 0x1440fffc, 0x24a5ffff, 0x03e00008,
+       0x00000000, 0x0000000d, 0x03e00008, 0x00000000, 0x3c040800, 0x8c82084c,
+       0x54400007, 0xac80084c, 0x8f820034, 0x24030400, 0x30420c00, 0x1443005b,
+       0x00000000, 0xac80084c, 0x0000000d, 0x00000000, 0x2400003c, 0x3c026000,
+       0x8c444448, 0x3c030800, 0xac640850, 0x24000043, 0x97420104, 0x3045ffff,
+       0x000530c2, 0x24a2007f, 0x000239c2, 0x2400004e, 0x3c046020, 0x24030020,
+       0xac830000, 0x8c820000, 0x30420020, 0x10400005, 0x3c036020, 0x8c620000,
+       0x30420020, 0x1440fffd, 0x00000000, 0x3c026020, 0x8c430010, 0x24040001,
+       0x0087102b, 0x30ea007f, 0x24abfffe, 0x10400010, 0x00034240, 0x3c056020,
+       0x24090020, 0xaca90000, 0x8ca20000, 0x30420020, 0x10400006, 0x24840001,
+       0x3c036020, 0x8c620000, 0x30420020, 0x1440fffd, 0x00000000, 0x0087102b,
+       0x1440fff4, 0x00000000, 0x8f85001c, 0x3c026020, 0x8c430010, 0x3c046020,
+       0x34848000, 0x006a1825, 0x01034025, 0x2400006b, 0x10c0000b, 0x00000000,
+       0x8ca30000, 0x24a50004, 0x8ca20000, 0x24a50004, 0x24c6ffff, 0xac820000,
+       0x24840004, 0xac830000, 0x14c0fff7, 0x24840004, 0x24000077, 0x3c020007,
+       0x34427700, 0x3c036000, 0xac6223c8, 0xac6b23cc, 0xac6823e4, 0x24000086,
+       0x3c046000, 0x3c038000, 0x8c8223f8, 0x00431024, 0x1440fffd, 0x3c021000,
+       0x3c056000, 0x24030019, 0xaca223f8, 0xa743014a, 0x8ca44448, 0x3c020800,
+       0xac440854, 0x03e00008, 0x00000000, 0x00000000 };
+
+static u32 bnx2_TPAT_b06FwData[(0x0/4) + 1] = { 0x00000000 };
+static u32 bnx2_TPAT_b06FwRodata[(0x0/4) + 1] = { 0x00000000 };
+static u32 bnx2_TPAT_b06FwBss[(0x80/4) + 1] = { 0x00000000 };
+static u32 bnx2_TPAT_b06FwSbss[(0x48/4) + 1] = { 0x00000000 };
+
+static int bnx2_TXP_b06FwReleaseMajor = 0x0;
+static int bnx2_TXP_b06FwReleaseMinor = 0x0;
+static int bnx2_TXP_b06FwReleaseFix = 0x0;
+static u32 bnx2_TXP_b06FwStartAddr = 0x08002090;
+static u32 bnx2_TXP_b06FwTextAddr = 0x08000000;
+static int bnx2_TXP_b06FwTextLen = 0x3ffc;
+static u32 bnx2_TXP_b06FwDataAddr = 0x08004020;
+static int bnx2_TXP_b06FwDataLen = 0x0;
+static u32 bnx2_TXP_b06FwRodataAddr = 0x00000000;
+static int bnx2_TXP_b06FwRodataLen = 0x0;
+static u32 bnx2_TXP_b06FwBssAddr = 0x08004060;
+static int bnx2_TXP_b06FwBssLen = 0x194;
+static u32 bnx2_TXP_b06FwSbssAddr = 0x08004020;
+static int bnx2_TXP_b06FwSbssLen = 0x34;
+static u32 bnx2_TXP_b06FwText[(0x3ffc/4) + 1] = {
+       0x0a000824, 0x00000000, 0x00000000, 0x0000000d, 0x74787020, 0x302e362e,
+       0x39000000, 0x00060900, 0x0000000a, 0x000003e8, 0x0000ea60, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x10000003, 0x00000000, 0x0000000d,
+       0x0000000d, 0x3c020800, 0x24424020, 0x3c030800, 0x246341f4, 0xac400000,
+       0x0043202b, 0x1480fffd, 0x24420004, 0x3c1d0800, 0x37bd7ffc, 0x03a0f021,
+       0x3c100800, 0x26102090, 0x3c1c0800, 0x279c4020, 0x0e000a0e, 0x00000000,
+       0x0000000d, 0x8f840014, 0x27bdffe8, 0xafb00010, 0x8f460104, 0x8f830008,
+       0x8c8500ac, 0xaf430080, 0x948200a8, 0xa7420e10, 0x948300aa, 0xa7430e12,
+       0x8c8200ac, 0xaf420e18, 0x97430e10, 0xa7430e14, 0x97420e12, 0xa7420e16,
+       0x8f430e18, 0x00005021, 0x00c53023, 0x10c001a3, 0xaf430e1c, 0x240f0800,
+       0x3c0e1000, 0x2419fff8, 0x24100010, 0x3c188100, 0x93620008, 0x10400009,
+       0x00000000, 0x97620010, 0x00c2102b, 0x14400005, 0x00000000, 0x97620010,
+       0x3042ffff, 0x0a000862, 0xaf420e00, 0xaf460e00, 0x8f420000, 0x30420008,
+       0x1040fffd, 0x00000000, 0x97420e08, 0x8f450e04, 0x3044ffff, 0x30820001,
+       0x14400005, 0x00000000, 0x14a00005, 0x3083a040, 0x0a0009e6, 0x00000000,
+       0x0000000d, 0x3083a040, 0x24020040, 0x14620049, 0x3082a000, 0x8f87000c,
+       0x30880036, 0x30890008, 0xaf4f0178, 0x00e01821, 0x9742008a, 0x00431023,
+       0x2442ffff, 0x30421fff, 0x2c420008, 0x1440fffa, 0x00000000, 0x8f830018,
+       0x00a05021, 0x00c53023, 0x24e24000, 0x03422821, 0x306b00ff, 0x24630001,
+       0xaf830018, 0x93840012, 0x000b1400, 0x3c030100, 0x00431025, 0xaca20000,
+       0x8f820018, 0x30840007, 0x00042240, 0x34870001, 0x00e83825, 0x1120000f,
+       0xaca20004, 0x97430e0a, 0x8f84000c, 0x00ee3825, 0x2402000e, 0x00781825,
+       0xaf430160, 0x25430006, 0x24840008, 0x30841fff, 0xa742015a, 0xa7430158,
+       0xaf84000c, 0x0a0008a9, 0x00000000, 0x8f83000c, 0x25420002, 0xa7420158,
+       0x24630008, 0x30631fff, 0xaf83000c, 0x54c0000c, 0x8f420e14, 0x97420e10,
+       0x97430e12, 0x8f840014, 0x00021400, 0x00621825, 0xac8300a8, 0x8f850014,
+       0x8f420e18, 0x34e70040, 0xaca200ac, 0x8f420e14, 0x8f430e1c, 0xaf420144,
+       0xaf430148, 0xa34b0152, 0xaf470154, 0x0a0009f1, 0xaf4e0178, 0x10400128,
+       0x00000000, 0x97620010, 0x00a2102b, 0x10400003, 0x30820040, 0x10400122,
+       0x00000000, 0xafa60008, 0xa7840010, 0xaf850004, 0x93620008, 0x1440005e,
+       0x27ac0008, 0xaf60000c, 0x97820010, 0x30424000, 0x10400002, 0x2403000e,
+       0x24030016, 0xa363000a, 0x24034007, 0xaf630014, 0x93820012, 0x8f630014,
+       0x30420007, 0x00021240, 0x00621825, 0xaf630014, 0x97820010, 0x8f630014,
+       0x30420010, 0x00621825, 0xaf630014, 0x97820010, 0x30420008, 0x5040000e,
+       0x00002821, 0x8f620014, 0x004e1025, 0xaf620014, 0x97430e0a, 0x2402000e,
+       0x00781825, 0xaf630004, 0xa3620002, 0x9363000a, 0x3405fffc, 0x24630004,
+       0x0a0008f2, 0xa363000a, 0xaf600004, 0xa3600002, 0x97820010, 0x9363000a,
+       0x30421f00, 0x00021182, 0x24420028, 0x00621821, 0xa3630009, 0x97420e0c,
+       0xa7620010, 0x93630009, 0x24020008, 0x24630002, 0x30630007, 0x00431023,
+       0x30420007, 0xa362000b, 0x93640009, 0x97620010, 0x8f890004, 0x97830010,
+       0x00441021, 0x00a21021, 0x30630040, 0x10600006, 0x3045ffff, 0x15250005,
+       0x0125102b, 0x3c068000, 0x0a000925, 0x00005821, 0x0125102b, 0x144000c8,
+       0x00005021, 0x97420e14, 0xa7420e10, 0x97430e16, 0xa7430e12, 0x8f420e1c,
+       0xaf420e18, 0xaf450e00, 0x8f420000, 0x30420008, 0x1040fffd, 0x00000000,
+       0x97420e08, 0x00a04821, 0xa7820010, 0x8f430e04, 0x00003021, 0x240b0001,
+       0xaf830004, 0x97620010, 0x0a000936, 0x304dffff, 0x8f890004, 0x97820010,
+       0x30420040, 0x10400004, 0x01206821, 0x3c068000, 0x0a000936, 0x00005821,
+       0x97630010, 0x8f820004, 0x144300a7, 0x00005021, 0x00003021, 0x240b0001,
+       0x8d820000, 0x00491023, 0x1440000d, 0xad820000, 0x8f620014, 0x34420040,
+       0xaf620014, 0x97430e10, 0x97420e12, 0x8f840014, 0x00031c00, 0x00431025,
+       0xac8200a8, 0x8f830014, 0x8f420e18, 0xac6200ac, 0x93620008, 0x1440003f,
+       0x00000000, 0x25260002, 0x8f84000c, 0x9743008a, 0x3063ffff, 0xafa30000,
+       0x8fa20000, 0x00441023, 0x2442ffff, 0x30421fff, 0x2c420010, 0x1440fff7,
+       0x00000000, 0x8f82000c, 0x8f830018, 0x00021082, 0x00021080, 0x24424000,
+       0x03422821, 0x00605021, 0x24630001, 0x314200ff, 0x00021400, 0xaf830018,
+       0x3c033200, 0x00431025, 0xaca20000, 0x93630009, 0x9362000a, 0x00031c00,
+       0x00431025, 0xaca20004, 0x8f830018, 0xaca30008, 0x97820010, 0x30420008,
+       0x10400002, 0x00c04021, 0x25280006, 0x97430e14, 0x93640002, 0x8f450e1c,
+       0x8f660004, 0x8f670014, 0xaf4f0178, 0x3063ffff, 0xa7430144, 0x97420e16,
+       0xa7420146, 0xaf450148, 0xa34a0152, 0x8f82000c, 0x308400ff, 0xa744015a,
+       0xaf460160, 0xa7480158, 0xaf470154, 0xaf4e0178, 0x00501021, 0x30421fff,
+       0xaf82000c, 0x0a0009c5, 0x8d820000, 0x93620009, 0x9363000b, 0x8f85000c,
+       0x2463000a, 0x00435021, 0x25440007, 0x00992024, 0x9743008a, 0x3063ffff,
+       0xafa30000, 0x8fa20000, 0x00451023, 0x2442ffff, 0x30421fff, 0x0044102b,
+       0x1440fff7, 0x00000000, 0x8f82000c, 0x8f840018, 0x00021082, 0x00021080,
+       0x24424000, 0x03422821, 0x00804021, 0x24840001, 0xaf840018, 0x93630009,
+       0x310200ff, 0x00022400, 0x3c024100, 0x24630002, 0x00621825, 0x00832025,
+       0xaca40000, 0x8f62000c, 0x00461025, 0xaca20004, 0x97430e14, 0x93640002,
+       0x8f450e1c, 0x8f660004, 0x8f670014, 0xaf4f0178, 0x3063ffff, 0xa7430144,
+       0x97420e16, 0x308400ff, 0xa7420146, 0xaf450148, 0xa3480152, 0x8f83000c,
+       0x25420007, 0x00591024, 0xa744015a, 0xaf460160, 0xa7490158, 0xaf470154,
+       0xaf4e0178, 0x00621821, 0x30631fff, 0xaf83000c, 0x8d820000, 0x14400005,
+       0x00000000, 0x8f620014, 0x2403ffbf, 0x00431024, 0xaf620014, 0x8f62000c,
+       0x004d1021, 0xaf62000c, 0x93630008, 0x14600008, 0x00000000, 0x11600006,
+       0x00000000, 0x8f630014, 0x3c02efff, 0x3442fffe, 0x00621824, 0xaf630014,
+       0xa36b0008, 0x01205021, 0x15400016, 0x8fa60008, 0x97420e14, 0x97430e16,
+       0x8f850014, 0x00021400, 0x00621825, 0xaca300a8, 0x8f840014, 0x8f420e1c,
+       0x0a0009f3, 0xac8200ac, 0x97420e14, 0x97430e16, 0x8f840014, 0x00021400,
+       0x00621825, 0xac8300a8, 0x8f850014, 0x8f420e1c, 0x00005021, 0x0a0009f3,
+       0xaca200ac, 0x14c0fe64, 0x00000000, 0x55400018, 0x8fb00010, 0x3c038000,
+       0x8f420178, 0x00431024, 0x1440fffd, 0x00000000, 0x97430e14, 0x8f440e1c,
+       0x24020800, 0xaf420178, 0x3063ffff, 0xa7430144, 0x97420e16, 0x3c031000,
+       0xa7420146, 0x24020240, 0xaf440148, 0xa3400152, 0xa740015a, 0xaf400160,
+       0xa7400158, 0xaf420154, 0xaf430178, 0x8fb00010, 0x03e00008, 0x27bd0018,
+       0x27bdffd8, 0x3c1a8000, 0x3c0420ff, 0x3484fffd, 0x3c020008, 0x03421821,
+       0xafbf0020, 0xafb3001c, 0xafb20018, 0xafb10014, 0xafb00010, 0xaf830014,
+       0xaf440e00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x3c0200ff, 0x3442fffd, 0x3c046004, 0xaf420e00, 0x8c835000, 0x24130d00,
+       0x3c120800, 0x3c114000, 0x2402ff7f, 0x00621824, 0x3463380c, 0x24020009,
+       0xac835000, 0xaf420008, 0xaf800018, 0xaf80000c, 0x0e000fa1, 0x00000000,
+       0x0e000a96, 0x00000000, 0x3c020800, 0x24504080, 0x8f420000, 0x30420001,
+       0x1040fffd, 0x00000000, 0x8f440100, 0xaf840008, 0xaf440020, 0x93430108,
+       0xa3830012, 0x93820012, 0x30420001, 0x10400008, 0x00000000, 0x93820012,
+       0x30420006, 0x00021100, 0x0e00083b, 0x0050d821, 0x0a000a52, 0x00000000,
+       0x14930005, 0x00000000, 0x0e00083b, 0x265b4100, 0x0a000a52, 0x00000000,
+       0x0e000ba3, 0x00000000, 0xaf510138, 0x0a000a36, 0x00000000, 0x27bdfff8,
+       0x3084ffff, 0x24820007, 0x3044fff8, 0x8f85000c, 0x9743008a, 0x3063ffff,
+       0xafa30000, 0x8fa20000, 0x00451023, 0x2442ffff, 0x30421fff, 0x0044102b,
+       0x1440fff7, 0x00000000, 0x8f82000c, 0x00021082, 0x00021080, 0x24424000,
+       0x03421021, 0x03e00008, 0x27bd0008, 0x3084ffff, 0x8f82000c, 0x24840007,
+       0x3084fff8, 0x00441021, 0x30421fff, 0xaf82000c, 0x03e00008, 0x00000000,
+       0x27bdffe8, 0x3c1a8000, 0x3c0420ff, 0x3484fffd, 0x3c020008, 0x03421821,
+       0xafbf0010, 0xaf830014, 0xaf440e00, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x3c0200ff, 0x3442fffd, 0x3c046004, 0xaf420e00,
+       0x8c825000, 0x2403ff7f, 0x00431024, 0x3442380c, 0x24030009, 0xac825000,
+       0xaf430008, 0xaf800018, 0xaf80000c, 0x0e000fa1, 0x00000000, 0x0e000a96,
+       0x00000000, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x27bdffe8, 0x3c02000a,
+       0x03421821, 0x3c040800, 0x24844120, 0x24050018, 0xafbf0010, 0xaf830024,
+       0x0e000fad, 0x00003021, 0x3c050800, 0x3c020800, 0x24423d60, 0xaca24180,
+       0x24a54180, 0x3c020800, 0x24423e18, 0x3c030800, 0x24633e2c, 0x3c040800,
+       0xaca20004, 0x3c020800, 0x24423d68, 0xaca30008, 0xac824190, 0x24844190,
+       0x3c020800, 0x24423da4, 0x3c070800, 0x24e73de4, 0x3c060800, 0x24c63e40,
+       0x3c050800, 0x24a52b28, 0x3c030800, 0xac820004, 0x3c020800, 0x24423e48,
+       0xac870008, 0xac86000c, 0xac850010, 0xac6241b0, 0x246341b0, 0x8fbf0010,
+       0x3c020800, 0x24423e60, 0xac620004, 0xac670008, 0xac66000c, 0xac650010,
+       0x03e00008, 0x27bd0018, 0x27bdffc8, 0x3c020800, 0x24424120, 0xafbf0030,
+       0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, 0x90470021, 0x8c510008,
+       0x8c45001c, 0x8f900020, 0x3c060800, 0x3c038000, 0x8f420178, 0x00431024,
+       0x1440fffd, 0x8cc2414c, 0x24c3414c, 0x2473ffd4, 0xaf420144, 0x8e620030,
+       0x30b22000, 0xaf420148, 0x3c021000, 0xaf50014c, 0xa3470152, 0xa7510158,
+       0xaf450154, 0xaf420178, 0x12400004, 0x3c030800, 0x8c620030, 0x24420001,
+       0xac620030, 0x93420109, 0x9344010a, 0x00111c00, 0xafa30018, 0x00071a00,
+       0xafa50014, 0x8cc5414c, 0x00021600, 0x00042400, 0x00441025, 0x00431025,
+       0xafa20010, 0x8f440100, 0x8e660030, 0x0e000fe1, 0x02003821, 0x1640000e,
+       0x8fbf0030, 0x8f820000, 0x8e630030, 0x8c44017c, 0x02031823, 0x00711823,
+       0x00641823, 0x2c630002, 0x14600006, 0x8fb3002c, 0x0000000d, 0x00000000,
+       0x240000ca, 0x8fbf0030, 0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020,
+       0x03e00008, 0x27bd0038, 0x974309da, 0x00804021, 0xad030000, 0x8f4209dc,
+       0xad020004, 0x8f4309e0, 0xad030008, 0x934409d9, 0x24020001, 0x30840003,
+       0x1082001f, 0x30a900ff, 0x28820002, 0x10400005, 0x24020002, 0x10800009,
+       0x3c0a0800, 0x0a000b64, 0x93420934, 0x1082000b, 0x24020003, 0x10820026,
+       0x3c0a0800, 0x0a000b64, 0x93420934, 0x974209e4, 0x00021400, 0x34420800,
+       0xad02000c, 0x0a000b63, 0x25080010, 0x974209e4, 0x00021400, 0x34428100,
+       0xad02000c, 0x974309e8, 0x3c0a0800, 0x00031c00, 0x34630800, 0xad030010,
+       0x0a000b63, 0x25080014, 0x974409e4, 0x3c050800, 0x24a24120, 0x94430018,
+       0x94460010, 0x9447000c, 0x00a05021, 0x24020800, 0xad000010, 0xad020014,
+       0x00042400, 0x00661821, 0x00671823, 0x2463fff2, 0x00832025, 0xad04000c,
+       0x0a000b63, 0x25080018, 0x974209e4, 0x3c050800, 0x00021400, 0x34428100,
+       0xad02000c, 0x974409e8, 0x24a24120, 0x94430018, 0x94460010, 0x9447000c,
+       0x00a05021, 0x24020800, 0xad000014, 0xad020018, 0x00042400, 0x00661821,
+       0x00671823, 0x2463ffee, 0x00832025, 0xad040010, 0x2508001c, 0x93420934,
+       0x93450921, 0x3c074000, 0x25444120, 0x94830014, 0x94860010, 0x00021082,
+       0x00021600, 0x00052c00, 0x00a72825, 0x00451025, 0x00661821, 0x00431025,
+       0xad020000, 0x97830028, 0x974209ea, 0x00621821, 0x00031c00, 0xad030004,
+       0x97820028, 0x24420001, 0x30427fff, 0xa7820028, 0x93430920, 0x3c020006,
+       0x00031e00, 0x00621825, 0xad030008, 0x8f42092c, 0xad02000c, 0x8f430930,
+       0xad030010, 0x8f440938, 0x25080014, 0xad040000, 0x8f820020, 0x11200004,
+       0xad020004, 0x8f420940, 0x0a000b8d, 0x2442ffff, 0x8f420940, 0xad020008,
+       0x8f440948, 0x8f420940, 0x93430936, 0x00822823, 0x00652806, 0x3402ffff,
+       0x0045102b, 0x54400001, 0x3405ffff, 0x93420937, 0x25444120, 0x90830020,
+       0xad000010, 0x00021700, 0x34630010, 0x00031c00, 0x00431025, 0x00451025,
+       0xad02000c, 0x03e00008, 0x25020014, 0x27bdffb0, 0x3c020008, 0x03421821,
+       0xafbf004c, 0xafbe0048, 0xafb70044, 0xafb60040, 0xafb5003c, 0xafb40038,
+       0xafb30034, 0xafb20030, 0xafb1002c, 0xafb00028, 0xaf830000, 0x24020040,
+       0xaf420814, 0xaf400810, 0x8f420944, 0x8f430950, 0x8f440954, 0x8f45095c,
+       0xaf820030, 0xaf830020, 0xaf84001c, 0xaf85002c, 0x93430900, 0x24020020,
+       0x10620005, 0x24020030, 0x10620022, 0x3c030800, 0x0a000bf1, 0x8c62002c,
+       0x24020088, 0xaf420818, 0x3c020800, 0x24424180, 0xafa20020, 0x93430109,
+       0x3c020800, 0x10600009, 0x24574190, 0x3c026000, 0x24030100, 0xac43081c,
+       0x3c030001, 0xac43081c, 0x0000000d, 0x00000000, 0x2400031d, 0x9342010a,
+       0x30420080, 0x1440001c, 0x00000000, 0x3c026000, 0x24030100, 0xac43081c,
+       0x3c030001, 0xac43081c, 0x0000000d, 0x00000000, 0x24000324, 0x0a000bf4,
+       0x00000000, 0x93430109, 0x3063007f, 0x00031140, 0x000318c0, 0x00431021,
+       0x24430088, 0xaf430818, 0x0000000d, 0x3c020800, 0x244241d0, 0x3c030800,
+       0x247741e0, 0x0a000bf4, 0xafa20020, 0x24420001, 0x0a000f4c, 0xac62002c,
+       0x8f840000, 0x8f850020, 0x24020800, 0xaf420178, 0x8f4209a4, 0x8c83017c,
+       0x00a21023, 0x00431023, 0x2c420002, 0x14400004, 0x00000000, 0x0000000d,
+       0x00000000, 0x24000349, 0x8f420104, 0x8f430988, 0x00431023, 0x58400005,
+       0x8f4209a0, 0x0000000d, 0x00000000, 0x2400034d, 0x8f4209a0, 0x3c100800,
+       0xae02414c, 0x8f4309a4, 0x2604414c, 0x2491ffd4, 0xae230030, 0x8f420104,
+       0xae250024, 0x00431023, 0xac82ffd4, 0x8fa30020, 0x8c620000, 0x0040f809,
+       0x0200b021, 0x00409021, 0x32440010, 0x32420002, 0x10400007, 0xafa40024,
+       0x8e22001c, 0x32500040, 0x2403ffbf, 0x00431024, 0x0a000f13, 0xae22001c,
+       0x32420020, 0x10400002, 0x3c020800, 0x245741b0, 0x32420001, 0x14400007,
+       0x00000000, 0x8f820008, 0xaf420080, 0x8ec3414c, 0xaf430e10, 0x8e220030,
+       0xaf420e18, 0x9343010b, 0x93420905, 0x30420008, 0x1040003c, 0x307400ff,
+       0x8f820000, 0x8c430074, 0x0460000a, 0x00000000, 0x3c026000, 0x24030100,
+       0xac43081c, 0x3c030001, 0xac43081c, 0x0000000d, 0x00000000, 0x24000384,
+       0x8f820000, 0x9044007b, 0x9343010a, 0x14830027, 0x32500040, 0x24072000,
+       0x3c090800, 0x3c038000, 0x8f420178, 0x00431024, 0x1440fffd, 0x8ec2414c,
+       0x26c4414c, 0x2484ffd4, 0xaf420144, 0x8c820030, 0x3c030100, 0xaf420148,
+       0x24020047, 0xaf43014c, 0x00001821, 0xa3420152, 0x3c021000, 0xa7430158,
+       0xaf470154, 0xaf420178, 0x8ec5414c, 0x8d230030, 0x8c860030, 0x24630001,
+       0xad230030, 0x93420109, 0x9343010a, 0xafa70014, 0xafa00018, 0x00021600,
+       0x00031c00, 0x00431025, 0x34424700, 0xafa20010, 0x8f440100, 0x0e000fe1,
+       0x3c070100, 0x3c030800, 0x24624120, 0x0a000d01, 0x8c43001c, 0x32820002,
+       0x10400047, 0x3c039000, 0x34630001, 0x8f820008, 0x32500040, 0x3c048000,
+       0x00431025, 0xaf420020, 0x8f420020, 0x00441024, 0x1440fffd, 0x00000000,
+       0x8f830000, 0x90620005, 0x3c058000, 0x34420008, 0xa0620005, 0x8f860000,
+       0x34a50001, 0x8f840008, 0x8cc20074, 0x3c038000, 0x00852025, 0x00431025,
+       0xacc20074, 0xaf440020, 0x90c3007b, 0x9342010a, 0x14620028, 0x3c040800,
+       0x24072000, 0x3c090800, 0x3c038000, 0x8f420178, 0x00431024, 0x1440fffd,
+       0x8ec2414c, 0x26c4414c, 0x2484ffd4, 0xaf420144, 0x8c820030, 0x3c030100,
+       0xaf420148, 0x24020046, 0xaf43014c, 0x00001821, 0xa3420152, 0x3c021000,
+       0xa7430158, 0xaf470154, 0xaf420178, 0x8ec5414c, 0x8d230030, 0x8c860030,
+       0x24630001, 0xad230030, 0x93420109, 0x9343010a, 0xafa70014, 0xafa00018,
+       0x00021600, 0x00031c00, 0x00431025, 0x34424600, 0xafa20010, 0x8f440100,
+       0x0e000fe1, 0x3c070100, 0x3c040800, 0x24824120, 0x0a000d01, 0x8c43001c,
+       0x93420108, 0x30420010, 0x50400050, 0x9343093f, 0x8f860000, 0x90c3007f,
+       0x90c2007e, 0x90c40080, 0x306800ff, 0x00021600, 0x00081c00, 0x00431025,
+       0x00042200, 0x90c3007a, 0x90c5000a, 0x00441025, 0x11050028, 0x00623825,
+       0xa0c8000a, 0x24086000, 0x3c090800, 0x3c038000, 0x8f420178, 0x00431024,
+       0x1440fffd, 0x8ec2414c, 0x26c4414c, 0x2484ffd4, 0xaf420144, 0x8c820030,
+       0x00001821, 0xaf420148, 0x24020052, 0xaf47014c, 0xa3420152, 0x3c021000,
+       0xa7430158, 0xaf480154, 0xaf420178, 0x8ec5414c, 0x8d230030, 0x8c860030,
+       0x24630001, 0xad230030, 0x93420109, 0x9343010a, 0xafa80014, 0xafa00018,
+       0x00021600, 0x00031c00, 0x00431025, 0x34425200, 0xafa20010, 0x0e000fe1,
+       0x8f440100, 0x0a000cfb, 0x00000000, 0x3c026000, 0x24030100, 0xac43081c,
+       0x3c030001, 0xac43081c, 0x0000000d, 0x00000000, 0x240003cd, 0x16800009,
+       0x3c040800, 0x3c030800, 0x24624120, 0x8c43001c, 0x32500040, 0x2404ffbf,
+       0x00641824, 0x0a000f13, 0xac43001c, 0x8c824120, 0x10400005, 0x3c030800,
+       0x8c620034, 0xac804120, 0x24420001, 0xac620034, 0x9343093f, 0x24020012,
+       0x1462000f, 0x329e0038, 0x17c0000c, 0x3c030800, 0x8f830000, 0x8c62004c,
+       0xac62005c, 0x3c020800, 0x24444120, 0x8c82001c, 0x32500040, 0x2403ffbf,
+       0x00431024, 0x0a000f13, 0xac82001c, 0xac604120, 0x97420908, 0x000211c0,
+       0xaf420024, 0x97420908, 0x3c030080, 0x34630003, 0x000211c0, 0xaf42080c,
+       0xaf43081c, 0x974209ec, 0x8f4309a4, 0xa7820028, 0x3c020800, 0x24444120,
+       0xac830028, 0x93420937, 0x93430934, 0x00021080, 0x00621821, 0xa4830014,
+       0x934209d8, 0x00621821, 0xa4830016, 0x934209d8, 0x93430934, 0x00809821,
+       0x00431021, 0x24420010, 0xa4820012, 0x0000a821, 0x24020006, 0x13c00003,
+       0xae62001c, 0x0a000d82, 0x24120008, 0x8f420958, 0x8f830020, 0x8f84002c,
+       0x00431023, 0x00832023, 0x04800003, 0xae620004, 0x04410003, 0x0082102b,
+       0x0a000d4e, 0xae600004, 0x54400001, 0xae640004, 0x8ee20000, 0x0040f809,
+       0x00000000, 0x00409021, 0x32420001, 0x5440001e, 0x8ee20004, 0x8e630008,
+       0x1060002b, 0x3c02c000, 0x00621025, 0xaf420e00, 0x8f420000, 0x30420008,
+       0x1040fffd, 0x00000000, 0x97420e08, 0xa7820010, 0x8f430e04, 0x8e620008,
+       0xaf830004, 0x8f840004, 0x0044102b, 0x1040000b, 0x24150001, 0x24020100,
+       0x3c016000, 0xac22081c, 0x3c020001, 0x3c016000, 0xac22081c, 0x0000000d,
+       0x00000000, 0x24000449, 0x24150001, 0x8ee20004, 0x0040f809, 0x00000000,
+       0x02429025, 0x32420002, 0x5040001d, 0x8f470940, 0x12a00006, 0x8ec2414c,
+       0x8f830000, 0xac6200a8, 0x8f840000, 0x8e620030, 0xac8200ac, 0x32420004,
+       0x50400013, 0x8f470940, 0x3c020800, 0x3283007d, 0x106000fe, 0x245741b0,
+       0x32820001, 0x50400006, 0x36520002, 0x8f830030, 0x8f420940, 0x106200f7,
+       0x00000000, 0x36520002, 0x24020008, 0xa660000c, 0xa662000e, 0xae600008,
+       0xa2600020, 0x8f470940, 0x3c030800, 0x24684120, 0x8d020028, 0x8d050008,
+       0x9504000c, 0x9506000a, 0x95030022, 0x00451021, 0x00862021, 0x00641821,
+       0xaf870030, 0xad020028, 0x32820030, 0x10400006, 0xa5030010, 0x91020020,
+       0x32910040, 0x34420004, 0x0a000dd4, 0xa1020020, 0x93420923, 0x30420040,
+       0x10400029, 0x32910040, 0x8f830000, 0x8f840020, 0x8c620084, 0x00441023,
+       0x0442000a, 0x3c039000, 0x95020010, 0x8c630084, 0x00821021, 0x00621823,
+       0x1c600004, 0x3c039000, 0x91020020, 0x34420001, 0xa1020020, 0x34630001,
+       0x8f820008, 0x32910040, 0x3c048000, 0x00431025, 0xaf420020, 0x8f420020,
+       0x00441024, 0x1440fffd, 0x00000000, 0x8f840000, 0x9083003f, 0x2402000a,
+       0x10620005, 0x2402000c, 0x9083003f, 0x24020008, 0x14620002, 0x24020014,
+       0xa082003f, 0x8f830008, 0x3c028000, 0x34420001, 0x00621825, 0xaf430020,
+       0x3c040800, 0x24904120, 0x9602000c, 0x96030016, 0x9604000e, 0x00431021,
+       0x00442021, 0x24840002, 0x3084ffff, 0x0e000a55, 0xa6020018, 0x8f850018,
+       0x00a01821, 0xa2030021, 0x8ee60008, 0x00402021, 0x24a50001, 0xaf850018,
+       0x00c0f809, 0x00000000, 0x00402021, 0x0e000b12, 0x02202821, 0x8ee3000c,
+       0x0060f809, 0x00402021, 0x96040018, 0x9602000e, 0x00822021, 0x24840002,
+       0x0e000a6b, 0x3084ffff, 0x3c030800, 0x8c624120, 0x8e030008, 0x3c040800,
+       0x00431023, 0x14400012, 0xac824120, 0x54600006, 0x8e02001c, 0x3243004a,
+       0x24020002, 0x14620005, 0x00000000, 0x8e02001c, 0x34420040, 0x0a000e0b,
+       0xae02001c, 0x52a00006, 0x36520002, 0x8e02002c, 0xaf420e10, 0x8e030030,
+       0xaf430e18, 0x36520002, 0x52a00008, 0x96670010, 0x8f830000, 0x8f420e10,
+       0xac6200a8, 0x8f840000, 0x8f420e18, 0xac8200ac, 0x96670010, 0x92680020,
+       0x24020040, 0xaf420814, 0x8f830020, 0x8f82001c, 0x00671821, 0x00621023,
+       0xaf830020, 0x58400005, 0x8f42095c, 0x8f820000, 0xaf83001c, 0xac430054,
+       0x8f42095c, 0x31030008, 0xaf82002c, 0x1060001a, 0x00000000, 0x8f840000,
+       0x90820120, 0x90830121, 0x304600ff, 0x00c31823, 0x30630007, 0x24020007,
+       0x1062000e, 0x00000000, 0x90820122, 0x304200fe, 0xa0820122, 0x8f850000,
+       0x00061880, 0x8f840020, 0x24a20100, 0x00431021, 0x24c30001, 0x30630007,
+       0xac440000, 0x0a000e40, 0xa0a30120, 0x90820122, 0x34420001, 0xa0820122,
+       0x14e00003, 0x31020001, 0x10400031, 0x32510002, 0x8f820000, 0x8c43000c,
+       0x30630001, 0x1060002c, 0x32510002, 0x3c029000, 0x8f830008, 0x34420001,
+       0x3c048000, 0x00621825, 0xaf430020, 0x8f420020, 0x00441024, 0x1440fffd,
+       0x00000000, 0x8f870000, 0x8ce2000c, 0x30420001, 0x10400018, 0x00000000,
+       0x94e2006a, 0x00022880, 0x50a00001, 0x24050001, 0x94e30068, 0x90e40081,
+       0x3c020800, 0x8c460024, 0x00652821, 0x00852804, 0x00c5102b, 0x54400001,
+       0x00a03021, 0x3c020800, 0x8c440028, 0x00c4182b, 0x54600001, 0x00c02021,
+       0x8f430074, 0x2402fffe, 0x00822824, 0x00a31821, 0xace3000c, 0x8f830008,
+       0x3c028000, 0x34420001, 0x00621825, 0xaf430020, 0x8f830020, 0x3c020800,
+       0x24504120, 0xae030024, 0x8ee20010, 0x0040f809, 0x00000000, 0x12a00005,
+       0x00000000, 0x8f420e10, 0xae02002c, 0x8f430e18, 0xae030030, 0x1220feba,
+       0x0000a821, 0x8f870024, 0x97860028, 0x8f830000, 0x8f820030, 0x8f840020,
+       0x8f85001c, 0x32500040, 0xa4e6002c, 0xac620044, 0x32420008, 0xac640050,
+       0xac650054, 0x1040007a, 0x32820020, 0x10400027, 0x32910010, 0x24072000,
+       0x3c090800, 0x3c038000, 0x8f420178, 0x00431024, 0x1440fffd, 0x8ec2414c,
+       0x26c4414c, 0x2484ffd4, 0xaf420144, 0x8c820030, 0x3c030400, 0xaf420148,
+       0x24020041, 0xaf43014c, 0x00001821, 0xa3420152, 0x3c021000, 0xa7430158,
+       0xaf470154, 0xaf420178, 0x8ec5414c, 0x8d230030, 0x8c860030, 0x24630001,
+       0xad230030, 0x93420109, 0x9343010a, 0xafa70014, 0xafa00018, 0x00021600,
+       0x00031c00, 0x00431025, 0x34424100, 0xafa20010, 0x8f440100, 0x0e000fe1,
+       0x3c070400, 0x12200028, 0x24072000, 0x3c090800, 0x3c038000, 0x8f420178,
+       0x00431024, 0x1440fffd, 0x8ec2414c, 0x26c4414c, 0x2484ffd4, 0xaf420144,
+       0x8c820030, 0x3c030300, 0xaf420148, 0x2402004e, 0xaf43014c, 0x00001821,
+       0xa3420152, 0x3c021000, 0xa7430158, 0xaf470154, 0xaf420178, 0x8ec5414c,
+       0x8d230030, 0x8c860030, 0x24630001, 0xad230030, 0x93420109, 0x9343010a,
+       0xafa70014, 0xafa00018, 0x00021600, 0x00031c00, 0x00431025, 0x34424e00,
+       0xafa20010, 0x8f440100, 0x0e000fe1, 0x3c070300, 0x0a000f0b, 0x8fa30024,
+       0x32820008, 0x10400026, 0x3c090800, 0x24072000, 0x3c038000, 0x8f420178,
+       0x00431024, 0x1440fffd, 0x8ec2414c, 0x26c4414c, 0x2484ffd4, 0xaf420144,
+       0x8c820030, 0x3c030200, 0xaf420148, 0x2402004b, 0xaf43014c, 0x00001821,
+       0xa3420152, 0x3c021000, 0xa7430158, 0xaf470154, 0xaf420178, 0x8ec5414c,
+       0x8d230030, 0x8c860030, 0x24630001, 0xad230030, 0x93420109, 0x9343010a,
+       0xafa70014, 0xafa00018, 0x00021600, 0x00031c00, 0x00431025, 0x34424b00,
+       0xafa20010, 0x8f440100, 0x0e000fe1, 0x3c070200, 0x8fa30024, 0x14600004,
+       0x8fa40020, 0x32420010, 0x10400004, 0x00000000, 0x8c820004, 0x0040f809,
+       0x00000000, 0x12000006, 0x8fa30020, 0x8c620008, 0x0040f809, 0x00000000,
+       0x0a000f4d, 0x8fbf004c, 0x3c030800, 0x8c62413c, 0x30420040, 0x1440002f,
+       0x8fbf004c, 0x24040040, 0x8f910020, 0x3c038000, 0x8f420178, 0x00431024,
+       0x1440fffd, 0x8ec2414c, 0x26d0414c, 0x2610ffd4, 0xaf420144, 0x8e020030,
+       0x00001821, 0xaf420148, 0x24020049, 0xaf51014c, 0xa3420152, 0x3c021000,
+       0xa7430158, 0xaf440154, 0xaf420178, 0x8ec5414c, 0x8e060030, 0x93420109,
+       0x9343010a, 0xafa40014, 0xafa00018, 0x00021600, 0x00031c00, 0x00431025,
+       0x34424900, 0xafa20010, 0x8f440100, 0x0e000fe1, 0x02203821, 0x8f830000,
+       0x8e020030, 0x8c64017c, 0x02221023, 0x00441023, 0x2c420002, 0x14400005,
+       0x8fbf004c, 0x0000000d, 0x00000000, 0x240000ca, 0x8fbf004c, 0x8fbe0048,
+       0x8fb70044, 0x8fb60040, 0x8fb5003c, 0x8fb40038, 0x8fb30034, 0x8fb20030,
+       0x8fb1002c, 0x8fb00028, 0x03e00008, 0x27bd0050, 0x03e00008, 0x00001021,
+       0x3c030800, 0x24654120, 0x8ca40004, 0x8c634120, 0x0064102b, 0x54400001,
+       0x00602021, 0x9743093c, 0x0083102b, 0x54400001, 0x00801821, 0x00001021,
+       0xaca30008, 0x03e00008, 0xa4a00022, 0x8f850004, 0x97840010, 0x3c030800,
+       0x24634120, 0x24020008, 0xa462000e, 0x8f820004, 0xa460000c, 0x000420c2,
+       0x30840008, 0x2c420001, 0x00021023, 0x30420006, 0xac650008, 0x03e00008,
+       0xa0640020, 0x3c020800, 0x24424120, 0x90450021, 0x94430018, 0x3c021100,
+       0xac800004, 0x00052c00, 0x24630002, 0x00621825, 0x00a32825, 0x24820008,
+       0x03e00008, 0xac850000, 0x0000000d, 0x00000000, 0x2400016f, 0x03e00008,
+       0x00000000, 0x0000000d, 0x00000000, 0x2400017b, 0x03e00008, 0x00000000,
+       0x03e00008, 0x00000000, 0x3c020800, 0x24424120, 0xac400008, 0xa4400022,
+       0x03e00008, 0x24020001, 0x3c020800, 0x24424120, 0x24030008, 0xac400008,
+       0xa440000c, 0xa443000e, 0xa0400020, 0x03e00008, 0x24020004, 0x03e00008,
+       0x00001021, 0x10c00007, 0x00000000, 0x8ca20000, 0x24c6ffff, 0x24a50004,
+       0xac820000, 0x14c0fffb, 0x24840004, 0x03e00008, 0x00000000, 0x0a000fb2,
+       0x00a01021, 0xac860000, 0x24840004, 0x00a01021, 0x1440fffc, 0x24a5ffff,
+       0x03e00008, 0x00000000, 0x3c0a0800, 0x8d490068, 0x3c050800, 0x24a51090,
+       0x00093140, 0x00c51021, 0xac440000, 0x8f440e04, 0x00a61021, 0xac440004,
+       0x97430e08, 0x97420e0c, 0x00a62021, 0x00031c00, 0x00431025, 0xac820008,
+       0x8f430e10, 0x00801021, 0xac43000c, 0x8f440e14, 0xac440010, 0x8f430e18,
+       0x3c0800ff, 0xac430014, 0x8f470e1c, 0x3508ffff, 0x25290001, 0xac470018,
+       0x3c070800, 0x8ce3006c, 0x9344010a, 0x3c026000, 0x24630001, 0xace3006c,
+       0x8c434448, 0x3129007f, 0x00a62821, 0xad490068, 0x00042600, 0x00681824,
+       0x00832025, 0x03e00008, 0xaca4001c, 0x8fac0010, 0x8fad0014, 0x8fae0018,
+       0x3c0b0800, 0x8d6a0060, 0x3c080800, 0x25080078, 0x000a4940, 0x01281021,
+       0x01091821, 0xac440000, 0x00601021, 0xac650004, 0xac460008, 0xac67000c,
+       0xac4c0010, 0xac6d0014, 0x3c036000, 0xac4e0018, 0x8c654448, 0x3c040800,
+       0x8c820064, 0x254a0001, 0x314a007f, 0x01094021, 0xad6a0060, 0x24420001,
+       0xac820064, 0x03e00008, 0xad05001c, 0x00000000 };
+
+static u32 bnx2_TXP_b06FwData[(0x0/4) + 1] = { 0x00000000 };
+static u32 bnx2_TXP_b06FwRodata[(0x0/4) + 1] = { 0x00000000 };
+static u32 bnx2_TXP_b06FwBss[(0x194/4) + 1] = { 0x00000000 };
+static u32 bnx2_TXP_b06FwSbss[(0x34/4) + 1] = { 0x00000000 };
+
index 770e28f98fd5329a7434c47be96d3f85f1cf33dc..269a5e407349e90e3c9c7f681979eea9732c5c17 100644 (file)
@@ -3037,7 +3037,7 @@ static void bond_activebackup_arp_mon(struct net_device *bond_dev)
                        bond_set_slave_inactive_flags(bond->current_arp_slave);
 
                        /* search for next candidate */
-                       bond_for_each_slave_from(bond, slave, i, bond->current_arp_slave) {
+                       bond_for_each_slave_from(bond, slave, i, bond->current_arp_slave->next) {
                                if (IS_UP(slave->dev)) {
                                        slave->link = BOND_LINK_BACK;
                                        bond_set_slave_active_flags(slave);
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
new file mode 100644 (file)
index 0000000..f4ba0ff
--- /dev/null
@@ -0,0 +1,1219 @@
+/*
+ *   dm9000.c: Version 1.2 03/18/2003
+ *
+ *         A Davicom DM9000 ISA NIC fast Ethernet driver for Linux.
+ *     Copyright (C) 1997  Sten Wang
+ *
+ *     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.
+ *
+ *   (C)Copyright 1997-1998 DAVICOM Semiconductor,Inc. All Rights Reserved.
+ *
+ * V0.11       06/20/2001      REG_0A bit3=1, default enable BP with DA match
+ *     06/22/2001      Support DM9801 progrmming
+ *                     E3: R25 = ((R24 + NF) & 0x00ff) | 0xf000
+ *                     E4: R25 = ((R24 + NF) & 0x00ff) | 0xc200
+ *                             R17 = (R17 & 0xfff0) | NF + 3
+ *                     E5: R25 = ((R24 + NF - 3) & 0x00ff) | 0xc200
+ *                             R17 = (R17 & 0xfff0) | NF
+ *
+ * v1.00                       modify by simon 2001.9.5
+ *                         change for kernel 2.4.x
+ *
+ * v1.1   11/09/2001           fix force mode bug
+ *
+ * v1.2   03/18/2003       Weilun Huang <weilun_huang@davicom.com.tw>:
+ *                     Fixed phy reset.
+ *                     Added tx/rx 32 bit mode.
+ *                     Cleaned up for kernel merge.
+ *
+ *        03/03/2004    Sascha Hauer <s.hauer@pengutronix.de>
+ *                      Port to 2.6 kernel
+ *
+ *       24-Sep-2004   Ben Dooks <ben@simtec.co.uk>
+ *                     Cleanup of code to remove ifdefs
+ *                     Allowed platform device data to influence access width
+ *                     Reformatting areas of code
+ *
+ *        17-Mar-2005   Sascha Hauer <s.hauer@pengutronix.de>
+ *                      * removed 2.4 style module parameters
+ *                      * removed removed unused stat counter and fixed
+ *                        net_device_stats
+ *                      * introduced tx_timeout function
+ *                      * reworked locking
+ */
+
+#include <linux/module.h>
+#include <linux/ioport.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/init.h>
+#include <linux/skbuff.h>
+#include <linux/version.h>
+#include <linux/spinlock.h>
+#include <linux/crc32.h>
+#include <linux/mii.h>
+#include <linux/dm9000.h>
+#include <linux/delay.h>
+
+#include <asm/delay.h>
+#include <asm/irq.h>
+#include <asm/io.h>
+
+#include "dm9000.h"
+
+/* Board/System/Debug information/definition ---------------- */
+
+#define DM9000_PHY             0x40    /* PHY address 0x01 */
+
+#define TRUE                   1
+#define FALSE                  0
+
+#define CARDNAME "dm9000"
+#define PFX CARDNAME ": "
+
+#define DM9000_TIMER_WUT  jiffies+(HZ*2)       /* timer wakeup time : 2 second */
+
+#define DM9000_DEBUG 0
+
+#if DM9000_DEBUG > 2
+#define PRINTK3(args...)  printk(CARDNAME ": " args)
+#else
+#define PRINTK3(args...)  do { } while(0)
+#endif
+
+#if DM9000_DEBUG > 1
+#define PRINTK2(args...)  printk(CARDNAME ": " args)
+#else
+#define PRINTK2(args...)  do { } while(0)
+#endif
+
+#if DM9000_DEBUG > 0
+#define PRINTK1(args...)  printk(CARDNAME ": " args)
+#define PRINTK(args...)   printk(CARDNAME ": " args)
+#else
+#define PRINTK1(args...)  do { } while(0)
+#define PRINTK(args...)   printk(KERN_DEBUG args)
+#endif
+
+/*
+ * Transmit timeout, default 5 seconds.
+ */
+static int watchdog = 5000;
+module_param(watchdog, int, 0400);
+MODULE_PARM_DESC(watchdog, "transmit timeout in milliseconds");
+
+/* Structure/enum declaration ------------------------------- */
+typedef struct board_info {
+
+       void __iomem *io_addr;  /* Register I/O base address */
+       void __iomem *io_data;  /* Data I/O address */
+       u16 irq;                /* IRQ */
+
+       u16 tx_pkt_cnt;
+       u16 queue_pkt_len;
+       u16 queue_start_addr;
+       u16 dbug_cnt;
+       u8 io_mode;             /* 0:word, 2:byte */
+       u8 phy_addr;
+
+       void (*inblk)(void __iomem *port, void *data, int length);
+       void (*outblk)(void __iomem *port, void *data, int length);
+       void (*dumpblk)(void __iomem *port, int length);
+
+       struct resource *addr_res;   /* resources found */
+       struct resource *data_res;
+       struct resource *addr_req;   /* resources requested */
+       struct resource *data_req;
+       struct resource *irq_res;
+
+       struct timer_list timer;
+       struct net_device_stats stats;
+       unsigned char srom[128];
+       spinlock_t lock;
+
+       struct mii_if_info mii;
+       u32 msg_enable;
+} board_info_t;
+
+/* function declaration ------------------------------------- */
+static int dm9000_probe(struct device *);
+static int dm9000_open(struct net_device *);
+static int dm9000_start_xmit(struct sk_buff *, struct net_device *);
+static int dm9000_stop(struct net_device *);
+static int dm9000_do_ioctl(struct net_device *, struct ifreq *, int);
+
+
+static void dm9000_timer(unsigned long);
+static void dm9000_init_dm9000(struct net_device *);
+
+static struct net_device_stats *dm9000_get_stats(struct net_device *);
+
+static irqreturn_t dm9000_interrupt(int, void *, struct pt_regs *);
+
+static int dm9000_phy_read(struct net_device *dev, int phyaddr_unsused, int reg);
+static void dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg,
+                          int value);
+static u16 read_srom_word(board_info_t *, int);
+static void dm9000_rx(struct net_device *);
+static void dm9000_hash_table(struct net_device *);
+
+//#define DM9000_PROGRAM_EEPROM
+#ifdef DM9000_PROGRAM_EEPROM
+static void program_eeprom(board_info_t * db);
+#endif
+/* DM9000 network board routine ---------------------------- */
+
+static void
+dm9000_reset(board_info_t * db)
+{
+       PRINTK1("dm9000x: resetting\n");
+       /* RESET device */
+       writeb(DM9000_NCR, db->io_addr);
+       udelay(200);
+       writeb(NCR_RST, db->io_data);
+       udelay(200);
+}
+
+/*
+ *   Read a byte from I/O port
+ */
+static u8
+ior(board_info_t * db, int reg)
+{
+       writeb(reg, db->io_addr);
+       return readb(db->io_data);
+}
+
+/*
+ *   Write a byte to I/O port
+ */
+
+static void
+iow(board_info_t * db, int reg, int value)
+{
+       writeb(reg, db->io_addr);
+       writeb(value, db->io_data);
+}
+
+/* routines for sending block to chip */
+
+static void dm9000_outblk_8bit(void __iomem *reg, void *data, int count)
+{
+       writesb(reg, data, count);
+}
+
+static void dm9000_outblk_16bit(void __iomem *reg, void *data, int count)
+{
+       writesw(reg, data, (count+1) >> 1);
+}
+
+static void dm9000_outblk_32bit(void __iomem *reg, void *data, int count)
+{
+       writesl(reg, data, (count+3) >> 2);
+}
+
+/* input block from chip to memory */
+
+static void dm9000_inblk_8bit(void __iomem *reg, void *data, int count)
+{
+       readsb(reg, data, count+1);
+}
+
+
+static void dm9000_inblk_16bit(void __iomem *reg, void *data, int count)
+{
+       readsw(reg, data, (count+1) >> 1);
+}
+
+static void dm9000_inblk_32bit(void __iomem *reg, void *data, int count)
+{
+       readsl(reg, data, (count+3) >> 2);
+}
+
+/* dump block from chip to null */
+
+static void dm9000_dumpblk_8bit(void __iomem *reg, int count)
+{
+       int i;
+       int tmp;
+
+       for (i = 0; i < count; i++)
+               tmp = readb(reg);
+}
+
+static void dm9000_dumpblk_16bit(void __iomem *reg, int count)
+{
+       int i;
+       int tmp;
+
+       count = (count + 1) >> 1;
+
+       for (i = 0; i < count; i++)
+               tmp = readw(reg);
+}
+
+static void dm9000_dumpblk_32bit(void __iomem *reg, int count)
+{
+       int i;
+       int tmp;
+
+       count = (count + 3) >> 2;
+
+       for (i = 0; i < count; i++)
+               tmp = readl(reg);
+}
+
+/* dm9000_set_io
+ *
+ * select the specified set of io routines to use with the
+ * device
+ */
+
+static void dm9000_set_io(struct board_info *db, int byte_width)
+{
+       /* use the size of the data resource to work out what IO
+        * routines we want to use
+        */
+
+       switch (byte_width) {
+       case 1:
+               db->dumpblk = dm9000_dumpblk_8bit;
+               db->outblk  = dm9000_outblk_8bit;
+               db->inblk   = dm9000_inblk_8bit;
+               break;
+
+       case 2:
+               db->dumpblk = dm9000_dumpblk_16bit;
+               db->outblk  = dm9000_outblk_16bit;
+               db->inblk   = dm9000_inblk_16bit;
+               break;
+
+       case 3:
+               printk(KERN_ERR PFX ": 3 byte IO, falling back to 16bit\n");
+               db->dumpblk = dm9000_dumpblk_16bit;
+               db->outblk  = dm9000_outblk_16bit;
+               db->inblk   = dm9000_inblk_16bit;
+               break;
+
+       case 4:
+       default:
+               db->dumpblk = dm9000_dumpblk_32bit;
+               db->outblk  = dm9000_outblk_32bit;
+               db->inblk   = dm9000_inblk_32bit;
+               break;
+       }
+}
+
+
+/* Our watchdog timed out. Called by the networking layer */
+static void dm9000_timeout(struct net_device *dev)
+{
+       board_info_t *db = (board_info_t *) dev->priv;
+       u8 reg_save;
+       unsigned long flags;
+
+       /* Save previous register address */
+       reg_save = readb(db->io_addr);
+       spin_lock_irqsave(db->lock,flags);
+
+       netif_stop_queue(dev);
+       dm9000_reset(db);
+       dm9000_init_dm9000(dev);
+       /* We can accept TX packets again */
+       dev->trans_start = jiffies;
+       netif_wake_queue(dev);
+
+       /* Restore previous register address */
+       writeb(reg_save, db->io_addr);
+       spin_unlock_irqrestore(db->lock,flags);
+}
+
+
+/* dm9000_release_board
+ *
+ * release a board, and any mapped resources
+ */
+
+static void
+dm9000_release_board(struct platform_device *pdev, struct board_info *db)
+{
+       if (db->data_res == NULL) {
+               if (db->addr_res != NULL)
+                       release_mem_region((unsigned long)db->io_addr, 4);
+               return;
+       }
+
+       /* unmap our resources */
+
+       iounmap(db->io_addr);
+       iounmap(db->io_data);
+
+       /* release the resources */
+
+       if (db->data_req != NULL) {
+               release_resource(db->data_req);
+               kfree(db->data_req);
+       }
+
+       if (db->addr_res != NULL) {
+               release_resource(db->data_req);
+               kfree(db->addr_req);
+       }
+}
+
+#define res_size(_r) (((_r)->end - (_r)->start) + 1)
+
+/*
+ * Search DM9000 board, allocate space and register it
+ */
+static int
+dm9000_probe(struct device *dev)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct dm9000_plat_data *pdata = pdev->dev.platform_data;
+       struct board_info *db;  /* Point a board information structure */
+       struct net_device *ndev;
+       unsigned long base;
+       int ret = 0;
+       int iosize;
+       int i;
+       u32 id_val;
+
+       printk(KERN_INFO "%s Ethernet Driver\n", CARDNAME);
+
+       /* Init network device */
+       ndev = alloc_etherdev(sizeof (struct board_info));
+       if (!ndev) {
+               printk("%s: could not allocate device.\n", CARDNAME);
+               return -ENOMEM;
+       }
+
+       SET_MODULE_OWNER(ndev);
+       SET_NETDEV_DEV(ndev, dev);
+
+       PRINTK2("dm9000_probe()");
+
+       /* setup board info structure */
+       db = (struct board_info *) ndev->priv;
+       memset(db, 0, sizeof (*db));
+
+       if (pdev->num_resources < 2) {
+               ret = -ENODEV;
+               goto out;
+       }
+
+       switch (pdev->num_resources) {
+       case 2:
+               base = pdev->resource[0].start;
+
+               if (!request_mem_region(base, 4, ndev->name)) {
+                       ret = -EBUSY;
+                       goto out;
+               }
+
+               ndev->base_addr = base;
+               ndev->irq = pdev->resource[1].start;
+               db->io_addr = (void *)base;
+               db->io_data = (void *)(base + 4);
+
+               break;
+
+       case 3:
+               db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+               db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+               db->irq_res  = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+
+               if (db->addr_res == NULL || db->data_res == NULL) {
+                       printk(KERN_ERR PFX "insufficient resources\n");
+                       ret = -ENOENT;
+                       goto out;
+               }
+
+               i = res_size(db->addr_res);
+               db->addr_req = request_mem_region(db->addr_res->start, i,
+                                                 pdev->name);
+
+               if (db->addr_req == NULL) {
+                       printk(KERN_ERR PFX "cannot claim address reg area\n");
+                       ret = -EIO;
+                       goto out;
+               }
+
+               db->io_addr = ioremap(db->addr_res->start, i);
+
+               if (db->io_addr == NULL) {
+                       printk(KERN_ERR "failed to ioremap address reg\n");
+                       ret = -EINVAL;
+                       goto out;
+               }
+
+               iosize = res_size(db->data_res);
+               db->data_req = request_mem_region(db->data_res->start, iosize,
+                                                 pdev->name);
+
+               if (db->data_req == NULL) {
+                       printk(KERN_ERR PFX "cannot claim data reg area\n");
+                       ret = -EIO;
+                       goto out;
+               }
+
+               db->io_data = ioremap(db->data_res->start, iosize);
+
+               if (db->io_data == NULL) {
+                       printk(KERN_ERR "failed to ioremap data reg\n");
+                       ret = -EINVAL;
+                       goto out;
+               }
+
+               /* fill in parameters for net-dev structure */
+
+               ndev->base_addr = (unsigned long)db->io_addr;
+               ndev->irq       = db->irq_res->start;
+
+               /* ensure at least we have a default set of IO routines */
+               dm9000_set_io(db, iosize);
+
+       }
+
+       /* check to see if anything is being over-ridden */
+       if (pdata != NULL) {
+               /* check to see if the driver wants to over-ride the
+                * default IO width */
+
+               if (pdata->flags & DM9000_PLATF_8BITONLY)
+                       dm9000_set_io(db, 1);
+
+               if (pdata->flags & DM9000_PLATF_16BITONLY)
+                       dm9000_set_io(db, 2);
+
+               if (pdata->flags & DM9000_PLATF_32BITONLY)
+                       dm9000_set_io(db, 4);
+
+               /* check to see if there are any IO routine
+                * over-rides */
+
+               if (pdata->inblk != NULL)
+                       db->inblk = pdata->inblk;
+
+               if (pdata->outblk != NULL)
+                       db->outblk = pdata->outblk;
+
+               if (pdata->dumpblk != NULL)
+                       db->dumpblk = pdata->dumpblk;
+       }
+
+       dm9000_reset(db);
+
+       /* try two times, DM9000 sometimes gets the first read wrong */
+       for (i = 0; i < 2; i++) {
+               id_val  = ior(db, DM9000_VIDL);
+               id_val |= (u32)ior(db, DM9000_VIDH) << 8;
+               id_val |= (u32)ior(db, DM9000_PIDL) << 16;
+               id_val |= (u32)ior(db, DM9000_PIDH) << 24;
+
+               if (id_val == DM9000_ID)
+                       break;
+               printk("%s: read wrong id 0x%08x\n", CARDNAME, id_val);
+       }
+
+       if (id_val != DM9000_ID) {
+               printk("%s: wrong id: 0x%08x\n", CARDNAME, id_val);
+               goto release;
+       }
+
+       /* from this point we assume that we have found a DM9000 */
+
+       /* driver system function */
+       ether_setup(ndev);
+
+       ndev->open               = &dm9000_open;
+       ndev->hard_start_xmit    = &dm9000_start_xmit;
+       ndev->tx_timeout         = &dm9000_timeout;
+       ndev->watchdog_timeo = msecs_to_jiffies(watchdog);
+       ndev->stop               = &dm9000_stop;
+       ndev->get_stats          = &dm9000_get_stats;
+       ndev->set_multicast_list = &dm9000_hash_table;
+       ndev->do_ioctl           = &dm9000_do_ioctl;
+
+#ifdef DM9000_PROGRAM_EEPROM
+       program_eeprom(db);
+#endif
+       db->msg_enable       = NETIF_MSG_LINK;
+       db->mii.phy_id_mask  = 0x1f;
+       db->mii.reg_num_mask = 0x1f;
+       db->mii.force_media  = 0;
+       db->mii.full_duplex  = 0;
+       db->mii.dev          = ndev;
+       db->mii.mdio_read    = dm9000_phy_read;
+       db->mii.mdio_write   = dm9000_phy_write;
+
+       /* Read SROM content */
+       for (i = 0; i < 64; i++)
+               ((u16 *) db->srom)[i] = read_srom_word(db, i);
+
+       /* Set Node Address */
+       for (i = 0; i < 6; i++)
+               ndev->dev_addr[i] = db->srom[i];
+
+       if (!is_valid_ether_addr(ndev->dev_addr))
+               printk("%s: Invalid ethernet MAC address.  Please "
+                      "set using ifconfig\n", ndev->name);
+
+       dev_set_drvdata(dev, ndev);
+       ret = register_netdev(ndev);
+
+       if (ret == 0) {
+               printk("%s: dm9000 at %p,%p IRQ %d MAC: ",
+                      ndev->name,  db->io_addr, db->io_data, ndev->irq);
+               for (i = 0; i < 5; i++)
+                       printk("%02x:", ndev->dev_addr[i]);
+               printk("%02x\n", ndev->dev_addr[5]);
+       }
+       return 0;
+
+ release:
+ out:
+       printk("%s: not found (%d).\n", CARDNAME, ret);
+
+       dm9000_release_board(pdev, db);
+       kfree(ndev);
+
+       return ret;
+}
+
+/*
+ *  Open the interface.
+ *  The interface is opened whenever "ifconfig" actives it.
+ */
+static int
+dm9000_open(struct net_device *dev)
+{
+       board_info_t *db = (board_info_t *) dev->priv;
+
+       PRINTK2("entering dm9000_open\n");
+
+       if (request_irq(dev->irq, &dm9000_interrupt, SA_SHIRQ, dev->name, dev))
+               return -EAGAIN;
+
+       /* Initialize DM9000 board */
+       dm9000_reset(db);
+       dm9000_init_dm9000(dev);
+
+       /* Init driver variable */
+       db->dbug_cnt = 0;
+
+       /* set and active a timer process */
+       init_timer(&db->timer);
+       db->timer.expires  = DM9000_TIMER_WUT * 2;
+       db->timer.data     = (unsigned long) dev;
+       db->timer.function = &dm9000_timer;
+       add_timer(&db->timer);
+
+       mii_check_media(&db->mii, netif_msg_link(db), 1);
+       netif_start_queue(dev);
+
+       return 0;
+}
+
+/*
+ * Initilize dm9000 board
+ */
+static void
+dm9000_init_dm9000(struct net_device *dev)
+{
+       board_info_t *db = (board_info_t *) dev->priv;
+
+       PRINTK1("entering %s\n",__FUNCTION__);
+
+       /* I/O mode */
+       db->io_mode = ior(db, DM9000_ISR) >> 6; /* ISR bit7:6 keeps I/O mode */
+
+       /* GPIO0 on pre-activate PHY */
+       iow(db, DM9000_GPR, 0); /* REG_1F bit0 activate phyxcer */
+       iow(db, DM9000_GPCR, GPCR_GEP_CNTL);    /* Let GPIO0 output */
+       iow(db, DM9000_GPR, 0); /* Enable PHY */
+
+       /* Program operating register */
+       iow(db, DM9000_TCR, 0);         /* TX Polling clear */
+       iow(db, DM9000_BPTR, 0x3f);     /* Less 3Kb, 200us */
+       iow(db, DM9000_FCR, 0xff);      /* Flow Control */
+       iow(db, DM9000_SMCR, 0);        /* Special Mode */
+       /* clear TX status */
+       iow(db, DM9000_NSR, NSR_WAKEST | NSR_TX2END | NSR_TX1END);
+       iow(db, DM9000_ISR, ISR_CLR_STATUS); /* Clear interrupt status */
+
+       /* Set address filter table */
+       dm9000_hash_table(dev);
+
+       /* Activate DM9000 */
+       iow(db, DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN);
+       /* Enable TX/RX interrupt mask */
+       iow(db, DM9000_IMR, IMR_PAR | IMR_PTM | IMR_PRM);
+
+       /* Init Driver variable */
+       db->tx_pkt_cnt = 0;
+       db->queue_pkt_len = 0;
+       dev->trans_start = 0;
+       spin_lock_init(&db->lock);
+}
+
+/*
+ *  Hardware start transmission.
+ *  Send a packet to media from the upper layer.
+ */
+static int
+dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+       board_info_t *db = (board_info_t *) dev->priv;
+
+       PRINTK3("dm9000_start_xmit\n");
+
+       if (db->tx_pkt_cnt > 1)
+               return 1;
+
+       netif_stop_queue(dev);
+
+       /* Disable all interrupts */
+       iow(db, DM9000_IMR, IMR_PAR);
+
+       /* Move data to DM9000 TX RAM */
+       writeb(DM9000_MWCMD, db->io_addr);
+
+       (db->outblk)(db->io_data, skb->data, skb->len);
+       db->stats.tx_bytes += skb->len;
+
+       /* TX control: First packet immediately send, second packet queue */
+       if (db->tx_pkt_cnt == 0) {
+
+               /* First Packet */
+               db->tx_pkt_cnt++;
+
+               /* Set TX length to DM9000 */
+               iow(db, DM9000_TXPLL, skb->len & 0xff);
+               iow(db, DM9000_TXPLH, (skb->len >> 8) & 0xff);
+
+               /* Issue TX polling command */
+               iow(db, DM9000_TCR, TCR_TXREQ); /* Cleared after TX complete */
+
+               dev->trans_start = jiffies;     /* save the time stamp */
+
+       } else {
+               /* Second packet */
+               db->tx_pkt_cnt++;
+               db->queue_pkt_len = skb->len;
+       }
+
+       /* free this SKB */
+       dev_kfree_skb(skb);
+
+       /* Re-enable resource check */
+       if (db->tx_pkt_cnt == 1)
+               netif_wake_queue(dev);
+
+       /* Re-enable interrupt */
+       iow(db, DM9000_IMR, IMR_PAR | IMR_PTM | IMR_PRM);
+
+       return 0;
+}
+
+static void
+dm9000_shutdown(struct net_device *dev)
+{
+       board_info_t *db = (board_info_t *) dev->priv;
+
+       /* RESET device */
+       dm9000_phy_write(dev, 0, MII_BMCR, BMCR_RESET); /* PHY RESET */
+       iow(db, DM9000_GPR, 0x01);      /* Power-Down PHY */
+       iow(db, DM9000_IMR, IMR_PAR);   /* Disable all interrupt */
+       iow(db, DM9000_RCR, 0x00);      /* Disable RX */
+}
+
+/*
+ * Stop the interface.
+ * The interface is stopped when it is brought.
+ */
+static int
+dm9000_stop(struct net_device *ndev)
+{
+       board_info_t *db = (board_info_t *) ndev->priv;
+
+       PRINTK1("entering %s\n",__FUNCTION__);
+
+       /* deleted timer */
+       del_timer(&db->timer);
+
+       netif_stop_queue(ndev);
+       netif_carrier_off(ndev);
+
+       /* free interrupt */
+       free_irq(ndev->irq, ndev);
+
+       dm9000_shutdown(ndev);
+
+       return 0;
+}
+
+/*
+ * DM9000 interrupt handler
+ * receive the packet to upper layer, free the transmitted packet
+ */
+
+void
+dm9000_tx_done(struct net_device *dev, board_info_t * db)
+{
+       int tx_status = ior(db, DM9000_NSR);    /* Got TX status */
+
+       if (tx_status & (NSR_TX2END | NSR_TX1END)) {
+               /* One packet sent complete */
+               db->tx_pkt_cnt--;
+               db->stats.tx_packets++;
+
+               /* Queue packet check & send */
+               if (db->tx_pkt_cnt > 0) {
+                       iow(db, DM9000_TXPLL, db->queue_pkt_len & 0xff);
+                       iow(db, DM9000_TXPLH, (db->queue_pkt_len >> 8) & 0xff);
+                       iow(db, DM9000_TCR, TCR_TXREQ);
+                       dev->trans_start = jiffies;
+               }
+               netif_wake_queue(dev);
+       }
+}
+
+static irqreturn_t
+dm9000_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+       struct net_device *dev = dev_id;
+       board_info_t *db;
+       int int_status;
+       u8 reg_save;
+
+       PRINTK3("entering %s\n",__FUNCTION__);
+
+       if (!dev) {
+               PRINTK1("dm9000_interrupt() without DEVICE arg\n");
+               return IRQ_HANDLED;
+       }
+
+       /* A real interrupt coming */
+       db = (board_info_t *) dev->priv;
+       spin_lock(&db->lock);
+
+       /* Save previous register address */
+       reg_save = readb(db->io_addr);
+
+       /* Disable all interrupts */
+       iow(db, DM9000_IMR, IMR_PAR);
+
+       /* Got DM9000 interrupt status */
+       int_status = ior(db, DM9000_ISR);       /* Got ISR */
+       iow(db, DM9000_ISR, int_status);        /* Clear ISR status */
+
+       /* Received the coming packet */
+       if (int_status & ISR_PRS)
+               dm9000_rx(dev);
+
+       /* Trnasmit Interrupt check */
+       if (int_status & ISR_PTS)
+               dm9000_tx_done(dev, db);
+
+       /* Re-enable interrupt mask */
+       iow(db, DM9000_IMR, IMR_PAR | IMR_PTM | IMR_PRM);
+
+       /* Restore previous register address */
+       writeb(reg_save, db->io_addr);
+
+       spin_unlock(&db->lock);
+
+       return IRQ_HANDLED;
+}
+
+/*
+ *  Get statistics from driver.
+ */
+static struct net_device_stats *
+dm9000_get_stats(struct net_device *dev)
+{
+       board_info_t *db = (board_info_t *) dev->priv;
+       return &db->stats;
+}
+
+/*
+ *  Process the upper socket ioctl command
+ */
+static int
+dm9000_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+       PRINTK1("entering %s\n",__FUNCTION__);
+       return 0;
+}
+
+/*
+ *  A periodic timer routine
+ *  Dynamic media sense, allocated Rx buffer...
+ */
+static void
+dm9000_timer(unsigned long data)
+{
+       struct net_device *dev = (struct net_device *) data;
+       board_info_t *db = (board_info_t *) dev->priv;
+       u8 reg_save;
+       unsigned long flags;
+
+       PRINTK3("dm9000_timer()\n");
+
+       spin_lock_irqsave(db->lock,flags);
+       /* Save previous register address */
+       reg_save = readb(db->io_addr);
+
+       mii_check_media(&db->mii, netif_msg_link(db), 0);
+
+       /* Restore previous register address */
+       writeb(reg_save, db->io_addr);
+       spin_unlock_irqrestore(db->lock,flags);
+
+       /* Set timer again */
+       db->timer.expires = DM9000_TIMER_WUT;
+       add_timer(&db->timer);
+}
+
+struct dm9000_rxhdr {
+       u16     RxStatus;
+       u16     RxLen;
+} __attribute__((__packed__));
+
+/*
+ *  Received a packet and pass to upper layer
+ */
+static void
+dm9000_rx(struct net_device *dev)
+{
+       board_info_t *db = (board_info_t *) dev->priv;
+       struct dm9000_rxhdr rxhdr;
+       struct sk_buff *skb;
+       u8 rxbyte, *rdptr;
+       int GoodPacket;
+       int RxLen;
+
+       /* Check packet ready or not */
+       do {
+               ior(db, DM9000_MRCMDX); /* Dummy read */
+
+               /* Get most updated data */
+               rxbyte = readb(db->io_data);
+
+               /* Status check: this byte must be 0 or 1 */
+               if (rxbyte > DM9000_PKT_RDY) {
+                       printk("status check failed: %d\n", rxbyte);
+                       iow(db, DM9000_RCR, 0x00);      /* Stop Device */
+                       iow(db, DM9000_ISR, IMR_PAR);   /* Stop INT request */
+                       return;
+               }
+
+               if (rxbyte != DM9000_PKT_RDY)
+                       return;
+
+               /* A packet ready now  & Get status/length */
+               GoodPacket = TRUE;
+               writeb(DM9000_MRCMD, db->io_addr);
+
+               (db->inblk)(db->io_data, &rxhdr, sizeof(rxhdr));
+
+               RxLen = rxhdr.RxLen;
+
+               /* Packet Status check */
+               if (RxLen < 0x40) {
+                       GoodPacket = FALSE;
+                       PRINTK1("Bad Packet received (runt)\n");
+               }
+
+               if (RxLen > DM9000_PKT_MAX) {
+                       PRINTK1("RST: RX Len:%x\n", RxLen);
+               }
+
+               if (rxhdr.RxStatus & 0xbf00) {
+                       GoodPacket = FALSE;
+                       if (rxhdr.RxStatus & 0x100) {
+                               PRINTK1("fifo error\n");
+                               db->stats.rx_fifo_errors++;
+                       }
+                       if (rxhdr.RxStatus & 0x200) {
+                               PRINTK1("crc error\n");
+                               db->stats.rx_crc_errors++;
+                       }
+                       if (rxhdr.RxStatus & 0x8000) {
+                               PRINTK1("length error\n");
+                               db->stats.rx_length_errors++;
+                       }
+               }
+
+               /* Move data from DM9000 */
+               if (GoodPacket
+                   && ((skb = dev_alloc_skb(RxLen + 4)) != NULL)) {
+                       skb->dev = dev;
+                       skb_reserve(skb, 2);
+                       rdptr = (u8 *) skb_put(skb, RxLen - 4);
+
+                       /* Read received packet from RX SRAM */
+
+                       (db->inblk)(db->io_data, rdptr, RxLen);
+                       db->stats.rx_bytes += RxLen;
+
+                       /* Pass to upper layer */
+                       skb->protocol = eth_type_trans(skb, dev);
+                       netif_rx(skb);
+                       db->stats.rx_packets++;
+
+               } else {
+                       /* need to dump the packet's data */
+
+                       (db->dumpblk)(db->io_data, RxLen);
+               }
+       } while (rxbyte == DM9000_PKT_RDY);
+}
+
+/*
+ *  Read a word data from SROM
+ */
+static u16
+read_srom_word(board_info_t * db, int offset)
+{
+       iow(db, DM9000_EPAR, offset);
+       iow(db, DM9000_EPCR, EPCR_ERPRR);
+       mdelay(8);              /* according to the datasheet 200us should be enough,
+                                  but it doesn't work */
+       iow(db, DM9000_EPCR, 0x0);
+       return (ior(db, DM9000_EPDRL) + (ior(db, DM9000_EPDRH) << 8));
+}
+
+#ifdef DM9000_PROGRAM_EEPROM
+/*
+ * Write a word data to SROM
+ */
+static void
+write_srom_word(board_info_t * db, int offset, u16 val)
+{
+       iow(db, DM9000_EPAR, offset);
+       iow(db, DM9000_EPDRH, ((val >> 8) & 0xff));
+       iow(db, DM9000_EPDRL, (val & 0xff));
+       iow(db, DM9000_EPCR, EPCR_WEP | EPCR_ERPRW);
+       mdelay(8);              /* same shit */
+       iow(db, DM9000_EPCR, 0);
+}
+
+/*
+ * Only for development:
+ * Here we write static data to the eeprom in case
+ * we don't have valid content on a new board
+ */
+static void
+program_eeprom(board_info_t * db)
+{
+       u16 eeprom[] = { 0x0c00, 0x007f, 0x1300,        /* MAC Address */
+               0x0000,         /* Autoload: accept nothing */
+               0x0a46, 0x9000, /* Vendor / Product ID */
+               0x0000,         /* pin control */
+               0x0000,
+       };                      /* Wake-up mode control */
+       int i;
+       for (i = 0; i < 8; i++)
+               write_srom_word(db, i, eeprom[i]);
+}
+#endif
+
+
+/*
+ *  Calculate the CRC valude of the Rx packet
+ *  flag = 1 : return the reverse CRC (for the received packet CRC)
+ *         0 : return the normal CRC (for Hash Table index)
+ */
+
+static unsigned long
+cal_CRC(unsigned char *Data, unsigned int Len, u8 flag)
+{
+
+       u32 crc = ether_crc_le(Len, Data);
+
+       if (flag)
+               return ~crc;
+
+       return crc;
+}
+
+/*
+ *  Set DM9000 multicast address
+ */
+static void
+dm9000_hash_table(struct net_device *dev)
+{
+       board_info_t *db = (board_info_t *) dev->priv;
+       struct dev_mc_list *mcptr = dev->mc_list;
+       int mc_cnt = dev->mc_count;
+       u32 hash_val;
+       u16 i, oft, hash_table[4];
+       unsigned long flags;
+
+       PRINTK2("dm9000_hash_table()\n");
+
+       spin_lock_irqsave(&db->lock,flags);
+
+       for (i = 0, oft = 0x10; i < 6; i++, oft++)
+               iow(db, oft, dev->dev_addr[i]);
+
+       /* Clear Hash Table */
+       for (i = 0; i < 4; i++)
+               hash_table[i] = 0x0;
+
+       /* broadcast address */
+       hash_table[3] = 0x8000;
+
+       /* the multicast address in Hash Table : 64 bits */
+       for (i = 0; i < mc_cnt; i++, mcptr = mcptr->next) {
+               hash_val = cal_CRC((char *) mcptr->dmi_addr, 6, 0) & 0x3f;
+               hash_table[hash_val / 16] |= (u16) 1 << (hash_val % 16);
+       }
+
+       /* Write the hash table to MAC MD table */
+       for (i = 0, oft = 0x16; i < 4; i++) {
+               iow(db, oft++, hash_table[i] & 0xff);
+               iow(db, oft++, (hash_table[i] >> 8) & 0xff);
+       }
+
+       spin_unlock_irqrestore(&db->lock,flags);
+}
+
+
+/*
+ *   Read a word from phyxcer
+ */
+static int
+dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg)
+{
+       board_info_t *db = (board_info_t *) dev->priv;
+       unsigned long flags;
+       int ret;
+
+       spin_lock_irqsave(&db->lock,flags);
+       /* Fill the phyxcer register into REG_0C */
+       iow(db, DM9000_EPAR, DM9000_PHY | reg);
+
+       iow(db, DM9000_EPCR, 0xc);      /* Issue phyxcer read command */
+       udelay(100);            /* Wait read complete */
+       iow(db, DM9000_EPCR, 0x0);      /* Clear phyxcer read command */
+
+       /* The read data keeps on REG_0D & REG_0E */
+       ret = (ior(db, DM9000_EPDRH) << 8) | ior(db, DM9000_EPDRL);
+
+       spin_unlock_irqrestore(&db->lock,flags);
+
+       return ret;
+}
+
+/*
+ *   Write a word to phyxcer
+ */
+static void
+dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value)
+{
+       board_info_t *db = (board_info_t *) dev->priv;
+       unsigned long flags;
+
+       spin_lock_irqsave(&db->lock,flags);
+
+       /* Fill the phyxcer register into REG_0C */
+       iow(db, DM9000_EPAR, DM9000_PHY | reg);
+
+       /* Fill the written data into REG_0D & REG_0E */
+       iow(db, DM9000_EPDRL, (value & 0xff));
+       iow(db, DM9000_EPDRH, ((value >> 8) & 0xff));
+
+       iow(db, DM9000_EPCR, 0xa);      /* Issue phyxcer write command */
+       udelay(500);            /* Wait write complete */
+       iow(db, DM9000_EPCR, 0x0);      /* Clear phyxcer write command */
+
+       spin_unlock_irqrestore(&db->lock,flags);
+}
+
+static int
+dm9000_drv_suspend(struct device *dev, u32 state, u32 level)
+{
+       struct net_device *ndev = dev_get_drvdata(dev);
+
+       if (ndev && level == SUSPEND_DISABLE) {
+               if (netif_running(ndev)) {
+                       netif_device_detach(ndev);
+                       dm9000_shutdown(ndev);
+               }
+       }
+       return 0;
+}
+
+static int
+dm9000_drv_resume(struct device *dev, u32 level)
+{
+       struct net_device *ndev = dev_get_drvdata(dev);
+       board_info_t *db = (board_info_t *) ndev->priv;
+
+       if (ndev && level == RESUME_ENABLE) {
+
+               if (netif_running(ndev)) {
+                       dm9000_reset(db);
+                       dm9000_init_dm9000(ndev);
+
+                       netif_device_attach(ndev);
+               }
+       }
+       return 0;
+}
+
+static int
+dm9000_drv_remove(struct device *dev)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct net_device *ndev = dev_get_drvdata(dev);
+
+       dev_set_drvdata(dev, NULL);
+
+       unregister_netdev(ndev);
+       dm9000_release_board(pdev, (board_info_t *) ndev->priv);
+       kfree(ndev);            /* free device structure */
+
+       PRINTK1("clean_module() exit\n");
+
+       return 0;
+}
+
+static struct device_driver dm9000_driver = {
+       .name    = "dm9000",
+       .bus     = &platform_bus_type,
+       .probe   = dm9000_probe,
+       .remove  = dm9000_drv_remove,
+       .suspend = dm9000_drv_suspend,
+       .resume  = dm9000_drv_resume,
+};
+
+static int __init
+dm9000_init(void)
+{
+       return driver_register(&dm9000_driver); /* search board and register */
+}
+
+static void __exit
+dm9000_cleanup(void)
+{
+       driver_unregister(&dm9000_driver);
+}
+
+module_init(dm9000_init);
+module_exit(dm9000_cleanup);
+
+MODULE_AUTHOR("Sascha Hauer, Ben Dooks");
+MODULE_DESCRIPTION("Davicom DM9000 network driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/net/dm9000.h b/drivers/net/dm9000.h
new file mode 100644 (file)
index 0000000..82cad36
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * dm9000 Ethernet
+ */
+
+#ifndef _DM9000X_H_
+#define _DM9000X_H_
+
+#define DM9000_ID              0x90000A46
+
+/* although the registers are 16 bit, they are 32-bit aligned.
+ */
+
+#define DM9000_NCR             0x00
+#define DM9000_NSR             0x01
+#define DM9000_TCR             0x02
+#define DM9000_TSR1            0x03
+#define DM9000_TSR2            0x04
+#define DM9000_RCR             0x05
+#define DM9000_RSR             0x06
+#define DM9000_ROCR            0x07
+#define DM9000_BPTR            0x08
+#define DM9000_FCTR            0x09
+#define DM9000_FCR             0x0A
+#define DM9000_EPCR            0x0B
+#define DM9000_EPAR            0x0C
+#define DM9000_EPDRL           0x0D
+#define DM9000_EPDRH           0x0E
+#define DM9000_WCR             0x0F
+
+#define DM9000_PAR             0x10
+#define DM9000_MAR             0x16
+
+#define DM9000_GPCR           0x1e
+#define DM9000_GPR             0x1f
+#define DM9000_TRPAL           0x22
+#define DM9000_TRPAH           0x23
+#define DM9000_RWPAL           0x24
+#define DM9000_RWPAH           0x25
+
+#define DM9000_VIDL            0x28
+#define DM9000_VIDH            0x29
+#define DM9000_PIDL            0x2A
+#define DM9000_PIDH            0x2B
+
+#define DM9000_CHIPR           0x2C
+#define DM9000_SMCR            0x2F
+
+#define DM9000_MRCMDX          0xF0
+#define DM9000_MRCMD           0xF2
+#define DM9000_MRRL            0xF4
+#define DM9000_MRRH            0xF5
+#define DM9000_MWCMDX          0xF6
+#define DM9000_MWCMD           0xF8
+#define DM9000_MWRL            0xFA
+#define DM9000_MWRH            0xFB
+#define DM9000_TXPLL           0xFC
+#define DM9000_TXPLH           0xFD
+#define DM9000_ISR             0xFE
+#define DM9000_IMR             0xFF
+
+#define NCR_EXT_PHY         (1<<7)
+#define NCR_WAKEEN          (1<<6)
+#define NCR_FCOL            (1<<4)
+#define NCR_FDX             (1<<3)
+#define NCR_LBK             (3<<1)
+#define NCR_RST                    (1<<0)
+
+#define NSR_SPEED           (1<<7)
+#define NSR_LINKST          (1<<6)
+#define NSR_WAKEST          (1<<5)
+#define NSR_TX2END          (1<<3)
+#define NSR_TX1END          (1<<2)
+#define NSR_RXOV            (1<<1)
+
+#define TCR_TJDIS           (1<<6)
+#define TCR_EXCECM          (1<<5)
+#define TCR_PAD_DIS2        (1<<4)
+#define TCR_CRC_DIS2        (1<<3)
+#define TCR_PAD_DIS1        (1<<2)
+#define TCR_CRC_DIS1        (1<<1)
+#define TCR_TXREQ           (1<<0)
+
+#define TSR_TJTO            (1<<7)
+#define TSR_LC              (1<<6)
+#define TSR_NC              (1<<5)
+#define TSR_LCOL            (1<<4)
+#define TSR_COL             (1<<3)
+#define TSR_EC              (1<<2)
+
+#define RCR_WTDIS           (1<<6)
+#define RCR_DIS_LONG        (1<<5)
+#define RCR_DIS_CRC         (1<<4)
+#define RCR_ALL                    (1<<3)
+#define RCR_RUNT            (1<<2)
+#define RCR_PRMSC           (1<<1)
+#define RCR_RXEN            (1<<0)
+
+#define RSR_RF              (1<<7)
+#define RSR_MF              (1<<6)
+#define RSR_LCS             (1<<5)
+#define RSR_RWTO            (1<<4)
+#define RSR_PLE             (1<<3)
+#define RSR_AE              (1<<2)
+#define RSR_CE              (1<<1)
+#define RSR_FOE             (1<<0)
+
+#define FCTR_HWOT(ot)  (( ot & 0xf ) << 4 )
+#define FCTR_LWOT(ot)  ( ot & 0xf )
+
+#define IMR_PAR             (1<<7)
+#define IMR_ROOM            (1<<3)
+#define IMR_ROM             (1<<2)
+#define IMR_PTM             (1<<1)
+#define IMR_PRM             (1<<0)
+
+#define ISR_ROOS            (1<<3)
+#define ISR_ROS             (1<<2)
+#define ISR_PTS             (1<<1)
+#define ISR_PRS             (1<<0)
+#define ISR_CLR_STATUS      (ISR_ROOS | ISR_ROS | ISR_PTS | ISR_PRS)
+
+#define EPCR_REEP           (1<<5)
+#define EPCR_WEP            (1<<4)
+#define EPCR_EPOS           (1<<3)
+#define EPCR_ERPRR          (1<<2)
+#define EPCR_ERPRW          (1<<1)
+#define EPCR_ERRE           (1<<0)
+
+#define GPCR_GEP_CNTL       (1<<0)
+
+#define DM9000_PKT_RDY         0x01    /* Packet ready to receive */
+#define DM9000_PKT_MAX         1536    /* Received packet max size */
+
+#endif /* _DM9000X_H_ */
+
index 1b68dd5a49b6505ed133442273b910cf2898a3fc..4a47df5a9ff9c076ddee640a437eca7f7c9348c9 100644 (file)
 
 #define DRV_NAME               "e100"
 #define DRV_EXT                "-NAPI"
-#define DRV_VERSION            "3.3.6-k2"DRV_EXT
+#define DRV_VERSION            "3.4.8-k2"DRV_EXT
 #define DRV_DESCRIPTION                "Intel(R) PRO/100 Network Driver"
-#define DRV_COPYRIGHT          "Copyright(c) 1999-2004 Intel Corporation"
+#define DRV_COPYRIGHT          "Copyright(c) 1999-2005 Intel Corporation"
 #define PFX                    DRV_NAME ": "
 
 #define E100_WATCHDOG_PERIOD   (2 * HZ)
@@ -210,11 +210,17 @@ static struct pci_device_id e100_id_table[] = {
        INTEL_8255X_ETHERNET_DEVICE(0x1069, 6),
        INTEL_8255X_ETHERNET_DEVICE(0x106A, 6),
        INTEL_8255X_ETHERNET_DEVICE(0x106B, 6),
+       INTEL_8255X_ETHERNET_DEVICE(0x1091, 7),
+       INTEL_8255X_ETHERNET_DEVICE(0x1092, 7),
+       INTEL_8255X_ETHERNET_DEVICE(0x1093, 7),
+       INTEL_8255X_ETHERNET_DEVICE(0x1094, 7),
+       INTEL_8255X_ETHERNET_DEVICE(0x1095, 7),
        INTEL_8255X_ETHERNET_DEVICE(0x1209, 0),
        INTEL_8255X_ETHERNET_DEVICE(0x1229, 0),
        INTEL_8255X_ETHERNET_DEVICE(0x2449, 2),
        INTEL_8255X_ETHERNET_DEVICE(0x2459, 2),
        INTEL_8255X_ETHERNET_DEVICE(0x245D, 2),
+       INTEL_8255X_ETHERNET_DEVICE(0x27DC, 7),
        { 0, }
 };
 MODULE_DEVICE_TABLE(pci, e100_id_table);
@@ -269,6 +275,12 @@ enum scb_status {
        rus_mask         = 0x3C,
 };
 
+enum ru_state  {
+       RU_SUSPENDED = 0,
+       RU_RUNNING       = 1,
+       RU_UNINITIALIZED = -1,
+};
+
 enum scb_stat_ack {
        stat_ack_not_ours    = 0x00,
        stat_ack_sw_gen      = 0x04,
@@ -510,7 +522,7 @@ struct nic {
        struct rx *rx_to_use;
        struct rx *rx_to_clean;
        struct rfd blank_rfd;
-       int ru_running;
+       enum ru_state ru_running;
 
        spinlock_t cb_lock                      ____cacheline_aligned;
        spinlock_t cmd_lock;
@@ -539,6 +551,7 @@ struct nic {
        struct timer_list watchdog;
        struct timer_list blink_timer;
        struct mii_if_info mii;
+       struct work_struct tx_timeout_task;
        enum loopback loopback;
 
        struct mem *mem;
@@ -770,7 +783,7 @@ static int e100_eeprom_save(struct nic *nic, u16 start, u16 count)
        return 0;
 }
 
-#define E100_WAIT_SCB_TIMEOUT 40
+#define E100_WAIT_SCB_TIMEOUT 20000 /* we might have to wait 100ms!!! */
 static inline int e100_exec_cmd(struct nic *nic, u8 cmd, dma_addr_t dma_addr)
 {
        unsigned long flags;
@@ -840,6 +853,10 @@ static inline int e100_exec_cb(struct nic *nic, struct sk_buff *skb,
                         * because the controller is too busy, so
                         * let's just queue the command and try again
                         * when another command is scheduled. */
+                       if(err == -ENOSPC) {
+                               //request a reset
+                               schedule_work(&nic->tx_timeout_task);
+                       }
                        break;
                } else {
                        nic->cuc_cmd = cuc_resume;
@@ -884,7 +901,7 @@ static void mdio_write(struct net_device *netdev, int addr, int reg, int data)
 
 static void e100_get_defaults(struct nic *nic)
 {
-       struct param_range rfds = { .min = 64, .max = 256, .count = 64 };
+       struct param_range rfds = { .min = 16, .max = 256, .count = 64 };
        struct param_range cbs  = { .min = 64, .max = 256, .count = 64 };
 
        pci_read_config_byte(nic->pdev, PCI_REVISION_ID, &nic->rev_id);
@@ -899,8 +916,9 @@ static void e100_get_defaults(struct nic *nic)
        /* Quadwords to DMA into FIFO before starting frame transmit */
        nic->tx_threshold = 0xE0;
 
-       nic->tx_command = cpu_to_le16(cb_tx | cb_i | cb_tx_sf |
-               ((nic->mac >= mac_82558_D101_A4) ? cb_cid : 0));
+       /* no interrupt for every tx completion, delay = 256us if not 557*/
+       nic->tx_command = cpu_to_le16(cb_tx | cb_tx_sf |
+               ((nic->mac >= mac_82558_D101_A4) ? cb_cid : cb_i));
 
        /* Template for a freshly allocated RFD */
        nic->blank_rfd.command = cpu_to_le16(cb_el);
@@ -964,7 +982,8 @@ static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)
        if(nic->flags & multicast_all)
                config->multicast_all = 0x1;            /* 1=accept, 0=no */
 
-       if(!(nic->flags & wol_magic))
+       /* disable WoL when up */
+       if(netif_running(nic->netdev) || !(nic->flags & wol_magic))
                config->magic_packet_disable = 0x1;     /* 1=off, 0=on */
 
        if(nic->mac >= mac_82558_D101_A4) {
@@ -1203,7 +1222,9 @@ static void e100_update_stats(struct nic *nic)
                }
        }
 
-       e100_exec_cmd(nic, cuc_dump_reset, 0);
+       
+       if(e100_exec_cmd(nic, cuc_dump_reset, 0))
+               DPRINTK(TX_ERR, DEBUG, "exec cuc_dump_reset failed\n");
 }
 
 static void e100_adjust_adaptive_ifs(struct nic *nic, int speed, int duplex)
@@ -1279,12 +1300,15 @@ static inline void e100_xmit_prepare(struct nic *nic, struct cb *cb,
        struct sk_buff *skb)
 {
        cb->command = nic->tx_command;
+       /* interrupt every 16 packets regardless of delay */
+       if((nic->cbs_avail & ~15) == nic->cbs_avail) cb->command |= cb_i;
        cb->u.tcb.tbd_array = cb->dma_addr + offsetof(struct cb, u.tcb.tbd);
        cb->u.tcb.tcb_byte_count = 0;
        cb->u.tcb.threshold = nic->tx_threshold;
        cb->u.tcb.tbd_count = 1;
        cb->u.tcb.tbd.buf_addr = cpu_to_le32(pci_map_single(nic->pdev,
                skb->data, skb->len, PCI_DMA_TODEVICE));
+       // check for mapping failure?
        cb->u.tcb.tbd.size = cpu_to_le16(skb->len);
 }
 
@@ -1297,7 +1321,8 @@ static int e100_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
                /* SW workaround for ICH[x] 10Mbps/half duplex Tx hang.
                   Issue a NOP command followed by a 1us delay before
                   issuing the Tx command. */
-               e100_exec_cmd(nic, cuc_nop, 0);
+               if(e100_exec_cmd(nic, cuc_nop, 0))
+                       DPRINTK(TX_ERR, DEBUG, "exec cuc_nop failed\n");
                udelay(1);
        }
 
@@ -1415,12 +1440,18 @@ static int e100_alloc_cbs(struct nic *nic)
        return 0;
 }
 
-static inline void e100_start_receiver(struct nic *nic)
+static inline void e100_start_receiver(struct nic *nic, struct rx *rx)
 {
+       if(!nic->rxs) return;
+       if(RU_SUSPENDED != nic->ru_running) return;
+
+       /* handle init time starts */
+       if(!rx) rx = nic->rxs;
+
        /* (Re)start RU if suspended or idle and RFA is non-NULL */
-       if(!nic->ru_running && nic->rx_to_clean->skb) {
-               e100_exec_cmd(nic, ruc_start, nic->rx_to_clean->dma_addr);
-               nic->ru_running = 1;
+       if(rx->skb) {
+               e100_exec_cmd(nic, ruc_start, rx->dma_addr);
+               nic->ru_running = RU_RUNNING;
        }
 }
 
@@ -1437,6 +1468,13 @@ static inline int e100_rx_alloc_skb(struct nic *nic, struct rx *rx)
        rx->dma_addr = pci_map_single(nic->pdev, rx->skb->data,
                RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
 
+       if(pci_dma_mapping_error(rx->dma_addr)) {
+               dev_kfree_skb_any(rx->skb);
+               rx->skb = 0;
+               rx->dma_addr = 0;
+               return -ENOMEM;
+       }
+
        /* Link the RFD to end of RFA by linking previous RFD to
         * this one, and clearing EL bit of previous.  */
        if(rx->prev->skb) {
@@ -1471,7 +1509,7 @@ static inline int e100_rx_indicate(struct nic *nic, struct rx *rx,
 
        /* If data isn't ready, nothing to indicate */
        if(unlikely(!(rfd_status & cb_complete)))
-               return -EAGAIN;
+               return -ENODATA;
 
        /* Get actual data size */
        actual_size = le16_to_cpu(rfd->actual_size) & 0x3FFF;
@@ -1482,6 +1520,10 @@ static inline int e100_rx_indicate(struct nic *nic, struct rx *rx,
        pci_unmap_single(nic->pdev, rx->dma_addr,
                RFD_BUF_LEN, PCI_DMA_FROMDEVICE);
 
+       /* this allows for a fast restart without re-enabling interrupts */
+       if(le16_to_cpu(rfd->command) & cb_el)
+               nic->ru_running = RU_SUSPENDED;
+
        /* Pull off the RFD and put the actual data (minus eth hdr) */
        skb_reserve(skb, sizeof(struct rfd));
        skb_put(skb, actual_size);
@@ -1514,20 +1556,45 @@ static inline void e100_rx_clean(struct nic *nic, unsigned int *work_done,
        unsigned int work_to_do)
 {
        struct rx *rx;
+       int restart_required = 0;
+       struct rx *rx_to_start = NULL;
+
+       /* are we already rnr? then pay attention!!! this ensures that
+        * the state machine progression never allows a start with a 
+        * partially cleaned list, avoiding a race between hardware
+        * and rx_to_clean when in NAPI mode */
+       if(RU_SUSPENDED == nic->ru_running)
+               restart_required = 1;
 
        /* Indicate newly arrived packets */
        for(rx = nic->rx_to_clean; rx->skb; rx = nic->rx_to_clean = rx->next) {
-               if(e100_rx_indicate(nic, rx, work_done, work_to_do))
+               int err = e100_rx_indicate(nic, rx, work_done, work_to_do);
+               if(-EAGAIN == err) {
+                       /* hit quota so have more work to do, restart once
+                        * cleanup is complete */
+                       restart_required = 0;
+                       break;
+               } else if(-ENODATA == err)
                        break; /* No more to clean */
        }
 
+       /* save our starting point as the place we'll restart the receiver */
+       if(restart_required)
+               rx_to_start = nic->rx_to_clean;
+
        /* Alloc new skbs to refill list */
        for(rx = nic->rx_to_use; !rx->skb; rx = nic->rx_to_use = rx->next) {
                if(unlikely(e100_rx_alloc_skb(nic, rx)))
                        break; /* Better luck next time (see watchdog) */
        }
 
-       e100_start_receiver(nic);
+       if(restart_required) {
+               // ack the rnr?
+               writeb(stat_ack_rnr, &nic->csr->scb.stat_ack);
+               e100_start_receiver(nic, rx_to_start);
+               if(work_done)
+                       (*work_done)++;
+       }
 }
 
 static void e100_rx_clean_list(struct nic *nic)
@@ -1535,6 +1602,8 @@ static void e100_rx_clean_list(struct nic *nic)
        struct rx *rx;
        unsigned int i, count = nic->params.rfds.count;
 
+       nic->ru_running = RU_UNINITIALIZED;
+
        if(nic->rxs) {
                for(rx = nic->rxs, i = 0; i < count; rx++, i++) {
                        if(rx->skb) {
@@ -1548,7 +1617,6 @@ static void e100_rx_clean_list(struct nic *nic)
        }
 
        nic->rx_to_use = nic->rx_to_clean = NULL;
-       nic->ru_running = 0;
 }
 
 static int e100_rx_alloc_list(struct nic *nic)
@@ -1557,6 +1625,7 @@ static int e100_rx_alloc_list(struct nic *nic)
        unsigned int i, count = nic->params.rfds.count;
 
        nic->rx_to_use = nic->rx_to_clean = NULL;
+       nic->ru_running = RU_UNINITIALIZED;
 
        if(!(nic->rxs = kmalloc(sizeof(struct rx) * count, GFP_ATOMIC)))
                return -ENOMEM;
@@ -1572,6 +1641,7 @@ static int e100_rx_alloc_list(struct nic *nic)
        }
 
        nic->rx_to_use = nic->rx_to_clean = nic->rxs;
+       nic->ru_running = RU_SUSPENDED;
 
        return 0;
 }
@@ -1593,7 +1663,7 @@ static irqreturn_t e100_intr(int irq, void *dev_id, struct pt_regs *regs)
 
        /* We hit Receive No Resource (RNR); restart RU after cleaning */
        if(stat_ack & stat_ack_rnr)
-               nic->ru_running = 0;
+               nic->ru_running = RU_SUSPENDED;
 
        e100_disable_irq(nic);
        netif_rx_schedule(netdev);
@@ -1663,6 +1733,7 @@ static int e100_change_mtu(struct net_device *netdev, int new_mtu)
        return 0;
 }
 
+#ifdef CONFIG_PM
 static int e100_asf(struct nic *nic)
 {
        /* ASF can be enabled from eeprom */
@@ -1671,6 +1742,7 @@ static int e100_asf(struct nic *nic)
           !(nic->eeprom[eeprom_config_asf] & eeprom_gcl) &&
           ((nic->eeprom[eeprom_smbus_addr] & 0xFF) != 0xFE));
 }
+#endif
 
 static int e100_up(struct nic *nic)
 {
@@ -1683,13 +1755,16 @@ static int e100_up(struct nic *nic)
        if((err = e100_hw_init(nic)))
                goto err_clean_cbs;
        e100_set_multicast_list(nic->netdev);
-       e100_start_receiver(nic);
+       e100_start_receiver(nic, 0);
        mod_timer(&nic->watchdog, jiffies);
        if((err = request_irq(nic->pdev->irq, e100_intr, SA_SHIRQ,
                nic->netdev->name, nic->netdev)))
                goto err_no_irq;
-       e100_enable_irq(nic);
        netif_wake_queue(nic->netdev);
+       netif_poll_enable(nic->netdev);
+       /* enable ints _after_ enabling poll, preventing a race between
+        * disable ints+schedule */
+       e100_enable_irq(nic);
        return 0;
 
 err_no_irq:
@@ -1703,11 +1778,13 @@ err_rx_clean_list:
 
 static void e100_down(struct nic *nic)
 {
+       /* wait here for poll to complete */
+       netif_poll_disable(nic->netdev);
+       netif_stop_queue(nic->netdev);
        e100_hw_reset(nic);
        free_irq(nic->pdev->irq, nic->netdev);
        del_timer_sync(&nic->watchdog);
        netif_carrier_off(nic->netdev);
-       netif_stop_queue(nic->netdev);
        e100_clean_cbs(nic);
        e100_rx_clean_list(nic);
 }
@@ -1716,6 +1793,15 @@ static void e100_tx_timeout(struct net_device *netdev)
 {
        struct nic *nic = netdev_priv(netdev);
 
+       /* Reset outside of interrupt context, to avoid request_irq 
+        * in interrupt context */
+       schedule_work(&nic->tx_timeout_task);
+}
+
+static void e100_tx_timeout_task(struct net_device *netdev)
+{
+       struct nic *nic = netdev_priv(netdev);
+
        DPRINTK(TX_ERR, DEBUG, "scb.status=0x%02X\n",
                readb(&nic->csr->scb.status));
        e100_down(netdev_priv(netdev));
@@ -1749,7 +1835,7 @@ static int e100_loopback_test(struct nic *nic, enum loopback loopback_mode)
                mdio_write(nic->netdev, nic->mii.phy_id, MII_BMCR,
                        BMCR_LOOPBACK);
 
-       e100_start_receiver(nic);
+       e100_start_receiver(nic, 0);
 
        if(!(skb = dev_alloc_skb(ETH_DATA_LEN))) {
                err = -ENOMEM;
@@ -1869,7 +1955,6 @@ static int e100_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
        else
                nic->flags &= ~wol_magic;
 
-       pci_enable_wake(nic->pdev, 0, nic->flags & (wol_magic | e100_asf(nic)));
        e100_exec_cb(nic, NULL, e100_configure);
 
        return 0;
@@ -2223,6 +2308,7 @@ static int __devinit e100_probe(struct pci_dev *pdev,
 
        e100_get_defaults(nic);
 
+       /* locks must be initialized before calling hw_reset */
        spin_lock_init(&nic->cb_lock);
        spin_lock_init(&nic->cmd_lock);
 
@@ -2240,6 +2326,9 @@ static int __devinit e100_probe(struct pci_dev *pdev,
        nic->blink_timer.function = e100_blink_led;
        nic->blink_timer.data = (unsigned long)nic;
 
+       INIT_WORK(&nic->tx_timeout_task,
+               (void (*)(void *))e100_tx_timeout_task, netdev);
+
        if((err = e100_alloc(nic))) {
                DPRINTK(PROBE, ERR, "Cannot alloc driver memory, aborting.\n");
                goto err_out_iounmap;
@@ -2263,7 +2352,8 @@ static int __devinit e100_probe(struct pci_dev *pdev,
           (nic->eeprom[eeprom_id] & eeprom_id_wol))
                nic->flags |= wol_magic;
 
-       pci_enable_wake(pdev, 0, nic->flags & (wol_magic | e100_asf(nic)));
+       /* ack any pending wake events, disable PME */
+       pci_enable_wake(pdev, 0, 0);
 
        strcpy(netdev->name, "eth%d");
        if((err = register_netdev(netdev))) {
@@ -2335,7 +2425,10 @@ static int e100_resume(struct pci_dev *pdev)
 
        pci_set_power_state(pdev, PCI_D0);
        pci_restore_state(pdev);
-       e100_hw_init(nic);
+       /* ack any pending wake events, disable PME */
+       pci_enable_wake(pdev, 0, 0);
+       if(e100_hw_init(nic))
+               DPRINTK(HW, ERR, "e100_hw_init failed\n");
 
        netif_device_attach(netdev);
        if(netif_running(netdev))
@@ -2345,6 +2438,21 @@ static int e100_resume(struct pci_dev *pdev)
 }
 #endif
 
+
+static void e100_shutdown(struct device *dev)
+{
+       struct pci_dev *pdev = container_of(dev, struct pci_dev, dev);
+       struct net_device *netdev = pci_get_drvdata(pdev);
+       struct nic *nic = netdev_priv(netdev);
+
+#ifdef CONFIG_PM
+       pci_enable_wake(pdev, 0, nic->flags & (wol_magic | e100_asf(nic)));
+#else
+       pci_enable_wake(pdev, 0, nic->flags & (wol_magic));
+#endif
+}
+
+
 static struct pci_driver e100_driver = {
        .name =         DRV_NAME,
        .id_table =     e100_id_table,
@@ -2354,6 +2462,11 @@ static struct pci_driver e100_driver = {
        .suspend =      e100_suspend,
        .resume =       e100_resume,
 #endif
+
+       .driver = {
+               .shutdown = e100_shutdown,
+       }
+
 };
 
 static int __init e100_init_module(void)
index 148930d4e9bdaef73f2e7357b15c86d36286666f..af1e82c5b808d89371b7ad99ff100bb3b5ea666b 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   
-  Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
+  Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
   
   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 
@@ -112,6 +112,8 @@ struct e1000_adapter;
 #define E1000_MAX_82544_RXD               4096
 
 /* Supported Rx Buffer Sizes */
+#define E1000_RXBUFFER_128   128    /* Used for packet split */
+#define E1000_RXBUFFER_256   256    /* Used for packet split */
 #define E1000_RXBUFFER_2048  2048
 #define E1000_RXBUFFER_4096  4096
 #define E1000_RXBUFFER_8192  8192
@@ -137,15 +139,19 @@ struct e1000_adapter;
 /* How many Rx Buffers do we bundle into one write to the hardware ? */
 #define E1000_RX_BUFFER_WRITE  16      /* Must be power of 2 */
 
-#define AUTO_ALL_MODES       0
-#define E1000_EEPROM_82544_APM 0x0004
-#define E1000_EEPROM_APME    0x0400
+#define AUTO_ALL_MODES            0
+#define E1000_EEPROM_82544_APM    0x0400
+#define E1000_EEPROM_APME         0x0400
 
 #ifndef E1000_MASTER_SLAVE
 /* Switch to override PHY master/slave setting */
 #define E1000_MASTER_SLAVE     e1000_ms_hw_default
 #endif
 
+#define E1000_MNG_VLAN_NONE -1
+/* Number of packet split data buffers (not including the header buffer) */
+#define PS_PAGE_BUFFERS MAX_PS_BUFFERS-1
+
 /* only works for sizes that are powers of 2 */
 #define E1000_ROUNDUP(i, size) ((i) = (((i) + (size) - 1) & ~((size) - 1)))
 
@@ -159,6 +165,9 @@ struct e1000_buffer {
        uint16_t next_to_watch;
 };
 
+struct e1000_ps_page { struct page *ps_page[MAX_PS_BUFFERS]; };
+struct e1000_ps_page_dma { uint64_t ps_page_dma[MAX_PS_BUFFERS]; };
+
 struct e1000_desc_ring {
        /* pointer to the descriptor ring memory */
        void *desc;
@@ -174,12 +183,19 @@ struct e1000_desc_ring {
        unsigned int next_to_clean;
        /* array of buffer information structs */
        struct e1000_buffer *buffer_info;
+       /* arrays of page information for packet split */
+       struct e1000_ps_page *ps_page;
+       struct e1000_ps_page_dma *ps_page_dma;
 };
 
 #define E1000_DESC_UNUSED(R) \
        ((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \
        (R)->next_to_clean - (R)->next_to_use - 1)
 
+#define E1000_RX_DESC_PS(R, i)     \
+       (&(((union e1000_rx_desc_packet_split *)((R).desc))[i]))
+#define E1000_RX_DESC_EXT(R, i)            \
+       (&(((union e1000_rx_desc_extended *)((R).desc))[i]))
 #define E1000_GET_DESC(R, i, type)     (&(((struct type *)((R).desc))[i]))
 #define E1000_RX_DESC(R, i)            E1000_GET_DESC(R, i, e1000_rx_desc)
 #define E1000_TX_DESC(R, i)            E1000_GET_DESC(R, i, e1000_tx_desc)
@@ -192,6 +208,7 @@ struct e1000_adapter {
        struct timer_list watchdog_timer;
        struct timer_list phy_info_timer;
        struct vlan_group *vlgrp;
+       uint16_t mng_vlan_id;
        uint32_t bd_number;
        uint32_t rx_buffer_len;
        uint32_t part_num;
@@ -228,14 +245,23 @@ struct e1000_adapter {
        boolean_t detect_tx_hung;
 
        /* RX */
+#ifdef CONFIG_E1000_NAPI
+       boolean_t (*clean_rx) (struct e1000_adapter *adapter, int *work_done,
+                         int work_to_do);
+#else
+       boolean_t (*clean_rx) (struct e1000_adapter *adapter);
+#endif
+       void (*alloc_rx_buf) (struct e1000_adapter *adapter);
        struct e1000_desc_ring rx_ring;
        uint64_t hw_csum_err;
        uint64_t hw_csum_good;
        uint32_t rx_int_delay;
        uint32_t rx_abs_int_delay;
        boolean_t rx_csum;
+       boolean_t rx_ps;
        uint32_t gorcl;
        uint64_t gorcl_old;
+       uint16_t rx_ps_bsize0;
 
        /* Interrupt Throttle Rate */
        uint32_t itr;
@@ -257,5 +283,8 @@ struct e1000_adapter {
 
 
        int msg_enable;
+#ifdef CONFIG_PCI_MSI
+       boolean_t have_msi;
+#endif
 };
 #endif /* _E1000_H_ */
index 0a2ca7c73a4120f751918524a24682601ed51b3f..237247f74df48f0ae0c8e4c9998e7b8f6be9223d 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   
-  Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
+  Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
   
   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 
@@ -69,6 +69,7 @@ static const struct e1000_stats e1000_gstrings_stats[] = {
        { "rx_crc_errors", E1000_STAT(net_stats.rx_crc_errors) },
        { "rx_frame_errors", E1000_STAT(net_stats.rx_frame_errors) },
        { "rx_fifo_errors", E1000_STAT(net_stats.rx_fifo_errors) },
+       { "rx_no_buffer_count", E1000_STAT(stats.rnbc) },
        { "rx_missed_errors", E1000_STAT(net_stats.rx_missed_errors) },
        { "tx_aborted_errors", E1000_STAT(net_stats.tx_aborted_errors) },
        { "tx_carrier_errors", E1000_STAT(net_stats.tx_carrier_errors) },
@@ -593,7 +594,7 @@ e1000_set_ringparam(struct net_device *netdev,
        tx_old = adapter->tx_ring;
        rx_old = adapter->rx_ring;
 
-       if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) 
+       if((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
                return -EINVAL;
 
        if(netif_running(adapter->netdev))
@@ -784,8 +785,8 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
        /* Hook up test interrupt handler just for this test */
        if(!request_irq(irq, &e1000_test_intr, 0, netdev->name, netdev)) {
                shared_int = FALSE;
-       } else if(request_irq(irq, &e1000_test_intr, SA_SHIRQ, 
-                       netdev->name, netdev)){
+       } else if(request_irq(irq, &e1000_test_intr, SA_SHIRQ,
+                             netdev->name, netdev)){
                *data = 1;
                return -1;
        }
@@ -842,10 +843,8 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
                         * test failed.
                         */
                        adapter->test_icr = 0;
-                       E1000_WRITE_REG(&adapter->hw, IMC, 
-                                       (~mask & 0x00007FFF));
-                       E1000_WRITE_REG(&adapter->hw, ICS, 
-                                       (~mask & 0x00007FFF));
+                       E1000_WRITE_REG(&adapter->hw, IMC, ~mask & 0x00007FFF);
+                       E1000_WRITE_REG(&adapter->hw, ICS, ~mask & 0x00007FFF);
                        msec_delay(10);
 
                        if(adapter->test_icr) {
@@ -919,7 +918,8 @@ e1000_setup_desc_rings(struct e1000_adapter *adapter)
 
        /* Setup Tx descriptor ring and Tx buffers */
 
-       txdr->count = 80;
+       if(!txdr->count)
+               txdr->count = E1000_DEFAULT_TXD;   
 
        size = txdr->count * sizeof(struct e1000_buffer);
        if(!(txdr->buffer_info = kmalloc(size, GFP_KERNEL))) {
@@ -974,7 +974,8 @@ e1000_setup_desc_rings(struct e1000_adapter *adapter)
 
        /* Setup Rx descriptor ring and Rx buffers */
 
-       rxdr->count = 80;
+       if(!rxdr->count)
+               rxdr->count = E1000_DEFAULT_RXD;   
 
        size = rxdr->count * sizeof(struct e1000_buffer);
        if(!(rxdr->buffer_info = kmalloc(size, GFP_KERNEL))) {
@@ -1008,7 +1009,7 @@ e1000_setup_desc_rings(struct e1000_adapter *adapter)
                struct e1000_rx_desc *rx_desc = E1000_RX_DESC(*rxdr, i);
                struct sk_buff *skb;
 
-               if(!(skb = alloc_skb(E1000_RXBUFFER_2048 + NET_IP_ALIGN, 
+               if(!(skb = alloc_skb(E1000_RXBUFFER_2048 + NET_IP_ALIGN,
                                GFP_KERNEL))) {
                        ret_val = 6;
                        goto err_nomem;
@@ -1310,31 +1311,62 @@ e1000_run_loopback_test(struct e1000_adapter *adapter)
        struct e1000_desc_ring *txdr = &adapter->test_tx_ring;
        struct e1000_desc_ring *rxdr = &adapter->test_rx_ring;
        struct pci_dev *pdev = adapter->pdev;
-       int i, ret_val;
+       int i, j, k, l, lc, good_cnt, ret_val=0;
+       unsigned long time;
 
        E1000_WRITE_REG(&adapter->hw, RDT, rxdr->count - 1);
 
-       for(i = 0; i < 64; i++) {
-               e1000_create_lbtest_frame(txdr->buffer_info[i].skb, 1024);
-               pci_dma_sync_single_for_device(pdev, txdr->buffer_info[i].dma,
-                                           txdr->buffer_info[i].length,
-                                           PCI_DMA_TODEVICE);
-       }
-       E1000_WRITE_REG(&adapter->hw, TDT, i);
-
-       msec_delay(200);
-
-       i = 0;
-       do {
-               pci_dma_sync_single_for_cpu(pdev, rxdr->buffer_info[i].dma,
-                                           rxdr->buffer_info[i].length,
-                                           PCI_DMA_FROMDEVICE);
-
-               ret_val = e1000_check_lbtest_frame(rxdr->buffer_info[i].skb,
-                                                  1024);
-               i++;
-       } while (ret_val != 0 && i < 64);
+       /* Calculate the loop count based on the largest descriptor ring 
+        * The idea is to wrap the largest ring a number of times using 64
+        * send/receive pairs during each loop
+        */
 
+       if(rxdr->count <= txdr->count)
+               lc = ((txdr->count / 64) * 2) + 1;
+       else
+               lc = ((rxdr->count / 64) * 2) + 1;
+
+       k = l = 0;
+       for(j = 0; j <= lc; j++) { /* loop count loop */
+               for(i = 0; i < 64; i++) { /* send the packets */
+                       e1000_create_lbtest_frame(txdr->buffer_info[i].skb, 
+                                       1024);
+                       pci_dma_sync_single_for_device(pdev, 
+                                       txdr->buffer_info[k].dma,
+                                       txdr->buffer_info[k].length,
+                                       PCI_DMA_TODEVICE);
+                       if(unlikely(++k == txdr->count)) k = 0;
+               }
+               E1000_WRITE_REG(&adapter->hw, TDT, k);
+               msec_delay(200);
+               time = jiffies; /* set the start time for the receive */
+               good_cnt = 0;
+               do { /* receive the sent packets */
+                       pci_dma_sync_single_for_cpu(pdev, 
+                                       rxdr->buffer_info[l].dma,
+                                       rxdr->buffer_info[l].length,
+                                       PCI_DMA_FROMDEVICE);
+       
+                       ret_val = e1000_check_lbtest_frame(
+                                       rxdr->buffer_info[l].skb,
+                                       1024);
+                       if(!ret_val)
+                               good_cnt++;
+                       if(unlikely(++l == rxdr->count)) l = 0;
+                       /* time + 20 msecs (200 msecs on 2.4) is more than 
+                        * enough time to complete the receives, if it's 
+                        * exceeded, break and error off
+                        */
+               } while (good_cnt < 64 && jiffies < (time + 20));
+               if(good_cnt != 64) {
+                       ret_val = 13; /* ret_val is the same as mis-compare */
+                       break; 
+               }
+               if(jiffies >= (time + 2)) {
+                       ret_val = 14; /* error code for time out error */
+                       break;
+               }
+       } /* end loop count loop */
        return ret_val;
 }
 
@@ -1354,13 +1386,12 @@ static int
 e1000_link_test(struct e1000_adapter *adapter, uint64_t *data)
 {
        *data = 0;
-
        if (adapter->hw.media_type == e1000_media_type_internal_serdes) {
                int i = 0;
                adapter->hw.serdes_link_down = TRUE;
 
-               /* on some blade server designs link establishment */
-               /* could take as long as 2-3 minutes.              */
+               /* On some blade server designs, link establishment
+                * could take as long as 2-3 minutes */
                do {
                        e1000_check_for_link(&adapter->hw);
                        if (adapter->hw.serdes_link_down == FALSE)
@@ -1368,9 +1399,11 @@ e1000_link_test(struct e1000_adapter *adapter, uint64_t *data)
                        msec_delay(20);
                } while (i++ < 3750);
 
-               *data = 1; 
+               *data = 1;
        } else {
                e1000_check_for_link(&adapter->hw);
+               if(adapter->hw.autoneg)  /* if auto_neg is set wait for it */
+                       msec_delay(4000);
 
                if(!(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU)) {
                        *data = 1;
index 786a9b935659fbeec6d162df0c6f17d5696ea15b..723589b28be5d7a1716e89858ae1fe6303d9dd63 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   
-  Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
+  Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
   
   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 
@@ -63,10 +63,11 @@ static uint16_t e1000_shift_in_ee_bits(struct e1000_hw *hw, uint16_t count);
 static int32_t e1000_acquire_eeprom(struct e1000_hw *hw);
 static void e1000_release_eeprom(struct e1000_hw *hw);
 static void e1000_standby_eeprom(struct e1000_hw *hw);
-static int32_t e1000_id_led_init(struct e1000_hw * hw);
 static int32_t e1000_set_vco_speed(struct e1000_hw *hw);
 static int32_t e1000_polarity_reversal_workaround(struct e1000_hw *hw);
 static int32_t e1000_set_phy_mode(struct e1000_hw *hw);
+static int32_t e1000_host_if_read_cookie(struct e1000_hw *hw, uint8_t *buffer);
+static uint8_t e1000_calculate_mng_checksum(char *buffer, uint32_t length);
 
 /* IGP cable length table */
 static const
@@ -80,6 +81,17 @@ uint16_t e1000_igp_cable_length_table[IGP01E1000_AGC_LENGTH_TABLE_SIZE] =
       100, 100, 100, 100, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
       110, 110, 110, 110, 110, 110, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120};
 
+static const
+uint16_t e1000_igp_2_cable_length_table[IGP02E1000_AGC_LENGTH_TABLE_SIZE] =
+    { 8, 13, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43,
+      22, 24, 27, 30, 32, 35, 37, 40, 42, 44, 47, 49, 51, 54, 56, 58,
+      32, 35, 38, 41, 44, 47, 50, 53, 55, 58, 61, 63, 66, 69, 71, 74,
+      43, 47, 51, 54, 58, 61, 64, 67, 71, 74, 77, 80, 82, 85, 88, 90,
+      57, 62, 66, 70, 74, 77, 81, 85, 88, 91, 94, 97, 100, 103, 106, 108,
+      73, 78, 82, 87, 91, 95, 98, 102, 105, 109, 112, 114, 117, 119, 122, 124,
+      91, 96, 101, 105, 109, 113, 116, 119, 122, 125, 127, 128, 128, 128, 128, 128,
+      108, 113, 117, 121, 124, 127, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128};
+
 
 /******************************************************************************
  * Set the phy type member in the hw struct.
@@ -91,10 +103,14 @@ e1000_set_phy_type(struct e1000_hw *hw)
 {
     DEBUGFUNC("e1000_set_phy_type");
 
+    if(hw->mac_type == e1000_undefined)
+        return -E1000_ERR_PHY_TYPE;
+
     switch(hw->phy_id) {
     case M88E1000_E_PHY_ID:
     case M88E1000_I_PHY_ID:
     case M88E1011_I_PHY_ID:
+    case M88E1111_I_PHY_ID:
         hw->phy_type = e1000_phy_m88;
         break;
     case IGP01E1000_I_PHY_ID:
@@ -128,7 +144,6 @@ e1000_phy_init_script(struct e1000_hw *hw)
 
     DEBUGFUNC("e1000_phy_init_script");
 
-
     if(hw->phy_init_script) {
         msec_delay(20);
 
@@ -271,6 +286,7 @@ e1000_set_mac_type(struct e1000_hw *hw)
     case E1000_DEV_ID_82546GB_FIBER:
     case E1000_DEV_ID_82546GB_SERDES:
     case E1000_DEV_ID_82546GB_PCIE:
+    case E1000_DEV_ID_82546GB_QUAD_COPPER:
         hw->mac_type = e1000_82546_rev_3;
         break;
     case E1000_DEV_ID_82541EI:
@@ -289,12 +305,19 @@ e1000_set_mac_type(struct e1000_hw *hw)
     case E1000_DEV_ID_82547GI:
         hw->mac_type = e1000_82547_rev_2;
         break;
+    case E1000_DEV_ID_82573E:
+    case E1000_DEV_ID_82573E_IAMT:
+        hw->mac_type = e1000_82573;
+        break;
     default:
         /* Should never have loaded on this device */
         return -E1000_ERR_MAC_TYPE;
     }
 
     switch(hw->mac_type) {
+    case e1000_82573:
+        hw->eeprom_semaphore_present = TRUE;
+        /* fall through */
     case e1000_82541:
     case e1000_82547:
     case e1000_82541_rev_2:
@@ -360,6 +383,9 @@ e1000_reset_hw(struct e1000_hw *hw)
     uint32_t icr;
     uint32_t manc;
     uint32_t led_ctrl;
+    uint32_t timeout;
+    uint32_t extcnf_ctrl;
+    int32_t ret_val;
 
     DEBUGFUNC("e1000_reset_hw");
 
@@ -369,6 +395,15 @@ e1000_reset_hw(struct e1000_hw *hw)
         e1000_pci_clear_mwi(hw);
     }
 
+    if(hw->bus_type == e1000_bus_type_pci_express) {
+        /* Prevent the PCI-E bus from sticking if there is no TLP connection
+         * on the last TLP read/write transaction when MAC is reset.
+         */
+        if(e1000_disable_pciex_master(hw) != E1000_SUCCESS) {
+            DEBUGOUT("PCI-E Master disable polling has failed.\n");
+        }
+    }
+
     /* Clear interrupt mask to stop board from generating interrupts */
     DEBUGOUT("Masking off all interrupts\n");
     E1000_WRITE_REG(hw, IMC, 0xffffffff);
@@ -393,10 +428,32 @@ e1000_reset_hw(struct e1000_hw *hw)
 
     /* Must reset the PHY before resetting the MAC */
     if((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
-        E1000_WRITE_REG_IO(hw, CTRL, (ctrl | E1000_CTRL_PHY_RST));
+        E1000_WRITE_REG(hw, CTRL, (ctrl | E1000_CTRL_PHY_RST));
         msec_delay(5);
     }
 
+    /* Must acquire the MDIO ownership before MAC reset.
+     * Ownership defaults to firmware after a reset. */
+    if(hw->mac_type == e1000_82573) {
+        timeout = 10;
+
+        extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL);
+        extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP;
+
+        do {
+            E1000_WRITE_REG(hw, EXTCNF_CTRL, extcnf_ctrl);
+            extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL);
+
+            if(extcnf_ctrl & E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP)
+                break;
+            else
+                extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP;
+
+            msec_delay(2);
+            timeout--;
+        } while(timeout);
+    }
+
     /* Issue a global reset to the MAC.  This will reset the chip's
      * transmit, receive, DMA, and link units.  It will not effect
      * the current PCI configuration.  The global reset bit is self-
@@ -450,6 +507,18 @@ e1000_reset_hw(struct e1000_hw *hw)
             /* Wait for EEPROM reload */
             msec_delay(20);
             break;
+        case e1000_82573:
+            udelay(10);
+            ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
+            ctrl_ext |= E1000_CTRL_EXT_EE_RST;
+            E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext);
+            E1000_WRITE_FLUSH(hw);
+            /* fall through */
+            ret_val = e1000_get_auto_rd_done(hw);
+            if(ret_val)
+                /* We don't want to continue accessing MAC registers. */
+                return ret_val;
+            break;
         default:
             /* Wait for EEPROM reload (it happens automatically) */
             msec_delay(5);
@@ -457,7 +526,7 @@ e1000_reset_hw(struct e1000_hw *hw)
     }
 
     /* Disable HW ARPs on ASF enabled adapters */
-    if(hw->mac_type >= e1000_82540) {
+    if(hw->mac_type >= e1000_82540 && hw->mac_type <= e1000_82547_rev_2) {
         manc = E1000_READ_REG(hw, MANC);
         manc &= ~(E1000_MANC_ARP_EN);
         E1000_WRITE_REG(hw, MANC, manc);
@@ -510,6 +579,8 @@ e1000_init_hw(struct e1000_hw *hw)
     uint16_t pcix_stat_hi_word;
     uint16_t cmd_mmrbc;
     uint16_t stat_mmrbc;
+    uint32_t mta_size;
+
     DEBUGFUNC("e1000_init_hw");
 
     /* Initialize Identification LED */
@@ -524,8 +595,8 @@ e1000_init_hw(struct e1000_hw *hw)
 
     /* Disabling VLAN filtering. */
     DEBUGOUT("Initializing the IEEE VLAN\n");
-    E1000_WRITE_REG(hw, VET, 0);
-
+    if (hw->mac_type < e1000_82545_rev_3)
+        E1000_WRITE_REG(hw, VET, 0);
     e1000_clear_vfta(hw);
 
     /* For 82542 (rev 2.0), disable MWI and put the receiver into reset */
@@ -553,14 +624,16 @@ e1000_init_hw(struct e1000_hw *hw)
 
     /* Zero out the Multicast HASH table */
     DEBUGOUT("Zeroing the MTA\n");
-    for(i = 0; i < E1000_MC_TBL_SIZE; i++)
+    mta_size = E1000_MC_TBL_SIZE;
+    for(i = 0; i < mta_size; i++)
         E1000_WRITE_REG_ARRAY(hw, MTA, i, 0);
 
     /* Set the PCI priority bit correctly in the CTRL register.  This
      * determines if the adapter gives priority to receives, or if it
-     * gives equal priority to transmits and receives.
+     * gives equal priority to transmits and receives.  Valid only on
+     * 82542 and 82543 silicon.
      */
-    if(hw->dma_fairness) {
+    if(hw->dma_fairness && hw->mac_type <= e1000_82543) {
         ctrl = E1000_READ_REG(hw, CTRL);
         E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PRIOR);
     }
@@ -598,9 +671,21 @@ e1000_init_hw(struct e1000_hw *hw)
     if(hw->mac_type > e1000_82544) {
         ctrl = E1000_READ_REG(hw, TXDCTL);
         ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | E1000_TXDCTL_FULL_TX_DESC_WB;
+        switch (hw->mac_type) {
+        default:
+            break;
+        case e1000_82573:
+            ctrl |= E1000_TXDCTL_COUNT_DESC;
+            break;
+        }
         E1000_WRITE_REG(hw, TXDCTL, ctrl);
     }
 
+    if (hw->mac_type == e1000_82573) {
+        e1000_enable_tx_pkt_filtering(hw); 
+    }
+
+
     /* Clear all of the statistics registers (clear on read).  It is
      * important that we do this after we have tried to establish link
      * because the symbol error count will increment wildly if there
@@ -679,7 +764,7 @@ e1000_setup_link(struct e1000_hw *hw)
      * control setting, then the variable hw->fc will
      * be initialized based on a value in the EEPROM.
      */
-    if(e1000_read_eeprom(hw, EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data) < 0) {
+    if(e1000_read_eeprom(hw, EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data)) {
         DEBUGOUT("EEPROM Read Error\n");
         return -E1000_ERR_EEPROM;
     }
@@ -736,6 +821,7 @@ e1000_setup_link(struct e1000_hw *hw)
     E1000_WRITE_REG(hw, FCAL, FLOW_CONTROL_ADDRESS_LOW);
     E1000_WRITE_REG(hw, FCAH, FLOW_CONTROL_ADDRESS_HIGH);
     E1000_WRITE_REG(hw, FCT, FLOW_CONTROL_TYPE);
+
     E1000_WRITE_REG(hw, FCTTV, hw->fc_pause_time);
 
     /* Set the flow control receive threshold registers.  Normally,
@@ -906,20 +992,18 @@ e1000_setup_fiber_serdes_link(struct e1000_hw *hw)
 }
 
 /******************************************************************************
-* Detects which PHY is present and the speed and duplex
+* Make sure we have a valid PHY and change PHY mode before link setup.
 *
 * hw - Struct containing variables accessed by shared code
 ******************************************************************************/
 static int32_t
-e1000_setup_copper_link(struct e1000_hw *hw)
+e1000_copper_link_preconfig(struct e1000_hw *hw)
 {
     uint32_t ctrl;
-    uint32_t led_ctrl;
     int32_t ret_val;
-    uint16_t i;
     uint16_t phy_data;
 
-    DEBUGFUNC("e1000_setup_copper_link");
+    DEBUGFUNC("e1000_copper_link_preconfig");
 
     ctrl = E1000_READ_REG(hw, CTRL);
     /* With 82543, we need to force speed and duplex on the MAC equal to what
@@ -933,7 +1017,9 @@ e1000_setup_copper_link(struct e1000_hw *hw)
     } else {
         ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX | E1000_CTRL_SLU);
         E1000_WRITE_REG(hw, CTRL, ctrl);
-        e1000_phy_hw_reset(hw);
+        ret_val = e1000_phy_hw_reset(hw);
+        if(ret_val)
+            return ret_val;
     }
 
     /* Make sure we have a valid PHY */
@@ -961,353 +1047,451 @@ e1000_setup_copper_link(struct e1000_hw *hw)
        hw->mac_type == e1000_82541_rev_2 || hw->mac_type == e1000_82547_rev_2)
         hw->phy_reset_disable = FALSE;
 
-    if(!hw->phy_reset_disable) {
-        if (hw->phy_type == e1000_phy_igp) {
-
-            ret_val = e1000_phy_reset(hw);
-            if(ret_val) {
-                DEBUGOUT("Error Resetting the PHY\n");
-                return ret_val;
-            }
-
-            /* Wait 10ms for MAC to configure PHY from eeprom settings */
-            msec_delay(15);
+   return E1000_SUCCESS;
+}
 
-            /* Configure activity LED after PHY reset */
-            led_ctrl = E1000_READ_REG(hw, LEDCTL);
-            led_ctrl &= IGP_ACTIVITY_LED_MASK;
-            led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
-            E1000_WRITE_REG(hw, LEDCTL, led_ctrl);
 
-            /* disable lplu d3 during driver init */
-            ret_val = e1000_set_d3_lplu_state(hw, FALSE);
-            if(ret_val) {
-                DEBUGOUT("Error Disabling LPLU D3\n");
-                return ret_val;
-            }
+/********************************************************************
+* Copper link setup for e1000_phy_igp series.
+*
+* hw - Struct containing variables accessed by shared code
+*********************************************************************/
+static int32_t
+e1000_copper_link_igp_setup(struct e1000_hw *hw)
+{
+    uint32_t led_ctrl;
+    int32_t ret_val;
+    uint16_t phy_data;
 
-            /* Configure mdi-mdix settings */
-            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,
-                                         &phy_data);
-            if(ret_val)
-                return ret_val;
+    DEBUGFUNC("e1000_copper_link_igp_setup");
 
-            if((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
-                hw->dsp_config_state = e1000_dsp_config_disabled;
-                /* Force MDI for earlier revs of the IGP PHY */
-                phy_data &= ~(IGP01E1000_PSCR_AUTO_MDIX |
-                              IGP01E1000_PSCR_FORCE_MDI_MDIX);
-                hw->mdix = 1;
+    if (hw->phy_reset_disable)
+        return E1000_SUCCESS;
+    
+    ret_val = e1000_phy_reset(hw);
+    if (ret_val) {
+        DEBUGOUT("Error Resetting the PHY\n");
+        return ret_val;
+    }
 
-            } else {
-                hw->dsp_config_state = e1000_dsp_config_enabled;
-                phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX;
-
-                switch (hw->mdix) {
-                case 1:
-                    phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX;
-                    break;
-                case 2:
-                    phy_data |= IGP01E1000_PSCR_FORCE_MDI_MDIX;
-                    break;
-                case 0:
-                default:
-                    phy_data |= IGP01E1000_PSCR_AUTO_MDIX;
-                    break;
-                }
-            }
-            ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,
-                                          phy_data);
-            if(ret_val)
-                return ret_val;
+    /* Wait 10ms for MAC to configure PHY from eeprom settings */
+    msec_delay(15);
 
-            /* set auto-master slave resolution settings */
-            if(hw->autoneg) {
-                e1000_ms_type phy_ms_setting = hw->master_slave;
+    /* Configure activity LED after PHY reset */
+    led_ctrl = E1000_READ_REG(hw, LEDCTL);
+    led_ctrl &= IGP_ACTIVITY_LED_MASK;
+    led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
+    E1000_WRITE_REG(hw, LEDCTL, led_ctrl);
 
-                if(hw->ffe_config_state == e1000_ffe_config_active)
-                    hw->ffe_config_state = e1000_ffe_config_enabled;
+    /* disable lplu d3 during driver init */
+    ret_val = e1000_set_d3_lplu_state(hw, FALSE);
+    if (ret_val) {
+        DEBUGOUT("Error Disabling LPLU D3\n");
+        return ret_val;
+    }
 
-                if(hw->dsp_config_state == e1000_dsp_config_activated)
-                    hw->dsp_config_state = e1000_dsp_config_enabled;
+    /* disable lplu d0 during driver init */
+    ret_val = e1000_set_d0_lplu_state(hw, FALSE);
+    if (ret_val) {
+        DEBUGOUT("Error Disabling LPLU D0\n");
+        return ret_val;
+    }
+    /* Configure mdi-mdix settings */
+    ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data);
+    if (ret_val)
+        return ret_val;
 
-                /* when autonegotiation advertisment is only 1000Mbps then we
-                 * should disable SmartSpeed and enable Auto MasterSlave
-                 * resolution as hardware default. */
-                if(hw->autoneg_advertised == ADVERTISE_1000_FULL) {
-                    /* Disable SmartSpeed */
-                    ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
-                                                 &phy_data);
-                    if(ret_val)
-                        return ret_val;
-                    phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
-                    ret_val = e1000_write_phy_reg(hw,
-                                                  IGP01E1000_PHY_PORT_CONFIG,
-                                                  phy_data);
-                    if(ret_val)
-                        return ret_val;
-                    /* Set auto Master/Slave resolution process */
-                    ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);
-                    if(ret_val)
-                        return ret_val;
-                    phy_data &= ~CR_1000T_MS_ENABLE;
-                    ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);
-                    if(ret_val)
-                        return ret_val;
-                }
+    if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
+        hw->dsp_config_state = e1000_dsp_config_disabled;
+        /* Force MDI for earlier revs of the IGP PHY */
+        phy_data &= ~(IGP01E1000_PSCR_AUTO_MDIX | IGP01E1000_PSCR_FORCE_MDI_MDIX);
+        hw->mdix = 1;
 
-                ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);
-                if(ret_val)
-                    return ret_val;
+    } else {
+        hw->dsp_config_state = e1000_dsp_config_enabled;
+        phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX;
 
-                /* load defaults for future use */
-                hw->original_master_slave = (phy_data & CR_1000T_MS_ENABLE) ?
-                                            ((phy_data & CR_1000T_MS_VALUE) ?
-                                             e1000_ms_force_master :
-                                             e1000_ms_force_slave) :
-                                             e1000_ms_auto;
-
-                switch (phy_ms_setting) {
-                case e1000_ms_force_master:
-                    phy_data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE);
-                    break;
-                case e1000_ms_force_slave:
-                    phy_data |= CR_1000T_MS_ENABLE;
-                    phy_data &= ~(CR_1000T_MS_VALUE);
-                    break;
-                case e1000_ms_auto:
-                    phy_data &= ~CR_1000T_MS_ENABLE;
-                default:
-                    break;
-                }
-                ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);
-                if(ret_val)
-                    return ret_val;
-            }
-        } else {
-            /* Enable CRS on TX. This must be set for half-duplex operation. */
-            ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
-                                         &phy_data);
-            if(ret_val)
-                return ret_val;
+        switch (hw->mdix) {
+        case 1:
+            phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX;
+            break;
+        case 2:
+            phy_data |= IGP01E1000_PSCR_FORCE_MDI_MDIX;
+            break;
+        case 0:
+        default:
+            phy_data |= IGP01E1000_PSCR_AUTO_MDIX;
+            break;
+        }
+    }
+    ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data);
+    if(ret_val)
+        return ret_val;
 
-            phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
+    /* set auto-master slave resolution settings */
+    if(hw->autoneg) {
+        e1000_ms_type phy_ms_setting = hw->master_slave;
 
-            /* Options:
-             *   MDI/MDI-X = 0 (default)
-             *   0 - Auto for all speeds
-             *   1 - MDI mode
-             *   2 - MDI-X mode
-             *   3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes)
-             */
-            phy_data &= ~M88E1000_PSCR_AUTO_X_MODE;
+        if(hw->ffe_config_state == e1000_ffe_config_active)
+            hw->ffe_config_state = e1000_ffe_config_enabled;
 
-            switch (hw->mdix) {
-            case 1:
-                phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE;
-                break;
-            case 2:
-                phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE;
-                break;
-            case 3:
-                phy_data |= M88E1000_PSCR_AUTO_X_1000T;
-                break;
-            case 0:
-            default:
-                phy_data |= M88E1000_PSCR_AUTO_X_MODE;
-                break;
-            }
+        if(hw->dsp_config_state == e1000_dsp_config_activated)
+            hw->dsp_config_state = e1000_dsp_config_enabled;
 
-            /* Options:
-             *   disable_polarity_correction = 0 (default)
-             *       Automatic Correction for Reversed Cable Polarity
-             *   0 - Disabled
-             *   1 - Enabled
-             */
-            phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL;
-            if(hw->disable_polarity_correction == 1)
-                phy_data |= M88E1000_PSCR_POLARITY_REVERSAL;
-            ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
-                                          phy_data);
+        /* when autonegotiation advertisment is only 1000Mbps then we
+          * should disable SmartSpeed and enable Auto MasterSlave
+          * resolution as hardware default. */
+        if(hw->autoneg_advertised == ADVERTISE_1000_FULL) {
+            /* Disable SmartSpeed */
+            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &phy_data);
             if(ret_val)
                 return ret_val;
-
-            /* Force TX_CLK in the Extended PHY Specific Control Register
-             * to 25MHz clock.
-             */
-            ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL,
-                                         &phy_data);
+            phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
+            ret_val = e1000_write_phy_reg(hw,
+                                                  IGP01E1000_PHY_PORT_CONFIG,
+                                                  phy_data);
+            if(ret_val)
+                return ret_val;
+            /* Set auto Master/Slave resolution process */
+            ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);
+            if(ret_val)
+                return ret_val;
+            phy_data &= ~CR_1000T_MS_ENABLE;
+            ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);
             if(ret_val)
                 return ret_val;
+        }
 
-            phy_data |= M88E1000_EPSCR_TX_CLK_25;
+        ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);
+        if(ret_val)
+            return ret_val;
 
-            if (hw->phy_revision < M88E1011_I_REV_4) {
-                /* Configure Master and Slave downshift values */
-                phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK |
-                              M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK);
-                phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X |
-                             M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X);
-                ret_val = e1000_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL,
-                                              phy_data);
-                if(ret_val)
-                    return ret_val;
-            }
+        /* load defaults for future use */
+        hw->original_master_slave = (phy_data & CR_1000T_MS_ENABLE) ?
+                                        ((phy_data & CR_1000T_MS_VALUE) ?
+                                         e1000_ms_force_master :
+                                         e1000_ms_force_slave) :
+                                         e1000_ms_auto;
 
-            /* SW Reset the PHY so all changes take effect */
-            ret_val = e1000_phy_reset(hw);
-            if(ret_val) {
-                DEBUGOUT("Error Resetting the PHY\n");
-                return ret_val;
-            }
+        switch (phy_ms_setting) {
+        case e1000_ms_force_master:
+            phy_data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE);
+            break;
+        case e1000_ms_force_slave:
+            phy_data |= CR_1000T_MS_ENABLE;
+            phy_data &= ~(CR_1000T_MS_VALUE);
+            break;
+        case e1000_ms_auto:
+            phy_data &= ~CR_1000T_MS_ENABLE;
+            default:
+            break;
+        }
+        ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);
+        if(ret_val)
+            return ret_val;
         }
 
-        /* Options:
-         *   autoneg = 1 (default)
-         *      PHY will advertise value(s) parsed from
-         *      autoneg_advertised and fc
-         *   autoneg = 0
-         *      PHY will be set to 10H, 10F, 100H, or 100F
-         *      depending on value parsed from forced_speed_duplex.
-         */
+   return E1000_SUCCESS;
+}
 
-        /* Is autoneg enabled?  This is enabled by default or by software
-         * override.  If so, call e1000_phy_setup_autoneg routine to parse the
-         * autoneg_advertised and fc options. If autoneg is NOT enabled, then
-         * the user should have provided a speed/duplex override.  If so, then
-         * call e1000_phy_force_speed_duplex to parse and set this up.
-         */
-        if(hw->autoneg) {
-            /* Perform some bounds checking on the hw->autoneg_advertised
-             * parameter.  If this variable is zero, then set it to the default.
-             */
-            hw->autoneg_advertised &= AUTONEG_ADVERTISE_SPEED_DEFAULT;
 
-            /* If autoneg_advertised is zero, we assume it was not defaulted
-             * by the calling code so we set to advertise full capability.
-             */
-            if(hw->autoneg_advertised == 0)
-                hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT;
+/********************************************************************
+* Copper link setup for e1000_phy_m88 series.
+*
+* hw - Struct containing variables accessed by shared code
+*********************************************************************/
+static int32_t
+e1000_copper_link_mgp_setup(struct e1000_hw *hw)
+{
+    int32_t ret_val;
+    uint16_t phy_data;
 
-            DEBUGOUT("Reconfiguring auto-neg advertisement params\n");
-            ret_val = e1000_phy_setup_autoneg(hw);
-            if(ret_val) {
-                DEBUGOUT("Error Setting up Auto-Negotiation\n");
-                return ret_val;
-            }
-            DEBUGOUT("Restarting Auto-Neg\n");
+    DEBUGFUNC("e1000_copper_link_mgp_setup");
 
-            /* Restart auto-negotiation by setting the Auto Neg Enable bit and
-             * the Auto Neg Restart bit in the PHY control register.
-             */
-            ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data);
-            if(ret_val)
-                return ret_val;
+    if(hw->phy_reset_disable)
+        return E1000_SUCCESS;
+    
+    /* Enable CRS on TX. This must be set for half-duplex operation. */
+    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
+    if(ret_val)
+        return ret_val;
 
-            phy_data |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG);
-            ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data);
-            if(ret_val)
-                return ret_val;
+    phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
 
-            /* Does the user want to wait for Auto-Neg to complete here, or
-             * check at a later time (for example, callback routine).
-             */
-            if(hw->wait_autoneg_complete) {
-                ret_val = e1000_wait_autoneg(hw);
-                if(ret_val) {
-                    DEBUGOUT("Error while waiting for autoneg to complete\n");
-                    return ret_val;
-                }
-            }
-            hw->get_link_status = TRUE;
-        } else {
-            DEBUGOUT("Forcing speed and duplex\n");
-            ret_val = e1000_phy_force_speed_duplex(hw);
-            if(ret_val) {
-                DEBUGOUT("Error Forcing Speed and Duplex\n");
-                return ret_val;
-            }
-        }
-    } /* !hw->phy_reset_disable */
+    /* Options:
+     *   MDI/MDI-X = 0 (default)
+     *   0 - Auto for all speeds
+     *   1 - MDI mode
+     *   2 - MDI-X mode
+     *   3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes)
+     */
+    phy_data &= ~M88E1000_PSCR_AUTO_X_MODE;
 
-    /* Check link status. Wait up to 100 microseconds for link to become
-     * valid.
+    switch (hw->mdix) {
+    case 1:
+        phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE;
+        break;
+    case 2:
+        phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE;
+        break;
+    case 3:
+        phy_data |= M88E1000_PSCR_AUTO_X_1000T;
+        break;
+    case 0:
+    default:
+        phy_data |= M88E1000_PSCR_AUTO_X_MODE;
+        break;
+    }
+
+    /* Options:
+     *   disable_polarity_correction = 0 (default)
+     *       Automatic Correction for Reversed Cable Polarity
+     *   0 - Disabled
+     *   1 - Enabled
      */
-    for(i = 0; i < 10; i++) {
-        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
+    phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL;
+    if(hw->disable_polarity_correction == 1)
+        phy_data |= M88E1000_PSCR_POLARITY_REVERSAL;
+        ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
         if(ret_val)
             return ret_val;
-        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
+
+    /* Force TX_CLK in the Extended PHY Specific Control Register
+     * to 25MHz clock.
+     */
+    ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data);
+    if(ret_val)
+        return ret_val;
+
+    phy_data |= M88E1000_EPSCR_TX_CLK_25;
+
+    if (hw->phy_revision < M88E1011_I_REV_4) {
+        /* Configure Master and Slave downshift values */
+        phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK |
+                              M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK);
+        phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X |
+                             M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X);
+        ret_val = e1000_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data);
         if(ret_val)
             return ret_val;
+    }
 
-        if(phy_data & MII_SR_LINK_STATUS) {
-            /* We have link, so we need to finish the config process:
-             *   1) Set up the MAC to the current PHY speed/duplex
-             *      if we are on 82543.  If we
-             *      are on newer silicon, we only need to configure
-             *      collision distance in the Transmit Control Register.
-             *   2) Set up flow control on the MAC to that established with
-             *      the link partner.
-             */
-            if(hw->mac_type >= e1000_82544) {
-                e1000_config_collision_dist(hw);
-            } else {
-                ret_val = e1000_config_mac_to_phy(hw);
-                if(ret_val) {
-                    DEBUGOUT("Error configuring MAC to PHY settings\n");
-                    return ret_val;
-                }
-            }
-            ret_val = e1000_config_fc_after_link_up(hw);
-            if(ret_val) {
-                DEBUGOUT("Error Configuring Flow Control\n");
-                return ret_val;
-            }
-            DEBUGOUT("Valid link established!!!\n");
-
-            if(hw->phy_type == e1000_phy_igp) {
-                ret_val = e1000_config_dsp_after_link_change(hw, TRUE);
-                if(ret_val) {
-                    DEBUGOUT("Error Configuring DSP after link up\n");
-                    return ret_val;
-                }
-            }
-            DEBUGOUT("Valid link established!!!\n");
-            return E1000_SUCCESS;
-        }
-        udelay(10);
+    /* SW Reset the PHY so all changes take effect */
+    ret_val = e1000_phy_reset(hw);
+    if(ret_val) {
+        DEBUGOUT("Error Resetting the PHY\n");
+        return ret_val;
     }
 
-    DEBUGOUT("Unable to establish link!!!\n");
-    return E1000_SUCCESS;
+   return E1000_SUCCESS;
 }
 
-/******************************************************************************
-* Configures PHY autoneg and flow control advertisement settings
+/********************************************************************
+* Setup auto-negotiation and flow control advertisements,
+* and then perform auto-negotiation.
 *
 * hw - Struct containing variables accessed by shared code
-******************************************************************************/
-int32_t
-e1000_phy_setup_autoneg(struct e1000_hw *hw)
+*********************************************************************/
+static int32_t
+e1000_copper_link_autoneg(struct e1000_hw *hw)
 {
     int32_t ret_val;
-    uint16_t mii_autoneg_adv_reg;
-    uint16_t mii_1000t_ctrl_reg;
+    uint16_t phy_data;
 
-    DEBUGFUNC("e1000_phy_setup_autoneg");
+    DEBUGFUNC("e1000_copper_link_autoneg");
 
-    /* Read the MII Auto-Neg Advertisement Register (Address 4). */
-    ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg);
+    /* Perform some bounds checking on the hw->autoneg_advertised
+     * parameter.  If this variable is zero, then set it to the default.
+     */
+    hw->autoneg_advertised &= AUTONEG_ADVERTISE_SPEED_DEFAULT;
+
+    /* If autoneg_advertised is zero, we assume it was not defaulted
+     * by the calling code so we set to advertise full capability.
+     */
+    if(hw->autoneg_advertised == 0)
+        hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT;
+
+    DEBUGOUT("Reconfiguring auto-neg advertisement params\n");
+    ret_val = e1000_phy_setup_autoneg(hw);
+    if(ret_val) {
+        DEBUGOUT("Error Setting up Auto-Negotiation\n");
+        return ret_val;
+    }
+    DEBUGOUT("Restarting Auto-Neg\n");
+
+    /* Restart auto-negotiation by setting the Auto Neg Enable bit and
+     * the Auto Neg Restart bit in the PHY control register.
+     */
+    ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data);
     if(ret_val)
         return ret_val;
 
-    /* Read the MII 1000Base-T Control Register (Address 9). */
-    ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg);
+    phy_data |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG);
+    ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data);
     if(ret_val)
         return ret_val;
 
-    /* Need to parse both autoneg_advertised and fc and set up
+    /* Does the user want to wait for Auto-Neg to complete here, or
+     * check at a later time (for example, callback routine).
+     */
+    if(hw->wait_autoneg_complete) {
+        ret_val = e1000_wait_autoneg(hw);
+        if(ret_val) {
+            DEBUGOUT("Error while waiting for autoneg to complete\n");
+            return ret_val;
+        }
+    }
+
+    hw->get_link_status = TRUE;
+
+    return E1000_SUCCESS;
+}
+
+
+/******************************************************************************
+* Config the MAC and the PHY after link is up.
+*   1) Set up the MAC to the current PHY speed/duplex
+*      if we are on 82543.  If we
+*      are on newer silicon, we only need to configure
+*      collision distance in the Transmit Control Register.
+*   2) Set up flow control on the MAC to that established with
+*      the link partner.
+*   3) Config DSP to improve Gigabit link quality for some PHY revisions.    
+*
+* hw - Struct containing variables accessed by shared code
+******************************************************************************/
+static int32_t
+e1000_copper_link_postconfig(struct e1000_hw *hw)
+{
+    int32_t ret_val;
+    DEBUGFUNC("e1000_copper_link_postconfig");
+    
+    if(hw->mac_type >= e1000_82544) {
+        e1000_config_collision_dist(hw);
+    } else {
+        ret_val = e1000_config_mac_to_phy(hw);
+        if(ret_val) {
+            DEBUGOUT("Error configuring MAC to PHY settings\n");
+            return ret_val;
+        }
+    }
+    ret_val = e1000_config_fc_after_link_up(hw);
+    if(ret_val) {
+        DEBUGOUT("Error Configuring Flow Control\n");
+        return ret_val;
+    }
+
+    /* Config DSP to improve Giga link quality */
+    if(hw->phy_type == e1000_phy_igp) {
+        ret_val = e1000_config_dsp_after_link_change(hw, TRUE);
+        if(ret_val) {
+            DEBUGOUT("Error Configuring DSP after link up\n");
+            return ret_val;
+        }
+    }
+                
+    return E1000_SUCCESS;
+}
+
+/******************************************************************************
+* Detects which PHY is present and setup the speed and duplex
+*
+* hw - Struct containing variables accessed by shared code
+******************************************************************************/
+static int32_t
+e1000_setup_copper_link(struct e1000_hw *hw)
+{
+    int32_t ret_val;
+    uint16_t i;
+    uint16_t phy_data;
+
+    DEBUGFUNC("e1000_setup_copper_link");
+
+    /* Check if it is a valid PHY and set PHY mode if necessary. */
+    ret_val = e1000_copper_link_preconfig(hw);
+    if(ret_val)
+        return ret_val;
+
+    if (hw->phy_type == e1000_phy_igp ||
+        hw->phy_type == e1000_phy_igp_2) {
+        ret_val = e1000_copper_link_igp_setup(hw);
+        if(ret_val)
+            return ret_val;
+    } else if (hw->phy_type == e1000_phy_m88) {
+        ret_val = e1000_copper_link_mgp_setup(hw);
+        if(ret_val)
+            return ret_val;
+    }
+
+    if(hw->autoneg) {
+        /* Setup autoneg and flow control advertisement 
+          * and perform autonegotiation */   
+        ret_val = e1000_copper_link_autoneg(hw);
+        if(ret_val)
+            return ret_val;           
+    } else {
+        /* PHY will be set to 10H, 10F, 100H,or 100F
+          * depending on value from forced_speed_duplex. */
+        DEBUGOUT("Forcing speed and duplex\n");
+        ret_val = e1000_phy_force_speed_duplex(hw);
+        if(ret_val) {
+            DEBUGOUT("Error Forcing Speed and Duplex\n");
+            return ret_val;
+        }
+    }
+
+    /* Check link status. Wait up to 100 microseconds for link to become
+     * valid.
+     */
+    for(i = 0; i < 10; i++) {
+        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
+        if(ret_val)
+            return ret_val;
+        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
+        if(ret_val)
+            return ret_val;
+
+        if(phy_data & MII_SR_LINK_STATUS) {
+            /* Config the MAC and PHY after link is up */
+            ret_val = e1000_copper_link_postconfig(hw);
+            if(ret_val)
+                return ret_val;
+            
+            DEBUGOUT("Valid link established!!!\n");
+            return E1000_SUCCESS;
+        }
+        udelay(10);
+    }
+
+    DEBUGOUT("Unable to establish link!!!\n");
+    return E1000_SUCCESS;
+}
+
+/******************************************************************************
+* Configures PHY autoneg and flow control advertisement settings
+*
+* hw - Struct containing variables accessed by shared code
+******************************************************************************/
+int32_t
+e1000_phy_setup_autoneg(struct e1000_hw *hw)
+{
+    int32_t ret_val;
+    uint16_t mii_autoneg_adv_reg;
+    uint16_t mii_1000t_ctrl_reg;
+
+    DEBUGFUNC("e1000_phy_setup_autoneg");
+
+    /* Read the MII Auto-Neg Advertisement Register (Address 4). */
+    ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg);
+    if(ret_val)
+        return ret_val;
+
+        /* Read the MII 1000Base-T Control Register (Address 9). */
+        ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg);
+        if(ret_val)
+            return ret_val;
+
+    /* Need to parse both autoneg_advertised and fc and set up
      * the appropriate PHY registers.  First we will parse for
      * autoneg_advertised software override.  Since we can advertise
      * a plethora of combinations, we need to check each bit
@@ -1417,7 +1601,7 @@ e1000_phy_setup_autoneg(struct e1000_hw *hw)
 
     DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg);
 
-    ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg);
+    ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg);    
     if(ret_val)
         return ret_val;
 
@@ -1678,6 +1862,11 @@ e1000_config_mac_to_phy(struct e1000_hw *hw)
 
     DEBUGFUNC("e1000_config_mac_to_phy");
 
+    /* 82544 or newer MAC, Auto Speed Detection takes care of 
+    * MAC speed/duplex configuration.*/
+    if (hw->mac_type >= e1000_82544)
+        return E1000_SUCCESS;
+
     /* Read the Device Control Register and set the bits to Force Speed
      * and Duplex.
      */
@@ -1688,45 +1877,25 @@ e1000_config_mac_to_phy(struct e1000_hw *hw)
     /* Set up duplex in the Device Control and Transmit Control
      * registers depending on negotiated values.
      */
-    if (hw->phy_type == e1000_phy_igp) {
-        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS,
-                                     &phy_data);
-        if(ret_val)
-            return ret_val;
-
-        if(phy_data & IGP01E1000_PSSR_FULL_DUPLEX) ctrl |= E1000_CTRL_FD;
-        else ctrl &= ~E1000_CTRL_FD;
-
-        e1000_config_collision_dist(hw);
+    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
+    if(ret_val)
+        return ret_val;
 
-        /* Set up speed in the Device Control register depending on
-         * negotiated values.
-         */
-        if((phy_data & IGP01E1000_PSSR_SPEED_MASK) ==
-           IGP01E1000_PSSR_SPEED_1000MBPS)
-            ctrl |= E1000_CTRL_SPD_1000;
-        else if((phy_data & IGP01E1000_PSSR_SPEED_MASK) ==
-                IGP01E1000_PSSR_SPEED_100MBPS)
-            ctrl |= E1000_CTRL_SPD_100;
-    } else {
-        ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
-                                     &phy_data);
-        if(ret_val)
-            return ret_val;
+    if(phy_data & M88E1000_PSSR_DPLX) 
+        ctrl |= E1000_CTRL_FD;
+    else 
+        ctrl &= ~E1000_CTRL_FD;
 
-        if(phy_data & M88E1000_PSSR_DPLX) ctrl |= E1000_CTRL_FD;
-        else ctrl &= ~E1000_CTRL_FD;
+    e1000_config_collision_dist(hw);
 
-        e1000_config_collision_dist(hw);
+    /* Set up speed in the Device Control register depending on
+     * negotiated values.
+     */
+    if((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS)
+        ctrl |= E1000_CTRL_SPD_1000;
+    else if((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_100MBS)
+        ctrl |= E1000_CTRL_SPD_100;
 
-        /* Set up speed in the Device Control register depending on
-         * negotiated values.
-         */
-        if((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS)
-            ctrl |= E1000_CTRL_SPD_1000;
-        else if((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_100MBS)
-            ctrl |= E1000_CTRL_SPD_100;
-    }
     /* Write the configured values back to the Device Control Reg. */
     E1000_WRITE_REG(hw, CTRL, ctrl);
     return E1000_SUCCESS;
@@ -2494,8 +2663,8 @@ e1000_read_phy_reg(struct e1000_hw *hw,
 
     DEBUGFUNC("e1000_read_phy_reg");
 
-
-    if(hw->phy_type == e1000_phy_igp &&
+    if((hw->phy_type == e1000_phy_igp || 
+        hw->phy_type == e1000_phy_igp_2) &&
        (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
         ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
                                          (uint16_t)reg_addr);
@@ -2600,8 +2769,8 @@ e1000_write_phy_reg(struct e1000_hw *hw,
 
     DEBUGFUNC("e1000_write_phy_reg");
 
-
-    if(hw->phy_type == e1000_phy_igp &&
+    if((hw->phy_type == e1000_phy_igp || 
+        hw->phy_type == e1000_phy_igp_2) &&
        (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
         ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
                                          (uint16_t)reg_addr);
@@ -2679,19 +2848,27 @@ e1000_write_phy_reg_ex(struct e1000_hw *hw,
     return E1000_SUCCESS;
 }
 
+
 /******************************************************************************
 * Returns the PHY to the power-on reset state
 *
 * hw - Struct containing variables accessed by shared code
 ******************************************************************************/
-void
+int32_t
 e1000_phy_hw_reset(struct e1000_hw *hw)
 {
     uint32_t ctrl, ctrl_ext;
     uint32_t led_ctrl;
+    int32_t ret_val;
 
     DEBUGFUNC("e1000_phy_hw_reset");
 
+    /* In the case of the phy reset being blocked, it's not an error, we
+     * simply return success without performing the reset. */
+    ret_val = e1000_check_phy_reset_block(hw);
+    if (ret_val)
+        return E1000_SUCCESS;
+
     DEBUGOUT("Resetting Phy...\n");
 
     if(hw->mac_type > e1000_82543) {
@@ -2727,6 +2904,11 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
         led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
         E1000_WRITE_REG(hw, LEDCTL, led_ctrl);
     }
+
+    /* Wait for FW to finish PHY configuration. */
+    ret_val = e1000_get_phy_cfg_done(hw);
+
+    return ret_val;
 }
 
 /******************************************************************************
@@ -2744,7 +2926,19 @@ e1000_phy_reset(struct e1000_hw *hw)
 
     DEBUGFUNC("e1000_phy_reset");
 
-    if(hw->mac_type != e1000_82541_rev_2) {
+    /* In the case of the phy reset being blocked, it's not an error, we
+     * simply return success without performing the reset. */
+    ret_val = e1000_check_phy_reset_block(hw);
+    if (ret_val)
+        return E1000_SUCCESS;
+
+    switch (hw->mac_type) {
+    case e1000_82541_rev_2:
+        ret_val = e1000_phy_hw_reset(hw);
+        if(ret_val)
+            return ret_val;
+        break;
+    default:
         ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data);
         if(ret_val)
             return ret_val;
@@ -2755,9 +2949,10 @@ e1000_phy_reset(struct e1000_hw *hw)
             return ret_val;
 
         udelay(1);
-    } else e1000_phy_hw_reset(hw);
+        break;
+    }
 
-    if(hw->phy_type == e1000_phy_igp)
+    if(hw->phy_type == e1000_phy_igp || hw->phy_type == e1000_phy_igp_2)
         e1000_phy_init_script(hw);
 
     return E1000_SUCCESS;
@@ -2811,6 +3006,9 @@ e1000_detect_gig_phy(struct e1000_hw *hw)
     case e1000_82547_rev_2:
         if(hw->phy_id == IGP01E1000_I_PHY_ID) match = TRUE;
         break;
+    case e1000_82573:
+        if(hw->phy_id == M88E1111_I_PHY_ID) match = TRUE;
+        break;
     default:
         DEBUGOUT1("Invalid MAC type %d\n", hw->mac_type);
         return -E1000_ERR_CONFIG;
@@ -2866,7 +3064,7 @@ e1000_phy_igp_get_info(struct e1000_hw *hw,
 
     /* The downshift status is checked only once, after link is established,
      * and it stored in the hw->speed_downgraded parameter. */
-    phy_info->downshift = hw->speed_downgraded;
+    phy_info->downshift = (e1000_downshift)hw->speed_downgraded;
 
     /* IGP01E1000 does not need to support it. */
     phy_info->extended_10bt_distance = e1000_10bt_ext_dist_enable_normal;
@@ -2905,7 +3103,7 @@ e1000_phy_igp_get_info(struct e1000_hw *hw,
         if(ret_val)
             return ret_val;
 
-        /* transalte to old method */
+        /* Translate to old method */
         average = (max_length + min_length) / 2;
 
         if(average <= e1000_igp_cable_length_50)
@@ -2940,7 +3138,7 @@ e1000_phy_m88_get_info(struct e1000_hw *hw,
 
     /* The downshift status is checked only once, after link is established,
      * and it stored in the hw->speed_downgraded parameter. */
-    phy_info->downshift = hw->speed_downgraded;
+    phy_info->downshift = (e1000_downshift)hw->speed_downgraded;
 
     ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
     if(ret_val)
@@ -3029,7 +3227,8 @@ e1000_phy_get_info(struct e1000_hw *hw,
         return -E1000_ERR_CONFIG;
     }
 
-    if(hw->phy_type == e1000_phy_igp)
+    if(hw->phy_type == e1000_phy_igp ||
+        hw->phy_type == e1000_phy_igp_2)
         return e1000_phy_igp_get_info(hw, phy_info);
     else
         return e1000_phy_m88_get_info(hw, phy_info);
@@ -3055,11 +3254,12 @@ e1000_validate_mdi_setting(struct e1000_hw *hw)
  *
  * hw - Struct containing variables accessed by shared code
  *****************************************************************************/
-void
+int32_t
 e1000_init_eeprom_params(struct e1000_hw *hw)
 {
     struct e1000_eeprom_info *eeprom = &hw->eeprom;
     uint32_t eecd = E1000_READ_REG(hw, EECD);
+    int32_t ret_val = E1000_SUCCESS;
     uint16_t eeprom_size;
 
     DEBUGFUNC("e1000_init_eeprom_params");
@@ -3074,6 +3274,8 @@ e1000_init_eeprom_params(struct e1000_hw *hw)
         eeprom->opcode_bits = 3;
         eeprom->address_bits = 6;
         eeprom->delay_usec = 50;
+        eeprom->use_eerd = FALSE;
+        eeprom->use_eewr = FALSE;
         break;
     case e1000_82540:
     case e1000_82545:
@@ -3090,6 +3292,8 @@ e1000_init_eeprom_params(struct e1000_hw *hw)
             eeprom->word_size = 64;
             eeprom->address_bits = 6;
         }
+        eeprom->use_eerd = FALSE;
+        eeprom->use_eewr = FALSE;
         break;
     case e1000_82541:
     case e1000_82541_rev_2:
@@ -3118,42 +3322,60 @@ e1000_init_eeprom_params(struct e1000_hw *hw)
                 eeprom->address_bits = 6;
             }
         }
+        eeprom->use_eerd = FALSE;
+        eeprom->use_eewr = FALSE;
+        break;
+    case e1000_82573:
+        eeprom->type = e1000_eeprom_spi;
+        eeprom->opcode_bits = 8;
+        eeprom->delay_usec = 1;
+        if (eecd & E1000_EECD_ADDR_BITS) {
+            eeprom->page_size = 32;
+            eeprom->address_bits = 16;
+        } else {
+            eeprom->page_size = 8;
+            eeprom->address_bits = 8;
+        }
+        eeprom->use_eerd = TRUE;
+        eeprom->use_eewr = TRUE;
+        if(e1000_is_onboard_nvm_eeprom(hw) == FALSE) {
+            eeprom->type = e1000_eeprom_flash;
+            eeprom->word_size = 2048;
+
+            /* Ensure that the Autonomous FLASH update bit is cleared due to
+             * Flash update issue on parts which use a FLASH for NVM. */
+            eecd &= ~E1000_EECD_AUPDEN;
+            E1000_WRITE_REG(hw, EECD, eecd);
+        }
         break;
     default:
         break;
     }
 
     if (eeprom->type == e1000_eeprom_spi) {
-        eeprom->word_size = 64;
-        if (e1000_read_eeprom(hw, EEPROM_CFG, 1, &eeprom_size) == 0) {
-            eeprom_size &= EEPROM_SIZE_MASK;
-
-            switch (eeprom_size) {
-            case EEPROM_SIZE_16KB:
-                eeprom->word_size = 8192;
-                break;
-            case EEPROM_SIZE_8KB:
-                eeprom->word_size = 4096;
-                break;
-            case EEPROM_SIZE_4KB:
-                eeprom->word_size = 2048;
-                break;
-            case EEPROM_SIZE_2KB:
-                eeprom->word_size = 1024;
-                break;
-            case EEPROM_SIZE_1KB:
-                eeprom->word_size = 512;
-                break;
-            case EEPROM_SIZE_512B:
-                eeprom->word_size = 256;
-                break;
-            case EEPROM_SIZE_128B:
-            default:
-                eeprom->word_size = 64;
-                break;
-            }
+        /* eeprom_size will be an enum [0..8] that maps to eeprom sizes 128B to
+         * 32KB (incremented by powers of 2).
+         */
+        if(hw->mac_type <= e1000_82547_rev_2) {
+            /* Set to default value for initial eeprom read. */
+            eeprom->word_size = 64;
+            ret_val = e1000_read_eeprom(hw, EEPROM_CFG, 1, &eeprom_size);
+            if(ret_val)
+                return ret_val;
+            eeprom_size = (eeprom_size & EEPROM_SIZE_MASK) >> EEPROM_SIZE_SHIFT;
+            /* 256B eeprom size was not supported in earlier hardware, so we
+             * bump eeprom_size up one to ensure that "1" (which maps to 256B)
+             * is never the result used in the shifting logic below. */
+            if(eeprom_size)
+                eeprom_size++;
+        } else {
+            eeprom_size = (uint16_t)((eecd & E1000_EECD_SIZE_EX_MASK) >>
+                          E1000_EECD_SIZE_EX_SHIFT);
         }
+
+        eeprom->word_size = 1 << (eeprom_size + EEPROM_WORD_SIZE_SHIFT);
     }
+    return ret_val;
 }
 
 /******************************************************************************
@@ -3306,8 +3528,12 @@ e1000_acquire_eeprom(struct e1000_hw *hw)
 
     DEBUGFUNC("e1000_acquire_eeprom");
 
+    if(e1000_get_hw_eeprom_semaphore(hw))
+        return -E1000_ERR_EEPROM;
+
     eecd = E1000_READ_REG(hw, EECD);
 
+    if (hw->mac_type != e1000_82573) {
     /* Request EEPROM Access */
     if(hw->mac_type > e1000_82544) {
         eecd |= E1000_EECD_REQ;
@@ -3326,6 +3552,7 @@ e1000_acquire_eeprom(struct e1000_hw *hw)
             return -E1000_ERR_EEPROM;
         }
     }
+    }
 
     /* Setup EEPROM for Read/Write */
 
@@ -3443,6 +3670,8 @@ e1000_release_eeprom(struct e1000_hw *hw)
         eecd &= ~E1000_EECD_REQ;
         E1000_WRITE_REG(hw, EECD, eecd);
     }
+
+    e1000_put_hw_eeprom_semaphore(hw);
 }
 
 /******************************************************************************
@@ -3504,8 +3733,10 @@ e1000_read_eeprom(struct e1000_hw *hw,
 {
     struct e1000_eeprom_info *eeprom = &hw->eeprom;
     uint32_t i = 0;
+    int32_t ret_val;
 
     DEBUGFUNC("e1000_read_eeprom");
+
     /* A check for invalid values:  offset too large, too many words, and not
      * enough words.
      */
@@ -3515,9 +3746,23 @@ e1000_read_eeprom(struct e1000_hw *hw,
         return -E1000_ERR_EEPROM;
     }
 
-    /* Prepare the EEPROM for reading  */
-    if(e1000_acquire_eeprom(hw) != E1000_SUCCESS)
-        return -E1000_ERR_EEPROM;
+    /* FLASH reads without acquiring the semaphore are safe in 82573-based
+     * controllers.
+     */
+    if ((e1000_is_onboard_nvm_eeprom(hw) == TRUE) ||
+        (hw->mac_type != e1000_82573)) {
+        /* Prepare the EEPROM for reading  */
+        if(e1000_acquire_eeprom(hw) != E1000_SUCCESS)
+            return -E1000_ERR_EEPROM;
+    }
+
+    if(eeprom->use_eerd == TRUE) {
+        ret_val = e1000_read_eeprom_eerd(hw, offset, words, data);
+        if ((e1000_is_onboard_nvm_eeprom(hw) == TRUE) ||
+            (hw->mac_type != e1000_82573))
+            e1000_release_eeprom(hw);
+        return ret_val;
+    }
 
     if(eeprom->type == e1000_eeprom_spi) {
         uint16_t word_in;
@@ -3569,65 +3814,212 @@ e1000_read_eeprom(struct e1000_hw *hw,
 }
 
 /******************************************************************************
- * Verifies that the EEPROM has a valid checksum
+ * Reads a 16 bit word from the EEPROM using the EERD register.
  *
  * hw - Struct containing variables accessed by shared code
- *
- * Reads the first 64 16 bit words of the EEPROM and sums the values read.
- * If the the sum of the 64 16 bit words is 0xBABA, the EEPROM's checksum is
- * valid.
+ * offset - offset of  word in the EEPROM to read
+ * data - word read from the EEPROM
+ * words - number of words to read
  *****************************************************************************/
 int32_t
-e1000_validate_eeprom_checksum(struct e1000_hw *hw)
+e1000_read_eeprom_eerd(struct e1000_hw *hw,
+                  uint16_t offset,
+                  uint16_t words,
+                  uint16_t *data)
 {
-    uint16_t checksum = 0;
-    uint16_t i, eeprom_data;
+    uint32_t i, eerd = 0;
+    int32_t error = 0;
 
-    DEBUGFUNC("e1000_validate_eeprom_checksum");
+    for (i = 0; i < words; i++) {
+        eerd = ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) +
+                         E1000_EEPROM_RW_REG_START;
 
-    for(i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) {
-        if(e1000_read_eeprom(hw, i, 1, &eeprom_data) < 0) {
-            DEBUGOUT("EEPROM Read Error\n");
-            return -E1000_ERR_EEPROM;
+        E1000_WRITE_REG(hw, EERD, eerd);
+        error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_READ);
+        
+        if(error) {
+            break;
         }
-        checksum += eeprom_data;
-    }
-
-    if(checksum == (uint16_t) EEPROM_SUM)
-        return E1000_SUCCESS;
-    else {
-        DEBUGOUT("EEPROM Checksum Invalid\n");
-        return -E1000_ERR_EEPROM;
+        data[i] = (E1000_READ_REG(hw, EERD) >> E1000_EEPROM_RW_REG_DATA);
+      
     }
+    
+    return error;
 }
 
 /******************************************************************************
- * Calculates the EEPROM checksum and writes it to the EEPROM
+ * Writes a 16 bit word from the EEPROM using the EEWR register.
  *
  * hw - Struct containing variables accessed by shared code
- *
- * Sums the first 63 16 bit words of the EEPROM. Subtracts the sum from 0xBABA.
- * Writes the difference to word offset 63 of the EEPROM.
+ * offset - offset of  word in the EEPROM to read
+ * data - word read from the EEPROM
+ * words - number of words to read
  *****************************************************************************/
 int32_t
-e1000_update_eeprom_checksum(struct e1000_hw *hw)
+e1000_write_eeprom_eewr(struct e1000_hw *hw,
+                   uint16_t offset,
+                   uint16_t words,
+                   uint16_t *data)
 {
-    uint16_t checksum = 0;
-    uint16_t i, eeprom_data;
+    uint32_t    register_value = 0;
+    uint32_t    i              = 0;
+    int32_t     error          = 0;
 
-    DEBUGFUNC("e1000_update_eeprom_checksum");
+    for (i = 0; i < words; i++) {
+        register_value = (data[i] << E1000_EEPROM_RW_REG_DATA) | 
+                         ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) | 
+                         E1000_EEPROM_RW_REG_START;
 
-    for(i = 0; i < EEPROM_CHECKSUM_REG; i++) {
-        if(e1000_read_eeprom(hw, i, 1, &eeprom_data) < 0) {
-            DEBUGOUT("EEPROM Read Error\n");
-            return -E1000_ERR_EEPROM;
-        }
-        checksum += eeprom_data;
+        error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE);
+        if(error) {
+            break;
+        }       
+
+        E1000_WRITE_REG(hw, EEWR, register_value);
+        
+        error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE);
+        
+        if(error) {
+            break;
+        }       
+    }
+    
+    return error;
+}
+
+/******************************************************************************
+ * Polls the status bit (bit 1) of the EERD to determine when the read is done.
+ *
+ * hw - Struct containing variables accessed by shared code
+ *****************************************************************************/
+int32_t
+e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd)
+{
+    uint32_t attempts = 100000;
+    uint32_t i, reg = 0;
+    int32_t done = E1000_ERR_EEPROM;
+
+    for(i = 0; i < attempts; i++) {
+        if(eerd == E1000_EEPROM_POLL_READ)
+            reg = E1000_READ_REG(hw, EERD);
+        else 
+            reg = E1000_READ_REG(hw, EEWR);
+
+        if(reg & E1000_EEPROM_RW_REG_DONE) {
+            done = E1000_SUCCESS;
+            break;
+        }
+        udelay(5);
+    }
+
+    return done;
+}
+
+/***************************************************************************
+* Description:     Determines if the onboard NVM is FLASH or EEPROM.
+*
+* hw - Struct containing variables accessed by shared code
+****************************************************************************/
+boolean_t
+e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw)
+{
+    uint32_t eecd = 0;
+
+    if(hw->mac_type == e1000_82573) {
+        eecd = E1000_READ_REG(hw, EECD);
+
+        /* Isolate bits 15 & 16 */
+        eecd = ((eecd >> 15) & 0x03);
+
+        /* If both bits are set, device is Flash type */
+        if(eecd == 0x03) {
+            return FALSE;
+        }
+    }
+    return TRUE;
+}
+
+/******************************************************************************
+ * Verifies that the EEPROM has a valid checksum
+ *
+ * hw - Struct containing variables accessed by shared code
+ *
+ * Reads the first 64 16 bit words of the EEPROM and sums the values read.
+ * If the the sum of the 64 16 bit words is 0xBABA, the EEPROM's checksum is
+ * valid.
+ *****************************************************************************/
+int32_t
+e1000_validate_eeprom_checksum(struct e1000_hw *hw)
+{
+    uint16_t checksum = 0;
+    uint16_t i, eeprom_data;
+
+    DEBUGFUNC("e1000_validate_eeprom_checksum");
+
+    if ((hw->mac_type == e1000_82573) &&
+        (e1000_is_onboard_nvm_eeprom(hw) == FALSE)) {
+        /* Check bit 4 of word 10h.  If it is 0, firmware is done updating
+         * 10h-12h.  Checksum may need to be fixed. */
+        e1000_read_eeprom(hw, 0x10, 1, &eeprom_data);
+        if ((eeprom_data & 0x10) == 0) {
+            /* Read 0x23 and check bit 15.  This bit is a 1 when the checksum
+             * has already been fixed.  If the checksum is still wrong and this
+             * bit is a 1, we need to return bad checksum.  Otherwise, we need
+             * to set this bit to a 1 and update the checksum. */
+            e1000_read_eeprom(hw, 0x23, 1, &eeprom_data);
+            if ((eeprom_data & 0x8000) == 0) {
+                eeprom_data |= 0x8000;
+                e1000_write_eeprom(hw, 0x23, 1, &eeprom_data);
+                e1000_update_eeprom_checksum(hw);
+            }
+        }
+    }
+
+    for(i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) {
+        if(e1000_read_eeprom(hw, i, 1, &eeprom_data) < 0) {
+            DEBUGOUT("EEPROM Read Error\n");
+            return -E1000_ERR_EEPROM;
+        }
+        checksum += eeprom_data;
+    }
+
+    if(checksum == (uint16_t) EEPROM_SUM)
+        return E1000_SUCCESS;
+    else {
+        DEBUGOUT("EEPROM Checksum Invalid\n");
+        return -E1000_ERR_EEPROM;
+    }
+}
+
+/******************************************************************************
+ * Calculates the EEPROM checksum and writes it to the EEPROM
+ *
+ * hw - Struct containing variables accessed by shared code
+ *
+ * Sums the first 63 16 bit words of the EEPROM. Subtracts the sum from 0xBABA.
+ * Writes the difference to word offset 63 of the EEPROM.
+ *****************************************************************************/
+int32_t
+e1000_update_eeprom_checksum(struct e1000_hw *hw)
+{
+    uint16_t checksum = 0;
+    uint16_t i, eeprom_data;
+
+    DEBUGFUNC("e1000_update_eeprom_checksum");
+
+    for(i = 0; i < EEPROM_CHECKSUM_REG; i++) {
+        if(e1000_read_eeprom(hw, i, 1, &eeprom_data) < 0) {
+            DEBUGOUT("EEPROM Read Error\n");
+            return -E1000_ERR_EEPROM;
+        }
+        checksum += eeprom_data;
     }
     checksum = (uint16_t) EEPROM_SUM - checksum;
     if(e1000_write_eeprom(hw, EEPROM_CHECKSUM_REG, 1, &checksum) < 0) {
         DEBUGOUT("EEPROM Write Error\n");
         return -E1000_ERR_EEPROM;
+    } else if (hw->eeprom.type == e1000_eeprom_flash) {
+        e1000_commit_shadow_ram(hw);
     }
     return E1000_SUCCESS;
 }
@@ -3663,6 +4055,10 @@ e1000_write_eeprom(struct e1000_hw *hw,
         return -E1000_ERR_EEPROM;
     }
 
+    /* 82573 reads only through eerd */
+    if(eeprom->use_eewr == TRUE)
+        return e1000_write_eeprom_eewr(hw, offset, words, data);
+
     /* Prepare the EEPROM for writing  */
     if (e1000_acquire_eeprom(hw) != E1000_SUCCESS)
         return -E1000_ERR_EEPROM;
@@ -3832,6 +4228,65 @@ e1000_write_eeprom_microwire(struct e1000_hw *hw,
     return E1000_SUCCESS;
 }
 
+/******************************************************************************
+ * Flushes the cached eeprom to NVM. This is done by saving the modified values
+ * in the eeprom cache and the non modified values in the currently active bank
+ * to the new bank.
+ *
+ * hw - Struct containing variables accessed by shared code
+ * offset - offset of  word in the EEPROM to read
+ * data - word read from the EEPROM
+ * words - number of words to read
+ *****************************************************************************/
+int32_t
+e1000_commit_shadow_ram(struct e1000_hw *hw)
+{
+    uint32_t attempts = 100000;
+    uint32_t eecd = 0;
+    uint32_t flop = 0;
+    uint32_t i = 0;
+    int32_t error = E1000_SUCCESS;
+
+    /* The flop register will be used to determine if flash type is STM */
+    flop = E1000_READ_REG(hw, FLOP);
+
+    if (hw->mac_type == e1000_82573) {
+        for (i=0; i < attempts; i++) {
+            eecd = E1000_READ_REG(hw, EECD);
+            if ((eecd & E1000_EECD_FLUPD) == 0) {
+                break;
+            }
+            udelay(5);
+        }
+
+        if (i == attempts) {
+            return -E1000_ERR_EEPROM;
+        }
+
+       /* If STM opcode located in bits 15:8 of flop, reset firmware */
+        if ((flop & 0xFF00) == E1000_STM_OPCODE) {
+            E1000_WRITE_REG(hw, HICR, E1000_HICR_FW_RESET);
+        }
+
+        /* Perform the flash update */
+        E1000_WRITE_REG(hw, EECD, eecd | E1000_EECD_FLUPD);
+
+       for (i=0; i < attempts; i++) {
+            eecd = E1000_READ_REG(hw, EECD);
+            if ((eecd & E1000_EECD_FLUPD) == 0) {
+                break;
+            }
+            udelay(5);
+        }
+
+        if (i == attempts) {
+            return -E1000_ERR_EEPROM;
+        }
+    }
+
+    return error;
+}
+
 /******************************************************************************
  * Reads the adapter's part number from the EEPROM
  *
@@ -3911,6 +4366,7 @@ void
 e1000_init_rx_addrs(struct e1000_hw *hw)
 {
     uint32_t i;
+    uint32_t rar_num;
 
     DEBUGFUNC("e1000_init_rx_addrs");
 
@@ -3919,9 +4375,10 @@ e1000_init_rx_addrs(struct e1000_hw *hw)
 
     e1000_rar_set(hw, hw->mac_addr, 0);
 
+    rar_num = E1000_RAR_ENTRIES;
     /* Zero out the other 15 receive addresses. */
     DEBUGOUT("Clearing RAR[1-15]\n");
-    for(i = 1; i < E1000_RAR_ENTRIES; i++) {
+    for(i = 1; i < rar_num; i++) {
         E1000_WRITE_REG_ARRAY(hw, RA, (i << 1), 0);
         E1000_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0);
     }
@@ -3950,7 +4407,9 @@ e1000_mc_addr_list_update(struct e1000_hw *hw,
 {
     uint32_t hash_value;
     uint32_t i;
-
+    uint32_t num_rar_entry;
+    uint32_t num_mta_entry;
+    
     DEBUGFUNC("e1000_mc_addr_list_update");
 
     /* Set the new number of MC addresses that we are being requested to use. */
@@ -3958,14 +4417,16 @@ e1000_mc_addr_list_update(struct e1000_hw *hw,
 
     /* Clear RAR[1-15] */
     DEBUGOUT(" Clearing RAR[1-15]\n");
-    for(i = rar_used_count; i < E1000_RAR_ENTRIES; i++) {
+    num_rar_entry = E1000_RAR_ENTRIES;
+    for(i = rar_used_count; i < num_rar_entry; i++) {
         E1000_WRITE_REG_ARRAY(hw, RA, (i << 1), 0);
         E1000_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0);
     }
 
     /* Clear the MTA */
     DEBUGOUT(" Clearing MTA\n");
-    for(i = 0; i < E1000_NUM_MTA_REGISTERS; i++) {
+    num_mta_entry = E1000_NUM_MTA_REGISTERS;
+    for(i = 0; i < num_mta_entry; i++) {
         E1000_WRITE_REG_ARRAY(hw, MTA, i, 0);
     }
 
@@ -3989,7 +4450,7 @@ e1000_mc_addr_list_update(struct e1000_hw *hw,
         /* Place this multicast address in the RAR if there is room, *
          * else put it in the MTA
          */
-        if(rar_used_count < E1000_RAR_ENTRIES) {
+        if (rar_used_count < num_rar_entry) {
             e1000_rar_set(hw,
                           mc_addr_list + (i * (ETH_LENGTH_OF_ADDRESS + pad)),
                           rar_used_count);
@@ -4040,6 +4501,7 @@ e1000_hash_mc_addr(struct e1000_hw *hw,
     }
 
     hash_value &= 0xFFF;
+
     return hash_value;
 }
 
@@ -4144,12 +4606,33 @@ void
 e1000_clear_vfta(struct e1000_hw *hw)
 {
     uint32_t offset;
-
-    for(offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++)
-        E1000_WRITE_REG_ARRAY(hw, VFTA, offset, 0);
+    uint32_t vfta_value = 0;
+    uint32_t vfta_offset = 0;
+    uint32_t vfta_bit_in_reg = 0;
+
+    if (hw->mac_type == e1000_82573) {
+        if (hw->mng_cookie.vlan_id != 0) {
+            /* The VFTA is a 4096b bit-field, each identifying a single VLAN
+             * ID.  The following operations determine which 32b entry
+             * (i.e. offset) into the array we want to set the VLAN ID
+             * (i.e. bit) of the manageability unit. */
+            vfta_offset = (hw->mng_cookie.vlan_id >>
+                           E1000_VFTA_ENTRY_SHIFT) &
+                          E1000_VFTA_ENTRY_MASK;
+            vfta_bit_in_reg = 1 << (hw->mng_cookie.vlan_id &
+                                    E1000_VFTA_ENTRY_BIT_SHIFT_MASK);
+        }
+    }
+    for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) {
+        /* If the offset we want to clear is the same offset of the
+         * manageability VLAN ID, then clear all bits except that of the
+         * manageability unit */
+        vfta_value = (offset == vfta_offset) ? vfta_bit_in_reg : 0;
+        E1000_WRITE_REG_ARRAY(hw, VFTA, offset, vfta_value);
+    }
 }
 
-static int32_t
+int32_t
 e1000_id_led_init(struct e1000_hw * hw)
 {
     uint32_t ledctl;
@@ -4480,6 +4963,19 @@ e1000_clear_hw_cntrs(struct e1000_hw *hw)
     temp = E1000_READ_REG(hw, MGTPRC);
     temp = E1000_READ_REG(hw, MGTPDC);
     temp = E1000_READ_REG(hw, MGTPTC);
+
+    if(hw->mac_type <= e1000_82547_rev_2) return;
+
+    temp = E1000_READ_REG(hw, IAC);
+    temp = E1000_READ_REG(hw, ICRXOC);
+    temp = E1000_READ_REG(hw, ICRXPTC);
+    temp = E1000_READ_REG(hw, ICRXATC);
+    temp = E1000_READ_REG(hw, ICTXPTC);
+    temp = E1000_READ_REG(hw, ICTXATC);
+    temp = E1000_READ_REG(hw, ICTXQEC);
+    temp = E1000_READ_REG(hw, ICTXQMTC);
+    temp = E1000_READ_REG(hw, ICRXDMTC);
+
 }
 
 /******************************************************************************
@@ -4646,6 +5142,11 @@ e1000_get_bus_info(struct e1000_hw *hw)
         hw->bus_speed = e1000_bus_speed_unknown;
         hw->bus_width = e1000_bus_width_unknown;
         break;
+    case e1000_82573:
+        hw->bus_type = e1000_bus_type_pci_express;
+        hw->bus_speed = e1000_bus_speed_2500;
+        hw->bus_width = e1000_bus_width_pciex_4;
+        break;
     default:
         status = E1000_READ_REG(hw, STATUS);
         hw->bus_type = (status & E1000_STATUS_PCIX_MODE) ?
@@ -4749,6 +5250,7 @@ e1000_get_cable_length(struct e1000_hw *hw,
 
     /* Use old method for Phy older than IGP */
     if(hw->phy_type == e1000_phy_m88) {
+
         ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
                                      &phy_data);
         if(ret_val)
@@ -4865,7 +5367,8 @@ e1000_check_polarity(struct e1000_hw *hw,
             return ret_val;
         *polarity = (phy_data & M88E1000_PSSR_REV_POLARITY) >>
                     M88E1000_PSSR_REV_POLARITY_SHIFT;
-    } else if(hw->phy_type == e1000_phy_igp) {
+    } else if(hw->phy_type == e1000_phy_igp ||
+              hw->phy_type == e1000_phy_igp_2) {
         /* Read the Status register to check the speed */
         ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS,
                                      &phy_data);
@@ -4917,7 +5420,8 @@ e1000_check_downshift(struct e1000_hw *hw)
 
     DEBUGFUNC("e1000_check_downshift");
 
-    if(hw->phy_type == e1000_phy_igp) {
+    if(hw->phy_type == e1000_phy_igp || 
+        hw->phy_type == e1000_phy_igp_2) {
         ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_LINK_HEALTH,
                                      &phy_data);
         if(ret_val)
@@ -4933,6 +5437,7 @@ e1000_check_downshift(struct e1000_hw *hw)
         hw->speed_downgraded = (phy_data & M88E1000_PSSR_DOWNSHIFT) >>
                                M88E1000_PSSR_DOWNSHIFT_SHIFT;
     }
+
     return E1000_SUCCESS;
 }
 
@@ -5047,7 +5552,7 @@ e1000_config_dsp_after_link_change(struct e1000_hw *hw,
             if(ret_val)
                 return ret_val;
 
-            msec_delay(20);
+            msec_delay_irq(20);
 
             ret_val = e1000_write_phy_reg(hw, 0x0000,
                                           IGP01E1000_IEEE_FORCE_GIGA);
@@ -5071,7 +5576,7 @@ e1000_config_dsp_after_link_change(struct e1000_hw *hw,
             if(ret_val)
                 return ret_val;
 
-            msec_delay(20);
+            msec_delay_irq(20);
 
             /* Now enable the transmitter */
             ret_val = e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data);
@@ -5096,7 +5601,7 @@ e1000_config_dsp_after_link_change(struct e1000_hw *hw,
             if(ret_val)
                 return ret_val;
 
-            msec_delay(20);
+            msec_delay_irq(20);
 
             ret_val = e1000_write_phy_reg(hw, 0x0000,
                                           IGP01E1000_IEEE_FORCE_GIGA);
@@ -5112,7 +5617,7 @@ e1000_config_dsp_after_link_change(struct e1000_hw *hw,
             if(ret_val)
                 return ret_val;
 
-            msec_delay(20);
+            msec_delay_irq(20);
 
             /* Now enable the transmitter */
             ret_val = e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data);
@@ -5187,22 +5692,36 @@ e1000_set_d3_lplu_state(struct e1000_hw *hw,
     uint16_t phy_data;
     DEBUGFUNC("e1000_set_d3_lplu_state");
 
-    if(!((hw->mac_type == e1000_82541_rev_2) ||
-         (hw->mac_type == e1000_82547_rev_2)))
+    if(hw->phy_type != e1000_phy_igp && hw->phy_type != e1000_phy_igp_2)
         return E1000_SUCCESS;
 
     /* During driver activity LPLU should not be used or it will attain link
      * from the lowest speeds starting from 10Mbps. The capability is used for
      * Dx transitions and states */
-    ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO, &phy_data);
-    if(ret_val)
-        return ret_val;
-
-    if(!active) {
-        phy_data &= ~IGP01E1000_GMII_FLEX_SPD;
-        ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);
+    if(hw->mac_type == e1000_82541_rev_2 || hw->mac_type == e1000_82547_rev_2) {
+        ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO, &phy_data);
+        if(ret_val)
+            return ret_val;
+    } else {
+        ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);
         if(ret_val)
             return ret_val;
+    }
+
+    if(!active) {
+        if(hw->mac_type == e1000_82541_rev_2 ||
+           hw->mac_type == e1000_82547_rev_2) {
+            phy_data &= ~IGP01E1000_GMII_FLEX_SPD;
+            ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);
+            if(ret_val)
+                return ret_val;
+        } else {
+                phy_data &= ~IGP02E1000_PM_D3_LPLU;
+                ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
+                                              phy_data);
+                if (ret_val)
+                    return ret_val;
+        }
 
         /* LPLU and SmartSpeed are mutually exclusive.  LPLU is used during
          * Dx states where the power conservation is most important.  During
@@ -5236,11 +5755,105 @@ e1000_set_d3_lplu_state(struct e1000_hw *hw,
               (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_ALL ) ||
               (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_100_ALL)) {
 
-        phy_data |= IGP01E1000_GMII_FLEX_SPD;
-        ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);
+        if(hw->mac_type == e1000_82541_rev_2 ||
+           hw->mac_type == e1000_82547_rev_2) {
+            phy_data |= IGP01E1000_GMII_FLEX_SPD;
+            ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);
+            if(ret_val)
+                return ret_val;
+        } else {
+                phy_data |= IGP02E1000_PM_D3_LPLU;
+                ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
+                                              phy_data);
+                if (ret_val)
+                    return ret_val;
+        }
+
+        /* When LPLU is enabled we should disable SmartSpeed */
+        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &phy_data);
+        if(ret_val)
+            return ret_val;
+
+        phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
+        ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, phy_data);
+        if(ret_val)
+            return ret_val;
+
+    }
+    return E1000_SUCCESS;
+}
+
+/*****************************************************************************
+ *
+ * This function sets the lplu d0 state according to the active flag.  When
+ * activating lplu this function also disables smart speed and vise versa.
+ * lplu will not be activated unless the device autonegotiation advertisment
+ * meets standards of either 10 or 10/100 or 10/100/1000 at all duplexes.
+ * hw: Struct containing variables accessed by shared code
+ * active - true to enable lplu false to disable lplu.
+ *
+ * returns: - E1000_ERR_PHY if fail to read/write the PHY
+ *            E1000_SUCCESS at any other case.
+ *
+ ****************************************************************************/
+
+int32_t
+e1000_set_d0_lplu_state(struct e1000_hw *hw,
+                        boolean_t active)
+{
+    int32_t ret_val;
+    uint16_t phy_data;
+    DEBUGFUNC("e1000_set_d0_lplu_state");
+
+    if(hw->mac_type <= e1000_82547_rev_2)
+        return E1000_SUCCESS;
+
+        ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);
         if(ret_val)
             return ret_val;
 
+    if (!active) {
+            phy_data &= ~IGP02E1000_PM_D0_LPLU;
+            ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
+            if (ret_val)
+                return ret_val;
+
+        /* LPLU and SmartSpeed are mutually exclusive.  LPLU is used during
+         * Dx states where the power conservation is most important.  During
+         * driver activity we should enable SmartSpeed, so performance is
+         * maintained. */
+        if (hw->smart_speed == e1000_smart_speed_on) {
+            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
+                                         &phy_data);
+            if(ret_val)
+                return ret_val;
+
+            phy_data |= IGP01E1000_PSCFR_SMART_SPEED;
+            ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
+                                          phy_data);
+            if(ret_val)
+                return ret_val;
+        } else if (hw->smart_speed == e1000_smart_speed_off) {
+            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
+                                         &phy_data);
+           if (ret_val)
+                return ret_val;
+
+            phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
+            ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
+                                          phy_data);
+            if(ret_val)
+                return ret_val;
+        }
+
+
+    } else {
+            phy_data |= IGP02E1000_PM_D0_LPLU;   
+            ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
+            if (ret_val)
+                return ret_val;
+
         /* When LPLU is enabled we should disable SmartSpeed */
         ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &phy_data);
         if(ret_val)
@@ -5318,21 +5931,353 @@ e1000_set_vco_speed(struct e1000_hw *hw)
     return E1000_SUCCESS;
 }
 
-static int32_t
-e1000_polarity_reversal_workaround(struct e1000_hw *hw)
+
+/*****************************************************************************
+ * This function reads the cookie from ARC ram.
+ *
+ * returns: - E1000_SUCCESS .
+ ****************************************************************************/
+int32_t
+e1000_host_if_read_cookie(struct e1000_hw * hw, uint8_t *buffer)
 {
-    int32_t ret_val;
-    uint16_t mii_status_reg;
-    uint16_t i;
+    uint8_t i;
+    uint32_t offset = E1000_MNG_DHCP_COOKIE_OFFSET; 
+    uint8_t length = E1000_MNG_DHCP_COOKIE_LENGTH;
 
-    /* Polarity reversal workaround for forced 10F/10H links. */
+    length = (length >> 2);
+    offset = (offset >> 2);
 
-    /* Disable the transmitter on the PHY */
+    for (i = 0; i < length; i++) {
+        *((uint32_t *) buffer + i) =
+            E1000_READ_REG_ARRAY_DWORD(hw, HOST_IF, offset + i);
+    }
+    return E1000_SUCCESS;
+}
 
-    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0019);
-    if(ret_val)
-        return ret_val;
-    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFFFF);
+
+/*****************************************************************************
+ * This function checks whether the HOST IF is enabled for command operaton
+ * and also checks whether the previous command is completed.
+ * It busy waits in case of previous command is not completed.
+ *
+ * returns: - E1000_ERR_HOST_INTERFACE_COMMAND in case if is not ready or 
+ *            timeout
+ *          - E1000_SUCCESS for success.
+ ****************************************************************************/
+int32_t
+e1000_mng_enable_host_if(struct e1000_hw * hw)
+{
+    uint32_t hicr;
+    uint8_t i;
+
+    /* Check that the host interface is enabled. */
+    hicr = E1000_READ_REG(hw, HICR);
+    if ((hicr & E1000_HICR_EN) == 0) {
+        DEBUGOUT("E1000_HOST_EN bit disabled.\n");
+        return -E1000_ERR_HOST_INTERFACE_COMMAND;
+    }
+    /* check the previous command is completed */
+    for (i = 0; i < E1000_MNG_DHCP_COMMAND_TIMEOUT; i++) {
+        hicr = E1000_READ_REG(hw, HICR);
+        if (!(hicr & E1000_HICR_C))
+            break;
+        msec_delay_irq(1);
+    }
+
+    if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) { 
+        DEBUGOUT("Previous command timeout failed .\n");
+        return -E1000_ERR_HOST_INTERFACE_COMMAND;
+    }
+    return E1000_SUCCESS;
+}
+
+/*****************************************************************************
+ * This function writes the buffer content at the offset given on the host if.
+ * It also does alignment considerations to do the writes in most efficient way.
+ * Also fills up the sum of the buffer in *buffer parameter.
+ *
+ * returns  - E1000_SUCCESS for success.
+ ****************************************************************************/
+int32_t
+e1000_mng_host_if_write(struct e1000_hw * hw, uint8_t *buffer,
+                        uint16_t length, uint16_t offset, uint8_t *sum)
+{
+    uint8_t *tmp;
+    uint8_t *bufptr = buffer;
+    uint32_t data;
+    uint16_t remaining, i, j, prev_bytes;
+
+    /* sum = only sum of the data and it is not checksum */
+
+    if (length == 0 || offset + length > E1000_HI_MAX_MNG_DATA_LENGTH) {
+        return -E1000_ERR_PARAM;
+    }
+
+    tmp = (uint8_t *)&data;
+    prev_bytes = offset & 0x3;
+    offset &= 0xFFFC;
+    offset >>= 2;
+
+    if (prev_bytes) {
+        data = E1000_READ_REG_ARRAY_DWORD(hw, HOST_IF, offset);
+        for (j = prev_bytes; j < sizeof(uint32_t); j++) {
+            *(tmp + j) = *bufptr++;
+            *sum += *(tmp + j);
+        }
+        E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, offset, data);
+        length -= j - prev_bytes;
+        offset++;
+    }
+
+    remaining = length & 0x3;
+    length -= remaining;
+
+    /* Calculate length in DWORDs */
+    length >>= 2;
+
+    /* The device driver writes the relevant command block into the
+     * ram area. */
+    for (i = 0; i < length; i++) {
+        for (j = 0; j < sizeof(uint32_t); j++) {
+            *(tmp + j) = *bufptr++;
+            *sum += *(tmp + j);
+        }
+
+        E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, offset + i, data);
+    }
+    if (remaining) {
+        for (j = 0; j < sizeof(uint32_t); j++) {
+            if (j < remaining)
+                *(tmp + j) = *bufptr++;
+            else
+                *(tmp + j) = 0;
+
+            *sum += *(tmp + j);
+        }
+        E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, offset + i, data);
+    }
+
+    return E1000_SUCCESS;
+}
+
+
+/*****************************************************************************
+ * This function writes the command header after does the checksum calculation.
+ *
+ * returns  - E1000_SUCCESS for success.
+ ****************************************************************************/
+int32_t
+e1000_mng_write_cmd_header(struct e1000_hw * hw,
+                           struct e1000_host_mng_command_header * hdr)
+{
+    uint16_t i;
+    uint8_t sum;
+    uint8_t *buffer;
+
+    /* Write the whole command header structure which includes sum of
+     * the buffer */
+
+    uint16_t length = sizeof(struct e1000_host_mng_command_header);
+
+    sum = hdr->checksum;
+    hdr->checksum = 0;
+
+    buffer = (uint8_t *) hdr;
+    i = length;
+    while(i--)
+        sum += buffer[i];
+
+    hdr->checksum = 0 - sum;
+
+    length >>= 2;
+    /* The device driver writes the relevant command block into the ram area. */
+    for (i = 0; i < length; i++)
+        E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, i, *((uint32_t *) hdr + i));
+
+    return E1000_SUCCESS;
+}
+
+
+/*****************************************************************************
+ * This function indicates to ARC that a new command is pending which completes
+ * one write operation by the driver.
+ *
+ * returns  - E1000_SUCCESS for success.
+ ****************************************************************************/
+int32_t
+e1000_mng_write_commit(
+    struct e1000_hw * hw)
+{
+    uint32_t hicr;
+
+    hicr = E1000_READ_REG(hw, HICR);
+    /* Setting this bit tells the ARC that a new command is pending. */
+    E1000_WRITE_REG(hw, HICR, hicr | E1000_HICR_C);
+
+    return E1000_SUCCESS;
+}
+
+
+/*****************************************************************************
+ * This function checks the mode of the firmware.
+ *
+ * returns  - TRUE when the mode is IAMT or FALSE.
+ ****************************************************************************/
+boolean_t
+e1000_check_mng_mode(
+    struct e1000_hw *hw)
+{
+    uint32_t fwsm;
+
+    fwsm = E1000_READ_REG(hw, FWSM);
+
+    if((fwsm & E1000_FWSM_MODE_MASK) ==
+        (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT))
+        return TRUE;
+
+    return FALSE;
+}
+
+
+/*****************************************************************************
+ * This function writes the dhcp info .
+ ****************************************************************************/
+int32_t
+e1000_mng_write_dhcp_info(struct e1000_hw * hw, uint8_t *buffer,
+                         uint16_t length)
+{
+    int32_t ret_val;
+    struct e1000_host_mng_command_header hdr;
+
+    hdr.command_id = E1000_MNG_DHCP_TX_PAYLOAD_CMD;
+    hdr.command_length = length;
+    hdr.reserved1 = 0;
+    hdr.reserved2 = 0;
+    hdr.checksum = 0;
+
+    ret_val = e1000_mng_enable_host_if(hw);
+    if (ret_val == E1000_SUCCESS) {
+        ret_val = e1000_mng_host_if_write(hw, buffer, length, sizeof(hdr),
+                                          &(hdr.checksum));
+        if (ret_val == E1000_SUCCESS) {
+            ret_val = e1000_mng_write_cmd_header(hw, &hdr);
+            if (ret_val == E1000_SUCCESS)
+                ret_val = e1000_mng_write_commit(hw);
+        }
+    }
+    return ret_val;
+}
+
+
+/*****************************************************************************
+ * This function calculates the checksum.
+ *
+ * returns  - checksum of buffer contents.
+ ****************************************************************************/
+uint8_t
+e1000_calculate_mng_checksum(char *buffer, uint32_t length)
+{
+    uint8_t sum = 0;
+    uint32_t i;
+
+    if (!buffer)
+        return 0;
+
+    for (i=0; i < length; i++)
+        sum += buffer[i];
+
+    return (uint8_t) (0 - sum);
+}
+
+/*****************************************************************************
+ * This function checks whether tx pkt filtering needs to be enabled or not.
+ *
+ * returns  - TRUE for packet filtering or FALSE.
+ ****************************************************************************/
+boolean_t
+e1000_enable_tx_pkt_filtering(struct e1000_hw *hw)
+{
+    /* called in init as well as watchdog timer functions */
+
+    int32_t ret_val, checksum;
+    boolean_t tx_filter = FALSE;
+    struct e1000_host_mng_dhcp_cookie *hdr = &(hw->mng_cookie);
+    uint8_t *buffer = (uint8_t *) &(hw->mng_cookie);
+
+    if (e1000_check_mng_mode(hw)) {
+        ret_val = e1000_mng_enable_host_if(hw);
+        if (ret_val == E1000_SUCCESS) {
+            ret_val = e1000_host_if_read_cookie(hw, buffer);
+            if (ret_val == E1000_SUCCESS) {
+                checksum = hdr->checksum;
+                hdr->checksum = 0;
+                if ((hdr->signature == E1000_IAMT_SIGNATURE) &&
+                    checksum == e1000_calculate_mng_checksum((char *)buffer,
+                                               E1000_MNG_DHCP_COOKIE_LENGTH)) {
+                    if (hdr->status &
+                        E1000_MNG_DHCP_COOKIE_STATUS_PARSING_SUPPORT)
+                        tx_filter = TRUE;
+                } else
+                    tx_filter = TRUE;
+            } else
+                tx_filter = TRUE;
+        }
+    }
+
+    hw->tx_pkt_filtering = tx_filter;
+    return tx_filter;
+}
+
+/******************************************************************************
+ * Verifies the hardware needs to allow ARPs to be processed by the host
+ *
+ * hw - Struct containing variables accessed by shared code
+ *
+ * returns: - TRUE/FALSE
+ *
+ *****************************************************************************/
+uint32_t
+e1000_enable_mng_pass_thru(struct e1000_hw *hw)
+{
+    uint32_t manc;
+    uint32_t fwsm, factps;
+
+    if (hw->asf_firmware_present) {
+        manc = E1000_READ_REG(hw, MANC);
+
+        if (!(manc & E1000_MANC_RCV_TCO_EN) ||
+            !(manc & E1000_MANC_EN_MAC_ADDR_FILTER))
+            return FALSE;
+        if (e1000_arc_subsystem_valid(hw) == TRUE) {
+            fwsm = E1000_READ_REG(hw, FWSM);
+            factps = E1000_READ_REG(hw, FACTPS);
+
+            if (((fwsm & E1000_FWSM_MODE_MASK) ==
+                (e1000_mng_mode_pt << E1000_FWSM_MODE_SHIFT)) &&
+                (factps & E1000_FACTPS_MNGCG))
+                return TRUE;
+        } else
+            if ((manc & E1000_MANC_SMBUS_EN) && !(manc & E1000_MANC_ASF_EN))
+                return TRUE;
+    }
+    return FALSE;
+}
+
+static int32_t
+e1000_polarity_reversal_workaround(struct e1000_hw *hw)
+{
+    int32_t ret_val;
+    uint16_t mii_status_reg;
+    uint16_t i;
+
+    /* Polarity reversal workaround for forced 10F/10H links. */
+
+    /* Disable the transmitter on the PHY */
+
+    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0019);
+    if(ret_val)
+        return ret_val;
+    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFFFF);
     if(ret_val)
         return ret_val;
 
@@ -5403,3 +6348,265 @@ e1000_polarity_reversal_workaround(struct e1000_hw *hw)
     return E1000_SUCCESS;
 }
 
+/***************************************************************************
+ *
+ * Disables PCI-Express master access.
+ *
+ * hw: Struct containing variables accessed by shared code
+ *
+ * returns: - none.
+ *
+ ***************************************************************************/
+void
+e1000_set_pci_express_master_disable(struct e1000_hw *hw)
+{
+    uint32_t ctrl;
+
+    DEBUGFUNC("e1000_set_pci_express_master_disable");
+
+    if (hw->bus_type != e1000_bus_type_pci_express)
+        return;
+
+    ctrl = E1000_READ_REG(hw, CTRL);
+    ctrl |= E1000_CTRL_GIO_MASTER_DISABLE;
+    E1000_WRITE_REG(hw, CTRL, ctrl);
+}
+
+/***************************************************************************
+ *
+ * Enables PCI-Express master access.
+ *
+ * hw: Struct containing variables accessed by shared code
+ *
+ * returns: - none.
+ *
+ ***************************************************************************/
+void
+e1000_enable_pciex_master(struct e1000_hw *hw)
+{
+    uint32_t ctrl;
+
+    DEBUGFUNC("e1000_enable_pciex_master");
+
+    if (hw->bus_type != e1000_bus_type_pci_express)
+        return;
+
+    ctrl = E1000_READ_REG(hw, CTRL);
+    ctrl &= ~E1000_CTRL_GIO_MASTER_DISABLE;
+    E1000_WRITE_REG(hw, CTRL, ctrl);
+}
+
+/*******************************************************************************
+ *
+ * Disables PCI-Express master access and verifies there are no pending requests
+ *
+ * hw: Struct containing variables accessed by shared code
+ *
+ * returns: - E1000_ERR_MASTER_REQUESTS_PENDING if master disable bit hasn't
+ *            caused the master requests to be disabled.
+ *            E1000_SUCCESS master requests disabled.
+ *
+ ******************************************************************************/
+int32_t
+e1000_disable_pciex_master(struct e1000_hw *hw)
+{
+    int32_t timeout = MASTER_DISABLE_TIMEOUT;   /* 80ms */
+
+    DEBUGFUNC("e1000_disable_pciex_master");
+
+    if (hw->bus_type != e1000_bus_type_pci_express)
+        return E1000_SUCCESS;
+
+    e1000_set_pci_express_master_disable(hw);
+
+    while(timeout) {
+        if(!(E1000_READ_REG(hw, STATUS) & E1000_STATUS_GIO_MASTER_ENABLE))
+            break;
+        else
+            udelay(100);
+        timeout--;
+    }
+
+    if(!timeout) {
+        DEBUGOUT("Master requests are pending.\n");
+        return -E1000_ERR_MASTER_REQUESTS_PENDING;
+    }
+
+    return E1000_SUCCESS;
+}
+
+/*******************************************************************************
+ *
+ * Check for EEPROM Auto Read bit done.
+ *
+ * hw: Struct containing variables accessed by shared code
+ *
+ * returns: - E1000_ERR_RESET if fail to reset MAC
+ *            E1000_SUCCESS at any other case.
+ *
+ ******************************************************************************/
+int32_t
+e1000_get_auto_rd_done(struct e1000_hw *hw)
+{
+    int32_t timeout = AUTO_READ_DONE_TIMEOUT;
+
+    DEBUGFUNC("e1000_get_auto_rd_done");
+
+    switch (hw->mac_type) {
+    default:
+        msec_delay(5);
+        break;
+    case e1000_82573:
+        while(timeout) {
+            if (E1000_READ_REG(hw, EECD) & E1000_EECD_AUTO_RD) break;
+            else msec_delay(1);
+            timeout--;
+        }
+
+        if(!timeout) {
+            DEBUGOUT("Auto read by HW from EEPROM has not completed.\n");
+            return -E1000_ERR_RESET;
+        }
+        break;
+    }
+
+    return E1000_SUCCESS;
+}
+
+/***************************************************************************
+ * Checks if the PHY configuration is done
+ *
+ * hw: Struct containing variables accessed by shared code
+ *
+ * returns: - E1000_ERR_RESET if fail to reset MAC
+ *            E1000_SUCCESS at any other case.
+ *
+ ***************************************************************************/
+int32_t
+e1000_get_phy_cfg_done(struct e1000_hw *hw)
+{
+    DEBUGFUNC("e1000_get_phy_cfg_done");
+
+    /* Simply wait for 10ms */
+    msec_delay(10);
+
+    return E1000_SUCCESS;
+}
+
+/***************************************************************************
+ *
+ * Using the combination of SMBI and SWESMBI semaphore bits when resetting
+ * adapter or Eeprom access.
+ *
+ * hw: Struct containing variables accessed by shared code
+ *
+ * returns: - E1000_ERR_EEPROM if fail to access EEPROM.
+ *            E1000_SUCCESS at any other case.
+ *
+ ***************************************************************************/
+int32_t
+e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw)
+{
+    int32_t timeout;
+    uint32_t swsm;
+
+    DEBUGFUNC("e1000_get_hw_eeprom_semaphore");
+
+    if(!hw->eeprom_semaphore_present)
+        return E1000_SUCCESS;
+
+
+    /* Get the FW semaphore. */
+    timeout = hw->eeprom.word_size + 1;
+    while(timeout) {
+        swsm = E1000_READ_REG(hw, SWSM);
+        swsm |= E1000_SWSM_SWESMBI;
+        E1000_WRITE_REG(hw, SWSM, swsm);
+        /* if we managed to set the bit we got the semaphore. */
+        swsm = E1000_READ_REG(hw, SWSM);
+        if(swsm & E1000_SWSM_SWESMBI)
+            break;
+
+        udelay(50);
+        timeout--;
+    }
+
+    if(!timeout) {
+        /* Release semaphores */
+        e1000_put_hw_eeprom_semaphore(hw);
+        DEBUGOUT("Driver can't access the Eeprom - SWESMBI bit is set.\n");
+        return -E1000_ERR_EEPROM;
+    }
+
+    return E1000_SUCCESS;
+}
+
+/***************************************************************************
+ * This function clears HW semaphore bits.
+ *
+ * hw: Struct containing variables accessed by shared code
+ *
+ * returns: - None.
+ *
+ ***************************************************************************/
+void
+e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw)
+{
+    uint32_t swsm;
+
+    DEBUGFUNC("e1000_put_hw_eeprom_semaphore");
+
+    if(!hw->eeprom_semaphore_present)
+        return;
+
+    swsm = E1000_READ_REG(hw, SWSM);
+    /* Release both semaphores. */
+    swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI);
+    E1000_WRITE_REG(hw, SWSM, swsm);
+}
+
+/******************************************************************************
+ * Checks if PHY reset is blocked due to SOL/IDER session, for example.
+ * Returning E1000_BLK_PHY_RESET isn't necessarily an error.  But it's up to
+ * the caller to figure out how to deal with it.
+ *
+ * hw - Struct containing variables accessed by shared code
+ *
+ * returns: - E1000_BLK_PHY_RESET
+ *            E1000_SUCCESS
+ *
+ *****************************************************************************/
+int32_t
+e1000_check_phy_reset_block(struct e1000_hw *hw)
+{
+    uint32_t manc = 0;
+    if(hw->mac_type > e1000_82547_rev_2)
+        manc = E1000_READ_REG(hw, MANC);
+    return (manc & E1000_MANC_BLK_PHY_RST_ON_IDE) ?
+           E1000_BLK_PHY_RESET : E1000_SUCCESS;
+}
+
+uint8_t
+e1000_arc_subsystem_valid(struct e1000_hw *hw)
+{
+    uint32_t fwsm;
+
+    /* On 8257x silicon, registers in the range of 0x8800 - 0x8FFC
+     * may not be provided a DMA clock when no manageability features are
+     * enabled.  We do not want to perform any reads/writes to these registers
+     * if this is the case.  We read FWSM to determine the manageability mode.
+     */
+    switch (hw->mac_type) {
+    case e1000_82573:
+        fwsm = E1000_READ_REG(hw, FWSM);
+        if((fwsm & E1000_FWSM_MODE_MASK) != 0)
+            return TRUE;
+        break;
+    default:
+        break;
+    }
+    return FALSE;
+}
+
+
+
index f397e637a3c5808a7a41ce650e450ad5b732926c..a0263ee96c6b0ee9133cc0ebdbee7ce08bfe5d75 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   
-  Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
+  Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
   
   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 
@@ -57,6 +57,7 @@ typedef enum {
     e1000_82541_rev_2,
     e1000_82547,
     e1000_82547_rev_2,
+    e1000_82573,
     e1000_num_macs
 } e1000_mac_type;
 
@@ -64,6 +65,7 @@ typedef enum {
     e1000_eeprom_uninitialized = 0,
     e1000_eeprom_spi,
     e1000_eeprom_microwire,
+    e1000_eeprom_flash,
     e1000_num_eeprom_types
 } e1000_eeprom_type;
 
@@ -96,6 +98,7 @@ typedef enum {
     e1000_bus_type_unknown = 0,
     e1000_bus_type_pci,
     e1000_bus_type_pcix,
+    e1000_bus_type_pci_express,
     e1000_bus_type_reserved
 } e1000_bus_type;
 
@@ -107,6 +110,7 @@ typedef enum {
     e1000_bus_speed_100,
     e1000_bus_speed_120,
     e1000_bus_speed_133,
+    e1000_bus_speed_2500,
     e1000_bus_speed_reserved
 } e1000_bus_speed;
 
@@ -115,6 +119,8 @@ typedef enum {
     e1000_bus_width_unknown = 0,
     e1000_bus_width_32,
     e1000_bus_width_64,
+    e1000_bus_width_pciex_1,
+    e1000_bus_width_pciex_4,
     e1000_bus_width_reserved
 } e1000_bus_width;
 
@@ -196,6 +202,7 @@ typedef enum {
 typedef enum {
     e1000_phy_m88 = 0,
     e1000_phy_igp,
+    e1000_phy_igp_2,
     e1000_phy_undefined = 0xFF
 } e1000_phy_type;
 
@@ -242,8 +249,19 @@ struct e1000_eeprom_info {
     uint16_t address_bits;
     uint16_t delay_usec;
     uint16_t page_size;
+    boolean_t use_eerd;
+    boolean_t use_eewr;
 };
 
+/* Flex ASF Information */
+#define E1000_HOST_IF_MAX_SIZE  2048
+
+typedef enum {
+    e1000_byte_align = 0,
+    e1000_word_align = 1,
+    e1000_dword_align = 2
+} e1000_align_type;
+
 
 
 /* Error Codes */
@@ -254,11 +272,16 @@ struct e1000_eeprom_info {
 #define E1000_ERR_PARAM    4
 #define E1000_ERR_MAC_TYPE 5
 #define E1000_ERR_PHY_TYPE 6
+#define E1000_ERR_RESET   9
+#define E1000_ERR_MASTER_REQUESTS_PENDING 10
+#define E1000_ERR_HOST_INTERFACE_COMMAND 11
+#define E1000_BLK_PHY_RESET   12
 
 /* Function prototypes */
 /* Initialization */
 int32_t e1000_reset_hw(struct e1000_hw *hw);
 int32_t e1000_init_hw(struct e1000_hw *hw);
+int32_t e1000_id_led_init(struct e1000_hw * hw);
 int32_t e1000_set_mac_type(struct e1000_hw *hw);
 void e1000_set_media_type(struct e1000_hw *hw);
 
@@ -275,7 +298,7 @@ int32_t e1000_force_mac_fc(struct e1000_hw *hw);
 /* PHY */
 int32_t e1000_read_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *phy_data);
 int32_t e1000_write_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t data);
-void e1000_phy_hw_reset(struct e1000_hw *hw);
+int32_t e1000_phy_hw_reset(struct e1000_hw *hw);
 int32_t e1000_phy_reset(struct e1000_hw *hw);
 int32_t e1000_detect_gig_phy(struct e1000_hw *hw);
 int32_t e1000_phy_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info);
@@ -287,13 +310,86 @@ int32_t e1000_check_downshift(struct e1000_hw *hw);
 int32_t e1000_validate_mdi_setting(struct e1000_hw *hw);
 
 /* EEPROM Functions */
-void e1000_init_eeprom_params(struct e1000_hw *hw);
+int32_t e1000_init_eeprom_params(struct e1000_hw *hw);
+boolean_t e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw);
+int32_t e1000_read_eeprom_eerd(struct e1000_hw *hw, uint16_t offset, uint16_t words, uint16_t *data);
+int32_t e1000_write_eeprom_eewr(struct e1000_hw *hw, uint16_t offset, uint16_t words, uint16_t *data);
+int32_t e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd);
+
+/* MNG HOST IF functions */
+uint32_t e1000_enable_mng_pass_thru(struct e1000_hw *hw);
+
+#define E1000_MNG_DHCP_TX_PAYLOAD_CMD   64
+#define E1000_HI_MAX_MNG_DATA_LENGTH    0x6F8   /* Host Interface data length */
+
+#define E1000_MNG_DHCP_COMMAND_TIMEOUT  10      /* Time in ms to process MNG command */
+#define E1000_MNG_DHCP_COOKIE_OFFSET   0x6F0   /* Cookie offset */
+#define E1000_MNG_DHCP_COOKIE_LENGTH   0x10    /* Cookie length */
+#define E1000_MNG_IAMT_MODE            0x3
+#define E1000_IAMT_SIGNATURE            0x544D4149 /* Intel(R) Active Management Technology signature */
+
+#define E1000_MNG_DHCP_COOKIE_STATUS_PARSING_SUPPORT 0x1 /* DHCP parsing enabled */
+#define E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT    0x2 /* DHCP parsing enabled */
+#define E1000_VFTA_ENTRY_SHIFT                       0x5
+#define E1000_VFTA_ENTRY_MASK                        0x7F
+#define E1000_VFTA_ENTRY_BIT_SHIFT_MASK              0x1F
+
+struct e1000_host_mng_command_header {
+    uint8_t command_id;
+    uint8_t checksum;
+    uint16_t reserved1;
+    uint16_t reserved2;
+    uint16_t command_length;
+};
+
+struct e1000_host_mng_command_info {
+    struct e1000_host_mng_command_header command_header;  /* Command Head/Command Result Head has 4 bytes */
+    uint8_t command_data[E1000_HI_MAX_MNG_DATA_LENGTH];   /* Command data can length 0..0x658*/
+};
+#ifdef __BIG_ENDIAN
+struct e1000_host_mng_dhcp_cookie{
+    uint32_t signature;
+    uint16_t vlan_id;
+    uint8_t reserved0;
+    uint8_t status;
+    uint32_t reserved1;
+    uint8_t checksum;
+    uint8_t reserved3;
+    uint16_t reserved2;
+};
+#else
+struct e1000_host_mng_dhcp_cookie{
+    uint32_t signature;
+    uint8_t status;
+    uint8_t reserved0;
+    uint16_t vlan_id;
+    uint32_t reserved1;
+    uint16_t reserved2;
+    uint8_t reserved3;
+    uint8_t checksum;
+};
+#endif
+
+int32_t e1000_mng_write_dhcp_info(struct e1000_hw *hw, uint8_t *buffer, 
+                                                       uint16_t length);
+boolean_t e1000_check_mng_mode(struct e1000_hw *hw);
+boolean_t e1000_enable_tx_pkt_filtering(struct e1000_hw *hw);
+int32_t e1000_mng_enable_host_if(struct e1000_hw *hw);
+int32_t e1000_mng_host_if_write(struct e1000_hw *hw, uint8_t *buffer,
+                            uint16_t length, uint16_t offset, uint8_t *sum);
+int32_t e1000_mng_write_cmd_header(struct e1000_hw* hw, 
+                                   struct e1000_host_mng_command_header* hdr);
+
+int32_t e1000_mng_write_commit(struct e1000_hw *hw);
+
 int32_t e1000_read_eeprom(struct e1000_hw *hw, uint16_t reg, uint16_t words, uint16_t *data);
 int32_t e1000_validate_eeprom_checksum(struct e1000_hw *hw);
 int32_t e1000_update_eeprom_checksum(struct e1000_hw *hw);
 int32_t e1000_write_eeprom(struct e1000_hw *hw, uint16_t reg, uint16_t words, uint16_t *data);
 int32_t e1000_read_part_num(struct e1000_hw *hw, uint32_t * part_num);
 int32_t e1000_read_mac_addr(struct e1000_hw * hw);
+int32_t e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask);
+void e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask);
 
 /* Filters (multicast, vlan, receive) */
 void e1000_init_rx_addrs(struct e1000_hw *hw);
@@ -313,7 +409,6 @@ int32_t e1000_led_off(struct e1000_hw *hw);
 /* Adaptive IFS Functions */
 
 /* Everything else */
-uint32_t e1000_enable_mng_pass_thru(struct e1000_hw *hw);
 void e1000_clear_hw_cntrs(struct e1000_hw *hw);
 void e1000_reset_adaptive(struct e1000_hw *hw);
 void e1000_update_adaptive(struct e1000_hw *hw);
@@ -330,6 +425,19 @@ void e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value);
 void e1000_write_reg_io(struct e1000_hw *hw, uint32_t offset, uint32_t value);
 int32_t e1000_config_dsp_after_link_change(struct e1000_hw *hw, boolean_t link_up);
 int32_t e1000_set_d3_lplu_state(struct e1000_hw *hw, boolean_t active);
+int32_t e1000_set_d0_lplu_state(struct e1000_hw *hw, boolean_t active);
+void e1000_set_pci_express_master_disable(struct e1000_hw *hw);
+void e1000_enable_pciex_master(struct e1000_hw *hw);
+int32_t e1000_disable_pciex_master(struct e1000_hw *hw);
+int32_t e1000_get_auto_rd_done(struct e1000_hw *hw);
+int32_t e1000_get_phy_cfg_done(struct e1000_hw *hw);
+int32_t e1000_get_software_semaphore(struct e1000_hw *hw);
+void e1000_release_software_semaphore(struct e1000_hw *hw);
+int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
+int32_t e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw);
+void e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw);
+int32_t e1000_commit_shadow_ram(struct e1000_hw *hw);
+uint8_t e1000_arc_subsystem_valid(struct e1000_hw *hw);
 
 #define E1000_READ_REG_IO(a, reg) \
     e1000_read_reg_io((a), E1000_##reg)
@@ -369,6 +477,10 @@ int32_t e1000_set_d3_lplu_state(struct e1000_hw *hw, boolean_t active);
 #define E1000_DEV_ID_82546GB_SERDES      0x107B
 #define E1000_DEV_ID_82546GB_PCIE        0x108A
 #define E1000_DEV_ID_82547EI             0x1019
+#define E1000_DEV_ID_82573E              0x108B
+#define E1000_DEV_ID_82573E_IAMT         0x108C
+
+#define E1000_DEV_ID_82546GB_QUAD_COPPER 0x1099
 
 #define NODE_ADDRESS_SIZE 6
 #define ETH_LENGTH_OF_ADDRESS 6
@@ -381,6 +493,7 @@ int32_t e1000_set_d3_lplu_state(struct e1000_hw *hw, boolean_t active);
 #define E1000_REVISION_0       0
 #define E1000_REVISION_1       1
 #define E1000_REVISION_2       2
+#define E1000_REVISION_3       3
 
 #define SPEED_10    10
 #define SPEED_100   100
@@ -437,6 +550,7 @@ int32_t e1000_set_d3_lplu_state(struct e1000_hw *hw, boolean_t active);
     E1000_IMS_RXSEQ  |    \
     E1000_IMS_LSC)
 
+
 /* Number of high/low register pairs in the RAR. The RAR (Receive Address
  * Registers) holds the directed and multicast addresses that we monitor. We
  * reserve one of these spots for our directed address, allowing us room for
@@ -457,14 +571,74 @@ struct e1000_rx_desc {
     uint16_t special;
 };
 
+/* Receive Descriptor - Extended */
+union e1000_rx_desc_extended {
+    struct {
+        uint64_t buffer_addr;
+        uint64_t reserved;
+    } read;
+    struct {
+        struct {
+            uint32_t mrq;              /* Multiple Rx Queues */
+            union {
+                uint32_t rss;          /* RSS Hash */
+                struct {
+                    uint16_t ip_id;    /* IP id */
+                    uint16_t csum;     /* Packet Checksum */
+                } csum_ip;
+            } hi_dword;
+        } lower;
+        struct {
+            uint32_t status_error;     /* ext status/error */
+            uint16_t length;
+            uint16_t vlan;             /* VLAN tag */
+        } upper;
+    } wb;  /* writeback */
+};
+
+#define MAX_PS_BUFFERS 4
+/* Receive Descriptor - Packet Split */
+union e1000_rx_desc_packet_split {
+    struct {
+        /* one buffer for protocol header(s), three data buffers */
+        uint64_t buffer_addr[MAX_PS_BUFFERS];
+    } read;
+    struct {
+        struct {
+            uint32_t mrq;              /* Multiple Rx Queues */
+            union {
+                uint32_t rss;          /* RSS Hash */
+                struct {
+                    uint16_t ip_id;    /* IP id */
+                    uint16_t csum;     /* Packet Checksum */
+                } csum_ip;
+            } hi_dword;
+        } lower;
+        struct {
+            uint32_t status_error;     /* ext status/error */
+            uint16_t length0;          /* length of buffer 0 */
+            uint16_t vlan;             /* VLAN tag */
+        } middle;
+        struct {
+            uint16_t header_status;
+            uint16_t length[3];        /* length of buffers 1-3 */
+        } upper;
+        uint64_t reserved;
+    } wb; /* writeback */
+};
+
 /* Receive Decriptor bit definitions */
 #define E1000_RXD_STAT_DD       0x01    /* Descriptor Done */
 #define E1000_RXD_STAT_EOP      0x02    /* End of Packet */
 #define E1000_RXD_STAT_IXSM     0x04    /* Ignore checksum */
 #define E1000_RXD_STAT_VP       0x08    /* IEEE VLAN Packet */
+#define E1000_RXD_STAT_UDPCS    0x10    /* UDP xsum caculated */
 #define E1000_RXD_STAT_TCPCS    0x20    /* TCP xsum calculated */
 #define E1000_RXD_STAT_IPCS     0x40    /* IP xsum calculated */
 #define E1000_RXD_STAT_PIF      0x80    /* passed in-exact filter */
+#define E1000_RXD_STAT_IPIDV    0x200   /* IP identification valid */
+#define E1000_RXD_STAT_UDPV     0x400   /* Valid UDP checksum */
+#define E1000_RXD_STAT_ACK      0x8000  /* ACK Packet indication */
 #define E1000_RXD_ERR_CE        0x01    /* CRC Error */
 #define E1000_RXD_ERR_SE        0x02    /* Symbol Error */
 #define E1000_RXD_ERR_SEQ       0x04    /* Sequence Error */
@@ -474,9 +648,20 @@ struct e1000_rx_desc {
 #define E1000_RXD_ERR_RXE       0x80    /* Rx Data Error */
 #define E1000_RXD_SPC_VLAN_MASK 0x0FFF  /* VLAN ID is in lower 12 bits */
 #define E1000_RXD_SPC_PRI_MASK  0xE000  /* Priority is in upper 3 bits */
-#define E1000_RXD_SPC_PRI_SHIFT 0x000D  /* Priority is in upper 3 of 16 */
+#define E1000_RXD_SPC_PRI_SHIFT 13
 #define E1000_RXD_SPC_CFI_MASK  0x1000  /* CFI is bit 12 */
-#define E1000_RXD_SPC_CFI_SHIFT 0x000C  /* CFI is bit 12 */
+#define E1000_RXD_SPC_CFI_SHIFT 12
+
+#define E1000_RXDEXT_STATERR_CE    0x01000000
+#define E1000_RXDEXT_STATERR_SE    0x02000000
+#define E1000_RXDEXT_STATERR_SEQ   0x04000000
+#define E1000_RXDEXT_STATERR_CXE   0x10000000
+#define E1000_RXDEXT_STATERR_TCPE  0x20000000
+#define E1000_RXDEXT_STATERR_IPE   0x40000000
+#define E1000_RXDEXT_STATERR_RXE   0x80000000
+
+#define E1000_RXDPS_HDRSTAT_HDRSP        0x00008000
+#define E1000_RXDPS_HDRSTAT_HDRLEN_MASK  0x000003FF
 
 /* mask to determine if packets should be dropped due to frame errors */
 #define E1000_RXD_ERR_FRAME_ERR_MASK ( \
@@ -486,6 +671,15 @@ struct e1000_rx_desc {
     E1000_RXD_ERR_CXE |                \
     E1000_RXD_ERR_RXE)
 
+
+/* Same mask, but for extended and packet split descriptors */
+#define E1000_RXDEXT_ERR_FRAME_ERR_MASK ( \
+    E1000_RXDEXT_STATERR_CE  |            \
+    E1000_RXDEXT_STATERR_SE  |            \
+    E1000_RXDEXT_STATERR_SEQ |            \
+    E1000_RXDEXT_STATERR_CXE |            \
+    E1000_RXDEXT_STATERR_RXE)
+
 /* Transmit Descriptor */
 struct e1000_tx_desc {
     uint64_t buffer_addr;       /* Address of the descriptor's data buffer */
@@ -667,6 +861,7 @@ struct e1000_ffvt_entry {
 #define E1000_ICS      0x000C8  /* Interrupt Cause Set - WO */
 #define E1000_IMS      0x000D0  /* Interrupt Mask Set - RW */
 #define E1000_IMC      0x000D8  /* Interrupt Mask Clear - WO */
+#define E1000_IAM      0x000E0  /* Interrupt Acknowledge Auto Mask */
 #define E1000_RCTL     0x00100  /* RX Control - RW */
 #define E1000_FCTTV    0x00170  /* Flow Control Transmit Timer Value - RW */
 #define E1000_TXCW     0x00178  /* TX Configuration Word - RW */
@@ -676,9 +871,23 @@ struct e1000_ffvt_entry {
 #define E1000_TBT      0x00448  /* TX Burst Timer - RW */
 #define E1000_AIT      0x00458  /* Adaptive Interframe Spacing Throttle - RW */
 #define E1000_LEDCTL   0x00E00  /* LED Control - RW */
+#define E1000_EXTCNF_CTRL  0x00F00  /* Extended Configuration Control */
+#define E1000_EXTCNF_SIZE  0x00F08  /* Extended Configuration Size */
 #define E1000_PBA      0x01000  /* Packet Buffer Allocation - RW */
+#define E1000_PBS      0x01008  /* Packet Buffer Size */
+#define E1000_EEMNGCTL 0x01010  /* MNG EEprom Control */
+#define E1000_FLASH_UPDATES 1000
+#define E1000_EEARBC   0x01024  /* EEPROM Auto Read Bus Control */
+#define E1000_FLASHT   0x01028  /* FLASH Timer Register */
+#define E1000_EEWR     0x0102C  /* EEPROM Write Register - RW */
+#define E1000_FLSWCTL  0x01030  /* FLASH control register */
+#define E1000_FLSWDATA 0x01034  /* FLASH data register */
+#define E1000_FLSWCNT  0x01038  /* FLASH Access Counter */
+#define E1000_FLOP     0x0103C  /* FLASH Opcode Register */
+#define E1000_ERT      0x02008  /* Early Rx Threshold - RW */
 #define E1000_FCRTL    0x02160  /* Flow Control Receive Threshold Low - RW */
 #define E1000_FCRTH    0x02168  /* Flow Control Receive Threshold High - RW */
+#define E1000_PSRCTL   0x02170  /* Packet Split Receive Control - RW */
 #define E1000_RDBAL    0x02800  /* RX Descriptor Base Address Low - RW */
 #define E1000_RDBAH    0x02804  /* RX Descriptor Base Address High - RW */
 #define E1000_RDLEN    0x02808  /* RX Descriptor Length - RW */
@@ -688,6 +897,7 @@ struct e1000_ffvt_entry {
 #define E1000_RXDCTL   0x02828  /* RX Descriptor Control - RW */
 #define E1000_RADV     0x0282C  /* RX Interrupt Absolute Delay Timer - RW */
 #define E1000_RSRPD    0x02C00  /* RX Small Packet Detect - RW */
+#define E1000_RAID     0x02C08  /* Receive Ack Interrupt Delay - RW */
 #define E1000_TXDMAC   0x03000  /* TX DMA Control - RW */
 #define E1000_TDFH     0x03410  /* TX Data FIFO Head - RW */
 #define E1000_TDFT     0x03418  /* TX Data FIFO Tail - RW */
@@ -703,6 +913,14 @@ struct e1000_ffvt_entry {
 #define E1000_TXDCTL   0x03828  /* TX Descriptor Control - RW */
 #define E1000_TADV     0x0382C  /* TX Interrupt Absolute Delay Val - RW */
 #define E1000_TSPMT    0x03830  /* TCP Segmentation PAD & Min Threshold - RW */
+#define E1000_TARC0    0x03840 /* TX Arbitration Count (0) */
+#define E1000_TDBAL1   0x03900 /* TX Desc Base Address Low (1) - RW */
+#define E1000_TDBAH1   0x03904 /* TX Desc Base Address High (1) - RW */
+#define E1000_TDLEN1   0x03908 /* TX Desc Length (1) - RW */
+#define E1000_TDH1     0x03910 /* TX Desc Head (1) - RW */
+#define E1000_TDT1     0x03918 /* TX Desc Tail (1) - RW */
+#define E1000_TXDCTL1  0x03928 /* TX Descriptor Control (1) - RW */
+#define E1000_TARC1    0x03940 /* TX Arbitration Count (1) */
 #define E1000_CRCERRS  0x04000  /* CRC Error Count - R/clr */
 #define E1000_ALGNERRC 0x04004  /* Alignment Error Count - R/clr */
 #define E1000_SYMERRS  0x04008  /* Symbol Error Count - R/clr */
@@ -761,7 +979,17 @@ struct e1000_ffvt_entry {
 #define E1000_BPTC     0x040F4  /* Broadcast Packets TX Count - R/clr */
 #define E1000_TSCTC    0x040F8  /* TCP Segmentation Context TX - R/clr */
 #define E1000_TSCTFC   0x040FC  /* TCP Segmentation Context TX Fail - R/clr */
+#define E1000_IAC       0x4100  /* Interrupt Assertion Count */
+#define E1000_ICRXPTC   0x4104  /* Interrupt Cause Rx Packet Timer Expire Count */
+#define E1000_ICRXATC   0x4108  /* Interrupt Cause Rx Absolute Timer Expire Count */
+#define E1000_ICTXPTC   0x410C  /* Interrupt Cause Tx Packet Timer Expire Count */
+#define E1000_ICTXATC   0x4110  /* Interrupt Cause Tx Absolute Timer Expire Count */
+#define E1000_ICTXQEC   0x4118  /* Interrupt Cause Tx Queue Empty Count */
+#define E1000_ICTXQMTC  0x411C  /* Interrupt Cause Tx Queue Minimum Threshold Count */
+#define E1000_ICRXDMTC  0x4120  /* Interrupt Cause Rx Descriptor Minimum Threshold Count */
+#define E1000_ICRXOC    0x4124  /* Interrupt Cause Receiver Overrun Count */
 #define E1000_RXCSUM   0x05000  /* RX Checksum Control - RW */
+#define E1000_RFCTL    0x05008  /* Receive Filter Control*/
 #define E1000_MTA      0x05200  /* Multicast Table Array - RW Array */
 #define E1000_RA       0x05400  /* Receive Address - RW Array */
 #define E1000_VFTA     0x05600  /* VLAN Filter Table Array - RW Array */
@@ -779,6 +1007,16 @@ struct e1000_ffvt_entry {
 #define E1000_FFMT     0x09000  /* Flexible Filter Mask Table - RW Array */
 #define E1000_FFVT     0x09800  /* Flexible Filter Value Table - RW Array */
 
+#define E1000_GCR       0x05B00 /* PCI-Ex Control */
+#define E1000_GSCL_1    0x05B10 /* PCI-Ex Statistic Control #1 */
+#define E1000_GSCL_2    0x05B14 /* PCI-Ex Statistic Control #2 */
+#define E1000_GSCL_3    0x05B18 /* PCI-Ex Statistic Control #3 */
+#define E1000_GSCL_4    0x05B1C /* PCI-Ex Statistic Control #4 */
+#define E1000_FACTPS    0x05B30 /* Function Active and Power State to MNG */
+#define E1000_SWSM      0x05B50 /* SW Semaphore */
+#define E1000_FWSM      0x05B54 /* FW Semaphore */
+#define E1000_FFLT_DBG  0x05F04 /* Debug Register */
+#define E1000_HICR      0x08F00 /* Host Inteface Control */
 /* Register Set (82542)
  *
  * Some of the 82542 registers are located at different offsets than they are
@@ -829,6 +1067,18 @@ struct e1000_ffvt_entry {
 #define E1000_82542_VFTA     0x00600
 #define E1000_82542_LEDCTL   E1000_LEDCTL
 #define E1000_82542_PBA      E1000_PBA
+#define E1000_82542_PBS      E1000_PBS
+#define E1000_82542_EEMNGCTL E1000_EEMNGCTL
+#define E1000_82542_EEARBC   E1000_EEARBC
+#define E1000_82542_FLASHT   E1000_FLASHT
+#define E1000_82542_EEWR     E1000_EEWR
+#define E1000_82542_FLSWCTL  E1000_FLSWCTL
+#define E1000_82542_FLSWDATA E1000_FLSWDATA
+#define E1000_82542_FLSWCNT  E1000_FLSWCNT
+#define E1000_82542_FLOP     E1000_FLOP
+#define E1000_82542_EXTCNF_CTRL  E1000_EXTCNF_CTRL
+#define E1000_82542_EXTCNF_SIZE  E1000_EXTCNF_SIZE
+#define E1000_82542_ERT      E1000_ERT
 #define E1000_82542_RXDCTL   E1000_RXDCTL
 #define E1000_82542_RADV     E1000_RADV
 #define E1000_82542_RSRPD    E1000_RSRPD
@@ -913,6 +1163,38 @@ struct e1000_ffvt_entry {
 #define E1000_82542_FFMT     E1000_FFMT
 #define E1000_82542_FFVT     E1000_FFVT
 #define E1000_82542_HOST_IF  E1000_HOST_IF
+#define E1000_82542_IAM         E1000_IAM
+#define E1000_82542_EEMNGCTL    E1000_EEMNGCTL
+#define E1000_82542_PSRCTL      E1000_PSRCTL
+#define E1000_82542_RAID        E1000_RAID
+#define E1000_82542_TARC0       E1000_TARC0
+#define E1000_82542_TDBAL1      E1000_TDBAL1
+#define E1000_82542_TDBAH1      E1000_TDBAH1
+#define E1000_82542_TDLEN1      E1000_TDLEN1
+#define E1000_82542_TDH1        E1000_TDH1
+#define E1000_82542_TDT1        E1000_TDT1
+#define E1000_82542_TXDCTL1     E1000_TXDCTL1
+#define E1000_82542_TARC1       E1000_TARC1
+#define E1000_82542_RFCTL       E1000_RFCTL
+#define E1000_82542_GCR         E1000_GCR
+#define E1000_82542_GSCL_1      E1000_GSCL_1
+#define E1000_82542_GSCL_2      E1000_GSCL_2
+#define E1000_82542_GSCL_3      E1000_GSCL_3
+#define E1000_82542_GSCL_4      E1000_GSCL_4
+#define E1000_82542_FACTPS      E1000_FACTPS
+#define E1000_82542_SWSM        E1000_SWSM
+#define E1000_82542_FWSM        E1000_FWSM
+#define E1000_82542_FFLT_DBG    E1000_FFLT_DBG
+#define E1000_82542_IAC         E1000_IAC
+#define E1000_82542_ICRXPTC     E1000_ICRXPTC
+#define E1000_82542_ICRXATC     E1000_ICRXATC
+#define E1000_82542_ICTXPTC     E1000_ICTXPTC
+#define E1000_82542_ICTXATC     E1000_ICTXATC
+#define E1000_82542_ICTXQEC     E1000_ICTXQEC
+#define E1000_82542_ICTXQMTC    E1000_ICTXQMTC
+#define E1000_82542_ICRXDMTC    E1000_ICRXDMTC
+#define E1000_82542_ICRXOC      E1000_ICRXOC
+#define E1000_82542_HICR        E1000_HICR
 
 /* Statistics counters collected by the MAC */
 struct e1000_hw_stats {
@@ -974,11 +1256,21 @@ struct e1000_hw_stats {
     uint64_t bptc;
     uint64_t tsctc;
     uint64_t tsctfc;
+    uint64_t iac;
+    uint64_t icrxptc;
+    uint64_t icrxatc;
+    uint64_t ictxptc;
+    uint64_t ictxatc;
+    uint64_t ictxqec;
+    uint64_t ictxqmtc;
+    uint64_t icrxdmtc;
+    uint64_t icrxoc;
 };
 
 /* Structure containing variables used by the shared code (e1000_hw.c) */
 struct e1000_hw {
-    uint8_t __iomem *hw_addr;
+    uint8_t *hw_addr;
+    uint8_t *flash_address;
     e1000_mac_type mac_type;
     e1000_phy_type phy_type;
     uint32_t phy_init_script;
@@ -993,6 +1285,7 @@ struct e1000_hw {
     e1000_ms_type original_master_slave;
     e1000_ffe_config ffe_config_state;
     uint32_t asf_firmware_present;
+    uint32_t eeprom_semaphore_present;
     unsigned long io_base;
     uint32_t phy_id;
     uint32_t phy_revision;
@@ -1009,6 +1302,8 @@ struct e1000_hw {
     uint32_t ledctl_default;
     uint32_t ledctl_mode1;
     uint32_t ledctl_mode2;
+    boolean_t tx_pkt_filtering;
+    struct e1000_host_mng_dhcp_cookie mng_cookie;
     uint16_t phy_spd_default;
     uint16_t autoneg_advertised;
     uint16_t pci_cmd_word;
@@ -1047,16 +1342,24 @@ struct e1000_hw {
     boolean_t adaptive_ifs;
     boolean_t ifs_params_forced;
     boolean_t in_ifs_mode;
+    boolean_t mng_reg_access_disabled;
 };
 
 
 #define E1000_EEPROM_SWDPIN0   0x0001   /* SWDPIN 0 EEPROM Value */
 #define E1000_EEPROM_LED_LOGIC 0x0020   /* Led Logic Word */
+#define E1000_EEPROM_RW_REG_DATA   16   /* Offset to data in EEPROM read/write registers */
+#define E1000_EEPROM_RW_REG_DONE   2    /* Offset to READ/WRITE done bit */
+#define E1000_EEPROM_RW_REG_START  1    /* First bit for telling part to start operation */
+#define E1000_EEPROM_RW_ADDR_SHIFT 2    /* Shift to the address bits */
+#define E1000_EEPROM_POLL_WRITE    1    /* Flag for polling for write complete */
+#define E1000_EEPROM_POLL_READ     0    /* Flag for polling for read complete */
 /* Register Bit Masks */
 /* Device Control */
 #define E1000_CTRL_FD       0x00000001  /* Full duplex.0=half; 1=full */
 #define E1000_CTRL_BEM      0x00000002  /* Endian Mode.0=little,1=big */
 #define E1000_CTRL_PRIOR    0x00000004  /* Priority on PCI. 0=rx,1=fair */
+#define E1000_CTRL_GIO_MASTER_DISABLE 0x00000004 /*Blocks new Master requests */
 #define E1000_CTRL_LRST     0x00000008  /* Link reset. 0=normal,1=reset */
 #define E1000_CTRL_TME      0x00000010  /* Test mode. 0=normal,1=test */
 #define E1000_CTRL_SLE      0x00000020  /* Serial Link on 0=dis,1=en */
@@ -1070,6 +1373,7 @@ struct e1000_hw {
 #define E1000_CTRL_BEM32    0x00000400  /* Big Endian 32 mode */
 #define E1000_CTRL_FRCSPD   0x00000800  /* Force Speed */
 #define E1000_CTRL_FRCDPX   0x00001000  /* Force Duplex */
+#define E1000_CTRL_D_UD_POLARITY 0x00004000 /* Defined polarity of Dock/Undock indication in SDP[0] */
 #define E1000_CTRL_SWDPIN0  0x00040000  /* SWDPIN 0 value */
 #define E1000_CTRL_SWDPIN1  0x00080000  /* SWDPIN 1 value */
 #define E1000_CTRL_SWDPIN2  0x00100000  /* SWDPIN 2 value */
@@ -1089,6 +1393,7 @@ struct e1000_hw {
 #define E1000_STATUS_FD         0x00000001      /* Full duplex.0=half,1=full */
 #define E1000_STATUS_LU         0x00000002      /* Link up.0=no,1=link */
 #define E1000_STATUS_FUNC_MASK  0x0000000C      /* PCI Function Mask */
+#define E1000_STATUS_FUNC_SHIFT 2
 #define E1000_STATUS_FUNC_0     0x00000000      /* Function 0 */
 #define E1000_STATUS_FUNC_1     0x00000004      /* Function 1 */
 #define E1000_STATUS_TXOFF      0x00000010      /* transmission paused */
@@ -1098,6 +1403,8 @@ struct e1000_hw {
 #define E1000_STATUS_SPEED_100  0x00000040      /* Speed 100Mb/s */
 #define E1000_STATUS_SPEED_1000 0x00000080      /* Speed 1000Mb/s */
 #define E1000_STATUS_ASDV       0x00000300      /* Auto speed detect value */
+#define E1000_STATUS_DOCK_CI    0x00000800      /* Change in Dock/Undock state. Clear on write '0'. */
+#define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000 /* Status of Master requests. */
 #define E1000_STATUS_MTXCKOK    0x00000400      /* MTX clock running OK */
 #define E1000_STATUS_PCI66      0x00000800      /* In 66Mhz slot */
 #define E1000_STATUS_BUS64      0x00001000      /* In 64 bit slot */
@@ -1128,6 +1435,18 @@ struct e1000_hw {
 #ifndef E1000_EEPROM_GRANT_ATTEMPTS
 #define E1000_EEPROM_GRANT_ATTEMPTS 1000 /* EEPROM # attempts to gain grant */
 #endif
+#define E1000_EECD_AUTO_RD          0x00000200  /* EEPROM Auto Read done */
+#define E1000_EECD_SIZE_EX_MASK     0x00007800  /* EEprom Size */
+#define E1000_EECD_SIZE_EX_SHIFT    11
+#define E1000_EECD_NVADDS    0x00018000 /* NVM Address Size */
+#define E1000_EECD_SELSHAD   0x00020000 /* Select Shadow RAM */
+#define E1000_EECD_INITSRAM  0x00040000 /* Initialize Shadow RAM */
+#define E1000_EECD_FLUPD     0x00080000 /* Update FLASH */
+#define E1000_EECD_AUPDEN    0x00100000 /* Enable Autonomous FLASH update */
+#define E1000_EECD_SHADV     0x00200000 /* Shadow RAM Data Valid */
+#define E1000_EECD_SEC1VAL   0x00400000 /* Sector One Valid */
+#define E1000_STM_OPCODE     0xDB00
+#define E1000_HICR_FW_RESET  0xC0
 
 /* EEPROM Read */
 #define E1000_EERD_START      0x00000001 /* Start Read */
@@ -1171,6 +1490,8 @@ struct e1000_hw {
 #define E1000_CTRL_EXT_WR_WMARK_320   0x01000000
 #define E1000_CTRL_EXT_WR_WMARK_384   0x02000000
 #define E1000_CTRL_EXT_WR_WMARK_448   0x03000000
+#define E1000_CTRL_EXT_IAME           0x08000000  /* Interrupt acknowledge Auto-mask */
+#define E1000_CTRL_EXT_INT_TIMER_CLR  0x20000000  /* Clear Interrupt timers after IMS clear */
 
 /* MDI Control */
 #define E1000_MDIC_DATA_MASK 0x0000FFFF
@@ -1187,14 +1508,17 @@ struct e1000_hw {
 /* LED Control */
 #define E1000_LEDCTL_LED0_MODE_MASK       0x0000000F
 #define E1000_LEDCTL_LED0_MODE_SHIFT      0
+#define E1000_LEDCTL_LED0_BLINK_RATE      0x0000020
 #define E1000_LEDCTL_LED0_IVRT            0x00000040
 #define E1000_LEDCTL_LED0_BLINK           0x00000080
 #define E1000_LEDCTL_LED1_MODE_MASK       0x00000F00
 #define E1000_LEDCTL_LED1_MODE_SHIFT      8
+#define E1000_LEDCTL_LED1_BLINK_RATE      0x0002000
 #define E1000_LEDCTL_LED1_IVRT            0x00004000
 #define E1000_LEDCTL_LED1_BLINK           0x00008000
 #define E1000_LEDCTL_LED2_MODE_MASK       0x000F0000
 #define E1000_LEDCTL_LED2_MODE_SHIFT      16
+#define E1000_LEDCTL_LED2_BLINK_RATE      0x00200000
 #define E1000_LEDCTL_LED2_IVRT            0x00400000
 #define E1000_LEDCTL_LED2_BLINK           0x00800000
 #define E1000_LEDCTL_LED3_MODE_MASK       0x0F000000
@@ -1238,6 +1562,10 @@ struct e1000_hw {
 #define E1000_ICR_GPI_EN3       0x00004000 /* GP Int 3 */
 #define E1000_ICR_TXD_LOW       0x00008000
 #define E1000_ICR_SRPD          0x00010000
+#define E1000_ICR_ACK           0x00020000 /* Receive Ack frame */
+#define E1000_ICR_MNG           0x00040000 /* Manageability event */
+#define E1000_ICR_DOCK          0x00080000 /* Dock/Undock */
+#define E1000_ICR_INT_ASSERTED  0x80000000 /* If this bit asserted, the driver should claim the interrupt */
 
 /* Interrupt Cause Set */
 #define E1000_ICS_TXDW      E1000_ICR_TXDW      /* Transmit desc written back */
@@ -1255,6 +1583,9 @@ struct e1000_hw {
 #define E1000_ICS_GPI_EN3   E1000_ICR_GPI_EN3   /* GP Int 3 */
 #define E1000_ICS_TXD_LOW   E1000_ICR_TXD_LOW
 #define E1000_ICS_SRPD      E1000_ICR_SRPD
+#define E1000_ICS_ACK       E1000_ICR_ACK       /* Receive Ack frame */
+#define E1000_ICS_MNG       E1000_ICR_MNG       /* Manageability event */
+#define E1000_ICS_DOCK      E1000_ICR_DOCK      /* Dock/Undock */
 
 /* Interrupt Mask Set */
 #define E1000_IMS_TXDW      E1000_ICR_TXDW      /* Transmit desc written back */
@@ -1272,6 +1603,9 @@ struct e1000_hw {
 #define E1000_IMS_GPI_EN3   E1000_ICR_GPI_EN3   /* GP Int 3 */
 #define E1000_IMS_TXD_LOW   E1000_ICR_TXD_LOW
 #define E1000_IMS_SRPD      E1000_ICR_SRPD
+#define E1000_IMS_ACK       E1000_ICR_ACK       /* Receive Ack frame */
+#define E1000_IMS_MNG       E1000_ICR_MNG       /* Manageability event */
+#define E1000_IMS_DOCK      E1000_ICR_DOCK      /* Dock/Undock */
 
 /* Interrupt Mask Clear */
 #define E1000_IMC_TXDW      E1000_ICR_TXDW      /* Transmit desc written back */
@@ -1289,6 +1623,9 @@ struct e1000_hw {
 #define E1000_IMC_GPI_EN3   E1000_ICR_GPI_EN3   /* GP Int 3 */
 #define E1000_IMC_TXD_LOW   E1000_ICR_TXD_LOW
 #define E1000_IMC_SRPD      E1000_ICR_SRPD
+#define E1000_IMC_ACK       E1000_ICR_ACK       /* Receive Ack frame */
+#define E1000_IMC_MNG       E1000_ICR_MNG       /* Manageability event */
+#define E1000_IMC_DOCK      E1000_ICR_DOCK      /* Dock/Undock */
 
 /* Receive Control */
 #define E1000_RCTL_RST            0x00000001    /* Software reset */
@@ -1301,6 +1638,8 @@ struct e1000_hw {
 #define E1000_RCTL_LBM_MAC        0x00000040    /* MAC loopback mode */
 #define E1000_RCTL_LBM_SLP        0x00000080    /* serial link loopback mode */
 #define E1000_RCTL_LBM_TCVR       0x000000C0    /* tcvr loopback mode */
+#define E1000_RCTL_DTYP_MASK      0x00000C00    /* Descriptor type mask */
+#define E1000_RCTL_DTYP_PS        0x00000400    /* Packet Split descriptor */
 #define E1000_RCTL_RDMTS_HALF     0x00000000    /* rx desc min threshold size */
 #define E1000_RCTL_RDMTS_QUAT     0x00000100    /* rx desc min threshold size */
 #define E1000_RCTL_RDMTS_EIGTH    0x00000200    /* rx desc min threshold size */
@@ -1327,6 +1666,34 @@ struct e1000_hw {
 #define E1000_RCTL_PMCF           0x00800000    /* pass MAC control frames */
 #define E1000_RCTL_BSEX           0x02000000    /* Buffer size extension */
 #define E1000_RCTL_SECRC          0x04000000    /* Strip Ethernet CRC */
+#define E1000_RCTL_FLXBUF_MASK    0x78000000    /* Flexible buffer size */
+#define E1000_RCTL_FLXBUF_SHIFT   27            /* Flexible buffer shift */
+
+/* Use byte values for the following shift parameters
+ * Usage:
+ *     psrctl |= (((ROUNDUP(value0, 128) >> E1000_PSRCTL_BSIZE0_SHIFT) &
+ *                  E1000_PSRCTL_BSIZE0_MASK) |
+ *                ((ROUNDUP(value1, 1024) >> E1000_PSRCTL_BSIZE1_SHIFT) &
+ *                  E1000_PSRCTL_BSIZE1_MASK) |
+ *                ((ROUNDUP(value2, 1024) << E1000_PSRCTL_BSIZE2_SHIFT) &
+ *                  E1000_PSRCTL_BSIZE2_MASK) |
+ *                ((ROUNDUP(value3, 1024) << E1000_PSRCTL_BSIZE3_SHIFT) |;
+ *                  E1000_PSRCTL_BSIZE3_MASK))
+ * where value0 = [128..16256],  default=256
+ *       value1 = [1024..64512], default=4096
+ *       value2 = [0..64512],    default=4096
+ *       value3 = [0..64512],    default=0
+ */
+    
+#define E1000_PSRCTL_BSIZE0_MASK   0x0000007F
+#define E1000_PSRCTL_BSIZE1_MASK   0x00003F00
+#define E1000_PSRCTL_BSIZE2_MASK   0x003F0000
+#define E1000_PSRCTL_BSIZE3_MASK   0x3F000000
+
+#define E1000_PSRCTL_BSIZE0_SHIFT  7            /* Shift _right_ 7 */
+#define E1000_PSRCTL_BSIZE1_SHIFT  2            /* Shift _right_ 2 */
+#define E1000_PSRCTL_BSIZE2_SHIFT  6            /* Shift _left_ 6 */
+#define E1000_PSRCTL_BSIZE3_SHIFT 14            /* Shift _left_ 14 */
 
 /* Receive Descriptor */
 #define E1000_RDT_DELAY 0x0000ffff      /* Delay timer (1=1024us) */
@@ -1341,6 +1708,23 @@ struct e1000_hw {
 #define E1000_FCRTL_RTL  0x0000FFF8     /* Mask Bits[15:3] for RTL */
 #define E1000_FCRTL_XONE 0x80000000     /* Enable XON frame transmission */
 
+/* Header split receive */
+#define E1000_RFCTL_ISCSI_DIS           0x00000001
+#define E1000_RFCTL_ISCSI_DWC_MASK      0x0000003E
+#define E1000_RFCTL_ISCSI_DWC_SHIFT     1
+#define E1000_RFCTL_NFSW_DIS            0x00000040
+#define E1000_RFCTL_NFSR_DIS            0x00000080
+#define E1000_RFCTL_NFS_VER_MASK        0x00000300
+#define E1000_RFCTL_NFS_VER_SHIFT       8
+#define E1000_RFCTL_IPV6_DIS            0x00000400
+#define E1000_RFCTL_IPV6_XSUM_DIS       0x00000800
+#define E1000_RFCTL_ACK_DIS             0x00001000
+#define E1000_RFCTL_ACKD_DIS            0x00002000
+#define E1000_RFCTL_IPFRSP_DIS          0x00004000
+#define E1000_RFCTL_EXTEN               0x00008000
+#define E1000_RFCTL_IPV6_EX_DIS         0x00010000
+#define E1000_RFCTL_NEW_IPV6_EXT_DIS    0x00020000
+
 /* Receive Descriptor Control */
 #define E1000_RXDCTL_PTHRESH 0x0000003F /* RXDCTL Prefetch Threshold */
 #define E1000_RXDCTL_HTHRESH 0x00003F00 /* RXDCTL Host Threshold */
@@ -1354,6 +1738,8 @@ struct e1000_hw {
 #define E1000_TXDCTL_GRAN    0x01000000 /* TXDCTL Granularity */
 #define E1000_TXDCTL_LWTHRESH 0xFE000000 /* TXDCTL Low Threshold */
 #define E1000_TXDCTL_FULL_TX_DESC_WB 0x01010000 /* GRAN=1, WTHRESH=1 */
+#define E1000_TXDCTL_COUNT_DESC 0x00400000 /* Enable the counting of desc.
+                                              still to be processed. */
 
 /* Transmit Configuration Word */
 #define E1000_TXCW_FD         0x00000020        /* TXCW full duplex */
@@ -1387,12 +1773,16 @@ struct e1000_hw {
 #define E1000_TCTL_PBE    0x00800000    /* Packet Burst Enable */
 #define E1000_TCTL_RTLC   0x01000000    /* Re-transmit on late collision */
 #define E1000_TCTL_NRTU   0x02000000    /* No Re-transmit on underrun */
+#define E1000_TCTL_MULR   0x10000000    /* Multiple request support */
 
 /* Receive Checksum Control */
 #define E1000_RXCSUM_PCSS_MASK 0x000000FF   /* Packet Checksum Start */
 #define E1000_RXCSUM_IPOFL     0x00000100   /* IPv4 checksum offload */
 #define E1000_RXCSUM_TUOFL     0x00000200   /* TCP / UDP checksum offload */
 #define E1000_RXCSUM_IPV6OFL   0x00000400   /* IPv6 checksum offload */
+#define E1000_RXCSUM_IPPCSE    0x00001000   /* IP payload checksum enable */
+#define E1000_RXCSUM_PCSD      0x00002000   /* packet checksum disabled */
+
 
 /* Definitions for power management and wakeup registers */
 /* Wake Up Control */
@@ -1411,6 +1801,7 @@ struct e1000_hw {
 #define E1000_WUFC_ARP  0x00000020 /* ARP Request Packet Wakeup Enable */
 #define E1000_WUFC_IPV4 0x00000040 /* Directed IPv4 Packet Wakeup Enable */
 #define E1000_WUFC_IPV6 0x00000080 /* Directed IPv6 Packet Wakeup Enable */
+#define E1000_WUFC_IGNORE_TCO      0x00008000 /* Ignore WakeOn TCO packets */
 #define E1000_WUFC_FLX0 0x00010000 /* Flexible Filter 0 Enable */
 #define E1000_WUFC_FLX1 0x00020000 /* Flexible Filter 1 Enable */
 #define E1000_WUFC_FLX2 0x00040000 /* Flexible Filter 2 Enable */
@@ -1446,13 +1837,19 @@ struct e1000_hw {
 #define E1000_MANC_ARP_EN        0x00002000 /* Enable ARP Request Filtering */
 #define E1000_MANC_NEIGHBOR_EN   0x00004000 /* Enable Neighbor Discovery
                                              * Filtering */
+#define E1000_MANC_ARP_RES_EN    0x00008000 /* Enable ARP response Filtering */
 #define E1000_MANC_TCO_RESET     0x00010000 /* TCO Reset Occurred */
 #define E1000_MANC_RCV_TCO_EN    0x00020000 /* Receive TCO Packets Enabled */
 #define E1000_MANC_REPORT_STATUS 0x00040000 /* Status Reporting Enabled */
+#define E1000_MANC_BLK_PHY_RST_ON_IDE   0x00040000 /* Block phy resets */
 #define E1000_MANC_EN_MAC_ADDR_FILTER   0x00100000 /* Enable MAC address
                                                     * filtering */
 #define E1000_MANC_EN_MNG2HOST   0x00200000 /* Enable MNG packets to host
                                              * memory */
+#define E1000_MANC_EN_IP_ADDR_FILTER    0x00400000 /* Enable IP address
+                                                    * filtering */
+#define E1000_MANC_EN_XSUM_FILTER   0x00800000 /* Enable checksum filtering */
+#define E1000_MANC_BR_EN            0x01000000 /* Enable broadcast filtering */
 #define E1000_MANC_SMB_REQ       0x01000000 /* SMBus Request */
 #define E1000_MANC_SMB_GNT       0x02000000 /* SMBus Grant */
 #define E1000_MANC_SMB_CLK_IN    0x04000000 /* SMBus Clock In */
@@ -1463,11 +1860,97 @@ struct e1000_hw {
 #define E1000_MANC_SMB_DATA_OUT_SHIFT  28 /* SMBus Data Out Shift */
 #define E1000_MANC_SMB_CLK_OUT_SHIFT   29 /* SMBus Clock Out Shift */
 
+/* SW Semaphore Register */
+#define E1000_SWSM_SMBI         0x00000001 /* Driver Semaphore bit */
+#define E1000_SWSM_SWESMBI      0x00000002 /* FW Semaphore bit */
+#define E1000_SWSM_WMNG         0x00000004 /* Wake MNG Clock */
+#define E1000_SWSM_DRV_LOAD     0x00000008 /* Driver Loaded Bit */
+
+/* FW Semaphore Register */
+#define E1000_FWSM_MODE_MASK    0x0000000E /* FW mode */
+#define E1000_FWSM_MODE_SHIFT            1
+#define E1000_FWSM_FW_VALID     0x00008000 /* FW established a valid mode */
+
+/* FFLT Debug Register */
+#define E1000_FFLT_DBG_INVC     0x00100000 /* Invalid /C/ code handling */
+
+typedef enum {
+    e1000_mng_mode_none     = 0,
+    e1000_mng_mode_asf,
+    e1000_mng_mode_pt,
+    e1000_mng_mode_ipmi,
+    e1000_mng_mode_host_interface_only
+} e1000_mng_mode;
+
+/* Host Inteface Control Register */
+#define E1000_HICR_EN           0x00000001  /* Enable Bit - RO */
+#define E1000_HICR_C            0x00000002  /* Driver sets this bit when done
+                                             * to put command in RAM */
+#define E1000_HICR_SV           0x00000004  /* Status Validity */
+#define E1000_HICR_FWR          0x00000080  /* FW reset. Set by the Host */
+
+/* Host Interface Command Interface - Address range 0x8800-0x8EFF */
+#define E1000_HI_MAX_DATA_LENGTH         252 /* Host Interface data length */
+#define E1000_HI_MAX_BLOCK_BYTE_LENGTH  1792 /* Number of bytes in range */
+#define E1000_HI_MAX_BLOCK_DWORD_LENGTH  448 /* Number of dwords in range */
+#define E1000_HI_COMMAND_TIMEOUT         500 /* Time in ms to process HI command */
+
+struct e1000_host_command_header {
+    uint8_t command_id;
+    uint8_t command_length;
+    uint8_t command_options;   /* I/F bits for command, status for return */
+    uint8_t checksum;
+};
+struct e1000_host_command_info {
+    struct e1000_host_command_header command_header;  /* Command Head/Command Result Head has 4 bytes */
+    uint8_t command_data[E1000_HI_MAX_DATA_LENGTH];   /* Command data can length 0..252 */
+};
+
+/* Host SMB register #0 */
+#define E1000_HSMC0R_CLKIN      0x00000001  /* SMB Clock in */
+#define E1000_HSMC0R_DATAIN     0x00000002  /* SMB Data in */
+#define E1000_HSMC0R_DATAOUT    0x00000004  /* SMB Data out */
+#define E1000_HSMC0R_CLKOUT     0x00000008  /* SMB Clock out */
+
+/* Host SMB register #1 */
+#define E1000_HSMC1R_CLKIN      E1000_HSMC0R_CLKIN
+#define E1000_HSMC1R_DATAIN     E1000_HSMC0R_DATAIN
+#define E1000_HSMC1R_DATAOUT    E1000_HSMC0R_DATAOUT
+#define E1000_HSMC1R_CLKOUT     E1000_HSMC0R_CLKOUT
+
+/* FW Status Register */
+#define E1000_FWSTS_FWS_MASK    0x000000FF  /* FW Status */
+
 /* Wake Up Packet Length */
 #define E1000_WUPL_LENGTH_MASK 0x0FFF   /* Only the lower 12 bits are valid */
 
 #define E1000_MDALIGN          4096
 
+#define E1000_GCR_BEM32                 0x00400000
+/* Function Active and Power State to MNG */
+#define E1000_FACTPS_FUNC0_POWER_STATE_MASK         0x00000003
+#define E1000_FACTPS_LAN0_VALID                     0x00000004
+#define E1000_FACTPS_FUNC0_AUX_EN                   0x00000008
+#define E1000_FACTPS_FUNC1_POWER_STATE_MASK         0x000000C0
+#define E1000_FACTPS_FUNC1_POWER_STATE_SHIFT        6
+#define E1000_FACTPS_LAN1_VALID                     0x00000100
+#define E1000_FACTPS_FUNC1_AUX_EN                   0x00000200
+#define E1000_FACTPS_FUNC2_POWER_STATE_MASK         0x00003000
+#define E1000_FACTPS_FUNC2_POWER_STATE_SHIFT        12
+#define E1000_FACTPS_IDE_ENABLE                     0x00004000
+#define E1000_FACTPS_FUNC2_AUX_EN                   0x00008000
+#define E1000_FACTPS_FUNC3_POWER_STATE_MASK         0x000C0000
+#define E1000_FACTPS_FUNC3_POWER_STATE_SHIFT        18
+#define E1000_FACTPS_SP_ENABLE                      0x00100000
+#define E1000_FACTPS_FUNC3_AUX_EN                   0x00200000
+#define E1000_FACTPS_FUNC4_POWER_STATE_MASK         0x03000000
+#define E1000_FACTPS_FUNC4_POWER_STATE_SHIFT        24
+#define E1000_FACTPS_IPMI_ENABLE                    0x04000000
+#define E1000_FACTPS_FUNC4_AUX_EN                   0x08000000
+#define E1000_FACTPS_MNGCG                          0x20000000
+#define E1000_FACTPS_LAN_FUNC_SEL                   0x40000000
+#define E1000_FACTPS_PM_STATE_CHANGED               0x80000000
+
 /* EEPROM Commands - Microwire */
 #define EEPROM_READ_OPCODE_MICROWIRE  0x6  /* EEPROM read opcode */
 #define EEPROM_WRITE_OPCODE_MICROWIRE 0x5  /* EEPROM write opcode */
@@ -1477,22 +1960,20 @@ struct e1000_hw {
 
 /* EEPROM Commands - SPI */
 #define EEPROM_MAX_RETRY_SPI    5000 /* Max wait of 5ms, for RDY signal */
-#define EEPROM_READ_OPCODE_SPI  0x3  /* EEPROM read opcode */
-#define EEPROM_WRITE_OPCODE_SPI 0x2  /* EEPROM write opcode */
-#define EEPROM_A8_OPCODE_SPI    0x8  /* opcode bit-3 = address bit-8 */
-#define EEPROM_WREN_OPCODE_SPI  0x6  /* EEPROM set Write Enable latch */
-#define EEPROM_WRDI_OPCODE_SPI  0x4  /* EEPROM reset Write Enable latch */
-#define EEPROM_RDSR_OPCODE_SPI  0x5  /* EEPROM read Status register */
-#define EEPROM_WRSR_OPCODE_SPI  0x1  /* EEPROM write Status register */
+#define EEPROM_READ_OPCODE_SPI      0x03  /* EEPROM read opcode */
+#define EEPROM_WRITE_OPCODE_SPI     0x02  /* EEPROM write opcode */
+#define EEPROM_A8_OPCODE_SPI        0x08  /* opcode bit-3 = address bit-8 */
+#define EEPROM_WREN_OPCODE_SPI      0x06  /* EEPROM set Write Enable latch */
+#define EEPROM_WRDI_OPCODE_SPI      0x04  /* EEPROM reset Write Enable latch */
+#define EEPROM_RDSR_OPCODE_SPI      0x05  /* EEPROM read Status register */
+#define EEPROM_WRSR_OPCODE_SPI      0x01  /* EEPROM write Status register */
+#define EEPROM_ERASE4K_OPCODE_SPI   0x20  /* EEPROM ERASE 4KB */
+#define EEPROM_ERASE64K_OPCODE_SPI  0xD8  /* EEPROM ERASE 64KB */
+#define EEPROM_ERASE256_OPCODE_SPI  0xDB  /* EEPROM ERASE 256B */
 
 /* EEPROM Size definitions */
-#define EEPROM_SIZE_16KB        0x1800
-#define EEPROM_SIZE_8KB         0x1400
-#define EEPROM_SIZE_4KB         0x1000
-#define EEPROM_SIZE_2KB         0x0C00
-#define EEPROM_SIZE_1KB         0x0800
-#define EEPROM_SIZE_512B        0x0400
-#define EEPROM_SIZE_128B        0x0000
+#define EEPROM_WORD_SIZE_SHIFT  6
+#define EEPROM_SIZE_SHIFT       10
 #define EEPROM_SIZE_MASK        0x1C00
 
 /* EEPROM Word Offsets */
@@ -1606,7 +2087,22 @@ struct e1000_hw {
 #define IFS_MIN                40
 #define IFS_RATIO              4
 
+/* Extended Configuration Control and Size */
+#define E1000_EXTCNF_CTRL_PCIE_WRITE_ENABLE 0x00000001
+#define E1000_EXTCNF_CTRL_PHY_WRITE_ENABLE  0x00000002
+#define E1000_EXTCNF_CTRL_D_UD_ENABLE       0x00000004
+#define E1000_EXTCNF_CTRL_D_UD_LATENCY      0x00000008
+#define E1000_EXTCNF_CTRL_D_UD_OWNER        0x00000010
+#define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020
+#define E1000_EXTCNF_CTRL_MDIO_HW_OWNERSHIP 0x00000040
+#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER   0x1FFF0000
+
+#define E1000_EXTCNF_SIZE_EXT_PHY_LENGTH    0x000000FF
+#define E1000_EXTCNF_SIZE_EXT_DOCK_LENGTH   0x0000FF00
+#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH   0x00FF0000
+
 /* PBA constants */
+#define E1000_PBA_12K 0x000C    /* 12KB, default Rx allocation */
 #define E1000_PBA_16K 0x0010    /* 16KB, default TX allocation */
 #define E1000_PBA_22K 0x0016
 #define E1000_PBA_24K 0x0018
@@ -1663,6 +2159,13 @@ struct e1000_hw {
 /* Number of milliseconds we wait for auto-negotiation to complete */
 #define LINK_UP_TIMEOUT             500
 
+/* Number of 100 microseconds we wait for PCI Express master disable */
+#define MASTER_DISABLE_TIMEOUT      800
+/* Number of milliseconds we wait for Eeprom auto read bit done after MAC reset */
+#define AUTO_READ_DONE_TIMEOUT      10
+/* Number of milliseconds we wait for PHY configuration done after MAC reset */
+#define PHY_CFG_TIMEOUT             40
+
 #define E1000_TX_BUFFER_SIZE ((uint32_t)1514)
 
 /* The carrier extension symbol, as received by the NIC. */
@@ -1763,6 +2266,7 @@ struct e1000_hw {
 #define IGP01E1000_PHY_LINK_HEALTH 0x13 /* PHY Link Health Register */
 #define IGP01E1000_GMII_FIFO       0x14 /* GMII FIFO Register */
 #define IGP01E1000_PHY_CHANNEL_QUALITY 0x15 /* PHY Channel Quality Register */
+#define IGP02E1000_PHY_POWER_MGMT      0x19
 #define IGP01E1000_PHY_PAGE_SELECT     0x1F /* PHY Page Select Core Register */
 
 /* IGP01E1000 AGC Registers - stores the cable length values*/
@@ -1771,12 +2275,20 @@ struct e1000_hw {
 #define IGP01E1000_PHY_AGC_C        0x1472
 #define IGP01E1000_PHY_AGC_D        0x1872
 
+/* IGP02E1000 AGC Registers for cable length values */
+#define IGP02E1000_PHY_AGC_A        0x11B1
+#define IGP02E1000_PHY_AGC_B        0x12B1
+#define IGP02E1000_PHY_AGC_C        0x14B1
+#define IGP02E1000_PHY_AGC_D        0x18B1
+
 /* IGP01E1000 DSP Reset Register */
 #define IGP01E1000_PHY_DSP_RESET   0x1F33
 #define IGP01E1000_PHY_DSP_SET     0x1F71
 #define IGP01E1000_PHY_DSP_FFE     0x1F35
 
 #define IGP01E1000_PHY_CHANNEL_NUM    4
+#define IGP02E1000_PHY_CHANNEL_NUM    4
+
 #define IGP01E1000_PHY_AGC_PARAM_A    0x1171
 #define IGP01E1000_PHY_AGC_PARAM_B    0x1271
 #define IGP01E1000_PHY_AGC_PARAM_C    0x1471
@@ -2060,20 +2572,30 @@ struct e1000_hw {
 #define IGP01E1000_MSE_CHANNEL_B        0x0F00
 #define IGP01E1000_MSE_CHANNEL_A        0xF000
 
+#define IGP02E1000_PM_SPD                         0x0001  /* Smart Power Down */
+#define IGP02E1000_PM_D3_LPLU                     0x0004  /* Enable LPLU in non-D0a modes */
+#define IGP02E1000_PM_D0_LPLU                     0x0002  /* Enable LPLU in D0a mode */
+
 /* IGP01E1000 DSP reset macros */
 #define DSP_RESET_ENABLE     0x0
 #define DSP_RESET_DISABLE    0x2
 #define E1000_MAX_DSP_RESETS 10
 
-/* IGP01E1000 AGC Registers */
+/* IGP01E1000 & IGP02E1000 AGC Registers */
 
 #define IGP01E1000_AGC_LENGTH_SHIFT 7         /* Coarse - 13:11, Fine - 10:7 */
+#define IGP02E1000_AGC_LENGTH_SHIFT 9         /* Coarse - 15:13, Fine - 12:9 */
+
+/* IGP02E1000 AGC Register Length 9-bit mask */
+#define IGP02E1000_AGC_LENGTH_MASK  0x7F
 
 /* 7 bits (3 Coarse + 4 Fine) --> 128 optional values */
 #define IGP01E1000_AGC_LENGTH_TABLE_SIZE 128
+#define IGP02E1000_AGC_LENGTH_TABLE_SIZE 128
 
-/* The precision of the length is +/- 10 meters */
+/* The precision error of the cable length is +/- 10 meters */
 #define IGP01E1000_AGC_RANGE    10
+#define IGP02E1000_AGC_RANGE    10
 
 /* IGP01E1000 PCS Initialization register */
 /* bits 3:6 in the PCS registers stores the channels polarity */
@@ -2113,6 +2635,8 @@ struct e1000_hw {
 #define M88E1000_12_PHY_ID M88E1000_E_PHY_ID
 #define M88E1000_14_PHY_ID M88E1000_E_PHY_ID
 #define M88E1011_I_REV_4   0x04
+#define M88E1111_I_PHY_ID  0x01410CC0
+#define L1LXT971A_PHY_ID   0x001378E0
 
 /* Miscellaneous PHY bit definitions. */
 #define PHY_PREAMBLE        0xFFFFFFFF
index 82549a6fcfb39500bf1a4ccd1d0cafc378e8d002..325495b8b60c62db8a8db095c8deda706d84d627 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   
-  Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
+  Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
   
   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 
 #include "e1000.h"
 
 /* Change Log
- * 5.3.12      6/7/04
- * - kcompat NETIF_MSG for older kernels (2.4.9) <sean.p.mcdermott@intel.com>
- * - if_mii support and associated kcompat for older kernels
- * - More errlogging support from Jon Mason <jonmason@us.ibm.com>
- * - Fix TSO issues on PPC64 machines -- Jon Mason <jonmason@us.ibm.com>
- *
- * 5.7.1       12/16/04
- * - Resurrect 82547EI/GI related fix in e1000_intr to avoid deadlocks. This
- *   fix was removed as it caused system instability. The suspected cause of 
- *   this is the called to e1000_irq_disable in e1000_intr. Inlined the 
- *   required piece of e1000_irq_disable into e1000_intr - Anton Blanchard
- * 5.7.0       12/10/04
- * - include fix to the condition that determines when to quit NAPI - Robert Olsson
- * - use netif_poll_{disable/enable} to synchronize between NAPI and i/f up/down
- * 5.6.5       11/01/04
- * - Enabling NETIF_F_SG without checksum offload is illegal - 
-     John Mason <jdmason@us.ibm.com>
- * 5.6.3        10/26/04
- * - Remove redundant initialization - Jamal Hadi
- * - Reset buffer_info->dma in tx resource cleanup logic
- * 5.6.2       10/12/04
- * - Avoid filling tx_ring completely - shemminger@osdl.org
- * - Replace schedule_timeout() with msleep()/msleep_interruptible() -
- *   nacc@us.ibm.com
- * - Sparse cleanup - shemminger@osdl.org
- * - Fix tx resource cleanup logic
- * - LLTX support - ak@suse.de and hadi@cyberus.ca
+ * 6.0.44+     2/15/05
+ *   o applied Anton's patch to resolve tx hang in hardware
+ *   o Applied Andrew Mortons patch - e1000 stops working after resume
  */
 
 char e1000_driver_name[] = "e1000";
@@ -65,7 +41,7 @@ char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
 #else
 #define DRIVERNAPI "-NAPI"
 #endif
-#define DRV_VERSION "5.7.6-k2"DRIVERNAPI
+#define DRV_VERSION "6.0.54-k2"DRIVERNAPI
 char e1000_driver_version[] = DRV_VERSION;
 char e1000_copyright[] = "Copyright (c) 1999-2004 Intel Corporation.";
 
@@ -96,6 +72,7 @@ static struct pci_device_id e1000_pci_tbl[] = {
        INTEL_E1000_ETHERNET_DEVICE(0x1017),
        INTEL_E1000_ETHERNET_DEVICE(0x1018),
        INTEL_E1000_ETHERNET_DEVICE(0x1019),
+       INTEL_E1000_ETHERNET_DEVICE(0x101A),
        INTEL_E1000_ETHERNET_DEVICE(0x101D),
        INTEL_E1000_ETHERNET_DEVICE(0x101E),
        INTEL_E1000_ETHERNET_DEVICE(0x1026),
@@ -110,6 +87,9 @@ static struct pci_device_id e1000_pci_tbl[] = {
        INTEL_E1000_ETHERNET_DEVICE(0x107B),
        INTEL_E1000_ETHERNET_DEVICE(0x107C),
        INTEL_E1000_ETHERNET_DEVICE(0x108A),
+       INTEL_E1000_ETHERNET_DEVICE(0x108B),
+       INTEL_E1000_ETHERNET_DEVICE(0x108C),
+       INTEL_E1000_ETHERNET_DEVICE(0x1099),
        /* required last entry */
        {0,}
 };
@@ -155,10 +135,14 @@ static boolean_t e1000_clean_tx_irq(struct e1000_adapter *adapter);
 static int e1000_clean(struct net_device *netdev, int *budget);
 static boolean_t e1000_clean_rx_irq(struct e1000_adapter *adapter,
                                     int *work_done, int work_to_do);
+static boolean_t e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
+                                       int *work_done, int work_to_do);
 #else
 static boolean_t e1000_clean_rx_irq(struct e1000_adapter *adapter);
+static boolean_t e1000_clean_rx_irq_ps(struct e1000_adapter *adapter);
 #endif
 static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter);
+static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter);
 static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);
 static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
                           int cmd);
@@ -286,7 +270,29 @@ e1000_irq_enable(struct e1000_adapter *adapter)
                E1000_WRITE_FLUSH(&adapter->hw);
        }
 }
-
+void
+e1000_update_mng_vlan(struct e1000_adapter *adapter)
+{
+       struct net_device *netdev = adapter->netdev;
+       uint16_t vid = adapter->hw.mng_cookie.vlan_id;
+       uint16_t old_vid = adapter->mng_vlan_id;
+       if(adapter->vlgrp) {
+               if(!adapter->vlgrp->vlan_devices[vid]) {
+                       if(adapter->hw.mng_cookie.status &
+                               E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) {
+                               e1000_vlan_rx_add_vid(netdev, vid);
+                               adapter->mng_vlan_id = vid;
+                       } else
+                               adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
+                               
+                       if((old_vid != (uint16_t)E1000_MNG_VLAN_NONE) &&
+                                       (vid != old_vid) && 
+                                       !adapter->vlgrp->vlan_devices[old_vid])
+                               e1000_vlan_rx_kill_vid(netdev, old_vid);
+               }
+       }
+}
+       
 int
 e1000_up(struct e1000_adapter *adapter)
 {
@@ -310,19 +316,33 @@ e1000_up(struct e1000_adapter *adapter)
        e1000_configure_tx(adapter);
        e1000_setup_rctl(adapter);
        e1000_configure_rx(adapter);
-       e1000_alloc_rx_buffers(adapter);
+       adapter->alloc_rx_buf(adapter);
 
+#ifdef CONFIG_PCI_MSI
+       if(adapter->hw.mac_type > e1000_82547_rev_2) {
+               adapter->have_msi = TRUE;
+               if((err = pci_enable_msi(adapter->pdev))) {
+                       DPRINTK(PROBE, ERR,
+                        "Unable to allocate MSI interrupt Error: %d\n", err);
+                       adapter->have_msi = FALSE;
+               }
+       }
+#endif
        if((err = request_irq(adapter->pdev->irq, &e1000_intr,
                              SA_SHIRQ | SA_SAMPLE_RANDOM,
-                             netdev->name, netdev)))
+                             netdev->name, netdev))) {
+               DPRINTK(PROBE, ERR,
+                   "Unable to allocate interrupt Error: %d\n", err);
                return err;
+       }
 
        mod_timer(&adapter->watchdog_timer, jiffies);
-       e1000_irq_enable(adapter);
 
 #ifdef CONFIG_E1000_NAPI
        netif_poll_enable(netdev);
 #endif
+       e1000_irq_enable(adapter);
+
        return 0;
 }
 
@@ -333,6 +353,11 @@ e1000_down(struct e1000_adapter *adapter)
 
        e1000_irq_disable(adapter);
        free_irq(adapter->pdev->irq, netdev);
+#ifdef CONFIG_PCI_MSI
+       if(adapter->hw.mac_type > e1000_82547_rev_2 &&
+          adapter->have_msi == TRUE)
+               pci_disable_msi(adapter->pdev);
+#endif
        del_timer_sync(&adapter->tx_fifo_stall_timer);
        del_timer_sync(&adapter->watchdog_timer);
        del_timer_sync(&adapter->phy_info_timer);
@@ -350,62 +375,93 @@ e1000_down(struct e1000_adapter *adapter)
        e1000_clean_rx_ring(adapter);
 
        /* If WoL is not enabled
+        * and management mode is not IAMT
         * Power down the PHY so no link is implied when interface is down */
-       if(!adapter->wol && adapter->hw.media_type == e1000_media_type_copper) {
+       if(!adapter->wol && adapter->hw.mac_type >= e1000_82540 &&
+          adapter->hw.media_type == e1000_media_type_copper &&
+          !e1000_check_mng_mode(&adapter->hw) &&
+          !(E1000_READ_REG(&adapter->hw, MANC) & E1000_MANC_SMBUS_EN)) {
                uint16_t mii_reg;
                e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg);
                mii_reg |= MII_CR_POWER_DOWN;
                e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg);
+               mdelay(1);
        }
 }
 
 void
 e1000_reset(struct e1000_adapter *adapter)
 {
-       uint32_t pba;
+       struct net_device *netdev = adapter->netdev;
+       uint32_t pba, manc;
+       uint16_t fc_high_water_mark = E1000_FC_HIGH_DIFF;
+       uint16_t fc_low_water_mark = E1000_FC_LOW_DIFF;
 
        /* Repartition Pba for greater than 9k mtu
         * To take effect CTRL.RST is required.
         */
 
-       if(adapter->hw.mac_type < e1000_82547) {
-               if(adapter->rx_buffer_len > E1000_RXBUFFER_8192)
-                       pba = E1000_PBA_40K;
-               else
-                       pba = E1000_PBA_48K;
-       } else {
-               if(adapter->rx_buffer_len > E1000_RXBUFFER_8192)
-                       pba = E1000_PBA_22K;
-               else
-                       pba = E1000_PBA_30K;
+       switch (adapter->hw.mac_type) {
+       case e1000_82547:
+       case e1000_82547_rev_2:
+               pba = E1000_PBA_30K;
+               break;
+       case e1000_82573:
+               pba = E1000_PBA_12K;
+               break;
+       default:
+               pba = E1000_PBA_48K;
+               break;
+       }
+
+       if((adapter->hw.mac_type != e1000_82573) &&
+          (adapter->rx_buffer_len > E1000_RXBUFFER_8192)) {
+               pba -= 8; /* allocate more FIFO for Tx */
+               /* send an XOFF when there is enough space in the
+                * Rx FIFO to hold one extra full size Rx packet 
+               */
+               fc_high_water_mark = netdev->mtu + ENET_HEADER_SIZE + 
+                                       ETHERNET_FCS_SIZE + 1;
+               fc_low_water_mark = fc_high_water_mark + 8;
+       }
+
+
+       if(adapter->hw.mac_type == e1000_82547) {
                adapter->tx_fifo_head = 0;
                adapter->tx_head_addr = pba << E1000_TX_HEAD_ADDR_SHIFT;
                adapter->tx_fifo_size =
                        (E1000_PBA_40K - pba) << E1000_PBA_BYTES_SHIFT;
                atomic_set(&adapter->tx_fifo_stall, 0);
        }
+
        E1000_WRITE_REG(&adapter->hw, PBA, pba);
 
        /* flow control settings */
        adapter->hw.fc_high_water = (pba << E1000_PBA_BYTES_SHIFT) -
-                                   E1000_FC_HIGH_DIFF;
+                                   fc_high_water_mark;
        adapter->hw.fc_low_water = (pba << E1000_PBA_BYTES_SHIFT) -
-                                  E1000_FC_LOW_DIFF;
+                                  fc_low_water_mark;
        adapter->hw.fc_pause_time = E1000_FC_PAUSE_TIME;
        adapter->hw.fc_send_xon = 1;
        adapter->hw.fc = adapter->hw.original_fc;
 
+       /* Allow time for pending master requests to run */
        e1000_reset_hw(&adapter->hw);
        if(adapter->hw.mac_type >= e1000_82544)
                E1000_WRITE_REG(&adapter->hw, WUC, 0);
        if(e1000_init_hw(&adapter->hw))
                DPRINTK(PROBE, ERR, "Hardware Error\n");
-
+       e1000_update_mng_vlan(adapter);
        /* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */
        E1000_WRITE_REG(&adapter->hw, VET, ETHERNET_IEEE_VLAN_TYPE);
 
        e1000_reset_adaptive(&adapter->hw);
        e1000_phy_get_info(&adapter->hw, &adapter->phy_info);
+       if (adapter->en_mng_pt) {
+               manc = E1000_READ_REG(&adapter->hw, MANC);
+               manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST);
+               E1000_WRITE_REG(&adapter->hw, MANC, manc);
+       }
 }
 
 /**
@@ -426,15 +482,13 @@ e1000_probe(struct pci_dev *pdev,
 {
        struct net_device *netdev;
        struct e1000_adapter *adapter;
+       unsigned long mmio_start, mmio_len;
+       uint32_t swsm;
+
        static int cards_found = 0;
-       unsigned long mmio_start;
-       int mmio_len;
-       int pci_using_dac;
-       int i;
-       int err;
+       int i, err, pci_using_dac;
        uint16_t eeprom_data;
        uint16_t eeprom_apme_mask = E1000_EEPROM_APME;
-
        if((err = pci_enable_device(pdev)))
                return err;
 
@@ -521,6 +575,9 @@ e1000_probe(struct pci_dev *pdev,
        if((err = e1000_sw_init(adapter)))
                goto err_sw_init;
 
+       if((err = e1000_check_phy_reset_block(&adapter->hw)))
+               DPRINTK(PROBE, INFO, "PHY reset is blocked due to SOL/IDER session.\n");
+
        if(adapter->hw.mac_type >= e1000_82543) {
                netdev->features = NETIF_F_SG |
                                   NETIF_F_HW_CSUM |
@@ -533,6 +590,11 @@ e1000_probe(struct pci_dev *pdev,
        if((adapter->hw.mac_type >= e1000_82544) &&
           (adapter->hw.mac_type != e1000_82547))
                netdev->features |= NETIF_F_TSO;
+
+#ifdef NETIF_F_TSO_IPV6
+       if(adapter->hw.mac_type > e1000_82547_rev_2)
+               netdev->features |= NETIF_F_TSO_IPV6;
+#endif
 #endif
        if(pci_using_dac)
                netdev->features |= NETIF_F_HIGHDMA;
@@ -540,6 +602,8 @@ e1000_probe(struct pci_dev *pdev,
        /* hard_start_xmit is safe against parallel locking */
        netdev->features |= NETIF_F_LLTX; 
  
+       adapter->en_mng_pt = e1000_enable_mng_pass_thru(&adapter->hw);
+
        /* before reading the EEPROM, reset the controller to 
         * put the device in a known good starting state */
        
@@ -555,7 +619,7 @@ e1000_probe(struct pci_dev *pdev,
 
        /* copy the MAC address out of the EEPROM */
 
-       if (e1000_read_mac_addr(&adapter->hw))
+       if(e1000_read_mac_addr(&adapter->hw))
                DPRINTK(PROBE, ERR, "EEPROM Read Error\n");
        memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);
 
@@ -629,6 +693,17 @@ e1000_probe(struct pci_dev *pdev,
        /* reset the hardware with the new settings */
        e1000_reset(adapter);
 
+       /* Let firmware know the driver has taken over */
+       switch(adapter->hw.mac_type) {
+       case e1000_82573:
+               swsm = E1000_READ_REG(&adapter->hw, SWSM);
+               E1000_WRITE_REG(&adapter->hw, SWSM,
+                               swsm | E1000_SWSM_DRV_LOAD);
+               break;
+       default:
+               break;
+       }
+
        strcpy(netdev->name, "eth%d");
        if((err = register_netdev(netdev)))
                goto err_register;
@@ -664,7 +739,7 @@ e1000_remove(struct pci_dev *pdev)
 {
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct e1000_adapter *adapter = netdev->priv;
-       uint32_t manc;
+       uint32_t manc, swsm;
 
        flush_scheduled_work();
 
@@ -677,9 +752,21 @@ e1000_remove(struct pci_dev *pdev)
                }
        }
 
+       switch(adapter->hw.mac_type) {
+       case e1000_82573:
+               swsm = E1000_READ_REG(&adapter->hw, SWSM);
+               E1000_WRITE_REG(&adapter->hw, SWSM,
+                               swsm & ~E1000_SWSM_DRV_LOAD);
+               break;
+
+       default:
+               break;
+       }
+
        unregister_netdev(netdev);
 
-       e1000_phy_hw_reset(&adapter->hw);
+       if(!e1000_check_phy_reset_block(&adapter->hw))
+               e1000_phy_hw_reset(&adapter->hw);
 
        iounmap(adapter->hw.hw_addr);
        pci_release_regions(pdev);
@@ -717,6 +804,7 @@ e1000_sw_init(struct e1000_adapter *adapter)
        pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word);
 
        adapter->rx_buffer_len = E1000_RXBUFFER_2048;
+       adapter->rx_ps_bsize0 = E1000_RXBUFFER_256;
        hw->max_frame_size = netdev->mtu +
                             ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
        hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE;
@@ -730,7 +818,10 @@ e1000_sw_init(struct e1000_adapter *adapter)
 
        /* initialize eeprom parameters */
 
-       e1000_init_eeprom_params(hw);
+       if(e1000_init_eeprom_params(hw)) {
+               E1000_ERR("EEPROM initialization failed\n");
+               return -EIO;
+       }
 
        switch(hw->mac_type) {
        default:
@@ -795,6 +886,11 @@ e1000_open(struct net_device *netdev)
 
        if((err = e1000_up(adapter)))
                goto err_up;
+       adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
+       if((adapter->hw.mng_cookie.status &
+                         E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) {
+               e1000_update_mng_vlan(adapter);
+       }
 
        return E1000_SUCCESS;
 
@@ -830,14 +926,18 @@ e1000_close(struct net_device *netdev)
        e1000_free_tx_resources(adapter);
        e1000_free_rx_resources(adapter);
 
+       if((adapter->hw.mng_cookie.status &
+                         E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) {
+               e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
+       }
        return 0;
 }
 
 /**
  * e1000_check_64k_bound - check that memory doesn't cross 64kB boundary
  * @adapter: address of board private structure
- * @begin: address of beginning of memory
- * @end: address of end of memory
+ * @start: address of beginning of memory
+ * @len: length of memory
  **/
 static inline boolean_t
 e1000_check_64k_bound(struct e1000_adapter *adapter,
@@ -846,12 +946,10 @@ e1000_check_64k_bound(struct e1000_adapter *adapter,
        unsigned long begin = (unsigned long) start;
        unsigned long end = begin + len;
 
-       /* first rev 82545 and 82546 need to not allow any memory
-        * write location to cross 64k boundary due to errata 23 */
+       /* First rev 82545 and 82546 need to not allow any memory
+        * write location to cross 64k boundary due to errata 23 */
        if (adapter->hw.mac_type == e1000_82545 ||
-           adapter->hw.mac_type == e1000_82546 ) {
-
-               /* check buffer doesn't cross 64kB */
+           adapter->hw.mac_type == e1000_82546) {
                return ((begin ^ (end - 1)) >> 16) != 0 ? FALSE : TRUE;
        }
 
@@ -875,8 +973,8 @@ e1000_setup_tx_resources(struct e1000_adapter *adapter)
        size = sizeof(struct e1000_buffer) * txdr->count;
        txdr->buffer_info = vmalloc(size);
        if(!txdr->buffer_info) {
-               DPRINTK(PROBE, ERR, 
-               "Unable to Allocate Memory for the Transmit descriptor ring\n");
+               DPRINTK(PROBE, ERR,
+               "Unable to allocate memory for the transmit descriptor ring\n");
                return -ENOMEM;
        }
        memset(txdr->buffer_info, 0, size);
@@ -889,38 +987,38 @@ e1000_setup_tx_resources(struct e1000_adapter *adapter)
        txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);
        if(!txdr->desc) {
 setup_tx_desc_die:
-               DPRINTK(PROBE, ERR, 
-               "Unable to Allocate Memory for the Transmit descriptor ring\n");
                vfree(txdr->buffer_info);
+               DPRINTK(PROBE, ERR,
+               "Unable to allocate memory for the transmit descriptor ring\n");
                return -ENOMEM;
        }
 
-       /* fix for errata 23, cant cross 64kB boundary */
+       /* Fix for errata 23, can't cross 64kB boundary */
        if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {
                void *olddesc = txdr->desc;
                dma_addr_t olddma = txdr->dma;
-               DPRINTK(TX_ERR,ERR,"txdr align check failed: %u bytes at %p\n",
-                       txdr->size, txdr->desc);
-               /* try again, without freeing the previous */
+               DPRINTK(TX_ERR, ERR, "txdr align check failed: %u bytes "
+                                    "at %p\n", txdr->size, txdr->desc);
+               /* Try again, without freeing the previous */
                txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);
-               /* failed allocation, critial failure */
                if(!txdr->desc) {
+               /* Failed allocation, critical failure */
                        pci_free_consistent(pdev, txdr->size, olddesc, olddma);
                        goto setup_tx_desc_die;
                }
 
                if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {
                        /* give up */
-                       pci_free_consistent(pdev, txdr->size,
-                            txdr->desc, txdr->dma);
+                       pci_free_consistent(pdev, txdr->size, txdr->desc,
+                                           txdr->dma);
                        pci_free_consistent(pdev, txdr->size, olddesc, olddma);
                        DPRINTK(PROBE, ERR,
-                        "Unable to Allocate aligned Memory for the Transmit"
-                        " descriptor ring\n");
+                               "Unable to allocate aligned memory "
+                               "for the transmit descriptor ring\n");
                        vfree(txdr->buffer_info);
                        return -ENOMEM;
                } else {
-                       /* free old, move on with the new one since its okay */
+                       /* Free old allocation, new allocation was successful */
                        pci_free_consistent(pdev, txdr->size, olddesc, olddma);
                }
        }
@@ -1022,59 +1120,88 @@ e1000_setup_rx_resources(struct e1000_adapter *adapter)
 {
        struct e1000_desc_ring *rxdr = &adapter->rx_ring;
        struct pci_dev *pdev = adapter->pdev;
-       int size;
+       int size, desc_len;
 
        size = sizeof(struct e1000_buffer) * rxdr->count;
        rxdr->buffer_info = vmalloc(size);
        if(!rxdr->buffer_info) {
-               DPRINTK(PROBE, ERR, 
-               "Unable to Allocate Memory for the Recieve descriptor ring\n");
+               DPRINTK(PROBE, ERR,
+               "Unable to allocate memory for the receive descriptor ring\n");
                return -ENOMEM;
        }
        memset(rxdr->buffer_info, 0, size);
 
+       size = sizeof(struct e1000_ps_page) * rxdr->count;
+       rxdr->ps_page = kmalloc(size, GFP_KERNEL);
+       if(!rxdr->ps_page) {
+               vfree(rxdr->buffer_info);
+               DPRINTK(PROBE, ERR,
+               "Unable to allocate memory for the receive descriptor ring\n");
+               return -ENOMEM;
+       }
+       memset(rxdr->ps_page, 0, size);
+
+       size = sizeof(struct e1000_ps_page_dma) * rxdr->count;
+       rxdr->ps_page_dma = kmalloc(size, GFP_KERNEL);
+       if(!rxdr->ps_page_dma) {
+               vfree(rxdr->buffer_info);
+               kfree(rxdr->ps_page);
+               DPRINTK(PROBE, ERR,
+               "Unable to allocate memory for the receive descriptor ring\n");
+               return -ENOMEM;
+       }
+       memset(rxdr->ps_page_dma, 0, size);
+
+       if(adapter->hw.mac_type <= e1000_82547_rev_2)
+               desc_len = sizeof(struct e1000_rx_desc);
+       else
+               desc_len = sizeof(union e1000_rx_desc_packet_split);
+
        /* Round up to nearest 4K */
 
-       rxdr->size = rxdr->count * sizeof(struct e1000_rx_desc);
+       rxdr->size = rxdr->count * desc_len;
        E1000_ROUNDUP(rxdr->size, 4096);
 
        rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);
 
        if(!rxdr->desc) {
 setup_rx_desc_die:
-               DPRINTK(PROBE, ERR, 
-               "Unble to Allocate Memory for the Recieve descriptor ring\n");
                vfree(rxdr->buffer_info);
+               kfree(rxdr->ps_page);
+               kfree(rxdr->ps_page_dma);
+               DPRINTK(PROBE, ERR,
+               "Unable to allocate memory for the receive descriptor ring\n");
                return -ENOMEM;
        }
 
-       /* fix for errata 23, cant cross 64kB boundary */
+       /* Fix for errata 23, can't cross 64kB boundary */
        if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {
                void *olddesc = rxdr->desc;
                dma_addr_t olddma = rxdr->dma;
-               DPRINTK(RX_ERR,ERR,
-                       "rxdr align check failed: %u bytes at %p\n",
-                       rxdr->size, rxdr->desc);
-               /* try again, without freeing the previous */
+               DPRINTK(RX_ERR, ERR, "rxdr align check failed: %u bytes "
+                                    "at %p\n", rxdr->size, rxdr->desc);
+               /* Try again, without freeing the previous */
                rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);
-               /* failed allocation, critial failure */
                if(!rxdr->desc) {
+               /* Failed allocation, critical failure */
                        pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
                        goto setup_rx_desc_die;
                }
 
                if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {
                        /* give up */
-                       pci_free_consistent(pdev, rxdr->size,
-                            rxdr->desc, rxdr->dma);
+                       pci_free_consistent(pdev, rxdr->size, rxdr->desc,
+                                           rxdr->dma);
                        pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
-                       DPRINTK(PROBE, ERR, 
-                               "Unable to Allocate aligned Memory for the"
-                               " Receive descriptor ring\n");
+                       DPRINTK(PROBE, ERR,
+                               "Unable to allocate aligned memory "
+                               "for the receive descriptor ring\n");
                        vfree(rxdr->buffer_info);
+                       kfree(rxdr->ps_page);
+                       kfree(rxdr->ps_page_dma);
                        return -ENOMEM;
                } else {
-                       /* free old, move on with the new one since its okay */
+                       /* Free old allocation, new allocation was successful */
                        pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
                }
        }
@@ -1087,14 +1214,15 @@ setup_rx_desc_die:
 }
 
 /**
- * e1000_setup_rctl - configure the receive control register
+ * e1000_setup_rctl - configure the receive control registers
  * @adapter: Board private structure
  **/
 
 static void
 e1000_setup_rctl(struct e1000_adapter *adapter)
 {
-       uint32_t rctl;
+       uint32_t rctl, rfctl;
+       uint32_t psrctl = 0;
 
        rctl = E1000_READ_REG(&adapter->hw, RCTL);
 
@@ -1109,24 +1237,69 @@ e1000_setup_rctl(struct e1000_adapter *adapter)
        else
                rctl &= ~E1000_RCTL_SBP;
 
+       if (adapter->netdev->mtu <= ETH_DATA_LEN)
+               rctl &= ~E1000_RCTL_LPE;
+       else
+               rctl |= E1000_RCTL_LPE;
+
        /* Setup buffer sizes */
-       rctl &= ~(E1000_RCTL_SZ_4096);
-       rctl |= (E1000_RCTL_BSEX | E1000_RCTL_LPE);
-       switch (adapter->rx_buffer_len) {
-       case E1000_RXBUFFER_2048:
-       default:
-               rctl |= E1000_RCTL_SZ_2048;
-               rctl &= ~(E1000_RCTL_BSEX | E1000_RCTL_LPE);
-               break;
-       case E1000_RXBUFFER_4096:
-               rctl |= E1000_RCTL_SZ_4096;
-               break;
-       case E1000_RXBUFFER_8192:
-               rctl |= E1000_RCTL_SZ_8192;
-               break;
-       case E1000_RXBUFFER_16384:
-               rctl |= E1000_RCTL_SZ_16384;
-               break;
+       if(adapter->hw.mac_type == e1000_82573) {
+               /* We can now specify buffers in 1K increments.
+                * BSIZE and BSEX are ignored in this case. */
+               rctl |= adapter->rx_buffer_len << 0x11;
+       } else {
+               rctl &= ~E1000_RCTL_SZ_4096;
+               rctl |= E1000_RCTL_BSEX; 
+               switch (adapter->rx_buffer_len) {
+               case E1000_RXBUFFER_2048:
+               default:
+                       rctl |= E1000_RCTL_SZ_2048;
+                       rctl &= ~E1000_RCTL_BSEX;
+                       break;
+               case E1000_RXBUFFER_4096:
+                       rctl |= E1000_RCTL_SZ_4096;
+                       break;
+               case E1000_RXBUFFER_8192:
+                       rctl |= E1000_RCTL_SZ_8192;
+                       break;
+               case E1000_RXBUFFER_16384:
+                       rctl |= E1000_RCTL_SZ_16384;
+                       break;
+               }
+       }
+
+#ifdef CONFIG_E1000_PACKET_SPLIT
+       /* 82571 and greater support packet-split where the protocol
+        * header is placed in skb->data and the packet data is
+        * placed in pages hanging off of skb_shinfo(skb)->nr_frags.
+        * In the case of a non-split, skb->data is linearly filled,
+        * followed by the page buffers.  Therefore, skb->data is
+        * sized to hold the largest protocol header.
+        */
+       adapter->rx_ps = (adapter->hw.mac_type > e1000_82547_rev_2) 
+                         && (adapter->netdev->mtu 
+                             < ((3 * PAGE_SIZE) + adapter->rx_ps_bsize0));
+#endif
+       if(adapter->rx_ps) {
+               /* Configure extra packet-split registers */
+               rfctl = E1000_READ_REG(&adapter->hw, RFCTL);
+               rfctl |= E1000_RFCTL_EXTEN;
+               /* disable IPv6 packet split support */
+               rfctl |= E1000_RFCTL_IPV6_DIS;
+               E1000_WRITE_REG(&adapter->hw, RFCTL, rfctl);
+
+               rctl |= E1000_RCTL_DTYP_PS | E1000_RCTL_SECRC;
+               
+               psrctl |= adapter->rx_ps_bsize0 >>
+                       E1000_PSRCTL_BSIZE0_SHIFT;
+               psrctl |= PAGE_SIZE >>
+                       E1000_PSRCTL_BSIZE1_SHIFT;
+               psrctl |= PAGE_SIZE <<
+                       E1000_PSRCTL_BSIZE2_SHIFT;
+               psrctl |= PAGE_SIZE <<
+                       E1000_PSRCTL_BSIZE3_SHIFT;
+
+               E1000_WRITE_REG(&adapter->hw, PSRCTL, psrctl);
        }
 
        E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
@@ -1143,9 +1316,18 @@ static void
 e1000_configure_rx(struct e1000_adapter *adapter)
 {
        uint64_t rdba = adapter->rx_ring.dma;
-       uint32_t rdlen = adapter->rx_ring.count * sizeof(struct e1000_rx_desc);
-       uint32_t rctl;
-       uint32_t rxcsum;
+       uint32_t rdlen, rctl, rxcsum;
+
+       if(adapter->rx_ps) {
+               rdlen = adapter->rx_ring.count *
+                       sizeof(union e1000_rx_desc_packet_split);
+               adapter->clean_rx = e1000_clean_rx_irq_ps;
+               adapter->alloc_rx_buf = e1000_alloc_rx_buffers_ps;
+       } else {
+               rdlen = adapter->rx_ring.count * sizeof(struct e1000_rx_desc);
+               adapter->clean_rx = e1000_clean_rx_irq;
+               adapter->alloc_rx_buf = e1000_alloc_rx_buffers;
+       }
 
        /* disable receives while setting up the descriptors */
        rctl = E1000_READ_REG(&adapter->hw, RCTL);
@@ -1172,13 +1354,27 @@ e1000_configure_rx(struct e1000_adapter *adapter)
        E1000_WRITE_REG(&adapter->hw, RDT, 0);
 
        /* Enable 82543 Receive Checksum Offload for TCP and UDP */
-       if((adapter->hw.mac_type >= e1000_82543) &&
-          (adapter->rx_csum == TRUE)) {
+       if(adapter->hw.mac_type >= e1000_82543) {
                rxcsum = E1000_READ_REG(&adapter->hw, RXCSUM);
-               rxcsum |= E1000_RXCSUM_TUOFL;
+               if(adapter->rx_csum == TRUE) {
+                       rxcsum |= E1000_RXCSUM_TUOFL;
+
+                       /* Enable 82573 IPv4 payload checksum for UDP fragments
+                        * Must be used in conjunction with packet-split. */
+                       if((adapter->hw.mac_type > e1000_82547_rev_2) && 
+                          (adapter->rx_ps)) {
+                               rxcsum |= E1000_RXCSUM_IPPCSE;
+                       }
+               } else {
+                       rxcsum &= ~E1000_RXCSUM_TUOFL;
+                       /* don't need to clear IPPCSE as it defaults to 0 */
+               }
                E1000_WRITE_REG(&adapter->hw, RXCSUM, rxcsum);
        }
 
+       if (adapter->hw.mac_type == e1000_82573)
+               E1000_WRITE_REG(&adapter->hw, ERT, 0x0100);
+
        /* Enable Receives */
        E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
 }
@@ -1210,13 +1406,11 @@ static inline void
 e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
                        struct e1000_buffer *buffer_info)
 {
-       struct pci_dev *pdev = adapter->pdev;
-
        if(buffer_info->dma) {
-               pci_unmap_page(pdev,
-                              buffer_info->dma,
-                              buffer_info->length,
-                              PCI_DMA_TODEVICE);
+               pci_unmap_page(adapter->pdev,
+                               buffer_info->dma,
+                               buffer_info->length,
+                               PCI_DMA_TODEVICE);
                buffer_info->dma = 0;
        }
        if(buffer_info->skb) {
@@ -1241,7 +1435,7 @@ e1000_clean_tx_ring(struct e1000_adapter *adapter)
        /* Free all the Tx ring sk_buffs */
 
        if (likely(adapter->previous_buffer_info.skb != NULL)) {
-               e1000_unmap_and_free_tx_resource(adapter, 
+               e1000_unmap_and_free_tx_resource(adapter,
                                &adapter->previous_buffer_info);
        }
 
@@ -1281,6 +1475,10 @@ e1000_free_rx_resources(struct e1000_adapter *adapter)
 
        vfree(rx_ring->buffer_info);
        rx_ring->buffer_info = NULL;
+       kfree(rx_ring->ps_page);
+       rx_ring->ps_page = NULL;
+       kfree(rx_ring->ps_page_dma);
+       rx_ring->ps_page_dma = NULL;
 
        pci_free_consistent(pdev, rx_ring->size, rx_ring->desc, rx_ring->dma);
 
@@ -1297,16 +1495,19 @@ e1000_clean_rx_ring(struct e1000_adapter *adapter)
 {
        struct e1000_desc_ring *rx_ring = &adapter->rx_ring;
        struct e1000_buffer *buffer_info;
+       struct e1000_ps_page *ps_page;
+       struct e1000_ps_page_dma *ps_page_dma;
        struct pci_dev *pdev = adapter->pdev;
        unsigned long size;
-       unsigned int i;
+       unsigned int i, j;
 
        /* Free all the Rx ring sk_buffs */
 
        for(i = 0; i < rx_ring->count; i++) {
                buffer_info = &rx_ring->buffer_info[i];
                if(buffer_info->skb) {
-
+                       ps_page = &rx_ring->ps_page[i];
+                       ps_page_dma = &rx_ring->ps_page_dma[i];
                        pci_unmap_single(pdev,
                                         buffer_info->dma,
                                         buffer_info->length,
@@ -1314,11 +1515,25 @@ e1000_clean_rx_ring(struct e1000_adapter *adapter)
 
                        dev_kfree_skb(buffer_info->skb);
                        buffer_info->skb = NULL;
+
+                       for(j = 0; j < PS_PAGE_BUFFERS; j++) {
+                               if(!ps_page->ps_page[j]) break;
+                               pci_unmap_single(pdev,
+                                                ps_page_dma->ps_page_dma[j],
+                                                PAGE_SIZE, PCI_DMA_FROMDEVICE);
+                               ps_page_dma->ps_page_dma[j] = 0;
+                               put_page(ps_page->ps_page[j]);
+                               ps_page->ps_page[j] = NULL;
+                       }
                }
        }
 
        size = sizeof(struct e1000_buffer) * rx_ring->count;
        memset(rx_ring->buffer_info, 0, size);
+       size = sizeof(struct e1000_ps_page) * rx_ring->count;
+       memset(rx_ring->ps_page, 0, size);
+       size = sizeof(struct e1000_ps_page_dma) * rx_ring->count;
+       memset(rx_ring->ps_page_dma, 0, size);
 
        /* Zero out the descriptor ring */
 
@@ -1422,15 +1637,15 @@ e1000_set_multi(struct net_device *netdev)
        struct e1000_adapter *adapter = netdev->priv;
        struct e1000_hw *hw = &adapter->hw;
        struct dev_mc_list *mc_ptr;
+       unsigned long flags;
        uint32_t rctl;
        uint32_t hash_value;
        int i;
-       unsigned long flags;
-
-       /* Check for Promiscuous and All Multicast modes */
 
        spin_lock_irqsave(&adapter->tx_lock, flags);
 
+       /* Check for Promiscuous and All Multicast modes */
+
        rctl = E1000_READ_REG(hw, RCTL);
 
        if(netdev->flags & IFF_PROMISC) {
@@ -1556,6 +1771,11 @@ e1000_watchdog_task(struct e1000_adapter *adapter)
        uint32_t link;
 
        e1000_check_for_link(&adapter->hw);
+       if (adapter->hw.mac_type == e1000_82573) {
+               e1000_enable_tx_pkt_filtering(&adapter->hw);
+               if(adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id)
+                       e1000_update_mng_vlan(adapter);
+       }       
 
        if((adapter->hw.media_type == e1000_media_type_internal_serdes) &&
           !(E1000_READ_REG(&adapter->hw, TXCW) & E1000_TXCW_ANE))
@@ -1632,7 +1852,7 @@ e1000_watchdog_task(struct e1000_adapter *adapter)
        /* Cause software interrupt to ensure rx ring is cleaned */
        E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_RXDMT0);
 
-       /* Force detection of hung controller every watchdog period*/
+       /* Force detection of hung controller every watchdog period */
        adapter->detect_tx_hung = TRUE;
 
        /* Reset the timer */
@@ -1642,6 +1862,7 @@ e1000_watchdog_task(struct e1000_adapter *adapter)
 #define E1000_TX_FLAGS_CSUM            0x00000001
 #define E1000_TX_FLAGS_VLAN            0x00000002
 #define E1000_TX_FLAGS_TSO             0x00000004
+#define E1000_TX_FLAGS_IPV4            0x00000008
 #define E1000_TX_FLAGS_VLAN_MASK       0xffff0000
 #define E1000_TX_FLAGS_VLAN_SHIFT      16
 
@@ -1652,7 +1873,7 @@ e1000_tso(struct e1000_adapter *adapter, struct sk_buff *skb)
        struct e1000_context_desc *context_desc;
        unsigned int i;
        uint32_t cmd_length = 0;
-       uint16_t ipcse, tucse, mss;
+       uint16_t ipcse = 0, tucse, mss;
        uint8_t ipcss, ipcso, tucss, tucso, hdr_len;
        int err;
 
@@ -1665,23 +1886,37 @@ e1000_tso(struct e1000_adapter *adapter, struct sk_buff *skb)
 
                hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2));
                mss = skb_shinfo(skb)->tso_size;
-               skb->nh.iph->tot_len = 0;
-               skb->nh.iph->check = 0;
-               skb->h.th->check = ~csum_tcpudp_magic(skb->nh.iph->saddr,
-                                                     skb->nh.iph->daddr,
-                                                     0,
-                                                     IPPROTO_TCP,
-                                                     0);
+               if(skb->protocol == ntohs(ETH_P_IP)) {
+                       skb->nh.iph->tot_len = 0;
+                       skb->nh.iph->check = 0;
+                       skb->h.th->check =
+                               ~csum_tcpudp_magic(skb->nh.iph->saddr,
+                                                  skb->nh.iph->daddr,
+                                                  0,
+                                                  IPPROTO_TCP,
+                                                  0);
+                       cmd_length = E1000_TXD_CMD_IP;
+                       ipcse = skb->h.raw - skb->data - 1;
+#ifdef NETIF_F_TSO_IPV6
+               } else if(skb->protocol == ntohs(ETH_P_IPV6)) {
+                       skb->nh.ipv6h->payload_len = 0;
+                       skb->h.th->check =
+                               ~csum_ipv6_magic(&skb->nh.ipv6h->saddr,
+                                                &skb->nh.ipv6h->daddr,
+                                                0,
+                                                IPPROTO_TCP,
+                                                0);
+                       ipcse = 0;
+#endif
+               }
                ipcss = skb->nh.raw - skb->data;
                ipcso = (void *)&(skb->nh.iph->check) - (void *)skb->data;
-               ipcse = skb->h.raw - skb->data - 1;
                tucss = skb->h.raw - skb->data;
                tucso = (void *)&(skb->h.th->check) - (void *)skb->data;
                tucse = 0;
 
                cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE |
-                              E1000_TXD_CMD_IP | E1000_TXD_CMD_TCP |
-                              (skb->len - (hdr_len)));
+                              E1000_TXD_CMD_TCP | (skb->len - (hdr_len)));
 
                i = adapter->tx_ring.next_to_use;
                context_desc = E1000_CONTEXT_DESC(adapter->tx_ring, i);
@@ -1760,6 +1995,15 @@ e1000_tx_map(struct e1000_adapter *adapter, struct sk_buff *skb,
                if(unlikely(mss && !nr_frags && size == len && size > 8))
                        size -= 4;
 #endif
+               /* work-around for errata 10 and it applies
+                * to all controllers in PCI-X mode
+                * The fix is to make sure that the first descriptor of a
+                * packet is smaller than 2048 - 16 - 16 (or 2016) bytes
+                */
+               if(unlikely((adapter->hw.bus_type == e1000_bus_type_pcix) &&
+                               (size > 2015) && count == 0))
+                       size = 2015;
+                                                                                
                /* Workaround for potential 82544 hang in PCI-X.  Avoid
                 * terminating buffers within evenly-aligned dwords. */
                if(unlikely(adapter->pcix_82544 &&
@@ -1840,7 +2084,10 @@ e1000_tx_queue(struct e1000_adapter *adapter, int count, int tx_flags)
        if(likely(tx_flags & E1000_TX_FLAGS_TSO)) {
                txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D |
                             E1000_TXD_CMD_TSE;
-               txd_upper |= (E1000_TXD_POPTS_IXSM | E1000_TXD_POPTS_TXSM) << 8;
+               txd_upper |= E1000_TXD_POPTS_TXSM << 8;
+
+               if(likely(tx_flags & E1000_TX_FLAGS_IPV4))
+                       txd_upper |= E1000_TXD_POPTS_IXSM << 8;
        }
 
        if(likely(tx_flags & E1000_TX_FLAGS_CSUM)) {
@@ -1915,6 +2162,53 @@ no_fifo_stall_required:
        return 0;
 }
 
+#define MINIMUM_DHCP_PACKET_SIZE 282
+static inline int
+e1000_transfer_dhcp_info(struct e1000_adapter *adapter, struct sk_buff *skb)
+{
+       struct e1000_hw *hw =  &adapter->hw;
+       uint16_t length, offset;
+       if(vlan_tx_tag_present(skb)) {
+               if(!((vlan_tx_tag_get(skb) == adapter->hw.mng_cookie.vlan_id) &&
+                       ( adapter->hw.mng_cookie.status &
+                         E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) )
+                       return 0;
+       }
+       if(htons(ETH_P_IP) == skb->protocol) {
+               const struct iphdr *ip = skb->nh.iph;
+               if(IPPROTO_UDP == ip->protocol) {
+                       struct udphdr *udp = (struct udphdr *)(skb->h.uh);
+                       if(ntohs(udp->dest) == 67) {
+                               offset = (uint8_t *)udp + 8 - skb->data;
+                               length = skb->len - offset;
+
+                               return e1000_mng_write_dhcp_info(hw,
+                                               (uint8_t *)udp + 8, length);
+                       }
+               }
+       } else if((skb->len > MINIMUM_DHCP_PACKET_SIZE) && (!skb->protocol)) {
+               struct ethhdr *eth = (struct ethhdr *) skb->data;
+               if((htons(ETH_P_IP) == eth->h_proto)) {
+                       const struct iphdr *ip = 
+                               (struct iphdr *)((uint8_t *)skb->data+14);
+                       if(IPPROTO_UDP == ip->protocol) {
+                               struct udphdr *udp = 
+                                       (struct udphdr *)((uint8_t *)ip + 
+                                               (ip->ihl << 2));
+                               if(ntohs(udp->dest) == 67) {
+                                       offset = (uint8_t *)udp + 8 - skb->data;
+                                       length = skb->len - offset;
+
+                                       return e1000_mng_write_dhcp_info(hw,
+                                                       (uint8_t *)udp + 8, 
+                                                       length);
+                               }
+                       }
+               }
+       }
+       return 0;
+}
+
 #define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )
 static int
 e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
@@ -1939,7 +2233,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
 
 #ifdef NETIF_F_TSO
        mss = skb_shinfo(skb)->tso_size;
-       /* The controller does a simple calculation to
+       /* The controller does a simple calculation to 
         * make sure there is enough room in the FIFO before
         * initiating the DMA for each buffer.  The calc is:
         * 4 = ceil(buffer len/mss).  To make sure we don't
@@ -1952,7 +2246,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
 
        if((mss) || (skb->ip_summed == CHECKSUM_HW))
                count++;
-       count++;        /* for sentinel desc */
+       count++;
 #else
        if(skb->ip_summed == CHECKSUM_HW)
                count++;
@@ -1962,6 +2256,13 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
        if(adapter->pcix_82544)
                count++;
 
+       /* work-around for errata 10 and it applies to all controllers 
+        * in PCI-X mode, so add one more descriptor to the count
+        */
+       if(unlikely((adapter->hw.bus_type == e1000_bus_type_pcix) &&
+                       (len > 2015)))
+               count++;
+
        nr_frags = skb_shinfo(skb)->nr_frags;
        for(f = 0; f < nr_frags; f++)
                count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size,
@@ -1975,6 +2276,9 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
                local_irq_restore(flags); 
                return NETDEV_TX_LOCKED; 
        } 
+       if(adapter->hw.tx_pkt_filtering && (adapter->hw.mac_type == e1000_82573) )
+               e1000_transfer_dhcp_info(adapter, skb);
+
 
        /* need: count + 2 desc gap to keep tail from touching
         * head, otherwise try next time */
@@ -2011,6 +2315,12 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
        else if(likely(e1000_tx_csum(adapter, skb)))
                tx_flags |= E1000_TX_FLAGS_CSUM;
 
+       /* Old method was to assume IPv4 packet by default if TSO was enabled.
+        * 82573 hardware supports TSO capabilities for IPv6 as well...
+        * no longer assume, we must. */
+       if(likely(skb->protocol == ntohs(ETH_P_IP)))
+               tx_flags |= E1000_TX_FLAGS_IPV4;
+
        e1000_tx_queue(adapter,
                e1000_tx_map(adapter, skb, first, max_per_txd, nr_frags, mss),
                tx_flags);
@@ -2077,7 +2387,6 @@ static int
 e1000_change_mtu(struct net_device *netdev, int new_mtu)
 {
        struct e1000_adapter *adapter = netdev->priv;
-       int old_mtu = adapter->rx_buffer_len;
        int max_frame = new_mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
 
        if((max_frame < MINIMUM_ETHERNET_FRAME_SIZE) ||
@@ -2086,29 +2395,45 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu)
                        return -EINVAL;
        }
 
-       if(max_frame <= MAXIMUM_ETHERNET_FRAME_SIZE) {
-               adapter->rx_buffer_len = E1000_RXBUFFER_2048;
-
-       } else if(adapter->hw.mac_type < e1000_82543) {
-               DPRINTK(PROBE, ERR, "Jumbo Frames not supported on 82542\n");
+#define MAX_STD_JUMBO_FRAME_SIZE 9216
+       /* might want this to be bigger enum check... */
+       if (adapter->hw.mac_type == e1000_82573 &&
+           max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) {
+               DPRINTK(PROBE, ERR, "Jumbo Frames not supported "
+                                   "on 82573\n");
                return -EINVAL;
+       }
 
-       } else if(max_frame <= E1000_RXBUFFER_4096) {
-               adapter->rx_buffer_len = E1000_RXBUFFER_4096;
-
-       } else if(max_frame <= E1000_RXBUFFER_8192) {
-               adapter->rx_buffer_len = E1000_RXBUFFER_8192;
-
+       if(adapter->hw.mac_type > e1000_82547_rev_2) {
+               adapter->rx_buffer_len = max_frame;
+               E1000_ROUNDUP(adapter->rx_buffer_len, 1024);
        } else {
-               adapter->rx_buffer_len = E1000_RXBUFFER_16384;
+               if(unlikely((adapter->hw.mac_type < e1000_82543) &&
+                  (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE))) {
+                       DPRINTK(PROBE, ERR, "Jumbo Frames not supported "
+                                           "on 82542\n");
+                       return -EINVAL;
+
+               } else {
+                       if(max_frame <= E1000_RXBUFFER_2048) {
+                               adapter->rx_buffer_len = E1000_RXBUFFER_2048;
+                       } else if(max_frame <= E1000_RXBUFFER_4096) {
+                               adapter->rx_buffer_len = E1000_RXBUFFER_4096;
+                       } else if(max_frame <= E1000_RXBUFFER_8192) {
+                               adapter->rx_buffer_len = E1000_RXBUFFER_8192;
+                       } else if(max_frame <= E1000_RXBUFFER_16384) {
+                               adapter->rx_buffer_len = E1000_RXBUFFER_16384;
+                       }
+               }
        }
 
-       if(old_mtu != adapter->rx_buffer_len && netif_running(netdev)) {
+       netdev->mtu = new_mtu;
+
+       if(netif_running(netdev)) {
                e1000_down(adapter);
                e1000_up(adapter);
        }
 
-       netdev->mtu = new_mtu;
        adapter->hw.max_frame_size = max_frame;
 
        return 0;
@@ -2199,6 +2524,17 @@ e1000_update_stats(struct e1000_adapter *adapter)
                adapter->stats.tsctc += E1000_READ_REG(hw, TSCTC);
                adapter->stats.tsctfc += E1000_READ_REG(hw, TSCTFC);
        }
+       if(hw->mac_type > e1000_82547_rev_2) {
+               adapter->stats.iac += E1000_READ_REG(hw, IAC);
+               adapter->stats.icrxoc += E1000_READ_REG(hw, ICRXOC);
+               adapter->stats.icrxptc += E1000_READ_REG(hw, ICRXPTC);
+               adapter->stats.icrxatc += E1000_READ_REG(hw, ICRXATC);
+               adapter->stats.ictxptc += E1000_READ_REG(hw, ICTXPTC);
+               adapter->stats.ictxatc += E1000_READ_REG(hw, ICTXATC);
+               adapter->stats.ictxqec += E1000_READ_REG(hw, ICTXQEC);
+               adapter->stats.ictxqmtc += E1000_READ_REG(hw, ICTXQMTC);
+               adapter->stats.icrxdmtc += E1000_READ_REG(hw, ICRXDMTC);
+       }
 
        /* Fill out the OS statistics structure */
 
@@ -2213,9 +2549,9 @@ e1000_update_stats(struct e1000_adapter *adapter)
 
        adapter->net_stats.rx_errors = adapter->stats.rxerrc +
                adapter->stats.crcerrs + adapter->stats.algnerrc +
-               adapter->stats.rlec + adapter->stats.rnbc +
-               adapter->stats.mpc + adapter->stats.cexterr;
-       adapter->net_stats.rx_dropped = adapter->stats.rnbc;
+               adapter->stats.rlec + adapter->stats.mpc + 
+               adapter->stats.cexterr;
+       adapter->net_stats.rx_dropped = adapter->stats.mpc;
        adapter->net_stats.rx_length_errors = adapter->stats.rlec;
        adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs;
        adapter->net_stats.rx_frame_errors = adapter->stats.algnerrc;
@@ -2300,11 +2636,11 @@ e1000_intr(int irq, void *data, struct pt_regs *regs)
        */
        if(hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2){
                atomic_inc(&adapter->irq_sem);
-               E1000_WRITE_REG(&adapter->hw, IMC, ~0);
+               E1000_WRITE_REG(hw, IMC, ~0);
        }
 
        for(i = 0; i < E1000_MAX_INTR; i++)
-               if(unlikely(!e1000_clean_rx_irq(adapter) &
+               if(unlikely(!adapter->clean_rx(adapter) &
                   !e1000_clean_tx_irq(adapter)))
                        break;
 
@@ -2328,16 +2664,15 @@ e1000_clean(struct net_device *netdev, int *budget)
        int work_to_do = min(*budget, netdev->quota);
        int tx_cleaned;
        int work_done = 0;
-       
+
        tx_cleaned = e1000_clean_tx_irq(adapter);
-       e1000_clean_rx_irq(adapter, &work_done, work_to_do);
+       adapter->clean_rx(adapter, &work_done, work_to_do);
 
        *budget -= work_done;
        netdev->quota -= work_done;
        
-       /* if no Tx and not enough Rx work done, exit the polling mode */
-       if((!tx_cleaned && (work_done < work_to_do)) || 
-                               !netif_running(netdev)) {
+       /* If no Tx and no Rx work done, exit the polling mode */
+       if ((!tx_cleaned && (work_done == 0)) || !netif_running(netdev)) {
                netif_rx_complete(netdev);
                e1000_irq_enable(adapter);
                return 0;
@@ -2367,11 +2702,10 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter)
        eop_desc = E1000_TX_DESC(*tx_ring, eop);
 
        while(eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) {
-               /* pre-mature writeback of Tx descriptors     */
-               /* clear (free buffers and unmap pci_mapping) */
-               /* previous_buffer_info                       */
+               /* Premature writeback of Tx descriptors clear (free buffers
+                * and unmap pci_mapping) previous_buffer_info */
                if (likely(adapter->previous_buffer_info.skb != NULL)) {
-                       e1000_unmap_and_free_tx_resource(adapter, 
+                       e1000_unmap_and_free_tx_resource(adapter,
                                        &adapter->previous_buffer_info);
                }
 
@@ -2380,26 +2714,30 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter)
                        buffer_info = &tx_ring->buffer_info[i];
                        cleaned = (i == eop);
 
-                       /* pre-mature writeback of Tx descriptors */
-                       /* save the cleaning of the this for the  */
-                       /* next iteration                         */
-                       if (cleaned) {
-                               memcpy(&adapter->previous_buffer_info,
-                                       buffer_info,
-                                       sizeof(struct e1000_buffer));
-                               memset(buffer_info,
-                                       0,
-                                       sizeof(struct e1000_buffer));
+#ifdef NETIF_F_TSO
+                       if (!(netdev->features & NETIF_F_TSO)) {
+#endif
+                               e1000_unmap_and_free_tx_resource(adapter,
+                                                                buffer_info);
+#ifdef NETIF_F_TSO
                        } else {
-                               e1000_unmap_and_free_tx_resource(adapter, 
-                                                       buffer_info);
+                               if (cleaned) {
+                                       memcpy(&adapter->previous_buffer_info,
+                                              buffer_info,
+                                              sizeof(struct e1000_buffer));
+                                       memset(buffer_info, 0,
+                                              sizeof(struct e1000_buffer));
+                               } else {
+                                       e1000_unmap_and_free_tx_resource(
+                                           adapter, buffer_info);
+                               }
                        }
+#endif
 
                        tx_desc->buffer_addr = 0;
                        tx_desc->lower.data = 0;
                        tx_desc->upper.data = 0;
 
-                       cleaned = (i == eop);
                        if(unlikely(++i == tx_ring->count)) i = 0;
                }
                
@@ -2416,57 +2754,107 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter)
                netif_wake_queue(netdev);
 
        spin_unlock(&adapter->tx_lock);
        if(adapter->detect_tx_hung) {
-               /* detect a transmit hang in hardware, this serializes the
+
+               /* Detect a transmit hang in hardware, this serializes the
                 * check with the clearing of time_stamp and movement of i */
                adapter->detect_tx_hung = FALSE;
-               if(tx_ring->buffer_info[i].dma &&
-                  time_after(jiffies, tx_ring->buffer_info[i].time_stamp + HZ) &&
-                  !(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_TXOFF))
+               if (tx_ring->buffer_info[i].dma &&
+                   time_after(jiffies, tx_ring->buffer_info[i].time_stamp + HZ)
+                   && !(E1000_READ_REG(&adapter->hw, STATUS) &
+                       E1000_STATUS_TXOFF)) {
+
+                       /* detected Tx unit hang */
+                       i = tx_ring->next_to_clean;
+                       eop = tx_ring->buffer_info[i].next_to_watch;
+                       eop_desc = E1000_TX_DESC(*tx_ring, eop);
+                       DPRINTK(TX_ERR, ERR, "Detected Tx Unit Hang\n"
+                                       "  TDH                  <%x>\n"
+                                       "  TDT                  <%x>\n"
+                                       "  next_to_use          <%x>\n"
+                                       "  next_to_clean        <%x>\n"
+                                       "buffer_info[next_to_clean]\n"
+                                       "  dma                  <%llx>\n"
+                                       "  time_stamp           <%lx>\n"
+                                       "  next_to_watch        <%x>\n"
+                                       "  jiffies              <%lx>\n"
+                                       "  next_to_watch.status <%x>\n",
+                               E1000_READ_REG(&adapter->hw, TDH),
+                               E1000_READ_REG(&adapter->hw, TDT),
+                               tx_ring->next_to_use,
+                               i,
+                               tx_ring->buffer_info[i].dma,
+                               tx_ring->buffer_info[i].time_stamp,
+                               eop,
+                               jiffies,
+                               eop_desc->upper.fields.status);
                        netif_stop_queue(netdev);
+               }
        }
+#ifdef NETIF_F_TSO
+
+       if( unlikely(!(eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
+           time_after(jiffies, adapter->previous_buffer_info.time_stamp + HZ)))
+               e1000_unmap_and_free_tx_resource(
+                   adapter, &adapter->previous_buffer_info);
 
+#endif
        return cleaned;
 }
 
 /**
  * e1000_rx_checksum - Receive Checksum Offload for 82543
- * @adapter: board private structure
- * @rx_desc: receive descriptor
- * @sk_buff: socket buffer with received data
+ * @adapter:     board private structure
+ * @status_err:  receive descriptor status and error fields
+ * @csum:        receive descriptor csum field
+ * @sk_buff:     socket buffer with received data
  **/
 
 static inline void
 e1000_rx_checksum(struct e1000_adapter *adapter,
-                  struct e1000_rx_desc *rx_desc,
-                  struct sk_buff *skb)
+                 uint32_t status_err, uint32_t csum,
+                 struct sk_buff *skb)
 {
+       uint16_t status = (uint16_t)status_err;
+       uint8_t errors = (uint8_t)(status_err >> 24);
+       skb->ip_summed = CHECKSUM_NONE;
+
        /* 82543 or newer only */
-       if(unlikely((adapter->hw.mac_type < e1000_82543) ||
+       if(unlikely(adapter->hw.mac_type < e1000_82543)) return;
        /* Ignore Checksum bit is set */
-       (rx_desc->status & E1000_RXD_STAT_IXSM) ||
-       /* TCP Checksum has not been calculated */
-       (!(rx_desc->status & E1000_RXD_STAT_TCPCS)))) {
-               skb->ip_summed = CHECKSUM_NONE;
-               return;
-       }
-
-       /* At this point we know the hardware did the TCP checksum */
-       /* now look at the TCP checksum error bit */
-       if(rx_desc->errors & E1000_RXD_ERR_TCPE) {
+       if(unlikely(status & E1000_RXD_STAT_IXSM)) return;
+       /* TCP/UDP checksum error bit is set */
+       if(unlikely(errors & E1000_RXD_ERR_TCPE)) {
                /* let the stack verify checksum errors */
-               skb->ip_summed = CHECKSUM_NONE;
                adapter->hw_csum_err++;
+               return;
+       }
+       /* TCP/UDP Checksum has not been calculated */
+       if(adapter->hw.mac_type <= e1000_82547_rev_2) {
+               if(!(status & E1000_RXD_STAT_TCPCS))
+                       return;
        } else {
+               if(!(status & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS)))
+                       return;
+       }
+       /* It must be a TCP or UDP packet with a valid checksum */
+       if (likely(status & E1000_RXD_STAT_TCPCS)) {
                /* TCP checksum is good */
                skb->ip_summed = CHECKSUM_UNNECESSARY;
-               adapter->hw_csum_good++;
+       } else if (adapter->hw.mac_type > e1000_82547_rev_2) {
+               /* IP fragment with UDP payload */
+               /* Hardware complements the payload checksum, so we undo it
+                * and then put the value in host order for further stack use.
+                */
+               csum = ntohl(csum ^ 0xFFFF);
+               skb->csum = csum;
+               skb->ip_summed = CHECKSUM_HW;
        }
+       adapter->hw_csum_good++;
 }
 
 /**
- * e1000_clean_rx_irq - Send received data up the network stack
+ * e1000_clean_rx_irq - Send received data up the network stack; legacy
  * @adapter: board private structure
  **/
 
@@ -2513,7 +2901,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter)
                if(unlikely(!(rx_desc->status & E1000_RXD_STAT_EOP))) {
                        /* All receives must fit into a single buffer */
                        E1000_DBG("%s: Receive packet consumed multiple"
-                                       " buffers\n", netdev->name);
+                                 " buffers\n", netdev->name);
                        dev_kfree_skb_irq(skb);
                        goto next_desc;
                }
@@ -2539,15 +2927,17 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter)
                skb_put(skb, length - ETHERNET_FCS_SIZE);
 
                /* Receive Checksum Offload */
-               e1000_rx_checksum(adapter, rx_desc, skb);
-
+               e1000_rx_checksum(adapter,
+                                 (uint32_t)(rx_desc->status) |
+                                 ((uint32_t)(rx_desc->errors) << 24),
+                                 rx_desc->csum, skb);
                skb->protocol = eth_type_trans(skb, netdev);
 #ifdef CONFIG_E1000_NAPI
                if(unlikely(adapter->vlgrp &&
                            (rx_desc->status & E1000_RXD_STAT_VP))) {
                        vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
-                                       le16_to_cpu(rx_desc->special) &
-                                       E1000_RXD_SPC_VLAN_MASK);
+                                                le16_to_cpu(rx_desc->special) &
+                                                E1000_RXD_SPC_VLAN_MASK);
                } else {
                        netif_receive_skb(skb);
                }
@@ -2570,16 +2960,142 @@ next_desc:
 
                rx_desc = E1000_RX_DESC(*rx_ring, i);
        }
-
        rx_ring->next_to_clean = i;
+       adapter->alloc_rx_buf(adapter);
+
+       return cleaned;
+}
+
+/**
+ * e1000_clean_rx_irq_ps - Send received data up the network stack; packet split
+ * @adapter: board private structure
+ **/
+
+static boolean_t
+#ifdef CONFIG_E1000_NAPI
+e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, int *work_done,
+                      int work_to_do)
+#else
+e1000_clean_rx_irq_ps(struct e1000_adapter *adapter)
+#endif
+{
+       struct e1000_desc_ring *rx_ring = &adapter->rx_ring;
+       union e1000_rx_desc_packet_split *rx_desc;
+       struct net_device *netdev = adapter->netdev;
+       struct pci_dev *pdev = adapter->pdev;
+       struct e1000_buffer *buffer_info;
+       struct e1000_ps_page *ps_page;
+       struct e1000_ps_page_dma *ps_page_dma;
+       struct sk_buff *skb;
+       unsigned int i, j;
+       uint32_t length, staterr;
+       boolean_t cleaned = FALSE;
+
+       i = rx_ring->next_to_clean;
+       rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
+       staterr = rx_desc->wb.middle.status_error;
+
+       while(staterr & E1000_RXD_STAT_DD) {
+               buffer_info = &rx_ring->buffer_info[i];
+               ps_page = &rx_ring->ps_page[i];
+               ps_page_dma = &rx_ring->ps_page_dma[i];
+#ifdef CONFIG_E1000_NAPI
+               if(unlikely(*work_done >= work_to_do))
+                       break;
+               (*work_done)++;
+#endif
+               cleaned = TRUE;
+               pci_unmap_single(pdev, buffer_info->dma,
+                                buffer_info->length,
+                                PCI_DMA_FROMDEVICE);
+
+               skb = buffer_info->skb;
+
+               if(unlikely(!(staterr & E1000_RXD_STAT_EOP))) {
+                       E1000_DBG("%s: Packet Split buffers didn't pick up"
+                                 " the full packet\n", netdev->name);
+                       dev_kfree_skb_irq(skb);
+                       goto next_desc;
+               }
+
+               if(unlikely(staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK)) {
+                       dev_kfree_skb_irq(skb);
+                       goto next_desc;
+               }
+
+               length = le16_to_cpu(rx_desc->wb.middle.length0);
+
+               if(unlikely(!length)) {
+                       E1000_DBG("%s: Last part of the packet spanning"
+                                 " multiple descriptors\n", netdev->name);
+                       dev_kfree_skb_irq(skb);
+                       goto next_desc;
+               }
+
+               /* Good Receive */
+               skb_put(skb, length);
+
+               for(j = 0; j < PS_PAGE_BUFFERS; j++) {
+                       if(!(length = le16_to_cpu(rx_desc->wb.upper.length[j])))
+                               break;
+
+                       pci_unmap_page(pdev, ps_page_dma->ps_page_dma[j],
+                                       PAGE_SIZE, PCI_DMA_FROMDEVICE);
+                       ps_page_dma->ps_page_dma[j] = 0;
+                       skb_shinfo(skb)->frags[j].page =
+                               ps_page->ps_page[j];
+                       ps_page->ps_page[j] = NULL;
+                       skb_shinfo(skb)->frags[j].page_offset = 0;
+                       skb_shinfo(skb)->frags[j].size = length;
+                       skb_shinfo(skb)->nr_frags++;
+                       skb->len += length;
+                       skb->data_len += length;
+               }
 
-       e1000_alloc_rx_buffers(adapter);
+               e1000_rx_checksum(adapter, staterr,
+                                 rx_desc->wb.lower.hi_dword.csum_ip.csum, skb);
+               skb->protocol = eth_type_trans(skb, netdev);
+
+#ifdef HAVE_RX_ZERO_COPY
+               if(likely(rx_desc->wb.upper.header_status &
+                         E1000_RXDPS_HDRSTAT_HDRSP))
+                       skb_shinfo(skb)->zero_copy = TRUE;
+#endif
+#ifdef CONFIG_E1000_NAPI
+               if(unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
+                       vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
+                               le16_to_cpu(rx_desc->wb.middle.vlan &
+                                       E1000_RXD_SPC_VLAN_MASK));
+               } else {
+                       netif_receive_skb(skb);
+               }
+#else /* CONFIG_E1000_NAPI */
+               if(unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
+                       vlan_hwaccel_rx(skb, adapter->vlgrp,
+                               le16_to_cpu(rx_desc->wb.middle.vlan &
+                                       E1000_RXD_SPC_VLAN_MASK));
+               } else {
+                       netif_rx(skb);
+               }
+#endif /* CONFIG_E1000_NAPI */
+               netdev->last_rx = jiffies;
+
+next_desc:
+               rx_desc->wb.middle.status_error &= ~0xFF;
+               buffer_info->skb = NULL;
+               if(unlikely(++i == rx_ring->count)) i = 0;
+
+               rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
+               staterr = rx_desc->wb.middle.status_error;
+       }
+       rx_ring->next_to_clean = i;
+       adapter->alloc_rx_buf(adapter);
 
        return cleaned;
 }
 
 /**
- * e1000_alloc_rx_buffers - Replace used receive buffers
+ * e1000_alloc_rx_buffers - Replace used receive buffers; legacy & extended
  * @adapter: address of board private structure
  **/
 
@@ -2592,43 +3108,43 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter)
        struct e1000_rx_desc *rx_desc;
        struct e1000_buffer *buffer_info;
        struct sk_buff *skb;
-       unsigned int i, bufsz;
+       unsigned int i;
+       unsigned int bufsz = adapter->rx_buffer_len + NET_IP_ALIGN;
 
        i = rx_ring->next_to_use;
        buffer_info = &rx_ring->buffer_info[i];
 
        while(!buffer_info->skb) {
-               bufsz = adapter->rx_buffer_len + NET_IP_ALIGN;
-
                skb = dev_alloc_skb(bufsz);
+
                if(unlikely(!skb)) {
                        /* Better luck next round */
                        break;
                }
 
-               /* fix for errata 23, cant cross 64kB boundary */
+               /* Fix for errata 23, can't cross 64kB boundary */
                if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
                        struct sk_buff *oldskb = skb;
-                       DPRINTK(RX_ERR,ERR,
-                               "skb align check failed: %u bytes at %p\n",
-                               bufsz, skb->data);
-                       /* try again, without freeing the previous */
+                       DPRINTK(RX_ERR, ERR, "skb align check failed: %u bytes "
+                                            "at %p\n", bufsz, skb->data);
+                       /* Try again, without freeing the previous */
                        skb = dev_alloc_skb(bufsz);
+                       /* Failed allocation, critical failure */
                        if (!skb) {
                                dev_kfree_skb(oldskb);
                                break;
                        }
+
                        if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
                                /* give up */
                                dev_kfree_skb(skb);
                                dev_kfree_skb(oldskb);
                                break; /* while !buffer_info->skb */
                        } else {
-                               /* move on with the new one */
+                               /* Use new allocation */
                                dev_kfree_skb(oldskb);
                        }
                }
-
                /* Make buffer alignment 2 beyond a 16 byte boundary
                 * this will result in a 16 byte aligned IP header after
                 * the 14 byte MAC header is removed
@@ -2644,25 +3160,23 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter)
                                                  adapter->rx_buffer_len,
                                                  PCI_DMA_FROMDEVICE);
 
-               /* fix for errata 23, cant cross 64kB boundary */
-               if(!e1000_check_64k_bound(adapter,
-                                              (void *)(unsigned long)buffer_info->dma,
-                                              adapter->rx_buffer_len)) {
-                       DPRINTK(RX_ERR,ERR,
-                               "dma align check failed: %u bytes at %ld\n",
-                               adapter->rx_buffer_len, (unsigned long)buffer_info->dma);
-
+               /* Fix for errata 23, can't cross 64kB boundary */
+               if (!e1000_check_64k_bound(adapter,
+                                       (void *)(unsigned long)buffer_info->dma,
+                                       adapter->rx_buffer_len)) {
+                       DPRINTK(RX_ERR, ERR,
+                               "dma align check failed: %u bytes at %p\n",
+                               adapter->rx_buffer_len,
+                               (void *)(unsigned long)buffer_info->dma);
                        dev_kfree_skb(skb);
                        buffer_info->skb = NULL;
 
-                       pci_unmap_single(pdev,
-                                        buffer_info->dma,
+                       pci_unmap_single(pdev, buffer_info->dma,
                                         adapter->rx_buffer_len,
                                         PCI_DMA_FROMDEVICE);
 
                        break; /* while !buffer_info->skb */
                }
-
                rx_desc = E1000_RX_DESC(*rx_ring, i);
                rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
 
@@ -2672,7 +3186,6 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter)
                         * applicable for weak-ordered memory model archs,
                         * such as IA-64). */
                        wmb();
-
                        E1000_WRITE_REG(&adapter->hw, RDT, i);
                }
 
@@ -2683,6 +3196,95 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter)
        rx_ring->next_to_use = i;
 }
 
+/**
+ * e1000_alloc_rx_buffers_ps - Replace used receive buffers; packet split
+ * @adapter: address of board private structure
+ **/
+
+static void
+e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter)
+{
+       struct e1000_desc_ring *rx_ring = &adapter->rx_ring;
+       struct net_device *netdev = adapter->netdev;
+       struct pci_dev *pdev = adapter->pdev;
+       union e1000_rx_desc_packet_split *rx_desc;
+       struct e1000_buffer *buffer_info;
+       struct e1000_ps_page *ps_page;
+       struct e1000_ps_page_dma *ps_page_dma;
+       struct sk_buff *skb;
+       unsigned int i, j;
+
+       i = rx_ring->next_to_use;
+       buffer_info = &rx_ring->buffer_info[i];
+       ps_page = &rx_ring->ps_page[i];
+       ps_page_dma = &rx_ring->ps_page_dma[i];
+
+       while(!buffer_info->skb) {
+               rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
+
+               for(j = 0; j < PS_PAGE_BUFFERS; j++) {
+                       if(unlikely(!ps_page->ps_page[j])) {
+                               ps_page->ps_page[j] =
+                                       alloc_page(GFP_ATOMIC);
+                               if(unlikely(!ps_page->ps_page[j]))
+                                       goto no_buffers;
+                               ps_page_dma->ps_page_dma[j] =
+                                       pci_map_page(pdev,
+                                                    ps_page->ps_page[j],
+                                                    0, PAGE_SIZE,
+                                                    PCI_DMA_FROMDEVICE);
+                       }
+                       /* Refresh the desc even if buffer_addrs didn't
+                        * change because each write-back erases this info.
+                        */
+                       rx_desc->read.buffer_addr[j+1] =
+                               cpu_to_le64(ps_page_dma->ps_page_dma[j]);
+               }
+
+               skb = dev_alloc_skb(adapter->rx_ps_bsize0 + NET_IP_ALIGN);
+
+               if(unlikely(!skb))
+                       break;
+
+               /* Make buffer alignment 2 beyond a 16 byte boundary
+                * this will result in a 16 byte aligned IP header after
+                * the 14 byte MAC header is removed
+                */
+               skb_reserve(skb, NET_IP_ALIGN);
+
+               skb->dev = netdev;
+
+               buffer_info->skb = skb;
+               buffer_info->length = adapter->rx_ps_bsize0;
+               buffer_info->dma = pci_map_single(pdev, skb->data,
+                                                 adapter->rx_ps_bsize0,
+                                                 PCI_DMA_FROMDEVICE);
+
+               rx_desc->read.buffer_addr[0] = cpu_to_le64(buffer_info->dma);
+
+               if(unlikely((i & ~(E1000_RX_BUFFER_WRITE - 1)) == i)) {
+                       /* Force memory writes to complete before letting h/w
+                        * know there are new descriptors to fetch.  (Only
+                        * applicable for weak-ordered memory model archs,
+                        * such as IA-64). */
+                       wmb();
+                       /* Hardware increments by 16 bytes, but packet split
+                        * descriptors are 32 bytes...so we increment tail
+                        * twice as much.
+                        */
+                       E1000_WRITE_REG(&adapter->hw, RDT, i<<1);
+               }
+
+               if(unlikely(++i == rx_ring->count)) i = 0;
+               buffer_info = &rx_ring->buffer_info[i];
+               ps_page = &rx_ring->ps_page[i];
+               ps_page_dma = &rx_ring->ps_page_dma[i];
+       }
+
+no_buffers:
+       rx_ring->next_to_use = i;
+}
+
 /**
  * e1000_smartspeed - Workaround for SmartSpeed on 82541 and 82547 controllers.
  * @adapter:
@@ -2856,9 +3458,10 @@ void
 e1000_pci_set_mwi(struct e1000_hw *hw)
 {
        struct e1000_adapter *adapter = hw->back;
+       int ret_val = pci_set_mwi(adapter->pdev);
 
-       int ret;
-       ret = pci_set_mwi(adapter->pdev);
+       if(ret_val)
+               DPRINTK(PROBE, ERR, "Error in setting MWI\n");
 }
 
 void
@@ -2917,6 +3520,7 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
                rctl |= E1000_RCTL_VFE;
                rctl &= ~E1000_RCTL_CFIEN;
                E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
+               e1000_update_mng_vlan(adapter);
        } else {
                /* disable VLAN tag insert/strip */
                ctrl = E1000_READ_REG(&adapter->hw, CTRL);
@@ -2927,6 +3531,10 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
                rctl = E1000_READ_REG(&adapter->hw, RCTL);
                rctl &= ~E1000_RCTL_VFE;
                E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
+               if(adapter->mng_vlan_id != (uint16_t)E1000_MNG_VLAN_NONE) {
+                       e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
+                       adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
+               }
        }
 
        e1000_irq_enable(adapter);
@@ -2937,7 +3545,10 @@ e1000_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid)
 {
        struct e1000_adapter *adapter = netdev->priv;
        uint32_t vfta, index;
-
+       if((adapter->hw.mng_cookie.status &
+               E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
+               (vid == adapter->mng_vlan_id))
+               return;
        /* add VID to filter table */
        index = (vid >> 5) & 0x7F;
        vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index);
@@ -2958,6 +3569,10 @@ e1000_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid)
 
        e1000_irq_enable(adapter);
 
+       if((adapter->hw.mng_cookie.status &
+               E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
+               (vid == adapter->mng_vlan_id))
+               return;
        /* remove VID from filter table */
        index = (vid >> 5) & 0x7F;
        vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index);
@@ -3004,8 +3619,7 @@ e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx)
                break;
        case SPEED_1000 + DUPLEX_HALF: /* not supported */
        default:
-               DPRINTK(PROBE, ERR, 
-                       "Unsupported Speed/Duplexity configuration\n");
+               DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n");
                return -EINVAL;
        }
        return 0;
@@ -3033,7 +3647,7 @@ e1000_suspend(struct pci_dev *pdev, uint32_t state)
 {
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct e1000_adapter *adapter = netdev->priv;
-       uint32_t ctrl, ctrl_ext, rctl, manc, status;
+       uint32_t ctrl, ctrl_ext, rctl, manc, status, swsm;
        uint32_t wufc = adapter->wol;
 
        netif_device_detach(netdev);
@@ -3075,6 +3689,9 @@ e1000_suspend(struct pci_dev *pdev, uint32_t state)
                        E1000_WRITE_REG(&adapter->hw, CTRL_EXT, ctrl_ext);
                }
 
+               /* Allow time for pending master requests to run */
+               e1000_disable_pciex_master(&adapter->hw);
+
                E1000_WRITE_REG(&adapter->hw, WUC, E1000_WUC_PME_EN);
                E1000_WRITE_REG(&adapter->hw, WUFC, wufc);
                pci_enable_wake(pdev, 3, 1);
@@ -3099,6 +3716,16 @@ e1000_suspend(struct pci_dev *pdev, uint32_t state)
                }
        }
 
+       switch(adapter->hw.mac_type) {
+       case e1000_82573:
+               swsm = E1000_READ_REG(&adapter->hw, SWSM);
+               E1000_WRITE_REG(&adapter->hw, SWSM,
+                               swsm & ~E1000_SWSM_DRV_LOAD);
+               break;
+       default:
+               break;
+       }
+
        pci_disable_device(pdev);
 
        state = (state > 0) ? 3 : 0;
@@ -3113,13 +3740,12 @@ e1000_resume(struct pci_dev *pdev)
 {
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct e1000_adapter *adapter = netdev->priv;
-       uint32_t manc, ret;
+       uint32_t manc, ret, swsm;
 
        pci_set_power_state(pdev, 0);
        pci_restore_state(pdev);
        ret = pci_enable_device(pdev);
-       if (pdev->is_busmaster)
-               pci_set_master(pdev);
+       pci_set_master(pdev);
 
        pci_enable_wake(pdev, 3, 0);
        pci_enable_wake(pdev, 4, 0); /* 4 == D3 cold */
@@ -3139,10 +3765,19 @@ e1000_resume(struct pci_dev *pdev)
                E1000_WRITE_REG(&adapter->hw, MANC, manc);
        }
 
+       switch(adapter->hw.mac_type) {
+       case e1000_82573:
+               swsm = E1000_READ_REG(&adapter->hw, SWSM);
+               E1000_WRITE_REG(&adapter->hw, SWSM,
+                               swsm | E1000_SWSM_DRV_LOAD);
+               break;
+       default:
+               break;
+       }
+
        return 0;
 }
 #endif
-
 #ifdef CONFIG_NET_POLL_CONTROLLER
 /*
  * Polling 'interrupt' - used by things like netconsole to send skbs
@@ -3150,7 +3785,7 @@ e1000_resume(struct pci_dev *pdev)
  * the interrupt routine is executing.
  */
 static void
-e1000_netpoll (struct net_device *netdev)
+e1000_netpoll(struct net_device *netdev)
 {
        struct e1000_adapter *adapter = netdev->priv;
        disable_irq(adapter->pdev->irq);
index 970c656a517c196be5eb60258b874224227e3f8c..aac64de6143708b5c7aca85aaeb70a50f33188b4 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   
-  Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
+  Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
   
   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 
 #include <linux/sched.h>
 
 #ifndef msec_delay
-#define msec_delay(x) msleep(x)
+#define msec_delay(x)  do { if(in_interrupt()) { \
+                               /* Don't mdelay in interrupt context! */ \
+                               BUG(); \
+                       } else { \
+                               msleep(x); \
+                       } } while(0)
 
 /* Some workarounds require millisecond delays and are run during interrupt
  * context.  Most notably, when establishing link, the phy may need tweaking
@@ -96,6 +101,29 @@ typedef enum {
         (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \
         ((offset) << 2)))
 
+#define E1000_READ_REG_ARRAY_DWORD E1000_READ_REG_ARRAY
+#define E1000_WRITE_REG_ARRAY_DWORD E1000_WRITE_REG_ARRAY
+
+#define E1000_WRITE_REG_ARRAY_WORD(a, reg, offset, value) ( \
+    writew((value), ((a)->hw_addr + \
+        (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \
+        ((offset) << 1))))
+
+#define E1000_READ_REG_ARRAY_WORD(a, reg, offset) ( \
+    readw((a)->hw_addr + \
+        (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \
+        ((offset) << 1)))
+
+#define E1000_WRITE_REG_ARRAY_BYTE(a, reg, offset, value) ( \
+    writeb((value), ((a)->hw_addr + \
+        (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \
+        (offset))))
+
+#define E1000_READ_REG_ARRAY_BYTE(a, reg, offset) ( \
+    readb((a)->hw_addr + \
+        (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \
+        (offset)))
+
 #define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, STATUS)
 
 #endif /* _E1000_OSDEP_H_ */
index e914d09fe6f9364ced28259879dfebfff125d048..676247f9f1cca054967d604547f005d1340b5eee 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   
-  Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
+  Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
   
   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 
@@ -478,7 +478,6 @@ e1000_check_options(struct e1000_adapter *adapter)
                                DPRINTK(PROBE, INFO, "%s set to dynamic mode\n", 
                                        opt.name);
                                break;
-                       case -1:
                        default:
                                e1000_validate_option(&adapter->itr, &opt, 
                                        adapter);
diff --git a/drivers/net/fmv18x.c b/drivers/net/fmv18x.c
deleted file mode 100644 (file)
index 04c7485..0000000
+++ /dev/null
@@ -1,689 +0,0 @@
-/* fmv18x.c: A network device driver for the Fujitsu FMV-181/182/183/184.
-
-       Original: at1700.c (1993-94 by Donald Becker).
-               Copyright 1993 United States Government as represented by the
-               Director, National Security Agency.
-               The author may be reached as becker@scyld.com, or C/O
-                       Scyld Computing Corporation
-                       410 Severn Ave., Suite 210
-                       Annapolis MD 21403
-
-       Modified by Yutaka TAMIYA (tamy@flab.fujitsu.co.jp)
-               Copyright 1994 Fujitsu Laboratories Ltd.
-       Special thanks to:
-               Masayoshi UTAKA (utaka@ace.yk.fujitsu.co.jp)
-                       for testing this driver.
-               H. NEGISHI (agy, negishi@sun45.psd.cs.fujitsu.co.jp)
-                       for suggestion of some program modification.
-               Masahiro SEKIGUCHI <seki@sysrap.cs.fujitsu.co.jp>
-                       for suggestion of some program modification.
-               Kazutoshi MORIOKA (morioka@aurora.oaks.cs.fujitsu.co.jp)
-                       for testing this driver.
-
-       This software may be used and distributed according to the terms
-       of the GNU General Public License, incorporated herein by reference.
-
-       This is a device driver for the Fujitsu FMV-181/182/183/184, which
-       is a straight-forward Fujitsu MB86965 implementation.
-
-  Sources:
-    at1700.c
-    The Fujitsu MB86965 datasheet.
-    The Fujitsu FMV-181/182 user's guide
-*/
-
-static const char version[] =
-       "fmv18x.c:v2.2.0 09/24/98  Yutaka TAMIYA (tamy@flab.fujitsu.co.jp)\n";
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/in.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/spinlock.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/delay.h>
-#include <linux/bitops.h>
-
-#include <asm/system.h>
-#include <asm/io.h>
-#include <asm/dma.h>
-
-#define DRV_NAME "fmv18x"
-
-static unsigned fmv18x_probe_list[] __initdata = {
-       0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x300, 0x340, 0
-};
-
-/* use 0 for production, 1 for verification, >2 for debug */
-#ifndef NET_DEBUG
-#define NET_DEBUG 1
-#endif
-static unsigned int net_debug = NET_DEBUG;
-
-typedef unsigned char uchar;
-
-/* Information that need to be kept for each board. */
-struct net_local {
-       struct net_device_stats stats;
-       long open_time;                         /* Useless example local info. */
-       uint tx_started:1;                      /* Number of packet on the Tx queue. */
-       uint tx_queue_ready:1;          /* Tx queue is ready to be sent. */
-       uint rx_started:1;                      /* Packets are Rxing. */
-       uchar tx_queue;                         /* Number of packet on the Tx queue. */
-       ushort tx_queue_len;            /* Current length of the Tx queue. */
-       spinlock_t lock;
-};
-
-
-/* Offsets from the base address. */
-#define STATUS                 0
-#define TX_STATUS              0
-#define RX_STATUS              1
-#define TX_INTR                        2               /* Bit-mapped interrupt enable registers. */
-#define RX_INTR                        3
-#define TX_MODE                        4
-#define RX_MODE                        5
-#define CONFIG_0               6               /* Misc. configuration settings. */
-#define CONFIG_1               7
-/* Run-time register bank 2 definitions. */
-#define DATAPORT               8               /* Word-wide DMA or programmed-I/O dataport. */
-#define TX_START               10
-#define COL16CNTL              11              /* Controll Reg for 16 collisions */
-#define MODE13                 13
-/* Fujitsu FMV-18x Card Configuration */
-#define        FJ_STATUS0              0x10
-#define        FJ_STATUS1              0x11
-#define        FJ_CONFIG0              0x12
-#define        FJ_CONFIG1              0x13
-#define        FJ_MACADDR              0x14    /* 0x14 - 0x19 */
-#define        FJ_BUFCNTL              0x1A
-#define        FJ_BUFDATA              0x1C
-#define FMV18X_IO_EXTENT       32
-
-/* Index to functions, as function prototypes. */
-
-static int fmv18x_probe1(struct net_device *dev, short ioaddr);
-static int net_open(struct net_device *dev);
-static int net_send_packet(struct sk_buff *skb, struct net_device *dev);
-static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-static void net_rx(struct net_device *dev);
-static void net_timeout(struct net_device *dev);
-static int net_close(struct net_device *dev);
-static struct net_device_stats *net_get_stats(struct net_device *dev);
-static void set_multicast_list(struct net_device *dev);
-
-\f
-/* Check for a network adaptor of this type, and return '0' iff one exists.
-   If dev->base_addr == 0, probe all likely locations.
-   If dev->base_addr == 1, always return failure.
-   If dev->base_addr == 2, allocate space for the device and return success
-   (detachable devices only).
-   */
-
-static int io = 0x220;
-static int irq;
-
-struct net_device * __init fmv18x_probe(int unit)
-{
-       struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-       unsigned *port;
-       int err = 0;
-
-       if (!dev)
-               return ERR_PTR(-ENODEV);
-
-       if (unit >= 0) {
-               sprintf(dev->name, "eth%d", unit);
-               netdev_boot_setup_check(dev);
-               io = dev->base_addr;
-               irq = dev->irq;
-       }
-
-       SET_MODULE_OWNER(dev);
-
-       if (io > 0x1ff) {       /* Check a single specified location. */
-               err = fmv18x_probe1(dev, io);
-       } else if (io != 0) {   /* Don't probe at all. */
-               err = -ENXIO;
-       } else {
-               for (port = fmv18x_probe_list; *port; port++)
-                       if (fmv18x_probe1(dev, *port) == 0)
-                               break;
-               if (!*port)
-                       err = -ENODEV;
-       }
-       if (err)
-               goto out;
-       err = register_netdev(dev);
-       if (err)
-               goto out1;
-       return dev;
-out1:
-       free_irq(dev->irq, dev);
-       release_region(dev->base_addr, FMV18X_IO_EXTENT);
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-
-/* The Fujitsu datasheet suggests that the NIC be probed for by checking its
-   "signature", the default bit pattern after a reset.  This *doesn't* work --
-   there is no way to reset the bus interface without a complete power-cycle!
-
-   It turns out that ATI came to the same conclusion I did: the only thing
-   that can be done is checking a few bits and then diving right into MAC
-   address check. */
-
-static int __init fmv18x_probe1(struct net_device *dev, short ioaddr)
-{
-       char irqmap[4] = {3, 7, 10, 15};
-       char irqmap_pnp[8] = {3, 4, 5, 7, 9, 10, 11, 15};
-       unsigned int i, retval;
-       struct net_local *lp;
-
-       /* Resetting the chip doesn't reset the ISA interface, so don't bother.
-          That means we have to be careful with the register values we probe for.
-          */
-
-       if (!request_region(ioaddr, FMV18X_IO_EXTENT, DRV_NAME))
-               return -EBUSY;
-
-       dev->irq = irq;
-       dev->base_addr = ioaddr;
-
-       /* Check I/O address configuration and Fujitsu vendor code */
-       if (inb(ioaddr+FJ_MACADDR  ) != 0x00
-       ||  inb(ioaddr+FJ_MACADDR+1) != 0x00
-       ||  inb(ioaddr+FJ_MACADDR+2) != 0x0e) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       /* Check PnP mode for FMV-183/184/183A/184A. */
-       /* This PnP routine is very poor. IO and IRQ should be known. */
-       if (inb(ioaddr + FJ_STATUS1) & 0x20) {
-               for (i = 0; i < 8; i++) {
-                       if (dev->irq == irqmap_pnp[i])
-                               break;
-               }
-               if (i == 8) {
-                       retval = -ENODEV;
-                       goto out;
-               }
-       } else {
-               if (fmv18x_probe_list[inb(ioaddr + FJ_CONFIG0) & 0x07] != ioaddr)
-                       return -ENODEV;
-               dev->irq = irqmap[(inb(ioaddr + FJ_CONFIG0)>>6) & 0x03];
-       }
-
-       /* Snarf the interrupt vector now. */
-       retval = request_irq(dev->irq, &net_interrupt, 0, DRV_NAME, dev);
-       if (retval) {
-               printk ("FMV-18x found at %#3x, but it's unusable due to a conflict on"
-                               "IRQ %d.\n", ioaddr, dev->irq);
-               goto out;
-       }
-
-       printk("%s: FMV-18x found at %#3x, IRQ %d, address ", dev->name,
-                  ioaddr, dev->irq);
-
-       for(i = 0; i < 6; i++) {
-               unsigned char val = inb(ioaddr + FJ_MACADDR + i);
-               printk("%02x", val);
-               dev->dev_addr[i] = val;
-       }
-
-       /* "FJ_STATUS0" 12 bit 0x0400 means use regular 100 ohm 10baseT signals,
-          rather than 150 ohm shielded twisted pair compensation.
-          0x0000 == auto-sense the interface
-          0x0800 == use TP interface
-          0x1800 == use coax interface
-          */
-       {
-               const char *porttype[] = {"auto-sense", "10baseT", "auto-sense", "10base2/5"};
-               ushort setup_value = inb(ioaddr + FJ_STATUS0);
-
-               switch( setup_value & 0x07 ){
-               case 0x01 /* 10base5 */:
-               case 0x02 /* 10base2 */: dev->if_port = 0x18; break;
-               case 0x04 /* 10baseT */: dev->if_port = 0x08; break;
-               default /* auto-sense*/: dev->if_port = 0x00; break;
-               }
-               printk(" %s interface.\n", porttype[(dev->if_port>>3) & 3]);
-       }
-
-       /* Initialize LAN Controller and LAN Card */
-       outb(0xda, ioaddr + CONFIG_0);   /* Initialize LAN Controller */
-       outb(0x00, ioaddr + CONFIG_1);   /* Stand by mode */
-       outb(0x00, ioaddr + FJ_CONFIG1); /* Disable IRQ of LAN Card */
-       outb(0x00, ioaddr + FJ_BUFCNTL); /* Reset ? I'm not sure (TAMIYA) */
-
-       /* wait for a while */
-       udelay(200);
-
-       /* Set the station address in bank zero. */
-       outb(0x00, ioaddr + CONFIG_1);
-       for (i = 0; i < 6; i++)
-               outb(dev->dev_addr[i], ioaddr + 8 + i);
-
-       /* Switch to bank 1 and set the multicast table to accept none. */
-       outb(0x04, ioaddr + CONFIG_1);
-       for (i = 0; i < 8; i++)
-               outb(0x00, ioaddr + 8 + i);
-
-       /* Switch to bank 2 and lock our I/O address. */
-       outb(0x08, ioaddr + CONFIG_1);
-       outb(dev->if_port, ioaddr + MODE13);
-       outb(0x00, ioaddr + COL16CNTL);
-
-       if (net_debug)
-               printk(version);
-
-       /* Initialize the device structure. */
-       dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
-       if (!dev->priv) {
-               retval = -ENOMEM;
-               goto out_irq;
-       }
-       memset(dev->priv, 0, sizeof(struct net_local));
-       lp = dev->priv;
-       spin_lock_init(&lp->lock);
-
-       dev->open               = net_open;
-       dev->stop               = net_close;
-       dev->hard_start_xmit    = net_send_packet;
-       dev->tx_timeout         = net_timeout;
-       dev->watchdog_timeo     = HZ/10;
-       dev->get_stats          = net_get_stats;
-       dev->set_multicast_list = set_multicast_list;
-       return 0;
-
-out_irq:
-       free_irq(dev->irq, dev);
-out:
-       release_region(ioaddr, FMV18X_IO_EXTENT);
-       return retval;
-}
-\f
-
-static int net_open(struct net_device *dev)
-{
-       struct net_local *lp = dev->priv;
-       int ioaddr = dev->base_addr;
-
-       /* Set the configuration register 0 to 32K 100ns. byte-wide memory,
-          16 bit bus access, and two 4K Tx, enable the Rx and Tx. */
-       outb(0x5a, ioaddr + CONFIG_0);
-
-       /* Powerup and switch to register bank 2 for the run-time registers. */
-       outb(0xe8, ioaddr + CONFIG_1);
-
-       lp->tx_started = 0;
-       lp->tx_queue_ready = 1;
-       lp->rx_started = 0;
-       lp->tx_queue = 0;
-       lp->tx_queue_len = 0;
-
-       /* Clear Tx and Rx Status */
-       outb(0xff, ioaddr + TX_STATUS);
-       outb(0xff, ioaddr + RX_STATUS);
-       lp->open_time = jiffies;
-
-       netif_start_queue(dev);
-       
-       /* Enable the IRQ of the LAN Card */
-       outb(0x80, ioaddr + FJ_CONFIG1);
-
-       /* Enable both Tx and Rx interrupts */
-       outw(0x8182, ioaddr+TX_INTR);
-
-       return 0;
-}
-
-static void net_timeout(struct net_device *dev)
-{
-       struct net_local *lp = dev->priv;
-       int ioaddr = dev->base_addr;
-       unsigned long flags;
-       
-       
-       printk(KERN_WARNING "%s: transmit timed out with status %04x, %s?\n", dev->name,
-                  htons(inw(ioaddr + TX_STATUS)),
-                  inb(ioaddr + TX_STATUS) & 0x80
-                  ? "IRQ conflict" : "network cable problem");
-       printk(KERN_WARNING "%s: timeout registers: %04x %04x %04x %04x %04x %04x %04x %04x.\n",
-                  dev->name, htons(inw(ioaddr + 0)),
-                  htons(inw(ioaddr + 2)), htons(inw(ioaddr + 4)),
-                  htons(inw(ioaddr + 6)), htons(inw(ioaddr + 8)),
-                  htons(inw(ioaddr +10)), htons(inw(ioaddr +12)),
-                  htons(inw(ioaddr +14)));
-       printk(KERN_WARNING "eth card: %04x %04x\n",
-               htons(inw(ioaddr+FJ_STATUS0)),
-               htons(inw(ioaddr+FJ_CONFIG0)));
-       lp->stats.tx_errors++;
-       /* ToDo: We should try to restart the adaptor... */
-       spin_lock_irqsave(&lp->lock, flags);
-
-       /* Initialize LAN Controller and LAN Card */
-       outb(0xda, ioaddr + CONFIG_0);   /* Initialize LAN Controller */
-       outb(0x00, ioaddr + CONFIG_1);   /* Stand by mode */
-       outb(0x00, ioaddr + FJ_CONFIG1); /* Disable IRQ of LAN Card */
-       outb(0x00, ioaddr + FJ_BUFCNTL); /* Reset ? I'm not sure */
-       net_open(dev);
-       spin_unlock_irqrestore(&lp->lock, flags);
-
-       netif_wake_queue(dev);
-}
-
-static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
-{
-       struct net_local *lp = dev->priv;
-       int ioaddr = dev->base_addr;
-       short length = skb->len;
-       unsigned char *buf;
-       unsigned long flags;
-
-       /* Block a transmit from overlapping.  */
-       
-       if (length > ETH_FRAME_LEN) {
-               if (net_debug)
-                       printk("%s: Attempting to send a large packet (%d bytes).\n",
-                               dev->name, length);
-               return 1;
-       }
-       
-       if (length < ETH_ZLEN) {
-               skb = skb_padto(skb, ETH_ZLEN);
-               if (skb == NULL)
-                       return 0;
-               length = ETH_ZLEN;
-       }
-       buf = skb->data;
-       
-       if (net_debug > 4)
-               printk("%s: Transmitting a packet of length %lu.\n", dev->name,
-                          (unsigned long)skb->len);
-       /* We may not start transmitting unless we finish transferring
-          a packet into the Tx queue. During executing the following
-          codes we possibly catch a Tx interrupt. Thus we flag off
-          tx_queue_ready, so that we prevent the interrupt routine
-          (net_interrupt) to start transmitting. */
-       spin_lock_irqsave(&lp->lock, flags);
-       lp->tx_queue_ready = 0;
-       {
-               outw(length, ioaddr + DATAPORT);
-               outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
-               lp->tx_queue++;
-               lp->tx_queue_len += length + 2;
-       }
-       lp->tx_queue_ready = 1;
-       spin_unlock_irqrestore(&lp->lock, flags);
-
-       if (lp->tx_started == 0) {
-               /* If the Tx is idle, always trigger a transmit. */
-               outb(0x80 | lp->tx_queue, ioaddr + TX_START);
-               lp->tx_queue = 0;
-               lp->tx_queue_len = 0;
-               dev->trans_start = jiffies;
-               lp->tx_started = 1;
-       } else if (lp->tx_queue_len >= 4096 - 1502) /* No room for a packet */
-               netif_stop_queue(dev);
-
-       dev_kfree_skb(skb);
-       return 0;
-}
-\f
-/* The typical workload of the driver:
-   Handle the network interface interrupts. */
-static irqreturn_t
-net_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
-       struct net_device *dev = dev_id;
-       struct net_local *lp;
-       int ioaddr, status;
-
-       ioaddr = dev->base_addr;
-       lp = dev->priv;
-       status = inw(ioaddr + TX_STATUS);
-       outw(status, ioaddr + TX_STATUS);
-
-       if (net_debug > 4)
-               printk("%s: Interrupt with status %04x.\n", dev->name, status);
-       if (lp->rx_started == 0 &&
-               (status & 0xff00 || (inb(ioaddr + RX_MODE) & 0x40) == 0)) {
-               /* Got a packet(s).
-                  We cannot execute net_rx more than once at the same time for
-                  the same device. During executing net_rx, we possibly catch a
-                  Tx interrupt. Thus we flag on rx_started, so that we prevent
-                  the interrupt routine (net_interrupt) to dive into net_rx
-                  again. */
-               lp->rx_started = 1;
-               outb(0x00, ioaddr + RX_INTR);   /* Disable RX intr. */
-               net_rx(dev);
-               outb(0x81, ioaddr + RX_INTR);   /* Enable  RX intr. */
-               lp->rx_started = 0;
-       }
-       if (status & 0x00ff) {
-               if (status & 0x02) {
-                       /* More than 16 collisions occurred */
-                       if (net_debug > 4)
-                               printk("%s: 16 Collision occur during Txing.\n", dev->name);
-                       /* Cancel sending a packet. */
-                       outb(0x03, ioaddr + COL16CNTL);
-                       lp->stats.collisions++;
-               }
-               if (status & 0x82) {
-                       spin_lock(&lp->lock);
-                       lp->stats.tx_packets++;
-                       if (lp->tx_queue && lp->tx_queue_ready) {
-                               outb(0x80 | lp->tx_queue, ioaddr + TX_START);
-                               lp->tx_queue = 0;
-                               lp->tx_queue_len = 0;
-                               dev->trans_start = jiffies;
-                               netif_wake_queue(dev);  /* Inform upper layers. */
-                       } else {
-                               lp->tx_started = 0;
-                               netif_wake_queue(dev);  /* Inform upper layers. */
-                       }
-                       spin_unlock(&lp->lock);
-               }
-       }
-       return IRQ_RETVAL(status);
-}
-
-/* We have a good packet(s), get it/them out of the buffers. */
-static void net_rx(struct net_device *dev)
-{
-       struct net_local *lp = dev->priv;
-       int ioaddr = dev->base_addr;
-       int boguscount = 5;
-
-       while ((inb(ioaddr + RX_MODE) & 0x40) == 0) {
-               /* Clear PKT_RDY bit: by agy 19940922 */
-               /* outb(0x80, ioaddr + RX_STATUS); */
-               ushort status = inw(ioaddr + DATAPORT);
-
-               if (net_debug > 4)
-                       printk("%s: Rxing packet mode %02x status %04x.\n",
-                                  dev->name, inb(ioaddr + RX_MODE), status);
-#ifndef final_version
-               if (status == 0) {
-                       outb(0x05, ioaddr + 14);
-                       break;
-               }
-#endif
-
-               if ((status & 0xF0) != 0x20) {  /* There was an error. */
-                       lp->stats.rx_errors++;
-                       if (status & 0x08) lp->stats.rx_length_errors++;
-                       if (status & 0x04) lp->stats.rx_frame_errors++;
-                       if (status & 0x02) lp->stats.rx_crc_errors++;
-                       if (status & 0x01) lp->stats.rx_over_errors++;
-               } else {
-                       ushort pkt_len = inw(ioaddr + DATAPORT);
-                       /* Malloc up new buffer. */
-                       struct sk_buff *skb;
-
-                       if (pkt_len > 1550) {
-                               printk("%s: The FMV-18x claimed a very large packet, size %d.\n",
-                                          dev->name, pkt_len);
-                               outb(0x05, ioaddr + 14);
-                               lp->stats.rx_errors++;
-                               break;
-                       }
-                       skb = dev_alloc_skb(pkt_len+3);
-                       if (skb == NULL) {
-                               printk("%s: Memory squeeze, dropping packet (len %d).\n",
-                                          dev->name, pkt_len);
-                               outb(0x05, ioaddr + 14);
-                               lp->stats.rx_dropped++;
-                               break;
-                       }
-                       skb->dev = dev;
-                       skb_reserve(skb,2);
-
-                       insw(ioaddr + DATAPORT, skb_put(skb,pkt_len), (pkt_len + 1) >> 1);
-
-                       if (net_debug > 5) {
-                               int i;
-                               printk("%s: Rxed packet of length %d: ", dev->name, pkt_len);
-                               for (i = 0; i < 14; i++)
-                                       printk(" %02x", skb->data[i]);
-                               printk(".\n");
-                       }
-
-                       skb->protocol=eth_type_trans(skb, dev);
-                       netif_rx(skb);
-                       dev->last_rx = jiffies;
-                       lp->stats.rx_packets++;
-                       lp->stats.rx_bytes += pkt_len;
-               }
-               if (--boguscount <= 0)
-                       break;
-       }
-
-       /* If any worth-while packets have been received, dev_rint()
-          has done a mark_bh(NET_BH) for us and will work on them
-          when we get to the bottom-half routine. */
-       {
-               int i;
-               for (i = 0; i < 20; i++) {
-                       if ((inb(ioaddr + RX_MODE) & 0x40) == 0x40)
-                               break;
-                       (void)inw(ioaddr + DATAPORT);                           /* dummy status read */
-                       outb(0x05, ioaddr + 14);
-               }
-
-               if (net_debug > 5 && i > 0)
-                       printk("%s: Exint Rx packet with mode %02x after %d ticks.\n",
-                                  dev->name, inb(ioaddr + RX_MODE), i);
-       }
-
-       return;
-}
-
-/* The inverse routine to net_open(). */
-static int net_close(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-
-       ((struct net_local *)dev->priv)->open_time = 0;
-
-       netif_stop_queue(dev);
-       
-       /* Set configuration register 0 to disable Tx and Rx. */
-       outb(0xda, ioaddr + CONFIG_0);
-
-       /* Update the statistics -- ToDo. */
-
-       /* Power-down the chip.  Green, green, green! */
-       outb(0x00, ioaddr + CONFIG_1);
-
-       /* Set the ethernet adaptor disable IRQ */
-       outb(0x00, ioaddr + FJ_CONFIG1);
-
-       return 0;
-}
-
-/* Get the current statistics. This may be called with the card open or
-   closed. */
-static struct net_device_stats *net_get_stats(struct net_device *dev)
-{
-       struct net_local *lp = dev->priv;
-       return &lp->stats;
-}
-
-/* Set or clear the multicast filter for this adaptor.
-   num_addrs == -1     Promiscuous mode, receive all packets
-   num_addrs == 0      Normal mode, clear multicast list
-   num_addrs > 0       Multicast mode, receive normal and MC packets, and do
-                       best-effort filtering.
- */
-static void set_multicast_list(struct net_device *dev)
-{
-       short ioaddr = dev->base_addr;
-       if (dev->mc_count || dev->flags&(IFF_PROMISC|IFF_ALLMULTI))
-       {
-               /*
-                *      We must make the kernel realise we had to move
-                *      into promisc mode or we start all out war on
-                *      the cable. - AC
-                */
-               dev->flags|=IFF_PROMISC;
-
-               outb(3, ioaddr + RX_MODE);      /* Enable promiscuous mode */
-       }
-       else
-               outb(2, ioaddr + RX_MODE);      /* Disable promiscuous, use normal mode */
-}
-
-#ifdef MODULE
-static struct net_device *dev_fmv18x;
-
-MODULE_PARM(io, "i");
-MODULE_PARM(irq, "i");
-MODULE_PARM(net_debug, "i");
-MODULE_PARM_DESC(io, "FMV-18X I/O address");
-MODULE_PARM_DESC(irq, "FMV-18X IRQ number");
-MODULE_PARM_DESC(net_debug, "FMV-18X debug level (0-1,5-6)");
-MODULE_LICENSE("GPL");
-
-int init_module(void)
-{
-       if (io == 0)
-               printk("fmv18x: You should not use auto-probing with insmod!\n");
-       dev_fmv18x = fmv18x_probe(-1);
-       if (IS_ERR(dev_fmv18x))
-               return PTR_ERR(dev_fmv18x);
-       return 0;
-}
-
-void
-cleanup_module(void)
-{
-       unregister_netdev(dev_fmv18x);
-       free_irq(dev_fmv18x->irq, dev_fmv18x);
-       release_region(dev_fmv18x->base_addr, FMV18X_IO_EXTENT);
-       free_netdev(dev_fmv18x);
-}
-#endif /* MODULE */
-\f
-/*
- * Local variables:
- *  compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c fmv18x.c"
- *  version-control: t
- *  kept-new-versions: 5
- *  tab-width: 4
- *  c-indent-level: 4
- * End:
- */
index cda48c5d72a91f59fc806f7fb834d73491c60a57..4ebcd052e15093b0c6e59c5880d974cf06f108dc 100644 (file)
@@ -81,6 +81,7 @@
  *                        cause DMA to kfree'd memory.
  *     0.31: 14 Nov 2004: ethtool support for getting/setting link
  *                        capabilities.
+ *     0.32: 16 Apr 2005: RX_ERROR4 handling added.
  *
  * Known bugs:
  * We suspect that on some hardware no TX done interrupts are generated.
@@ -92,7 +93,7 @@
  * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few
  * superfluous timer interrupts from the nic.
  */
-#define FORCEDETH_VERSION              "0.31"
+#define FORCEDETH_VERSION              "0.32"
 #define DRV_NAME                       "forcedeth"
 
 #include <linux/module.h>
 #include <linux/mii.h>
 #include <linux/random.h>
 #include <linux/init.h>
+#include <linux/if_vlan.h>
 
 #include <asm/irq.h>
 #include <asm/io.h>
@@ -1013,6 +1015,59 @@ static void nv_tx_timeout(struct net_device *dev)
        spin_unlock_irq(&np->lock);
 }
 
+/*
+ * Called when the nic notices a mismatch between the actual data len on the
+ * wire and the len indicated in the 802 header
+ */
+static int nv_getlen(struct net_device *dev, void *packet, int datalen)
+{
+       int hdrlen;     /* length of the 802 header */
+       int protolen;   /* length as stored in the proto field */
+
+       /* 1) calculate len according to header */
+       if ( ((struct vlan_ethhdr *)packet)->h_vlan_proto == __constant_htons(ETH_P_8021Q)) {
+               protolen = ntohs( ((struct vlan_ethhdr *)packet)->h_vlan_encapsulated_proto );
+               hdrlen = VLAN_HLEN;
+       } else {
+               protolen = ntohs( ((struct ethhdr *)packet)->h_proto);
+               hdrlen = ETH_HLEN;
+       }
+       dprintk(KERN_DEBUG "%s: nv_getlen: datalen %d, protolen %d, hdrlen %d\n",
+                               dev->name, datalen, protolen, hdrlen);
+       if (protolen > ETH_DATA_LEN)
+               return datalen; /* Value in proto field not a len, no checks possible */
+
+       protolen += hdrlen;
+       /* consistency checks: */
+       if (datalen > ETH_ZLEN) {
+               if (datalen >= protolen) {
+                       /* more data on wire than in 802 header, trim of
+                        * additional data.
+                        */
+                       dprintk(KERN_DEBUG "%s: nv_getlen: accepting %d bytes.\n",
+                                       dev->name, protolen);
+                       return protolen;
+               } else {
+                       /* less data on wire than mentioned in header.
+                        * Discard the packet.
+                        */
+                       dprintk(KERN_DEBUG "%s: nv_getlen: discarding long packet.\n",
+                                       dev->name);
+                       return -1;
+               }
+       } else {
+               /* short packet. Accept only if 802 values are also short */
+               if (protolen > ETH_ZLEN) {
+                       dprintk(KERN_DEBUG "%s: nv_getlen: discarding short packet.\n",
+                                       dev->name);
+                       return -1;
+               }
+               dprintk(KERN_DEBUG "%s: nv_getlen: accepting %d bytes.\n",
+                               dev->name, datalen);
+               return datalen;
+       }
+}
+
 static void nv_rx_process(struct net_device *dev)
 {
        struct fe_priv *np = get_nvpriv(dev);
@@ -1064,7 +1119,7 @@ static void nv_rx_process(struct net_device *dev)
                                np->stats.rx_errors++;
                                goto next_pkt;
                        }
-                       if (Flags & (NV_RX_ERROR1|NV_RX_ERROR2|NV_RX_ERROR3|NV_RX_ERROR4)) {
+                       if (Flags & (NV_RX_ERROR1|NV_RX_ERROR2|NV_RX_ERROR3)) {
                                np->stats.rx_errors++;
                                goto next_pkt;
                        }
@@ -1078,22 +1133,24 @@ static void nv_rx_process(struct net_device *dev)
                                np->stats.rx_errors++;
                                goto next_pkt;
                        }
-                       if (Flags & NV_RX_ERROR) {
-                               /* framing errors are soft errors, the rest is fatal. */
-                               if (Flags & NV_RX_FRAMINGERR) {
-                                       if (Flags & NV_RX_SUBSTRACT1) {
-                                               len--;
-                                       }
-                               } else {
+                       if (Flags & NV_RX_ERROR4) {
+                               len = nv_getlen(dev, np->rx_skbuff[i]->data, len);
+                               if (len < 0) {
                                        np->stats.rx_errors++;
                                        goto next_pkt;
                                }
                        }
+                       /* framing errors are soft errors. */
+                       if (Flags & NV_RX_FRAMINGERR) {
+                               if (Flags & NV_RX_SUBSTRACT1) {
+                                       len--;
+                               }
+                       }
                } else {
                        if (!(Flags & NV_RX2_DESCRIPTORVALID))
                                goto next_pkt;
 
-                       if (Flags & (NV_RX2_ERROR1|NV_RX2_ERROR2|NV_RX2_ERROR3|NV_RX2_ERROR4)) {
+                       if (Flags & (NV_RX2_ERROR1|NV_RX2_ERROR2|NV_RX2_ERROR3)) {
                                np->stats.rx_errors++;
                                goto next_pkt;
                        }
@@ -1107,17 +1164,19 @@ static void nv_rx_process(struct net_device *dev)
                                np->stats.rx_errors++;
                                goto next_pkt;
                        }
-                       if (Flags & NV_RX2_ERROR) {
-                               /* framing errors are soft errors, the rest is fatal. */
-                               if (Flags & NV_RX2_FRAMINGERR) {
-                                       if (Flags & NV_RX2_SUBSTRACT1) {
-                                               len--;
-                                       }
-                               } else {
+                       if (Flags & NV_RX2_ERROR4) {
+                               len = nv_getlen(dev, np->rx_skbuff[i]->data, len);
+                               if (len < 0) {
                                        np->stats.rx_errors++;
                                        goto next_pkt;
                                }
                        }
+                       /* framing errors are soft errors */
+                       if (Flags & NV_RX2_FRAMINGERR) {
+                               if (Flags & NV_RX2_SUBSTRACT1) {
+                                       len--;
+                               }
+                       }
                        Flags &= NV_RX2_CHECKSUMMASK;
                        if (Flags == NV_RX2_CHECKSUMOK1 ||
                                        Flags == NV_RX2_CHECKSUMOK2 ||
@@ -1480,6 +1539,13 @@ static void nv_do_nic_poll(unsigned long data)
        enable_irq(dev->irq);
 }
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void nv_poll_controller(struct net_device *dev)
+{
+       nv_do_nic_poll((unsigned long) dev);
+}
+#endif
+
 static void nv_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 {
        struct fe_priv *np = get_nvpriv(dev);
@@ -1962,6 +2028,9 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
        dev->get_stats = nv_get_stats;
        dev->change_mtu = nv_change_mtu;
        dev->set_multicast_list = nv_set_multicast;
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       dev->poll_controller = nv_poll_controller;
+#endif
        SET_ETHTOOL_OPS(dev, &ops);
        dev->tx_timeout = nv_tx_timeout;
        dev->watchdog_timeo = NV_WATCHDOG_TIMEO;
index 1c563f905a5964fb094d40ab6626e4b590a6bcb2..a7f15d9f13e5ccd04faa36b6dda826c20e750fbb 100644 (file)
@@ -374,29 +374,6 @@ static inline void do_kiss_params(struct baycom_state *bc,
 }
 
 /* --------------------------------------------------------------------- */
-/*
- * high performance HDLC encoder
- * yes, it's ugly, but generates pretty good code
- */
-
-#define ENCODEITERA(j)                         \
-({                                             \
-        if (!(notbitstream & (0x1f0 << j)))    \
-                goto stuff##j;                 \
-  encodeend##j:        ;                      \
-})
-
-#define ENCODEITERB(j)                                          \
-({                                                              \
-  stuff##j:                                                     \
-        bitstream &= ~(0x100 << j);                             \
-        bitbuf = (bitbuf & (((2 << j) << numbit) - 1)) |        \
-                ((bitbuf & ~(((2 << j) << numbit) - 1)) << 1);  \
-        numbit++;                                               \
-        notbitstream = ~bitstream;                              \
-        goto encodeend##j;                                      \
-})
-
 
 static void encode_hdlc(struct baycom_state *bc)
 {
@@ -405,6 +382,7 @@ static void encode_hdlc(struct baycom_state *bc)
        int pkt_len;
         unsigned bitstream, notbitstream, bitbuf, numbit, crc;
        unsigned char crcarr[2];
+       int j;
        
        if (bc->hdlctx.bufcnt > 0)
                return;
@@ -429,24 +407,14 @@ static void encode_hdlc(struct baycom_state *bc)
                pkt_len--;
                if (!pkt_len)
                        bp = crcarr;
-               ENCODEITERA(0);
-               ENCODEITERA(1);
-               ENCODEITERA(2);
-               ENCODEITERA(3);
-               ENCODEITERA(4);
-               ENCODEITERA(5);
-               ENCODEITERA(6);
-               ENCODEITERA(7);
-               goto enditer;
-               ENCODEITERB(0);
-               ENCODEITERB(1);
-               ENCODEITERB(2);
-               ENCODEITERB(3);
-               ENCODEITERB(4);
-               ENCODEITERB(5);
-               ENCODEITERB(6);
-               ENCODEITERB(7);
-       enditer:
+               for (j = 0; j < 8; j++)
+                       if (unlikely(!(notbitstream & (0x1f0 << j)))) {
+                               bitstream &= ~(0x100 << j);
+                               bitbuf = (bitbuf & (((2 << j) << numbit) - 1)) |
+                                       ((bitbuf & ~(((2 << j) << numbit) - 1)) << 1);
+                               numbit++;
+                               notbitstream = ~bitstream;
+                       }
                numbit += 8;
                while (numbit >= 8) {
                        *wp++ = bitbuf;
@@ -610,37 +578,6 @@ static void do_rxpacket(struct net_device *dev)
        bc->stats.rx_packets++;
 }
 
-#define DECODEITERA(j)                                                        \
-({                                                                            \
-        if (!(notbitstream & (0x0fc << j)))              /* flag or abort */  \
-                goto flgabrt##j;                                              \
-        if ((bitstream & (0x1f8 << j)) == (0xf8 << j))   /* stuffed bit */    \
-                goto stuff##j;                                                \
-  enditer##j:      ;                                                           \
-})
-
-#define DECODEITERB(j)                                                                 \
-({                                                                                     \
-  flgabrt##j:                                                                          \
-        if (!(notbitstream & (0x1fc << j))) {              /* abort received */        \
-                state = 0;                                                             \
-                goto enditer##j;                                                       \
-        }                                                                              \
-        if ((bitstream & (0x1fe << j)) != (0x0fc << j))   /* flag received */          \
-                goto enditer##j;                                                       \
-        if (state)                                                                     \
-                do_rxpacket(dev);                                                      \
-        bc->hdlcrx.bufcnt = 0;                                                         \
-        bc->hdlcrx.bufptr = bc->hdlcrx.buf;                                            \
-        state = 1;                                                                     \
-        numbits = 7-j;                                                                 \
-        goto enditer##j;                                                               \
-  stuff##j:                                                                            \
-        numbits--;                                                                     \
-        bitbuf = (bitbuf & ((~0xff) << j)) | ((bitbuf & ~((~0xff) << j)) << 1);        \
-        goto enditer##j;                                                               \
-})
-        
 static int receive(struct net_device *dev, int cnt)
 {
        struct baycom_state *bc = netdev_priv(dev);
@@ -649,6 +586,7 @@ static int receive(struct net_device *dev, int cnt)
        unsigned char tmp[128];
         unsigned char *cp;
        int cnt2, ret = 0;
+       int j;
         
         numbits = bc->hdlcrx.numbits;
        state = bc->hdlcrx.state;
@@ -669,24 +607,32 @@ static int receive(struct net_device *dev, int cnt)
                        bitbuf |= (*cp) << 8;
                        numbits += 8;
                        notbitstream = ~bitstream;
-                       DECODEITERA(0);
-                       DECODEITERA(1);
-                       DECODEITERA(2);
-                       DECODEITERA(3);
-                       DECODEITERA(4);
-                       DECODEITERA(5);
-                       DECODEITERA(6);
-                       DECODEITERA(7);
-                       goto enddec;
-                       DECODEITERB(0);
-                       DECODEITERB(1);
-                       DECODEITERB(2);
-                       DECODEITERB(3);
-                       DECODEITERB(4);
-                       DECODEITERB(5);
-                       DECODEITERB(6);
-                       DECODEITERB(7);
-               enddec:
+                       for (j = 0; j < 8; j++) {
+
+                               /* flag or abort */
+                               if (unlikely(!(notbitstream & (0x0fc << j)))) {
+
+                                       /* abort received */
+                                       if (!(notbitstream & (0x1fc << j)))
+                                               state = 0;
+
+                                       /* not flag received */
+                                       else if (!(bitstream & (0x1fe << j)) != (0x0fc << j)) {
+                                               if (state)
+                                                       do_rxpacket(dev);
+                                               bc->hdlcrx.bufcnt = 0;
+                                               bc->hdlcrx.bufptr = bc->hdlcrx.buf;
+                                               state = 1;
+                                               numbits = 7-j;
+                                               }
+                                       }
+
+                               /* stuffed bit */
+                               else if (unlikely((bitstream & (0x1f8 << j)) == (0xf8 << j))) {
+                                       numbits--;
+                                       bitbuf = (bitbuf & ((~0xff) << j)) | ((bitbuf & ~((~0xff) << j)) << 1);
+                                       }
+                               }
                        while (state && numbits >= 8) {
                                if (bc->hdlcrx.bufcnt >= TXBUFFER_SIZE) {
                                        state = 0;
index ab44358ddbfc9a7c2a618a24fe820e8239bdcf32..6482d994d4899aef539f2639bd70703c306d3c90 100644 (file)
@@ -1595,7 +1595,7 @@ static struct ethtool_ops emac_ethtool_ops = {
 static int emac_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 {
        struct ocp_enet_private *fep = dev->priv;
-       uint *data = (uint *) & rq->ifr_ifru;
+       uint16_t *data = (uint16_t *) & rq->ifr_ifru;
 
        switch (cmd) {
        case SIOCGMIIPHY:
index 1c553d7efdd9f42b2874f37b08428d96cb4be8a8..ca5914091d3afb9550a80b571312700492d85693 100644 (file)
@@ -389,7 +389,7 @@ config VIA_FIR
        help
          Say Y here if you want to build support for the VIA VT8231
          and VIA VT1211 IrDA controllers, found on the motherboards using
-         those those VIA chipsets. To use this controller, you will need
+         those VIA chipsets. To use this controller, you will need
          to plug a specific 5 pins FIR IrDA dongle in the specific
          motherboard connector. The driver provides support for SIR, MIR
          and FIR (4Mbps) speeds.
index 855f8b2cf13b6f83d1b41011253d514b22e5cc2c..55af32e9bf082ad7f8d88b96b2e068eb0e35304f 100644 (file)
@@ -802,13 +802,14 @@ static void veth_tx_timeout(struct net_device *dev)
 
        spin_lock_irqsave(&port->pending_gate, flags);
 
+       if (!port->pending_lpmask) {
+               spin_unlock_irqrestore(&port->pending_gate, flags);
+               return;
+       }
+
        printk(KERN_WARNING "%s: Tx timeout!  Resetting lp connections: %08x\n",
               dev->name, port->pending_lpmask);
 
-       /* If we've timed out the queue must be stopped, which should
-        * only ever happen when there is a pending packet. */
-       WARN_ON(! port->pending_lpmask);
-
        for (i = 0; i < HVMAXARCHITECTEDLPS; i++) {
                struct veth_lpar_connection *cnx = veth_cnx[i];
 
@@ -924,7 +925,7 @@ static int veth_transmit_to_one(struct sk_buff *skb, HvLpIndex rlp,
 
        spin_lock_irqsave(&cnx->lock, flags);
 
-       if (! cnx->state & VETH_STATE_READY)
+       if (! (cnx->state & VETH_STATE_READY))
                goto drop;
 
        if ((skb->len - 14) > VETH_MAX_MTU)
@@ -1023,6 +1024,8 @@ static int veth_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
        lpmask = veth_transmit_to_many(skb, lpmask, dev);
 
+       dev->trans_start = jiffies;
+
        if (! lpmask) {
                dev_kfree_skb(skb);
        } else {
@@ -1262,13 +1265,18 @@ static void veth_receive(struct veth_lpar_connection *cnx,
 
                vlan = skb->data[9];
                dev = veth_dev[vlan];
-               if (! dev)
-                       /* Some earlier versions of the driver sent
-                          broadcasts down all connections, even to
-                          lpars that weren't on the relevant vlan.
-                          So ignore packets belonging to a vlan we're
-                          not on. */
+               if (! dev) {
+                       /*
+                        * Some earlier versions of the driver sent
+                        * broadcasts down all connections, even to lpars
+                        * that weren't on the relevant vlan. So ignore
+                        * packets belonging to a vlan we're not on.
+                        * We can also be here if we receive packets while
+                        * the driver is going down, because then dev is NULL.
+                        */
+                       dev_kfree_skb_irq(skb);
                        continue;
+               }
 
                port = (struct veth_port *)dev->priv;
                dest = *((u64 *) skb->data) & 0xFFFFFFFFFFFF0000;
@@ -1381,18 +1389,25 @@ void __exit veth_module_cleanup(void)
 {
        int i;
 
-       vio_unregister_driver(&veth_driver);
+       /* Stop the queues first to stop any new packets being sent. */
+       for (i = 0; i < HVMAXARCHITECTEDVIRTUALLANS; i++)
+               if (veth_dev[i])
+                       netif_stop_queue(veth_dev[i]);
 
+       /* Stop the connections before we unregister the driver. This
+        * ensures there's no skbs lying around holding the device open. */
        for (i = 0; i < HVMAXARCHITECTEDLPS; ++i)
                veth_stop_connection(i);
 
        HvLpEvent_unregisterHandler(HvLpEvent_Type_VirtualLan);
 
        /* Hypervisor callbacks may have scheduled more work while we
-        * were destroying connections. Now that we've disconnected from
+        * were stoping connections. Now that we've disconnected from
         * the hypervisor make sure everything's finished. */
        flush_scheduled_work();
 
+       vio_unregister_driver(&veth_driver);
+
        for (i = 0; i < HVMAXARCHITECTEDLPS; ++i)
                veth_destroy_connection(i);
 
index 26c4f15f7fc0b329ebc4f875dbf546932ad8b6b5..f8d3385c7842d3fe6f34b6d672da43353ce139a4 100644 (file)
@@ -110,7 +110,7 @@ struct ixgb_adapter;
 #define IXGB_TX_QUEUE_WAKE 16
 
 /* How many Rx Buffers do we bundle into one write to the hardware ? */
-#define IXGB_RX_BUFFER_WRITE   16      /* Must be power of 2 */
+#define IXGB_RX_BUFFER_WRITE         /* Must be power of 2 */
 
 /* only works for sizes that are powers of 2 */
 #define IXGB_ROUNDUP(i, size) ((i) = (((i) + (size) - 1) & ~((size) - 1)))
index 653e99f919cee638c23be7da3f02dc734b4ea00f..3aae110c55606ced13769acddf7d87c2649d1a4f 100644 (file)
@@ -411,7 +411,7 @@ ixgb_write_eeprom(struct ixgb_hw *hw, uint16_t offset, uint16_t data)
        ixgb_cleanup_eeprom(hw);
 
        /* clear the init_ctrl_reg_1 to signify that the cache is invalidated */
-       ee_map->init_ctrl_reg_1 = EEPROM_ICW1_SIGNATURE_CLEAR;
+       ee_map->init_ctrl_reg_1 = le16_to_cpu(EEPROM_ICW1_SIGNATURE_CLEAR);
 
        return;
 }
@@ -483,7 +483,7 @@ ixgb_get_eeprom_data(struct ixgb_hw *hw)
                DEBUGOUT("ixgb_ee: Checksum invalid.\n");
                /* clear the init_ctrl_reg_1 to signify that the cache is
                 * invalidated */
-               ee_map->init_ctrl_reg_1 = EEPROM_ICW1_SIGNATURE_CLEAR;
+               ee_map->init_ctrl_reg_1 = le16_to_cpu(EEPROM_ICW1_SIGNATURE_CLEAR);
                return (FALSE);
        }
 
@@ -579,7 +579,7 @@ ixgb_get_ee_compatibility(struct ixgb_hw *hw)
        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
 
        if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
-               return(ee_map->compatibility);
+               return (le16_to_cpu(ee_map->compatibility));
 
        return(0);
 }
@@ -616,7 +616,7 @@ ixgb_get_ee_init_ctrl_reg_1(struct ixgb_hw *hw)
        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
 
        if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
-               return(ee_map->init_ctrl_reg_1);
+               return (le16_to_cpu(ee_map->init_ctrl_reg_1));
 
        return(0);
 }
@@ -635,7 +635,7 @@ ixgb_get_ee_init_ctrl_reg_2(struct ixgb_hw *hw)
        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
 
        if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
-               return(ee_map->init_ctrl_reg_2);
+               return (le16_to_cpu(ee_map->init_ctrl_reg_2));
 
        return(0);
 }
@@ -654,7 +654,7 @@ ixgb_get_ee_subsystem_id(struct ixgb_hw *hw)
        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
 
        if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
-          return(ee_map->subsystem_id);
+               return (le16_to_cpu(ee_map->subsystem_id));
 
        return(0);
 }
@@ -673,7 +673,7 @@ ixgb_get_ee_subvendor_id(struct ixgb_hw *hw)
        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
 
        if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
-               return(ee_map->subvendor_id);
+               return (le16_to_cpu(ee_map->subvendor_id));
 
        return(0);
 }
@@ -692,7 +692,7 @@ ixgb_get_ee_device_id(struct ixgb_hw *hw)
        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
 
        if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
-               return(ee_map->device_id);
+               return (le16_to_cpu(ee_map->device_id));
 
        return(0);
 }
@@ -711,7 +711,7 @@ ixgb_get_ee_vendor_id(struct ixgb_hw *hw)
        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
 
        if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
-               return(ee_map->vendor_id);
+               return (le16_to_cpu(ee_map->vendor_id));
 
        return(0);
 }
@@ -730,7 +730,7 @@ ixgb_get_ee_swdpins_reg(struct ixgb_hw *hw)
        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
 
        if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
-               return(ee_map->swdpins_reg);
+               return (le16_to_cpu(ee_map->swdpins_reg));
 
        return(0);
 }
@@ -749,7 +749,7 @@ ixgb_get_ee_d3_power(struct ixgb_hw *hw)
        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
 
        if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
-               return(ee_map->d3_power);
+               return (le16_to_cpu(ee_map->d3_power));
 
        return(0);
 }
@@ -768,7 +768,7 @@ ixgb_get_ee_d0_power(struct ixgb_hw *hw)
        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
 
        if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
-               return(ee_map->d0_power);
+               return (le16_to_cpu(ee_map->d0_power));
 
        return(0);
 }
index aea10e8aaa7220092491cec24691273dd47e2781..3fa113854eebc3d27c8cda25e0d5600a30a48e0e 100644 (file)
@@ -252,7 +252,9 @@ ixgb_get_regs(struct net_device *netdev,
        uint32_t *reg_start = reg;
        uint8_t i;
 
-       regs->version = (adapter->hw.device_id << 16) | adapter->hw.subsystem_id;
+       /* the 1 (one) below indicates an attempt at versioning, if the
+        * interface in ethtool or the driver this 1 should be incremented */
+       regs->version = (1<<24) | hw->revision_id << 16 | hw->device_id;
 
        /* General Registers */
        *reg++ = IXGB_READ_REG(hw, CTRL0);      /*   0 */
index 7d26623d859278bd1ad6369648de9ed41a112493..35f6a7c271a2be3a1f749716cbe27b1bffc66b98 100644 (file)
@@ -47,7 +47,7 @@ char ixgb_driver_string[] = "Intel(R) PRO/10GbE Network Driver";
 #else
 #define DRIVERNAPI "-NAPI"
 #endif
-char ixgb_driver_version[] = "1.0.90-k2"DRIVERNAPI;
+char ixgb_driver_version[] = "1.0.95-k2"DRIVERNAPI;
 char ixgb_copyright[] = "Copyright (c) 1999-2005 Intel Corporation.";
 
 /* ixgb_pci_tbl - PCI Device ID Table
@@ -103,6 +103,7 @@ static int ixgb_change_mtu(struct net_device *netdev, int new_mtu);
 static int ixgb_set_mac(struct net_device *netdev, void *p);
 static irqreturn_t ixgb_intr(int irq, void *data, struct pt_regs *regs);
 static boolean_t ixgb_clean_tx_irq(struct ixgb_adapter *adapter);
+
 #ifdef CONFIG_IXGB_NAPI
 static int ixgb_clean(struct net_device *netdev, int *budget);
 static boolean_t ixgb_clean_rx_irq(struct ixgb_adapter *adapter,
@@ -120,33 +121,20 @@ static void ixgb_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid);
 static void ixgb_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid);
 static void ixgb_restore_vlan(struct ixgb_adapter *adapter);
 
-static int ixgb_notify_reboot(struct notifier_block *, unsigned long event,
-                             void *ptr);
-static int ixgb_suspend(struct pci_dev *pdev, uint32_t state);
-
 #ifdef CONFIG_NET_POLL_CONTROLLER
 /* for netdump / net console */
 static void ixgb_netpoll(struct net_device *dev);
 #endif
 
-struct notifier_block ixgb_notifier_reboot = {
-       .notifier_call = ixgb_notify_reboot,
-       .next = NULL,
-       .priority = 0
-};
-
 /* Exported from other modules */
 
 extern void ixgb_check_options(struct ixgb_adapter *adapter);
 
 static struct pci_driver ixgb_driver = {
-       .name = ixgb_driver_name,
+       .name     = ixgb_driver_name,
        .id_table = ixgb_pci_tbl,
-       .probe = ixgb_probe,
-       .remove = __devexit_p(ixgb_remove),
-       /* Power Managment Hooks */
-       .suspend = NULL,
-       .resume = NULL
+       .probe    = ixgb_probe,
+       .remove   = __devexit_p(ixgb_remove),
 };
 
 MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
@@ -169,17 +157,12 @@ MODULE_LICENSE("GPL");
 static int __init
 ixgb_init_module(void)
 {
-       int ret;
        printk(KERN_INFO "%s - version %s\n",
               ixgb_driver_string, ixgb_driver_version);
 
        printk(KERN_INFO "%s\n", ixgb_copyright);
 
-       ret = pci_module_init(&ixgb_driver);
-       if(ret >= 0) {
-               register_reboot_notifier(&ixgb_notifier_reboot);
-       }
-       return ret;
+       return pci_module_init(&ixgb_driver);
 }
 
 module_init(ixgb_init_module);
@@ -194,7 +177,6 @@ module_init(ixgb_init_module);
 static void __exit
 ixgb_exit_module(void)
 {
-       unregister_reboot_notifier(&ixgb_notifier_reboot);
        pci_unregister_driver(&ixgb_driver);
 }
 
@@ -224,8 +206,8 @@ ixgb_irq_enable(struct ixgb_adapter *adapter)
 {
        if(atomic_dec_and_test(&adapter->irq_sem)) {
                IXGB_WRITE_REG(&adapter->hw, IMS,
-                          IXGB_INT_RXT0 | IXGB_INT_RXDMT0 | IXGB_INT_TXDW |
-                          IXGB_INT_RXO | IXGB_INT_LSC);
+                              IXGB_INT_RXT0 | IXGB_INT_RXDMT0 | IXGB_INT_TXDW |
+                              IXGB_INT_LSC);
                IXGB_WRITE_FLUSH(&adapter->hw);
        }
 }
@@ -1209,10 +1191,10 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb)
                                                | IXGB_CONTEXT_DESC_CMD_TSE
                                                | IXGB_CONTEXT_DESC_CMD_IP
                                                | IXGB_CONTEXT_DESC_CMD_TCP
-                                               | IXGB_CONTEXT_DESC_CMD_RS
                                                | IXGB_CONTEXT_DESC_CMD_IDE
                                                | (skb->len - (hdr_len)));
 
+
                if(++i == adapter->tx_ring.count) i = 0;
                adapter->tx_ring.next_to_use = i;
 
@@ -1247,8 +1229,7 @@ ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb)
                context_desc->mss = 0;
                context_desc->cmd_type_len =
                        cpu_to_le32(IXGB_CONTEXT_DESC_TYPE
-                                       | IXGB_TX_DESC_CMD_RS 
-                                       | IXGB_TX_DESC_CMD_IDE);
+                                   | IXGB_TX_DESC_CMD_IDE);
 
                if(++i == adapter->tx_ring.count) i = 0;
                adapter->tx_ring.next_to_use = i;
@@ -1273,6 +1254,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb,
 
        unsigned int nr_frags = skb_shinfo(skb)->nr_frags;
        unsigned int f;
+
        len -= skb->data_len;
 
        i = tx_ring->next_to_use;
@@ -1526,14 +1508,33 @@ ixgb_change_mtu(struct net_device *netdev, int new_mtu)
 void
 ixgb_update_stats(struct ixgb_adapter *adapter)
 {
+       struct net_device *netdev = adapter->netdev;
+
+       if((netdev->flags & IFF_PROMISC) || (netdev->flags & IFF_ALLMULTI) ||
+          (netdev->mc_count > IXGB_MAX_NUM_MULTICAST_ADDRESSES)) {
+               u64 multi = IXGB_READ_REG(&adapter->hw, MPRCL);
+               u32 bcast_l = IXGB_READ_REG(&adapter->hw, BPRCL);
+               u32 bcast_h = IXGB_READ_REG(&adapter->hw, BPRCH);
+               u64 bcast = ((u64)bcast_h << 32) | bcast_l; 
+
+               multi |= ((u64)IXGB_READ_REG(&adapter->hw, MPRCH) << 32);
+               /* fix up multicast stats by removing broadcasts */
+               multi -= bcast;
+               
+               adapter->stats.mprcl += (multi & 0xFFFFFFFF);
+               adapter->stats.mprch += (multi >> 32);
+               adapter->stats.bprcl += bcast_l; 
+               adapter->stats.bprch += bcast_h;
+       } else {
+               adapter->stats.mprcl += IXGB_READ_REG(&adapter->hw, MPRCL);
+               adapter->stats.mprch += IXGB_READ_REG(&adapter->hw, MPRCH);
+               adapter->stats.bprcl += IXGB_READ_REG(&adapter->hw, BPRCL);
+               adapter->stats.bprch += IXGB_READ_REG(&adapter->hw, BPRCH);
+       }
        adapter->stats.tprl += IXGB_READ_REG(&adapter->hw, TPRL);
        adapter->stats.tprh += IXGB_READ_REG(&adapter->hw, TPRH);
        adapter->stats.gprcl += IXGB_READ_REG(&adapter->hw, GPRCL);
        adapter->stats.gprch += IXGB_READ_REG(&adapter->hw, GPRCH);
-       adapter->stats.bprcl += IXGB_READ_REG(&adapter->hw, BPRCL);
-       adapter->stats.bprch += IXGB_READ_REG(&adapter->hw, BPRCH);
-       adapter->stats.mprcl += IXGB_READ_REG(&adapter->hw, MPRCL);
-       adapter->stats.mprch += IXGB_READ_REG(&adapter->hw, MPRCH);
        adapter->stats.uprcl += IXGB_READ_REG(&adapter->hw, UPRCL);
        adapter->stats.uprch += IXGB_READ_REG(&adapter->hw, UPRCH);
        adapter->stats.vprcl += IXGB_READ_REG(&adapter->hw, VPRCL);
@@ -1823,7 +1824,6 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
        struct pci_dev *pdev = adapter->pdev;
        struct ixgb_rx_desc *rx_desc, *next_rxd;
        struct ixgb_buffer *buffer_info, *next_buffer, *next2_buffer;
-       struct sk_buff *skb, *next_skb;
        uint32_t length;
        unsigned int i, j;
        boolean_t cleaned = FALSE;
@@ -1833,6 +1833,8 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
        buffer_info = &rx_ring->buffer_info[i];
 
        while(rx_desc->status & IXGB_RX_DESC_STATUS_DD) {
+               struct sk_buff *skb, *next_skb;
+               u8 status;
 
 #ifdef CONFIG_IXGB_NAPI
                if(*work_done >= work_to_do)
@@ -1840,7 +1842,9 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
 
                (*work_done)++;
 #endif
+               status = rx_desc->status;
                skb = buffer_info->skb;
+
                prefetch(skb->data);
 
                if(++i == rx_ring->count) i = 0;
@@ -1855,7 +1859,6 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
                next_skb = next_buffer->skb;
                prefetch(next_skb);
 
-
                cleaned = TRUE;
 
                pci_unmap_single(pdev,
@@ -1865,7 +1868,7 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
 
                length = le16_to_cpu(rx_desc->length);
 
-               if(unlikely(!(rx_desc->status & IXGB_RX_DESC_STATUS_EOP))) {
+               if(unlikely(!(status & IXGB_RX_DESC_STATUS_EOP))) {
 
                        /* All receives must fit into a single buffer */
 
@@ -1873,12 +1876,7 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
                                         "length<%x>\n", length);
 
                        dev_kfree_skb_irq(skb);
-                       rx_desc->status = 0;
-                       buffer_info->skb = NULL;
-
-                       rx_desc = next_rxd;
-                       buffer_info = next_buffer;
-                       continue;
+                       goto rxdesc_done;
                }
 
                if (unlikely(rx_desc->errors
@@ -1887,12 +1885,7 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
                                IXGB_RX_DESC_ERRORS_RXE))) {
 
                        dev_kfree_skb_irq(skb);
-                       rx_desc->status = 0;
-                       buffer_info->skb = NULL;
-
-                       rx_desc = next_rxd;
-                       buffer_info = next_buffer;
-                       continue;
+                       goto rxdesc_done;
                }
 
                /* Good Receive */
@@ -1903,7 +1896,7 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
 
                skb->protocol = eth_type_trans(skb, netdev);
 #ifdef CONFIG_IXGB_NAPI
-               if(adapter->vlgrp && (rx_desc->status & IXGB_RX_DESC_STATUS_VP)) {
+               if(adapter->vlgrp && (status & IXGB_RX_DESC_STATUS_VP)) {
                        vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
                                le16_to_cpu(rx_desc->special) &
                                        IXGB_RX_DESC_SPECIAL_VLAN_MASK);
@@ -1911,7 +1904,7 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
                        netif_receive_skb(skb);
                }
 #else /* CONFIG_IXGB_NAPI */
-               if(adapter->vlgrp && (rx_desc->status & IXGB_RX_DESC_STATUS_VP)) {
+               if(adapter->vlgrp && (status & IXGB_RX_DESC_STATUS_VP)) {
                        vlan_hwaccel_rx(skb, adapter->vlgrp,
                                le16_to_cpu(rx_desc->special) &
                                        IXGB_RX_DESC_SPECIAL_VLAN_MASK);
@@ -1921,9 +1914,12 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
 #endif /* CONFIG_IXGB_NAPI */
                netdev->last_rx = jiffies;
 
+rxdesc_done:
+               /* clean up descriptor, might be written over by hw */
                rx_desc->status = 0;
                buffer_info->skb = NULL;
 
+               /* use prefetched values */
                rx_desc = next_rxd;
                buffer_info = next_buffer;
        }
@@ -1959,8 +1955,8 @@ ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter)
 
        num_group_tail_writes = IXGB_RX_BUFFER_WRITE;
 
-       /* leave one descriptor unused */
-       while(--cleancount > 0) {
+       /* leave three descriptors unused */
+       while(--cleancount > 2) {
                rx_desc = IXGB_RX_DESC(*rx_ring, i);
 
                skb = dev_alloc_skb(adapter->rx_buffer_len + NET_IP_ALIGN);
@@ -1987,6 +1983,10 @@ ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter)
                                   PCI_DMA_FROMDEVICE);
 
                rx_desc->buff_addr = cpu_to_le64(buffer_info->dma);
+               /* guarantee DD bit not set now before h/w gets descriptor
+                * this is the rest of the workaround for h/w double 
+                * writeback. */
+               rx_desc->status = 0;
 
                if((i & ~(num_group_tail_writes- 1)) == i) {
                        /* Force memory writes to complete before letting h/w
@@ -2099,54 +2099,6 @@ ixgb_restore_vlan(struct ixgb_adapter *adapter)
        }
 }
 
-/**
- * ixgb_notify_reboot - handles OS notification of reboot event.
- * @param nb notifier block, unused
- * @param event Event being passed to driver to act upon
- * @param p A pointer to our net device
- **/
-static int
-ixgb_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
-{
-       struct pci_dev *pdev = NULL;
-
-       switch(event) {
-       case SYS_DOWN:
-       case SYS_HALT:
-       case SYS_POWER_OFF:
-               while ((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev))) {
-                       if (pci_dev_driver(pdev) == &ixgb_driver)
-                               ixgb_suspend(pdev, 3);
-               }
-       }
-       return NOTIFY_DONE;
-}
-
-/**
- * ixgb_suspend - driver suspend function called from notify.
- * @param pdev pci driver structure used for passing to
- * @param state power state to enter 
- **/
-static int
-ixgb_suspend(struct pci_dev *pdev, uint32_t state)
-{
-       struct net_device *netdev = pci_get_drvdata(pdev);
-       struct ixgb_adapter *adapter = netdev->priv;
-
-       netif_device_detach(netdev);
-
-       if(netif_running(netdev))
-               ixgb_down(adapter, TRUE);
-
-       pci_save_state(pdev);
-
-       state = (state > 0) ? 3 : 0;
-       pci_set_power_state(pdev, state);
-       msec_delay(200);
-
-       return 0;
-}
-
 #ifdef CONFIG_NET_POLL_CONTROLLER
 /*
  * Polling 'interrupt' - used by things like netconsole to send skbs
@@ -2157,6 +2109,7 @@ ixgb_suspend(struct pci_dev *pdev, uint32_t state)
 static void ixgb_netpoll(struct net_device *dev)
 {
        struct ixgb_adapter *adapter = dev->priv;
+
        disable_irq(adapter->pdev->irq);
        ixgb_intr(adapter->pdev->irq, dev, NULL);
        enable_irq(adapter->pdev->irq);
index 9eba9289190183934b7d2475950271b9f4b4cc72..dba20481ee80126e70d0876a5893892ce680ce27 100644 (file)
@@ -45,8 +45,7 @@
                                /* Don't mdelay in interrupt context! */ \
                                BUG(); \
                        } else { \
-                               set_current_state(TASK_UNINTERRUPTIBLE); \
-                               schedule_timeout((x * HZ)/1000 + 2); \
+                               msleep(x); \
                        } } while(0)
 #endif
 
index 223bdadd4c0d56ccca398fbbbb7d3c7a639b32b6..babb59e146ea62524fc00c50ee1d284502e69c56 100644 (file)
@@ -2433,9 +2433,9 @@ static void __set_rx_mode(struct net_device *dev)
                rx_mode = RxFilterEnable | AcceptBroadcast
                        | AcceptMulticast | AcceptMyPhys;
                for (i = 0; i < 64; i += 2) {
-                       writew(HASH_TABLE + i, ioaddr + RxFilterAddr);
-                       writew((mc_filter[i+1]<<8) + mc_filter[i],
-                               ioaddr + RxFilterData);
+                       writel(HASH_TABLE + i, ioaddr + RxFilterAddr);
+                       writel((mc_filter[i + 1] << 8) + mc_filter[i],
+                              ioaddr + RxFilterData);
                }
        }
        writel(rx_mode, ioaddr + RxFilterAddr);
index 2fcc181a8624c817504b32bd68d523620ccc1128..c336b46bd332676155f01fee160a63b590b30e9b 100644 (file)
@@ -1,4 +1,4 @@
-#define _VERSION "0.20"
+#define VERSION "0.22"
 /* ns83820.c by Benjamin LaHaise with contributions.
  *
  * Questions/comments/discussion to linux-ns83820@kvack.org.
  *                          -  fix missed txok introduced during performance
  *                             tuning
  *                     0.20 -  fix stupid RFEN thinko.  i am such a smurf.
- *
  *     20040828        0.21 -  add hardware vlan accleration
  *                             by Neil Horman <nhorman@redhat.com>
+ *     20050406        0.22 -  improved DAC ifdefs from Andi Kleen     
+ *                          -  removal of dead code from Adrian Bunk
+ *                          -  fix half duplex collision behaviour
  * Driver Overview
  * ===============
  *
@@ -129,18 +131,6 @@ static int lnksts = 0;             /* CFG_LNKSTS bit polarity */
 #undef Dprintk
 #define        Dprintk                 dprintk
 
-#if defined(CONFIG_HIGHMEM64G) || defined(__ia64__)
-#define USE_64BIT_ADDR "+"
-#endif
-
-#if defined(USE_64BIT_ADDR)
-#define        VERSION _VERSION USE_64BIT_ADDR
-#define TRY_DAC        1
-#else
-#define        VERSION _VERSION
-#define TRY_DAC        0
-#endif
-
 /* tunables */
 #define RX_BUF_SIZE    1500    /* 8192 */
 #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
@@ -386,22 +376,16 @@ static int lnksts = 0;            /* CFG_LNKSTS bit polarity */
 #define LINK_DOWN              0x02
 #define LINK_UP                        0x04
 
-#ifdef USE_64BIT_ADDR
-#define HW_ADDR_LEN    8
+#define HW_ADDR_LEN    sizeof(dma_addr_t) 
 #define desc_addr_set(desc, addr)                              \
        do {                                                    \
-               u64 __addr = (addr);                            \
-               (desc)[0] = cpu_to_le32(__addr);                \
-               (desc)[1] = cpu_to_le32(__addr >> 32);          \
+               ((desc)[0] = cpu_to_le32(addr));                \
+               if (HW_ADDR_LEN == 8)                           \
+                       (desc)[1] = cpu_to_le32(((u64)addr) >> 32);     \
        } while(0)
 #define desc_addr_get(desc)                                    \
-               (((u64)le32_to_cpu((desc)[1]) << 32)            \
-                    | le32_to_cpu((desc)[0]))
-#else
-#define HW_ADDR_LEN    4
-#define desc_addr_set(desc, addr)      ((desc)[0] = cpu_to_le32(addr))
-#define desc_addr_get(desc)            (le32_to_cpu((desc)[0]))
-#endif
+       (le32_to_cpu((desc)[0]) | \
+       (HW_ADDR_LEN == 8 ? ((dma_addr_t)le32_to_cpu((desc)[1]))<<32 : 0))
 
 #define DESC_LINK              0
 #define DESC_BUFPTR            (DESC_LINK + HW_ADDR_LEN/4)
@@ -727,11 +711,23 @@ static void fastcall phy_intr(struct net_device *ndev)
                speed = ((cfg / CFG_SPDSTS0) & 3);
                fullduplex = (cfg & CFG_DUPSTS);
 
-               if (fullduplex)
+               if (fullduplex) {
                        new_cfg |= CFG_SB;
+                       writel(readl(dev->base + TXCFG)
+                                       | TXCFG_CSI | TXCFG_HBI,
+                              dev->base + TXCFG);
+                       writel(readl(dev->base + RXCFG) | RXCFG_RX_FD,
+                              dev->base + RXCFG);
+               } else {
+                       writel(readl(dev->base + TXCFG)
+                                       & ~(TXCFG_CSI | TXCFG_HBI),
+                              dev->base + TXCFG);
+                       writel(readl(dev->base + RXCFG) & ~(RXCFG_RX_FD),
+                              dev->base + RXCFG);
+               }
 
                if ((cfg & CFG_LNKSTS) &&
-                   ((new_cfg ^ dev->CFG_cache) & CFG_MODE_1000)) {
+                   ((new_cfg ^ dev->CFG_cache) != 0)) {
                        writel(new_cfg, dev->base + CFG);
                        dev->CFG_cache = new_cfg;
                }
@@ -1189,7 +1185,6 @@ again:
 
        for (;;) {
                volatile u32 *desc = dev->tx_descs + (free_idx * DESC_SIZE);
-               u32 residue = 0;
 
                dprintk("frag[%3u]: %4u @ 0x%08Lx\n", free_idx, len,
                        (unsigned long long)buf);
@@ -1199,17 +1194,11 @@ again:
                desc_addr_set(desc + DESC_BUFPTR, buf);
                desc[DESC_EXTSTS] = cpu_to_le32(extsts);
 
-               cmdsts = ((nr_frags|residue) ? CMDSTS_MORE : do_intr ? CMDSTS_INTR : 0);
+               cmdsts = ((nr_frags) ? CMDSTS_MORE : do_intr ? CMDSTS_INTR : 0);
                cmdsts |= (desc == first_desc) ? 0 : CMDSTS_OWN;
                cmdsts |= len;
                desc[DESC_CMDSTS] = cpu_to_le32(cmdsts);
 
-               if (residue) {
-                       buf += len;
-                       len = residue;
-                       continue;
-               }
-
                if (!nr_frags)
                        break;
 
@@ -1841,7 +1830,8 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_
        int using_dac = 0;
 
        /* See if we can set the dma mask early on; failure is fatal. */
-       if (TRY_DAC && !pci_set_dma_mask(pci_dev, 0xffffffffffffffffULL)) {
+       if (sizeof(dma_addr_t) == 8 && 
+               !pci_set_dma_mask(pci_dev, 0xffffffffffffffffULL)) {
                using_dac = 1;
        } else if (!pci_set_dma_mask(pci_dev, 0xffffffff)) {
                using_dac = 0;
@@ -1972,9 +1962,8 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_
        /* When compiled with 64 bit addressing, we must always enable
         * the 64 bit descriptor format.
         */
-#ifdef USE_64BIT_ADDR
-       dev->CFG_cache |= CFG_M64ADDR;
-#endif
+       if (sizeof(dma_addr_t) == 8) 
+               dev->CFG_cache |= CFG_M64ADDR;
        if (using_dac)
                dev->CFG_cache |= CFG_T64ADDR;
 
index 41e517114807052707dad7bace8529f7080ba25a..c6e8b25f968529837ec3987baac52e7f55d73dea 100644 (file)
@@ -1274,6 +1274,9 @@ static int el3_close(struct net_device *dev)
                spin_lock_irqsave(&lp->window_lock, flags);
                update_stats(dev);
                spin_unlock_irqrestore(&lp->window_lock, flags);
+
+               /* force interrupts off */
+               outw(SetIntrEnb | 0x0000, ioaddr + EL3_CMD);
        }
 
        link->open--;
index b0126304ca08398ba3b40189c154b9ada522750f..181b6ed550036852196bb0d67ae6ef753be5c78b 100644 (file)
@@ -1537,20 +1537,20 @@ static void shmem_get_8390_hdr(struct net_device *dev,
 static void shmem_block_input(struct net_device *dev, int count,
                              struct sk_buff *skb, int ring_offset)
 {
-    void __iomem *xfer_start = ei_status.mem + (TX_PAGES<<8)
-                               + ring_offset
+    void __iomem *base = ei_status.mem;
+    unsigned long offset = (TX_PAGES<<8) + ring_offset
                                - (ei_status.rx_start_page << 8);
     char *buf = skb->data;
     
-    if (xfer_start + count > (void __iomem *)ei_status.rmem_end) {
+    if (offset + count > ei_status.priv) {
        /* We must wrap the input move. */
-       int semi_count = (void __iomem *)ei_status.rmem_end - xfer_start;
-       copyin(buf, xfer_start, semi_count);
+       int semi_count = ei_status.priv - offset;
+       copyin(buf, base + offset, semi_count);
        buf += semi_count;
-       xfer_start = ei_status.mem + (TX_PAGES<<8);
+       offset = TX_PAGES<<8;
        count -= semi_count;
     }
-    copyin(buf, xfer_start, count);
+    copyin(buf, base + offset, count);
 }
 
 /*====================================================================*/
@@ -1611,8 +1611,9 @@ static int setup_shmem_window(dev_link_t *link, int start_pg,
     }
     
     ei_status.mem = info->base + offset;
+    ei_status.priv = req.Size;
     dev->mem_start = (u_long)ei_status.mem;
-    dev->mem_end = ei_status.rmem_end = (u_long)info->base + req.Size;
+    dev->mem_end = dev->mem_start + req.Size;
 
     ei_status.tx_start_page = start_pg;
     ei_status.rx_start_page = start_pg + TX_PAGES;
index 17947e6c8793796b78bc809240d480817d3a8a27..13f114876965ba1d26f3bc2c604037d409213fa5 100644 (file)
@@ -22,8 +22,8 @@
  *************************************************************************/
 
 #define DRV_NAME       "pcnet32"
-#define DRV_VERSION    "1.30i"
-#define DRV_RELDATE    "06.28.2004"
+#define DRV_VERSION    "1.30j"
+#define DRV_RELDATE    "29.04.2005"
 #define PFX            DRV_NAME ": "
 
 static const char *version =
@@ -256,6 +256,7 @@ static int homepna[MAX_UNITS];
  *        homepna for selecting HomePNA mode for PCNet/Home 79C978.
  * v1.30h  24 Jun 2004 Don Fry correctly select auto, speed, duplex in bcr32.
  * v1.30i  28 Jun 2004 Don Fry change to use module_param.
+ * v1.30j  29 Apr 2005 Don Fry fix skb/map leak with loopback test.
  */
 
 
@@ -395,6 +396,7 @@ static void pcnet32_led_blink_callback(struct net_device *dev);
 static int pcnet32_get_regs_len(struct net_device *dev);
 static void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs,
        void *ptr);
+static void pcnet32_purge_tx_ring(struct net_device *dev);
 
 enum pci_flags_bit {
     PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4,
@@ -785,6 +787,7 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t *data1)
     }
 
 clean_up:
+    pcnet32_purge_tx_ring(dev);
     x = a->read_csr(ioaddr, 15) & 0xFFFF;
     a->write_csr(ioaddr, 15, (x & ~0x0044));   /* reset bits 6 and 2 */
 
index 3b377f6cd4a0bff915d75d46cef3d66eb16cbf20..ab726ab43798811bd28d76c293f4fc3564dff75a 100644 (file)
@@ -273,7 +273,7 @@ static int ppp_connect_channel(struct channel *pch, int unit);
 static int ppp_disconnect_channel(struct channel *pch);
 static void ppp_destroy_channel(struct channel *pch);
 
-static struct class_simple *ppp_class;
+static struct class *ppp_class;
 
 /* Translates a PPP protocol number to a NP index (NP == network protocol) */
 static inline int proto_to_npindex(int proto)
@@ -858,12 +858,12 @@ static int __init ppp_init(void)
        printk(KERN_INFO "PPP generic driver version " PPP_VERSION "\n");
        err = register_chrdev(PPP_MAJOR, "ppp", &ppp_device_fops);
        if (!err) {
-               ppp_class = class_simple_create(THIS_MODULE, "ppp");
+               ppp_class = class_create(THIS_MODULE, "ppp");
                if (IS_ERR(ppp_class)) {
                        err = PTR_ERR(ppp_class);
                        goto out_chrdev;
                }
-               class_simple_device_add(ppp_class, MKDEV(PPP_MAJOR, 0), NULL, "ppp");
+               class_device_create(ppp_class, MKDEV(PPP_MAJOR, 0), NULL, "ppp");
                err = devfs_mk_cdev(MKDEV(PPP_MAJOR, 0),
                                S_IFCHR|S_IRUSR|S_IWUSR, "ppp");
                if (err)
@@ -876,8 +876,8 @@ out:
        return err;
 
 out_class:
-       class_simple_device_remove(MKDEV(PPP_MAJOR,0));
-       class_simple_destroy(ppp_class);
+       class_device_destroy(ppp_class, MKDEV(PPP_MAJOR,0));
+       class_destroy(ppp_class);
 out_chrdev:
        unregister_chrdev(PPP_MAJOR, "ppp");
        goto out;
@@ -1217,36 +1217,43 @@ ppp_push(struct ppp *ppp)
  */
 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
 {
-       int nch, len, fragsize;
+       int len, fragsize;
        int i, bits, hdrlen, mtu;
-       int flen, fnb;
+       int flen;
+       int navail, nfree;
+       int nbigger;
        unsigned char *p, *q;
        struct list_head *list;
        struct channel *pch;
        struct sk_buff *frag;
        struct ppp_channel *chan;
 
-       nch = 0;
+       nfree = 0;      /* # channels which have no packet already queued */
+       navail = 0;     /* total # of usable channels (not deregistered) */
        hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN;
+       i = 0;
        list = &ppp->channels;
        while ((list = list->next) != &ppp->channels) {
                pch = list_entry(list, struct channel, clist);
-               nch += pch->avail = (skb_queue_len(&pch->file.xq) == 0);
-               /*
-                * If a channel hasn't had a fragment yet, it has to get
-                * one before we send any fragments on later channels.
-                * If it can't take a fragment now, don't give any
-                * to subsequent channels.
-                */
-               if (!pch->had_frag && !pch->avail) {
-                       while ((list = list->next) != &ppp->channels) {
-                               pch = list_entry(list, struct channel, clist);
-                               pch->avail = 0;
+               navail += pch->avail = (pch->chan != NULL);
+               if (pch->avail) {
+                       if (skb_queue_len(&pch->file.xq) == 0
+                           || !pch->had_frag) {
+                               pch->avail = 2;
+                               ++nfree;
                        }
-                       break;
+                       if (!pch->had_frag && i < ppp->nxchan)
+                               ppp->nxchan = i;
                }
+               ++i;
        }
-       if (nch == 0)
+
+       /*
+        * Don't start sending this packet unless at least half of
+        * the channels are free.  This gives much better TCP
+        * performance if we have a lot of channels.
+        */
+       if (nfree == 0 || nfree < navail / 2)
                return 0;       /* can't take now, leave it in xmit_pending */
 
        /* Do protocol field compression (XXX this should be optional) */
@@ -1257,14 +1264,19 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
                --len;
        }
 
-       /* decide on fragment size */
+       /*
+        * Decide on fragment size.
+        * We create a fragment for each free channel regardless of
+        * how small they are (i.e. even 0 length) in order to minimize
+        * the time that it will take to detect when a channel drops
+        * a fragment.
+        */
        fragsize = len;
-       if (nch > 1) {
-               int maxch = ROUNDUP(len, MIN_FRAG_SIZE);
-               if (nch > maxch)
-                       nch = maxch;
-               fragsize = ROUNDUP(fragsize, nch);
-       }
+       if (nfree > 1)
+               fragsize = ROUNDUP(fragsize, nfree);
+       /* nbigger channels get fragsize bytes, the rest get fragsize-1,
+          except if nbigger==0, then they all get fragsize. */
+       nbigger = len % nfree;
 
        /* skip to the channel after the one we last used
           and start at that one */
@@ -1278,7 +1290,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
 
        /* create a fragment for each channel */
        bits = B;
-       do {
+       while (nfree > 0 || len > 0) {
                list = list->next;
                if (list == &ppp->channels) {
                        i = 0;
@@ -1289,61 +1301,92 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
                if (!pch->avail)
                        continue;
 
+               /*
+                * Skip this channel if it has a fragment pending already and
+                * we haven't given a fragment to all of the free channels.
+                */
+               if (pch->avail == 1) {
+                       if (nfree > 0)
+                               continue;
+               } else {
+                       --nfree;
+                       pch->avail = 1;
+               }
+
                /* check the channel's mtu and whether it is still attached. */
                spin_lock_bh(&pch->downl);
-               if (pch->chan == 0 || (mtu = pch->chan->mtu) < hdrlen) {
-                       /* can't use this channel */
+               if (pch->chan == NULL) {
+                       /* can't use this channel, it's being deregistered */
                        spin_unlock_bh(&pch->downl);
                        pch->avail = 0;
-                       if (--nch == 0)
+                       if (--navail == 0)
                                break;
                        continue;
                }
 
                /*
-                * We have to create multiple fragments for this channel
-                * if fragsize is greater than the channel's mtu.
+                * Create a fragment for this channel of
+                * min(max(mtu+2-hdrlen, 4), fragsize, len) bytes.
+                * If mtu+2-hdrlen < 4, that is a ridiculously small
+                * MTU, so we use mtu = 2 + hdrlen.
                 */
                if (fragsize > len)
                        fragsize = len;
-               for (flen = fragsize; flen > 0; flen -= fnb) {
-                       fnb = flen;
-                       if (fnb > mtu + 2 - hdrlen)
-                               fnb = mtu + 2 - hdrlen;
-                       if (fnb >= len)
-                               bits |= E;
-                       frag = alloc_skb(fnb + hdrlen, GFP_ATOMIC);
-                       if (frag == 0)
-                               goto noskb;
-                       q = skb_put(frag, fnb + hdrlen);
-                       /* make the MP header */
-                       q[0] = PPP_MP >> 8;
-                       q[1] = PPP_MP;
-                       if (ppp->flags & SC_MP_XSHORTSEQ) {
-                               q[2] = bits + ((ppp->nxseq >> 8) & 0xf);
-                               q[3] = ppp->nxseq;
-                       } else {
-                               q[2] = bits;
-                               q[3] = ppp->nxseq >> 16;
-                               q[4] = ppp->nxseq >> 8;
-                               q[5] = ppp->nxseq;
-                       }
-
-                       /* copy the data in */
-                       memcpy(q + hdrlen, p, fnb);
-
-                       /* try to send it down the channel */
-                       chan = pch->chan;
-                       if (!chan->ops->start_xmit(chan, frag))
-                               skb_queue_tail(&pch->file.xq, frag);
-                       pch->had_frag = 1;
-                       p += fnb;
-                       len -= fnb;
-                       ++ppp->nxseq;
-                       bits = 0;
+               flen = fragsize;
+               mtu = pch->chan->mtu + 2 - hdrlen;
+               if (mtu < 4)
+                       mtu = 4;
+               if (flen > mtu)
+                       flen = mtu;
+               if (flen == len && nfree == 0)
+                       bits |= E;
+               frag = alloc_skb(flen + hdrlen + (flen == 0), GFP_ATOMIC);
+               if (frag == 0)
+                       goto noskb;
+               q = skb_put(frag, flen + hdrlen);
+
+               /* make the MP header */
+               q[0] = PPP_MP >> 8;
+               q[1] = PPP_MP;
+               if (ppp->flags & SC_MP_XSHORTSEQ) {
+                       q[2] = bits + ((ppp->nxseq >> 8) & 0xf);
+                       q[3] = ppp->nxseq;
+               } else {
+                       q[2] = bits;
+                       q[3] = ppp->nxseq >> 16;
+                       q[4] = ppp->nxseq >> 8;
+                       q[5] = ppp->nxseq;
                }
+
+               /*
+                * Copy the data in.
+                * Unfortunately there is a bug in older versions of
+                * the Linux PPP multilink reconstruction code where it
+                * drops 0-length fragments.  Therefore we make sure the
+                * fragment has at least one byte of data.  Any bytes
+                * we add in this situation will end up as padding on the
+                * end of the reconstructed packet.
+                */
+               if (flen == 0)
+                       *skb_put(frag, 1) = 0;
+               else
+                       memcpy(q + hdrlen, p, flen);
+
+               /* try to send it down the channel */
+               chan = pch->chan;
+               if (skb_queue_len(&pch->file.xq)
+                   || !chan->ops->start_xmit(chan, frag))
+                       skb_queue_tail(&pch->file.xq, frag);
+               pch->had_frag = 1;
+               p += flen;
+               len -= flen;
+               ++ppp->nxseq;
+               bits = 0;
                spin_unlock_bh(&pch->downl);
-       } while (len > 0);
+
+               if (--nbigger == 0 && fragsize > 0)
+                       --fragsize;
+       }
        ppp->nxchan = i;
 
        return 1;
@@ -1422,7 +1465,7 @@ ppp_input(struct ppp_channel *chan, struct sk_buff *skb)
                kfree_skb(skb);
                return;
        }
-       
+
        proto = PPP_PROTO(skb);
        read_lock_bh(&pch->upl);
        if (pch->ppp == 0 || proto >= 0xc000 || proto == PPP_CCPFRAG) {
@@ -1691,7 +1734,7 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
        struct list_head *l;
        int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN;
 
-       if (!pskb_may_pull(skb, mphdrlen + 1) || ppp->mrru == 0)
+       if (!pskb_may_pull(skb, mphdrlen) || ppp->mrru == 0)
                goto err;               /* no good, throw it away */
 
        /* Decode sequence number and begin/end bits */
@@ -2611,8 +2654,8 @@ static void __exit ppp_cleanup(void)
        if (unregister_chrdev(PPP_MAJOR, "ppp") != 0)
                printk(KERN_ERR "PPP: failed to unregister PPP device\n");
        devfs_remove("ppp");
-       class_simple_device_remove(MKDEV(PPP_MAJOR, 0));
-       class_simple_destroy(ppp_class);
+       class_device_destroy(ppp_class, MKDEV(PPP_MAJOR, 0));
+       class_destroy(ppp_class);
 }
 
 /*
index c59507f8a76befe001f1313f55b6780423d1e778..ce449fe90e6d66169a1e93399b75282b8c472b47 100644 (file)
@@ -69,7 +69,13 @@ VERSION 2.2LK        <2005/01/25>
 #include <asm/io.h>
 #include <asm/irq.h>
 
-#define RTL8169_VERSION "2.2LK"
+#ifdef CONFIG_R8169_NAPI
+#define NAPI_SUFFIX    "-NAPI"
+#else
+#define NAPI_SUFFIX    ""
+#endif
+
+#define RTL8169_VERSION "2.2LK" NAPI_SUFFIX
 #define MODULENAME "r8169"
 #define PFX MODULENAME ": "
 
@@ -85,6 +91,10 @@ VERSION 2.2LK        <2005/01/25>
 #define dprintk(fmt, args...)  do {} while (0)
 #endif /* RTL8169_DEBUG */
 
+#define R8169_MSG_DEFAULT \
+       (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK | NETIF_MSG_IFUP | \
+        NETIF_MSG_IFDOWN)
+
 #define TX_BUFFS_AVAIL(tp) \
        (tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1)
 
@@ -174,8 +184,9 @@ const static struct {
 #undef _R
 
 static struct pci_device_id rtl8169_pci_tbl[] = {
-       {0x10ec, 0x8169, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       {0x1186, 0x4300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+       { PCI_DEVICE(PCI_VENDOR_ID_REALTEK,     0x8169), },
+       { PCI_DEVICE(PCI_VENDOR_ID_DLINK,       0x4300), },
+       { PCI_DEVICE(0x16ec,                    0x0116), },
        {0,},
 };
 
@@ -183,10 +194,15 @@ MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
 
 static int rx_copybreak = 200;
 static int use_dac;
+static struct {
+       u32 msg_enable;
+} debug = { -1 };
 
 enum RTL8169_registers {
        MAC0 = 0,               /* Ethernet hardware address. */
        MAR0 = 8,               /* Multicast filter. */
+       CounterAddrLow = 0x10,
+       CounterAddrHigh = 0x14,
        TxDescStartAddrLow = 0x20,
        TxDescStartAddrHigh = 0x24,
        TxHDescStartAddrLow = 0x28,
@@ -328,6 +344,9 @@ enum RTL8169_register_content {
 
        /* _TBICSRBit */
        TBILinkOK = 0x02000000,
+
+       /* DumpCounterCommand */
+       CounterDump = 0x8,
 };
 
 enum _DescStatusBit {
@@ -385,6 +404,7 @@ struct rtl8169_private {
        struct pci_dev *pci_dev;        /* Index of PCI device */
        struct net_device_stats stats;  /* statistics of net device */
        spinlock_t lock;                /* spin lock flag */
+       u32 msg_enable;
        int chipset;
        int mac_version;
        int phy_version;
@@ -415,12 +435,16 @@ struct rtl8169_private {
        struct work_struct task;
 };
 
-MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@oss.sgi.com>");
+MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
 MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
 module_param_array(media, int, &num_media, 0);
+MODULE_PARM_DESC(media, "force phy operation. Deprecated by ethtool (8).");
 module_param(rx_copybreak, int, 0);
+MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames");
 module_param(use_dac, int, 0);
 MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
+module_param_named(debug, debug.msg_enable, int, 0);
+MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(RTL8169_VERSION);
 
@@ -433,10 +457,10 @@ static void rtl8169_hw_start(struct net_device *dev);
 static int rtl8169_close(struct net_device *dev);
 static void rtl8169_set_rx_mode(struct net_device *dev);
 static void rtl8169_tx_timeout(struct net_device *dev);
-static struct net_device_stats *rtl8169_get_stats(struct net_device *netdev);
+static struct net_device_stats *rtl8169_get_stats(struct net_device *dev);
 static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
                                void __iomem *);
-static int rtl8169_change_mtu(struct net_device *netdev, int new_mtu);
+static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
 static void rtl8169_down(struct net_device *dev);
 
 #ifdef CONFIG_R8169_NAPI
@@ -543,9 +567,13 @@ static void rtl8169_check_link_status(struct net_device *dev,
        spin_lock_irqsave(&tp->lock, flags);
        if (tp->link_ok(ioaddr)) {
                netif_carrier_on(dev);
-               printk(KERN_INFO PFX "%s: link up\n", dev->name);
-       } else
+               if (netif_msg_ifup(tp))
+                       printk(KERN_INFO PFX "%s: link up\n", dev->name);
+       } else {
+               if (netif_msg_ifdown(tp))
+                       printk(KERN_INFO PFX "%s: link down\n", dev->name);
                netif_carrier_off(dev);
+       }
        spin_unlock_irqrestore(&tp->lock, flags);
 }
 
@@ -569,7 +597,7 @@ static void rtl8169_link_option(int idx, u8 *autoneg, u16 *speed, u8 *duplex)
        
        option = ((idx < MAX_UNITS) && (idx >= 0)) ? media[idx] : 0xff;
 
-       if ((option != 0xff) && !idx)
+       if ((option != 0xff) && !idx && netif_msg_drv(&debug))
                printk(KERN_WARNING PFX "media option is deprecated.\n");
 
        for (p = link_settings; p->media != 0xff; p++) {
@@ -611,9 +639,11 @@ static int rtl8169_set_speed_tbi(struct net_device *dev,
        } else if (autoneg == AUTONEG_ENABLE)
                RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
        else {
-               printk(KERN_WARNING PFX
-                      "%s: incorrect speed setting refused in TBI mode\n",
-                      dev->name);
+               if (netif_msg_link(tp)) {
+                       printk(KERN_WARNING "%s: "
+                              "incorrect speed setting refused in TBI mode\n",
+                              dev->name);
+               }
                ret = -EOPNOTSUPP;
        }
 
@@ -871,12 +901,120 @@ static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
         spin_unlock_irqrestore(&tp->lock, flags);
 }
 
+static u32 rtl8169_get_msglevel(struct net_device *dev)
+{
+       struct rtl8169_private *tp = netdev_priv(dev);
+
+       return tp->msg_enable;
+}
+
+static void rtl8169_set_msglevel(struct net_device *dev, u32 value)
+{
+       struct rtl8169_private *tp = netdev_priv(dev);
+
+       tp->msg_enable = value;
+}
+
+static const char rtl8169_gstrings[][ETH_GSTRING_LEN] = {
+       "tx_packets",
+       "rx_packets",
+       "tx_errors",
+       "rx_errors",
+       "rx_missed",
+       "align_errors",
+       "tx_single_collisions",
+       "tx_multi_collisions",
+       "unicast",
+       "broadcast",
+       "multicast",
+       "tx_aborted",
+       "tx_underrun",
+};
+
+struct rtl8169_counters {
+       u64     tx_packets;
+       u64     rx_packets;
+       u64     tx_errors;
+       u32     rx_errors;
+       u16     rx_missed;
+       u16     align_errors;
+       u32     tx_one_collision;
+       u32     tx_multi_collision;
+       u64     rx_unicast;
+       u64     rx_broadcast;
+       u32     rx_multicast;
+       u16     tx_aborted;
+       u16     tx_underun;
+};
+
+static int rtl8169_get_stats_count(struct net_device *dev)
+{
+       return ARRAY_SIZE(rtl8169_gstrings);
+}
+
+static void rtl8169_get_ethtool_stats(struct net_device *dev,
+                                     struct ethtool_stats *stats, u64 *data)
+{
+       struct rtl8169_private *tp = netdev_priv(dev);
+       void __iomem *ioaddr = tp->mmio_addr;
+       struct rtl8169_counters *counters;
+       dma_addr_t paddr;
+       u32 cmd;
+
+       ASSERT_RTNL();
+
+       counters = pci_alloc_consistent(tp->pci_dev, sizeof(*counters), &paddr);
+       if (!counters)
+               return;
+
+       RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
+       cmd = (u64)paddr & DMA_32BIT_MASK;
+       RTL_W32(CounterAddrLow, cmd);
+       RTL_W32(CounterAddrLow, cmd | CounterDump);
+
+       while (RTL_R32(CounterAddrLow) & CounterDump) {
+               if (msleep_interruptible(1))
+                       break;
+       }
+
+       RTL_W32(CounterAddrLow, 0);
+       RTL_W32(CounterAddrHigh, 0);
+
+       data[0] = le64_to_cpu(counters->tx_packets);
+       data[1] = le64_to_cpu(counters->rx_packets);
+       data[2] = le64_to_cpu(counters->tx_errors);
+       data[3] = le32_to_cpu(counters->rx_errors);
+       data[4] = le16_to_cpu(counters->rx_missed);
+       data[5] = le16_to_cpu(counters->align_errors);
+       data[6] = le32_to_cpu(counters->tx_one_collision);
+       data[7] = le32_to_cpu(counters->tx_multi_collision);
+       data[8] = le64_to_cpu(counters->rx_unicast);
+       data[9] = le64_to_cpu(counters->rx_broadcast);
+       data[10] = le32_to_cpu(counters->rx_multicast);
+       data[11] = le16_to_cpu(counters->tx_aborted);
+       data[12] = le16_to_cpu(counters->tx_underun);
+
+       pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr);
+}
+
+static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
+{
+       switch(stringset) {
+       case ETH_SS_STATS:
+               memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
+               break;
+       }
+}
+
+
 static struct ethtool_ops rtl8169_ethtool_ops = {
        .get_drvinfo            = rtl8169_get_drvinfo,
        .get_regs_len           = rtl8169_get_regs_len,
        .get_link               = ethtool_op_get_link,
        .get_settings           = rtl8169_get_settings,
        .set_settings           = rtl8169_set_settings,
+       .get_msglevel           = rtl8169_get_msglevel,
+       .set_msglevel           = rtl8169_set_msglevel,
        .get_rx_csum            = rtl8169_get_rx_csum,
        .set_rx_csum            = rtl8169_set_rx_csum,
        .get_tx_csum            = ethtool_op_get_tx_csum,
@@ -886,6 +1024,9 @@ static struct ethtool_ops rtl8169_ethtool_ops = {
        .get_tso                = ethtool_op_get_tso,
        .set_tso                = ethtool_op_set_tso,
        .get_regs               = rtl8169_get_regs,
+       .get_strings            = rtl8169_get_strings,
+       .get_stats_count        = rtl8169_get_stats_count,
+       .get_ethtool_stats      = rtl8169_get_ethtool_stats,
 };
 
 static void rtl8169_write_gmii_reg_bit(void __iomem *ioaddr, int reg, int bitnum,
@@ -1091,7 +1232,8 @@ static void rtl8169_phy_timer(unsigned long __opaque)
        if (tp->link_ok(ioaddr))
                goto out_unlock;
 
-       printk(KERN_WARNING PFX "%s: PHY reset until link up\n", dev->name);
+       if (netif_msg_link(tp))
+               printk(KERN_WARNING "%s: PHY reset until link up\n", dev->name);
 
        tp->phy_reset_enable(ioaddr);
 
@@ -1169,18 +1311,23 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out,
        /* dev zeroed in alloc_etherdev */
        dev = alloc_etherdev(sizeof (*tp));
        if (dev == NULL) {
-               printk(KERN_ERR PFX "unable to alloc new ethernet\n");
+               if (netif_msg_drv(&debug))
+                       printk(KERN_ERR PFX "unable to alloc new ethernet\n");
                goto err_out;
        }
 
        SET_MODULE_OWNER(dev);
        SET_NETDEV_DEV(dev, &pdev->dev);
        tp = netdev_priv(dev);
+       tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
 
        /* enable device (incl. PCI PM wakeup and hotplug setup) */
        rc = pci_enable_device(pdev);
-       if (rc) {
-               printk(KERN_ERR PFX "%s: enable failure\n", pci_name(pdev));
+       if (rc < 0) {
+               if (netif_msg_probe(tp)) {
+                       printk(KERN_ERR PFX "%s: enable failure\n",
+                              pci_name(pdev));
+               }
                goto err_out_free_dev;
        }
 
@@ -1196,29 +1343,39 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out,
                pci_read_config_word(pdev, pm_cap + PCI_PM_CTRL, &pwr_command);
                acpi_idle_state = pwr_command & PCI_PM_CTRL_STATE_MASK;
        } else {
-               printk(KERN_ERR PFX
-                      "Cannot find PowerManagement capability, aborting.\n");
+               if (netif_msg_probe(tp)) {
+                       printk(KERN_ERR PFX
+                              "Cannot find PowerManagement capability. "
+                              "Aborting.\n");
+               }
                goto err_out_mwi;
        }
 
        /* make sure PCI base addr 1 is MMIO */
        if (!(pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) {
-               printk(KERN_ERR PFX
-                      "region #1 not an MMIO resource, aborting\n");
+               if (netif_msg_probe(tp)) {
+                       printk(KERN_ERR PFX
+                              "region #1 not an MMIO resource, aborting\n");
+               }
                rc = -ENODEV;
                goto err_out_mwi;
        }
        /* check for weird/broken PCI region reporting */
        if (pci_resource_len(pdev, 1) < R8169_REGS_SIZE) {
-               printk(KERN_ERR PFX "Invalid PCI region size(s), aborting\n");
+               if (netif_msg_probe(tp)) {
+                       printk(KERN_ERR PFX
+                              "Invalid PCI region size(s), aborting\n");
+               }
                rc = -ENODEV;
                goto err_out_mwi;
        }
 
        rc = pci_request_regions(pdev, MODULENAME);
-       if (rc) {
-               printk(KERN_ERR PFX "%s: could not request regions.\n",
-                      pci_name(pdev));
+       if (rc < 0) {
+               if (netif_msg_probe(tp)) {
+                       printk(KERN_ERR PFX "%s: could not request regions.\n",
+                              pci_name(pdev));
+               }
                goto err_out_mwi;
        }
 
@@ -1231,7 +1388,10 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out,
        } else {
                rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
                if (rc < 0) {
-                       printk(KERN_ERR PFX "DMA configuration failed.\n");
+                       if (netif_msg_probe(tp)) {
+                               printk(KERN_ERR PFX
+                                      "DMA configuration failed.\n");
+                       }
                        goto err_out_free_res;
                }
        }
@@ -1241,7 +1401,8 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out,
        /* ioremap MMIO region */
        ioaddr = ioremap(pci_resource_start(pdev, 1), R8169_REGS_SIZE);
        if (ioaddr == NULL) {
-               printk(KERN_ERR PFX "cannot remap MMIO, aborting\n");
+               if (netif_msg_probe(tp))
+                       printk(KERN_ERR PFX "cannot remap MMIO, aborting\n");
                rc = -EIO;
                goto err_out_free_res;
        }
@@ -1272,9 +1433,11 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out,
        }
        if (i < 0) {
                /* Unknown chip: assume array element #0, original RTL-8169 */
-               printk(KERN_DEBUG PFX
-                      "PCI device %s: unknown chip version, assuming %s\n",
-                      pci_name(pdev), rtl_chip_info[0].name);
+               if (netif_msg_probe(tp)) {
+                       printk(KERN_DEBUG PFX "PCI device %s: "
+                              "unknown chip version, assuming %s\n",
+                              pci_name(pdev), rtl_chip_info[0].name);
+               }
                i++;
        }
        tp->chipset = i;
@@ -1308,7 +1471,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        struct rtl8169_private *tp;
        void __iomem *ioaddr = NULL;
        static int board_idx = -1;
-       static int printed_version = 0;
        u8 autoneg, duplex;
        u16 speed;
        int i, rc;
@@ -1318,10 +1480,9 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        board_idx++;
 
-       if (!printed_version) {
+       if (netif_msg_drv(&debug)) {
                printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
                       MODULENAME, RTL8169_VERSION);
-               printed_version = 1;
        }
 
        rc = rtl8169_init_board(pdev, &dev, &ioaddr);
@@ -1366,7 +1527,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 #ifdef CONFIG_R8169_NAPI
        dev->poll = rtl8169_poll;
        dev->weight = R8169_NAPI_WEIGHT;
-       printk(KERN_INFO PFX "NAPI enabled\n");
 #endif
 
 #ifdef CONFIG_R8169_VLAN
@@ -1391,20 +1551,24 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                return rc;
        }
 
-       printk(KERN_DEBUG "%s: Identified chip type is '%s'.\n", dev->name,
-              rtl_chip_info[tp->chipset].name);
+       if (netif_msg_probe(tp)) {
+               printk(KERN_DEBUG "%s: Identified chip type is '%s'.\n",
+                      dev->name, rtl_chip_info[tp->chipset].name);
+       }
 
        pci_set_drvdata(pdev, dev);
 
-       printk(KERN_INFO "%s: %s at 0x%lx, "
-              "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
-              "IRQ %d\n",
-              dev->name,
-              rtl_chip_info[ent->driver_data].name,
-              dev->base_addr,
-              dev->dev_addr[0], dev->dev_addr[1],
-              dev->dev_addr[2], dev->dev_addr[3],
-              dev->dev_addr[4], dev->dev_addr[5], dev->irq);
+       if (netif_msg_probe(tp)) {
+               printk(KERN_INFO "%s: %s at 0x%lx, "
+                      "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
+                      "IRQ %d\n",
+                      dev->name,
+                      rtl_chip_info[ent->driver_data].name,
+                      dev->base_addr,
+                      dev->dev_addr[0], dev->dev_addr[1],
+                      dev->dev_addr[2], dev->dev_addr[3],
+                      dev->dev_addr[4], dev->dev_addr[5], dev->irq);
+       }
 
        rtl8169_hw_phy_config(dev);
 
@@ -1427,7 +1591,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        rtl8169_set_speed(dev, autoneg, speed, duplex);
        
-       if (RTL_R8(PHYstatus) & TBI_Enable)
+       if ((RTL_R8(PHYstatus) & TBI_Enable) && netif_msg_link(tp))
                printk(KERN_INFO PFX "%s: TBI auto-negotiating\n", dev->name);
 
        return 0;
@@ -1585,8 +1749,8 @@ rtl8169_hw_start(struct net_device *dev)
        RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
        RTL_W8(EarlyTxThres, EarlyTxThld);
 
-       /* For gigabit rtl8169, MTU + header + CRC + VLAN */
-       RTL_W16(RxMaxSize, tp->rx_buf_sz);
+       /* Low hurts. Let's disable the filtering. */
+       RTL_W16(RxMaxSize, 16383);
 
        /* Set Rx Config register */
        i = rtl8169_rx_config |
@@ -1860,8 +2024,13 @@ static void rtl8169_reinit_task(void *_data)
        ret = rtl8169_open(dev);
        if (unlikely(ret < 0)) {
                if (net_ratelimit()) {
-                       printk(PFX KERN_ERR "%s: reinit failure (status = %d)."
-                              " Rescheduling.\n", dev->name, ret);
+                       struct rtl8169_private *tp = netdev_priv(dev);
+
+                       if (netif_msg_drv(tp)) {
+                               printk(PFX KERN_ERR
+                                      "%s: reinit failure (status = %d)."
+                                      " Rescheduling.\n", dev->name, ret);
+                       }
                }
                rtl8169_schedule_work(dev, rtl8169_reinit_task);
        }
@@ -1886,8 +2055,12 @@ static void rtl8169_reset_task(void *_data)
                netif_wake_queue(dev);
        } else {
                if (net_ratelimit()) {
-                       printk(PFX KERN_EMERG "%s: Rx buffers shortage\n",
-                              dev->name);
+                       struct rtl8169_private *tp = netdev_priv(dev);
+
+                       if (netif_msg_intr(tp)) {
+                               printk(PFX KERN_EMERG
+                                      "%s: Rx buffers shortage\n", dev->name);
+                       }
                }
                rtl8169_schedule_work(dev, rtl8169_reset_task);
        }
@@ -1973,8 +2146,11 @@ static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev)
        int ret = 0;
        
        if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
-               printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n",
-                      dev->name);
+               if (netif_msg_drv(tp)) {
+                       printk(KERN_ERR
+                              "%s: BUG! Tx Ring full when queue awake!\n",
+                              dev->name);
+               }
                goto err_stop;
        }
 
@@ -2049,8 +2225,11 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev)
        pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
        pci_read_config_word(pdev, PCI_STATUS, &pci_status);
 
-       printk(KERN_ERR PFX "%s: PCI error (cmd = 0x%04x, status = 0x%04x).\n",
-              dev->name, pci_cmd, pci_status);
+       if (netif_msg_intr(tp)) {
+               printk(KERN_ERR
+                      "%s: PCI error (cmd = 0x%04x, status = 0x%04x).\n",
+                      dev->name, pci_cmd, pci_status);
+       }
 
        /*
         * The recovery sequence below admits a very elaborated explanation:
@@ -2069,7 +2248,8 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev)
 
        /* The infamous DAC f*ckup only happens at boot time */
        if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) {
-               printk(KERN_INFO PFX "%s: disabling PCI DAC.\n", dev->name);
+               if (netif_msg_intr(tp))
+                       printk(KERN_INFO "%s: disabling PCI DAC.\n", dev->name);
                tp->cp_cmd &= ~PCIDAC;
                RTL_W16(CPlusCmd, tp->cp_cmd);
                dev->features &= ~NETIF_F_HIGHDMA;
@@ -2127,6 +2307,11 @@ rtl8169_tx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
        }
 }
 
+static inline int rtl8169_fragmented_frame(u32 status)
+{
+       return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
+}
+
 static inline void rtl8169_rx_csum(struct sk_buff *skb, struct RxDesc *desc)
 {
        u32 opts1 = le32_to_cpu(desc->opts1);
@@ -2175,29 +2360,46 @@ rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
        rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
        rx_left = rtl8169_rx_quota(rx_left, (u32) dev->quota);
 
-       while (rx_left > 0) {
+       for (; rx_left > 0; rx_left--, cur_rx++) {
                unsigned int entry = cur_rx % NUM_RX_DESC;
+               struct RxDesc *desc = tp->RxDescArray + entry;
                u32 status;
 
                rmb();
-               status = le32_to_cpu(tp->RxDescArray[entry].opts1);
+               status = le32_to_cpu(desc->opts1);
 
                if (status & DescOwn)
                        break;
-               if (status & RxRES) {
-                       printk(KERN_INFO "%s: Rx ERROR!!!\n", dev->name);
+               if (unlikely(status & RxRES)) {
+                       if (netif_msg_rx_err(tp)) {
+                               printk(KERN_INFO
+                                      "%s: Rx ERROR. status = %08x\n",
+                                      dev->name, status);
+                       }
                        tp->stats.rx_errors++;
                        if (status & (RxRWT | RxRUNT))
                                tp->stats.rx_length_errors++;
                        if (status & RxCRC)
                                tp->stats.rx_crc_errors++;
+                       rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
                } else {
-                       struct RxDesc *desc = tp->RxDescArray + entry;
                        struct sk_buff *skb = tp->Rx_skbuff[entry];
                        int pkt_size = (status & 0x00001FFF) - 4;
                        void (*pci_action)(struct pci_dev *, dma_addr_t,
                                size_t, int) = pci_dma_sync_single_for_device;
 
+                       /*
+                        * The driver does not support incoming fragmented
+                        * frames. They are seen as a symptom of over-mtu
+                        * sized frames.
+                        */
+                       if (unlikely(rtl8169_fragmented_frame(status))) {
+                               tp->stats.rx_dropped++;
+                               tp->stats.rx_length_errors++;
+                               rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
+                               continue;
+                       }
+
                        rtl8169_rx_csum(skb, desc);
                        
                        pci_dma_sync_single_for_cpu(tp->pci_dev,
@@ -2224,16 +2426,13 @@ rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
                        tp->stats.rx_bytes += pkt_size;
                        tp->stats.rx_packets++;
                }
-               
-               cur_rx++; 
-               rx_left--;
        }
 
        count = cur_rx - tp->cur_rx;
        tp->cur_rx = cur_rx;
 
        delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx);
-       if (!delta && count)
+       if (!delta && count && netif_msg_intr(tp))
                printk(KERN_INFO "%s: no Rx buffer allocated\n", dev->name);
        tp->dirty_rx += delta;
 
@@ -2244,7 +2443,7 @@ rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
         *   after refill ?
         * - how do others driver handle this condition (Uh oh...).
         */
-       if (tp->dirty_rx + NUM_RX_DESC == tp->cur_rx)
+       if ((tp->dirty_rx + NUM_RX_DESC == tp->cur_rx) && netif_msg_intr(tp))
                printk(KERN_EMERG "%s: Rx buffers exhausted\n", dev->name);
 
        return count;
@@ -2296,7 +2495,7 @@ rtl8169_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
 
                if (likely(netif_rx_schedule_prep(dev)))
                        __netif_rx_schedule(dev);
-               else {
+               else if (netif_msg_intr(tp)) {
                        printk(KERN_INFO "%s: interrupt %04x taken in poll\n",
                               dev->name, status);      
                }
@@ -2315,8 +2514,10 @@ rtl8169_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
        } while (boguscnt > 0);
 
        if (boguscnt <= 0) {
-               printk(KERN_WARNING "%s: Too much work at interrupt!\n",
-                      dev->name);
+               if (net_ratelimit() && netif_msg_intr(tp)) {
+                       printk(KERN_WARNING
+                              "%s: Too much work at interrupt!\n", dev->name);
+               }
                /* Clear all interrupt sources. */
                RTL_W16(IntrStatus, 0xffff);
        }
@@ -2439,8 +2640,10 @@ rtl8169_set_rx_mode(struct net_device *dev)
 
        if (dev->flags & IFF_PROMISC) {
                /* Unconditionally log net taps. */
-               printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n",
-                      dev->name);
+               if (netif_msg_link(tp)) {
+                       printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n",
+                              dev->name);
+               }
                rx_mode =
                    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
                    AcceptAllPhys;
index e68cf5fb4920fe70bfbcfb5c43680af523f7e24a..20edeb3457921e5377c68a6e7d69681682fca135 100644 (file)
@@ -100,35 +100,8 @@ static int sh_debug;               /* Debug flag */
 
 #define SHAPER_BANNER  "CymruNet Traffic Shaper BETA 0.04 for Linux 2.1\n"
 
-/*
- *     Locking
- */
-static int shaper_lock(struct shaper *sh)
-{
-       /*
-        *      Lock in an interrupt must fail
-        */
-       while (test_and_set_bit(0, &sh->locked))
-       {
-               if (!in_interrupt())
-                       sleep_on(&sh->wait_queue);
-               else
-                       return 0;
-                       
-       }
-       return 1;
-}
-
 static void shaper_kick(struct shaper *sh);
 
-static void shaper_unlock(struct shaper *sh)
-{
-       clear_bit(0, &sh->locked);
-       wake_up(&sh->wait_queue);
-       shaper_kick(sh);
-}
-
 /*
  *     Compute clocks on a buffer
  */
@@ -157,17 +130,15 @@ static void shaper_setspeed(struct shaper *shaper, int bitspersec)
  *     Throw a frame at a shaper.
  */
   
-static int shaper_qframe(struct shaper *shaper, struct sk_buff *skb)
+
+static int shaper_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
+       struct shaper *shaper = dev->priv;
        struct sk_buff *ptr;
    
-       /*
-        *      Get ready to work on this shaper. Lock may fail if its
-        *      an interrupt and locked.
-        */
-        
-       if(!shaper_lock(shaper))
-               return -1;
+       if (down_trylock(&shaper->sem))
+               return -1;
+
        ptr=shaper->sendq.prev;
        
        /*
@@ -260,7 +231,8 @@ static int shaper_qframe(struct shaper *shaper, struct sk_buff *skb)
                 dev_kfree_skb(ptr);
                 shaper->stats.collisions++;
        }
-       shaper_unlock(shaper);
+       shaper_kick(shaper);
+       up(&shaper->sem);
        return 0;
 }
 
@@ -297,8 +269,13 @@ static void shaper_queue_xmit(struct shaper *shaper, struct sk_buff *skb)
  
 static void shaper_timer(unsigned long data)
 {
-       struct shaper *sh=(struct shaper *)data;
-       shaper_kick(sh);
+       struct shaper *shaper = (struct shaper *)data;
+
+       if (!down_trylock(&shaper->sem)) {
+               shaper_kick(shaper);
+               up(&shaper->sem);
+       } else
+               mod_timer(&shaper->timer, jiffies);
 }
 
 /*
@@ -310,19 +287,6 @@ static void shaper_kick(struct shaper *shaper)
 {
        struct sk_buff *skb;
        
-       /*
-        *      Shaper unlock will kick
-        */
-        
-       if (test_and_set_bit(0, &shaper->locked))
-       {
-               if(sh_debug)
-                       printk("Shaper locked.\n");
-               mod_timer(&shaper->timer, jiffies);
-               return;
-       }
-
-               
        /*
         *      Walk the list (may be empty)
         */
@@ -364,8 +328,6 @@ static void shaper_kick(struct shaper *shaper)
         
        if(skb!=NULL)
                mod_timer(&shaper->timer, SHAPERCB(skb)->shapeclock);
-
-       clear_bit(0, &shaper->locked);
 }
 
 
@@ -376,14 +338,12 @@ static void shaper_kick(struct shaper *shaper)
 static void shaper_flush(struct shaper *shaper)
 {
        struct sk_buff *skb;
-       if(!shaper_lock(shaper))
-       {
-               printk(KERN_ERR "shaper: shaper_flush() called by an irq!\n");
-               return;
-       }
+
+       down(&shaper->sem);
        while((skb=skb_dequeue(&shaper->sendq))!=NULL)
                dev_kfree_skb(skb);
-       shaper_unlock(shaper);
+       shaper_kick(shaper);
+       up(&shaper->sem);
 }
 
 /*
@@ -426,13 +386,6 @@ static int shaper_close(struct net_device *dev)
  *     ARP and other resolutions and not before.
  */
 
-
-static int shaper_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-       struct shaper *sh=dev->priv;
-       return shaper_qframe(sh, skb);
-}
-
 static struct net_device_stats *shaper_get_stats(struct net_device *dev)
 {
        struct shaper *sh=dev->priv;
@@ -623,7 +576,6 @@ static void shaper_init_priv(struct net_device *dev)
        init_timer(&sh->timer);
        sh->timer.function=shaper_timer;
        sh->timer.data=(unsigned long)sh;
-       init_waitqueue_head(&sh->wait_queue);
 }
 
 /*
index 3e9d9aab05887dc1a12e45fc27879fd0b3a985cd..3107aed0fb51958b01f7a860adc8d1771159adfc 100644 (file)
@@ -162,6 +162,7 @@ struct sis900_private {
        struct mii_phy * mii;
        struct mii_phy * first_mii; /* record the first mii structure */
        unsigned int cur_phy;
+       struct mii_if_info mii_info;
 
        struct timer_list timer; /* Link status detection timer. */
        u8 autong_complete; /* 1: auto-negotiate complete  */
@@ -203,7 +204,7 @@ static int sis900_open(struct net_device *net_dev);
 static int sis900_mii_probe (struct net_device * net_dev);
 static void sis900_init_rxfilter (struct net_device * net_dev);
 static u16 read_eeprom(long ioaddr, int location);
-static u16 mdio_read(struct net_device *net_dev, int phy_id, int location);
+static int mdio_read(struct net_device *net_dev, int phy_id, int location);
 static void mdio_write(struct net_device *net_dev, int phy_id, int location, int val);
 static void sis900_timer(unsigned long data);
 static void sis900_check_mode (struct net_device *net_dev, struct mii_phy *mii_phy);
@@ -478,7 +479,13 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev,
                sis_priv->msg_enable = sis900_debug;
        else
                sis_priv->msg_enable = SIS900_DEF_MSG;
-               
+
+       sis_priv->mii_info.dev = net_dev;
+       sis_priv->mii_info.mdio_read = mdio_read;
+       sis_priv->mii_info.mdio_write = mdio_write;
+       sis_priv->mii_info.phy_id_mask = 0x1f;
+       sis_priv->mii_info.reg_num_mask = 0x1f;
+
        /* Get Mac address according to the chip revision */
        pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &(sis_priv->chipset_rev));
        if(netif_msg_probe(sis_priv))
@@ -725,6 +732,8 @@ static u16 sis900_default_phy(struct net_device * net_dev)
                       pci_name(sis_priv->pci_dev), sis_priv->cur_phy);
        }
        
+       sis_priv->mii_info.phy_id = sis_priv->cur_phy;
+
        status = mdio_read(net_dev, sis_priv->cur_phy, MII_CONTROL);
        status &= (~MII_CNTL_ISOLATE);
 
@@ -852,7 +861,7 @@ static void mdio_reset(long mdio_addr)
  *     Please see SiS7014 or ICS spec
  */
 
-static u16 mdio_read(struct net_device *net_dev, int phy_id, int location)
+static int mdio_read(struct net_device *net_dev, int phy_id, int location)
 {
        long mdio_addr = net_dev->base_addr + mear;
        int mii_cmd = MIIread|(phy_id<<MIIpmdShift)|(location<<MIIregShift);
@@ -1966,10 +1975,47 @@ static void sis900_set_msglevel(struct net_device *net_dev, u32 value)
        sis_priv->msg_enable = value;
 }
 
+static u32 sis900_get_link(struct net_device *net_dev)
+{
+       struct sis900_private *sis_priv = net_dev->priv;
+       return mii_link_ok(&sis_priv->mii_info);
+}
+
+static int sis900_get_settings(struct net_device *net_dev,
+                               struct ethtool_cmd *cmd)
+{
+       struct sis900_private *sis_priv = net_dev->priv;
+       spin_lock_irq(&sis_priv->lock);
+       mii_ethtool_gset(&sis_priv->mii_info, cmd);
+       spin_unlock_irq(&sis_priv->lock);
+       return 0;
+}
+
+static int sis900_set_settings(struct net_device *net_dev,
+                               struct ethtool_cmd *cmd)
+{
+       struct sis900_private *sis_priv = net_dev->priv;
+       int rt;
+       spin_lock_irq(&sis_priv->lock);
+       rt = mii_ethtool_sset(&sis_priv->mii_info, cmd);
+       spin_unlock_irq(&sis_priv->lock);
+       return rt;
+}
+
+static int sis900_nway_reset(struct net_device *net_dev)
+{
+       struct sis900_private *sis_priv = net_dev->priv;
+       return mii_nway_restart(&sis_priv->mii_info);
+}
+
 static struct ethtool_ops sis900_ethtool_ops = {
        .get_drvinfo    = sis900_get_drvinfo,
        .get_msglevel   = sis900_get_msglevel,
        .set_msglevel   = sis900_set_msglevel,
+       .get_link       = sis900_get_link,
+       .get_settings   = sis900_get_settings,
+       .set_settings   = sis900_set_settings,
+       .nway_reset     = sis900_nway_reset,
 };
 
 /**
index 05b827f79f54a247232dc4280bebd12930595a28..1ccb2989001c4a46dcf28fbacfb06f320389089d 100644 (file)
@@ -4212,7 +4212,7 @@ SK_BOOL           DualNet;
                        Flags);
 
                SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_HARD_RST);
-               pAC->dev[Param.Para32[0]]->flags &= ~IFF_RUNNING;
+               netif_carrier_off(pAC->dev[Param.Para32[0]]);
                spin_unlock_irqrestore(
                        &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
                        Flags);
@@ -4355,7 +4355,7 @@ SK_BOOL           DualNet;
                }
 
                /* Inform the world that link protocol is up. */
-               pAC->dev[Param.Para32[0]]->flags |= IFF_RUNNING;
+               netif_carrier_on(pAC->dev[Param.Para32[0]]);
 
                break;
        case SK_DRV_NET_DOWN:    /* SK_U32 Reason */
@@ -4368,7 +4368,7 @@ SK_BOOL           DualNet;
                } else {
                        DoPrintInterfaceChange = SK_TRUE;
                }
-               pAC->dev[Param.Para32[1]]->flags &= ~IFF_RUNNING;
+               netif_carrier_off(pAC->dev[Param.Para32[1]]);
                break;
        case SK_DRV_SWITCH_HARD: /* SK_U32 FromPortIdx SK_U32 ToPortIdx */
                SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
@@ -4961,7 +4961,6 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
 #ifdef CONFIG_NET_POLL_CONTROLLER
        dev->poll_controller =  &SkGePollController;
 #endif
-       dev->flags &=           ~IFF_RUNNING;
        SET_NETDEV_DEV(dev, &pdev->dev);
        SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps);
 
@@ -5035,7 +5034,6 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
                dev->set_mac_address    = &SkGeSetMacAddr;
                dev->do_ioctl           = &SkGeIoctl;
                dev->change_mtu         = &SkGeChangeMtu;
-               dev->flags             &= ~IFF_RUNNING;
                SET_NETDEV_DEV(dev, &pdev->dev);
                SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps);
 
diff --git a/drivers/net/sk_g16.c b/drivers/net/sk_g16.c
deleted file mode 100644 (file)
index 134ae0e..0000000
+++ /dev/null
@@ -1,2066 +0,0 @@
-/*-
- * Copyright (C) 1994 by PJD Weichmann & SWS Bern, Switzerland
- *
- * This software may be used and distributed according to the terms
- * of the GNU General Public License, incorporated herein by reference.
- *
- * Module         : sk_g16.c
- *
- * Version        : $Revision: 1.1 $
- *
- * Author         : Patrick J.D. Weichmann
- *
- * Date Created   : 94/05/26
- * Last Updated   : $Date: 1994/06/30 16:25:15 $
- *
- * Description    : Schneider & Koch G16 Ethernet Device Driver for
- *                  Linux Kernel >= 1.1.22
- * Update History :
- *                  Paul Gortmaker, 03/97: Fix for v2.1.x to use read{b,w}
- *                  write{b,w} and memcpy -> memcpy_{to,from}io
- *
- *                 Jeff Garzik, 06/2000, Modularize
- *
--*/
-
-static const char rcsid[] = "$Id: sk_g16.c,v 1.1 1994/06/30 16:25:15 root Exp $";
-
-/*
- * The Schneider & Koch (SK) G16 Network device driver is based
- * on the 'ni6510' driver from Michael Hipp which can be found at
- * ftp://sunsite.unc.edu/pub/Linux/system/Network/drivers/nidrivers.tar.gz
- * 
- * Sources: 1) ni6510.c by M. Hipp
- *          2) depca.c  by D.C. Davies
- *          3) skeleton.c by D. Becker
- *          4) Am7990 Local Area Network Controller for Ethernet (LANCE),
- *             AMD, Pub. #05698, June 1989
- *
- * Many Thanks for helping me to get things working to: 
- *                 
- *                 A. Cox (A.Cox@swansea.ac.uk)
- *                 M. Hipp (mhipp@student.uni-tuebingen.de)
- *                 R. Bolz (Schneider & Koch, Germany)
- *
- * To Do: 
- *        - Support of SK_G8 and other SK Network Cards.
- *        - Autoset memory mapped RAM. Check for free memory and then
- *          configure RAM correctly. 
- *        - SK_close should really set card in to initial state.
- *        - Test if IRQ 3 is not switched off. Use autoirq() functionality.
- *          (as in /drivers/net/skeleton.c)
- *        - Implement Multicast addressing. At minimum something like
- *          in depca.c. 
- *        - Redo the statistics part.
- *        - Try to find out if the board is in 8 Bit or 16 Bit slot.
- *          If in 8 Bit mode don't use IRQ 11.
- *        - (Try to make it slightly faster.) 
- *       - Power management support
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/fcntl.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/slab.h>
-#include <linux/string.h> 
-#include <linux/delay.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/spinlock.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/bitops.h>
-
-#include <asm/system.h>
-#include <asm/io.h>
-
-#include "sk_g16.h"
-
-/* 
- * Schneider & Koch Card Definitions 
- * =================================
- */  
-
-#define SK_NAME   "SK_G16"
-
-/*
- * SK_G16 Configuration
- * --------------------
- */ 
-
-/* 
- * Abbreviations
- * -------------
- *  
- * RAM - used for the 16KB shared memory 
- * Boot_ROM, ROM - are used for referencing the BootEPROM
- *
- * SK_BOOT_ROM and SK_ADDR are symbolic constants used to configure
- * the behaviour of the driver and the SK_G16.
- *
- * ! See sk_g16.install on how to install and configure the driver !   
- *
- * SK_BOOT_ROM defines if the Boot_ROM should be switched off or not.
- *
- * SK_ADDR defines the address where the RAM will be mapped into the real
- *         host memory.
- *         valid addresses are from 0xa0000 to 0xfc000 in 16Kbyte steps.
- */  
-#define SK_BOOT_ROM     1              /* 1=BootROM on 0=off */
-
-#define SK_ADDR         0xcc000
-
-/* 
- * In POS3 are bits A14-A19 of the address bus. These bits can be set
- * to choose the RAM address. That's why we only can choose the RAM address
- * in 16KB steps.
- */
-
-#define POS_ADDR       (rom_addr>>14)  /* Do not change this line */
-
-/* 
- * SK_G16 I/O PORT's + IRQ's + Boot_ROM locations
- * ----------------------------------------------
- */
-
-/* 
- * As nearly every card has also SK_G16 a specified I/O Port region and
- * only a few possible IRQ's.
- * In the Installation Guide from Schneider & Koch is listed a possible
- * Interrupt IRQ2. IRQ2 is always IRQ9 in boards with two cascaded interrupt
- * controllers. So we use in SK_IRQS IRQ9.
- */
-
-/* Don't touch any of the following #defines. */
-
-#define SK_IO_PORTS     { 0x100, 0x180, 0x208, 0x220, 0x288, 0x320, 0x328, 0x390, 0 }
-
-#define SK_IRQS         { 3, 5, 9, 11, 0 }
-
-#define SK_BOOT_ROM_LOCATIONS { 0xc0000, 0xc4000, 0xc8000, 0xcc000, 0xd0000, 0xd4000, 0xd8000, 0xdc000, 0 }
-
-#define SK_BOOT_ROM_ID  { 0x55, 0xaa, 0x10, 0x50, 0x06, 0x33 }
-
-/* 
- * SK_G16 POS REGISTERS 
- * --------------------
- */
-
-/*
- * SK_G16 has a Programmable Option Select (POS) Register.
- * The POS is composed of 8 separate registers (POS0-7) which 
- * are I/O mapped on an address set by the W1 switch.                    
- *
- */
-
-#define SK_POS_SIZE 8           /* 8 I/O Ports are used by SK_G16 */
-
-#define SK_POS0     ioaddr      /* Card-ID Low (R) */
-#define SK_POS1     ioaddr+1    /* Card-ID High (R) */
-#define SK_POS2     ioaddr+2    /* Card-Enable, Boot-ROM Disable (RW) */
-#define SK_POS3     ioaddr+3    /* Base address of RAM */
-#define SK_POS4     ioaddr+4    /* IRQ */
-
-/* POS5 - POS7 are unused */
-
-/* 
- * SK_G16 MAC PREFIX 
- * -----------------
- */
-
-/* 
- * Scheider & Koch manufacturer code (00:00:a5).
- * This must be checked, that we are sure it is a SK card.
- */
-
-#define SK_MAC0         0x00
-#define SK_MAC1         0x00
-#define SK_MAC2         0x5a
-
-/* 
- * SK_G16 ID 
- * ---------
- */ 
-
-/* 
- * If POS0,POS1 contain the following ID, then we know
- * at which I/O Port Address we are. 
- */
-
-#define SK_IDLOW  0xfd 
-#define SK_IDHIGH 0x6a
-
-
-/* 
- * LANCE POS Bit definitions 
- * -------------------------
- */
-
-#define SK_ROM_RAM_ON  (POS2_CARD)
-#define SK_ROM_RAM_OFF (POS2_EPROM)
-#define SK_ROM_ON      (inb(SK_POS2) & POS2_CARD)
-#define SK_ROM_OFF     (inb(SK_POS2) | POS2_EPROM)
-#define SK_RAM_ON      (inb(SK_POS2) | POS2_CARD)
-#define SK_RAM_OFF     (inb(SK_POS2) & POS2_EPROM) 
-
-#define POS2_CARD  0x0001              /* 1 = SK_G16 on      0 = off */
-#define POS2_EPROM 0x0002              /* 1 = Boot EPROM off 0 = on */ 
-
-/* 
- * SK_G16 Memory mapped Registers
- * ------------------------------
- *
- */ 
-
-#define SK_IOREG        (&board->ioreg) /* LANCE data registers.     */ 
-#define SK_PORT         (&board->port)  /* Control, Status register  */
-#define SK_IOCOM        (&board->iocom) /* I/O Command               */
-
-/* 
- * SK_G16 Status/Control Register bits
- * -----------------------------------
- *
- * (C) Controlreg (S) Statusreg 
- */
-
-/* 
- * Register transfer: 0 = no transfer
- *                    1 = transferring data between LANCE and I/O reg 
- */
-#define SK_IORUN        0x20   
-
-/* 
- * LANCE interrupt: 0 = LANCE interrupt occurred       
- *                  1 = no LANCE interrupt occurred
- */
-#define SK_IRQ          0x10   
-                       
-#define SK_RESET        0x08   /* Reset SK_CARD: 0 = RESET 1 = normal */
-#define SK_RW           0x02   /* 0 = write to 1 = read from */
-#define SK_ADR          0x01   /* 0 = REG DataPort 1 = RAP Reg addr port */
-
-  
-#define SK_RREG         SK_RW  /* Transferdirection to read from lance */
-#define SK_WREG         0      /* Transferdirection to write to lance */
-#define SK_RAP          SK_ADR /* Destination Register RAP */
-#define SK_RDATA        0      /* Destination Register REG DataPort */
-
-/* 
- * SK_G16 I/O Command 
- * ------------------
- */
-
-/* 
- * Any bitcombination sets the internal I/O bit (transfer will start) 
- * when written to I/O Command
- */
-
-#define SK_DOIO         0x80   /* Do Transfer */ 
-/* 
- * LANCE RAP (Register Address Port). 
- * ---------------------------------
- */
-
-/*   
- * The LANCE internal registers are selected through the RAP. 
- * The Registers are:
- *
- * CSR0 - Status and Control flags 
- * CSR1 - Low order bits of initialize block (bits 15:00)
- * CSR2 - High order bits of initialize block (bits 07:00, 15:08 are reserved)
- * CSR3 - Allows redefinition of the Bus Master Interface.
- *        This register must be set to 0x0002, which means BSWAP = 0,
- *        ACON = 1, BCON = 0;
- *
- */
-#define CSR0            0x00   
-#define CSR1            0x01  
-#define CSR2            0x02 
-#define CSR3            0x03
-
-/* 
- * General Definitions 
- * ===================
- */
-
-/* 
- * Set the number of Tx and Rx buffers, using Log_2(# buffers).
- * We have 16KB RAM which can be accessed by the LANCE. In the 
- * memory are not only the buffers but also the ring descriptors and
- * the initialize block. 
- * Don't change anything unless you really know what you do.
- */
-
-#define LC_LOG_TX_BUFFERS 1               /* (2 == 2^^1) 2 Transmit buffers */
-#define LC_LOG_RX_BUFFERS 3               /* (8 == 2^^3) 8 Receive buffers */
-
-/* Descriptor ring sizes */
-
-#define TMDNUM (1 << (LC_LOG_TX_BUFFERS)) /* 2 Transmit descriptor rings */
-#define RMDNUM (1 << (LC_LOG_RX_BUFFERS)) /* 8 Receive Buffers */
-
-/* Define Mask for setting RMD, TMD length in the LANCE init_block */
-
-#define TMDNUMMASK (LC_LOG_TX_BUFFERS << 29)
-#define RMDNUMMASK (LC_LOG_RX_BUFFERS << 29)
-
-/*
- * Data Buffer size is set to maximum packet length.
- */
-
-#define PKT_BUF_SZ              1518 
-
-/* 
- * The number of low I/O ports used by the ethercard. 
- */
-
-#define ETHERCARD_TOTAL_SIZE    SK_POS_SIZE
-
-/* 
- * SK_DEBUG
- *
- * Here you can choose what level of debugging wanted.
- *
- * If SK_DEBUG and SK_DEBUG2 are undefined, then only the
- *  necessary messages will be printed.
- *
- * If SK_DEBUG is defined, there will be many debugging prints
- *  which can help to find some mistakes in configuration or even
- *  in the driver code.
- *
- * If SK_DEBUG2 is defined, many many messages will be printed 
- *  which normally you don't need. I used this to check the interrupt
- *  routine. 
- *
- * (If you define only SK_DEBUG2 then only the messages for 
- *  checking interrupts will be printed!)
- *
- * Normal way of live is: 
- *
- * For the whole thing get going let both symbolic constants
- * undefined. If you face any problems and you know what's going
- * on (you know something about the card and you can interpret some
- * hex LANCE register output) then define SK_DEBUG
- * 
- */
-
-#undef  SK_DEBUG       /* debugging */
-#undef  SK_DEBUG2      /* debugging with more verbose report */
-
-#ifdef SK_DEBUG
-#define PRINTK(x) printk x
-#else
-#define PRINTK(x) /**/
-#endif
-
-#ifdef SK_DEBUG2
-#define PRINTK2(x) printk x
-#else
-#define PRINTK2(x) /**/
-#endif
-
-/* 
- * SK_G16 RAM
- *
- * The components are memory mapped and can be set in a region from
- * 0x00000 through 0xfc000 in 16KB steps. 
- *
- * The Network components are: dual ported RAM, Prom, I/O Reg, Status-,
- * Controlregister and I/O Command.
- *
- * dual ported RAM: This is the only memory region which the LANCE chip
- *      has access to. From the Lance it is addressed from 0x0000 to
- *      0x3fbf. The host accesses it normally.
- *
- * PROM: The PROM obtains the ETHERNET-MAC-Address. It is realised as a
- *       8-Bit PROM, this means only the 16 even addresses are used of the
- *       32 Byte Address region. Access to an odd address results in invalid
- *       data.
- * 
- * LANCE I/O Reg: The I/O Reg is build of 4 single Registers, Low-Byte Write,
- *       Hi-Byte Write, Low-Byte Read, Hi-Byte Read.
- *       Transfer from or to the LANCE is always in 16Bit so Low and High
- *       registers are always relevant.
- *
- *       The Data from the Readregister is not the data in the Writeregister!!
- *       
- * Port: Status- and Controlregister. 
- *       Two different registers which share the same address, Status is 
- *       read-only, Control is write-only.
- *    
- * I/O Command: 
- *       Any bitcombination written in here starts the transmission between
- *       Host and LANCE.
- */
-
-typedef struct
-{
-       unsigned char  ram[0x3fc0];   /* 16KB dual ported ram */
-       unsigned char  rom[0x0020];   /* 32Byte PROM containing 6Byte MAC */
-       unsigned char  res1[0x0010];  /* reserved */
-       unsigned volatile short ioreg;/* LANCE I/O Register */
-       unsigned volatile char  port; /* Statusregister and Controlregister */
-       unsigned char  iocom;         /* I/O Command Register */
-} SK_RAM;
-
-/* struct  */
-
-/* 
- * This is the structure for the dual ported ram. We
- * have exactly 16 320 Bytes. In here there must be:
- *
- *     - Initialize Block   (starting at a word boundary)
- *     - Receive and Transmit Descriptor Rings (quadword boundary)
- *     - Data Buffers (arbitrary boundary)
- *
- * This is because LANCE has on SK_G16 only access to the dual ported
- * RAM and nowhere else.
- */
-
-struct SK_ram
-{
-    struct init_block ib;
-    struct tmd tmde[TMDNUM];
-    struct rmd rmde[RMDNUM];
-    char tmdbuf[TMDNUM][PKT_BUF_SZ];
-    char rmdbuf[RMDNUM][PKT_BUF_SZ];
-};
-
-/* 
- * Structure where all necessary information is for ring buffer 
- * management and statistics.
- */
-
-struct priv
-{
-    struct SK_ram *ram;  /* dual ported ram structure */
-    struct rmd *rmdhead; /* start of receive ring descriptors */
-    struct tmd *tmdhead; /* start of transmit ring descriptors */
-    int        rmdnum;   /* actual used ring descriptor */
-    int        tmdnum;   /* actual transmit descriptor for transmitting data */
-    int        tmdlast;  /* last sent descriptor used for error handling, etc */
-    void       *rmdbufs[RMDNUM]; /* pointer to the receive buffers */
-    void       *tmdbufs[TMDNUM]; /* pointer to the transmit buffers */
-    struct net_device_stats stats; /* Device driver statistics */
-};
-
-/* global variable declaration */
-
-/* IRQ map used to reserve a IRQ (see SK_open()) */
-
-/* static variables */
-
-static SK_RAM *board;  /* pointer to our memory mapped board components */
-static DEFINE_SPINLOCK(SK_lock);
-
-/* Macros */
-
-\f
-/* Function Prototypes */
-
-/*
- * Device Driver functions
- * -----------------------
- * See for short explanation of each function its definitions header.
- */
-
-static int   SK_probe(struct net_device *dev, short ioaddr);
-
-static void  SK_timeout(struct net_device *dev);
-static int   SK_open(struct net_device *dev);
-static int   SK_send_packet(struct sk_buff *skb, struct net_device *dev);
-static irqreturn_t SK_interrupt(int irq, void *dev_id, struct pt_regs * regs);
-static void  SK_rxintr(struct net_device *dev);
-static void  SK_txintr(struct net_device *dev);
-static int   SK_close(struct net_device *dev);
-
-static struct net_device_stats *SK_get_stats(struct net_device *dev);
-
-unsigned int SK_rom_addr(void);
-
-static void set_multicast_list(struct net_device *dev);
-
-/*
- * LANCE Functions
- * ---------------
- */
-
-static int SK_lance_init(struct net_device *dev, unsigned short mode);
-void   SK_reset_board(void);
-void   SK_set_RAP(int reg_number);
-int    SK_read_reg(int reg_number);
-int    SK_rread_reg(void);
-void   SK_write_reg(int reg_number, int value);
-
-/* 
- * Debugging functions
- * -------------------
- */
-
-void SK_print_pos(struct net_device *dev, char *text);
-void SK_print_dev(struct net_device *dev, char *text);
-void SK_print_ram(struct net_device *dev);
-
-\f
-/*-
- * Function       : SK_init
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/26
- *
- * Description    : Check for a SK_G16 network adaptor and initialize it.
- *                  This function gets called by dev_init which initializes
- *                  all Network devices.
- *
- * Parameters     : I : struct net_device *dev - structure preconfigured 
- *                                           from Space.c
- * Return Value   : 0 = Driver Found and initialized 
- * Errors         : ENODEV - no device found
- *                  ENXIO  - not probed
- * Globals        : None
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-static int io; /* 0 == probe */
-
-/* 
- * Check for a network adaptor of this type, and return '0' if one exists.
- * If dev->base_addr == 0, probe all likely locations.
- * If dev->base_addr == 1, always return failure.
- */
-
-struct net_device * __init SK_init(int unit)
-{
-       int *port, ports[] = SK_IO_PORTS;  /* SK_G16 supported ports */
-       static unsigned version_printed;
-       struct net_device *dev = alloc_etherdev(sizeof(struct priv));
-       int err = -ENODEV;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       if (unit >= 0) {
-               sprintf(dev->name, "eth%d", unit);
-               netdev_boot_setup_check(dev);
-               io = dev->base_addr;
-       }
-
-       if (version_printed++ == 0)
-               PRINTK(("%s: %s", SK_NAME, rcsid));
-
-       if (io > 0xff) {        /* Check a single specified address */
-               err = -EBUSY;
-               /* Check if on specified address is a SK_G16 */
-               if (request_region(io, ETHERCARD_TOTAL_SIZE, "sk_g16")) {
-                       err = SK_probe(dev, io);
-                       if (!err)
-                               goto got_it;
-                       release_region(io, ETHERCARD_TOTAL_SIZE);
-               }
-       } else if (io > 0) {       /* Don't probe at all */
-               err = -ENXIO;
-       } else {
-               /* Autoprobe base_addr */
-               for (port = &ports[0]; *port; port++) {
-                       io = *port;
-
-                       /* Check if I/O Port region is used by another board */
-                       if (!request_region(io, ETHERCARD_TOTAL_SIZE, "sk_g16"))
-                               continue;       /* Try next Port address */
-
-                       /* Check if at ioaddr is a SK_G16 */
-                       if (SK_probe(dev, io) == 0)
-                               goto got_it;
-
-                       release_region(io, ETHERCARD_TOTAL_SIZE);
-               }
-       }
-err_out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-
-got_it:
-       err = register_netdev(dev);
-       if (err) {
-               release_region(dev->base_addr, ETHERCARD_TOTAL_SIZE);
-               goto err_out;
-       }
-       return dev;
-
-} /* End of SK_init */
-
-
-MODULE_AUTHOR("Patrick J.D. Weichmann");
-MODULE_DESCRIPTION("Schneider & Koch G16 Ethernet Device Driver");
-MODULE_LICENSE("GPL");
-MODULE_PARM(io, "i");
-MODULE_PARM_DESC(io, "0 to probe common ports (unsafe), or the I/O base of the board");
-
-
-#ifdef MODULE
-
-static struct net_device *SK_dev;
-
-static int __init SK_init_module (void)
-{
-       SK_dev = SK_init(-1);
-       return IS_ERR(SK_dev) ? PTR_ERR(SK_dev) : 0;
-}
-
-static void __exit SK_cleanup_module (void)
-{
-       unregister_netdev(SK_dev);
-       release_region(SK_dev->base_addr, ETHERCARD_TOTAL_SIZE);
-       free_netdev(SK_dev);
-}
-
-module_init(SK_init_module);
-module_exit(SK_cleanup_module);
-#endif
-
-\f
-/*-
- * Function       : SK_probe
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/26
- *
- * Description    : This function is called by SK_init and 
- *                  does the main part of initialization.
- *                  
- * Parameters     : I : struct net_device *dev - SK_G16 device structure
- *                  I : short ioaddr       - I/O Port address where POS is.
- * Return Value   : 0 = Initialization done             
- * Errors         : ENODEV - No SK_G16 found
- *                  -1     - Configuration problem
- * Globals        : board       - pointer to SK_RAM
- * Update History :
- *     YY/MM/DD  uid  Description
- *     94/06/30  pwe  SK_ADDR now checked and at the correct place
--*/
-
-int __init SK_probe(struct net_device *dev, short ioaddr)
-{
-    int i,j;                /* Counters */
-    int sk_addr_flag = 0;   /* SK ADDR correct? 1 - no, 0 - yes */
-    unsigned int rom_addr;  /* used to store RAM address used for POS_ADDR */
-
-    struct priv *p = netdev_priv(dev); /* SK_G16 private structure */
-
-    if (inb(SK_POS0) != SK_IDLOW || inb(SK_POS1) != SK_IDHIGH)
-       return -ENODEV;
-    dev->base_addr = ioaddr;
-
-    if (SK_ADDR & 0x3fff || SK_ADDR < 0xa0000)
-    {
-      
-       sk_addr_flag = 1;
-
-       /* 
-        * Now here we could use a routine which searches for a free
-        * place in the ram and set SK_ADDR if found. TODO. 
-        */
-    }
-
-    if (SK_BOOT_ROM)            /* Shall we keep Boot_ROM on ? */
-    {
-        PRINTK(("## %s: SK_BOOT_ROM is set.\n", SK_NAME));
-
-        rom_addr = SK_rom_addr();
-
-       if (rom_addr == 0)      /* No Boot_ROM found */
-       {
-            if (sk_addr_flag)   /* No or Invalid SK_ADDR is defined */ 
-            {
-                printk("%s: SK_ADDR %#08x is not valid. Check configuration.\n",
-                       dev->name, SK_ADDR);
-                return -1;
-            }
-
-           rom_addr = SK_ADDR; /* assign predefined address */
-
-           PRINTK(("## %s: NO Bootrom found \n", SK_NAME));
-
-           outb(SK_ROM_RAM_OFF, SK_POS2); /* Boot_ROM + RAM off */
-           outb(POS_ADDR, SK_POS3);       /* Set RAM address */
-           outb(SK_RAM_ON, SK_POS2);      /* enable RAM */
-       }
-       else if (rom_addr == SK_ADDR) 
-       {
-            printk("%s: RAM + ROM are set to the same address %#08x\n"
-                   "   Check configuration. Now switching off Boot_ROM\n",
-                   SK_NAME, rom_addr);
-
-           outb(SK_ROM_RAM_OFF, SK_POS2); /* Boot_ROM + RAM off*/
-           outb(POS_ADDR, SK_POS3);       /* Set RAM address */
-           outb(SK_RAM_ON, SK_POS2);      /* enable RAM */
-       }
-       else
-       {
-            PRINTK(("## %s: Found ROM at %#08x\n", SK_NAME, rom_addr));
-           PRINTK(("## %s: Keeping Boot_ROM on\n", SK_NAME));
-
-            if (sk_addr_flag)       /* No or Invalid SK_ADDR is defined */ 
-            {
-                printk("%s: SK_ADDR %#08x is not valid. Check configuration.\n",
-                       dev->name, SK_ADDR);
-                return -1;
-            }
-
-           rom_addr = SK_ADDR;
-
-           outb(SK_ROM_RAM_OFF, SK_POS2); /* Boot_ROM + RAM off */ 
-           outb(POS_ADDR, SK_POS3);       /* Set RAM address */
-           outb(SK_ROM_RAM_ON, SK_POS2);  /* RAM on, BOOT_ROM on */
-       }
-    }
-    else /* Don't keep Boot_ROM */
-    {
-        PRINTK(("## %s: SK_BOOT_ROM is not set.\n", SK_NAME));
-
-        if (sk_addr_flag)           /* No or Invalid SK_ADDR is defined */ 
-        {
-            printk("%s: SK_ADDR %#08x is not valid. Check configuration.\n",
-                   dev->name, SK_ADDR);
-            return -1;
-        }
-
-       rom_addr = SK_rom_addr();          /* Try to find a Boot_ROM */
-
-       /* IF we find a Boot_ROM disable it */
-
-       outb(SK_ROM_RAM_OFF, SK_POS2);     /* Boot_ROM + RAM off */  
-
-        /* We found a Boot_ROM and it's gone. Set RAM address on
-         * Boot_ROM address. 
-         */ 
-
-       if (rom_addr) 
-       {
-            printk("%s: We found Boot_ROM at %#08x. Now setting RAM on"
-                   "that address\n", SK_NAME, rom_addr);
-
-           outb(POS_ADDR, SK_POS3);       /* Set RAM on Boot_ROM address */
-       }
-       else /* We did not find a Boot_ROM, use predefined SK_ADDR for ram */
-       {
-            if (sk_addr_flag)       /* No or Invalid SK_ADDR is defined */ 
-            {
-                printk("%s: SK_ADDR %#08x is not valid. Check configuration.\n",
-                       dev->name, SK_ADDR);
-                return -1;
-            }
-
-           rom_addr = SK_ADDR;
-
-           outb(POS_ADDR, SK_POS3);       /* Set RAM address */ 
-       }
-       outb(SK_RAM_ON, SK_POS2);          /* enable RAM */
-    }
-
-#ifdef SK_DEBUG
-    SK_print_pos(dev, "POS registers after ROM, RAM config");
-#endif
-
-    board = (SK_RAM *) isa_bus_to_virt(rom_addr);
-
-    /* Read in station address */
-    for (i = 0, j = 0; i < ETH_ALEN; i++, j+=2)
-    {
-       dev->dev_addr[i] = readb(board->rom+j);          
-    }
-
-    /* Check for manufacturer code */
-    if (!(dev->dev_addr[0] == SK_MAC0 &&
-         dev->dev_addr[1] == SK_MAC1 &&
-         dev->dev_addr[2] == SK_MAC2) )
-    {
-        PRINTK(("## %s: We did not find SK_G16 at RAM location.\n",
-                SK_NAME)); 
-       return -ENODEV;                     /* NO SK_G16 found */
-    }
-
-    printk("%s: %s found at %#3x, HW addr: %#04x:%02x:%02x:%02x:%02x:%02x\n",
-           dev->name,
-           "Schneider & Koch Netcard",
-           (unsigned int) dev->base_addr,
-           dev->dev_addr[0],
-           dev->dev_addr[1],
-           dev->dev_addr[2],
-           dev->dev_addr[3],
-           dev->dev_addr[4],
-           dev->dev_addr[5]);
-
-    memset((char *) dev->priv, 0, sizeof(struct priv)); /* clear memory */
-
-    /* Assign our Device Driver functions */
-
-    dev->open                   = SK_open;
-    dev->stop                   = SK_close;
-    dev->hard_start_xmit        = SK_send_packet;
-    dev->get_stats              = SK_get_stats;
-    dev->set_multicast_list     = set_multicast_list;
-    dev->tx_timeout            = SK_timeout;
-    dev->watchdog_timeo                = HZ/7;
-
-
-    dev->flags &= ~IFF_MULTICAST;
-
-    /* Initialize private structure */
-
-    p->ram = (struct SK_ram *) rom_addr; /* Set dual ported RAM addr */
-    p->tmdhead = &(p->ram)->tmde[0];     /* Set TMD head */
-    p->rmdhead = &(p->ram)->rmde[0];     /* Set RMD head */
-
-    /* Initialize buffer pointers */
-
-    for (i = 0; i < TMDNUM; i++)
-    {
-       p->tmdbufs[i] = &(p->ram)->tmdbuf[i];
-    }
-
-    for (i = 0; i < RMDNUM; i++)
-    {
-       p->rmdbufs[i] = &(p->ram)->rmdbuf[i]; 
-    }
-
-#ifdef SK_DEBUG
-    SK_print_pos(dev, "End of SK_probe");
-    SK_print_ram(dev);
-#endif 
-    return 0;                            /* Initialization done */
-} /* End of SK_probe() */
-
-\f
-/*- 
- * Function       : SK_open
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/26
- *
- * Description    : This function is called sometimes after booting 
- *                  when ifconfig program is run.
- *
- *                  This function requests an IRQ, sets the correct
- *                  IRQ in the card. Then calls SK_lance_init() to 
- *                  init and start the LANCE chip. Then if everything is 
- *                  ok returns with 0 (OK), which means SK_G16 is now
- *                  opened and operational.
- *
- *                  (Called by dev_open() /net/inet/dev.c)
- *
- * Parameters     : I : struct net_device *dev - SK_G16 device structure
- * Return Value   : 0 - Device opened
- * Errors         : -EAGAIN - Open failed
- * Side Effects   : None
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-static int SK_open(struct net_device *dev)
-{
-    int i = 0;
-    int irqval = 0;
-    int ioaddr = dev->base_addr;
-
-    int irqtab[] = SK_IRQS; 
-
-    struct priv *p = netdev_priv(dev);
-
-    PRINTK(("## %s: At beginning of SK_open(). CSR0: %#06x\n", 
-           SK_NAME, SK_read_reg(CSR0)));
-
-    if (dev->irq == 0) /* Autoirq */
-    {
-       i = 0;
-
-       /* 
-         * Check if one IRQ out of SK_IRQS is free and install 
-        * interrupt handler.
-        * Most done by request_irq(). 
-        * irqval: 0       - interrupt handler installed for IRQ irqtab[i]
-        *         -EBUSY  - interrupt busy 
-         *         -EINVAL - irq > 15 or handler = NULL
-        */
-
-       do
-       {
-         irqval = request_irq(irqtab[i], &SK_interrupt, 0, "sk_g16", dev);
-         i++;
-       } while (irqval && irqtab[i]);
-
-       if (irqval) /* We tried every possible IRQ but no success */
-       {
-           printk("%s: unable to get an IRQ\n", dev->name);
-           return -EAGAIN;
-       }
-
-       dev->irq = irqtab[--i]; 
-       
-       outb(i<<2, SK_POS4);           /* Set Card on probed IRQ */
-
-    }
-    else if (dev->irq == 2) /* IRQ2 is always IRQ9 */
-    {
-       if (request_irq(9, &SK_interrupt, 0, "sk_g16", dev))
-       {
-           printk("%s: unable to get IRQ 9\n", dev->name);
-           return -EAGAIN;
-       } 
-       dev->irq = 9;
-       
-        /* 
-         * Now we set card on IRQ2.
-         * This can be confusing, but remember that IRQ2 on the network
-         * card is in reality IRQ9
-         */
-       outb(0x08, SK_POS4);           /* set card to IRQ2 */
-
-    }
-    else  /* Check IRQ as defined in Space.c */
-    {
-       int i = 0;
-
-       /* check if IRQ free and valid. Then install Interrupt handler */
-
-       if (request_irq(dev->irq, &SK_interrupt, 0, "sk_g16", dev))
-       {
-           printk("%s: unable to get selected IRQ\n", dev->name);
-           return -EAGAIN;
-       }
-
-       switch(dev->irq)
-       {
-           case 3: i = 0;
-                   break;
-           case 5: i = 1;
-                   break;
-           case 2: i = 2;
-                   break;
-           case 11:i = 3;
-                   break;
-           default: 
-               printk("%s: Preselected IRQ %d is invalid for %s boards",
-                      dev->name,
-                      dev->irq,
-                       SK_NAME);
-               return -EAGAIN;
-       }      
-  
-       outb(i<<2, SK_POS4);           /* Set IRQ on card */
-    }
-
-    printk("%s: Schneider & Koch G16 at %#3x, IRQ %d, shared mem at %#08x\n",
-           dev->name, (unsigned int)dev->base_addr, 
-           (int) dev->irq, (unsigned int) p->ram);
-
-    if (!(i = SK_lance_init(dev, 0)))  /* LANCE init OK? */
-    {
-       netif_start_queue(dev);
-
-#ifdef SK_DEBUG
-
-        /* 
-         * This debug block tries to stop LANCE,
-         * reinit LANCE with transmitter and receiver disabled,
-         * then stop again and reinit with NORMAL_MODE
-         */
-
-        printk("## %s: After lance init. CSR0: %#06x\n", 
-               SK_NAME, SK_read_reg(CSR0));
-        SK_write_reg(CSR0, CSR0_STOP);
-        printk("## %s: LANCE stopped. CSR0: %#06x\n", 
-               SK_NAME, SK_read_reg(CSR0));
-        SK_lance_init(dev, MODE_DTX | MODE_DRX);
-        printk("## %s: Reinit with DTX + DRX off. CSR0: %#06x\n", 
-               SK_NAME, SK_read_reg(CSR0));
-        SK_write_reg(CSR0, CSR0_STOP);
-        printk("## %s: LANCE stopped. CSR0: %#06x\n", 
-               SK_NAME, SK_read_reg(CSR0));
-        SK_lance_init(dev, MODE_NORMAL);
-        printk("## %s: LANCE back to normal mode. CSR0: %#06x\n", 
-               SK_NAME, SK_read_reg(CSR0));
-        SK_print_pos(dev, "POS regs before returning OK");
-
-#endif /* SK_DEBUG */
-       
-       return 0;              /* SK_open() is successful */
-    }
-    else /* LANCE init failed */
-    {
-
-       PRINTK(("## %s: LANCE init failed: CSR0: %#06x\n", 
-               SK_NAME, SK_read_reg(CSR0)));
-
-       return -EAGAIN;
-    }
-
-} /* End of SK_open() */
-
-\f
-/*-
- * Function       : SK_lance_init
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/26
- *
- * Description    : Reset LANCE chip, fill RMD, TMD structures with
- *                  start values and Start LANCE.
- *
- * Parameters     : I : struct net_device *dev - SK_G16 device structure
- *                  I : int mode - put LANCE into "mode" see data-sheet for
- *                                 more info.
- * Return Value   : 0  - Init done
- * Errors         : -1 - Init failed
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-static int SK_lance_init(struct net_device *dev, unsigned short mode)
-{
-    int i;
-    unsigned long flags;
-    struct priv *p = netdev_priv(dev);
-    struct tmd  *tmdp;
-    struct rmd  *rmdp;
-
-    PRINTK(("## %s: At beginning of LANCE init. CSR0: %#06x\n", 
-           SK_NAME, SK_read_reg(CSR0)));
-
-    /* Reset LANCE */
-    SK_reset_board();
-
-    /* Initialize TMD's with start values */
-    p->tmdnum = 0;                   /* First descriptor for transmitting */ 
-    p->tmdlast = 0;                  /* First descriptor for reading stats */
-
-    for (i = 0; i < TMDNUM; i++)     /* Init all TMD's */
-    {
-       tmdp = p->tmdhead + i; 
-   
-       writel((unsigned long) p->tmdbufs[i], tmdp->u.buffer); /* assign buffer */
-       
-       /* Mark TMD as start and end of packet */
-       writeb(TX_STP | TX_ENP, &tmdp->u.s.status);
-    }
-
-
-    /* Initialize RMD's with start values */
-
-    p->rmdnum = 0;                   /* First RMD which will be used */
-    for (i = 0; i < RMDNUM; i++)     /* Init all RMD's */
-    {
-       rmdp = p->rmdhead + i;
-
-       
-       writel((unsigned long) p->rmdbufs[i], rmdp->u.buffer); /* assign buffer */
-       
-       /* 
-         * LANCE must be owner at beginning so that he can fill in 
-        * receiving packets, set status and release RMD 
-        */
-
-       writeb(RX_OWN, &rmdp->u.s.status);
-
-       writew(-PKT_BUF_SZ, &rmdp->blen); /* Buffer Size (two's complement) */
-
-       writeb(0, &rmdp->mlen);           /* init message length */       
-       
-    }
-
-    /* Fill LANCE Initialize Block */
-
-    writew(mode, (&((p->ram)->ib.mode))); /* Set operation mode */
-
-    for (i = 0; i < ETH_ALEN; i++)   /* Set physical address */
-    {
-       writeb(dev->dev_addr[i], (&((p->ram)->ib.paddr[i]))); 
-    }
-
-    for (i = 0; i < 8; i++)          /* Set multicast, logical address */
-    {
-       writeb(0, (&((p->ram)->ib.laddr[i]))); /* We do not use logical addressing */
-    } 
-
-    /* Set ring descriptor pointers and set number of descriptors */
-
-    writel((int)p->rmdhead | RMDNUMMASK, (&((p->ram)->ib.rdrp)));
-    writel((int)p->tmdhead | TMDNUMMASK, (&((p->ram)->ib.tdrp)));
-
-    /* Prepare LANCE Control and Status Registers */
-
-    spin_lock_irqsave(&SK_lock, flags);
-
-    SK_write_reg(CSR3, CSR3_ACON);   /* Ale Control !!!THIS MUST BE SET!!!! */
-    /* 
-     * LANCE addresses the RAM from 0x0000 to 0x3fbf and has no access to
-     * PC Memory locations.
-     *
-     * In structure SK_ram is defined that the first thing in ram
-     * is the initialization block. So his address is for LANCE always
-     * 0x0000
-     *
-     * CSR1 contains low order bits 15:0 of initialization block address
-     * CSR2 is built of: 
-     *    7:0  High order bits 23:16 of initialization block address
-     *   15:8  reserved, must be 0
-     */
-    
-    /* Set initialization block address (must be on word boundary) */
-    SK_write_reg(CSR1, 0);          /* Set low order bits 15:0 */
-    SK_write_reg(CSR2, 0);          /* Set high order bits 23:16 */ 
-    
-
-    PRINTK(("## %s: After setting CSR1-3. CSR0: %#06x\n", 
-           SK_NAME, SK_read_reg(CSR0)));
-
-    /* Initialize LANCE */
-
-    /* 
-     * INIT = Initialize, when set, causes the LANCE to begin the
-     * initialization procedure and access the Init Block.
-     */
-
-    SK_write_reg(CSR0, CSR0_INIT); 
-
-    spin_unlock_irqrestore(&SK_lock, flags);
-
-    /* Wait until LANCE finished initialization */
-    
-    SK_set_RAP(CSR0);              /* Register Address Pointer to CSR0 */
-
-    for (i = 0; (i < 100) && !(SK_rread_reg() & CSR0_IDON); i++) 
-       ; /* Wait until init done or go ahead if problems (i>=100) */
-
-    if (i >= 100) /* Something is wrong ! */
-    {
-       printk("%s: can't init am7990, status: %04x "
-              "init_block: %#08x\n", 
-               dev->name, (int) SK_read_reg(CSR0), 
-               (unsigned int) &(p->ram)->ib);
-
-#ifdef SK_DEBUG
-       SK_print_pos(dev, "LANCE INIT failed");
-       SK_print_dev(dev,"Device Structure:");
-#endif
-
-       return -1;                 /* LANCE init failed */
-    }
-
-    PRINTK(("## %s: init done after %d ticks\n", SK_NAME, i));
-
-    /* Clear Initialize done, enable Interrupts, start LANCE */
-
-    SK_write_reg(CSR0, CSR0_IDON | CSR0_INEA | CSR0_STRT);
-
-    PRINTK(("## %s: LANCE started. CSR0: %#06x\n", SK_NAME, 
-            SK_read_reg(CSR0)));
-
-    return 0;                      /* LANCE is up and running */
-
-} /* End of SK_lance_init() */
-
-
-\f
-/*-
- * Function       : SK_send_packet
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/27
- *
- * Description    : Writes an socket buffer into a transmit descriptor
- *                  and starts transmission.
- *
- * Parameters     : I : struct sk_buff *skb - packet to transfer
- *                  I : struct net_device *dev  - SK_G16 device structure
- * Return Value   : 0 - OK
- *                  1 - Could not transmit (dev_queue_xmit will queue it)
- *                      and try to sent it later
- * Globals        : None
- * Side Effects   : None
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-static void SK_timeout(struct net_device *dev)
-{
-       printk(KERN_WARNING "%s: xmitter timed out, try to restart!\n", dev->name);
-       SK_lance_init(dev, MODE_NORMAL); /* Reinit LANCE */
-       netif_wake_queue(dev);           /* Clear Transmitter flag */
-       dev->trans_start = jiffies;      /* Mark Start of transmission */
-}
-
-static int SK_send_packet(struct sk_buff *skb, struct net_device *dev)
-{
-    struct priv *p = netdev_priv(dev);
-    struct tmd *tmdp;
-    static char pad[64];
-
-    PRINTK2(("## %s: SK_send_packet() called, CSR0 %#04x.\n", 
-           SK_NAME, SK_read_reg(CSR0)));
-
-
-    /* 
-     * Block a timer-based transmit from overlapping. 
-     * This means check if we are already in. 
-     */
-
-    netif_stop_queue (dev);
-
-    {
-
-       /* Evaluate Packet length */
-       short len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; 
-       
-       tmdp = p->tmdhead + p->tmdnum; /* Which descriptor for transmitting */
-
-       /* Fill in Transmit Message Descriptor */
-
-       /* Copy data into dual ported ram */
-
-       memcpy_toio((tmdp->u.buffer & 0x00ffffff), skb->data, skb->len);
-       if (len != skb->len)
-               memcpy_toio((tmdp->u.buffer & 0x00ffffff) + skb->len, pad, len-skb->len);
-
-       writew(-len, &tmdp->blen);            /* set length to transmit */
-
-       /* 
-        * Packet start and end is always set because we use the maximum
-        * packet length as buffer length.
-        * Relinquish ownership to LANCE
-        */
-
-       writeb(TX_OWN | TX_STP | TX_ENP, &tmdp->u.s.status);
-       
-       /* Start Demand Transmission */
-       SK_write_reg(CSR0, CSR0_TDMD | CSR0_INEA);
-
-       dev->trans_start = jiffies;   /* Mark start of transmission */
-
-       /* Set pointer to next transmit buffer */
-       p->tmdnum++; 
-       p->tmdnum &= TMDNUM-1; 
-
-       /* Do we own the next transmit buffer ? */
-       if (! (readb(&((p->tmdhead + p->tmdnum)->u.s.status)) & TX_OWN) )
-       {
-          /* 
-           * We own next buffer and are ready to transmit, so
-           * clear busy flag
-           */
-          netif_start_queue(dev);
-       }
-
-       p->stats.tx_bytes += skb->len;
-
-    }
-
-    dev_kfree_skb(skb);
-    return 0;  
-} /* End of SK_send_packet */
-
-\f
-/*-
- * Function       : SK_interrupt
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/27
- *
- * Description    : SK_G16 interrupt handler which checks for LANCE
- *                  Errors, handles transmit and receive interrupts
- *
- * Parameters     : I : int irq, void *dev_id, struct pt_regs * regs -
- * Return Value   : None
- * Errors         : None
- * Globals        : None
- * Side Effects   : None
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-static irqreturn_t SK_interrupt(int irq, void *dev_id, struct pt_regs * regs)
-{
-    int csr0;
-    struct net_device *dev = dev_id;
-    struct priv *p = netdev_priv(dev);
-
-
-    PRINTK2(("## %s: SK_interrupt(). status: %#06x\n", 
-            SK_NAME, SK_read_reg(CSR0)));
-
-    if (dev == NULL)
-    {
-       printk("SK_interrupt(): IRQ %d for unknown device.\n", irq);
-    }
-    
-    spin_lock (&SK_lock);
-
-    csr0 = SK_read_reg(CSR0);      /* store register for checking */
-
-    /* 
-     * Acknowledge all of the current interrupt sources, disable      
-     * Interrupts (INEA = 0) 
-     */
-
-    SK_write_reg(CSR0, csr0 & CSR0_CLRALL); 
-
-    if (csr0 & CSR0_ERR) /* LANCE Error */
-    {
-       printk("%s: error: %04x\n", dev->name, csr0);
-      
-        if (csr0 & CSR0_MISS)      /* No place to store packet ? */
-        { 
-            p->stats.rx_dropped++;
-        }
-    }
-
-    if (csr0 & CSR0_RINT)          /* Receive Interrupt (packet arrived) */ 
-    {
-       SK_rxintr(dev); 
-    }
-
-    if (csr0 & CSR0_TINT)          /* Transmit interrupt (packet sent) */
-    {
-       SK_txintr(dev);
-    }
-
-    SK_write_reg(CSR0, CSR0_INEA); /* Enable Interrupts */
-
-    spin_unlock (&SK_lock);
-    return IRQ_HANDLED;
-} /* End of SK_interrupt() */ 
-
-\f
-/*-
- * Function       : SK_txintr
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/27
- *
- * Description    : After sending a packet we check status, update
- *                  statistics and relinquish ownership of transmit 
- *                  descriptor ring.
- *
- * Parameters     : I : struct net_device *dev - SK_G16 device structure
- * Return Value   : None
- * Errors         : None
- * Globals        : None
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-static void SK_txintr(struct net_device *dev)
-{
-    int tmdstat;
-    struct tmd *tmdp;
-    struct priv *p = netdev_priv(dev);
-
-
-    PRINTK2(("## %s: SK_txintr() status: %#06x\n", 
-            SK_NAME, SK_read_reg(CSR0)));
-
-    tmdp = p->tmdhead + p->tmdlast;     /* Which buffer we sent at last ? */
-
-    /* Set next buffer */
-    p->tmdlast++;
-    p->tmdlast &= TMDNUM-1;
-
-    tmdstat = readb(&tmdp->u.s.status);
-
-    /* 
-     * We check status of transmitted packet.
-     * see LANCE data-sheet for error explanation
-     */
-    if (tmdstat & TX_ERR) /* Error occurred */
-    {
-       int stat2 = readw(&tmdp->status2);
-
-       printk("%s: TX error: %04x %04x\n", dev->name, tmdstat, stat2);
-
-       if (stat2 & TX_TDR)    /* TDR problems? */
-       {
-           printk("%s: tdr-problems \n", dev->name);
-       }
-
-       if (stat2 & TX_RTRY)   /* Failed in 16 attempts to transmit ? */
-            p->stats.tx_aborted_errors++;   
-        if (stat2 & TX_LCOL)   /* Late collision ? */
-            p->stats.tx_window_errors++; 
-       if (stat2 & TX_LCAR)   /* Loss of Carrier ? */  
-            p->stats.tx_carrier_errors++;
-        if (stat2 & TX_UFLO)   /* Underflow error ? */
-        {
-            p->stats.tx_fifo_errors++;
-
-            /* 
-             * If UFLO error occurs it will turn transmitter of.
-             * So we must reinit LANCE
-             */
-
-            SK_lance_init(dev, MODE_NORMAL);
-        }
-       
-       p->stats.tx_errors++;
-
-       writew(0, &tmdp->status2);             /* Clear error flags */
-    }
-    else if (tmdstat & TX_MORE)        /* Collisions occurred ? */
-    {
-        /* 
-         * Here I have a problem.
-         * I only know that there must be one or up to 15 collisions.
-         * That's why TX_MORE is set, because after 16 attempts TX_RTRY
-         * will be set which means couldn't send packet aborted transfer.
-         *
-         * First I did not have this in but then I thought at minimum
-         * we see that something was not ok.
-         * If anyone knows something better than this to handle this
-         * please report it.
-         */ 
-
-        p->stats.collisions++; 
-    }
-    else   /* Packet sent without any problems */
-    {
-        p->stats.tx_packets++; 
-    }
-
-    /* 
-     * We mark transmitter not busy anymore, because now we have a free
-     * transmit descriptor which can be filled by SK_send_packet and
-     * afterwards sent by the LANCE
-     * 
-     * The function which do handle slow IRQ parts is do_bottom_half()
-     * which runs at normal kernel priority, that means all interrupt are
-     * enabled. (see kernel/irq.c)
-     *  
-     * net_bh does something like this:
-     *  - check if already in net_bh
-     *  - try to transmit something from the send queue
-     *  - if something is in the receive queue send it up to higher 
-     *    levels if it is a known protocol
-     *  - try to transmit something from the send queue
-     */
-
-    netif_wake_queue(dev);
-
-} /* End of SK_txintr() */
-
-\f
-/*-
- * Function       : SK_rxintr
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/27
- *
- * Description    : Buffer sent, check for errors, relinquish ownership
- *                  of the receive message descriptor. 
- *
- * Parameters     : I : SK_G16 device structure
- * Return Value   : None
- * Globals        : None
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-static void SK_rxintr(struct net_device *dev)
-{
-
-    struct rmd *rmdp;
-    int rmdstat;
-    struct priv *p = netdev_priv(dev);
-
-    PRINTK2(("## %s: SK_rxintr(). CSR0: %#06x\n", 
-            SK_NAME, SK_read_reg(CSR0)));
-
-    rmdp = p->rmdhead + p->rmdnum;
-
-    /* As long as we own the next entry, check status and send
-     * it up to higher layer 
-     */
-
-    while (!( (rmdstat = readb(&rmdp->u.s.status)) & RX_OWN))
-    {
-       /* 
-         * Start and end of packet must be set, because we use 
-        * the ethernet maximum packet length (1518) as buffer size.
-        * 
-        * Because our buffers are at maximum OFLO and BUFF errors are
-        * not to be concerned (see Data sheet)
-        */
-
-       if ((rmdstat & (RX_STP | RX_ENP)) != (RX_STP | RX_ENP))
-       {
-           /* Start of a frame > 1518 Bytes ? */
-
-           if (rmdstat & RX_STP) 
-           {
-               p->stats.rx_errors++;        /* bad packet received */
-               p->stats.rx_length_errors++; /* packet too long */
-
-               printk("%s: packet too long\n", dev->name);
-           }
-           
-           /* 
-             * All other packets will be ignored until a new frame with
-            * start (RX_STP) set follows.
-            * 
-            * What we do is just give descriptor free for new incoming
-            * packets. 
-            */
-
-           writeb(RX_OWN, &rmdp->u.s.status); /* Relinquish ownership to LANCE */ 
-
-       }
-       else if (rmdstat & RX_ERR)          /* Receive Error ? */
-       {
-           printk("%s: RX error: %04x\n", dev->name, (int) rmdstat);
-           
-           p->stats.rx_errors++;
-
-           if (rmdstat & RX_FRAM) p->stats.rx_frame_errors++;
-           if (rmdstat & RX_CRC)  p->stats.rx_crc_errors++;
-
-           writeb(RX_OWN, &rmdp->u.s.status); /* Relinquish ownership to LANCE */
-
-       }
-       else /* We have a packet which can be queued for the upper layers */
-       {
-
-           int len = readw(&rmdp->mlen) & 0x0fff;  /* extract message length from receive buffer */
-           struct sk_buff *skb;
-
-           skb = dev_alloc_skb(len+2); /* allocate socket buffer */ 
-
-           if (skb == NULL)                /* Could not get mem ? */
-           {
-    
-               /* 
-                 * Couldn't allocate sk_buffer so we give descriptor back
-                * to Lance, update statistics and go ahead.
-                */
-
-               writeb(RX_OWN, &rmdp->u.s.status); /* Relinquish ownership to LANCE */
-               printk("%s: Couldn't allocate sk_buff, deferring packet.\n",
-                      dev->name);
-               p->stats.rx_dropped++;
-
-               break;                      /* Jump out */
-           }
-           
-           /* Prepare sk_buff to queue for upper layers */
-
-           skb->dev = dev;
-           skb_reserve(skb,2);         /* Align IP header on 16 byte boundary */
-           
-           /* 
-             * Copy data out of our receive descriptor into sk_buff.
-            *
-            * (rmdp->u.buffer & 0x00ffffff) -> get address of buffer and 
-            * ignore status fields) 
-            */
-
-           memcpy_fromio(skb_put(skb,len), (rmdp->u.buffer & 0x00ffffff), len);
-
-
-           /* 
-             * Notify the upper protocol layers that there is another packet
-            * to handle
-            *
-            * netif_rx() always succeeds. see /net/inet/dev.c for more.
-            */
-
-           skb->protocol=eth_type_trans(skb,dev);
-           netif_rx(skb);                 /* queue packet and mark it for processing */
-          
-           /* 
-             * Packet is queued and marked for processing so we
-            * free our descriptor and update statistics 
-            */
-
-           writeb(RX_OWN, &rmdp->u.s.status);
-           dev->last_rx = jiffies;
-           p->stats.rx_packets++;
-           p->stats.rx_bytes += len;
-
-
-           p->rmdnum++;
-           p->rmdnum %= RMDNUM;
-
-           rmdp = p->rmdhead + p->rmdnum;
-       }
-    }
-} /* End of SK_rxintr() */
-
-\f
-/*-
- * Function       : SK_close
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/26
- *
- * Description    : close gets called from dev_close() and should
- *                  deinstall the card (free_irq, mem etc).
- *
- * Parameters     : I : struct net_device *dev - our device structure
- * Return Value   : 0 - closed device driver
- * Errors         : None
- * Globals        : None
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-/* I have tried to set BOOT_ROM on and RAM off but then, after a 'ifconfig
- * down' the system stops. So I don't shut set card to init state.
- */
-
-static int SK_close(struct net_device *dev)
-{
-
-    PRINTK(("## %s: SK_close(). CSR0: %#06x\n", 
-           SK_NAME, SK_read_reg(CSR0)));
-
-    netif_stop_queue(dev);        /* Transmitter busy */
-
-    printk("%s: Shutting %s down CSR0 %#06x\n", dev->name, SK_NAME, 
-           (int) SK_read_reg(CSR0));
-
-    SK_write_reg(CSR0, CSR0_STOP); /* STOP the LANCE */
-
-    free_irq(dev->irq, dev);      /* Free IRQ */
-
-    return 0; /* always succeed */
-    
-} /* End of SK_close() */
-
-\f
-/*-
- * Function       : SK_get_stats
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/26
- *
- * Description    : Return current status structure to upper layers.
- *                  It is called by sprintf_stats (dev.c).
- *
- * Parameters     : I : struct net_device *dev   - our device structure
- * Return Value   : struct net_device_stats * - our current statistics
- * Errors         : None
- * Side Effects   : None
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-static struct net_device_stats *SK_get_stats(struct net_device *dev)
-{
-
-    struct priv *p = netdev_priv(dev);
-
-    PRINTK(("## %s: SK_get_stats(). CSR0: %#06x\n", 
-           SK_NAME, SK_read_reg(CSR0)));
-
-    return &p->stats;             /* Return Device status */
-
-} /* End of SK_get_stats() */
-
-\f
-/*-
- * Function       : set_multicast_list
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/26
- *
- * Description    : This function gets called when a program performs
- *                  a SIOCSIFFLAGS call. Ifconfig does this if you call
- *                  'ifconfig [-]allmulti' which enables or disables the
- *                  Promiscuous mode.
- *                  Promiscuous mode is when the Network card accepts all
- *                  packets, not only the packets which match our MAC 
- *                  Address. It is useful for writing a network monitor,
- *                  but it is also a security problem. You have to remember
- *                  that all information on the net is not encrypted.
- *
- * Parameters     : I : struct net_device *dev - SK_G16 device Structure
- * Return Value   : None
- * Errors         : None
- * Globals        : None
- * Update History :
- *     YY/MM/DD  uid  Description
- *     95/10/18  ACox  New multicast calling scheme
--*/
-
-
-/* Set or clear the multicast filter for SK_G16.
- */
-
-static void set_multicast_list(struct net_device *dev)
-{
-
-    if (dev->flags&IFF_PROMISC)
-    {
-       /* Reinitialize LANCE with MODE_PROM set */
-       SK_lance_init(dev, MODE_PROM);
-    }
-    else if (dev->mc_count==0 && !(dev->flags&IFF_ALLMULTI))
-    {
-       /* Reinitialize LANCE without MODE_PROM */
-       SK_lance_init(dev, MODE_NORMAL);
-    }
-    else
-    {
-       /* Multicast with logical address filter on */
-       /* Reinitialize LANCE without MODE_PROM */
-       SK_lance_init(dev, MODE_NORMAL);
-       
-       /* Not implemented yet. */
-    }
-} /* End of set_multicast_list() */
-
-
-\f
-/*-
- * Function       : SK_rom_addr
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/06/01
- *
- * Description    : Try to find a Boot_ROM at all possible locations
- *
- * Parameters     : None
- * Return Value   : Address where Boot_ROM is
- * Errors         : 0 - Did not find Boot_ROM
- * Globals        : None
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-unsigned int __init SK_rom_addr(void)
-{
-    int i,j;
-    int rom_found = 0;
-    unsigned int rom_location[] = SK_BOOT_ROM_LOCATIONS;
-    unsigned char rom_id[] = SK_BOOT_ROM_ID;
-    unsigned char test_byte;
-
-    /* Autodetect Boot_ROM */
-    PRINTK(("## %s: Autodetection of Boot_ROM\n", SK_NAME));
-
-    for (i = 0; (rom_location[i] != 0) && (rom_found == 0); i++)
-    {
-       
-       PRINTK(("##   Trying ROM location %#08x", rom_location[i]));
-       
-       rom_found = 1; 
-       for (j = 0; j < 6; j++)
-       {
-           test_byte = readb(rom_location[i]+j);
-           PRINTK((" %02x ", *test_byte));
-
-           if(test_byte != rom_id[j])
-           {
-               rom_found = 0;
-           } 
-       }
-       PRINTK(("\n"));
-    }
-
-    if (rom_found == 1)
-    {
-       PRINTK(("## %s: Boot_ROM found at %#08x\n", 
-               SK_NAME, rom_location[(i-1)]));
-
-       return (rom_location[--i]);
-    }
-    else
-    {
-       PRINTK(("%s: No Boot_ROM found\n", SK_NAME));
-       return 0;
-    }
-} /* End of SK_rom_addr() */
-
-
-\f
-/* LANCE access functions 
- *
- * ! CSR1-3 can only be accessed when in CSR0 the STOP bit is set !
- */
-
-
-/*-
- * Function       : SK_reset_board
- *
- * Author         : Patrick J.D. Weichmann
- *
- * Date Created   : 94/05/25
- *
- * Description    : This function resets SK_G16 and all components, but
- *                  POS registers are not changed
- *
- * Parameters     : None
- * Return Value   : None
- * Errors         : None
- * Globals        : SK_RAM *board - SK_RAM structure pointer
- *
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-void SK_reset_board(void)
-{
-    writeb(0x00, SK_PORT);       /* Reset active */
-    mdelay(5);                /* Delay min 5ms */
-    writeb(SK_RESET, SK_PORT);   /* Set back to normal operation */
-
-} /* End of SK_reset_board() */
-
-\f
-/*-
- * Function       : SK_set_RAP
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/25
- *
- * Description    : Set LANCE Register Address Port to register
- *                  for later data transfer.
- *
- * Parameters     : I : reg_number - which CSR to read/write from/to
- * Return Value   : None
- * Errors         : None
- * Globals        : SK_RAM *board - SK_RAM structure pointer
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-void SK_set_RAP(int reg_number)
-{
-    writew(reg_number, SK_IOREG);
-    writeb(SK_RESET | SK_RAP | SK_WREG, SK_PORT);
-    writeb(SK_DOIO, SK_IOCOM);
-
-    while (readb(SK_PORT) & SK_IORUN) 
-       barrier();
-} /* End of SK_set_RAP() */
-
-\f
-/*-
- * Function       : SK_read_reg
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/25
- *
- * Description    : Set RAP and read data from a LANCE CSR register
- *
- * Parameters     : I : reg_number - which CSR to read from
- * Return Value   : Register contents
- * Errors         : None
- * Globals        : SK_RAM *board - SK_RAM structure pointer
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-int SK_read_reg(int reg_number)
-{
-    SK_set_RAP(reg_number);
-
-    writeb(SK_RESET | SK_RDATA | SK_RREG, SK_PORT);
-    writeb(SK_DOIO, SK_IOCOM);
-
-    while (readb(SK_PORT) & SK_IORUN)
-       barrier();
-    return (readw(SK_IOREG));
-
-} /* End of SK_read_reg() */
-
-\f
-/*-
- * Function       : SK_rread_reg
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/28
- *
- * Description    : Read data from preseted register.
- *                  This function requires that you know which
- *                  Register is actually set. Be aware that CSR1-3
- *                  can only be accessed when in CSR0 STOP is set.
- *
- * Return Value   : Register contents
- * Errors         : None
- * Globals        : SK_RAM *board - SK_RAM structure pointer
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-int SK_rread_reg(void)
-{
-    writeb(SK_RESET | SK_RDATA | SK_RREG, SK_PORT);
-
-    writeb(SK_DOIO, SK_IOCOM);
-
-    while (readb(SK_PORT) & SK_IORUN)
-       barrier();
-    return (readw(SK_IOREG));
-
-} /* End of SK_rread_reg() */
-
-\f
-/*-
- * Function       : SK_write_reg
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/25
- *
- * Description    : This function sets the RAP then fills in the
- *                  LANCE I/O Reg and starts Transfer to LANCE.
- *                  It waits until transfer has ended which is max. 7 ms
- *                  and then it returns.
- *
- * Parameters     : I : reg_number - which CSR to write to
- *                  I : value      - what value to fill into register 
- * Return Value   : None
- * Errors         : None
- * Globals        : SK_RAM *board - SK_RAM structure pointer
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-void SK_write_reg(int reg_number, int value)
-{
-    SK_set_RAP(reg_number);
-
-    writew(value, SK_IOREG);
-    writeb(SK_RESET | SK_RDATA | SK_WREG, SK_PORT);
-    writeb(SK_DOIO, SK_IOCOM);
-
-    while (readb(SK_PORT) & SK_IORUN)
-       barrier();
-} /* End of SK_write_reg */
-
-\f
-
-/* 
- * Debugging functions
- * -------------------
- */
-
-/*-
- * Function       : SK_print_pos
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/25
- *
- * Description    : This function prints out the 4 POS (Programmable
- *                  Option Select) Registers. Used mainly to debug operation.
- *
- * Parameters     : I : struct net_device *dev - SK_G16 device structure
- *                  I : char * - Text which will be printed as title
- * Return Value   : None
- * Errors         : None
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-void SK_print_pos(struct net_device *dev, char *text)
-{
-    int ioaddr = dev->base_addr;
-
-    unsigned char pos0 = inb(SK_POS0),
-                 pos1 = inb(SK_POS1),
-                 pos2 = inb(SK_POS2),
-                 pos3 = inb(SK_POS3),
-                 pos4 = inb(SK_POS4);
-
-
-    printk("## %s: %s.\n"
-           "##   pos0=%#4x pos1=%#4x pos2=%#04x pos3=%#08x pos4=%#04x\n",
-           SK_NAME, text, pos0, pos1, pos2, (pos3<<14), pos4);
-
-} /* End of SK_print_pos() */
-
-
-\f
-/*-
- * Function       : SK_print_dev
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/05/25
- *
- * Description    : This function simply prints out the important fields
- *                  of the device structure.
- *
- * Parameters     : I : struct net_device *dev  - SK_G16 device structure
- *                  I : char *text - Title for printing
- * Return Value   : None
- * Errors         : None
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-void SK_print_dev(struct net_device *dev, char *text)
-{
-    if (dev == NULL)
-    {
-       printk("## %s: Device Structure. %s\n", SK_NAME, text);
-       printk("## DEVICE == NULL\n");
-    }
-    else
-    {
-       printk("## %s: Device Structure. %s\n", SK_NAME, text);
-       printk("## Device Name: %s Base Address: %#06lx IRQ: %d\n", 
-               dev->name, dev->base_addr, dev->irq);
-              
-       printk("## next device: %#08x init function: %#08x\n", 
-              (int) dev->next, (int) dev->init);
-    }
-
-} /* End of SK_print_dev() */
-
-
-\f
-/*-
- * Function       : SK_print_ram
- * Author         : Patrick J.D. Weichmann
- * Date Created   : 94/06/02
- *
- * Description    : This function is used to check how are things set up
- *                  in the 16KB RAM. Also the pointers to the receive and 
- *                  transmit descriptor rings and rx and tx buffers locations.
- *                  It contains a minor bug in printing, but has no effect to the values
- *                  only newlines are not correct.
- *
- * Parameters     : I : struct net_device *dev - SK_G16 device structure
- * Return Value   : None
- * Errors         : None
- * Globals        : None
- * Update History :
- *     YY/MM/DD  uid  Description
--*/
-
-void __init SK_print_ram(struct net_device *dev)
-{
-
-    int i;    
-    struct priv *p = netdev_priv(dev);
-
-    printk("## %s: RAM Details.\n"
-           "##   RAM at %#08x tmdhead: %#08x rmdhead: %#08x initblock: %#08x\n",
-           SK_NAME, 
-           (unsigned int) p->ram,
-           (unsigned int) p->tmdhead, 
-           (unsigned int) p->rmdhead, 
-           (unsigned int) &(p->ram)->ib);
-           
-    printk("##   ");
-
-    for(i = 0; i < TMDNUM; i++)
-    {
-           if (!(i % 3)) /* Every third line do a newline */
-           {
-               printk("\n##   ");
-           }
-        printk("tmdbufs%d: %#08x ", (i+1), (int) p->tmdbufs[i]);
-    }
-    printk("##   ");
-
-    for(i = 0; i < RMDNUM; i++)
-    {
-         if (!(i % 3)) /* Every third line do a newline */
-           {
-               printk("\n##   ");
-           }
-        printk("rmdbufs%d: %#08x ", (i+1), (int) p->rmdbufs[i]);
-    } 
-    printk("\n");
-
-} /* End of SK_print_ram() */
-
diff --git a/drivers/net/sk_g16.h b/drivers/net/sk_g16.h
deleted file mode 100644 (file)
index 0a5dc09..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-/*-
- *
- * This software may be used and distributed according to the terms
- * of the GNU General Public License, incorporated herein by reference.
- *
- * Module         : sk_g16.h
- * Version        : $Revision$  
- *
- * Author         : M.Hipp (mhipp@student.uni-tuebingen.de)
- * changes by     : Patrick J.D. Weichmann
- *
- * Date Created   : 94/05/25
- *
- * Description    : In here are all necessary definitions of  
- *                  the am7990 (LANCE) chip used for writing a
- *                  network device driver which uses this chip 
- *
- * $Log$
--*/
-
-#ifndef SK_G16_H
-
-#define SK_G16_H
-
-
-/*
- *     Control and Status Register 0 (CSR0) bit definitions
- *
- * (R=Readable) (W=Writeable) (S=Set on write) (C-Clear on write)
- *
- */
-
-#define CSR0_ERR       0x8000  /* Error summary (R) */
-#define CSR0_BABL      0x4000  /* Babble transmitter timeout error (RC) */
-#define CSR0_CERR      0x2000  /* Collision Error (RC) */
-#define CSR0_MISS      0x1000  /* Missed packet (RC) */
-#define CSR0_MERR      0x0800  /* Memory Error  (RC) */ 
-#define CSR0_RINT      0x0400  /* Receiver Interrupt (RC) */
-#define CSR0_TINT       0x0200 /* Transmit Interrupt (RC) */ 
-#define CSR0_IDON      0x0100  /* Initialization Done (RC) */
-#define CSR0_INTR      0x0080  /* Interrupt Flag (R) */
-#define CSR0_INEA      0x0040  /* Interrupt Enable (RW) */
-#define CSR0_RXON      0x0020  /* Receiver on (R) */
-#define CSR0_TXON      0x0010  /* Transmitter on (R) */
-#define CSR0_TDMD      0x0008  /* Transmit Demand (RS) */
-#define CSR0_STOP      0x0004  /* Stop (RS) */
-#define CSR0_STRT      0x0002  /* Start (RS) */
-#define CSR0_INIT      0x0001  /* Initialize (RS) */
-
-#define CSR0_CLRALL     0x7f00  /* mask for all clearable bits */
-
-/*
- *    Control and Status Register 3 (CSR3) bit definitions
- *
- */
-
-#define CSR3_BSWAP     0x0004  /* Byte Swap (RW) */
-#define CSR3_ACON      0x0002  /* ALE Control (RW) */
-#define CSR3_BCON      0x0001  /* Byte Control (RW) */
-
-/*
- *     Initialization Block Mode operation Bit Definitions.
- */
-
-#define MODE_PROM      0x8000  /* Promiscuous Mode */
-#define MODE_INTL      0x0040  /* Internal Loopback */
-#define MODE_DRTY      0x0020  /* Disable Retry */ 
-#define MODE_COLL      0x0010  /* Force Collision */
-#define MODE_DTCR      0x0008  /* Disable Transmit CRC) */
-#define MODE_LOOP      0x0004  /* Loopback */
-#define MODE_DTX       0x0002  /* Disable the Transmitter */ 
-#define MODE_DRX       0x0001  /* Disable the Receiver */
-
-#define MODE_NORMAL    0x0000  /* Normal operation mode */
-
-/*
- *     Receive message descriptor status bit definitions.
- */
-
-#define RX_OWN         0x80    /* Owner bit 0 = host, 1 = lance */
-#define RX_ERR         0x40    /* Error Summary */
-#define RX_FRAM                0x20    /* Framing Error */
-#define RX_OFLO                0x10    /* Overflow Error */
-#define RX_CRC         0x08    /* CRC Error */ 
-#define RX_BUFF                0x04    /* Buffer Error */
-#define RX_STP         0x02    /* Start of Packet */
-#define RX_ENP         0x01    /* End of Packet */
-
-
-/*
- *     Transmit message descriptor status bit definitions.
- */
-
-#define TX_OWN         0x80    /* Owner bit 0 = host, 1 = lance */
-#define TX_ERR         0x40    /* Error Summary */
-#define TX_MORE                0x10    /* More the 1 retry needed to Xmit */
-#define TX_ONE         0x08    /* One retry needed to Xmit */
-#define TX_DEF         0x04    /* Deferred */
-#define TX_STP                 0x02    /* Start of Packet */
-#define TX_ENP         0x01    /* End of Packet */
-
-/*
- *      Transmit status (2) (valid if TX_ERR == 1)
- */
-
-#define TX_BUFF        0x8000  /* Buffering error (no ENP) */
-#define TX_UFLO        0x4000  /* Underflow (late memory) */
-#define TX_LCOL        0x1000  /* Late collision */
-#define TX_LCAR        0x0400  /* Loss of Carrier */
-#define TX_RTRY        0x0200  /* Failed after 16 retransmissions  */
-#define TX_TDR          0x003f  /* Time-domain-reflectometer-value */
-
-
-/* 
- * Structures used for Communication with the LANCE 
- */
-
-/* LANCE Initialize Block */
-
-struct init_block 
-{
-  unsigned short mode;     /* Mode Register */
-  unsigned char  paddr[6]; /* Physical Address (MAC) */
-  unsigned char  laddr[8]; /* Logical Filter Address (not used) */
-  unsigned int   rdrp;     /* Receive Descriptor Ring pointer */
-  unsigned int   tdrp;     /* Transmit Descriptor Ring pointer */
-};
-
-
-/* Receive Message Descriptor Entry */
-
-struct rmd 
-{ 
-  union
-  {
-    unsigned long buffer;     /* Address of buffer */
-    struct 
-    {
-      unsigned char unused[3]; 
-      unsigned volatile char status;   /* Status Bits */
-    } s;
-  } u;
-  volatile short blen;        /* Buffer Length (two's complement) */
-  unsigned short mlen;        /* Message Byte Count */
-};
-
-
-/* Transmit Message Descriptor Entry */
-
-struct tmd   
-{
-  union 
-  {
-    unsigned long  buffer;    /* Address of buffer */
-    struct 
-    {
-      unsigned char unused[3];
-      unsigned volatile char status;   /* Status Bits */
-    } s;
-  } u;
-  unsigned short blen;             /* Buffer Length (two's complement) */
-  unsigned volatile short status2; /* Error Status Bits */
-};
-
-#endif /* End of SK_G16_H */
diff --git a/drivers/net/skge.c b/drivers/net/skge.c
new file mode 100644 (file)
index 0000000..30e8d58
--- /dev/null
@@ -0,0 +1,3386 @@
+/*
+ * New driver for Marvell Yukon chipset and SysKonnect Gigabit
+ * Ethernet adapters. Based on earlier sk98lin, e100 and
+ * FreeBSD if_sk drivers.
+ *
+ * This driver intentionally does not support all the features
+ * of the original driver such as link fail-over and link management because
+ * those should be done at higher levels.
+ *
+ * Copyright (C) 2004, Stephen Hemminger <shemminger@osdl.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/ethtool.h>
+#include <linux/pci.h>
+#include <linux/if_vlan.h>
+#include <linux/ip.h>
+#include <linux/delay.h>
+#include <linux/crc32.h>
+#include <linux/dma-mapping.h>
+#include <asm/irq.h>
+
+#include "skge.h"
+
+#define DRV_NAME               "skge"
+#define DRV_VERSION            "0.6"
+#define PFX                    DRV_NAME " "
+
+#define DEFAULT_TX_RING_SIZE   128
+#define DEFAULT_RX_RING_SIZE   512
+#define MAX_TX_RING_SIZE       1024
+#define MAX_RX_RING_SIZE       4096
+#define PHY_RETRIES            1000
+#define ETH_JUMBO_MTU          9000
+#define TX_WATCHDOG            (5 * HZ)
+#define NAPI_WEIGHT            64
+#define BLINK_HZ               (HZ/4)
+#define LINK_POLL_HZ           (HZ/10)
+
+MODULE_DESCRIPTION("SysKonnect Gigabit Ethernet driver");
+MODULE_AUTHOR("Stephen Hemminger <shemminger@osdl.org>");
+MODULE_LICENSE("GPL");
+MODULE_VERSION(DRV_VERSION);
+
+static const u32 default_msg
+       = NETIF_MSG_DRV| NETIF_MSG_PROBE| NETIF_MSG_LINK
+         | NETIF_MSG_IFUP| NETIF_MSG_IFDOWN;
+
+static int debug = -1; /* defaults above */
+module_param(debug, int, 0);
+MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
+
+static const struct pci_device_id skge_id_table[] = {
+       { PCI_VENDOR_ID_3COM, PCI_DEVICE_ID_3COM_3C940,
+         PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_3COM, PCI_DEVICE_ID_3COM_3C940B,
+         PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_GE,
+         PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_YU,
+         PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_SYSKONNECT, 0x9E00, /* SK-9Exx  */
+         PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_DLINK, PCI_DEVICE_ID_DLINK_DGE510T,
+         PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_MARVELL, 0x4320, /* Gigabit Ethernet Controller */
+         PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_MARVELL, 0x5005, /* Marvell (11ab), Belkin */
+         PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_CNET, PCI_DEVICE_ID_CNET_GIGACARD,
+         PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_LINKSYS, PCI_DEVICE_ID_LINKSYS_EG1032,
+         PCI_ANY_ID, PCI_ANY_ID },
+       { PCI_VENDOR_ID_LINKSYS, PCI_DEVICE_ID_LINKSYS_EG1064,
+         PCI_ANY_ID, PCI_ANY_ID },
+       { 0 }
+};
+MODULE_DEVICE_TABLE(pci, skge_id_table);
+
+static int skge_up(struct net_device *dev);
+static int skge_down(struct net_device *dev);
+static void skge_tx_clean(struct skge_port *skge);
+static void skge_xm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val);
+static void skge_gm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val);
+static void genesis_get_stats(struct skge_port *skge, u64 *data);
+static void yukon_get_stats(struct skge_port *skge, u64 *data);
+static void yukon_init(struct skge_hw *hw, int port);
+static void yukon_reset(struct skge_hw *hw, int port);
+static void genesis_mac_init(struct skge_hw *hw, int port);
+static void genesis_reset(struct skge_hw *hw, int port);
+
+static const int txqaddr[] = { Q_XA1, Q_XA2 };
+static const int rxqaddr[] = { Q_R1, Q_R2 };
+static const u32 rxirqmask[] = { IS_R1_F, IS_R2_F };
+static const u32 txirqmask[] = { IS_XA1_F, IS_XA2_F };
+
+/* Don't need to look at whole 16K.
+ * last interesting register is descriptor poll timer.
+ */
+#define SKGE_REGS_LEN  (29*128)
+
+static int skge_get_regs_len(struct net_device *dev)
+{
+       return SKGE_REGS_LEN;
+}
+
+/*
+ * Returns copy of control register region
+ * I/O region is divided into banks and certain regions are unreadable
+ */
+static void skge_get_regs(struct net_device *dev, struct ethtool_regs *regs,
+                         void *p)
+{
+       const struct skge_port *skge = netdev_priv(dev);
+       unsigned long offs;
+       const void __iomem *io = skge->hw->regs;
+       static const unsigned long bankmap
+               = (1<<0) | (1<<2) | (1<<8) | (1<<9)
+                 | (1<<12) | (1<<13) | (1<<14) | (1<<15) | (1<<16)
+                 | (1<<17) | (1<<20) | (1<<21) | (1<<22) | (1<<23)
+                 | (1<<24)  | (1<<25) | (1<<26) | (1<<27) | (1<<28);
+
+       regs->version = 1;
+       for (offs = 0; offs < regs->len; offs += 128) {
+               u32 len = min_t(u32, 128, regs->len - offs);
+
+               if (bankmap & (1<<(offs/128)))
+                       memcpy_fromio(p + offs, io + offs, len);
+               else
+                       memset(p + offs, 0, len);
+       }
+}
+
+/* Wake on Lan only supported on Yukon chps with rev 1 or above */
+static int wol_supported(const struct skge_hw *hw)
+{
+       return !((hw->chip_id == CHIP_ID_GENESIS ||
+                 (hw->chip_id == CHIP_ID_YUKON && chip_rev(hw) == 0)));
+}
+
+static void skge_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+{
+       struct skge_port *skge = netdev_priv(dev);
+
+       wol->supported = wol_supported(skge->hw) ? WAKE_MAGIC : 0;
+       wol->wolopts = skge->wol ? WAKE_MAGIC : 0;
+}
+
+static int skge_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+
+       if(wol->wolopts != WAKE_MAGIC && wol->wolopts != 0)
+               return -EOPNOTSUPP;
+
+       if (wol->wolopts == WAKE_MAGIC && !wol_supported(hw))
+               return -EOPNOTSUPP;
+
+       skge->wol = wol->wolopts == WAKE_MAGIC;
+
+       if (skge->wol) {
+               memcpy_toio(hw->regs + WOL_MAC_ADDR, dev->dev_addr, ETH_ALEN);
+
+               skge_write16(hw, WOL_CTRL_STAT,
+                            WOL_CTL_ENA_PME_ON_MAGIC_PKT |
+                            WOL_CTL_ENA_MAGIC_PKT_UNIT);
+       } else
+               skge_write16(hw, WOL_CTRL_STAT, WOL_CTL_DEFAULT);
+
+       return 0;
+}
+
+
+static int skge_get_settings(struct net_device *dev,
+                            struct ethtool_cmd *ecmd)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+
+       ecmd->transceiver = XCVR_INTERNAL;
+
+       if (iscopper(hw)) {
+               if (hw->chip_id == CHIP_ID_GENESIS)
+                       ecmd->supported = SUPPORTED_1000baseT_Full
+                               | SUPPORTED_1000baseT_Half
+                               | SUPPORTED_Autoneg | SUPPORTED_TP;
+               else {
+                       ecmd->supported = SUPPORTED_10baseT_Half
+                               | SUPPORTED_10baseT_Full
+                               | SUPPORTED_100baseT_Half
+                               | SUPPORTED_100baseT_Full
+                               | SUPPORTED_1000baseT_Half
+                               | SUPPORTED_1000baseT_Full
+                               | SUPPORTED_Autoneg| SUPPORTED_TP;
+
+                       if (hw->chip_id == CHIP_ID_YUKON)
+                               ecmd->supported &= ~SUPPORTED_1000baseT_Half;
+
+                       else if (hw->chip_id == CHIP_ID_YUKON_FE)
+                               ecmd->supported &= ~(SUPPORTED_1000baseT_Half
+                                                    | SUPPORTED_1000baseT_Full);
+               }
+
+               ecmd->port = PORT_TP;
+               ecmd->phy_address = hw->phy_addr;
+       } else {
+               ecmd->supported = SUPPORTED_1000baseT_Full
+                       | SUPPORTED_FIBRE
+                       | SUPPORTED_Autoneg;
+
+               ecmd->port = PORT_FIBRE;
+       }
+
+       ecmd->advertising = skge->advertising;
+       ecmd->autoneg = skge->autoneg;
+       ecmd->speed = skge->speed;
+       ecmd->duplex = skge->duplex;
+       return 0;
+}
+
+static u32 skge_modes(const struct skge_hw *hw)
+{
+       u32 modes = ADVERTISED_Autoneg
+               | ADVERTISED_1000baseT_Full | ADVERTISED_1000baseT_Half
+               | ADVERTISED_100baseT_Full | ADVERTISED_100baseT_Half
+               | ADVERTISED_10baseT_Full | ADVERTISED_10baseT_Half;
+
+       if (iscopper(hw)) {
+               modes |= ADVERTISED_TP;
+               switch(hw->chip_id) {
+               case CHIP_ID_GENESIS:
+                       modes &= ~(ADVERTISED_100baseT_Full
+                                  | ADVERTISED_100baseT_Half
+                                  | ADVERTISED_10baseT_Full
+                                  | ADVERTISED_10baseT_Half);
+                       break;
+
+               case CHIP_ID_YUKON:
+                       modes &= ~ADVERTISED_1000baseT_Half;
+                       break;
+
+               case CHIP_ID_YUKON_FE:
+                       modes &= ~(ADVERTISED_1000baseT_Half|ADVERTISED_1000baseT_Full);
+                       break;
+               }
+       } else {
+               modes |= ADVERTISED_FIBRE;
+               modes &= ~ADVERTISED_1000baseT_Half;
+       }
+       return modes;
+}
+
+static int skge_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       const struct skge_hw *hw = skge->hw;
+
+       if (ecmd->autoneg == AUTONEG_ENABLE) {
+               if (ecmd->advertising & skge_modes(hw))
+                       return -EINVAL;
+       } else {
+               switch(ecmd->speed) {
+               case SPEED_1000:
+                       if (hw->chip_id == CHIP_ID_YUKON_FE)
+                               return -EINVAL;
+                       break;
+               case SPEED_100:
+               case SPEED_10:
+                       if (iscopper(hw) || hw->chip_id == CHIP_ID_GENESIS)
+                               return -EINVAL;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+       }
+
+       skge->autoneg = ecmd->autoneg;
+       skge->speed = ecmd->speed;
+       skge->duplex = ecmd->duplex;
+       skge->advertising = ecmd->advertising;
+
+       if (netif_running(dev)) {
+               skge_down(dev);
+               skge_up(dev);
+       }
+       return (0);
+}
+
+static void skge_get_drvinfo(struct net_device *dev,
+                            struct ethtool_drvinfo *info)
+{
+       struct skge_port *skge = netdev_priv(dev);
+
+       strcpy(info->driver, DRV_NAME);
+       strcpy(info->version, DRV_VERSION);
+       strcpy(info->fw_version, "N/A");
+       strcpy(info->bus_info, pci_name(skge->hw->pdev));
+}
+
+static const struct skge_stat {
+       char       name[ETH_GSTRING_LEN];
+       u16        xmac_offset;
+       u16        gma_offset;
+} skge_stats[] = {
+       { "tx_bytes",           XM_TXO_OK_HI,  GM_TXO_OK_HI },
+       { "rx_bytes",           XM_RXO_OK_HI,  GM_RXO_OK_HI },
+
+       { "tx_broadcast",       XM_TXF_BC_OK,  GM_TXF_BC_OK },
+       { "rx_broadcast",       XM_RXF_BC_OK,  GM_RXF_BC_OK },
+       { "tx_multicast",       XM_TXF_MC_OK,  GM_TXF_MC_OK },
+       { "rx_multicast",       XM_RXF_MC_OK,  GM_RXF_MC_OK },
+       { "tx_unicast",         XM_TXF_UC_OK,  GM_TXF_UC_OK },
+       { "rx_unicast",         XM_RXF_UC_OK,  GM_RXF_UC_OK },
+       { "tx_mac_pause",       XM_TXF_MPAUSE, GM_TXF_MPAUSE },
+       { "rx_mac_pause",       XM_RXF_MPAUSE, GM_RXF_MPAUSE },
+
+       { "collisions",         XM_TXF_SNG_COL, GM_TXF_SNG_COL },
+       { "multi_collisions",   XM_TXF_MUL_COL, GM_TXF_MUL_COL },
+       { "aborted",            XM_TXF_ABO_COL, GM_TXF_ABO_COL },
+       { "late_collision",     XM_TXF_LAT_COL, GM_TXF_LAT_COL },
+       { "fifo_underrun",      XM_TXE_FIFO_UR, GM_TXE_FIFO_UR },
+       { "fifo_overflow",      XM_RXE_FIFO_OV, GM_RXE_FIFO_OV },
+
+       { "rx_toolong",         XM_RXF_LNG_ERR, GM_RXF_LNG_ERR },
+       { "rx_jabber",          XM_RXF_JAB_PKT, GM_RXF_JAB_PKT },
+       { "rx_runt",            XM_RXE_RUNT,    GM_RXE_FRAG },
+       { "rx_too_long",        XM_RXF_LNG_ERR, GM_RXF_LNG_ERR },
+       { "rx_fcs_error",       XM_RXF_FCS_ERR, GM_RXF_FCS_ERR },
+};
+
+static int skge_get_stats_count(struct net_device *dev)
+{
+       return ARRAY_SIZE(skge_stats);
+}
+
+static void skge_get_ethtool_stats(struct net_device *dev,
+                                  struct ethtool_stats *stats, u64 *data)
+{
+       struct skge_port *skge = netdev_priv(dev);
+
+       if (skge->hw->chip_id == CHIP_ID_GENESIS)
+               genesis_get_stats(skge, data);
+       else
+               yukon_get_stats(skge, data);
+}
+
+/* Use hardware MIB variables for critical path statistics and
+ * transmit feedback not reported at interrupt.
+ * Other errors are accounted for in interrupt handler.
+ */
+static struct net_device_stats *skge_get_stats(struct net_device *dev)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       u64 data[ARRAY_SIZE(skge_stats)];
+
+       if (skge->hw->chip_id == CHIP_ID_GENESIS)
+               genesis_get_stats(skge, data);
+       else
+               yukon_get_stats(skge, data);
+
+       skge->net_stats.tx_bytes = data[0];
+       skge->net_stats.rx_bytes = data[1];
+       skge->net_stats.tx_packets = data[2] + data[4] + data[6];
+       skge->net_stats.rx_packets = data[3] + data[5] + data[7];
+       skge->net_stats.multicast = data[5] + data[7];
+       skge->net_stats.collisions = data[10];
+       skge->net_stats.tx_aborted_errors = data[12];
+
+       return &skge->net_stats;
+}
+
+static void skge_get_strings(struct net_device *dev, u32 stringset, u8 *data)
+{
+       int i;
+
+       switch(stringset) {
+       case ETH_SS_STATS:
+               for (i = 0; i < ARRAY_SIZE(skge_stats); i++)
+                       memcpy(data + i * ETH_GSTRING_LEN,
+                              skge_stats[i].name, ETH_GSTRING_LEN);
+               break;
+       }
+}
+
+static void skge_get_ring_param(struct net_device *dev,
+                               struct ethtool_ringparam *p)
+{
+       struct skge_port *skge = netdev_priv(dev);
+
+       p->rx_max_pending = MAX_RX_RING_SIZE;
+       p->tx_max_pending = MAX_TX_RING_SIZE;
+       p->rx_mini_max_pending = 0;
+       p->rx_jumbo_max_pending = 0;
+
+       p->rx_pending = skge->rx_ring.count;
+       p->tx_pending = skge->tx_ring.count;
+       p->rx_mini_pending = 0;
+       p->rx_jumbo_pending = 0;
+}
+
+static int skge_set_ring_param(struct net_device *dev,
+                              struct ethtool_ringparam *p)
+{
+       struct skge_port *skge = netdev_priv(dev);
+
+       if (p->rx_pending == 0 || p->rx_pending > MAX_RX_RING_SIZE ||
+           p->tx_pending == 0 || p->tx_pending > MAX_TX_RING_SIZE)
+               return -EINVAL;
+
+       skge->rx_ring.count = p->rx_pending;
+       skge->tx_ring.count = p->tx_pending;
+
+       if (netif_running(dev)) {
+               skge_down(dev);
+               skge_up(dev);
+       }
+
+       return 0;
+}
+
+static u32 skge_get_msglevel(struct net_device *netdev)
+{
+       struct skge_port *skge = netdev_priv(netdev);
+       return skge->msg_enable;
+}
+
+static void skge_set_msglevel(struct net_device *netdev, u32 value)
+{
+       struct skge_port *skge = netdev_priv(netdev);
+       skge->msg_enable = value;
+}
+
+static int skge_nway_reset(struct net_device *dev)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+
+       if (skge->autoneg != AUTONEG_ENABLE || !netif_running(dev))
+               return -EINVAL;
+
+       spin_lock_bh(&hw->phy_lock);
+       if (hw->chip_id == CHIP_ID_GENESIS) {
+               genesis_reset(hw, port);
+               genesis_mac_init(hw, port);
+       } else {
+               yukon_reset(hw, port);
+               yukon_init(hw, port);
+       }
+       spin_unlock_bh(&hw->phy_lock);
+       return 0;
+}
+
+static int skge_set_sg(struct net_device *dev, u32 data)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+
+       if (hw->chip_id == CHIP_ID_GENESIS && data)
+               return -EOPNOTSUPP;
+       return ethtool_op_set_sg(dev, data);
+}
+
+static int skge_set_tx_csum(struct net_device *dev, u32 data)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+
+       if (hw->chip_id == CHIP_ID_GENESIS && data)
+               return -EOPNOTSUPP;
+
+       return ethtool_op_set_tx_csum(dev, data);
+}
+
+static u32 skge_get_rx_csum(struct net_device *dev)
+{
+       struct skge_port *skge = netdev_priv(dev);
+
+       return skge->rx_csum;
+}
+
+/* Only Yukon supports checksum offload. */
+static int skge_set_rx_csum(struct net_device *dev, u32 data)
+{
+       struct skge_port *skge = netdev_priv(dev);
+
+       if (skge->hw->chip_id == CHIP_ID_GENESIS && data)
+               return -EOPNOTSUPP;
+
+       skge->rx_csum = data;
+       return 0;
+}
+
+/* Only Yukon II supports TSO (not implemented yet) */
+static int skge_set_tso(struct net_device *dev, u32 data)
+{
+       if (data)
+               return -EOPNOTSUPP;
+       return 0;
+}
+
+static void skge_get_pauseparam(struct net_device *dev,
+                               struct ethtool_pauseparam *ecmd)
+{
+       struct skge_port *skge = netdev_priv(dev);
+
+       ecmd->tx_pause = (skge->flow_control == FLOW_MODE_LOC_SEND)
+               || (skge->flow_control == FLOW_MODE_SYMMETRIC);
+       ecmd->rx_pause = (skge->flow_control == FLOW_MODE_REM_SEND)
+               || (skge->flow_control == FLOW_MODE_SYMMETRIC);
+
+       ecmd->autoneg = skge->autoneg;
+}
+
+static int skge_set_pauseparam(struct net_device *dev,
+                              struct ethtool_pauseparam *ecmd)
+{
+       struct skge_port *skge = netdev_priv(dev);
+
+       skge->autoneg = ecmd->autoneg;
+       if (ecmd->rx_pause && ecmd->tx_pause)
+               skge->flow_control = FLOW_MODE_SYMMETRIC;
+       else if(ecmd->rx_pause && !ecmd->tx_pause)
+               skge->flow_control = FLOW_MODE_REM_SEND;
+       else if(!ecmd->rx_pause && ecmd->tx_pause)
+               skge->flow_control = FLOW_MODE_LOC_SEND;
+       else
+               skge->flow_control = FLOW_MODE_NONE;
+
+       if (netif_running(dev)) {
+               skge_down(dev);
+               skge_up(dev);
+       }
+       return 0;
+}
+
+/* Chip internal frequency for clock calculations */
+static inline u32 hwkhz(const struct skge_hw *hw)
+{
+       if (hw->chip_id == CHIP_ID_GENESIS)
+               return 53215; /* or:  53.125 MHz */
+       else if (hw->chip_id == CHIP_ID_YUKON_EC)
+               return 125000; /* or: 125.000 MHz */
+       else
+               return 78215; /* or:  78.125 MHz */
+}
+
+/* Chip hz to microseconds */
+static inline u32 skge_clk2usec(const struct skge_hw *hw, u32 ticks)
+{
+       return (ticks * 1000) / hwkhz(hw);
+}
+
+/* Microseconds to chip hz */
+static inline u32 skge_usecs2clk(const struct skge_hw *hw, u32 usec)
+{
+       return hwkhz(hw) * usec / 1000;
+}
+
+static int skge_get_coalesce(struct net_device *dev,
+                            struct ethtool_coalesce *ecmd)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+
+       ecmd->rx_coalesce_usecs = 0;
+       ecmd->tx_coalesce_usecs = 0;
+
+       if (skge_read32(hw, B2_IRQM_CTRL) & TIM_START) {
+               u32 delay = skge_clk2usec(hw, skge_read32(hw, B2_IRQM_INI));
+               u32 msk = skge_read32(hw, B2_IRQM_MSK);
+
+               if (msk & rxirqmask[port])
+                       ecmd->rx_coalesce_usecs = delay;
+               if (msk & txirqmask[port])
+                       ecmd->tx_coalesce_usecs = delay;
+       }
+
+       return 0;
+}
+
+/* Note: interrupt timer is per board, but can turn on/off per port */
+static int skge_set_coalesce(struct net_device *dev,
+                            struct ethtool_coalesce *ecmd)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+       u32 msk = skge_read32(hw, B2_IRQM_MSK);
+       u32 delay = 25;
+
+       if (ecmd->rx_coalesce_usecs == 0)
+               msk &= ~rxirqmask[port];
+       else if (ecmd->rx_coalesce_usecs < 25 ||
+                ecmd->rx_coalesce_usecs > 33333)
+               return -EINVAL;
+       else {
+               msk |= rxirqmask[port];
+               delay = ecmd->rx_coalesce_usecs;
+       }
+
+       if (ecmd->tx_coalesce_usecs == 0)
+               msk &= ~txirqmask[port];
+       else if (ecmd->tx_coalesce_usecs < 25 ||
+                ecmd->tx_coalesce_usecs > 33333)
+               return -EINVAL;
+       else {
+               msk |= txirqmask[port];
+               delay = min(delay, ecmd->rx_coalesce_usecs);
+       }
+
+       skge_write32(hw, B2_IRQM_MSK, msk);
+       if (msk == 0)
+               skge_write32(hw, B2_IRQM_CTRL, TIM_STOP);
+       else {
+               skge_write32(hw, B2_IRQM_INI, skge_usecs2clk(hw, delay));
+               skge_write32(hw, B2_IRQM_CTRL, TIM_START);
+       }
+       return 0;
+}
+
+static void skge_led_on(struct skge_hw *hw, int port)
+{
+       if (hw->chip_id == CHIP_ID_GENESIS) {
+               skge_write8(hw, SKGEMAC_REG(port, LNK_LED_REG), LINKLED_ON);
+               skge_write8(hw, B0_LED, LED_STAT_ON);
+
+               skge_write8(hw, SKGEMAC_REG(port, RX_LED_TST), LED_T_ON);
+               skge_write32(hw, SKGEMAC_REG(port, RX_LED_VAL), 100);
+               skge_write8(hw, SKGEMAC_REG(port, RX_LED_CTRL), LED_START);
+
+               switch (hw->phy_type) {
+               case SK_PHY_BCOM:
+                       skge_xm_phy_write(hw, port, PHY_BCOM_P_EXT_CTRL,
+                                         PHY_B_PEC_LED_ON);
+                       break;
+               case SK_PHY_LONE:
+                       skge_xm_phy_write(hw, port, PHY_LONE_LED_CFG,
+                                         0x0800);
+                       break;
+               default:
+                       skge_write8(hw, SKGEMAC_REG(port, TX_LED_TST), LED_T_ON);
+                       skge_write32(hw, SKGEMAC_REG(port, TX_LED_VAL), 100);
+                       skge_write8(hw, SKGEMAC_REG(port, TX_LED_CTRL), LED_START);
+               }
+       } else {
+               skge_gm_phy_write(hw, port, PHY_MARV_LED_CTRL, 0);
+               skge_gm_phy_write(hw, port, PHY_MARV_LED_OVER,
+                                 PHY_M_LED_MO_DUP(MO_LED_ON)  |
+                                 PHY_M_LED_MO_10(MO_LED_ON)   |
+                                 PHY_M_LED_MO_100(MO_LED_ON)  |
+                                 PHY_M_LED_MO_1000(MO_LED_ON) |
+                                 PHY_M_LED_MO_RX(MO_LED_ON));
+       }
+}
+
+static void skge_led_off(struct skge_hw *hw, int port)
+{
+       if (hw->chip_id == CHIP_ID_GENESIS) {
+               skge_write8(hw, SKGEMAC_REG(port, LNK_LED_REG), LINKLED_OFF);
+               skge_write8(hw, B0_LED, LED_STAT_OFF);
+
+               skge_write32(hw, SKGEMAC_REG(port, RX_LED_VAL), 0);
+               skge_write8(hw, SKGEMAC_REG(port, RX_LED_CTRL), LED_T_OFF);
+
+               switch (hw->phy_type) {
+               case SK_PHY_BCOM:
+                       skge_xm_phy_write(hw, port, PHY_BCOM_P_EXT_CTRL,
+                                         PHY_B_PEC_LED_OFF);
+                       break;
+               case SK_PHY_LONE:
+                       skge_xm_phy_write(hw, port, PHY_LONE_LED_CFG,
+                                         PHY_L_LC_LEDT);
+                       break;
+               default:
+                       skge_write32(hw, SKGEMAC_REG(port, TX_LED_VAL), 0);
+                       skge_write8(hw, SKGEMAC_REG(port, TX_LED_CTRL), LED_T_OFF);
+               }
+       } else {
+               skge_gm_phy_write(hw, port, PHY_MARV_LED_CTRL, 0);
+               skge_gm_phy_write(hw, port, PHY_MARV_LED_OVER,
+                                 PHY_M_LED_MO_DUP(MO_LED_OFF)  |
+                                 PHY_M_LED_MO_10(MO_LED_OFF)   |
+                                 PHY_M_LED_MO_100(MO_LED_OFF)  |
+                                 PHY_M_LED_MO_1000(MO_LED_OFF) |
+                                 PHY_M_LED_MO_RX(MO_LED_OFF));
+       }
+}
+
+static void skge_blink_timer(unsigned long data)
+{
+       struct skge_port *skge = (struct skge_port *) data;
+       struct skge_hw *hw = skge->hw;
+       unsigned long flags;
+
+       spin_lock_irqsave(&hw->phy_lock, flags);
+       if (skge->blink_on)
+               skge_led_on(hw, skge->port);
+       else
+               skge_led_off(hw, skge->port);
+       spin_unlock_irqrestore(&hw->phy_lock, flags);
+
+       skge->blink_on = !skge->blink_on;
+       mod_timer(&skge->led_blink, jiffies + BLINK_HZ);
+}
+
+/* blink LED's for finding board */
+static int skge_phys_id(struct net_device *dev, u32 data)
+{
+       struct skge_port *skge = netdev_priv(dev);
+
+       if(!data || data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ))
+               data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ);
+
+       /* start blinking */
+       skge->blink_on = 1;
+       mod_timer(&skge->led_blink, jiffies+1);
+
+       msleep_interruptible(data * 1000);
+       del_timer_sync(&skge->led_blink);
+
+       skge_led_off(skge->hw, skge->port);
+
+       return 0;
+}
+
+static struct ethtool_ops skge_ethtool_ops = {
+       .get_settings   = skge_get_settings,
+       .set_settings   = skge_set_settings,
+       .get_drvinfo    = skge_get_drvinfo,
+       .get_regs_len   = skge_get_regs_len,
+       .get_regs       = skge_get_regs,
+       .get_wol        = skge_get_wol,
+       .set_wol        = skge_set_wol,
+       .get_msglevel   = skge_get_msglevel,
+       .set_msglevel   = skge_set_msglevel,
+       .nway_reset     = skge_nway_reset,
+       .get_link       = ethtool_op_get_link,
+       .get_ringparam  = skge_get_ring_param,
+       .set_ringparam  = skge_set_ring_param,
+       .get_pauseparam = skge_get_pauseparam,
+       .set_pauseparam = skge_set_pauseparam,
+       .get_coalesce   = skge_get_coalesce,
+       .set_coalesce   = skge_set_coalesce,
+       .get_tso        = ethtool_op_get_tso,
+       .set_tso        = skge_set_tso,
+       .get_sg         = ethtool_op_get_sg,
+       .set_sg         = skge_set_sg,
+       .get_tx_csum    = ethtool_op_get_tx_csum,
+       .set_tx_csum    = skge_set_tx_csum,
+       .get_rx_csum    = skge_get_rx_csum,
+       .set_rx_csum    = skge_set_rx_csum,
+       .get_strings    = skge_get_strings,
+       .phys_id        = skge_phys_id,
+       .get_stats_count = skge_get_stats_count,
+       .get_ethtool_stats = skge_get_ethtool_stats,
+};
+
+/*
+ * Allocate ring elements and chain them together
+ * One-to-one association of board descriptors with ring elements
+ */
+static int skge_ring_alloc(struct skge_ring *ring, void *vaddr, u64 base)
+{
+       struct skge_tx_desc *d;
+       struct skge_element *e;
+       int i;
+
+       ring->start = kmalloc(sizeof(*e)*ring->count, GFP_KERNEL);
+       if (!ring->start)
+               return -ENOMEM;
+
+       for (i = 0, e = ring->start, d = vaddr; i < ring->count; i++, e++, d++) {
+               e->desc = d;
+               if (i == ring->count - 1) {
+                       e->next = ring->start;
+                       d->next_offset = base;
+               } else {
+                       e->next = e + 1;
+                       d->next_offset = base + (i+1) * sizeof(*d);
+               }
+       }
+       ring->to_use = ring->to_clean = ring->start;
+
+       return 0;
+}
+
+/* Setup buffer for receiving */
+static inline int skge_rx_alloc(struct skge_port *skge,
+                               struct skge_element *e)
+{
+       unsigned long bufsize = skge->netdev->mtu + ETH_HLEN; /* VLAN? */
+       struct skge_rx_desc *rd = e->desc;
+       struct sk_buff *skb;
+       u64 map;
+
+       skb = dev_alloc_skb(bufsize + NET_IP_ALIGN);
+       if (unlikely(!skb)) {
+               printk(KERN_DEBUG PFX "%s: out of memory for receive\n",
+                      skge->netdev->name);
+               return -ENOMEM;
+       }
+
+       skb->dev = skge->netdev;
+       skb_reserve(skb, NET_IP_ALIGN);
+
+       map = pci_map_single(skge->hw->pdev, skb->data, bufsize,
+                            PCI_DMA_FROMDEVICE);
+
+       rd->dma_lo = map;
+       rd->dma_hi = map >> 32;
+       e->skb = skb;
+       rd->csum1_start = ETH_HLEN;
+       rd->csum2_start = ETH_HLEN;
+       rd->csum1 = 0;
+       rd->csum2 = 0;
+
+       wmb();
+
+       rd->control = BMU_OWN | BMU_STF | BMU_IRQ_EOF | BMU_TCP_CHECK | bufsize;
+       pci_unmap_addr_set(e, mapaddr, map);
+       pci_unmap_len_set(e, maplen, bufsize);
+       return 0;
+}
+
+/* Free all unused buffers in receive ring, assumes receiver stopped */
+static void skge_rx_clean(struct skge_port *skge)
+{
+       struct skge_hw *hw = skge->hw;
+       struct skge_ring *ring = &skge->rx_ring;
+       struct skge_element *e;
+
+       for (e = ring->to_clean; e != ring->to_use; e = e->next) {
+               struct skge_rx_desc *rd = e->desc;
+               rd->control = 0;
+
+               pci_unmap_single(hw->pdev,
+                                pci_unmap_addr(e, mapaddr),
+                                pci_unmap_len(e, maplen),
+                                PCI_DMA_FROMDEVICE);
+               dev_kfree_skb(e->skb);
+               e->skb = NULL;
+       }
+       ring->to_clean = e;
+}
+
+/* Allocate buffers for receive ring
+ * For receive: to_use   is refill location
+ *              to_clean is next received frame.
+ *
+ * if (to_use == to_clean)
+ *      then ring all frames in ring need buffers
+ * if (to_use->next == to_clean)
+ *      then ring all frames in ring have buffers
+ */
+static int skge_rx_fill(struct skge_port *skge)
+{
+       struct skge_ring *ring = &skge->rx_ring;
+       struct skge_element *e;
+       int ret = 0;
+
+       for (e = ring->to_use; e->next != ring->to_clean; e = e->next) {
+               if (skge_rx_alloc(skge, e)) {
+                       ret = 1;
+                       break;
+               }
+
+       }
+       ring->to_use = e;
+
+       return ret;
+}
+
+static void skge_link_up(struct skge_port *skge)
+{
+       netif_carrier_on(skge->netdev);
+       if (skge->tx_avail > MAX_SKB_FRAGS + 1)
+               netif_wake_queue(skge->netdev);
+
+       if (netif_msg_link(skge))
+               printk(KERN_INFO PFX
+                      "%s: Link is up at %d Mbps, %s duplex, flow control %s\n",
+                      skge->netdev->name, skge->speed,
+                      skge->duplex == DUPLEX_FULL ? "full" : "half",
+                      (skge->flow_control == FLOW_MODE_NONE) ? "none" :
+                      (skge->flow_control == FLOW_MODE_LOC_SEND) ? "tx only" :
+                      (skge->flow_control == FLOW_MODE_REM_SEND) ? "rx only" :
+                      (skge->flow_control == FLOW_MODE_SYMMETRIC) ? "tx and rx" :
+                      "unknown");
+}
+
+static void skge_link_down(struct skge_port *skge)
+{
+       netif_carrier_off(skge->netdev);
+       netif_stop_queue(skge->netdev);
+
+       if (netif_msg_link(skge))
+               printk(KERN_INFO PFX "%s: Link is down.\n", skge->netdev->name);
+}
+
+static u16 skge_xm_phy_read(struct skge_hw *hw, int port,  u16 reg)
+{
+       int i;
+       u16 v;
+
+       skge_xm_write16(hw, port, XM_PHY_ADDR, reg | hw->phy_addr);
+       v = skge_xm_read16(hw, port, XM_PHY_DATA);
+       if (hw->phy_type != SK_PHY_XMAC) {
+               for (i = 0; i < PHY_RETRIES; i++) {
+                       udelay(1);
+                       if (skge_xm_read16(hw, port, XM_MMU_CMD)
+                           & XM_MMU_PHY_RDY)
+                               goto ready;
+               }
+
+               printk(KERN_WARNING PFX "%s: phy read timed out\n",
+                      hw->dev[port]->name);
+               return 0;
+       ready:
+               v = skge_xm_read16(hw, port, XM_PHY_DATA);
+       }
+
+       return v;
+}
+
+static void skge_xm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val)
+{
+       int i;
+
+       skge_xm_write16(hw, port, XM_PHY_ADDR, reg | hw->phy_addr);
+       for (i = 0; i < PHY_RETRIES; i++) {
+               if (!(skge_xm_read16(hw, port, XM_MMU_CMD) & XM_MMU_PHY_BUSY))
+                       goto ready;
+               cpu_relax();
+       }
+       printk(KERN_WARNING PFX "%s: phy write failed to come ready\n",
+              hw->dev[port]->name);
+
+
+ ready:
+       skge_xm_write16(hw, port, XM_PHY_DATA, val);
+       for (i = 0; i < PHY_RETRIES; i++) {
+               udelay(1);
+               if (!(skge_xm_read16(hw, port, XM_MMU_CMD) & XM_MMU_PHY_BUSY))
+                       return;
+       }
+       printk(KERN_WARNING PFX "%s: phy write timed out\n",
+                      hw->dev[port]->name);
+}
+
+static void genesis_init(struct skge_hw *hw)
+{
+       /* set blink source counter */
+       skge_write32(hw, B2_BSC_INI, (SK_BLK_DUR * SK_FACT_53) / 100);
+       skge_write8(hw, B2_BSC_CTRL, BSC_START);
+
+       /* configure mac arbiter */
+       skge_write16(hw, B3_MA_TO_CTRL, MA_RST_CLR);
+
+       /* configure mac arbiter timeout values */
+       skge_write8(hw, B3_MA_TOINI_RX1, SK_MAC_TO_53);
+       skge_write8(hw, B3_MA_TOINI_RX2, SK_MAC_TO_53);
+       skge_write8(hw, B3_MA_TOINI_TX1, SK_MAC_TO_53);
+       skge_write8(hw, B3_MA_TOINI_TX2, SK_MAC_TO_53);
+
+       skge_write8(hw, B3_MA_RCINI_RX1, 0);
+       skge_write8(hw, B3_MA_RCINI_RX2, 0);
+       skge_write8(hw, B3_MA_RCINI_TX1, 0);
+       skge_write8(hw, B3_MA_RCINI_TX2, 0);
+
+       /* configure packet arbiter timeout */
+       skge_write16(hw, B3_PA_CTRL, PA_RST_CLR);
+       skge_write16(hw, B3_PA_TOINI_RX1, SK_PKT_TO_MAX);
+       skge_write16(hw, B3_PA_TOINI_TX1, SK_PKT_TO_MAX);
+       skge_write16(hw, B3_PA_TOINI_RX2, SK_PKT_TO_MAX);
+       skge_write16(hw, B3_PA_TOINI_TX2, SK_PKT_TO_MAX);
+}
+
+static void genesis_reset(struct skge_hw *hw, int port)
+{
+       int i;
+       u64 zero = 0;
+
+       /* reset the statistics module */
+       skge_xm_write32(hw, port, XM_GP_PORT, XM_GP_RES_STAT);
+       skge_xm_write16(hw, port, XM_IMSK, 0xffff);     /* disable XMAC IRQs */
+       skge_xm_write32(hw, port, XM_MODE, 0);          /* clear Mode Reg */
+       skge_xm_write16(hw, port, XM_TX_CMD, 0);        /* reset TX CMD Reg */
+       skge_xm_write16(hw, port, XM_RX_CMD, 0);        /* reset RX CMD Reg */
+
+       /* disable all PHY IRQs */
+       if  (hw->phy_type == SK_PHY_BCOM)
+               skge_xm_write16(hw, port, PHY_BCOM_INT_MASK, 0xffff);
+
+       skge_xm_outhash(hw, port, XM_HSM, (u8 *) &zero);
+       for (i = 0; i < 15; i++)
+               skge_xm_outaddr(hw, port, XM_EXM(i), (u8 *) &zero);
+       skge_xm_outhash(hw, port, XM_SRC_CHK, (u8 *) &zero);
+}
+
+
+static void genesis_mac_init(struct skge_hw *hw, int port)
+{
+       struct skge_port *skge = netdev_priv(hw->dev[port]);
+       int i;
+       u32 r;
+       u16 id1;
+       u16 ctrl1, ctrl2, ctrl3, ctrl4, ctrl5;
+
+       /* magic workaround patterns for Broadcom */
+       static const struct {
+               u16 reg;
+               u16 val;
+       } A1hack[] = {
+               { 0x18, 0x0c20 }, { 0x17, 0x0012 }, { 0x15, 0x1104 },
+               { 0x17, 0x0013 }, { 0x15, 0x0404 }, { 0x17, 0x8006 },
+               { 0x15, 0x0132 }, { 0x17, 0x8006 }, { 0x15, 0x0232 },
+               { 0x17, 0x800D }, { 0x15, 0x000F }, { 0x18, 0x0420 },
+       }, C0hack[] = {
+               { 0x18, 0x0c20 }, { 0x17, 0x0012 }, { 0x15, 0x1204 },
+               { 0x17, 0x0013 }, { 0x15, 0x0A04 }, { 0x18, 0x0420 },
+       };
+
+
+       /* initialize Rx, Tx and Link LED */
+       skge_write8(hw, SKGEMAC_REG(port, LNK_LED_REG), LINKLED_ON);
+       skge_write8(hw, SKGEMAC_REG(port, LNK_LED_REG), LINKLED_LINKSYNC_ON);
+
+       skge_write8(hw, SKGEMAC_REG(port, RX_LED_CTRL), LED_START);
+       skge_write8(hw, SKGEMAC_REG(port, TX_LED_CTRL), LED_START);
+
+       /* Unreset the XMAC. */
+       skge_write16(hw, SKGEMAC_REG(port, TX_MFF_CTRL1), MFF_CLR_MAC_RST);
+
+       /*
+        * Perform additional initialization for external PHYs,
+        * namely for the 1000baseTX cards that use the XMAC's
+        * GMII mode.
+        */
+       spin_lock_bh(&hw->phy_lock);
+       if (hw->phy_type != SK_PHY_XMAC) {
+               /* Take PHY out of reset. */
+               r = skge_read32(hw, B2_GP_IO);
+               if (port == 0)
+                       r |= GP_DIR_0|GP_IO_0;
+               else
+                       r |= GP_DIR_2|GP_IO_2;
+
+               skge_write32(hw, B2_GP_IO, r);
+               skge_read32(hw, B2_GP_IO);
+
+               /* Enable GMII mode on the XMAC. */
+               skge_xm_write16(hw, port, XM_HW_CFG, XM_HW_GMII_MD);
+
+               id1 = skge_xm_phy_read(hw, port, PHY_XMAC_ID1);
+
+               /* Optimize MDIO transfer by suppressing preamble. */
+               skge_xm_write16(hw, port, XM_MMU_CMD,
+                               skge_xm_read16(hw, port, XM_MMU_CMD)
+                               | XM_MMU_NO_PRE);
+
+               if (id1 == PHY_BCOM_ID1_C0) {
+                       /*
+                        * Workaround BCOM Errata for the C0 type.
+                        * Write magic patterns to reserved registers.
+                        */
+                       for (i = 0; i < ARRAY_SIZE(C0hack); i++)
+                               skge_xm_phy_write(hw, port,
+                                         C0hack[i].reg, C0hack[i].val);
+
+               } else if (id1 == PHY_BCOM_ID1_A1) {
+                       /*
+                        * Workaround BCOM Errata for the A1 type.
+                        * Write magic patterns to reserved registers.
+                        */
+                       for (i = 0; i < ARRAY_SIZE(A1hack); i++)
+                               skge_xm_phy_write(hw, port,
+                                         A1hack[i].reg, A1hack[i].val);
+               }
+
+               /*
+                * Workaround BCOM Errata (#10523) for all BCom PHYs.
+                * Disable Power Management after reset.
+                */
+               r = skge_xm_phy_read(hw, port, PHY_BCOM_AUX_CTRL);
+               skge_xm_phy_write(hw, port, PHY_BCOM_AUX_CTRL, r | PHY_B_AC_DIS_PM);
+       }
+
+       /* Dummy read */
+       skge_xm_read16(hw, port, XM_ISRC);
+
+       r = skge_xm_read32(hw, port, XM_MODE);
+       skge_xm_write32(hw, port, XM_MODE, r|XM_MD_CSA);
+
+       /* We don't need the FCS appended to the packet. */
+       r = skge_xm_read16(hw, port, XM_RX_CMD);
+       skge_xm_write16(hw, port, XM_RX_CMD, r | XM_RX_STRIP_FCS);
+
+       /* We want short frames padded to 60 bytes. */
+       r = skge_xm_read16(hw, port, XM_TX_CMD);
+       skge_xm_write16(hw, port, XM_TX_CMD, r | XM_TX_AUTO_PAD);
+
+       /*
+        * Enable the reception of all error frames. This is is
+        * a necessary evil due to the design of the XMAC. The
+        * XMAC's receive FIFO is only 8K in size, however jumbo
+        * frames can be up to 9000 bytes in length. When bad
+        * frame filtering is enabled, the XMAC's RX FIFO operates
+        * in 'store and forward' mode. For this to work, the
+        * entire frame has to fit into the FIFO, but that means
+        * that jumbo frames larger than 8192 bytes will be
+        * truncated. Disabling all bad frame filtering causes
+        * the RX FIFO to operate in streaming mode, in which
+        * case the XMAC will start transfering frames out of the
+        * RX FIFO as soon as the FIFO threshold is reached.
+        */
+       r = skge_xm_read32(hw, port, XM_MODE);
+       skge_xm_write32(hw, port, XM_MODE,
+                    XM_MD_RX_CRCE|XM_MD_RX_LONG|XM_MD_RX_RUNT|
+                    XM_MD_RX_ERR|XM_MD_RX_IRLE);
+
+       skge_xm_outaddr(hw, port, XM_SA, hw->dev[port]->dev_addr);
+       skge_xm_outaddr(hw, port, XM_EXM(0), hw->dev[port]->dev_addr);
+
+       /*
+        * Bump up the transmit threshold. This helps hold off transmit
+        * underruns when we're blasting traffic from both ports at once.
+        */
+       skge_xm_write16(hw, port, XM_TX_THR, 512);
+
+       /* Configure MAC arbiter */
+       skge_write16(hw, B3_MA_TO_CTRL, MA_RST_CLR);
+
+       /* configure timeout values */
+       skge_write8(hw, B3_MA_TOINI_RX1, 72);
+       skge_write8(hw, B3_MA_TOINI_RX2, 72);
+       skge_write8(hw, B3_MA_TOINI_TX1, 72);
+       skge_write8(hw, B3_MA_TOINI_TX2, 72);
+
+       skge_write8(hw, B3_MA_RCINI_RX1, 0);
+       skge_write8(hw, B3_MA_RCINI_RX2, 0);
+       skge_write8(hw, B3_MA_RCINI_TX1, 0);
+       skge_write8(hw, B3_MA_RCINI_TX2, 0);
+
+       /* Configure Rx MAC FIFO */
+       skge_write8(hw, SKGEMAC_REG(port, RX_MFF_CTRL2), MFF_RST_CLR);
+       skge_write16(hw, SKGEMAC_REG(port, RX_MFF_CTRL1), MFF_ENA_TIM_PAT);
+       skge_write8(hw, SKGEMAC_REG(port, RX_MFF_CTRL2), MFF_ENA_OP_MD);
+
+       /* Configure Tx MAC FIFO */
+       skge_write8(hw, SKGEMAC_REG(port, TX_MFF_CTRL2), MFF_RST_CLR);
+       skge_write16(hw, SKGEMAC_REG(port, TX_MFF_CTRL1), MFF_TX_CTRL_DEF);
+       skge_write8(hw, SKGEMAC_REG(port, TX_MFF_CTRL2), MFF_ENA_OP_MD);
+
+       if (hw->dev[port]->mtu > ETH_DATA_LEN) {
+               /* Enable frame flushing if jumbo frames used */
+               skge_write16(hw, SKGEMAC_REG(port,RX_MFF_CTRL1), MFF_ENA_FLUSH);
+       } else {
+               /* enable timeout timers if normal frames */
+               skge_write16(hw, B3_PA_CTRL,
+                            port == 0 ? PA_ENA_TO_TX1 : PA_ENA_TO_TX2);
+       }
+
+
+       r = skge_xm_read16(hw, port, XM_RX_CMD);
+       if (hw->dev[port]->mtu > ETH_DATA_LEN)
+               skge_xm_write16(hw, port, XM_RX_CMD, r | XM_RX_BIG_PK_OK);
+       else
+               skge_xm_write16(hw, port, XM_RX_CMD, r & ~(XM_RX_BIG_PK_OK));
+
+       switch (hw->phy_type) {
+       case SK_PHY_XMAC:
+               if (skge->autoneg == AUTONEG_ENABLE) {
+                       ctrl1 = PHY_X_AN_FD | PHY_X_AN_HD;
+
+                       switch (skge->flow_control) {
+                       case FLOW_MODE_NONE:
+                               ctrl1 |= PHY_X_P_NO_PAUSE;
+                               break;
+                       case FLOW_MODE_LOC_SEND:
+                               ctrl1 |= PHY_X_P_ASYM_MD;
+                               break;
+                       case FLOW_MODE_SYMMETRIC:
+                               ctrl1 |= PHY_X_P_SYM_MD;
+                               break;
+                       case FLOW_MODE_REM_SEND:
+                               ctrl1 |= PHY_X_P_BOTH_MD;
+                               break;
+                       }
+
+                       skge_xm_phy_write(hw, port, PHY_XMAC_AUNE_ADV, ctrl1);
+                       ctrl2 = PHY_CT_ANE | PHY_CT_RE_CFG;
+               } else {
+                       ctrl2 = 0;
+                       if (skge->duplex == DUPLEX_FULL)
+                               ctrl2 |= PHY_CT_DUP_MD;
+               }
+
+               skge_xm_phy_write(hw, port, PHY_XMAC_CTRL, ctrl2);
+               break;
+
+       case SK_PHY_BCOM:
+               ctrl1 = PHY_CT_SP1000;
+               ctrl2 = 0;
+               ctrl3 = PHY_SEL_TYPE;
+               ctrl4 = PHY_B_PEC_EN_LTR;
+               ctrl5 = PHY_B_AC_TX_TST;
+
+               if (skge->autoneg == AUTONEG_ENABLE) {
+                       /*
+                        * Workaround BCOM Errata #1 for the C5 type.
+                        * 1000Base-T Link Acquisition Failure in Slave Mode
+                        * Set Repeater/DTE bit 10 of the 1000Base-T Control Register
+                        */
+                       ctrl2 |= PHY_B_1000C_RD;
+                       if (skge->advertising & ADVERTISED_1000baseT_Half)
+                               ctrl2 |= PHY_B_1000C_AHD;
+                       if (skge->advertising & ADVERTISED_1000baseT_Full)
+                               ctrl2 |= PHY_B_1000C_AFD;
+
+                       /* Set Flow-control capabilities */
+                       switch (skge->flow_control) {
+                       case FLOW_MODE_NONE:
+                               ctrl3 |= PHY_B_P_NO_PAUSE;
+                               break;
+                       case FLOW_MODE_LOC_SEND:
+                               ctrl3 |= PHY_B_P_ASYM_MD;
+                               break;
+                       case FLOW_MODE_SYMMETRIC:
+                               ctrl3 |= PHY_B_P_SYM_MD;
+                               break;
+                       case FLOW_MODE_REM_SEND:
+                               ctrl3 |= PHY_B_P_BOTH_MD;
+                               break;
+                       }
+
+                       /* Restart Auto-negotiation */
+                       ctrl1 |= PHY_CT_ANE | PHY_CT_RE_CFG;
+               } else {
+                       if (skge->duplex == DUPLEX_FULL)
+                               ctrl1 |= PHY_CT_DUP_MD;
+
+                       ctrl2 |= PHY_B_1000C_MSE;       /* set it to Slave */
+               }
+
+               skge_xm_phy_write(hw, port, PHY_BCOM_1000T_CTRL, ctrl2);
+               skge_xm_phy_write(hw, port, PHY_BCOM_AUNE_ADV, ctrl3);
+
+               if (skge->netdev->mtu > ETH_DATA_LEN) {
+                       ctrl4 |= PHY_B_PEC_HIGH_LA;
+                       ctrl5 |= PHY_B_AC_LONG_PACK;
+
+                       skge_xm_phy_write(hw, port,PHY_BCOM_AUX_CTRL, ctrl5);
+               }
+
+               skge_xm_phy_write(hw, port, PHY_BCOM_P_EXT_CTRL, ctrl4);
+               skge_xm_phy_write(hw, port, PHY_BCOM_CTRL, ctrl1);
+               break;
+       }
+       spin_unlock_bh(&hw->phy_lock);
+
+       /* Clear MIB counters */
+       skge_xm_write16(hw, port, XM_STAT_CMD,
+                       XM_SC_CLR_RXC | XM_SC_CLR_TXC);
+       /* Clear two times according to Errata #3 */
+       skge_xm_write16(hw, port, XM_STAT_CMD,
+                       XM_SC_CLR_RXC | XM_SC_CLR_TXC);
+
+       /* Start polling for link status */
+       mod_timer(&skge->link_check, jiffies + LINK_POLL_HZ);
+}
+
+static void genesis_stop(struct skge_port *skge)
+{
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+
+       /* Clear Tx packet arbiter timeout IRQ */
+       skge_write16(hw, B3_PA_CTRL,
+                    port == 0 ? PA_CLR_TO_TX1 : PA_CLR_TO_TX2);
+
+       /*
+        * If the transfer stucks at the MAC the STOP command will not
+        * terminate if we don't flush the XMAC's transmit FIFO !
+        */
+       skge_xm_write32(hw, port, XM_MODE,
+                       skge_xm_read32(hw, port, XM_MODE)|XM_MD_FTF);
+
+
+       /* Reset the MAC */
+       skge_write16(hw, SKGEMAC_REG(port, TX_MFF_CTRL1), MFF_SET_MAC_RST);
+
+       /* For external PHYs there must be special handling */
+       if (hw->phy_type != SK_PHY_XMAC) {
+               u32 reg = skge_read32(hw, B2_GP_IO);
+
+               if (port == 0) {
+                       reg |= GP_DIR_0;
+                       reg &= ~GP_IO_0;
+               } else {
+                       reg |= GP_DIR_2;
+                       reg &= ~GP_IO_2;
+               }
+               skge_write32(hw, B2_GP_IO, reg);
+               skge_read32(hw, B2_GP_IO);
+       }
+
+       skge_xm_write16(hw, port, XM_MMU_CMD,
+                       skge_xm_read16(hw, port, XM_MMU_CMD)
+                       & ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX));
+
+       skge_xm_read16(hw, port, XM_MMU_CMD);
+}
+
+
+static void genesis_get_stats(struct skge_port *skge, u64 *data)
+{
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+       int i;
+       unsigned long timeout = jiffies + HZ;
+
+       skge_xm_write16(hw, port,
+                       XM_STAT_CMD, XM_SC_SNP_TXC | XM_SC_SNP_RXC);
+
+       /* wait for update to complete */
+       while (skge_xm_read16(hw, port, XM_STAT_CMD)
+              & (XM_SC_SNP_TXC | XM_SC_SNP_RXC)) {
+               if (time_after(jiffies, timeout))
+                       break;
+               udelay(10);
+       }
+
+       /* special case for 64 bit octet counter */
+       data[0] = (u64) skge_xm_read32(hw, port, XM_TXO_OK_HI) << 32
+               | skge_xm_read32(hw, port, XM_TXO_OK_LO);
+       data[1] = (u64) skge_xm_read32(hw, port, XM_RXO_OK_HI) << 32
+               | skge_xm_read32(hw, port, XM_RXO_OK_LO);
+
+       for (i = 2; i < ARRAY_SIZE(skge_stats); i++)
+               data[i] = skge_xm_read32(hw, port, skge_stats[i].xmac_offset);
+}
+
+static void genesis_mac_intr(struct skge_hw *hw, int port)
+{
+       struct skge_port *skge = netdev_priv(hw->dev[port]);
+       u16 status = skge_xm_read16(hw, port, XM_ISRC);
+
+       pr_debug("genesis_intr status %x\n", status);
+       if (hw->phy_type == SK_PHY_XMAC) {
+               /* LInk down, start polling for state change */
+               if (status & XM_IS_INP_ASS) {
+                       skge_xm_write16(hw, port, XM_IMSK,
+                                       skge_xm_read16(hw, port, XM_IMSK) | XM_IS_INP_ASS);
+                       mod_timer(&skge->link_check, jiffies + LINK_POLL_HZ);
+               }
+               else if (status & XM_IS_AND)
+                       mod_timer(&skge->link_check, jiffies + LINK_POLL_HZ);
+       }
+
+       if (status & XM_IS_TXF_UR) {
+               skge_xm_write32(hw, port, XM_MODE, XM_MD_FTF);
+               ++skge->net_stats.tx_fifo_errors;
+       }
+       if (status & XM_IS_RXF_OV) {
+               skge_xm_write32(hw, port, XM_MODE, XM_MD_FRF);
+               ++skge->net_stats.rx_fifo_errors;
+       }
+}
+
+static void skge_gm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val)
+{
+       int i;
+
+       skge_gma_write16(hw, port, GM_SMI_DATA, val);
+       skge_gma_write16(hw, port, GM_SMI_CTRL,
+                        GM_SMI_CT_PHY_AD(hw->phy_addr) | GM_SMI_CT_REG_AD(reg));
+       for (i = 0; i < PHY_RETRIES; i++) {
+               udelay(1);
+
+               if (!(skge_gma_read16(hw, port, GM_SMI_CTRL) & GM_SMI_CT_BUSY))
+                       break;
+       }
+}
+
+static u16 skge_gm_phy_read(struct skge_hw *hw, int port, u16 reg)
+{
+       int i;
+
+       skge_gma_write16(hw, port, GM_SMI_CTRL,
+                        GM_SMI_CT_PHY_AD(hw->phy_addr)
+                        | GM_SMI_CT_REG_AD(reg) | GM_SMI_CT_OP_RD);
+
+       for (i = 0; i < PHY_RETRIES; i++) {
+               udelay(1);
+               if (skge_gma_read16(hw, port, GM_SMI_CTRL) & GM_SMI_CT_RD_VAL)
+                       goto ready;
+       }
+
+       printk(KERN_WARNING PFX "%s: phy read timeout\n",
+              hw->dev[port]->name);
+       return 0;
+ ready:
+       return skge_gma_read16(hw, port, GM_SMI_DATA);
+}
+
+static void genesis_link_down(struct skge_port *skge)
+{
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+
+       pr_debug("genesis_link_down\n");
+
+       skge_xm_write16(hw, port, XM_MMU_CMD,
+                       skge_xm_read16(hw, port, XM_MMU_CMD)
+                       & ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX));
+
+       /* dummy read to ensure writing */
+       (void) skge_xm_read16(hw, port, XM_MMU_CMD);
+
+       skge_link_down(skge);
+}
+
+static void genesis_link_up(struct skge_port *skge)
+{
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+       u16 cmd;
+       u32 mode, msk;
+
+       pr_debug("genesis_link_up\n");
+       cmd = skge_xm_read16(hw, port, XM_MMU_CMD);
+
+       /*
+        * enabling pause frame reception is required for 1000BT
+        * because the XMAC is not reset if the link is going down
+        */
+       if (skge->flow_control == FLOW_MODE_NONE ||
+           skge->flow_control == FLOW_MODE_LOC_SEND)
+               cmd |= XM_MMU_IGN_PF;
+       else
+               /* Enable Pause Frame Reception */
+               cmd &= ~XM_MMU_IGN_PF;
+
+       skge_xm_write16(hw, port, XM_MMU_CMD, cmd);
+
+       mode = skge_xm_read32(hw, port, XM_MODE);
+       if (skge->flow_control == FLOW_MODE_SYMMETRIC ||
+           skge->flow_control == FLOW_MODE_LOC_SEND) {
+               /*
+                * Configure Pause Frame Generation
+                * Use internal and external Pause Frame Generation.
+                * Sending pause frames is edge triggered.
+                * Send a Pause frame with the maximum pause time if
+                * internal oder external FIFO full condition occurs.
+                * Send a zero pause time frame to re-start transmission.
+                */
+               /* XM_PAUSE_DA = '010000C28001' (default) */
+               /* XM_MAC_PTIME = 0xffff (maximum) */
+               /* remember this value is defined in big endian (!) */
+               skge_xm_write16(hw, port, XM_MAC_PTIME, 0xffff);
+
+               mode |= XM_PAUSE_MODE;
+               skge_write16(hw, SKGEMAC_REG(port, RX_MFF_CTRL1), MFF_ENA_PAUSE);
+       } else {
+               /*
+                * disable pause frame generation is required for 1000BT
+                * because the XMAC is not reset if the link is going down
+                */
+               /* Disable Pause Mode in Mode Register */
+               mode &= ~XM_PAUSE_MODE;
+
+               skge_write16(hw, SKGEMAC_REG(port, RX_MFF_CTRL1), MFF_DIS_PAUSE);
+       }
+
+       skge_xm_write32(hw, port, XM_MODE, mode);
+
+       msk = XM_DEF_MSK;
+       if (hw->phy_type != SK_PHY_XMAC)
+               msk |= XM_IS_INP_ASS;   /* disable GP0 interrupt bit */
+
+       skge_xm_write16(hw, port, XM_IMSK, msk);
+       skge_xm_read16(hw, port, XM_ISRC);
+
+       /* get MMU Command Reg. */
+       cmd = skge_xm_read16(hw, port, XM_MMU_CMD);
+       if (hw->phy_type != SK_PHY_XMAC && skge->duplex == DUPLEX_FULL)
+               cmd |= XM_MMU_GMII_FD;
+
+       if (hw->phy_type == SK_PHY_BCOM) {
+               /*
+                * Workaround BCOM Errata (#10523) for all BCom Phys
+                * Enable Power Management after link up
+                */
+               skge_xm_phy_write(hw, port, PHY_BCOM_AUX_CTRL,
+                                 skge_xm_phy_read(hw, port, PHY_BCOM_AUX_CTRL)
+                                 & ~PHY_B_AC_DIS_PM);
+               skge_xm_phy_write(hw, port, PHY_BCOM_INT_MASK,
+                                 PHY_B_DEF_MSK);
+       }
+
+       /* enable Rx/Tx */
+       skge_xm_write16(hw, port, XM_MMU_CMD,
+                       cmd | XM_MMU_ENA_RX | XM_MMU_ENA_TX);
+       skge_link_up(skge);
+}
+
+
+static void genesis_bcom_intr(struct skge_port *skge)
+{
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+       u16 stat = skge_xm_phy_read(hw, port, PHY_BCOM_INT_STAT);
+
+       pr_debug("genesis_bcom intr stat=%x\n", stat);
+
+       /* Workaround BCom Errata:
+        *      enable and disable loopback mode if "NO HCD" occurs.
+        */
+       if (stat & PHY_B_IS_NO_HDCL) {
+               u16 ctrl = skge_xm_phy_read(hw, port, PHY_BCOM_CTRL);
+               skge_xm_phy_write(hw, port, PHY_BCOM_CTRL,
+                                 ctrl | PHY_CT_LOOP);
+               skge_xm_phy_write(hw, port, PHY_BCOM_CTRL,
+                                 ctrl & ~PHY_CT_LOOP);
+       }
+
+       stat = skge_xm_phy_read(hw, port, PHY_BCOM_STAT);
+       if (stat & (PHY_B_IS_AN_PR | PHY_B_IS_LST_CHANGE)) {
+               u16 aux = skge_xm_phy_read(hw, port, PHY_BCOM_AUX_STAT);
+               if ( !(aux & PHY_B_AS_LS) && netif_carrier_ok(skge->netdev))
+                       genesis_link_down(skge);
+
+               else if (stat & PHY_B_IS_LST_CHANGE) {
+                       if (aux & PHY_B_AS_AN_C) {
+                               switch (aux & PHY_B_AS_AN_RES_MSK) {
+                               case PHY_B_RES_1000FD:
+                                       skge->duplex = DUPLEX_FULL;
+                                       break;
+                               case PHY_B_RES_1000HD:
+                                       skge->duplex = DUPLEX_HALF;
+                                       break;
+                               }
+
+                               switch (aux & PHY_B_AS_PAUSE_MSK) {
+                               case PHY_B_AS_PAUSE_MSK:
+                                       skge->flow_control = FLOW_MODE_SYMMETRIC;
+                                       break;
+                               case PHY_B_AS_PRR:
+                                       skge->flow_control = FLOW_MODE_REM_SEND;
+                                       break;
+                               case PHY_B_AS_PRT:
+                                       skge->flow_control = FLOW_MODE_LOC_SEND;
+                                       break;
+                               default:
+                                       skge->flow_control = FLOW_MODE_NONE;
+                               }
+                               skge->speed = SPEED_1000;
+                       }
+                       genesis_link_up(skge);
+               }
+               else
+                       mod_timer(&skge->link_check, jiffies + LINK_POLL_HZ);
+       }
+}
+
+/* Perodic poll of phy status to check for link transistion  */
+static void skge_link_timer(unsigned long __arg)
+{
+       struct skge_port *skge = (struct skge_port *) __arg;
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+
+       if (hw->chip_id != CHIP_ID_GENESIS || !netif_running(skge->netdev))
+               return;
+
+       spin_lock_bh(&hw->phy_lock);
+       if (hw->phy_type == SK_PHY_BCOM)
+               genesis_bcom_intr(skge);
+       else {
+               int i;
+               for (i = 0; i < 3; i++)
+                       if (skge_xm_read16(hw, port, XM_ISRC) & XM_IS_INP_ASS)
+                               break;
+
+               if (i == 3)
+                       mod_timer(&skge->link_check, jiffies + LINK_POLL_HZ);
+               else
+                       genesis_link_up(skge);
+       }
+       spin_unlock_bh(&hw->phy_lock);
+}
+
+/* Marvell Phy Initailization */
+static void yukon_init(struct skge_hw *hw, int port)
+{
+       struct skge_port *skge = netdev_priv(hw->dev[port]);
+       u16 ctrl, ct1000, adv;
+       u16 ledctrl, ledover;
+
+       pr_debug("yukon_init\n");
+       if (skge->autoneg == AUTONEG_ENABLE) {
+               u16 ectrl = skge_gm_phy_read(hw, port, PHY_MARV_EXT_CTRL);
+
+               ectrl &= ~(PHY_M_EC_M_DSC_MSK | PHY_M_EC_S_DSC_MSK |
+                         PHY_M_EC_MAC_S_MSK);
+               ectrl |= PHY_M_EC_MAC_S(MAC_TX_CLK_25_MHZ);
+
+               /* on PHY 88E1111 there is a change for downshift control */
+               if (hw->chip_id == CHIP_ID_YUKON_EC)
+                       ectrl |= PHY_M_EC_M_DSC_2(0) | PHY_M_EC_DOWN_S_ENA;
+               else
+                       ectrl |= PHY_M_EC_M_DSC(0) | PHY_M_EC_S_DSC(1);
+
+               skge_gm_phy_write(hw, port, PHY_MARV_EXT_CTRL, ectrl);
+       }
+
+       ctrl = skge_gm_phy_read(hw, port, PHY_MARV_CTRL);
+       if (skge->autoneg == AUTONEG_DISABLE)
+               ctrl &= ~PHY_CT_ANE;
+
+       ctrl |= PHY_CT_RESET;
+       skge_gm_phy_write(hw, port, PHY_MARV_CTRL, ctrl);
+
+       ctrl = 0;
+       ct1000 = 0;
+       adv = PHY_SEL_TYPE;
+
+       if (skge->autoneg == AUTONEG_ENABLE) {
+               if (iscopper(hw)) {
+                       if (skge->advertising & ADVERTISED_1000baseT_Full)
+                               ct1000 |= PHY_M_1000C_AFD;
+                       if (skge->advertising & ADVERTISED_1000baseT_Half)
+                               ct1000 |= PHY_M_1000C_AHD;
+                       if (skge->advertising & ADVERTISED_100baseT_Full)
+                               adv |= PHY_M_AN_100_FD;
+                       if (skge->advertising & ADVERTISED_100baseT_Half)
+                               adv |= PHY_M_AN_100_HD;
+                       if (skge->advertising & ADVERTISED_10baseT_Full)
+                               adv |= PHY_M_AN_10_FD;
+                       if (skge->advertising & ADVERTISED_10baseT_Half)
+                               adv |= PHY_M_AN_10_HD;
+
+                       /* Set Flow-control capabilities */
+                       switch (skge->flow_control) {
+                       case FLOW_MODE_NONE:
+                               adv |= PHY_B_P_NO_PAUSE;
+                               break;
+                       case FLOW_MODE_LOC_SEND:
+                               adv |= PHY_B_P_ASYM_MD;
+                               break;
+                       case FLOW_MODE_SYMMETRIC:
+                               adv |= PHY_B_P_SYM_MD;
+                               break;
+                       case FLOW_MODE_REM_SEND:
+                               adv |= PHY_B_P_BOTH_MD;
+                               break;
+                       }
+               } else {        /* special defines for FIBER (88E1011S only) */
+                       adv |= PHY_M_AN_1000X_AHD | PHY_M_AN_1000X_AFD;
+
+                       /* Set Flow-control capabilities */
+                       switch (skge->flow_control) {
+                       case FLOW_MODE_NONE:
+                               adv |= PHY_M_P_NO_PAUSE_X;
+                               break;
+                       case FLOW_MODE_LOC_SEND:
+                               adv |= PHY_M_P_ASYM_MD_X;
+                               break;
+                       case FLOW_MODE_SYMMETRIC:
+                               adv |= PHY_M_P_SYM_MD_X;
+                               break;
+                       case FLOW_MODE_REM_SEND:
+                               adv |= PHY_M_P_BOTH_MD_X;
+                               break;
+                       }
+               }
+               /* Restart Auto-negotiation */
+               ctrl |= PHY_CT_ANE | PHY_CT_RE_CFG;
+       } else {
+               /* forced speed/duplex settings */
+               ct1000 = PHY_M_1000C_MSE;
+
+               if (skge->duplex == DUPLEX_FULL)
+                       ctrl |= PHY_CT_DUP_MD;
+
+               switch (skge->speed) {
+               case SPEED_1000:
+                       ctrl |= PHY_CT_SP1000;
+                       break;
+               case SPEED_100:
+                       ctrl |= PHY_CT_SP100;
+                       break;
+               }
+
+               ctrl |= PHY_CT_RESET;
+       }
+
+       if (hw->chip_id != CHIP_ID_YUKON_FE)
+               skge_gm_phy_write(hw, port, PHY_MARV_1000T_CTRL, ct1000);
+
+       skge_gm_phy_write(hw, port, PHY_MARV_AUNE_ADV, adv);
+       skge_gm_phy_write(hw, port, PHY_MARV_CTRL, ctrl);
+
+       /* Setup Phy LED's */
+       ledctrl = PHY_M_LED_PULS_DUR(PULS_170MS);
+       ledover = 0;
+
+       if (hw->chip_id == CHIP_ID_YUKON_FE) {
+               /* on 88E3082 these bits are at 11..9 (shifted left) */
+               ledctrl |= PHY_M_LED_BLINK_RT(BLINK_84MS) << 1;
+
+               skge_gm_phy_write(hw, port, PHY_MARV_FE_LED_PAR,
+                                 ((skge_gm_phy_read(hw, port, PHY_MARV_FE_LED_PAR)
+
+                                   & ~PHY_M_FELP_LED1_MSK)
+                                  | PHY_M_FELP_LED1_CTRL(LED_PAR_CTRL_ACT_BL)));
+       } else {
+               /* set Tx LED (LED_TX) to blink mode on Rx OR Tx activity */
+               ledctrl |= PHY_M_LED_BLINK_RT(BLINK_84MS) | PHY_M_LEDC_TX_CTRL;
+
+               /* turn off the Rx LED (LED_RX) */
+               ledover |= PHY_M_LED_MO_RX(MO_LED_OFF);
+       }
+
+       /* disable blink mode (LED_DUPLEX) on collisions */
+       ctrl |= PHY_M_LEDC_DP_CTRL;
+       skge_gm_phy_write(hw, port, PHY_MARV_LED_CTRL, ledctrl);
+
+       if (skge->autoneg == AUTONEG_DISABLE || skge->speed == SPEED_100) {
+               /* turn on 100 Mbps LED (LED_LINK100) */
+               ledover |= PHY_M_LED_MO_100(MO_LED_ON);
+       }
+
+       if (ledover)
+               skge_gm_phy_write(hw, port, PHY_MARV_LED_OVER, ledover);
+
+       /* Enable phy interrupt on autonegotiation complete (or link up) */
+       if (skge->autoneg == AUTONEG_ENABLE)
+               skge_gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_IS_AN_COMPL);
+       else
+               skge_gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK);
+}
+
+static void yukon_reset(struct skge_hw *hw, int port)
+{
+       skge_gm_phy_write(hw, port, PHY_MARV_INT_MASK, 0);/* disable PHY IRQs */
+       skge_gma_write16(hw, port, GM_MC_ADDR_H1, 0);   /* clear MC hash */
+       skge_gma_write16(hw, port, GM_MC_ADDR_H2, 0);
+       skge_gma_write16(hw, port, GM_MC_ADDR_H3, 0);
+       skge_gma_write16(hw, port, GM_MC_ADDR_H4, 0);
+
+       skge_gma_write16(hw, port, GM_RX_CTRL,
+                        skge_gma_read16(hw, port, GM_RX_CTRL)
+                        | GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA);
+}
+
+static void yukon_mac_init(struct skge_hw *hw, int port)
+{
+       struct skge_port *skge = netdev_priv(hw->dev[port]);
+       int i;
+       u32 reg;
+       const u8 *addr = hw->dev[port]->dev_addr;
+
+       /* WA code for COMA mode -- set PHY reset */
+       if (hw->chip_id == CHIP_ID_YUKON_LITE &&
+           chip_rev(hw) == CHIP_REV_YU_LITE_A3)
+               skge_write32(hw, B2_GP_IO,
+                            (skge_read32(hw, B2_GP_IO) | GP_DIR_9 | GP_IO_9));
+
+       /* hard reset */
+       skge_write32(hw, SKGEMAC_REG(port, GPHY_CTRL), GPC_RST_SET);
+       skge_write32(hw, SKGEMAC_REG(port, GMAC_CTRL), GMC_RST_SET);
+
+       /* WA code for COMA mode -- clear PHY reset */
+       if (hw->chip_id == CHIP_ID_YUKON_LITE &&
+           chip_rev(hw) == CHIP_REV_YU_LITE_A3)
+               skge_write32(hw, B2_GP_IO,
+                            (skge_read32(hw, B2_GP_IO) | GP_DIR_9)
+                            & ~GP_IO_9);
+
+       /* Set hardware config mode */
+       reg = GPC_INT_POL_HI | GPC_DIS_FC | GPC_DIS_SLEEP |
+               GPC_ENA_XC | GPC_ANEG_ADV_ALL_M | GPC_ENA_PAUSE;
+       reg |= iscopper(hw) ? GPC_HWCFG_GMII_COP : GPC_HWCFG_GMII_FIB;
+
+       /* Clear GMC reset */
+       skge_write32(hw, SKGEMAC_REG(port, GPHY_CTRL), reg | GPC_RST_SET);
+       skge_write32(hw, SKGEMAC_REG(port, GPHY_CTRL), reg | GPC_RST_CLR);
+       skge_write32(hw, SKGEMAC_REG(port, GMAC_CTRL), GMC_PAUSE_ON | GMC_RST_CLR);
+       if (skge->autoneg == AUTONEG_DISABLE) {
+               reg = GM_GPCR_AU_ALL_DIS;
+               skge_gma_write16(hw, port, GM_GP_CTRL,
+                                skge_gma_read16(hw, port, GM_GP_CTRL) | reg);
+
+               switch (skge->speed) {
+               case SPEED_1000:
+                       reg |= GM_GPCR_SPEED_1000;
+                       /* fallthru */
+               case SPEED_100:
+                       reg |= GM_GPCR_SPEED_100;
+               }
+
+               if (skge->duplex == DUPLEX_FULL)
+                       reg |= GM_GPCR_DUP_FULL;
+       } else
+               reg = GM_GPCR_SPEED_1000 | GM_GPCR_SPEED_100 | GM_GPCR_DUP_FULL;
+       switch (skge->flow_control) {
+       case FLOW_MODE_NONE:
+               skge_write32(hw, SKGEMAC_REG(port, GMAC_CTRL), GMC_PAUSE_OFF);
+               reg |= GM_GPCR_FC_TX_DIS | GM_GPCR_FC_RX_DIS | GM_GPCR_AU_FCT_DIS;
+               break;
+       case FLOW_MODE_LOC_SEND:
+               /* disable Rx flow-control */
+               reg |= GM_GPCR_FC_RX_DIS | GM_GPCR_AU_FCT_DIS;
+       }
+
+       skge_gma_write16(hw, port, GM_GP_CTRL, reg);
+       skge_read16(hw, GMAC_IRQ_SRC);
+
+       spin_lock_bh(&hw->phy_lock);
+       yukon_init(hw, port);
+       spin_unlock_bh(&hw->phy_lock);
+
+       /* MIB clear */
+       reg = skge_gma_read16(hw, port, GM_PHY_ADDR);
+       skge_gma_write16(hw, port, GM_PHY_ADDR, reg | GM_PAR_MIB_CLR);
+
+       for (i = 0; i < GM_MIB_CNT_SIZE; i++)
+               skge_gma_read16(hw, port, GM_MIB_CNT_BASE + 8*i);
+       skge_gma_write16(hw, port, GM_PHY_ADDR, reg);
+
+       /* transmit control */
+       skge_gma_write16(hw, port, GM_TX_CTRL, TX_COL_THR(TX_COL_DEF));
+
+       /* receive control reg: unicast + multicast + no FCS  */
+       skge_gma_write16(hw, port, GM_RX_CTRL,
+                        GM_RXCR_UCF_ENA | GM_RXCR_CRC_DIS | GM_RXCR_MCF_ENA);
+
+       /* transmit flow control */
+       skge_gma_write16(hw, port, GM_TX_FLOW_CTRL, 0xffff);
+
+       /* transmit parameter */
+       skge_gma_write16(hw, port, GM_TX_PARAM,
+                        TX_JAM_LEN_VAL(TX_JAM_LEN_DEF) |
+                        TX_JAM_IPG_VAL(TX_JAM_IPG_DEF) |
+                        TX_IPG_JAM_DATA(TX_IPG_JAM_DEF));
+
+       /* serial mode register */
+       reg = GM_SMOD_VLAN_ENA | IPG_DATA_VAL(IPG_DATA_DEF);
+       if (hw->dev[port]->mtu > 1500)
+               reg |= GM_SMOD_JUMBO_ENA;
+
+       skge_gma_write16(hw, port, GM_SERIAL_MODE, reg);
+
+       /* physical address: used for pause frames */
+       skge_gm_set_addr(hw, port, GM_SRC_ADDR_1L, addr);
+       /* virtual address for data */
+       skge_gm_set_addr(hw, port, GM_SRC_ADDR_2L, addr);
+
+       /* enable interrupt mask for counter overflows */
+       skge_gma_write16(hw, port, GM_TX_IRQ_MSK, 0);
+       skge_gma_write16(hw, port, GM_RX_IRQ_MSK, 0);
+       skge_gma_write16(hw, port, GM_TR_IRQ_MSK, 0);
+
+       /* Initialize Mac Fifo */
+
+       /* Configure Rx MAC FIFO */
+       skge_write16(hw, SKGEMAC_REG(port, RX_GMF_FL_MSK), RX_FF_FL_DEF_MSK);
+       reg = GMF_OPER_ON | GMF_RX_F_FL_ON;
+       if (hw->chip_id == CHIP_ID_YUKON_LITE &&
+           chip_rev(hw) == CHIP_REV_YU_LITE_A3)
+               reg &= ~GMF_RX_F_FL_ON;
+       skge_write8(hw, SKGEMAC_REG(port, RX_GMF_CTRL_T), GMF_RST_CLR);
+       skge_write16(hw, SKGEMAC_REG(port, RX_GMF_CTRL_T), reg);
+       skge_write16(hw, SKGEMAC_REG(port, RX_GMF_FL_THR), RX_GMF_FL_THR_DEF);
+
+       /* Configure Tx MAC FIFO */
+       skge_write8(hw, SKGEMAC_REG(port, TX_GMF_CTRL_T), GMF_RST_CLR);
+       skge_write16(hw, SKGEMAC_REG(port, TX_GMF_CTRL_T), GMF_OPER_ON);
+}
+
+static void yukon_stop(struct skge_port *skge)
+{
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+
+       if (hw->chip_id == CHIP_ID_YUKON_LITE &&
+           chip_rev(hw) == CHIP_REV_YU_LITE_A3) {
+               skge_write32(hw, B2_GP_IO,
+                            skge_read32(hw, B2_GP_IO) | GP_DIR_9 | GP_IO_9);
+       }
+
+       skge_gma_write16(hw, port, GM_GP_CTRL,
+                        skge_gma_read16(hw, port, GM_GP_CTRL)
+                        & ~(GM_GPCR_RX_ENA|GM_GPCR_RX_ENA));
+       skge_gma_read16(hw, port, GM_GP_CTRL);
+
+       /* set GPHY Control reset */
+       skge_gma_write32(hw, port, GPHY_CTRL, GPC_RST_SET);
+       skge_gma_write32(hw, port, GMAC_CTRL, GMC_RST_SET);
+}
+
+static void yukon_get_stats(struct skge_port *skge, u64 *data)
+{
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+       int i;
+
+       data[0] = (u64) skge_gma_read32(hw, port, GM_TXO_OK_HI) << 32
+               | skge_gma_read32(hw, port, GM_TXO_OK_LO);
+       data[1] = (u64) skge_gma_read32(hw, port, GM_RXO_OK_HI) << 32
+               | skge_gma_read32(hw, port, GM_RXO_OK_LO);
+
+       for (i = 2; i < ARRAY_SIZE(skge_stats); i++)
+               data[i] = skge_gma_read32(hw, port,
+                                         skge_stats[i].gma_offset);
+}
+
+static void yukon_mac_intr(struct skge_hw *hw, int port)
+{
+       struct skge_port *skge = netdev_priv(hw->dev[port]);
+       u8 status = skge_read8(hw, SKGEMAC_REG(port, GMAC_IRQ_SRC));
+
+       pr_debug("yukon_intr status %x\n", status);
+       if (status & GM_IS_RX_FF_OR) {
+               ++skge->net_stats.rx_fifo_errors;
+               skge_gma_write8(hw, port, RX_GMF_CTRL_T, GMF_CLI_RX_FO);
+       }
+       if (status & GM_IS_TX_FF_UR) {
+               ++skge->net_stats.tx_fifo_errors;
+               skge_gma_write8(hw, port, TX_GMF_CTRL_T, GMF_CLI_TX_FU);
+       }
+
+}
+
+static u16 yukon_speed(const struct skge_hw *hw, u16 aux)
+{
+       if (hw->chip_id == CHIP_ID_YUKON_FE)
+               return (aux & PHY_M_PS_SPEED_100) ? SPEED_100 : SPEED_10;
+
+       switch(aux & PHY_M_PS_SPEED_MSK) {
+       case PHY_M_PS_SPEED_1000:
+               return SPEED_1000;
+       case PHY_M_PS_SPEED_100:
+               return SPEED_100;
+       default:
+               return SPEED_10;
+       }
+}
+
+static void yukon_link_up(struct skge_port *skge)
+{
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+       u16 reg;
+
+       pr_debug("yukon_link_up\n");
+
+       /* Enable Transmit FIFO Underrun */
+       skge_write8(hw, GMAC_IRQ_MSK, GMAC_DEF_MSK);
+
+       reg = skge_gma_read16(hw, port, GM_GP_CTRL);
+       if (skge->duplex == DUPLEX_FULL || skge->autoneg == AUTONEG_ENABLE)
+               reg |= GM_GPCR_DUP_FULL;
+
+       /* enable Rx/Tx */
+       reg |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA;
+       skge_gma_write16(hw, port, GM_GP_CTRL, reg);
+
+       skge_gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK);
+       skge_link_up(skge);
+}
+
+static void yukon_link_down(struct skge_port *skge)
+{
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+
+       pr_debug("yukon_link_down\n");
+       skge_gm_phy_write(hw, port, PHY_MARV_INT_MASK, 0);
+       skge_gm_phy_write(hw, port, GM_GP_CTRL,
+                         skge_gm_phy_read(hw, port, GM_GP_CTRL)
+                         & ~(GM_GPCR_RX_ENA | GM_GPCR_TX_ENA));
+
+       if (hw->chip_id != CHIP_ID_YUKON_FE &&
+           skge->flow_control == FLOW_MODE_REM_SEND) {
+               /* restore Asymmetric Pause bit */
+               skge_gm_phy_write(hw, port, PHY_MARV_AUNE_ADV,
+                                 skge_gm_phy_read(hw, port,
+                                                  PHY_MARV_AUNE_ADV)
+                                 | PHY_M_AN_ASP);
+
+       }
+
+       yukon_reset(hw, port);
+       skge_link_down(skge);
+
+       yukon_init(hw, port);
+}
+
+static void yukon_phy_intr(struct skge_port *skge)
+{
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+       const char *reason = NULL;
+       u16 istatus, phystat;
+
+       istatus = skge_gm_phy_read(hw, port, PHY_MARV_INT_STAT);
+       phystat = skge_gm_phy_read(hw, port, PHY_MARV_PHY_STAT);
+       pr_debug("yukon phy intr istat=%x phy_stat=%x\n", istatus, phystat);
+
+       if (istatus & PHY_M_IS_AN_COMPL) {
+               if (skge_gm_phy_read(hw, port, PHY_MARV_AUNE_LP)
+                   & PHY_M_AN_RF) {
+                       reason = "remote fault";
+                       goto failed;
+               }
+
+               if (!(hw->chip_id == CHIP_ID_YUKON_FE || hw->chip_id == CHIP_ID_YUKON_EC)
+                   && (skge_gm_phy_read(hw, port, PHY_MARV_1000T_STAT)
+                       & PHY_B_1000S_MSF)) {
+                       reason = "master/slave fault";
+                       goto failed;
+               }
+
+               if (!(phystat & PHY_M_PS_SPDUP_RES)) {
+                       reason = "speed/duplex";
+                       goto failed;
+               }
+
+               skge->duplex = (phystat & PHY_M_PS_FULL_DUP)
+                       ? DUPLEX_FULL : DUPLEX_HALF;
+               skge->speed = yukon_speed(hw, phystat);
+
+               /* Tx & Rx Pause Enabled bits are at 9..8 */
+               if (hw->chip_id == CHIP_ID_YUKON_XL)
+                       phystat >>= 6;
+
+               /* We are using IEEE 802.3z/D5.0 Table 37-4 */
+               switch (phystat & PHY_M_PS_PAUSE_MSK) {
+               case PHY_M_PS_PAUSE_MSK:
+                       skge->flow_control = FLOW_MODE_SYMMETRIC;
+                       break;
+               case PHY_M_PS_RX_P_EN:
+                       skge->flow_control = FLOW_MODE_REM_SEND;
+                       break;
+               case PHY_M_PS_TX_P_EN:
+                       skge->flow_control = FLOW_MODE_LOC_SEND;
+                       break;
+               default:
+                       skge->flow_control = FLOW_MODE_NONE;
+               }
+
+               if (skge->flow_control == FLOW_MODE_NONE ||
+                   (skge->speed < SPEED_1000 && skge->duplex == DUPLEX_HALF))
+                       skge_write8(hw, SKGEMAC_REG(port, GMAC_CTRL), GMC_PAUSE_OFF);
+               else
+                       skge_write8(hw, SKGEMAC_REG(port, GMAC_CTRL), GMC_PAUSE_ON);
+               yukon_link_up(skge);
+               return;
+       }
+
+       if (istatus & PHY_M_IS_LSP_CHANGE)
+               skge->speed = yukon_speed(hw, phystat);
+
+       if (istatus & PHY_M_IS_DUP_CHANGE)
+               skge->duplex = (phystat & PHY_M_PS_FULL_DUP) ? DUPLEX_FULL : DUPLEX_HALF;
+       if (istatus & PHY_M_IS_LST_CHANGE) {
+               if (phystat & PHY_M_PS_LINK_UP)
+                       yukon_link_up(skge);
+               else
+                       yukon_link_down(skge);
+       }
+       return;
+ failed:
+       printk(KERN_ERR PFX "%s: autonegotiation failed (%s)\n",
+              skge->netdev->name, reason);
+
+       /* XXX restart autonegotiation? */
+}
+
+static void skge_ramset(struct skge_hw *hw, u16 q, u32 start, size_t len)
+{
+       u32 end;
+
+       start /= 8;
+       len /= 8;
+       end = start + len - 1;
+
+       skge_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR);
+       skge_write32(hw, RB_ADDR(q, RB_START), start);
+       skge_write32(hw, RB_ADDR(q, RB_WP), start);
+       skge_write32(hw, RB_ADDR(q, RB_RP), start);
+       skge_write32(hw, RB_ADDR(q, RB_END), end);
+
+       if (q == Q_R1 || q == Q_R2) {
+               /* Set thresholds on receive queue's */
+               skge_write32(hw, RB_ADDR(q, RB_RX_UTPP),
+                            start + (2*len)/3);
+               skge_write32(hw, RB_ADDR(q, RB_RX_LTPP),
+                            start + (len/3));
+       } else {
+               /* Enable store & forward on Tx queue's because
+                * Tx FIFO is only 4K on Genesis and 1K on Yukon
+                */
+               skge_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_STFWD);
+       }
+
+       skge_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_OP_MD);
+}
+
+/* Setup Bus Memory Interface */
+static void skge_qset(struct skge_port *skge, u16 q,
+                     const struct skge_element *e)
+{
+       struct skge_hw *hw = skge->hw;
+       u32 watermark = 0x600;
+       u64 base = skge->dma + (e->desc - skge->mem);
+
+       /* optimization to reduce window on 32bit/33mhz */
+       if ((skge_read16(hw, B0_CTST) & (CS_BUS_CLOCK | CS_BUS_SLOT_SZ)) == 0)
+               watermark /= 2;
+
+       skge_write32(hw, Q_ADDR(q, Q_CSR), CSR_CLR_RESET);
+       skge_write32(hw, Q_ADDR(q, Q_F), watermark);
+       skge_write32(hw, Q_ADDR(q, Q_DA_H), (u32)(base >> 32));
+       skge_write32(hw, Q_ADDR(q, Q_DA_L), (u32)base);
+}
+
+static int skge_up(struct net_device *dev)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+       u32 chunk, ram_addr;
+       size_t rx_size, tx_size;
+       int err;
+
+       if (netif_msg_ifup(skge))
+               printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
+
+       rx_size = skge->rx_ring.count * sizeof(struct skge_rx_desc);
+       tx_size = skge->tx_ring.count * sizeof(struct skge_tx_desc);
+       skge->mem_size = tx_size + rx_size;
+       skge->mem = pci_alloc_consistent(hw->pdev, skge->mem_size, &skge->dma);
+       if (!skge->mem)
+               return -ENOMEM;
+
+       memset(skge->mem, 0, skge->mem_size);
+
+       if ((err = skge_ring_alloc(&skge->rx_ring, skge->mem, skge->dma)))
+               goto free_pci_mem;
+
+       if (skge_rx_fill(skge))
+               goto free_rx_ring;
+
+       if ((err = skge_ring_alloc(&skge->tx_ring, skge->mem + rx_size,
+                                  skge->dma + rx_size)))
+               goto free_rx_ring;
+
+       skge->tx_avail = skge->tx_ring.count - 1;
+
+       /* Initialze MAC */
+       if (hw->chip_id == CHIP_ID_GENESIS)
+               genesis_mac_init(hw, port);
+       else
+               yukon_mac_init(hw, port);
+
+       /* Configure RAMbuffers */
+       chunk = hw->ram_size / (isdualport(hw) ? 4 : 2);
+       ram_addr = hw->ram_offset + 2 * chunk * port;
+
+       skge_ramset(hw, rxqaddr[port], ram_addr, chunk);
+       skge_qset(skge, rxqaddr[port], skge->rx_ring.to_clean);
+
+       BUG_ON(skge->tx_ring.to_use != skge->tx_ring.to_clean);
+       skge_ramset(hw, txqaddr[port], ram_addr+chunk, chunk);
+       skge_qset(skge, txqaddr[port], skge->tx_ring.to_use);
+
+       /* Start receiver BMU */
+       wmb();
+       skge_write8(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_START | CSR_IRQ_CL_F);
+
+       pr_debug("skge_up completed\n");
+       return 0;
+
+ free_rx_ring:
+       skge_rx_clean(skge);
+       kfree(skge->rx_ring.start);
+ free_pci_mem:
+       pci_free_consistent(hw->pdev, skge->mem_size, skge->mem, skge->dma);
+
+       return err;
+}
+
+static int skge_down(struct net_device *dev)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+
+       if (netif_msg_ifdown(skge))
+               printk(KERN_INFO PFX "%s: disabling interface\n", dev->name);
+
+       netif_stop_queue(dev);
+
+       del_timer_sync(&skge->led_blink);
+       del_timer_sync(&skge->link_check);
+
+       /* Stop transmitter */
+       skge_write8(hw, Q_ADDR(txqaddr[port], Q_CSR), CSR_STOP);
+       skge_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL),
+                    RB_RST_SET|RB_DIS_OP_MD);
+
+       if (hw->chip_id == CHIP_ID_GENESIS)
+               genesis_stop(skge);
+       else
+               yukon_stop(skge);
+
+       /* Disable Force Sync bit and Enable Alloc bit */
+       skge_write8(hw, SKGEMAC_REG(port, TXA_CTRL),
+                   TXA_DIS_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC);
+
+       /* Stop Interval Timer and Limit Counter of Tx Arbiter */
+       skge_write32(hw, SKGEMAC_REG(port, TXA_ITI_INI), 0L);
+       skge_write32(hw, SKGEMAC_REG(port, TXA_LIM_INI), 0L);
+
+       /* Reset PCI FIFO */
+       skge_write32(hw, Q_ADDR(txqaddr[port], Q_CSR), CSR_SET_RESET);
+       skge_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL), RB_RST_SET);
+
+       /* Reset the RAM Buffer async Tx queue */
+       skge_write8(hw, RB_ADDR(port == 0 ? Q_XA1 : Q_XA2, RB_CTRL), RB_RST_SET);
+       /* stop receiver */
+       skge_write8(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_STOP);
+       skge_write32(hw, RB_ADDR(port ? Q_R2 : Q_R1, RB_CTRL),
+                    RB_RST_SET|RB_DIS_OP_MD);
+       skge_write32(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_SET_RESET);
+
+       if (hw->chip_id == CHIP_ID_GENESIS) {
+               skge_write8(hw, SKGEMAC_REG(port, TX_MFF_CTRL2), MFF_RST_SET);
+               skge_write8(hw, SKGEMAC_REG(port, RX_MFF_CTRL2), MFF_RST_SET);
+               skge_write8(hw, SKGEMAC_REG(port, TX_LED_CTRL), LED_STOP);
+               skge_write8(hw, SKGEMAC_REG(port, RX_LED_CTRL), LED_STOP);
+       } else {
+               skge_write8(hw, SKGEMAC_REG(port, RX_GMF_CTRL_T), GMF_RST_SET);
+               skge_write8(hw, SKGEMAC_REG(port, TX_GMF_CTRL_T), GMF_RST_SET);
+       }
+
+       /* turn off led's */
+       skge_write16(hw, B0_LED, LED_STAT_OFF);
+
+       skge_tx_clean(skge);
+       skge_rx_clean(skge);
+
+       kfree(skge->rx_ring.start);
+       kfree(skge->tx_ring.start);
+       pci_free_consistent(hw->pdev, skge->mem_size, skge->mem, skge->dma);
+       return 0;
+}
+
+static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+       struct skge_ring *ring = &skge->tx_ring;
+       struct skge_element *e;
+       struct skge_tx_desc *td;
+       int i;
+       u32 control, len;
+       u64 map;
+       unsigned long flags;
+
+       skb = skb_padto(skb, ETH_ZLEN);
+       if (!skb)
+               return NETDEV_TX_OK;
+
+       local_irq_save(flags);
+       if (!spin_trylock(&skge->tx_lock)) {
+               /* Collision - tell upper layer to requeue */ 
+               local_irq_restore(flags); 
+               return NETDEV_TX_LOCKED; 
+       } 
+
+       if (unlikely(skge->tx_avail < skb_shinfo(skb)->nr_frags +1)) {
+               netif_stop_queue(dev);
+               spin_unlock_irqrestore(&skge->tx_lock, flags);
+
+               printk(KERN_WARNING PFX "%s: ring full when queue awake!\n",
+                      dev->name);
+               return NETDEV_TX_BUSY;
+       }
+
+       e = ring->to_use;
+       td = e->desc;
+       e->skb = skb;
+       len = skb_headlen(skb);
+       map = pci_map_single(hw->pdev, skb->data, len, PCI_DMA_TODEVICE);
+       pci_unmap_addr_set(e, mapaddr, map);
+       pci_unmap_len_set(e, maplen, len);
+
+       td->dma_lo = map;
+       td->dma_hi = map >> 32;
+
+       if (skb->ip_summed == CHECKSUM_HW) {
+               const struct iphdr *ip
+                       = (const struct iphdr *) (skb->data + ETH_HLEN);
+               int offset = skb->h.raw - skb->data;
+
+               /* This seems backwards, but it is what the sk98lin
+                * does.  Looks like hardware is wrong?
+                */
+               if (ip->protocol == IPPROTO_UDP
+                   && chip_rev(hw) == 0 && hw->chip_id == CHIP_ID_YUKON)
+                       control = BMU_TCP_CHECK;
+               else
+                       control = BMU_UDP_CHECK;
+
+               td->csum_offs = 0;
+               td->csum_start = offset;
+               td->csum_write = offset + skb->csum;
+       } else
+               control = BMU_CHECK;
+
+       if (!skb_shinfo(skb)->nr_frags) /* single buffer i.e. no fragments */
+               control |= BMU_EOF| BMU_IRQ_EOF;
+       else {
+               struct skge_tx_desc *tf = td;
+
+               control |= BMU_STFWD;
+               for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
+                       skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
+
+                       map = pci_map_page(hw->pdev, frag->page, frag->page_offset,
+                                          frag->size, PCI_DMA_TODEVICE);
+
+                       e = e->next;
+                       e->skb = NULL;
+                       tf = e->desc;
+                       tf->dma_lo = map;
+                       tf->dma_hi = (u64) map >> 32;
+                       pci_unmap_addr_set(e, mapaddr, map);
+                       pci_unmap_len_set(e, maplen, frag->size);
+
+                       tf->control = BMU_OWN | BMU_SW | control | frag->size;
+               }
+               tf->control |= BMU_EOF | BMU_IRQ_EOF;
+       }
+       /* Make sure all the descriptors written */
+       wmb();
+       td->control = BMU_OWN | BMU_SW | BMU_STF | control | len;
+       wmb();
+
+       skge_write8(hw, Q_ADDR(txqaddr[skge->port], Q_CSR), CSR_START);
+
+       if (netif_msg_tx_queued(skge))
+               printk(KERN_DEBUG "%s: tx queued, slot %td, len %d\n",
+                      dev->name, e - ring->start, skb->len);
+
+       ring->to_use = e->next;
+       skge->tx_avail -= skb_shinfo(skb)->nr_frags + 1;
+       if (skge->tx_avail <= MAX_SKB_FRAGS + 1) {
+               pr_debug("%s: transmit queue full\n", dev->name);
+               netif_stop_queue(dev);
+       }
+
+       dev->trans_start = jiffies;
+       spin_unlock_irqrestore(&skge->tx_lock, flags);
+
+       return NETDEV_TX_OK;
+}
+
+static inline void skge_tx_free(struct skge_hw *hw, struct skge_element *e)
+{
+       if (e->skb) {
+               pci_unmap_single(hw->pdev,
+                              pci_unmap_addr(e, mapaddr),
+                              pci_unmap_len(e, maplen),
+                              PCI_DMA_TODEVICE);
+               dev_kfree_skb_any(e->skb);
+               e->skb = NULL;
+       } else {
+               pci_unmap_page(hw->pdev,
+                              pci_unmap_addr(e, mapaddr),
+                              pci_unmap_len(e, maplen),
+                              PCI_DMA_TODEVICE);
+       }
+}
+
+static void skge_tx_clean(struct skge_port *skge)
+{
+       struct skge_ring *ring = &skge->tx_ring;
+       struct skge_element *e;
+       unsigned long flags;
+
+       spin_lock_irqsave(&skge->tx_lock, flags);
+       for (e = ring->to_clean; e != ring->to_use; e = e->next) {
+               ++skge->tx_avail;
+               skge_tx_free(skge->hw, e);
+       }
+       ring->to_clean = e;
+       spin_unlock_irqrestore(&skge->tx_lock, flags);
+}
+
+static void skge_tx_timeout(struct net_device *dev)
+{
+       struct skge_port *skge = netdev_priv(dev);
+
+       if (netif_msg_timer(skge))
+               printk(KERN_DEBUG PFX "%s: tx timeout\n", dev->name);
+
+       skge_write8(skge->hw, Q_ADDR(txqaddr[skge->port], Q_CSR), CSR_STOP);
+       skge_tx_clean(skge);
+}
+
+static int skge_change_mtu(struct net_device *dev, int new_mtu)
+{
+       int err = 0;
+
+       if(new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU)
+               return -EINVAL;
+
+       dev->mtu = new_mtu;
+
+       if (netif_running(dev)) {
+               skge_down(dev);
+               skge_up(dev);
+       }
+
+       return err;
+}
+
+static void genesis_set_multicast(struct net_device *dev)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+       int i, count = dev->mc_count;
+       struct dev_mc_list *list = dev->mc_list;
+       u32 mode;
+       u8 filter[8];
+
+       mode = skge_xm_read32(hw, port, XM_MODE);
+       mode |= XM_MD_ENA_HASH;
+       if (dev->flags & IFF_PROMISC)
+               mode |= XM_MD_ENA_PROM;
+       else
+               mode &= ~XM_MD_ENA_PROM;
+
+       if (dev->flags & IFF_ALLMULTI)
+               memset(filter, 0xff, sizeof(filter));
+       else {
+               memset(filter, 0, sizeof(filter));
+               for(i = 0; list && i < count; i++, list = list->next) {
+                       u32 crc = crc32_le(~0, list->dmi_addr, ETH_ALEN);
+                       u8 bit = 63 - (crc & 63);
+
+                       filter[bit/8] |= 1 << (bit%8);
+               }
+       }
+
+       skge_xm_outhash(hw, port, XM_HSM, filter);
+
+       skge_xm_write32(hw, port, XM_MODE, mode);
+}
+
+static void yukon_set_multicast(struct net_device *dev)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+       struct dev_mc_list *list = dev->mc_list;
+       u16 reg;
+       u8 filter[8];
+
+       memset(filter, 0, sizeof(filter));
+
+       reg = skge_gma_read16(hw, port, GM_RX_CTRL);
+       reg |= GM_RXCR_UCF_ENA;
+
+       if (dev->flags & IFF_PROMISC)           /* promiscious */
+               reg &= ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA);
+       else if (dev->flags & IFF_ALLMULTI)     /* all multicast */
+               memset(filter, 0xff, sizeof(filter));
+       else if (dev->mc_count == 0)            /* no multicast */
+               reg &= ~GM_RXCR_MCF_ENA;
+       else {
+               int i;
+               reg |= GM_RXCR_MCF_ENA;
+
+               for(i = 0; list && i < dev->mc_count; i++, list = list->next) {
+                       u32 bit = ether_crc(ETH_ALEN, list->dmi_addr) & 0x3f;
+                       filter[bit/8] |= 1 << (bit%8);
+               }
+       }
+
+
+       skge_gma_write16(hw, port, GM_MC_ADDR_H1,
+                        (u16)filter[0] | ((u16)filter[1] << 8));
+       skge_gma_write16(hw, port, GM_MC_ADDR_H2,
+                        (u16)filter[2] | ((u16)filter[3] << 8));
+       skge_gma_write16(hw, port, GM_MC_ADDR_H3,
+                        (u16)filter[4] | ((u16)filter[5] << 8));
+       skge_gma_write16(hw, port, GM_MC_ADDR_H4,
+                        (u16)filter[6] | ((u16)filter[7] << 8));
+
+       skge_gma_write16(hw, port, GM_RX_CTRL, reg);
+}
+
+static inline int bad_phy_status(const struct skge_hw *hw, u32 status)
+{
+       if (hw->chip_id == CHIP_ID_GENESIS)
+               return (status & (XMR_FS_ERR | XMR_FS_2L_VLAN)) != 0;
+       else
+               return (status & GMR_FS_ANY_ERR) ||
+                       (status & GMR_FS_RX_OK) == 0;
+}
+
+static void skge_rx_error(struct skge_port *skge, int slot,
+                         u32 control, u32 status)
+{
+       if (netif_msg_rx_err(skge))
+               printk(KERN_DEBUG PFX "%s: rx err, slot %d control 0x%x status 0x%x\n",
+                      skge->netdev->name, slot, control, status);
+
+       if ((control & (BMU_EOF|BMU_STF)) != (BMU_STF|BMU_EOF)
+           || (control & BMU_BBC) > skge->netdev->mtu + VLAN_ETH_HLEN)
+               skge->net_stats.rx_length_errors++;
+       else {
+               if (skge->hw->chip_id == CHIP_ID_GENESIS) {
+                       if (status & (XMR_FS_RUNT|XMR_FS_LNG_ERR))
+                               skge->net_stats.rx_length_errors++;
+                       if (status & XMR_FS_FRA_ERR)
+                               skge->net_stats.rx_frame_errors++;
+                       if (status & XMR_FS_FCS_ERR)
+                               skge->net_stats.rx_crc_errors++;
+               } else {
+                       if (status & (GMR_FS_LONG_ERR|GMR_FS_UN_SIZE))
+                               skge->net_stats.rx_length_errors++;
+                       if (status & GMR_FS_FRAGMENT)
+                               skge->net_stats.rx_frame_errors++;
+                       if (status & GMR_FS_CRC_ERR)
+                               skge->net_stats.rx_crc_errors++;
+               }
+       }
+}
+
+static int skge_poll(struct net_device *dev, int *budget)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+       struct skge_ring *ring = &skge->rx_ring;
+       struct skge_element *e;
+       unsigned int to_do = min(dev->quota, *budget);
+       unsigned int work_done = 0;
+       int done;
+       static const u32 irqmask[] = { IS_PORT_1, IS_PORT_2 };
+
+       for (e = ring->to_clean; e != ring->to_use && work_done < to_do;
+            e = e->next) {
+               struct skge_rx_desc *rd = e->desc;
+               struct sk_buff *skb = e->skb;
+               u32 control, len, status;
+
+               rmb();
+               control = rd->control;
+               if (control & BMU_OWN)
+                       break;
+
+               len = control & BMU_BBC;
+               e->skb = NULL;
+
+               pci_unmap_single(hw->pdev,
+                                pci_unmap_addr(e, mapaddr),
+                                pci_unmap_len(e, maplen),
+                                PCI_DMA_FROMDEVICE);
+
+               status = rd->status;
+               if ((control & (BMU_EOF|BMU_STF)) != (BMU_STF|BMU_EOF)
+                    || len > dev->mtu + VLAN_ETH_HLEN
+                    || bad_phy_status(hw, status)) {
+                       skge_rx_error(skge, e - ring->start, control, status);
+                       dev_kfree_skb(skb);
+                       continue;
+               }
+
+               if (netif_msg_rx_status(skge))
+                   printk(KERN_DEBUG PFX "%s: rx slot %td status 0x%x len %d\n",
+                          dev->name, e - ring->start, rd->status, len);
+
+               skb_put(skb, len);
+               skb->protocol = eth_type_trans(skb, dev);
+
+               if (skge->rx_csum) {
+                       skb->csum = le16_to_cpu(rd->csum2);
+                       skb->ip_summed = CHECKSUM_HW;
+               }
+
+               dev->last_rx = jiffies;
+               netif_receive_skb(skb);
+
+               ++work_done;
+       }
+       ring->to_clean = e;
+
+       *budget -= work_done;
+       dev->quota -= work_done;
+       done = work_done < to_do;
+
+       if (skge_rx_fill(skge))
+               done = 0;
+
+       /* restart receiver */
+       wmb();
+       skge_write8(hw, Q_ADDR(rxqaddr[skge->port], Q_CSR),
+                   CSR_START | CSR_IRQ_CL_F);
+
+       if (done) {
+               local_irq_disable();
+               hw->intr_mask |= irqmask[skge->port];
+               /* Order is important since data can get interrupted */
+               skge_write32(hw, B0_IMSK, hw->intr_mask);
+               __netif_rx_complete(dev);
+               local_irq_enable();
+       }
+
+       return !done;
+}
+
+static inline void skge_tx_intr(struct net_device *dev)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct skge_hw *hw = skge->hw;
+       struct skge_ring *ring = &skge->tx_ring;
+       struct skge_element *e;
+
+       spin_lock(&skge->tx_lock);
+       for(e = ring->to_clean; e != ring->to_use; e = e->next) {
+               struct skge_tx_desc *td = e->desc;
+               u32 control;
+
+               rmb();
+               control = td->control;
+               if (control & BMU_OWN)
+                       break;
+
+               if (unlikely(netif_msg_tx_done(skge)))
+                       printk(KERN_DEBUG PFX "%s: tx done slot %td status 0x%x\n",
+                              dev->name, e - ring->start, td->status);
+
+               skge_tx_free(hw, e);
+               e->skb = NULL;
+               ++skge->tx_avail;
+       }
+       ring->to_clean = e;
+       skge_write8(hw, Q_ADDR(txqaddr[skge->port], Q_CSR), CSR_IRQ_CL_F);
+
+       if (skge->tx_avail > MAX_SKB_FRAGS + 1)
+               netif_wake_queue(dev);
+
+       spin_unlock(&skge->tx_lock);
+}
+
+static void skge_mac_parity(struct skge_hw *hw, int port)
+{
+       printk(KERN_ERR PFX "%s: mac data parity error\n",
+              hw->dev[port] ? hw->dev[port]->name
+              : (port == 0 ? "(port A)": "(port B"));
+
+       if (hw->chip_id == CHIP_ID_GENESIS)
+               skge_write16(hw, SKGEMAC_REG(port, TX_MFF_CTRL1),
+                            MFF_CLR_PERR);
+       else
+               /* HW-Bug #8: cleared by GMF_CLI_TX_FC instead of GMF_CLI_TX_PE */
+               skge_write8(hw, SKGEMAC_REG(port, TX_GMF_CTRL_T),
+                           (hw->chip_id == CHIP_ID_YUKON && chip_rev(hw) == 0)
+                           ? GMF_CLI_TX_FC : GMF_CLI_TX_PE);
+}
+
+static void skge_pci_clear(struct skge_hw *hw)
+{
+       u16 status;
+
+       status = skge_read16(hw, SKGEPCI_REG(PCI_STATUS));
+       skge_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
+       skge_write16(hw, SKGEPCI_REG(PCI_STATUS),
+                    status | PCI_STATUS_ERROR_BITS);
+       skge_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
+}
+
+static void skge_mac_intr(struct skge_hw *hw, int port)
+{
+       if (hw->chip_id == CHIP_ID_GENESIS) 
+               genesis_mac_intr(hw, port);
+       else
+               yukon_mac_intr(hw, port);
+}
+
+/* Handle device specific framing and timeout interrupts */
+static void skge_error_irq(struct skge_hw *hw)
+{
+       u32 hwstatus = skge_read32(hw, B0_HWE_ISRC);
+
+       if (hw->chip_id == CHIP_ID_GENESIS) {
+               /* clear xmac errors */
+               if (hwstatus & (IS_NO_STAT_M1|IS_NO_TIST_M1))
+                       skge_write16(hw, SKGEMAC_REG(0, RX_MFF_CTRL1), MFF_CLR_INSTAT);
+               if (hwstatus & (IS_NO_STAT_M2|IS_NO_TIST_M2))
+                       skge_write16(hw, SKGEMAC_REG(0, RX_MFF_CTRL2), MFF_CLR_INSTAT);
+       } else {
+               /* Timestamp (unused) overflow */
+               if (hwstatus & IS_IRQ_TIST_OV)
+                       skge_write8(hw, GMAC_TI_ST_CTRL, GMT_ST_CLR_IRQ);
+
+               if (hwstatus & IS_IRQ_SENSOR) {
+                       /* no sensors on 32-bit Yukon */
+                       if (!(skge_read16(hw, B0_CTST) & CS_BUS_SLOT_SZ)) {
+                               printk(KERN_ERR PFX "ignoring bogus sensor interrups\n");
+                               skge_write32(hw, B0_HWE_IMSK,
+                                            IS_ERR_MSK & ~IS_IRQ_SENSOR);
+                       } else
+                               printk(KERN_WARNING PFX "sensor interrupt\n");
+               }
+
+
+       }
+
+       if (hwstatus & IS_RAM_RD_PAR) {
+               printk(KERN_ERR PFX "Ram read data parity error\n");
+               skge_write16(hw, B3_RI_CTRL, RI_CLR_RD_PERR);
+       }
+
+       if (hwstatus & IS_RAM_WR_PAR) {
+               printk(KERN_ERR PFX "Ram write data parity error\n");
+               skge_write16(hw, B3_RI_CTRL, RI_CLR_WR_PERR);
+       }
+
+       if (hwstatus & IS_M1_PAR_ERR)
+               skge_mac_parity(hw, 0);
+
+       if (hwstatus & IS_M2_PAR_ERR)
+               skge_mac_parity(hw, 1);
+
+       if (hwstatus & IS_R1_PAR_ERR)
+               skge_write32(hw, B0_R1_CSR, CSR_IRQ_CL_P);
+
+       if (hwstatus & IS_R2_PAR_ERR)
+               skge_write32(hw, B0_R2_CSR, CSR_IRQ_CL_P);
+
+       if (hwstatus & (IS_IRQ_MST_ERR|IS_IRQ_STAT)) {
+               printk(KERN_ERR PFX "hardware error detected (status 0x%x)\n",
+                      hwstatus);
+
+               skge_pci_clear(hw);
+
+               hwstatus = skge_read32(hw, B0_HWE_ISRC);
+               if (hwstatus & IS_IRQ_STAT) {
+                       printk(KERN_WARNING PFX "IRQ status %x: still set ignoring hardware errors\n",
+                              hwstatus);
+                       hw->intr_mask &= ~IS_HW_ERR;
+               }
+       }
+}
+
+/*
+ * Interrrupt from PHY are handled in tasklet (soft irq)
+ * because accessing phy registers requires spin wait which might
+ * cause excess interrupt latency.
+ */
+static void skge_extirq(unsigned long data)
+{
+       struct skge_hw *hw = (struct skge_hw *) data;
+       int port;
+
+       spin_lock(&hw->phy_lock);
+       for (port = 0; port < 2; port++) {
+               struct net_device *dev = hw->dev[port];
+
+               if (dev && netif_running(dev)) {
+                       struct skge_port *skge = netdev_priv(dev);
+
+                       if (hw->chip_id != CHIP_ID_GENESIS)
+                               yukon_phy_intr(skge);
+                       else if (hw->phy_type == SK_PHY_BCOM)
+                               genesis_bcom_intr(skge);
+               }
+       }
+       spin_unlock(&hw->phy_lock);
+
+       local_irq_disable();
+       hw->intr_mask |= IS_EXT_REG;
+       skge_write32(hw, B0_IMSK, hw->intr_mask);
+       local_irq_enable();
+}
+
+static irqreturn_t skge_intr(int irq, void *dev_id, struct pt_regs *regs)
+{
+       struct skge_hw *hw = dev_id;
+       u32 status = skge_read32(hw, B0_SP_ISRC);
+
+       if (status == 0 || status == ~0) /* hotplug or shared irq */
+               return IRQ_NONE;
+
+       status &= hw->intr_mask;
+
+       if ((status & IS_R1_F) && netif_rx_schedule_prep(hw->dev[0])) {
+               status &= ~IS_R1_F;
+               hw->intr_mask &= ~IS_R1_F;
+               skge_write32(hw, B0_IMSK, hw->intr_mask);
+               __netif_rx_schedule(hw->dev[0]);
+       }
+
+       if ((status & IS_R2_F) && netif_rx_schedule_prep(hw->dev[1])) {
+               status &= ~IS_R2_F;
+               hw->intr_mask &= ~IS_R2_F;
+               skge_write32(hw, B0_IMSK, hw->intr_mask);
+               __netif_rx_schedule(hw->dev[1]);
+       }
+
+       if (status & IS_XA1_F)
+               skge_tx_intr(hw->dev[0]);
+
+       if (status & IS_XA2_F)
+               skge_tx_intr(hw->dev[1]);
+
+       if (status & IS_MAC1)
+               skge_mac_intr(hw, 0);
+       
+       if (status & IS_MAC2)
+               skge_mac_intr(hw, 1);
+
+       if (status & IS_HW_ERR)
+               skge_error_irq(hw);
+
+       if (status & IS_EXT_REG) {
+               hw->intr_mask &= ~IS_EXT_REG;
+               tasklet_schedule(&hw->ext_tasklet);
+       }
+
+       if (status)
+               skge_write32(hw, B0_IMSK, hw->intr_mask);
+
+       return IRQ_HANDLED;
+}
+
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void skge_netpoll(struct net_device *dev)
+{
+       struct skge_port *skge = netdev_priv(dev);
+
+       disable_irq(dev->irq);
+       skge_intr(dev->irq, skge->hw, NULL);
+       enable_irq(dev->irq);
+}
+#endif
+
+static int skge_set_mac_address(struct net_device *dev, void *p)
+{
+       struct skge_port *skge = netdev_priv(dev);
+       struct sockaddr *addr = p;
+       int err = 0;
+
+       if (!is_valid_ether_addr(addr->sa_data))
+               return -EADDRNOTAVAIL;
+
+       skge_down(dev);
+       memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
+       memcpy_toio(skge->hw->regs + B2_MAC_1 + skge->port*8,
+                   dev->dev_addr, ETH_ALEN);
+       memcpy_toio(skge->hw->regs + B2_MAC_2 + skge->port*8,
+                   dev->dev_addr, ETH_ALEN);
+       if (dev->flags & IFF_UP)
+               err = skge_up(dev);
+       return err;
+}
+
+static const struct {
+       u8 id;
+       const char *name;
+} skge_chips[] = {
+       { CHIP_ID_GENESIS,      "Genesis" },
+       { CHIP_ID_YUKON,         "Yukon" },
+       { CHIP_ID_YUKON_LITE,    "Yukon-Lite"},
+       { CHIP_ID_YUKON_LP,      "Yukon-LP"},
+       { CHIP_ID_YUKON_XL,      "Yukon-2 XL"},
+       { CHIP_ID_YUKON_EC,      "YUKON-2 EC"},
+       { CHIP_ID_YUKON_FE,      "YUKON-2 FE"},
+};
+
+static const char *skge_board_name(const struct skge_hw *hw)
+{
+       int i;
+       static char buf[16];
+
+       for (i = 0; i < ARRAY_SIZE(skge_chips); i++)
+               if (skge_chips[i].id == hw->chip_id)
+                       return skge_chips[i].name;
+
+       snprintf(buf, sizeof buf, "chipid 0x%x", hw->chip_id);
+       return buf;
+}
+
+
+/*
+ * Setup the board data structure, but don't bring up
+ * the port(s)
+ */
+static int skge_reset(struct skge_hw *hw)
+{
+       u16 ctst;
+       u8 t8;
+       int i, ports;
+
+       ctst = skge_read16(hw, B0_CTST);
+
+       /* do a SW reset */
+       skge_write8(hw, B0_CTST, CS_RST_SET);
+       skge_write8(hw, B0_CTST, CS_RST_CLR);
+
+       /* clear PCI errors, if any */
+       skge_pci_clear(hw);
+
+       skge_write8(hw, B0_CTST, CS_MRST_CLR);
+
+       /* restore CLK_RUN bits (for Yukon-Lite) */
+       skge_write16(hw, B0_CTST,
+                    ctst & (CS_CLK_RUN_HOT|CS_CLK_RUN_RST|CS_CLK_RUN_ENA));
+
+       hw->chip_id = skge_read8(hw, B2_CHIP_ID);
+       hw->phy_type = skge_read8(hw, B2_E_1) & 0xf;
+       hw->pmd_type = skge_read8(hw, B2_PMD_TYP);
+
+       switch(hw->chip_id) {
+       case CHIP_ID_GENESIS:
+               switch (hw->phy_type) {
+               case SK_PHY_XMAC:
+                       hw->phy_addr = PHY_ADDR_XMAC;
+                       break;
+               case SK_PHY_BCOM:
+                       hw->phy_addr = PHY_ADDR_BCOM;
+                       break;
+               default:
+                       printk(KERN_ERR PFX "%s: unsupported phy type 0x%x\n",
+                              pci_name(hw->pdev), hw->phy_type);
+                       return -EOPNOTSUPP;
+               }
+               break;
+
+       case CHIP_ID_YUKON:
+       case CHIP_ID_YUKON_LITE:
+       case CHIP_ID_YUKON_LP:
+               if (hw->phy_type < SK_PHY_MARV_COPPER && hw->pmd_type != 'S')
+                       hw->phy_type = SK_PHY_MARV_COPPER;
+
+               hw->phy_addr = PHY_ADDR_MARV;
+               if (!iscopper(hw))
+                       hw->phy_type = SK_PHY_MARV_FIBER;
+
+               break;
+
+       default:
+               printk(KERN_ERR PFX "%s: unsupported chip type 0x%x\n",
+                      pci_name(hw->pdev), hw->chip_id);
+               return -EOPNOTSUPP;
+       }
+
+       hw->mac_cfg = skge_read8(hw, B2_MAC_CFG);
+       ports = isdualport(hw) ? 2 : 1;
+
+       /* read the adapters RAM size */
+       t8 = skge_read8(hw, B2_E_0);
+       if (hw->chip_id == CHIP_ID_GENESIS) {
+               if (t8 == 3) {
+                       /* special case: 4 x 64k x 36, offset = 0x80000 */
+                       hw->ram_size = 0x100000;
+                       hw->ram_offset = 0x80000;
+               } else
+                       hw->ram_size = t8 * 512;
+       }
+       else if (t8 == 0)
+               hw->ram_size = 0x20000;
+       else
+               hw->ram_size = t8 * 4096;
+
+       if (hw->chip_id == CHIP_ID_GENESIS)
+               genesis_init(hw);
+       else {
+               /* switch power to VCC (WA for VAUX problem) */
+               skge_write8(hw, B0_POWER_CTRL,
+                           PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_OFF | PC_VCC_ON);
+               for (i = 0; i < ports; i++) {
+                       skge_write16(hw, SKGEMAC_REG(i, GMAC_LINK_CTRL), GMLC_RST_SET);
+                       skge_write16(hw, SKGEMAC_REG(i, GMAC_LINK_CTRL), GMLC_RST_CLR);
+               }
+       }
+
+       /* turn off hardware timer (unused) */
+       skge_write8(hw, B2_TI_CTRL, TIM_STOP);
+       skge_write8(hw, B2_TI_CTRL, TIM_CLR_IRQ);
+       skge_write8(hw, B0_LED, LED_STAT_ON);
+
+       /* enable the Tx Arbiters */
+       for (i = 0; i < ports; i++)
+               skge_write8(hw, SKGEMAC_REG(i, TXA_CTRL), TXA_ENA_ARB);
+
+       /* Initialize ram interface */
+       skge_write16(hw, B3_RI_CTRL, RI_RST_CLR);
+
+       skge_write8(hw, B3_RI_WTO_R1, SK_RI_TO_53);
+       skge_write8(hw, B3_RI_WTO_XA1, SK_RI_TO_53);
+       skge_write8(hw, B3_RI_WTO_XS1, SK_RI_TO_53);
+       skge_write8(hw, B3_RI_RTO_R1, SK_RI_TO_53);
+       skge_write8(hw, B3_RI_RTO_XA1, SK_RI_TO_53);
+       skge_write8(hw, B3_RI_RTO_XS1, SK_RI_TO_53);
+       skge_write8(hw, B3_RI_WTO_R2, SK_RI_TO_53);
+       skge_write8(hw, B3_RI_WTO_XA2, SK_RI_TO_53);
+       skge_write8(hw, B3_RI_WTO_XS2, SK_RI_TO_53);
+       skge_write8(hw, B3_RI_RTO_R2, SK_RI_TO_53);
+       skge_write8(hw, B3_RI_RTO_XA2, SK_RI_TO_53);
+       skge_write8(hw, B3_RI_RTO_XS2, SK_RI_TO_53);
+
+       skge_write32(hw, B0_HWE_IMSK, IS_ERR_MSK);
+
+       /* Set interrupt moderation for Transmit only
+        * Receive interrupts avoided by NAPI
+        */
+       skge_write32(hw, B2_IRQM_MSK, IS_XA1_F|IS_XA2_F);
+       skge_write32(hw, B2_IRQM_INI, skge_usecs2clk(hw, 100));
+       skge_write32(hw, B2_IRQM_CTRL, TIM_START);
+
+       hw->intr_mask = IS_HW_ERR | IS_EXT_REG | IS_PORT_1;
+       if (isdualport(hw))
+               hw->intr_mask |= IS_PORT_2;
+       skge_write32(hw, B0_IMSK, hw->intr_mask);
+
+       if (hw->chip_id != CHIP_ID_GENESIS)
+               skge_write8(hw, GMAC_IRQ_MSK, 0);
+
+       spin_lock_bh(&hw->phy_lock);
+       for (i = 0; i < ports; i++) {
+               if (hw->chip_id == CHIP_ID_GENESIS)
+                       genesis_reset(hw, i);
+               else
+                       yukon_reset(hw, i);
+       }
+       spin_unlock_bh(&hw->phy_lock);
+
+       return 0;
+}
+
+/* Initialize network device */
+static struct net_device *skge_devinit(struct skge_hw *hw, int port)
+{
+       struct skge_port *skge;
+       struct net_device *dev = alloc_etherdev(sizeof(*skge));
+
+       if (!dev) {
+               printk(KERN_ERR "skge etherdev alloc failed");
+               return NULL;
+       }
+
+       SET_MODULE_OWNER(dev);
+       SET_NETDEV_DEV(dev, &hw->pdev->dev);
+       dev->open = skge_up;
+       dev->stop = skge_down;
+       dev->hard_start_xmit = skge_xmit_frame;
+       dev->get_stats = skge_get_stats;
+       if (hw->chip_id == CHIP_ID_GENESIS)
+               dev->set_multicast_list = genesis_set_multicast;
+       else
+               dev->set_multicast_list = yukon_set_multicast;
+
+       dev->set_mac_address = skge_set_mac_address;
+       dev->change_mtu = skge_change_mtu;
+       SET_ETHTOOL_OPS(dev, &skge_ethtool_ops);
+       dev->tx_timeout = skge_tx_timeout;
+       dev->watchdog_timeo = TX_WATCHDOG;
+       dev->poll = skge_poll;
+       dev->weight = NAPI_WEIGHT;
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       dev->poll_controller = skge_netpoll;
+#endif
+       dev->irq = hw->pdev->irq;
+       dev->features = NETIF_F_LLTX;
+
+       skge = netdev_priv(dev);
+       skge->netdev = dev;
+       skge->hw = hw;
+       skge->msg_enable = netif_msg_init(debug, default_msg);
+       skge->tx_ring.count = DEFAULT_TX_RING_SIZE;
+       skge->rx_ring.count = DEFAULT_RX_RING_SIZE;
+
+       /* Auto speed and flow control */
+       skge->autoneg = AUTONEG_ENABLE;
+       skge->flow_control = FLOW_MODE_SYMMETRIC;
+       skge->duplex = -1;
+       skge->speed = -1;
+       skge->advertising = skge_modes(hw);
+
+       hw->dev[port] = dev;
+
+       skge->port = port;
+
+       spin_lock_init(&skge->tx_lock);
+
+       init_timer(&skge->link_check);
+       skge->link_check.function = skge_link_timer;
+       skge->link_check.data = (unsigned long) skge;
+
+       init_timer(&skge->led_blink);
+       skge->led_blink.function = skge_blink_timer;
+       skge->led_blink.data = (unsigned long) skge;
+
+       if (hw->chip_id != CHIP_ID_GENESIS) {
+               dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
+               skge->rx_csum = 1;
+       }
+
+       /* read the mac address */
+       memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port*8, ETH_ALEN);
+
+       /* device is off until link detection */
+       netif_carrier_off(dev);
+       netif_stop_queue(dev);
+
+       return dev;
+}
+
+static void __devinit skge_show_addr(struct net_device *dev)
+{
+       const struct skge_port *skge = netdev_priv(dev);
+
+       if (netif_msg_probe(skge))
+               printk(KERN_INFO PFX "%s: addr %02x:%02x:%02x:%02x:%02x:%02x\n",
+                      dev->name,
+                      dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
+                      dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+}
+
+static int __devinit skge_probe(struct pci_dev *pdev,
+                               const struct pci_device_id *ent)
+{
+       struct net_device *dev, *dev1;
+       struct skge_hw *hw;
+       int err, using_dac = 0;
+
+       if ((err = pci_enable_device(pdev))) {
+               printk(KERN_ERR PFX "%s cannot enable PCI device\n",
+                      pci_name(pdev));
+               goto err_out;
+       }
+
+       if ((err = pci_request_regions(pdev, DRV_NAME))) {
+               printk(KERN_ERR PFX "%s cannot obtain PCI resources\n",
+                      pci_name(pdev));
+               goto err_out_disable_pdev;
+       }
+
+       pci_set_master(pdev);
+
+       if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK)))
+               using_dac = 1;
+       else if (!(err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
+               printk(KERN_ERR PFX "%s no usable DMA configuration\n",
+                      pci_name(pdev));
+               goto err_out_free_regions;
+       }
+
+#ifdef __BIG_ENDIAN
+       /* byte swap decriptors in hardware */
+       {
+               u32 reg;
+
+               pci_read_config_dword(pdev, PCI_DEV_REG2, &reg);
+               reg |= PCI_REV_DESC;
+               pci_write_config_dword(pdev, PCI_DEV_REG2, reg);
+       }
+#endif
+
+       err = -ENOMEM;
+       hw = kmalloc(sizeof(*hw), GFP_KERNEL);
+       if (!hw) {
+               printk(KERN_ERR PFX "%s: cannot allocate hardware struct\n",
+                      pci_name(pdev));
+               goto err_out_free_regions;
+       }
+
+       memset(hw, 0, sizeof(*hw));
+       hw->pdev = pdev;
+       spin_lock_init(&hw->phy_lock);
+       tasklet_init(&hw->ext_tasklet, skge_extirq, (unsigned long) hw);
+
+       hw->regs = ioremap_nocache(pci_resource_start(pdev, 0), 0x4000);
+       if (!hw->regs) {
+               printk(KERN_ERR PFX "%s: cannot map device registers\n",
+                      pci_name(pdev));
+               goto err_out_free_hw;
+       }
+
+       if ((err = request_irq(pdev->irq, skge_intr, SA_SHIRQ, DRV_NAME, hw))) {
+               printk(KERN_ERR PFX "%s: cannot assign irq %d\n",
+                      pci_name(pdev), pdev->irq);
+               goto err_out_iounmap;
+       }
+       pci_set_drvdata(pdev, hw);
+
+       err = skge_reset(hw);
+       if (err)
+               goto err_out_free_irq;
+
+       printk(KERN_INFO PFX "addr 0x%lx irq %d chip %s rev %d\n",
+              pci_resource_start(pdev, 0), pdev->irq,
+              skge_board_name(hw), chip_rev(hw));
+
+       if ((dev = skge_devinit(hw, 0)) == NULL)
+               goto err_out_led_off;
+
+       if (using_dac)
+               dev->features |= NETIF_F_HIGHDMA;
+
+       if ((err = register_netdev(dev))) {
+               printk(KERN_ERR PFX "%s: cannot register net device\n",
+                      pci_name(pdev));
+               goto err_out_free_netdev;
+       }
+
+       skge_show_addr(dev);
+
+       if (isdualport(hw) && (dev1 = skge_devinit(hw, 1))) {
+               if (using_dac)
+                       dev1->features |= NETIF_F_HIGHDMA;
+
+               if (register_netdev(dev1) == 0)
+                       skge_show_addr(dev1);
+               else {
+                       /* Failure to register second port need not be fatal */
+                       printk(KERN_WARNING PFX "register of second port failed\n");
+                       hw->dev[1] = NULL;
+                       free_netdev(dev1);
+               }
+       }
+
+       return 0;
+
+err_out_free_netdev:
+       free_netdev(dev);
+err_out_led_off:
+       skge_write16(hw, B0_LED, LED_STAT_OFF);
+err_out_free_irq:
+       free_irq(pdev->irq, hw);
+err_out_iounmap:
+       iounmap(hw->regs);
+err_out_free_hw:
+       kfree(hw);
+err_out_free_regions:
+       pci_release_regions(pdev);
+err_out_disable_pdev:
+       pci_disable_device(pdev);
+       pci_set_drvdata(pdev, NULL);
+err_out:
+       return err;
+}
+
+static void __devexit skge_remove(struct pci_dev *pdev)
+{
+       struct skge_hw *hw  = pci_get_drvdata(pdev);
+       struct net_device *dev0, *dev1;
+
+       if(!hw)
+               return;
+
+       if ((dev1 = hw->dev[1]))
+               unregister_netdev(dev1);
+       dev0 = hw->dev[0];
+       unregister_netdev(dev0);
+
+       tasklet_kill(&hw->ext_tasklet);
+
+       free_irq(pdev->irq, hw);
+       pci_release_regions(pdev);
+       pci_disable_device(pdev);
+       if (dev1)
+               free_netdev(dev1);
+       free_netdev(dev0);
+       skge_write16(hw, B0_LED, LED_STAT_OFF);
+       iounmap(hw->regs);
+       kfree(hw);
+       pci_set_drvdata(pdev, NULL);
+}
+
+#ifdef CONFIG_PM
+static int skge_suspend(struct pci_dev *pdev, u32 state)
+{
+       struct skge_hw *hw  = pci_get_drvdata(pdev);
+       int i, wol = 0;
+
+       for(i = 0; i < 2; i++) {
+               struct net_device *dev = hw->dev[i];
+
+               if (dev) {
+                       struct skge_port *skge = netdev_priv(dev);
+                       if (netif_running(dev)) {
+                               netif_carrier_off(dev);
+                               skge_down(dev);
+                       }
+                       netif_device_detach(dev);
+                       wol |= skge->wol;
+               }
+       }
+
+       pci_save_state(pdev);
+       pci_enable_wake(pdev, state, wol);
+       pci_disable_device(pdev);
+       pci_set_power_state(pdev, pci_choose_state(pdev, state));
+
+       return 0;
+}
+
+static int skge_resume(struct pci_dev *pdev)
+{
+       struct skge_hw *hw  = pci_get_drvdata(pdev);
+       int i;
+
+       pci_set_power_state(pdev, PCI_D0);
+       pci_restore_state(pdev);
+       pci_enable_wake(pdev, PCI_D0, 0);
+
+       skge_reset(hw);
+
+       for(i = 0; i < 2; i++) {
+               struct net_device *dev = hw->dev[i];
+               if (dev) {
+                       netif_device_attach(dev);
+                       if(netif_running(dev))
+                               skge_up(dev);
+               }
+       }
+       return 0;
+}
+#endif
+
+static struct pci_driver skge_driver = {
+       .name =         DRV_NAME,
+       .id_table =     skge_id_table,
+       .probe =        skge_probe,
+       .remove =       __devexit_p(skge_remove),
+#ifdef CONFIG_PM
+       .suspend =      skge_suspend,
+       .resume =       skge_resume,
+#endif
+};
+
+static int __init skge_init_module(void)
+{
+       return pci_module_init(&skge_driver);
+}
+
+static void __exit skge_cleanup_module(void)
+{
+       pci_unregister_driver(&skge_driver);
+}
+
+module_init(skge_init_module);
+module_exit(skge_cleanup_module);
diff --git a/drivers/net/skge.h b/drivers/net/skge.h
new file mode 100644 (file)
index 0000000..36c62b6
--- /dev/null
@@ -0,0 +1,3005 @@
+/*
+ * Definitions for the new Marvell Yukon / SysKonenct driver.
+ */
+#ifndef _SKGE_H
+#define _SKGE_H
+
+/* PCI config registers */
+#define PCI_DEV_REG1   0x40
+#define PCI_DEV_REG2   0x44
+#ifndef PCI_VPD
+#define PCI_VPD                0x50
+#endif
+
+/*     PCI_OUR_REG_2           32 bit  Our Register 2 */
+enum {
+       PCI_VPD_WR_THR  = 0xff<<24, /* Bit 31..24:      VPD Write Threshold */
+       PCI_DEV_SEL     = 0x7f<<17, /* Bit 23..17:      EEPROM Device Select */
+       PCI_VPD_ROM_SZ  = 7   <<14, /* Bit 16..14:      VPD ROM Size    */
+                                   /* Bit 13..12:      reserved        */
+       PCI_EN_DUMMY_RD = 1<<3, /* Enable Dummy Read */
+       PCI_REV_DESC    = 1<<2, /* Reverse Desc. Bytes */
+       PCI_USEDATA64   = 1<<0, /* Use 64Bit Data bus ext */
+};
+
+/*     PCI_VPD_ADR_REG         16 bit  VPD Address Register */
+enum {
+       PCI_VPD_FLAG    = 1<<15,  /* starts VPD rd/wr cycle */
+       PCI_VPD_ADR_MSK =0x7fffL, /* Bit 14.. 0:        VPD Address Mask */
+       VPD_RES_ID      = 0x82,
+       VPD_RES_READ    = 0x90,
+       VPD_RES_WRITE   = 0x81,
+       VPD_RES_END     = 0x78,
+};
+
+
+#define PCI_STATUS_ERROR_BITS (PCI_STATUS_DETECTED_PARITY | \
+                              PCI_STATUS_SIG_SYSTEM_ERROR | \
+                              PCI_STATUS_REC_MASTER_ABORT | \
+                              PCI_STATUS_REC_TARGET_ABORT | \
+                              PCI_STATUS_PARITY)
+
+
+enum csr_regs {
+       B0_RAP  = 0x0000,
+       B0_CTST = 0x0004,
+       B0_LED  = 0x0006,
+       B0_POWER_CTRL   = 0x0007,
+       B0_ISRC = 0x0008,
+       B0_IMSK = 0x000c,
+       B0_HWE_ISRC     = 0x0010,
+       B0_HWE_IMSK     = 0x0014,
+       B0_SP_ISRC      = 0x0018,
+       B0_XM1_IMSK     = 0x0020,
+       B0_XM1_ISRC     = 0x0028,
+       B0_XM1_PHY_ADDR = 0x0030,
+       B0_XM1_PHY_DATA = 0x0034,
+       B0_XM2_IMSK     = 0x0040,
+       B0_XM2_ISRC     = 0x0048,
+       B0_XM2_PHY_ADDR = 0x0050,
+       B0_XM2_PHY_DATA = 0x0054,
+       B0_R1_CSR       = 0x0060,
+       B0_R2_CSR       = 0x0064,
+       B0_XS1_CSR      = 0x0068,
+       B0_XA1_CSR      = 0x006c,
+       B0_XS2_CSR      = 0x0070,
+       B0_XA2_CSR      = 0x0074,
+
+       B2_MAC_1        = 0x0100,
+       B2_MAC_2        = 0x0108,
+       B2_MAC_3        = 0x0110,
+       B2_CONN_TYP     = 0x0118,
+       B2_PMD_TYP      = 0x0119,
+       B2_MAC_CFG      = 0x011a,
+       B2_CHIP_ID      = 0x011b,
+       B2_E_0          = 0x011c,
+       B2_E_1          = 0x011d,
+       B2_E_2          = 0x011e,
+       B2_E_3          = 0x011f,
+       B2_FAR          = 0x0120,
+       B2_FDP          = 0x0124,
+       B2_LD_CTRL      = 0x0128,
+       B2_LD_TEST      = 0x0129,
+       B2_TI_INI       = 0x0130,
+       B2_TI_VAL       = 0x0134,
+       B2_TI_CTRL      = 0x0138,
+       B2_TI_TEST      = 0x0139,
+       B2_IRQM_INI     = 0x0140,
+       B2_IRQM_VAL     = 0x0144,
+       B2_IRQM_CTRL    = 0x0148,
+       B2_IRQM_TEST    = 0x0149,
+       B2_IRQM_MSK     = 0x014c,
+       B2_IRQM_HWE_MSK = 0x0150,
+       B2_TST_CTRL1    = 0x0158,
+       B2_TST_CTRL2    = 0x0159,
+       B2_GP_IO        = 0x015c,
+       B2_I2C_CTRL     = 0x0160,
+       B2_I2C_DATA     = 0x0164,
+       B2_I2C_IRQ      = 0x0168,
+       B2_I2C_SW       = 0x016c,
+       B2_BSC_INI      = 0x0170,
+       B2_BSC_VAL      = 0x0174,
+       B2_BSC_CTRL     = 0x0178,
+       B2_BSC_STAT     = 0x0179,
+       B2_BSC_TST      = 0x017a,
+
+       B3_RAM_ADDR     = 0x0180,
+       B3_RAM_DATA_LO  = 0x0184,
+       B3_RAM_DATA_HI  = 0x0188,
+       B3_RI_WTO_R1    = 0x0190,
+       B3_RI_WTO_XA1   = 0x0191,
+       B3_RI_WTO_XS1   = 0x0192,
+       B3_RI_RTO_R1    = 0x0193,
+       B3_RI_RTO_XA1   = 0x0194,
+       B3_RI_RTO_XS1   = 0x0195,
+       B3_RI_WTO_R2    = 0x0196,
+       B3_RI_WTO_XA2   = 0x0197,
+       B3_RI_WTO_XS2   = 0x0198,
+       B3_RI_RTO_R2    = 0x0199,
+       B3_RI_RTO_XA2   = 0x019a,
+       B3_RI_RTO_XS2   = 0x019b,
+       B3_RI_TO_VAL    = 0x019c,
+       B3_RI_CTRL      = 0x01a0,
+       B3_RI_TEST      = 0x01a2,
+       B3_MA_TOINI_RX1 = 0x01b0,
+       B3_MA_TOINI_RX2 = 0x01b1,
+       B3_MA_TOINI_TX1 = 0x01b2,
+       B3_MA_TOINI_TX2 = 0x01b3,
+       B3_MA_TOVAL_RX1 = 0x01b4,
+       B3_MA_TOVAL_RX2 = 0x01b5,
+       B3_MA_TOVAL_TX1 = 0x01b6,
+       B3_MA_TOVAL_TX2 = 0x01b7,
+       B3_MA_TO_CTRL   = 0x01b8,
+       B3_MA_TO_TEST   = 0x01ba,
+       B3_MA_RCINI_RX1 = 0x01c0,
+       B3_MA_RCINI_RX2 = 0x01c1,
+       B3_MA_RCINI_TX1 = 0x01c2,
+       B3_MA_RCINI_TX2 = 0x01c3,
+       B3_MA_RCVAL_RX1 = 0x01c4,
+       B3_MA_RCVAL_RX2 = 0x01c5,
+       B3_MA_RCVAL_TX1 = 0x01c6,
+       B3_MA_RCVAL_TX2 = 0x01c7,
+       B3_MA_RC_CTRL   = 0x01c8,
+       B3_MA_RC_TEST   = 0x01ca,
+       B3_PA_TOINI_RX1 = 0x01d0,
+       B3_PA_TOINI_RX2 = 0x01d4,
+       B3_PA_TOINI_TX1 = 0x01d8,
+       B3_PA_TOINI_TX2 = 0x01dc,
+       B3_PA_TOVAL_RX1 = 0x01e0,
+       B3_PA_TOVAL_RX2 = 0x01e4,
+       B3_PA_TOVAL_TX1 = 0x01e8,
+       B3_PA_TOVAL_TX2 = 0x01ec,
+       B3_PA_CTRL      = 0x01f0,
+       B3_PA_TEST      = 0x01f2,
+};
+
+/*     B0_CTST                 16 bit  Control/Status register */
+enum {
+       CS_CLK_RUN_HOT  = 1<<13,/* CLK_RUN hot m. (YUKON-Lite only) */
+       CS_CLK_RUN_RST  = 1<<12,/* CLK_RUN reset  (YUKON-Lite only) */
+       CS_CLK_RUN_ENA  = 1<<11,/* CLK_RUN enable (YUKON-Lite only) */
+       CS_VAUX_AVAIL   = 1<<10,/* VAUX available (YUKON only) */
+       CS_BUS_CLOCK    = 1<<9, /* Bus Clock 0/1 = 33/66 MHz */
+       CS_BUS_SLOT_SZ  = 1<<8, /* Slot Size 0/1 = 32/64 bit slot */
+       CS_ST_SW_IRQ    = 1<<7, /* Set IRQ SW Request */
+       CS_CL_SW_IRQ    = 1<<6, /* Clear IRQ SW Request */
+       CS_STOP_DONE    = 1<<5, /* Stop Master is finished */
+       CS_STOP_MAST    = 1<<4, /* Command Bit to stop the master */
+       CS_MRST_CLR     = 1<<3, /* Clear Master reset   */
+       CS_MRST_SET     = 1<<2, /* Set Master reset     */
+       CS_RST_CLR      = 1<<1, /* Clear Software reset */
+       CS_RST_SET      = 1,    /* Set   Software reset */
+
+/*     B0_LED                   8 Bit  LED register */
+/* Bit  7.. 2: reserved */
+       LED_STAT_ON     = 1<<1, /* Status LED on        */
+       LED_STAT_OFF    = 1,            /* Status LED off       */
+
+/*     B0_POWER_CTRL    8 Bit  Power Control reg (YUKON only) */
+       PC_VAUX_ENA     = 1<<7, /* Switch VAUX Enable  */
+       PC_VAUX_DIS     = 1<<6, /* Switch VAUX Disable */
+       PC_VCC_ENA      = 1<<5, /* Switch VCC Enable  */
+       PC_VCC_DIS      = 1<<4, /* Switch VCC Disable */
+       PC_VAUX_ON      = 1<<3, /* Switch VAUX On  */
+       PC_VAUX_OFF     = 1<<2, /* Switch VAUX Off */
+       PC_VCC_ON       = 1<<1, /* Switch VCC On  */
+       PC_VCC_OFF      = 1<<0, /* Switch VCC Off */
+};
+
+/*     B2_IRQM_MSK     32 bit  IRQ Moderation Mask */
+enum {
+       IS_ALL_MSK      = 0xbffffffful, /* All Interrupt bits */
+       IS_HW_ERR       = 1<<31,        /* Interrupt HW Error */
+                                       /* Bit 30:      reserved */
+       IS_PA_TO_RX1    = 1<<29,        /* Packet Arb Timeout Rx1 */
+       IS_PA_TO_RX2    = 1<<28,        /* Packet Arb Timeout Rx2 */
+       IS_PA_TO_TX1    = 1<<27,        /* Packet Arb Timeout Tx1 */
+       IS_PA_TO_TX2    = 1<<26,        /* Packet Arb Timeout Tx2 */
+       IS_I2C_READY    = 1<<25,        /* IRQ on end of I2C Tx */
+       IS_IRQ_SW       = 1<<24,        /* SW forced IRQ        */
+       IS_EXT_REG      = 1<<23,        /* IRQ from LM80 or PHY (GENESIS only) */
+                                       /* IRQ from PHY (YUKON only) */
+       IS_TIMINT       = 1<<22,        /* IRQ from Timer       */
+       IS_MAC1         = 1<<21,        /* IRQ from MAC 1       */
+       IS_LNK_SYNC_M1  = 1<<20,        /* Link Sync Cnt wrap MAC 1 */
+       IS_MAC2         = 1<<19,        /* IRQ from MAC 2       */
+       IS_LNK_SYNC_M2  = 1<<18,        /* Link Sync Cnt wrap MAC 2 */
+/* Receive Queue 1 */
+       IS_R1_B         = 1<<17,        /* Q_R1 End of Buffer */
+       IS_R1_F         = 1<<16,        /* Q_R1 End of Frame */
+       IS_R1_C         = 1<<15,        /* Q_R1 Encoding Error */
+/* Receive Queue 2 */
+       IS_R2_B         = 1<<14,        /* Q_R2 End of Buffer */
+       IS_R2_F         = 1<<13,        /* Q_R2 End of Frame */
+       IS_R2_C         = 1<<12,        /* Q_R2 Encoding Error */
+/* Synchronous Transmit Queue 1 */
+       IS_XS1_B        = 1<<11,        /* Q_XS1 End of Buffer */
+       IS_XS1_F        = 1<<10,        /* Q_XS1 End of Frame */
+       IS_XS1_C        = 1<<9,         /* Q_XS1 Encoding Error */
+/* Asynchronous Transmit Queue 1 */
+       IS_XA1_B        = 1<<8,         /* Q_XA1 End of Buffer */
+       IS_XA1_F        = 1<<7,         /* Q_XA1 End of Frame */
+       IS_XA1_C        = 1<<6,         /* Q_XA1 Encoding Error */
+/* Synchronous Transmit Queue 2 */
+       IS_XS2_B        = 1<<5,         /* Q_XS2 End of Buffer */
+       IS_XS2_F        = 1<<4,         /* Q_XS2 End of Frame */
+       IS_XS2_C        = 1<<3,         /* Q_XS2 Encoding Error */
+/* Asynchronous Transmit Queue 2 */
+       IS_XA2_B        = 1<<2,         /* Q_XA2 End of Buffer */
+       IS_XA2_F        = 1<<1,         /* Q_XA2 End of Frame */
+       IS_XA2_C        = 1<<0,         /* Q_XA2 Encoding Error */
+
+       IS_PORT_1       = IS_XA1_F| IS_R1_F| IS_MAC1,
+       IS_PORT_2       = IS_XA2_F| IS_R2_F| IS_MAC2,
+};
+
+
+/*     B2_IRQM_HWE_MSK 32 bit  IRQ Moderation HW Error Mask */
+enum {
+       IS_ERR_MSK      = 0x00003fff,/*                 All Error bits */
+
+       IS_IRQ_TIST_OV  = 1<<13, /* Time Stamp Timer Overflow (YUKON only) */
+       IS_IRQ_SENSOR   = 1<<12, /* IRQ from Sensor (YUKON only) */
+       IS_IRQ_MST_ERR  = 1<<11, /* IRQ master error detected */
+       IS_IRQ_STAT     = 1<<10, /* IRQ status exception */
+       IS_NO_STAT_M1   = 1<<9, /* No Rx Status from MAC 1 */
+       IS_NO_STAT_M2   = 1<<8, /* No Rx Status from MAC 2 */
+       IS_NO_TIST_M1   = 1<<7, /* No Time Stamp from MAC 1 */
+       IS_NO_TIST_M2   = 1<<6, /* No Time Stamp from MAC 2 */
+       IS_RAM_RD_PAR   = 1<<5, /* RAM Read  Parity Error */
+       IS_RAM_WR_PAR   = 1<<4, /* RAM Write Parity Error */
+       IS_M1_PAR_ERR   = 1<<3, /* MAC 1 Parity Error */
+       IS_M2_PAR_ERR   = 1<<2, /* MAC 2 Parity Error */
+       IS_R1_PAR_ERR   = 1<<1, /* Queue R1 Parity Error */
+       IS_R2_PAR_ERR   = 1<<0, /* Queue R2 Parity Error */
+};
+
+/*     B2_TST_CTRL1     8 bit  Test Control Register 1 */
+enum {
+       TST_FRC_DPERR_MR = 1<<7, /* force DATAPERR on MST RD */
+       TST_FRC_DPERR_MW = 1<<6, /* force DATAPERR on MST WR */
+       TST_FRC_DPERR_TR = 1<<5, /* force DATAPERR on TRG RD */
+       TST_FRC_DPERR_TW = 1<<4, /* force DATAPERR on TRG WR */
+       TST_FRC_APERR_M  = 1<<3, /* force ADDRPERR on MST */
+       TST_FRC_APERR_T  = 1<<2, /* force ADDRPERR on TRG */
+       TST_CFG_WRITE_ON = 1<<1, /* Enable  Config Reg WR */
+       TST_CFG_WRITE_OFF= 1<<0, /* Disable Config Reg WR */
+};
+
+/*     B2_MAC_CFG               8 bit  MAC Configuration / Chip Revision */
+enum {
+       CFG_CHIP_R_MSK    = 0xf<<4,     /* Bit 7.. 4: Chip Revision */
+                                       /* Bit 3.. 2:   reserved */
+       CFG_DIS_M2_CLK    = 1<<1,       /* Disable Clock for 2nd MAC */
+       CFG_SNG_MAC       = 1<<0,       /* MAC Config: 0=2 MACs / 1=1 MAC*/
+};
+
+/*     B2_CHIP_ID               8 bit  Chip Identification Number */
+enum {
+       CHIP_ID_GENESIS    = 0x0a, /* Chip ID for GENESIS */
+       CHIP_ID_YUKON      = 0xb0, /* Chip ID for YUKON */
+       CHIP_ID_YUKON_LITE = 0xb1, /* Chip ID for YUKON-Lite (Rev. A1-A3) */
+       CHIP_ID_YUKON_LP   = 0xb2, /* Chip ID for YUKON-LP */
+       CHIP_ID_YUKON_XL   = 0xb3, /* Chip ID for YUKON-2 XL */
+       CHIP_ID_YUKON_EC   = 0xb6, /* Chip ID for YUKON-2 EC */
+       CHIP_ID_YUKON_FE   = 0xb7, /* Chip ID for YUKON-2 FE */
+
+       CHIP_REV_YU_LITE_A1  = 3,       /* Chip Rev. for YUKON-Lite A1,A2 */
+       CHIP_REV_YU_LITE_A3  = 7,       /* Chip Rev. for YUKON-Lite A3 */
+};
+
+/*     B2_LD_TEST               8 bit  EPROM loader test register */
+enum {
+       LD_T_ON         = 1<<3, /* Loader Test mode on */
+       LD_T_OFF        = 1<<2, /* Loader Test mode off */
+       LD_T_STEP       = 1<<1, /* Decrement FPROM addr. Counter */
+       LD_START        = 1<<0, /* Start loading FPROM */
+};
+
+/*     B2_TI_CTRL               8 bit  Timer control */
+/*     B2_IRQM_CTRL     8 bit  IRQ Moderation Timer Control */
+enum {
+       TIM_START       = 1<<2, /* Start Timer */
+       TIM_STOP        = 1<<1, /* Stop  Timer */
+       TIM_CLR_IRQ     = 1<<0, /* Clear Timer IRQ (!IRQM) */
+};
+
+/*     B2_TI_TEST               8 Bit  Timer Test */
+/*     B2_IRQM_TEST     8 bit  IRQ Moderation Timer Test */
+/*     B28_DPT_TST              8 bit  Descriptor Poll Timer Test Reg */
+enum {
+       TIM_T_ON        = 1<<2, /* Test mode on */
+       TIM_T_OFF       = 1<<1, /* Test mode off */
+       TIM_T_STEP      = 1<<0, /* Test step */
+};
+
+/*     B28_DPT_INI     32 bit  Descriptor Poll Timer Init Val */
+/*     B28_DPT_VAL     32 bit  Descriptor Poll Timer Curr Val */
+/*     B28_DPT_CTRL     8 bit  Descriptor Poll Timer Ctrl Reg */
+enum {
+       DPT_MSK = 0x00ffffffL,  /* Bit 23.. 0:  Desc Poll Timer Bits */
+
+       DPT_START       = 1<<1, /* Start Descriptor Poll Timer */
+       DPT_STOP        = 1<<0, /* Stop  Descriptor Poll Timer */
+};
+
+/*     B2_GP_IO                32 bit  General Purpose I/O Register */
+enum {
+       GP_DIR_9 = 1<<25, /* IO_9 direct, 0=In/1=Out */
+       GP_DIR_8 = 1<<24, /* IO_8 direct, 0=In/1=Out */
+       GP_DIR_7 = 1<<23, /* IO_7 direct, 0=In/1=Out */
+       GP_DIR_6 = 1<<22, /* IO_6 direct, 0=In/1=Out */
+       GP_DIR_5 = 1<<21, /* IO_5 direct, 0=In/1=Out */
+       GP_DIR_4 = 1<<20, /* IO_4 direct, 0=In/1=Out */
+       GP_DIR_3 = 1<<19, /* IO_3 direct, 0=In/1=Out */
+       GP_DIR_2 = 1<<18, /* IO_2 direct, 0=In/1=Out */
+       GP_DIR_1 = 1<<17, /* IO_1 direct, 0=In/1=Out */
+       GP_DIR_0 = 1<<16, /* IO_0 direct, 0=In/1=Out */
+
+       GP_IO_9 = 1<<9, /* IO_9 pin */
+       GP_IO_8 = 1<<8, /* IO_8 pin */
+       GP_IO_7 = 1<<7, /* IO_7 pin */
+       GP_IO_6 = 1<<6, /* IO_6 pin */
+       GP_IO_5 = 1<<5, /* IO_5 pin */
+       GP_IO_4 = 1<<4, /* IO_4 pin */
+       GP_IO_3 = 1<<3, /* IO_3 pin */
+       GP_IO_2 = 1<<2, /* IO_2 pin */
+       GP_IO_1 = 1<<1, /* IO_1 pin */
+       GP_IO_0 = 1<<0, /* IO_0 pin */
+};
+
+/* Rx/Tx Path related Arbiter Test Registers */
+/*     B3_MA_TO_TEST   16 bit  MAC Arbiter Timeout Test Reg */
+/*     B3_MA_RC_TEST   16 bit  MAC Arbiter Recovery Test Reg */
+/*     B3_PA_TEST              16 bit  Packet Arbiter Test Register */
+/*                     Bit 15, 11, 7, and 3 are reserved in B3_PA_TEST */
+enum {
+       TX2_T_EV        = 1<<15,/* TX2 Timeout/Recv Event occured */
+       TX2_T_ON        = 1<<14,/* TX2 Timeout/Recv Timer Test On */
+       TX2_T_OFF       = 1<<13,/* TX2 Timeout/Recv Timer Tst Off */
+       TX2_T_STEP      = 1<<12,/* TX2 Timeout/Recv Timer Step */
+       TX1_T_EV        = 1<<11,/* TX1 Timeout/Recv Event occured */
+       TX1_T_ON        = 1<<10,/* TX1 Timeout/Recv Timer Test On */
+       TX1_T_OFF       = 1<<9, /* TX1 Timeout/Recv Timer Tst Off */
+       TX1_T_STEP      = 1<<8, /* TX1 Timeout/Recv Timer Step */
+       RX2_T_EV        = 1<<7, /* RX2 Timeout/Recv Event occured */
+       RX2_T_ON        = 1<<6, /* RX2 Timeout/Recv Timer Test On */
+       RX2_T_OFF       = 1<<5, /* RX2 Timeout/Recv Timer Tst Off */
+       RX2_T_STEP      = 1<<4, /* RX2 Timeout/Recv Timer Step */
+       RX1_T_EV        = 1<<3, /* RX1 Timeout/Recv Event occured */
+       RX1_T_ON        = 1<<2, /* RX1 Timeout/Recv Timer Test On */
+       RX1_T_OFF       = 1<<1, /* RX1 Timeout/Recv Timer Tst Off */
+       RX1_T_STEP      = 1<<0, /* RX1 Timeout/Recv Timer Step */
+};
+
+/* Descriptor Bit Definition */
+/*     TxCtrl          Transmit Buffer Control Field */
+/*     RxCtrl          Receive  Buffer Control Field */
+enum {
+       BMU_OWN         = 1<<31, /* OWN bit: 0=host/1=BMU */
+       BMU_STF         = 1<<30, /* Start of Frame */
+       BMU_EOF         = 1<<29, /* End of Frame */
+       BMU_IRQ_EOB     = 1<<28, /* Req "End of Buffer" IRQ */
+       BMU_IRQ_EOF     = 1<<27, /* Req "End of Frame" IRQ */
+                               /* TxCtrl specific bits */
+       BMU_STFWD       = 1<<26, /* (Tx)        Store & Forward Frame */
+       BMU_NO_FCS      = 1<<25, /* (Tx) Disable MAC FCS (CRC) generation */
+       BMU_SW  = 1<<24, /* (Tx)        1 bit res. for SW use */
+                               /* RxCtrl specific bits */
+       BMU_DEV_0       = 1<<26, /* (Rx)        Transfer data to Dev0 */
+       BMU_STAT_VAL    = 1<<25, /* (Rx)        Rx Status Valid */
+       BMU_TIST_VAL    = 1<<24, /* (Rx)        Rx TimeStamp Valid */
+                       /* Bit 23..16:  BMU Check Opcodes */
+       BMU_CHECK       = 0x55<<16, /* Default BMU check */
+       BMU_TCP_CHECK   = 0x56<<16, /* Descr with TCP ext */
+       BMU_UDP_CHECK   = 0x57<<16, /* Descr with UDP ext (YUKON only) */
+       BMU_BBC         = 0xffffL, /* Bit 15.. 0:       Buffer Byte Counter */
+};
+
+/*     B2_BSC_CTRL              8 bit  Blink Source Counter Control */
+enum {
+        BSC_START      = 1<<1, /* Start Blink Source Counter */
+        BSC_STOP       = 1<<0, /* Stop  Blink Source Counter */
+};
+
+/*     B2_BSC_STAT              8 bit  Blink Source Counter Status */
+enum {
+       BSC_SRC         = 1<<0, /* Blink Source, 0=Off / 1=On */
+};
+
+/*     B2_BSC_TST              16 bit  Blink Source Counter Test Reg */
+enum {
+       BSC_T_ON        = 1<<2, /* Test mode on */
+       BSC_T_OFF       = 1<<1, /* Test mode off */
+       BSC_T_STEP      = 1<<0, /* Test step */
+};
+
+/*     B3_RAM_ADDR             32 bit  RAM Address, to read or write */
+                                       /* Bit 31..19:  reserved */
+#define RAM_ADR_RAN    0x0007ffffL     /* Bit 18.. 0:  RAM Address Range */
+/* RAM Interface Registers */
+
+/*     B3_RI_CTRL              16 bit  RAM Iface Control Register */
+enum {
+       RI_CLR_RD_PERR  = 1<<9, /* Clear IRQ RAM Read Parity Err */
+       RI_CLR_WR_PERR  = 1<<8, /* Clear IRQ RAM Write Parity Err*/
+
+       RI_RST_CLR      = 1<<1, /* Clear RAM Interface Reset */
+       RI_RST_SET      = 1<<0, /* Set   RAM Interface Reset */
+};
+
+/*     B3_RI_TEST               8 bit  RAM Iface Test Register */
+enum {
+       RI_T_EV = 1<<3, /* Timeout Event occured */
+       RI_T_ON = 1<<2, /* Timeout Timer Test On */
+       RI_T_OFF        = 1<<1, /* Timeout Timer Test Off */
+       RI_T_STEP       = 1<<0, /* Timeout Timer Step */
+};
+
+/* MAC Arbiter Registers */
+/*     B3_MA_TO_CTRL   16 bit  MAC Arbiter Timeout Ctrl Reg */
+enum {
+       MA_FOE_ON       = 1<<3, /* XMAC Fast Output Enable ON */
+       MA_FOE_OFF      = 1<<2, /* XMAC Fast Output Enable OFF */
+       MA_RST_CLR      = 1<<1, /* Clear MAC Arbiter Reset */
+       MA_RST_SET      = 1<<0, /* Set   MAC Arbiter Reset */
+
+};
+
+/* Timeout values */
+#define SK_MAC_TO_53   72              /* MAC arbiter timeout */
+#define SK_PKT_TO_53   0x2000          /* Packet arbiter timeout */
+#define SK_PKT_TO_MAX  0xffff          /* Maximum value */
+#define SK_RI_TO_53    36              /* RAM interface timeout */
+
+
+/*     B3_MA_RC_CTRL   16 bit  MAC Arbiter Recovery Ctrl Reg */
+enum {
+       MA_ENA_REC_TX2  = 1<<7, /* Enable  Recovery Timer TX2 */
+       MA_DIS_REC_TX2  = 1<<6, /* Disable Recovery Timer TX2 */
+       MA_ENA_REC_TX1  = 1<<5, /* Enable  Recovery Timer TX1 */
+       MA_DIS_REC_TX1  = 1<<4, /* Disable Recovery Timer TX1 */
+       MA_ENA_REC_RX2  = 1<<3, /* Enable  Recovery Timer RX2 */
+       MA_DIS_REC_RX2  = 1<<2, /* Disable Recovery Timer RX2 */
+       MA_ENA_REC_RX1  = 1<<1, /* Enable  Recovery Timer RX1 */
+       MA_DIS_REC_RX1  = 1<<0, /* Disable Recovery Timer RX1 */
+};
+
+/* Packet Arbiter Registers */
+/*     B3_PA_CTRL              16 bit  Packet Arbiter Ctrl Register */
+enum {
+       PA_CLR_TO_TX2   = 1<<13,        /* Clear IRQ Packet Timeout TX2 */
+       PA_CLR_TO_TX1   = 1<<12,        /* Clear IRQ Packet Timeout TX1 */
+       PA_CLR_TO_RX2   = 1<<11,        /* Clear IRQ Packet Timeout RX2 */
+       PA_CLR_TO_RX1   = 1<<10,        /* Clear IRQ Packet Timeout RX1 */
+       PA_ENA_TO_TX2   = 1<<9, /* Enable  Timeout Timer TX2 */
+       PA_DIS_TO_TX2   = 1<<8, /* Disable Timeout Timer TX2 */
+       PA_ENA_TO_TX1   = 1<<7, /* Enable  Timeout Timer TX1 */
+       PA_DIS_TO_TX1   = 1<<6, /* Disable Timeout Timer TX1 */
+       PA_ENA_TO_RX2   = 1<<5, /* Enable  Timeout Timer RX2 */
+       PA_DIS_TO_RX2   = 1<<4, /* Disable Timeout Timer RX2 */
+       PA_ENA_TO_RX1   = 1<<3, /* Enable  Timeout Timer RX1 */
+       PA_DIS_TO_RX1   = 1<<2, /* Disable Timeout Timer RX1 */
+       PA_RST_CLR      = 1<<1, /* Clear MAC Arbiter Reset */
+       PA_RST_SET      = 1<<0, /* Set   MAC Arbiter Reset */
+};
+
+#define PA_ENA_TO_ALL  (PA_ENA_TO_RX1 | PA_ENA_TO_RX2 |\
+                                               PA_ENA_TO_TX1 | PA_ENA_TO_TX2)
+
+
+/* Transmit Arbiter Registers MAC 1 and 2, use MR_ADDR() to access */
+/*     TXA_ITI_INI             32 bit  Tx Arb Interval Timer Init Val */
+/*     TXA_ITI_VAL             32 bit  Tx Arb Interval Timer Value */
+/*     TXA_LIM_INI             32 bit  Tx Arb Limit Counter Init Val */
+/*     TXA_LIM_VAL             32 bit  Tx Arb Limit Counter Value */
+
+#define TXA_MAX_VAL    0x00ffffffUL    /* Bit 23.. 0:  Max TXA Timer/Cnt Val */
+
+/*     TXA_CTRL                 8 bit  Tx Arbiter Control Register */
+enum {
+       TXA_ENA_FSYNC   = 1<<7, /* Enable  force of sync Tx queue */
+       TXA_DIS_FSYNC   = 1<<6, /* Disable force of sync Tx queue */
+       TXA_ENA_ALLOC   = 1<<5, /* Enable  alloc of free bandwidth */
+       TXA_DIS_ALLOC   = 1<<4, /* Disable alloc of free bandwidth */
+       TXA_START_RC    = 1<<3, /* Start sync Rate Control */
+       TXA_STOP_RC     = 1<<2, /* Stop  sync Rate Control */
+       TXA_ENA_ARB     = 1<<1, /* Enable  Tx Arbiter */
+       TXA_DIS_ARB     = 1<<0, /* Disable Tx Arbiter */
+};
+
+/*
+ *     Bank 4 - 5
+ */
+/* Transmit Arbiter Registers MAC 1 and 2, use MR_ADDR() to access */
+enum {
+       TXA_ITI_INI     = 0x0200,/* 32 bit      Tx Arb Interval Timer Init Val*/
+       TXA_ITI_VAL     = 0x0204,/* 32 bit      Tx Arb Interval Timer Value */
+       TXA_LIM_INI     = 0x0208,/* 32 bit      Tx Arb Limit Counter Init Val */
+       TXA_LIM_VAL     = 0x020c,/* 32 bit      Tx Arb Limit Counter Value */
+       TXA_CTRL        = 0x0210,/*  8 bit      Tx Arbiter Control Register */
+       TXA_TEST        = 0x0211,/*  8 bit      Tx Arbiter Test Register */
+       TXA_STAT        = 0x0212,/*  8 bit      Tx Arbiter Status Register */
+};
+
+
+enum {
+       B6_EXT_REG      = 0x0300,/* External registers (GENESIS only) */
+       B7_CFG_SPC      = 0x0380,/* copy of the Configuration register */
+       B8_RQ1_REGS     = 0x0400,/* Receive Queue 1 */
+       B8_RQ2_REGS     = 0x0480,/* Receive Queue 2 */
+       B8_TS1_REGS     = 0x0600,/* Transmit sync queue 1 */
+       B8_TA1_REGS     = 0x0680,/* Transmit async queue 1 */
+       B8_TS2_REGS     = 0x0700,/* Transmit sync queue 2 */
+       B8_TA2_REGS     = 0x0780,/* Transmit sync queue 2 */
+       B16_RAM_REGS    = 0x0800,/* RAM Buffer Registers */
+};
+
+/* Queue Register Offsets, use Q_ADDR() to access */
+enum {
+       B8_Q_REGS = 0x0400, /* base of Queue registers */       
+       Q_D     = 0x00, /* 8*32 bit     Current Descriptor */
+       Q_DA_L  = 0x20, /* 32 bit       Current Descriptor Address Low dWord */
+       Q_DA_H  = 0x24, /* 32 bit       Current Descriptor Address High dWord */
+       Q_AC_L  = 0x28, /* 32 bit       Current Address Counter Low dWord */
+       Q_AC_H  = 0x2c, /* 32 bit       Current Address Counter High dWord */
+       Q_BC    = 0x30, /* 32 bit       Current Byte Counter */
+       Q_CSR   = 0x34, /* 32 bit       BMU Control/Status Register */
+       Q_F     = 0x38, /* 32 bit       Flag Register */
+       Q_T1    = 0x3c, /* 32 bit       Test Register 1 */
+       Q_T1_TR = 0x3c, /*  8 bit       Test Register 1 Transfer SM */
+       Q_T1_WR = 0x3d, /*  8 bit       Test Register 1 Write Descriptor SM */
+       Q_T1_RD = 0x3e, /*  8 bit       Test Register 1 Read Descriptor SM */
+       Q_T1_SV = 0x3f, /*  8 bit       Test Register 1 Supervisor SM */
+       Q_T2    = 0x40, /* 32 bit       Test Register 2 */
+       Q_T3    = 0x44, /* 32 bit       Test Register 3 */
+
+/* Yukon-2 */
+       Q_DONE  = 0x24, /* 16 bit       Done Index              (Yukon-2 only) */
+       Q_WM    = 0x40, /* 16 bit       FIFO Watermark */
+       Q_AL    = 0x42, /*  8 bit       FIFO Alignment */
+       Q_RSP   = 0x44, /* 16 bit       FIFO Read Shadow Pointer */
+       Q_RSL   = 0x46, /*  8 bit       FIFO Read Shadow Level */
+       Q_RP    = 0x48, /*  8 bit       FIFO Read Pointer */
+       Q_RL    = 0x4a, /*  8 bit       FIFO Read Level */
+       Q_WP    = 0x4c, /*  8 bit       FIFO Write Pointer */
+       Q_WSP   = 0x4d, /*  8 bit       FIFO Write Shadow Pointer */
+       Q_WL    = 0x4e, /*  8 bit       FIFO Write Level */
+       Q_WSL   = 0x4f, /*  8 bit       FIFO Write Shadow Level */
+};
+#define Q_ADDR(reg, offs) (B8_Q_REGS + (reg) + (offs))
+
+/* RAM Buffer Register Offsets */
+enum {
+
+       RB_START        = 0x00,/* 32 bit        RAM Buffer Start Address */
+       RB_END  = 0x04,/* 32 bit        RAM Buffer End Address */
+       RB_WP   = 0x08,/* 32 bit        RAM Buffer Write Pointer */
+       RB_RP   = 0x0c,/* 32 bit        RAM Buffer Read Pointer */
+       RB_RX_UTPP      = 0x10,/* 32 bit        Rx Upper Threshold, Pause Packet */
+       RB_RX_LTPP      = 0x14,/* 32 bit        Rx Lower Threshold, Pause Packet */
+       RB_RX_UTHP      = 0x18,/* 32 bit        Rx Upper Threshold, High Prio */
+       RB_RX_LTHP      = 0x1c,/* 32 bit        Rx Lower Threshold, High Prio */
+       /* 0x10 - 0x1f: reserved at Tx RAM Buffer Registers */
+       RB_PC   = 0x20,/* 32 bit        RAM Buffer Packet Counter */
+       RB_LEV  = 0x24,/* 32 bit        RAM Buffer Level Register */
+       RB_CTRL = 0x28,/* 32 bit        RAM Buffer Control Register */
+       RB_TST1 = 0x29,/*  8 bit        RAM Buffer Test Register 1 */
+       RB_TST2 = 0x2a,/*  8 bit        RAM Buffer Test Register 2 */
+};
+
+/* Receive and Transmit Queues */
+enum {
+       Q_R1    = 0x0000,       /* Receive Queue 1 */
+       Q_R2    = 0x0080,       /* Receive Queue 2 */
+       Q_XS1   = 0x0200,       /* Synchronous Transmit Queue 1 */
+       Q_XA1   = 0x0280,       /* Asynchronous Transmit Queue 1 */
+       Q_XS2   = 0x0300,       /* Synchronous Transmit Queue 2 */
+       Q_XA2   = 0x0380,       /* Asynchronous Transmit Queue 2 */
+};
+
+/* Different MAC Types */
+enum {
+       SK_MAC_XMAC =   0,      /* Xaqti XMAC II */
+       SK_MAC_GMAC =   1,      /* Marvell GMAC */
+};
+
+/* Different PHY Types */
+enum {
+       SK_PHY_XMAC     = 0,/* integrated in XMAC II */
+       SK_PHY_BCOM     = 1,/* Broadcom BCM5400 */
+       SK_PHY_LONE     = 2,/* Level One LXT1000  [not supported]*/
+       SK_PHY_NAT      = 3,/* National DP83891  [not supported] */
+       SK_PHY_MARV_COPPER= 4,/* Marvell 88E1011S */
+       SK_PHY_MARV_FIBER = 5,/* Marvell 88E1011S working on fiber */
+};
+
+/* PHY addresses (bits 12..8 of PHY address reg) */
+enum {
+       PHY_ADDR_XMAC   = 0<<8,
+       PHY_ADDR_BCOM   = 1<<8,
+       PHY_ADDR_LONE   = 3<<8,
+       PHY_ADDR_NAT    = 0<<8,
+/* GPHY address (bits 15..11 of SMI control reg) */
+       PHY_ADDR_MARV   = 0,
+};
+
+#define RB_ADDR(offs, queue) (B16_RAM_REGS + (queue) + (offs))
+
+/* Receive MAC FIFO, Receive LED, and Link_Sync regs (GENESIS only) */
+enum {
+       RX_MFF_EA       = 0x0c00,/* 32 bit      Receive MAC FIFO End Address */
+       RX_MFF_WP       = 0x0c04,/* 32 bit      Receive MAC FIFO Write Pointer */
+
+       RX_MFF_RP       = 0x0c0c,/* 32 bit      Receive MAC FIFO Read Pointer */
+       RX_MFF_PC       = 0x0c10,/* 32 bit      Receive MAC FIFO Packet Cnt */
+       RX_MFF_LEV      = 0x0c14,/* 32 bit      Receive MAC FIFO Level */
+       RX_MFF_CTRL1    = 0x0c18,/* 16 bit      Receive MAC FIFO Control Reg 1*/
+       RX_MFF_STAT_TO  = 0x0c1a,/*  8 bit      Receive MAC Status Timeout */
+       RX_MFF_TIST_TO  = 0x0c1b,/*  8 bit      Receive MAC Time Stamp Timeout */
+       RX_MFF_CTRL2    = 0x0c1c,/*  8 bit      Receive MAC FIFO Control Reg 2*/
+       RX_MFF_TST1     = 0x0c1d,/*  8 bit      Receive MAC FIFO Test Reg 1 */
+       RX_MFF_TST2     = 0x0c1e,/*  8 bit      Receive MAC FIFO Test Reg 2 */
+
+       RX_LED_INI      = 0x0c20,/* 32 bit      Receive LED Cnt Init Value */
+       RX_LED_VAL      = 0x0c24,/* 32 bit      Receive LED Cnt Current Value */
+       RX_LED_CTRL     = 0x0c28,/*  8 bit      Receive LED Cnt Control Reg */
+       RX_LED_TST      = 0x0c29,/*  8 bit      Receive LED Cnt Test Register */
+
+       LNK_SYNC_INI    = 0x0c30,/* 32 bit      Link Sync Cnt Init Value */
+       LNK_SYNC_VAL    = 0x0c34,/* 32 bit      Link Sync Cnt Current Value */
+       LNK_SYNC_CTRL   = 0x0c38,/*  8 bit      Link Sync Cnt Control Register */
+       LNK_SYNC_TST    = 0x0c39,/*  8 bit      Link Sync Cnt Test Register */
+       LNK_LED_REG     = 0x0c3c,/*  8 bit      Link LED Register */
+};
+
+/* Receive and Transmit MAC FIFO Registers (GENESIS only) */
+/*     RX_MFF_CTRL1    16 bit  Receive MAC FIFO Control Reg 1 */
+enum {
+       MFF_ENA_RDY_PAT = 1<<13,        /* Enable  Ready Patch */
+       MFF_DIS_RDY_PAT = 1<<12,        /* Disable Ready Patch */
+       MFF_ENA_TIM_PAT = 1<<11,        /* Enable  Timing Patch */
+       MFF_DIS_TIM_PAT = 1<<10,        /* Disable Timing Patch */
+       MFF_ENA_ALM_FUL = 1<<9, /* Enable  AlmostFull Sign */
+       MFF_DIS_ALM_FUL = 1<<8, /* Disable AlmostFull Sign */
+       MFF_ENA_PAUSE   = 1<<7, /* Enable  Pause Signaling */
+       MFF_DIS_PAUSE   = 1<<6, /* Disable Pause Signaling */
+       MFF_ENA_FLUSH   = 1<<5, /* Enable  Frame Flushing */
+       MFF_DIS_FLUSH   = 1<<4, /* Disable Frame Flushing */
+       MFF_ENA_TIST    = 1<<3, /* Enable  Time Stamp Gener */
+       MFF_DIS_TIST    = 1<<2, /* Disable Time Stamp Gener */
+       MFF_CLR_INTIST  = 1<<1, /* Clear IRQ No Time Stamp */
+       MFF_CLR_INSTAT  = 1<<0, /* Clear IRQ No Status */
+#define MFF_RX_CTRL_DEF MFF_ENA_TIM_PAT
+};
+
+/*     TX_MFF_CTRL1    16 bit  Transmit MAC FIFO Control Reg 1 */
+enum {
+       MFF_CLR_PERR    = 1<<15,        /* Clear Parity Error IRQ */
+                                                               /* Bit 14:      reserved */
+       MFF_ENA_PKT_REC = 1<<13,        /* Enable  Packet Recovery */
+       MFF_DIS_PKT_REC = 1<<12,        /* Disable Packet Recovery */
+
+       MFF_ENA_W4E     = 1<<7, /* Enable  Wait for Empty */
+       MFF_DIS_W4E     = 1<<6, /* Disable Wait for Empty */
+
+       MFF_ENA_LOOPB   = 1<<3, /* Enable  Loopback */
+       MFF_DIS_LOOPB   = 1<<2, /* Disable Loopback */
+       MFF_CLR_MAC_RST = 1<<1, /* Clear XMAC Reset */
+       MFF_SET_MAC_RST = 1<<0, /* Set   XMAC Reset */
+};
+
+#define MFF_TX_CTRL_DEF        (MFF_ENA_PKT_REC | MFF_ENA_TIM_PAT | MFF_ENA_FLUSH)
+
+/*     RX_MFF_TST2              8 bit  Receive MAC FIFO Test Register 2 */
+/*     TX_MFF_TST2              8 bit  Transmit MAC FIFO Test Register 2 */
+enum {
+       MFF_WSP_T_ON    = 1<<6, /* Tx: Write Shadow Ptr TestOn */
+       MFF_WSP_T_OFF   = 1<<5, /* Tx: Write Shadow Ptr TstOff */
+       MFF_WSP_INC     = 1<<4, /* Tx: Write Shadow Ptr Increment */
+       MFF_PC_DEC      = 1<<3, /* Packet Counter Decrement */
+       MFF_PC_T_ON     = 1<<2, /* Packet Counter Test On */
+       MFF_PC_T_OFF    = 1<<1, /* Packet Counter Test Off */
+       MFF_PC_INC      = 1<<0, /* Packet Counter Increment */
+};
+
+/*     RX_MFF_TST1              8 bit  Receive MAC FIFO Test Register 1 */
+/*     TX_MFF_TST1              8 bit  Transmit MAC FIFO Test Register 1 */
+enum {
+       MFF_WP_T_ON     = 1<<6, /* Write Pointer Test On */
+       MFF_WP_T_OFF    = 1<<5, /* Write Pointer Test Off */
+       MFF_WP_INC      = 1<<4, /* Write Pointer Increm */
+
+       MFF_RP_T_ON     = 1<<2, /* Read Pointer Test On */
+       MFF_RP_T_OFF    = 1<<1, /* Read Pointer Test Off */
+       MFF_RP_DEC      = 1<<0, /* Read Pointer Decrement */
+};
+
+/*     RX_MFF_CTRL2     8 bit  Receive MAC FIFO Control Reg 2 */
+/*     TX_MFF_CTRL2     8 bit  Transmit MAC FIFO Control Reg 2 */
+enum {
+       MFF_ENA_OP_MD   = 1<<3, /* Enable  Operation Mode */
+       MFF_DIS_OP_MD   = 1<<2, /* Disable Operation Mode */
+       MFF_RST_CLR     = 1<<1, /* Clear MAC FIFO Reset */
+       MFF_RST_SET     = 1<<0, /* Set   MAC FIFO Reset */
+};
+
+
+/*     Link LED Counter Registers (GENESIS only) */
+
+/*     RX_LED_CTRL              8 bit  Receive LED Cnt Control Reg */
+/*     TX_LED_CTRL              8 bit  Transmit LED Cnt Control Reg */
+/*     LNK_SYNC_CTRL    8 bit  Link Sync Cnt Control Register */
+enum {
+       LED_START       = 1<<2, /* Start Timer */
+       LED_STOP        = 1<<1, /* Stop Timer */
+       LED_STATE       = 1<<0, /* Rx/Tx: LED State, 1=LED on */
+};
+
+/*     RX_LED_TST               8 bit  Receive LED Cnt Test Register */
+/*     TX_LED_TST               8 bit  Transmit LED Cnt Test Register */
+/*     LNK_SYNC_TST     8 bit  Link Sync Cnt Test Register */
+enum {
+       LED_T_ON        = 1<<2, /* LED Counter Test mode On */
+       LED_T_OFF       = 1<<1, /* LED Counter Test mode Off */
+       LED_T_STEP      = 1<<0, /* LED Counter Step */
+};
+
+/*     LNK_LED_REG              8 bit  Link LED Register */
+enum {
+       LED_BLK_ON      = 1<<5, /* Link LED Blinking On */
+       LED_BLK_OFF     = 1<<4, /* Link LED Blinking Off */
+       LED_SYNC_ON     = 1<<3, /* Use Sync Wire to switch LED */
+       LED_SYNC_OFF    = 1<<2, /* Disable Sync Wire Input */
+       LED_ON  = 1<<1, /* switch LED on */
+       LED_OFF = 1<<0, /* switch LED off */
+};
+
+/* Receive GMAC FIFO (YUKON and Yukon-2) */
+enum {
+       RX_GMF_EA       = 0x0c40,/* 32 bit      Rx GMAC FIFO End Address */
+       RX_GMF_AF_THR   = 0x0c44,/* 32 bit      Rx GMAC FIFO Almost Full Thresh. */
+       RX_GMF_CTRL_T   = 0x0c48,/* 32 bit      Rx GMAC FIFO Control/Test */
+       RX_GMF_FL_MSK   = 0x0c4c,/* 32 bit      Rx GMAC FIFO Flush Mask */
+       RX_GMF_FL_THR   = 0x0c50,/* 32 bit      Rx GMAC FIFO Flush Threshold */
+       RX_GMF_TR_THR   = 0x0c54,/* 32 bit      Rx Truncation Threshold (Yukon-2) */
+
+       RX_GMF_VLAN     = 0x0c5c,/* 32 bit      Rx VLAN Type Register (Yukon-2) */
+       RX_GMF_WP       = 0x0c60,/* 32 bit      Rx GMAC FIFO Write Pointer */
+
+       RX_GMF_WLEV     = 0x0c68,/* 32 bit      Rx GMAC FIFO Write Level */
+
+       RX_GMF_RP       = 0x0c70,/* 32 bit      Rx GMAC FIFO Read Pointer */
+
+       RX_GMF_RLEV     = 0x0c78,/* 32 bit      Rx GMAC FIFO Read Level */
+};
+
+
+/*     TXA_TEST                 8 bit  Tx Arbiter Test Register */
+enum {
+       TXA_INT_T_ON    = 1<<5, /* Tx Arb Interval Timer Test On */
+       TXA_INT_T_OFF   = 1<<4, /* Tx Arb Interval Timer Test Off */
+       TXA_INT_T_STEP  = 1<<3, /* Tx Arb Interval Timer Step */
+       TXA_LIM_T_ON    = 1<<2, /* Tx Arb Limit Timer Test On */
+       TXA_LIM_T_OFF   = 1<<1, /* Tx Arb Limit Timer Test Off */
+       TXA_LIM_T_STEP  = 1<<0, /* Tx Arb Limit Timer Step */
+};
+
+/*     TXA_STAT                 8 bit  Tx Arbiter Status Register */
+enum {
+       TXA_PRIO_XS     = 1<<0, /* sync queue has prio to send */
+};
+
+
+/*     Q_BC                    32 bit  Current Byte Counter */
+
+/* BMU Control Status Registers */
+/*     B0_R1_CSR               32 bit  BMU Ctrl/Stat Rx Queue 1 */
+/*     B0_R2_CSR               32 bit  BMU Ctrl/Stat Rx Queue 2 */
+/*     B0_XA1_CSR              32 bit  BMU Ctrl/Stat Sync Tx Queue 1 */
+/*     B0_XS1_CSR              32 bit  BMU Ctrl/Stat Async Tx Queue 1 */
+/*     B0_XA2_CSR              32 bit  BMU Ctrl/Stat Sync Tx Queue 2 */
+/*     B0_XS2_CSR              32 bit  BMU Ctrl/Stat Async Tx Queue 2 */
+/*     Q_CSR                   32 bit  BMU Control/Status Register */
+
+enum {
+       CSR_SV_IDLE     = 1<<24,        /* BMU SM Idle */
+
+       CSR_DESC_CLR    = 1<<21,        /* Clear Reset for Descr */
+       CSR_DESC_SET    = 1<<20,        /* Set   Reset for Descr */
+       CSR_FIFO_CLR    = 1<<19,        /* Clear Reset for FIFO */
+       CSR_FIFO_SET    = 1<<18,        /* Set   Reset for FIFO */
+       CSR_HPI_RUN     = 1<<17,        /* Release HPI SM */
+       CSR_HPI_RST     = 1<<16,        /* Reset   HPI SM to Idle */
+       CSR_SV_RUN      = 1<<15,        /* Release Supervisor SM */
+       CSR_SV_RST      = 1<<14,        /* Reset   Supervisor SM */
+       CSR_DREAD_RUN   = 1<<13,        /* Release Descr Read SM */
+       CSR_DREAD_RST   = 1<<12,        /* Reset   Descr Read SM */
+       CSR_DWRITE_RUN  = 1<<11,        /* Release Descr Write SM */
+       CSR_DWRITE_RST  = 1<<10,        /* Reset   Descr Write SM */
+       CSR_TRANS_RUN   = 1<<9,         /* Release Transfer SM */
+       CSR_TRANS_RST   = 1<<8,         /* Reset   Transfer SM */
+       CSR_ENA_POL     = 1<<7,         /* Enable  Descr Polling */
+       CSR_DIS_POL     = 1<<6,         /* Disable Descr Polling */
+       CSR_STOP        = 1<<5,         /* Stop  Rx/Tx Queue */
+       CSR_START       = 1<<4,         /* Start Rx/Tx Queue */
+       CSR_IRQ_CL_P    = 1<<3,         /* (Rx) Clear Parity IRQ */
+       CSR_IRQ_CL_B    = 1<<2,         /* Clear EOB IRQ */
+       CSR_IRQ_CL_F    = 1<<1,         /* Clear EOF IRQ */
+       CSR_IRQ_CL_C    = 1<<0,         /* Clear ERR IRQ */
+};
+
+#define CSR_SET_RESET  (CSR_DESC_SET | CSR_FIFO_SET | CSR_HPI_RST |\
+                       CSR_SV_RST | CSR_DREAD_RST | CSR_DWRITE_RST |\
+                       CSR_TRANS_RST)
+#define CSR_CLR_RESET  (CSR_DESC_CLR | CSR_FIFO_CLR | CSR_HPI_RUN |\
+                       CSR_SV_RUN | CSR_DREAD_RUN | CSR_DWRITE_RUN |\
+                       CSR_TRANS_RUN)
+
+/*     Q_F                             32 bit  Flag Register */
+enum {
+       F_ALM_FULL      = 1<<27,        /* Rx FIFO: almost full */
+       F_EMPTY         = 1<<27,        /* Tx FIFO: empty flag */
+       F_FIFO_EOF      = 1<<26,        /* Tag (EOF Flag) bit in FIFO */
+       F_WM_REACHED    = 1<<25,        /* Watermark reached */
+
+       F_FIFO_LEVEL    = 0x1fL<<16,    /* Bit 23..16:  # of Qwords in FIFO */
+       F_WATER_MARK    = 0x0007ffL,    /* Bit 10.. 0:  Watermark */
+};
+
+/* RAM Buffer Register Offsets, use RB_ADDR(Queue, Offs) to access */
+/*     RB_START                32 bit  RAM Buffer Start Address */
+/*     RB_END                  32 bit  RAM Buffer End Address */
+/*     RB_WP                   32 bit  RAM Buffer Write Pointer */
+/*     RB_RP                   32 bit  RAM Buffer Read Pointer */
+/*     RB_RX_UTPP              32 bit  Rx Upper Threshold, Pause Pack */
+/*     RB_RX_LTPP              32 bit  Rx Lower Threshold, Pause Pack */
+/*     RB_RX_UTHP              32 bit  Rx Upper Threshold, High Prio */
+/*     RB_RX_LTHP              32 bit  Rx Lower Threshold, High Prio */
+/*     RB_PC                   32 bit  RAM Buffer Packet Counter */
+/*     RB_LEV                  32 bit  RAM Buffer Level Register */
+
+#define RB_MSK 0x0007ffff      /* Bit 18.. 0:  RAM Buffer Pointer Bits */
+/*     RB_TST2                  8 bit  RAM Buffer Test Register 2 */
+/*     RB_TST1                  8 bit  RAM Buffer Test Register 1 */
+
+/*     RB_CTRL                  8 bit  RAM Buffer Control Register */
+enum {
+       RB_ENA_STFWD    = 1<<5, /* Enable  Store & Forward */
+       RB_DIS_STFWD    = 1<<4, /* Disable Store & Forward */
+       RB_ENA_OP_MD    = 1<<3, /* Enable  Operation Mode */
+       RB_DIS_OP_MD    = 1<<2, /* Disable Operation Mode */
+       RB_RST_CLR      = 1<<1, /* Clear RAM Buf STM Reset */
+       RB_RST_SET      = 1<<0, /* Set   RAM Buf STM Reset */
+};
+
+/* Transmit MAC FIFO and Transmit LED Registers (GENESIS only), */
+enum {
+       TX_MFF_EA       = 0x0d00,/* 32 bit      Transmit MAC FIFO End Address */
+       TX_MFF_WP       = 0x0d04,/* 32 bit      Transmit MAC FIFO WR Pointer */
+       TX_MFF_WSP      = 0x0d08,/* 32 bit      Transmit MAC FIFO WR Shadow Ptr */
+       TX_MFF_RP       = 0x0d0c,/* 32 bit      Transmit MAC FIFO RD Pointer */
+       TX_MFF_PC       = 0x0d10,/* 32 bit      Transmit MAC FIFO Packet Cnt */
+       TX_MFF_LEV      = 0x0d14,/* 32 bit      Transmit MAC FIFO Level */
+       TX_MFF_CTRL1    = 0x0d18,/* 16 bit      Transmit MAC FIFO Ctrl Reg 1 */
+       TX_MFF_WAF      = 0x0d1a,/*  8 bit      Transmit MAC Wait after flush */
+
+       TX_MFF_CTRL2    = 0x0d1c,/*  8 bit      Transmit MAC FIFO Ctrl Reg 2 */
+       TX_MFF_TST1     = 0x0d1d,/*  8 bit      Transmit MAC FIFO Test Reg 1 */
+       TX_MFF_TST2     = 0x0d1e,/*  8 bit      Transmit MAC FIFO Test Reg 2 */
+
+       TX_LED_INI      = 0x0d20,/* 32 bit      Transmit LED Cnt Init Value */
+       TX_LED_VAL      = 0x0d24,/* 32 bit      Transmit LED Cnt Current Val */
+       TX_LED_CTRL     = 0x0d28,/*  8 bit      Transmit LED Cnt Control Reg */
+       TX_LED_TST      = 0x0d29,/*  8 bit      Transmit LED Cnt Test Reg */
+};
+
+/* Counter and Timer constants, for a host clock of 62.5 MHz */
+#define SK_XMIT_DUR            0x002faf08UL    /*  50 ms */
+#define SK_BLK_DUR             0x01dcd650UL    /* 500 ms */
+
+#define SK_DPOLL_DEF   0x00ee6b28UL    /* 250 ms at 62.5 MHz */
+
+#define SK_DPOLL_MAX   0x00ffffffUL    /* 268 ms at 62.5 MHz */
+                                       /* 215 ms at 78.12 MHz */
+
+#define SK_FACT_62             100     /* is given in percent */
+#define SK_FACT_53              85     /* on GENESIS:  53.12 MHz */
+#define SK_FACT_78             125     /* on YUKON:    78.12 MHz */
+
+
+/* Transmit GMAC FIFO (YUKON only) */
+enum {
+       TX_GMF_EA       = 0x0d40,/* 32 bit      Tx GMAC FIFO End Address */
+       TX_GMF_AE_THR   = 0x0d44,/* 32 bit      Tx GMAC FIFO Almost Empty Thresh.*/
+       TX_GMF_CTRL_T   = 0x0d48,/* 32 bit      Tx GMAC FIFO Control/Test */
+
+       TX_GMF_WP       = 0x0d60,/* 32 bit      Tx GMAC FIFO Write Pointer */
+       TX_GMF_WSP      = 0x0d64,/* 32 bit      Tx GMAC FIFO Write Shadow Ptr. */
+       TX_GMF_WLEV     = 0x0d68,/* 32 bit      Tx GMAC FIFO Write Level */
+
+       TX_GMF_RP       = 0x0d70,/* 32 bit      Tx GMAC FIFO Read Pointer */
+       TX_GMF_RSTP     = 0x0d74,/* 32 bit      Tx GMAC FIFO Restart Pointer */
+       TX_GMF_RLEV     = 0x0d78,/* 32 bit      Tx GMAC FIFO Read Level */
+
+       /* Descriptor Poll Timer Registers */
+       B28_DPT_INI     = 0x0e00,/* 24 bit      Descriptor Poll Timer Init Val */
+       B28_DPT_VAL     = 0x0e04,/* 24 bit      Descriptor Poll Timer Curr Val */
+       B28_DPT_CTRL    = 0x0e08,/*  8 bit      Descriptor Poll Timer Ctrl Reg */
+
+       B28_DPT_TST     = 0x0e0a,/*  8 bit      Descriptor Poll Timer Test Reg */
+
+       /* Time Stamp Timer Registers (YUKON only) */
+       GMAC_TI_ST_VAL  = 0x0e14,/* 32 bit      Time Stamp Timer Curr Val */
+       GMAC_TI_ST_CTRL = 0x0e18,/*  8 bit      Time Stamp Timer Ctrl Reg */
+       GMAC_TI_ST_TST  = 0x0e1a,/*  8 bit      Time Stamp Timer Test Reg */
+};
+
+/* Status BMU Registers (Yukon-2 only)*/
+enum {
+       STAT_CTRL       = 0x0e80,/* 32 bit      Status BMU Control Reg */
+       STAT_LAST_IDX   = 0x0e84,/* 16 bit      Status BMU Last Index */
+       /* 0x0e85 - 0x0e86:     reserved */
+       STAT_LIST_ADDR_LO       = 0x0e88,/* 32 bit      Status List Start Addr (low) */
+       STAT_LIST_ADDR_HI       = 0x0e8c,/* 32 bit      Status List Start Addr (high) */
+       STAT_TXA1_RIDX  = 0x0e90,/* 16 bit      Status TxA1 Report Index Reg */
+       STAT_TXS1_RIDX  = 0x0e92,/* 16 bit      Status TxS1 Report Index Reg */
+       STAT_TXA2_RIDX  = 0x0e94,/* 16 bit      Status TxA2 Report Index Reg */
+       STAT_TXS2_RIDX  = 0x0e96,/* 16 bit      Status TxS2 Report Index Reg */
+       STAT_TX_IDX_TH  = 0x0e98,/* 16 bit      Status Tx Index Threshold Reg */
+       STAT_PUT_IDX    = 0x0e9c,/* 16 bit      Status Put Index Reg */
+
+/* FIFO Control/Status Registers (Yukon-2 only)*/
+       STAT_FIFO_WP    = 0x0ea0,/*  8 bit      Status FIFO Write Pointer Reg */
+       STAT_FIFO_RP    = 0x0ea4,/*  8 bit      Status FIFO Read Pointer Reg */
+       STAT_FIFO_RSP   = 0x0ea6,/*  8 bit      Status FIFO Read Shadow Ptr */
+       STAT_FIFO_LEVEL = 0x0ea8,/*  8 bit      Status FIFO Level Reg */
+       STAT_FIFO_SHLVL = 0x0eaa,/*  8 bit      Status FIFO Shadow Level Reg */
+       STAT_FIFO_WM    = 0x0eac,/*  8 bit      Status FIFO Watermark Reg */
+       STAT_FIFO_ISR_WM        = 0x0ead,/*  8 bit      Status FIFO ISR Watermark Reg */
+
+/* Level and ISR Timer Registers (Yukon-2 only)*/
+       STAT_LEV_TIMER_INI      = 0x0eb0,/* 32 bit      Level Timer Init. Value Reg */
+       STAT_LEV_TIMER_CNT      = 0x0eb4,/* 32 bit      Level Timer Counter Reg */
+       STAT_LEV_TIMER_CTRL     = 0x0eb8,/*  8 bit      Level Timer Control Reg */
+       STAT_LEV_TIMER_TEST     = 0x0eb9,/*  8 bit      Level Timer Test Reg */
+       STAT_TX_TIMER_INI       = 0x0ec0,/* 32 bit      Tx Timer Init. Value Reg */
+       STAT_TX_TIMER_CNT       = 0x0ec4,/* 32 bit      Tx Timer Counter Reg */
+       STAT_TX_TIMER_CTRL      = 0x0ec8,/*  8 bit      Tx Timer Control Reg */
+       STAT_TX_TIMER_TEST      = 0x0ec9,/*  8 bit      Tx Timer Test Reg */
+       STAT_ISR_TIMER_INI      = 0x0ed0,/* 32 bit      ISR Timer Init. Value Reg */
+       STAT_ISR_TIMER_CNT      = 0x0ed4,/* 32 bit      ISR Timer Counter Reg */
+       STAT_ISR_TIMER_CTRL     = 0x0ed8,/*  8 bit      ISR Timer Control Reg */
+       STAT_ISR_TIMER_TEST     = 0x0ed9,/*  8 bit      ISR Timer Test Reg */
+
+       ST_LAST_IDX_MASK        = 0x007f,/* Last Index Mask */
+       ST_TXRP_IDX_MASK        = 0x0fff,/* Tx Report Index Mask */
+       ST_TXTH_IDX_MASK        = 0x0fff,/* Tx Threshold Index Mask */
+       ST_WM_IDX_MASK  = 0x3f,/* FIFO Watermark Index Mask */
+};
+
+enum {
+       LINKLED_OFF          = 0x01,
+       LINKLED_ON           = 0x02,
+       LINKLED_LINKSYNC_OFF = 0x04,
+       LINKLED_LINKSYNC_ON  = 0x08,
+       LINKLED_BLINK_OFF    = 0x10,
+       LINKLED_BLINK_ON     = 0x20,
+};
+       
+/* GMAC and GPHY Control Registers (YUKON only) */
+enum {
+       GMAC_CTRL       = 0x0f00,/* 32 bit      GMAC Control Reg */
+       GPHY_CTRL       = 0x0f04,/* 32 bit      GPHY Control Reg */
+       GMAC_IRQ_SRC    = 0x0f08,/*  8 bit      GMAC Interrupt Source Reg */
+       GMAC_IRQ_MSK    = 0x0f0c,/*  8 bit      GMAC Interrupt Mask Reg */
+       GMAC_LINK_CTRL  = 0x0f10,/* 16 bit      Link Control Reg */
+
+/* Wake-up Frame Pattern Match Control Registers (YUKON only) */
+
+       WOL_REG_OFFS    = 0x20,/* HW-Bug: Address is + 0x20 against spec. */
+
+       WOL_CTRL_STAT   = 0x0f20,/* 16 bit      WOL Control/Status Reg */
+       WOL_MATCH_CTL   = 0x0f22,/*  8 bit      WOL Match Control Reg */
+       WOL_MATCH_RES   = 0x0f23,/*  8 bit      WOL Match Result Reg */
+       WOL_MAC_ADDR    = 0x0f24,/* 32 bit      WOL MAC Address */
+       WOL_PATT_PME    = 0x0f2a,/*  8 bit      WOL PME Match Enable (Yukon-2) */
+       WOL_PATT_ASFM   = 0x0f2b,/*  8 bit      WOL ASF Match Enable (Yukon-2) */
+       WOL_PATT_RPTR   = 0x0f2c,/*  8 bit      WOL Pattern Read Pointer */
+
+/* WOL Pattern Length Registers (YUKON only) */
+
+       WOL_PATT_LEN_LO = 0x0f30,/* 32 bit      WOL Pattern Length 3..0 */
+       WOL_PATT_LEN_HI = 0x0f34,/* 24 bit      WOL Pattern Length 6..4 */
+
+/* WOL Pattern Counter Registers (YUKON only) */
+
+       WOL_PATT_CNT_0  = 0x0f38,/* 32 bit      WOL Pattern Counter 3..0 */
+       WOL_PATT_CNT_4  = 0x0f3c,/* 24 bit      WOL Pattern Counter 6..4 */
+};
+
+enum {
+       WOL_PATT_RAM_1  = 0x1000,/*  WOL Pattern RAM Link 1 */
+       WOL_PATT_RAM_2  = 0x1400,/*  WOL Pattern RAM Link 2 */
+};
+
+enum {
+       BASE_XMAC_1     = 0x2000,/* XMAC 1 registers */
+       BASE_GMAC_1     = 0x2800,/* GMAC 1 registers */
+       BASE_XMAC_2     = 0x3000,/* XMAC 2 registers */
+       BASE_GMAC_2     = 0x3800,/* GMAC 2 registers */
+};
+
+/*
+ * Receive Frame Status Encoding
+ */
+enum {
+       XMR_FS_LEN      = 0x3fff<<18,   /* Bit 31..18:  Rx Frame Length */
+       XMR_FS_2L_VLAN  = 1<<17, /* Bit 17:     tagged wh 2Lev VLAN ID*/
+       XMR_FS_1_VLAN   = 1<<16, /* Bit 16:     tagged wh 1ev VLAN ID*/
+       XMR_FS_BC       = 1<<15, /* Bit 15:     Broadcast Frame */
+       XMR_FS_MC       = 1<<14, /* Bit 14:     Multicast Frame */
+       XMR_FS_UC       = 1<<13, /* Bit 13:     Unicast Frame */
+
+       XMR_FS_BURST    = 1<<11, /* Bit 11:     Burst Mode */
+       XMR_FS_CEX_ERR  = 1<<10, /* Bit 10:     Carrier Ext. Error */
+       XMR_FS_802_3    = 1<<9, /* Bit  9:      802.3 Frame */
+       XMR_FS_COL_ERR  = 1<<8, /* Bit  8:      Collision Error */
+       XMR_FS_CAR_ERR  = 1<<7, /* Bit  7:      Carrier Event Error */
+       XMR_FS_LEN_ERR  = 1<<6, /* Bit  6:      In-Range Length Error */
+       XMR_FS_FRA_ERR  = 1<<5, /* Bit  5:      Framing Error */
+       XMR_FS_RUNT     = 1<<4, /* Bit  4:      Runt Frame */
+       XMR_FS_LNG_ERR  = 1<<3, /* Bit  3:      Giant (Jumbo) Frame */
+       XMR_FS_FCS_ERR  = 1<<2, /* Bit  2:      Frame Check Sequ Err */
+       XMR_FS_ERR      = 1<<1, /* Bit  1:      Frame Error */
+       XMR_FS_MCTRL    = 1<<0, /* Bit  0:      MAC Control Packet */
+
+/*
+ * XMR_FS_ERR will be set if
+ *     XMR_FS_FCS_ERR, XMR_FS_LNG_ERR, XMR_FS_RUNT,
+ *     XMR_FS_FRA_ERR, XMR_FS_LEN_ERR, or XMR_FS_CEX_ERR
+ * is set. XMR_FS_LNG_ERR and XMR_FS_LEN_ERR will issue
+ * XMR_FS_ERR unless the corresponding bit in the Receive Command
+ * Register is set.
+ */
+};
+
+/*
+,* XMAC-PHY Registers, indirect addressed over the XMAC
+ */
+enum {
+       PHY_XMAC_CTRL           = 0x00,/* 16 bit r/w    PHY Control Register */
+       PHY_XMAC_STAT           = 0x01,/* 16 bit r/w    PHY Status Register */
+       PHY_XMAC_ID0            = 0x02,/* 16 bit r/o    PHY ID0 Register */
+       PHY_XMAC_ID1            = 0x03,/* 16 bit r/o    PHY ID1 Register */
+       PHY_XMAC_AUNE_ADV       = 0x04,/* 16 bit r/w    Auto-Neg. Advertisement */
+       PHY_XMAC_AUNE_LP        = 0x05,/* 16 bit r/o    Link Partner Abi Reg */
+       PHY_XMAC_AUNE_EXP       = 0x06,/* 16 bit r/o    Auto-Neg. Expansion Reg */
+       PHY_XMAC_NEPG   = 0x07,/* 16 bit r/w    Next Page Register */
+       PHY_XMAC_NEPG_LP        = 0x08,/* 16 bit r/o    Next Page Link Partner */
+
+       PHY_XMAC_EXT_STAT       = 0x0f,/* 16 bit r/o    Ext Status Register */
+       PHY_XMAC_RES_ABI        = 0x10,/* 16 bit r/o    PHY Resolved Ability */
+};
+/*
+ * Broadcom-PHY Registers, indirect addressed over XMAC
+ */
+enum {
+       PHY_BCOM_CTRL           = 0x00,/* 16 bit r/w    PHY Control Register */
+       PHY_BCOM_STAT           = 0x01,/* 16 bit r/o    PHY Status Register */
+       PHY_BCOM_ID0            = 0x02,/* 16 bit r/o    PHY ID0 Register */
+       PHY_BCOM_ID1            = 0x03,/* 16 bit r/o    PHY ID1 Register */
+       PHY_BCOM_AUNE_ADV       = 0x04,/* 16 bit r/w    Auto-Neg. Advertisement */
+       PHY_BCOM_AUNE_LP        = 0x05,/* 16 bit r/o    Link Part Ability Reg */
+       PHY_BCOM_AUNE_EXP       = 0x06,/* 16 bit r/o    Auto-Neg. Expansion Reg */
+       PHY_BCOM_NEPG           = 0x07,/* 16 bit r/w    Next Page Register */
+       PHY_BCOM_NEPG_LP        = 0x08,/* 16 bit r/o    Next Page Link Partner */
+       /* Broadcom-specific registers */
+       PHY_BCOM_1000T_CTRL     = 0x09,/* 16 bit r/w    1000Base-T Control Reg */
+       PHY_BCOM_1000T_STAT     = 0x0a,/* 16 bit r/o    1000Base-T Status Reg */
+       PHY_BCOM_EXT_STAT       = 0x0f,/* 16 bit r/o    Extended Status Reg */
+       PHY_BCOM_P_EXT_CTRL     = 0x10,/* 16 bit r/w    PHY Extended Ctrl Reg */
+       PHY_BCOM_P_EXT_STAT     = 0x11,/* 16 bit r/o    PHY Extended Stat Reg */
+       PHY_BCOM_RE_CTR         = 0x12,/* 16 bit r/w    Receive Error Counter */
+       PHY_BCOM_FC_CTR         = 0x13,/* 16 bit r/w    False Carrier Sense Cnt */
+       PHY_BCOM_RNO_CTR        = 0x14,/* 16 bit r/w    Receiver NOT_OK Cnt */
+
+       PHY_BCOM_AUX_CTRL       = 0x18,/* 16 bit r/w    Auxiliary Control Reg */
+       PHY_BCOM_AUX_STAT       = 0x19,/* 16 bit r/o    Auxiliary Stat Summary */
+       PHY_BCOM_INT_STAT       = 0x1a,/* 16 bit r/o    Interrupt Status Reg */
+       PHY_BCOM_INT_MASK       = 0x1b,/* 16 bit r/w    Interrupt Mask Reg */
+};
+
+/*
+ * Marvel-PHY Registers, indirect addressed over GMAC
+ */
+enum {
+       PHY_MARV_CTRL           = 0x00,/* 16 bit r/w    PHY Control Register */
+       PHY_MARV_STAT           = 0x01,/* 16 bit r/o    PHY Status Register */
+       PHY_MARV_ID0            = 0x02,/* 16 bit r/o    PHY ID0 Register */
+       PHY_MARV_ID1            = 0x03,/* 16 bit r/o    PHY ID1 Register */
+       PHY_MARV_AUNE_ADV       = 0x04,/* 16 bit r/w    Auto-Neg. Advertisement */
+       PHY_MARV_AUNE_LP        = 0x05,/* 16 bit r/o    Link Part Ability Reg */
+       PHY_MARV_AUNE_EXP       = 0x06,/* 16 bit r/o    Auto-Neg. Expansion Reg */
+       PHY_MARV_NEPG           = 0x07,/* 16 bit r/w    Next Page Register */
+       PHY_MARV_NEPG_LP        = 0x08,/* 16 bit r/o    Next Page Link Partner */
+       /* Marvel-specific registers */
+       PHY_MARV_1000T_CTRL     = 0x09,/* 16 bit r/w    1000Base-T Control Reg */
+       PHY_MARV_1000T_STAT     = 0x0a,/* 16 bit r/o    1000Base-T Status Reg */
+       PHY_MARV_EXT_STAT       = 0x0f,/* 16 bit r/o    Extended Status Reg */
+       PHY_MARV_PHY_CTRL       = 0x10,/* 16 bit r/w    PHY Specific Ctrl Reg */
+       PHY_MARV_PHY_STAT       = 0x11,/* 16 bit r/o    PHY Specific Stat Reg */
+       PHY_MARV_INT_MASK       = 0x12,/* 16 bit r/w    Interrupt Mask Reg */
+       PHY_MARV_INT_STAT       = 0x13,/* 16 bit r/o    Interrupt Status Reg */
+       PHY_MARV_EXT_CTRL       = 0x14,/* 16 bit r/w    Ext. PHY Specific Ctrl */
+       PHY_MARV_RXE_CNT        = 0x15,/* 16 bit r/w    Receive Error Counter */
+       PHY_MARV_EXT_ADR        = 0x16,/* 16 bit r/w    Ext. Ad. for Cable Diag. */
+       PHY_MARV_PORT_IRQ       = 0x17,/* 16 bit r/o    Port 0 IRQ (88E1111 only) */
+       PHY_MARV_LED_CTRL       = 0x18,/* 16 bit r/w    LED Control Reg */
+       PHY_MARV_LED_OVER       = 0x19,/* 16 bit r/w    Manual LED Override Reg */
+       PHY_MARV_EXT_CTRL_2     = 0x1a,/* 16 bit r/w    Ext. PHY Specific Ctrl 2 */
+       PHY_MARV_EXT_P_STAT     = 0x1b,/* 16 bit r/w    Ext. PHY Spec. Stat Reg */
+       PHY_MARV_CABLE_DIAG     = 0x1c,/* 16 bit r/o    Cable Diagnostic Reg */
+       PHY_MARV_PAGE_ADDR      = 0x1d,/* 16 bit r/w    Extended Page Address Reg */
+       PHY_MARV_PAGE_DATA      = 0x1e,/* 16 bit r/w    Extended Page Data Reg */
+
+/* for 10/100 Fast Ethernet PHY (88E3082 only) */
+       PHY_MARV_FE_LED_PAR     = 0x16,/* 16 bit r/w    LED Parallel Select Reg. */
+       PHY_MARV_FE_LED_SER     = 0x17,/* 16 bit r/w    LED Stream Select S. LED */
+       PHY_MARV_FE_VCT_TX      = 0x1a,/* 16 bit r/w    VCT Reg. for TXP/N Pins */
+       PHY_MARV_FE_VCT_RX      = 0x1b,/* 16 bit r/o    VCT Reg. for RXP/N Pins */
+       PHY_MARV_FE_SPEC_2      = 0x1c,/* 16 bit r/w    Specific Control Reg. 2 */
+};
+
+/* Level One-PHY Registers, indirect addressed over XMAC */
+enum {
+       PHY_LONE_CTRL           = 0x00,/* 16 bit r/w    PHY Control Register */
+       PHY_LONE_STAT           = 0x01,/* 16 bit r/o    PHY Status Register */
+       PHY_LONE_ID0            = 0x02,/* 16 bit r/o    PHY ID0 Register */
+       PHY_LONE_ID1            = 0x03,/* 16 bit r/o    PHY ID1 Register */
+       PHY_LONE_AUNE_ADV       = 0x04,/* 16 bit r/w    Auto-Neg. Advertisement */
+       PHY_LONE_AUNE_LP        = 0x05,/* 16 bit r/o    Link Part Ability Reg */
+       PHY_LONE_AUNE_EXP       = 0x06,/* 16 bit r/o    Auto-Neg. Expansion Reg */
+       PHY_LONE_NEPG           = 0x07,/* 16 bit r/w    Next Page Register */
+       PHY_LONE_NEPG_LP        = 0x08,/* 16 bit r/o    Next Page Link Partner */
+       /* Level One-specific registers */
+       PHY_LONE_1000T_CTRL     = 0x09,/* 16 bit r/w    1000Base-T Control Reg */
+       PHY_LONE_1000T_STAT     = 0x0a,/* 16 bit r/o    1000Base-T Status Reg */
+       PHY_LONE_EXT_STAT       = 0x0f,/* 16 bit r/o    Extended Status Reg */
+       PHY_LONE_PORT_CFG       = 0x10,/* 16 bit r/w    Port Configuration Reg*/
+       PHY_LONE_Q_STAT         = 0x11,/* 16 bit r/o    Quick Status Reg */
+       PHY_LONE_INT_ENAB       = 0x12,/* 16 bit r/w    Interrupt Enable Reg */
+       PHY_LONE_INT_STAT       = 0x13,/* 16 bit r/o    Interrupt Status Reg */
+       PHY_LONE_LED_CFG        = 0x14,/* 16 bit r/w    LED Configuration Reg */
+       PHY_LONE_PORT_CTRL      = 0x15,/* 16 bit r/w    Port Control Reg */
+       PHY_LONE_CIM            = 0x16,/* 16 bit r/o    CIM Reg */
+};
+
+/* National-PHY Registers, indirect addressed over XMAC */
+enum {
+       PHY_NAT_CTRL            = 0x00,/* 16 bit r/w    PHY Control Register */
+       PHY_NAT_STAT            = 0x01,/* 16 bit r/w    PHY Status Register */
+       PHY_NAT_ID0             = 0x02,/* 16 bit r/o    PHY ID0 Register */
+       PHY_NAT_ID1             = 0x03,/* 16 bit r/o    PHY ID1 Register */
+       PHY_NAT_AUNE_ADV        = 0x04,/* 16 bit r/w    Auto-Neg. Advertisement */
+       PHY_NAT_AUNE_LP         = 0x05,/* 16 bit r/o    Link Partner Ability Reg */
+       PHY_NAT_AUNE_EXP        = 0x06,/* 16 bit r/o    Auto-Neg. Expansion Reg */
+       PHY_NAT_NEPG            = 0x07,/* 16 bit r/w    Next Page Register */
+       PHY_NAT_NEPG_LP         = 0x08,/* 16 bit r/o    Next Page Link Partner Reg */
+       /* National-specific registers */
+       PHY_NAT_1000T_CTRL      = 0x09,/* 16 bit r/w    1000Base-T Control Reg */
+       PHY_NAT_1000T_STAT      = 0x0a,/* 16 bit r/o    1000Base-T Status Reg */
+       PHY_NAT_EXT_STAT        = 0x0f,/* 16 bit r/o    Extended Status Register */
+       PHY_NAT_EXT_CTRL1       = 0x10,/* 16 bit r/o    Extended Control Reg1 */
+       PHY_NAT_Q_STAT1         = 0x11,/* 16 bit r/o    Quick Status Reg1 */
+       PHY_NAT_10B_OP          = 0x12,/* 16 bit r/o    10Base-T Operations Reg */
+       PHY_NAT_EXT_CTRL2       = 0x13,/* 16 bit r/o    Extended Control Reg1 */
+       PHY_NAT_Q_STAT2         = 0x14,/* 16 bit r/o    Quick Status Reg2 */
+
+       PHY_NAT_PHY_ADDR        = 0x19,/* 16 bit r/o    PHY Address Register */
+};
+
+enum {
+       PHY_CT_RESET    = 1<<15, /* Bit 15: (sc)        clear all PHY related regs */
+       PHY_CT_LOOP     = 1<<14, /* Bit 14:     enable Loopback over PHY */
+       PHY_CT_SPS_LSB  = 1<<13, /* Bit 13:     Speed select, lower bit */
+       PHY_CT_ANE      = 1<<12, /* Bit 12:     Auto-Negotiation Enabled */
+       PHY_CT_PDOWN    = 1<<11, /* Bit 11:     Power Down Mode */
+       PHY_CT_ISOL     = 1<<10, /* Bit 10:     Isolate Mode */
+       PHY_CT_RE_CFG   = 1<<9, /* Bit  9:      (sc) Restart Auto-Negotiation */
+       PHY_CT_DUP_MD   = 1<<8, /* Bit  8:      Duplex Mode */
+       PHY_CT_COL_TST  = 1<<7, /* Bit  7:      Collision Test enabled */
+       PHY_CT_SPS_MSB  = 1<<6, /* Bit  6:      Speed select, upper bit */
+};
+
+enum {
+       PHY_CT_SP1000   = PHY_CT_SPS_MSB, /* enable speed of 1000 Mbps */
+       PHY_CT_SP100    = PHY_CT_SPS_LSB, /* enable speed of  100 Mbps */
+       PHY_CT_SP10     = 0,              /* enable speed of   10 Mbps */
+};
+
+enum {
+       PHY_ST_EXT_ST   = 1<<8, /* Bit  8:      Extended Status Present */
+
+       PHY_ST_PRE_SUP  = 1<<6, /* Bit  6:      Preamble Suppression */
+       PHY_ST_AN_OVER  = 1<<5, /* Bit  5:      Auto-Negotiation Over */
+       PHY_ST_REM_FLT  = 1<<4, /* Bit  4:      Remote Fault Condition Occured */
+       PHY_ST_AN_CAP   = 1<<3, /* Bit  3:      Auto-Negotiation Capability */
+       PHY_ST_LSYNC    = 1<<2, /* Bit  2:      Link Synchronized */
+       PHY_ST_JAB_DET  = 1<<1, /* Bit  1:      Jabber Detected */
+       PHY_ST_EXT_REG  = 1<<0, /* Bit  0:      Extended Register available */
+};
+
+enum {
+       PHY_I1_OUI_MSK  = 0x3f<<10, /* Bit 15..10:      Organization Unique ID */
+       PHY_I1_MOD_NUM  = 0x3f<<4, /* Bit  9.. 4:       Model Number */
+       PHY_I1_REV_MSK  = 0xf, /* Bit  3.. 0:   Revision Number */
+};
+
+/* different Broadcom PHY Ids */
+enum {
+       PHY_BCOM_ID1_A1 = 0x6041,
+       PHY_BCOM_ID1_B2 = 0x6043,
+       PHY_BCOM_ID1_C0 = 0x6044,
+       PHY_BCOM_ID1_C5 = 0x6047,
+};
+
+/* different Marvell PHY Ids */
+enum {
+       PHY_MARV_ID0_VAL= 0x0141, /* Marvell Unique Identifier */
+       PHY_MARV_ID1_B0 = 0x0C23, /* Yukon (PHY 88E1011) */
+       PHY_MARV_ID1_B2 = 0x0C25, /* Yukon-Plus (PHY 88E1011) */
+       PHY_MARV_ID1_C2 = 0x0CC2, /* Yukon-EC (PHY 88E1111) */
+       PHY_MARV_ID1_Y2 = 0x0C91, /* Yukon-2 (PHY 88E1112) */
+};
+
+enum {
+       PHY_AN_NXT_PG   = 1<<15, /* Bit 15:     Request Next Page */
+       PHY_X_AN_ACK    = 1<<14, /* Bit 14:     (ro) Acknowledge Received */
+       PHY_X_AN_RFB    = 3<<12,/* Bit 13..12:  Remote Fault Bits */
+
+       PHY_X_AN_PAUSE  = 3<<7,/* Bit  8.. 7:   Pause Bits */
+       PHY_X_AN_HD     = 1<<6, /* Bit  6:      Half Duplex */
+       PHY_X_AN_FD     = 1<<5, /* Bit  5:      Full Duplex */
+};
+
+enum {
+       PHY_B_AN_RF     = 1<<13, /* Bit 13:     Remote Fault */
+
+       PHY_B_AN_ASP    = 1<<11, /* Bit 11:     Asymmetric Pause */
+       PHY_B_AN_PC     = 1<<10, /* Bit 10:     Pause Capable */
+       PHY_B_AN_SEL    = 0x1f, /* Bit 4..0:    Selector Field, 00001=Ethernet*/
+};
+
+enum {
+       PHY_L_AN_RF     = 1<<13, /* Bit 13:     Remote Fault */
+                                                               /* Bit 12:      reserved */
+       PHY_L_AN_ASP    = 1<<11, /* Bit 11:     Asymmetric Pause */
+       PHY_L_AN_PC     = 1<<10, /* Bit 10:     Pause Capable */
+
+       PHY_L_AN_SEL    = 0x1f, /* Bit 4..0:    Selector Field, 00001=Ethernet*/
+};
+
+/*  PHY_NAT_AUNE_ADV   16 bit r/w      Auto-Negotiation Advertisement */
+/*  PHY_NAT_AUNE_LP    16 bit r/o      Link Partner Ability Reg *****/
+/*  PHY_AN_NXT_PG      (see XMAC) Bit 15:      Request Next Page */
+enum {
+       PHY_N_AN_RF     = 1<<13, /* Bit 13:     Remote Fault */
+
+       PHY_N_AN_100F   = 1<<11, /* Bit 11:     100Base-T2 FD Support */
+       PHY_N_AN_100H   = 1<<10, /* Bit 10:     100Base-T2 HD Support */
+
+       PHY_N_AN_SEL    = 0x1f, /* Bit 4..0:    Selector Field, 00001=Ethernet*/
+};
+
+/* field type definition for PHY_x_AN_SEL */
+enum {
+       PHY_SEL_TYPE     = 1,   /* 00001 = Ethernet */
+};
+
+enum {
+       PHY_ANE_LP_NP   = 1<<3, /* Bit  3:      Link Partner can Next Page */
+       PHY_ANE_LOC_NP  = 1<<2, /* Bit  2:      Local PHY can Next Page */
+       PHY_ANE_RX_PG   = 1<<1, /* Bit  1:      Page Received */
+};
+
+enum {
+       PHY_ANE_PAR_DF  = 1<<4, /* Bit  4:      Parallel Detection Fault */
+
+       PHY_ANE_LP_CAP  = 1<<0, /* Bit  0:      Link Partner Auto-Neg. Cap. */  
+};
+
+enum {
+       PHY_NP_MORE     = 1<<15, /* Bit 15:     More, Next Pages to follow */
+       PHY_NP_ACK1     = 1<<14, /* Bit 14: (ro)        Ack1, for receiving a message */
+       PHY_NP_MSG_VAL  = 1<<13, /* Bit 13:     Message Page valid */
+       PHY_NP_ACK2     = 1<<12, /* Bit 12:     Ack2, comply with msg content */
+       PHY_NP_TOG      = 1<<11, /* Bit 11:     Toggle Bit, ensure sync */
+       PHY_NP_MSG      = 0x07ff, /* Bit 10..0: Message from/to Link Partner */
+};
+
+enum {
+       PHY_X_EX_FD     = 1<<15, /* Bit 15:     Device Supports Full Duplex */
+       PHY_X_EX_HD     = 1<<14, /* Bit 14:     Device Supports Half Duplex */
+};
+
+enum {
+       PHY_X_RS_PAUSE  = 3<<7,/* Bit  8..7:    selected Pause Mode */
+       PHY_X_RS_HD     = 1<<6, /* Bit  6:      Half Duplex Mode selected */
+       PHY_X_RS_FD     = 1<<5, /* Bit  5:      Full Duplex Mode selected */
+       PHY_X_RS_ABLMIS = 1<<4, /* Bit  4:      duplex or pause cap mismatch */
+       PHY_X_RS_PAUMIS = 1<<3, /* Bit  3:      pause capability mismatch */
+};
+
+/** Remote Fault Bits (PHY_X_AN_RFB) encoding  */
+enum {
+       X_RFB_OK        = 0<<12,/* Bit 13..12   No errors, Link OK */
+       X_RFB_LF        = 1<<12, /* Bit 13..12  Link Failure */
+       X_RFB_OFF       = 2<<12,/* Bit 13..12   Offline */
+       X_RFB_AN_ERR    = 3<<12,/* Bit 13..12   Auto-Negotiation Error */
+};
+
+/* Pause Bits (PHY_X_AN_PAUSE and PHY_X_RS_PAUSE) encoding */
+enum {
+       PHY_X_P_NO_PAUSE        = 0<<7,/* Bit  8..7:    no Pause Mode */
+       PHY_X_P_SYM_MD  = 1<<7, /* Bit  8..7:   symmetric Pause Mode */
+       PHY_X_P_ASYM_MD = 2<<7,/* Bit  8..7:    asymmetric Pause Mode */
+       PHY_X_P_BOTH_MD = 3<<7,/* Bit  8..7:    both Pause Mode */
+};
+
+
+/* Broadcom-Specific */
+/*****  PHY_BCOM_1000T_CTRL    16 bit r/w      1000Base-T Control Reg *****/
+enum {
+       PHY_B_1000C_TEST        = 7<<13,/* Bit 15..13:  Test Modes */
+       PHY_B_1000C_MSE = 1<<12, /* Bit 12:     Master/Slave Enable */
+       PHY_B_1000C_MSC = 1<<11, /* Bit 11:     M/S Configuration */
+       PHY_B_1000C_RD  = 1<<10, /* Bit 10:     Repeater/DTE */
+       PHY_B_1000C_AFD = 1<<9, /* Bit  9:      Advertise Full Duplex */
+       PHY_B_1000C_AHD = 1<<8, /* Bit  8:      Advertise Half Duplex */
+};
+
+/*****  PHY_BCOM_1000T_STAT    16 bit r/o      1000Base-T Status Reg *****/
+/*****  PHY_MARV_1000T_STAT    16 bit r/o      1000Base-T Status Reg *****/
+enum {
+       PHY_B_1000S_MSF = 1<<15, /* Bit 15:     Master/Slave Fault */
+       PHY_B_1000S_MSR = 1<<14, /* Bit 14:     Master/Slave Result */
+       PHY_B_1000S_LRS = 1<<13, /* Bit 13:     Local Receiver Status */
+       PHY_B_1000S_RRS = 1<<12, /* Bit 12:     Remote Receiver Status */
+       PHY_B_1000S_LP_FD       = 1<<11, /* Bit 11:     Link Partner can FD */
+       PHY_B_1000S_LP_HD       = 1<<10, /* Bit 10:     Link Partner can HD */
+                                                                       /* Bit  9..8:   reserved */
+       PHY_B_1000S_IEC = 0xff, /* Bit  7..0:   Idle Error Count */
+};
+
+/*****  PHY_BCOM_EXT_STAT      16 bit r/o      Extended Status Register *****/
+enum {
+       PHY_B_ES_X_FD_CAP       = 1<<15, /* Bit 15:     1000Base-X FD capable */
+       PHY_B_ES_X_HD_CAP       = 1<<14, /* Bit 14:     1000Base-X HD capable */
+       PHY_B_ES_T_FD_CAP       = 1<<13, /* Bit 13:     1000Base-T FD capable */
+       PHY_B_ES_T_HD_CAP       = 1<<12, /* Bit 12:     1000Base-T HD capable */
+};
+
+/*****  PHY_BCOM_P_EXT_CTRL    16 bit r/w      PHY Extended Control Reg *****/
+enum {
+       PHY_B_PEC_MAC_PHY       = 1<<15, /* Bit 15:     10BIT/GMI-Interface */
+       PHY_B_PEC_DIS_CROSS     = 1<<14, /* Bit 14:     Disable MDI Crossover */
+       PHY_B_PEC_TX_DIS        = 1<<13, /* Bit 13:     Tx output Disabled */
+       PHY_B_PEC_INT_DIS       = 1<<12, /* Bit 12:     Interrupts Disabled */
+       PHY_B_PEC_F_INT = 1<<11, /* Bit 11:     Force Interrupt */
+       PHY_B_PEC_BY_45 = 1<<10, /* Bit 10:     Bypass 4B5B-Decoder */
+       PHY_B_PEC_BY_SCR        = 1<<9, /* Bit  9:      Bypass Scrambler */
+       PHY_B_PEC_BY_MLT3       = 1<<8, /* Bit  8:      Bypass MLT3 Encoder */
+       PHY_B_PEC_BY_RXA        = 1<<7, /* Bit  7:      Bypass Rx Alignm. */
+       PHY_B_PEC_RES_SCR       = 1<<6, /* Bit  6:      Reset Scrambler */
+       PHY_B_PEC_EN_LTR        = 1<<5, /* Bit  5:      Ena LED Traffic Mode */
+       PHY_B_PEC_LED_ON        = 1<<4, /* Bit  4:      Force LED's on */
+       PHY_B_PEC_LED_OFF       = 1<<3, /* Bit  3:      Force LED's off */
+       PHY_B_PEC_EX_IPG        = 1<<2, /* Bit  2:      Extend Tx IPG Mode */
+       PHY_B_PEC_3_LED = 1<<1, /* Bit  1:      Three Link LED mode */
+       PHY_B_PEC_HIGH_LA       = 1<<0, /* Bit  0:      GMII FIFO Elasticy */
+};
+
+/*****  PHY_BCOM_P_EXT_STAT    16 bit r/o      PHY Extended Status Reg *****/
+enum {
+       PHY_B_PES_CROSS_STAT    = 1<<13, /* Bit 13:     MDI Crossover Status */
+       PHY_B_PES_INT_STAT      = 1<<12, /* Bit 12:     Interrupt Status */
+       PHY_B_PES_RRS   = 1<<11, /* Bit 11:     Remote Receiver Stat. */
+       PHY_B_PES_LRS   = 1<<10, /* Bit 10:     Local Receiver Stat. */
+       PHY_B_PES_LOCKED        = 1<<9, /* Bit  9:      Locked */
+       PHY_B_PES_LS    = 1<<8, /* Bit  8:      Link Status */
+       PHY_B_PES_RF    = 1<<7, /* Bit  7:      Remote Fault */
+       PHY_B_PES_CE_ER = 1<<6, /* Bit  6:      Carrier Ext Error */
+       PHY_B_PES_BAD_SSD       = 1<<5, /* Bit  5:      Bad SSD */
+       PHY_B_PES_BAD_ESD       = 1<<4, /* Bit  4:      Bad ESD */
+       PHY_B_PES_RX_ER = 1<<3, /* Bit  3:      Receive Error */
+       PHY_B_PES_TX_ER = 1<<2, /* Bit  2:      Transmit Error */
+       PHY_B_PES_LOCK_ER       = 1<<1, /* Bit  1:      Lock Error */
+       PHY_B_PES_MLT3_ER       = 1<<0, /* Bit  0:      MLT3 code Error */
+};
+
+/*****  PHY_BCOM_FC_CTR                16 bit r/w      False Carrier Counter *****/
+enum {
+       PHY_B_FC_CTR    = 0xff, /* Bit  7..0:   False Carrier Counter */
+
+/*****  PHY_BCOM_RNO_CTR       16 bit r/w      Receive NOT_OK Counter *****/
+       PHY_B_RC_LOC_MSK        = 0xff00, /* Bit 15..8: Local Rx NOT_OK cnt */
+       PHY_B_RC_REM_MSK        = 0x00ff, /* Bit  7..0: Remote Rx NOT_OK cnt */
+
+/*****  PHY_BCOM_AUX_CTRL      16 bit r/w      Auxiliary Control Reg *****/
+       PHY_B_AC_L_SQE          = 1<<15, /* Bit 15:     Low Squelch */
+       PHY_B_AC_LONG_PACK      = 1<<14, /* Bit 14:     Rx Long Packets */
+       PHY_B_AC_ER_CTRL        = 3<<12,/* Bit 13..12:  Edgerate Control */
+                                                                       /* Bit 11:      reserved */
+       PHY_B_AC_TX_TST = 1<<10, /* Bit 10:     Tx test bit, always 1 */
+                                                                       /* Bit  9.. 8:  reserved */
+       PHY_B_AC_DIS_PRF        = 1<<7, /* Bit  7:      dis part resp filter */
+                                                                       /* Bit  6:      reserved */
+       PHY_B_AC_DIS_PM = 1<<5, /* Bit  5:      dis power management */
+                                                                       /* Bit  4:      reserved */
+       PHY_B_AC_DIAG   = 1<<3, /* Bit  3:      Diagnostic Mode */
+};
+
+/*****  PHY_BCOM_AUX_STAT      16 bit r/o      Auxiliary Status Reg *****/
+enum {
+       PHY_B_AS_AN_C   = 1<<15, /* Bit 15:     AutoNeg complete */
+       PHY_B_AS_AN_CA  = 1<<14, /* Bit 14:     AN Complete Ack */
+       PHY_B_AS_ANACK_D        = 1<<13, /* Bit 13:     AN Ack Detect */
+       PHY_B_AS_ANAB_D = 1<<12, /* Bit 12:     AN Ability Detect */
+       PHY_B_AS_NPW    = 1<<11, /* Bit 11:     AN Next Page Wait */
+       PHY_B_AS_AN_RES_MSK     = 7<<8,/* Bit 10..8:    AN HDC */
+       PHY_B_AS_PDF    = 1<<7, /* Bit  7:      Parallel Detect. Fault */
+       PHY_B_AS_RF     = 1<<6, /* Bit  6:      Remote Fault */
+       PHY_B_AS_ANP_R  = 1<<5, /* Bit  5:      AN Page Received */
+       PHY_B_AS_LP_ANAB        = 1<<4, /* Bit  4:      LP AN Ability */
+       PHY_B_AS_LP_NPAB        = 1<<3, /* Bit  3:      LP Next Page Ability */
+       PHY_B_AS_LS     = 1<<2, /* Bit  2:      Link Status */
+       PHY_B_AS_PRR    = 1<<1, /* Bit  1:      Pause Resolution-Rx */
+       PHY_B_AS_PRT    = 1<<0, /* Bit  0:      Pause Resolution-Tx */
+};
+#define PHY_B_AS_PAUSE_MSK     (PHY_B_AS_PRR | PHY_B_AS_PRT)
+
+/*****  PHY_BCOM_INT_STAT      16 bit r/o      Interrupt Status Reg *****/
+/*****  PHY_BCOM_INT_MASK      16 bit r/w      Interrupt Mask Reg *****/
+enum {
+       PHY_B_IS_PSE    = 1<<14, /* Bit 14:     Pair Swap Error */
+       PHY_B_IS_MDXI_SC        = 1<<13, /* Bit 13:     MDIX Status Change */
+       PHY_B_IS_HCT    = 1<<12, /* Bit 12:     counter above 32k */
+       PHY_B_IS_LCT    = 1<<11, /* Bit 11:     counter above 128 */
+       PHY_B_IS_AN_PR  = 1<<10, /* Bit 10:     Page Received */
+       PHY_B_IS_NO_HDCL        = 1<<9, /* Bit  9:      No HCD Link */
+       PHY_B_IS_NO_HDC = 1<<8, /* Bit  8:      No HCD */
+       PHY_B_IS_NEG_USHDC      = 1<<7, /* Bit  7:      Negotiated Unsup. HCD */
+       PHY_B_IS_SCR_S_ER       = 1<<6, /* Bit  6:      Scrambler Sync Error */
+       PHY_B_IS_RRS_CHANGE     = 1<<5, /* Bit  5:      Remote Rx Stat Change */
+       PHY_B_IS_LRS_CHANGE     = 1<<4, /* Bit  4:      Local Rx Stat Change */
+       PHY_B_IS_DUP_CHANGE     = 1<<3, /* Bit  3:      Duplex Mode Change */
+       PHY_B_IS_LSP_CHANGE     = 1<<2, /* Bit  2:      Link Speed Change */
+       PHY_B_IS_LST_CHANGE     = 1<<1, /* Bit  1:      Link Status Changed */
+       PHY_B_IS_CRC_ER = 1<<0, /* Bit  0:      CRC Error */
+};
+#define PHY_B_DEF_MSK  (~(PHY_B_IS_AN_PR | PHY_B_IS_LST_CHANGE))
+
+/* Pause Bits (PHY_B_AN_ASP and PHY_B_AN_PC) encoding */
+enum {
+       PHY_B_P_NO_PAUSE        = 0<<10,/* Bit 11..10:  no Pause Mode */
+       PHY_B_P_SYM_MD  = 1<<10, /* Bit 11..10: symmetric Pause Mode */
+       PHY_B_P_ASYM_MD = 2<<10,/* Bit 11..10:  asymmetric Pause Mode */
+       PHY_B_P_BOTH_MD = 3<<10,/* Bit 11..10:  both Pause Mode */
+};
+/*
+ * Resolved Duplex mode and Capabilities (Aux Status Summary Reg)
+ */
+enum {
+       PHY_B_RES_1000FD        = 7<<8,/* Bit 10..8:    1000Base-T Full Dup. */
+       PHY_B_RES_1000HD        = 6<<8,/* Bit 10..8:    1000Base-T Half Dup. */
+};
+
+/*
+ * Level One-Specific
+ */
+/*****  PHY_LONE_1000T_CTRL    16 bit r/w      1000Base-T Control Reg *****/
+enum {
+       PHY_L_1000C_TEST        = 7<<13,/* Bit 15..13:  Test Modes */
+       PHY_L_1000C_MSE = 1<<12, /* Bit 12:     Master/Slave Enable */
+       PHY_L_1000C_MSC = 1<<11, /* Bit 11:     M/S Configuration */
+       PHY_L_1000C_RD  = 1<<10, /* Bit 10:     Repeater/DTE */
+       PHY_L_1000C_AFD = 1<<9, /* Bit  9:      Advertise Full Duplex */
+       PHY_L_1000C_AHD = 1<<8, /* Bit  8:      Advertise Half Duplex */
+};
+
+/*****  PHY_LONE_1000T_STAT    16 bit r/o      1000Base-T Status Reg *****/
+enum {
+       PHY_L_1000S_MSF = 1<<15, /* Bit 15:     Master/Slave Fault */
+       PHY_L_1000S_MSR = 1<<14, /* Bit 14:     Master/Slave Result */
+       PHY_L_1000S_LRS = 1<<13, /* Bit 13:     Local Receiver Status */
+       PHY_L_1000S_RRS = 1<<12, /* Bit 12:     Remote Receiver Status */
+       PHY_L_1000S_LP_FD = 1<<11, /* Bit 11:   Link Partner can FD */
+       PHY_L_1000S_LP_HD = 1<<10, /* Bit 10:   Link Partner can HD */
+
+       PHY_L_1000S_IEC  = 0xff, /* Bit  7..0:  Idle Error Count */
+
+/*****  PHY_LONE_EXT_STAT      16 bit r/o      Extended Status Register *****/
+       PHY_L_ES_X_FD_CAP = 1<<15, /* Bit 15:   1000Base-X FD capable */
+       PHY_L_ES_X_HD_CAP = 1<<14, /* Bit 14:   1000Base-X HD capable */
+       PHY_L_ES_T_FD_CAP = 1<<13, /* Bit 13:   1000Base-T FD capable */
+       PHY_L_ES_T_HD_CAP = 1<<12, /* Bit 12:   1000Base-T HD capable */
+};
+
+/*****  PHY_LONE_PORT_CFG      16 bit r/w      Port Configuration Reg *****/
+enum {
+       PHY_L_PC_REP_MODE       = 1<<15, /* Bit 15:     Repeater Mode */
+
+       PHY_L_PC_TX_DIS = 1<<13, /* Bit 13:     Tx output Disabled */
+       PHY_L_PC_BY_SCR = 1<<12, /* Bit 12:     Bypass Scrambler */
+       PHY_L_PC_BY_45  = 1<<11, /* Bit 11:     Bypass 4B5B-Decoder */
+       PHY_L_PC_JAB_DIS        = 1<<10, /* Bit 10:     Jabber Disabled */
+       PHY_L_PC_SQE    = 1<<9, /* Bit  9:      Enable Heartbeat */
+       PHY_L_PC_TP_LOOP        = 1<<8, /* Bit  8:      TP Loopback */
+       PHY_L_PC_SSS    = 1<<7, /* Bit  7:      Smart Speed Selection */
+       PHY_L_PC_FIFO_SIZE      = 1<<6, /* Bit  6:      FIFO Size */
+       PHY_L_PC_PRE_EN = 1<<5, /* Bit  5:      Preamble Enable */
+       PHY_L_PC_CIM    = 1<<4, /* Bit  4:      Carrier Integrity Mon */
+       PHY_L_PC_10_SER = 1<<3, /* Bit  3:      Use Serial Output */
+       PHY_L_PC_ANISOL = 1<<2, /* Bit  2:      Unisolate Port */
+       PHY_L_PC_TEN_BIT        = 1<<1, /* Bit  1:      10bit iface mode on */
+       PHY_L_PC_ALTCLOCK       = 1<<0, /* Bit  0: (ro) ALTCLOCK Mode on */
+};
+
+/*****  PHY_LONE_Q_STAT                16 bit r/o      Quick Status Reg *****/
+enum {
+       PHY_L_QS_D_RATE = 3<<14,/* Bit 15..14:  Data Rate */
+       PHY_L_QS_TX_STAT        = 1<<13, /* Bit 13:     Transmitting */
+       PHY_L_QS_RX_STAT        = 1<<12, /* Bit 12:     Receiving */
+       PHY_L_QS_COL_STAT       = 1<<11, /* Bit 11:     Collision */
+       PHY_L_QS_L_STAT = 1<<10, /* Bit 10:     Link is up */
+       PHY_L_QS_DUP_MOD        = 1<<9, /* Bit  9:      Full/Half Duplex */
+       PHY_L_QS_AN     = 1<<8, /* Bit  8:      AutoNeg is On */
+       PHY_L_QS_AN_C   = 1<<7, /* Bit  7:      AN is Complete */
+       PHY_L_QS_LLE    = 7<<4,/* Bit  6..4:    Line Length Estim. */
+       PHY_L_QS_PAUSE  = 1<<3, /* Bit  3:      LP advertised Pause */
+       PHY_L_QS_AS_PAUSE       = 1<<2, /* Bit  2:      LP adv. asym. Pause */
+       PHY_L_QS_ISOLATE        = 1<<1, /* Bit  1:      CIM Isolated */
+       PHY_L_QS_EVENT  = 1<<0, /* Bit  0:      Event has occurred */
+};
+
+/*****  PHY_LONE_INT_ENAB      16 bit r/w      Interrupt Enable Reg *****/
+/*****  PHY_LONE_INT_STAT      16 bit r/o      Interrupt Status Reg *****/
+enum {
+       PHY_L_IS_AN_F   = 1<<13, /* Bit 13:     Auto-Negotiation fault */
+       PHY_L_IS_CROSS  = 1<<11, /* Bit 11:     Crossover used */
+       PHY_L_IS_POL    = 1<<10, /* Bit 10:     Polarity correct. used */
+       PHY_L_IS_SS     = 1<<9, /* Bit  9:      Smart Speed Downgrade */
+       PHY_L_IS_CFULL  = 1<<8, /* Bit  8:      Counter Full */
+       PHY_L_IS_AN_C   = 1<<7, /* Bit  7:      AutoNeg Complete */
+       PHY_L_IS_SPEED  = 1<<6, /* Bit  6:      Speed Changed */
+       PHY_L_IS_DUP    = 1<<5, /* Bit  5:      Duplex Changed */
+       PHY_L_IS_LS     = 1<<4, /* Bit  4:      Link Status Changed */
+       PHY_L_IS_ISOL   = 1<<3, /* Bit  3:      Isolate Occured */
+       PHY_L_IS_MDINT  = 1<<2, /* Bit  2: (ro) STAT: MII Int Pending */
+       PHY_L_IS_INTEN  = 1<<1, /* Bit  1:      ENAB: Enable IRQs */
+       PHY_L_IS_FORCE  = 1<<0, /* Bit  0:      ENAB: Force Interrupt */
+};
+
+/* int. mask */
+#define PHY_L_DEF_MSK  (PHY_L_IS_LS | PHY_L_IS_ISOL | PHY_L_IS_INTEN)
+
+/*****  PHY_LONE_LED_CFG       16 bit r/w      LED Configuration Reg *****/
+enum {
+       PHY_L_LC_LEDC   = 3<<14,/* Bit 15..14:  Col/Blink/On/Off */
+       PHY_L_LC_LEDR   = 3<<12,/* Bit 13..12:  Rx/Blink/On/Off */
+       PHY_L_LC_LEDT   = 3<<10,/* Bit 11..10:  Tx/Blink/On/Off */
+       PHY_L_LC_LEDG   = 3<<8,/* Bit  9..8:    Giga/Blink/On/Off */
+       PHY_L_LC_LEDS   = 3<<6,/* Bit  7..6:    10-100/Blink/On/Off */
+       PHY_L_LC_LEDL   = 3<<4,/* Bit  5..4:    Link/Blink/On/Off */
+       PHY_L_LC_LEDF   = 3<<2,/* Bit  3..2:    Duplex/Blink/On/Off */
+       PHY_L_LC_PSTRECH= 1<<1, /* Bit  1:      Strech LED Pulses */
+       PHY_L_LC_FREQ   = 1<<0, /* Bit  0:      30/100 ms */
+};
+
+/*****  PHY_LONE_PORT_CTRL     16 bit r/w      Port Control Reg *****/
+enum {
+       PHY_L_PC_TX_TCLK = 1<<15, /* Bit 15:    Enable TX_TCLK */
+       PHY_L_PC_ALT_NP  = 1<<13, /* Bit 14:    Alternate Next Page */
+       PHY_L_PC_GMII_ALT= 1<<12, /* Bit 13:    Alternate GMII driver */
+       PHY_L_PC_TEN_CRS = 1<<10, /* Bit 10:    Extend CRS*/
+};
+
+/*****  PHY_LONE_CIM           16 bit r/o      CIM Reg *****/
+enum {
+       PHY_L_CIM_ISOL      = 0xff<<8,/* Bit 15..8:     Isolate Count */
+       PHY_L_CIM_FALSE_CAR = 0xff,   /* Bit  7..0:     False Carrier Count */
+};
+
+/*
+ * Pause Bits (PHY_L_AN_ASP and PHY_L_AN_PC) encoding
+ */
+enum {
+       PHY_L_P_NO_PAUSE= 0<<10,/* Bit 11..10:  no Pause Mode */
+       PHY_L_P_SYM_MD  = 1<<10, /* Bit 11..10: symmetric Pause Mode */
+       PHY_L_P_ASYM_MD = 2<<10,/* Bit 11..10:  asymmetric Pause Mode */
+       PHY_L_P_BOTH_MD = 3<<10,/* Bit 11..10:  both Pause Mode */
+};
+
+/*
+ * National-Specific
+ */
+/*****  PHY_NAT_1000T_CTRL     16 bit r/w      1000Base-T Control Reg *****/
+enum {
+       PHY_N_1000C_TEST= 7<<13,/* Bit 15..13:  Test Modes */
+       PHY_N_1000C_MSE = 1<<12, /* Bit 12:     Master/Slave Enable */
+       PHY_N_1000C_MSC = 1<<11, /* Bit 11:     M/S Configuration */
+       PHY_N_1000C_RD  = 1<<10, /* Bit 10:     Repeater/DTE */
+       PHY_N_1000C_AFD = 1<<9, /* Bit  9:      Advertise Full Duplex */
+       PHY_N_1000C_AHD = 1<<8, /* Bit  8:      Advertise Half Duplex */
+       PHY_N_1000C_APC = 1<<7, /* Bit  7:      Asymmetric Pause Cap. */};
+
+
+/*****  PHY_NAT_1000T_STAT     16 bit r/o      1000Base-T Status Reg *****/
+enum {
+       PHY_N_1000S_MSF = 1<<15, /* Bit 15:     Master/Slave Fault */
+       PHY_N_1000S_MSR = 1<<14, /* Bit 14:     Master/Slave Result */
+       PHY_N_1000S_LRS = 1<<13, /* Bit 13:     Local Receiver Status */
+       PHY_N_1000S_RRS = 1<<12, /* Bit 12:     Remote Receiver Status*/
+       PHY_N_1000S_LP_FD= 1<<11, /* Bit 11:    Link Partner can FD */
+       PHY_N_1000S_LP_HD= 1<<10, /* Bit 10:    Link Partner can HD */
+       PHY_N_1000C_LP_APC= 1<<9, /* Bit  9:    LP Asym. Pause Cap. */
+       PHY_N_1000S_IEC = 0xff, /* Bit  7..0:   Idle Error Count */
+};
+
+/*****  PHY_NAT_EXT_STAT       16 bit r/o      Extended Status Register *****/
+enum {
+       PHY_N_ES_X_FD_CAP= 1<<15, /* Bit 15:    1000Base-X FD capable */
+       PHY_N_ES_X_HD_CAP= 1<<14, /* Bit 14:    1000Base-X HD capable */
+       PHY_N_ES_T_FD_CAP= 1<<13, /* Bit 13:    1000Base-T FD capable */
+       PHY_N_ES_T_HD_CAP= 1<<12, /* Bit 12:    1000Base-T HD capable */
+};
+
+/** Marvell-Specific */
+enum {
+       PHY_M_AN_NXT_PG = 1<<15, /* Request Next Page */
+       PHY_M_AN_ACK    = 1<<14, /* (ro)        Acknowledge Received */
+       PHY_M_AN_RF     = 1<<13, /* Remote Fault */
+
+       PHY_M_AN_ASP    = 1<<11, /* Asymmetric Pause */
+       PHY_M_AN_PC     = 1<<10, /* MAC Pause implemented */
+       PHY_M_AN_100_T4 = 1<<9, /* Not cap. 100Base-T4 (always 0) */
+       PHY_M_AN_100_FD = 1<<8, /* Advertise 100Base-TX Full Duplex */
+       PHY_M_AN_100_HD = 1<<7, /* Advertise 100Base-TX Half Duplex */
+       PHY_M_AN_10_FD  = 1<<6, /* Advertise 10Base-TX Full Duplex */
+       PHY_M_AN_10_HD  = 1<<5, /* Advertise 10Base-TX Half Duplex */
+       PHY_M_AN_SEL_MSK =0x1f<<4,      /* Bit  4.. 0: Selector Field Mask */
+};
+
+/* special defines for FIBER (88E1011S only) */
+enum {
+       PHY_M_AN_ASP_X  = 1<<8, /* Asymmetric Pause */
+       PHY_M_AN_PC_X   = 1<<7, /* MAC Pause implemented */
+       PHY_M_AN_1000X_AHD      = 1<<6, /* Advertise 10000Base-X Half Duplex */
+       PHY_M_AN_1000X_AFD      = 1<<5, /* Advertise 10000Base-X Full Duplex */
+};
+
+/* Pause Bits (PHY_M_AN_ASP_X and PHY_M_AN_PC_X) encoding */
+enum {
+       PHY_M_P_NO_PAUSE_X      = 0<<7,/* Bit  8.. 7:   no Pause Mode */
+       PHY_M_P_SYM_MD_X        = 1<<7, /* Bit  8.. 7:  symmetric Pause Mode */
+       PHY_M_P_ASYM_MD_X       = 2<<7,/* Bit  8.. 7:   asymmetric Pause Mode */
+       PHY_M_P_BOTH_MD_X       = 3<<7,/* Bit  8.. 7:   both Pause Mode */
+};
+
+/*****  PHY_MARV_1000T_CTRL    16 bit r/w      1000Base-T Control Reg *****/
+enum {
+       PHY_M_1000C_TEST        = 7<<13,/* Bit 15..13:  Test Modes */
+       PHY_M_1000C_MSE = 1<<12, /* Manual Master/Slave Enable */
+       PHY_M_1000C_MSC = 1<<11, /* M/S Configuration (1=Master) */
+       PHY_M_1000C_MPD = 1<<10, /* Multi-Port Device */
+       PHY_M_1000C_AFD = 1<<9, /* Advertise Full Duplex */
+       PHY_M_1000C_AHD = 1<<8, /* Advertise Half Duplex */
+};
+
+/*****  PHY_MARV_PHY_CTRL      16 bit r/w      PHY Specific Ctrl Reg *****/
+enum {
+       PHY_M_PC_TX_FFD_MSK     = 3<<14,/* Bit 15..14: Tx FIFO Depth Mask */
+       PHY_M_PC_RX_FFD_MSK     = 3<<12,/* Bit 13..12: Rx FIFO Depth Mask */
+       PHY_M_PC_ASS_CRS_TX     = 1<<11, /* Assert CRS on Transmit */
+       PHY_M_PC_FL_GOOD        = 1<<10, /* Force Link Good */
+       PHY_M_PC_EN_DET_MSK     = 3<<8,/* Bit  9.. 8: Energy Detect Mask */
+       PHY_M_PC_ENA_EXT_D      = 1<<7, /* Enable Ext. Distance (10BT) */
+       PHY_M_PC_MDIX_MSK       = 3<<5,/* Bit  6.. 5: MDI/MDIX Config. Mask */
+       PHY_M_PC_DIS_125CLK     = 1<<4, /* Disable 125 CLK */
+       PHY_M_PC_MAC_POW_UP     = 1<<3, /* MAC Power up */
+       PHY_M_PC_SQE_T_ENA      = 1<<2, /* SQE Test Enabled */
+       PHY_M_PC_POL_R_DIS      = 1<<1, /* Polarity Reversal Disabled */
+       PHY_M_PC_DIS_JABBER     = 1<<0, /* Disable Jabber */
+};
+
+enum {
+       PHY_M_PC_EN_DET         = 2<<8, /* Energy Detect (Mode 1) */
+       PHY_M_PC_EN_DET_PLUS    = 3<<8, /* Energy Detect Plus (Mode 2) */
+};
+
+#define PHY_M_PC_MDI_XMODE(x)  (((x)<<5) & PHY_M_PC_MDIX_MSK)  
+
+enum {
+       PHY_M_PC_MAN_MDI        = 0, /* 00 = Manual MDI configuration */
+       PHY_M_PC_MAN_MDIX       = 1, /* 01 = Manual MDIX configuration */
+       PHY_M_PC_ENA_AUTO       = 3, /* 11 = Enable Automatic Crossover */
+};
+
+/* for 10/100 Fast Ethernet PHY (88E3082 only) */
+enum {
+       PHY_M_PC_ENA_DTE_DT     = 1<<15, /* Enable Data Terminal Equ. (DTE) Detect */
+       PHY_M_PC_ENA_ENE_DT     = 1<<14, /* Enable Energy Detect (sense & pulse) */
+       PHY_M_PC_DIS_NLP_CK     = 1<<13, /* Disable Normal Link Puls (NLP) Check */
+       PHY_M_PC_ENA_LIP_NP     = 1<<12, /* Enable Link Partner Next Page Reg. */
+       PHY_M_PC_DIS_NLP_GN     = 1<<11, /* Disable Normal Link Puls Generation */
+
+       PHY_M_PC_DIS_SCRAMB     = 1<<9, /* Disable Scrambler */
+       PHY_M_PC_DIS_FEFI       = 1<<8, /* Disable Far End Fault Indic. (FEFI) */
+
+       PHY_M_PC_SH_TP_SEL      = 1<<6, /* Shielded Twisted Pair Select */
+       PHY_M_PC_RX_FD_MSK      = 3<<2,/* Bit  3.. 2: Rx FIFO Depth Mask */
+};
+
+/*****  PHY_MARV_PHY_STAT      16 bit r/o      PHY Specific Status Reg *****/
+enum {
+       PHY_M_PS_SPEED_MSK      = 3<<14, /* Bit 15..14: Speed Mask */
+       PHY_M_PS_SPEED_1000     = 1<<15, /*             10 = 1000 Mbps */
+       PHY_M_PS_SPEED_100      = 1<<14, /*             01 =  100 Mbps */
+       PHY_M_PS_SPEED_10       = 0,     /*             00 =   10 Mbps */
+       PHY_M_PS_FULL_DUP       = 1<<13, /* Full Duplex */
+       PHY_M_PS_PAGE_REC       = 1<<12, /* Page Received */
+       PHY_M_PS_SPDUP_RES      = 1<<11, /* Speed & Duplex Resolved */
+       PHY_M_PS_LINK_UP        = 1<<10, /* Link Up */
+       PHY_M_PS_CABLE_MSK      = 7<<7,  /* Bit  9.. 7: Cable Length Mask */
+       PHY_M_PS_MDI_X_STAT     = 1<<6,  /* MDI Crossover Stat (1=MDIX) */
+       PHY_M_PS_DOWNS_STAT     = 1<<5,  /* Downshift Status (1=downsh.) */
+       PHY_M_PS_ENDET_STAT     = 1<<4,  /* Energy Detect Status (1=act) */
+       PHY_M_PS_TX_P_EN        = 1<<3,  /* Tx Pause Enabled */
+       PHY_M_PS_RX_P_EN        = 1<<2,  /* Rx Pause Enabled */
+       PHY_M_PS_POL_REV        = 1<<1,  /* Polarity Reversed */
+       PHY_M_PS_JABBER         = 1<<0,  /* Jabber */
+};
+
+#define PHY_M_PS_PAUSE_MSK     (PHY_M_PS_TX_P_EN | PHY_M_PS_RX_P_EN)
+
+/* for 10/100 Fast Ethernet PHY (88E3082 only) */
+enum {
+       PHY_M_PS_DTE_DETECT     = 1<<15, /* Data Terminal Equipment (DTE) Detected */
+       PHY_M_PS_RES_SPEED      = 1<<14, /* Resolved Speed (1=100 Mbps, 0=10 Mbps */
+};
+
+enum {
+       PHY_M_IS_AN_ERROR       = 1<<15, /* Auto-Negotiation Error */
+       PHY_M_IS_LSP_CHANGE     = 1<<14, /* Link Speed Changed */
+       PHY_M_IS_DUP_CHANGE     = 1<<13, /* Duplex Mode Changed */
+       PHY_M_IS_AN_PR          = 1<<12, /* Page Received */
+       PHY_M_IS_AN_COMPL       = 1<<11, /* Auto-Negotiation Completed */
+       PHY_M_IS_LST_CHANGE     = 1<<10, /* Link Status Changed */
+       PHY_M_IS_SYMB_ERROR     = 1<<9, /* Symbol Error */
+       PHY_M_IS_FALSE_CARR     = 1<<8, /* False Carrier */
+       PHY_M_IS_FIFO_ERROR     = 1<<7, /* FIFO Overflow/Underrun Error */
+       PHY_M_IS_MDI_CHANGE     = 1<<6, /* MDI Crossover Changed */
+       PHY_M_IS_DOWNSH_DET     = 1<<5, /* Downshift Detected */
+       PHY_M_IS_END_CHANGE     = 1<<4, /* Energy Detect Changed */
+
+       PHY_M_IS_DTE_CHANGE     = 1<<2, /* DTE Power Det. Status Changed */
+       PHY_M_IS_POL_CHANGE     = 1<<1, /* Polarity Changed */
+       PHY_M_IS_JABBER         = 1<<0, /* Jabber */
+};
+
+#define PHY_M_DEF_MSK  ( PHY_M_IS_AN_ERROR | PHY_M_IS_LSP_CHANGE | \
+                         PHY_M_IS_LST_CHANGE | PHY_M_IS_FIFO_ERROR)
+
+/*****  PHY_MARV_EXT_CTRL      16 bit r/w      Ext. PHY Specific Ctrl *****/
+enum {
+       PHY_M_EC_ENA_BC_EXT = 1<<15, /* Enable Block Carr. Ext. (88E1111 only) */
+       PHY_M_EC_ENA_LIN_LB = 1<<14, /* Enable Line Loopback (88E1111 only) */
+
+       PHY_M_EC_DIS_LINK_P = 1<<12, /* Disable Link Pulses (88E1111 only) */
+       PHY_M_EC_M_DSC_MSK  = 3<<10, /* Bit 11..10:     Master Downshift Counter */
+                                       /* (88E1011 only) */
+       PHY_M_EC_S_DSC_MSK      = 3<<8,/* Bit  9.. 8:   Slave  Downshift Counter */
+                                      /* (88E1011 only) */
+       PHY_M_EC_M_DSC_MSK2     = 7<<9,/* Bit 11.. 9:   Master Downshift Counter */
+                                       /* (88E1111 only) */
+       PHY_M_EC_DOWN_S_ENA     = 1<<8, /* Downshift Enable (88E1111 only) */
+                                       /* !!! Errata in spec. (1 = disable) */
+       PHY_M_EC_RX_TIM_CT      = 1<<7, /* RGMII Rx Timing Control*/
+       PHY_M_EC_MAC_S_MSK      = 7<<4,/* Bit  6.. 4:   Def. MAC interface speed */
+       PHY_M_EC_FIB_AN_ENA     = 1<<3, /* Fiber Auto-Neg. Enable (88E1011S only) */
+       PHY_M_EC_DTE_D_ENA      = 1<<2, /* DTE Detect Enable (88E1111 only) */
+       PHY_M_EC_TX_TIM_CT      = 1<<1, /* RGMII Tx Timing Control */
+       PHY_M_EC_TRANS_DIS      = 1<<0, /* Transmitter Disable (88E1111 only) */};
+
+#define PHY_M_EC_M_DSC(x)      ((x)<<10) /* 00=1x; 01=2x; 10=3x; 11=4x */
+#define PHY_M_EC_S_DSC(x)      ((x)<<8) /* 00=dis; 01=1x; 10=2x; 11=3x */
+#define PHY_M_EC_MAC_S(x)      ((x)<<4) /* 01X=0; 110=2.5; 111=25 (MHz) */
+
+#define PHY_M_EC_M_DSC_2(x)    ((x)<<9) /* 000=1x; 001=2x; 010=3x; 011=4x */
+                                                                                       /* 100=5x; 101=6x; 110=7x; 111=8x */
+enum {
+       MAC_TX_CLK_0_MHZ        = 2,
+       MAC_TX_CLK_2_5_MHZ      = 6,
+       MAC_TX_CLK_25_MHZ       = 7,
+};
+
+/*****  PHY_MARV_LED_CTRL      16 bit r/w      LED Control Reg *****/
+enum {
+       PHY_M_LEDC_DIS_LED      = 1<<15, /* Disable LED */
+       PHY_M_LEDC_PULS_MSK     = 7<<12,/* Bit 14..12: Pulse Stretch Mask */
+       PHY_M_LEDC_F_INT        = 1<<11, /* Force Interrupt */
+       PHY_M_LEDC_BL_R_MSK     = 7<<8,/* Bit 10.. 8: Blink Rate Mask */
+       PHY_M_LEDC_DP_C_LSB     = 1<<7, /* Duplex Control (LSB, 88E1111 only) */
+       PHY_M_LEDC_TX_C_LSB     = 1<<6, /* Tx Control (LSB, 88E1111 only) */
+       PHY_M_LEDC_LK_C_MSK     = 7<<3,/* Bit  5.. 3: Link Control Mask */
+                                       /* (88E1111 only) */
+};
+
+enum {
+       PHY_M_LEDC_LINK_MSK     = 3<<3,/* Bit  4.. 3: Link Control Mask */
+                                                                       /* (88E1011 only) */
+       PHY_M_LEDC_DP_CTRL      = 1<<2, /* Duplex Control */
+       PHY_M_LEDC_DP_C_MSB     = 1<<2, /* Duplex Control (MSB, 88E1111 only) */
+       PHY_M_LEDC_RX_CTRL      = 1<<1, /* Rx Activity / Link */
+       PHY_M_LEDC_TX_CTRL      = 1<<0, /* Tx Activity / Link */
+       PHY_M_LEDC_TX_C_MSB     = 1<<0, /* Tx Control (MSB, 88E1111 only) */
+};
+
+#define PHY_M_LED_PULS_DUR(x)  (       ((x)<<12) & PHY_M_LEDC_PULS_MSK)
+
+enum {
+       PULS_NO_STR     = 0,/* no pulse stretching */
+       PULS_21MS       = 1,/* 21 ms to 42 ms */
+       PULS_42MS       = 2,/* 42 ms to 84 ms */
+       PULS_84MS       = 3,/* 84 ms to 170 ms */
+       PULS_170MS      = 4,/* 170 ms to 340 ms */
+       PULS_340MS      = 5,/* 340 ms to 670 ms */
+       PULS_670MS      = 6,/* 670 ms to 1.3 s */
+       PULS_1300MS     = 7,/* 1.3 s to 2.7 s */
+};
+
+#define PHY_M_LED_BLINK_RT(x)  (       ((x)<<8) & PHY_M_LEDC_BL_R_MSK)
+
+enum {
+       BLINK_42MS      = 0,/* 42 ms */
+       BLINK_84MS      = 1,/* 84 ms */
+       BLINK_170MS     = 2,/* 170 ms */
+       BLINK_340MS     = 3,/* 340 ms */
+       BLINK_670MS     = 4,/* 670 ms */
+};
+
+/*****  PHY_MARV_LED_OVER      16 bit r/w      Manual LED Override Reg *****/
+#define PHY_M_LED_MO_SGMII(x)  ((x)<<14) /* Bit 15..14:  SGMII AN Timer */
+                                                                               /* Bit 13..12:  reserved */
+#define PHY_M_LED_MO_DUP(x)    ((x)<<10) /* Bit 11..10:  Duplex */
+#define PHY_M_LED_MO_10(x)     ((x)<<8) /* Bit  9.. 8:  Link 10 */
+#define PHY_M_LED_MO_100(x)    ((x)<<6) /* Bit  7.. 6:  Link 100 */
+#define PHY_M_LED_MO_1000(x)   ((x)<<4) /* Bit  5.. 4:  Link 1000 */
+#define PHY_M_LED_MO_RX(x)     ((x)<<2) /* Bit  3.. 2:  Rx */
+#define PHY_M_LED_MO_TX(x)     ((x)<<0) /* Bit  1.. 0:  Tx */
+
+enum {
+       MO_LED_NORM     = 0,
+       MO_LED_BLINK    = 1,
+       MO_LED_OFF      = 2,
+       MO_LED_ON       = 3,
+};
+
+/*****  PHY_MARV_EXT_CTRL_2    16 bit r/w      Ext. PHY Specific Ctrl 2 *****/
+enum {
+       PHY_M_EC2_FI_IMPED      = 1<<6, /* Fiber Input  Impedance */
+       PHY_M_EC2_FO_IMPED      = 1<<5, /* Fiber Output Impedance */
+       PHY_M_EC2_FO_M_CLK      = 1<<4, /* Fiber Mode Clock Enable */
+       PHY_M_EC2_FO_BOOST      = 1<<3, /* Fiber Output Boost */
+       PHY_M_EC2_FO_AM_MSK     = 7,/* Bit  2.. 0:      Fiber Output Amplitude */
+};
+
+/*****  PHY_MARV_EXT_P_STAT 16 bit r/w Ext. PHY Specific Status *****/
+enum {
+       PHY_M_FC_AUTO_SEL       = 1<<15, /* Fiber/Copper Auto Sel. Dis. */
+       PHY_M_FC_AN_REG_ACC     = 1<<14, /* Fiber/Copper AN Reg. Access */
+       PHY_M_FC_RESOLUTION     = 1<<13, /* Fiber/Copper Resolution */
+       PHY_M_SER_IF_AN_BP      = 1<<12, /* Ser. IF AN Bypass Enable */
+       PHY_M_SER_IF_BP_ST      = 1<<11, /* Ser. IF AN Bypass Status */
+       PHY_M_IRQ_POLARITY      = 1<<10, /* IRQ polarity */
+       PHY_M_DIS_AUT_MED       = 1<<9, /* Disable Aut. Medium Reg. Selection */
+                                                                       /* (88E1111 only) */
+                                                               /* Bit  9.. 4: reserved (88E1011 only) */
+       PHY_M_UNDOC1    = 1<<7, /* undocumented bit !! */
+       PHY_M_DTE_POW_STAT      = 1<<4, /* DTE Power Status (88E1111 only) */
+       PHY_M_MODE_MASK = 0xf, /* Bit  3.. 0: copy of HWCFG MODE[3:0] */
+};
+
+/*****  PHY_MARV_CABLE_DIAG    16 bit r/o      Cable Diagnostic Reg *****/
+enum {
+       PHY_M_CABD_ENA_TEST     = 1<<15, /* Enable Test (Page 0) */
+       PHY_M_CABD_DIS_WAIT     = 1<<15, /* Disable Waiting Period (Page 1) */
+                                       /* (88E1111 only) */
+       PHY_M_CABD_STAT_MSK     = 3<<13, /* Bit 14..13: Status Mask */
+       PHY_M_CABD_AMPL_MSK     = 0x1f<<8,/* Bit 12.. 8: Amplitude Mask */
+                                       /* (88E1111 only) */
+       PHY_M_CABD_DIST_MSK     = 0xff, /* Bit  7.. 0: Distance Mask */
+};
+
+/* values for Cable Diagnostic Status (11=fail; 00=OK; 10=open; 01=short) */
+enum {
+       CABD_STAT_NORMAL= 0,
+       CABD_STAT_SHORT = 1,
+       CABD_STAT_OPEN  = 2,
+       CABD_STAT_FAIL  = 3,
+};
+
+/* for 10/100 Fast Ethernet PHY (88E3082 only) */
+/*****  PHY_MARV_FE_LED_PAR            16 bit r/w      LED Parallel Select Reg. *****/
+                                                                       /* Bit 15..12: reserved (used internally) */
+enum {
+       PHY_M_FELP_LED2_MSK = 0xf<<8,   /* Bit 11.. 8: LED2 Mask (LINK) */
+       PHY_M_FELP_LED1_MSK = 0xf<<4,   /* Bit  7.. 4: LED1 Mask (ACT) */
+       PHY_M_FELP_LED0_MSK = 0xf, /* Bit  3.. 0: LED0 Mask (SPEED) */
+};
+
+#define PHY_M_FELP_LED2_CTRL(x)        (       ((x)<<8) & PHY_M_FELP_LED2_MSK)
+#define PHY_M_FELP_LED1_CTRL(x)        (       ((x)<<4) & PHY_M_FELP_LED1_MSK)
+#define PHY_M_FELP_LED0_CTRL(x)        (       ((x)<<0) & PHY_M_FELP_LED0_MSK)
+
+enum {
+       LED_PAR_CTRL_COLX       = 0x00,
+       LED_PAR_CTRL_ERROR      = 0x01,
+       LED_PAR_CTRL_DUPLEX     = 0x02,
+       LED_PAR_CTRL_DP_COL     = 0x03,
+       LED_PAR_CTRL_SPEED      = 0x04,
+       LED_PAR_CTRL_LINK       = 0x05,
+       LED_PAR_CTRL_TX         = 0x06,
+       LED_PAR_CTRL_RX         = 0x07,
+       LED_PAR_CTRL_ACT        = 0x08,
+       LED_PAR_CTRL_LNK_RX     = 0x09,
+       LED_PAR_CTRL_LNK_AC     = 0x0a,
+       LED_PAR_CTRL_ACT_BL     = 0x0b,
+       LED_PAR_CTRL_TX_BL      = 0x0c,
+       LED_PAR_CTRL_RX_BL      = 0x0d,
+       LED_PAR_CTRL_COL_BL     = 0x0e,
+       LED_PAR_CTRL_INACT      = 0x0f
+};
+
+/*****,PHY_MARV_FE_SPEC_2              16 bit r/w      Specific Control Reg. 2 *****/
+enum {
+       PHY_M_FESC_DIS_WAIT     = 1<<2, /* Disable TDR Waiting Period */
+       PHY_M_FESC_ENA_MCLK     = 1<<1, /* Enable MAC Rx Clock in sleep mode */
+       PHY_M_FESC_SEL_CL_A     = 1<<0, /* Select Class A driver (100B-TX) */
+};
+
+/* for Yukon-2 Gigabit Ethernet PHY (88E1112 only) */
+/*****  PHY_MARV_PHY_CTRL (page 2)             16 bit r/w      MAC Specific Ctrl *****/
+enum {
+       PHY_M_MAC_MD_MSK        = 7<<7, /* Bit  9.. 7: Mode Select Mask */
+       PHY_M_MAC_MD_AUTO       = 3,/* Auto Copper/1000Base-X */
+       PHY_M_MAC_MD_COPPER     = 5,/* Copper only */
+       PHY_M_MAC_MD_1000BX     = 7,/* 1000Base-X only */
+};
+#define PHY_M_MAC_MODE_SEL(x)  (       ((x)<<7) & PHY_M_MAC_MD_MSK)
+
+/*****  PHY_MARV_PHY_CTRL (page 3)             16 bit r/w      LED Control Reg. *****/
+enum {
+       PHY_M_LEDC_LOS_MSK      = 0xf<<12,/* Bit 15..12: LOS LED Ctrl. Mask */
+       PHY_M_LEDC_INIT_MSK     = 0xf<<8, /* Bit 11.. 8: INIT LED Ctrl. Mask */
+       PHY_M_LEDC_STA1_MSK     = 0xf<<4,/* Bit  7.. 4: STAT1 LED Ctrl. Mask */
+       PHY_M_LEDC_STA0_MSK     = 0xf, /* Bit  3.. 0: STAT0 LED Ctrl. Mask */
+};
+
+#define PHY_M_LEDC_LOS_CTRL(x) (       ((x)<<12) & PHY_M_LEDC_LOS_MSK)
+#define PHY_M_LEDC_INIT_CTRL(x)        (       ((x)<<8) & PHY_M_LEDC_INIT_MSK)
+#define PHY_M_LEDC_STA1_CTRL(x)        (       ((x)<<4) & PHY_M_LEDC_STA1_MSK)
+#define PHY_M_LEDC_STA0_CTRL(x)        (       ((x)<<0) & PHY_M_LEDC_STA0_MSK)
+
+/* GMAC registers  */
+/* Port Registers */
+enum {
+       GM_GP_STAT      = 0x0000,       /* 16 bit r/o   General Purpose Status */
+       GM_GP_CTRL      = 0x0004,       /* 16 bit r/w   General Purpose Control */
+       GM_TX_CTRL      = 0x0008,       /* 16 bit r/w   Transmit Control Reg. */
+       GM_RX_CTRL      = 0x000c,       /* 16 bit r/w   Receive Control Reg. */
+       GM_TX_FLOW_CTRL = 0x0010,       /* 16 bit r/w   Transmit Flow-Control */
+       GM_TX_PARAM     = 0x0014,       /* 16 bit r/w   Transmit Parameter Reg. */
+       GM_SERIAL_MODE  = 0x0018,       /* 16 bit r/w   Serial Mode Register */
+/* Source Address Registers */
+       GM_SRC_ADDR_1L  = 0x001c,       /* 16 bit r/w   Source Address 1 (low) */
+       GM_SRC_ADDR_1M  = 0x0020,       /* 16 bit r/w   Source Address 1 (middle) */
+       GM_SRC_ADDR_1H  = 0x0024,       /* 16 bit r/w   Source Address 1 (high) */
+       GM_SRC_ADDR_2L  = 0x0028,       /* 16 bit r/w   Source Address 2 (low) */
+       GM_SRC_ADDR_2M  = 0x002c,       /* 16 bit r/w   Source Address 2 (middle) */
+       GM_SRC_ADDR_2H  = 0x0030,       /* 16 bit r/w   Source Address 2 (high) */
+
+/* Multicast Address Hash Registers */
+       GM_MC_ADDR_H1   = 0x0034,       /* 16 bit r/w   Multicast Address Hash 1 */
+       GM_MC_ADDR_H2   = 0x0038,       /* 16 bit r/w   Multicast Address Hash 2 */
+       GM_MC_ADDR_H3   = 0x003c,       /* 16 bit r/w   Multicast Address Hash 3 */
+       GM_MC_ADDR_H4   = 0x0040,       /* 16 bit r/w   Multicast Address Hash 4 */
+
+/* Interrupt Source Registers */
+       GM_TX_IRQ_SRC   = 0x0044,       /* 16 bit r/o   Tx Overflow IRQ Source */
+       GM_RX_IRQ_SRC   = 0x0048,       /* 16 bit r/o   Rx Overflow IRQ Source */
+       GM_TR_IRQ_SRC   = 0x004c,       /* 16 bit r/o   Tx/Rx Over. IRQ Source */
+
+/* Interrupt Mask Registers */
+       GM_TX_IRQ_MSK   = 0x0050,       /* 16 bit r/w   Tx Overflow IRQ Mask */
+       GM_RX_IRQ_MSK   = 0x0054,       /* 16 bit r/w   Rx Overflow IRQ Mask */
+       GM_TR_IRQ_MSK   = 0x0058,       /* 16 bit r/w   Tx/Rx Over. IRQ Mask */
+
+/* Serial Management Interface (SMI) Registers */
+       GM_SMI_CTRL     = 0x0080,       /* 16 bit r/w   SMI Control Register */
+       GM_SMI_DATA     = 0x0084,       /* 16 bit r/w   SMI Data Register */
+       GM_PHY_ADDR     = 0x0088,       /* 16 bit r/w   GPHY Address Register */
+};
+
+/* MIB Counters */
+#define GM_MIB_CNT_BASE        0x0100          /* Base Address of MIB Counters */
+#define GM_MIB_CNT_SIZE        44              /* Number of MIB Counters */
+
+/*
+ * MIB Counters base address definitions (low word) -
+ * use offset 4 for access to high word        (32 bit r/o)
+ */
+enum {
+       GM_RXF_UC_OK  = GM_MIB_CNT_BASE + 0,    /* Unicast Frames Received OK */
+       GM_RXF_BC_OK    = GM_MIB_CNT_BASE + 8,  /* Broadcast Frames Received OK */
+       GM_RXF_MPAUSE   = GM_MIB_CNT_BASE + 16, /* Pause MAC Ctrl Frames Received */
+       GM_RXF_MC_OK    = GM_MIB_CNT_BASE + 24, /* Multicast Frames Received OK */
+       GM_RXF_FCS_ERR  = GM_MIB_CNT_BASE + 32, /* Rx Frame Check Seq. Error */
+       /* GM_MIB_CNT_BASE + 40:        reserved */
+       GM_RXO_OK_LO    = GM_MIB_CNT_BASE + 48, /* Octets Received OK Low */
+       GM_RXO_OK_HI    = GM_MIB_CNT_BASE + 56, /* Octets Received OK High */
+       GM_RXO_ERR_LO   = GM_MIB_CNT_BASE + 64, /* Octets Received Invalid Low */
+       GM_RXO_ERR_HI   = GM_MIB_CNT_BASE + 72, /* Octets Received Invalid High */
+       GM_RXF_SHT      = GM_MIB_CNT_BASE + 80, /* Frames <64 Byte Received OK */
+       GM_RXE_FRAG     = GM_MIB_CNT_BASE + 88, /* Frames <64 Byte Received with FCS Err */
+       GM_RXF_64B      = GM_MIB_CNT_BASE + 96, /* 64 Byte Rx Frame */
+       GM_RXF_127B     = GM_MIB_CNT_BASE + 104,        /* 65-127 Byte Rx Frame */
+       GM_RXF_255B     = GM_MIB_CNT_BASE + 112,        /* 128-255 Byte Rx Frame */
+       GM_RXF_511B     = GM_MIB_CNT_BASE + 120,        /* 256-511 Byte Rx Frame */
+       GM_RXF_1023B    = GM_MIB_CNT_BASE + 128,        /* 512-1023 Byte Rx Frame */
+       GM_RXF_1518B    = GM_MIB_CNT_BASE + 136,        /* 1024-1518 Byte Rx Frame */
+       GM_RXF_MAX_SZ   = GM_MIB_CNT_BASE + 144,        /* 1519-MaxSize Byte Rx Frame */
+       GM_RXF_LNG_ERR  = GM_MIB_CNT_BASE + 152,        /* Rx Frame too Long Error */
+       GM_RXF_JAB_PKT  = GM_MIB_CNT_BASE + 160,        /* Rx Jabber Packet Frame */
+       /* GM_MIB_CNT_BASE + 168:       reserved */
+       GM_RXE_FIFO_OV  = GM_MIB_CNT_BASE + 176,        /* Rx FIFO overflow Event */
+       /* GM_MIB_CNT_BASE + 184:       reserved */
+       GM_TXF_UC_OK    = GM_MIB_CNT_BASE + 192,        /* Unicast Frames Xmitted OK */
+       GM_TXF_BC_OK    = GM_MIB_CNT_BASE + 200,        /* Broadcast Frames Xmitted OK */
+       GM_TXF_MPAUSE   = GM_MIB_CNT_BASE + 208,        /* Pause MAC Ctrl Frames Xmitted */
+       GM_TXF_MC_OK    = GM_MIB_CNT_BASE + 216,        /* Multicast Frames Xmitted OK */
+       GM_TXO_OK_LO    = GM_MIB_CNT_BASE + 224,        /* Octets Transmitted OK Low */
+       GM_TXO_OK_HI    = GM_MIB_CNT_BASE + 232,        /* Octets Transmitted OK High */
+       GM_TXF_64B      = GM_MIB_CNT_BASE + 240,        /* 64 Byte Tx Frame */
+       GM_TXF_127B     = GM_MIB_CNT_BASE + 248,        /* 65-127 Byte Tx Frame */
+       GM_TXF_255B     = GM_MIB_CNT_BASE + 256,        /* 128-255 Byte Tx Frame */
+       GM_TXF_511B     = GM_MIB_CNT_BASE + 264,        /* 256-511 Byte Tx Frame */
+       GM_TXF_1023B    = GM_MIB_CNT_BASE + 272,        /* 512-1023 Byte Tx Frame */
+       GM_TXF_1518B    = GM_MIB_CNT_BASE + 280,        /* 1024-1518 Byte Tx Frame */
+       GM_TXF_MAX_SZ   = GM_MIB_CNT_BASE + 288,        /* 1519-MaxSize Byte Tx Frame */
+
+       GM_TXF_COL      = GM_MIB_CNT_BASE + 304,        /* Tx Collision */
+       GM_TXF_LAT_COL  = GM_MIB_CNT_BASE + 312,        /* Tx Late Collision */
+       GM_TXF_ABO_COL  = GM_MIB_CNT_BASE + 320,        /* Tx aborted due to Exces. Col. */
+       GM_TXF_MUL_COL  = GM_MIB_CNT_BASE + 328,        /* Tx Multiple Collision */
+       GM_TXF_SNG_COL  = GM_MIB_CNT_BASE + 336,        /* Tx Single Collision */
+       GM_TXE_FIFO_UR  = GM_MIB_CNT_BASE + 344,        /* Tx FIFO Underrun Event */
+};
+
+/* GMAC Bit Definitions */
+/*     GM_GP_STAT      16 bit r/o      General Purpose Status Register */
+enum {
+       GM_GPSR_SPEED           = 1<<15, /* Bit 15:     Port Speed (1 = 100 Mbps) */
+       GM_GPSR_DUPLEX          = 1<<14, /* Bit 14:     Duplex Mode (1 = Full) */
+       GM_GPSR_FC_TX_DIS       = 1<<13, /* Bit 13:     Tx Flow-Control Mode Disabled */
+       GM_GPSR_LINK_UP         = 1<<12, /* Bit 12:     Link Up Status */
+       GM_GPSR_PAUSE           = 1<<11, /* Bit 11:     Pause State */
+       GM_GPSR_TX_ACTIVE       = 1<<10, /* Bit 10:     Tx in Progress */
+       GM_GPSR_EXC_COL         = 1<<9, /* Bit  9:      Excessive Collisions Occured */
+       GM_GPSR_LAT_COL         = 1<<8, /* Bit  8:      Late Collisions Occured */
+
+       GM_GPSR_PHY_ST_CH       = 1<<5, /* Bit  5:      PHY Status Change */
+       GM_GPSR_GIG_SPEED       = 1<<4, /* Bit  4:      Gigabit Speed (1 = 1000 Mbps) */
+       GM_GPSR_PART_MODE       = 1<<3, /* Bit  3:      Partition mode */
+       GM_GPSR_FC_RX_DIS       = 1<<2, /* Bit  2:      Rx Flow-Control Mode Disabled */
+       GM_GPSR_PROM_EN         = 1<<1, /* Bit  1:      Promiscuous Mode Enabled */
+};
+       
+/*     GM_GP_CTRL      16 bit r/w      General Purpose Control Register */
+enum {
+       GM_GPCR_PROM_ENA        = 1<<14,        /* Bit 14:      Enable Promiscuous Mode */
+       GM_GPCR_FC_TX_DIS       = 1<<13, /* Bit 13:     Disable Tx Flow-Control Mode */
+       GM_GPCR_TX_ENA          = 1<<12, /* Bit 12:     Enable Transmit */
+       GM_GPCR_RX_ENA          = 1<<11, /* Bit 11:     Enable Receive */
+       GM_GPCR_BURST_ENA       = 1<<10, /* Bit 10:     Enable Burst Mode */
+       GM_GPCR_LOOP_ENA        = 1<<9, /* Bit  9:      Enable MAC Loopback Mode */
+       GM_GPCR_PART_ENA        = 1<<8, /* Bit  8:      Enable Partition Mode */
+       GM_GPCR_GIGS_ENA        = 1<<7, /* Bit  7:      Gigabit Speed (1000 Mbps) */
+       GM_GPCR_FL_PASS         = 1<<6, /* Bit  6:      Force Link Pass */
+       GM_GPCR_DUP_FULL        = 1<<5, /* Bit  5:      Full Duplex Mode */
+       GM_GPCR_FC_RX_DIS       = 1<<4, /* Bit  4:      Disable Rx Flow-Control Mode */
+       GM_GPCR_SPEED_100       = 1<<3,   /* Bit  3:    Port Speed 100 Mbps */
+       GM_GPCR_AU_DUP_DIS      = 1<<2, /* Bit  2:      Disable Auto-Update Duplex */
+       GM_GPCR_AU_FCT_DIS      = 1<<1, /* Bit  1:      Disable Auto-Update Flow-C. */
+       GM_GPCR_AU_SPD_DIS      = 1<<0, /* Bit  0:      Disable Auto-Update Speed */
+};
+
+#define GM_GPCR_SPEED_1000     (GM_GPCR_GIGS_ENA | GM_GPCR_SPEED_100)
+#define GM_GPCR_AU_ALL_DIS     (GM_GPCR_AU_DUP_DIS | GM_GPCR_AU_FCT_DIS|GM_GPCR_AU_SPD_DIS)
+       
+/*     GM_TX_CTRL                      16 bit r/w      Transmit Control Register */
+enum {
+       GM_TXCR_FORCE_JAM       = 1<<15, /* Bit 15:     Force Jam / Flow-Control */
+       GM_TXCR_CRC_DIS         = 1<<14, /* Bit 14:     Disable insertion of CRC */
+       GM_TXCR_PAD_DIS         = 1<<13, /* Bit 13:     Disable padding of packets */
+       GM_TXCR_COL_THR_MSK     = 1<<10, /* Bit 12..10: Collision Threshold */
+};
+
+#define TX_COL_THR(x)          (((x)<<10) & GM_TXCR_COL_THR_MSK)
+#define TX_COL_DEF             0x04
+       
+/*     GM_RX_CTRL                      16 bit r/w      Receive Control Register */
+enum {
+       GM_RXCR_UCF_ENA = 1<<15, /* Bit 15:     Enable Unicast filtering */
+       GM_RXCR_MCF_ENA = 1<<14, /* Bit 14:     Enable Multicast filtering */
+       GM_RXCR_CRC_DIS = 1<<13, /* Bit 13:     Remove 4-byte CRC */
+       GM_RXCR_PASS_FC = 1<<12, /* Bit 12:     Pass FC packets to FIFO */
+};
+       
+/*     GM_TX_PARAM             16 bit r/w      Transmit Parameter Register */
+enum {
+       GM_TXPA_JAMLEN_MSK      = 0x03<<14,     /* Bit 15..14:  Jam Length */
+       GM_TXPA_JAMIPG_MSK      = 0x1f<<9,      /* Bit 13..9:   Jam IPG */
+       GM_TXPA_JAMDAT_MSK      = 0x1f<<4,      /* Bit  8..4:   IPG Jam to Data */
+
+       TX_JAM_LEN_DEF          = 0x03,
+       TX_JAM_IPG_DEF          = 0x0b,
+       TX_IPG_JAM_DEF          = 0x1c,
+};
+
+#define TX_JAM_LEN_VAL(x)      (((x)<<14) & GM_TXPA_JAMLEN_MSK)
+#define TX_JAM_IPG_VAL(x)      (((x)<<9)  & GM_TXPA_JAMIPG_MSK)
+#define TX_IPG_JAM_DATA(x)     (((x)<<4)  & GM_TXPA_JAMDAT_MSK)
+
+
+/*     GM_SERIAL_MODE                  16 bit r/w      Serial Mode Register */
+enum {
+       GM_SMOD_DATABL_MSK      = 0x1f<<11, /* Bit 15..11:      Data Blinder (r/o) */
+       GM_SMOD_LIMIT_4         = 1<<10, /* Bit 10:     4 consecutive Tx trials */
+       GM_SMOD_VLAN_ENA        = 1<<9, /* Bit  9:      Enable VLAN  (Max. Frame Len) */
+       GM_SMOD_JUMBO_ENA       = 1<<8, /* Bit  8:      Enable Jumbo (Max. Frame Len) */
+        GM_SMOD_IPG_MSK        = 0x1f  /* Bit 4..0:    Inter-Packet Gap (IPG) */
+};
+       
+#define DATA_BLIND_VAL(x)      (((x)<<11) & GM_SMOD_DATABL_MSK)
+#define DATA_BLIND_DEF         0x04
+
+#define IPG_DATA_VAL(x)                (x & GM_SMOD_IPG_MSK)
+#define IPG_DATA_DEF           0x1e
+
+/*     GM_SMI_CTRL                     16 bit r/w      SMI Control Register */
+enum {
+       GM_SMI_CT_PHY_A_MSK     = 0x1f<<11,/* Bit 15..11:       PHY Device Address */
+       GM_SMI_CT_REG_A_MSK     = 0x1f<<6,/* Bit 10.. 6:        PHY Register Address */
+       GM_SMI_CT_OP_RD         = 1<<5, /* Bit  5:      OpCode Read (0=Write)*/
+       GM_SMI_CT_RD_VAL        = 1<<4, /* Bit  4:      Read Valid (Read completed) */
+       GM_SMI_CT_BUSY          = 1<<3, /* Bit  3:      Busy (Operation in progress) */
+};
+       
+#define GM_SMI_CT_PHY_AD(x)    (((x)<<11) & GM_SMI_CT_PHY_A_MSK)
+#define GM_SMI_CT_REG_AD(x)    (((x)<<6) & GM_SMI_CT_REG_A_MSK)
+
+/*     GM_PHY_ADDR                             16 bit r/w      GPHY Address Register */
+enum {
+       GM_PAR_MIB_CLR  = 1<<5, /* Bit  5:      Set MIB Clear Counter Mode */
+       GM_PAR_MIB_TST  = 1<<4, /* Bit  4:      MIB Load Counter (Test Mode) */
+};
+       
+/* Receive Frame Status Encoding */
+enum {
+       GMR_FS_LEN      = 0xffff<<16, /* Bit 31..16:    Rx Frame Length */
+       GMR_FS_VLAN     = 1<<13, /* Bit 13:     VLAN Packet */
+       GMR_FS_JABBER   = 1<<12, /* Bit 12:     Jabber Packet */
+       GMR_FS_UN_SIZE  = 1<<11, /* Bit 11:     Undersize Packet */
+       GMR_FS_MC       = 1<<10, /* Bit 10:     Multicast Packet */
+       GMR_FS_BC       = 1<<9, /* Bit  9:      Broadcast Packet */
+       GMR_FS_RX_OK    = 1<<8, /* Bit  8:      Receive OK (Good Packet) */
+       GMR_FS_GOOD_FC  = 1<<7, /* Bit  7:      Good Flow-Control Packet */
+       GMR_FS_BAD_FC   = 1<<6, /* Bit  6:      Bad  Flow-Control Packet */
+       GMR_FS_MII_ERR  = 1<<5, /* Bit  5:      MII Error */
+       GMR_FS_LONG_ERR = 1<<4, /* Bit  4:      Too Long Packet */
+       GMR_FS_FRAGMENT = 1<<3, /* Bit  3:      Fragment */
+
+       GMR_FS_CRC_ERR  = 1<<1, /* Bit  1:      CRC Error */
+       GMR_FS_RX_FF_OV = 1<<0, /* Bit  0:      Rx FIFO Overflow */
+
+/*
+ * GMR_FS_ANY_ERR (analogous to XMR_FS_ANY_ERR)
+ */
+       GMR_FS_ANY_ERR  = GMR_FS_CRC_ERR | GMR_FS_LONG_ERR | 
+                         GMR_FS_MII_ERR | GMR_FS_BAD_FC | GMR_FS_GOOD_FC | 
+                         GMR_FS_JABBER,
+/* Rx GMAC FIFO Flush Mask (default) */
+       RX_FF_FL_DEF_MSK = GMR_FS_CRC_ERR | GMR_FS_RX_FF_OV |GMR_FS_MII_ERR |
+                          GMR_FS_BAD_FC | GMR_FS_GOOD_FC | GMR_FS_UN_SIZE | 
+                          GMR_FS_JABBER,
+};
+
+/*     RX_GMF_CTRL_T   32 bit  Rx GMAC FIFO Control/Test */
+enum {
+       GMF_WP_TST_ON   = 1<<14,        /* Write Pointer Test On */
+       GMF_WP_TST_OFF  = 1<<13,        /* Write Pointer Test Off */
+       GMF_WP_STEP     = 1<<12,        /* Write Pointer Step/Increment */
+
+       GMF_RP_TST_ON   = 1<<10,        /* Read Pointer Test On */
+       GMF_RP_TST_OFF  = 1<<9,         /* Read Pointer Test Off */
+       GMF_RP_STEP     = 1<<8,         /* Read Pointer Step/Increment */
+       GMF_RX_F_FL_ON  = 1<<7,         /* Rx FIFO Flush Mode On */
+       GMF_RX_F_FL_OFF = 1<<6,         /* Rx FIFO Flush Mode Off */
+       GMF_CLI_RX_FO   = 1<<5,         /* Clear IRQ Rx FIFO Overrun */
+       GMF_CLI_RX_FC   = 1<<4,         /* Clear IRQ Rx Frame Complete */
+       GMF_OPER_ON     = 1<<3,         /* Operational Mode On */
+       GMF_OPER_OFF    = 1<<2,         /* Operational Mode Off */
+       GMF_RST_CLR     = 1<<1,         /* Clear GMAC FIFO Reset */
+       GMF_RST_SET     = 1<<0,         /* Set   GMAC FIFO Reset */
+
+       RX_GMF_FL_THR_DEF = 0xa,        /* flush threshold (default) */
+};
+
+
+/*     TX_GMF_CTRL_T   32 bit  Tx GMAC FIFO Control/Test */
+enum {
+       GMF_WSP_TST_ON  = 1<<18,/* Write Shadow Pointer Test On */
+       GMF_WSP_TST_OFF = 1<<17,/* Write Shadow Pointer Test Off */
+       GMF_WSP_STEP    = 1<<16,/* Write Shadow Pointer Step/Increment */
+
+       GMF_CLI_TX_FU   = 1<<6, /* Clear IRQ Tx FIFO Underrun */
+       GMF_CLI_TX_FC   = 1<<5, /* Clear IRQ Tx Frame Complete */
+       GMF_CLI_TX_PE   = 1<<4, /* Clear IRQ Tx Parity Error */
+};
+
+/*     GMAC_TI_ST_CTRL  8 bit  Time Stamp Timer Ctrl Reg (YUKON only) */
+enum {
+       GMT_ST_START    = 1<<2, /* Start Time Stamp Timer */
+       GMT_ST_STOP     = 1<<1, /* Stop  Time Stamp Timer */
+       GMT_ST_CLR_IRQ  = 1<<0, /* Clear Time Stamp Timer IRQ */
+};
+
+/*     GMAC_CTRL               32 bit  GMAC Control Reg (YUKON only) */
+enum {
+       GMC_H_BURST_ON  = 1<<7, /* Half Duplex Burst Mode On */
+       GMC_H_BURST_OFF = 1<<6, /* Half Duplex Burst Mode Off */
+       GMC_F_LOOPB_ON  = 1<<5, /* FIFO Loopback On */
+       GMC_F_LOOPB_OFF = 1<<4, /* FIFO Loopback Off */
+       GMC_PAUSE_ON    = 1<<3, /* Pause On */
+       GMC_PAUSE_OFF   = 1<<2, /* Pause Off */
+       GMC_RST_CLR     = 1<<1, /* Clear GMAC Reset */
+       GMC_RST_SET     = 1<<0, /* Set   GMAC Reset */
+};
+
+/*     GPHY_CTRL               32 bit  GPHY Control Reg (YUKON only) */
+enum {
+       GPC_SEL_BDT     = 1<<28, /* Select Bi-Dir. Transfer for MDC/MDIO */
+       GPC_INT_POL_HI  = 1<<27, /* IRQ Polarity is Active HIGH */
+       GPC_75_OHM      = 1<<26, /* Use 75 Ohm Termination instead of 50 */
+       GPC_DIS_FC      = 1<<25, /* Disable Automatic Fiber/Copper Detection */
+       GPC_DIS_SLEEP   = 1<<24, /* Disable Energy Detect */
+       GPC_HWCFG_M_3   = 1<<23, /* HWCFG_MODE[3] */
+       GPC_HWCFG_M_2   = 1<<22, /* HWCFG_MODE[2] */
+       GPC_HWCFG_M_1   = 1<<21, /* HWCFG_MODE[1] */
+       GPC_HWCFG_M_0   = 1<<20, /* HWCFG_MODE[0] */
+       GPC_ANEG_0      = 1<<19, /* ANEG[0] */
+       GPC_ENA_XC      = 1<<18, /* Enable MDI crossover */
+       GPC_DIS_125     = 1<<17, /* Disable 125 MHz clock */
+       GPC_ANEG_3      = 1<<16, /* ANEG[3] */
+       GPC_ANEG_2      = 1<<15, /* ANEG[2] */
+       GPC_ANEG_1      = 1<<14, /* ANEG[1] */
+       GPC_ENA_PAUSE   = 1<<13, /* Enable Pause (SYM_OR_REM) */
+       GPC_PHYADDR_4   = 1<<12, /* Bit 4 of Phy Addr */
+       GPC_PHYADDR_3   = 1<<11, /* Bit 3 of Phy Addr */
+       GPC_PHYADDR_2   = 1<<10, /* Bit 2 of Phy Addr */
+       GPC_PHYADDR_1   = 1<<9,  /* Bit 1 of Phy Addr */
+       GPC_PHYADDR_0   = 1<<8,  /* Bit 0 of Phy Addr */
+                                               /* Bits  7..2:  reserved */
+       GPC_RST_CLR     = 1<<1, /* Clear GPHY Reset */
+       GPC_RST_SET     = 1<<0, /* Set   GPHY Reset */
+};
+
+#define GPC_HWCFG_GMII_COP (GPC_HWCFG_M_3|GPC_HWCFG_M_2 | GPC_HWCFG_M_1 | GPC_HWCFG_M_0)
+#define GPC_HWCFG_GMII_FIB (GPC_HWCFG_M_2 | GPC_HWCFG_M_1 | GPC_HWCFG_M_0)
+#define GPC_ANEG_ADV_ALL_M  (GPC_ANEG_3 | GPC_ANEG_2 | GPC_ANEG_1 | GPC_ANEG_0)
+
+/* forced speed and duplex mode (don't mix with other ANEG bits) */
+#define GPC_FRC10MBIT_HALF     0
+#define GPC_FRC10MBIT_FULL     GPC_ANEG_0
+#define GPC_FRC100MBIT_HALF    GPC_ANEG_1
+#define GPC_FRC100MBIT_FULL    (GPC_ANEG_0 | GPC_ANEG_1)
+
+/* auto-negotiation with limited advertised speeds */
+/* mix only with master/slave settings (for copper) */
+#define GPC_ADV_1000_HALF      GPC_ANEG_2
+#define GPC_ADV_1000_FULL      GPC_ANEG_3
+#define GPC_ADV_ALL            (GPC_ANEG_2 | GPC_ANEG_3)
+
+/* master/slave settings */
+/* only for copper with 1000 Mbps */
+#define GPC_FORCE_MASTER       0
+#define GPC_FORCE_SLAVE                GPC_ANEG_0
+#define GPC_PREF_MASTER                GPC_ANEG_1
+#define GPC_PREF_SLAVE         (GPC_ANEG_1 | GPC_ANEG_0)
+
+/*     GMAC_IRQ_SRC     8 bit  GMAC Interrupt Source Reg (YUKON only) */
+/*     GMAC_IRQ_MSK     8 bit  GMAC Interrupt Mask   Reg (YUKON only) */
+enum {
+       GM_IS_TX_CO_OV  = 1<<5, /* Transmit Counter Overflow IRQ */
+       GM_IS_RX_CO_OV  = 1<<4, /* Receive Counter Overflow IRQ */
+       GM_IS_TX_FF_UR  = 1<<3, /* Transmit FIFO Underrun */
+       GM_IS_TX_COMPL  = 1<<2, /* Frame Transmission Complete */
+       GM_IS_RX_FF_OR  = 1<<1, /* Receive FIFO Overrun */
+       GM_IS_RX_COMPL  = 1<<0, /* Frame Reception Complete */
+
+#define GMAC_DEF_MSK   (GM_IS_TX_CO_OV | GM_IS_RX_CO_OV | GM_IS_TX_FF_UR)
+
+/*     GMAC_LINK_CTRL  16 bit  GMAC Link Control Reg (YUKON only) */
+                                               /* Bits 15.. 2: reserved */
+       GMLC_RST_CLR    = 1<<1, /* Clear GMAC Link Reset */
+       GMLC_RST_SET    = 1<<0, /* Set   GMAC Link Reset */
+
+
+/*     WOL_CTRL_STAT   16 bit  WOL Control/Status Reg */
+       WOL_CTL_LINK_CHG_OCC            = 1<<15,
+       WOL_CTL_MAGIC_PKT_OCC           = 1<<14,
+       WOL_CTL_PATTERN_OCC             = 1<<13,
+       WOL_CTL_CLEAR_RESULT            = 1<<12,
+       WOL_CTL_ENA_PME_ON_LINK_CHG     = 1<<11,
+       WOL_CTL_DIS_PME_ON_LINK_CHG     = 1<<10,
+       WOL_CTL_ENA_PME_ON_MAGIC_PKT    = 1<<9,
+       WOL_CTL_DIS_PME_ON_MAGIC_PKT    = 1<<8,
+       WOL_CTL_ENA_PME_ON_PATTERN      = 1<<7,
+       WOL_CTL_DIS_PME_ON_PATTERN      = 1<<6,
+       WOL_CTL_ENA_LINK_CHG_UNIT       = 1<<5,
+       WOL_CTL_DIS_LINK_CHG_UNIT       = 1<<4,
+       WOL_CTL_ENA_MAGIC_PKT_UNIT      = 1<<3,
+       WOL_CTL_DIS_MAGIC_PKT_UNIT      = 1<<2,
+       WOL_CTL_ENA_PATTERN_UNIT        = 1<<1,
+       WOL_CTL_DIS_PATTERN_UNIT        = 1<<0,
+};
+
+#define WOL_CTL_DEFAULT                                \
+       (WOL_CTL_DIS_PME_ON_LINK_CHG |  \
+       WOL_CTL_DIS_PME_ON_PATTERN |    \
+       WOL_CTL_DIS_PME_ON_MAGIC_PKT |  \
+       WOL_CTL_DIS_LINK_CHG_UNIT |             \
+       WOL_CTL_DIS_PATTERN_UNIT |              \
+       WOL_CTL_DIS_MAGIC_PKT_UNIT)
+
+/*     WOL_MATCH_CTL    8 bit  WOL Match Control Reg */
+#define WOL_CTL_PATT_ENA(x)    (1 << (x))
+
+
+/* XMAC II registers                                 */
+enum {
+       XM_MMU_CMD      = 0x0000, /* 16 bit r/w MMU Command Register */
+       XM_POFF         = 0x0008, /* 32 bit r/w Packet Offset Register */
+       XM_BURST        = 0x000c, /* 32 bit r/w Burst Register for half duplex*/
+       XM_1L_VLAN_TAG  = 0x0010, /* 16 bit r/w One Level VLAN Tag ID */
+       XM_2L_VLAN_TAG  = 0x0014, /* 16 bit r/w Two Level VLAN Tag ID */
+       XM_TX_CMD       = 0x0020, /* 16 bit r/w Transmit Command Register */
+       XM_TX_RT_LIM    = 0x0024, /* 16 bit r/w Transmit Retry Limit Register */
+       XM_TX_STIME     = 0x0028, /* 16 bit r/w Transmit Slottime Register */
+       XM_TX_IPG       = 0x002c, /* 16 bit r/w Transmit Inter Packet Gap */
+       XM_RX_CMD       = 0x0030, /* 16 bit r/w Receive Command Register */
+       XM_PHY_ADDR     = 0x0034, /* 16 bit r/w PHY Address Register */
+       XM_PHY_DATA     = 0x0038, /* 16 bit r/w PHY Data Register */
+       XM_GP_PORT      = 0x0040, /* 32 bit r/w General Purpose Port Register */
+       XM_IMSK         = 0x0044, /* 16 bit r/w Interrupt Mask Register */
+       XM_ISRC         = 0x0048, /* 16 bit r/o Interrupt Status Register */
+       XM_HW_CFG       = 0x004c, /* 16 bit r/w Hardware Config Register */
+       XM_TX_LO_WM     = 0x0060, /* 16 bit r/w Tx FIFO Low Water Mark */
+       XM_TX_HI_WM     = 0x0062, /* 16 bit r/w Tx FIFO High Water Mark */
+       XM_TX_THR       = 0x0064, /* 16 bit r/w Tx Request Threshold */
+       XM_HT_THR       = 0x0066, /* 16 bit r/w Host Request Threshold */
+       XM_PAUSE_DA     = 0x0068, /* NA reg r/w Pause Destination Address */
+       XM_CTL_PARA     = 0x0070, /* 32 bit r/w Control Parameter Register */
+       XM_MAC_OPCODE   = 0x0074, /* 16 bit r/w Opcode for MAC control frames */
+       XM_MAC_PTIME    = 0x0076, /* 16 bit r/w Pause time for MAC ctrl frames*/
+       XM_TX_STAT      = 0x0078, /* 32 bit r/o Tx Status LIFO Register */
+
+       XM_EXM_START    = 0x0080, /* r/w        Start Address of the EXM Regs */
+#define XM_EXM(reg)    (XM_EXM_START + ((reg) << 3))
+};
+
+enum {
+       XM_SRC_CHK      = 0x0100, /* NA reg r/w Source Check Address Register */
+       XM_SA           = 0x0108, /* NA reg r/w Station Address Register */
+       XM_HSM          = 0x0110, /* 64 bit r/w Hash Match Address Registers */
+       XM_RX_LO_WM     = 0x0118, /* 16 bit r/w Receive Low Water Mark */
+       XM_RX_HI_WM     = 0x011a, /* 16 bit r/w Receive High Water Mark */
+       XM_RX_THR       = 0x011c, /* 32 bit r/w Receive Request Threshold */
+       XM_DEV_ID       = 0x0120, /* 32 bit r/o Device ID Register */
+       XM_MODE         = 0x0124, /* 32 bit r/w Mode Register */
+       XM_LSA          = 0x0128, /* NA reg r/o Last Source Register */
+       XM_TS_READ      = 0x0130, /* 32 bit r/o Time Stamp Read Register */
+       XM_TS_LOAD      = 0x0134, /* 32 bit r/o Time Stamp Load Value */
+       XM_STAT_CMD     = 0x0200, /* 16 bit r/w Statistics Command Register */
+       XM_RX_CNT_EV    = 0x0204, /* 32 bit r/o Rx Counter Event Register */
+       XM_TX_CNT_EV    = 0x0208, /* 32 bit r/o Tx Counter Event Register */
+       XM_RX_EV_MSK    = 0x020c, /* 32 bit r/w Rx Counter Event Mask */
+       XM_TX_EV_MSK    = 0x0210, /* 32 bit r/w Tx Counter Event Mask */
+       XM_TXF_OK       = 0x0280, /* 32 bit r/o Frames Transmitted OK Conuter */
+       XM_TXO_OK_HI    = 0x0284, /* 32 bit r/o Octets Transmitted OK High Cnt*/
+       XM_TXO_OK_LO    = 0x0288, /* 32 bit r/o Octets Transmitted OK Low Cnt */
+       XM_TXF_BC_OK    = 0x028c, /* 32 bit r/o Broadcast Frames Xmitted OK */
+       XM_TXF_MC_OK    = 0x0290, /* 32 bit r/o Multicast Frames Xmitted OK */
+       XM_TXF_UC_OK    = 0x0294, /* 32 bit r/o Unicast Frames Xmitted OK */
+       XM_TXF_LONG     = 0x0298, /* 32 bit r/o Tx Long Frame Counter */
+       XM_TXE_BURST    = 0x029c, /* 32 bit r/o Tx Burst Event Counter */
+       XM_TXF_MPAUSE   = 0x02a0, /* 32 bit r/o Tx Pause MAC Ctrl Frame Cnt */
+       XM_TXF_MCTRL    = 0x02a4, /* 32 bit r/o Tx MAC Ctrl Frame Counter */
+       XM_TXF_SNG_COL  = 0x02a8, /* 32 bit r/o Tx Single Collision Counter */
+       XM_TXF_MUL_COL  = 0x02ac, /* 32 bit r/o Tx Multiple Collision Counter */
+       XM_TXF_ABO_COL  = 0x02b0, /* 32 bit r/o Tx aborted due to Exces. Col. */
+       XM_TXF_LAT_COL  = 0x02b4, /* 32 bit r/o Tx Late Collision Counter */
+       XM_TXF_DEF      = 0x02b8, /* 32 bit r/o Tx Deferred Frame Counter */
+       XM_TXF_EX_DEF   = 0x02bc, /* 32 bit r/o Tx Excessive Deferall Counter */
+       XM_TXE_FIFO_UR  = 0x02c0, /* 32 bit r/o Tx FIFO Underrun Event Cnt */
+       XM_TXE_CS_ERR   = 0x02c4, /* 32 bit r/o Tx Carrier Sense Error Cnt */
+       XM_TXP_UTIL     = 0x02c8, /* 32 bit r/o Tx Utilization in % */
+       XM_TXF_64B      = 0x02d0, /* 32 bit r/o 64 Byte Tx Frame Counter */
+       XM_TXF_127B     = 0x02d4, /* 32 bit r/o 65-127 Byte Tx Frame Counter */
+       XM_TXF_255B     = 0x02d8, /* 32 bit r/o 128-255 Byte Tx Frame Counter */
+       XM_TXF_511B     = 0x02dc, /* 32 bit r/o 256-511 Byte Tx Frame Counter */
+       XM_TXF_1023B    = 0x02e0, /* 32 bit r/o 512-1023 Byte Tx Frame Counter*/
+       XM_TXF_MAX_SZ   = 0x02e4, /* 32 bit r/o 1024-MaxSize Byte Tx Frame Cnt*/
+       XM_RXF_OK       = 0x0300, /* 32 bit r/o Frames Received OK */
+       XM_RXO_OK_HI    = 0x0304, /* 32 bit r/o Octets Received OK High Cnt */
+       XM_RXO_OK_LO    = 0x0308, /* 32 bit r/o Octets Received OK Low Counter*/
+       XM_RXF_BC_OK    = 0x030c, /* 32 bit r/o Broadcast Frames Received OK */
+       XM_RXF_MC_OK    = 0x0310, /* 32 bit r/o Multicast Frames Received OK */
+       XM_RXF_UC_OK    = 0x0314, /* 32 bit r/o Unicast Frames Received OK */
+       XM_RXF_MPAUSE   = 0x0318, /* 32 bit r/o Rx Pause MAC Ctrl Frame Cnt */
+       XM_RXF_MCTRL    = 0x031c, /* 32 bit r/o Rx MAC Ctrl Frame Counter */
+       XM_RXF_INV_MP   = 0x0320, /* 32 bit r/o Rx invalid Pause Frame Cnt */
+       XM_RXF_INV_MOC  = 0x0324, /* 32 bit r/o Rx Frames with inv. MAC Opcode*/
+       XM_RXE_BURST    = 0x0328, /* 32 bit r/o Rx Burst Event Counter */
+       XM_RXE_FMISS    = 0x032c, /* 32 bit r/o Rx Missed Frames Event Cnt */
+       XM_RXF_FRA_ERR  = 0x0330, /* 32 bit r/o Rx Framing Error Counter */
+       XM_RXE_FIFO_OV  = 0x0334, /* 32 bit r/o Rx FIFO overflow Event Cnt */
+       XM_RXF_JAB_PKT  = 0x0338, /* 32 bit r/o Rx Jabber Packet Frame Cnt */
+       XM_RXE_CAR_ERR  = 0x033c, /* 32 bit r/o Rx Carrier Event Error Cnt */
+       XM_RXF_LEN_ERR  = 0x0340, /* 32 bit r/o Rx in Range Length Error */
+       XM_RXE_SYM_ERR  = 0x0344, /* 32 bit r/o Rx Symbol Error Counter */
+       XM_RXE_SHT_ERR  = 0x0348, /* 32 bit r/o Rx Short Event Error Cnt */
+       XM_RXE_RUNT     = 0x034c, /* 32 bit r/o Rx Runt Event Counter */
+       XM_RXF_LNG_ERR  = 0x0350, /* 32 bit r/o Rx Frame too Long Error Cnt */
+       XM_RXF_FCS_ERR  = 0x0354, /* 32 bit r/o Rx Frame Check Seq. Error Cnt */
+       XM_RXF_CEX_ERR  = 0x035c, /* 32 bit r/o Rx Carrier Ext Error Frame Cnt*/
+       XM_RXP_UTIL     = 0x0360, /* 32 bit r/o Rx Utilization in % */
+       XM_RXF_64B      = 0x0368, /* 32 bit r/o 64 Byte Rx Frame Counter */
+       XM_RXF_127B     = 0x036c, /* 32 bit r/o 65-127 Byte Rx Frame Counter */
+       XM_RXF_255B     = 0x0370, /* 32 bit r/o 128-255 Byte Rx Frame Counter */
+       XM_RXF_511B     = 0x0374, /* 32 bit r/o 256-511 Byte Rx Frame Counter */
+       XM_RXF_1023B    = 0x0378, /* 32 bit r/o 512-1023 Byte Rx Frame Counter*/
+       XM_RXF_MAX_SZ   = 0x037c, /* 32 bit r/o 1024-MaxSize Byte Rx Frame Cnt*/
+};
+
+/*     XM_MMU_CMD      16 bit r/w      MMU Command Register */
+enum {
+       XM_MMU_PHY_RDY  = 1<<12,/* Bit 12:      PHY Read Ready */
+       XM_MMU_PHY_BUSY = 1<<11,/* Bit 11:      PHY Busy */
+       XM_MMU_IGN_PF   = 1<<10,/* Bit 10:      Ignore Pause Frame */
+       XM_MMU_MAC_LB   = 1<<9, /* Bit  9:      Enable MAC Loopback */
+       XM_MMU_FRC_COL  = 1<<7, /* Bit  7:      Force Collision */
+       XM_MMU_SIM_COL  = 1<<6, /* Bit  6:      Simulate Collision */
+       XM_MMU_NO_PRE   = 1<<5, /* Bit  5:      No MDIO Preamble */
+       XM_MMU_GMII_FD  = 1<<4, /* Bit  4:      GMII uses Full Duplex */
+       XM_MMU_RAT_CTRL = 1<<3, /* Bit  3:      Enable Rate Control */
+       XM_MMU_GMII_LOOP= 1<<2, /* Bit  2:      PHY is in Loopback Mode */
+       XM_MMU_ENA_RX   = 1<<1, /* Bit  1:      Enable Receiver */
+       XM_MMU_ENA_TX   = 1<<0, /* Bit  0:      Enable Transmitter */
+};
+
+
+/*     XM_TX_CMD       16 bit r/w      Transmit Command Register */
+enum {
+       XM_TX_BK2BK     = 1<<6, /* Bit  6:      Ignor Carrier Sense (Tx Bk2Bk)*/
+       XM_TX_ENC_BYP   = 1<<5, /* Bit  5:      Set Encoder in Bypass Mode */
+       XM_TX_SAM_LINE  = 1<<4, /* Bit  4: (sc) Start utilization calculation */
+       XM_TX_NO_GIG_MD = 1<<3, /* Bit  3:      Disable Carrier Extension */
+       XM_TX_NO_PRE    = 1<<2, /* Bit  2:      Disable Preamble Generation */
+       XM_TX_NO_CRC    = 1<<1, /* Bit  1:      Disable CRC Generation */
+       XM_TX_AUTO_PAD  = 1<<0, /* Bit  0:      Enable Automatic Padding */
+};
+
+/*     XM_TX_RT_LIM    16 bit r/w      Transmit Retry Limit Register */
+#define XM_RT_LIM_MSK  0x1f    /* Bit  4..0:   Tx Retry Limit */
+
+
+/*     XM_TX_STIME     16 bit r/w      Transmit Slottime Register */
+#define XM_STIME_MSK   0x7f    /* Bit  6..0:   Tx Slottime bits */
+
+
+/*     XM_TX_IPG       16 bit r/w      Transmit Inter Packet Gap */
+#define XM_IPG_MSK             0xff    /* Bit  7..0:   IPG value bits */
+
+
+/*     XM_RX_CMD       16 bit r/w      Receive Command Register */
+enum {
+       XM_RX_LENERR_OK = 1<<8, /* Bit  8       don't set Rx Err bit for */
+                               /*              inrange error packets */
+       XM_RX_BIG_PK_OK = 1<<7, /* Bit  7       don't set Rx Err bit for */
+                               /*              jumbo packets */
+       XM_RX_IPG_CAP   = 1<<6, /* Bit  6       repl. type field with IPG */
+       XM_RX_TP_MD     = 1<<5, /* Bit  5:      Enable transparent Mode */
+       XM_RX_STRIP_FCS = 1<<4, /* Bit  4:      Enable FCS Stripping */
+       XM_RX_SELF_RX   = 1<<3, /* Bit  3:      Enable Rx of own packets */
+       XM_RX_SAM_LINE  = 1<<2, /* Bit  2: (sc) Start utilization calculation */
+       XM_RX_STRIP_PAD = 1<<1, /* Bit  1:      Strip pad bytes of Rx frames */
+       XM_RX_DIS_CEXT  = 1<<0, /* Bit  0:      Disable carrier ext. check */
+};
+
+
+/*     XM_PHY_ADDR     16 bit r/w      PHY Address Register */
+#define XM_PHY_ADDR_SZ 0x1f    /* Bit  4..0:   PHY Address bits */
+
+
+/*     XM_GP_PORT      32 bit r/w      General Purpose Port Register */
+enum {
+       XM_GP_ANIP      = 1<<6, /* Bit  6: (ro) Auto-Neg. in progress */
+       XM_GP_FRC_INT   = 1<<5, /* Bit  5: (sc) Force Interrupt */
+       XM_GP_RES_MAC   = 1<<3, /* Bit  3: (sc) Reset MAC and FIFOs */
+       XM_GP_RES_STAT  = 1<<2, /* Bit  2: (sc) Reset the statistics module */
+       XM_GP_INP_ASS   = 1<<0, /* Bit  0: (ro) GP Input Pin asserted */
+};
+
+
+/*     XM_IMSK         16 bit r/w      Interrupt Mask Register */
+/*     XM_ISRC         16 bit r/o      Interrupt Status Register */
+enum {
+       XM_IS_LNK_AE    = 1<<14, /* Bit 14:     Link Asynchronous Event */
+       XM_IS_TX_ABORT  = 1<<13, /* Bit 13:     Transmit Abort, late Col. etc */
+       XM_IS_FRC_INT   = 1<<12, /* Bit 12:     Force INT bit set in GP */
+       XM_IS_INP_ASS   = 1<<11,        /* Bit 11:      Input Asserted, GP bit 0 set */
+       XM_IS_LIPA_RC   = 1<<10,        /* Bit 10:      Link Partner requests config */
+       XM_IS_RX_PAGE   = 1<<9, /* Bit  9:      Page Received */
+       XM_IS_TX_PAGE   = 1<<8, /* Bit  8:      Next Page Loaded for Transmit */
+       XM_IS_AND       = 1<<7, /* Bit  7:      Auto-Negotiation Done */
+       XM_IS_TSC_OV    = 1<<6, /* Bit  6:      Time Stamp Counter Overflow */
+       XM_IS_RXC_OV    = 1<<5, /* Bit  5:      Rx Counter Event Overflow */
+       XM_IS_TXC_OV    = 1<<4, /* Bit  4:      Tx Counter Event Overflow */
+       XM_IS_RXF_OV    = 1<<3, /* Bit  3:      Receive FIFO Overflow */
+       XM_IS_TXF_UR    = 1<<2, /* Bit  2:      Transmit FIFO Underrun */
+       XM_IS_TX_COMP   = 1<<1, /* Bit  1:      Frame Tx Complete */
+       XM_IS_RX_COMP   = 1<<0, /* Bit  0:      Frame Rx Complete */
+};
+
+#define XM_DEF_MSK     (~(XM_IS_INP_ASS | XM_IS_LIPA_RC | XM_IS_RX_PAGE | \
+                          XM_IS_AND | XM_IS_RXC_OV | XM_IS_TXC_OV | \
+                          XM_IS_RXF_OV | XM_IS_TXF_UR))
+
+
+/*     XM_HW_CFG       16 bit r/w      Hardware Config Register */
+enum {
+       XM_HW_GEN_EOP   = 1<<3, /* Bit  3:      generate End of Packet pulse */
+       XM_HW_COM4SIG   = 1<<2, /* Bit  2:      use Comma Detect for Sig. Det.*/
+       XM_HW_GMII_MD   = 1<<0, /* Bit  0:      GMII Interface selected */
+};
+
+
+/*     XM_TX_LO_WM     16 bit r/w      Tx FIFO Low Water Mark */
+/*     XM_TX_HI_WM     16 bit r/w      Tx FIFO High Water Mark */
+#define XM_TX_WM_MSK   0x01ff  /* Bit  9.. 0   Tx FIFO Watermark bits */
+
+/*     XM_TX_THR       16 bit r/w      Tx Request Threshold */
+/*     XM_HT_THR       16 bit r/w      Host Request Threshold */
+/*     XM_RX_THR       16 bit r/w      Rx Request Threshold */
+#define XM_THR_MSK             0x03ff  /* Bit 10.. 0   Rx/Tx Request Threshold bits */
+
+
+/*     XM_TX_STAT      32 bit r/o      Tx Status LIFO Register */
+enum {
+       XM_ST_VALID     = (1UL<<31),    /* Bit 31:      Status Valid */
+       XM_ST_BYTE_CNT  = (0x3fffL<<17),        /* Bit 30..17:  Tx frame Length */
+       XM_ST_RETRY_CNT = (0x1fL<<12),  /* Bit 16..12:  Retry Count */
+       XM_ST_EX_COL    = 1<<11,        /* Bit 11:      Excessive Collisions */
+       XM_ST_EX_DEF    = 1<<10,        /* Bit 10:      Excessive Deferral */
+       XM_ST_BURST     = 1<<9,         /* Bit  9:      p. xmitted in burst md*/
+       XM_ST_DEFER     = 1<<8,         /* Bit  8:      packet was defered */
+       XM_ST_BC        = 1<<7,         /* Bit  7:      Broadcast packet */
+       XM_ST_MC        = 1<<6,         /* Bit  6:      Multicast packet */
+       XM_ST_UC        = 1<<5,         /* Bit  5:      Unicast packet */
+       XM_ST_TX_UR     = 1<<4,         /* Bit  4:      FIFO Underrun occured */
+       XM_ST_CS_ERR    = 1<<3,         /* Bit  3:      Carrier Sense Error */
+       XM_ST_LAT_COL   = 1<<2,         /* Bit  2:      Late Collision Error */
+       XM_ST_MUL_COL   = 1<<1,         /* Bit  1:      Multiple Collisions */
+       XM_ST_SGN_COL   = 1<<0,         /* Bit  0:      Single Collision */
+};
+
+/*     XM_RX_LO_WM     16 bit r/w      Receive Low Water Mark */
+/*     XM_RX_HI_WM     16 bit r/w      Receive High Water Mark */
+#define XM_RX_WM_MSK   0x03ff          /* Bit 11.. 0:  Rx FIFO Watermark bits */
+
+
+/*     XM_DEV_ID       32 bit r/o      Device ID Register */
+#define XM_DEV_OUI     (0x00ffffffUL<<8)       /* Bit 31..8:   Device OUI */
+#define XM_DEV_REV     (0x07L << 5)            /* Bit  7..5:   Chip Rev Num */
+
+
+/*     XM_MODE         32 bit r/w      Mode Register */
+enum {
+       XM_MD_ENA_REJ   = 1<<26, /* Bit 26:     Enable Frame Reject */
+       XM_MD_SPOE_E    = 1<<25, /* Bit 25:     Send Pause on Edge */
+                                                                       /*              extern generated */
+       XM_MD_TX_REP    = 1<<24, /* Bit 24:     Transmit Repeater Mode */
+       XM_MD_SPOFF_I   = 1<<23, /* Bit 23:     Send Pause on FIFO full */
+                                                                       /*              intern generated */
+       XM_MD_LE_STW    = 1<<22, /* Bit 22:     Rx Stat Word in Little Endian */
+       XM_MD_TX_CONT   = 1<<21, /* Bit 21:     Send Continuous */
+       XM_MD_TX_PAUSE  = 1<<20, /* Bit 20: (sc)        Send Pause Frame */
+       XM_MD_ATS       = 1<<19, /* Bit 19:     Append Time Stamp */
+       XM_MD_SPOL_I    = 1<<18, /* Bit 18:     Send Pause on Low */
+                                                                       /*              intern generated */
+       XM_MD_SPOH_I    = 1<<17, /* Bit 17:     Send Pause on High */
+                                                                       /*              intern generated */
+       XM_MD_CAP       = 1<<16, /* Bit 16:     Check Address Pair */
+       XM_MD_ENA_HASH  = 1<<15, /* Bit 15:     Enable Hashing */
+       XM_MD_CSA       = 1<<14, /* Bit 14:     Check Station Address */
+       XM_MD_CAA       = 1<<13, /* Bit 13:     Check Address Array */
+       XM_MD_RX_MCTRL  = 1<<12, /* Bit 12:     Rx MAC Control Frame */
+       XM_MD_RX_RUNT   = 1<<11, /* Bit 11:     Rx Runt Frames */
+       XM_MD_RX_IRLE   = 1<<10, /* Bit 10:     Rx in Range Len Err Frame */
+       XM_MD_RX_LONG   = 1<<9,  /* Bit  9:     Rx Long Frame */
+       XM_MD_RX_CRCE   = 1<<8,  /* Bit  8:     Rx CRC Error Frame */
+       XM_MD_RX_ERR    = 1<<7,  /* Bit  7:     Rx Error Frame */
+       XM_MD_DIS_UC    = 1<<6,  /* Bit  6:     Disable Rx Unicast */
+       XM_MD_DIS_MC    = 1<<5,  /* Bit  5:     Disable Rx Multicast */
+       XM_MD_DIS_BC    = 1<<4,  /* Bit  4:     Disable Rx Broadcast */
+       XM_MD_ENA_PROM  = 1<<3,  /* Bit  3:     Enable Promiscuous */
+       XM_MD_ENA_BE    = 1<<2,  /* Bit  2:     Enable Big Endian */
+       XM_MD_FTF       = 1<<1,  /* Bit  1: (sc)        Flush Tx FIFO */
+       XM_MD_FRF       = 1<<0,  /* Bit  0: (sc)        Flush Rx FIFO */
+};
+
+#define XM_PAUSE_MODE  (XM_MD_SPOE_E | XM_MD_SPOL_I | XM_MD_SPOH_I)
+#define XM_DEF_MODE            (XM_MD_RX_RUNT | XM_MD_RX_IRLE | XM_MD_RX_LONG |\
+                               XM_MD_RX_CRCE | XM_MD_RX_ERR | XM_MD_CSA | XM_MD_CAA)
+
+/*     XM_STAT_CMD     16 bit r/w      Statistics Command Register */
+enum {
+       XM_SC_SNP_RXC   = 1<<5, /* Bit  5: (sc) Snap Rx Counters */
+       XM_SC_SNP_TXC   = 1<<4, /* Bit  4: (sc) Snap Tx Counters */
+       XM_SC_CP_RXC    = 1<<3, /* Bit  3:      Copy Rx Counters Continuously */
+       XM_SC_CP_TXC    = 1<<2, /* Bit  2:      Copy Tx Counters Continuously */
+       XM_SC_CLR_RXC   = 1<<1, /* Bit  1: (sc) Clear Rx Counters */
+       XM_SC_CLR_TXC   = 1<<0, /* Bit  0: (sc) Clear Tx Counters */
+};
+
+
+/*     XM_RX_CNT_EV    32 bit r/o      Rx Counter Event Register */
+/*     XM_RX_EV_MSK    32 bit r/w      Rx Counter Event Mask */
+enum {
+       XMR_MAX_SZ_OV   = 1<<31, /* Bit 31:     1024-MaxSize Rx Cnt Ov*/
+       XMR_1023B_OV    = 1<<30, /* Bit 30:     512-1023Byte Rx Cnt Ov*/
+       XMR_511B_OV     = 1<<29, /* Bit 29:     256-511 Byte Rx Cnt Ov*/
+       XMR_255B_OV     = 1<<28, /* Bit 28:     128-255 Byte Rx Cnt Ov*/
+       XMR_127B_OV     = 1<<27, /* Bit 27:     65-127 Byte Rx Cnt Ov */
+       XMR_64B_OV      = 1<<26, /* Bit 26:     64 Byte Rx Cnt Ov */
+       XMR_UTIL_OV     = 1<<25, /* Bit 25:     Rx Util Cnt Overflow */
+       XMR_UTIL_UR     = 1<<24, /* Bit 24:     Rx Util Cnt Underrun */
+       XMR_CEX_ERR_OV  = 1<<23, /* Bit 23:     CEXT Err Cnt Ov */
+       XMR_FCS_ERR_OV  = 1<<21, /* Bit 21:     Rx FCS Error Cnt Ov */
+       XMR_LNG_ERR_OV  = 1<<20, /* Bit 20:     Rx too Long Err Cnt Ov*/
+       XMR_RUNT_OV     = 1<<19, /* Bit 19:     Runt Event Cnt Ov */
+       XMR_SHT_ERR_OV  = 1<<18, /* Bit 18:     Rx Short Ev Err Cnt Ov*/
+       XMR_SYM_ERR_OV  = 1<<17, /* Bit 17:     Rx Sym Err Cnt Ov */
+       XMR_CAR_ERR_OV  = 1<<15, /* Bit 15:     Rx Carr Ev Err Cnt Ov */
+       XMR_JAB_PKT_OV  = 1<<14, /* Bit 14:     Rx Jabb Packet Cnt Ov */
+       XMR_FIFO_OV     = 1<<13, /* Bit 13:     Rx FIFO Ov Ev Cnt Ov */
+       XMR_FRA_ERR_OV  = 1<<12, /* Bit 12:     Rx Framing Err Cnt Ov */
+       XMR_FMISS_OV    = 1<<11, /* Bit 11:     Rx Missed Ev Cnt Ov */
+       XMR_BURST       = 1<<10, /* Bit 10:     Rx Burst Event Cnt Ov */
+       XMR_INV_MOC     = 1<<9,  /* Bit  9:     Rx with inv. MAC OC Ov*/
+       XMR_INV_MP      = 1<<8,  /* Bit  8:     Rx inv Pause Frame Ov */
+       XMR_MCTRL_OV    = 1<<7,  /* Bit  7:     Rx MAC Ctrl-F Cnt Ov */
+       XMR_MPAUSE_OV   = 1<<6,  /* Bit  6:     Rx Pause MAC Ctrl-F Ov*/
+       XMR_UC_OK_OV    = 1<<5,  /* Bit  5:     Rx Unicast Frame CntOv*/
+       XMR_MC_OK_OV    = 1<<4,  /* Bit  4:     Rx Multicast Cnt Ov */
+       XMR_BC_OK_OV    = 1<<3,  /* Bit  3:     Rx Broadcast Cnt Ov */
+       XMR_OK_LO_OV    = 1<<2,  /* Bit  2:     Octets Rx OK Low CntOv*/
+       XMR_OK_HI_OV    = 1<<1,  /* Bit  1:     Octets Rx OK Hi Cnt Ov*/
+       XMR_OK_OV       = 1<<0,  /* Bit  0:     Frames Received Ok Ov */
+};
+
+#define XMR_DEF_MSK            (XMR_OK_LO_OV | XMR_OK_HI_OV)
+
+/*     XM_TX_CNT_EV    32 bit r/o      Tx Counter Event Register */
+/*     XM_TX_EV_MSK    32 bit r/w      Tx Counter Event Mask */
+enum {
+       XMT_MAX_SZ_OV   = 1<<25,        /* Bit 25:      1024-MaxSize Tx Cnt Ov*/
+       XMT_1023B_OV    = 1<<24,        /* Bit 24:      512-1023Byte Tx Cnt Ov*/
+       XMT_511B_OV     = 1<<23,        /* Bit 23:      256-511 Byte Tx Cnt Ov*/
+       XMT_255B_OV     = 1<<22,        /* Bit 22:      128-255 Byte Tx Cnt Ov*/
+       XMT_127B_OV     = 1<<21,        /* Bit 21:      65-127 Byte Tx Cnt Ov */
+       XMT_64B_OV      = 1<<20,        /* Bit 20:      64 Byte Tx Cnt Ov */
+       XMT_UTIL_OV     = 1<<19,        /* Bit 19:      Tx Util Cnt Overflow */
+       XMT_UTIL_UR     = 1<<18,        /* Bit 18:      Tx Util Cnt Underrun */
+       XMT_CS_ERR_OV   = 1<<17,        /* Bit 17:      Tx Carr Sen Err Cnt Ov*/
+       XMT_FIFO_UR_OV  = 1<<16,        /* Bit 16:      Tx FIFO Ur Ev Cnt Ov */
+       XMT_EX_DEF_OV   = 1<<15,        /* Bit 15:      Tx Ex Deferall Cnt Ov */
+       XMT_DEF = 1<<14,        /* Bit 14:      Tx Deferred Cnt Ov */
+       XMT_LAT_COL_OV  = 1<<13,        /* Bit 13:      Tx Late Col Cnt Ov */
+       XMT_ABO_COL_OV  = 1<<12,        /* Bit 12:      Tx abo dueto Ex Col Ov*/
+       XMT_MUL_COL_OV  = 1<<11,        /* Bit 11:      Tx Mult Col Cnt Ov */
+       XMT_SNG_COL     = 1<<10,        /* Bit 10:      Tx Single Col Cnt Ov */
+       XMT_MCTRL_OV    = 1<<9,         /* Bit  9:      Tx MAC Ctrl Counter Ov*/
+       XMT_MPAUSE      = 1<<8,         /* Bit  8:      Tx Pause MAC Ctrl-F Ov*/
+       XMT_BURST       = 1<<7,         /* Bit  7:      Tx Burst Event Cnt Ov */
+       XMT_LONG        = 1<<6,         /* Bit  6:      Tx Long Frame Cnt Ov */
+       XMT_UC_OK_OV    = 1<<5,         /* Bit  5:      Tx Unicast Cnt Ov */
+       XMT_MC_OK_OV    = 1<<4,         /* Bit  4:      Tx Multicast Cnt Ov */
+       XMT_BC_OK_OV    = 1<<3,         /* Bit  3:      Tx Broadcast Cnt Ov */
+       XMT_OK_LO_OV    = 1<<2,         /* Bit  2:      Octets Tx OK Low CntOv*/
+       XMT_OK_HI_OV    = 1<<1,         /* Bit  1:      Octets Tx OK Hi Cnt Ov*/
+       XMT_OK_OV       = 1<<0,         /* Bit  0:      Frames Tx Ok Ov */
+};
+
+#define XMT_DEF_MSK            (XMT_OK_LO_OV | XMT_OK_HI_OV)
+
+struct skge_rx_desc {
+       u32             control;
+       u32             next_offset;
+       u32             dma_lo;
+       u32             dma_hi;
+       u32             status;
+       u32             timestamp;
+       u16             csum2;
+       u16             csum1;
+       u16             csum2_start;
+       u16             csum1_start;
+};
+
+struct skge_tx_desc {
+       u32             control;
+       u32             next_offset;
+       u32             dma_lo;
+       u32             dma_hi;
+       u32             status;
+       u32             csum_offs;
+       u16             csum_write;
+       u16             csum_start;
+       u32             rsvd;
+};
+
+struct skge_element {
+       struct skge_element     *next;
+       void                    *desc;
+       struct sk_buff          *skb;
+       DECLARE_PCI_UNMAP_ADDR(mapaddr);
+       DECLARE_PCI_UNMAP_LEN(maplen);
+};
+
+struct skge_ring {
+       struct skge_element *to_clean;
+       struct skge_element *to_use;
+       struct skge_element *start;
+       unsigned long       count;
+};
+
+
+struct skge_hw {
+       void __iomem         *regs;
+       struct pci_dev       *pdev;
+       u32                  intr_mask;
+       struct net_device    *dev[2];
+
+       u8                   mac_cfg;
+       u8                   chip_id;
+       u8                   phy_type;
+       u8                   pmd_type;
+       u16                  phy_addr;
+
+       u32                  ram_size;
+       u32                  ram_offset;
+       
+       struct tasklet_struct ext_tasklet;
+       spinlock_t           phy_lock;
+};
+
+static inline int isdualport(const struct skge_hw *hw)
+{
+       return !(hw->mac_cfg & CFG_SNG_MAC);
+}
+
+static inline u8 chip_rev(const struct skge_hw *hw)
+{
+       return (hw->mac_cfg & CFG_CHIP_R_MSK) >> 4;
+}
+
+static inline int iscopper(const struct skge_hw *hw)
+{
+       return (hw->pmd_type == 'T');
+}
+
+enum {
+       FLOW_MODE_NONE          = 0, /* No Flow-Control */
+       FLOW_MODE_LOC_SEND      = 1, /* Local station sends PAUSE */
+       FLOW_MODE_REM_SEND      = 2, /* Symmetric or just remote */
+       FLOW_MODE_SYMMETRIC     = 3, /* Both stations may send PAUSE */
+};
+       
+struct skge_port {
+       u32                  msg_enable;
+       struct skge_hw       *hw;
+       struct net_device    *netdev;
+       int                  port;
+
+       spinlock_t           tx_lock;
+       u32                  tx_avail;
+       struct skge_ring     tx_ring;
+       struct skge_ring     rx_ring;
+
+       struct net_device_stats net_stats;
+
+       u8                   rx_csum;
+       u8                   blink_on;
+       u8                   flow_control;
+       u8                   wol;
+       u8                   autoneg;   /* AUTONEG_ENABLE, AUTONEG_DISABLE */
+       u8                   duplex;    /* DUPLEX_HALF, DUPLEX_FULL */
+       u16                  speed;     /* SPEED_1000, SPEED_100, ... */
+       u32                  advertising;
+
+       void                 *mem;      /* PCI memory for rings */
+       dma_addr_t           dma;
+       unsigned long        mem_size;
+
+       struct timer_list    link_check;
+       struct timer_list    led_blink;
+};
+
+
+/* Register accessor for memory mapped device */
+static inline u32 skge_read32(const struct skge_hw *hw, int reg)
+{
+       return readl(hw->regs + reg);
+
+}
+
+static inline u16 skge_read16(const struct skge_hw *hw, int reg)
+{
+       return readw(hw->regs + reg);
+}
+
+static inline u8 skge_read8(const struct skge_hw *hw, int reg)
+{
+       return readb(hw->regs + reg);
+}
+
+static inline void skge_write32(const struct skge_hw *hw, int reg, u32 val)
+{
+       writel(val, hw->regs + reg);
+}
+
+static inline void skge_write16(const struct skge_hw *hw, int reg, u16 val)
+{
+       writew(val, hw->regs + reg);
+}
+
+static inline void skge_write8(const struct skge_hw *hw, int reg, u8 val)
+{
+       writeb(val, hw->regs + reg);
+}
+
+/* MAC Related Registers inside the device. */
+#define SKGEMAC_REG(port,reg)  (((port)<<7)+(reg))
+
+/* PCI config space can be accessed via memory mapped space */
+#define SKGEPCI_REG(reg) ((reg)+ 0x380)
+
+#define SKGEXM_REG(port, reg) \
+       ((BASE_XMAC_1 + (port) * (BASE_XMAC_2 - BASE_XMAC_1)) | (reg) << 1)
+
+static inline u32 skge_xm_read32(const struct skge_hw *hw, int port, int reg)
+{
+       return skge_read32(hw, SKGEXM_REG(port,reg));
+}
+
+static inline u16 skge_xm_read16(const struct skge_hw *hw, int port, int reg)
+{
+       return skge_read16(hw, SKGEXM_REG(port,reg));
+}
+
+static inline u8 skge_xm_read8(const struct skge_hw *hw, int port, int reg)
+{
+       return skge_read8(hw, SKGEXM_REG(port,reg));
+}
+
+static inline void skge_xm_write32(const struct skge_hw *hw, int port, int r, u32 v)
+{
+       skge_write32(hw, SKGEXM_REG(port,r), v);
+}
+
+static inline void skge_xm_write16(const struct skge_hw *hw, int port, int r, u16 v)
+{
+       skge_write16(hw, SKGEXM_REG(port,r), v);
+}
+
+static inline void skge_xm_write8(const struct skge_hw *hw, int port, int r, u8 v)
+{
+       skge_write8(hw, SKGEXM_REG(port,r), v);
+}
+
+static inline void skge_xm_outhash(const struct skge_hw *hw, int port, int reg,
+                                  const u8 *hash)
+{
+       skge_xm_write16(hw, port, reg, 
+                       (u16)hash[0] | ((u16)hash[1] << 8));
+       skge_xm_write16(hw, port, reg+2, 
+                       (u16)hash[2] | ((u16)hash[3] << 8));
+       skge_xm_write16(hw, port, reg+4, 
+                       (u16)hash[4] | ((u16)hash[5] << 8));
+       skge_xm_write16(hw, port, reg+6, 
+                       (u16)hash[6] | ((u16)hash[7] << 8));
+}
+
+static inline void skge_xm_outaddr(const struct skge_hw *hw, int port, int reg,
+                                  const u8 *addr)
+{
+       skge_xm_write16(hw, port, reg, 
+                       (u16)addr[0] | ((u16)addr[1] << 8));
+       skge_xm_write16(hw, port, reg, 
+                       (u16)addr[2] | ((u16)addr[3] << 8));
+       skge_xm_write16(hw, port, reg, 
+                       (u16)addr[4] | ((u16)addr[5] << 8));
+}
+
+
+#define SKGEGMA_REG(port,reg) \
+       ((reg) + BASE_GMAC_1 + \
+        (port) * (BASE_GMAC_2-BASE_GMAC_1))
+
+static inline u16 skge_gma_read16(const struct skge_hw *hw, int port, int reg)
+{
+       return skge_read16(hw, SKGEGMA_REG(port,reg));
+}
+
+static inline u32 skge_gma_read32(const struct skge_hw *hw, int port, int reg)
+{
+       return (u32) skge_read16(hw, SKGEGMA_REG(port,reg))
+               | ((u32)skge_read16(hw, SKGEGMA_REG(port,reg+4)) << 16);
+}
+
+static inline u8 skge_gma_read8(const struct skge_hw *hw, int port, int reg)
+{
+       return skge_read8(hw, SKGEGMA_REG(port,reg));
+}
+
+static inline void skge_gma_write16(const struct skge_hw *hw, int port, int r, u16 v)
+{
+       skge_write16(hw, SKGEGMA_REG(port,r), v);
+}
+
+static inline void skge_gma_write32(const struct skge_hw *hw, int port, int r, u32 v)
+{
+       skge_write16(hw, SKGEGMA_REG(port, r), (u16) v);
+       skge_write32(hw, SKGEGMA_REG(port, r+4), (u16)(v >> 16));
+}
+
+static inline void skge_gma_write8(const struct skge_hw *hw, int port, int r, u8 v)
+{
+       skge_write8(hw, SKGEGMA_REG(port,r), v);
+}
+
+static inline void skge_gm_set_addr(struct skge_hw *hw, int port, int reg,
+                                   const u8 *addr)
+{
+       skge_gma_write16(hw, port, reg,
+                        (u16) addr[0] | ((u16) addr[1] << 8));
+       skge_gma_write16(hw, port, reg+4,
+                        (u16) addr[2] | ((u16) addr[3] << 8));
+       skge_gma_write16(hw, port, reg+8,
+                        (u16) addr[4] | ((u16) addr[5] << 8));
+}
+               
+#endif
index 5e561ba4433330ee2e49675f2805f3e03457715d..fd80048f7f7ac6f98e09bf6e0456448e7688ccea 100644 (file)
@@ -129,7 +129,7 @@ MODULE_PARM_DESC(nowait, "set to 1 for no wait state");
 /*
  * Transmit timeout, default 5 seconds.
  */
-static int watchdog = 5000;
+static int watchdog = 1000;
 module_param(watchdog, int, 0400);
 MODULE_PARM_DESC(watchdog, "transmit timeout in milliseconds");
 
@@ -660,15 +660,14 @@ static void smc_hardware_send_pkt(unsigned long data)
        SMC_outw(((len & 1) ? (0x2000 | buf[len-1]) : 0), ioaddr, DATA_REG);
 
        /*
-        * If THROTTLE_TX_PKTS is set, we look at the TX_EMPTY flag
-        * before queueing this packet for TX, and if it's clear then
-        * we stop the queue here.  This will have the effect of
-        * having at most 2 packets queued for TX in the chip's memory
-        * at all time. If THROTTLE_TX_PKTS is not set then the queue
-        * is stopped only when memory allocation (MC_ALLOC) does not
-        * succeed right away.
+        * If THROTTLE_TX_PKTS is set, we stop the queue here. This will
+        * have the effect of having at most one packet queued for TX
+        * in the chip's memory at all time.
+        *
+        * If THROTTLE_TX_PKTS is not set then the queue is stopped only
+        * when memory allocation (MC_ALLOC) does not succeed right away.
         */
-       if (THROTTLE_TX_PKTS && !(SMC_GET_INT() & IM_TX_EMPTY_INT))
+       if (THROTTLE_TX_PKTS)
                netif_stop_queue(dev);
 
        /* queue the packet for TX */
@@ -792,17 +791,20 @@ static void smc_tx(struct net_device *dev)
        DBG(2, "%s: TX STATUS 0x%04x PNR 0x%02x\n",
                dev->name, tx_status, packet_no);
 
-       if (!(tx_status & TS_SUCCESS))
+       if (!(tx_status & ES_TX_SUC))
                lp->stats.tx_errors++;
-       if (tx_status & TS_LOSTCAR)
+
+       if (tx_status & ES_LOSTCARR)
                lp->stats.tx_carrier_errors++;
 
-       if (tx_status & TS_LATCOL) {
-               PRINTK("%s: late collision occurred on last xmit\n", dev->name);
+       if (tx_status & (ES_LATCOL | ES_16COL)) {
+               PRINTK("%s: %s occurred on last xmit\n", dev->name,
+                      (tx_status & ES_LATCOL) ?
+                       "late collision" : "too many collisions");
                lp->stats.tx_window_errors++;
                if (!(lp->stats.tx_window_errors & 63) && net_ratelimit()) {
-                       printk(KERN_INFO "%s: unexpectedly large numbers of "
-                              "late collisions. Please check duplex "
+                       printk(KERN_INFO "%s: unexpectedly large number of "
+                              "bad collisions. Please check duplex "
                               "setting.\n", dev->name);
                }
        }
@@ -1236,7 +1238,7 @@ static void smc_10bt_check_media(struct net_device *dev, int init)
        old_carrier = netif_carrier_ok(dev) ? 1 : 0;
 
        SMC_SELECT_BANK(0);
-       new_carrier = SMC_inw(ioaddr, EPH_STATUS_REG) & ES_LINK_OK ? 1 : 0;
+       new_carrier = (SMC_GET_EPH_STATUS() & ES_LINK_OK) ? 1 : 0;
        SMC_SELECT_BANK(2);
 
        if (init || (old_carrier != new_carrier)) {
@@ -1308,15 +1310,16 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                if (!status)
                        break;
 
-               if (status & IM_RCV_INT) {
-                       DBG(3, "%s: RX irq\n", dev->name);
-                       smc_rcv(dev);
-               } else if (status & IM_TX_INT) {
+               if (status & IM_TX_INT) {
+                       /* do this before RX as it will free memory quickly */
                        DBG(3, "%s: TX int\n", dev->name);
                        smc_tx(dev);
                        SMC_ACK_INT(IM_TX_INT);
                        if (THROTTLE_TX_PKTS)
                                netif_wake_queue(dev);
+               } else if (status & IM_RCV_INT) {
+                       DBG(3, "%s: RX irq\n", dev->name);
+                       smc_rcv(dev);
                } else if (status & IM_ALLOC_INT) {
                        DBG(3, "%s: Allocation irq\n", dev->name);
                        tasklet_hi_schedule(&lp->tx_task);
@@ -1337,7 +1340,10 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                        /* multiple collisions */
                        lp->stats.collisions += card_stats & 0xF;
                } else if (status & IM_RX_OVRN_INT) {
-                       DBG(1, "%s: RX overrun\n", dev->name);
+                       DBG(1, "%s: RX overrun (EPH_ST 0x%04x)\n", dev->name,
+                              ({ int eph_st; SMC_SELECT_BANK(0);
+                                 eph_st = SMC_GET_EPH_STATUS();
+                                 SMC_SELECT_BANK(2); eph_st; }) );
                        SMC_ACK_INT(IM_RX_OVRN_INT);
                        lp->stats.rx_errors++;
                        lp->stats.rx_fifo_errors++;
@@ -1389,7 +1395,7 @@ static void smc_timeout(struct net_device *dev)
 {
        struct smc_local *lp = netdev_priv(dev);
        void __iomem *ioaddr = lp->base;
-       int status, mask, meminfo, fifo;
+       int status, mask, eph_st, meminfo, fifo;
 
        DBG(2, "%s: %s\n", dev->name, __FUNCTION__);
 
@@ -1398,11 +1404,13 @@ static void smc_timeout(struct net_device *dev)
        mask = SMC_GET_INT_MASK();
        fifo = SMC_GET_FIFO();
        SMC_SELECT_BANK(0);
+       eph_st = SMC_GET_EPH_STATUS();
        meminfo = SMC_GET_MIR();
        SMC_SELECT_BANK(2);
        spin_unlock_irq(&lp->lock);
-       PRINTK( "%s: INT 0x%02x MASK 0x%02x MEM 0x%04x FIFO 0x%04x\n",
-               dev->name, status, mask, meminfo, fifo );
+       PRINTK( "%s: TX timeout (INT 0x%02x INTMASK 0x%02x "
+               "MEM 0x%04x FIFO 0x%04x EPH_ST 0x%04x)\n",
+               dev->name, status, mask, meminfo, fifo, eph_st );
 
        smc_reset(dev);
        smc_enable(dev);
@@ -1863,7 +1871,7 @@ static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr)
        SMC_SELECT_BANK(1);
        val = SMC_GET_BASE();
        val = ((val & 0x1F00) >> 3) << SMC_IO_SHIFT;
-       if (((unsigned long)ioaddr & ((PAGE_SIZE-1)<<SMC_IO_SHIFT)) != val) { /*XXX: WTF? */
+       if (((unsigned int)ioaddr & (0x3e0 << SMC_IO_SHIFT)) != val) {
                printk("%s: IOADDR %p doesn't match configuration (%x).\n",
                        CARDNAME, ioaddr, val);
        }
index ddd2688e7d33ee61e76c9fad7e7796a5273ef825..946528e6b742000523f6991cf7925f2c123a3b24 100644 (file)
 
 /* We actually can't write halfwords properly if not word aligned */
 static inline void
-SMC_outw(u16 val, unsigned long ioaddr, int reg)
+SMC_outw(u16 val, void __iomem *ioaddr, int reg)
 {
        if (reg & 2) {
                unsigned int v = val << 16;
@@ -317,7 +317,7 @@ static inline void SMC_outsw (unsigned long a, int r, unsigned char* p, int l)
 #define SMC_insl(a, r, p, l) \
        smc_pxa_dma_insl(a, lp->physaddr, r, dev->dma, p, l)
 static inline void
-smc_pxa_dma_insl(u_long ioaddr, u_long physaddr, int reg, int dma,
+smc_pxa_dma_insl(void __iomem *ioaddr, u_long physaddr, int reg, int dma,
                 u_char *buf, int len)
 {
        dma_addr_t dmabuf;
@@ -355,7 +355,7 @@ smc_pxa_dma_insl(u_long ioaddr, u_long physaddr, int reg, int dma,
 #define SMC_insw(a, r, p, l) \
        smc_pxa_dma_insw(a, lp->physaddr, r, dev->dma, p, l)
 static inline void
-smc_pxa_dma_insw(u_long ioaddr, u_long physaddr, int reg, int dma,
+smc_pxa_dma_insw(void __iomem *ioaddr, u_long physaddr, int reg, int dma,
                 u_char *buf, int len)
 {
        dma_addr_t dmabuf;
@@ -680,14 +680,6 @@ static const char * chip_ids[ 16 ] =  {
        NULL, NULL, NULL};
 
 
-/*
- . Transmit status bits
-*/
-#define TS_SUCCESS 0x0001
-#define TS_LOSTCAR 0x0400
-#define TS_LATCOL  0x0200
-#define TS_16COL   0x0010
-
 /*
  . Receive status bits
 */
@@ -845,6 +837,7 @@ static const char * chip_ids[ 16 ] =  {
 #define SMC_GET_FIFO()         SMC_inw( ioaddr, FIFO_REG )
 #define SMC_GET_PTR()          SMC_inw( ioaddr, PTR_REG )
 #define SMC_SET_PTR(x)         SMC_outw( x, ioaddr, PTR_REG )
+#define SMC_GET_EPH_STATUS()   SMC_inw( ioaddr, EPH_STATUS_REG )
 #define SMC_GET_RCR()          SMC_inw( ioaddr, RCR_REG )
 #define SMC_SET_RCR(x)         SMC_outw( x, ioaddr, RCR_REG )
 #define SMC_GET_REV()          SMC_inw( ioaddr, REV_REG )
index 236bdd3f6ba034aadf72b8daa230eadf93c01b74..12e2b6826fa3768e2c72ee9afd92bc0bee6b2e5d 100644 (file)
@@ -2,7 +2,7 @@
 /*
        Written 1998-2000 by Donald Becker.
 
-       Current maintainer is Ion Badulescu <ionut@cs.columbia.edu>. Please
+       Current maintainer is Ion Badulescu <ionut ta badula tod org>. Please
        send all bug reports to me, and not to Donald Becker, as this code
        has been heavily modified from Donald's original version.
 
        - put the chip to a D3 slumber on driver unload
        - added config option to enable/disable NAPI
 
-TODO:  bugfixes (no bugs known as of right now)
+       LK1.4.2 (Ion Badulescu)
+       - finally added firmware (GPL'ed by Adaptec)
+       - removed compatibility code for 2.2.x
+
+TODO:  - fix forced speed/duplexing code (broken a long time ago, when
+       somebody converted the driver to use the generic MII code)
+       - fix VLAN support
 */
 
 #define DRV_NAME       "starfire"
-#define DRV_VERSION    "1.03+LK1.4.1"
-#define DRV_RELDATE    "February 10, 2002"
+#define DRV_VERSION    "1.03+LK1.4.2"
+#define DRV_RELDATE    "January 19, 2005"
 
 #include <linux/config.h>
 #include <linux/version.h>
@@ -145,25 +151,15 @@ TODO:     bugfixes (no bugs known as of right now)
 #include <linux/etherdevice.h>
 #include <linux/init.h>
 #include <linux/delay.h>
+#include <linux/crc32.h>
+#include <linux/ethtool.h>
+#include <linux/mii.h>
+#include <linux/if_vlan.h>
 #include <asm/processor.h>             /* Processor type for cache alignment. */
 #include <asm/uaccess.h>
 #include <asm/io.h>
 
-/*
- * Adaptec's license for their drivers (which is where I got the
- * firmware files) does not allow one to redistribute them. Thus, we can't
- * include the firmware with this driver.
- *
- * However, should a legal-to-distribute firmware become available,
- * the driver developer would need only to obtain the firmware in the
- * form of a C header file.
- * Once that's done, the #undef below must be changed into a #define
- * for this driver to really use the firmware. Note that Rx/Tx
- * hardware TCP checksumming is not possible without the firmware.
- *
- * WANTED: legal firmware to include with this GPL'd driver.
- */
-#undef HAS_FIRMWARE
+#include "starfire_firmware.h"
 /*
  * The current frame processor firmware fails to checksum a fragment
  * of length 1. If and when this is fixed, the #define below can be removed.
@@ -172,13 +168,7 @@ TODO:      bugfixes (no bugs known as of right now)
 /*
  * Define this if using the driver with the zero-copy patch
  */
-#if defined(HAS_FIRMWARE) && defined(MAX_SKB_FRAGS)
 #define ZEROCOPY
-#endif
-
-#ifdef HAS_FIRMWARE
-#include "starfire_firmware.h"
-#endif /* HAS_FIRMWARE */
 
 #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
 #define VLAN_SUPPORT
@@ -202,11 +192,7 @@ static int mtu;
    The Starfire has a 512 element hash table based on the Ethernet CRC. */
 static int multicast_filter_limit = 512;
 /* Whether to do TCP/UDP checksums in hardware */
-#ifdef HAS_FIRMWARE
 static int enable_hw_cksum = 1;
-#else
-static int enable_hw_cksum = 0;
-#endif
 
 #define PKT_BUF_SZ     1536            /* Size of each temporary Rx buffer.*/
 /*
@@ -291,43 +277,15 @@ static int full_duplex[MAX_UNITS] = {0, };
 #define RX_DESC_ADDR_SIZE RxDescAddr32bit
 #endif
 
-#ifdef MAX_SKB_FRAGS
 #define skb_first_frag_len(skb)        skb_headlen(skb)
 #define skb_num_frags(skb) (skb_shinfo(skb)->nr_frags + 1)
-#else  /* not MAX_SKB_FRAGS */
-#define skb_first_frag_len(skb)        (skb->len)
-#define skb_num_frags(skb) 1
-#endif /* not MAX_SKB_FRAGS */
-
-/* 2.2.x compatibility code */
-#if LINUX_VERSION_CODE < 0x20300
-
-#include "starfire-kcomp22.h"
-
-#else  /* LINUX_VERSION_CODE > 0x20300 */
-
-#include <linux/crc32.h>
-#include <linux/ethtool.h>
-#include <linux/mii.h>
-
-#include <linux/if_vlan.h>
-
-#define init_tx_timer(dev, func, timeout) \
-       dev->tx_timeout = func; \
-       dev->watchdog_timeo = timeout;
-#define kick_tx_timer(dev, func, timeout)
-
-#define netif_start_if(dev)
-#define netif_stop_if(dev)
-
-#define PCI_SLOT_NAME(pci_dev) pci_name(pci_dev)
-
-#endif /* LINUX_VERSION_CODE > 0x20300 */
 
 #ifdef HAVE_NETDEV_POLL
 #define init_poll(dev) \
+do { \
        dev->poll = &netdev_poll; \
-       dev->weight = max_interrupt_work;
+       dev->weight = max_interrupt_work; \
+} while (0)
 #define netdev_rx(dev, ioaddr) \
 do { \
        u32 intr_enable; \
@@ -341,7 +299,7 @@ do { \
                /* Paranoia check */ \
                intr_enable = readl(ioaddr + IntrEnable); \
                if (intr_enable & (IntrRxDone | IntrRxEmpty)) { \
-                       printk("%s: interrupt while in polling mode!\n", dev->name); \
+                       printk(KERN_INFO "%s: interrupt while in polling mode!\n", dev->name); \
                        intr_enable &= ~(IntrRxDone | IntrRxEmpty); \
                        writel(intr_enable, ioaddr + IntrEnable); \
                } \
@@ -371,6 +329,7 @@ KERN_INFO " (unofficial 2.2/2.4 kernel port, version " DRV_VERSION ", " DRV_RELD
 MODULE_AUTHOR("Donald Becker <becker@scyld.com>");
 MODULE_DESCRIPTION("Adaptec Starfire Ethernet driver");
 MODULE_LICENSE("GPL");
+MODULE_VERSION(DRV_VERSION);
 
 module_param(max_interrupt_work, int, 0);
 module_param(mtu, int, 0);
@@ -425,7 +384,7 @@ on the 32/64 bitness of the architecture), and relies on automatic
 minimum-length padding.  It does not use the completion queue
 consumer index, but instead checks for non-zero status entries.
 
-For receive this driver uses type 0/1/2/3 receive descriptors.  The driver
+For receive this driver uses type 2/3 receive descriptors.  The driver
 allocates full frame size skbuffs for the Rx ring buffers, so all frames
 should fit in a single descriptor.  The driver does not use the completion
 queue consumer index, but instead checks for non-zero status entries.
@@ -476,7 +435,7 @@ IVc. Errata
 
 */
 
-\f
+
 
 enum chip_capability_flags {CanHaveMII=1, };
 
@@ -670,7 +629,6 @@ struct full_rx_done_desc {
        u32 timestamp;
 };
 /* XXX: this is ugly and I'm not sure it's worth the trouble -Ion */
-#ifdef HAS_FIRMWARE
 #ifdef VLAN_SUPPORT
 typedef struct full_rx_done_desc rx_done_desc;
 #define RxComplType RxComplType3
@@ -678,15 +636,6 @@ typedef struct full_rx_done_desc rx_done_desc;
 typedef struct csum_rx_done_desc rx_done_desc;
 #define RxComplType RxComplType2
 #endif /* not VLAN_SUPPORT */
-#else  /* not HAS_FIRMWARE */
-#ifdef VLAN_SUPPORT
-typedef struct basic_rx_done_desc rx_done_desc;
-#define RxComplType RxComplType1
-#else  /* not VLAN_SUPPORT */
-typedef struct short_rx_done_desc rx_done_desc;
-#define RxComplType RxComplType0
-#endif /* not VLAN_SUPPORT */
-#endif /* not HAS_FIRMWARE */
 
 enum rx_done_bits {
        RxOK=0x20000000, RxFIFOErr=0x10000000, RxBufQ2=0x08000000,
@@ -898,13 +847,10 @@ static int __devinit starfire_init_one(struct pci_dev *pdev,
        /* enable MWI -- it vastly improves Rx performance on sparc64 */
        pci_set_mwi(pdev);
 
-#ifdef MAX_SKB_FRAGS
-       dev->features |= NETIF_F_SG;
-#endif /* MAX_SKB_FRAGS */
 #ifdef ZEROCOPY
        /* Starfire can do TCP/UDP checksumming */
        if (enable_hw_cksum)
-               dev->features |= NETIF_F_IP_CSUM;
+               dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
 #endif /* ZEROCOPY */
 #ifdef VLAN_SUPPORT
        dev->features |= NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER;
@@ -1008,7 +954,8 @@ static int __devinit starfire_init_one(struct pci_dev *pdev,
        /* The chip-specific entries in the device structure. */
        dev->open = &netdev_open;
        dev->hard_start_xmit = &start_tx;
-       init_tx_timer(dev, tx_timeout, TX_TIMEOUT);
+       dev->tx_timeout = tx_timeout;
+       dev->watchdog_timeo = TX_TIMEOUT;
        init_poll(dev);
        dev->stop = &netdev_close;
        dev->get_stats = &get_stats;
@@ -1039,7 +986,7 @@ static int __devinit starfire_init_one(struct pci_dev *pdev,
                                if ((mdio_read(dev, phy, MII_BMCR) & BMCR_RESET) == 0)
                                        break;
                        if (boguscnt == 0) {
-                               printk("%s: PHY reset never completed!\n", dev->name);
+                               printk("%s: PHY#%d reset never completed!\n", dev->name, phy);
                                continue;
                        }
                        mii_status = mdio_read(dev, phy, MII_BMSR);
@@ -1110,6 +1057,7 @@ static int netdev_open(struct net_device *dev)
        size_t tx_done_q_size, rx_done_q_size, tx_ring_size, rx_ring_size;
 
        /* Do we ever need to reset the chip??? */
+
        retval = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev);
        if (retval)
                return retval;
@@ -1211,7 +1159,6 @@ static int netdev_open(struct net_device *dev)
 
        writel(np->intr_timer_ctrl, ioaddr + IntrTimerCtrl);
 
-       netif_start_if(dev);
        netif_start_queue(dev);
 
        if (debug > 1)
@@ -1238,13 +1185,11 @@ static int netdev_open(struct net_device *dev)
        writel(ETH_P_8021Q, ioaddr + VlanType);
 #endif /* VLAN_SUPPORT */
 
-#ifdef HAS_FIRMWARE
        /* Load Rx/Tx firmware into the frame processors */
        for (i = 0; i < FIRMWARE_RX_SIZE * 2; i++)
                writel(firmware_rx[i], ioaddr + RxGfpMem + i * 4);
        for (i = 0; i < FIRMWARE_TX_SIZE * 2; i++)
                writel(firmware_tx[i], ioaddr + TxGfpMem + i * 4);
-#endif /* HAS_FIRMWARE */
        if (enable_hw_cksum)
                /* Enable the Rx and Tx units, and the Rx/Tx frame processors. */
                writel(TxEnable|TxGFPEnable|RxEnable|RxGFPEnable, ioaddr + GenCtrl);
@@ -1378,8 +1323,6 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev)
        u32 status;
        int i;
 
-       kick_tx_timer(dev, tx_timeout, TX_TIMEOUT);
-
        /*
         * be cautious here, wrapping the queue has weird semantics
         * and we may not have enough slots even when it seems we do.
@@ -1404,7 +1347,7 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev)
                }
 
                if (has_bad_length)
-                       skb_checksum_help(skb);
+                       skb_checksum_help(skb, 0);
        }
 #endif /* ZEROCOPY && HAS_BROKEN_FIRMWARE */
 
@@ -1433,12 +1376,10 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev)
                        np->tx_info[entry].mapping =
                                pci_map_single(np->pci_dev, skb->data, skb_first_frag_len(skb), PCI_DMA_TODEVICE);
                } else {
-#ifdef MAX_SKB_FRAGS
                        skb_frag_t *this_frag = &skb_shinfo(skb)->frags[i - 1];
                        status |= this_frag->size;
                        np->tx_info[entry].mapping =
                                pci_map_single(np->pci_dev, page_address(this_frag->page) + this_frag->page_offset, this_frag->size, PCI_DMA_TODEVICE);
-#endif /* MAX_SKB_FRAGS */
                }
 
                np->tx_ring[entry].addr = cpu_to_dma(np->tx_info[entry].mapping);
@@ -1531,7 +1472,6 @@ static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs
                                np->tx_info[entry].mapping = 0;
                                np->dirty_tx += np->tx_info[entry].used_slots;
                                entry = (entry + np->tx_info[entry].used_slots) % TX_RING_SIZE;
-#ifdef MAX_SKB_FRAGS
                                {
                                        int i;
                                        for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
@@ -1543,7 +1483,7 @@ static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs
                                                entry++;
                                        }
                                }
-#endif /* MAX_SKB_FRAGS */
+
                                dev_kfree_skb_irq(skb);
                        }
                        np->tx_done_q[np->tx_done].status = 0;
@@ -1603,7 +1543,7 @@ static int __netdev_rx(struct net_device *dev, int *quota)
                if (debug > 4)
                        printk(KERN_DEBUG "  netdev_rx() status of %d was %#8.8x.\n", np->rx_done, desc_status);
                if (!(desc_status & RxOK)) {
-                       /* There was a error. */
+                       /* There was an error. */
                        if (debug > 2)
                                printk(KERN_DEBUG "  netdev_rx() Rx error was %#8.8x.\n", desc_status);
                        np->stats.rx_errors++;
@@ -1656,11 +1596,10 @@ static int __netdev_rx(struct net_device *dev, int *quota)
 #endif
 
                skb->protocol = eth_type_trans(skb, dev);
-#if defined(HAS_FIRMWARE) || defined(VLAN_SUPPORT)
+#ifdef VLAN_SUPPORT
                if (debug > 4)
                        printk(KERN_DEBUG "  netdev_rx() status2 of %d was %#4.4x.\n", np->rx_done, le16_to_cpu(desc->status2));
 #endif
-#ifdef HAS_FIRMWARE
                if (le16_to_cpu(desc->status2) & 0x0100) {
                        skb->ip_summed = CHECKSUM_UNNECESSARY;
                        np->stats.rx_compressed++;
@@ -1679,7 +1618,6 @@ static int __netdev_rx(struct net_device *dev, int *quota)
                        skb->csum = le16_to_cpu(desc->csum);
                        printk(KERN_DEBUG "%s: checksum_hw, status2 = %#x\n", dev->name, le16_to_cpu(desc->status2));
                }
-#endif /* HAS_FIRMWARE */
 #ifdef VLAN_SUPPORT
                if (np->vlgrp && le16_to_cpu(desc->status2) & 0x0200) {
                        if (debug > 4)
@@ -1900,9 +1838,6 @@ static struct net_device_stats *get_stats(struct net_device *dev)
 }
 
 
-/* Chips may use the upper or lower CRC bits, and may reverse and/or invert
-   them.  Select the endian-ness that results in minimal calculations.
-*/
 static void set_rx_mode(struct net_device *dev)
 {
        struct netdev_private *np = netdev_priv(dev);
@@ -1969,6 +1904,8 @@ static void set_rx_mode(struct net_device *dev)
                memset(mc_filter, 0, sizeof(mc_filter));
                for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
                     i++, mclist = mclist->next) {
+                       /* The chip uses the upper 9 CRC bits
+                          as index into the hash table */
                        int bit_nr = ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 23;
                        __u32 *fptr = (__u32 *) &mc_filter[(bit_nr >> 4) & ~1];
 
@@ -2001,7 +1938,7 @@ static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
        struct netdev_private *np = netdev_priv(dev);
        strcpy(info->driver, DRV_NAME);
        strcpy(info->version, DRV_VERSION);
-       strcpy(info->bus_info, PCI_SLOT_NAME(np->pci_dev));
+       strcpy(info->bus_info, pci_name(np->pci_dev));
 }
 
 static int get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
@@ -2083,7 +2020,6 @@ static int netdev_close(struct net_device *dev)
        int i;
 
        netif_stop_queue(dev);
-       netif_stop_if(dev);
 
        if (debug > 1) {
                printk(KERN_DEBUG "%s: Shutting down ethercard, Intr status %#8.8x.\n",
@@ -2184,7 +2120,13 @@ static int __init starfire_init (void)
 /* when a module, this is printed whether or not devices are found in probe */
 #ifdef MODULE
        printk(version);
+#ifdef HAVE_NETDEV_POLL
+       printk(KERN_INFO DRV_NAME ": polling (NAPI) enabled\n");
+#else
+       printk(KERN_INFO DRV_NAME ": polling (NAPI) disabled\n");
 #endif
+#endif
+
 #ifndef ADDR_64BITS
        /* we can do this test only at run-time... sigh */
        if (sizeof(dma_addr_t) == sizeof(u64)) {
@@ -2192,10 +2134,6 @@ static int __init starfire_init (void)
                return -ENODEV;
        }
 #endif /* not ADDR_64BITS */
-#ifndef HAS_FIRMWARE
-       /* unconditionally disable hw cksums if firmware is not present */
-       enable_hw_cksum = 0;
-#endif /* not HAS_FIRMWARE */
        return pci_module_init (&starfire_driver);
 }
 
diff --git a/drivers/net/starfire_firmware.h b/drivers/net/starfire_firmware.h
new file mode 100644 (file)
index 0000000..0a66852
--- /dev/null
@@ -0,0 +1,346 @@
+/*
+ * Copyright 2003 Adaptec, Inc.
+ *
+ * Please read the following license before using the Adaptec Software
+ * ("Program"). If you do not agree to the license terms, do not use the
+ * Program:
+ *
+ * You agree to be bound by version 2 of the General Public License ("GPL")
+ * dated June 1991, which can be found at http://www.fsf.org/licenses/gpl.html.
+ * If the link is broken, write to Free Software Foundation, 59 Temple Place,
+ * Boston, Massachusetts 02111-1307.
+ *
+ * BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE IT IS LICENSED "AS IS" AND
+ * THERE IS NO WARRANTY FOR THE PROGRAM, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR A PARTICULAR PURPOSE
+ * (TO THE EXTENT PERMITTED BY APPLICABLE LAW). USE OF THE PROGRAM IS AT YOUR
+ * OWN RISK. IN NO EVENT WILL ADAPTEC OR ITS LICENSORS BE LIABLE TO YOU FOR
+ * DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM.
+ *
+ */
+
+static const u32 firmware_rx[] = {
+  0x010003dc, 0x00000000,
+  0x04000421, 0x00000086,
+  0x80000015, 0x0000180e,
+  0x81000015, 0x00006664,
+  0x1a0040ab, 0x00000b06,
+  0x14200011, 0x00000000,
+  0x14204022, 0x0000aaaa,
+  0x14204022, 0x00000300,
+  0x14204022, 0x00000000,
+  0x1a0040ab, 0x00000b14,
+  0x14200011, 0x00000000,
+  0x83000015, 0x00000002,
+  0x04000021, 0x00000000,
+  0x00000010, 0x00000000,
+  0x04000421, 0x00000087,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00008015, 0x00000000,
+  0x0000003e, 0x00000000,
+  0x00000010, 0x00000000,
+  0x82000015, 0x00004000,
+  0x009e8050, 0x00000000,
+  0x03008015, 0x00000000,
+  0x86008015, 0x00000000,
+  0x82000015, 0x00008000,
+  0x0100001c, 0x00000000,
+  0x000050a0, 0x0000010c,
+  0x4e20d011, 0x00006008,
+  0x1420d012, 0x00004008,
+  0x0000f090, 0x00007000,
+  0x0000c8b0, 0x00003000,
+  0x00004040, 0x00000000,
+  0x00108015, 0x00000000,
+  0x00a2c150, 0x00004000,
+  0x00a400b0, 0x00000014,
+  0x00000020, 0x00000000,
+  0x2500400d, 0x00002525,
+  0x00047220, 0x00003100,
+  0x00934070, 0x00000000,
+  0x00000020, 0x00000000,
+  0x00924460, 0x00000184,
+  0x2b20c011, 0x00000000,
+  0x0000c420, 0x00000540,
+  0x36014018, 0x0000422d,
+  0x14200011, 0x00000000,
+  0x00924460, 0x00000183,
+  0x3200001f, 0x00000034,
+  0x02ac0015, 0x00000002,
+  0x00a60110, 0x00000008,
+  0x42200011, 0x00000000,
+  0x00924060, 0x00000103,
+  0x0000001e, 0x00000000,
+  0x00000020, 0x00000100,
+  0x0000001e, 0x00000000,
+  0x00924460, 0x00000086,
+  0x00004080, 0x00000000,
+  0x0092c070, 0x00000000,
+  0x00924060, 0x00000100,
+  0x0000c890, 0x00005000,
+  0x00a6c110, 0x00000000,
+  0x00b0c090, 0x00000012,
+  0x021c0015, 0x00000000,
+  0x3200001f, 0x00000034,
+  0x00924460, 0x00000510,
+  0x44210011, 0x00000000,
+  0x42000011, 0x00000000,
+  0x83000015, 0x00000040,
+  0x00924460, 0x00000508,
+  0x45014018, 0x00004545,
+  0x00808050, 0x00000000,
+  0x62208012, 0x00000000,
+  0x82000015, 0x00000800,
+  0x15200011, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x80000015, 0x0000eea4,
+  0x81000015, 0x0000005f,
+  0x00000060, 0x00000000,
+  0x00004120, 0x00000000,
+  0x00004a00, 0x00004000,
+  0x00924460, 0x00000190,
+  0x5601401a, 0x00005956,
+  0x14000011, 0x00000000,
+  0x00934050, 0x00000018,
+  0x00930050, 0x00000018,
+  0x3601403a, 0x0000002d,
+  0x000643a9, 0x00000000,
+  0x0000c420, 0x00000140,
+  0x5601401a, 0x00005956,
+  0x14000011, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x000642a9, 0x00000000,
+  0x00024420, 0x00000183,
+  0x5601401a, 0x00005956,
+  0x82000015, 0x00002000,
+  0x15200011, 0x00000000,
+  0x82000015, 0x00000010,
+  0x15200011, 0x00000000,
+  0x82000015, 0x00000010,
+  0x15200011, 0x00000000,
+};     /* 104 Rx instructions */
+#define FIRMWARE_RX_SIZE 104
+
+static const u32 firmware_tx[] = {
+  0x010003dc, 0x00000000,
+  0x04000421, 0x00000086,
+  0x80000015, 0x0000180e,
+  0x81000015, 0x00006664,
+  0x1a0040ab, 0x00000b06,
+  0x14200011, 0x00000000,
+  0x14204022, 0x0000aaaa,
+  0x14204022, 0x00000300,
+  0x14204022, 0x00000000,
+  0x1a0040ab, 0x00000b14,
+  0x14200011, 0x00000000,
+  0x83000015, 0x00000002,
+  0x04000021, 0x00000000,
+  0x00000010, 0x00000000,
+  0x04000421, 0x00000087,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00008015, 0x00000000,
+  0x0000003e, 0x00000000,
+  0x00000010, 0x00000000,
+  0x82000015, 0x00004000,
+  0x009e8050, 0x00000000,
+  0x03008015, 0x00000000,
+  0x86008015, 0x00000000,
+  0x82000015, 0x00008000,
+  0x0100001c, 0x00000000,
+  0x000050a0, 0x0000010c,
+  0x4e20d011, 0x00006008,
+  0x1420d012, 0x00004008,
+  0x0000f090, 0x00007000,
+  0x0000c8b0, 0x00003000,
+  0x00004040, 0x00000000,
+  0x00108015, 0x00000000,
+  0x00a2c150, 0x00004000,
+  0x00a400b0, 0x00000014,
+  0x00000020, 0x00000000,
+  0x2500400d, 0x00002525,
+  0x00047220, 0x00003100,
+  0x00934070, 0x00000000,
+  0x00000020, 0x00000000,
+  0x00924460, 0x00000184,
+  0x2b20c011, 0x00000000,
+  0x0000c420, 0x00000540,
+  0x36014018, 0x0000422d,
+  0x14200011, 0x00000000,
+  0x00924460, 0x00000183,
+  0x3200001f, 0x00000034,
+  0x02ac0015, 0x00000002,
+  0x00a60110, 0x00000008,
+  0x42200011, 0x00000000,
+  0x00924060, 0x00000103,
+  0x0000001e, 0x00000000,
+  0x00000020, 0x00000100,
+  0x0000001e, 0x00000000,
+  0x00924460, 0x00000086,
+  0x00004080, 0x00000000,
+  0x0092c070, 0x00000000,
+  0x00924060, 0x00000100,
+  0x0000c890, 0x00005000,
+  0x00a6c110, 0x00000000,
+  0x00b0c090, 0x00000012,
+  0x021c0015, 0x00000000,
+  0x3200001f, 0x00000034,
+  0x00924460, 0x00000510,
+  0x44210011, 0x00000000,
+  0x42000011, 0x00000000,
+  0x83000015, 0x00000040,
+  0x00924460, 0x00000508,
+  0x45014018, 0x00004545,
+  0x00808050, 0x00000000,
+  0x62208012, 0x00000000,
+  0x82000015, 0x00000800,
+  0x15200011, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x80000015, 0x0000eea4,
+  0x81000015, 0x0000005f,
+  0x00000060, 0x00000000,
+  0x00004120, 0x00000000,
+  0x00004a00, 0x00004000,
+  0x00924460, 0x00000190,
+  0x5601401a, 0x00005956,
+  0x14000011, 0x00000000,
+  0x00934050, 0x00000018,
+  0x00930050, 0x00000018,
+  0x3601403a, 0x0000002d,
+  0x000643a9, 0x00000000,
+  0x0000c420, 0x00000140,
+  0x5601401a, 0x00005956,
+  0x14000011, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x000642a9, 0x00000000,
+  0x00024420, 0x00000183,
+  0x5601401a, 0x00005956,
+  0x82000015, 0x00002000,
+  0x15200011, 0x00000000,
+  0x82000015, 0x00000010,
+  0x15200011, 0x00000000,
+  0x82000015, 0x00000010,
+  0x15200011, 0x00000000,
+};     /* 104 Tx instructions */
+#define FIRMWARE_TX_SIZE 104
+#if 0
+static const u32 firmware_wol[] = {
+  0x010003dc, 0x00000000,
+  0x19000421, 0x00000087,
+  0x80000015, 0x00001a1a,
+  0x81000015, 0x00001a1a,
+  0x1a0040ab, 0x00000b06,
+  0x15200011, 0x00000000,
+  0x15204022, 0x0000aaaa,
+  0x15204022, 0x00000300,
+  0x15204022, 0x00000000,
+  0x1a0040ab, 0x00000b15,
+  0x15200011, 0x00000000,
+  0x83000015, 0x00000002,
+  0x04000021, 0x00000000,
+  0x00000010, 0x00000000,
+  0x04000421, 0x00000087,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00008015, 0x00000000,
+  0x0000003e, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x82000015, 0x00004000,
+  0x82000015, 0x00008000,
+  0x0000000c, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00004080, 0x00000100,
+  0x1f20c011, 0x00001122,
+  0x2720f011, 0x00003011,
+  0x19200071, 0x00000000,
+  0x1a200051, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x1d2040a4, 0x00003344,
+  0x1d2040a2, 0x00005566,
+  0x000040a0, 0x00000100,
+  0x00108050, 0x00000001,
+  0x1a208012, 0x00000006,
+  0x82000015, 0x00008080,
+  0x010003dc, 0x00000000,
+  0x1d2040a4, 0x00002233,
+  0x1d2040a4, 0x00004455,
+  0x2d208011, 0x00000005,
+  0x1d2040a4, 0x00006611,
+  0x00108050, 0x00000001,
+  0x27200011, 0x00000000,
+  0x1d2050a4, 0x00006600,
+  0x82000015, 0x00008080,
+  0x010003dc, 0x00000000,
+  0x00000050, 0x00000000,
+  0x1b200031, 0x00000000,
+  0x0000001e, 0x00000000,
+  0x0000001e, 0x00000000,
+  0x0000001e, 0x00000000,
+  0x0000001e, 0x00000000,
+  0x00924460, 0x00000086,
+  0x00004080, 0x00000000,
+  0x0092c070, 0x00000000,
+  0x00924060, 0x00000100,
+  0x0000c890, 0x00005000,
+  0x00a6c110, 0x00000000,
+  0x00b0c090, 0x00000012,
+  0x021c0015, 0x00000000,
+  0x3200001f, 0x00000034,
+  0x00924460, 0x00000510,
+  0x44210011, 0x00000000,
+  0x42000011, 0x00000000,
+  0x83000015, 0x00000040,
+  0x00924460, 0x00000508,
+  0x476a0012, 0x00000100,
+  0x83000015, 0x00000008,
+  0x16200011, 0x00000000,
+  0x001e8050, 0x00000000,
+  0x001e8050, 0x00000000,
+  0x00808050, 0x00000000,
+  0x03008015, 0x00000000,
+  0x62208012, 0x00000000,
+  0x82000015, 0x00000800,
+  0x16200011, 0x00000000,
+  0x80000015, 0x0000eea4,
+  0x81000015, 0x0000005f,
+  0x00000020, 0x00000000,
+  0x00004120, 0x00000000,
+  0x00004a00, 0x00004000,
+  0x00924460, 0x00000190,
+  0x5c01401a, 0x0000595c,
+  0x15000011, 0x00000000,
+  0x00934050, 0x00000018,
+  0x00930050, 0x00000018,
+  0x3601403a, 0x0000002d,
+  0x00064029, 0x00000000,
+  0x0000c420, 0x00000140,
+  0x5c01401a, 0x0000595c,
+  0x15000011, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00000010, 0x00000000,
+  0x00064029, 0x00000000,
+  0x00024420, 0x00000183,
+  0x5c01401a, 0x0000595c,
+  0x82000015, 0x00002000,
+  0x16200011, 0x00000000,
+  0x82000015, 0x00000010,
+  0x16200011, 0x00000000,
+  0x82000015, 0x00000010,
+  0x16200011, 0x00000000,
+};     /* 104 WoL instructions */
+#define FIRMWARE_WOL_SIZE 104
+#endif
index f79b02e80e75da28e180131e6910c9e43dd7cf8f..a0b8848049c9ede346a9160c370d0b1df49c2798 100644 (file)
@@ -7,7 +7,12 @@
  * Copyright (C) 2005 Broadcom Corporation.
  *
  * Firmware is:
- *     Copyright (C) 2000-2003 Broadcom Corporation.
+ *     Derived from proprietary unpublished source code,
+ *     Copyright (C) 2000-2003 Broadcom Corporation.
+ *
+ *     Permission is hereby granted for the distribution of this firmware
+ *     data in hexadecimal or equivalent format, provided this copyright
+ *     notice is accompanying it.
  */
 
 #include <linux/config.h>
@@ -61,8 +66,8 @@
 
 #define DRV_MODULE_NAME                "tg3"
 #define PFX DRV_MODULE_NAME    ": "
-#define DRV_MODULE_VERSION     "3.27"
-#define DRV_MODULE_RELDATE     "May 5, 2005"
+#define DRV_MODULE_VERSION     "3.31"
+#define DRV_MODULE_RELDATE     "June 8, 2005"
 
 #define TG3_DEF_MAC_MODE       0
 #define TG3_DEF_RX_MODE                0
 /* number of ETHTOOL_GSTATS u64's */
 #define TG3_NUM_STATS          (sizeof(struct tg3_ethtool_stats)/sizeof(u64))
 
+#define TG3_NUM_TEST           6
+
 static char version[] __devinitdata =
        DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
 
@@ -206,6 +213,8 @@ static struct pci_device_id tg3_pci_tbl[] = {
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5752,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
+       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5752M,
+         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753M,
@@ -314,6 +323,17 @@ static struct {
        { "nic_tx_threshold_hit" }
 };
 
+static struct {
+       const char string[ETH_GSTRING_LEN];
+} ethtool_test_keys[TG3_NUM_TEST] = {
+       { "nvram test     (online) " },
+       { "link test      (online) " },
+       { "register test  (offline)" },
+       { "memory test    (offline)" },
+       { "loopback test  (offline)" },
+       { "interrupt test (offline)" },
+};
+
 static void tg3_write_indirect_reg32(struct tg3 *tp, u32 off, u32 val)
 {
        if ((tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) != 0) {
@@ -420,7 +440,8 @@ static void tg3_enable_ints(struct tg3 *tp)
 {
        tw32(TG3PCI_MISC_HOST_CTRL,
             (tp->misc_host_ctrl & ~MISC_HOST_CTRL_MASK_PCI_INT));
-       tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000000);
+       tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
+                    (tp->last_tag << 24));
        tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
 
        tg3_cond_int(tp);
@@ -455,10 +476,16 @@ static void tg3_restart_ints(struct tg3 *tp)
 {
        tw32(TG3PCI_MISC_HOST_CTRL,
                (tp->misc_host_ctrl & ~MISC_HOST_CTRL_MASK_PCI_INT));
-       tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000000);
+       tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
+                    tp->last_tag << 24);
        mmiowb();
 
-       if (tg3_has_work(tp))
+       /* When doing tagged status, this work check is unnecessary.
+        * The last_tag we write above tells the chip which piece of
+        * work we've completed.
+        */
+       if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) &&
+           tg3_has_work(tp))
                tw32(HOSTCC_MODE, tp->coalesce_mode |
                     (HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW));
 }
@@ -2500,7 +2527,7 @@ static int tg3_setup_phy(struct tg3 *tp, int force_reset)
        if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
                if (netif_carrier_ok(tp->dev)) {
                        tw32(HOSTCC_STAT_COAL_TICKS,
-                            DEFAULT_STAT_COAL_TICKS);
+                            tp->coal.stats_block_coalesce_usecs);
                } else {
                        tw32(HOSTCC_STAT_COAL_TICKS, 0);
                }
@@ -2886,7 +2913,6 @@ static int tg3_poll(struct net_device *netdev, int *budget)
         * All RX "locking" is done by ensuring outside
         * code synchronizes with dev->poll()
         */
-       done = 1;
        if (sblk->idx[0].rx_producer != tp->rx_rcb_ptr) {
                int orig_budget = *budget;
                int work_done;
@@ -2898,12 +2924,14 @@ static int tg3_poll(struct net_device *netdev, int *budget)
 
                *budget -= work_done;
                netdev->quota -= work_done;
-
-               if (work_done >= orig_budget)
-                       done = 0;
        }
 
+       if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
+               tp->last_tag = sblk->status_tag;
+       rmb();
+
        /* if no more work, tell net stack and NIC we're done */
+       done = !tg3_has_work(tp);
        if (done) {
                spin_lock_irqsave(&tp->lock, flags);
                __netif_rx_complete(netdev);
@@ -2928,22 +2956,21 @@ static irqreturn_t tg3_msi(int irq, void *dev_id, struct pt_regs *regs)
        spin_lock_irqsave(&tp->lock, flags);
 
        /*
-        * writing any value to intr-mbox-0 clears PCI INTA# and
+        * Writing any value to intr-mbox-0 clears PCI INTA# and
         * chip-internal interrupt pending events.
-        * writing non-zero to intr-mbox-0 additional tells the
+        * Writing non-zero to intr-mbox-0 additional tells the
         * NIC to stop sending us irqs, engaging "in-intr-handler"
         * event coalescing.
         */
        tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
+       tp->last_tag = sblk->status_tag;
        sblk->status &= ~SD_STATUS_UPDATED;
-
        if (likely(tg3_has_work(tp)))
                netif_rx_schedule(dev);         /* schedule NAPI poll */
        else {
-               /* no work, re-enable interrupts
-                */
+               /* No work, re-enable interrupts.  */
                tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
-                            0x00000000);
+                            tp->last_tag << 24);
        }
 
        spin_unlock_irqrestore(&tp->lock, flags);
@@ -2969,21 +2996,62 @@ static irqreturn_t tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        if ((sblk->status & SD_STATUS_UPDATED) ||
            !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) {
                /*
-                * writing any value to intr-mbox-0 clears PCI INTA# and
+                * Writing any value to intr-mbox-0 clears PCI INTA# and
                 * chip-internal interrupt pending events.
-                * writing non-zero to intr-mbox-0 additional tells the
+                * Writing non-zero to intr-mbox-0 additional tells the
                 * NIC to stop sending us irqs, engaging "in-intr-handler"
                 * event coalescing.
                 */
                tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
                             0x00000001);
+               sblk->status &= ~SD_STATUS_UPDATED;
+               if (likely(tg3_has_work(tp)))
+                       netif_rx_schedule(dev);         /* schedule NAPI poll */
+               else {
+                       /* No work, shared interrupt perhaps?  re-enable
+                        * interrupts, and flush that PCI write
+                        */
+                       tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
+                               0x00000000);
+                       tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
+               }
+       } else {        /* shared interrupt */
+               handled = 0;
+       }
+
+       spin_unlock_irqrestore(&tp->lock, flags);
+
+       return IRQ_RETVAL(handled);
+}
+
+static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id, struct pt_regs *regs)
+{
+       struct net_device *dev = dev_id;
+       struct tg3 *tp = netdev_priv(dev);
+       struct tg3_hw_status *sblk = tp->hw_status;
+       unsigned long flags;
+       unsigned int handled = 1;
+
+       spin_lock_irqsave(&tp->lock, flags);
+
+       /* In INTx mode, it is possible for the interrupt to arrive at
+        * the CPU before the status block posted prior to the interrupt.
+        * Reading the PCI State register will confirm whether the
+        * interrupt is ours and will flush the status block.
+        */
+       if ((sblk->status & SD_STATUS_UPDATED) ||
+           !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) {
                /*
-                * Flush PCI write.  This also guarantees that our
-                * status block has been flushed to host memory.
+                * writing any value to intr-mbox-0 clears PCI INTA# and
+                * chip-internal interrupt pending events.
+                * writing non-zero to intr-mbox-0 additional tells the
+                * NIC to stop sending us irqs, engaging "in-intr-handler"
+                * event coalescing.
                 */
-               tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
+               tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
+                            0x00000001);
+               tp->last_tag = sblk->status_tag;
                sblk->status &= ~SD_STATUS_UPDATED;
-
                if (likely(tg3_has_work(tp)))
                        netif_rx_schedule(dev);         /* schedule NAPI poll */
                else {
@@ -2991,7 +3059,7 @@ static irqreturn_t tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                         * interrupts, and flush that PCI write
                         */
                        tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
-                               0x00000000);
+                                    tp->last_tag << 24);
                        tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
                }
        } else {        /* shared interrupt */
@@ -3020,7 +3088,7 @@ static irqreturn_t tg3_test_isr(int irq, void *dev_id,
 }
 
 static int tg3_init_hw(struct tg3 *);
-static int tg3_halt(struct tg3 *, int);
+static int tg3_halt(struct tg3 *, int, int);
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
 static void tg3_poll_controller(struct net_device *dev)
@@ -3044,7 +3112,7 @@ static void tg3_reset_task(void *_data)
        restart_timer = tp->tg3_flags2 & TG3_FLG2_RESTART_TIMER;
        tp->tg3_flags2 &= ~TG3_FLG2_RESTART_TIMER;
 
-       tg3_halt(tp, 0);
+       tg3_halt(tp, RESET_KIND_SHUTDOWN, 0);
        tg3_init_hw(tp);
 
        tg3_netif_start(tp);
@@ -3390,7 +3458,7 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu)
        spin_lock_irq(&tp->lock);
        spin_lock(&tp->tx_lock);
 
-       tg3_halt(tp, 1);
+       tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
 
        tg3_set_mtu(dev, tp, new_mtu);
 
@@ -4081,19 +4149,19 @@ static void tg3_stop_fw(struct tg3 *tp)
 }
 
 /* tp->lock is held. */
-static int tg3_halt(struct tg3 *tp, int silent)
+static int tg3_halt(struct tg3 *tp, int kind, int silent)
 {
        int err;
 
        tg3_stop_fw(tp);
 
-       tg3_write_sig_pre_reset(tp, RESET_KIND_SHUTDOWN);
+       tg3_write_sig_pre_reset(tp, kind);
 
        tg3_abort_hw(tp, silent);
        err = tg3_chip_reset(tp);
 
-       tg3_write_sig_legacy(tp, RESET_KIND_SHUTDOWN);
-       tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN);
+       tg3_write_sig_legacy(tp, kind);
+       tg3_write_sig_post_reset(tp, kind);
 
        if (err)
                return err;
@@ -4307,7 +4375,12 @@ static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base, u32 cpu_scratch_b
         */
        tp->tg3_flags |= TG3_FLAG_PCIX_TARGET_HWBUG;
 
+       /* It is possible that bootcode is still loading at this point.
+        * Get the nvram lock first before halting the cpu.
+        */
+       tg3_nvram_lock(tp);
        err = tg3_halt_cpu(tp, cpu_base);
+       tg3_nvram_unlock(tp);
        if (err)
                goto out;
 
@@ -5044,6 +5117,27 @@ static void tg3_set_bdinfo(struct tg3 *tp, u32 bdinfo_addr,
 }
 
 static void __tg3_set_rx_mode(struct net_device *);
+static void tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec)
+{
+       tw32(HOSTCC_RXCOL_TICKS, ec->rx_coalesce_usecs);
+       tw32(HOSTCC_TXCOL_TICKS, ec->tx_coalesce_usecs);
+       tw32(HOSTCC_RXMAX_FRAMES, ec->rx_max_coalesced_frames);
+       tw32(HOSTCC_TXMAX_FRAMES, ec->tx_max_coalesced_frames);
+       if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
+               tw32(HOSTCC_RXCOAL_TICK_INT, ec->rx_coalesce_usecs_irq);
+               tw32(HOSTCC_TXCOAL_TICK_INT, ec->tx_coalesce_usecs_irq);
+       }
+       tw32(HOSTCC_RXCOAL_MAXF_INT, ec->rx_max_coalesced_frames_irq);
+       tw32(HOSTCC_TXCOAL_MAXF_INT, ec->tx_max_coalesced_frames_irq);
+       if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
+               u32 val = ec->stats_block_coalesce_usecs;
+
+               if (!netif_carrier_ok(tp->dev))
+                       val = 0;
+
+               tw32(HOSTCC_STAT_COAL_TICKS, val);
+       }
+}
 
 /* tp->lock is held. */
 static int tg3_reset_hw(struct tg3 *tp)
@@ -5366,16 +5460,7 @@ static int tg3_reset_hw(struct tg3 *tp)
                udelay(10);
        }
 
-       tw32(HOSTCC_RXCOL_TICKS, 0);
-       tw32(HOSTCC_TXCOL_TICKS, LOW_TXCOL_TICKS);
-       tw32(HOSTCC_RXMAX_FRAMES, 1);
-       tw32(HOSTCC_TXMAX_FRAMES, LOW_RXMAX_FRAMES);
-       if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
-               tw32(HOSTCC_RXCOAL_TICK_INT, 0);
-               tw32(HOSTCC_TXCOAL_TICK_INT, 0);
-       }
-       tw32(HOSTCC_RXCOAL_MAXF_INT, 1);
-       tw32(HOSTCC_TXCOAL_MAXF_INT, 0);
+       tg3_set_coalesce(tp, &tp->coal);
 
        /* set status block DMA address */
        tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
@@ -5388,8 +5473,6 @@ static int tg3_reset_hw(struct tg3 *tp)
                 * the tg3_periodic_fetch_stats call there, and
                 * tg3_get_stats to see how this works for 5705/5750 chips.
                 */
-               tw32(HOSTCC_STAT_COAL_TICKS,
-                    DEFAULT_STAT_COAL_TICKS);
                tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
                     ((u64) tp->stats_mapping >> 32));
                tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW,
@@ -5445,7 +5528,8 @@ static int tg3_reset_hw(struct tg3 *tp)
        udelay(100);
 
        tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0);
-       tr32(MAILBOX_INTERRUPT_0);
+       tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
+       tp->last_tag = 0;
 
        if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
                tw32_f(DMAC_MODE, DMAC_MODE_ENABLE);
@@ -5723,31 +5807,33 @@ static void tg3_timer(unsigned long __opaque)
        spin_lock_irqsave(&tp->lock, flags);
        spin_lock(&tp->tx_lock);
 
-       /* All of this garbage is because when using non-tagged
-        * IRQ status the mailbox/status_block protocol the chip
-        * uses with the cpu is race prone.
-        */
-       if (tp->hw_status->status & SD_STATUS_UPDATED) {
-               tw32(GRC_LOCAL_CTRL,
-                    tp->grc_local_ctrl | GRC_LCLCTRL_SETINT);
-       } else {
-               tw32(HOSTCC_MODE, tp->coalesce_mode |
-                    (HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW));
-       }
+       if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) {
+               /* All of this garbage is because when using non-tagged
+                * IRQ status the mailbox/status_block protocol the chip
+                * uses with the cpu is race prone.
+                */
+               if (tp->hw_status->status & SD_STATUS_UPDATED) {
+                       tw32(GRC_LOCAL_CTRL,
+                            tp->grc_local_ctrl | GRC_LCLCTRL_SETINT);
+               } else {
+                       tw32(HOSTCC_MODE, tp->coalesce_mode |
+                            (HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW));
+               }
 
-       if (!(tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) {
-               tp->tg3_flags2 |= TG3_FLG2_RESTART_TIMER;
-               spin_unlock(&tp->tx_lock);
-               spin_unlock_irqrestore(&tp->lock, flags);
-               schedule_work(&tp->reset_task);
-               return;
+               if (!(tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) {
+                       tp->tg3_flags2 |= TG3_FLG2_RESTART_TIMER;
+                       spin_unlock(&tp->tx_lock);
+                       spin_unlock_irqrestore(&tp->lock, flags);
+                       schedule_work(&tp->reset_task);
+                       return;
+               }
        }
 
-       if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
-               tg3_periodic_fetch_stats(tp);
-
        /* This part only runs once per second. */
        if (!--tp->timer_counter) {
+               if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
+                       tg3_periodic_fetch_stats(tp);
+
                if (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) {
                        u32 mac_stat;
                        int phy_event;
@@ -5818,6 +5904,9 @@ static int tg3_test_interrupt(struct tg3 *tp)
        int err, i;
        u32 int_mbox = 0;
 
+       if (!netif_running(dev))
+               return -ENODEV;
+
        tg3_disable_ints(tp);
 
        free_irq(tp->pdev->irq, dev);
@@ -5846,9 +5935,13 @@ static int tg3_test_interrupt(struct tg3 *tp)
        if (tp->tg3_flags2 & TG3_FLG2_USING_MSI)
                err = request_irq(tp->pdev->irq, tg3_msi,
                                  SA_SAMPLE_RANDOM, dev->name, dev);
-       else
-               err = request_irq(tp->pdev->irq, tg3_interrupt,
+       else {
+               irqreturn_t (*fn)(int, void *, struct pt_regs *)=tg3_interrupt;
+               if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
+                       fn = tg3_interrupt_tagged;
+               err = request_irq(tp->pdev->irq, fn,
                                  SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev);
+       }
 
        if (err)
                return err;
@@ -5900,9 +5993,14 @@ static int tg3_test_msi(struct tg3 *tp)
 
        tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
 
-       err = request_irq(tp->pdev->irq, tg3_interrupt,
-                         SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev);
+       {
+               irqreturn_t (*fn)(int, void *, struct pt_regs *)=tg3_interrupt;
+               if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
+                       fn = tg3_interrupt_tagged;
 
+               err = request_irq(tp->pdev->irq, fn,
+                                 SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev);
+       }
        if (err)
                return err;
 
@@ -5912,7 +6010,7 @@ static int tg3_test_msi(struct tg3 *tp)
        spin_lock_irq(&tp->lock);
        spin_lock(&tp->tx_lock);
 
-       tg3_halt(tp, 1);
+       tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
        err = tg3_init_hw(tp);
 
        spin_unlock(&tp->tx_lock);
@@ -5948,7 +6046,13 @@ static int tg3_open(struct net_device *dev)
        if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
            (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5750_AX) &&
            (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5750_BX)) {
-               if (pci_enable_msi(tp->pdev) == 0) {
+               /* All MSI supporting chips should support tagged
+                * status.  Assert that this is the case.
+                */
+               if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) {
+                       printk(KERN_WARNING PFX "%s: MSI without TAGGED? "
+                              "Not using MSI.\n", tp->dev->name);
+               } else if (pci_enable_msi(tp->pdev) == 0) {
                        u32 msi_mode;
 
                        msi_mode = tr32(MSGINT_MODE);
@@ -5959,9 +6063,14 @@ static int tg3_open(struct net_device *dev)
        if (tp->tg3_flags2 & TG3_FLG2_USING_MSI)
                err = request_irq(tp->pdev->irq, tg3_msi,
                                  SA_SAMPLE_RANDOM, dev->name, dev);
-       else
-               err = request_irq(tp->pdev->irq, tg3_interrupt,
+       else {
+               irqreturn_t (*fn)(int, void *, struct pt_regs *)=tg3_interrupt;
+               if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
+                       fn = tg3_interrupt_tagged;
+
+               err = request_irq(tp->pdev->irq, fn,
                                  SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev);
+       }
 
        if (err) {
                if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
@@ -5977,12 +6086,19 @@ static int tg3_open(struct net_device *dev)
 
        err = tg3_init_hw(tp);
        if (err) {
-               tg3_halt(tp, 1);
+               tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
                tg3_free_rings(tp);
        } else {
-               tp->timer_offset = HZ / 10;
-               tp->timer_counter = tp->timer_multiplier = 10;
-               tp->asf_counter = tp->asf_multiplier = (10 * 120);
+               if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
+                       tp->timer_offset = HZ;
+               else
+                       tp->timer_offset = HZ / 10;
+
+               BUG_ON(tp->timer_offset > HZ);
+               tp->timer_counter = tp->timer_multiplier =
+                       (HZ / tp->timer_offset);
+               tp->asf_counter = tp->asf_multiplier =
+                       ((HZ / tp->timer_offset) * 120);
 
                init_timer(&tp->timer);
                tp->timer.expires = jiffies + tp->timer_offset;
@@ -6005,6 +6121,7 @@ static int tg3_open(struct net_device *dev)
 
        if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
                err = tg3_test_msi(tp);
+
                if (err) {
                        spin_lock_irq(&tp->lock);
                        spin_lock(&tp->tx_lock);
@@ -6013,7 +6130,7 @@ static int tg3_open(struct net_device *dev)
                                pci_disable_msi(tp->pdev);
                                tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
                        }
-                       tg3_halt(tp, 1);
+                       tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
                        tg3_free_rings(tp);
                        tg3_free_consistent(tp);
 
@@ -6286,7 +6403,7 @@ static int tg3_close(struct net_device *dev)
 
        tg3_disable_ints(tp);
 
-       tg3_halt(tp, 1);
+       tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
        tg3_free_rings(tp);
        tp->tg3_flags &=
                ~(TG3_FLAG_INIT_COMPLETE |
@@ -7006,7 +7123,7 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e
        tp->tx_pending = ering->tx_pending;
 
        if (netif_running(dev)) {
-               tg3_halt(tp, 1);
+               tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
                tg3_init_hw(tp);
                tg3_netif_start(tp);
        }
@@ -7049,7 +7166,7 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
                tp->tg3_flags &= ~TG3_FLAG_TX_PAUSE;
 
        if (netif_running(dev)) {
-               tg3_halt(tp, 1);
+               tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
                tg3_init_hw(tp);
                tg3_netif_start(tp);
        }
@@ -7108,12 +7225,20 @@ static int tg3_get_stats_count (struct net_device *dev)
        return TG3_NUM_STATS;
 }
 
+static int tg3_get_test_count (struct net_device *dev)
+{
+       return TG3_NUM_TEST;
+}
+
 static void tg3_get_strings (struct net_device *dev, u32 stringset, u8 *buf)
 {
        switch (stringset) {
        case ETH_SS_STATS:
                memcpy(buf, &ethtool_stats_keys, sizeof(ethtool_stats_keys));
                break;
+       case ETH_SS_TEST:
+               memcpy(buf, &ethtool_test_keys, sizeof(ethtool_test_keys));
+               break;
        default:
                WARN_ON(1);     /* we need a WARN() */
                break;
@@ -7127,6 +7252,516 @@ static void tg3_get_ethtool_stats (struct net_device *dev,
        memcpy(tmp_stats, tg3_get_estats(tp), sizeof(tp->estats));
 }
 
+#define NVRAM_TEST_SIZE 0x100
+
+static int tg3_test_nvram(struct tg3 *tp)
+{
+       u32 *buf, csum;
+       int i, j, err = 0;
+
+       buf = kmalloc(NVRAM_TEST_SIZE, GFP_KERNEL);
+       if (buf == NULL)
+               return -ENOMEM;
+
+       for (i = 0, j = 0; i < NVRAM_TEST_SIZE; i += 4, j++) {
+               u32 val;
+
+               if ((err = tg3_nvram_read(tp, i, &val)) != 0)
+                       break;
+               buf[j] = cpu_to_le32(val);
+       }
+       if (i < NVRAM_TEST_SIZE)
+               goto out;
+
+       err = -EIO;
+       if (cpu_to_be32(buf[0]) != TG3_EEPROM_MAGIC)
+               goto out;
+
+       /* Bootstrap checksum at offset 0x10 */
+       csum = calc_crc((unsigned char *) buf, 0x10);
+       if(csum != cpu_to_le32(buf[0x10/4]))
+               goto out;
+
+       /* Manufacturing block starts at offset 0x74, checksum at 0xfc */
+       csum = calc_crc((unsigned char *) &buf[0x74/4], 0x88);
+       if (csum != cpu_to_le32(buf[0xfc/4]))
+                goto out;
+
+       err = 0;
+
+out:
+       kfree(buf);
+       return err;
+}
+
+#define TG3_SERDES_TIMEOUT_SEC 2
+#define TG3_COPPER_TIMEOUT_SEC 6
+
+static int tg3_test_link(struct tg3 *tp)
+{
+       int i, max;
+
+       if (!netif_running(tp->dev))
+               return -ENODEV;
+
+       if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
+               max = TG3_SERDES_TIMEOUT_SEC;
+       else
+               max = TG3_COPPER_TIMEOUT_SEC;
+
+       for (i = 0; i < max; i++) {
+               if (netif_carrier_ok(tp->dev))
+                       return 0;
+
+               if (msleep_interruptible(1000))
+                       break;
+       }
+
+       return -EIO;
+}
+
+/* Only test the commonly used registers */
+static int tg3_test_registers(struct tg3 *tp)
+{
+       int i, is_5705;
+       u32 offset, read_mask, write_mask, val, save_val, read_val;
+       static struct {
+               u16 offset;
+               u16 flags;
+#define TG3_FL_5705    0x1
+#define TG3_FL_NOT_5705        0x2
+#define TG3_FL_NOT_5788        0x4
+               u32 read_mask;
+               u32 write_mask;
+       } reg_tbl[] = {
+               /* MAC Control Registers */
+               { MAC_MODE, TG3_FL_NOT_5705,
+                       0x00000000, 0x00ef6f8c },
+               { MAC_MODE, TG3_FL_5705,
+                       0x00000000, 0x01ef6b8c },
+               { MAC_STATUS, TG3_FL_NOT_5705,
+                       0x03800107, 0x00000000 },
+               { MAC_STATUS, TG3_FL_5705,
+                       0x03800100, 0x00000000 },
+               { MAC_ADDR_0_HIGH, 0x0000,
+                       0x00000000, 0x0000ffff },
+               { MAC_ADDR_0_LOW, 0x0000,
+                       0x00000000, 0xffffffff },
+               { MAC_RX_MTU_SIZE, 0x0000,
+                       0x00000000, 0x0000ffff },
+               { MAC_TX_MODE, 0x0000,
+                       0x00000000, 0x00000070 },
+               { MAC_TX_LENGTHS, 0x0000,
+                       0x00000000, 0x00003fff },
+               { MAC_RX_MODE, TG3_FL_NOT_5705,
+                       0x00000000, 0x000007fc },
+               { MAC_RX_MODE, TG3_FL_5705,
+                       0x00000000, 0x000007dc },
+               { MAC_HASH_REG_0, 0x0000,
+                       0x00000000, 0xffffffff },
+               { MAC_HASH_REG_1, 0x0000,
+                       0x00000000, 0xffffffff },
+               { MAC_HASH_REG_2, 0x0000,
+                       0x00000000, 0xffffffff },
+               { MAC_HASH_REG_3, 0x0000,
+                       0x00000000, 0xffffffff },
+
+               /* Receive Data and Receive BD Initiator Control Registers. */
+               { RCVDBDI_JUMBO_BD+0, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { RCVDBDI_JUMBO_BD+4, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { RCVDBDI_JUMBO_BD+8, TG3_FL_NOT_5705,
+                       0x00000000, 0x00000003 },
+               { RCVDBDI_JUMBO_BD+0xc, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { RCVDBDI_STD_BD+0, 0x0000,
+                       0x00000000, 0xffffffff },
+               { RCVDBDI_STD_BD+4, 0x0000,
+                       0x00000000, 0xffffffff },
+               { RCVDBDI_STD_BD+8, 0x0000,
+                       0x00000000, 0xffff0002 },
+               { RCVDBDI_STD_BD+0xc, 0x0000,
+                       0x00000000, 0xffffffff },
+       
+               /* Receive BD Initiator Control Registers. */
+               { RCVBDI_STD_THRESH, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { RCVBDI_STD_THRESH, TG3_FL_5705,
+                       0x00000000, 0x000003ff },
+               { RCVBDI_JUMBO_THRESH, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+       
+               /* Host Coalescing Control Registers. */
+               { HOSTCC_MODE, TG3_FL_NOT_5705,
+                       0x00000000, 0x00000004 },
+               { HOSTCC_MODE, TG3_FL_5705,
+                       0x00000000, 0x000000f6 },
+               { HOSTCC_RXCOL_TICKS, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { HOSTCC_RXCOL_TICKS, TG3_FL_5705,
+                       0x00000000, 0x000003ff },
+               { HOSTCC_TXCOL_TICKS, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { HOSTCC_TXCOL_TICKS, TG3_FL_5705,
+                       0x00000000, 0x000003ff },
+               { HOSTCC_RXMAX_FRAMES, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { HOSTCC_RXMAX_FRAMES, TG3_FL_5705 | TG3_FL_NOT_5788,
+                       0x00000000, 0x000000ff },
+               { HOSTCC_TXMAX_FRAMES, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { HOSTCC_TXMAX_FRAMES, TG3_FL_5705 | TG3_FL_NOT_5788,
+                       0x00000000, 0x000000ff },
+               { HOSTCC_RXCOAL_TICK_INT, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { HOSTCC_TXCOAL_TICK_INT, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { HOSTCC_RXCOAL_MAXF_INT, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { HOSTCC_RXCOAL_MAXF_INT, TG3_FL_5705 | TG3_FL_NOT_5788,
+                       0x00000000, 0x000000ff },
+               { HOSTCC_TXCOAL_MAXF_INT, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { HOSTCC_TXCOAL_MAXF_INT, TG3_FL_5705 | TG3_FL_NOT_5788,
+                       0x00000000, 0x000000ff },
+               { HOSTCC_STAT_COAL_TICKS, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { HOSTCC_STATS_BLK_HOST_ADDR, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { HOSTCC_STATS_BLK_HOST_ADDR+4, TG3_FL_NOT_5705,
+                       0x00000000, 0xffffffff },
+               { HOSTCC_STATUS_BLK_HOST_ADDR, 0x0000,
+                       0x00000000, 0xffffffff },
+               { HOSTCC_STATUS_BLK_HOST_ADDR+4, 0x0000,
+                       0x00000000, 0xffffffff },
+               { HOSTCC_STATS_BLK_NIC_ADDR, 0x0000,
+                       0xffffffff, 0x00000000 },
+               { HOSTCC_STATUS_BLK_NIC_ADDR, 0x0000,
+                       0xffffffff, 0x00000000 },
+
+               /* Buffer Manager Control Registers. */
+               { BUFMGR_MB_POOL_ADDR, 0x0000,
+                       0x00000000, 0x007fff80 },
+               { BUFMGR_MB_POOL_SIZE, 0x0000,
+                       0x00000000, 0x007fffff },
+               { BUFMGR_MB_RDMA_LOW_WATER, 0x0000,
+                       0x00000000, 0x0000003f },
+               { BUFMGR_MB_MACRX_LOW_WATER, 0x0000,
+                       0x00000000, 0x000001ff },
+               { BUFMGR_MB_HIGH_WATER, 0x0000,
+                       0x00000000, 0x000001ff },
+               { BUFMGR_DMA_DESC_POOL_ADDR, TG3_FL_NOT_5705,
+                       0xffffffff, 0x00000000 },
+               { BUFMGR_DMA_DESC_POOL_SIZE, TG3_FL_NOT_5705,
+                       0xffffffff, 0x00000000 },
+       
+               /* Mailbox Registers */
+               { GRCMBOX_RCVSTD_PROD_IDX+4, 0x0000,
+                       0x00000000, 0x000001ff },
+               { GRCMBOX_RCVJUMBO_PROD_IDX+4, TG3_FL_NOT_5705,
+                       0x00000000, 0x000001ff },
+               { GRCMBOX_RCVRET_CON_IDX_0+4, 0x0000,
+                       0x00000000, 0x000007ff },
+               { GRCMBOX_SNDHOST_PROD_IDX_0+4, 0x0000,
+                       0x00000000, 0x000001ff },
+
+               { 0xffff, 0x0000, 0x00000000, 0x00000000 },
+       };
+
+       if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
+               is_5705 = 1;
+       else
+               is_5705 = 0;
+
+       for (i = 0; reg_tbl[i].offset != 0xffff; i++) {
+               if (is_5705 && (reg_tbl[i].flags & TG3_FL_NOT_5705))
+                       continue;
+
+               if (!is_5705 && (reg_tbl[i].flags & TG3_FL_5705))
+                       continue;
+
+               if ((tp->tg3_flags2 & TG3_FLG2_IS_5788) &&
+                   (reg_tbl[i].flags & TG3_FL_NOT_5788))
+                       continue;
+
+               offset = (u32) reg_tbl[i].offset;
+               read_mask = reg_tbl[i].read_mask;
+               write_mask = reg_tbl[i].write_mask;
+
+               /* Save the original register content */
+               save_val = tr32(offset);
+
+               /* Determine the read-only value. */
+               read_val = save_val & read_mask;
+
+               /* Write zero to the register, then make sure the read-only bits
+                * are not changed and the read/write bits are all zeros.
+                */
+               tw32(offset, 0);
+
+               val = tr32(offset);
+
+               /* Test the read-only and read/write bits. */
+               if (((val & read_mask) != read_val) || (val & write_mask))
+                       goto out;
+
+               /* Write ones to all the bits defined by RdMask and WrMask, then
+                * make sure the read-only bits are not changed and the
+                * read/write bits are all ones.
+                */
+               tw32(offset, read_mask | write_mask);
+
+               val = tr32(offset);
+
+               /* Test the read-only bits. */
+               if ((val & read_mask) != read_val)
+                       goto out;
+
+               /* Test the read/write bits. */
+               if ((val & write_mask) != write_mask)
+                       goto out;
+
+               tw32(offset, save_val);
+       }
+
+       return 0;
+
+out:
+       printk(KERN_ERR PFX "Register test failed at offset %x\n", offset);
+       tw32(offset, save_val);
+       return -EIO;
+}
+
+static int tg3_do_mem_test(struct tg3 *tp, u32 offset, u32 len)
+{
+       static u32 test_pattern[] = { 0x00000000, 0xffffffff, 0xaa55a55a };
+       int i;
+       u32 j;
+
+       for (i = 0; i < sizeof(test_pattern)/sizeof(u32); i++) {
+               for (j = 0; j < len; j += 4) {
+                       u32 val;
+
+                       tg3_write_mem(tp, offset + j, test_pattern[i]);
+                       tg3_read_mem(tp, offset + j, &val);
+                       if (val != test_pattern[i])
+                               return -EIO;
+               }
+       }
+       return 0;
+}
+
+static int tg3_test_memory(struct tg3 *tp)
+{
+       static struct mem_entry {
+               u32 offset;
+               u32 len;
+       } mem_tbl_570x[] = {
+               { 0x00000000, 0x01000},
+               { 0x00002000, 0x1c000},
+               { 0xffffffff, 0x00000}
+       }, mem_tbl_5705[] = {
+               { 0x00000100, 0x0000c},
+               { 0x00000200, 0x00008},
+               { 0x00000b50, 0x00400},
+               { 0x00004000, 0x00800},
+               { 0x00006000, 0x01000},
+               { 0x00008000, 0x02000},
+               { 0x00010000, 0x0e000},
+               { 0xffffffff, 0x00000}
+       };
+       struct mem_entry *mem_tbl;
+       int err = 0;
+       int i;
+
+       if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
+               mem_tbl = mem_tbl_5705;
+       else
+               mem_tbl = mem_tbl_570x;
+
+       for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) {
+               if ((err = tg3_do_mem_test(tp, mem_tbl[i].offset,
+                   mem_tbl[i].len)) != 0)
+                       break;
+       }
+       
+       return err;
+}
+
+static int tg3_test_loopback(struct tg3 *tp)
+{
+       u32 mac_mode, send_idx, rx_start_idx, rx_idx, tx_idx, opaque_key;
+       u32 desc_idx;
+       struct sk_buff *skb, *rx_skb;
+       u8 *tx_data;
+       dma_addr_t map;
+       int num_pkts, tx_len, rx_len, i, err;
+       struct tg3_rx_buffer_desc *desc;
+
+       if (!netif_running(tp->dev))
+               return -ENODEV;
+
+       err = -EIO;
+
+       tg3_abort_hw(tp, 1);
+
+       /* Clearing this flag to keep interrupts disabled */
+       tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE;
+       tg3_reset_hw(tp);
+
+       mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) |
+                  MAC_MODE_PORT_INT_LPBACK | MAC_MODE_LINK_POLARITY |
+                  MAC_MODE_PORT_MODE_GMII;
+       tw32(MAC_MODE, mac_mode);
+
+       tx_len = 1514;
+       skb = dev_alloc_skb(tx_len);
+       tx_data = skb_put(skb, tx_len);
+       memcpy(tx_data, tp->dev->dev_addr, 6);
+       memset(tx_data + 6, 0x0, 8);
+
+       tw32(MAC_RX_MTU_SIZE, tx_len + 4);
+
+       for (i = 14; i < tx_len; i++)
+               tx_data[i] = (u8) (i & 0xff);
+
+       map = pci_map_single(tp->pdev, skb->data, tx_len, PCI_DMA_TODEVICE);
+
+       tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE |
+            HOSTCC_MODE_NOW);
+
+       udelay(10);
+
+       rx_start_idx = tp->hw_status->idx[0].rx_producer;
+
+       send_idx = 0;
+       num_pkts = 0;
+
+       tg3_set_txd(tp, send_idx, map, tx_len, 0, 1);
+
+       send_idx++;
+       num_pkts++;
+
+       tw32_tx_mbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW, send_idx);
+       tr32(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW);
+
+       udelay(10);
+
+       for (i = 0; i < 10; i++) {
+               tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE |
+                      HOSTCC_MODE_NOW);
+
+               udelay(10);
+
+               tx_idx = tp->hw_status->idx[0].tx_consumer;
+               rx_idx = tp->hw_status->idx[0].rx_producer;
+               if ((tx_idx == send_idx) &&
+                   (rx_idx == (rx_start_idx + num_pkts)))
+                       break;
+       }
+
+       pci_unmap_single(tp->pdev, map, tx_len, PCI_DMA_TODEVICE);
+       dev_kfree_skb(skb);
+
+       if (tx_idx != send_idx)
+               goto out;
+
+       if (rx_idx != rx_start_idx + num_pkts)
+               goto out;
+
+       desc = &tp->rx_rcb[rx_start_idx];
+       desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK;
+       opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK;
+       if (opaque_key != RXD_OPAQUE_RING_STD)
+               goto out;
+
+       if ((desc->err_vlan & RXD_ERR_MASK) != 0 &&
+           (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII))
+               goto out;
+
+       rx_len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - 4;
+       if (rx_len != tx_len)
+               goto out;
+
+       rx_skb = tp->rx_std_buffers[desc_idx].skb;
+
+       map = pci_unmap_addr(&tp->rx_std_buffers[desc_idx], mapping);
+       pci_dma_sync_single_for_cpu(tp->pdev, map, rx_len, PCI_DMA_FROMDEVICE);
+
+       for (i = 14; i < tx_len; i++) {
+               if (*(rx_skb->data + i) != (u8) (i & 0xff))
+                       goto out;
+       }
+       err = 0;
+       
+       /* tg3_free_rings will unmap and free the rx_skb */
+out:
+       return err;
+}
+
+static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
+                         u64 *data)
+{
+       struct tg3 *tp = netdev_priv(dev);
+
+       memset(data, 0, sizeof(u64) * TG3_NUM_TEST);
+
+       if (tg3_test_nvram(tp) != 0) {
+               etest->flags |= ETH_TEST_FL_FAILED;
+               data[0] = 1;
+       }
+       if (tg3_test_link(tp) != 0) {
+               etest->flags |= ETH_TEST_FL_FAILED;
+               data[1] = 1;
+       }
+       if (etest->flags & ETH_TEST_FL_OFFLINE) {
+               if (netif_running(dev))
+                       tg3_netif_stop(tp);
+
+               spin_lock_irq(&tp->lock);
+               spin_lock(&tp->tx_lock);
+
+               tg3_halt(tp, RESET_KIND_SUSPEND, 1);
+               tg3_nvram_lock(tp);
+               tg3_halt_cpu(tp, RX_CPU_BASE);
+               if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
+                       tg3_halt_cpu(tp, TX_CPU_BASE);
+               tg3_nvram_unlock(tp);
+
+               if (tg3_test_registers(tp) != 0) {
+                       etest->flags |= ETH_TEST_FL_FAILED;
+                       data[2] = 1;
+               }
+               if (tg3_test_memory(tp) != 0) {
+                       etest->flags |= ETH_TEST_FL_FAILED;
+                       data[3] = 1;
+               }
+               if (tg3_test_loopback(tp) != 0) {
+                       etest->flags |= ETH_TEST_FL_FAILED;
+                       data[4] = 1;
+               }
+
+               spin_unlock(&tp->tx_lock);
+               spin_unlock_irq(&tp->lock);
+               if (tg3_test_interrupt(tp) != 0) {
+                       etest->flags |= ETH_TEST_FL_FAILED;
+                       data[5] = 1;
+               }
+               spin_lock_irq(&tp->lock);
+               spin_lock(&tp->tx_lock);
+
+               tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
+               if (netif_running(dev)) {
+                       tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
+                       tg3_init_hw(tp);
+                       tg3_netif_start(tp);
+               }
+               spin_unlock(&tp->tx_lock);
+               spin_unlock_irq(&tp->lock);
+       }
+}
+
 static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
        struct mii_ioctl_data *data = if_mii(ifr);
@@ -7203,6 +7838,14 @@ static void tg3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
 }
 #endif
 
+static int tg3_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
+{
+       struct tg3 *tp = netdev_priv(dev);
+
+       memcpy(ec, &tp->coal, sizeof(*ec));
+       return 0;
+}
+
 static struct ethtool_ops tg3_ethtool_ops = {
        .get_settings           = tg3_get_settings,
        .set_settings           = tg3_set_settings,
@@ -7232,9 +7875,12 @@ static struct ethtool_ops tg3_ethtool_ops = {
        .get_tso                = ethtool_op_get_tso,
        .set_tso                = tg3_set_tso,
 #endif
+       .self_test_count        = tg3_get_test_count,
+       .self_test              = tg3_self_test,
        .get_strings            = tg3_get_strings,
        .get_stats_count        = tg3_get_stats_count,
        .get_ethtool_stats      = tg3_get_ethtool_stats,
+       .get_coalesce           = tg3_get_coalesce,
 };
 
 static void __devinit tg3_get_eeprom_size(struct tg3 *tp)
@@ -7914,6 +8560,16 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
 
                case NIC_SRAM_DATA_CFG_LED_MODE_MAC:
                        tp->led_ctrl = LED_CTRL_MODE_MAC;
+
+                       /* Default to PHY_1_MODE if 0 (MAC_MODE) is
+                        * read on some older 5700/5701 bootcode.
+                        */
+                       if (GET_ASIC_REV(tp->pci_chip_rev_id) ==
+                           ASIC_REV_5700 ||
+                           GET_ASIC_REV(tp->pci_chip_rev_id) ==
+                           ASIC_REV_5701)
+                               tp->led_ctrl = LED_CTRL_MODE_PHY_1;
+
                        break;
 
                case SHASTA_EXT_LED_SHARED:
@@ -8422,15 +9078,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
        if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
                tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG;
 
-       /* Only 5701 and later support tagged irq status mode.
-        * Also, 5788 chips cannot use tagged irq status.
-        *
-        * However, since we are using NAPI avoid tagged irq status
-        * because the interrupt condition is more difficult to
-        * fully clear in that mode.
-        */
        tp->coalesce_mode = 0;
-
        if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX &&
            GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_BX)
                tp->coalesce_mode |= HOSTCC_MODE_32BYTE;
@@ -8494,6 +9142,18 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
             grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788M))
                tp->tg3_flags2 |= TG3_FLG2_IS_5788;
 
+       if (!(tp->tg3_flags2 & TG3_FLG2_IS_5788) &&
+           (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700))
+               tp->tg3_flags |= TG3_FLAG_TAGGED_STATUS;
+       if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) {
+               tp->coalesce_mode |= (HOSTCC_MODE_CLRTICK_RXBD |
+                                     HOSTCC_MODE_CLRTICK_TXBD);
+
+               tp->misc_host_ctrl |= MISC_HOST_CTRL_TAGGED_STATUS;
+               pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
+                                      tp->misc_host_ctrl);
+       }
+
        /* these are limited to 10/100 only */
        if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 &&
             (grc_misc_cfg == 0x8000 || grc_misc_cfg == 0x4000)) ||
@@ -8671,6 +9331,146 @@ static int __devinit tg3_get_device_address(struct tg3 *tp)
        return 0;
 }
 
+#define BOUNDARY_SINGLE_CACHELINE      1
+#define BOUNDARY_MULTI_CACHELINE       2
+
+static u32 __devinit tg3_calc_dma_bndry(struct tg3 *tp, u32 val)
+{
+       int cacheline_size;
+       u8 byte;
+       int goal;
+
+       pci_read_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, &byte);
+       if (byte == 0)
+               cacheline_size = 1024;
+       else
+               cacheline_size = (int) byte * 4;
+
+       /* On 5703 and later chips, the boundary bits have no
+        * effect.
+        */
+       if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
+           GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701 &&
+           !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS))
+               goto out;
+
+#if defined(CONFIG_PPC64) || defined(CONFIG_IA64) || defined(CONFIG_PARISC)
+       goal = BOUNDARY_MULTI_CACHELINE;
+#else
+#if defined(CONFIG_SPARC64) || defined(CONFIG_ALPHA)
+       goal = BOUNDARY_SINGLE_CACHELINE;
+#else
+       goal = 0;
+#endif
+#endif
+
+       if (!goal)
+               goto out;
+
+       /* PCI controllers on most RISC systems tend to disconnect
+        * when a device tries to burst across a cache-line boundary.
+        * Therefore, letting tg3 do so just wastes PCI bandwidth.
+        *
+        * Unfortunately, for PCI-E there are only limited
+        * write-side controls for this, and thus for reads
+        * we will still get the disconnects.  We'll also waste
+        * these PCI cycles for both read and write for chips
+        * other than 5700 and 5701 which do not implement the
+        * boundary bits.
+        */
+       if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) &&
+           !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) {
+               switch (cacheline_size) {
+               case 16:
+               case 32:
+               case 64:
+               case 128:
+                       if (goal == BOUNDARY_SINGLE_CACHELINE) {
+                               val |= (DMA_RWCTRL_READ_BNDRY_128_PCIX |
+                                       DMA_RWCTRL_WRITE_BNDRY_128_PCIX);
+                       } else {
+                               val |= (DMA_RWCTRL_READ_BNDRY_384_PCIX |
+                                       DMA_RWCTRL_WRITE_BNDRY_384_PCIX);
+                       }
+                       break;
+
+               case 256:
+                       val |= (DMA_RWCTRL_READ_BNDRY_256_PCIX |
+                               DMA_RWCTRL_WRITE_BNDRY_256_PCIX);
+                       break;
+
+               default:
+                       val |= (DMA_RWCTRL_READ_BNDRY_384_PCIX |
+                               DMA_RWCTRL_WRITE_BNDRY_384_PCIX);
+                       break;
+               };
+       } else if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
+               switch (cacheline_size) {
+               case 16:
+               case 32:
+               case 64:
+                       if (goal == BOUNDARY_SINGLE_CACHELINE) {
+                               val &= ~DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE;
+                               val |= DMA_RWCTRL_WRITE_BNDRY_64_PCIE;
+                               break;
+                       }
+                       /* fallthrough */
+               case 128:
+               default:
+                       val &= ~DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE;
+                       val |= DMA_RWCTRL_WRITE_BNDRY_128_PCIE;
+                       break;
+               };
+       } else {
+               switch (cacheline_size) {
+               case 16:
+                       if (goal == BOUNDARY_SINGLE_CACHELINE) {
+                               val |= (DMA_RWCTRL_READ_BNDRY_16 |
+                                       DMA_RWCTRL_WRITE_BNDRY_16);
+                               break;
+                       }
+                       /* fallthrough */
+               case 32:
+                       if (goal == BOUNDARY_SINGLE_CACHELINE) {
+                               val |= (DMA_RWCTRL_READ_BNDRY_32 |
+                                       DMA_RWCTRL_WRITE_BNDRY_32);
+                               break;
+                       }
+                       /* fallthrough */
+               case 64:
+                       if (goal == BOUNDARY_SINGLE_CACHELINE) {
+                               val |= (DMA_RWCTRL_READ_BNDRY_64 |
+                                       DMA_RWCTRL_WRITE_BNDRY_64);
+                               break;
+                       }
+                       /* fallthrough */
+               case 128:
+                       if (goal == BOUNDARY_SINGLE_CACHELINE) {
+                               val |= (DMA_RWCTRL_READ_BNDRY_128 |
+                                       DMA_RWCTRL_WRITE_BNDRY_128);
+                               break;
+                       }
+                       /* fallthrough */
+               case 256:
+                       val |= (DMA_RWCTRL_READ_BNDRY_256 |
+                               DMA_RWCTRL_WRITE_BNDRY_256);
+                       break;
+               case 512:
+                       val |= (DMA_RWCTRL_READ_BNDRY_512 |
+                               DMA_RWCTRL_WRITE_BNDRY_512);
+                       break;
+               case 1024:
+               default:
+                       val |= (DMA_RWCTRL_READ_BNDRY_1024 |
+                               DMA_RWCTRL_WRITE_BNDRY_1024);
+                       break;
+               };
+       }
+
+out:
+       return val;
+}
+
 static int __devinit tg3_do_test_dma(struct tg3 *tp, u32 *buf, dma_addr_t buf_dma, int size, int to_device)
 {
        struct tg3_internal_buffer_desc test_desc;
@@ -8752,12 +9552,12 @@ static int __devinit tg3_do_test_dma(struct tg3 *tp, u32 *buf, dma_addr_t buf_dm
        return ret;
 }
 
-#define TEST_BUFFER_SIZE       0x400
+#define TEST_BUFFER_SIZE       0x2000
 
 static int __devinit tg3_test_dma(struct tg3 *tp)
 {
        dma_addr_t buf_dma;
-       u32 *buf;
+       u32 *buf, saved_dma_rwctrl;
        int ret;
 
        buf = pci_alloc_consistent(tp->pdev, TEST_BUFFER_SIZE, &buf_dma);
@@ -8769,46 +9569,7 @@ static int __devinit tg3_test_dma(struct tg3 *tp)
        tp->dma_rwctrl = ((0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) |
                          (0x6 << DMA_RWCTRL_PCI_READ_CMD_SHIFT));
 
-#ifndef CONFIG_X86
-       {
-               u8 byte;
-               int cacheline_size;
-               pci_read_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, &byte);
-
-               if (byte == 0)
-                       cacheline_size = 1024;
-               else
-                       cacheline_size = (int) byte * 4;
-
-               switch (cacheline_size) {
-               case 16:
-               case 32:
-               case 64:
-               case 128:
-                       if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) &&
-                           !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) {
-                               tp->dma_rwctrl |=
-                                       DMA_RWCTRL_WRITE_BNDRY_384_PCIX;
-                               break;
-                       } else if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
-                               tp->dma_rwctrl &=
-                                       ~(DMA_RWCTRL_PCI_WRITE_CMD);
-                               tp->dma_rwctrl |=
-                                       DMA_RWCTRL_WRITE_BNDRY_128_PCIE;
-                               break;
-                       }
-                       /* fallthrough */
-               case 256:
-                       if (!(tp->tg3_flags & TG3_FLAG_PCIX_MODE) &&
-                           !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS))
-                               tp->dma_rwctrl |=
-                                       DMA_RWCTRL_WRITE_BNDRY_256;
-                       else if (!(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS))
-                               tp->dma_rwctrl |=
-                                       DMA_RWCTRL_WRITE_BNDRY_256_PCIX;
-               };
-       }
-#endif
+       tp->dma_rwctrl = tg3_calc_dma_bndry(tp, tp->dma_rwctrl);
 
        if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
                /* DMA read watermark not used on PCIE */
@@ -8827,7 +9588,7 @@ static int __devinit tg3_test_dma(struct tg3 *tp)
                        if (ccval == 0x6 || ccval == 0x7)
                                tp->dma_rwctrl |= DMA_RWCTRL_ONE_DMA;
 
-                       /* Set bit 23 to renable PCIX hw bug fix */
+                       /* Set bit 23 to enable PCIX hw bug fix */
                        tp->dma_rwctrl |= 0x009f0000;
                } else {
                        tp->dma_rwctrl |= 0x001b000f;
@@ -8868,6 +9629,13 @@ static int __devinit tg3_test_dma(struct tg3 *tp)
            GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701)
                goto out;
 
+       /* It is best to perform DMA test with maximum write burst size
+        * to expose the 5700/5701 write DMA bug.
+        */
+       saved_dma_rwctrl = tp->dma_rwctrl;
+       tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK;
+       tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
+
        while (1) {
                u32 *p = buf, i;
 
@@ -8906,8 +9674,9 @@ static int __devinit tg3_test_dma(struct tg3 *tp)
                        if (p[i] == i)
                                continue;
 
-                       if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) ==
-                           DMA_RWCTRL_WRITE_BNDRY_DISAB) {
+                       if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) !=
+                           DMA_RWCTRL_WRITE_BNDRY_16) {
+                               tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK;
                                tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16;
                                tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
                                break;
@@ -8924,6 +9693,28 @@ static int __devinit tg3_test_dma(struct tg3 *tp)
                        break;
                }
        }
+       if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) !=
+           DMA_RWCTRL_WRITE_BNDRY_16) {
+               static struct pci_device_id dma_wait_state_chipsets[] = {
+                       { PCI_DEVICE(PCI_VENDOR_ID_APPLE,
+                                    PCI_DEVICE_ID_APPLE_UNI_N_PCI15) },
+                       { },
+               };
+
+               /* DMA test passed without adjusting DMA boundary,
+                * now look for chipsets that are known to expose the
+                * DMA bug without failing the test.
+                */
+               if (pci_dev_present(dma_wait_state_chipsets)) {
+                       tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK;
+                       tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16;
+               }
+               else
+                       /* Safe to use the calculated DMA boundary. */
+                       tp->dma_rwctrl = saved_dma_rwctrl;
+
+               tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
+       }
 
 out:
        pci_free_consistent(tp->pdev, TEST_BUFFER_SIZE, buf, buf_dma);
@@ -9011,6 +9802,31 @@ static struct pci_dev * __devinit tg3_find_5704_peer(struct tg3 *tp)
        return peer;
 }
 
+static void __devinit tg3_init_coal(struct tg3 *tp)
+{
+       struct ethtool_coalesce *ec = &tp->coal;
+
+       memset(ec, 0, sizeof(*ec));
+       ec->cmd = ETHTOOL_GCOALESCE;
+       ec->rx_coalesce_usecs = LOW_RXCOL_TICKS;
+       ec->tx_coalesce_usecs = LOW_TXCOL_TICKS;
+       ec->rx_max_coalesced_frames = LOW_RXMAX_FRAMES;
+       ec->tx_max_coalesced_frames = LOW_TXMAX_FRAMES;
+       ec->rx_coalesce_usecs_irq = DEFAULT_RXCOAL_TICK_INT;
+       ec->tx_coalesce_usecs_irq = DEFAULT_TXCOAL_TICK_INT;
+       ec->rx_max_coalesced_frames_irq = DEFAULT_RXCOAL_MAXF_INT;
+       ec->tx_max_coalesced_frames_irq = DEFAULT_TXCOAL_MAXF_INT;
+       ec->stats_block_coalesce_usecs = DEFAULT_STAT_COAL_TICKS;
+
+       if (tp->coalesce_mode & (HOSTCC_MODE_CLRTICK_RXBD |
+                                HOSTCC_MODE_CLRTICK_TXBD)) {
+               ec->rx_coalesce_usecs = LOW_RXCOL_TICKS_CLRTCKS;
+               ec->rx_coalesce_usecs_irq = DEFAULT_RXCOAL_TICK_INT_CLRTCKS;
+               ec->tx_coalesce_usecs = LOW_TXCOL_TICKS_CLRTCKS;
+               ec->tx_coalesce_usecs_irq = DEFAULT_TXCOAL_TICK_INT_CLRTCKS;
+       }
+}
+
 static int __devinit tg3_init_one(struct pci_dev *pdev,
                                  const struct pci_device_id *ent)
 {
@@ -9232,7 +10048,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
            (tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) {
                pci_save_state(tp->pdev);
                tw32(MEMARB_MODE, MEMARB_MODE_ENABLE);
-               tg3_halt(tp, 1);
+               tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
        }
 
        err = tg3_test_dma(tp);
@@ -9256,6 +10072,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
        /* flow control autonegotiation is default behavior */
        tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG;
 
+       tg3_init_coal(tp);
+
        err = register_netdev(dev);
        if (err) {
                printk(KERN_ERR PFX "Cannot register net device, "
@@ -9298,6 +10116,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
               (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) != 0,
               (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED) == 0,
               (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) != 0);
+       printk(KERN_INFO "%s: dma_rwctrl[%08x]\n",
+              dev->name, tp->dma_rwctrl);
 
        return 0;
 
@@ -9355,7 +10175,7 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state)
 
        spin_lock_irq(&tp->lock);
        spin_lock(&tp->tx_lock);
-       tg3_halt(tp, 1);
+       tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
        spin_unlock(&tp->tx_lock);
        spin_unlock_irq(&tp->lock);
 
index 8de6f21037bae13910b0f9c8f075a8d38b89db69..993f84c93dc41df662f0864e4a6bfb556051512e 100644 (file)
 #define  HOSTCC_STATUS_ERROR_ATTN       0x00000004
 #define HOSTCC_RXCOL_TICKS             0x00003c08
 #define  LOW_RXCOL_TICKS                0x00000032
+#define  LOW_RXCOL_TICKS_CLRTCKS        0x00000014
 #define  DEFAULT_RXCOL_TICKS            0x00000048
 #define  HIGH_RXCOL_TICKS               0x00000096
 #define HOSTCC_TXCOL_TICKS             0x00003c0c
 #define  LOW_TXCOL_TICKS                0x00000096
+#define  LOW_TXCOL_TICKS_CLRTCKS        0x00000048
 #define  DEFAULT_TXCOL_TICKS            0x0000012c
 #define  HIGH_TXCOL_TICKS               0x00000145
 #define HOSTCC_RXMAX_FRAMES            0x00003c10
 #define  HIGH_TXMAX_FRAMES              0x00000052
 #define HOSTCC_RXCOAL_TICK_INT         0x00003c18
 #define  DEFAULT_RXCOAL_TICK_INT        0x00000019
+#define  DEFAULT_RXCOAL_TICK_INT_CLRTCKS 0x00000014
 #define HOSTCC_TXCOAL_TICK_INT         0x00003c1c
 #define  DEFAULT_TXCOAL_TICK_INT        0x00000019
+#define  DEFAULT_TXCOAL_TICK_INT_CLRTCKS 0x00000014
 #define HOSTCC_RXCOAL_MAXF_INT         0x00003c20
 #define  DEFAULT_RXCOAL_MAXF_INT        0x00000005
 #define HOSTCC_TXCOAL_MAXF_INT         0x00003c24
@@ -2023,6 +2027,7 @@ struct tg3 {
 
        struct tg3_hw_status            *hw_status;
        dma_addr_t                      status_mapping;
+       u32                             last_tag;
 
        u32                             msg_enable;
 
@@ -2068,6 +2073,7 @@ struct tg3 {
 
        u32                             rx_offset;
        u32                             tg3_flags;
+#define TG3_FLAG_TAGGED_STATUS         0x00000001
 #define TG3_FLAG_TXD_MBOX_HWBUG                0x00000002
 #define TG3_FLAG_RX_CHECKSUMS          0x00000004
 #define TG3_FLAG_USE_LINKCHG_REG       0x00000008
@@ -2225,7 +2231,7 @@ struct tg3 {
 
 #define SST_25VF0X0_PAGE_SIZE          4098
 
-
+       struct ethtool_coalesce         coal;
 };
 
 #endif /* !(_T3_H) */
index a7ffa64502dd3a2074418392e1c4e576ee81517a..cf31c0629852732defbf52d5ae4537325d1fc7e4 100644 (file)
@@ -193,6 +193,12 @@ static  int aui[MAX_TLAN_BOARDS];
 static  int duplex[MAX_TLAN_BOARDS];
 static  int speed[MAX_TLAN_BOARDS];
 static  int boards_found;
+module_param_array(aui, int, NULL, 0);
+module_param_array(duplex, int, NULL, 0);
+module_param_array(speed, int, NULL, 0);
+MODULE_PARM_DESC(aui, "ThunderLAN use AUI port(s) (0-1)");
+MODULE_PARM_DESC(duplex, "ThunderLAN duplex setting(s) (0-default, 1-half, 2-full)");
+MODULE_PARM_DESC(speed, "ThunderLAN port speen setting(s) (0,10,100)");
 
 MODULE_AUTHOR("Maintainer: Samuel Chessman <chessman@tux.org>");
 MODULE_DESCRIPTION("Driver for TI ThunderLAN based ethernet PCI adapters");
@@ -204,8 +210,13 @@ MODULE_LICENSE("GPL");
 
 /* Turn on debugging. See Documentation/networking/tlan.txt for details */
 static  int            debug;
+module_param(debug, int, 0);
+MODULE_PARM_DESC(debug, "ThunderLAN debug mask");
 
 static int             bbuf;
+module_param(bbuf, int, 0);
+MODULE_PARM_DESC(bbuf, "ThunderLAN use big buffer (0-1)");
+
 static u8              *TLanPadBuffer;
 static  dma_addr_t     TLanPadBufferDMA;
 static char            TLanSignature[] = "TLAN";
@@ -2381,6 +2392,7 @@ TLan_FinishReset( struct net_device *dev )
                TLan_SetTimer( dev, (10*HZ), TLAN_TIMER_FINISH_RESET );
                return;
        }
+       TLan_SetMulticastList(dev);
 
 } /* TLan_FinishReset */
 
@@ -2807,7 +2819,7 @@ void TLan_PhyMonitor( struct net_device *dev )
               if (priv->link) {
                      priv->link = 0;
                      printk(KERN_DEBUG "TLAN: %s has lost link\n", dev->name);
-                     dev->flags &= ~IFF_RUNNING;
+                     netif_carrier_off(dev);
                      TLan_SetTimer( dev, (2*HZ), TLAN_TIMER_LINK_BEAT );
                      return;
                }
@@ -2817,7 +2829,7 @@ void TLan_PhyMonitor( struct net_device *dev )
         if ((phy_status & MII_GS_LINK) && !priv->link) {
                priv->link = 1;
                printk(KERN_DEBUG "TLAN: %s has reestablished link\n", dev->name);
-               dev->flags |= IFF_RUNNING;
+               netif_carrier_on(dev);
         }
 
        /* Setup a new monitor */
index c098863bdd9d408a7b0ca4cd176c83a9e1516774..3873917a9c227e8cd3a8667b9ad134f767751161 100644 (file)
@@ -888,11 +888,6 @@ static int tok_open(struct net_device *dev)
        ti->sap_status   = CLOSED; /* CLOSED or OPEN      */
        ti->open_failure =     NO; /* NO     or YES       */
        ti->open_mode    = MANUAL; /* MANUAL or AUTOMATIC */
-       /* 12/2000 not typical Linux, but we can use RUNNING to let us know when
-       the network has crapped out or cables are disconnected. Useful because
-       the IFF_UP flag stays up the whole time, until ifconfig tr0 down.
-       */
-       dev->flags &= ~IFF_RUNNING;
 
        ti->sram_phys &= ~1; /* to reverse what we do in tok_close */
        /* init the spinlock */
@@ -1242,7 +1237,7 @@ irqreturn_t tok_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                ti->open_status = CLOSED;
                ti->sap_status  = CLOSED;
                ti->open_mode   = AUTOMATIC;
-               dev->flags &= ~IFF_RUNNING;
+               netif_carrier_off(dev);
                netif_stop_queue(dev);
                ti->open_action = RESTART;
                outb(0, dev->base_addr + ADAPTRESET);
@@ -1323,7 +1318,7 @@ irqreturn_t tok_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                                break;
                        }
                        netif_wake_queue(dev);
-                       dev->flags |= IFF_RUNNING;/*BMS 12/2000*/
+                       netif_carrier_on(dev);
                        break;
                case DIR_INTERRUPT:
                case DIR_MOD_OPEN_PARAMS:
@@ -1427,7 +1422,7 @@ irqreturn_t tok_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                                                                ring_status);
                        if(ring_status& (REMOVE_RECV|AUTO_REMOVAL|LOBE_FAULT)){
                                netif_stop_queue(dev);
-                               dev->flags &= ~IFF_RUNNING;/*not typical Linux*/
+                               netif_carrier_off(dev);
                                DPRINTK("Remove received, or Auto-removal error"
                                        ", or Lobe fault\n");
                                DPRINTK("We'll try to reopen the closed adapter"
index edae09a4b021e353ab4fbba756e31492fbb8fd2e..919c40cd635cbb9a0286f0486e706a0c5e1aeb16 100644 (file)
@@ -174,6 +174,7 @@ void tulip_mdio_write(struct net_device *dev, int phy_id, int location, int val)
                                break;
                }
                spin_unlock_irqrestore(&tp->mii_lock, flags);
+               return;
        }
                
        /* Establish sync by sending 32 logic ones. */
index d098b3ba35384fb912989348fd6da59820711ca4..e0ae3ed6e5785832794a8cb32dec13d1d592f5cc 100644 (file)
@@ -1104,7 +1104,7 @@ static void set_rx_mode(struct net_device *dev)
                        if (entry != 0) {
                                /* Avoid a chip errata by prefixing a dummy entry. Don't do
                                   this on the ULI526X as it triggers a different problem */
-                               if (!(tp->chip_id == ULI526X && (tp->revision = 0x40 || tp->revision == 0x50))) {
+                               if (!(tp->chip_id == ULI526X && (tp->revision == 0x40 || tp->revision == 0x50))) {
                                        tp->tx_buffers[entry].skb = NULL;
                                        tp->tx_buffers[entry].mapping = 0;
                                        tp->tx_ring[entry].length =
index 921a573372e945c6d2f0d38f9f844da9d3fe97a6..7ff814fd65d0826596261f76448911b4579efe2e 100644 (file)
@@ -235,7 +235,7 @@ static int dma[MAX_CARDS+1];
 static int irq[MAX_CARDS+1] = { -1, -1, -1, -1, -1, -1, 0, };
 
 /* for class stuff*/
-static struct class_simple *cosa_class;
+static struct class *cosa_class;
 
 #ifdef MODULE
 module_param_array(io, int, NULL, 0);
@@ -394,19 +394,19 @@ static int __init cosa_init(void)
                goto out;
        }
        devfs_mk_dir("cosa");
-       cosa_class = class_simple_create(THIS_MODULE, "cosa");
+       cosa_class = class_create(THIS_MODULE, "cosa");
        if (IS_ERR(cosa_class)) {
                err = PTR_ERR(cosa_class);
                goto out_chrdev;
        }
        for (i=0; i<nr_cards; i++) {
-               class_simple_device_add(cosa_class, MKDEV(cosa_major, i),
+               class_device_create(cosa_class, MKDEV(cosa_major, i),
                                NULL, "cosa%d", i);
                err = devfs_mk_cdev(MKDEV(cosa_major, i),
                                S_IFCHR|S_IRUSR|S_IWUSR,
                                "cosa/%d", i);
                if (err) {
-                       class_simple_device_remove(MKDEV(cosa_major, i));
+                       class_device_destroy(cosa_class, MKDEV(cosa_major, i));
                        goto out_chrdev;                
                }
        }
@@ -427,10 +427,10 @@ static void __exit cosa_exit(void)
        printk(KERN_INFO "Unloading the cosa module\n");
 
        for (i=0; i<nr_cards; i++) {
-               class_simple_device_remove(MKDEV(cosa_major, i));
+               class_device_destroy(cosa_class, MKDEV(cosa_major, i));
                devfs_remove("cosa/%d", i);
        }
-       class_simple_destroy(cosa_class);
+       class_destroy(cosa_class);
        devfs_remove("cosa");
        for (cosa=cosa_cards; nr_cards--; cosa++) {
                /* Clean up the per-channel data */
index 7f450b51a6cbdc43a11595f04caf0faa50ebcf19..a5d6891c9d4c3959fcb895d8dc1a2500a8eb6200 100644 (file)
@@ -2,7 +2,7 @@
  * Generic HDLC support routines for Linux
  * Frame Relay support
  *
- * Copyright (C) 1999 - 2003 Krzysztof Halasa <khc@pm.waw.pl>
+ * Copyright (C) 1999 - 2005 Krzysztof Halasa <khc@pm.waw.pl>
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License
  active = open and "link reliable"
  exist = new = not used
 
+ CCITT LMI: ITU-T Q.933 Annex A
+ ANSI LMI: ANSI T1.617 Annex D
+ CISCO LMI: the original, aka "Gang of Four" LMI
+
 */
 
 #include <linux/module.h>
 #undef DEBUG_ECN
 #undef DEBUG_LINK
 
-#define MAXLEN_LMISTAT  20     /* max size of status enquiry frame */
-
-#define PVC_STATE_NEW   0x01
-#define PVC_STATE_ACTIVE 0x02
-#define PVC_STATE_FECN  0x08 /* FECN condition */
-#define PVC_STATE_BECN  0x10 /* BECN condition */
-
-
-#define FR_UI           0x03
-#define FR_PAD          0x00
-
-#define NLPID_IP        0xCC
-#define NLPID_IPV6      0x8E
-#define NLPID_SNAP      0x80
-#define NLPID_PAD       0x00
-#define NLPID_Q933      0x08
-
-
-#define LMI_DLCI                   0 /* LMI DLCI */
-#define LMI_PROTO               0x08
-#define LMI_CALLREF             0x00 /* Call Reference */
-#define LMI_ANSI_LOCKSHIFT      0x95 /* ANSI lockshift */
-#define LMI_REPTYPE                1 /* report type */
-#define LMI_CCITT_REPTYPE       0x51
-#define LMI_ALIVE                  3 /* keep alive */
-#define LMI_CCITT_ALIVE         0x53
-#define LMI_PVCSTAT                7 /* pvc status */
-#define LMI_CCITT_PVCSTAT       0x57
-#define LMI_FULLREP                0 /* full report  */
-#define LMI_INTEGRITY              1 /* link integrity report */
-#define LMI_SINGLE                 2 /* single pvc report */
+#define FR_UI                  0x03
+#define FR_PAD                 0x00
+
+#define NLPID_IP               0xCC
+#define NLPID_IPV6             0x8E
+#define NLPID_SNAP             0x80
+#define NLPID_PAD              0x00
+#define NLPID_CCITT_ANSI_LMI   0x08
+#define NLPID_CISCO_LMI                0x09
+
+
+#define LMI_CCITT_ANSI_DLCI       0 /* LMI DLCI */
+#define LMI_CISCO_DLCI         1023
+
+#define LMI_CALLREF            0x00 /* Call Reference */
+#define LMI_ANSI_LOCKSHIFT     0x95 /* ANSI locking shift */
+#define LMI_ANSI_CISCO_REPTYPE 0x01 /* report type */
+#define LMI_CCITT_REPTYPE      0x51
+#define LMI_ANSI_CISCO_ALIVE   0x03 /* keep alive */
+#define LMI_CCITT_ALIVE                0x53
+#define LMI_ANSI_CISCO_PVCSTAT 0x07 /* PVC status */
+#define LMI_CCITT_PVCSTAT      0x57
+
+#define LMI_FULLREP            0x00 /* full report  */
+#define LMI_INTEGRITY          0x01 /* link integrity report */
+#define LMI_SINGLE             0x02 /* single PVC report */
+
 #define LMI_STATUS_ENQUIRY      0x75
 #define LMI_STATUS              0x7D /* reply */
 
 #define LMI_REPT_LEN               1 /* report type element length */
 #define LMI_INTEG_LEN              2 /* link integrity element length */
 
-#define LMI_LENGTH                13 /* standard LMI frame length */
-#define LMI_ANSI_LENGTH           14
+#define LMI_CCITT_CISCO_LENGTH   13 /* LMI frame lengths */
+#define LMI_ANSI_LENGTH                  14
 
 
 typedef struct {
@@ -223,51 +223,34 @@ static inline struct net_device** get_dev_p(pvc_device *pvc, int type)
 }
 
 
-static inline u16 status_to_dlci(u8 *status, int *active, int *new)
-{
-       *new = (status[2] & 0x08) ? 1 : 0;
-       *active = (status[2] & 0x02) ? 1 : 0;
-
-       return ((status[0] & 0x3F) << 4) | ((status[1] & 0x78) >> 3);
-}
-
-
-static inline void dlci_to_status(u16 dlci, u8 *status, int active, int new)
-{
-       status[0] = (dlci >> 4) & 0x3F;
-       status[1] = ((dlci << 3) & 0x78) | 0x80;
-       status[2] = 0x80;
-
-       if (new)
-               status[2] |= 0x08;
-       else if (active)
-               status[2] |= 0x02;
-}
-
-
-
 static int fr_hard_header(struct sk_buff **skb_p, u16 dlci)
 {
        u16 head_len;
        struct sk_buff *skb = *skb_p;
 
        switch (skb->protocol) {
-       case __constant_ntohs(ETH_P_IP):
+       case __constant_ntohs(NLPID_CCITT_ANSI_LMI):
                head_len = 4;
                skb_push(skb, head_len);
-               skb->data[3] = NLPID_IP;
+               skb->data[3] = NLPID_CCITT_ANSI_LMI;
                break;
 
-       case __constant_ntohs(ETH_P_IPV6):
+       case __constant_ntohs(NLPID_CISCO_LMI):
                head_len = 4;
                skb_push(skb, head_len);
-               skb->data[3] = NLPID_IPV6;
+               skb->data[3] = NLPID_CISCO_LMI;
                break;
 
-       case __constant_ntohs(LMI_PROTO):
+       case __constant_ntohs(ETH_P_IP):
+               head_len = 4;
+               skb_push(skb, head_len);
+               skb->data[3] = NLPID_IP;
+               break;
+
+       case __constant_ntohs(ETH_P_IPV6):
                head_len = 4;
                skb_push(skb, head_len);
-               skb->data[3] = LMI_PROTO;
+               skb->data[3] = NLPID_IPV6;
                break;
 
        case __constant_ntohs(ETH_P_802_3):
@@ -461,13 +444,14 @@ static void fr_lmi_send(struct net_device *dev, int fullrep)
        hdlc_device *hdlc = dev_to_hdlc(dev);
        struct sk_buff *skb;
        pvc_device *pvc = hdlc->state.fr.first_pvc;
-       int len = (hdlc->state.fr.settings.lmi == LMI_ANSI) ? LMI_ANSI_LENGTH
-               : LMI_LENGTH;
-       int stat_len = 3;
+       int lmi = hdlc->state.fr.settings.lmi;
+       int dce = hdlc->state.fr.settings.dce;
+       int len = lmi == LMI_ANSI ? LMI_ANSI_LENGTH : LMI_CCITT_CISCO_LENGTH;
+       int stat_len = (lmi == LMI_CISCO) ? 6 : 3;
        u8 *data;
        int i = 0;
 
-       if (hdlc->state.fr.settings.dce && fullrep) {
+       if (dce && fullrep) {
                len += hdlc->state.fr.dce_pvc_count * (2 + stat_len);
                if (len > HDLC_MAX_MRU) {
                        printk(KERN_WARNING "%s: Too many PVCs while sending "
@@ -484,29 +468,31 @@ static void fr_lmi_send(struct net_device *dev, int fullrep)
        }
        memset(skb->data, 0, len);
        skb_reserve(skb, 4);
-       skb->protocol = __constant_htons(LMI_PROTO);
-       fr_hard_header(&skb, LMI_DLCI);
+       if (lmi == LMI_CISCO) {
+               skb->protocol = __constant_htons(NLPID_CISCO_LMI);
+               fr_hard_header(&skb, LMI_CISCO_DLCI);
+       } else {
+               skb->protocol = __constant_htons(NLPID_CCITT_ANSI_LMI);
+               fr_hard_header(&skb, LMI_CCITT_ANSI_DLCI);
+       }
        data = skb->tail;
        data[i++] = LMI_CALLREF;
-       data[i++] = hdlc->state.fr.settings.dce
-               ? LMI_STATUS : LMI_STATUS_ENQUIRY;
-       if (hdlc->state.fr.settings.lmi == LMI_ANSI)
+       data[i++] = dce ? LMI_STATUS : LMI_STATUS_ENQUIRY;
+       if (lmi == LMI_ANSI)
                data[i++] = LMI_ANSI_LOCKSHIFT;
-       data[i++] = (hdlc->state.fr.settings.lmi == LMI_CCITT)
-               ? LMI_CCITT_REPTYPE : LMI_REPTYPE;
+       data[i++] = lmi == LMI_CCITT ? LMI_CCITT_REPTYPE :
+               LMI_ANSI_CISCO_REPTYPE;
        data[i++] = LMI_REPT_LEN;
        data[i++] = fullrep ? LMI_FULLREP : LMI_INTEGRITY;
-
-       data[i++] = (hdlc->state.fr.settings.lmi == LMI_CCITT)
-               ? LMI_CCITT_ALIVE : LMI_ALIVE;
+       data[i++] = lmi == LMI_CCITT ? LMI_CCITT_ALIVE : LMI_ANSI_CISCO_ALIVE;
        data[i++] = LMI_INTEG_LEN;
        data[i++] = hdlc->state.fr.txseq =fr_lmi_nextseq(hdlc->state.fr.txseq);
        data[i++] = hdlc->state.fr.rxseq;
 
-       if (hdlc->state.fr.settings.dce && fullrep) {
+       if (dce && fullrep) {
                while (pvc) {
-                       data[i++] = (hdlc->state.fr.settings.lmi == LMI_CCITT)
-                               ? LMI_CCITT_PVCSTAT : LMI_PVCSTAT;
+                       data[i++] = lmi == LMI_CCITT ? LMI_CCITT_PVCSTAT :
+                               LMI_ANSI_CISCO_PVCSTAT;
                        data[i++] = stat_len;
 
                        /* LMI start/restart */
@@ -523,8 +509,20 @@ static void fr_lmi_send(struct net_device *dev, int fullrep)
                                fr_log_dlci_active(pvc);
                        }
 
-                       dlci_to_status(pvc->dlci, data + i,
-                                      pvc->state.active, pvc->state.new);
+                       if (lmi == LMI_CISCO) {
+                               data[i] = pvc->dlci >> 8;
+                               data[i + 1] = pvc->dlci & 0xFF;
+                       } else {
+                               data[i] = (pvc->dlci >> 4) & 0x3F;
+                               data[i + 1] = ((pvc->dlci << 3) & 0x78) | 0x80;
+                               data[i + 2] = 0x80;
+                       }
+
+                       if (pvc->state.new)
+                               data[i + 2] |= 0x08;
+                       else if (pvc->state.active)
+                               data[i + 2] |= 0x02;
+
                        i += stat_len;
                        pvc = pvc->next;
                }
@@ -569,6 +567,8 @@ static void fr_set_link_state(int reliable, struct net_device *dev)
                        pvc_carrier(0, pvc);
                        pvc->state.exist = pvc->state.active = 0;
                        pvc->state.new = 0;
+                       if (!hdlc->state.fr.settings.dce)
+                               pvc->state.bandwidth = 0;
                        pvc = pvc->next;
                }
        }
@@ -583,11 +583,12 @@ static void fr_timer(unsigned long arg)
        int i, cnt = 0, reliable;
        u32 list;
 
-       if (hdlc->state.fr.settings.dce)
+       if (hdlc->state.fr.settings.dce) {
                reliable = hdlc->state.fr.request &&
                        time_before(jiffies, hdlc->state.fr.last_poll +
                                    hdlc->state.fr.settings.t392 * HZ);
-       else {
+               hdlc->state.fr.request = 0;
+       } else {
                hdlc->state.fr.last_errors <<= 1; /* Shift the list */
                if (hdlc->state.fr.request) {
                        if (hdlc->state.fr.reliable)
@@ -634,65 +635,88 @@ static void fr_timer(unsigned long arg)
 static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb)
 {
        hdlc_device *hdlc = dev_to_hdlc(dev);
-       int stat_len;
        pvc_device *pvc;
-       int reptype = -1, error, no_ram;
        u8 rxseq, txseq;
-       int i;
+       int lmi = hdlc->state.fr.settings.lmi;
+       int dce = hdlc->state.fr.settings.dce;
+       int stat_len = (lmi == LMI_CISCO) ? 6 : 3, reptype, error, no_ram, i;
 
-       if (skb->len < ((hdlc->state.fr.settings.lmi == LMI_ANSI)
-                       ? LMI_ANSI_LENGTH : LMI_LENGTH)) {
+       if (skb->len < (lmi == LMI_ANSI ? LMI_ANSI_LENGTH :
+                       LMI_CCITT_CISCO_LENGTH)) {
                printk(KERN_INFO "%s: Short LMI frame\n", dev->name);
                return 1;
        }
 
-       if (skb->data[5] != (!hdlc->state.fr.settings.dce ?
-                            LMI_STATUS : LMI_STATUS_ENQUIRY)) {
-               printk(KERN_INFO "%s: LMI msgtype=%x, Not LMI status %s\n",
-                      dev->name, skb->data[2],
-                      hdlc->state.fr.settings.dce ? "enquiry" : "reply");
+       if (skb->data[3] != (lmi == LMI_CISCO ? NLPID_CISCO_LMI :
+                            NLPID_CCITT_ANSI_LMI)) {
+               printk(KERN_INFO "%s: Received non-LMI frame with LMI"
+                      " DLCI\n", dev->name);
+               return 1;
+       }
+
+       if (skb->data[4] != LMI_CALLREF) {
+               printk(KERN_INFO "%s: Invalid LMI Call reference (0x%02X)\n",
+                      dev->name, skb->data[4]);
+               return 1;
+       }
+
+       if (skb->data[5] != (dce ? LMI_STATUS_ENQUIRY : LMI_STATUS)) {
+               printk(KERN_INFO "%s: Invalid LMI Message type (0x%02X)\n",
+                      dev->name, skb->data[5]);
                return 1;
        }
 
-       i = (hdlc->state.fr.settings.lmi == LMI_ANSI) ? 7 : 6;
+       if (lmi == LMI_ANSI) {
+               if (skb->data[6] != LMI_ANSI_LOCKSHIFT) {
+                       printk(KERN_INFO "%s: Not ANSI locking shift in LMI"
+                              " message (0x%02X)\n", dev->name, skb->data[6]);
+                       return 1;
+               }
+               i = 7;
+       } else
+               i = 6;
 
-       if (skb->data[i] !=
-           ((hdlc->state.fr.settings.lmi == LMI_CCITT)
-            ? LMI_CCITT_REPTYPE : LMI_REPTYPE)) {
-               printk(KERN_INFO "%s: Not a report type=%x\n",
+       if (skb->data[i] != (lmi == LMI_CCITT ? LMI_CCITT_REPTYPE :
+                            LMI_ANSI_CISCO_REPTYPE)) {
+               printk(KERN_INFO "%s: Not an LMI Report type IE (0x%02X)\n",
                       dev->name, skb->data[i]);
                return 1;
        }
-       i++;
 
-       i++;                            /* Skip length field */
+       if (skb->data[++i] != LMI_REPT_LEN) {
+               printk(KERN_INFO "%s: Invalid LMI Report type IE length"
+                      " (%u)\n", dev->name, skb->data[i]);
+               return 1;
+       }
 
-       reptype = skb->data[i++];
+       reptype = skb->data[++i];
+       if (reptype != LMI_INTEGRITY && reptype != LMI_FULLREP) {
+               printk(KERN_INFO "%s: Unsupported LMI Report type (0x%02X)\n",
+                      dev->name, reptype);
+               return 1;
+       }
 
-       if (skb->data[i]!=
-           ((hdlc->state.fr.settings.lmi == LMI_CCITT)
-            ? LMI_CCITT_ALIVE : LMI_ALIVE)) {
-               printk(KERN_INFO "%s: Unsupported status element=%x\n",
-                      dev->name, skb->data[i]);
+       if (skb->data[++i] != (lmi == LMI_CCITT ? LMI_CCITT_ALIVE :
+                              LMI_ANSI_CISCO_ALIVE)) {
+               printk(KERN_INFO "%s: Not an LMI Link integrity verification"
+                      " IE (0x%02X)\n", dev->name, skb->data[i]);
                return 1;
        }
-       i++;
 
-       i++;                    /* Skip length field */
+       if (skb->data[++i] != LMI_INTEG_LEN) {
+               printk(KERN_INFO "%s: Invalid LMI Link integrity verification"
+                      " IE length (%u)\n", dev->name, skb->data[i]);
+               return 1;
+       }
+       i++;
 
        hdlc->state.fr.rxseq = skb->data[i++]; /* TX sequence from peer */
        rxseq = skb->data[i++]; /* Should confirm our sequence */
 
        txseq = hdlc->state.fr.txseq;
 
-       if (hdlc->state.fr.settings.dce) {
-               if (reptype != LMI_FULLREP && reptype != LMI_INTEGRITY) {
-                       printk(KERN_INFO "%s: Unsupported report type=%x\n",
-                              dev->name, reptype);
-                       return 1;
-               }
+       if (dce)
                hdlc->state.fr.last_poll = jiffies;
-       }
 
        error = 0;
        if (!hdlc->state.fr.reliable)
@@ -703,7 +727,7 @@ static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb)
                error = 1;
        }
 
-       if (hdlc->state.fr.settings.dce) {
+       if (dce) {
                if (hdlc->state.fr.fullrep_sent && !error) {
 /* Stop sending full report - the last one has been confirmed by DTE */
                        hdlc->state.fr.fullrep_sent = 0;
@@ -725,6 +749,7 @@ static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb)
                        hdlc->state.fr.dce_changed = 0;
                }
 
+               hdlc->state.fr.request = 1; /* got request */
                fr_lmi_send(dev, reptype == LMI_FULLREP ? 1 : 0);
                return 0;
        }
@@ -739,7 +764,6 @@ static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb)
        if (reptype != LMI_FULLREP)
                return 0;
 
-       stat_len = 3;
        pvc = hdlc->state.fr.first_pvc;
 
        while (pvc) {
@@ -750,24 +774,35 @@ static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb)
        no_ram = 0;
        while (skb->len >= i + 2 + stat_len) {
                u16 dlci;
+               u32 bw;
                unsigned int active, new;
 
-               if (skb->data[i] != ((hdlc->state.fr.settings.lmi == LMI_CCITT)
-                                    ? LMI_CCITT_PVCSTAT : LMI_PVCSTAT)) {
-                       printk(KERN_WARNING "%s: Invalid PVCSTAT ID: %x\n",
-                              dev->name, skb->data[i]);
+               if (skb->data[i] != (lmi == LMI_CCITT ? LMI_CCITT_PVCSTAT :
+                                      LMI_ANSI_CISCO_PVCSTAT)) {
+                       printk(KERN_INFO "%s: Not an LMI PVC status IE"
+                              " (0x%02X)\n", dev->name, skb->data[i]);
                        return 1;
                }
-               i++;
 
-               if (skb->data[i] != stat_len) {
-                       printk(KERN_WARNING "%s: Invalid PVCSTAT length: %x\n",
-                              dev->name, skb->data[i]);
+               if (skb->data[++i] != stat_len) {
+                       printk(KERN_INFO "%s: Invalid LMI PVC status IE length"
+                              " (%u)\n", dev->name, skb->data[i]);
                        return 1;
                }
                i++;
 
-               dlci = status_to_dlci(skb->data + i, &active, &new);
+               new = !! (skb->data[i + 2] & 0x08);
+               active = !! (skb->data[i + 2] & 0x02);
+               if (lmi == LMI_CISCO) {
+                       dlci = (skb->data[i] << 8) | skb->data[i + 1];
+                       bw = (skb->data[i + 3] << 16) |
+                               (skb->data[i + 4] << 8) |
+                               (skb->data[i + 5]);
+               } else {
+                       dlci = ((skb->data[i] & 0x3F) << 4) |
+                               ((skb->data[i + 1] & 0x78) >> 3);
+                       bw = 0;
+               }
 
                pvc = add_pvc(dev, dlci);
 
@@ -783,9 +818,11 @@ static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb)
                        pvc->state.deleted = 0;
                        if (active != pvc->state.active ||
                            new != pvc->state.new ||
+                           bw != pvc->state.bandwidth ||
                            !pvc->state.exist) {
                                pvc->state.new = new;
                                pvc->state.active = active;
+                               pvc->state.bandwidth = bw;
                                pvc_carrier(active, pvc);
                                fr_log_dlci_active(pvc);
                        }
@@ -801,6 +838,7 @@ static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb)
                        pvc_carrier(0, pvc);
                        pvc->state.active = pvc->state.new = 0;
                        pvc->state.exist = 0;
+                       pvc->state.bandwidth = 0;
                        fr_log_dlci_active(pvc);
                }
                pvc = pvc->next;
@@ -829,22 +867,15 @@ static int fr_rx(struct sk_buff *skb)
 
        dlci = q922_to_dlci(skb->data);
 
-       if (dlci == LMI_DLCI) {
-               if (hdlc->state.fr.settings.lmi == LMI_NONE)
-                       goto rx_error; /* LMI packet with no LMI? */
-
-               if (data[3] == LMI_PROTO) {
-                       if (fr_lmi_recv(ndev, skb))
-                               goto rx_error;
-                       else {
-                               dev_kfree_skb_any(skb);
-                               return NET_RX_SUCCESS;
-                       }
-               }
-
-               printk(KERN_INFO "%s: Received non-LMI frame with LMI DLCI\n",
-                      ndev->name);
-               goto rx_error;
+       if ((dlci == LMI_CCITT_ANSI_DLCI &&
+            (hdlc->state.fr.settings.lmi == LMI_ANSI ||
+             hdlc->state.fr.settings.lmi == LMI_CCITT)) ||
+           (dlci == LMI_CISCO_DLCI &&
+            hdlc->state.fr.settings.lmi == LMI_CISCO)) {
+               if (fr_lmi_recv(ndev, skb))
+                       goto rx_error;
+               dev_kfree_skb_any(skb);
+               return NET_RX_SUCCESS;
        }
 
        pvc = find_pvc(hdlc, dlci);
@@ -1170,7 +1201,8 @@ int hdlc_fr_ioctl(struct net_device *dev, struct ifreq *ifr)
 
                if ((new_settings.lmi != LMI_NONE &&
                     new_settings.lmi != LMI_ANSI &&
-                    new_settings.lmi != LMI_CCITT) ||
+                    new_settings.lmi != LMI_CCITT &&
+                    new_settings.lmi != LMI_CISCO) ||
                    new_settings.t391 < 1 ||
                    new_settings.t392 < 2 ||
                    new_settings.n391 < 1 ||
index 6ed064cb44693b786c1931ff02f665d18edca2a7..a63f6a2cc4f7d75746a8ba3869c7a62d649fad91 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Generic HDLC support routines for Linux
  *
- * Copyright (C) 1999 - 2003 Krzysztof Halasa <khc@pm.waw.pl>
+ * Copyright (C) 1999 - 2005 Krzysztof Halasa <khc@pm.waw.pl>
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License
@@ -38,7 +38,7 @@
 #include <linux/hdlc.h>
 
 
-static const char* version = "HDLC support module revision 1.17";
+static const char* version = "HDLC support module revision 1.18";
 
 #undef DEBUG_LINK
 
@@ -126,10 +126,13 @@ void hdlc_set_carrier(int on, struct net_device *dev)
        if (!hdlc->open)
                goto carrier_exit;
 
-       if (hdlc->carrier)
+       if (hdlc->carrier) {
+               printk(KERN_INFO "%s: Carrier detected\n", dev->name);
                __hdlc_set_carrier_on(dev);
-       else
+       } else {
+               printk(KERN_INFO "%s: Carrier lost\n", dev->name);
                __hdlc_set_carrier_off(dev);
+       }
 
 carrier_exit:
        spin_unlock_irqrestore(&hdlc->state_lock, flags);
@@ -157,8 +160,11 @@ int hdlc_open(struct net_device *dev)
 
        spin_lock_irq(&hdlc->state_lock);
 
-       if (hdlc->carrier)
+       if (hdlc->carrier) {
+               printk(KERN_INFO "%s: Carrier detected\n", dev->name);
                __hdlc_set_carrier_on(dev);
+       } else
+               printk(KERN_INFO "%s: No carrier\n", dev->name);
 
        hdlc->open = 1;
 
index 15e545f66cd736822392b1ba12141d9e2595a816..2b948ea397d56aa553900e2e25da03ed29665660 100644 (file)
@@ -723,7 +723,7 @@ static void lmc_watchdog (unsigned long data) /*fold00*/
         /* lmc_reset (sc); Why reset??? The link can go down ok */
 
         /* Inform the world that link has been lost */
-        dev->flags &= ~IFF_RUNNING;
+       netif_carrier_off(dev);
     }
 
     /*
@@ -736,7 +736,7 @@ static void lmc_watchdog (unsigned long data) /*fold00*/
          /* lmc_reset (sc); Again why reset??? */
 
          /* Inform the world that link protocol is back up. */
-         dev->flags |= IFF_RUNNING;
+        netif_carrier_on(dev);
 
          /* Now we have to tell the syncppp that we had an outage
           * and that it should deal.  Calling sppp_reopen here
@@ -1168,8 +1168,6 @@ static void lmc_running_reset (struct net_device *dev) /*fold00*/
     sc->lmc_media->set_link_status (sc, 1);
     sc->lmc_media->set_status (sc, NULL);
 
-    //dev->flags |= IFF_RUNNING;
-    
     netif_wake_queue(dev);
 
     sc->lmc_txfull = 0;
@@ -1233,8 +1231,6 @@ static int lmc_ifdown (struct net_device *dev) /*fold00*/
     csr6 &= ~LMC_DEC_SR;               /* Turn off the Receive bit */
     LMC_CSR_WRITE (sc, csr_command, csr6);
 
-    dev->flags &= ~IFF_RUNNING;
-
     sc->stats.rx_missed_errors +=
         LMC_CSR_READ (sc, csr_missed_frames) & 0xffff;
 
index 0aaa12c0c098ae48d48cac1535abf92e7c0880f9..1d3231cc471acff346ef9dd6425d66c1b96c4276 100644 (file)
@@ -323,7 +323,7 @@ config PRISM54
          For a complete list of supported cards visit <http://prism54.org>.
          Here is the latest confirmed list of supported cards:
 
-         3com OfficeConnect 11g Cardbus Card aka 3CRWE154G72
+         3com OfficeConnect 11g Cardbus Card aka 3CRWE154G72 (version 1)
          Allnet ALL0271 PCI Card
          Compex WL54G Cardbus Card
          Corega CG-WLCB54GT Cardbus Card
index 463c789cdc77c5e9705e656277050a47b76523ee..fb10a2db63ad018623c2781be4da42db970cf434 100644 (file)
@@ -754,7 +754,7 @@ typedef struct {
   u8 zero;
   u8 ssidLen;
   u8 ssid[32];
-  u16 rssi;
+  u16 dBm;
 #define CAP_ESS (1<<0)
 #define CAP_IBSS (1<<1)
 #define CAP_PRIVACY (1<<4)
@@ -1125,6 +1125,9 @@ static int micsetup(struct airo_info *ai);
 static int encapsulate(struct airo_info *ai, etherHead *pPacket, MICBuffer *buffer, int len);
 static int decapsulate(struct airo_info *ai, MICBuffer *mic, etherHead *pPacket, u16 payLen);
 
+static u8 airo_rssi_to_dbm (tdsRssiEntry *rssi_rid, u8 rssi);
+static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm);
+
 #include <linux/crypto.h>
 #endif
 
@@ -1713,6 +1716,7 @@ static int readBSSListRid(struct airo_info *ai, int first,
        list->fh.dwell = le16_to_cpu(list->fh.dwell);
        list->dsChannel = le16_to_cpu(list->dsChannel);
        list->atimWindow = le16_to_cpu(list->atimWindow);
+       list->dBm = le16_to_cpu(list->dBm);
        return rc;
 }
 
@@ -3245,7 +3249,10 @@ badrx:
                                        wstats.level = 0x100 - apriv->rssi[hdr.rssi[1]].rssidBm;
                                else
                                        wstats.level = (hdr.rssi[1] + 321) / 2;
-                               wstats.updated = 3;     
+                               wstats.noise = apriv->wstats.qual.noise;
+                               wstats.updated = IW_QUAL_LEVEL_UPDATED
+                                       | IW_QUAL_QUAL_UPDATED
+                                       | IW_QUAL_NOISE_UPDATED;
                                /* Update spy records */
                                wireless_spy_update(dev, sa, &wstats);
                        }
@@ -3588,7 +3595,10 @@ void mpi_receive_802_11 (struct airo_info *ai)
                        wstats.level = 0x100 - ai->rssi[hdr.rssi[1]].rssidBm;
                else
                        wstats.level = (hdr.rssi[1] + 321) / 2;
-               wstats.updated = 3;
+               wstats.noise = ai->wstats.qual.noise;
+               wstats.updated = IW_QUAL_QUAL_UPDATED
+                       | IW_QUAL_LEVEL_UPDATED
+                       | IW_QUAL_NOISE_UPDATED;
                /* Update spy records */
                wireless_spy_update(ai->dev, sa, &wstats);
        }
@@ -3679,7 +3689,7 @@ static u16 setup_card(struct airo_info *ai, u8 *mac, int lock)
                status = PC4500_readrid(ai,RID_RSSI,&rssi_rid,sizeof(rssi_rid),lock);
                if ( status == SUCCESS ) {
                        if (ai->rssi || (ai->rssi = kmalloc(512, GFP_KERNEL)) != NULL)
-                               memcpy(ai->rssi, (u8*)&rssi_rid + 2, 512);
+                               memcpy(ai->rssi, (u8*)&rssi_rid + 2, 512); /* Skip RID length member */
                }
                else {
                        if (ai->rssi) {
@@ -5348,7 +5358,7 @@ static int proc_BSSList_open( struct inode *inode, struct file *file ) {
                                (int)BSSList_rid.bssid[5],
                                (int)BSSList_rid.ssidLen,
                                BSSList_rid.ssid,
-                               (int)BSSList_rid.rssi);
+                               (int)BSSList_rid.dBm);
                ptr += sprintf(ptr, " channel = %d %s %s %s %s\n",
                                (int)BSSList_rid.dsChannel,
                                BSSList_rid.cap & CAP_ESS ? "ESS" : "",
@@ -5593,6 +5603,29 @@ static void __exit airo_cleanup_module( void )
  * would not work at all... - Jean II
  */
 
+static u8 airo_rssi_to_dbm (tdsRssiEntry *rssi_rid, u8 rssi)
+{
+       if( !rssi_rid )
+               return 0;
+
+       return (0x100 - rssi_rid[rssi].rssidBm);
+}
+
+static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm)
+{
+       int i;
+
+       if( !rssi_rid )
+               return 0;
+
+       for( i = 0; i < 256; i++ )
+               if (rssi_rid[i].rssidBm == dbm)
+                       return rssi_rid[i].rssipct;
+
+       return 0;
+}
+
+
 static int airo_get_quality (StatusRid *status_rid, CapabilityRid *cap_rid)
 {
        int quality = 0;
@@ -6443,11 +6476,29 @@ static int airo_get_range(struct net_device *dev,
        }
        range->num_frequency = k;
 
+       range->sensitivity = 65535;
+
        /* Hum... Should put the right values there */
-       range->max_qual.qual = airo_get_max_quality(&cap_rid);
-       range->max_qual.level = 0x100 - 120;    /* -120 dBm */
+       if (local->rssi)
+               range->max_qual.qual = 100;     /* % */
+       else
+               range->max_qual.qual = airo_get_max_quality(&cap_rid);
+       range->max_qual.level = 0;      /* 0 means we use dBm  */
        range->max_qual.noise = 0;
-       range->sensitivity = 65535;
+       range->max_qual.updated = 0;
+
+       /* Experimental measurements - boundary 11/5.5 Mb/s */
+       /* Note : with or without the (local->rssi), results
+        * are somewhat different. - Jean II */
+       if (local->rssi) {
+               range->avg_qual.qual = 50;      /* % */
+               range->avg_qual.level = 186;    /* -70 dBm */
+       } else {
+               range->avg_qual.qual = airo_get_avg_quality(&cap_rid);
+               range->avg_qual.level = 176;    /* -80 dBm */
+       }
+       range->avg_qual.noise = 0;
+       range->avg_qual.updated = 0;
 
        for(i = 0 ; i < 8 ; i++) {
                range->bitrate[i] = cap_rid.supportedRates[i] * 500000;
@@ -6508,15 +6559,6 @@ static int airo_get_range(struct net_device *dev,
        range->max_retry = 65535;
        range->min_r_time = 1024;
        range->max_r_time = 65535 * 1024;
-       /* Experimental measurements - boundary 11/5.5 Mb/s */
-       /* Note : with or without the (local->rssi), results
-        * are somewhat different. - Jean II */
-       range->avg_qual.qual = airo_get_avg_quality(&cap_rid);
-       if (local->rssi)
-               range->avg_qual.level = 186;    /* -70 dBm */
-       else
-               range->avg_qual.level = 176;    /* -80 dBm */
-       range->avg_qual.noise = 0;
 
        /* Event capability (kernel + driver) */
        range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
@@ -6676,12 +6718,18 @@ static int airo_get_aplist(struct net_device *dev,
                loseSync = 0;
                memcpy(address[i].sa_data, BSSList.bssid, ETH_ALEN);
                address[i].sa_family = ARPHRD_ETHER;
-               if (local->rssi)
-                       qual[i].level = 0x100 - local->rssi[BSSList.rssi].rssidBm;
-               else
-                       qual[i].level = (BSSList.rssi + 321) / 2;
-               qual[i].qual = qual[i].noise = 0;
-               qual[i].updated = 2;
+               if (local->rssi) {
+                       qual[i].level = 0x100 - BSSList.dBm;
+                       qual[i].qual = airo_dbm_to_pct( local->rssi, BSSList.dBm );
+                       qual[i].updated = IW_QUAL_QUAL_UPDATED;
+               } else {
+                       qual[i].level = (BSSList.dBm + 321) / 2;
+                       qual[i].qual = 0;
+                       qual[i].updated = IW_QUAL_QUAL_INVALID;
+               }
+               qual[i].noise = local->wstats.qual.noise;
+               qual[i].updated = IW_QUAL_LEVEL_UPDATED
+                               | IW_QUAL_NOISE_UPDATED;
                if (BSSList.index == 0xffff)
                        break;
        }
@@ -6760,7 +6808,7 @@ static int airo_set_scan(struct net_device *dev,
 static inline char *airo_translate_scan(struct net_device *dev,
                                        char *current_ev,
                                        char *end_buf,
-                                       BSSListRid *list)
+                                       BSSListRid *bss)
 {
        struct airo_info *ai = dev->priv;
        struct iw_event         iwe;            /* Temporary buffer */
@@ -6771,22 +6819,22 @@ static inline char *airo_translate_scan(struct net_device *dev,
        /* First entry *MUST* be the AP MAC address */
        iwe.cmd = SIOCGIWAP;
        iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
-       memcpy(iwe.u.ap_addr.sa_data, list->bssid, ETH_ALEN);
+       memcpy(iwe.u.ap_addr.sa_data, bss->bssid, ETH_ALEN);
        current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_ADDR_LEN);
 
        /* Other entries will be displayed in the order we give them */
 
        /* Add the ESSID */
-       iwe.u.data.length = list->ssidLen;
+       iwe.u.data.length = bss->ssidLen;
        if(iwe.u.data.length > 32)
                iwe.u.data.length = 32;
        iwe.cmd = SIOCGIWESSID;
        iwe.u.data.flags = 1;
-       current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, list->ssid);
+       current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, bss->ssid);
 
        /* Add mode */
        iwe.cmd = SIOCGIWMODE;
-       capabilities = le16_to_cpu(list->cap);
+       capabilities = le16_to_cpu(bss->cap);
        if(capabilities & (CAP_ESS | CAP_IBSS)) {
                if(capabilities & CAP_ESS)
                        iwe.u.mode = IW_MODE_MASTER;
@@ -6797,19 +6845,25 @@ static inline char *airo_translate_scan(struct net_device *dev,
 
        /* Add frequency */
        iwe.cmd = SIOCGIWFREQ;
-       iwe.u.freq.m = le16_to_cpu(list->dsChannel);
+       iwe.u.freq.m = le16_to_cpu(bss->dsChannel);
        iwe.u.freq.m = frequency_list[iwe.u.freq.m] * 100000;
        iwe.u.freq.e = 1;
        current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_FREQ_LEN);
 
        /* Add quality statistics */
        iwe.cmd = IWEVQUAL;
-       if (ai->rssi)
-               iwe.u.qual.level = 0x100 - ai->rssi[list->rssi].rssidBm;
-       else
-               iwe.u.qual.level = (list->rssi + 321) / 2;
-       iwe.u.qual.noise = 0;
-       iwe.u.qual.qual = 0;
+       if (ai->rssi) {
+               iwe.u.qual.level = 0x100 - bss->dBm;
+               iwe.u.qual.qual = airo_dbm_to_pct( ai->rssi, bss->dBm );
+               iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED;
+       } else {
+               iwe.u.qual.level = (bss->dBm + 321) / 2;
+               iwe.u.qual.qual = 0;
+               iwe.u.qual.updated = IW_QUAL_QUAL_INVALID;
+       }
+       iwe.u.qual.noise = ai->wstats.qual.noise;
+       iwe.u.qual.updated = IW_QUAL_LEVEL_UPDATED
+                       | IW_QUAL_NOISE_UPDATED;
        current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_QUAL_LEN);
 
        /* Add encryption capability */
@@ -6819,7 +6873,7 @@ static inline char *airo_translate_scan(struct net_device *dev,
        else
                iwe.u.data.flags = IW_ENCODE_DISABLED;
        iwe.u.data.length = 0;
-       current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, list->ssid);
+       current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, bss->ssid);
 
        /* Rate : stuffing multiple values in a single event require a bit
         * more of magic - Jean II */
@@ -6831,10 +6885,10 @@ static inline char *airo_translate_scan(struct net_device *dev,
        /* Max 8 values */
        for(i = 0 ; i < 8 ; i++) {
                /* NULL terminated */
-               if(list->rates[i] == 0)
+               if(bss->rates[i] == 0)
                        break;
                /* Bit rate given in 500 kb/s units (+ 0x80) */
-               iwe.u.bitrate.value = ((list->rates[i] & 0x7f) * 500000);
+               iwe.u.bitrate.value = ((bss->rates[i] & 0x7f) * 500000);
                /* Add new value to event */
                current_val = iwe_stream_add_value(current_ev, current_val, end_buf, &iwe, IW_EV_PARAM_LEN);
        }
@@ -7153,18 +7207,22 @@ static void airo_read_wireless_stats(struct airo_info *local)
        /* The status */
        local->wstats.status = status_rid.mode;
 
-       /* Signal quality and co. But where is the noise level ??? */
-       local->wstats.qual.qual = airo_get_quality(&status_rid, &cap_rid);
-       if (local->rssi)
-               local->wstats.qual.level = 0x100 - local->rssi[status_rid.sigQuality].rssidBm;
-       else
+       /* Signal quality and co */
+       if (local->rssi) {
+               local->wstats.qual.level = airo_rssi_to_dbm( local->rssi, status_rid.sigQuality );
+               /* normalizedSignalStrength appears to be a percentage */
+               local->wstats.qual.qual = status_rid.normalizedSignalStrength;
+       } else {
                local->wstats.qual.level = (status_rid.normalizedSignalStrength + 321) / 2;
+               local->wstats.qual.qual = airo_get_quality(&status_rid, &cap_rid);
+       }
+       local->wstats.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED;
        if (status_rid.len >= 124) {
-               local->wstats.qual.noise = 256 - status_rid.noisedBm;
-               local->wstats.qual.updated = 7;
+               local->wstats.qual.noise = 0x100 - status_rid.noisedBm;
+               local->wstats.qual.updated |= IW_QUAL_NOISE_UPDATED;
        } else {
                local->wstats.qual.noise = 0;
-               local->wstats.qual.updated = 3;
+               local->wstats.qual.updated |= IW_QUAL_NOISE_INVALID;
        }
 
        /* Packets discarded in the wireless adapter due to wireless
index a91b507e0a7a279b18104b5472e66766b6cdb08b..a4ed28d9c7837227774c1d629a3a638989a8ac07 100644 (file)
@@ -321,6 +321,7 @@ static struct {
        { 0x01bf, 0x3302, NULL, ATMEL_FW_TYPE_502E, "Belkin F5D6020-V2" }, 
        { 0, 0, "BT/Voyager 1020 Laptop Adapter", ATMEL_FW_TYPE_502, "BT Voyager 1020" },
        { 0, 0, "IEEE 802.11b/Wireless LAN PC Card", ATMEL_FW_TYPE_502, "Siemens Gigaset PC Card II" },
+       { 0, 0, "IEEE 802.11b/Wireless LAN Card S", ATMEL_FW_TYPE_504_2958, "Siemens Gigaset PC Card II" },
        { 0, 0, "CNet/CNWLC 11Mbps Wireless PC Card V-5", ATMEL_FW_TYPE_502E, "CNet CNWLC-811ARL" },
        { 0, 0, "Wireless/PC_CARD", ATMEL_FW_TYPE_502D, "Planet WL-3552" },
        { 0, 0, "OEM/11Mbps Wireless LAN PC Card V-3", ATMEL_FW_TYPE_502, "OEM 11Mbps WLAN PCMCIA Card" },
index a3a32430ae9d719e105d945b3eb7071523a44e37..b1078baa1d5e3851804b12509222407283b753d2 100644 (file)
@@ -492,6 +492,9 @@ EXPORT_SYMBOL(orinoco_debug);
 static int suppress_linkstatus; /* = 0 */
 module_param(suppress_linkstatus, bool, 0644);
 MODULE_PARM_DESC(suppress_linkstatus, "Don't log link status changes");
+static int ignore_disconnect; /* = 0 */
+module_param(ignore_disconnect, int, 0644);
+MODULE_PARM_DESC(ignore_disconnect, "Don't report lost link to the network layer");
 
 /********************************************************************/
 /* Compile time configuration and compatibility stuff               */
@@ -604,7 +607,6 @@ struct hermes_rx_descriptor {
 static int orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
 static int __orinoco_program_rids(struct net_device *dev);
 static void __orinoco_set_multicast_list(struct net_device *dev);
-static int orinoco_debug_dump_recs(struct net_device *dev);
 
 /********************************************************************/
 /* Internal helper functions                                        */
@@ -655,7 +657,7 @@ static int orinoco_open(struct net_device *dev)
        return err;
 }
 
-int orinoco_stop(struct net_device *dev)
+static int orinoco_stop(struct net_device *dev)
 {
        struct orinoco_private *priv = netdev_priv(dev);
        int err = 0;
@@ -686,7 +688,7 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev)
        struct orinoco_private *priv = netdev_priv(dev);
        hermes_t *hw = &priv->hw;
        struct iw_statistics *wstats = &priv->wstats;
-       int err = 0;
+       int err;
        unsigned long flags;
 
        if (! netif_device_present(dev)) {
@@ -695,9 +697,21 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev)
                return NULL; /* FIXME: Can we do better than this? */
        }
 
+       /* If busy, return the old stats.  Returning NULL may cause
+        * the interface to disappear from /proc/net/wireless */
        if (orinoco_lock(priv, &flags) != 0)
-               return NULL;  /* FIXME: Erg, we've been signalled, how
-                              * do we propagate this back up? */
+               return wstats;
+
+       /* We can't really wait for the tallies inquiry command to
+        * complete, so we just use the previous results and trigger
+        * a new tallies inquiry command for next time - Jean II */
+       /* FIXME: Really we should wait for the inquiry to come back -
+        * as it is the stats we give don't make a whole lot of sense.
+        * Unfortunately, it's not clear how to do that within the
+        * wireless extensions framework: I think we're in user
+        * context, but a lock seems to be held by the time we get in
+        * here so we're not safe to sleep here. */
+       hermes_inquire(hw, HERMES_INQ_TALLIES);
 
        if (priv->iw_mode == IW_MODE_ADHOC) {
                memset(&wstats->qual, 0, sizeof(wstats->qual));
@@ -716,25 +730,16 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev)
 
                err = HERMES_READ_RECORD(hw, USER_BAP,
                                         HERMES_RID_COMMSQUALITY, &cq);
-               
-               wstats->qual.qual = (int)le16_to_cpu(cq.qual);
-               wstats->qual.level = (int)le16_to_cpu(cq.signal) - 0x95;
-               wstats->qual.noise = (int)le16_to_cpu(cq.noise) - 0x95;
-               wstats->qual.updated = 7;
+
+               if (!err) {
+                       wstats->qual.qual = (int)le16_to_cpu(cq.qual);
+                       wstats->qual.level = (int)le16_to_cpu(cq.signal) - 0x95;
+                       wstats->qual.noise = (int)le16_to_cpu(cq.noise) - 0x95;
+                       wstats->qual.updated = 7;
+               }
        }
 
-       /* We can't really wait for the tallies inquiry command to
-        * complete, so we just use the previous results and trigger
-        * a new tallies inquiry command for next time - Jean II */
-       /* FIXME: We're in user context (I think?), so we should just
-           wait for the tallies to come through */
-       err = hermes_inquire(hw, HERMES_INQ_TALLIES);
-               
        orinoco_unlock(priv, &flags);
-
-       if (err)
-               return NULL;
-               
        return wstats;
 }
 
@@ -1275,9 +1280,10 @@ static void __orinoco_ev_info(struct net_device *dev, hermes_t *hw)
                        len = sizeof(tallies);
                }
                
-               /* Read directly the data (no seek) */
-               hermes_read_words(hw, HERMES_DATA1, (void *) &tallies,
-                                 len / 2); /* FIXME: blech! */
+               err = hermes_bap_pread(hw, IRQ_BAP, &tallies, len,
+                                      infofid, sizeof(info));
+               if (err)
+                       break;
                
                /* Increment our various counters */
                /* wstats->discard.nwid - no wrong BSSID stuff */
@@ -1307,8 +1313,10 @@ static void __orinoco_ev_info(struct net_device *dev, hermes_t *hw)
                        break;
                }
 
-               hermes_read_words(hw, HERMES_DATA1, (void *) &linkstatus,
-                                 len / 2);
+               err = hermes_bap_pread(hw, IRQ_BAP, &linkstatus, len,
+                                      infofid, sizeof(info));
+               if (err)
+                       break;
                newstatus = le16_to_cpu(linkstatus.linkstatus);
 
                connected = (newstatus == HERMES_LINKSTATUS_CONNECTED)
@@ -1317,7 +1325,7 @@ static void __orinoco_ev_info(struct net_device *dev, hermes_t *hw)
 
                if (connected)
                        netif_carrier_on(dev);
-               else
+               else if (!ignore_disconnect)
                        netif_carrier_off(dev);
 
                if (newstatus != priv->last_linkstatus)
@@ -1350,6 +1358,8 @@ int __orinoco_up(struct net_device *dev)
        struct hermes *hw = &priv->hw;
        int err;
 
+       netif_carrier_off(dev); /* just to make sure */
+
        err = __orinoco_program_rids(dev);
        if (err) {
                printk(KERN_ERR "%s: Error %d configuring card\n",
@@ -1413,7 +1423,7 @@ int orinoco_reinit_firmware(struct net_device *dev)
                return err;
 
        err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid);
-       if (err == -EIO) {
+       if (err == -EIO && priv->nicbuf_size > TX_NICBUF_SIZE_BUG) {
                /* Try workaround for old Symbol firmware bug */
                printk(KERN_WARNING "%s: firmware ALLOC bug detected "
                       "(old Symbol firmware?). Trying to work around... ",
@@ -1610,17 +1620,15 @@ static int __orinoco_program_rids(struct net_device *dev)
                return err;
        }
        /* Set the channel/frequency */
-       if (priv->channel == 0) {
-               printk(KERN_DEBUG "%s: Channel is 0 in __orinoco_program_rids()\n", dev->name);
-               if (priv->createibss)
-                       priv->channel = 10;
-       }
-       err = hermes_write_wordrec(hw, USER_BAP, HERMES_RID_CNFOWNCHANNEL,
-                                  priv->channel);
-       if (err) {
-               printk(KERN_ERR "%s: Error %d setting channel\n",
-                      dev->name, err);
-               return err;
+       if (priv->channel != 0 && priv->iw_mode != IW_MODE_INFRA) {
+               err = hermes_write_wordrec(hw, USER_BAP,
+                                          HERMES_RID_CNFOWNCHANNEL,
+                                          priv->channel);
+               if (err) {
+                       printk(KERN_ERR "%s: Error %d setting channel %d\n",
+                              dev->name, err, priv->channel);
+                       return err;
+               }
        }
 
        if (priv->has_ibss) {
@@ -1916,7 +1924,7 @@ static void orinoco_reset(struct net_device *dev)
 {
        struct orinoco_private *priv = netdev_priv(dev);
        struct hermes *hw = &priv->hw;
-       int err = 0;
+       int err;
        unsigned long flags;
 
        if (orinoco_lock(priv, &flags) != 0)
@@ -1938,20 +1946,20 @@ static void orinoco_reset(struct net_device *dev)
 
        orinoco_unlock(priv, &flags);
 
-       if (priv->hard_reset)
+       if (priv->hard_reset) {
                err = (*priv->hard_reset)(priv);
-       if (err) {
-               printk(KERN_ERR "%s: orinoco_reset: Error %d "
-                      "performing  hard reset\n", dev->name, err);
-               /* FIXME: shutdown of some sort */
-               return;
+               if (err) {
+                       printk(KERN_ERR "%s: orinoco_reset: Error %d "
+                              "performing hard reset\n", dev->name, err);
+                       goto disable;
+               }
        }
 
        err = orinoco_reinit_firmware(dev);
        if (err) {
                printk(KERN_ERR "%s: orinoco_reset: Error %d re-initializing firmware\n",
                       dev->name, err);
-               return;
+               goto disable;
        }
 
        spin_lock_irq(&priv->lock); /* This has to be called from user context */
@@ -1972,6 +1980,10 @@ static void orinoco_reset(struct net_device *dev)
        spin_unlock_irq(&priv->lock);
 
        return;
+ disable:
+       hermes_set_irqmask(hw, 0);
+       netif_device_detach(dev);
+       printk(KERN_ERR "%s: Device has been disabled!\n", dev->name);
 }
 
 /********************************************************************/
@@ -2056,7 +2068,7 @@ irqreturn_t orinoco_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                if (events & HERMES_EV_ALLOC)
                        __orinoco_ev_alloc(dev, hw);
                
-               hermes_write_regn(hw, EVACK, events);
+               hermes_write_regn(hw, EVACK, evstat);
 
                evstat = hermes_read_regn(hw, EVSTAT);
                events = evstat & hw->inten;
@@ -2215,6 +2227,8 @@ static int determine_firmware(struct net_device *dev)
                               firmver >= 0x31000;
                priv->has_preamble = (firmver >= 0x20000);
                priv->ibss_port = 4;
+               priv->broken_disableport = (firmver == 0x25013) ||
+                                          (firmver >= 0x30000 && firmver <= 0x31000);
                /* Tested with Intel firmware : 0x20015 => Jean II */
                /* Tested with 3Com firmware : 0x15012 & 0x22001 => Jean II */
                break;
@@ -2267,7 +2281,7 @@ static int orinoco_init(struct net_device *dev)
        priv->nicbuf_size = IEEE802_11_FRAME_LEN + ETH_HLEN;
 
        /* Initialize the firmware */
-       err = hermes_init(hw);
+       err = orinoco_reinit_firmware(dev);
        if (err != 0) {
                printk(KERN_ERR "%s: failed to initialize firmware (err = %d)\n",
                       dev->name, err);
@@ -2400,31 +2414,12 @@ static int orinoco_init(struct net_device *dev)
        /* By default use IEEE/IBSS ad-hoc mode if we have it */
        priv->prefer_port3 = priv->has_port3 && (! priv->has_ibss);
        set_port_type(priv);
-       priv->channel = 10; /* default channel, more-or-less arbitrary */
+       priv->channel = 0; /* use firmware default */
 
        priv->promiscuous = 0;
        priv->wep_on = 0;
        priv->tx_key = 0;
 
-       err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid);
-       if (err == -EIO) {
-               /* Try workaround for old Symbol firmware bug */
-               printk(KERN_WARNING "%s: firmware ALLOC bug detected "
-                      "(old Symbol firmware?). Trying to work around... ",
-                      dev->name);
-               
-               priv->nicbuf_size = TX_NICBUF_SIZE_BUG;
-               err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid);
-               if (err)
-                       printk("failed!\n");
-               else
-                       printk("ok.\n");
-       }
-       if (err) {
-               printk("%s: Error %d allocating Tx buffer\n", dev->name, err);
-               goto out;
-       }
-
        /* Make the hardware available, as long as it hasn't been
         * removed elsewhere (e.g. by PCMCIA hot unplug) */
        spin_lock_irq(&priv->lock);
@@ -2450,7 +2445,7 @@ struct net_device *alloc_orinocodev(int sizeof_card,
        priv = netdev_priv(dev);
        priv->ndev = dev;
        if (sizeof_card)
-               priv->card = (void *)((unsigned long)netdev_priv(dev)
+               priv->card = (void *)((unsigned long)priv
                                      + sizeof(struct orinoco_private));
        else
                priv->card = NULL;
@@ -2555,6 +2550,7 @@ static int orinoco_hw_get_essid(struct orinoco_private *priv, int *active,
        }
 
        len = le16_to_cpu(essidbuf.len);
+       BUG_ON(len > IW_ESSID_MAX_SIZE);
 
        memset(buf, 0, IW_ESSID_MAX_SIZE+1);
        memcpy(buf, p, len);
@@ -2923,13 +2919,14 @@ static int orinoco_ioctl_setessid(struct net_device *dev, struct iw_point *erq)
        memset(&essidbuf, 0, sizeof(essidbuf));
 
        if (erq->flags) {
-               if (erq->length > IW_ESSID_MAX_SIZE)
+               /* iwconfig includes the NUL in the specified length */
+               if (erq->length > IW_ESSID_MAX_SIZE+1)
                        return -E2BIG;
                
                if (copy_from_user(&essidbuf, erq->pointer, erq->length))
                        return -EFAULT;
 
-               essidbuf[erq->length] = '\0';
+               essidbuf[IW_ESSID_MAX_SIZE] = '\0';
        }
 
        if (orinoco_lock(priv, &flags) != 0)
@@ -3855,7 +3852,6 @@ orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                                { SIOCIWFIRSTPRIV + 0x7, 0,
                                  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
                                  "get_ibssport" },
-                               { SIOCIWLASTPRIV, 0, 0, "dump_recs" },
                        };
 
                        wrq->u.data.length = sizeof(privtab) / sizeof(privtab[0]);
@@ -3943,14 +3939,6 @@ orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                err = orinoco_ioctl_getibssport(dev, wrq);
                break;
 
-       case SIOCIWLASTPRIV:
-               err = orinoco_debug_dump_recs(dev);
-               if (err)
-                       printk(KERN_ERR "%s: Unable to dump records (%d)\n",
-                              dev->name, err);
-               break;
-
-
        default:
                err = -EOPNOTSUPP;
        }
@@ -3964,187 +3952,6 @@ orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
        return err;
 }
 
-struct {
-       u16 rid;
-       char *name;
-       int displaytype;
-#define DISPLAY_WORDS  0
-#define DISPLAY_BYTES  1
-#define DISPLAY_STRING 2
-#define DISPLAY_XSTRING        3
-} record_table[] = {
-#define DEBUG_REC(name,type) { HERMES_RID_##name, #name, DISPLAY_##type }
-       DEBUG_REC(CNFPORTTYPE,WORDS),
-       DEBUG_REC(CNFOWNMACADDR,BYTES),
-       DEBUG_REC(CNFDESIREDSSID,STRING),
-       DEBUG_REC(CNFOWNCHANNEL,WORDS),
-       DEBUG_REC(CNFOWNSSID,STRING),
-       DEBUG_REC(CNFOWNATIMWINDOW,WORDS),
-       DEBUG_REC(CNFSYSTEMSCALE,WORDS),
-       DEBUG_REC(CNFMAXDATALEN,WORDS),
-       DEBUG_REC(CNFPMENABLED,WORDS),
-       DEBUG_REC(CNFPMEPS,WORDS),
-       DEBUG_REC(CNFMULTICASTRECEIVE,WORDS),
-       DEBUG_REC(CNFMAXSLEEPDURATION,WORDS),
-       DEBUG_REC(CNFPMHOLDOVERDURATION,WORDS),
-       DEBUG_REC(CNFOWNNAME,STRING),
-       DEBUG_REC(CNFOWNDTIMPERIOD,WORDS),
-       DEBUG_REC(CNFMULTICASTPMBUFFERING,WORDS),
-       DEBUG_REC(CNFWEPENABLED_AGERE,WORDS),
-       DEBUG_REC(CNFMANDATORYBSSID_SYMBOL,WORDS),
-       DEBUG_REC(CNFWEPDEFAULTKEYID,WORDS),
-       DEBUG_REC(CNFDEFAULTKEY0,BYTES),
-       DEBUG_REC(CNFDEFAULTKEY1,BYTES),
-       DEBUG_REC(CNFMWOROBUST_AGERE,WORDS),
-       DEBUG_REC(CNFDEFAULTKEY2,BYTES),
-       DEBUG_REC(CNFDEFAULTKEY3,BYTES),
-       DEBUG_REC(CNFWEPFLAGS_INTERSIL,WORDS),
-       DEBUG_REC(CNFWEPKEYMAPPINGTABLE,WORDS),
-       DEBUG_REC(CNFAUTHENTICATION,WORDS),
-       DEBUG_REC(CNFMAXASSOCSTA,WORDS),
-       DEBUG_REC(CNFKEYLENGTH_SYMBOL,WORDS),
-       DEBUG_REC(CNFTXCONTROL,WORDS),
-       DEBUG_REC(CNFROAMINGMODE,WORDS),
-       DEBUG_REC(CNFHOSTAUTHENTICATION,WORDS),
-       DEBUG_REC(CNFRCVCRCERROR,WORDS),
-       DEBUG_REC(CNFMMLIFE,WORDS),
-       DEBUG_REC(CNFALTRETRYCOUNT,WORDS),
-       DEBUG_REC(CNFBEACONINT,WORDS),
-       DEBUG_REC(CNFAPPCFINFO,WORDS),
-       DEBUG_REC(CNFSTAPCFINFO,WORDS),
-       DEBUG_REC(CNFPRIORITYQUSAGE,WORDS),
-       DEBUG_REC(CNFTIMCTRL,WORDS),
-       DEBUG_REC(CNFTHIRTY2TALLY,WORDS),
-       DEBUG_REC(CNFENHSECURITY,WORDS),
-       DEBUG_REC(CNFGROUPADDRESSES,BYTES),
-       DEBUG_REC(CNFCREATEIBSS,WORDS),
-       DEBUG_REC(CNFFRAGMENTATIONTHRESHOLD,WORDS),
-       DEBUG_REC(CNFRTSTHRESHOLD,WORDS),
-       DEBUG_REC(CNFTXRATECONTROL,WORDS),
-       DEBUG_REC(CNFPROMISCUOUSMODE,WORDS),
-       DEBUG_REC(CNFBASICRATES_SYMBOL,WORDS),
-       DEBUG_REC(CNFPREAMBLE_SYMBOL,WORDS),
-       DEBUG_REC(CNFSHORTPREAMBLE,WORDS),
-       DEBUG_REC(CNFWEPKEYS_AGERE,BYTES),
-       DEBUG_REC(CNFEXCLUDELONGPREAMBLE,WORDS),
-       DEBUG_REC(CNFTXKEY_AGERE,WORDS),
-       DEBUG_REC(CNFAUTHENTICATIONRSPTO,WORDS),
-       DEBUG_REC(CNFBASICRATES,WORDS),
-       DEBUG_REC(CNFSUPPORTEDRATES,WORDS),
-       DEBUG_REC(CNFTICKTIME,WORDS),
-       DEBUG_REC(CNFSCANREQUEST,WORDS),
-       DEBUG_REC(CNFJOINREQUEST,WORDS),
-       DEBUG_REC(CNFAUTHENTICATESTATION,WORDS),
-       DEBUG_REC(CNFCHANNELINFOREQUEST,WORDS),
-       DEBUG_REC(MAXLOADTIME,WORDS),
-       DEBUG_REC(DOWNLOADBUFFER,WORDS),
-       DEBUG_REC(PRIID,WORDS),
-       DEBUG_REC(PRISUPRANGE,WORDS),
-       DEBUG_REC(CFIACTRANGES,WORDS),
-       DEBUG_REC(NICSERNUM,XSTRING),
-       DEBUG_REC(NICID,WORDS),
-       DEBUG_REC(MFISUPRANGE,WORDS),
-       DEBUG_REC(CFISUPRANGE,WORDS),
-       DEBUG_REC(CHANNELLIST,WORDS),
-       DEBUG_REC(REGULATORYDOMAINS,WORDS),
-       DEBUG_REC(TEMPTYPE,WORDS),
-/*     DEBUG_REC(CIS,BYTES), */
-       DEBUG_REC(STAID,WORDS),
-       DEBUG_REC(CURRENTSSID,STRING),
-       DEBUG_REC(CURRENTBSSID,BYTES),
-       DEBUG_REC(COMMSQUALITY,WORDS),
-       DEBUG_REC(CURRENTTXRATE,WORDS),
-       DEBUG_REC(CURRENTBEACONINTERVAL,WORDS),
-       DEBUG_REC(CURRENTSCALETHRESHOLDS,WORDS),
-       DEBUG_REC(PROTOCOLRSPTIME,WORDS),
-       DEBUG_REC(SHORTRETRYLIMIT,WORDS),
-       DEBUG_REC(LONGRETRYLIMIT,WORDS),
-       DEBUG_REC(MAXTRANSMITLIFETIME,WORDS),
-       DEBUG_REC(MAXRECEIVELIFETIME,WORDS),
-       DEBUG_REC(CFPOLLABLE,WORDS),
-       DEBUG_REC(AUTHENTICATIONALGORITHMS,WORDS),
-       DEBUG_REC(PRIVACYOPTIONIMPLEMENTED,WORDS),
-       DEBUG_REC(OWNMACADDR,BYTES),
-       DEBUG_REC(SCANRESULTSTABLE,WORDS),
-       DEBUG_REC(PHYTYPE,WORDS),
-       DEBUG_REC(CURRENTCHANNEL,WORDS),
-       DEBUG_REC(CURRENTPOWERSTATE,WORDS),
-       DEBUG_REC(CCAMODE,WORDS),
-       DEBUG_REC(SUPPORTEDDATARATES,WORDS),
-       DEBUG_REC(BUILDSEQ,BYTES),
-       DEBUG_REC(FWID,XSTRING)
-#undef DEBUG_REC
-};
-
-#define DEBUG_LTV_SIZE         128
-
-static int orinoco_debug_dump_recs(struct net_device *dev)
-{
-       struct orinoco_private *priv = netdev_priv(dev);
-       hermes_t *hw = &priv->hw;
-       u8 *val8;
-       u16 *val16;
-       int i,j;
-       u16 length;
-       int err;
-
-       /* I'm not sure: we might have a lock here, so we'd better go
-           atomic, just in case. */
-       val8 = kmalloc(DEBUG_LTV_SIZE + 2, GFP_ATOMIC);
-       if (! val8)
-               return -ENOMEM;
-       val16 = (u16 *)val8;
-
-       for (i = 0; i < ARRAY_SIZE(record_table); i++) {
-               u16 rid = record_table[i].rid;
-               int len;
-
-               memset(val8, 0, DEBUG_LTV_SIZE + 2);
-
-               err = hermes_read_ltv(hw, USER_BAP, rid, DEBUG_LTV_SIZE,
-                                     &length, val8);
-               if (err) {
-                       DEBUG(0, "Error %d reading RID 0x%04x\n", err, rid);
-                       continue;
-               }
-               val16 = (u16 *)val8;
-               if (length == 0)
-                       continue;
-
-               printk(KERN_DEBUG "%-15s (0x%04x): length=%d (%d bytes)\tvalue=",
-                      record_table[i].name,
-                      rid, length, (length-1)*2);
-               len = min(((int)length-1)*2, DEBUG_LTV_SIZE);
-
-               switch (record_table[i].displaytype) {
-               case DISPLAY_WORDS:
-                       for (j = 0; j < len / 2; j++)
-                               printk("%04X-", le16_to_cpu(val16[j]));
-                       break;
-
-               case DISPLAY_BYTES:
-               default:
-                       for (j = 0; j < len; j++)
-                               printk("%02X:", val8[j]);
-                       break;
-
-               case DISPLAY_STRING:
-                       len = min(len, le16_to_cpu(val16[0])+2);
-                       val8[len] = '\0';
-                       printk("\"%s\"", (char *)&val16[1]);
-                       break;
-
-               case DISPLAY_XSTRING:
-                       printk("'%s'", (char *)val8);
-               }
-
-               printk("\n");
-       }
-
-       kfree(val8);
-
-       return 0;
-}
 
 /********************************************************************/
 /* Debugging                                                        */
@@ -4218,7 +4025,6 @@ EXPORT_SYMBOL(free_orinocodev);
 
 EXPORT_SYMBOL(__orinoco_up);
 EXPORT_SYMBOL(__orinoco_down);
-EXPORT_SYMBOL(orinoco_stop);
 EXPORT_SYMBOL(orinoco_reinit_firmware);
 
 EXPORT_SYMBOL(orinoco_interrupt);
index 13e42c2afb272bd6a8d9978571248c597bdce69a..f749b50d10883359c0a9f73596eaab8644c42ae3 100644 (file)
@@ -119,7 +119,6 @@ extern struct net_device *alloc_orinocodev(int sizeof_card,
 extern void free_orinocodev(struct net_device *dev);
 extern int __orinoco_up(struct net_device *dev);
 extern int __orinoco_down(struct net_device *dev);
-extern int orinoco_stop(struct net_device *dev);
 extern int orinoco_reinit_firmware(struct net_device *dev);
 extern irqreturn_t orinoco_interrupt(int irq, void * dev_id, struct pt_regs *regs);
 
index 55720dc6ec43feb06b3b1edecb8aca6716cea578..745a14183634feb56d83e51685b10d549eb4e846 100644 (file)
@@ -62,7 +62,7 @@ static int task_exit_notify(struct notifier_block * self, unsigned long val, voi
        /* To avoid latency problems, we only process the current CPU,
         * hoping that most samples for the task are on this CPU
         */
-       sync_buffer(_smp_processor_id());
+       sync_buffer(raw_smp_processor_id());
        return 0;
 }
 
@@ -86,7 +86,7 @@ static int munmap_notify(struct notifier_block * self, unsigned long val, void *
                /* To avoid latency problems, we only process the current CPU,
                 * hoping that most samples for the task are on this CPU
                 */
-               sync_buffer(_smp_processor_id());
+               sync_buffer(raw_smp_processor_id());
                return 0;
        }
 
index 021d0f76bc4c4db9b914c194c4a97103ed4e34b0..3903f8c559b603989068767f30bae7fceb2144f6 100644 (file)
@@ -52,116 +52,17 @@ int pci_hotplug (struct device *dev, char **envp, int num_envp,
        if ((buffer_size - length <= 0) || (i >= num_envp))
                return -ENOMEM;
 
+       envp[i++] = scratch;
+       length += scnprintf (scratch, buffer_size - length,
+                           "MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02x\n",
+                           pdev->vendor, pdev->device,
+                           pdev->subsystem_vendor, pdev->subsystem_device,
+                           (u8)(pdev->class >> 16), (u8)(pdev->class >> 8),
+                           (u8)(pdev->class));
+       if ((buffer_size - length <= 0) || (i >= num_envp))
+               return -ENOMEM;
+
        envp[i] = NULL;
 
        return 0;
 }
-
-static int pci_visit_bus (struct pci_visit * fn, struct pci_bus_wrapped *wrapped_bus, struct pci_dev_wrapped *wrapped_parent)
-{
-       struct list_head *ln;
-       struct pci_dev *dev;
-       struct pci_dev_wrapped wrapped_dev;
-       int result = 0;
-
-       pr_debug("PCI: Scanning bus %04x:%02x\n", pci_domain_nr(wrapped_bus->bus),
-               wrapped_bus->bus->number);
-
-       if (fn->pre_visit_pci_bus) {
-               result = fn->pre_visit_pci_bus(wrapped_bus, wrapped_parent);
-               if (result)
-                       return result;
-       }
-
-       ln = wrapped_bus->bus->devices.next; 
-       while (ln != &wrapped_bus->bus->devices) {
-               dev = pci_dev_b(ln);
-               ln = ln->next;
-
-               memset(&wrapped_dev, 0, sizeof(struct pci_dev_wrapped));
-               wrapped_dev.dev = dev;
-
-               result = pci_visit_dev(fn, &wrapped_dev, wrapped_bus);
-               if (result)
-                       return result;
-       }
-
-       if (fn->post_visit_pci_bus)
-               result = fn->post_visit_pci_bus(wrapped_bus, wrapped_parent);
-
-       return result;
-}
-
-static int pci_visit_bridge (struct pci_visit * fn,
-                            struct pci_dev_wrapped *wrapped_dev,
-                            struct pci_bus_wrapped *wrapped_parent)
-{
-       struct pci_bus *bus;
-       struct pci_bus_wrapped wrapped_bus;
-       int result = 0;
-
-       pr_debug("PCI: Scanning bridge %s\n", pci_name(wrapped_dev->dev));
-
-       if (fn->visit_pci_dev) {
-               result = fn->visit_pci_dev(wrapped_dev, wrapped_parent);
-               if (result)
-                       return result;
-       }
-
-       bus = wrapped_dev->dev->subordinate;
-       if (bus) {
-               memset(&wrapped_bus, 0, sizeof(struct pci_bus_wrapped));
-               wrapped_bus.bus = bus;
-
-               result = pci_visit_bus(fn, &wrapped_bus, wrapped_dev);
-       }
-       return result;
-}
-
-/**
- * pci_visit_dev - scans the pci buses.
- * @fn: callback functions that are called while visiting
- * @wrapped_dev: the device to scan
- * @wrapped_parent: the bus where @wrapped_dev is connected to
- *
- * Every bus and every function is presented to a custom
- * function that can act upon it.
- */
-int pci_visit_dev(struct pci_visit *fn, struct pci_dev_wrapped *wrapped_dev,
-                 struct pci_bus_wrapped *wrapped_parent)
-{
-       struct pci_dev* dev = wrapped_dev ? wrapped_dev->dev : NULL;
-       int result = 0;
-
-       if (!dev)
-               return 0;
-
-       if (fn->pre_visit_pci_dev) {
-               result = fn->pre_visit_pci_dev(wrapped_dev, wrapped_parent);
-               if (result)
-                       return result;
-       }
-
-       switch (dev->class >> 8) {
-               case PCI_CLASS_BRIDGE_PCI:
-                       result = pci_visit_bridge(fn, wrapped_dev,
-                                                 wrapped_parent);
-                       if (result)
-                               return result;
-                       break;
-               default:
-                       pr_debug("PCI: Scanning device %s\n", pci_name(dev));
-                       if (fn->visit_pci_dev) {
-                               result = fn->visit_pci_dev (wrapped_dev,
-                                                           wrapped_parent);
-                               if (result)
-                                       return result;
-                       }
-       }
-
-       if (fn->post_visit_pci_dev)
-               result = fn->post_visit_pci_dev(wrapped_dev, wrapped_parent);
-
-       return result;
-}
-EXPORT_SYMBOL(pci_visit_dev);
index 3ddd75937a40e3d089f5ed2b964c0336bb80564e..d9769b30be9a6f175a89c68340b0526c885ec5f2 100644 (file)
@@ -31,7 +31,7 @@
 #include <linux/types.h>
 #include <linux/pci.h>
 
-/* PICMG 2.12 R2.0 HS CSR bits: */
+/* PICMG 2.1 R2.0 HS CSR bits: */
 #define HS_CSR_INS     0x0080
 #define HS_CSR_EXT     0x0040
 #define HS_CSR_PI      0x0030
index ed243605dc7b36bd687fb72b0d96de3aa8f1c2f4..30af105271a2883d559c7ec89a2f5b0efe8f3ed6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * CompactPCI Hot Plug Driver
  *
- * Copyright (C) 2002 SOMA Networks, Inc.
+ * Copyright (C) 2002,2005 SOMA Networks, Inc.
  * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
  * Copyright (C) 2001 IBM Corp.
  *
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/smp_lock.h>
+#include <asm/atomic.h>
 #include <linux/delay.h>
 #include "pci_hotplug.h"
 #include "cpci_hotplug.h"
 
-#define DRIVER_VERSION "0.2"
 #define DRIVER_AUTHOR  "Scott Murray <scottm@somanetworks.com>"
 #define DRIVER_DESC    "CompactPCI Hot Plug Core"
 
 
 #define dbg(format, arg...)                                    \
        do {                                                    \
-               if(cpci_debug)                                  \
+               if (cpci_debug)                                 \
                        printk (KERN_DEBUG "%s: " format "\n",  \
                                MY_NAME , ## arg);              \
-       } while(0)
+       } while (0)
 #define err(format, arg...) printk(KERN_ERR "%s: " format "\n", MY_NAME , ## arg)
 #define info(format, arg...) printk(KERN_INFO "%s: " format "\n", MY_NAME , ## arg)
 #define warn(format, arg...) printk(KERN_WARNING "%s: " format "\n", MY_NAME , ## arg)
 
 /* local variables */
-static spinlock_t list_lock;
+static DECLARE_RWSEM(list_rwsem);
 static LIST_HEAD(slot_list);
 static int slots;
+static atomic_t extracting;
 int cpci_debug;
 static struct cpci_hp_controller *controller;
 static struct semaphore event_semaphore;       /* mutex for process loop (up if something to process) */
@@ -68,6 +69,8 @@ static int disable_slot(struct hotplug_slot *slot);
 static int set_attention_status(struct hotplug_slot *slot, u8 value);
 static int get_power_status(struct hotplug_slot *slot, u8 * value);
 static int get_attention_status(struct hotplug_slot *slot, u8 * value);
+static int get_adapter_status(struct hotplug_slot *slot, u8 * value);
+static int get_latch_status(struct hotplug_slot *slot, u8 * value);
 
 static struct hotplug_slot_ops cpci_hotplug_slot_ops = {
        .owner = THIS_MODULE,
@@ -76,6 +79,8 @@ static struct hotplug_slot_ops cpci_hotplug_slot_ops = {
        .set_attention_status = set_attention_status,
        .get_power_status = get_power_status,
        .get_attention_status = get_attention_status,
+       .get_adapter_status = get_adapter_status,
+       .get_latch_status = get_latch_status,
 };
 
 static int
@@ -106,10 +111,8 @@ enable_slot(struct hotplug_slot *hotplug_slot)
 
        dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name);
 
-       if(controller->ops->set_power) {
+       if (controller->ops->set_power)
                retval = controller->ops->set_power(slot, 1);
-       }
-
        return retval;
 }
 
@@ -121,35 +124,41 @@ disable_slot(struct hotplug_slot *hotplug_slot)
 
        dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name);
 
+       down_write(&list_rwsem);
+
        /* Unconfigure device */
        dbg("%s - unconfiguring slot %s",
            __FUNCTION__, slot->hotplug_slot->name);
-       if((retval = cpci_unconfigure_slot(slot))) {
+       if ((retval = cpci_unconfigure_slot(slot))) {
                err("%s - could not unconfigure slot %s",
                    __FUNCTION__, slot->hotplug_slot->name);
-               return retval;
+               goto disable_error;
        }
        dbg("%s - finished unconfiguring slot %s",
            __FUNCTION__, slot->hotplug_slot->name);
 
        /* Clear EXT (by setting it) */
-       if(cpci_clear_ext(slot)) {
+       if (cpci_clear_ext(slot)) {
                err("%s - could not clear EXT for slot %s",
                    __FUNCTION__, slot->hotplug_slot->name);
                retval = -ENODEV;
+               goto disable_error;
        }
        cpci_led_on(slot);
 
-       if(controller->ops->set_power) {
-               retval = controller->ops->set_power(slot, 0);
-       }
+       if (controller->ops->set_power)
+               if ((retval = controller->ops->set_power(slot, 0)))
+                       goto disable_error;
 
-       if(update_adapter_status(slot->hotplug_slot, 0)) {
+       if (update_adapter_status(slot->hotplug_slot, 0))
                warn("failure to update adapter file");
-       }
-
-       slot->extracting = 0;
 
+       if (slot->extracting) {
+               slot->extracting = 0;
+               atomic_dec(&extracting);
+       }
+disable_error:
+       up_write(&list_rwsem);
        return retval;
 }
 
@@ -158,9 +167,8 @@ cpci_get_power_status(struct slot *slot)
 {
        u8 power = 1;
 
-       if(controller->ops->get_power) {
+       if (controller->ops->get_power)
                power = controller->ops->get_power(slot);
-       }
        return power;
 }
 
@@ -188,6 +196,20 @@ set_attention_status(struct hotplug_slot *hotplug_slot, u8 status)
        return cpci_set_attention_status(hotplug_slot->private, status);
 }
 
+static int
+get_adapter_status(struct hotplug_slot *hotplug_slot, u8 * value)
+{
+       *value = hotplug_slot->info->adapter_status;
+       return 0;
+}
+
+static int
+get_latch_status(struct hotplug_slot *hotplug_slot, u8 * value)
+{
+       *value = hotplug_slot->info->latch_status;
+       return 0;
+}
+
 static void release_slot(struct hotplug_slot *hotplug_slot)
 {
        struct slot *slot = hotplug_slot->private;
@@ -195,6 +217,8 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
        kfree(slot->hotplug_slot->info);
        kfree(slot->hotplug_slot->name);
        kfree(slot->hotplug_slot);
+       if (slot->dev)
+               pci_dev_put(slot->dev);
        kfree(slot);
 }
 
@@ -216,9 +240,8 @@ cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last)
        int status = -ENOMEM;
        int i;
 
-       if(!(controller && bus)) {
+       if (!(controller && bus))
                return -ENODEV;
-       }
 
        /*
         * Create a structure for each slot, and register that slot
@@ -273,10 +296,10 @@ cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last)
                }
 
                /* Add slot to our internal list */
-               spin_lock(&list_lock);
+               down_write(&list_rwsem);
                list_add(&slot->slot_list, &slot_list);
                slots++;
-               spin_unlock(&list_lock);
+               up_write(&list_rwsem);
        }
        return 0;
 error_name:
@@ -295,32 +318,30 @@ int
 cpci_hp_unregister_bus(struct pci_bus *bus)
 {
        struct slot *slot;
-       struct list_head *tmp;
-       struct list_head *next;
-       int status;
+       struct slot *tmp;
+       int status = 0;
 
-       spin_lock(&list_lock);
-       if(!slots) {
-               spin_unlock(&list_lock);
+       down_write(&list_rwsem);
+       if (!slots) {
+               up_write(&list_rwsem);
                return -1;
        }
-       list_for_each_safe(tmp, next, &slot_list) {
-               slot = list_entry(tmp, struct slot, slot_list);
-               if(slot->bus == bus) {
+       list_for_each_entry_safe(slot, tmp, &slot_list, slot_list) {
+               if (slot->bus == bus) {
+                       list_del(&slot->slot_list);
+                       slots--;
+
                        dbg("deregistering slot %s", slot->hotplug_slot->name);
                        status = pci_hp_deregister(slot->hotplug_slot);
-                       if(status) {
+                       if (status) {
                                err("pci_hp_deregister failed with error %d",
                                    status);
-                               return status;
+                               break;
                        }
-
-                       list_del(&slot->slot_list);
-                       slots--;
                }
        }
-       spin_unlock(&list_lock);
-       return 0;
+       up_write(&list_rwsem);
+       return status;
 }
 
 /* This is the interrupt mode interrupt handler */
@@ -330,7 +351,7 @@ cpci_hp_intr(int irq, void *data, struct pt_regs *regs)
        dbg("entered cpci_hp_intr");
 
        /* Check to see if it was our interrupt */
-       if((controller->irq_flags & SA_SHIRQ) &&
+       if ((controller->irq_flags & SA_SHIRQ) &&
            !controller->ops->check_irq(controller->dev_id)) {
                dbg("exited cpci_hp_intr, not our interrupt");
                return IRQ_NONE;
@@ -347,46 +368,38 @@ cpci_hp_intr(int irq, void *data, struct pt_regs *regs)
 }
 
 /*
- * According to PICMG 2.12 R2.0, section 6.3.2, upon
+ * According to PICMG 2.1 R2.0, section 6.3.2, upon
  * initialization, the system driver shall clear the
  * INS bits of the cold-inserted devices.
  */
 static int
-init_slots(void)
+init_slots(int clear_ins)
 {
        struct slot *slot;
-       struct list_head *tmp;
        struct pci_dev* dev;
 
        dbg("%s - enter", __FUNCTION__);
-       spin_lock(&list_lock);
-       if(!slots) {
-               spin_unlock(&list_lock);
+       down_read(&list_rwsem);
+       if (!slots) {
+               up_read(&list_rwsem);
                return -1;
        }
-       list_for_each(tmp, &slot_list) {
-               slot = list_entry(tmp, struct slot, slot_list);
+       list_for_each_entry(slot, &slot_list, slot_list) {
                dbg("%s - looking at slot %s",
                    __FUNCTION__, slot->hotplug_slot->name);
-               if(cpci_check_and_clear_ins(slot)) {
+               if (clear_ins && cpci_check_and_clear_ins(slot))
                        dbg("%s - cleared INS for slot %s",
                            __FUNCTION__, slot->hotplug_slot->name);
-                       dev = pci_find_slot(slot->bus->number, PCI_DEVFN(slot->number, 0));
-                       if(dev) {
-                               if(update_adapter_status(slot->hotplug_slot, 1)) {
-                                       warn("failure to update adapter file");
-                               }
-                               if(update_latch_status(slot->hotplug_slot, 1)) {
-                                       warn("failure to update latch file");
-                               }
-                               slot->dev = dev;
-                       } else {
-                               err("%s - no driver attached to device in slot %s",
-                                   __FUNCTION__, slot->hotplug_slot->name);
-                       }
+               dev = pci_get_slot(slot->bus, PCI_DEVFN(slot->number, 0));
+               if (dev) {
+                       if (update_adapter_status(slot->hotplug_slot, 1))
+                               warn("failure to update adapter file");
+                       if (update_latch_status(slot->hotplug_slot, 1))
+                               warn("failure to update latch file");
+                       slot->dev = dev;
                }
        }
-       spin_unlock(&list_lock);
+       up_read(&list_rwsem);
        dbg("%s - exit", __FUNCTION__);
        return 0;
 }
@@ -395,27 +408,28 @@ static int
 check_slots(void)
 {
        struct slot *slot;
-       struct list_head *tmp;
        int extracted;
        int inserted;
+       u16 hs_csr;
 
-       spin_lock(&list_lock);
-       if(!slots) {
-               spin_unlock(&list_lock);
+       down_read(&list_rwsem);
+       if (!slots) {
+               up_read(&list_rwsem);
                err("no slots registered, shutting down");
                return -1;
        }
        extracted = inserted = 0;
-       list_for_each(tmp, &slot_list) {
-               slot = list_entry(tmp, struct slot, slot_list);
+       list_for_each_entry(slot, &slot_list, slot_list) {
                dbg("%s - looking at slot %s",
                    __FUNCTION__, slot->hotplug_slot->name);
-               if(cpci_check_and_clear_ins(slot)) {
-                       u16 hs_csr;
-
-                       /* Some broken hardware (e.g. PLX 9054AB) asserts ENUM# twice... */
-                       if(slot->dev) {
-                               warn("slot %s already inserted", slot->hotplug_slot->name);
+               if (cpci_check_and_clear_ins(slot)) {
+                       /*
+                        * Some broken hardware (e.g. PLX 9054AB) asserts
+                        * ENUM# twice...
+                        */
+                       if (slot->dev) {
+                               warn("slot %s already inserted",
+                                    slot->hotplug_slot->name);
                                inserted++;
                                continue;
                        }
@@ -432,7 +446,7 @@ check_slots(void)
                        /* Configure device */
                        dbg("%s - configuring slot %s",
                            __FUNCTION__, slot->hotplug_slot->name);
-                       if(cpci_configure_slot(slot)) {
+                       if (cpci_configure_slot(slot)) {
                                err("%s - could not configure slot %s",
                                    __FUNCTION__, slot->hotplug_slot->name);
                                continue;
@@ -445,13 +459,11 @@ check_slots(void)
                        dbg("%s - slot %s HS_CSR (2) = %04x",
                            __FUNCTION__, slot->hotplug_slot->name, hs_csr);
 
-                       if(update_latch_status(slot->hotplug_slot, 1)) {
+                       if (update_latch_status(slot->hotplug_slot, 1))
                                warn("failure to update latch file");
-                       }
 
-                       if(update_adapter_status(slot->hotplug_slot, 1)) {
+                       if (update_adapter_status(slot->hotplug_slot, 1))
                                warn("failure to update adapter file");
-                       }
 
                        cpci_led_off(slot);
 
@@ -461,9 +473,7 @@ check_slots(void)
                            __FUNCTION__, slot->hotplug_slot->name, hs_csr);
 
                        inserted++;
-               } else if(cpci_check_ext(slot)) {
-                       u16 hs_csr;
-
+               } else if (cpci_check_ext(slot)) {
                        /* Process extraction request */
                        dbg("%s - slot %s extracted",
                            __FUNCTION__, slot->hotplug_slot->name);
@@ -473,23 +483,40 @@ check_slots(void)
                        dbg("%s - slot %s HS_CSR = %04x",
                            __FUNCTION__, slot->hotplug_slot->name, hs_csr);
 
-                       if(!slot->extracting) {
-                               if(update_latch_status(slot->hotplug_slot, 0)) {
+                       if (!slot->extracting) {
+                               if (update_latch_status(slot->hotplug_slot, 0)) {
                                        warn("failure to update latch file");
                                }
                                slot->extracting = 1;
+                               atomic_inc(&extracting);
                        }
                        extracted++;
+               } else if (slot->extracting) {
+                       hs_csr = cpci_get_hs_csr(slot);
+                       if (hs_csr == 0xffff) {
+                               /*
+                                * Hmmm, we're likely hosed at this point, should we
+                                * bother trying to tell the driver or not?
+                                */
+                               err("card in slot %s was improperly removed",
+                                   slot->hotplug_slot->name);
+                               if (update_adapter_status(slot->hotplug_slot, 0))
+                                       warn("failure to update adapter file");
+                               slot->extracting = 0;
+                               atomic_dec(&extracting);
+                       }
                }
        }
-       spin_unlock(&list_lock);
-       if(inserted || extracted) {
+       up_read(&list_rwsem);
+       dbg("inserted=%d, extracted=%d, extracting=%d",
+           inserted, extracted, atomic_read(&extracting));
+       if (inserted || extracted)
                return extracted;
-       }
-       else {
+       else if (!atomic_read(&extracting)) {
                err("cannot find ENUM# source, shutting down");
                return -1;
        }
+       return 0;
 }
 
 /* This is the interrupt mode worker thread body */
@@ -497,54 +524,37 @@ static int
 event_thread(void *data)
 {
        int rc;
-       struct slot *slot;
-       struct list_head *tmp;
 
        lock_kernel();
        daemonize("cpci_hp_eventd");
        unlock_kernel();
 
        dbg("%s - event thread started", __FUNCTION__);
-       while(1) {
+       while (1) {
                dbg("event thread sleeping");
                down_interruptible(&event_semaphore);
                dbg("event thread woken, thread_finished = %d",
                    thread_finished);
-               if(thread_finished || signal_pending(current))
+               if (thread_finished || signal_pending(current))
                        break;
-               while(controller->ops->query_enum()) {
+               do {
                        rc = check_slots();
-                       if (rc > 0)
+                       if (rc > 0) {
                                /* Give userspace a chance to handle extraction */
                                msleep(500);
-                       else if (rc < 0) {
+                       else if (rc < 0) {
                                dbg("%s - error checking slots", __FUNCTION__);
                                thread_finished = 1;
                                break;
                        }
-               }
-               /* Check for someone yanking out a board */
-               list_for_each(tmp, &slot_list) {
-                       slot = list_entry(tmp, struct slot, slot_list);
-                       if(slot->extracting) {
-                               /*
-                                * Hmmm, we're likely hosed at this point, should we
-                                * bother trying to tell the driver or not?
-                                */
-                               err("card in slot %s was improperly removed",
-                                   slot->hotplug_slot->name);
-                               if(update_adapter_status(slot->hotplug_slot, 0)) {
-                                       warn("failure to update adapter file");
-                               }
-                               slot->extracting = 0;
-                       }
-               }
+               } while (atomic_read(&extracting) && !thread_finished);
+               if (thread_finished)
+                       break;
 
                /* Re-enable ENUM# interrupt */
                dbg("%s - re-enabling irq", __FUNCTION__);
                controller->ops->enable_irq();
        }
-
        dbg("%s - event thread signals exit", __FUNCTION__);
        up(&thread_exit);
        return 0;
@@ -555,45 +565,27 @@ static int
 poll_thread(void *data)
 {
        int rc;
-       struct slot *slot;
-       struct list_head *tmp;
 
        lock_kernel();
        daemonize("cpci_hp_polld");
        unlock_kernel();
 
-       while(1) {
-               if(thread_finished || signal_pending(current))
+       while (1) {
+               if (thread_finished || signal_pending(current))
                        break;
-
-               while(controller->ops->query_enum()) {
-                       rc = check_slots();
-                       if(rc > 0)
-                               /* Give userspace a chance to handle extraction */
-                               msleep(500);
-                       else if (rc < 0) {
-                               dbg("%s - error checking slots", __FUNCTION__);
-                               thread_finished = 1;
-                               break;
-                       }
-               }
-               /* Check for someone yanking out a board */
-               list_for_each(tmp, &slot_list) {
-                       slot = list_entry(tmp, struct slot, slot_list);
-                       if(slot->extracting) {
-                               /*
-                                * Hmmm, we're likely hosed at this point, should we
-                                * bother trying to tell the driver or not?
-                                */
-                               err("card in slot %s was improperly removed",
-                                   slot->hotplug_slot->name);
-                               if(update_adapter_status(slot->hotplug_slot, 0)) {
-                                       warn("failure to update adapter file");
+               if (controller->ops->query_enum()) {
+                       do {
+                               rc = check_slots();
+                               if (rc > 0) {
+                                       /* Give userspace a chance to handle extraction */
+                                       msleep(500);
+                               } else if (rc < 0) {
+                                       dbg("%s - error checking slots", __FUNCTION__);
+                                       thread_finished = 1;
+                                       break;
                                }
-                               slot->extracting = 0;
-                       }
+                       } while (atomic_read(&extracting) && !thread_finished);
                }
-
                msleep(100);
        }
        dbg("poll thread signals exit");
@@ -611,12 +603,11 @@ cpci_start_thread(void)
        init_MUTEX_LOCKED(&thread_exit);
        thread_finished = 0;
 
-       if(controller->irq) {
+       if (controller->irq)
                pid = kernel_thread(event_thread, NULL, 0);
-       } else {
+       else
                pid = kernel_thread(poll_thread, NULL, 0);
-       }
-       if(pid < 0) {
+       if (pid < 0) {
                err("Can't start up our thread");
                return -1;
        }
@@ -629,9 +620,8 @@ cpci_stop_thread(void)
 {
        thread_finished = 1;
        dbg("thread finish command given");
-       if(controller->irq) {
+       if (controller->irq)
                up(&event_semaphore);
-       }
        dbg("wait for thread to exit");
        down(&thread_exit);
 }
@@ -641,42 +631,67 @@ cpci_hp_register_controller(struct cpci_hp_controller *new_controller)
 {
        int status = 0;
 
-       if(!controller) {
-               controller = new_controller;
-               if(controller->irq) {
-                       if(request_irq(controller->irq,
-                                       cpci_hp_intr,
-                                       controller->irq_flags,
-                                       MY_NAME, controller->dev_id)) {
-                               err("Can't get irq %d for the hotplug cPCI controller", controller->irq);
-                               status = -ENODEV;
-                       }
-                       dbg("%s - acquired controller irq %d", __FUNCTION__,
-                           controller->irq);
+       if (controller)
+               return -1;
+       if (!(new_controller && new_controller->ops))
+               return -EINVAL;
+       if (new_controller->irq) {
+               if (!(new_controller->ops->enable_irq &&
+                    new_controller->ops->disable_irq))
+                       status = -EINVAL;
+               if (request_irq(new_controller->irq,
+                              cpci_hp_intr,
+                              new_controller->irq_flags,
+                              MY_NAME,
+                              new_controller->dev_id)) {
+                       err("Can't get irq %d for the hotplug cPCI controller",
+                           new_controller->irq);
+                       status = -ENODEV;
                }
-       } else {
-               err("cPCI hotplug controller already registered");
-               status = -1;
+               dbg("%s - acquired controller irq %d",
+                   __FUNCTION__, new_controller->irq);
        }
+       if (!status)
+               controller = new_controller;
        return status;
 }
 
+static void
+cleanup_slots(void)
+{
+       struct slot *slot;
+       struct slot *tmp;
+
+       /*
+        * Unregister all of our slots with the pci_hotplug subsystem,
+        * and free up all memory that we had allocated.
+        */
+       down_write(&list_rwsem);
+       if (!slots)
+               goto cleanup_null;
+       list_for_each_entry_safe(slot, tmp, &slot_list, slot_list) {
+               list_del(&slot->slot_list);
+               pci_hp_deregister(slot->hotplug_slot);
+       }
+cleanup_null:
+       up_write(&list_rwsem);
+       return;
+}
+
 int
 cpci_hp_unregister_controller(struct cpci_hp_controller *old_controller)
 {
        int status = 0;
 
-       if(controller) {
-               if(!thread_finished) {
+       if (controller) {
+               if (!thread_finished)
                        cpci_stop_thread();
-               }
-               if(controller->irq) {
+               if (controller->irq)
                        free_irq(controller->irq, controller->dev_id);
-               }
                controller = NULL;
-       } else {
+               cleanup_slots();
+       } else
                status = -ENODEV;
-       }
        return status;
 }
 
@@ -687,32 +702,28 @@ cpci_hp_start(void)
        int status;
 
        dbg("%s - enter", __FUNCTION__);
-       if(!controller) {
+       if (!controller)
                return -ENODEV;
-       }
 
-       spin_lock(&list_lock);
-       if(!slots) {
-               spin_unlock(&list_lock);
+       down_read(&list_rwsem);
+       if (list_empty(&slot_list)) {
+               up_read(&list_rwsem);
                return -ENODEV;
        }
-       spin_unlock(&list_lock);
+       up_read(&list_rwsem);
 
-       if(first) {
-               status = init_slots();
-               if(status) {
-                       return status;
-               }
+       status = init_slots(first);
+       if (first)
                first = 0;
-       }
+       if (status)
+               return status;
 
        status = cpci_start_thread();
-       if(status) {
+       if (status)
                return status;
-       }
        dbg("%s - thread started", __FUNCTION__);
 
-       if(controller->irq) {
+       if (controller->irq) {
                /* Start enum interrupt processing */
                dbg("%s - enabling irq", __FUNCTION__);
                controller->ops->enable_irq();
@@ -724,11 +735,9 @@ cpci_hp_start(void)
 int
 cpci_hp_stop(void)
 {
-       if(!controller) {
+       if (!controller)
                return -ENODEV;
-       }
-
-       if(controller->irq) {
+       if (controller->irq) {
                /* Stop enum interrupt processing */
                dbg("%s - disabling irq", __FUNCTION__);
                controller->ops->disable_irq();
@@ -737,41 +746,10 @@ cpci_hp_stop(void)
        return 0;
 }
 
-static void __exit
-cleanup_slots(void)
-{
-       struct list_head *tmp;
-       struct slot *slot;
-
-       /*
-        * Unregister all of our slots with the pci_hotplug subsystem,
-        * and free up all memory that we had allocated.
-        */
-       spin_lock(&list_lock);
-       if(!slots) {
-               goto null_cleanup;
-       }
-       list_for_each(tmp, &slot_list) {
-               slot = list_entry(tmp, struct slot, slot_list);
-               list_del(&slot->slot_list);
-               pci_hp_deregister(slot->hotplug_slot);
-               kfree(slot->hotplug_slot->info);
-               kfree(slot->hotplug_slot->name);
-               kfree(slot->hotplug_slot);
-               kfree(slot);
-       }
-      null_cleanup:
-       spin_unlock(&list_lock);
-       return;
-}
-
 int __init
 cpci_hotplug_init(int debug)
 {
-       spin_lock_init(&list_lock);
        cpci_debug = debug;
-
-       info(DRIVER_DESC " version: " DRIVER_VERSION);
        return 0;
 }
 
@@ -781,7 +759,8 @@ cpci_hotplug_exit(void)
        /*
         * Clean everything up.
         */
-       cleanup_slots();
+       cpci_hp_stop();
+       cpci_hp_unregister_controller(controller);
 }
 
 EXPORT_SYMBOL_GPL(cpci_hp_register_controller);
index 2e969616f298d620fc0b62876460e557d7505058..225b5e551dd6f53133b982087624b541310bc0ee 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * CompactPCI Hot Plug Driver PCI functions
  *
- * Copyright (C) 2002 by SOMA Networks, Inc.
+ * Copyright (C) 2002,2005 by SOMA Networks, Inc.
  *
  * All rights reserved.
  *
 #include "pci_hotplug.h"
 #include "cpci_hotplug.h"
 
-#if !defined(MODULE)
 #define MY_NAME        "cpci_hotplug"
-#else
-#define MY_NAME        THIS_MODULE->name
-#endif
 
 extern int cpci_debug;
 
 #define dbg(format, arg...)                                    \
        do {                                                    \
-               if(cpci_debug)                                  \
+               if (cpci_debug)                                 \
                        printk (KERN_DEBUG "%s: " format "\n",  \
                                MY_NAME , ## arg);              \
-       } while(0)
+       } while (0)
 #define err(format, arg...) printk(KERN_ERR "%s: " format "\n", MY_NAME , ## arg)
 #define info(format, arg...) printk(KERN_INFO "%s: " format "\n", MY_NAME , ## arg)
 #define warn(format, arg...) printk(KERN_WARNING "%s: " format "\n", MY_NAME , ## arg)
@@ -61,16 +57,15 @@ u8 cpci_get_attention_status(struct slot* slot)
        hs_cap = pci_bus_find_capability(slot->bus,
                                         slot->devfn,
                                         PCI_CAP_ID_CHSWP);
-       if(!hs_cap) {
+       if (!hs_cap)
                return 0;
-       }
 
-       if(pci_bus_read_config_word(slot->bus,
+       if (pci_bus_read_config_word(slot->bus,
                                     slot->devfn,
                                     hs_cap + 2,
-                                    &hs_csr)) {
+                                    &hs_csr))
                return 0;
-       }
+
        return hs_csr & 0x0008 ? 1 : 0;
 }
 
@@ -82,27 +77,22 @@ int cpci_set_attention_status(struct slot* slot, int status)
        hs_cap = pci_bus_find_capability(slot->bus,
                                         slot->devfn,
                                         PCI_CAP_ID_CHSWP);
-       if(!hs_cap) {
+       if (!hs_cap)
                return 0;
-       }
-
-       if(pci_bus_read_config_word(slot->bus,
+       if (pci_bus_read_config_word(slot->bus,
                                     slot->devfn,
                                     hs_cap + 2,
-                                    &hs_csr)) {
+                                    &hs_csr))
                return 0;
-       }
-       if(status) {
+       if (status)
                hs_csr |= HS_CSR_LOO;
-       } else {
+       else
                hs_csr &= ~HS_CSR_LOO;
-       }
-       if(pci_bus_write_config_word(slot->bus,
+       if (pci_bus_write_config_word(slot->bus,
                                      slot->devfn,
                                      hs_cap + 2,
-                                     hs_csr)) {
+                                     hs_csr))
                return 0;
-       }
        return 1;
 }
 
@@ -114,51 +104,16 @@ u16 cpci_get_hs_csr(struct slot* slot)
        hs_cap = pci_bus_find_capability(slot->bus,
                                         slot->devfn,
                                         PCI_CAP_ID_CHSWP);
-       if(!hs_cap) {
+       if (!hs_cap)
                return 0xFFFF;
-       }
-
-       if(pci_bus_read_config_word(slot->bus,
+       if (pci_bus_read_config_word(slot->bus,
                                     slot->devfn,
                                     hs_cap + 2,
-                                    &hs_csr)) {
+                                    &hs_csr))
                return 0xFFFF;
-       }
        return hs_csr;
 }
 
-#if 0
-u16 cpci_set_hs_csr(struct slot* slot, u16 hs_csr)
-{
-       int hs_cap;
-       u16 new_hs_csr;
-
-       hs_cap = pci_bus_find_capability(slot->bus,
-                                        slot->devfn,
-                                        PCI_CAP_ID_CHSWP);
-       if(!hs_cap) {
-               return 0xFFFF;
-       }
-
-       /* Write out the new value */
-       if(pci_bus_write_config_word(slot->bus,
-                                     slot->devfn,
-                                     hs_cap + 2,
-                                     hs_csr)) {
-               return 0xFFFF;
-       }
-
-       /* Read back what we just wrote out */
-       if(pci_bus_read_config_word(slot->bus,
-                                    slot->devfn,
-                                    hs_cap + 2,
-                                    &new_hs_csr)) {
-               return 0xFFFF;
-       }
-       return new_hs_csr;
-}
-#endif
-
 int cpci_check_and_clear_ins(struct slot* slot)
 {
        int hs_cap;
@@ -168,24 +123,22 @@ int cpci_check_and_clear_ins(struct slot* slot)
        hs_cap = pci_bus_find_capability(slot->bus,
                                         slot->devfn,
                                         PCI_CAP_ID_CHSWP);
-       if(!hs_cap) {
+       if (!hs_cap)
                return 0;
-       }
-       if(pci_bus_read_config_word(slot->bus,
+       if (pci_bus_read_config_word(slot->bus,
                                     slot->devfn,
                                     hs_cap + 2,
-                                    &hs_csr)) {
+                                    &hs_csr))
                return 0;
-       }
-       if(hs_csr & HS_CSR_INS) {
+       if (hs_csr & HS_CSR_INS) {
                /* Clear INS (by setting it) */
-               if(pci_bus_write_config_word(slot->bus,
+               if (pci_bus_write_config_word(slot->bus,
                                              slot->devfn,
                                              hs_cap + 2,
-                                             hs_csr)) {
+                                             hs_csr))
                        ins = 0;
-               }
-               ins = 1;
+               else
+                       ins = 1;
        }
        return ins;
 }
@@ -199,18 +152,15 @@ int cpci_check_ext(struct slot* slot)
        hs_cap = pci_bus_find_capability(slot->bus,
                                         slot->devfn,
                                         PCI_CAP_ID_CHSWP);
-       if(!hs_cap) {
+       if (!hs_cap)
                return 0;
-       }
-       if(pci_bus_read_config_word(slot->bus,
+       if (pci_bus_read_config_word(slot->bus,
                                     slot->devfn,
                                     hs_cap + 2,
-                                    &hs_csr)) {
+                                    &hs_csr))
                return 0;
-       }
-       if(hs_csr & HS_CSR_EXT) {
+       if (hs_csr & HS_CSR_EXT)
                ext = 1;
-       }
        return ext;
 }
 
@@ -222,23 +172,20 @@ int cpci_clear_ext(struct slot* slot)
        hs_cap = pci_bus_find_capability(slot->bus,
                                         slot->devfn,
                                         PCI_CAP_ID_CHSWP);
-       if(!hs_cap) {
+       if (!hs_cap)
                return -ENODEV;
-       }
-       if(pci_bus_read_config_word(slot->bus,
+       if (pci_bus_read_config_word(slot->bus,
                                     slot->devfn,
                                     hs_cap + 2,
-                                    &hs_csr)) {
+                                    &hs_csr))
                return -ENODEV;
-       }
-       if(hs_csr & HS_CSR_EXT) {
+       if (hs_csr & HS_CSR_EXT) {
                /* Clear EXT (by setting it) */
-               if(pci_bus_write_config_word(slot->bus,
+               if (pci_bus_write_config_word(slot->bus,
                                              slot->devfn,
                                              hs_cap + 2,
-                                             hs_csr)) {
+                                             hs_csr))
                        return -ENODEV;
-               }
        }
        return 0;
 }
@@ -251,19 +198,16 @@ int cpci_led_on(struct slot* slot)
        hs_cap = pci_bus_find_capability(slot->bus,
                                         slot->devfn,
                                         PCI_CAP_ID_CHSWP);
-       if(!hs_cap) {
+       if (!hs_cap)
                return -ENODEV;
-       }
-       if(pci_bus_read_config_word(slot->bus,
+       if (pci_bus_read_config_word(slot->bus,
                                     slot->devfn,
                                     hs_cap + 2,
-                                    &hs_csr)) {
+                                    &hs_csr))
                return -ENODEV;
-       }
-       if((hs_csr & HS_CSR_LOO) != HS_CSR_LOO) {
-               /* Set LOO */
+       if ((hs_csr & HS_CSR_LOO) != HS_CSR_LOO) {
                hs_csr |= HS_CSR_LOO;
-               if(pci_bus_write_config_word(slot->bus,
+               if (pci_bus_write_config_word(slot->bus,
                                              slot->devfn,
                                              hs_cap + 2,
                                              hs_csr)) {
@@ -283,19 +227,16 @@ int cpci_led_off(struct slot* slot)
        hs_cap = pci_bus_find_capability(slot->bus,
                                         slot->devfn,
                                         PCI_CAP_ID_CHSWP);
-       if(!hs_cap) {
+       if (!hs_cap)
                return -ENODEV;
-       }
-       if(pci_bus_read_config_word(slot->bus,
+       if (pci_bus_read_config_word(slot->bus,
                                     slot->devfn,
                                     hs_cap + 2,
-                                    &hs_csr)) {
+                                    &hs_csr))
                return -ENODEV;
-       }
-       if(hs_csr & HS_CSR_LOO) {
-               /* Clear LOO */
+       if (hs_csr & HS_CSR_LOO) {
                hs_csr &= ~HS_CSR_LOO;
-               if(pci_bus_write_config_word(slot->bus,
+               if (pci_bus_write_config_word(slot->bus,
                                              slot->devfn,
                                              hs_cap + 2,
                                              hs_csr)) {
@@ -312,268 +253,21 @@ int cpci_led_off(struct slot* slot)
  * Device configuration functions
  */
 
-static int cpci_configure_dev(struct pci_bus *bus, struct pci_dev *dev)
-{
-       u8 irq_pin;
-       int r;
-
-       dbg("%s - enter", __FUNCTION__);
-
-       /* NOTE: device already setup from prior scan */
-
-       /* FIXME: How would we know if we need to enable the expansion ROM? */
-       pci_write_config_word(dev, PCI_ROM_ADDRESS, 0x00L);
-
-       /* Assign resources */
-       dbg("assigning resources for %02x:%02x.%x",
-           dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
-       for (r = 0; r < 6; r++) {
-               struct resource *res = dev->resource + r;
-               if(res->flags)
-                       pci_assign_resource(dev, r);
-       }
-       dbg("finished assigning resources for %02x:%02x.%x",
-           dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
-
-       /* Does this function have an interrupt at all? */
-       dbg("checking for function interrupt");
-       pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &irq_pin);
-       if(irq_pin) {
-               dbg("function uses interrupt pin %d", irq_pin);
-       }
-
-       /*
-        * Need to explicitly set irq field to 0 so that it'll get assigned
-        * by the pcibios platform dependent code called by pci_enable_device.
-        */
-       dev->irq = 0;
-
-       dbg("enabling device");
-       pci_enable_device(dev); /* XXX check return */
-       dbg("now dev->irq = %d", dev->irq);
-       if(irq_pin && dev->irq) {
-               pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
-       }
-
-       /* Can't use pci_insert_device at the moment, do it manually for now */
-       pci_proc_attach_device(dev);
-       dbg("notifying drivers");
-       //pci_announce_device_to_drivers(dev);
-       dbg("%s - exit", __FUNCTION__);
-       return 0;
-}
-
-static int cpci_configure_bridge(struct pci_bus* bus, struct pci_dev* dev)
-{
-       int rc;
-       struct pci_bus* child;
-       struct resource* r;
-       u8 max, n;
-       u16 command;
-
-       dbg("%s - enter", __FUNCTION__);
-
-       /* Do basic bridge initialization */
-       rc = pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0x40);
-       if(rc) {
-               printk(KERN_ERR "%s - write of PCI_LATENCY_TIMER failed\n", __FUNCTION__);
-       }
-       rc = pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER, 0x40);
-       if(rc) {
-               printk(KERN_ERR "%s - write of PCI_SEC_LATENCY_TIMER failed\n", __FUNCTION__);
-       }
-       rc = pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, L1_CACHE_BYTES / 4);
-       if(rc) {
-               printk(KERN_ERR "%s - write of PCI_CACHE_LINE_SIZE failed\n", __FUNCTION__);
-       }
-
-       /*
-        * Set parent bridge's subordinate field so that configuration space
-        * access will work in pci_scan_bridge and friends.
-        */
-       max = pci_max_busnr();
-       bus->subordinate = max + 1;
-       pci_write_config_byte(bus->self, PCI_SUBORDINATE_BUS, max + 1);
-
-       /* Scan behind bridge */
-       n = pci_scan_bridge(bus, dev, max, 2);
-       child = pci_find_bus(0, max + 1);
-       if (!child)
-               return -ENODEV;
-       pci_proc_attach_bus(child);
-
-       /*
-        * Update parent bridge's subordinate field if there were more bridges
-        * behind the bridge that was scanned.
-        */
-       if(n > max) {
-               bus->subordinate = n;
-               pci_write_config_byte(bus->self, PCI_SUBORDINATE_BUS, n);
-       }
-
-       /*
-        * Update the bridge resources of the bridge to accommodate devices
-        * behind it.
-        */
-       pci_bus_size_bridges(child);
-       pci_bus_assign_resources(child);
-
-       /* Enable resource mapping via command register */
-       command = PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE | PCI_COMMAND_PARITY | PCI_COMMAND_SERR;
-       r = child->resource[0];
-       if(r && r->start) {
-               command |= PCI_COMMAND_IO;
-       }
-       r = child->resource[1];
-       if(r && r->start) {
-               command |= PCI_COMMAND_MEMORY;
-       }
-       r = child->resource[2];
-       if(r && r->start) {
-               command |= PCI_COMMAND_MEMORY;
-       }
-       rc = pci_write_config_word(dev, PCI_COMMAND, command);
-       if(rc) {
-               err("Error setting command register");
-               return rc;
-       }
-
-       /* Set bridge control register */
-       command = PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR | PCI_BRIDGE_CTL_NO_ISA;
-       rc = pci_write_config_word(dev, PCI_BRIDGE_CONTROL, command);
-       if(rc) {
-               err("Error setting bridge control register");
-               return rc;
-       }
-       dbg("%s - exit", __FUNCTION__);
-       return 0;
-}
-
-static int configure_visit_pci_dev(struct pci_dev_wrapped *wrapped_dev,
-                                  struct pci_bus_wrapped *wrapped_bus)
-{
-       int rc;
-       struct pci_dev *dev = wrapped_dev->dev;
-       struct pci_bus *bus = wrapped_bus->bus;
-       struct slot* slot;
-
-       dbg("%s - enter", __FUNCTION__);
-
-       /*
-        * We need to fix up the hotplug representation with the Linux
-        * representation.
-        */
-       if(wrapped_dev->data) {
-               slot = (struct slot*) wrapped_dev->data;
-               slot->dev = dev;
-       }
-
-       /* If it's a bridge, scan behind it for devices */
-       if(dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
-               rc = cpci_configure_bridge(bus, dev);
-               if(rc)
-                       return rc;
-       }
-
-       /* Actually configure device */
-       if(dev) {
-               rc = cpci_configure_dev(bus, dev);
-               if(rc)
-                       return rc;
-       }
-       dbg("%s - exit", __FUNCTION__);
-       return 0;
-}
-
-static int unconfigure_visit_pci_dev_phase2(struct pci_dev_wrapped *wrapped_dev,
-                                           struct pci_bus_wrapped *wrapped_bus)
-{
-       struct pci_dev *dev = wrapped_dev->dev;
-       struct slot* slot;
-
-       dbg("%s - enter", __FUNCTION__);
-       if(!dev)
-               return -ENODEV;
-
-       /* Remove the Linux representation */
-       if(pci_remove_device_safe(dev)) {
-               err("Could not remove device\n");
-               return -1;
-       }
-
-       /*
-        * Now remove the hotplug representation.
-        */
-       if(wrapped_dev->data) {
-               slot = (struct slot*) wrapped_dev->data;
-               slot->dev = NULL;
-       } else {
-               dbg("No hotplug representation for %02x:%02x.%x",
-                   dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
-       }
-       dbg("%s - exit", __FUNCTION__);
-       return 0;
-}
-
-static int unconfigure_visit_pci_bus_phase2(struct pci_bus_wrapped *wrapped_bus,
-                                           struct pci_dev_wrapped *wrapped_dev)
-{
-       struct pci_bus *bus = wrapped_bus->bus;
-       struct pci_bus *parent = bus->self->bus;
-
-       dbg("%s - enter", __FUNCTION__);
-
-       /* The cleanup code for proc entries regarding buses should be in the kernel... */
-       if(bus->procdir)
-               dbg("detach_pci_bus %s", bus->procdir->name);
-       pci_proc_detach_bus(bus);
-
-       /* The cleanup code should live in the kernel... */
-       bus->self->subordinate = NULL;
-
-       /* unlink from parent bus */
-       list_del(&bus->node);
-
-       /* Now, remove */
-       if(bus)
-               kfree(bus);
-
-       /* Update parent's subordinate field */
-       if(parent) {
-               u8 n = pci_bus_max_busnr(parent);
-               if(n < parent->subordinate) {
-                       parent->subordinate = n;
-                       pci_write_config_byte(parent->self, PCI_SUBORDINATE_BUS, n);
-               }
-       }
-       dbg("%s - exit", __FUNCTION__);
-       return 0;
-}
-
-static struct pci_visit configure_functions = {
-       .visit_pci_dev = configure_visit_pci_dev,
-};
-
-static struct pci_visit unconfigure_functions_phase2 = {
-       .post_visit_pci_bus = unconfigure_visit_pci_bus_phase2,
-       .post_visit_pci_dev = unconfigure_visit_pci_dev_phase2
-};
-
-
 int cpci_configure_slot(struct slot* slot)
 {
-       int rc = 0;
+       unsigned char busnr;
+       struct pci_bus *child;
 
        dbg("%s - enter", __FUNCTION__);
 
-       if(slot->dev == NULL) {
+       if (slot->dev == NULL) {
                dbg("pci_dev null, finding %02x:%02x:%x",
                    slot->bus->number, PCI_SLOT(slot->devfn), PCI_FUNC(slot->devfn));
-               slot->dev = pci_find_slot(slot->bus->number, slot->devfn);
+               slot->dev = pci_get_slot(slot->bus, slot->devfn);
        }
 
        /* Still NULL? Well then scan for it! */
-       if(slot->dev == NULL) {
+       if (slot->dev == NULL) {
                int n;
                dbg("pci_dev still null");
 
@@ -583,79 +277,50 @@ int cpci_configure_slot(struct slot* slot)
                 */
                n = pci_scan_slot(slot->bus, slot->devfn);
                dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n);
-               if(n > 0)
+               if (n > 0)
                        pci_bus_add_devices(slot->bus);
-               slot->dev = pci_find_slot(slot->bus->number, slot->devfn);
-               if(slot->dev == NULL) {
+               slot->dev = pci_get_slot(slot->bus, slot->devfn);
+               if (slot->dev == NULL) {
                        err("Could not find PCI device for slot %02x", slot->number);
-                       return 0;
+                       return 1;
                }
        }
-       dbg("slot->dev = %p", slot->dev);
-       if(slot->dev) {
-               struct pci_dev *dev;
-               struct pci_dev_wrapped wrapped_dev;
-               struct pci_bus_wrapped wrapped_bus;
-               int i;
-
-               memset(&wrapped_dev, 0, sizeof (struct pci_dev_wrapped));
-               memset(&wrapped_bus, 0, sizeof (struct pci_bus_wrapped));
-
-               for (i = 0; i < 8; i++) {
-                       dev = pci_find_slot(slot->bus->number,
-                                           PCI_DEVFN(PCI_SLOT(slot->dev->devfn), i));
-                       if(!dev)
-                               continue;
-                       wrapped_dev.dev = dev;
-                       wrapped_bus.bus = slot->dev->bus;
-                       if(i)
-                               wrapped_dev.data = NULL;
-                       else
-                               wrapped_dev.data = (void*) slot;
-                       rc = pci_visit_dev(&configure_functions, &wrapped_dev, &wrapped_bus);
-               }
+
+       if (slot->dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
+               pci_read_config_byte(slot->dev, PCI_SECONDARY_BUS, &busnr);
+               child = pci_add_new_bus(slot->dev->bus, slot->dev, busnr);
+               pci_do_scan_bus(child);
+               pci_bus_size_bridges(child);
        }
 
-       dbg("%s - exit, rc = %d", __FUNCTION__, rc);
-       return rc;
+       pci_bus_assign_resources(slot->dev->bus);
+
+       dbg("%s - exit", __FUNCTION__);
+       return 0;
 }
 
 int cpci_unconfigure_slot(struct slot* slot)
 {
-       int rc = 0;
        int i;
-       struct pci_dev_wrapped wrapped_dev;
-       struct pci_bus_wrapped wrapped_bus;
        struct pci_dev *dev;
 
        dbg("%s - enter", __FUNCTION__);
-
-       if(!slot->dev) {
+       if (!slot->dev) {
                err("No device for slot %02x\n", slot->number);
                return -ENODEV;
        }
 
-       memset(&wrapped_dev, 0, sizeof (struct pci_dev_wrapped));
-       memset(&wrapped_bus, 0, sizeof (struct pci_bus_wrapped));
-
        for (i = 0; i < 8; i++) {
-               dev = pci_find_slot(slot->bus->number,
+               dev = pci_get_slot(slot->bus,
                                    PCI_DEVFN(PCI_SLOT(slot->devfn), i));
-               if(dev) {
-                       wrapped_dev.dev = dev;
-                       wrapped_bus.bus = dev->bus;
-                       if(i)
-                               wrapped_dev.data = NULL;
-                       else
-                               wrapped_dev.data = (void*) slot;
-                       dbg("%s - unconfigure phase 2", __FUNCTION__);
-                       rc = pci_visit_dev(&unconfigure_functions_phase2,
-                                          &wrapped_dev,
-                                          &wrapped_bus);
-                       if(rc)
-                               break;
+               if (dev) {
+                       pci_remove_bus_device(dev);
+                       pci_dev_put(dev);
                }
        }
-       dbg("%s - exit, rc = %d", __FUNCTION__, rc);
-       return rc;
+       pci_dev_put(slot->dev);
+       slot->dev = NULL;
+
+       dbg("%s - exit", __FUNCTION__);
+       return 0;
 }
index 41c7971d06c55e2a73729b97f65c91987bd379d7..4c11048ad51b432f41bc7c965b8666debf4144b2 100644 (file)
@@ -38,7 +38,7 @@
 
 /* A few routines that create sysfs entries for the hot plug controller */
 
-static ssize_t show_ctrl (struct device *dev, char *buf)
+static ssize_t show_ctrl (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pci_dev *pci_dev;
        struct controller *ctrl;
@@ -82,7 +82,7 @@ static ssize_t show_ctrl (struct device *dev, char *buf)
 }
 static DEVICE_ATTR (ctrl, S_IRUGO, show_ctrl, NULL);
 
-static ssize_t show_dev (struct device *dev, char *buf)
+static ssize_t show_dev (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pci_dev *pci_dev;
        struct controller *ctrl;
index c802f6270b8954d52eccfb9f938351319b21604a..c4282902cb5245494ba84870d64432b71b203154 100644 (file)
@@ -73,7 +73,7 @@ static ssize_t hotplug_slot_attr_show(struct kobject *kobj,
 {
        struct hotplug_slot *slot = to_hotplug_slot(kobj);
        struct hotplug_slot_attribute *attribute = to_hotplug_attr(attr);
-       return attribute->show ? attribute->show(slot, buf) : 0;
+       return attribute->show ? attribute->show(slot, buf) : -EIO;
 }
 
 static ssize_t hotplug_slot_attr_store(struct kobject *kobj,
@@ -81,7 +81,7 @@ static ssize_t hotplug_slot_attr_store(struct kobject *kobj,
 {
        struct hotplug_slot *slot = to_hotplug_slot(kobj);
        struct hotplug_slot_attribute *attribute = to_hotplug_attr(attr);
-       return attribute->store ? attribute->store(slot, buf, len) : 0;
+       return attribute->store ? attribute->store(slot, buf, len) : -EIO;
 }
 
 static struct sysfs_ops hotplug_slot_sysfs_ops = {
index f313121d51414d9a3f12bf26bea28a6bfe0b2bcc..46b294a12418a65eb58055c2535a9e2f23bd39d5 100644 (file)
@@ -130,6 +130,7 @@ struct controller {
        u8 slot_bus;            /* Bus where the slots handled by this controller sit */
        u8 ctrlcap;
        u16 vendor_id;
+       u8 cap_base;
 };
 
 struct irq_mapping {
index ed1fd8d6178d7f7418d840f93db0ef6e04142c67..df4915dbc321ca21622dd187b1a8ebc852b5bfae 100644 (file)
@@ -607,7 +607,7 @@ static int pciehp_resume (struct pcie_device *dev)
 static struct pcie_port_service_id port_pci_ids[] = { { 
        .vendor = PCI_ANY_ID, 
        .device = PCI_ANY_ID,
-       .port_type = PCIE_RC_PORT, 
+       .port_type = PCIE_ANY_PORT,
        .service_type = PCIE_PORT_SERVICE_HP,
        .driver_data =  0, 
        }, { /* end: all zeroes */ }
index 9e70c4681f77e57d782116ce6d74afb3729c7ceb..1cda30bd6e47c90020fec4290f15aee624f95a4f 100644 (file)
@@ -109,20 +109,20 @@ enum ctrl_offsets {
 };
 static int pcie_cap_base = 0;          /* Base of the PCI Express capability item structure */ 
 
-#define PCIE_CAP_ID    ( pcie_cap_base + PCIECAPID )
-#define NXT_CAP_PTR    ( pcie_cap_base + NXTCAPPTR )
-#define CAP_REG                ( pcie_cap_base + CAPREG )
-#define DEV_CAP                ( pcie_cap_base + DEVCAP )
-#define DEV_CTRL       ( pcie_cap_base + DEVCTRL )
-#define DEV_STATUS     ( pcie_cap_base + DEVSTATUS )
-#define LNK_CAP                ( pcie_cap_base + LNKCAP )
-#define LNK_CTRL       ( pcie_cap_base + LNKCTRL )
-#define LNK_STATUS     ( pcie_cap_base + LNKSTATUS )
-#define SLOT_CAP       ( pcie_cap_base + SLOTCAP )
-#define SLOT_CTRL      ( pcie_cap_base + SLOTCTRL )
-#define SLOT_STATUS    ( pcie_cap_base + SLOTSTATUS )
-#define ROOT_CTRL      ( pcie_cap_base + ROOTCTRL )
-#define ROOT_STATUS    ( pcie_cap_base + ROOTSTATUS )
+#define PCIE_CAP_ID(cb)        ( cb + PCIECAPID )
+#define NXT_CAP_PTR(cb)        ( cb + NXTCAPPTR )
+#define CAP_REG(cb)    ( cb + CAPREG )
+#define DEV_CAP(cb)    ( cb + DEVCAP )
+#define DEV_CTRL(cb)   ( cb + DEVCTRL )
+#define DEV_STATUS(cb) ( cb + DEVSTATUS )
+#define LNK_CAP(cb)    ( cb + LNKCAP )
+#define LNK_CTRL(cb)   ( cb + LNKCTRL )
+#define LNK_STATUS(cb) ( cb + LNKSTATUS )
+#define SLOT_CAP(cb)   ( cb + SLOTCAP )
+#define SLOT_CTRL(cb)  ( cb + SLOTCTRL )
+#define SLOT_STATUS(cb)        ( cb + SLOTSTATUS )
+#define ROOT_CTRL(cb)  ( cb + ROOTCTRL )
+#define ROOT_STATUS(cb)        ( cb + ROOTSTATUS )
 
 #define hp_register_read_word(pdev, reg , value)               \
        pci_read_config_word(pdev, reg, &value)
@@ -303,7 +303,7 @@ static int pcie_write_cmd(struct slot *slot, u16 cmd)
                return -1;
        }
 
-       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(slot->ctrl->cap_base), slot_status);
        if (retval) {
                        err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
                        return retval;
@@ -317,7 +317,7 @@ static int pcie_write_cmd(struct slot *slot, u16 cmd)
        }
 
        dbg("%s: Before hp_register_write_word SLOT_CTRL %x\n", __FUNCTION__, cmd);
-       retval = hp_register_write_word(php_ctlr->pci_dev, SLOT_CTRL, cmd | CMD_CMPL_INTR_ENABLE);
+       retval = hp_register_write_word(php_ctlr->pci_dev, SLOT_CTRL(slot->ctrl->cap_base), cmd | CMD_CMPL_INTR_ENABLE);
        if (retval) {
                err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__);
                return retval;
@@ -342,7 +342,7 @@ static int hpc_check_lnk_status(struct controller *ctrl)
                return -1;
        }
        
-       retval = hp_register_read_word(php_ctlr->pci_dev, LNK_STATUS, lnk_status);
+       retval = hp_register_read_word(php_ctlr->pci_dev, LNK_STATUS(ctrl->cap_base), lnk_status);
 
        if (retval) {
                err("%s : hp_register_read_word LNK_STATUS failed\n", __FUNCTION__);
@@ -376,14 +376,14 @@ static int hpc_get_attention_status(struct slot *slot, u8 *status)
                return -1;
        }
 
-       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL, slot_ctrl);
+       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(slot->ctrl->cap_base), slot_ctrl);
 
        if (retval) {
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                return retval;
        }
 
-       dbg("%s: SLOT_CTRL %x, value read %x\n", __FUNCTION__,SLOT_CTRL, slot_ctrl);
+       dbg("%s: SLOT_CTRL %x, value read %x\n", __FUNCTION__,SLOT_CTRL(slot->ctrl->cap_base), slot_ctrl);
 
        atten_led_state = (slot_ctrl & ATTN_LED_CTRL) >> 6;
 
@@ -423,13 +423,13 @@ static int hpc_get_power_status(struct slot * slot, u8 *status)
                return -1;
        }
 
-       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL, slot_ctrl);
+       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(slot->ctrl->cap_base), slot_ctrl);
 
        if (retval) {
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                return retval;
        }
-       dbg("%s: SLOT_CTRL %x value read %x\n", __FUNCTION__, SLOT_CTRL, slot_ctrl);
+       dbg("%s: SLOT_CTRL %x value read %x\n", __FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base), slot_ctrl);
 
        pwr_state = (slot_ctrl & PWR_CTRL) >> 10;
 
@@ -463,7 +463,7 @@ static int hpc_get_latch_status(struct slot *slot, u8 *status)
                return -1;
        }
 
-       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(slot->ctrl->cap_base), slot_status);
 
        if (retval) {
                err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
@@ -490,7 +490,7 @@ static int hpc_get_adapter_status(struct slot *slot, u8 *status)
                return -1;
        }
 
-       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(slot->ctrl->cap_base), slot_status);
 
        if (retval) {
                err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
@@ -518,7 +518,7 @@ static int hpc_query_power_fault(struct slot * slot)
                return -1;
        }
 
-       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(slot->ctrl->cap_base), slot_status);
 
        if (retval) {
                err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
@@ -549,7 +549,7 @@ static int hpc_set_attention_status(struct slot *slot, u8 value)
                err("%s: Invalid HPC slot number!\n", __FUNCTION__);
                return -1;
        }
-       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL, slot_ctrl);
+       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(slot->ctrl->cap_base), slot_ctrl);
 
        if (rc) {
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
@@ -574,7 +574,7 @@ static int hpc_set_attention_status(struct slot *slot, u8 value)
                slot_cmd = slot_cmd | HP_INTR_ENABLE; 
 
        pcie_write_cmd(slot, slot_cmd);
-       dbg("%s: SLOT_CTRL %x write cmd %x\n", __FUNCTION__, SLOT_CTRL, slot_cmd);
+       dbg("%s: SLOT_CTRL %x write cmd %x\n", __FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base), slot_cmd);
        
        return rc;
 }
@@ -598,7 +598,7 @@ static void hpc_set_green_led_on(struct slot *slot)
                return ;
        }
 
-       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL, slot_ctrl);
+       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(slot->ctrl->cap_base), slot_ctrl);
 
        if (rc) {
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
@@ -611,7 +611,7 @@ static void hpc_set_green_led_on(struct slot *slot)
 
        pcie_write_cmd(slot, slot_cmd);
 
-       dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__, SLOT_CTRL, slot_cmd);
+       dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base), slot_cmd);
        return;
 }
 
@@ -633,7 +633,7 @@ static void hpc_set_green_led_off(struct slot *slot)
                return ;
        }
 
-       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL, slot_ctrl);
+       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(slot->ctrl->cap_base), slot_ctrl);
 
        if (rc) {
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
@@ -646,7 +646,7 @@ static void hpc_set_green_led_off(struct slot *slot)
        if (!pciehp_poll_mode)
                slot_cmd = slot_cmd | HP_INTR_ENABLE; 
        pcie_write_cmd(slot, slot_cmd);
-       dbg("%s: SLOT_CTRL %x write cmd %x\n", __FUNCTION__, SLOT_CTRL, slot_cmd);
+       dbg("%s: SLOT_CTRL %x write cmd %x\n", __FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base), slot_cmd);
 
        return;
 }
@@ -669,7 +669,7 @@ static void hpc_set_green_led_blink(struct slot *slot)
                return ;
        }
 
-       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL, slot_ctrl);
+       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(slot->ctrl->cap_base), slot_ctrl);
 
        if (rc) {
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
@@ -683,7 +683,7 @@ static void hpc_set_green_led_blink(struct slot *slot)
                slot_cmd = slot_cmd | HP_INTR_ENABLE; 
        pcie_write_cmd(slot, slot_cmd);
 
-       dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__, SLOT_CTRL, slot_cmd);
+       dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base), slot_cmd);
        return;
 }
 
@@ -707,7 +707,7 @@ int pcie_get_ctlr_slot_config(struct controller *ctrl,
        *first_device_num = 0;
        *num_ctlr_slots = 1; 
 
-       rc = hp_register_read_dword(php_ctlr->pci_dev, SLOT_CAP, slot_cap);
+       rc = hp_register_read_dword(php_ctlr->pci_dev, SLOT_CAP(ctrl->cap_base), slot_cap);
 
        if (rc) {
                err("%s : hp_register_read_dword SLOT_CAP failed\n", __FUNCTION__);
@@ -793,13 +793,13 @@ static int hpc_power_on_slot(struct slot * slot)
                return -1;
        }
 
-       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL, slot_ctrl);
+       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(slot->ctrl->cap_base), slot_ctrl);
 
        if (retval) {
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                return retval;
        }
-       dbg("%s: SLOT_CTRL %x, value read %xn", __FUNCTION__, SLOT_CTRL
+       dbg("%s: SLOT_CTRL %x, value read %xn", __FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base),
                slot_ctrl);
 
        slot_cmd = (slot_ctrl & ~PWR_CTRL) | POWER_ON;
@@ -813,7 +813,7 @@ static int hpc_power_on_slot(struct slot * slot)
                err("%s: Write %x command failed!\n", __FUNCTION__, slot_cmd);
                return -1;
        }
-       dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__, SLOT_CTRL, slot_cmd);
+       dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base), slot_cmd);
 
        DBG_LEAVE_ROUTINE
 
@@ -842,13 +842,13 @@ static int hpc_power_off_slot(struct slot * slot)
                err("%s: Invalid HPC slot number!\n", __FUNCTION__);
                return -1;
        }
-       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL, slot_ctrl);
+       retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(slot->ctrl->cap_base), slot_ctrl);
 
        if (retval) {
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                return retval;
        }
-       dbg("%s: SLOT_CTRL %x, value read %x\n", __FUNCTION__, SLOT_CTRL
+       dbg("%s: SLOT_CTRL %x, value read %x\n", __FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base),
                slot_ctrl);
 
        slot_cmd = (slot_ctrl & ~PWR_CTRL) | POWER_OFF;
@@ -862,7 +862,7 @@ static int hpc_power_off_slot(struct slot * slot)
                err("%s: Write command failed!\n", __FUNCTION__);
                return -1;
        }
-       dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__, SLOT_CTRL, slot_cmd);
+       dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base), slot_cmd);
 
        DBG_LEAVE_ROUTINE
 
@@ -900,7 +900,7 @@ static irqreturn_t pcie_isr(int IRQ, void *dev_id, struct pt_regs *regs)
                return IRQ_NONE;
        }
 
-       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), slot_status);
        if (rc) {
                err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
                return IRQ_NONE;
@@ -918,7 +918,7 @@ static irqreturn_t pcie_isr(int IRQ, void *dev_id, struct pt_regs *regs)
        dbg("%s: intr_loc %x\n", __FUNCTION__, intr_loc);
        /* Mask Hot-plug Interrupt Enable */
        if (!pciehp_poll_mode) {
-               rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL, temp_word);
+               rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(ctrl->cap_base), temp_word);
                if (rc) {
                        err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                        return IRQ_NONE;
@@ -928,14 +928,14 @@ static irqreturn_t pcie_isr(int IRQ, void *dev_id, struct pt_regs *regs)
                dbg("%s: hp_register_read_word SLOT_CTRL with value %x\n", __FUNCTION__, temp_word);
                temp_word = (temp_word & ~HP_INTR_ENABLE & ~CMD_CMPL_INTR_ENABLE) | 0x00;
 
-               rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_CTRL, temp_word);
+               rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_CTRL(ctrl->cap_base), temp_word);
                if (rc) {
                        err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__);
                        return IRQ_NONE;
                }
                dbg("%s: hp_register_write_word SLOT_CTRL with value %x\n", __FUNCTION__, temp_word);
                
-               rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+               rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), slot_status);
                if (rc) {
                        err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
                        return IRQ_NONE;
@@ -944,7 +944,7 @@ static irqreturn_t pcie_isr(int IRQ, void *dev_id, struct pt_regs *regs)
                
                /* Clear command complete interrupt caused by this write */
                temp_word = 0x1f;
-               rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS, temp_word);
+               rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), temp_word);
                if (rc) {
                        err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__);
                        return IRQ_NONE;
@@ -975,14 +975,14 @@ static irqreturn_t pcie_isr(int IRQ, void *dev_id, struct pt_regs *regs)
 
        /* Clear all events after serving them */
        temp_word = 0x1F;
-       rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS, temp_word);
+       rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), temp_word);
        if (rc) {
                err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__);
                return IRQ_NONE;
        }
        /* Unmask Hot-plug Interrupt Enable */
        if (!pciehp_poll_mode) {
-               rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL, temp_word);
+               rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(ctrl->cap_base), temp_word);
                if (rc) {
                        err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                        return IRQ_NONE;
@@ -992,14 +992,14 @@ static irqreturn_t pcie_isr(int IRQ, void *dev_id, struct pt_regs *regs)
                dbg("%s: hp_register_read_word SLOT_CTRL with value %x\n", __FUNCTION__, temp_word);
                temp_word = (temp_word & ~HP_INTR_ENABLE) | HP_INTR_ENABLE;
 
-               rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_CTRL, temp_word);
+               rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_CTRL(ctrl->cap_base), temp_word);
                if (rc) {
                        err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__);
                        return IRQ_NONE;
                }
                dbg("%s: hp_register_write_word SLOT_CTRL with value %x\n", __FUNCTION__, temp_word);   
        
-               rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+               rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), slot_status);
                if (rc) {
                        err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
                        return IRQ_NONE;
@@ -1008,7 +1008,7 @@ static irqreturn_t pcie_isr(int IRQ, void *dev_id, struct pt_regs *regs)
                
                /* Clear command complete interrupt caused by this write */
                temp_word = 0x1F;
-               rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS, temp_word);
+               rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), temp_word);
                if (rc) {
                        err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__);
                        return IRQ_NONE;
@@ -1038,7 +1038,7 @@ static int hpc_get_max_lnk_speed (struct slot *slot, enum pci_bus_speed *value)
                return -1;
        }
 
-       retval = hp_register_read_dword(php_ctlr->pci_dev, LNK_CAP, lnk_cap);
+       retval = hp_register_read_dword(php_ctlr->pci_dev, LNK_CAP(slot->ctrl->cap_base), lnk_cap);
 
        if (retval) {
                err("%s : hp_register_read_dword  LNK_CAP failed\n", __FUNCTION__);
@@ -1079,7 +1079,7 @@ static int hpc_get_max_lnk_width (struct slot *slot, enum pcie_link_width *value
                return -1;
        }
 
-       retval = hp_register_read_dword(php_ctlr->pci_dev, LNK_CAP, lnk_cap);
+       retval = hp_register_read_dword(php_ctlr->pci_dev, LNK_CAP(slot->ctrl->cap_base), lnk_cap);
 
        if (retval) {
                err("%s : hp_register_read_dword  LNK_CAP failed\n", __FUNCTION__);
@@ -1141,7 +1141,7 @@ static int hpc_get_cur_lnk_speed (struct slot *slot, enum pci_bus_speed *value)
                return -1;
        }
 
-       retval = hp_register_read_word(php_ctlr->pci_dev, LNK_STATUS, lnk_status);
+       retval = hp_register_read_word(php_ctlr->pci_dev, LNK_STATUS(slot->ctrl->cap_base), lnk_status);
 
        if (retval) {
                err("%s : hp_register_read_word LNK_STATUS failed\n", __FUNCTION__);
@@ -1182,7 +1182,7 @@ static int hpc_get_cur_lnk_width (struct slot *slot, enum pcie_link_width *value
                return -1;
        }
 
-       retval = hp_register_read_word(php_ctlr->pci_dev, LNK_STATUS, lnk_status);
+       retval = hp_register_read_word(php_ctlr->pci_dev, LNK_STATUS(slot->ctrl->cap_base), lnk_status);
 
        if (retval) {
                err("%s : hp_register_read_word LNK_STATUS failed\n", __FUNCTION__);
@@ -1292,47 +1292,48 @@ int pcie_init(struct controller * ctrl,
                goto abort_free_ctlr;
        }
 
-       pcie_cap_base = cap_base;
+       ctrl->cap_base = cap_base;
 
        dbg("%s: pcie_cap_base %x\n", __FUNCTION__, pcie_cap_base);
 
-       rc = hp_register_read_word(pdev, CAP_REG, cap_reg);
+       rc = hp_register_read_word(pdev, CAP_REG(ctrl->cap_base), cap_reg);
        if (rc) {
                err("%s : hp_register_read_word CAP_REG failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s: CAP_REG offset %x cap_reg %x\n", __FUNCTION__, CAP_REG, cap_reg);
+       dbg("%s: CAP_REG offset %x cap_reg %x\n", __FUNCTION__, CAP_REG(ctrl->cap_base), cap_reg);
 
-       if (((cap_reg & SLOT_IMPL) == 0) || ((cap_reg & DEV_PORT_TYPE) != 0x0040)){
+       if (((cap_reg & SLOT_IMPL) == 0) || (((cap_reg & DEV_PORT_TYPE) != 0x0040)
+               && ((cap_reg & DEV_PORT_TYPE) != 0x0060))) {
                dbg("%s : This is not a root port or the port is not connected to a slot\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
 
-       rc = hp_register_read_dword(php_ctlr->pci_dev, SLOT_CAP, slot_cap);
+       rc = hp_register_read_dword(php_ctlr->pci_dev, SLOT_CAP(ctrl->cap_base), slot_cap);
        if (rc) {
                err("%s : hp_register_read_word CAP_REG failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s: SLOT_CAP offset %x slot_cap %x\n", __FUNCTION__, SLOT_CAP, slot_cap);
+       dbg("%s: SLOT_CAP offset %x slot_cap %x\n", __FUNCTION__, SLOT_CAP(ctrl->cap_base), slot_cap);
 
        if (!(slot_cap & HP_CAP)) {
                dbg("%s : This slot is not hot-plug capable\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
        /* For debugging purpose */
-       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), slot_status);
        if (rc) {
                err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s: SLOT_STATUS offset %x slot_status %x\n", __FUNCTION__, SLOT_STATUS, slot_status);
+       dbg("%s: SLOT_STATUS offset %x slot_status %x\n", __FUNCTION__, SLOT_STATUS(ctrl->cap_base), slot_status);
 
-       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL, slot_ctrl);
+       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(ctrl->cap_base), slot_ctrl);
        if (rc) {
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s: SLOT_CTRL offset %x slot_ctrl %x\n", __FUNCTION__, SLOT_CTRL, slot_ctrl);
+       dbg("%s: SLOT_CTRL offset %x slot_ctrl %x\n", __FUNCTION__, SLOT_CTRL(ctrl->cap_base), slot_ctrl);
 
        if (first) {
                spin_lock_init(&hpc_event_lock);
@@ -1372,36 +1373,37 @@ int pcie_init(struct controller * ctrl,
        php_ctlr->num_slots = 1;
 
        /* Mask Hot-plug Interrupt Enable */
-       rc = hp_register_read_word(pdev, SLOT_CTRL, temp_word);
+       rc = hp_register_read_word(pdev, SLOT_CTRL(ctrl->cap_base), temp_word);
        if (rc) {
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
 
-       dbg("%s: SLOT_CTRL %x value read %x\n", __FUNCTION__, SLOT_CTRL, temp_word);
+       dbg("%s: SLOT_CTRL %x value read %x\n", __FUNCTION__, SLOT_CTRL(ctrl->cap_base), temp_word);
        temp_word = (temp_word & ~HP_INTR_ENABLE & ~CMD_CMPL_INTR_ENABLE) | 0x00;
 
-       rc = hp_register_write_word(pdev, SLOT_CTRL, temp_word);
+       rc = hp_register_write_word(pdev, SLOT_CTRL(ctrl->cap_base), temp_word);
        if (rc) {
                err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
        dbg("%s : Mask HPIE hp_register_write_word SLOT_CTRL %x\n", __FUNCTION__, temp_word);
 
-       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), slot_status);
        if (rc) {
                err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s: Mask HPIE SLOT_STATUS offset %x reads slot_status %x\n", __FUNCTION__, SLOT_STATUS, slot_status);
+       dbg("%s: Mask HPIE SLOT_STATUS offset %x reads slot_status %x\n", __FUNCTION__, SLOT_STATUS(ctrl->cap_base)
+               , slot_status);
 
        temp_word = 0x1F; /* Clear all events */
-       rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS, temp_word);
+       rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), temp_word);
        if (rc) {
                err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s: SLOT_STATUS offset %x writes slot_status %x\n", __FUNCTION__, SLOT_STATUS, temp_word);
+       dbg("%s: SLOT_STATUS offset %x writes slot_status %x\n", __FUNCTION__, SLOT_STATUS(ctrl->cap_base), temp_word);
 
        if (pciehp_poll_mode)  {/* Install interrupt polling code */
                /* Install and start the interrupt polling timer */
@@ -1417,12 +1419,12 @@ int pcie_init(struct controller * ctrl,
                }
        }
 
-       rc = hp_register_read_word(pdev, SLOT_CTRL, temp_word);
+       rc = hp_register_read_word(pdev, SLOT_CTRL(ctrl->cap_base), temp_word);
        if (rc) {
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s: SLOT_CTRL %x value read %x\n", __FUNCTION__, SLOT_CTRL, temp_word);
+       dbg("%s: SLOT_CTRL %x value read %x\n", __FUNCTION__, SLOT_CTRL(ctrl->cap_base), temp_word);
        dbg("%s: slot_cap %x\n", __FUNCTION__, slot_cap);
 
        intr_enable = intr_enable | PRSN_DETECT_ENABLE;
@@ -1446,27 +1448,27 @@ int pcie_init(struct controller * ctrl,
        dbg("%s: temp_word %x\n", __FUNCTION__, temp_word);
 
        /* Unmask Hot-plug Interrupt Enable for the interrupt notification mechanism case */
-       rc = hp_register_write_word(pdev, SLOT_CTRL, temp_word);
+       rc = hp_register_write_word(pdev, SLOT_CTRL(ctrl->cap_base), temp_word);
        if (rc) {
                err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
        dbg("%s : Unmask HPIE hp_register_write_word SLOT_CTRL with %x\n", __FUNCTION__, temp_word);
-       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+       rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), slot_status);
        if (rc) {
                err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
        dbg("%s: Unmask HPIE SLOT_STATUS offset %x reads slot_status %x\n", __FUNCTION__, 
-               SLOT_STATUS, slot_status);
+               SLOT_STATUS(ctrl->cap_base), slot_status);
        
        temp_word =  0x1F; /* Clear all events */
-       rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS, temp_word);
+       rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), temp_word);
        if (rc) {
                err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s: SLOT_STATUS offset %x writes slot_status %x\n", __FUNCTION__, SLOT_STATUS, temp_word);
+       dbg("%s: SLOT_STATUS offset %x writes slot_status %x\n", __FUNCTION__, SLOT_STATUS(ctrl->cap_base), temp_word);
        
        /*  Add this HPC instance into the HPC list */
        spin_lock(&list_lock);
index 3285b822478da67bed4fe5672ae44a5939bc0e4e..752e6513c447dce6ab3f5882a075e0f66eaf9dca 100644 (file)
@@ -48,7 +48,7 @@ dlpar_attr_store(struct kobject * kobj, struct attribute * attr,
        struct dlpar_io_attr *dlpar_attr = container_of(attr,
                                                struct dlpar_io_attr, attr);
        return dlpar_attr->store ?
-               dlpar_attr->store(dlpar_attr, buf, nbytes) : 0;
+               dlpar_attr->store(dlpar_attr, buf, nbytes) : -EIO;
 }
 
 static struct sysfs_ops dlpar_attr_sysfs_ops = {
index f0c53f850aedb12b2c7be0eeaeb5b39146b12eff..a70a5c5705f2dee83f0da960c3a836269735e43d 100644 (file)
@@ -95,7 +95,7 @@ static struct hotplug_slot_ops shpchp_hotplug_slot_ops = {
  */
 static void release_slot(struct hotplug_slot *hotplug_slot)
 {
-       struct slot *slot = (struct slot *)hotplug_slot->private;
+       struct slot *slot = hotplug_slot->private;
 
        dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
 
index 9f90eb8e6ecd8302812dd90d5da19c8fffaf17cc..490a9553a0625175d7ba02783988f6915fbc57b7 100644 (file)
@@ -1885,7 +1885,7 @@ int shpchp_enable_slot (struct slot *p_slot)
        func = shpchp_slot_find(p_slot->bus, p_slot->device, 0);
        if (!func) {
                dbg("%s: Error! slot NULL\n", __FUNCTION__);
-               return 1;
+               return -ENODEV;
        }
 
        /* Check to see if (latch closed, card present, power off) */
@@ -1894,19 +1894,19 @@ int shpchp_enable_slot (struct slot *p_slot)
        if (rc || !getstatus) {
                info("%s: no adapter on slot(%x)\n", __FUNCTION__, p_slot->number);
                up(&p_slot->ctrl->crit_sect);
-               return 1;
+               return -ENODEV;
        }
        rc = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
        if (rc || getstatus) {
                info("%s: latch open on slot(%x)\n", __FUNCTION__, p_slot->number);
                up(&p_slot->ctrl->crit_sect);
-               return 1;
+               return -ENODEV;
        }
        rc = p_slot->hpc_ops->get_power_status(p_slot, &getstatus);
        if (rc || getstatus) {
                info("%s: already enabled on slot(%x)\n", __FUNCTION__, p_slot->number);
                up(&p_slot->ctrl->crit_sect);
-               return 1;
+               return -ENODEV;
        }
        up(&p_slot->ctrl->crit_sect);
 
@@ -1914,7 +1914,7 @@ int shpchp_enable_slot (struct slot *p_slot)
 
        func = shpchp_slot_create(p_slot->bus);
        if (func == NULL)
-               return 1;
+               return -ENOMEM;
 
        func->bus = p_slot->bus;
        func->device = p_slot->device;
@@ -1939,7 +1939,7 @@ int shpchp_enable_slot (struct slot *p_slot)
                /* Setup slot structure with entry for empty slot */
                func = shpchp_slot_create(p_slot->bus);
                if (func == NULL)
-                       return (1);     /* Out of memory */
+                       return -ENOMEM; /* Out of memory */
 
                func->bus = p_slot->bus;
                func->device = p_slot->device;
@@ -1972,7 +1972,7 @@ int shpchp_disable_slot (struct slot *p_slot)
        struct pci_func *func;
 
        if (!p_slot->ctrl)
-               return 1;
+               return -ENODEV;
 
        pci_bus = p_slot->ctrl->pci_dev->subordinate;
 
@@ -1983,19 +1983,19 @@ int shpchp_disable_slot (struct slot *p_slot)
        if (ret || !getstatus) {
                info("%s: no adapter on slot(%x)\n", __FUNCTION__, p_slot->number);
                up(&p_slot->ctrl->crit_sect);
-               return 1;
+               return -ENODEV;
        }
        ret = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
        if (ret || getstatus) {
                info("%s: latch open on slot(%x)\n", __FUNCTION__, p_slot->number);
                up(&p_slot->ctrl->crit_sect);
-               return 1;
+               return -ENODEV;
        }
        ret = p_slot->hpc_ops->get_power_status(p_slot, &getstatus);
        if (ret || !getstatus) {
                info("%s: already disabled slot(%x)\n", __FUNCTION__, p_slot->number);
                up(&p_slot->ctrl->crit_sect);
-               return 1;
+               return -ENODEV;
        }
        up(&p_slot->ctrl->crit_sect);
 
@@ -2011,7 +2011,7 @@ int shpchp_disable_slot (struct slot *p_slot)
                /* Check the Class Code */
                rc = pci_bus_read_config_byte (pci_bus, devfn, 0x0B, &class_code);
                if (rc)
-                       return rc;
+                       return -ENODEV;
 
                if (class_code == PCI_BASE_CLASS_DISPLAY) {
                        /* Display/Video adapter (not supported) */
@@ -2020,13 +2020,13 @@ int shpchp_disable_slot (struct slot *p_slot)
                        /* See if it's a bridge */
                        rc = pci_bus_read_config_byte (pci_bus, devfn, PCI_HEADER_TYPE, &header_type);
                        if (rc)
-                               return rc;
+                               return -ENODEV;
 
                        /* If it's a bridge, check the VGA Enable bit */
                        if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
                                rc = pci_bus_read_config_byte (pci_bus, devfn, PCI_BRIDGE_CONTROL, &BCR);
                                if (rc)
-                                       return rc;
+                                       return -ENODEV;
 
                                /* If the VGA Enable bit is set, remove isn't supported */
                                if (BCR & PCI_BRIDGE_CTL_VGA) {
@@ -2042,12 +2042,12 @@ int shpchp_disable_slot (struct slot *p_slot)
        if ((func != NULL) && !rc) {
                rc = remove_board(func, p_slot->ctrl);
        } else if (!rc)
-               rc = 1;
+               rc = -ENODEV;
 
        if (p_slot)
                update_slot_info(p_slot);
 
-       return(rc);
+       return rc;
 }
 
 
index 9a1ee132d12cb47115b68fc310b95193be9bb74d..c9445ebda5c7e5cf4a2edd6dcbeda5ca9122f537 100644 (file)
@@ -38,7 +38,7 @@
 
 /* A few routines that create sysfs entries for the hot plug controller */
 
-static ssize_t show_ctrl (struct device *dev, char *buf)
+static ssize_t show_ctrl (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pci_dev *pci_dev;
        struct controller *ctrl;
@@ -82,7 +82,7 @@ static ssize_t show_ctrl (struct device *dev, char *buf)
 }
 static DEVICE_ATTR (ctrl, S_IRUGO, show_ctrl, NULL);
 
-static ssize_t show_dev (struct device *dev, char *buf)
+static ssize_t show_dev (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pci_dev *pci_dev;
        struct controller *ctrl;
index 243a51d88b86844d75a7f2e84c7e3522c837a066..7957cdc72cd0464869096ffe9b59298953fdc539 100644 (file)
@@ -1626,7 +1626,7 @@ int shpchprm_set_hpp(
        pci_bus->number = func->bus;
        devfn = PCI_DEVFN(func->device, func->function);
 
-       ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->bus);
+       ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->slot_bus);
 
        if (ab) {
                if (ab->_hpp) {
@@ -1681,7 +1681,7 @@ void shpchprm_enable_card(
                | PCI_COMMAND_IO | PCI_COMMAND_MEMORY;
        bcmd = bcommand  = bcommand | PCI_BRIDGE_CTL_NO_ISA;
 
-       ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->bus);
+       ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->slot_bus);
        if (ab) {
                if (ab->_hpp) {
                        if (ab->_hpp->enable_perr) {
index fe98553c978f335dae47646cee5df32c8f69b42e..e65bf2b395aab8f12ec033e9e33c53978942961b 100644 (file)
@@ -335,13 +335,14 @@ pci_driver_attr_show(struct kobject * kobj, struct attribute *attr, char *buf)
 {
        struct device_driver *driver = kobj_to_pci_driver(kobj);
        struct driver_attribute *dattr = attr_to_driver_attribute(attr);
-       ssize_t ret = 0;
+       ssize_t ret;
 
-       if (get_driver(driver)) {
-               if (dattr->show)
-                       ret = dattr->show(driver, buf);
-               put_driver(driver);
-       }
+       if (!get_driver(driver))
+               return -ENODEV;
+
+       ret = dattr->show ? dattr->show(driver, buf) : -EIO;
+
+       put_driver(driver);
        return ret;
 }
 
@@ -351,13 +352,14 @@ pci_driver_attr_store(struct kobject * kobj, struct attribute *attr,
 {
        struct device_driver *driver = kobj_to_pci_driver(kobj);
        struct driver_attribute *dattr = attr_to_driver_attribute(attr);
-       ssize_t ret = 0;
+       ssize_t ret;
 
-       if (get_driver(driver)) {
-               if (dattr->store)
-                       ret = dattr->store(driver, buf, count);
-               put_driver(driver);
-       }
+       if (!get_driver(driver))
+               return -ENODEV;
+
+       ret = dattr->store ? dattr->store(driver, buf, count) : -EIO;
+
+       put_driver(driver);
        return ret;
 }
 
@@ -393,7 +395,10 @@ int pci_register_driver(struct pci_driver *drv)
        drv->driver.bus = &pci_bus_type;
        drv->driver.probe = pci_device_probe;
        drv->driver.remove = pci_device_remove;
-       drv->driver.shutdown = pci_device_shutdown,
+       /* FIXME, once all of the existing PCI drivers have been fixed to set
+        * the pci shutdown function, this test can go away. */
+       if (!drv->driver.shutdown)
+               drv->driver.shutdown = pci_device_shutdown;
        drv->driver.owner = drv->owner;
        drv->driver.kobj.ktype = &pci_driver_kobj_type;
        pci_init_dynids(&drv->dynids);
index 8568b207f18927f4d4cc23006ff2edf07dc932be..a15f94072a6f554a4e43b70db5c24d7e1b64240a 100644 (file)
@@ -29,7 +29,7 @@ static int sysfs_initialized; /* = 0 */
 /* show configuration fields */
 #define pci_config_attr(field, format_string)                          \
 static ssize_t                                                         \
-field##_show(struct device *dev, char *buf)                            \
+field##_show(struct device *dev, struct device_attribute *attr, char *buf)                             \
 {                                                                      \
        struct pci_dev *pdev;                                           \
                                                                        \
@@ -44,7 +44,7 @@ pci_config_attr(subsystem_device, "0x%04x\n");
 pci_config_attr(class, "0x%06x\n");
 pci_config_attr(irq, "%u\n");
 
-static ssize_t local_cpus_show(struct device *dev, char *buf)
+static ssize_t local_cpus_show(struct device *dev, struct device_attribute *attr, char *buf)
 {              
        cpumask_t mask = pcibus_to_cpumask(to_pci_dev(dev)->bus);
        int len = cpumask_scnprintf(buf, PAGE_SIZE-2, mask);
@@ -54,7 +54,7 @@ static ssize_t local_cpus_show(struct device *dev, char *buf)
 
 /* show resources */
 static ssize_t
-resource_show(struct device * dev, char * buf)
+resource_show(struct device * dev, struct device_attribute *attr, char * buf)
 {
        struct pci_dev * pci_dev = to_pci_dev(dev);
        char * str = buf;
@@ -73,6 +73,17 @@ resource_show(struct device * dev, char * buf)
        return (str - buf);
 }
 
+static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+
+       return sprintf(buf, "pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02x\n",
+                      pci_dev->vendor, pci_dev->device,
+                      pci_dev->subsystem_vendor, pci_dev->subsystem_device,
+                      (u8)(pci_dev->class >> 16), (u8)(pci_dev->class >> 8),
+                      (u8)(pci_dev->class));
+}
+
 struct device_attribute pci_dev_attrs[] = {
        __ATTR_RO(resource),
        __ATTR_RO(vendor),
@@ -82,6 +93,7 @@ struct device_attribute pci_dev_attrs[] = {
        __ATTR_RO(class),
        __ATTR_RO(irq),
        __ATTR_RO(local_cpus),
+       __ATTR_RO(modalias),
        __ATTR_NULL,
 };
 
@@ -327,16 +339,17 @@ pci_create_resource_files(struct pci_dev *pdev)
                if (!pci_resource_len(pdev, i))
                        continue;
 
-               res_attr = kmalloc(sizeof(*res_attr) + 10, GFP_ATOMIC);
+               /* allocate attribute structure, piggyback attribute name */
+               res_attr = kcalloc(1, sizeof(*res_attr) + 10, GFP_ATOMIC);
                if (res_attr) {
-                       memset(res_attr, 0, sizeof(*res_attr) + 10);
+                       char *res_attr_name = (char *)(res_attr + 1);
+
                        pdev->res_attr[i] = res_attr;
-                       /* Allocated above after the res_attr struct */
-                       res_attr->attr.name = (char *)(res_attr + 1);
-                       sprintf(res_attr->attr.name, "resource%d", i);
-                       res_attr->size = pci_resource_len(pdev, i);
+                       sprintf(res_attr_name, "resource%d", i);
+                       res_attr->attr.name = res_attr_name;
                        res_attr->attr.mode = S_IRUSR | S_IWUSR;
                        res_attr->attr.owner = THIS_MODULE;
+                       res_attr->size = pci_resource_len(pdev, i);
                        res_attr->mmap = pci_mmap_resource;
                        res_attr->private = &pdev->resource[i];
                        sysfs_create_bin_file(&pdev->dev.kobj, res_attr);
index 79cdc16c52c826b7a1633de4dfb634c6f9f3b8f3..744da0d4ae5f90614a1f719299d23e23854c749e 100644 (file)
@@ -32,33 +32,6 @@ extern unsigned char pci_max_busnr(void);
 extern unsigned char pci_bus_max_busnr(struct pci_bus *bus);
 extern int pci_bus_find_capability (struct pci_bus *bus, unsigned int devfn, int cap);
 
-struct pci_dev_wrapped {
-       struct pci_dev  *dev;
-       void            *data;
-};
-
-struct pci_bus_wrapped {
-       struct pci_bus  *bus;
-       void            *data;
-};
-
-struct pci_visit {
-       int (* pre_visit_pci_bus)       (struct pci_bus_wrapped *,
-                                        struct pci_dev_wrapped *);
-       int (* post_visit_pci_bus)      (struct pci_bus_wrapped *,
-                                        struct pci_dev_wrapped *);
-
-       int (* pre_visit_pci_dev)       (struct pci_dev_wrapped *,
-                                        struct pci_bus_wrapped *);
-       int (* visit_pci_dev)           (struct pci_dev_wrapped *,
-                                        struct pci_bus_wrapped *);
-       int (* post_visit_pci_dev)      (struct pci_dev_wrapped *,
-                                        struct pci_bus_wrapped *);
-};
-
-extern int pci_visit_dev(struct pci_visit *fn,
-                        struct pci_dev_wrapped *wrapped_dev,
-                        struct pci_bus_wrapped *wrapped_parent);
 extern void pci_remove_legacy_files(struct pci_bus *bus);
 
 /* Lock for read/write access to pci device and bus lists */
index 93481b41b613e33b75f1b494074372c80fe299cd..1d2ef1e2ffc6178398c2347b3b4295fee763dda1 100644 (file)
        080f  Sentry5 DDR/SDR RAM Controller
        0811  Sentry5 External Interface Core
        0816  BCM3302 Sentry5 MIPS32 CPU
+       1600  NetXtreme BCM5752 Gigabit Ethernet PCI Express
        1644  NetXtreme BCM5700 Gigabit Ethernet
                1014 0277  Broadcom Vigil B5700 1000Base-T
                1028 00d1  Broadcom BCM5700
index 4037a3e568de9d97043a946e6eb936f914de27cb..3e84b501e6a419ea2b7e28452983c36a8a127bff 100644 (file)
@@ -39,7 +39,8 @@ static int pcie_port_bus_match(struct device *dev, struct device_driver *drv)
                driver->id_table->vendor != pciedev->id.vendor) ||
               (driver->id_table->device != PCI_ANY_ID &&
                driver->id_table->device != pciedev->id.device) ||      
-               driver->id_table->port_type != pciedev->id.port_type ||
+              (driver->id_table->port_type != PCIE_ANY_PORT &&
+               driver->id_table->port_type != pciedev->id.port_type) ||
                driver->id_table->service_type != pciedev->id.service_type )
                return 0;
 
index 576285765e98cab75dab2fcc2d0ffbc1d9ff7897..f5c5f10a3d2f8da02de92b45f18eba599014e244 100644 (file)
@@ -232,19 +232,16 @@ static void pcie_device_init(struct pci_dev *parent, struct pcie_device *dev,
        /* Initialize generic device interface */
        device = &dev->device;
        memset(device, 0, sizeof(struct device));
-       INIT_LIST_HEAD(&device->node);
-       INIT_LIST_HEAD(&device->children);
-       INIT_LIST_HEAD(&device->bus_list);
        device->bus = &pcie_port_bus_type;
        device->driver = NULL;
-       device->driver_data = NULL; 
+       device->driver_data = NULL;
        device->release = release_pcie_device;  /* callback to free pcie dev */
-       sprintf(&device->bus_id[0], "pcie%02x", 
+       sprintf(&device->bus_id[0], "pcie%02x",
                get_descriptor_id(port_type, service_type));
        device->parent = &parent->dev;
 }
 
-static struct pcie_device* alloc_pcie_device(struct pci_dev *parent, 
+static struct pcie_device* alloc_pcie_device(struct pci_dev *parent,
        int port_type, int service_type, int irq, int irq_mode)
 {
        struct pcie_device *device;
@@ -270,9 +267,9 @@ int pcie_port_device_probe(struct pci_dev *dev)
        pci_read_config_word(dev, pos + PCIE_CAPABILITIES_REG, &reg);
        type = (reg >> 4) & PORT_TYPE_MASK;
        if (    type == PCIE_RC_PORT || type == PCIE_SW_UPSTREAM_PORT ||
-               type == PCIE_SW_DOWNSTREAM_PORT )  
+               type == PCIE_SW_DOWNSTREAM_PORT )
                return 0;
+
        return -ENODEV;
 }
 
@@ -283,8 +280,8 @@ int pcie_port_device_register(struct pci_dev *dev)
        u16 reg16;
 
        /* Get port type */
-       pci_read_config_word(dev, 
-               pci_find_capability(dev, PCI_CAP_ID_EXP) + 
+       pci_read_config_word(dev,
+               pci_find_capability(dev, PCI_CAP_ID_EXP) +
                PCIE_CAPABILITIES_REG, &reg16);
        type = (reg16 >> 4) & PORT_TYPE_MASK;
 
@@ -299,11 +296,11 @@ int pcie_port_device_register(struct pci_dev *dev)
                if (capabilities & (1 << i)) {
                        child = alloc_pcie_device(
                                dev,            /* parent */
-                               type,           /* port type */ 
+                               type,           /* port type */
                                i,              /* service type */
                                vectors[i],     /* irq */
                                irq_mode        /* interrupt mode */);
-                       if (child) { 
+                       if (child) {
                                status = device_register(&child->device);
                                if (status) {
                                        kfree(child);
@@ -317,84 +314,78 @@ int pcie_port_device_register(struct pci_dev *dev)
 }
 
 #ifdef CONFIG_PM
-int pcie_port_device_suspend(struct pci_dev *dev, pm_message_t state)
+static int suspend_iter(struct device *dev, void *data)
 {
-       struct list_head                *head, *tmp;
-       struct device                   *parent, *child;
-       struct device_driver            *driver;
        struct pcie_port_service_driver *service_driver;
+       u32 state = (u32)data;
+
+       if ((dev->bus == &pcie_port_bus_type) &&
+           (dev->driver)) {
+               service_driver = to_service_driver(dev->driver);
+               if (service_driver->suspend)
+                       service_driver->suspend(to_pcie_device(dev), state);
+       }
+       return 0;
+}
 
-       parent = &dev->dev;
-       head = &parent->children;
-       tmp = head->next;
-       while (head != tmp) {
-               child = container_of(tmp, struct device, node);
-               tmp = tmp->next;
-               if (child->bus != &pcie_port_bus_type)
-                       continue;
-               driver = child->driver;
-               if (!driver)
-                       continue;
-               service_driver = to_service_driver(driver);
-               if (service_driver->suspend)  
-                       service_driver->suspend(to_pcie_device(child), state);
-       }
-       return 0; 
+int pcie_port_device_suspend(struct pci_dev *dev, u32 state)
+{
+       device_for_each_child(&dev->dev, (void *)state, suspend_iter);
+       return 0;
 }
 
-int pcie_port_device_resume(struct pci_dev *dev) 
-{ 
-       struct list_head                *head, *tmp;
-       struct device                   *parent, *child;
-       struct device_driver            *driver;
+static int resume_iter(struct device *dev, void *data)
+{
        struct pcie_port_service_driver *service_driver;
 
-       parent = &dev->dev;
-       head = &parent->children;
-       tmp = head->next;
-       while (head != tmp) {
-               child = container_of(tmp, struct device, node);
-               tmp = tmp->next;
-               if (child->bus != &pcie_port_bus_type)
-                       continue;
-               driver = child->driver;
-               if (!driver)
-                       continue;
-               service_driver = to_service_driver(driver);
-               if (service_driver->resume)  
-                       service_driver->resume(to_pcie_device(child));
+       if ((dev->bus == &pcie_port_bus_type) &&
+           (dev->driver)) {
+               service_driver = to_service_driver(dev->driver);
+               if (service_driver->resume)
+                       service_driver->resume(to_pcie_device(dev));
        }
-       return 0; 
+       return 0;
+}
 
+int pcie_port_device_resume(struct pci_dev *dev)
+{
+       device_for_each_child(&dev->dev, NULL, resume_iter);
+       return 0;
 }
 #endif
 
-void pcie_port_device_remove(struct pci_dev *dev)
+static int remove_iter(struct device *dev, void *data)
 {
-       struct list_head                *head, *tmp;
-       struct device                   *parent, *child;
-       struct device_driver            *driver;
        struct pcie_port_service_driver *service_driver;
-       int interrupt_mode = PCIE_PORT_INTx_MODE;
 
-       parent = &dev->dev;
-       head = &parent->children;
-       tmp = head->next;
-       while (head != tmp) {
-               child = container_of(tmp, struct device, node);
-               tmp = tmp->next;
-               if (child->bus != &pcie_port_bus_type)
-                       continue;
-               driver = child->driver;
-               if (driver) { 
-                       service_driver = to_service_driver(driver);
-                       if (service_driver->remove)  
-                               service_driver->remove(to_pcie_device(child));
+       if (dev->bus == &pcie_port_bus_type) {
+               if (dev->driver) {
+                       service_driver = to_service_driver(dev->driver);
+                       if (service_driver->remove)
+                               service_driver->remove(to_pcie_device(dev));
                }
-               interrupt_mode = (to_pcie_device(child))->interrupt_mode;
-               put_device(child);
-               device_unregister(child);
+               *(unsigned long*)data = (unsigned long)dev;
+               return 1;
        }
+       return 0;
+}
+
+void pcie_port_device_remove(struct pci_dev *dev)
+{
+       struct device *device;
+       unsigned long device_addr;
+       int interrupt_mode = PCIE_PORT_INTx_MODE;
+       int status;
+
+       do {
+               status = device_for_each_child(&dev->dev, &device_addr, remove_iter);
+               if (status) {
+                       device = (struct device*)device_addr;
+                       interrupt_mode = (to_pcie_device(device))->interrupt_mode;
+                       put_device(device);
+                       device_unregister(device);
+               }
+       } while (status);
        /* Switch to INTx by default if MSI enabled */
        if (interrupt_mode == PCIE_PORT_MSIX_MODE)
                pci_disable_msix(dev);
@@ -423,7 +414,7 @@ int pcie_port_service_register(struct pcie_port_service_driver *new)
        new->driver.resume = pcie_port_resume_service;
 
        return driver_register(&new->driver);
-} 
+}
 
 void pcie_port_service_unregister(struct pcie_port_service_driver *new)
 {
index b7ae87823c69777f772717947b6911ffdeac6b2b..fd48b201eb53ac18e443519c17046ba7b68bb94c 100644 (file)
@@ -125,7 +125,7 @@ static inline unsigned int pci_calc_resource_flags(unsigned int flags)
 /*
  * Find the extent of a PCI decode..
  */
-static u32 pci_size(u32 base, u32 maxbase, unsigned long mask)
+static u32 pci_size(u32 base, u32 maxbase, u32 mask)
 {
        u32 size = mask & maxbase;      /* Find the significant bits */
        if (!size)
index 026aa04669a29467559af822be1ad69d06f61ef0..968033fd29f0bfc287a23399e5d6f9e2d8776f82 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <linux/delay.h>
+#include <linux/acpi.h>
 #include "pci.h"
 
 /* Deal with broken BIOS'es that neglect to enable passive release,
@@ -455,23 +456,15 @@ static void __init quirk_amd_8131_ioapic(struct pci_dev *dev)
 } 
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_APIC,         quirk_amd_8131_ioapic ); 
 
+static void __init quirk_svw_msi(struct pci_dev *dev)
+{
+       pci_msi_quirk = 1;
+       printk(KERN_WARNING "PCI: MSI quirk detected. pci_msi_quirk set.\n");
+}
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_svw_msi );
 #endif /* CONFIG_X86_IO_APIC */
 
 
-/*
- * Via 686A/B:  The PCI_INTERRUPT_LINE register for the on-chip
- * devices, USB0/1, AC97, MC97, and ACPI, has an unusual feature:
- * when written, it makes an internal connection to the PIC.
- * For these devices, this register is defined to be 4 bits wide.
- * Normally this is fine.  However for IO-APIC motherboards, or
- * non-x86 architectures (yes Via exists on PPC among other places),
- * we must mask the PCI_INTERRUPT_LINE value versus 0xf to get
- * interrupts delivered properly.
- *
- * TODO: When we have device-specific interrupt routers,
- * quirk_via_irqpic will go away from quirks.
- */
-
 /*
  * FIXME: it is questionable that quirk_via_acpi
  * is needed.  It shows up as an ISA bridge, and does not
@@ -494,6 +487,31 @@ static void __devinit quirk_via_acpi(struct pci_dev *d)
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,    PCI_DEVICE_ID_VIA_82C586_3,     quirk_via_acpi );
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,    PCI_DEVICE_ID_VIA_82C686_4,     quirk_via_acpi );
 
+/*
+ * Via 686A/B:  The PCI_INTERRUPT_LINE register for the on-chip
+ * devices, USB0/1, AC97, MC97, and ACPI, has an unusual feature:
+ * when written, it makes an internal connection to the PIC.
+ * For these devices, this register is defined to be 4 bits wide.
+ * Normally this is fine.  However for IO-APIC motherboards, or
+ * non-x86 architectures (yes Via exists on PPC among other places),
+ * we must mask the PCI_INTERRUPT_LINE value versus 0xf to get
+ * interrupts delivered properly.
+ */
+static void quirk_via_irq(struct pci_dev *dev)
+{
+       u8 irq, new_irq;
+
+       new_irq = dev->irq & 0xf;
+       pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
+       if (new_irq != irq) {
+               printk(KERN_INFO "PCI: Via IRQ fixup for %s, from %d to %d\n",
+                       pci_name(dev), irq, new_irq);
+               udelay(15);     /* unknown if delay really needed */
+               pci_write_config_byte(dev, PCI_INTERRUPT_LINE, new_irq);
+       }
+}
+DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_ANY_ID, quirk_via_irq);
+
 /*
  * PIIX3 USB: We have to disable USB interrupts that are
  * hardwired to PIRQD# and may be shared with an
@@ -683,19 +701,6 @@ static void __init quirk_disable_pxb(struct pci_dev *pdev)
 }
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82454NX,    quirk_disable_pxb );
 
-/*
- *     VIA northbridges care about PCI_INTERRUPT_LINE
- */
-int via_interrupt_line_quirk;
-
-static void __devinit quirk_via_bridge(struct pci_dev *pdev)
-{
-       if(pdev->devfn == 0) {
-               printk(KERN_INFO "PCI: Via IRQ fixup\n");
-               via_interrupt_line_quirk = 1;
-       }
-}
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,    PCI_ANY_ID,                     quirk_via_bridge );
 
 /*
  *     Serverworks CSB5 IDE does not fully support native mode
index 6375ebc85020556df3d837e3077c3df47a19b8c4..14e4124e15231f777cc9602db8a9f9289b50adba 100644 (file)
@@ -171,19 +171,21 @@ config PCMCIA_PROBE
 config M32R_PCC
        bool "M32R PCMCIA I/F"
        depends on M32R && CHIP_M32700 && PCMCIA
+       select PCCARD_NONSTATIC
        help
          Say Y here to use the M32R PCMCIA controller.
 
 config M32R_CFC
        bool "M32R CF I/F Controller"
-       depends on M32R && (PLAT_USRV || PLAT_M32700UT || PLAT_MAPPI2 || PLAT_OPSPUT)
+       depends on M32R && (PLAT_USRV || PLAT_M32700UT || PLAT_MAPPI2 || PLAT_MAPPI3 || PLAT_OPSPUT)
+       select PCCARD_NONSTATIC
        help
          Say Y here to use the M32R CompactFlash controller.
 
 config M32R_CFC_NUM
        int "M32R CF I/F number"
        depends on M32R_CFC
-       default "1" if PLAT_USRV || PLAT_M32700UT || PLAT_MAPPI2 || PLAT_OPSPUT
+       default "1" if PLAT_USRV || PLAT_M32700UT || PLAT_MAPPI2 || PLAT_MAPPI3 || PLAT_OPSPUT
        help
          Set the number of M32R CF slots.
 
index 66150d08b5c7c6d470c83a723559504b9b40dc70..569e55feecfd682c5563b594ac92d456717053f5 100644 (file)
@@ -604,14 +604,14 @@ static int pcmcia_bus_match(struct device * dev, struct device_driver * drv) {
 /************************ per-device sysfs output ***************************/
 
 #define pcmcia_device_attr(field, test, format)                                \
-static ssize_t field##_show (struct device *dev, char *buf)            \
+static ssize_t field##_show (struct device *dev, struct device_attribute *attr, char *buf)             \
 {                                                                      \
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);               \
        return p_dev->test ? sprintf (buf, format, p_dev->field) : -ENODEV; \
 }
 
 #define pcmcia_device_stringattr(name, field)                                  \
-static ssize_t name##_show (struct device *dev, char *buf)             \
+static ssize_t name##_show (struct device *dev, struct device_attribute *attr, char *buf)              \
 {                                                                      \
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);               \
        return p_dev->field ? sprintf (buf, "%s\n", p_dev->field) : -ENODEV; \
@@ -1592,9 +1592,9 @@ static int __init init_pcmcia_bus(void)
 
        /* Set up character device for user mode clients */
        i = register_chrdev(0, "pcmcia", &ds_fops);
-       if (i == -EBUSY)
+       if (i < 0)
                printk(KERN_NOTICE "unable to find a free device # for "
-                      "Driver Services\n");
+                      "Driver Services (error=%d)\n", i);
        else
                major_dev = i;
 
index 581bfa95429e1c1a4f1092777e84a63a3395e80d..b1111c6bf062a55d726b7be28eb79af41eafe8f5 100644 (file)
@@ -24,9 +24,9 @@
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
 #include <linux/device.h>
+#include <linux/bitops.h>
 #include <asm/irq.h>
 #include <asm/io.h>
-#include <asm/bitops.h>
 #include <asm/system.h>
 
 #include <pcmcia/version.h>
@@ -444,7 +444,7 @@ static int _pcc_get_status(u_short sock, u_int *value)
                debug(3, "m32r_cfc: _pcc_get_status: "
                         "power off (CPCR=0x%08x)\n", status);
        }
-#elif defined(CONFIG_PLAT_MAPPI2)
+#elif defined(CONFIG_PLAT_MAPPI2) || defined(CONFIG_PLAT_MAPPI3)
        if ( status ) {
                status = pcc_get(sock, (unsigned int)PLD_CPCR);
                if (status == 0) { /* power off */
@@ -452,18 +452,23 @@ static int _pcc_get_status(u_short sock, u_int *value)
                        pcc_set(sock, (unsigned int)PLD_CFBUFCR,0); /* force buffer off for ZA-36 */
                        udelay(50);
                }
-               status = pcc_get(sock, (unsigned int)PLD_CFBUFCR);
-               if (status != 0) { /* buffer off */
-                       pcc_set(sock, (unsigned int)PLD_CFBUFCR,0);
-                       udelay(50);
-                       pcc_set(sock, (unsigned int)PLD_CFRSTCR, 0x0101);
-                       udelay(25); /* for IDE reset */
-                       pcc_set(sock, (unsigned int)PLD_CFRSTCR, 0x0100);
-                       mdelay(2);  /* for IDE reset */
-               } else {
-                       *value |= SS_POWERON;
-                       *value |= SS_READY;
-               }
+               *value |= SS_POWERON;
+
+               pcc_set(sock, (unsigned int)PLD_CFBUFCR,0);
+               udelay(50);
+               pcc_set(sock, (unsigned int)PLD_CFRSTCR, 0x0101);
+               udelay(25); /* for IDE reset */
+               pcc_set(sock, (unsigned int)PLD_CFRSTCR, 0x0100);
+               mdelay(2);  /* for IDE reset */
+
+               *value |= SS_READY;
+               *value |= SS_3VCARD;
+       } else {
+               /* disable CF power */
+               pcc_set(sock, (unsigned int)PLD_CPCR, 0);
+               udelay(100);
+               debug(3, "m32r_cfc: _pcc_get_status: "
+                        "power off (CPCR=0x%08x)\n", status);
        }
 #else
 #error no platform configuration
@@ -479,14 +484,13 @@ static int _pcc_get_socket(u_short sock, socket_state_t *state)
 {
 //     pcc_socket_t *t = &socket[sock];
 
-#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_USRV) || defined(CONFIG_PLAT_OPSPUT)
        state->flags = 0;
        state->csc_mask = SS_DETECT;
        state->csc_mask |= SS_READY;
        state->io_irq = 0;
        state->Vcc = 33;        /* 3.3V fixed */
        state->Vpp = 33;
-#endif
+
        debug(3, "m32r_cfc: GetSocket(%d) = flags %#3.3x, Vcc %d, Vpp %d, "
                  "io_irq %d, csc_mask %#2.2x\n", sock, state->flags,
                  state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
@@ -497,32 +501,17 @@ static int _pcc_get_socket(u_short sock, socket_state_t *state)
 
 static int _pcc_set_socket(u_short sock, socket_state_t *state)
 {
-#if defined(CONFIG_PLAT_MAPPI2)
-       u_long reg = 0;
-#endif
        debug(3, "m32r_cfc: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
                  "io_irq %d, csc_mask %#2.2x)\n", sock, state->flags,
                  state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
 
-#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_USRV) || defined(CONFIG_PLAT_OPSPUT)
+#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_USRV) || defined(CONFIG_PLAT_OPSPUT) || defined(CONFIG_PLAT_MAPPI2) || defined(CONFIG_PLAT_MAPPI3)
        if (state->Vcc) {
                if ((state->Vcc != 50) && (state->Vcc != 33))
                        return -EINVAL;
                /* accept 5V and 3.3V */
        }
-#elif defined(CONFIG_PLAT_MAPPI2)
-       if (state->Vcc) {
-               /*
-                * 5V only
-                */
-               if (state->Vcc == 50) {
-                       reg |= PCCSIGCR_VEN;
-               } else {
-                       return -EINVAL;
-               }
-       }
 #endif
-
        if (state->flags & SS_RESET) {
                debug(3, ":RESET\n");
                pcc_set(sock,(unsigned int)PLD_CFRSTCR,0x101);
@@ -788,7 +777,7 @@ static int __init init_m32r_pcc(void)
                return ret;
        }
 
-#if defined(CONFIG_PLAT_MAPPI2)
+#if defined(CONFIG_PLAT_MAPPI2) || defined(CONFIG_PLAT_MAPPI3)
        pcc_set(0, (unsigned int)PLD_CFCR0, 0x0f0f);
        pcc_set(0, (unsigned int)PLD_CFCR1, 0x0200);
 #endif
@@ -825,7 +814,7 @@ static int __init init_m32r_pcc(void)
        for (i = 0 ; i < pcc_sockets ; i++) {
                socket[i].socket.dev.dev = &pcc_device.dev;
                socket[i].socket.ops = &pcc_operations;
-               socket[i].socket.resource_ops = &pccard_static_ops;
+               socket[i].socket.resource_ops = &pccard_nonstatic_ops;
                socket[i].socket.owner = THIS_MODULE;
                socket[i].number = i;
                ret = pcmcia_register_socket(&socket[i].socket);
index 17c1db7ae15589e446f607b25a444205c2569d49..8146e3bee2e8f1dab1784cae0e52f935268d3928 100644 (file)
 
 #define CFC_IOPORT_BASE                0x1000
 
-#if !defined(CONFIG_PLAT_USRV)
+#if defined(CONFIG_PLAT_MAPPI3)
+#define CFC_ATTR_MAPBASE       0x14014000
+#define CFC_IO_MAPBASE_BYTE    0xb4012000
+#define CFC_IO_MAPBASE_WORD    0xb4002000
+#elif !defined(CONFIG_PLAT_USRV)
 #define CFC_ATTR_MAPBASE        0x0c014000
 #define CFC_IO_MAPBASE_BYTE     0xac012000
 #define CFC_IO_MAPBASE_WORD     0xac002000
-#else  /* CONFIG_PLAT_USRV */
+#else
 #define CFC_ATTR_MAPBASE       0x04014000
 #define CFC_IO_MAPBASE_BYTE    0xa4012000
 #define CFC_IO_MAPBASE_WORD    0xa4002000
index 97eeecfaef1b712682d7a4224682f4463c356050..3252662958d3cf3f2cb66bd562acef0fb9147a86 100644 (file)
@@ -140,7 +140,7 @@ static void pnp_release_card(struct device *dmdev)
 }
 
 
-static ssize_t pnp_show_card_name(struct device *dmdev, char *buf)
+static ssize_t pnp_show_card_name(struct device *dmdev, struct device_attribute *attr, char *buf)
 {
        char *str = buf;
        struct pnp_card *card = to_pnp_card(dmdev);
@@ -150,7 +150,7 @@ static ssize_t pnp_show_card_name(struct device *dmdev, char *buf)
 
 static DEVICE_ATTR(name,S_IRUGO,pnp_show_card_name,NULL);
 
-static ssize_t pnp_show_card_ids(struct device *dmdev, char *buf)
+static ssize_t pnp_show_card_ids(struct device *dmdev, struct device_attribute *attr, char *buf)
 {
        char *str = buf;
        struct pnp_card *card = to_pnp_card(dmdev);
index d64c1ca4fa76db7f77902f94b0baf840c78dc020..1d037c2a82acb0a5bfbd8002ae0274128fb01ee3 100644 (file)
@@ -160,10 +160,16 @@ struct bus_type pnp_bus_type = {
 };
 
 
+static int count_devices(struct device * dev, void * c)
+{
+       int * count = c;
+       (*count)++;
+       return 0;
+}
+
 int pnp_register_driver(struct pnp_driver *drv)
 {
        int count;
-       struct list_head *pos;
 
        pnp_dbg("the driver '%s' has been registered", drv->name);
 
@@ -177,9 +183,7 @@ int pnp_register_driver(struct pnp_driver *drv)
        /* get the number of initial matches */
        if (count >= 0){
                count = 0;
-               list_for_each(pos,&drv->driver.devices){
-                       count++;
-               }
+               driver_for_each_device(&drv->driver, NULL, &count, count_devices);
        }
        return count;
 }
index 53fac8ba5d5cbe0244af96da939d45223d16cc78..a2d8ce7fef9c97bb0149b4e6166e044820119ea2 100644 (file)
@@ -205,7 +205,7 @@ static void pnp_print_option(pnp_info_buffer_t *buffer, char *space,
 }
 
 
-static ssize_t pnp_show_options(struct device *dmdev, char *buf)
+static ssize_t pnp_show_options(struct device *dmdev, struct device_attribute *attr, char *buf)
 {
        struct pnp_dev *dev = to_pnp_dev(dmdev);
        struct pnp_option * independent = dev->independent;
@@ -236,7 +236,7 @@ static ssize_t pnp_show_options(struct device *dmdev, char *buf)
 static DEVICE_ATTR(options,S_IRUGO,pnp_show_options,NULL);
 
 
-static ssize_t pnp_show_current_resources(struct device *dmdev, char *buf)
+static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_attribute *attr, char *buf)
 {
        struct pnp_dev *dev = to_pnp_dev(dmdev);
        int i, ret;
@@ -308,7 +308,7 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, char *buf)
 extern struct semaphore pnp_res_mutex;
 
 static ssize_t
-pnp_set_current_resources(struct device * dmdev, const char * ubuf, size_t count)
+pnp_set_current_resources(struct device * dmdev, struct device_attribute *attr, const char * ubuf, size_t count)
 {
        struct pnp_dev *dev = to_pnp_dev(dmdev);
        char    *buf = (void *)ubuf;
@@ -444,7 +444,7 @@ pnp_set_current_resources(struct device * dmdev, const char * ubuf, size_t count
 static DEVICE_ATTR(resources,S_IRUGO | S_IWUSR,
                   pnp_show_current_resources,pnp_set_current_resources);
 
-static ssize_t pnp_show_current_ids(struct device *dmdev, char *buf)
+static ssize_t pnp_show_current_ids(struct device *dmdev, struct device_attribute *attr, char *buf)
 {
        char *str = buf;
        struct pnp_dev *dev = to_pnp_dev(dmdev);
index 02cfe244e069777219e3ef4450e05634badafcc9..ceeb3cf64a16ccc10aa521c550889fc0cad5edcd 100644 (file)
@@ -7,7 +7,7 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001
  *
- * $Revision: 1.161 $
+ * $Revision: 1.164 $
  */
 
 #include <linux/config.h>
@@ -1766,10 +1766,10 @@ dasd_generic_probe (struct ccw_device *cdev,
                printk(KERN_WARNING
                       "dasd_generic_probe: could not add sysfs entries "
                       "for %s\n", cdev->dev.bus_id);
+       } else {
+               cdev->handler = &dasd_int_handler;
        }
 
-       cdev->handler = &dasd_int_handler;
-
        return ret;
 }
 
@@ -1780,6 +1780,8 @@ dasd_generic_remove (struct ccw_device *cdev)
 {
        struct dasd_device *device;
 
+       cdev->handler = NULL;
+
        dasd_remove_sysfs_files(cdev);
        device = dasd_device_from_cdev(cdev);
        if (IS_ERR(device))
@@ -1810,14 +1812,14 @@ dasd_generic_set_online (struct ccw_device *cdev,
        struct dasd_device *device;
        int feature_diag, rc;
 
-       feature_diag = dasd_get_feature(cdev, DASD_FEATURE_USEDIAG);
-       if (feature_diag < 0)
-               return feature_diag;
-
        device = dasd_create_device(cdev);
        if (IS_ERR(device))
                return PTR_ERR(device);
 
+       feature_diag = dasd_get_feature(cdev, DASD_FEATURE_USEDIAG);
+       if (feature_diag < 0)
+               return feature_diag;
+
        if (feature_diag) {
                if (!dasd_diag_discipline_pointer) {
                        printk (KERN_WARNING
index 1aedc48e5f851685b76e86b9d80b9eb88433d179..d948566bb24a32e211797259d92af82fed6f50b1 100644 (file)
@@ -615,7 +615,7 @@ dasd_device_from_cdev(struct ccw_device *cdev)
  * readonly controls the readonly status of a dasd
  */
 static ssize_t
-dasd_ro_show(struct device *dev, char *buf)
+dasd_ro_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct dasd_devmap *devmap;
        int ro_flag;
@@ -629,7 +629,7 @@ dasd_ro_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-dasd_ro_store(struct device *dev, const char *buf, size_t count)
+dasd_ro_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct dasd_devmap *devmap;
        int ro_flag;
@@ -656,7 +656,7 @@ static DEVICE_ATTR(readonly, 0644, dasd_ro_show, dasd_ro_store);
  * to talk to the device
  */
 static ssize_t 
-dasd_use_diag_show(struct device *dev, char *buf)
+dasd_use_diag_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct dasd_devmap *devmap;
        int use_diag;
@@ -670,7 +670,7 @@ dasd_use_diag_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-dasd_use_diag_store(struct device *dev, const char *buf, size_t count)
+dasd_use_diag_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct dasd_devmap *devmap;
        ssize_t rc;
@@ -698,7 +698,7 @@ static
 DEVICE_ATTR(use_diag, 0644, dasd_use_diag_show, dasd_use_diag_store);
 
 static ssize_t
-dasd_discipline_show(struct device *dev, char *buf)
+dasd_discipline_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct dasd_devmap *devmap;
        char *dname;
index a66b17b65296e7d73ddc6d8f0ecea6c5ac864b6f..16ab8d363ac6ccdab63714ea6920996b7dd8052b 100644 (file)
@@ -45,16 +45,16 @@ static struct block_device_operations dcssblk_devops = {
        .release = dcssblk_release,
 };
 
-static ssize_t dcssblk_add_store(struct device * dev, const char * buf,
+static ssize_t dcssblk_add_store(struct device * dev, struct device_attribute *attr, const char * buf,
                                  size_t count);
-static ssize_t dcssblk_remove_store(struct device * dev, const char * buf,
+static ssize_t dcssblk_remove_store(struct device * dev, struct device_attribute *attr, const char * buf,
                                  size_t count);
-static ssize_t dcssblk_save_store(struct device * dev, const char * buf,
+static ssize_t dcssblk_save_store(struct device * dev, struct device_attribute *attr, const char * buf,
                                  size_t count);
-static ssize_t dcssblk_save_show(struct device *dev, char *buf);
-static ssize_t dcssblk_shared_store(struct device * dev, const char * buf,
+static ssize_t dcssblk_save_show(struct device *dev, struct device_attribute *attr, char *buf);
+static ssize_t dcssblk_shared_store(struct device * dev, struct device_attribute *attr, const char * buf,
                                  size_t count);
-static ssize_t dcssblk_shared_show(struct device *dev, char *buf);
+static ssize_t dcssblk_shared_show(struct device *dev, struct device_attribute *attr, char *buf);
 
 static DEVICE_ATTR(add, S_IWUSR, NULL, dcssblk_add_store);
 static DEVICE_ATTR(remove, S_IWUSR, NULL, dcssblk_remove_store);
@@ -195,7 +195,7 @@ dcssblk_segment_warn(int rc, char* seg_name)
  * operation (show + store)
  */
 static ssize_t
-dcssblk_shared_show(struct device *dev, char *buf)
+dcssblk_shared_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct dcssblk_dev_info *dev_info;
 
@@ -204,7 +204,7 @@ dcssblk_shared_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-dcssblk_shared_store(struct device *dev, const char *inbuf, size_t count)
+dcssblk_shared_store(struct device *dev, struct device_attribute *attr, const char *inbuf, size_t count)
 {
        struct dcssblk_dev_info *dev_info;
        int rc;
@@ -288,7 +288,7 @@ out:
  * (show + store)
  */
 static ssize_t
-dcssblk_save_show(struct device *dev, char *buf)
+dcssblk_save_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct dcssblk_dev_info *dev_info;
 
@@ -297,7 +297,7 @@ dcssblk_save_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-dcssblk_save_store(struct device *dev, const char *inbuf, size_t count)
+dcssblk_save_store(struct device *dev, struct device_attribute *attr, const char *inbuf, size_t count)
 {
        struct dcssblk_dev_info *dev_info;
 
@@ -343,7 +343,7 @@ dcssblk_save_store(struct device *dev, const char *inbuf, size_t count)
  * device attribute for adding devices
  */
 static ssize_t
-dcssblk_add_store(struct device *dev, const char *buf, size_t count)
+dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        int rc, i;
        struct dcssblk_dev_info *dev_info;
@@ -517,7 +517,7 @@ out_nobuf:
  * device attribute for removing devices
  */
 static ssize_t
-dcssblk_remove_store(struct device *dev, const char *buf, size_t count)
+dcssblk_remove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct dcssblk_dev_info *dev_info;
        int rc, i;
index 8e16a97166866b43cc88a094b107690f561b76d7..d5eefeaba50ca209834c4d9c10879b9fe23f4c7f 100644 (file)
@@ -1084,7 +1084,7 @@ raw3270_probe (struct ccw_device *cdev)
  * Additional attributes for a 3270 device
  */
 static ssize_t
-raw3270_model_show(struct device *dev, char *buf)
+raw3270_model_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        return snprintf(buf, PAGE_SIZE, "%i\n",
                        ((struct raw3270 *) dev->driver_data)->model);
@@ -1092,7 +1092,7 @@ raw3270_model_show(struct device *dev, char *buf)
 static DEVICE_ATTR(model, 0444, raw3270_model_show, 0);
 
 static ssize_t
-raw3270_rows_show(struct device *dev, char *buf)
+raw3270_rows_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        return snprintf(buf, PAGE_SIZE, "%i\n",
                        ((struct raw3270 *) dev->driver_data)->rows);
@@ -1100,7 +1100,7 @@ raw3270_rows_show(struct device *dev, char *buf)
 static DEVICE_ATTR(rows, 0444, raw3270_rows_show, 0);
 
 static ssize_t
-raw3270_columns_show(struct device *dev, char *buf)
+raw3270_columns_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        return snprintf(buf, PAGE_SIZE, "%i\n",
                        ((struct raw3270 *) dev->driver_data)->cols);
index 0f8ffd4167caaf9463929f194d23806caa6bec2e..ed0cb1f15b4c1bc0926e182e3e3ac707712ee8e8 100644 (file)
@@ -16,7 +16,7 @@ MODULE_DESCRIPTION(
 );
 MODULE_LICENSE("GPL");
 
-struct class_simple *tape_class;
+static struct class *tape_class;
 
 /*
  * Register a tape device and return a pointer to the cdev structure.
@@ -70,7 +70,7 @@ struct tape_class_device *register_tape_dev(
        if (rc)
                goto fail_with_cdev;
 
-       tcd->class_device = class_simple_device_add(
+       tcd->class_device = class_device_create(
                                tape_class,
                                tcd->char_device->dev,
                                device,
@@ -101,7 +101,7 @@ void unregister_tape_dev(struct tape_class_device *tcd)
                        &tcd->class_device->dev->kobj,
                        tcd->mode_name
                );
-               class_simple_device_remove(tcd->char_device->dev);
+               class_device_destroy(tape_class, tcd->char_device->dev);
                cdev_del(tcd->char_device);
                kfree(tcd);
        }
@@ -111,14 +111,14 @@ EXPORT_SYMBOL(unregister_tape_dev);
 
 static int __init tape_init(void)
 {
-       tape_class = class_simple_create(THIS_MODULE, "tape390");
+       tape_class = class_create(THIS_MODULE, "tape390");
 
        return 0;
 }
 
 static void __exit tape_exit(void)
 {
-       class_simple_destroy(tape_class);
+       class_destroy(tape_class);
        tape_class = NULL;
 }
 
index e51046ab8adc2d33a10c053c861102b3935a1a2e..b4df4a515b1256056b5bc7708b12708b177154a4 100644 (file)
@@ -107,7 +107,7 @@ busid_to_int(char *bus_id)
  *        replaced by a link to the cdev tree.
  */
 static ssize_t
-tape_medium_state_show(struct device *dev, char *buf)
+tape_medium_state_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct tape_device *tdev;
 
@@ -119,7 +119,7 @@ static
 DEVICE_ATTR(medium_state, 0444, tape_medium_state_show, NULL);
 
 static ssize_t
-tape_first_minor_show(struct device *dev, char *buf)
+tape_first_minor_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct tape_device *tdev;
 
@@ -131,7 +131,7 @@ static
 DEVICE_ATTR(first_minor, 0444, tape_first_minor_show, NULL);
 
 static ssize_t
-tape_state_show(struct device *dev, char *buf)
+tape_state_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct tape_device *tdev;
 
@@ -144,7 +144,7 @@ static
 DEVICE_ATTR(state, 0444, tape_state_show, NULL);
 
 static ssize_t
-tape_operation_show(struct device *dev, char *buf)
+tape_operation_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct tape_device *tdev;
        ssize_t rc;
@@ -171,7 +171,7 @@ static
 DEVICE_ATTR(operation, 0444, tape_operation_show, NULL);
 
 static ssize_t
-tape_blocksize_show(struct device *dev, char *buf)
+tape_blocksize_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct tape_device *tdev;
 
index edf50d2bd10b5437be8dc0f76008f7d642299410..f7717327d15e1f7a666ac243ae0b04b8d2c63dc1 100644 (file)
@@ -548,7 +548,7 @@ vmlogrdr_read (struct file *filp, char *data, size_t count, loff_t * ppos)
 }
 
 static ssize_t
-vmlogrdr_autopurge_store(struct device * dev, const char * buf, size_t count) {
+vmlogrdr_autopurge_store(struct device * dev, struct device_attribute *attr, const char * buf, size_t count) {
        struct vmlogrdr_priv_t *priv = dev->driver_data;
        ssize_t ret = count;
 
@@ -567,7 +567,7 @@ vmlogrdr_autopurge_store(struct device * dev, const char * buf, size_t count) {
 
 
 static ssize_t
-vmlogrdr_autopurge_show(struct device *dev, char *buf) {
+vmlogrdr_autopurge_show(struct device *dev, struct device_attribute *attr, char *buf) {
        struct vmlogrdr_priv_t *priv = dev->driver_data;
        return sprintf(buf, "%u\n", priv->autopurge);
 }
@@ -578,7 +578,7 @@ static DEVICE_ATTR(autopurge, 0644, vmlogrdr_autopurge_show,
 
 
 static ssize_t
-vmlogrdr_purge_store(struct device * dev, const char * buf, size_t count) {
+vmlogrdr_purge_store(struct device * dev, struct device_attribute *attr, const char * buf, size_t count) {
 
        char cp_command[80];
        char cp_response[80];
@@ -619,7 +619,7 @@ static DEVICE_ATTR(purge, 0200, NULL, vmlogrdr_purge_store);
 
 
 static ssize_t
-vmlogrdr_autorecording_store(struct device *dev, const char *buf,
+vmlogrdr_autorecording_store(struct device *dev, struct device_attribute *attr, const char *buf,
                             size_t count) {
        struct vmlogrdr_priv_t *priv = dev->driver_data;
        ssize_t ret = count;
@@ -639,7 +639,7 @@ vmlogrdr_autorecording_store(struct device *dev, const char *buf,
 
 
 static ssize_t
-vmlogrdr_autorecording_show(struct device *dev, char *buf) {
+vmlogrdr_autorecording_show(struct device *dev, struct device_attribute *attr, char *buf) {
        struct vmlogrdr_priv_t *priv = dev->driver_data;
        return sprintf(buf, "%u\n", priv->autorecording);
 }
@@ -650,7 +650,7 @@ static DEVICE_ATTR(autorecording, 0644, vmlogrdr_autorecording_show,
 
 
 static ssize_t
-vmlogrdr_recording_store(struct device * dev, const char * buf, size_t count) {
+vmlogrdr_recording_store(struct device * dev, struct device_attribute *attr, const char * buf, size_t count) {
 
        struct vmlogrdr_priv_t *priv = dev->driver_data;
        ssize_t ret;
@@ -703,7 +703,7 @@ static struct attribute_group vmlogrdr_attr_group = {
        .attrs = vmlogrdr_attrs,
 };
 
-static struct class_simple *vmlogrdr_class;
+static struct class *vmlogrdr_class;
 static struct device_driver vmlogrdr_driver = {
        .name = "vmlogrdr",
        .bus  = &iucv_bus,
@@ -727,7 +727,7 @@ vmlogrdr_register_driver(void) {
                goto unregdriver;
        }
 
-       vmlogrdr_class = class_simple_create(THIS_MODULE, "vmlogrdr");
+       vmlogrdr_class = class_create(THIS_MODULE, "vmlogrdr");
        if (IS_ERR(vmlogrdr_class)) {
                printk(KERN_ERR "vmlogrdr: failed to create class.\n");
                ret=PTR_ERR(vmlogrdr_class);
@@ -746,7 +746,7 @@ unregdriver:
 
 static void
 vmlogrdr_unregister_driver(void) {
-       class_simple_destroy(vmlogrdr_class);
+       class_destroy(vmlogrdr_class);
        vmlogrdr_class = NULL;
        driver_remove_file(&vmlogrdr_driver, &driver_attr_recording_status);
        driver_unregister(&vmlogrdr_driver);
@@ -786,7 +786,7 @@ vmlogrdr_register_device(struct vmlogrdr_priv_t *priv) {
                device_unregister(dev);
                return ret;
        }
-       priv->class_device = class_simple_device_add(
+       priv->class_device = class_device_create(
                                vmlogrdr_class,
                                MKDEV(vmlogrdr_major, priv->minor_num),
                                dev,
@@ -806,7 +806,7 @@ vmlogrdr_register_device(struct vmlogrdr_priv_t *priv) {
 
 static int
 vmlogrdr_unregister_device(struct vmlogrdr_priv_t *priv ) {
-       class_simple_device_remove(MKDEV(vmlogrdr_major, priv->minor_num));
+       class_device_destroy(vmlogrdr_class, MKDEV(vmlogrdr_major, priv->minor_num));
        if (priv->device != NULL) {
                sysfs_remove_group(&priv->device->kobj, &vmlogrdr_attr_group);
                device_unregister(priv->device);
index 4a06c7d0e5e4950899007faebc31725caf900119..aac83ce6469cf8ef57e9926848993dd6a27f2c2a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/blacklist.c
  *   S/390 common I/O routines -- blacklisting of specific devices
- *   $Revision: 1.33 $
+ *   $Revision: 1.34 $
  *
  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
  *                           IBM Corporation
@@ -289,7 +289,7 @@ static int cio_ignore_read (char *page, char **start, off_t off,
        len = 0;
        for (devno = off; /* abuse the page variable
                           * as counter, see fs/proc/generic.c */
-            devno <= __MAX_SUBCHANNELS && len + entry_size < count; devno++) {
+            devno < __MAX_SUBCHANNELS && len + entry_size < count; devno++) {
                if (!test_bit(devno, bl_dev))
                        continue;
                len += sprintf(page + len, "0.0.%04lx", devno);
@@ -302,7 +302,7 @@ static int cio_ignore_read (char *page, char **start, off_t off,
                len += sprintf(page + len, "\n");
        }
 
-       if (devno <= __MAX_SUBCHANNELS)
+       if (devno < __MAX_SUBCHANNELS)
                *eof = 1;
        *start = (char *) (devno - off); /* number of checked entries */
        return len;
index 21a75ee28b80e0a4a4c6dea1130e5b9d25b9391a..306525acb9f829d8a51e700e0ac458a4cccaf1a2 100644 (file)
@@ -77,7 +77,7 @@ __ccwgroup_remove_symlinks(struct ccwgroup_device *gdev)
  * longer needed or accidentially created. Saves memory :)
  */
 static ssize_t
-ccwgroup_ungroup_store(struct device *dev, const char *buf, size_t count)
+ccwgroup_ungroup_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct ccwgroup_device *gdev;
 
@@ -310,7 +310,7 @@ ccwgroup_set_offline(struct ccwgroup_device *gdev)
 }
 
 static ssize_t
-ccwgroup_online_store (struct device *dev, const char *buf, size_t count)
+ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct ccwgroup_device *gdev;
        struct ccwgroup_driver *gdrv;
@@ -338,7 +338,7 @@ ccwgroup_online_store (struct device *dev, const char *buf, size_t count)
 }
 
 static ssize_t
-ccwgroup_online_show (struct device *dev, char *buf)
+ccwgroup_online_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        int online;
 
index b35fe12e6bfc52311673673f979c3e8529ed75e2..b86f94ecd8742de228ab2eb5b166a283f600006a 100644 (file)
@@ -852,7 +852,7 @@ out:
  * Files for the channel path entries.
  */
 static ssize_t
-chp_status_show(struct device *dev, char *buf)
+chp_status_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct channel_path *chp = container_of(dev, struct channel_path, dev);
 
@@ -863,7 +863,7 @@ chp_status_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-chp_status_write(struct device *dev, const char *buf, size_t count)
+chp_status_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct channel_path *cp = container_of(dev, struct channel_path, dev);
        char cmd[10];
@@ -888,7 +888,7 @@ chp_status_write(struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(status, 0644, chp_status_show, chp_status_write);
 
 static ssize_t
-chp_type_show(struct device *dev, char *buf)
+chp_type_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct channel_path *chp = container_of(dev, struct channel_path, dev);
 
index 49def26ba383a2d98300c56c0116eec1c2f6bef4..8cc4f1a940dcde952f6aafb124762185fb77fdeb 100644 (file)
@@ -796,7 +796,7 @@ cmb_show_attr(struct device *dev, char *buf, enum cmb_index idx)
 }
 
 static ssize_t
-cmb_show_avg_sample_interval(struct device *dev, char *buf)
+cmb_show_avg_sample_interval(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct ccw_device *cdev;
        long interval;
@@ -813,7 +813,7 @@ cmb_show_avg_sample_interval(struct device *dev, char *buf)
 }
 
 static ssize_t
-cmb_show_avg_utilization(struct device *dev, char *buf)
+cmb_show_avg_utilization(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct cmbdata data;
        u64 utilization;
@@ -842,12 +842,12 @@ cmb_show_avg_utilization(struct device *dev, char *buf)
 }
 
 #define cmf_attr(name) \
-static ssize_t show_ ## name (struct device * dev, char * buf) \
+static ssize_t show_ ## name (struct device * dev, struct device_attribute *attr, char * buf) \
 { return cmb_show_attr((dev), buf, cmb_ ## name); } \
 static DEVICE_ATTR(name, 0444, show_ ## name, NULL);
 
 #define cmf_attr_avg(name) \
-static ssize_t show_avg_ ## name (struct device * dev, char * buf) \
+static ssize_t show_avg_ ## name (struct device * dev, struct device_attribute *attr, char * buf) \
 { return cmb_show_attr((dev), buf, cmb_ ## name); } \
 static DEVICE_ATTR(avg_ ## name, 0444, show_avg_ ## name, NULL);
 
@@ -902,12 +902,12 @@ static struct attribute_group cmf_attr_group_ext = {
        .attrs = cmf_attributes_ext,
 };
 
-static ssize_t cmb_enable_show(struct device *dev, char *buf)
+static ssize_t cmb_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        return sprintf(buf, "%d\n", to_ccwdev(dev)->private->cmb ? 1 : 0);
 }
 
-static ssize_t cmb_enable_store(struct device *dev, const char *buf, size_t c)
+static ssize_t cmb_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t c)
 {
        struct ccw_device *cdev;
        int ret;
index df0325505e4e3f256ab81cf61da5d8e151de61d2..809e1108a06ef40c00603133d98a38bcc9eaceba 100644 (file)
@@ -204,7 +204,7 @@ module_exit(cleanup_ccw_bus_type);
  * TODO: Split chpids and pimpampom up? Where is "in use" in the tree?
  */
 static ssize_t
-chpids_show (struct device * dev, char * buf)
+chpids_show (struct device * dev, struct device_attribute *attr, char * buf)
 {
        struct subchannel *sch = to_subchannel(dev);
        struct ssd_info *ssd = &sch->ssd_info;
@@ -219,7 +219,7 @@ chpids_show (struct device * dev, char * buf)
 }
 
 static ssize_t
-pimpampom_show (struct device * dev, char * buf)
+pimpampom_show (struct device * dev, struct device_attribute *attr, char * buf)
 {
        struct subchannel *sch = to_subchannel(dev);
        struct pmcw *pmcw = &sch->schib.pmcw;
@@ -229,7 +229,7 @@ pimpampom_show (struct device * dev, char * buf)
 }
 
 static ssize_t
-devtype_show (struct device *dev, char *buf)
+devtype_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct ccw_device *cdev = to_ccwdev(dev);
        struct ccw_device_id *id = &(cdev->id);
@@ -242,7 +242,7 @@ devtype_show (struct device *dev, char *buf)
 }
 
 static ssize_t
-cutype_show (struct device *dev, char *buf)
+cutype_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct ccw_device *cdev = to_ccwdev(dev);
        struct ccw_device_id *id = &(cdev->id);
@@ -252,7 +252,7 @@ cutype_show (struct device *dev, char *buf)
 }
 
 static ssize_t
-online_show (struct device *dev, char *buf)
+online_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct ccw_device *cdev = to_ccwdev(dev);
 
@@ -350,7 +350,7 @@ ccw_device_set_online(struct ccw_device *cdev)
 }
 
 static ssize_t
-online_store (struct device *dev, const char *buf, size_t count)
+online_store (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct ccw_device *cdev = to_ccwdev(dev);
        int i, force, ret;
@@ -422,7 +422,7 @@ online_store (struct device *dev, const char *buf, size_t count)
 }
 
 static ssize_t
-available_show (struct device *dev, char *buf)
+available_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct ccw_device *cdev = to_ccwdev(dev);
        struct subchannel *sch;
index 7cabb80a2e4144ef77210e5576124009baa747f3..90d4d0ef3dd4d54f5b6563e24c68118c654aa74f 100644 (file)
@@ -9,6 +9,7 @@ obj-$(CONFIG_NETIUCV) += netiucv.o fsm.o
 obj-$(CONFIG_SMSGIUCV) += smsgiucv.o
 obj-$(CONFIG_CTC) += ctc.o fsm.o cu3088.o
 obj-$(CONFIG_LCS) += lcs.o cu3088.o
-qeth-y := qeth_main.o qeth_mpc.o qeth_sys.o qeth_eddp.o qeth_tso.o
+obj-$(CONFIG_CLAW) += claw.o cu3088.o
+qeth-y := qeth_main.o qeth_mpc.o qeth_sys.o qeth_eddp.o 
 qeth-$(CONFIG_PROC_FS) += qeth_proc.o
 obj-$(CONFIG_QETH) += qeth.o
index 06804d39a9c6da09a104285581489941ef84eb07..a99927d54ebb5bb1c40efa9ec20b36169a511d4d 100644 (file)
@@ -241,20 +241,20 @@ static struct sk_buff *claw_pack_skb(struct claw_privbk *privptr);
 static void dumpit (char *buf, int len);
 #endif
 /* sysfs Functions */
-static ssize_t claw_hname_show(struct device *dev, char *buf);
-static ssize_t claw_hname_write(struct device *dev,
+static ssize_t claw_hname_show(struct device *dev, struct device_attribute *attr, char *buf);
+static ssize_t claw_hname_write(struct device *dev, struct device_attribute *attr,
        const char *buf, size_t count);
-static ssize_t claw_adname_show(struct device *dev, char *buf);
-static ssize_t claw_adname_write(struct device *dev,
+static ssize_t claw_adname_show(struct device *dev, struct device_attribute *attr, char *buf);
+static ssize_t claw_adname_write(struct device *dev, struct device_attribute *attr,
        const char *buf, size_t count);
-static ssize_t claw_apname_show(struct device *dev, char *buf);
-static ssize_t claw_apname_write(struct device *dev,
+static ssize_t claw_apname_show(struct device *dev, struct device_attribute *attr, char *buf);
+static ssize_t claw_apname_write(struct device *dev, struct device_attribute *attr,
        const char *buf, size_t count);
-static ssize_t claw_wbuff_show(struct device *dev, char *buf);
-static ssize_t claw_wbuff_write(struct device *dev,
+static ssize_t claw_wbuff_show(struct device *dev, struct device_attribute *attr, char *buf);
+static ssize_t claw_wbuff_write(struct device *dev, struct device_attribute *attr,
        const char *buf, size_t count);
-static ssize_t claw_rbuff_show(struct device *dev, char *buf);
-static ssize_t claw_rbuff_write(struct device *dev,
+static ssize_t claw_rbuff_show(struct device *dev, struct device_attribute *attr, char *buf);
+static ssize_t claw_rbuff_write(struct device *dev, struct device_attribute *attr,
        const char *buf, size_t count);
 static int claw_add_files(struct device *dev);
 static void claw_remove_files(struct device *dev);
@@ -4149,7 +4149,7 @@ claw_remove_device(struct ccwgroup_device *cgdev)
  * sysfs attributes
  */
 static ssize_t
-claw_hname_show(struct device *dev, char *buf)
+claw_hname_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct claw_privbk *priv;
        struct claw_env *  p_env;
@@ -4162,7 +4162,7 @@ claw_hname_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-claw_hname_write(struct device *dev, const char *buf, size_t count)
+claw_hname_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct claw_privbk *priv;
        struct claw_env *  p_env;
@@ -4186,7 +4186,7 @@ claw_hname_write(struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(host_name, 0644, claw_hname_show, claw_hname_write);
 
 static ssize_t
-claw_adname_show(struct device *dev, char *buf)
+claw_adname_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct claw_privbk *priv;
        struct claw_env *  p_env;
@@ -4199,7 +4199,7 @@ claw_adname_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-claw_adname_write(struct device *dev, const char *buf, size_t count)
+claw_adname_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct claw_privbk *priv;
        struct claw_env *  p_env;
@@ -4223,7 +4223,7 @@ claw_adname_write(struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(adapter_name, 0644, claw_adname_show, claw_adname_write);
 
 static ssize_t
-claw_apname_show(struct device *dev, char *buf)
+claw_apname_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct claw_privbk *priv;
        struct claw_env *  p_env;
@@ -4237,7 +4237,7 @@ claw_apname_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-claw_apname_write(struct device *dev, const char *buf, size_t count)
+claw_apname_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct claw_privbk *priv;
        struct claw_env *  p_env;
@@ -4271,7 +4271,7 @@ claw_apname_write(struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(api_type, 0644, claw_apname_show, claw_apname_write);
 
 static ssize_t
-claw_wbuff_show(struct device *dev, char *buf)
+claw_wbuff_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct claw_privbk *priv;
        struct claw_env * p_env;
@@ -4284,7 +4284,7 @@ claw_wbuff_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-claw_wbuff_write(struct device *dev, const char *buf, size_t count)
+claw_wbuff_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct claw_privbk *priv;
        struct claw_env *  p_env;
@@ -4312,7 +4312,7 @@ claw_wbuff_write(struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(write_buffer, 0644, claw_wbuff_show, claw_wbuff_write);
 
 static ssize_t
-claw_rbuff_show(struct device *dev, char *buf)
+claw_rbuff_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct claw_privbk *priv;
        struct claw_env *  p_env;
@@ -4325,7 +4325,7 @@ claw_rbuff_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-claw_rbuff_write(struct device *dev, const char *buf, size_t count)
+claw_rbuff_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct claw_privbk *priv;
        struct claw_env *p_env;
index ef8883951720c27ea3aa3b1c0abacda934105c0c..7fe2ebd1792dc6de5cbe1ee4a30af420fd76d8fb 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/ctcdbug.h ($Revision: 1.4 $)
+ * linux/drivers/s390/net/ctcdbug.h ($Revision: 1.5 $)
  *
  * CTC / ESCON network driver - s390 dbf exploit.
  *
@@ -9,7 +9,7 @@
  *    Author(s): Original Code written by
  *                       Peter Tiedemann (ptiedem@de.ibm.com)
  *
- *    $Revision: 1.4 $  $Date: 2004/10/15 09:26:58 $
+ *    $Revision: 1.5 $  $Date: 2005/02/27 19:46:44 $
  *
  * 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
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-
+#ifndef _CTCDBUG_H_
+#define _CTCDBUG_H_
 
 #include <asm/debug.h>
+#include "ctcmain.h"
 /**
  * Debug Facility stuff
  */
@@ -41,7 +43,7 @@
 #define CTC_DBF_DATA_LEN 128
 #define CTC_DBF_DATA_INDEX 3
 #define CTC_DBF_DATA_NR_AREAS 1
-#define CTC_DBF_DATA_LEVEL 2
+#define CTC_DBF_DATA_LEVEL 3
 
 #define CTC_DBF_TRACE_NAME "ctc_trace"
 #define CTC_DBF_TRACE_LEN 16
@@ -121,3 +123,5 @@ hex_dump(unsigned char *buf, size_t len)
        printk("\n");
 }
 
+
+#endif
index 7266bf5ea6599f9734866b01383032636e4de96f..96ca863eaff2826fe30c46e9d9a961a5a9fa3131 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: ctcmain.c,v 1.72 2005/03/17 10:51:52 ptiedem Exp $
+ * $Id: ctcmain.c,v 1.74 2005/03/24 09:04:17 mschwide Exp $
  *
  * CTC / ESCON network driver
  *
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.72 $
+ * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.74 $
  *
  */
 \f
 #undef DEBUG
-
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include "ctctty.h"
 #include "fsm.h"
 #include "cu3088.h"
+
 #include "ctcdbug.h"
+#include "ctcmain.h"
 
 MODULE_AUTHOR("(C) 2000 IBM Corp. by Fritz Elfert (felfert@millenux.com)");
 MODULE_DESCRIPTION("Linux for S/390 CTC/Escon Driver");
 MODULE_LICENSE("GPL");
-
-/**
- * CCW commands, used in this driver.
- */
-#define CCW_CMD_WRITE          0x01
-#define CCW_CMD_READ           0x02
-#define CCW_CMD_SET_EXTENDED   0xc3
-#define CCW_CMD_PREPARE                0xe3
-
-#define CTC_PROTO_S390          0
-#define CTC_PROTO_LINUX         1
-#define CTC_PROTO_LINUX_TTY     2
-#define CTC_PROTO_OS390         3
-#define CTC_PROTO_MAX           3
-
-#define CTC_BUFSIZE_LIMIT       65535
-#define CTC_BUFSIZE_DEFAULT     32768
-
-#define CTC_TIMEOUT_5SEC        5000
-
-#define CTC_INITIAL_BLOCKLEN    2
-
-#define READ                   0
-#define WRITE                  1
-
-#define CTC_ID_SIZE             BUS_ID_SIZE+3
-\f
-
-struct ctc_profile {
-       unsigned long maxmulti;
-       unsigned long maxcqueue;
-       unsigned long doios_single;
-       unsigned long doios_multi;
-       unsigned long txlen;
-       unsigned long tx_time;
-       struct timespec send_stamp;
-};
-
-/**
- * Definition of one channel
- */
-struct channel {
-
-       /**
-        * Pointer to next channel in list.
-        */
-       struct channel *next;
-       char id[CTC_ID_SIZE];
-       struct ccw_device *cdev;
-
-       /**
-        * Type of this channel.
-        * CTC/A or Escon for valid channels.
-        */
-       enum channel_types type;
-
-       /**
-        * Misc. flags. See CHANNEL_FLAGS_... below
-        */
-       __u32 flags;
-
-       /**
-        * The protocol of this channel
-        */
-       __u16 protocol;
-
-       /**
-        * I/O and irq related stuff
-        */
-       struct ccw1 *ccw;
-       struct irb *irb;
-
-       /**
-        * RX/TX buffer size
-        */
-       int max_bufsize;
-
-       /**
-        * Transmit/Receive buffer.
-        */
-       struct sk_buff *trans_skb;
-
-       /**
-        * Universal I/O queue.
-        */
-       struct sk_buff_head io_queue;
-
-       /**
-        * TX queue for collecting skb's during busy.
-        */
-       struct sk_buff_head collect_queue;
-
-       /**
-        * Amount of data in collect_queue.
-        */
-       int collect_len;
-
-       /**
-        * spinlock for collect_queue and collect_len
-        */
-       spinlock_t collect_lock;
-
-       /**
-        * Timer for detecting unresposive
-        * I/O operations.
-        */
-       fsm_timer timer;
-
-       /**
-        * Retry counter for misc. operations.
-        */
-       int retry;
-
-       /**
-        * The finite state machine of this channel
-        */
-       fsm_instance *fsm;
-
-       /**
-        * The corresponding net_device this channel
-        * belongs to.
-        */
-       struct net_device *netdev;
-
-       struct ctc_profile prof;
-
-       unsigned char *trans_skb_data;
-
-       __u16 logflags;
-};
-
-#define CHANNEL_FLAGS_READ            0
-#define CHANNEL_FLAGS_WRITE           1
-#define CHANNEL_FLAGS_INUSE           2
-#define CHANNEL_FLAGS_BUFSIZE_CHANGED 4
-#define CHANNEL_FLAGS_FAILED          8
-#define CHANNEL_FLAGS_WAITIRQ        16
-#define CHANNEL_FLAGS_RWMASK 1
-#define CHANNEL_DIRECTION(f) (f & CHANNEL_FLAGS_RWMASK)
-
-#define LOG_FLAG_ILLEGALPKT  1
-#define LOG_FLAG_ILLEGALSIZE 2
-#define LOG_FLAG_OVERRUN     4
-#define LOG_FLAG_NOMEM       8
-
-#define CTC_LOGLEVEL_INFO     1
-#define CTC_LOGLEVEL_NOTICE   2
-#define CTC_LOGLEVEL_WARN     4
-#define CTC_LOGLEVEL_EMERG    8
-#define CTC_LOGLEVEL_ERR     16
-#define CTC_LOGLEVEL_DEBUG   32
-#define CTC_LOGLEVEL_CRIT    64
-
-#define CTC_LOGLEVEL_DEFAULT \
-(CTC_LOGLEVEL_INFO | CTC_LOGLEVEL_NOTICE | CTC_LOGLEVEL_WARN | CTC_LOGLEVEL_CRIT)
-
-#define CTC_LOGLEVEL_MAX     ((CTC_LOGLEVEL_CRIT<<1)-1)
-
-static int loglevel = CTC_LOGLEVEL_DEFAULT;
-
-#define ctc_pr_debug(fmt, arg...) \
-do { if (loglevel & CTC_LOGLEVEL_DEBUG) printk(KERN_DEBUG fmt,##arg); } while (0)
-
-#define ctc_pr_info(fmt, arg...) \
-do { if (loglevel & CTC_LOGLEVEL_INFO) printk(KERN_INFO fmt,##arg); } while (0)
-
-#define ctc_pr_notice(fmt, arg...) \
-do { if (loglevel & CTC_LOGLEVEL_NOTICE) printk(KERN_NOTICE fmt,##arg); } while (0)
-
-#define ctc_pr_warn(fmt, arg...) \
-do { if (loglevel & CTC_LOGLEVEL_WARN) printk(KERN_WARNING fmt,##arg); } while (0)
-
-#define ctc_pr_emerg(fmt, arg...) \
-do { if (loglevel & CTC_LOGLEVEL_EMERG) printk(KERN_EMERG fmt,##arg); } while (0)
-
-#define ctc_pr_err(fmt, arg...) \
-do { if (loglevel & CTC_LOGLEVEL_ERR) printk(KERN_ERR fmt,##arg); } while (0)
-
-#define ctc_pr_crit(fmt, arg...) \
-do { if (loglevel & CTC_LOGLEVEL_CRIT) printk(KERN_CRIT fmt,##arg); } while (0)
-
-/**
- * Linked list of all detected channels.
- */
-static struct channel *channels = NULL;
-
-struct ctc_priv {
-       struct net_device_stats stats;
-       unsigned long tbusy;
-       /**
-        * The finite state machine of this interface.
-        */
-       fsm_instance *fsm;
-       /**
-        * The protocol of this device
-        */
-       __u16 protocol;
-       /**
-        * Timer for restarting after I/O Errors
-        */
-       fsm_timer               restart_timer;
-
-       int buffer_size;
-
-       struct channel *channel[2];
-};
-
-/**
- * Definition of our link level header.
- */
-struct ll_header {
-       __u16 length;
-       __u16 type;
-       __u16 unused;
-};
-#define LL_HEADER_LENGTH (sizeof(struct ll_header))
-
-/**
- * Compatibility macros for busy handling
- * of network devices.
- */
-static __inline__ void
-ctc_clear_busy(struct net_device * dev)
-{
-       clear_bit(0, &(((struct ctc_priv *) dev->priv)->tbusy));
-       if (((struct ctc_priv *)dev->priv)->protocol != CTC_PROTO_LINUX_TTY)
-               netif_wake_queue(dev);
-}
-
-static __inline__ int
-ctc_test_and_set_busy(struct net_device * dev)
-{
-       if (((struct ctc_priv *)dev->priv)->protocol != CTC_PROTO_LINUX_TTY)
-               netif_stop_queue(dev);
-       return test_and_set_bit(0, &((struct ctc_priv *) dev->priv)->tbusy);
-}
-
-/**
- * Print Banner.
- */
-static void
-print_banner(void)
-{
-       static int printed = 0;
-       char vbuf[] = "$Revision: 1.72 $";
-       char *version = vbuf;
-
-       if (printed)
-               return;
-       if ((version = strchr(version, ':'))) {
-               char *p = strchr(version + 1, '$');
-               if (p)
-                       *p = '\0';
-       } else
-               version = " ??? ";
-       printk(KERN_INFO "CTC driver Version%s"
-#ifdef DEBUG
-                   " (DEBUG-VERSION, " __DATE__ __TIME__ ")"
-#endif
-                   " initialized\n", version);
-       printed = 1;
-}
-\f
-/**
- * Return type of a detected device.
- */
-static enum channel_types
-get_channel_type(struct ccw_device_id *id)
-{
-       enum channel_types type = (enum channel_types) id->driver_info;
-
-       if (type == channel_type_ficon)
-               type = channel_type_escon;
-
-       return type;
-}
-\f
 /**
  * States of the interface statemachine.
  */
@@ -371,7 +95,7 @@ enum dev_states {
        /**
         * MUST be always the last element!!
         */
-       NR_DEV_STATES
+       CTC_NR_DEV_STATES
 };
 
 static const char *dev_state_names[] = {
@@ -399,7 +123,7 @@ enum dev_events {
        /**
         * MUST be always the last element!!
         */
-       NR_DEV_EVENTS
+       CTC_NR_DEV_EVENTS
 };
 
 static const char *dev_event_names[] = {
@@ -476,40 +200,6 @@ enum ch_events {
        NR_CH_EVENTS,
 };
 
-static const char *ch_event_names[] = {
-       "ccw_device success",
-       "ccw_device busy",
-       "ccw_device enodev",
-       "ccw_device ioerr",
-       "ccw_device unknown",
-
-       "Status ATTN & BUSY",
-       "Status ATTN",
-       "Status BUSY",
-
-       "Unit check remote reset",
-       "Unit check remote system reset",
-       "Unit check TX timeout",
-       "Unit check TX parity",
-       "Unit check Hardware failure",
-       "Unit check RX parity",
-       "Unit check ZERO",
-       "Unit check Unknown",
-
-       "SubChannel check Unknown",
-
-       "Machine check failure",
-       "Machine check operational",
-
-       "IRQ normal",
-       "IRQ final",
-
-       "Timer",
-
-       "Start",
-       "Stop",
-};
-
 /**
  * States of the channel statemachine.
  */
@@ -545,6 +235,87 @@ enum ch_states {
        NR_CH_STATES,
 };
 
+static int loglevel = CTC_LOGLEVEL_DEFAULT;
+
+/**
+ * Linked list of all detected channels.
+ */
+static struct channel *channels = NULL;
+
+/**
+ * Print Banner.
+ */
+static void
+print_banner(void)
+{
+       static int printed = 0;
+       char vbuf[] = "$Revision: 1.74 $";
+       char *version = vbuf;
+
+       if (printed)
+               return;
+       if ((version = strchr(version, ':'))) {
+               char *p = strchr(version + 1, '$');
+               if (p)
+                       *p = '\0';
+       } else
+               version = " ??? ";
+       printk(KERN_INFO "CTC driver Version%s"
+#ifdef DEBUG
+                   " (DEBUG-VERSION, " __DATE__ __TIME__ ")"
+#endif
+                   " initialized\n", version);
+       printed = 1;
+}
+
+/**
+ * Return type of a detected device.
+ */
+static enum channel_types
+get_channel_type(struct ccw_device_id *id)
+{
+       enum channel_types type = (enum channel_types) id->driver_info;
+
+       if (type == channel_type_ficon)
+               type = channel_type_escon;
+
+       return type;
+}
+
+static const char *ch_event_names[] = {
+       "ccw_device success",
+       "ccw_device busy",
+       "ccw_device enodev",
+       "ccw_device ioerr",
+       "ccw_device unknown",
+
+       "Status ATTN & BUSY",
+       "Status ATTN",
+       "Status BUSY",
+
+       "Unit check remote reset",
+       "Unit check remote system reset",
+       "Unit check TX timeout",
+       "Unit check TX parity",
+       "Unit check Hardware failure",
+       "Unit check RX parity",
+       "Unit check ZERO",
+       "Unit check Unknown",
+
+       "SubChannel check Unknown",
+
+       "Machine check failure",
+       "Machine check operational",
+
+       "IRQ normal",
+       "IRQ final",
+
+       "Timer",
+
+       "Start",
+       "Stop",
+};
+
 static const char *ch_state_names[] = {
        "Idle",
        "Stopped",
@@ -1934,7 +1705,6 @@ add_channel(struct ccw_device *cdev, enum channel_types type)
        ch->cdev = cdev;
        snprintf(ch->id, CTC_ID_SIZE, "ch-%s", cdev->dev.bus_id);
        ch->type = type;
-       loglevel = CTC_LOGLEVEL_DEFAULT;
        ch->fsm = init_fsm(ch->id, ch_state_names,
                           ch_event_names, NR_CH_STATES, NR_CH_EVENTS,
                           ch_fsm, CH_FSM_LEN, GFP_KERNEL);
@@ -2697,8 +2467,9 @@ ctc_stats(struct net_device * dev)
 /*
  * sysfs attributes
  */
+
 static ssize_t
-buffer_show(struct device *dev, char *buf)
+buffer_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct ctc_priv *priv;
 
@@ -2710,62 +2481,66 @@ buffer_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-buffer_write(struct device *dev, const char *buf, size_t count)
+buffer_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct ctc_priv *priv;
        struct net_device *ndev;
        int bs1;
+       char buffer[16];
 
        DBF_TEXT(trace, 3, __FUNCTION__);
+       DBF_TEXT(trace, 3, buf);
        priv = dev->driver_data;
-       if (!priv)
+       if (!priv) {
+               DBF_TEXT(trace, 3, "bfnopriv");
                return -ENODEV;
+       }
+
+       sscanf(buf, "%u", &bs1);
+       if (bs1 > CTC_BUFSIZE_LIMIT)
+               goto einval;
+       if (bs1 < (576 + LL_HEADER_LENGTH + 2))
+               goto einval;
+       priv->buffer_size = bs1;        // just to overwrite the default
+
        ndev = priv->channel[READ]->netdev;
-       if (!ndev)
+       if (!ndev) {
+               DBF_TEXT(trace, 3, "bfnondev");
                return -ENODEV;
-       sscanf(buf, "%u", &bs1);
+       }
 
-       if (bs1 > CTC_BUFSIZE_LIMIT)
-               return -EINVAL;
        if ((ndev->flags & IFF_RUNNING) &&
            (bs1 < (ndev->mtu + LL_HEADER_LENGTH + 2)))
-               return -EINVAL;
-       if (bs1 < (576 + LL_HEADER_LENGTH + 2))
-               return -EINVAL;
+               goto einval;
 
-       priv->buffer_size = bs1;
-       priv->channel[READ]->max_bufsize =
-           priv->channel[WRITE]->max_bufsize = bs1;
+       priv->channel[READ]->max_bufsize = bs1;
+       priv->channel[WRITE]->max_bufsize = bs1;
        if (!(ndev->flags & IFF_RUNNING))
                ndev->mtu = bs1 - LL_HEADER_LENGTH - 2;
        priv->channel[READ]->flags |= CHANNEL_FLAGS_BUFSIZE_CHANGED;
        priv->channel[WRITE]->flags |= CHANNEL_FLAGS_BUFSIZE_CHANGED;
 
+       sprintf(buffer, "%d",priv->buffer_size);
+       DBF_TEXT(trace, 3, buffer);
        return count;
 
+einval:
+       DBF_TEXT(trace, 3, "buff_err");
+       return -EINVAL;
 }
 
 static ssize_t
-loglevel_show(struct device *dev, char *buf)
+loglevel_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
-       struct ctc_priv *priv;
-
-       priv = dev->driver_data;
-       if (!priv)
-               return -ENODEV;
        return sprintf(buf, "%d\n", loglevel);
 }
 
 static ssize_t
-loglevel_write(struct device *dev, const char *buf, size_t count)
+loglevel_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
-       struct ctc_priv *priv;
        int ll1;
 
        DBF_TEXT(trace, 5, __FUNCTION__);
-       priv = dev->driver_data;
-       if (!priv)
-               return -ENODEV;
        sscanf(buf, "%i", &ll1);
 
        if ((ll1 > CTC_LOGLEVEL_MAX) || (ll1 < 0))
@@ -2814,7 +2589,7 @@ ctc_print_statistics(struct ctc_priv *priv)
 }
 
 static ssize_t
-stats_show(struct device *dev, char *buf)
+stats_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct ctc_priv *priv = dev->driver_data;
        if (!priv)
@@ -2824,7 +2599,7 @@ stats_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-stats_write(struct device *dev, const char *buf, size_t count)
+stats_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct ctc_priv *priv = dev->driver_data;
        if (!priv)
@@ -2835,27 +2610,6 @@ stats_write(struct device *dev, const char *buf, size_t count)
        return count;
 }
 
-static DEVICE_ATTR(buffer, 0644, buffer_show, buffer_write);
-static DEVICE_ATTR(loglevel, 0644, loglevel_show, loglevel_write);
-static DEVICE_ATTR(stats, 0644, stats_show, stats_write);
-
-static int
-ctc_add_attributes(struct device *dev)
-{
-//     device_create_file(dev, &dev_attr_buffer);
-       device_create_file(dev, &dev_attr_loglevel);
-       device_create_file(dev, &dev_attr_stats);
-       return 0;
-}
-
-static void
-ctc_remove_attributes(struct device *dev)
-{
-       device_remove_file(dev, &dev_attr_stats);
-       device_remove_file(dev, &dev_attr_loglevel);
-//     device_remove_file(dev, &dev_attr_buffer);
-}
-
 \f
 static void
 ctc_netdev_unregister(struct net_device * dev)
@@ -2899,54 +2653,8 @@ ctc_free_netdevice(struct net_device * dev, int free_dev)
 #endif
 }
 
-/**
- * Initialize everything of the net device except the name and the
- * channel structs.
- */
-static struct net_device *
-ctc_init_netdevice(struct net_device * dev, int alloc_device, 
-                  struct ctc_priv *privptr)
-{
-       if (!privptr)
-               return NULL;
-
-       DBF_TEXT(setup, 3, __FUNCTION__);
-       if (alloc_device) {
-               dev = kmalloc(sizeof (struct net_device), GFP_KERNEL);
-               if (!dev)
-                       return NULL;
-               memset(dev, 0, sizeof (struct net_device));
-       }
-
-       dev->priv = privptr;
-       privptr->fsm = init_fsm("ctcdev", dev_state_names,
-                               dev_event_names, NR_DEV_STATES, NR_DEV_EVENTS,
-                               dev_fsm, DEV_FSM_LEN, GFP_KERNEL);
-       if (privptr->fsm == NULL) {
-               if (alloc_device)
-                       kfree(dev);
-               return NULL;
-       }
-       fsm_newstate(privptr->fsm, DEV_STATE_STOPPED);
-       fsm_settimer(privptr->fsm, &privptr->restart_timer);
-       if (dev->mtu == 0)
-               dev->mtu = CTC_BUFSIZE_DEFAULT - LL_HEADER_LENGTH - 2;
-       dev->hard_start_xmit = ctc_tx;
-       dev->open = ctc_open;
-       dev->stop = ctc_close;
-       dev->get_stats = ctc_stats;
-       dev->change_mtu = ctc_change_mtu;
-       dev->hard_header_len = LL_HEADER_LENGTH + 2;
-       dev->addr_len = 0;
-       dev->type = ARPHRD_SLIP;
-       dev->tx_queue_len = 100;
-       dev->flags = IFF_POINTOPOINT | IFF_NOARP;
-       SET_MODULE_OWNER(dev);
-       return dev;
-}
-
 static ssize_t
-ctc_proto_show(struct device *dev, char *buf)
+ctc_proto_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct ctc_priv *priv;
 
@@ -2958,7 +2666,7 @@ ctc_proto_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-ctc_proto_store(struct device *dev, const char *buf, size_t count)
+ctc_proto_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct ctc_priv *priv;
        int value;
@@ -2977,10 +2685,9 @@ ctc_proto_store(struct device *dev, const char *buf, size_t count)
        return count;
 }
 
-static DEVICE_ATTR(protocol, 0644, ctc_proto_show, ctc_proto_store);
 
 static ssize_t
-ctc_type_show(struct device *dev, char *buf)
+ctc_type_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct ccwgroup_device *cgdev;
 
@@ -2991,8 +2698,13 @@ ctc_type_show(struct device *dev, char *buf)
        return sprintf(buf, "%s\n", cu3088_type[cgdev->cdev[0]->id.driver_info]);
 }
 
+static DEVICE_ATTR(buffer, 0644, buffer_show, buffer_write);
+static DEVICE_ATTR(protocol, 0644, ctc_proto_show, ctc_proto_store);
 static DEVICE_ATTR(type, 0444, ctc_type_show, NULL);
 
+static DEVICE_ATTR(loglevel, 0644, loglevel_show, loglevel_write);
+static DEVICE_ATTR(stats, 0644, stats_show, stats_write);
+
 static struct attribute *ctc_attr[] = {
        &dev_attr_protocol.attr,
        &dev_attr_type.attr,
@@ -3004,6 +2716,21 @@ static struct attribute_group ctc_attr_group = {
        .attrs = ctc_attr,
 };
 
+static int
+ctc_add_attributes(struct device *dev)
+{
+       device_create_file(dev, &dev_attr_loglevel);
+       device_create_file(dev, &dev_attr_stats);
+       return 0;
+}
+
+static void
+ctc_remove_attributes(struct device *dev)
+{
+       device_remove_file(dev, &dev_attr_stats);
+       device_remove_file(dev, &dev_attr_loglevel);
+}
+
 static int
 ctc_add_files(struct device *dev)
 {
@@ -3028,15 +2755,15 @@ ctc_remove_files(struct device *dev)
  *
  * @returns 0 on success, !0 on failure.
  */
-
 static int
 ctc_probe_device(struct ccwgroup_device *cgdev)
 {
        struct ctc_priv *priv;
        int rc;
+       char buffer[16];
 
        pr_debug("%s() called\n", __FUNCTION__);
-       DBF_TEXT(trace, 3, __FUNCTION__);
+       DBF_TEXT(setup, 3, __FUNCTION__);
 
        if (!get_device(&cgdev->dev))
                return -ENODEV;
@@ -3060,9 +2787,69 @@ ctc_probe_device(struct ccwgroup_device *cgdev)
        cgdev->cdev[1]->handler = ctc_irq_handler;
        cgdev->dev.driver_data = priv;
 
+       sprintf(buffer, "%p", priv);
+       DBF_TEXT(data, 3, buffer);
+
+       sprintf(buffer, "%u", (unsigned int)sizeof(struct ctc_priv));
+       DBF_TEXT(data, 3, buffer);
+
+       sprintf(buffer, "%p", &channels);
+       DBF_TEXT(data, 3, buffer);
+
+       sprintf(buffer, "%u", (unsigned int)sizeof(struct channel));
+       DBF_TEXT(data, 3, buffer);
+
        return 0;
 }
 
+/**
+ * Initialize everything of the net device except the name and the
+ * channel structs.
+ */
+static struct net_device *
+ctc_init_netdevice(struct net_device * dev, int alloc_device,
+                  struct ctc_priv *privptr)
+{
+       if (!privptr)
+               return NULL;
+
+       DBF_TEXT(setup, 3, __FUNCTION__);
+
+       if (alloc_device) {
+               dev = kmalloc(sizeof (struct net_device), GFP_KERNEL);
+               if (!dev)
+                       return NULL;
+               memset(dev, 0, sizeof (struct net_device));
+       }
+
+       dev->priv = privptr;
+       privptr->fsm = init_fsm("ctcdev", dev_state_names,
+                               dev_event_names, CTC_NR_DEV_STATES, CTC_NR_DEV_EVENTS,
+                               dev_fsm, DEV_FSM_LEN, GFP_KERNEL);
+       if (privptr->fsm == NULL) {
+               if (alloc_device)
+                       kfree(dev);
+               return NULL;
+       }
+       fsm_newstate(privptr->fsm, DEV_STATE_STOPPED);
+       fsm_settimer(privptr->fsm, &privptr->restart_timer);
+       if (dev->mtu == 0)
+               dev->mtu = CTC_BUFSIZE_DEFAULT - LL_HEADER_LENGTH - 2;
+       dev->hard_start_xmit = ctc_tx;
+       dev->open = ctc_open;
+       dev->stop = ctc_close;
+       dev->get_stats = ctc_stats;
+       dev->change_mtu = ctc_change_mtu;
+       dev->hard_header_len = LL_HEADER_LENGTH + 2;
+       dev->addr_len = 0;
+       dev->type = ARPHRD_SLIP;
+       dev->tx_queue_len = 100;
+       dev->flags = IFF_POINTOPOINT | IFF_NOARP;
+       SET_MODULE_OWNER(dev);
+       return dev;
+}
+
+
 /**
  *
  * Setup an interface.
@@ -3081,6 +2868,7 @@ ctc_new_device(struct ccwgroup_device *cgdev)
        struct ctc_priv *privptr;
        struct net_device *dev;
        int ret;
+       char buffer[16];
 
        pr_debug("%s() called\n", __FUNCTION__);
        DBF_TEXT(setup, 3, __FUNCTION__);
@@ -3089,6 +2877,9 @@ ctc_new_device(struct ccwgroup_device *cgdev)
        if (!privptr)
                return -ENODEV;
 
+       sprintf(buffer, "%d", privptr->buffer_size);
+       DBF_TEXT(setup, 3, buffer);
+
        type = get_channel_type(&cgdev->cdev[0]->id);
        
        snprintf(read_id, CTC_ID_SIZE, "ch-%s", cgdev->cdev[0]->dev.bus_id);
@@ -3177,9 +2968,10 @@ ctc_shutdown_device(struct ccwgroup_device *cgdev)
        struct ctc_priv *priv;
        struct net_device *ndev;
                
-       DBF_TEXT(trace, 3, __FUNCTION__);
+       DBF_TEXT(setup, 3, __FUNCTION__);
        pr_debug("%s() called\n", __FUNCTION__);
 
+
        priv = cgdev->dev.driver_data;
        ndev = NULL;
        if (!priv)
@@ -3215,7 +3007,6 @@ ctc_shutdown_device(struct ccwgroup_device *cgdev)
                channel_remove(priv->channel[READ]);
        if (priv->channel[WRITE])
                channel_remove(priv->channel[WRITE]);
-       
        priv->channel[READ] = priv->channel[WRITE] = NULL;
 
        return 0;
@@ -3228,7 +3019,7 @@ ctc_remove_device(struct ccwgroup_device *cgdev)
        struct ctc_priv *priv;
 
        pr_debug("%s() called\n", __FUNCTION__);
-       DBF_TEXT(trace, 3, __FUNCTION__);
+       DBF_TEXT(setup, 3, __FUNCTION__);
 
        priv = cgdev->dev.driver_data;
        if (!priv)
@@ -3265,6 +3056,7 @@ static struct ccwgroup_driver ctc_group_driver = {
 static void __exit
 ctc_exit(void)
 {
+       DBF_TEXT(setup, 3, __FUNCTION__);
        unregister_cu3088_discipline(&ctc_group_driver);
        ctc_tty_cleanup();
        ctc_unregister_dbf_views();
@@ -3282,6 +3074,10 @@ ctc_init(void)
 {
        int ret = 0;
 
+       loglevel = CTC_LOGLEVEL_DEFAULT;
+
+       DBF_TEXT(setup, 3, __FUNCTION__);
+
        print_banner();
 
        ret = ctc_register_dbf_views();
diff --git a/drivers/s390/net/ctcmain.h b/drivers/s390/net/ctcmain.h
new file mode 100644 (file)
index 0000000..ba3605f
--- /dev/null
@@ -0,0 +1,276 @@
+/*
+ * $Id: ctcmain.h,v 1.4 2005/03/24 09:04:17 mschwide Exp $
+ *
+ * CTC / ESCON network driver
+ *
+ * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ * Author(s): Fritz Elfert (elfert@de.ibm.com, felfert@millenux.com)
+             Peter Tiedemann (ptiedem@de.ibm.com)
+ *
+ *
+ * Documentation used:
+ *  - Principles of Operation (IBM doc#: SA22-7201-06)
+ *  - Common IO/-Device Commands and Self Description (IBM doc#: SA22-7204-02)
+ *  - Common IO/-Device Commands and Self Description (IBM doc#: SN22-5535)
+ *  - ESCON Channel-to-Channel Adapter (IBM doc#: SA22-7203-00)
+ *  - ESCON I/O Interface (IBM doc#: SA22-7202-029
+ *
+ * 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, 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.
+ *
+ * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.4 $
+ *
+ */
+
+#ifndef _CTCMAIN_H_
+#define _CTCMAIN_H_
+
+#include <asm/ccwdev.h>
+#include <asm/ccwgroup.h>
+
+#include "ctctty.h"
+#include "fsm.h"
+#include "cu3088.h"
+
+
+/**
+ * CCW commands, used in this driver.
+ */
+#define CCW_CMD_WRITE          0x01
+#define CCW_CMD_READ           0x02
+#define CCW_CMD_SET_EXTENDED   0xc3
+#define CCW_CMD_PREPARE                0xe3
+
+#define CTC_PROTO_S390          0
+#define CTC_PROTO_LINUX         1
+#define CTC_PROTO_LINUX_TTY     2
+#define CTC_PROTO_OS390         3
+#define CTC_PROTO_MAX           3
+
+#define CTC_BUFSIZE_LIMIT       65535
+#define CTC_BUFSIZE_DEFAULT     32768
+
+#define CTC_TIMEOUT_5SEC        5000
+
+#define CTC_INITIAL_BLOCKLEN    2
+
+#define READ                   0
+#define WRITE                  1
+
+#define CTC_ID_SIZE             BUS_ID_SIZE+3
+
+
+struct ctc_profile {
+       unsigned long maxmulti;
+       unsigned long maxcqueue;
+       unsigned long doios_single;
+       unsigned long doios_multi;
+       unsigned long txlen;
+       unsigned long tx_time;
+       struct timespec send_stamp;
+};
+
+/**
+ * Definition of one channel
+ */
+struct channel {
+
+       /**
+        * Pointer to next channel in list.
+        */
+       struct channel *next;
+       char id[CTC_ID_SIZE];
+       struct ccw_device *cdev;
+
+       /**
+        * Type of this channel.
+        * CTC/A or Escon for valid channels.
+        */
+       enum channel_types type;
+
+       /**
+        * Misc. flags. See CHANNEL_FLAGS_... below
+        */
+       __u32 flags;
+
+       /**
+        * The protocol of this channel
+        */
+       __u16 protocol;
+
+       /**
+        * I/O and irq related stuff
+        */
+       struct ccw1 *ccw;
+       struct irb *irb;
+
+       /**
+        * RX/TX buffer size
+        */
+       int max_bufsize;
+
+       /**
+        * Transmit/Receive buffer.
+        */
+       struct sk_buff *trans_skb;
+
+       /**
+        * Universal I/O queue.
+        */
+       struct sk_buff_head io_queue;
+
+       /**
+        * TX queue for collecting skb's during busy.
+        */
+       struct sk_buff_head collect_queue;
+
+       /**
+        * Amount of data in collect_queue.
+        */
+       int collect_len;
+
+       /**
+        * spinlock for collect_queue and collect_len
+        */
+       spinlock_t collect_lock;
+
+       /**
+        * Timer for detecting unresposive
+        * I/O operations.
+        */
+       fsm_timer timer;
+
+       /**
+        * Retry counter for misc. operations.
+        */
+       int retry;
+
+       /**
+        * The finite state machine of this channel
+        */
+       fsm_instance *fsm;
+
+       /**
+        * The corresponding net_device this channel
+        * belongs to.
+        */
+       struct net_device *netdev;
+
+       struct ctc_profile prof;
+
+       unsigned char *trans_skb_data;
+
+       __u16 logflags;
+};
+
+#define CHANNEL_FLAGS_READ            0
+#define CHANNEL_FLAGS_WRITE           1
+#define CHANNEL_FLAGS_INUSE           2
+#define CHANNEL_FLAGS_BUFSIZE_CHANGED 4
+#define CHANNEL_FLAGS_FAILED          8
+#define CHANNEL_FLAGS_WAITIRQ        16
+#define CHANNEL_FLAGS_RWMASK 1
+#define CHANNEL_DIRECTION(f) (f & CHANNEL_FLAGS_RWMASK)
+
+#define LOG_FLAG_ILLEGALPKT  1
+#define LOG_FLAG_ILLEGALSIZE 2
+#define LOG_FLAG_OVERRUN     4
+#define LOG_FLAG_NOMEM       8
+
+#define CTC_LOGLEVEL_INFO     1
+#define CTC_LOGLEVEL_NOTICE   2
+#define CTC_LOGLEVEL_WARN     4
+#define CTC_LOGLEVEL_EMERG    8
+#define CTC_LOGLEVEL_ERR     16
+#define CTC_LOGLEVEL_DEBUG   32
+#define CTC_LOGLEVEL_CRIT    64
+
+#define CTC_LOGLEVEL_DEFAULT \
+(CTC_LOGLEVEL_INFO | CTC_LOGLEVEL_NOTICE | CTC_LOGLEVEL_WARN | CTC_LOGLEVEL_CRIT)
+
+#define CTC_LOGLEVEL_MAX     ((CTC_LOGLEVEL_CRIT<<1)-1)
+
+#define ctc_pr_debug(fmt, arg...) \
+do { if (loglevel & CTC_LOGLEVEL_DEBUG) printk(KERN_DEBUG fmt,##arg); } while (0)
+
+#define ctc_pr_info(fmt, arg...) \
+do { if (loglevel & CTC_LOGLEVEL_INFO) printk(KERN_INFO fmt,##arg); } while (0)
+
+#define ctc_pr_notice(fmt, arg...) \
+do { if (loglevel & CTC_LOGLEVEL_NOTICE) printk(KERN_NOTICE fmt,##arg); } while (0)
+
+#define ctc_pr_warn(fmt, arg...) \
+do { if (loglevel & CTC_LOGLEVEL_WARN) printk(KERN_WARNING fmt,##arg); } while (0)
+
+#define ctc_pr_emerg(fmt, arg...) \
+do { if (loglevel & CTC_LOGLEVEL_EMERG) printk(KERN_EMERG fmt,##arg); } while (0)
+
+#define ctc_pr_err(fmt, arg...) \
+do { if (loglevel & CTC_LOGLEVEL_ERR) printk(KERN_ERR fmt,##arg); } while (0)
+
+#define ctc_pr_crit(fmt, arg...) \
+do { if (loglevel & CTC_LOGLEVEL_CRIT) printk(KERN_CRIT fmt,##arg); } while (0)
+
+struct ctc_priv {
+       struct net_device_stats stats;
+       unsigned long tbusy;
+       /**
+        * The finite state machine of this interface.
+        */
+       fsm_instance *fsm;
+       /**
+        * The protocol of this device
+        */
+       __u16 protocol;
+       /**
+        * Timer for restarting after I/O Errors
+        */
+       fsm_timer               restart_timer;
+
+       int buffer_size;
+
+       struct channel *channel[2];
+};
+
+/**
+ * Definition of our link level header.
+ */
+struct ll_header {
+       __u16 length;
+       __u16 type;
+       __u16 unused;
+};
+#define LL_HEADER_LENGTH (sizeof(struct ll_header))
+
+/**
+ * Compatibility macros for busy handling
+ * of network devices.
+ */
+static __inline__ void
+ctc_clear_busy(struct net_device * dev)
+{
+       clear_bit(0, &(((struct ctc_priv *) dev->priv)->tbusy));
+       if (((struct ctc_priv *)dev->priv)->protocol != CTC_PROTO_LINUX_TTY)
+               netif_wake_queue(dev);
+}
+
+static __inline__ int
+ctc_test_and_set_busy(struct net_device * dev)
+{
+       if (((struct ctc_priv *)dev->priv)->protocol != CTC_PROTO_LINUX_TTY)
+               netif_stop_queue(dev);
+       return test_and_set_bit(0, &((struct ctc_priv *) dev->priv)->tbusy);
+}
+
+#endif
index 9257d60c78330478bca8a05280fda54054ceb9c4..3080393e823db43117d22a6bd73adf7cfdcc6013 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: ctctty.c,v 1.26 2004/08/04 11:06:55 mschwide Exp $
+ * $Id: ctctty.c,v 1.29 2005/04/05 08:50:44 mschwide Exp $
  *
  * CTC / ESCON network driver, tty interface.
  *
@@ -1056,8 +1056,7 @@ ctc_tty_close(struct tty_struct *tty, struct file *filp)
        info->tty = 0;
        tty->closing = 0;
        if (info->blocked_open) {
-               set_current_state(TASK_INTERRUPTIBLE);
-               schedule_timeout(HZ/2);
+               msleep_interruptible(500);
                wake_up_interruptible(&info->open_wait);
        }
        info->flags &= ~(CTC_ASYNC_NORMAL_ACTIVE | CTC_ASYNC_CLOSING);
index 1b0a9f16024c5929f0062972d431fd33088bb1d7..0075894c71db0e09086efd97b55111f0a374bbe0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: cu3088.c,v 1.34 2004/06/15 13:16:27 pavlic Exp $
+ * $Id: cu3088.c,v 1.35 2005/03/30 19:28:52 richtera Exp $
  *
  * CTC / LCS ccw_device driver
  *
@@ -39,6 +39,7 @@ const char *cu3088_type[] = {
        "FICON channel",
        "P390 LCS card",
        "OSA LCS card",
+       "CLAW channel device",
        "unknown channel type",
        "unsupported channel type",
 };
@@ -51,6 +52,7 @@ static struct ccw_device_id cu3088_ids[] = {
        { CCW_DEVICE(0x3088, 0x1e), .driver_info = channel_type_ficon },
        { CCW_DEVICE(0x3088, 0x01), .driver_info = channel_type_p390 },
        { CCW_DEVICE(0x3088, 0x60), .driver_info = channel_type_osa2 },
+       { CCW_DEVICE(0x3088, 0x61), .driver_info = channel_type_claw },
        { /* end of list */ }
 };
 
index 0ec49a8b3adcc5a2e697d01313120e18ad43fc4a..1753661f702a196325968df22cffec4485743f5e 100644 (file)
@@ -23,6 +23,9 @@ enum channel_types {
        /* Device is a OSA2 card */
        channel_type_osa2,
 
+       /* Device is a CLAW channel device */
+       channel_type_claw,
+
        /* Device is a channel, but we don't know
         * anything about it */
        channel_type_unknown,
index 1ac6563ee3e0fd0574f8e79e275130606defed3d..e08e74e16124704b1f7b8bede6092a2d1cab376e 100644 (file)
@@ -1,5 +1,5 @@
 /* 
- * $Id: iucv.c,v 1.43 2005/02/09 14:47:43 braunu Exp $
+ * $Id: iucv.c,v 1.45 2005/04/26 22:59:06 braunu Exp $
  *
  * IUCV network driver
  *
@@ -29,7 +29,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.43 $
+ * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.45 $
  *
  */
 \f
@@ -355,7 +355,7 @@ do { \
 static void
 iucv_banner(void)
 {
-       char vbuf[] = "$Revision: 1.43 $";
+       char vbuf[] = "$Revision: 1.45 $";
        char *version = vbuf;
 
        if ((version = strchr(version, ':'))) {
@@ -2553,12 +2553,12 @@ EXPORT_SYMBOL (iucv_resume);
 #endif
 EXPORT_SYMBOL (iucv_reply_prmmsg);
 EXPORT_SYMBOL (iucv_send);
-#if 0
 EXPORT_SYMBOL (iucv_send2way);
 EXPORT_SYMBOL (iucv_send2way_array);
-EXPORT_SYMBOL (iucv_send_array);
 EXPORT_SYMBOL (iucv_send2way_prmmsg);
 EXPORT_SYMBOL (iucv_send2way_prmmsg_array);
+#if 0
+EXPORT_SYMBOL (iucv_send_array);
 EXPORT_SYMBOL (iucv_send_prmmsg);
 EXPORT_SYMBOL (iucv_setmask);
 #endif
index 0f76e945b9841dadd2ac93b4c627fca18d0e9c84..ab086242d305a490e80f88f518c156d44ba05b01 100644 (file)
@@ -11,7 +11,7 @@
  *                       Frank Pavlic (pavlic@de.ibm.com) and
  *                       Martin Schwidefsky <schwidefsky@de.ibm.com>
  *
- *    $Revision: 1.96 $         $Date: 2004/11/11 13:42:33 $
+ *    $Revision: 1.98 $         $Date: 2005/04/18 13:41:29 $
  *
  * 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
@@ -59,7 +59,7 @@
 /**
  * initialization string for output
  */
-#define VERSION_LCS_C  "$Revision: 1.96 $"
+#define VERSION_LCS_C  "$Revision: 1.98 $"
 
 static char version[] __initdata = "LCS driver ("VERSION_LCS_C "/" VERSION_LCS_H ")";
 static char debug_buffer[255];
@@ -1098,14 +1098,6 @@ lcs_check_multicast_support(struct lcs_card *card)
                PRINT_ERR("Query IPAssist failed. Assuming unsupported!\n");
                return -EOPNOTSUPP;
        }
-       /* Print out supported assists: IPv6 */
-       PRINT_INFO("LCS device %s %s IPv6 support\n", card->dev->name,
-                  (card->ip_assists_supported & LCS_IPASS_IPV6_SUPPORT) ?
-                  "with" : "without");
-       /* Print out supported assist: Multicast */
-       PRINT_INFO("LCS device %s %s Multicast support\n", card->dev->name,
-                  (card->ip_assists_supported & LCS_IPASS_MULTICAST_SUPPORT) ?
-                  "with" : "without");
        if (card->ip_assists_supported & LCS_IPASS_MULTICAST_SUPPORT)
                return 0;
        return -EOPNOTSUPP;
@@ -1160,7 +1152,7 @@ list_modified:
                }
        }
        /* re-insert all entries from the failed_list into ipm_list */
-       list_for_each_entry(ipm, &failed_list, list) {
+       list_for_each_entry_safe(ipm, tmp, &failed_list, list) {
                list_del_init(&ipm->list);
                list_add_tail(&ipm->list, &card->ipm_list);
        }
@@ -1992,7 +1984,7 @@ lcs_open_device(struct net_device *dev)
  * show function for portno called by cat or similar things
  */
 static ssize_t
-lcs_portno_show (struct device *dev, char *buf)
+lcs_portno_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
         struct lcs_card *card;
 
@@ -2008,7 +2000,7 @@ lcs_portno_show (struct device *dev, char *buf)
  * store the value which is piped to file portno
  */
 static ssize_t
-lcs_portno_store (struct device *dev, const char *buf, size_t count)
+lcs_portno_store (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
         struct lcs_card *card;
         int value;
@@ -2029,7 +2021,7 @@ lcs_portno_store (struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(portno, 0644, lcs_portno_show, lcs_portno_store);
 
 static ssize_t
-lcs_type_show(struct device *dev, char *buf)
+lcs_type_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct ccwgroup_device *cgdev;
 
@@ -2043,7 +2035,7 @@ lcs_type_show(struct device *dev, char *buf)
 static DEVICE_ATTR(type, 0444, lcs_type_show, NULL);
 
 static ssize_t
-lcs_timeout_show(struct device *dev, char *buf)
+lcs_timeout_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lcs_card *card;
 
@@ -2053,7 +2045,7 @@ lcs_timeout_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-lcs_timeout_store (struct device *dev, const char *buf, size_t count)
+lcs_timeout_store (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
         struct lcs_card *card;
         int value;
@@ -2198,30 +2190,39 @@ lcs_new_device(struct ccwgroup_device *ccwgdev)
        if (!dev)
                goto out;
        card->dev = dev;
-netdev_out:
        card->dev->priv = card;
        card->dev->open = lcs_open_device;
        card->dev->stop = lcs_stop_device;
        card->dev->hard_start_xmit = lcs_start_xmit;
        card->dev->get_stats = lcs_getstats;
        SET_MODULE_OWNER(dev);
-       if (lcs_register_netdev(ccwgdev) != 0)
-               goto out;
        memcpy(card->dev->dev_addr, card->mac, LCS_MAC_LENGTH);
 #ifdef CONFIG_IP_MULTICAST
        if (!lcs_check_multicast_support(card))
                card->dev->set_multicast_list = lcs_set_multicast_list;
 #endif
-       netif_stop_queue(card->dev);
+netdev_out:
        lcs_set_allowed_threads(card,0xffffffff);
        if (recover_state == DEV_STATE_RECOVER) {
                lcs_set_multicast_list(card->dev);
                card->dev->flags |= IFF_UP;
                netif_wake_queue(card->dev);
                card->state = DEV_STATE_UP;
-       } else
+       } else {
                lcs_stopcard(card);
+       }
 
+       if (lcs_register_netdev(ccwgdev) != 0)
+               goto out;
+
+       /* Print out supported assists: IPv6 */
+       PRINT_INFO("LCS device %s %s IPv6 support\n", card->dev->name,
+                  (card->ip_assists_supported & LCS_IPASS_IPV6_SUPPORT) ?
+                  "with" : "without");
+       /* Print out supported assist: Multicast */
+       PRINT_INFO("LCS device %s %s Multicast support\n", card->dev->name,
+                  (card->ip_assists_supported & LCS_IPASS_MULTICAST_SUPPORT) ?
+                  "with" : "without");
        return 0;
 out:
 
index 16e8e69afb10b2d3395657bb2a0db1f4b298b05f..3fd4fb754b2d4736502235012b41d8c54ab7a444 100644 (file)
@@ -1356,7 +1356,7 @@ netiucv_change_mtu (struct net_device * dev, int new_mtu)
  *****************************************************************************/
 
 static ssize_t
-user_show (struct device *dev, char *buf)
+user_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1365,7 +1365,7 @@ user_show (struct device *dev, char *buf)
 }
 
 static ssize_t
-user_write (struct device *dev, const char *buf, size_t count)
+user_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct netiucv_priv *priv = dev->driver_data;
        struct net_device *ndev = priv->conn->netdev;
@@ -1422,7 +1422,7 @@ user_write (struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(user, 0644, user_show, user_write);
 
 static ssize_t
-buffer_show (struct device *dev, char *buf)
+buffer_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1431,7 +1431,7 @@ buffer_show (struct device *dev, char *buf)
 }
 
 static ssize_t
-buffer_write (struct device *dev, const char *buf, size_t count)
+buffer_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct netiucv_priv *priv = dev->driver_data;
        struct net_device *ndev = priv->conn->netdev;
@@ -1486,7 +1486,7 @@ buffer_write (struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(buffer, 0644, buffer_show, buffer_write);
 
 static ssize_t
-dev_fsm_show (struct device *dev, char *buf)
+dev_fsm_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1497,7 +1497,7 @@ dev_fsm_show (struct device *dev, char *buf)
 static DEVICE_ATTR(device_fsm_state, 0444, dev_fsm_show, NULL);
 
 static ssize_t
-conn_fsm_show (struct device *dev, char *buf)
+conn_fsm_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1508,7 +1508,7 @@ conn_fsm_show (struct device *dev, char *buf)
 static DEVICE_ATTR(connection_fsm_state, 0444, conn_fsm_show, NULL);
 
 static ssize_t
-maxmulti_show (struct device *dev, char *buf)
+maxmulti_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1517,7 +1517,7 @@ maxmulti_show (struct device *dev, char *buf)
 }
 
 static ssize_t
-maxmulti_write (struct device *dev, const char *buf, size_t count)
+maxmulti_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1529,7 +1529,7 @@ maxmulti_write (struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(max_tx_buffer_used, 0644, maxmulti_show, maxmulti_write);
 
 static ssize_t
-maxcq_show (struct device *dev, char *buf)
+maxcq_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1538,7 +1538,7 @@ maxcq_show (struct device *dev, char *buf)
 }
 
 static ssize_t
-maxcq_write (struct device *dev, const char *buf, size_t count)
+maxcq_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct netiucv_priv *priv = dev->driver_data;
        
@@ -1550,7 +1550,7 @@ maxcq_write (struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(max_chained_skbs, 0644, maxcq_show, maxcq_write);
 
 static ssize_t
-sdoio_show (struct device *dev, char *buf)
+sdoio_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1559,7 +1559,7 @@ sdoio_show (struct device *dev, char *buf)
 }
 
 static ssize_t
-sdoio_write (struct device *dev, const char *buf, size_t count)
+sdoio_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct netiucv_priv *priv = dev->driver_data;
        
@@ -1571,7 +1571,7 @@ sdoio_write (struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(tx_single_write_ops, 0644, sdoio_show, sdoio_write);
 
 static ssize_t
-mdoio_show (struct device *dev, char *buf)
+mdoio_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1580,7 +1580,7 @@ mdoio_show (struct device *dev, char *buf)
 }
 
 static ssize_t
-mdoio_write (struct device *dev, const char *buf, size_t count)
+mdoio_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct netiucv_priv *priv = dev->driver_data;
        
@@ -1592,7 +1592,7 @@ mdoio_write (struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(tx_multi_write_ops, 0644, mdoio_show, mdoio_write);
 
 static ssize_t
-txlen_show (struct device *dev, char *buf)
+txlen_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1601,7 +1601,7 @@ txlen_show (struct device *dev, char *buf)
 }
 
 static ssize_t
-txlen_write (struct device *dev, const char *buf, size_t count)
+txlen_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct netiucv_priv *priv = dev->driver_data;
        
@@ -1613,7 +1613,7 @@ txlen_write (struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(netto_bytes, 0644, txlen_show, txlen_write);
 
 static ssize_t
-txtime_show (struct device *dev, char *buf)
+txtime_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1622,7 +1622,7 @@ txtime_show (struct device *dev, char *buf)
 }
 
 static ssize_t
-txtime_write (struct device *dev, const char *buf, size_t count)
+txtime_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct netiucv_priv *priv = dev->driver_data;
        
@@ -1634,7 +1634,7 @@ txtime_write (struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(max_tx_io_time, 0644, txtime_show, txtime_write);
 
 static ssize_t
-txpend_show (struct device *dev, char *buf)
+txpend_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1643,7 +1643,7 @@ txpend_show (struct device *dev, char *buf)
 }
 
 static ssize_t
-txpend_write (struct device *dev, const char *buf, size_t count)
+txpend_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1655,7 +1655,7 @@ txpend_write (struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(tx_pending, 0644, txpend_show, txpend_write);
 
 static ssize_t
-txmpnd_show (struct device *dev, char *buf)
+txmpnd_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
@@ -1664,7 +1664,7 @@ txmpnd_show (struct device *dev, char *buf)
 }
 
 static ssize_t
-txmpnd_write (struct device *dev, const char *buf, size_t count)
+txmpnd_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct netiucv_priv *priv = dev->driver_data;
 
index a341041a6cf77358955232fae17fa61ef09b4107..a755b57db46b359c9cb632919fc71ef7fd9c52fd 100644 (file)
@@ -24,7 +24,7 @@
 
 #include "qeth_mpc.h"
 
-#define VERSION_QETH_H                 "$Revision: 1.135 $"
+#define VERSION_QETH_H                 "$Revision: 1.139 $"
 
 #ifdef CONFIG_QETH_IPV6
 #define QETH_VERSION_IPV6      ":IPv6"
@@ -288,7 +288,8 @@ qeth_is_ipa_enabled(struct qeth_ipa_info *ipa, enum qeth_ipa_funcs func)
 #define QETH_TX_TIMEOUT                100 * HZ
 #define QETH_HEADER_SIZE       32
 #define MAX_PORTNO             15
-#define QETH_FAKE_LL_LEN       ETH_HLEN
+#define QETH_FAKE_LL_LEN_ETH   ETH_HLEN
+#define QETH_FAKE_LL_LEN_TR    (sizeof(struct trh_hdr)-TR_MAXRIFLEN+sizeof(struct trllc))
 #define QETH_FAKE_LL_V6_ADDR_POS 24
 
 /*IPv6 address autoconfiguration stuff*/
@@ -369,6 +370,25 @@ struct qeth_hdr {
        } hdr;
 } __attribute__ ((packed));
 
+/*TCP Segmentation Offload header*/
+struct qeth_hdr_ext_tso {
+        __u16 hdr_tot_len;
+        __u8  imb_hdr_no;
+        __u8  reserved;
+        __u8  hdr_type;
+        __u8  hdr_version;
+        __u16 hdr_len;
+        __u32 payload_len;
+        __u16 mss;
+        __u16 dg_hdr_len;
+        __u8  padding[16];
+} __attribute__ ((packed));
+
+struct qeth_hdr_tso {
+        struct qeth_hdr hdr;   /*hdr->hdr.l3.xxx*/
+       struct qeth_hdr_ext_tso ext;
+} __attribute__ ((packed));
+
 
 /* flags for qeth_hdr.flags */
 #define QETH_HDR_PASSTHRU 0x10
@@ -866,6 +886,7 @@ qeth_push_skb(struct qeth_card *card, struct sk_buff **skb, int size)
         return hdr;
 }
 
+
 inline static int
 qeth_get_hlen(__u8 link_type)
 {
@@ -873,19 +894,19 @@ qeth_get_hlen(__u8 link_type)
        switch (link_type) {
        case QETH_LINK_TYPE_HSTR:
        case QETH_LINK_TYPE_LANE_TR:
-               return sizeof(struct qeth_hdr) + TR_HLEN;
+               return sizeof(struct qeth_hdr_tso) + TR_HLEN;
        default:
 #ifdef CONFIG_QETH_VLAN
-               return sizeof(struct qeth_hdr) + VLAN_ETH_HLEN;
+               return sizeof(struct qeth_hdr_tso) + VLAN_ETH_HLEN;
 #else
-               return sizeof(struct qeth_hdr) + ETH_HLEN;
+               return sizeof(struct qeth_hdr_tso) + ETH_HLEN;
 #endif
        }
 #else  /* CONFIG_QETH_IPV6 */
 #ifdef CONFIG_QETH_VLAN
-       return sizeof(struct qeth_hdr) + VLAN_HLEN;
+       return sizeof(struct qeth_hdr_tso) + VLAN_HLEN;
 #else
-       return sizeof(struct qeth_hdr);
+       return sizeof(struct qeth_hdr_tso);
 #endif
 #endif /* CONFIG_QETH_IPV6 */
 }
index 7ee1c06ed68a841af7ac49eeaa1d616681845b67..f94f1f25eec60a8e57ba9d311a90c47b2df58594 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_eddp.c ($Revision: 1.11 $)
+ * linux/drivers/s390/net/qeth_eddp.c ($Revision: 1.13 $)
  *
  * Enhanced Device Driver Packing (EDDP) support for the qeth driver.
  *
@@ -8,7 +8,7 @@
  *
  *    Author(s): Thomas Spatzier <tspat@de.ibm.com>
  *
- *    $Revision: 1.11 $         $Date: 2005/03/24 09:04:18 $
+ *    $Revision: 1.13 $         $Date: 2005/05/04 20:19:18 $
  *
  */
 #include <linux/config.h>
@@ -85,7 +85,7 @@ void
 qeth_eddp_buf_release_contexts(struct qeth_qdio_out_buffer *buf)
 {
        struct qeth_eddp_context_reference *ref;
-
+       
        QETH_DBF_TEXT(trace, 6, "eddprctx");
        while (!list_empty(&buf->ctx_list)){
                ref = list_entry(buf->ctx_list.next,
@@ -139,7 +139,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue,
                                           "buffer!\n");
                                goto out;
                        }
-               }
+               }               
                /* check if the whole next skb fits into current buffer */
                if ((QETH_MAX_BUFFER_ELEMENTS(queue->card) -
                                        buf->next_element_to_fill)
@@ -152,7 +152,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue,
                         * and increment ctx's refcnt */
                        must_refcnt = 1;
                        continue;
-               }
+               }       
                if (must_refcnt){
                        must_refcnt = 0;
                        if (qeth_eddp_buf_ref_context(buf, ctx)){
@@ -202,40 +202,29 @@ out:
        return flush_cnt;
 }
 
-static inline int
-qeth_get_skb_data_len(struct sk_buff *skb)
-{
-       int len = skb->len;
-       int i;
-
-       for (i = 0; i < skb_shinfo(skb)->nr_frags; ++i)
-               len -= skb_shinfo(skb)->frags[i].size;
-       return len;
-}
-
 static inline void
 qeth_eddp_create_segment_hdrs(struct qeth_eddp_context *ctx,
-                             struct qeth_eddp_data *eddp)
+                             struct qeth_eddp_data *eddp, int data_len)
 {
        u8 *page;
        int page_remainder;
        int page_offset;
-       int hdr_len;
+       int pkt_len;
        struct qeth_eddp_element *element;
 
        QETH_DBF_TEXT(trace, 5, "eddpcrsh");
        page = ctx->pages[ctx->offset >> PAGE_SHIFT];
        page_offset = ctx->offset % PAGE_SIZE;
        element = &ctx->elements[ctx->num_elements];
-       hdr_len = eddp->nhl + eddp->thl;
+       pkt_len = eddp->nhl + eddp->thl + data_len;
        /* FIXME: layer2 and VLAN !!! */
        if (eddp->qh.hdr.l2.id == QETH_HEADER_TYPE_LAYER2)
-               hdr_len += ETH_HLEN;
+               pkt_len += ETH_HLEN;
        if (eddp->mac.h_proto == __constant_htons(ETH_P_8021Q))
-               hdr_len += VLAN_HLEN;
-       /* does complete header fit in current page ? */
+               pkt_len += VLAN_HLEN;
+       /* does complete packet fit in current page ? */
        page_remainder = PAGE_SIZE - page_offset;
-       if (page_remainder < (sizeof(struct qeth_hdr) + hdr_len)){
+       if (page_remainder < (sizeof(struct qeth_hdr) + pkt_len)){
                /* no -> go to start of next page */
                ctx->offset += page_remainder;
                page = ctx->pages[ctx->offset >> PAGE_SHIFT];
@@ -281,7 +270,7 @@ qeth_eddp_copy_data_tcp(char *dst, struct qeth_eddp_data *eddp, int len,
        int left_in_frag;
        int copy_len;
        u8 *src;
-
+       
        QETH_DBF_TEXT(trace, 5, "eddpcdtc");
        if (skb_shinfo(eddp->skb)->nr_frags == 0) {
                memcpy(dst, eddp->skb->data + eddp->skb_offset, len);
@@ -292,7 +281,7 @@ qeth_eddp_copy_data_tcp(char *dst, struct qeth_eddp_data *eddp, int len,
                while (len > 0) {
                        if (eddp->frag < 0) {
                                /* we're in skb->data */
-                               left_in_frag = qeth_get_skb_data_len(eddp->skb)
+                               left_in_frag = (eddp->skb->len - eddp->skb->data_len)
                                                - eddp->skb_offset;
                                src = eddp->skb->data + eddp->skb_offset;
                        } else {
@@ -424,7 +413,7 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
        struct tcphdr *tcph;
        int data_len;
        u32 hcsum;
-
+       
        QETH_DBF_TEXT(trace, 5, "eddpftcp");
        eddp->skb_offset = sizeof(struct qeth_hdr) + eddp->nhl + eddp->thl;
        tcph = eddp->skb->h.th;
@@ -464,7 +453,7 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
                else
                        hcsum = qeth_eddp_check_tcp6_hdr(eddp, data_len);
                /* fill the next segment into the context */
-               qeth_eddp_create_segment_hdrs(ctx, eddp);
+               qeth_eddp_create_segment_hdrs(ctx, eddp, data_len);
                qeth_eddp_create_segment_data_tcp(ctx, eddp, data_len, hcsum);
                if (eddp->skb_offset >= eddp->skb->len)
                        break;
@@ -474,13 +463,13 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
                eddp->th.tcp.h.seq += data_len;
        }
 }
-
+                          
 static inline int
 qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
                           struct sk_buff *skb, struct qeth_hdr *qhdr)
 {
        struct qeth_eddp_data *eddp = NULL;
-
+       
        QETH_DBF_TEXT(trace, 5, "eddpficx");
        /* create our segmentation headers and copy original headers */
        if (skb->protocol == ETH_P_IP)
@@ -520,7 +509,7 @@ qeth_eddp_calc_num_pages(struct qeth_eddp_context *ctx, struct sk_buff *skb,
                         int hdr_len)
 {
        int skbs_per_page;
-
+       
        QETH_DBF_TEXT(trace, 5, "eddpcanp");
        /* can we put multiple skbs in one page? */
        skbs_per_page = PAGE_SIZE / (skb_shinfo(skb)->tso_size + hdr_len);
@@ -600,7 +589,7 @@ qeth_eddp_create_context_tcp(struct qeth_card *card, struct sk_buff *skb,
                             struct qeth_hdr *qhdr)
 {
        struct qeth_eddp_context *ctx = NULL;
-
+       
        QETH_DBF_TEXT(trace, 5, "creddpct");
        if (skb->protocol == ETH_P_IP)
                ctx = qeth_eddp_create_context_generic(card, skb,
index 607b92542df6c3924cc5d7f8740928776661eb34..208127a5033ae707ffdb1168d2c0f7da979cab4d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_main.c ($Revision: 1.206 $)
+ * linux/drivers/s390/net/qeth_main.c ($Revision: 1.214 $)
  *
  * Linux on zSeries OSA Express and HiperSockets support
  *
@@ -12,7 +12,7 @@
  *                       Frank Pavlic (pavlic@de.ibm.com) and
  *                       Thomas Spatzier <tspat@de.ibm.com>
  *
- *    $Revision: 1.206 $        $Date: 2005/03/24 09:04:18 $
+ *    $Revision: 1.214 $        $Date: 2005/05/04 20:19:18 $
  *
  * 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
@@ -80,7 +80,7 @@ qeth_eyecatcher(void)
 #include "qeth_eddp.h"
 #include "qeth_tso.h"
 
-#define VERSION_QETH_C "$Revision: 1.206 $"
+#define VERSION_QETH_C "$Revision: 1.214 $"
 static const char *version = "qeth S/390 OSA-Express driver";
 
 /**
@@ -158,6 +158,9 @@ qeth_irq_tasklet(unsigned long);
 static int
 qeth_set_online(struct ccwgroup_device *);
 
+static int
+__qeth_set_online(struct ccwgroup_device *gdev, int recovery_mode);
+
 static struct qeth_ipaddr *
 qeth_get_addr_buffer(enum qeth_prot_versions);
 
@@ -510,10 +513,10 @@ qeth_irq_tasklet(unsigned long data)
        wake_up(&card->wait_q);
 }
 
-static int qeth_stop_card(struct qeth_card *);
+static int qeth_stop_card(struct qeth_card *, int);
 
 static int
-qeth_set_offline(struct ccwgroup_device *cgdev)
+__qeth_set_offline(struct ccwgroup_device *cgdev, int recovery_mode)
 {
        struct qeth_card *card = (struct qeth_card *) cgdev->dev.driver_data;
        int rc = 0;
@@ -523,7 +526,7 @@ qeth_set_offline(struct ccwgroup_device *cgdev)
        QETH_DBF_HEX(setup, 3, &card, sizeof(void *));
 
        recover_flag = card->state;
-       if (qeth_stop_card(card) == -ERESTARTSYS){
+       if (qeth_stop_card(card, recovery_mode) == -ERESTARTSYS){
                PRINT_WARN("Stopping card %s interrupted by user!\n",
                           CARD_BUS_ID(card));
                return -ERESTARTSYS;
@@ -539,6 +542,12 @@ qeth_set_offline(struct ccwgroup_device *cgdev)
        return 0;
 }
 
+static int
+qeth_set_offline(struct ccwgroup_device *cgdev)
+{
+       return  __qeth_set_offline(cgdev, 0);
+}
+
 static int
 qeth_wait_for_threads(struct qeth_card *card, unsigned long threads);
 
@@ -953,8 +962,8 @@ qeth_recover(void *ptr)
        PRINT_WARN("Recovery of device %s started ...\n",
                   CARD_BUS_ID(card));
        card->use_hard_stop = 1;
-       qeth_set_offline(card->gdev);
-       rc = qeth_set_online(card->gdev);
+       __qeth_set_offline(card->gdev,1);
+       rc = __qeth_set_online(card->gdev,1);
        if (!rc)
                PRINT_INFO("Device %s successfully recovered!\n",
                           CARD_BUS_ID(card));
@@ -2152,9 +2161,15 @@ qeth_get_next_skb(struct qeth_card *card, struct qdio_buffer *buffer,
        if (!skb_len)
                return NULL;
        if (card->options.fake_ll){
-               if (!(skb = qeth_get_skb(skb_len + QETH_FAKE_LL_LEN)))
-                       goto no_mem;
-               skb_pull(skb, QETH_FAKE_LL_LEN);
+               if(card->dev->type == ARPHRD_IEEE802_TR){
+                       if (!(skb = qeth_get_skb(skb_len+QETH_FAKE_LL_LEN_TR)))
+                               goto no_mem;
+                       skb_reserve(skb,QETH_FAKE_LL_LEN_TR);
+               } else {
+                       if (!(skb = qeth_get_skb(skb_len+QETH_FAKE_LL_LEN_ETH)))
+                               goto no_mem;
+                       skb_reserve(skb,QETH_FAKE_LL_LEN_ETH);
+               }
        } else if (!(skb = qeth_get_skb(skb_len)))
                goto no_mem;
        data_ptr = element->addr + offset;
@@ -2229,14 +2244,68 @@ qeth_type_trans(struct sk_buff *skb, struct net_device *dev)
 }
 
 static inline void
-qeth_rebuild_skb_fake_ll(struct qeth_card *card, struct sk_buff *skb,
+qeth_rebuild_skb_fake_ll_tr(struct qeth_card *card, struct sk_buff *skb,
+                        struct qeth_hdr *hdr)
+{
+       struct trh_hdr *fake_hdr;
+       struct trllc *fake_llc;
+       struct iphdr *ip_hdr;
+
+       QETH_DBF_TEXT(trace,5,"skbfktr");
+       skb->mac.raw = skb->data - QETH_FAKE_LL_LEN_TR;
+       /* this is a fake ethernet header */
+       fake_hdr = (struct trh_hdr *) skb->mac.raw;
+
+       /* the destination MAC address */
+       switch (skb->pkt_type){
+       case PACKET_MULTICAST:
+               switch (skb->protocol){
+#ifdef CONFIG_QETH_IPV6
+               case __constant_htons(ETH_P_IPV6):
+                       ndisc_mc_map((struct in6_addr *)
+                                    skb->data + QETH_FAKE_LL_V6_ADDR_POS,
+                                    fake_hdr->daddr, card->dev, 0);
+                       break;
+#endif /* CONFIG_QETH_IPV6 */
+               case __constant_htons(ETH_P_IP):
+                       ip_hdr = (struct iphdr *)skb->data;
+                       ip_tr_mc_map(ip_hdr->daddr, fake_hdr->daddr);
+                       break;
+               default:
+                       memcpy(fake_hdr->daddr, card->dev->dev_addr, TR_ALEN);
+               }
+               break;
+       case PACKET_BROADCAST:
+               memset(fake_hdr->daddr, 0xff, TR_ALEN);
+               break;
+       default:
+               memcpy(fake_hdr->daddr, card->dev->dev_addr, TR_ALEN);
+       }
+       /* the source MAC address */
+       if (hdr->hdr.l3.ext_flags & QETH_HDR_EXT_SRC_MAC_ADDR)
+               memcpy(fake_hdr->saddr, &hdr->hdr.l3.dest_addr[2], TR_ALEN);
+       else
+               memset(fake_hdr->saddr, 0, TR_ALEN);
+       fake_hdr->rcf=0;
+       fake_llc = (struct trllc*)&(fake_hdr->rcf);
+       fake_llc->dsap = EXTENDED_SAP;
+       fake_llc->ssap = EXTENDED_SAP;
+       fake_llc->llc  = UI_CMD;
+       fake_llc->protid[0] = 0;
+       fake_llc->protid[1] = 0;
+       fake_llc->protid[2] = 0;
+       fake_llc->ethertype = ETH_P_IP;
+}
+
+static inline void
+qeth_rebuild_skb_fake_ll_eth(struct qeth_card *card, struct sk_buff *skb,
                         struct qeth_hdr *hdr)
 {
        struct ethhdr *fake_hdr;
        struct iphdr *ip_hdr;
 
-       QETH_DBF_TEXT(trace,5,"skbfake");
-       skb->mac.raw = skb->data - QETH_FAKE_LL_LEN;
+       QETH_DBF_TEXT(trace,5,"skbfketh");
+       skb->mac.raw = skb->data - QETH_FAKE_LL_LEN_ETH;
        /* this is a fake ethernet header */
        fake_hdr = (struct ethhdr *) skb->mac.raw;
 
@@ -2253,10 +2322,7 @@ qeth_rebuild_skb_fake_ll(struct qeth_card *card, struct sk_buff *skb,
 #endif /* CONFIG_QETH_IPV6 */
                case __constant_htons(ETH_P_IP):
                        ip_hdr = (struct iphdr *)skb->data;
-                       if (card->dev->type == ARPHRD_IEEE802_TR)
-                               ip_tr_mc_map(ip_hdr->daddr, fake_hdr->h_dest);
-                       else
-                               ip_eth_mc_map(ip_hdr->daddr, fake_hdr->h_dest);
+                       ip_eth_mc_map(ip_hdr->daddr, fake_hdr->h_dest);
                        break;
                default:
                        memcpy(fake_hdr->h_dest, card->dev->dev_addr, ETH_ALEN);
@@ -2277,6 +2343,16 @@ qeth_rebuild_skb_fake_ll(struct qeth_card *card, struct sk_buff *skb,
        fake_hdr->h_proto = skb->protocol;
 }
 
+static inline void
+qeth_rebuild_skb_fake_ll(struct qeth_card *card, struct sk_buff *skb,
+                       struct qeth_hdr *hdr)
+{
+       if (card->dev->type == ARPHRD_IEEE802_TR)
+               qeth_rebuild_skb_fake_ll_tr(card, skb, hdr);
+       else
+               qeth_rebuild_skb_fake_ll_eth(card, skb, hdr);
+}
+
 static inline void
 qeth_rebuild_skb_vlan(struct qeth_card *card, struct sk_buff *skb,
                      struct qeth_hdr *hdr)
@@ -3440,16 +3516,25 @@ qeth_fake_header(struct sk_buff *skb, struct net_device *dev,
                     unsigned short type, void *daddr, void *saddr,
                     unsigned len)
 {
-       struct ethhdr *hdr;
+       if(dev->type == ARPHRD_IEEE802_TR){
+               struct trh_hdr *hdr;
+               hdr = (struct trh_hdr *)skb_push(skb, QETH_FAKE_LL_LEN_TR);
+               memcpy(hdr->saddr, dev->dev_addr, TR_ALEN);
+               memcpy(hdr->daddr, "FAKELL", TR_ALEN);
+               return QETH_FAKE_LL_LEN_TR;
+
+       } else {
+               struct ethhdr *hdr;
+               hdr = (struct ethhdr *)skb_push(skb, QETH_FAKE_LL_LEN_ETH);
+               memcpy(hdr->h_source, dev->dev_addr, ETH_ALEN);
+               memcpy(hdr->h_dest, "FAKELL", ETH_ALEN);
+               if (type != ETH_P_802_3)
+                       hdr->h_proto = htons(type);
+               else
+                       hdr->h_proto = htons(len);
+               return QETH_FAKE_LL_LEN_ETH;
 
-        hdr = (struct ethhdr *)skb_push(skb, QETH_FAKE_LL_LEN);
-       memcpy(hdr->h_source, dev->dev_addr, ETH_ALEN);
-        memcpy(hdr->h_dest, "FAKELL", ETH_ALEN);
-        if (type != ETH_P_802_3)
-                hdr->h_proto = htons(type);
-        else
-                hdr->h_proto = htons(len);
-       return QETH_FAKE_LL_LEN;
+       }
 }
 
 static inline int
@@ -3710,16 +3795,12 @@ static inline int
 qeth_prepare_skb(struct qeth_card *card, struct sk_buff **skb,
                 struct qeth_hdr **hdr, int ipv)
 {
-       int rc = 0;
 #ifdef CONFIG_QETH_VLAN
        u16 *tag;
 #endif
 
        QETH_DBF_TEXT(trace, 6, "prepskb");
 
-       rc = qeth_realloc_headroom(card, skb, sizeof(struct qeth_hdr));
-       if (rc)
-               return rc;
 #ifdef CONFIG_QETH_VLAN
        if (card->vlangrp && vlan_tx_tag_present(*skb) &&
            ((ipv == 6) || card->options.layer2) ) {
@@ -3882,9 +3963,15 @@ qeth_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
                        memcpy(hdr->hdr.l3.dest_addr, &skb->nh.ipv6h->daddr, 16);
                }
        } else { /* passthrough */
-               if (!memcmp(skb->data + sizeof(struct qeth_hdr),
+                if((skb->dev->type == ARPHRD_IEEE802_TR) &&
+                   !memcmp(skb->data + sizeof(struct qeth_hdr) + 
+                   sizeof(__u16), skb->dev->broadcast, 6)) {
+                       hdr->hdr.l3.flags = QETH_CAST_BROADCAST |
+                                               QETH_HDR_PASSTHRU;
+               } else if (!memcmp(skb->data + sizeof(struct qeth_hdr),
                            skb->dev->broadcast, 6)) {   /* broadcast? */
-                       hdr->hdr.l3.flags = QETH_CAST_BROADCAST | QETH_HDR_PASSTHRU;
+                       hdr->hdr.l3.flags = QETH_CAST_BROADCAST |
+                                               QETH_HDR_PASSTHRU;
                } else {
                        hdr->hdr.l3.flags = (cast_type == RTN_MULTICAST) ?
                                QETH_CAST_MULTICAST | QETH_HDR_PASSTHRU :
@@ -3893,68 +3980,30 @@ qeth_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
        }
 }
 
-static inline void
-__qeth_fill_buffer_frag(struct sk_buff *skb, struct qdio_buffer *buffer,
-                       int *next_element_to_fill)
-{
-       int length = skb->len;
-       struct skb_frag_struct *frag;
-       int fragno;
-       unsigned long addr;
-       int element;
-       int first_lap = 1;
-
-       fragno = skb_shinfo(skb)->nr_frags; /* start with last frag */
-       element = *next_element_to_fill + fragno;
-       while (length > 0) {
-               if (fragno > 0) {
-                       frag = &skb_shinfo(skb)->frags[fragno - 1];
-                       addr = (page_to_pfn(frag->page) << PAGE_SHIFT) +
-                               frag->page_offset;
-                       buffer->element[element].addr = (char *)addr;
-                       buffer->element[element].length = frag->size;
-                       length -= frag->size;
-                       if (first_lap)
-                               buffer->element[element].flags =
-                                   SBAL_FLAGS_LAST_FRAG;
-                       else
-                               buffer->element[element].flags =
-                                   SBAL_FLAGS_MIDDLE_FRAG;
-               } else {
-                       buffer->element[element].addr = skb->data;
-                       buffer->element[element].length = length;
-                       length = 0;
-                       buffer->element[element].flags =
-                               SBAL_FLAGS_FIRST_FRAG;
-               }
-               element--;
-               fragno--;
-               first_lap = 0;
-       }
-       *next_element_to_fill += skb_shinfo(skb)->nr_frags + 1;
-}
-
 static inline void
 __qeth_fill_buffer(struct sk_buff *skb, struct qdio_buffer *buffer,
-                  int *next_element_to_fill)
+                  int is_tso, int *next_element_to_fill)
 {
        int length = skb->len;
        int length_here;
        int element;
        char *data;
-       int first_lap = 1;
+       int first_lap ;
 
        element = *next_element_to_fill;
        data = skb->data;
+       first_lap = (is_tso == 0 ? 1 : 0);
+
        while (length > 0) {
                /* length_here is the remaining amount of data in this page */
                length_here = PAGE_SIZE - ((unsigned long) data % PAGE_SIZE);
                if (length < length_here)
                        length_here = length;
+
                buffer->element[element].addr = data;
                buffer->element[element].length = length_here;
                length -= length_here;
-               if (!length){
+               if (!length) {
                        if (first_lap)
                                buffer->element[element].flags = 0;
                        else
@@ -3981,17 +4030,35 @@ qeth_fill_buffer(struct qeth_qdio_out_q *queue,
                 struct sk_buff *skb)
 {
        struct qdio_buffer *buffer;
-       int flush_cnt = 0;
+       struct qeth_hdr_tso *hdr;
+       int flush_cnt = 0, hdr_len, large_send = 0;
 
        QETH_DBF_TEXT(trace, 6, "qdfillbf");
+
        buffer = buf->buffer;
        atomic_inc(&skb->users);
        skb_queue_tail(&buf->skb_list, skb);
+
+       hdr  = (struct qeth_hdr_tso *) skb->data;
+       /*check first on TSO ....*/
+       if (hdr->hdr.hdr.l3.id == QETH_HEADER_TYPE_TSO) {
+               int element = buf->next_element_to_fill;
+
+               hdr_len = sizeof(struct qeth_hdr_tso) + hdr->ext.dg_hdr_len;
+               /*fill first buffer entry only with header information */
+               buffer->element[element].addr = skb->data;
+               buffer->element[element].length = hdr_len;
+               buffer->element[element].flags = SBAL_FLAGS_FIRST_FRAG;
+               buf->next_element_to_fill++;
+               skb->data += hdr_len;
+               skb->len  -= hdr_len;
+               large_send = 1;
+       }
        if (skb_shinfo(skb)->nr_frags == 0)
-               __qeth_fill_buffer(skb, buffer,
+               __qeth_fill_buffer(skb, buffer, large_send,
                                   (int *)&buf->next_element_to_fill);
        else
-               __qeth_fill_buffer_frag(skb, buffer,
+               __qeth_fill_buffer_frag(skb, buffer, large_send,
                                        (int *)&buf->next_element_to_fill);
 
        if (!queue->do_pack) {
@@ -4183,6 +4250,25 @@ out:
        return rc;
 }
 
+static inline int
+qeth_get_elements_no(struct qeth_card *card, void *hdr, struct sk_buff *skb)
+{
+       int elements_needed = 0;
+
+        if (skb_shinfo(skb)->nr_frags > 0) {
+                elements_needed = (skb_shinfo(skb)->nr_frags + 1);
+       }
+        if (elements_needed == 0 )
+                elements_needed = 1 + (((((unsigned long) hdr) % PAGE_SIZE)
+                                        + skb->len) >> PAGE_SHIFT);
+        if (elements_needed > QETH_MAX_BUFFER_ELEMENTS(card)){
+                PRINT_ERR("qeth_do_send_packet: invalid size of "
+                          "IP packet. Discarded.");
+                return 0;
+        }
+        return elements_needed;
+}
+
 static inline int
 qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
 {
@@ -4205,7 +4291,11 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
                                dev_kfree_skb_irq(skb);
                                return 0;
                        }
-                       skb_pull(skb, QETH_FAKE_LL_LEN);
+                       if(card->dev->type == ARPHRD_IEEE802_TR){
+                               skb_pull(skb, QETH_FAKE_LL_LEN_TR);
+                       } else {
+                               skb_pull(skb, QETH_FAKE_LL_LEN_ETH);
+                       }
                }
        }
        cast_type = qeth_get_cast_type(card, skb);
@@ -4221,19 +4311,25 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
        if (skb_shinfo(skb)->tso_size)
                large_send = card->options.large_send;
 
-       if ((rc = qeth_prepare_skb(card, &skb, &hdr, ipv))){
-               QETH_DBF_TEXT_(trace, 4, "pskbe%d", rc);
-               return rc;
-       }
        /*are we able to do TSO ? If so ,prepare and send it from here */
        if ((large_send == QETH_LARGE_SEND_TSO) &&
            (cast_type == RTN_UNSPEC)) {
-               rc = qeth_tso_send_packet(card, skb, queue,
-                                         ipv, cast_type);
-               goto do_statistics;
+               rc = qeth_tso_prepare_packet(card, skb, ipv, cast_type);
+               if (rc) {
+                       card->stats.tx_dropped++;
+                       card->stats.tx_errors++;
+                       dev_kfree_skb_any(skb);
+                       return NETDEV_TX_OK;
+               } 
+               elements_needed++;
+       } else {
+               if ((rc = qeth_prepare_skb(card, &skb, &hdr, ipv))) {
+                       QETH_DBF_TEXT_(trace, 4, "pskbe%d", rc);
+                       return rc;
+               }
+               qeth_fill_header(card, hdr, skb, ipv, cast_type);
        }
 
-       qeth_fill_header(card, hdr, skb, ipv, cast_type);
        if (large_send == QETH_LARGE_SEND_EDDP) {
                ctx = qeth_eddp_create_context(card, skb, hdr);
                if (ctx == NULL) {
@@ -4241,7 +4337,7 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
                        return -EINVAL;
                }
        } else {
-               elements_needed = qeth_get_elements_no(card,(void*) hdr, skb);
+               elements_needed += qeth_get_elements_no(card,(void*) hdr, skb);
                if (!elements_needed)
                        return -EINVAL;
        }
@@ -4252,12 +4348,12 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
        else
                rc = qeth_do_send_packet_fast(card, queue, skb, hdr,
                                              elements_needed, ctx);
-do_statistics:
        if (!rc){
                card->stats.tx_packets++;
                card->stats.tx_bytes += skb->len;
 #ifdef CONFIG_QETH_PERF_STATS
-               if (skb_shinfo(skb)->tso_size) {
+               if (skb_shinfo(skb)->tso_size &&
+                  !(large_send == QETH_LARGE_SEND_NO)) {
                        card->perf_stats.large_send_bytes += skb->len;
                        card->perf_stats.large_send_cnt++;
                }
@@ -7154,7 +7250,7 @@ qeth_wait_for_threads(struct qeth_card *card, unsigned long threads)
 }
 
 static int
-qeth_stop_card(struct qeth_card *card)
+qeth_stop_card(struct qeth_card *card, int recovery_mode)
 {
        int rc = 0;
 
@@ -7167,9 +7263,13 @@ qeth_stop_card(struct qeth_card *card)
        if (card->read.state == CH_STATE_UP &&
            card->write.state == CH_STATE_UP &&
            (card->state == CARD_STATE_UP)) {
-               rtnl_lock();
-               dev_close(card->dev);
-               rtnl_unlock();
+               if(recovery_mode) {
+                       qeth_stop(card->dev);
+               } else {
+                       rtnl_lock();
+                       dev_close(card->dev);
+                       rtnl_unlock();
+               }
                if (!card->use_hard_stop) {
                        __u8 *mac = &card->dev->dev_addr[0];
                        rc = qeth_layer2_send_delmac(card, mac);
@@ -7341,13 +7441,17 @@ qeth_register_netdev(struct qeth_card *card)
 }
 
 static void
-qeth_start_again(struct qeth_card *card)
+qeth_start_again(struct qeth_card *card, int recovery_mode)
 {
        QETH_DBF_TEXT(setup ,2, "startag");
 
-       rtnl_lock();
-       dev_open(card->dev);
-       rtnl_unlock();
+       if(recovery_mode) {
+               qeth_open(card->dev);
+       } else {
+               rtnl_lock();
+               dev_open(card->dev);
+               rtnl_unlock();
+       }
        /* this also sets saved unicast addresses */
        qeth_set_multicast_list(card->dev);
 }
@@ -7404,7 +7508,7 @@ static void qeth_make_parameters_consistent(struct qeth_card *card)
 
 
 static int
-qeth_set_online(struct ccwgroup_device *gdev)
+__qeth_set_online(struct ccwgroup_device *gdev, int recovery_mode)
 {
        struct qeth_card *card = gdev->dev.driver_data;
        int rc = 0;
@@ -7464,12 +7568,12 @@ qeth_set_online(struct ccwgroup_device *gdev)
  * we can also use this state for recovery purposes*/
        qeth_set_allowed_threads(card, 0xffffffff, 0);
        if (recover_flag == CARD_STATE_RECOVER)
-               qeth_start_again(card);
+               qeth_start_again(card, recovery_mode);
        qeth_notify_processes();
        return 0;
 out_remove:
        card->use_hard_stop = 1;
-       qeth_stop_card(card);
+       qeth_stop_card(card, 0);
        ccw_device_set_offline(CARD_DDEV(card));
        ccw_device_set_offline(CARD_WDEV(card));
        ccw_device_set_offline(CARD_RDEV(card));
@@ -7480,6 +7584,12 @@ out_remove:
        return -ENODEV;
 }
 
+static int
+qeth_set_online(struct ccwgroup_device *gdev)
+{
+       return __qeth_set_online(gdev, 0);
+}
+
 static struct ccw_device_id qeth_ids[] = {
        {CCW_DEVICE(0x1731, 0x01), driver_info:QETH_CARD_TYPE_OSAE},
        {CCW_DEVICE(0x1731, 0x05), driver_info:QETH_CARD_TYPE_IQD},
index 24034839821112cf06ae12eb6190af90a9225124..98bedb0cb3875a87e2bd2d78b7b2fd34c2f94d77 100644 (file)
@@ -30,7 +30,7 @@ const char *VERSION_QETH_SYS_C = "$Revision: 1.51 $";
 //low/high watermark
 
 static ssize_t
-qeth_dev_state_show(struct device *dev, char *buf)
+qeth_dev_state_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
        if (!card)
@@ -58,7 +58,7 @@ qeth_dev_state_show(struct device *dev, char *buf)
 static DEVICE_ATTR(state, 0444, qeth_dev_state_show, NULL);
 
 static ssize_t
-qeth_dev_chpid_show(struct device *dev, char *buf)
+qeth_dev_chpid_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
        if (!card)
@@ -70,7 +70,7 @@ qeth_dev_chpid_show(struct device *dev, char *buf)
 static DEVICE_ATTR(chpid, 0444, qeth_dev_chpid_show, NULL);
 
 static ssize_t
-qeth_dev_if_name_show(struct device *dev, char *buf)
+qeth_dev_if_name_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
        if (!card)
@@ -81,7 +81,7 @@ qeth_dev_if_name_show(struct device *dev, char *buf)
 static DEVICE_ATTR(if_name, 0444, qeth_dev_if_name_show, NULL);
 
 static ssize_t
-qeth_dev_card_type_show(struct device *dev, char *buf)
+qeth_dev_card_type_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
        if (!card)
@@ -93,7 +93,7 @@ qeth_dev_card_type_show(struct device *dev, char *buf)
 static DEVICE_ATTR(card_type, 0444, qeth_dev_card_type_show, NULL);
 
 static ssize_t
-qeth_dev_portno_show(struct device *dev, char *buf)
+qeth_dev_portno_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
        if (!card)
@@ -103,7 +103,7 @@ qeth_dev_portno_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_portno_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_portno_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -129,7 +129,7 @@ qeth_dev_portno_store(struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(portno, 0644, qeth_dev_portno_show, qeth_dev_portno_store);
 
 static ssize_t
-qeth_dev_portname_show(struct device *dev, char *buf)
+qeth_dev_portname_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
        char portname[9] = {0, };
@@ -146,7 +146,7 @@ qeth_dev_portname_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_portname_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_portname_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -177,7 +177,7 @@ static DEVICE_ATTR(portname, 0644, qeth_dev_portname_show,
                qeth_dev_portname_store);
 
 static ssize_t
-qeth_dev_checksum_show(struct device *dev, char *buf)
+qeth_dev_checksum_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -188,7 +188,7 @@ qeth_dev_checksum_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_checksum_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_checksum_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -218,7 +218,7 @@ static DEVICE_ATTR(checksumming, 0644, qeth_dev_checksum_show,
                qeth_dev_checksum_store);
 
 static ssize_t
-qeth_dev_prioqing_show(struct device *dev, char *buf)
+qeth_dev_prioqing_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -237,7 +237,7 @@ qeth_dev_prioqing_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_prioqing_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_prioqing_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -290,7 +290,7 @@ static DEVICE_ATTR(priority_queueing, 0644, qeth_dev_prioqing_show,
                qeth_dev_prioqing_store);
 
 static ssize_t
-qeth_dev_bufcnt_show(struct device *dev, char *buf)
+qeth_dev_bufcnt_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -301,7 +301,7 @@ qeth_dev_bufcnt_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_bufcnt_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_bufcnt_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -360,7 +360,7 @@ qeth_dev_route_show(struct qeth_card *card, struct qeth_routing_info *route,
 }
 
 static ssize_t
-qeth_dev_route4_show(struct device *dev, char *buf)
+qeth_dev_route4_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -410,7 +410,7 @@ qeth_dev_route_store(struct qeth_card *card, struct qeth_routing_info *route,
 }
 
 static ssize_t
-qeth_dev_route4_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_route4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -425,7 +425,7 @@ static DEVICE_ATTR(route4, 0644, qeth_dev_route4_show, qeth_dev_route4_store);
 
 #ifdef CONFIG_QETH_IPV6
 static ssize_t
-qeth_dev_route6_show(struct device *dev, char *buf)
+qeth_dev_route6_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -439,7 +439,7 @@ qeth_dev_route6_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_route6_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_route6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -461,7 +461,7 @@ static DEVICE_ATTR(route6, 0644, qeth_dev_route6_show, qeth_dev_route6_store);
 #endif
 
 static ssize_t
-qeth_dev_add_hhlen_show(struct device *dev, char *buf)
+qeth_dev_add_hhlen_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -472,7 +472,7 @@ qeth_dev_add_hhlen_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_add_hhlen_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_add_hhlen_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -499,7 +499,7 @@ static DEVICE_ATTR(add_hhlen, 0644, qeth_dev_add_hhlen_show,
                   qeth_dev_add_hhlen_store);
 
 static ssize_t
-qeth_dev_fake_ll_show(struct device *dev, char *buf)
+qeth_dev_fake_ll_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -510,7 +510,7 @@ qeth_dev_fake_ll_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_fake_ll_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_fake_ll_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -536,7 +536,7 @@ static DEVICE_ATTR(fake_ll, 0644, qeth_dev_fake_ll_show,
                   qeth_dev_fake_ll_store);
 
 static ssize_t
-qeth_dev_fake_broadcast_show(struct device *dev, char *buf)
+qeth_dev_fake_broadcast_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -547,7 +547,7 @@ qeth_dev_fake_broadcast_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_fake_broadcast_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_fake_broadcast_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -574,7 +574,7 @@ static DEVICE_ATTR(fake_broadcast, 0644, qeth_dev_fake_broadcast_show,
                   qeth_dev_fake_broadcast_store);
 
 static ssize_t
-qeth_dev_recover_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_recover_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -596,7 +596,7 @@ qeth_dev_recover_store(struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(recover, 0200, NULL, qeth_dev_recover_store);
 
 static ssize_t
-qeth_dev_broadcast_mode_show(struct device *dev, char *buf)
+qeth_dev_broadcast_mode_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -613,7 +613,7 @@ qeth_dev_broadcast_mode_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_broadcast_mode_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_broadcast_mode_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -651,7 +651,7 @@ static DEVICE_ATTR(broadcast_mode, 0644, qeth_dev_broadcast_mode_show,
                   qeth_dev_broadcast_mode_store);
 
 static ssize_t
-qeth_dev_canonical_macaddr_show(struct device *dev, char *buf)
+qeth_dev_canonical_macaddr_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -667,7 +667,7 @@ qeth_dev_canonical_macaddr_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_canonical_macaddr_store(struct device *dev, const char *buf,
+qeth_dev_canonical_macaddr_store(struct device *dev, struct device_attribute *attr, const char *buf,
                                  size_t count)
 {
        struct qeth_card *card = dev->driver_data;
@@ -703,7 +703,7 @@ static DEVICE_ATTR(canonical_macaddr, 0644, qeth_dev_canonical_macaddr_show,
                   qeth_dev_canonical_macaddr_store);
 
 static ssize_t
-qeth_dev_layer2_show(struct device *dev, char *buf)
+qeth_dev_layer2_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -714,7 +714,7 @@ qeth_dev_layer2_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_layer2_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_layer2_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -742,7 +742,7 @@ static DEVICE_ATTR(layer2, 0644, qeth_dev_layer2_show,
                   qeth_dev_layer2_store);
 
 static ssize_t
-qeth_dev_large_send_show(struct device *dev, char *buf)
+qeth_dev_large_send_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -762,7 +762,7 @@ qeth_dev_large_send_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_large_send_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_large_send_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        enum qeth_large_send_types type;
@@ -832,7 +832,7 @@ qeth_dev_blkt_store(struct qeth_card *card, const char *buf, size_t count,
 }
 
 static ssize_t
-qeth_dev_blkt_total_show(struct device *dev, char *buf)
+qeth_dev_blkt_total_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -841,7 +841,7 @@ qeth_dev_blkt_total_show(struct device *dev, char *buf)
 
 
 static ssize_t
-qeth_dev_blkt_total_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_blkt_total_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -855,7 +855,7 @@ static DEVICE_ATTR(total, 0644, qeth_dev_blkt_total_show,
                   qeth_dev_blkt_total_store);
 
 static ssize_t
-qeth_dev_blkt_inter_show(struct device *dev, char *buf)
+qeth_dev_blkt_inter_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -864,7 +864,7 @@ qeth_dev_blkt_inter_show(struct device *dev, char *buf)
 
 
 static ssize_t
-qeth_dev_blkt_inter_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_blkt_inter_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -876,7 +876,7 @@ static DEVICE_ATTR(inter, 0644, qeth_dev_blkt_inter_show,
                   qeth_dev_blkt_inter_store);
 
 static ssize_t
-qeth_dev_blkt_inter_jumbo_show(struct device *dev, char *buf)
+qeth_dev_blkt_inter_jumbo_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -886,7 +886,7 @@ qeth_dev_blkt_inter_jumbo_show(struct device *dev, char *buf)
 
 
 static ssize_t
-qeth_dev_blkt_inter_jumbo_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_blkt_inter_jumbo_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -956,7 +956,7 @@ qeth_check_layer2(struct qeth_card *card)
 
 
 static ssize_t
-qeth_dev_ipato_enable_show(struct device *dev, char *buf)
+qeth_dev_ipato_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -969,7 +969,7 @@ qeth_dev_ipato_enable_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_ipato_enable_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_ipato_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -1004,7 +1004,7 @@ static QETH_DEVICE_ATTR(ipato_enable, enable, 0644,
                        qeth_dev_ipato_enable_store);
 
 static ssize_t
-qeth_dev_ipato_invert4_show(struct device *dev, char *buf)
+qeth_dev_ipato_invert4_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1018,7 +1018,7 @@ qeth_dev_ipato_invert4_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_ipato_invert4_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_ipato_invert4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -1084,7 +1084,7 @@ qeth_dev_ipato_add_show(char *buf, struct qeth_card *card,
 }
 
 static ssize_t
-qeth_dev_ipato_add4_show(struct device *dev, char *buf)
+qeth_dev_ipato_add4_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1153,7 +1153,7 @@ qeth_dev_ipato_add_store(const char *buf, size_t count,
 }
 
 static ssize_t
-qeth_dev_ipato_add4_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_ipato_add4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1186,7 +1186,7 @@ qeth_dev_ipato_del_store(const char *buf, size_t count,
 }
 
 static ssize_t
-qeth_dev_ipato_del4_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_ipato_del4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1201,7 +1201,7 @@ static QETH_DEVICE_ATTR(ipato_del4, del4, 0200, NULL,
 
 #ifdef CONFIG_QETH_IPV6
 static ssize_t
-qeth_dev_ipato_invert6_show(struct device *dev, char *buf)
+qeth_dev_ipato_invert6_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1215,7 +1215,7 @@ qeth_dev_ipato_invert6_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_ipato_invert6_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_ipato_invert6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
        char *tmp;
@@ -1247,7 +1247,7 @@ static QETH_DEVICE_ATTR(ipato_invert6, invert6, 0644,
 
 
 static ssize_t
-qeth_dev_ipato_add6_show(struct device *dev, char *buf)
+qeth_dev_ipato_add6_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1258,7 +1258,7 @@ qeth_dev_ipato_add6_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_ipato_add6_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_ipato_add6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1273,7 +1273,7 @@ static QETH_DEVICE_ATTR(ipato_add6, add6, 0644,
                        qeth_dev_ipato_add6_store);
 
 static ssize_t
-qeth_dev_ipato_del6_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_ipato_del6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1341,7 +1341,7 @@ qeth_dev_vipa_add_show(char *buf, struct qeth_card *card,
 }
 
 static ssize_t
-qeth_dev_vipa_add4_show(struct device *dev, char *buf)
+qeth_dev_vipa_add4_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1381,7 +1381,7 @@ qeth_dev_vipa_add_store(const char *buf, size_t count,
 }
 
 static ssize_t
-qeth_dev_vipa_add4_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_vipa_add4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1413,7 +1413,7 @@ qeth_dev_vipa_del_store(const char *buf, size_t count,
 }
 
 static ssize_t
-qeth_dev_vipa_del4_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_vipa_del4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1428,7 +1428,7 @@ static QETH_DEVICE_ATTR(vipa_del4, del4, 0200, NULL,
 
 #ifdef CONFIG_QETH_IPV6
 static ssize_t
-qeth_dev_vipa_add6_show(struct device *dev, char *buf)
+qeth_dev_vipa_add6_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1439,7 +1439,7 @@ qeth_dev_vipa_add6_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_vipa_add6_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_vipa_add6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1454,7 +1454,7 @@ static QETH_DEVICE_ATTR(vipa_add6, add6, 0644,
                        qeth_dev_vipa_add6_store);
 
 static ssize_t
-qeth_dev_vipa_del6_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_vipa_del6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1522,7 +1522,7 @@ qeth_dev_rxip_add_show(char *buf, struct qeth_card *card,
 }
 
 static ssize_t
-qeth_dev_rxip_add4_show(struct device *dev, char *buf)
+qeth_dev_rxip_add4_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1562,7 +1562,7 @@ qeth_dev_rxip_add_store(const char *buf, size_t count,
 }
 
 static ssize_t
-qeth_dev_rxip_add4_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_rxip_add4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1594,7 +1594,7 @@ qeth_dev_rxip_del_store(const char *buf, size_t count,
 }
 
 static ssize_t
-qeth_dev_rxip_del4_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_rxip_del4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1609,7 +1609,7 @@ static QETH_DEVICE_ATTR(rxip_del4, del4, 0200, NULL,
 
 #ifdef CONFIG_QETH_IPV6
 static ssize_t
-qeth_dev_rxip_add6_show(struct device *dev, char *buf)
+qeth_dev_rxip_add6_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1620,7 +1620,7 @@ qeth_dev_rxip_add6_show(struct device *dev, char *buf)
 }
 
 static ssize_t
-qeth_dev_rxip_add6_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_rxip_add6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
@@ -1635,7 +1635,7 @@ static QETH_DEVICE_ATTR(rxip_add6, add6, 0644,
                        qeth_dev_rxip_add6_store);
 
 static ssize_t
-qeth_dev_rxip_del6_store(struct device *dev, const char *buf, size_t count)
+qeth_dev_rxip_del6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev->driver_data;
 
diff --git a/drivers/s390/net/qeth_tso.c b/drivers/s390/net/qeth_tso.c
deleted file mode 100644 (file)
index c919762..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * linux/drivers/s390/net/qeth_tso.c ($Revision: 1.6 $)
- *
- * Header file for qeth TCP Segmentation Offload support.
- *
- * Copyright 2004 IBM Corporation
- *
- *    Author(s): Frank Pavlic <pavlic@de.ibm.com>
- *
- *    $Revision: 1.6 $  $Date: 2005/03/24 09:04:18 $
- *
- */
-
-#include <linux/skbuff.h>
-#include <linux/tcp.h>
-#include <linux/ip.h>
-#include <linux/ipv6.h>
-#include <net/ip6_checksum.h>
-#include "qeth.h"
-#include "qeth_mpc.h"
-#include "qeth_tso.h"
-
-/**
- * skb already partially prepared
- * classic qdio header in skb->data
- * */
-static inline struct qeth_hdr_tso *
-qeth_tso_prepare_skb(struct qeth_card *card, struct sk_buff **skb)
-{
-       int rc = 0;
-
-       QETH_DBF_TEXT(trace, 5, "tsoprsk");
-       rc = qeth_realloc_headroom(card, skb,sizeof(struct qeth_hdr_ext_tso));
-       if (rc)
-               return NULL;
-
-       return qeth_push_skb(card, skb, sizeof(struct qeth_hdr_ext_tso));
-}
-
-/**
- * fill header for a TSO packet
- */
-static inline void
-qeth_tso_fill_header(struct qeth_card *card, struct sk_buff *skb)
-{
-       struct qeth_hdr_tso *hdr;
-       struct tcphdr *tcph;
-       struct iphdr *iph;
-
-       QETH_DBF_TEXT(trace, 5, "tsofhdr");
-
-       hdr  = (struct qeth_hdr_tso *) skb->data;
-       iph  = skb->nh.iph;
-       tcph = skb->h.th;
-       /*fix header to TSO values ...*/
-       hdr->hdr.hdr.l3.id = QETH_HEADER_TYPE_TSO;
-       /*set values which are fix for the first approach ...*/
-       hdr->ext.hdr_tot_len = (__u16) sizeof(struct qeth_hdr_ext_tso);
-       hdr->ext.imb_hdr_no  = 1;
-       hdr->ext.hdr_type    = 1;
-       hdr->ext.hdr_version = 1;
-       hdr->ext.hdr_len     = 28;
-       /*insert non-fix values */
-       hdr->ext.mss = skb_shinfo(skb)->tso_size;
-       hdr->ext.dg_hdr_len = (__u16)(iph->ihl*4 + tcph->doff*4);
-       hdr->ext.payload_len = (__u16)(skb->len - hdr->ext.dg_hdr_len -
-                                      sizeof(struct qeth_hdr_tso));
-}
-
-/**
- * change some header values as requested by hardware
- */
-static inline void
-qeth_tso_set_tcpip_header(struct qeth_card *card, struct sk_buff *skb)
-{
-       struct iphdr *iph;
-       struct ipv6hdr *ip6h;
-       struct tcphdr *tcph;
-
-       iph  = skb->nh.iph;
-       ip6h = skb->nh.ipv6h;
-       tcph = skb->h.th;
-
-       tcph->check = 0;
-       if (skb->protocol == ETH_P_IPV6) {
-               ip6h->payload_len = 0;
-               tcph->check = ~csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr,
-                                              0, IPPROTO_TCP, 0);
-               return;
-       }
-       /*OSA want us to set these values ...*/
-       tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
-                                        0, IPPROTO_TCP, 0);
-       iph->tot_len = 0;
-       iph->check = 0;
-}
-
-static inline struct qeth_hdr_tso *
-qeth_tso_prepare_packet(struct qeth_card *card, struct sk_buff *skb,
-                       int ipv, int cast_type)
-{
-       struct qeth_hdr_tso *hdr;
-       int rc = 0;
-
-       QETH_DBF_TEXT(trace, 5, "tsoprep");
-
-       /*get headroom for tso qdio header */
-       hdr = (struct qeth_hdr_tso *) qeth_tso_prepare_skb(card, &skb);
-       if (hdr == NULL) {
-               QETH_DBF_TEXT_(trace, 4, "2err%d", rc);
-               return NULL;
-       }
-       memset(hdr, 0, sizeof(struct qeth_hdr_tso));
-       /*fill first 32 bytes of  qdio header as used
-        *FIXME: TSO has two struct members
-        * with different names but same size
-        * */
-       qeth_fill_header(card, &hdr->hdr, skb, ipv, cast_type);
-       qeth_tso_fill_header(card, skb);
-       qeth_tso_set_tcpip_header(card, skb);
-       return hdr;
-}
-
-static inline int
-qeth_tso_get_queue_buffer(struct qeth_qdio_out_q *queue)
-{
-       struct qeth_qdio_out_buffer *buffer;
-       int flush_cnt = 0;
-
-       QETH_DBF_TEXT(trace, 5, "tsobuf");
-
-       /* force to non-packing*/
-       if (queue->do_pack)
-               queue->do_pack = 0;
-       buffer = &queue->bufs[queue->next_buf_to_fill];
-       /* get a new buffer if current is already in use*/
-       if ((atomic_read(&buffer->state) == QETH_QDIO_BUF_EMPTY) &&
-           (buffer->next_element_to_fill > 0)) {
-               atomic_set(&buffer->state, QETH_QDIO_BUF_PRIMED);
-               queue->next_buf_to_fill = (queue->next_buf_to_fill + 1) %
-                                         QDIO_MAX_BUFFERS_PER_Q;
-               flush_cnt++;
-       }
-       return flush_cnt;
-}
-
-static inline void
-__qeth_tso_fill_buffer_frag(struct qeth_qdio_out_buffer *buf,
-                         struct sk_buff *skb)
-{
-       struct skb_frag_struct *frag;
-       struct qdio_buffer *buffer;
-       int fragno, cnt, element;
-       unsigned long addr;
-
-        QETH_DBF_TEXT(trace, 6, "tsfilfrg");
-
-       /*initialize variables ...*/
-       fragno = skb_shinfo(skb)->nr_frags;
-       buffer = buf->buffer;
-       element = buf->next_element_to_fill;
-       /*fill buffer elements .....*/
-       for (cnt = 0; cnt < fragno; cnt++) {
-               frag = &skb_shinfo(skb)->frags[cnt];
-               addr = (page_to_pfn(frag->page) << PAGE_SHIFT) +
-                       frag->page_offset;
-               buffer->element[element].addr = (char *)addr;
-               buffer->element[element].length = frag->size;
-               if (cnt < (fragno - 1))
-                       buffer->element[element].flags =
-                               SBAL_FLAGS_MIDDLE_FRAG;
-               else
-                       buffer->element[element].flags =
-                               SBAL_FLAGS_LAST_FRAG;
-               element++;
-       }
-       buf->next_element_to_fill = element;
-}
-
-static inline int
-qeth_tso_fill_buffer(struct qeth_qdio_out_buffer *buf,
-                    struct sk_buff *skb)
-{
-        int length, length_here, element;
-        int hdr_len;
-       struct qdio_buffer *buffer;
-       struct qeth_hdr_tso *hdr;
-       char *data;
-
-        QETH_DBF_TEXT(trace, 3, "tsfilbuf");
-
-       /*increment user count and queue skb ...*/
-        atomic_inc(&skb->users);
-        skb_queue_tail(&buf->skb_list, skb);
-
-       /*initialize all variables...*/
-        buffer = buf->buffer;
-       hdr = (struct qeth_hdr_tso *)skb->data;
-       hdr_len = sizeof(struct qeth_hdr_tso) + hdr->ext.dg_hdr_len;
-       data = skb->data + hdr_len;
-       length = skb->len - hdr_len;
-        element = buf->next_element_to_fill;
-       /*fill first buffer entry only with header information */
-       buffer->element[element].addr = skb->data;
-       buffer->element[element].length = hdr_len;
-       buffer->element[element].flags = SBAL_FLAGS_FIRST_FRAG;
-       buf->next_element_to_fill++;
-
-       if (skb_shinfo(skb)->nr_frags > 0) {
-                 __qeth_tso_fill_buffer_frag(buf, skb);
-                 goto out;
-        }
-
-       /*start filling buffer entries ...*/
-        element++;
-        while (length > 0) {
-                /* length_here is the remaining amount of data in this page */
-               length_here = PAGE_SIZE - ((unsigned long) data % PAGE_SIZE);
-               if (length < length_here)
-                        length_here = length;
-                buffer->element[element].addr = data;
-                buffer->element[element].length = length_here;
-                length -= length_here;
-                if (!length)
-                        buffer->element[element].flags =
-                                SBAL_FLAGS_LAST_FRAG;
-                 else
-                         buffer->element[element].flags =
-                                 SBAL_FLAGS_MIDDLE_FRAG;
-                data += length_here;
-                element++;
-        }
-        /*set the buffer to primed  ...*/
-        buf->next_element_to_fill = element;
-out:
-       atomic_set(&buf->state, QETH_QDIO_BUF_PRIMED);
-        return 1;
-}
-
-int
-qeth_tso_send_packet(struct qeth_card *card, struct sk_buff *skb,
-                    struct qeth_qdio_out_q *queue, int ipv, int cast_type)
-{
-       int flush_cnt = 0;
-       struct qeth_hdr_tso *hdr;
-       struct qeth_qdio_out_buffer *buffer;
-        int start_index;
-
-       QETH_DBF_TEXT(trace, 3, "tsosend");
-
-       if (!(hdr = qeth_tso_prepare_packet(card, skb, ipv, cast_type)))
-               return -ENOMEM;
-       /*check if skb fits in one SBAL ...*/
-       if (!(qeth_get_elements_no(card, (void*)hdr, skb)))
-               return -EINVAL;
-       /*lock queue, force switching to non-packing and send it ...*/
-       while (atomic_compare_and_swap(QETH_OUT_Q_UNLOCKED,
-                                       QETH_OUT_Q_LOCKED,
-                                       &queue->state));
-        start_index = queue->next_buf_to_fill;
-        buffer = &queue->bufs[queue->next_buf_to_fill];
-       /*check if card is too busy ...*/
-       if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY){
-               card->stats.tx_dropped++;
-               goto out;
-       }
-       /*let's force to non-packing and get a new SBAL*/
-       flush_cnt += qeth_tso_get_queue_buffer(queue);
-       buffer = &queue->bufs[queue->next_buf_to_fill];
-       if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY) {
-               card->stats.tx_dropped++;
-               goto out;
-       }
-       flush_cnt += qeth_tso_fill_buffer(buffer, skb);
-       queue->next_buf_to_fill = (queue->next_buf_to_fill + 1) %
-                                  QDIO_MAX_BUFFERS_PER_Q;
-out:
-       atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
-       if (flush_cnt)
-               qeth_flush_buffers(queue, 0, start_index, flush_cnt);
-       /*do some statistics */
-       card->stats.tx_packets++;
-       card->stats.tx_bytes += skb->len;
-       return 0;
-}
index 83504dee3f57d9d72ee963772a3d63429bd729c7..ad33e6f466f1bd819547f687e5b9e719a6c19f5e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/s390/net/qeth_tso.h ($Revision: 1.4 $)
+ * linux/drivers/s390/net/qeth_tso.h ($Revision: 1.7 $)
  *
  * Header file for qeth TCP Segmentation Offload support.
  *
  *
  *    Author(s): Frank Pavlic <pavlic@de.ibm.com>
  *
- *    $Revision: 1.4 $  $Date: 2005/03/24 09:04:18 $
+ *    $Revision: 1.7 $  $Date: 2005/05/04 20:19:18 $
  *
  */
 #ifndef __QETH_TSO_H__
 #define __QETH_TSO_H__
 
+#include <linux/skbuff.h>
+#include <linux/tcp.h>
+#include <linux/ip.h>
+#include <linux/ipv6.h>
+#include <net/ip6_checksum.h>
+#include "qeth.h"
+#include "qeth_mpc.h"
 
-extern int
-qeth_tso_send_packet(struct qeth_card *, struct sk_buff *,
-                    struct qeth_qdio_out_q *, int , int);
 
-struct qeth_hdr_ext_tso {
-        __u16 hdr_tot_len;
-        __u8  imb_hdr_no;
-        __u8  reserved;
-        __u8  hdr_type;
-        __u8  hdr_version;
-        __u16 hdr_len;
-        __u32 payload_len;
-        __u16 mss;
-        __u16 dg_hdr_len;
-        __u8  padding[16];
-} __attribute__ ((packed));
+static inline struct qeth_hdr_tso *
+qeth_tso_prepare_skb(struct qeth_card *card, struct sk_buff **skb)
+{
+       QETH_DBF_TEXT(trace, 5, "tsoprsk");
+       return qeth_push_skb(card, skb, sizeof(struct qeth_hdr_tso));
+}
+
+/**
+ * fill header for a TSO packet
+ */
+static inline void
+qeth_tso_fill_header(struct qeth_card *card, struct sk_buff *skb)
+{
+       struct qeth_hdr_tso *hdr;
+       struct tcphdr *tcph;
+       struct iphdr *iph;
+
+       QETH_DBF_TEXT(trace, 5, "tsofhdr");
+
+       hdr  = (struct qeth_hdr_tso *) skb->data;
+       iph  = skb->nh.iph;
+       tcph = skb->h.th;
+       /*fix header to TSO values ...*/
+       hdr->hdr.hdr.l3.id = QETH_HEADER_TYPE_TSO;
+       /*set values which are fix for the first approach ...*/
+       hdr->ext.hdr_tot_len = (__u16) sizeof(struct qeth_hdr_ext_tso);
+       hdr->ext.imb_hdr_no  = 1;
+       hdr->ext.hdr_type    = 1;
+       hdr->ext.hdr_version = 1;
+       hdr->ext.hdr_len     = 28;
+       /*insert non-fix values */
+       hdr->ext.mss = skb_shinfo(skb)->tso_size;
+       hdr->ext.dg_hdr_len = (__u16)(iph->ihl*4 + tcph->doff*4);
+       hdr->ext.payload_len = (__u16)(skb->len - hdr->ext.dg_hdr_len -
+                                      sizeof(struct qeth_hdr_tso));
+}
+
+/**
+ * change some header values as requested by hardware
+ */
+static inline void
+qeth_tso_set_tcpip_header(struct qeth_card *card, struct sk_buff *skb)
+{
+       struct iphdr *iph;
+       struct ipv6hdr *ip6h;
+       struct tcphdr *tcph;
 
-struct qeth_hdr_tso {
-        struct qeth_hdr hdr;   /*hdr->hdr.l3.xxx*/
-       struct qeth_hdr_ext_tso ext;
-} __attribute__ ((packed));
+       iph  = skb->nh.iph;
+       ip6h = skb->nh.ipv6h;
+       tcph = skb->h.th;
 
-/*some helper functions*/
+       tcph->check = 0;
+       if (skb->protocol == ETH_P_IPV6) {
+               ip6h->payload_len = 0;
+               tcph->check = ~csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr,
+                                              0, IPPROTO_TCP, 0);
+               return;
+       }
+       /*OSA want us to set these values ...*/
+       tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
+                                        0, IPPROTO_TCP, 0);
+       iph->tot_len = 0;
+       iph->check = 0;
+}
 
 static inline int
-qeth_get_elements_no(struct qeth_card *card, void *hdr, struct sk_buff *skb)
+qeth_tso_prepare_packet(struct qeth_card *card, struct sk_buff *skb,
+                       int ipv, int cast_type)
+{
+       struct qeth_hdr_tso *hdr;
+
+       QETH_DBF_TEXT(trace, 5, "tsoprep");
+
+       hdr = (struct qeth_hdr_tso *) qeth_tso_prepare_skb(card, &skb);
+       if (hdr == NULL) {
+               QETH_DBF_TEXT(trace, 4, "tsoperr");
+               return -ENOMEM;
+       }
+       memset(hdr, 0, sizeof(struct qeth_hdr_tso));
+       /*fill first 32 bytes of  qdio header as used
+        *FIXME: TSO has two struct members
+        * with different names but same size
+        * */
+       qeth_fill_header(card, &hdr->hdr, skb, ipv, cast_type);
+       qeth_tso_fill_header(card, skb);
+       qeth_tso_set_tcpip_header(card, skb);
+       return 0;
+}
+
+static inline void
+__qeth_fill_buffer_frag(struct sk_buff *skb, struct qdio_buffer *buffer,
+                       int is_tso, int *next_element_to_fill)
 {
-       int elements_needed = 0;
-
-       if (skb_shinfo(skb)->nr_frags > 0)
-               elements_needed = (skb_shinfo(skb)->nr_frags + 1);
-       if (elements_needed == 0 )
-               elements_needed = 1 + (((((unsigned long) hdr) % PAGE_SIZE)
-                                       + skb->len) >> PAGE_SHIFT);
-       if (elements_needed > QETH_MAX_BUFFER_ELEMENTS(card)){
-               PRINT_ERR("qeth_do_send_packet: invalid size of "
-                         "IP packet. Discarded.");
-               return 0;
+       struct skb_frag_struct *frag;
+       int fragno;
+       unsigned long addr;
+       int element, cnt, dlen;
+       
+       fragno = skb_shinfo(skb)->nr_frags;
+       element = *next_element_to_fill;
+       dlen = 0;
+       
+       if (is_tso)
+               buffer->element[element].flags =
+                       SBAL_FLAGS_MIDDLE_FRAG;
+       else
+               buffer->element[element].flags =
+                       SBAL_FLAGS_FIRST_FRAG;
+       if ( (dlen = (skb->len - skb->data_len)) ) {
+               buffer->element[element].addr = skb->data;
+               buffer->element[element].length = dlen;
+               element++;
+       }
+       for (cnt = 0; cnt < fragno; cnt++) {
+               frag = &skb_shinfo(skb)->frags[cnt];
+               addr = (page_to_pfn(frag->page) << PAGE_SHIFT) +
+                       frag->page_offset;
+               buffer->element[element].addr = (char *)addr;
+               buffer->element[element].length = frag->size;
+               if (cnt < (fragno - 1))
+                       buffer->element[element].flags =
+                               SBAL_FLAGS_MIDDLE_FRAG;
+               else
+                       buffer->element[element].flags =
+                               SBAL_FLAGS_LAST_FRAG;
+               element++;
        }
-       return elements_needed;
+       *next_element_to_fill = element;
 }
 #endif /* __QETH_TSO_H__ */
index 68d151aaa4749f893294d4a04150f57c59b6f509..e17b4d58a9f6d6a5b1d3009c141fdaf26123d6cd 100644 (file)
@@ -97,11 +97,6 @@ MODULE_PARM_DESC(loglevel,
                 "FC ERP QDIO CIO Config FSF SCSI Other, "
                 "levels: 0=none 1=normal 2=devel 3=trace");
 
-#ifdef ZFCP_PRINT_FLAGS
-u32 flags_dump = 0;
-module_param(flags_dump, uint, 0);
-#endif
-
 /****************************************************************/
 /************** Functions without logging ***********************/
 /****************************************************************/
@@ -223,13 +218,20 @@ zfcp_in_els_dbf_event(struct zfcp_adapter *adapter, const char *text,
  * Parse "device=..." parameter string.
  */
 static int __init
-zfcp_device_setup(char *str)
+zfcp_device_setup(char *devstr)
 {
-       char *tmp;
+       char *tmp, *str;
+       size_t len;
 
-       if (!str)
+       if (!devstr)
                return 0;
 
+       len = strlen(devstr) + 1;
+       str = (char *) kmalloc(len, GFP_KERNEL);
+       if (!str)
+               goto err_out;
+       memcpy(str, devstr, len);
+
        tmp = strchr(str, ',');
        if (!tmp)
                goto err_out;
@@ -246,10 +248,12 @@ zfcp_device_setup(char *str)
        zfcp_data.init_fcp_lun = simple_strtoull(tmp, &tmp, 0);
        if (*tmp != '\0')
                goto err_out;
+       kfree(str);
        return 1;
 
  err_out:
        ZFCP_LOG_NORMAL("Parse error for device parameter string %s\n", str);
+       kfree(str);
        return 0;
 }
 
@@ -525,7 +529,7 @@ zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command,
 
  out:
        if (fsf_req != NULL)
-               zfcp_fsf_req_cleanup(fsf_req);
+               zfcp_fsf_req_free(fsf_req);
 
        if ((adapter != NULL) && (retval != -ENXIO))
                zfcp_adapter_put(adapter);
@@ -1154,7 +1158,7 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device)
        INIT_LIST_HEAD(&adapter->port_remove_lh);
 
        /* initialize list of fsf requests */
-       rwlock_init(&adapter->fsf_req_list_lock);
+       spin_lock_init(&adapter->fsf_req_list_lock);
        INIT_LIST_HEAD(&adapter->fsf_req_list_head);
 
        /* initialize abort lock */
@@ -1239,9 +1243,9 @@ zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
        zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev);
        dev_set_drvdata(&adapter->ccw_device->dev, NULL);
        /* sanity check: no pending FSF requests */
-       read_lock_irqsave(&adapter->fsf_req_list_lock, flags);
+       spin_lock_irqsave(&adapter->fsf_req_list_lock, flags);
        retval = !list_empty(&adapter->fsf_req_list_head);
-       read_unlock_irqrestore(&adapter->fsf_req_list_lock, flags);
+       spin_unlock_irqrestore(&adapter->fsf_req_list_lock, flags);
        if (retval) {
                ZFCP_LOG_NORMAL("bug: adapter %s (%p) still in use, "
                                "%i requests outstanding\n",
@@ -1483,19 +1487,15 @@ zfcp_fsf_incoming_els_rscn(struct zfcp_adapter *adapter,
                fcp_rscn_element++;
                switch (fcp_rscn_element->addr_format) {
                case ZFCP_PORT_ADDRESS:
-                       ZFCP_LOG_FLAGS(1, "ZFCP_PORT_ADDRESS\n");
                        range_mask = ZFCP_PORTS_RANGE_PORT;
                        break;
                case ZFCP_AREA_ADDRESS:
-                       ZFCP_LOG_FLAGS(1, "ZFCP_AREA_ADDRESS\n");
                        range_mask = ZFCP_PORTS_RANGE_AREA;
                        break;
                case ZFCP_DOMAIN_ADDRESS:
-                       ZFCP_LOG_FLAGS(1, "ZFCP_DOMAIN_ADDRESS\n");
                        range_mask = ZFCP_PORTS_RANGE_DOMAIN;
                        break;
                case ZFCP_FABRIC_ADDRESS:
-                       ZFCP_LOG_FLAGS(1, "ZFCP_FABRIC_ADDRESS\n");
                        range_mask = ZFCP_PORTS_RANGE_FABRIC;
                        break;
                default:
@@ -1762,7 +1762,10 @@ static void zfcp_ns_gid_pn_handler(unsigned long data)
        ct_iu_req = zfcp_sg_to_address(ct->req);
        ct_iu_resp = zfcp_sg_to_address(ct->resp);
 
-       if ((ct->status != 0) || zfcp_check_ct_response(&ct_iu_resp->header)) {
+       if (ct->status != 0)
+               goto failed;
+
+       if (zfcp_check_ct_response(&ct_iu_resp->header)) {
                /* FIXME: do we need some specific erp entry points */
                atomic_set_mask(ZFCP_STATUS_PORT_INVALID_WWPN, &port->status);
                goto failed;
index c5daf372f853d556c83abcf2ad475d65fda581b5..4103b5be768376376ae941d20e6b4feae7983f45 100644 (file)
@@ -62,9 +62,6 @@
 #include <linux/syscalls.h>
 #include <linux/ioctl.h>
 
-/************************ DEBUG FLAGS *****************************************/
-
-#define        ZFCP_PRINT_FLAGS
 
 /********************* GENERAL DEFINES *********************************/
 
@@ -152,8 +149,10 @@ typedef u32 scsi_lun_t;
 #define FSF_QTCB_UNSOLICITED_STATUS            0x6305
 #define ZFCP_STATUS_READ_FAILED_THRESHOLD      3
 #define ZFCP_STATUS_READS_RECOM                        FSF_STATUS_READS_RECOM
-#define ZFCP_EXCHANGE_CONFIG_DATA_RETRIES      6
-#define ZFCP_EXCHANGE_CONFIG_DATA_SLEEP                50
+
+/* Do 1st retry in 1 second, then double the timeout for each following retry */
+#define ZFCP_EXCHANGE_CONFIG_DATA_FIRST_SLEEP  100
+#define ZFCP_EXCHANGE_CONFIG_DATA_RETRIES      7
 
 /* timeout value for "default timer" for fsf requests */
 #define ZFCP_FSF_REQUEST_TIMEOUT (60*HZ);
@@ -472,17 +471,6 @@ do { \
        ZFCP_LOG(ZFCP_LOG_LEVEL_TRACE, fmt , ##args)
 #endif
 
-#ifndef ZFCP_PRINT_FLAGS
-# define ZFCP_LOG_FLAGS(level, fmt, args...)
-#else
-extern u32 flags_dump;
-# define ZFCP_LOG_FLAGS(level, fmt, args...) \
-do { \
-       if (level <= flags_dump) \
-               _ZFCP_LOG(fmt, ##args); \
-} while (0)
-#endif
-
 /*************** ADAPTER/PORT/UNIT AND FSF_REQ STATUS FLAGS ******************/
 
 /* 
@@ -502,6 +490,7 @@ do { \
 #define ZFCP_STATUS_COMMON_CLOSING              0x02000000
 #define ZFCP_STATUS_COMMON_ERP_INUSE           0x01000000
 #define ZFCP_STATUS_COMMON_ACCESS_DENIED       0x00800000
+#define ZFCP_STATUS_COMMON_ACCESS_BOXED                0x00400000
 
 /* adapter status */
 #define ZFCP_STATUS_ADAPTER_QDIOUP             0x00000002
@@ -763,6 +752,7 @@ typedef void (*zfcp_send_els_handler_t)(unsigned long);
 /**
  * struct zfcp_send_els - used to pass parameters to function zfcp_fsf_send_els
  * @adapter: adapter where request is sent from
+ * @port: port where ELS is destinated (port reference count has to be increased)
  * @d_id: destiniation id of port where request is sent to
  * @req: scatter-gather list for request
  * @resp: scatter-gather list for response
@@ -777,6 +767,7 @@ typedef void (*zfcp_send_els_handler_t)(unsigned long);
  */
 struct zfcp_send_els {
        struct zfcp_adapter *adapter;
+       struct zfcp_port *port;
        fc_id_t d_id;
        struct scatterlist *req;
        struct scatterlist *resp;
@@ -871,7 +862,7 @@ struct zfcp_adapter {
        u32                     ports;             /* number of remote ports */
         struct timer_list       scsi_er_timer;     /* SCSI err recovery watch */
        struct list_head        fsf_req_list_head; /* head of FSF req list */
-       rwlock_t                fsf_req_list_lock; /* lock for ops on list of
+       spinlock_t              fsf_req_list_lock; /* lock for ops on list of
                                                      FSF requests */
         atomic_t                       fsf_reqs_active;   /* # active FSF reqs */
        struct zfcp_qdio_queue  request_queue;     /* request queue */
index 53ebc1cdfe2de995e4ea39bc75076549cab847e8..0cf31f7d1c0f9fd1c4ec80af137e1b5d8dc9ca61 100644 (file)
@@ -35,7 +35,7 @@
 
 #include "zfcp_ext.h"
 
-static int zfcp_erp_adisc(struct zfcp_adapter *, fc_id_t);
+static int zfcp_erp_adisc(struct zfcp_port *);
 static void zfcp_erp_adisc_handler(unsigned long);
 
 static int zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *, int);
@@ -295,12 +295,12 @@ zfcp_erp_unit_shutdown(struct zfcp_unit *unit, int clear_mask)
 
 /**
  * zfcp_erp_adisc - send ADISC ELS command
- * @adapter: adapter structure
- * @d_id: d_id of port where ADISC is sent to
+ * @port: port structure
  */
 int
-zfcp_erp_adisc(struct zfcp_adapter *adapter, fc_id_t d_id)
+zfcp_erp_adisc(struct zfcp_port *port)
 {
+       struct zfcp_adapter *adapter = port->adapter;
        struct zfcp_send_els *send_els;
        struct zfcp_ls_adisc *adisc;
        void *address = NULL;
@@ -332,7 +332,8 @@ zfcp_erp_adisc(struct zfcp_adapter *adapter, fc_id_t d_id)
        send_els->req_count = send_els->resp_count = 1;
 
        send_els->adapter = adapter;
-       send_els->d_id = d_id;
+       send_els->port = port;
+       send_els->d_id = port->d_id;
        send_els->handler = zfcp_erp_adisc_handler;
        send_els->handler_data = (unsigned long) send_els;
 
@@ -350,7 +351,7 @@ zfcp_erp_adisc(struct zfcp_adapter *adapter, fc_id_t d_id)
        ZFCP_LOG_INFO("ADISC request from s_id 0x%08x to d_id 0x%08x "
                      "(wwpn=0x%016Lx, wwnn=0x%016Lx, "
                      "hard_nport_id=0x%08x, nport_id=0x%08x)\n",
-                     adapter->s_id, d_id, (wwn_t) adisc->wwpn,
+                     adapter->s_id, send_els->d_id, (wwn_t) adisc->wwpn,
                      (wwn_t) adisc->wwnn, adisc->hard_nport_id,
                      adisc->nport_id);
 
@@ -367,7 +368,7 @@ zfcp_erp_adisc(struct zfcp_adapter *adapter, fc_id_t d_id)
        retval = zfcp_fsf_send_els(send_els);
        if (retval != 0) {
                ZFCP_LOG_NORMAL("error: initiation of Send ELS failed for port "
-                               "0x%08x on adapter %s\n", d_id,
+                               "0x%08x on adapter %s\n", send_els->d_id,
                                zfcp_get_busid_by_adapter(adapter));
                del_timer(send_els->timer);
                goto freemem;
@@ -411,14 +412,9 @@ zfcp_erp_adisc_handler(unsigned long data)
        del_timer(send_els->timer);
 
        adapter = send_els->adapter;
+       port = send_els->port;
        d_id = send_els->d_id;
 
-       read_lock(&zfcp_data.config_lock);
-       port = zfcp_get_port_by_did(send_els->adapter, send_els->d_id);
-       read_unlock(&zfcp_data.config_lock);
-
-       BUG_ON(port == NULL);
-
        /* request rejected or timed out */
        if (send_els->status != 0) {
                ZFCP_LOG_NORMAL("ELS request rejected/timed out, "
@@ -482,7 +478,7 @@ zfcp_test_link(struct zfcp_port *port)
        int retval;
 
        zfcp_port_get(port);
-       retval = zfcp_erp_adisc(port->adapter, port->d_id);
+       retval = zfcp_erp_adisc(port);
        if (retval != 0) {
                zfcp_port_put(port);
                ZFCP_LOG_NORMAL("reopen needed for port 0x%016Lx "
@@ -895,7 +891,7 @@ zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action)
 
        if (erp_action->fsf_req) {
                /* take lock to ensure that request is not being deleted meanwhile */
-               write_lock(&adapter->fsf_req_list_lock);
+               spin_lock(&adapter->fsf_req_list_lock);
                /* check whether fsf req does still exist */
                list_for_each_entry(fsf_req, &adapter->fsf_req_list_head, list)
                    if (fsf_req == erp_action->fsf_req)
@@ -938,7 +934,7 @@ zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action)
                         */
                        erp_action->fsf_req = NULL;
                }
-               write_unlock(&adapter->fsf_req_list_lock);
+               spin_unlock(&adapter->fsf_req_list_lock);
        } else
                debug_text_event(adapter->erp_dbf, 3, "a_ca_noreq");
 
@@ -2286,12 +2282,12 @@ zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *erp_action)
 {
        int retval = ZFCP_ERP_SUCCEEDED;
        int retries;
+       int sleep = ZFCP_EXCHANGE_CONFIG_DATA_FIRST_SLEEP;
        struct zfcp_adapter *adapter = erp_action->adapter;
 
        atomic_clear_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, &adapter->status);
-       retries = ZFCP_EXCHANGE_CONFIG_DATA_RETRIES;
 
-       do {
+       for (retries = ZFCP_EXCHANGE_CONFIG_DATA_RETRIES; retries; retries--) {
                atomic_clear_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
                                  &adapter->status);
                ZFCP_LOG_DEBUG("Doing exchange config data\n");
@@ -2329,16 +2325,17 @@ zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *erp_action)
                                      zfcp_get_busid_by_adapter(adapter));
                        break;
                }
-               if (atomic_test_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
-                                    &adapter->status)) {
-                       ZFCP_LOG_DEBUG("host connection still initialising... "
-                                      "waiting and retrying...\n");
-                       /* sleep a little bit before retry */
-                       msleep(jiffies_to_msecs(ZFCP_EXCHANGE_CONFIG_DATA_SLEEP));
-               }
-       } while ((retries--) &&
-                atomic_test_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
-                                 &adapter->status));
+
+               if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
+                                    &adapter->status))
+                       break;
+
+               ZFCP_LOG_DEBUG("host connection still initialising... "
+                              "waiting and retrying...\n");
+               /* sleep a little bit before retry */
+               msleep(jiffies_to_msecs(sleep));
+               sleep *= 2;
+       }
 
        if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK,
                              &adapter->status)) {
@@ -3484,6 +3481,45 @@ zfcp_erp_action_to_ready(struct zfcp_erp_action *erp_action)
        list_move(&erp_action->list, &erp_action->adapter->erp_ready_head);
 }
 
+/*
+ * function:   zfcp_erp_port_boxed
+ *
+ * purpose:
+ */
+void
+zfcp_erp_port_boxed(struct zfcp_port *port)
+{
+       struct zfcp_adapter *adapter = port->adapter;
+       unsigned long flags;
+
+       debug_text_event(adapter->erp_dbf, 3, "p_access_boxed");
+       debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t));
+       read_lock_irqsave(&zfcp_data.config_lock, flags);
+       zfcp_erp_modify_port_status(port,
+                       ZFCP_STATUS_COMMON_ACCESS_BOXED,
+                       ZFCP_SET);
+       read_unlock_irqrestore(&zfcp_data.config_lock, flags);
+       zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED);
+}
+
+/*
+ * function:   zfcp_erp_unit_boxed
+ *
+ * purpose:
+ */
+void
+zfcp_erp_unit_boxed(struct zfcp_unit *unit)
+{
+       struct zfcp_adapter *adapter = unit->port->adapter;
+
+       debug_text_event(adapter->erp_dbf, 3, "u_access_boxed");
+       debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t));
+       zfcp_erp_modify_unit_status(unit,
+                       ZFCP_STATUS_COMMON_ACCESS_BOXED,
+                       ZFCP_SET);
+       zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED);
+}
+
 /*
  * function:   zfcp_erp_port_access_denied
  *
@@ -3495,11 +3531,13 @@ zfcp_erp_port_access_denied(struct zfcp_port *port)
        struct zfcp_adapter *adapter = port->adapter;
        unsigned long flags;
 
-       debug_text_event(adapter->erp_dbf, 3, "p_access_block");
+       debug_text_event(adapter->erp_dbf, 3, "p_access_denied");
        debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t));
        read_lock_irqsave(&zfcp_data.config_lock, flags);
-       zfcp_erp_modify_port_status(port, ZFCP_STATUS_COMMON_ERP_FAILED |
-                                   ZFCP_STATUS_COMMON_ACCESS_DENIED, ZFCP_SET);
+       zfcp_erp_modify_port_status(port,
+                       ZFCP_STATUS_COMMON_ERP_FAILED |
+                       ZFCP_STATUS_COMMON_ACCESS_DENIED,
+                       ZFCP_SET);
        read_unlock_irqrestore(&zfcp_data.config_lock, flags);
 }
 
@@ -3513,10 +3551,12 @@ zfcp_erp_unit_access_denied(struct zfcp_unit *unit)
 {
        struct zfcp_adapter *adapter = unit->port->adapter;
 
-       debug_text_event(adapter->erp_dbf, 3, "u_access_block");
+       debug_text_event(adapter->erp_dbf, 3, "u_access_denied");
        debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t));
-       zfcp_erp_modify_unit_status(unit, ZFCP_STATUS_COMMON_ERP_FAILED |
-                                   ZFCP_STATUS_COMMON_ACCESS_DENIED, ZFCP_SET);
+       zfcp_erp_modify_unit_status(unit,
+                       ZFCP_STATUS_COMMON_ERP_FAILED |
+                       ZFCP_STATUS_COMMON_ACCESS_DENIED,
+                       ZFCP_SET);
 }
 
 /*
@@ -3530,7 +3570,7 @@ zfcp_erp_adapter_access_changed(struct zfcp_adapter *adapter)
        struct zfcp_port *port;
        unsigned long flags;
 
-       debug_text_event(adapter->erp_dbf, 3, "a_access_unblock");
+       debug_text_event(adapter->erp_dbf, 3, "a_access_recover");
        debug_event(adapter->erp_dbf, 3, &adapter->name, 8);
 
        read_lock_irqsave(&zfcp_data.config_lock, flags);
@@ -3553,10 +3593,12 @@ zfcp_erp_port_access_changed(struct zfcp_port *port)
        struct zfcp_adapter *adapter = port->adapter;
        struct zfcp_unit *unit;
 
-       debug_text_event(adapter->erp_dbf, 3, "p_access_unblock");
+       debug_text_event(adapter->erp_dbf, 3, "p_access_recover");
        debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t));
 
        if (!atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED,
+                             &port->status) &&
+           !atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_BOXED,
                              &port->status)) {
                if (!atomic_test_mask(ZFCP_STATUS_PORT_WKA, &port->status))
                        list_for_each_entry(unit, &port->unit_list_head, list)
@@ -3583,10 +3625,13 @@ zfcp_erp_unit_access_changed(struct zfcp_unit *unit)
 {
        struct zfcp_adapter *adapter = unit->port->adapter;
 
-       debug_text_event(adapter->erp_dbf, 3, "u_access_unblock");
+       debug_text_event(adapter->erp_dbf, 3, "u_access_recover");
        debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t));
 
-       if (!atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED, &unit->status))
+       if (!atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED,
+                             &unit->status) &&
+           !atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_BOXED,
+                             &unit->status))
                return;
 
        ZFCP_LOG_NORMAL("reopen of unit 0x%016Lx on port 0x%016Lx "
index d5fd433520719e1a914f573782b43818d40b0de1..42df7e57eeae48f1414e0948b3720e8b30e20d16 100644 (file)
@@ -116,7 +116,7 @@ extern int  zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *,
                                           struct timer_list*, int);
 extern int  zfcp_fsf_req_complete(struct zfcp_fsf_req *);
 extern void zfcp_fsf_incoming_els(struct zfcp_fsf_req *);
-extern void zfcp_fsf_req_cleanup(struct zfcp_fsf_req *);
+extern void zfcp_fsf_req_free(struct zfcp_fsf_req *);
 extern struct zfcp_fsf_req *zfcp_fsf_send_fcp_command_task_management(
        struct zfcp_adapter *, struct zfcp_unit *, u8, int);
 extern struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command(
@@ -171,6 +171,8 @@ extern int  zfcp_erp_async_handler(struct zfcp_erp_action *, unsigned long);
 
 extern int  zfcp_test_link(struct zfcp_port *);
 
+extern void zfcp_erp_port_boxed(struct zfcp_port *);
+extern void zfcp_erp_unit_boxed(struct zfcp_unit *);
 extern void zfcp_erp_port_access_denied(struct zfcp_port *);
 extern void zfcp_erp_unit_access_denied(struct zfcp_unit *);
 extern void zfcp_erp_adapter_access_changed(struct zfcp_adapter *);
index 148b11c822bf818c9299744a907a0bdfe39d674e..0d9f20edc490f8c5702e46953f8c357796eaf46d 100644 (file)
@@ -61,7 +61,6 @@ static int zfcp_fsf_fsfstatus_eval(struct zfcp_fsf_req *);
 static int zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *);
 static int zfcp_fsf_req_dispatch(struct zfcp_fsf_req *);
 static void zfcp_fsf_req_dismiss(struct zfcp_fsf_req *);
-static void zfcp_fsf_req_free(struct zfcp_fsf_req *);
 
 /* association between FSF command and FSF QTCB type */
 static u32 fsf_qtcb_type[] = {
@@ -149,13 +148,13 @@ zfcp_fsf_req_alloc(mempool_t *pool, int req_flags)
  *
  * locks:       none
  */
-static void
+void
 zfcp_fsf_req_free(struct zfcp_fsf_req *fsf_req)
 {
        if (likely(fsf_req->pool != NULL))
                mempool_free(fsf_req, fsf_req->pool);
-               else
-                       kfree(fsf_req);
+       else
+               kfree(fsf_req);
 }
 
 /*
@@ -170,30 +169,21 @@ zfcp_fsf_req_free(struct zfcp_fsf_req *fsf_req)
 int
 zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter)
 {
-       int retval = 0;
        struct zfcp_fsf_req *fsf_req, *tmp;
+       unsigned long flags;
+       LIST_HEAD(remove_queue);
 
-       list_for_each_entry_safe(fsf_req, tmp, &adapter->fsf_req_list_head,
-                                list)
-           zfcp_fsf_req_dismiss(fsf_req);
-       /* wait_event_timeout? */
-       while (!list_empty(&adapter->fsf_req_list_head)) {
-               ZFCP_LOG_DEBUG("fsf req list of adapter %s not yet empty\n",
-                              zfcp_get_busid_by_adapter(adapter));
-               /* wait for woken intiators to clean up their requests */
-               msleep(jiffies_to_msecs(ZFCP_FSFREQ_CLEANUP_TIMEOUT));
-       }
+       spin_lock_irqsave(&adapter->fsf_req_list_lock, flags);
+       list_splice_init(&adapter->fsf_req_list_head, &remove_queue);
+       atomic_set(&adapter->fsf_reqs_active, 0);
+       spin_unlock_irqrestore(&adapter->fsf_req_list_lock, flags);
 
-       /* consistency check */
-       if (atomic_read(&adapter->fsf_reqs_active)) {
-               ZFCP_LOG_NORMAL("bug: There are still %d FSF requests pending "
-                               "on adapter %s after cleanup.\n",
-                               atomic_read(&adapter->fsf_reqs_active),
-                               zfcp_get_busid_by_adapter(adapter));
-               atomic_set(&adapter->fsf_reqs_active, 0);
+       list_for_each_entry_safe(fsf_req, tmp, &remove_queue, list) {
+               list_del(&fsf_req->list);
+               zfcp_fsf_req_dismiss(fsf_req);
        }
 
-       return retval;
+       return 0;
 }
 
 /*
@@ -226,10 +216,6 @@ zfcp_fsf_req_complete(struct zfcp_fsf_req *fsf_req)
 {
        int retval = 0;
        int cleanup;
-       struct zfcp_adapter *adapter = fsf_req->adapter;
-
-       /* do some statistics */
-       atomic_dec(&adapter->fsf_reqs_active);
 
        if (unlikely(fsf_req->fsf_command == FSF_QTCB_UNSOLICITED_STATUS)) {
                ZFCP_LOG_DEBUG("Status read response received\n");
@@ -260,7 +246,7 @@ zfcp_fsf_req_complete(struct zfcp_fsf_req *fsf_req)
                 * lock must not be held here since it will be
                 * grabed by the called routine, too
                 */
-               zfcp_fsf_req_cleanup(fsf_req);
+               zfcp_fsf_req_free(fsf_req);
        } else {
                /* notify initiator waiting for the requests completion */
                ZFCP_LOG_TRACE("waking initiator of FSF request %p\n",fsf_req);
@@ -346,15 +332,10 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req)
        switch (fsf_req->qtcb->prefix.prot_status) {
 
        case FSF_PROT_GOOD:
-               ZFCP_LOG_TRACE("FSF_PROT_GOOD\n");
-               break;
-
        case FSF_PROT_FSF_STATUS_PRESENTED:
-               ZFCP_LOG_TRACE("FSF_PROT_FSF_STATUS_PRESENTED\n");
                break;
 
        case FSF_PROT_QTCB_VERSION_ERROR:
-               ZFCP_LOG_FLAGS(0, "FSF_PROT_QTCB_VERSION_ERROR\n");
                ZFCP_LOG_NORMAL("error: The adapter %s contains "
                                "microcode of version 0x%x, the device driver "
                                "only supports 0x%x. Aborting.\n",
@@ -371,7 +352,6 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_PROT_SEQ_NUMB_ERROR:
-               ZFCP_LOG_FLAGS(0, "FSF_PROT_SEQ_NUMB_ERROR\n");
                ZFCP_LOG_NORMAL("bug: Sequence number mismatch between "
                                "driver (0x%x) and adapter %s (0x%x). "
                                "Restarting all operations on this adapter.\n",
@@ -390,7 +370,6 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_PROT_UNSUPP_QTCB_TYPE:
-               ZFCP_LOG_FLAGS(0, "FSF_PROT_UNSUP_QTCB_TYPE\n");
                ZFCP_LOG_NORMAL("error: Packet header type used by the "
                                "device driver is incompatible with "
                                "that used on adapter %s. "
@@ -405,7 +384,6 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_PROT_HOST_CONNECTION_INITIALIZING:
-               ZFCP_LOG_FLAGS(1, "FSF_PROT_HOST_CONNECTION_INITIALIZING\n");
                zfcp_cmd_dbf_event_fsf("hconinit", fsf_req,
                                       &fsf_req->qtcb->prefix.prot_status_qual,
                                       sizeof (union fsf_prot_status_qual));
@@ -416,7 +394,6 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_PROT_DUPLICATE_REQUEST_ID:
-               ZFCP_LOG_FLAGS(0, "FSF_PROT_DUPLICATE_REQUEST_IDS\n");
                if (fsf_req->qtcb) {
                        ZFCP_LOG_NORMAL("bug: The request identifier 0x%Lx "
                                        "to the adapter %s is ambiguous. "
@@ -445,7 +422,6 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_PROT_LINK_DOWN:
-               ZFCP_LOG_FLAGS(1, "FSF_PROT_LINK_DOWN\n");
                /*
                 * 'test and set' is not atomic here -
                 * it's ok as long as calls to our response queue handler
@@ -502,13 +478,11 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req)
                                        ZFCP_STATUS_COMMON_ERP_FAILED,
                                        &adapter->status);
                        zfcp_erp_adapter_reopen(adapter, 0);
-                       debug_text_event(adapter->erp_dbf, 1, "prot_link_down");
                }
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                break;
 
        case FSF_PROT_REEST_QUEUE:
-               ZFCP_LOG_FLAGS(1, "FSF_PROT_REEST_QUEUE\n");
                debug_text_event(adapter->erp_dbf, 1, "prot_reest_queue");
                ZFCP_LOG_INFO("The local link to adapter with "
                              "%s was re-plugged. "
@@ -528,7 +502,6 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_PROT_ERROR_STATE:
-               ZFCP_LOG_FLAGS(0, "FSF_PROT_ERROR_STATE\n");
                ZFCP_LOG_NORMAL("error: The adapter %s "
                                "has entered the error state. "
                                "Restarting all operations on this "
@@ -589,7 +562,6 @@ zfcp_fsf_fsfstatus_eval(struct zfcp_fsf_req *fsf_req)
        /* evaluate FSF Status */
        switch (fsf_req->qtcb->header.fsf_status) {
        case FSF_UNKNOWN_COMMAND:
-               ZFCP_LOG_FLAGS(0, "FSF_UNKNOWN_COMMAND\n");
                ZFCP_LOG_NORMAL("bug: Command issued by the device driver is "
                                "not known by the adapter %s "
                                "Stopping all operations on this adapter. "
@@ -606,14 +578,12 @@ zfcp_fsf_fsfstatus_eval(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_FCP_RSP_AVAILABLE:
-               ZFCP_LOG_FLAGS(2, "FSF_FCP_RSP_AVAILABLE\n");
                ZFCP_LOG_DEBUG("FCP Sense data will be presented to the "
                               "SCSI stack.\n");
                debug_text_event(fsf_req->adapter->erp_dbf, 3, "fsf_s_rsp");
                break;
 
        case FSF_ADAPTER_STATUS_AVAILABLE:
-               ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n");
                debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_astatus");
                zfcp_fsf_fsfstatus_qual_eval(fsf_req);
                break;
@@ -647,11 +617,9 @@ zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *fsf_req)
 
        switch (fsf_req->qtcb->header.fsf_status_qual.word[0]) {
        case FSF_SQ_FCP_RSP_AVAILABLE:
-               ZFCP_LOG_FLAGS(2, "FSF_SQ_FCP_RSP_AVAILABLE\n");
                debug_text_event(fsf_req->adapter->erp_dbf, 4, "fsf_sq_rsp");
                break;
        case FSF_SQ_RETRY_IF_POSSIBLE:
-               ZFCP_LOG_FLAGS(2, "FSF_SQ_RETRY_IF_POSSIBLE\n");
                /* The SCSI-stack may now issue retries or escalate */
                debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_sq_retry");
                zfcp_cmd_dbf_event_fsf("sqretry", fsf_req,
@@ -660,7 +628,6 @@ zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *fsf_req)
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                break;
        case FSF_SQ_COMMAND_ABORTED:
-               ZFCP_LOG_FLAGS(2, "FSF_SQ_COMMAND_ABORTED\n");
                /* Carry the aborted state on to upper layer */
                debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_sq_abort");
                zfcp_cmd_dbf_event_fsf("sqabort", fsf_req,
@@ -670,7 +637,6 @@ zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *fsf_req)
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                break;
        case FSF_SQ_NO_RECOM:
-               ZFCP_LOG_FLAGS(0, "FSF_SQ_NO_RECOM\n");
                debug_text_exception(fsf_req->adapter->erp_dbf, 0,
                                     "fsf_sq_no_rec");
                ZFCP_LOG_NORMAL("bug: No recommendation could be given for a"
@@ -684,7 +650,6 @@ zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *fsf_req)
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                break;
        case FSF_SQ_ULP_PROGRAMMING_ERROR:
-               ZFCP_LOG_FLAGS(0, "FSF_SQ_ULP_PROGRAMMING_ERROR\n");
                ZFCP_LOG_NORMAL("error: not enough SBALs for data transfer "
                                "(adapter %s)\n",
                                zfcp_get_busid_by_adapter(fsf_req->adapter));
@@ -740,72 +705,58 @@ zfcp_fsf_req_dispatch(struct zfcp_fsf_req *fsf_req)
        switch (fsf_req->fsf_command) {
 
        case FSF_QTCB_FCP_CMND:
-               ZFCP_LOG_FLAGS(3, "FSF_QTCB_FCP_CMND\n");
                zfcp_fsf_send_fcp_command_handler(fsf_req);
                break;
 
        case FSF_QTCB_ABORT_FCP_CMND:
-               ZFCP_LOG_FLAGS(2, "FSF_QTCB_ABORT_FCP_CMND\n");
                zfcp_fsf_abort_fcp_command_handler(fsf_req);
                break;
 
        case FSF_QTCB_SEND_GENERIC:
-               ZFCP_LOG_FLAGS(2, "FSF_QTCB_SEND_GENERIC\n");
                zfcp_fsf_send_ct_handler(fsf_req);
                break;
 
        case FSF_QTCB_OPEN_PORT_WITH_DID:
-               ZFCP_LOG_FLAGS(2, "FSF_QTCB_OPEN_PORT_WITH_DID\n");
                zfcp_fsf_open_port_handler(fsf_req);
                break;
 
        case FSF_QTCB_OPEN_LUN:
-               ZFCP_LOG_FLAGS(2, "FSF_QTCB_OPEN_LUN\n");
                zfcp_fsf_open_unit_handler(fsf_req);
                break;
 
        case FSF_QTCB_CLOSE_LUN:
-               ZFCP_LOG_FLAGS(2, "FSF_QTCB_CLOSE_LUN\n");
                zfcp_fsf_close_unit_handler(fsf_req);
                break;
 
        case FSF_QTCB_CLOSE_PORT:
-               ZFCP_LOG_FLAGS(2, "FSF_QTCB_CLOSE_PORT\n");
                zfcp_fsf_close_port_handler(fsf_req);
                break;
 
        case FSF_QTCB_CLOSE_PHYSICAL_PORT:
-               ZFCP_LOG_FLAGS(2, "FSF_QTCB_CLOSE_PHYSICAL_PORT\n");
                zfcp_fsf_close_physical_port_handler(fsf_req);
                break;
 
        case FSF_QTCB_EXCHANGE_CONFIG_DATA:
-               ZFCP_LOG_FLAGS(2, "FSF_QTCB_EXCHANGE_CONFIG_DATA\n");
                zfcp_fsf_exchange_config_data_handler(fsf_req);
                break;
 
        case FSF_QTCB_EXCHANGE_PORT_DATA:
-               ZFCP_LOG_FLAGS(2, "FSF_QTCB_EXCHANGE_PORT_DATA\n");
                zfcp_fsf_exchange_port_data_handler(fsf_req);
                break;
 
        case FSF_QTCB_SEND_ELS:
-               ZFCP_LOG_FLAGS(2, "FSF_QTCB_SEND_ELS\n");
                zfcp_fsf_send_els_handler(fsf_req);
                break;
 
        case FSF_QTCB_DOWNLOAD_CONTROL_FILE:
-               ZFCP_LOG_FLAGS(2, "FSF_QTCB_DOWNLOAD_CONTROL_FILE\n");
                zfcp_fsf_control_file_handler(fsf_req);
                break;
 
        case FSF_QTCB_UPLOAD_CONTROL_FILE:
-               ZFCP_LOG_FLAGS(2, "FSF_QTCB_UPLOAD_CONTROL_FILE\n");
                zfcp_fsf_control_file_handler(fsf_req);
                break;
 
        default:
-               ZFCP_LOG_FLAGS(2, "FSF_QTCB_UNKNOWN\n");
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                ZFCP_LOG_NORMAL("bug: Command issued by the device driver is "
                                "not supported by the adapter %s\n",
@@ -929,13 +880,11 @@ zfcp_fsf_status_read_port_closed(struct zfcp_fsf_req *fsf_req)
        switch (status_buffer->status_subtype) {
 
        case FSF_STATUS_READ_SUB_CLOSE_PHYS_PORT:
-               ZFCP_LOG_FLAGS(2, "FSF_STATUS_READ_SUB_CLOSE_PHYS_PORT\n");
                debug_text_event(adapter->erp_dbf, 3, "unsol_pc_phys:");
                zfcp_erp_port_reopen(port, 0);
                break;
 
        case FSF_STATUS_READ_SUB_ERROR_PORT:
-               ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_SUB_ERROR_PORT\n");
                debug_text_event(adapter->erp_dbf, 1, "unsol_pc_err:");
                zfcp_erp_port_shutdown(port, 0);
                break;
@@ -973,14 +922,13 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req)
 
        if (fsf_req->status & ZFCP_STATUS_FSFREQ_DISMISSED) {
                mempool_free(status_buffer, adapter->pool.data_status_read);
-               zfcp_fsf_req_cleanup(fsf_req);
+               zfcp_fsf_req_free(fsf_req);
                goto out;
        }
 
        switch (status_buffer->status_type) {
 
        case FSF_STATUS_READ_PORT_CLOSED:
-               ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_PORT_CLOSED\n");
                debug_text_event(adapter->erp_dbf, 3, "unsol_pclosed:");
                debug_event(adapter->erp_dbf, 3,
                            &status_buffer->d_id, sizeof (u32));
@@ -988,13 +936,11 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_STATUS_READ_INCOMING_ELS:
-               ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_INCOMING_ELS\n");
                debug_text_event(adapter->erp_dbf, 3, "unsol_els:");
                zfcp_fsf_incoming_els(fsf_req);
                break;
 
        case FSF_STATUS_READ_SENSE_DATA_AVAIL:
-               ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_SENSE_DATA_AVAIL\n");
                debug_text_event(adapter->erp_dbf, 3, "unsol_sense:");
                ZFCP_LOG_INFO("unsolicited sense data received (adapter %s)\n",
                              zfcp_get_busid_by_adapter(adapter));
@@ -1003,7 +949,6 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_STATUS_READ_BIT_ERROR_THRESHOLD:
-               ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_BIT_ERROR_THRESHOLD\n");
                debug_text_event(adapter->erp_dbf, 3, "unsol_bit_err:");
                ZFCP_LOG_NORMAL("Bit error threshold data received:\n");
                ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL,
@@ -1012,7 +957,6 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_STATUS_READ_LINK_DOWN:
-               ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_LINK_DOWN\n");
                debug_text_event(adapter->erp_dbf, 0, "unsol_link_down:");
                ZFCP_LOG_INFO("Local link to adapter %s is down\n",
                              zfcp_get_busid_by_adapter(adapter));
@@ -1022,7 +966,6 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_STATUS_READ_LINK_UP:
-               ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_LINK_UP\n");
                debug_text_event(adapter->erp_dbf, 2, "unsol_link_up:");
                ZFCP_LOG_INFO("Local link to adapter %s was replugged. "
                              "Restarting operations on this adapter\n",
@@ -1037,7 +980,6 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_STATUS_READ_CFDC_UPDATED:
-               ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_CFDC_UPDATED\n");
                debug_text_event(adapter->erp_dbf, 2, "unsol_cfdc_update:");
                ZFCP_LOG_INFO("CFDC has been updated on the adapter %s\n",
                              zfcp_get_busid_by_adapter(adapter));
@@ -1045,7 +987,6 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_STATUS_READ_CFDC_HARDENED:
-               ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_CFDC_HARDENED\n");
                debug_text_event(adapter->erp_dbf, 2, "unsol_cfdc_harden:");
                switch (status_buffer->status_subtype) {
                case FSF_STATUS_READ_SUB_CFDC_HARDENED_ON_SE:
@@ -1078,7 +1019,7 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req)
                break;
        }
        mempool_free(status_buffer, adapter->pool.data_status_read);
-       zfcp_fsf_req_cleanup(fsf_req);
+       zfcp_fsf_req_free(fsf_req);
        /*
         * recycle buffer and start new request repeat until outbound
         * queue is empty or adapter shutdown is requested
@@ -1214,7 +1155,6 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req)
 
        case FSF_PORT_HANDLE_NOT_VALID:
                if (status_qual >> 4 != status_qual % 0xf) {
-                       ZFCP_LOG_FLAGS(2, "FSF_PORT_HANDLE_NOT_VALID\n");
                        debug_text_event(new_fsf_req->adapter->erp_dbf, 3,
                                         "fsf_s_phand_nv0");
                        /*
@@ -1223,7 +1163,6 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req)
                         * fine.
                         */
                } else {
-                       ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n");
                        ZFCP_LOG_INFO("Temporary port identifier 0x%x for "
                                      "port 0x%016Lx on adapter %s invalid. "
                                      "This may happen occasionally.\n",
@@ -1246,7 +1185,6 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req)
        case FSF_LUN_HANDLE_NOT_VALID:
                if (status_qual >> 4 != status_qual % 0xf) {
                        /* 2 */
-                       ZFCP_LOG_FLAGS(0, "FSF_LUN_HANDLE_NOT_VALID\n");
                        debug_text_event(new_fsf_req->adapter->erp_dbf, 3,
                                         "fsf_s_lhand_nv0");
                        /*
@@ -1255,7 +1193,6 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req)
                         * This is fine.
                         */
                } else {
-                       ZFCP_LOG_FLAGS(1, "FSF_LUN_HANDLE_NOT_VALID\n");
                        ZFCP_LOG_INFO
                            ("Warning: Temporary LUN identifier 0x%x of LUN "
                             "0x%016Lx on port 0x%016Lx on adapter %s is "
@@ -1279,7 +1216,6 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req)
                break;
 
        case FSF_FCP_COMMAND_DOES_NOT_EXIST:
-               ZFCP_LOG_FLAGS(2, "FSF_FCP_COMMAND_DOES_NOT_EXIST\n");
                retval = 0;
                debug_text_event(new_fsf_req->adapter->erp_dbf, 3,
                                 "fsf_s_no_exist");
@@ -1287,50 +1223,37 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req)
                break;
 
        case FSF_PORT_BOXED:
-               /* 2 */
-               ZFCP_LOG_FLAGS(0, "FSF_PORT_BOXED\n");
                ZFCP_LOG_INFO("Remote port 0x%016Lx on adapter %s needs to "
                              "be reopened\n", unit->port->wwpn,
                              zfcp_get_busid_by_unit(unit));
                debug_text_event(new_fsf_req->adapter->erp_dbf, 2,
                                 "fsf_s_pboxed");
-               zfcp_erp_port_reopen(unit->port, 0);
+               zfcp_erp_port_boxed(unit->port);
                new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR
                    | ZFCP_STATUS_FSFREQ_RETRY;
                break;
 
        case FSF_LUN_BOXED:
-                ZFCP_LOG_FLAGS(0, "FSF_LUN_BOXED\n");
                 ZFCP_LOG_INFO(
                         "unit 0x%016Lx on port 0x%016Lx on adapter %s needs "
                         "to be reopened\n",
                         unit->fcp_lun, unit->port->wwpn,
                         zfcp_get_busid_by_unit(unit));
                 debug_text_event(new_fsf_req->adapter->erp_dbf, 1, "fsf_s_lboxed");
-                zfcp_erp_unit_reopen(unit, 0);
-                zfcp_cmd_dbf_event_fsf("unitbox", new_fsf_req,
-                        &new_fsf_req->qtcb->header.fsf_status_qual,
-                        sizeof(union fsf_status_qual));
+               zfcp_erp_unit_boxed(unit);
                 new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR
                         | ZFCP_STATUS_FSFREQ_RETRY;
                 break;
 
        case FSF_ADAPTER_STATUS_AVAILABLE:
-               /* 2 */
-               ZFCP_LOG_FLAGS(0, "FSF_ADAPTER_STATUS_AVAILABLE\n");
                switch (new_fsf_req->qtcb->header.fsf_status_qual.word[0]) {
                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
-                       ZFCP_LOG_FLAGS(2,
-                                      "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n");
                        debug_text_event(new_fsf_req->adapter->erp_dbf, 1,
                                         "fsf_sq_ltest");
-                       /* reopening link to port */
-                       zfcp_erp_port_reopen(unit->port, 0);
+                       zfcp_test_link(unit->port);
                        new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                        break;
                case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
-                       ZFCP_LOG_FLAGS(2,
-                                      "FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n");
                        /* SCSI stack will escalate */
                        debug_text_event(new_fsf_req->adapter->erp_dbf, 1,
                                         "fsf_sq_ulp");
@@ -1350,8 +1273,6 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req)
                break;
 
        case FSF_GOOD:
-               /* 3 */
-               ZFCP_LOG_FLAGS(0, "FSF_GOOD\n");
                retval = 0;
                new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED;
                break;
@@ -1553,12 +1474,10 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
        switch (header->fsf_status) {
 
         case FSF_GOOD:
-                ZFCP_LOG_FLAGS(2,"FSF_GOOD\n");
                 retval = 0;
                break;
 
         case FSF_SERVICE_CLASS_NOT_SUPPORTED:
-               ZFCP_LOG_FLAGS(2, "FSF_SERVICE_CLASS_NOT_SUPPORTED\n");
                if (adapter->fc_service_class <= 3) {
                        ZFCP_LOG_INFO("error: adapter %s does not support fc "
                                      "class %d.\n",
@@ -1578,17 +1497,14 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
         case FSF_ADAPTER_STATUS_AVAILABLE:
-                ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n");
                 switch (header->fsf_status_qual.word[0]){
                 case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
-                       ZFCP_LOG_FLAGS(2,"FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n");
                        /* reopening link to port */
                        debug_text_event(adapter->erp_dbf, 1, "fsf_sq_ltest");
                        zfcp_test_link(port);
                        fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                        break;
                 case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
-                       ZFCP_LOG_FLAGS(2,"FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n");
                        /* ERP strategy will escalate */
                        debug_text_event(adapter->erp_dbf, 1, "fsf_sq_ulp");
                        fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
@@ -1602,7 +1518,6 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
                 break;
 
        case FSF_ACCESS_DENIED:
-               ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n");
                ZFCP_LOG_NORMAL("access denied, cannot send generic service "
                                "command (adapter %s, port d_id=0x%08x)\n",
                                zfcp_get_busid_by_port(port), port->d_id);
@@ -1625,7 +1540,6 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
         case FSF_GENERIC_COMMAND_REJECTED:
-               ZFCP_LOG_FLAGS(2, "FSF_GENERIC_COMMAND_REJECTED\n");
                ZFCP_LOG_INFO("generic service command rejected "
                              "(adapter %s, port d_id=0x%08x)\n",
                              zfcp_get_busid_by_port(port), port->d_id);
@@ -1638,7 +1552,6 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
         case FSF_PORT_HANDLE_NOT_VALID:
-               ZFCP_LOG_FLAGS(2, "FSF_PORT_HANDLE_NOT_VALID\n");
                ZFCP_LOG_DEBUG("Temporary port identifier 0x%x for port "
                               "0x%016Lx on adapter %s invalid. This may "
                               "happen occasionally.\n", port->handle,
@@ -1653,12 +1566,11 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
         case FSF_PORT_BOXED:
-               ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n");
                ZFCP_LOG_INFO("port needs to be reopened "
                              "(adapter %s, port d_id=0x%08x)\n",
                              zfcp_get_busid_by_port(port), port->d_id);
                debug_text_event(adapter->erp_dbf, 2, "fsf_s_pboxed");
-               zfcp_erp_port_reopen(port, 0);
+               zfcp_erp_port_boxed(port);
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR
                    | ZFCP_STATUS_FSFREQ_RETRY;
                break;
@@ -1666,7 +1578,6 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
        /* following states should never occure, all cases avoided
           in zfcp_fsf_send_ct - but who knows ... */
        case FSF_PAYLOAD_SIZE_MISMATCH:
-               ZFCP_LOG_FLAGS(2, "FSF_PAYLOAD_SIZE_MISMATCH\n");
                ZFCP_LOG_INFO("payload size mismatch (adapter: %s, "
                              "req_buf_length=%d, resp_buf_length=%d)\n",
                              zfcp_get_busid_by_adapter(adapter),
@@ -1674,7 +1585,6 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                break;
        case FSF_REQUEST_SIZE_TOO_LARGE:
-               ZFCP_LOG_FLAGS(2, "FSF_REQUEST_SIZE_TOO_LARGE\n");
                ZFCP_LOG_INFO("request size too large (adapter: %s, "
                              "req_buf_length=%d)\n",
                              zfcp_get_busid_by_adapter(adapter),
@@ -1682,7 +1592,6 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                break;
        case FSF_RESPONSE_SIZE_TOO_LARGE:
-               ZFCP_LOG_FLAGS(2, "FSF_RESPONSE_SIZE_TOO_LARGE\n");
                ZFCP_LOG_INFO("response size too large (adapter: %s, "
                              "resp_buf_length=%d)\n",
                              zfcp_get_busid_by_adapter(adapter),
@@ -1690,7 +1599,6 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                break;
        case FSF_SBAL_MISMATCH:
-               ZFCP_LOG_FLAGS(2, "FSF_SBAL_MISMATCH\n");
                ZFCP_LOG_INFO("SBAL mismatch (adapter: %s, req_buf_length=%d, "
                              "resp_buf_length=%d)\n",
                              zfcp_get_busid_by_adapter(adapter),
@@ -1846,8 +1754,8 @@ zfcp_fsf_send_els(struct zfcp_send_els *els)
 static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req)
 {
        struct zfcp_adapter *adapter;
-       fc_id_t d_id;
        struct zfcp_port *port;
+       fc_id_t d_id;
        struct fsf_qtcb_header *header;
        struct fsf_qtcb_bottom_support *bottom;
        struct zfcp_send_els *send_els;
@@ -1856,6 +1764,7 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req)
 
        send_els = fsf_req->data.send_els;
        adapter = send_els->adapter;
+       port = send_els->port;
        d_id = send_els->d_id;
        header = &fsf_req->qtcb->header;
        bottom = &fsf_req->qtcb->bottom.support;
@@ -1866,12 +1775,10 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req)
        switch (header->fsf_status) {
 
        case FSF_GOOD:
-               ZFCP_LOG_FLAGS(2, "FSF_GOOD\n");
                retval = 0;
                break;
 
        case FSF_SERVICE_CLASS_NOT_SUPPORTED:
-               ZFCP_LOG_FLAGS(2, "FSF_SERVICE_CLASS_NOT_SUPPORTED\n");
                if (adapter->fc_service_class <= 3) {
                        ZFCP_LOG_INFO("error: adapter %s does "
                                      "not support fibrechannel class %d.\n",
@@ -1891,22 +1798,14 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_ADAPTER_STATUS_AVAILABLE:
-               ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n");
                switch (header->fsf_status_qual.word[0]){
                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
-                       ZFCP_LOG_FLAGS(2,"FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n");
                        debug_text_event(adapter->erp_dbf, 1, "fsf_sq_ltest");
-                       if (send_els->ls_code != ZFCP_LS_ADISC) {
-                               read_lock(&zfcp_data.config_lock);
-                               port = zfcp_get_port_by_did(adapter, d_id);
-                               if (port)
-                                       zfcp_test_link(port);
-                               read_unlock(&zfcp_data.config_lock);
-                       }
+                       if (port && (send_els->ls_code != ZFCP_LS_ADISC))
+                               zfcp_test_link(port);
                        fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                        break;
                case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
-                       ZFCP_LOG_FLAGS(2,"FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n");
                        debug_text_event(adapter->erp_dbf, 1, "fsf_sq_ulp");
                        fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                        retval =
@@ -1915,7 +1814,6 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req)
                                              &header->fsf_status_qual.word[2]);
                        break;
                case FSF_SQ_RETRY_IF_POSSIBLE:
-                       ZFCP_LOG_FLAGS(2, "FSF_SQ_RETRY_IF_POSSIBLE\n");
                        debug_text_event(adapter->erp_dbf, 1, "fsf_sq_retry");
                        fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                        break;
@@ -1928,7 +1826,6 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_ELS_COMMAND_REJECTED:
-               ZFCP_LOG_FLAGS(2, "FSF_ELS_COMMAND_REJECTED\n");
                ZFCP_LOG_INFO("ELS has been rejected because command filter "
                              "prohibited sending "
                              "(adapter: %s, port d_id: 0x%08x)\n",
@@ -1937,7 +1834,6 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_PAYLOAD_SIZE_MISMATCH:
-               ZFCP_LOG_FLAGS(2, "FSF_PAYLOAD_SIZE_MISMATCH\n");
                ZFCP_LOG_INFO(
                        "ELS request size and ELS response size must be either "
                        "both 0, or both greater than 0 "
@@ -1948,7 +1844,6 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_REQUEST_SIZE_TOO_LARGE:
-               ZFCP_LOG_FLAGS(2, "FSF_REQUEST_SIZE_TOO_LARGE\n");
                ZFCP_LOG_INFO(
                        "Length of the ELS request buffer, "
                        "specified in QTCB bottom, "
@@ -1960,7 +1855,6 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_RESPONSE_SIZE_TOO_LARGE:
-               ZFCP_LOG_FLAGS(2, "FSF_RESPONSE_SIZE_TOO_LARGE\n");
                ZFCP_LOG_INFO(
                        "Length of the ELS response buffer, "
                        "specified in QTCB bottom, "
@@ -1973,7 +1867,6 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req)
 
        case FSF_SBAL_MISMATCH:
                /* should never occure, avoided in zfcp_fsf_send_els */
-               ZFCP_LOG_FLAGS(2, "FSF_SBAL_MISMATCH\n");
                ZFCP_LOG_INFO("SBAL mismatch (adapter: %s, req_buf_length=%d, "
                              "resp_buf_length=%d)\n",
                              zfcp_get_busid_by_adapter(adapter),
@@ -1982,7 +1875,6 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_ACCESS_DENIED:
-               ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n");
                ZFCP_LOG_NORMAL("access denied, cannot send ELS command "
                                "(adapter %s, port d_id=0x%08x)\n",
                                zfcp_get_busid_by_adapter(adapter), d_id);
@@ -2000,11 +1892,8 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req)
                        }
                }
                debug_text_event(adapter->erp_dbf, 1, "fsf_s_access");
-               read_lock(&zfcp_data.config_lock);
-               port = zfcp_get_port_by_did(adapter, d_id);
                if (port != NULL)
                        zfcp_erp_port_access_denied(port);
-               read_unlock(&zfcp_data.config_lock);
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                break;
 
@@ -2195,14 +2084,11 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req)
        switch (fsf_req->qtcb->header.fsf_status) {
 
        case FSF_GOOD:
-               ZFCP_LOG_FLAGS(2, "FSF_GOOD\n");
-
                if (zfcp_fsf_exchange_config_evaluate(fsf_req, 1))
                        return -EIO;
 
                switch (adapter->fc_topology) {
                case FSF_TOPO_P2P:
-                       ZFCP_LOG_FLAGS(1, "FSF_TOPO_P2P\n");
                        ZFCP_LOG_NORMAL("Point-to-Point fibrechannel "
                                        "configuration detected at adapter %s\n"
                                        "Peer WWNN 0x%016llx, "
@@ -2216,7 +2102,6 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req)
                                         "top-p-to-p");
                        break;
                case FSF_TOPO_AL:
-                       ZFCP_LOG_FLAGS(1, "FSF_TOPO_AL\n");
                        ZFCP_LOG_NORMAL("error: Arbitrated loop fibrechannel "
                                        "topology detected at adapter %s "
                                        "unsupported, shutting down adapter\n",
@@ -2226,7 +2111,6 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req)
                        zfcp_erp_adapter_shutdown(adapter, 0);
                        return -EIO;
                case FSF_TOPO_FABRIC:
-                       ZFCP_LOG_FLAGS(1, "FSF_TOPO_FABRIC\n");
                        ZFCP_LOG_INFO("Switched fabric fibrechannel "
                                      "network detected at adapter %s.\n",
                                      zfcp_get_busid_by_adapter(adapter));
@@ -2357,7 +2241,7 @@ zfcp_fsf_exchange_port_data(struct zfcp_adapter *adapter,
        wait_event(fsf_req->completion_wq,
                   fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
        del_timer_sync(timer);
-       zfcp_fsf_req_cleanup(fsf_req);
+       zfcp_fsf_req_free(fsf_req);
  out:
        kfree(timer);
        return retval;
@@ -2379,7 +2263,6 @@ zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *fsf_req)
 
        switch (fsf_req->qtcb->header.fsf_status) {
         case FSF_GOOD:
-                ZFCP_LOG_FLAGS(2,"FSF_GOOD\n");
                 bottom = &fsf_req->qtcb->bottom.port;
                 memcpy(data, bottom, sizeof(*data));
                 break;
@@ -2481,7 +2364,6 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req)
        switch (header->fsf_status) {
 
        case FSF_PORT_ALREADY_OPEN:
-               ZFCP_LOG_FLAGS(0, "FSF_PORT_ALREADY_OPEN\n");
                ZFCP_LOG_NORMAL("bug: remote port 0x%016Lx on adapter %s "
                                "is already open.\n",
                                port->wwpn, zfcp_get_busid_by_port(port));
@@ -2494,7 +2376,6 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_ACCESS_DENIED:
-               ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n");
                ZFCP_LOG_NORMAL("Access denied, cannot open port 0x%016Lx "
                                "on adapter %s\n",
                                port->wwpn, zfcp_get_busid_by_port(port));
@@ -2517,7 +2398,6 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED:
-               ZFCP_LOG_FLAGS(1, "FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED\n");
                ZFCP_LOG_INFO("error: The FSF adapter is out of resources. "
                              "The remote port 0x%016Lx on adapter %s "
                              "could not be opened. Disabling it.\n",
@@ -2529,11 +2409,8 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_ADAPTER_STATUS_AVAILABLE:
-               ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n");
                switch (header->fsf_status_qual.word[0]) {
                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
-                       ZFCP_LOG_FLAGS(2,
-                                      "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n");
                        debug_text_event(fsf_req->adapter->erp_dbf, 1,
                                         "fsf_sq_ltest");
                        /* ERP strategy will escalate */
@@ -2546,7 +2423,6 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req)
                        fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                        break;
                case FSF_SQ_NO_RETRY_POSSIBLE:
-                       ZFCP_LOG_FLAGS(0, "FSF_SQ_NO_RETRY_POSSIBLE\n");
                        ZFCP_LOG_NORMAL("The remote port 0x%016Lx on "
                                        "adapter %s could not be opened. "
                                        "Disabling it.\n",
@@ -2572,7 +2448,6 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_GOOD:
-               ZFCP_LOG_FLAGS(3, "FSF_GOOD\n");
                /* save port handle assigned by FSF */
                port->handle = header->port_handle;
                ZFCP_LOG_INFO("The remote port 0x%016Lx via adapter %s "
@@ -2582,6 +2457,9 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req)
                /* mark port as open */
                atomic_set_mask(ZFCP_STATUS_COMMON_OPEN |
                                ZFCP_STATUS_PORT_PHYS_OPEN, &port->status);
+               atomic_clear_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED |
+                                 ZFCP_STATUS_COMMON_ACCESS_BOXED,
+                                 &port->status);
                retval = 0;
                /* check whether D_ID has changed during open */
                /*
@@ -2630,7 +2508,6 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req)
 
        case FSF_UNKNOWN_OP_SUBTYPE:
                /* should never occure, subtype not set in zfcp_fsf_open_port */
-               ZFCP_LOG_FLAGS(2, "FSF_UNKNOWN_OP_SUBTYPE\n");
                ZFCP_LOG_INFO("unknown operation subtype (adapter: %s, "
                              "op_subtype=0x%x)\n",
                              zfcp_get_busid_by_port(port),
@@ -2739,7 +2616,6 @@ zfcp_fsf_close_port_handler(struct zfcp_fsf_req *fsf_req)
        switch (fsf_req->qtcb->header.fsf_status) {
 
        case FSF_PORT_HANDLE_NOT_VALID:
-               ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n");
                ZFCP_LOG_INFO("Temporary port identifier 0x%x for port "
                              "0x%016Lx on adapter %s invalid. This may happen "
                              "occasionally.\n", port->handle,
@@ -2755,7 +2631,6 @@ zfcp_fsf_close_port_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_ADAPTER_STATUS_AVAILABLE:
-               ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n");
                /* Note: FSF has actually closed the port in this case.
                 * The status code is just daft. Fingers crossed for a change
                 */
@@ -2763,7 +2638,6 @@ zfcp_fsf_close_port_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_GOOD:
-               ZFCP_LOG_FLAGS(3, "FSF_GOOD\n");
                ZFCP_LOG_TRACE("remote port 0x016%Lx on adapter %s closed, "
                               "port handle 0x%x\n", port->wwpn,
                               zfcp_get_busid_by_port(port), port->handle);
@@ -2884,7 +2758,6 @@ zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *fsf_req)
        switch (header->fsf_status) {
 
        case FSF_PORT_HANDLE_NOT_VALID:
-               ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n");
                ZFCP_LOG_INFO("Temporary port identifier 0x%x invalid"
                              "(adapter %s, port 0x%016Lx). "
                              "This may happen occasionally.\n",
@@ -2902,7 +2775,6 @@ zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_ACCESS_DENIED:
-               ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n");
                ZFCP_LOG_NORMAL("Access denied, cannot close "
                                "physical port 0x%016Lx on adapter %s\n",
                                port->wwpn, zfcp_get_busid_by_port(port));
@@ -2925,32 +2797,26 @@ zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_PORT_BOXED:
-               ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n");
                ZFCP_LOG_DEBUG("The remote port 0x%016Lx on adapter "
                               "%s needs to be reopened but it was attempted "
                               "to close it physically.\n",
                               port->wwpn,
                               zfcp_get_busid_by_port(port));
                debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_pboxed");
-               zfcp_erp_port_reopen(port, 0);
+               zfcp_erp_port_boxed(port);
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR |
                        ZFCP_STATUS_FSFREQ_RETRY;
                break;
 
        case FSF_ADAPTER_STATUS_AVAILABLE:
-               ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n");
                switch (header->fsf_status_qual.word[0]) {
                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
-                       ZFCP_LOG_FLAGS(2,
-                                      "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n");
                        debug_text_event(fsf_req->adapter->erp_dbf, 1,
                                         "fsf_sq_ltest");
                        /* This will now be escalated by ERP */
                        fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                        break;
                case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
-                       ZFCP_LOG_FLAGS(2,
-                                      "FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n");
                        /* ERP strategy will escalate */
                        debug_text_event(fsf_req->adapter->erp_dbf, 1,
                                         "fsf_sq_ulp");
@@ -2970,7 +2836,6 @@ zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_GOOD:
-               ZFCP_LOG_FLAGS(3, "FSF_GOOD\n");
                ZFCP_LOG_DEBUG("Remote port 0x%016Lx via adapter %s "
                               "physically closed, port handle 0x%x\n",
                               port->wwpn,
@@ -3116,7 +2981,6 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
        switch (header->fsf_status) {
 
        case FSF_PORT_HANDLE_NOT_VALID:
-               ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n");
                ZFCP_LOG_INFO("Temporary port identifier 0x%x "
                              "for port 0x%016Lx on adapter %s invalid "
                              "This may happen occasionally\n",
@@ -3132,7 +2996,6 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_LUN_ALREADY_OPEN:
-               ZFCP_LOG_FLAGS(0, "FSF_LUN_ALREADY_OPEN\n");
                ZFCP_LOG_NORMAL("bug: Attempted to open unit 0x%016Lx on "
                                "remote port 0x%016Lx on adapter %s twice.\n",
                                unit->fcp_lun,
@@ -3143,7 +3006,6 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_ACCESS_DENIED:
-               ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n");
                ZFCP_LOG_NORMAL("Access denied, cannot open unit 0x%016Lx on "
                                "remote port 0x%016Lx on adapter %s\n",
                                unit->fcp_lun, unit->port->wwpn,
@@ -3169,18 +3031,16 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_PORT_BOXED:
-               ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n");
                ZFCP_LOG_DEBUG("The remote port 0x%016Lx on adapter %s "
                               "needs to be reopened\n",
                               unit->port->wwpn, zfcp_get_busid_by_unit(unit));
                debug_text_event(adapter->erp_dbf, 2, "fsf_s_pboxed");
-               zfcp_erp_port_reopen(unit->port, 0);
+               zfcp_erp_port_boxed(unit->port);
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR |
                        ZFCP_STATUS_FSFREQ_RETRY;
                break;
 
        case FSF_LUN_SHARING_VIOLATION:
-               ZFCP_LOG_FLAGS(2, "FSF_LUN_SHARING_VIOLATION\n");
                if (header->fsf_status_qual.word[0] != 0) {
                        ZFCP_LOG_NORMAL("FCP-LUN 0x%Lx at the remote port "
                                        "with WWPN 0x%Lx "
@@ -3224,7 +3084,6 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_MAXIMUM_NUMBER_OF_LUNS_EXCEEDED:
-               ZFCP_LOG_FLAGS(1, "FSF_MAXIMUM_NUMBER_OF_LUNS_EXCEEDED\n");
                ZFCP_LOG_INFO("error: The adapter ran out of resources. "
                              "There is no handle (temporary port identifier) "
                              "available for unit 0x%016Lx on port 0x%016Lx "
@@ -3239,20 +3098,15 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_ADAPTER_STATUS_AVAILABLE:
-               ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n");
                switch (header->fsf_status_qual.word[0]) {
                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
-                       ZFCP_LOG_FLAGS(2,
-                                      "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n");
                        /* Re-establish link to port */
                        debug_text_event(adapter->erp_dbf, 1,
                                         "fsf_sq_ltest");
-                       zfcp_erp_port_reopen(unit->port, 0);
+                       zfcp_test_link(unit->port);
                        fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                        break;
                case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
-                       ZFCP_LOG_FLAGS(2,
-                                      "FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n");
                        /* ERP strategy will escalate */
                        debug_text_event(adapter->erp_dbf, 1,
                                         "fsf_sq_ulp");
@@ -3271,7 +3125,6 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_INVALID_COMMAND_OPTION:
-               ZFCP_LOG_FLAGS(2, "FSF_INVALID_COMMAND_OPTION\n");
                ZFCP_LOG_NORMAL(
                        "Invalid option 0x%x has been specified "
                        "in QTCB bottom sent to the adapter %s\n",
@@ -3282,7 +3135,6 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_GOOD:
-               ZFCP_LOG_FLAGS(3, "FSF_GOOD\n");
                /* save LUN handle assigned by FSF */
                unit->handle = header->lun_handle;
                ZFCP_LOG_TRACE("unit 0x%016Lx on remote port 0x%016Lx on "
@@ -3293,7 +3145,9 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
                               unit->handle);
                /* mark unit as open */
                atomic_set_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status);
-
+               atomic_clear_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED |
+                                 ZFCP_STATUS_COMMON_ACCESS_BOXED,
+                                 &unit->status);
                if (adapter->supported_features & FSF_FEATURE_LUN_SHARING){
                        if (!exclusive)
                                atomic_set_mask(ZFCP_STATUS_UNIT_SHARED,
@@ -3437,7 +3291,6 @@ zfcp_fsf_close_unit_handler(struct zfcp_fsf_req *fsf_req)
        switch (fsf_req->qtcb->header.fsf_status) {
 
        case FSF_PORT_HANDLE_NOT_VALID:
-               ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n");
                ZFCP_LOG_INFO("Temporary port identifier 0x%x for port "
                              "0x%016Lx on adapter %s invalid. This may "
                              "happen in rare circumstances\n",
@@ -3458,7 +3311,6 @@ zfcp_fsf_close_unit_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_LUN_HANDLE_NOT_VALID:
-               ZFCP_LOG_FLAGS(1, "FSF_LUN_HANDLE_NOT_VALID\n");
                ZFCP_LOG_INFO("Temporary LUN identifier 0x%x of unit "
                              "0x%016Lx on port 0x%016Lx on adapter %s is "
                              "invalid. This may happen occasionally.\n",
@@ -3480,32 +3332,26 @@ zfcp_fsf_close_unit_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_PORT_BOXED:
-               ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n");
                ZFCP_LOG_DEBUG("The remote port 0x%016Lx on adapter %s "
                               "needs to be reopened\n",
                               unit->port->wwpn,
                               zfcp_get_busid_by_unit(unit));
                debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed");
-               zfcp_erp_port_reopen(unit->port, 0);
+               zfcp_erp_port_boxed(unit->port);
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR |
                        ZFCP_STATUS_FSFREQ_RETRY;
                break;
 
        case FSF_ADAPTER_STATUS_AVAILABLE:
-               ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n");
                switch (fsf_req->qtcb->header.fsf_status_qual.word[0]) {
                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
-                       ZFCP_LOG_FLAGS(2,
-                                      "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n");
                        /* re-establish link to port */
                        debug_text_event(fsf_req->adapter->erp_dbf, 1,
                                         "fsf_sq_ltest");
-                       zfcp_erp_port_reopen(unit->port, 0);
+                       zfcp_test_link(unit->port);
                        fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                        break;
                case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
-                       ZFCP_LOG_FLAGS(2,
-                                      "FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n");
                        /* ERP strategy will escalate */
                        debug_text_event(fsf_req->adapter->erp_dbf, 1,
                                         "fsf_sq_ulp");
@@ -3526,7 +3372,6 @@ zfcp_fsf_close_unit_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_GOOD:
-               ZFCP_LOG_FLAGS(3, "FSF_GOOD\n");
                ZFCP_LOG_TRACE("unit 0x%016Lx on port 0x%016Lx on adapter %s "
                               "closed, port handle 0x%x\n",
                               unit->fcp_lun,
@@ -3622,7 +3467,6 @@ zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter,
         */
        switch (scsi_cmnd->sc_data_direction) {
        case DMA_NONE:
-               ZFCP_LOG_FLAGS(3, "DMA_NONE\n");
                fsf_req->qtcb->bottom.io.data_direction = FSF_DATADIR_CMND;
                /*
                 * FIXME(qdio):
@@ -3632,19 +3476,16 @@ zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter,
                sbtype = SBAL_FLAGS0_TYPE_READ;
                break;
        case DMA_FROM_DEVICE:
-               ZFCP_LOG_FLAGS(3, "DMA_FROM_DEVICE\n");
                fsf_req->qtcb->bottom.io.data_direction = FSF_DATADIR_READ;
                sbtype = SBAL_FLAGS0_TYPE_READ;
                fcp_cmnd_iu->rddata = 1;
                break;
        case DMA_TO_DEVICE:
-               ZFCP_LOG_FLAGS(3, "DMA_TO_DEVICE\n");
                fsf_req->qtcb->bottom.io.data_direction = FSF_DATADIR_WRITE;
                sbtype = SBAL_FLAGS0_TYPE_WRITE;
                fcp_cmnd_iu->wddata = 1;
                break;
        case DMA_BIDIRECTIONAL:
-               ZFCP_LOG_FLAGS(0, "DMA_BIDIRECTIONAL not supported\n");
        default:
                /*
                 * dummy, catch this condition earlier
@@ -3877,7 +3718,6 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req)
        switch (header->fsf_status) {
 
        case FSF_PORT_HANDLE_NOT_VALID:
-               ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n");
                ZFCP_LOG_INFO("Temporary port identifier 0x%x for port "
                              "0x%016Lx on adapter %s invalid\n",
                              unit->port->handle,
@@ -3892,7 +3732,6 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_LUN_HANDLE_NOT_VALID:
-               ZFCP_LOG_FLAGS(1, "FSF_LUN_HANDLE_NOT_VALID\n");
                ZFCP_LOG_INFO("Temporary LUN identifier 0x%x for unit "
                              "0x%016Lx on port 0x%016Lx on adapter %s is "
                              "invalid. This may happen occasionally.\n",
@@ -3911,7 +3750,6 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_HANDLE_MISMATCH:
-               ZFCP_LOG_FLAGS(0, "FSF_HANDLE_MISMATCH\n");
                ZFCP_LOG_NORMAL("bug: The port handle 0x%x has changed "
                                "unexpectedly. (adapter %s, port 0x%016Lx, "
                                "unit 0x%016Lx)\n",
@@ -3934,7 +3772,6 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_SERVICE_CLASS_NOT_SUPPORTED:
-               ZFCP_LOG_FLAGS(0, "FSF_SERVICE_CLASS_NOT_SUPPORTED\n");
                if (fsf_req->adapter->fc_service_class <= 3) {
                        ZFCP_LOG_NORMAL("error: The adapter %s does "
                                        "not support fibrechannel class %d.\n",
@@ -3959,7 +3796,6 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_FCPLUN_NOT_VALID:
-               ZFCP_LOG_FLAGS(0, "FSF_FCPLUN_NOT_VALID\n");
                ZFCP_LOG_NORMAL("bug: unit 0x%016Lx on port 0x%016Lx on "
                                "adapter %s does not have correct unit "
                                "handle 0x%x\n",
@@ -3982,7 +3818,6 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_ACCESS_DENIED:
-               ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n");
                ZFCP_LOG_NORMAL("Access denied, cannot send FCP command to "
                                "unit 0x%016Lx on port 0x%016Lx on "
                                "adapter %s\n", unit->fcp_lun, unit->port->wwpn,
@@ -4006,7 +3841,6 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_DIRECTION_INDICATOR_NOT_VALID:
-               ZFCP_LOG_FLAGS(0, "FSF_DIRECTION_INDICATOR_NOT_VALID\n");
                ZFCP_LOG_INFO("bug: Invalid data direction given for unit "
                              "0x%016Lx on port 0x%016Lx on adapter %s "
                              "(debug info %d)\n",
@@ -4026,7 +3860,6 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_CMND_LENGTH_NOT_VALID:
-               ZFCP_LOG_FLAGS(0, "FSF_CMND_LENGTH_NOT_VALID\n");
                ZFCP_LOG_NORMAL
                    ("bug: An invalid control-data-block length field "
                     "was found in a command for unit 0x%016Lx on port "
@@ -4046,69 +3879,43 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_PORT_BOXED:
-               ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n");
                ZFCP_LOG_DEBUG("The remote port 0x%016Lx on adapter %s "
                               "needs to be reopened\n",
                               unit->port->wwpn, zfcp_get_busid_by_unit(unit));
                debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed");
-               zfcp_erp_port_reopen(unit->port, 0);
-               zfcp_cmd_dbf_event_fsf("portbox", fsf_req,
-                                      &header->fsf_status_qual,
-                                      sizeof (union fsf_status_qual));
+               zfcp_erp_port_boxed(unit->port);
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR |
                        ZFCP_STATUS_FSFREQ_RETRY;
                break;
 
        case FSF_LUN_BOXED:
-               ZFCP_LOG_FLAGS(0, "FSF_LUN_BOXED\n");
                ZFCP_LOG_NORMAL("unit needs to be reopened (adapter %s, "
                                "wwpn=0x%016Lx, fcp_lun=0x%016Lx)\n",
                                zfcp_get_busid_by_unit(unit),
                                unit->port->wwpn, unit->fcp_lun);
                debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_lboxed");
-               zfcp_erp_unit_reopen(unit, 0);
-               zfcp_cmd_dbf_event_fsf("unitbox", fsf_req,
-                                      &header->fsf_status_qual,
-                                      sizeof(union fsf_status_qual));
+               zfcp_erp_unit_boxed(unit);
                fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR
                        | ZFCP_STATUS_FSFREQ_RETRY;
                break;
 
        case FSF_ADAPTER_STATUS_AVAILABLE:
-               ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n");
                switch (header->fsf_status_qual.word[0]) {
                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
-                       ZFCP_LOG_FLAGS(2,
-                                      "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n");
                        /* re-establish link to port */
                        debug_text_event(fsf_req->adapter->erp_dbf, 1,
                                         "fsf_sq_ltest");
-                       zfcp_erp_port_reopen(unit->port, 0);
-                       zfcp_cmd_dbf_event_fsf(
-                               "sqltest",
-                               fsf_req,
-                               &header->fsf_status_qual,
-                               sizeof (union fsf_status_qual));
-                       fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
+                       zfcp_test_link(unit->port);
                        break;
                case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
-                       ZFCP_LOG_FLAGS(3,
-                                      "FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n");
                        /* FIXME(hw) need proper specs for proper action */
                        /* let scsi stack deal with retries and escalation */
                        debug_text_event(fsf_req->adapter->erp_dbf, 1,
                                         "fsf_sq_ulp");
-                       zfcp_cmd_dbf_event_fsf(
-                               "sqdeperp",
-                               fsf_req,
-                               &header->fsf_status_qual,
-                               sizeof (union fsf_status_qual));
-                       fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                        break;
                default:
-                       /* FIXME: shall we consider this a successful transfer? */
                        ZFCP_LOG_NORMAL
-                           ("bug: Wrong status qualifier 0x%x arrived.\n",
+                           ("Unknown status qualifier 0x%x arrived.\n",
                             header->fsf_status_qual.word[0]);
                        debug_text_event(fsf_req->adapter->erp_dbf, 0,
                                         "fsf_sq_inval:");
@@ -4117,14 +3924,13 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req)
                                        sizeof(u32));
                        break;
                }
+               fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
                break;
 
        case FSF_GOOD:
-               ZFCP_LOG_FLAGS(3, "FSF_GOOD\n");
                break;
 
        case FSF_FCP_RSP_AVAILABLE:
-               ZFCP_LOG_FLAGS(2, "FSF_FCP_RSP_AVAILABLE\n");
                break;
 
        default:
@@ -4217,14 +4023,12 @@ zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *fsf_req)
                ZFCP_LOG_DEBUG("rsp_len is valid\n");
                switch (fcp_rsp_info[3]) {
                case RSP_CODE_GOOD:
-                       ZFCP_LOG_FLAGS(3, "RSP_CODE_GOOD\n");
                        /* ok, continue */
                        ZFCP_LOG_TRACE("no failure or Task Management "
                                       "Function complete\n");
                        set_host_byte(&scpnt->result, DID_OK);
                        break;
                case RSP_CODE_LENGTH_MISMATCH:
-                       ZFCP_LOG_FLAGS(0, "RSP_CODE_LENGTH_MISMATCH\n");
                        /* hardware bug */
                        ZFCP_LOG_NORMAL("bug: FCP response code indictates "
                                        "that the fibrechannel protocol data "
@@ -4242,7 +4046,6 @@ zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *fsf_req)
                        set_host_byte(&scpnt->result, DID_ERROR);
                        goto skip_fsfstatus;
                case RSP_CODE_FIELD_INVALID:
-                       ZFCP_LOG_FLAGS(0, "RSP_CODE_FIELD_INVALID\n");
                        /* driver or hardware bug */
                        ZFCP_LOG_NORMAL("bug: FCP response code indictates "
                                        "that the fibrechannel protocol data "
@@ -4261,7 +4064,6 @@ zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *fsf_req)
                        zfcp_cmd_dbf_event_fsf("codeinv", fsf_req, NULL, 0);
                        goto skip_fsfstatus;
                case RSP_CODE_RO_MISMATCH:
-                       ZFCP_LOG_FLAGS(0, "RSP_CODE_RO_MISMATCH\n");
                        /* hardware bug */
                        ZFCP_LOG_NORMAL("bug: The FCP response code indicates "
                                        "that conflicting  values for the "
@@ -4407,13 +4209,11 @@ zfcp_fsf_send_fcp_command_task_management_handler(struct zfcp_fsf_req *fsf_req)
        /* check FCP_RSP_INFO */
        switch (fcp_rsp_info[3]) {
        case RSP_CODE_GOOD:
-               ZFCP_LOG_FLAGS(3, "RSP_CODE_GOOD\n");
                /* ok, continue */
                ZFCP_LOG_DEBUG("no failure or Task Management "
                               "Function complete\n");
                break;
        case RSP_CODE_TASKMAN_UNSUPP:
-               ZFCP_LOG_FLAGS(0, "RSP_CODE_TASKMAN_UNSUPP\n");
                ZFCP_LOG_NORMAL("bug: A reuested task management function "
                                "is not supported on the target device "
                                "unit 0x%016Lx, port 0x%016Lx, adapter %s\n ",
@@ -4423,7 +4223,6 @@ zfcp_fsf_send_fcp_command_task_management_handler(struct zfcp_fsf_req *fsf_req)
                fsf_req->status |= ZFCP_STATUS_FSFREQ_TMFUNCNOTSUPP;
                break;
        case RSP_CODE_TASKMAN_FAILED:
-               ZFCP_LOG_FLAGS(0, "RSP_CODE_TASKMAN_FAILED\n");
                ZFCP_LOG_NORMAL("bug: A reuested task management function "
                                "failed to complete successfully. "
                                "unit 0x%016Lx, port 0x%016Lx, adapter %s.\n",
@@ -4610,7 +4409,6 @@ zfcp_fsf_control_file_handler(struct zfcp_fsf_req *fsf_req)
        switch (header->fsf_status) {
 
        case FSF_GOOD:
-               ZFCP_LOG_FLAGS(2, "FSF_GOOD\n");
                ZFCP_LOG_NORMAL(
                        "The FSF request has been successfully completed "
                        "on the adapter %s\n",
@@ -4618,7 +4416,6 @@ zfcp_fsf_control_file_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_OPERATION_PARTIALLY_SUCCESSFUL:
-               ZFCP_LOG_FLAGS(2, "FSF_OPERATION_PARTIALLY_SUCCESSFUL\n");
                if (bottom->operation_subtype == FSF_CFDC_OPERATION_SUBTYPE) {
                        switch (header->fsf_status_qual.word[0]) {
 
@@ -4655,7 +4452,6 @@ zfcp_fsf_control_file_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_AUTHORIZATION_FAILURE:
-               ZFCP_LOG_FLAGS(2, "FSF_AUTHORIZATION_FAILURE\n");
                ZFCP_LOG_NORMAL(
                        "Adapter %s does not accept privileged commands\n",
                        zfcp_get_busid_by_adapter(adapter));
@@ -4664,7 +4460,6 @@ zfcp_fsf_control_file_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_CFDC_ERROR_DETECTED:
-               ZFCP_LOG_FLAGS(2, "FSF_CFDC_ERROR_DETECTED\n");
                ZFCP_LOG_NORMAL(
                        "Error at position %d in the CFDC, "
                        "CFDC is discarded by the adapter %s\n",
@@ -4675,7 +4470,6 @@ zfcp_fsf_control_file_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_CONTROL_FILE_UPDATE_ERROR:
-               ZFCP_LOG_FLAGS(2, "FSF_CONTROL_FILE_UPDATE_ERROR\n");
                ZFCP_LOG_NORMAL(
                        "Adapter %s cannot harden the control file, "
                        "file is discarded\n",
@@ -4685,7 +4479,6 @@ zfcp_fsf_control_file_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_CONTROL_FILE_TOO_LARGE:
-               ZFCP_LOG_FLAGS(2, "FSF_CONTROL_FILE_TOO_LARGE\n");
                ZFCP_LOG_NORMAL(
                        "Control file is too large, file is discarded "
                        "by the adapter %s\n",
@@ -4695,7 +4488,6 @@ zfcp_fsf_control_file_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_ACCESS_CONFLICT_DETECTED:
-               ZFCP_LOG_FLAGS(2, "FSF_ACCESS_CONFLICT_DETECTED\n");
                if (bottom->operation_subtype == FSF_CFDC_OPERATION_SUBTYPE)
                        ZFCP_LOG_NORMAL(
                                "CFDC has been discarded by the adapter %s, "
@@ -4708,7 +4500,6 @@ zfcp_fsf_control_file_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_CONFLICTS_OVERRULED:
-               ZFCP_LOG_FLAGS(2, "FSF_CONFLICTS_OVERRULED\n");
                if (bottom->operation_subtype == FSF_CFDC_OPERATION_SUBTYPE)
                        ZFCP_LOG_NORMAL(
                                "CFDC has been activated on the adapter %s, "
@@ -4721,7 +4512,6 @@ zfcp_fsf_control_file_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_UNKNOWN_OP_SUBTYPE:
-               ZFCP_LOG_FLAGS(2, "FSF_UNKNOWN_OP_SUBTYPE\n");
                ZFCP_LOG_NORMAL("unknown operation subtype (adapter: %s, "
                                "op_subtype=0x%x)\n",
                                zfcp_get_busid_by_adapter(adapter),
@@ -4731,7 +4521,6 @@ zfcp_fsf_control_file_handler(struct zfcp_fsf_req *fsf_req)
                break;
 
        case FSF_INVALID_COMMAND_OPTION:
-               ZFCP_LOG_FLAGS(2, "FSF_INVALID_COMMAND_OPTION\n");
                ZFCP_LOG_NORMAL(
                        "Invalid option 0x%x has been specified "
                        "in QTCB bottom sent to the adapter %s\n",
@@ -4800,7 +4589,7 @@ zfcp_fsf_req_wait_and_cleanup(struct zfcp_fsf_req *fsf_req,
        *status = fsf_req->status;
 
        /* cleanup request */
-       zfcp_fsf_req_cleanup(fsf_req);
+       zfcp_fsf_req_free(fsf_req);
  out:
        return retval;
 }
@@ -4999,9 +4788,9 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *fsf_req, struct timer_list *timer)
                inc_seq_no = 0;
 
        /* put allocated FSF request at list tail */
-       write_lock_irqsave(&adapter->fsf_req_list_lock, flags);
+       spin_lock_irqsave(&adapter->fsf_req_list_lock, flags);
        list_add_tail(&fsf_req->list, &adapter->fsf_req_list_head);
-       write_unlock_irqrestore(&adapter->fsf_req_list_lock, flags);
+       spin_unlock_irqrestore(&adapter->fsf_req_list_lock, flags);
 
        /* figure out expiration time of timeout and start timeout */
        if (unlikely(timer)) {
@@ -5045,9 +4834,9 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *fsf_req, struct timer_list *timer)
                 */
                if (timer)
                        del_timer(timer);
-               write_lock_irqsave(&adapter->fsf_req_list_lock, flags);
+               spin_lock_irqsave(&adapter->fsf_req_list_lock, flags);
                list_del(&fsf_req->list);
-               write_unlock_irqrestore(&adapter->fsf_req_list_lock, flags);
+               spin_unlock_irqrestore(&adapter->fsf_req_list_lock, flags);
                /*
                 * adjust the number of free SBALs in request queue as well as
                 * position of first one
@@ -5085,25 +4874,4 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *fsf_req, struct timer_list *timer)
        return retval;
 }
 
-/*
- * function:    zfcp_fsf_req_cleanup
- *
- * purpose:    cleans up an FSF request and removes it from the specified list
- *
- * returns:
- *
- * assumption: no pending SB in SBALEs other than QTCB
- */
-void
-zfcp_fsf_req_cleanup(struct zfcp_fsf_req *fsf_req)
-{
-       struct zfcp_adapter *adapter = fsf_req->adapter;
-       unsigned long flags;
-
-       write_lock_irqsave(&adapter->fsf_req_list_lock, flags);
-       list_del(&fsf_req->list);
-       write_unlock_irqrestore(&adapter->fsf_req_list_lock, flags);
-       zfcp_fsf_req_free(fsf_req);
-}
-
 #undef ZFCP_LOG_AREA
index 06e862d7bc90075ff320fb34a463767be68ae0c2..24e16ec331d9e5760a00b59972e6fa5ab3009175 100644 (file)
@@ -229,52 +229,14 @@ zfcp_qdio_handler_error_check(struct zfcp_adapter *adapter,
                        ZFCP_LOG_TRACE("status is"
                                       " QDIO_STATUS_OUTBOUND_INT \n");
                }
-       }                       // if (ZFCP_LOG_CHECK(ZFCP_LOG_LEVEL_TRACE))
+       }
        if (unlikely(status & QDIO_STATUS_LOOK_FOR_ERROR)) {
                retval = -EIO;
 
-               ZFCP_LOG_FLAGS(1, "QDIO_STATUS_LOOK_FOR_ERROR \n");
-
                ZFCP_LOG_INFO("QDIO problem occurred (status=0x%x, "
                              "qdio_error=0x%x, siga_error=0x%x)\n",
                              status, qdio_error, siga_error);
 
-               if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION) {
-                       ZFCP_LOG_FLAGS(2,
-                                      "QDIO_STATUS_ACTIVATE_CHECK_CONDITION\n");
-               }
-               if (status & QDIO_STATUS_MORE_THAN_ONE_QDIO_ERROR) {
-                       ZFCP_LOG_FLAGS(2,
-                                      "QDIO_STATUS_MORE_THAN_ONE_QDIO_ERROR\n");
-               }
-               if (status & QDIO_STATUS_MORE_THAN_ONE_SIGA_ERROR) {
-                       ZFCP_LOG_FLAGS(2,
-                                      "QDIO_STATUS_MORE_THAN_ONE_SIGA_ERROR\n");
-               }
-
-               if (siga_error & QDIO_SIGA_ERROR_ACCESS_EXCEPTION) {
-                       ZFCP_LOG_FLAGS(2, "QDIO_SIGA_ERROR_ACCESS_EXCEPTION\n");
-               }
-
-               if (siga_error & QDIO_SIGA_ERROR_B_BIT_SET) {
-                       ZFCP_LOG_FLAGS(2, "QDIO_SIGA_ERROR_B_BIT_SET\n");
-               }
-
-               switch (qdio_error) {
-               case 0:
-                       ZFCP_LOG_FLAGS(3, "QDIO_OK");
-                       break;
-               case SLSB_P_INPUT_ERROR:
-                       ZFCP_LOG_FLAGS(1, "SLSB_P_INPUT_ERROR\n");
-                       break;
-               case SLSB_P_OUTPUT_ERROR:
-                       ZFCP_LOG_FLAGS(1, "SLSB_P_OUTPUT_ERROR\n");
-                       break;
-               default:
-                       ZFCP_LOG_NORMAL("bug: unknown QDIO error 0x%x\n",
-                                       qdio_error);
-                       break;
-               }
                /* Restarting IO on the failed adapter from scratch */
                debug_text_event(adapter->erp_dbf, 1, "qdio_err");
                /*
@@ -484,37 +446,37 @@ int
 zfcp_qdio_reqid_check(struct zfcp_adapter *adapter, void *sbale_addr)
 {
        struct zfcp_fsf_req *fsf_req;
-       int retval = 0;
 
        /* invalid (per convention used in this driver) */
        if (unlikely(!sbale_addr)) {
                ZFCP_LOG_NORMAL("bug: invalid reqid\n");
-               retval = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
        /* valid request id and thus (hopefully :) valid fsf_req address */
        fsf_req = (struct zfcp_fsf_req *) sbale_addr;
 
+       /* serialize with zfcp_fsf_req_dismiss_all */
+       spin_lock(&adapter->fsf_req_list_lock);
+       if (list_empty(&adapter->fsf_req_list_head)) {
+               spin_unlock(&adapter->fsf_req_list_lock);
+               return 0;
+       }
+       list_del(&fsf_req->list);
+       atomic_dec(&adapter->fsf_reqs_active);
+       spin_unlock(&adapter->fsf_req_list_lock);
+       
        if (unlikely(adapter != fsf_req->adapter)) {
                ZFCP_LOG_NORMAL("bug: invalid reqid (fsf_req=%p, "
                                "fsf_req->adapter=%p, adapter=%p)\n",
                                fsf_req, fsf_req->adapter, adapter);
-               retval = -EINVAL;
-               goto out;
-       }
-
-       ZFCP_LOG_TRACE("fsf_req at %p, QTCB at %p\n", fsf_req, fsf_req->qtcb);
-       if (likely(fsf_req->qtcb)) {
-               ZFCP_LOG_TRACE("hex dump of QTCB:\n");
-               ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE, (char *) fsf_req->qtcb,
-                             sizeof(struct fsf_qtcb));
+               return -EINVAL;
        }
 
        /* finish the FSF request */
        zfcp_fsf_req_complete(fsf_req);
- out:
-       return retval;
+
+       return 0;
 }
 
 /**
index e21b547fd427836cc49bad40393c5643f184c5ba..b61d309352c38e5ae02536e271784c030d5fb4e2 100644 (file)
@@ -433,7 +433,7 @@ zfcp_port_lookup(struct zfcp_adapter *adapter, int channel, scsi_id_t id)
  *             FAILED  - otherwise
  */
 int
-zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
+__zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
 {
        int retval = SUCCESS;
        struct zfcp_fsf_req *new_fsf_req, *old_fsf_req;
@@ -575,7 +575,7 @@ zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
            *(u64 *) & new_fsf_req->qtcb->header.fsf_status_qual.word[0];
        dbf_fsf_qual[1] =
            *(u64 *) & new_fsf_req->qtcb->header.fsf_status_qual.word[2];
-       zfcp_fsf_req_cleanup(new_fsf_req);
+       zfcp_fsf_req_free(new_fsf_req);
 #else
        retval = zfcp_fsf_req_wait_and_cleanup(new_fsf_req,
                                               ZFCP_UNINTERRUPTIBLE, &status);
@@ -611,6 +611,17 @@ zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
        return retval;
 }
 
+int
+zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
+{
+       int rc;
+       struct Scsi_Host *scsi_host = scpnt->device->host;
+       spin_lock_irq(scsi_host->host_lock);
+       rc = __zfcp_scsi_eh_abort_handler(scpnt);
+       spin_unlock_irq(scsi_host->host_lock);
+       return rc;
+}
+
 /*
  * function:   zfcp_scsi_eh_device_reset_handler
  *
@@ -625,8 +636,6 @@ zfcp_scsi_eh_device_reset_handler(struct scsi_cmnd *scpnt)
        struct zfcp_unit *unit = (struct zfcp_unit *) scpnt->device->hostdata;
        struct Scsi_Host *scsi_host = scpnt->device->host;
 
-       spin_unlock_irq(scsi_host->host_lock);
-
        if (!unit) {
                ZFCP_LOG_NORMAL("bug: Tried reset for nonexistent unit\n");
                retval = SUCCESS;
@@ -669,7 +678,6 @@ zfcp_scsi_eh_device_reset_handler(struct scsi_cmnd *scpnt)
                retval = SUCCESS;
        }
  out:
-       spin_lock_irq(scsi_host->host_lock);
        return retval;
 }
 
@@ -723,8 +731,6 @@ zfcp_scsi_eh_bus_reset_handler(struct scsi_cmnd *scpnt)
        struct zfcp_unit *unit;
        struct Scsi_Host *scsi_host = scpnt->device->host;
 
-       spin_unlock_irq(scsi_host->host_lock);
-
        unit = (struct zfcp_unit *) scpnt->device->hostdata;
        ZFCP_LOG_NORMAL("bus reset because of problems with "
                        "unit 0x%016Lx\n", unit->fcp_lun);
@@ -732,7 +738,6 @@ zfcp_scsi_eh_bus_reset_handler(struct scsi_cmnd *scpnt)
        zfcp_erp_wait(unit->port->adapter);
        retval = SUCCESS;
 
-       spin_lock_irq(scsi_host->host_lock);
        return retval;
 }
 
@@ -750,8 +755,6 @@ zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt)
        struct zfcp_unit *unit;
        struct Scsi_Host *scsi_host = scpnt->device->host;
 
-       spin_unlock_irq(scsi_host->host_lock);
-
        unit = (struct zfcp_unit *) scpnt->device->hostdata;
        ZFCP_LOG_NORMAL("host reset because of problems with "
                        "unit 0x%016Lx\n", unit->fcp_lun);
@@ -759,7 +762,6 @@ zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt)
        zfcp_erp_wait(unit->port->adapter);
        retval = SUCCESS;
 
-       spin_lock_irq(scsi_host->host_lock);
        return retval;
 }
 
@@ -922,7 +924,7 @@ struct fc_function_template zfcp_transport_functions = {
  * Generates attribute for a unit.
  */
 #define ZFCP_DEFINE_SCSI_ATTR(_name, _format, _value)                    \
-static ssize_t zfcp_sysfs_scsi_##_name##_show(struct device *dev,        \
+static ssize_t zfcp_sysfs_scsi_##_name##_show(struct device *dev, struct device_attribute *attr,        \
                                               char *buf)                 \
 {                                                                        \
         struct scsi_device *sdev;                                        \
index 23e2dca55bb81f5156f38cab9079da360aa30302..e7345a74800a950bb03d6ed762e0198d0c0e8733 100644 (file)
@@ -50,7 +50,7 @@ static const char fc_topologies[5][25] = {
  * Generates attributes for an adapter.
  */
 #define ZFCP_DEFINE_ADAPTER_ATTR(_name, _format, _value)                      \
-static ssize_t zfcp_sysfs_adapter_##_name##_show(struct device *dev,          \
+static ssize_t zfcp_sysfs_adapter_##_name##_show(struct device *dev, struct device_attribute *attr,          \
                                                 char *buf)                   \
 {                                                                             \
        struct zfcp_adapter *adapter;                                         \
@@ -90,7 +90,7 @@ ZFCP_DEFINE_ADAPTER_ATTR(in_recovery, "%d\n", atomic_test_mask
  * Store function of the "port_add" attribute of an adapter.
  */
 static ssize_t
-zfcp_sysfs_port_add_store(struct device *dev, const char *buf, size_t count)
+zfcp_sysfs_port_add_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        wwn_t wwpn;
        char *endp;
@@ -135,7 +135,7 @@ static DEVICE_ATTR(port_add, S_IWUSR, NULL, zfcp_sysfs_port_add_store);
  * Store function of the "port_remove" attribute of an adapter.
  */
 static ssize_t
-zfcp_sysfs_port_remove_store(struct device *dev, const char *buf, size_t count)
+zfcp_sysfs_port_remove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct zfcp_adapter *adapter;
        struct zfcp_port *port;
@@ -196,7 +196,7 @@ static DEVICE_ATTR(port_remove, S_IWUSR, NULL, zfcp_sysfs_port_remove_store);
  * started for the belonging adapter.
  */
 static ssize_t
-zfcp_sysfs_adapter_failed_store(struct device *dev,
+zfcp_sysfs_adapter_failed_store(struct device *dev, struct device_attribute *attr,
                                const char *buf, size_t count)
 {
        struct zfcp_adapter *adapter;
@@ -236,7 +236,7 @@ zfcp_sysfs_adapter_failed_store(struct device *dev,
  * "0" if adapter is working, otherwise "1".
  */
 static ssize_t
-zfcp_sysfs_adapter_failed_show(struct device *dev, char *buf)
+zfcp_sysfs_adapter_failed_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct zfcp_adapter *adapter;
 
index 6aafb2abb4b5087e867a982f28cf556122f561ae..7a84c7d474d961e25985a9cfefa8417ad0e7d6f1 100644 (file)
@@ -53,7 +53,7 @@ zfcp_sysfs_port_release(struct device *dev)
  * Generates attributes for a port.
  */
 #define ZFCP_DEFINE_PORT_ATTR(_name, _format, _value)                    \
-static ssize_t zfcp_sysfs_port_##_name##_show(struct device *dev,        \
+static ssize_t zfcp_sysfs_port_##_name##_show(struct device *dev, struct device_attribute *attr,        \
                                               char *buf)                 \
 {                                                                        \
         struct zfcp_port *port;                                          \
@@ -82,7 +82,7 @@ ZFCP_DEFINE_PORT_ATTR(access_denied, "%d\n", atomic_test_mask
  * Store function of the "unit_add" attribute of a port.
  */
 static ssize_t
-zfcp_sysfs_unit_add_store(struct device *dev, const char *buf, size_t count)
+zfcp_sysfs_unit_add_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        fcp_lun_t fcp_lun;
        char *endp;
@@ -125,7 +125,7 @@ static DEVICE_ATTR(unit_add, S_IWUSR, NULL, zfcp_sysfs_unit_add_store);
  * @count: number of bytes in buffer
  */
 static ssize_t
-zfcp_sysfs_unit_remove_store(struct device *dev, const char *buf, size_t count)
+zfcp_sysfs_unit_remove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct zfcp_port *port;
        struct zfcp_unit *unit;
@@ -186,7 +186,7 @@ static DEVICE_ATTR(unit_remove, S_IWUSR, NULL, zfcp_sysfs_unit_remove_store);
  * started for the belonging port.
  */
 static ssize_t
-zfcp_sysfs_port_failed_store(struct device *dev, const char *buf, size_t count)
+zfcp_sysfs_port_failed_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct zfcp_port *port;
        unsigned int val;
@@ -224,7 +224,7 @@ zfcp_sysfs_port_failed_store(struct device *dev, const char *buf, size_t count)
  * "0" if port is working, otherwise "1".
  */
 static ssize_t
-zfcp_sysfs_port_failed_show(struct device *dev, char *buf)
+zfcp_sysfs_port_failed_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct zfcp_port *port;
 
index 87c0b461831fd516f06a4847f668f7574d1a60d1..0556642c9e1d5ed7cf94d83bf3ff5e8358df7dd4 100644 (file)
@@ -53,7 +53,7 @@ zfcp_sysfs_unit_release(struct device *dev)
  * Generates attribute for a unit.
  */
 #define ZFCP_DEFINE_UNIT_ATTR(_name, _format, _value)                    \
-static ssize_t zfcp_sysfs_unit_##_name##_show(struct device *dev,        \
+static ssize_t zfcp_sysfs_unit_##_name##_show(struct device *dev, struct device_attribute *attr,        \
                                               char *buf)                 \
 {                                                                        \
         struct zfcp_unit *unit;                                          \
@@ -86,7 +86,7 @@ ZFCP_DEFINE_UNIT_ATTR(access_readonly, "%d\n", atomic_test_mask
  * started for the belonging unit.
  */
 static ssize_t
-zfcp_sysfs_unit_failed_store(struct device *dev, const char *buf, size_t count)
+zfcp_sysfs_unit_failed_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct zfcp_unit *unit;
        unsigned int val;
@@ -123,7 +123,7 @@ zfcp_sysfs_unit_failed_store(struct device *dev, const char *buf, size_t count)
  * "0" if unit is working, otherwise "1".
  */
 static ssize_t
-zfcp_sysfs_unit_failed_show(struct device *dev, char *buf)
+zfcp_sysfs_unit_failed_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct zfcp_unit *unit;
 
index e5fa1703856bf94858f327377fec588d71779788..650d5e924f4714c1d0c00f4777c1fad58559c645 100644 (file)
@@ -81,10 +81,6 @@ unsigned char irqs[4] = {
 int irqhit=0;
 #endif
 
-#ifndef MIN
-#define MIN(a,b) ((a) < (b) ? (a) : (b))
-#endif
-
 static struct tty_driver *aurora_driver;
 static struct Aurora_board aurora_board[AURORA_NBOARD] = {
        {0,},
@@ -594,7 +590,7 @@ static void aurora_transmit(struct Aurora_board const * bp, int chip)
                                            &bp->r[chip]->r[CD180_TDR]);
                                port->COR2 &= ~COR2_ETC;
                        }
-                       count = MIN(port->break_length, 0xff);
+                       count = min(port->break_length, 0xff);
                        sbus_writeb(CD180_C_ESC,
                                    &bp->r[chip]->r[CD180_TDR]);
                        sbus_writeb(CD180_C_DELAY,
@@ -1575,7 +1571,7 @@ static int aurora_write(struct tty_struct * tty,
        save_flags(flags);
        while (1) {
                cli();
-               c = MIN(count, MIN(SERIAL_XMIT_SIZE - port->xmit_cnt - 1,
+               c = min(count, min(SERIAL_XMIT_SIZE - port->xmit_cnt - 1,
                                   SERIAL_XMIT_SIZE - port->xmit_head));
                if (c <= 0) {
                        restore_flags(flags);
index a2b18f5a4f9305af289e0eb750ad457f2152169f..34dbc37a79d4991f8b40d9e61ad01c32b07000a9 100644 (file)
@@ -1695,8 +1695,6 @@ static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt)
 
        tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
 
-       spin_unlock_irq(tw_dev->host->host_lock);
-
        tw_dev->num_resets++;
 
        printk(KERN_WARNING "3w-9xxx: scsi%d: WARNING: (0x%02X:0x%04X): Unit #%d: Command (0x%x) timed out, resetting card.\n", tw_dev->host->host_no, TW_DRIVER, 0x2c, SCpnt->device->id, SCpnt->cmnd[0]);
@@ -1709,7 +1707,6 @@ static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt)
 
        retval = SUCCESS;
 out:
-       spin_lock_irq(tw_dev->host->host_lock);
        return retval;
 } /* End twa_scsi_eh_reset() */
 
index 48f9ece1cbd0912237a3150c19410db31c6400a8..b6dc576da4306f28f861ffe853bb536444410627 100644 (file)
@@ -1430,8 +1430,6 @@ static int tw_scsi_eh_reset(struct scsi_cmnd *SCpnt)
 
        tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
 
-       spin_unlock_irq(tw_dev->host->host_lock);
-
        tw_dev->num_resets++;
 
        printk(KERN_WARNING "3w-xxxx: scsi%d: WARNING: Unit #%d: Command (0x%x) timed out, resetting card.\n", tw_dev->host->host_no, SCpnt->device->id, SCpnt->cmnd[0]);
@@ -1444,7 +1442,6 @@ static int tw_scsi_eh_reset(struct scsi_cmnd *SCpnt)
 
        retval = SUCCESS;
 out:
-       spin_lock_irq(tw_dev->host->host_lock);
        return retval;
 } /* End tw_scsi_eh_reset() */
 
index 4b1bb529f676dcbb158bbc05d43b90378ce9c313..a7620fc368e7ab365d5f415414e8c05e176e05cd 100644 (file)
@@ -170,7 +170,6 @@ MODULE_LICENSE("GPL");
 STATIC int NCR_700_queuecommand(struct scsi_cmnd *, void (*done)(struct scsi_cmnd *));
 STATIC int NCR_700_abort(struct scsi_cmnd * SCpnt);
 STATIC int NCR_700_bus_reset(struct scsi_cmnd * SCpnt);
-STATIC int NCR_700_dev_reset(struct scsi_cmnd * SCpnt);
 STATIC int NCR_700_host_reset(struct scsi_cmnd * SCpnt);
 STATIC void NCR_700_chip_setup(struct Scsi_Host *host);
 STATIC void NCR_700_chip_reset(struct Scsi_Host *host);
@@ -330,7 +329,6 @@ NCR_700_detect(struct scsi_host_template *tpnt,
        /* Fill in the missing routines from the host template */
        tpnt->queuecommand = NCR_700_queuecommand;
        tpnt->eh_abort_handler = NCR_700_abort;
-       tpnt->eh_device_reset_handler = NCR_700_dev_reset;
        tpnt->eh_bus_reset_handler = NCR_700_bus_reset;
        tpnt->eh_host_reset_handler = NCR_700_host_reset;
        tpnt->can_queue = NCR_700_COMMAND_SLOTS_PER_HOST;
@@ -1959,34 +1957,31 @@ NCR_700_bus_reset(struct scsi_cmnd * SCp)
        printk(KERN_INFO "scsi%d (%d:%d) New error handler wants BUS reset, cmd %p\n\t",
               SCp->device->host->host_no, SCp->device->id, SCp->device->lun, SCp);
        scsi_print_command(SCp);
+
        /* In theory, eh_complete should always be null because the
         * eh is single threaded, but just in case we're handling a
         * reset via sg or something */
-       while(hostdata->eh_complete != NULL) {
+       spin_lock_irq(SCp->device->host->host_lock);
+       while (hostdata->eh_complete != NULL) {
                spin_unlock_irq(SCp->device->host->host_lock);
                msleep_interruptible(100);
                spin_lock_irq(SCp->device->host->host_lock);
        }
+
        hostdata->eh_complete = &complete;
        NCR_700_internal_bus_reset(SCp->device->host);
+
        spin_unlock_irq(SCp->device->host->host_lock);
        wait_for_completion(&complete);
        spin_lock_irq(SCp->device->host->host_lock);
+
        hostdata->eh_complete = NULL;
        /* Revalidate the transport parameters of the failing device */
        if(hostdata->fast)
                spi_schedule_dv_device(SCp->device);
-       return SUCCESS;
-}
 
-STATIC int
-NCR_700_dev_reset(struct scsi_cmnd * SCp)
-{
-       printk(KERN_INFO "scsi%d (%d:%d) New error handler wants device reset\n\t",
-              SCp->device->host->host_no, SCp->device->id, SCp->device->lun);
-       scsi_print_command(SCp);
-       
-       return FAILED;
+       spin_unlock_irq(SCp->device->host->host_lock);
+       return SUCCESS;
 }
 
 STATIC int
@@ -1996,8 +1991,13 @@ NCR_700_host_reset(struct scsi_cmnd * SCp)
               SCp->device->host->host_no, SCp->device->id, SCp->device->lun);
        scsi_print_command(SCp);
 
+       spin_lock_irq(SCp->device->host->host_lock);
+
        NCR_700_internal_bus_reset(SCp->device->host);
        NCR_700_chip_reset(SCp->device->host);
+
+       spin_unlock_irq(SCp->device->host->host_lock);
+
        return SUCCESS;
 }
 
@@ -2125,7 +2125,7 @@ static int NCR_700_change_queue_type(struct scsi_device *SDp, int tag_type)
 }
 
 static ssize_t
-NCR_700_show_active_tags(struct device *dev, char *buf)
+NCR_700_show_active_tags(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct scsi_device *SDp = to_scsi_device(dev);
 
index 15e4b122d56e93c4330fbbfd1871e6d2c164b7a0..9d6040bfa0646ae32283be9f1ffde0e974172594 100644 (file)
@@ -2746,9 +2746,15 @@ static int BusLogic_host_reset(struct scsi_cmnd * SCpnt)
 
        unsigned int id = SCpnt->device->id;
        struct BusLogic_TargetStatistics *stats = &HostAdapter->TargetStatistics[id];
+       int rc;
+
+       spin_lock_irq(SCpnt->device->host->host_lock);
+
        BusLogic_IncrementErrorCounter(&stats->HostAdapterResetsRequested);
 
-       return BusLogic_ResetHostAdapter(HostAdapter, false);
+       rc = BusLogic_ResetHostAdapter(HostAdapter, false);
+       spin_unlock_irq(SCpnt->device->host->host_lock);
+       return rc;
 }
 
 /*
index 56a695c6ab52ae05530d61c0cbc0fdb68762565d..5beed4f6d985a7b2bd2c9f007b2e49158989ec31 100644 (file)
@@ -22,8 +22,6 @@
 #ifndef CONFIG_SCSI_OMIT_FLASHPOINT
 
 
-#define UNIX
-#define FW_TYPE                _SCCB_MGR_
 #define MAX_CARDS      8
 #undef BUSTYPE_PCI
 
@@ -34,8 +32,6 @@
 #define OS_OutPortByte(port, value)    outb(value, port)
 #define OS_OutPortWord(port, value)    outw(value, port)
 #define OS_OutPortLong(port, value)    outl(value, port)
-#define OS_Lock(x)
-#define OS_UnLock(x)
 
 
 /*
 #define SccbMgr_isr                    FlashPoint_HandleInterrupt
 
 
-/*
-  Define name replacements to avoid kernel namespace pollution.
-*/
-
-#define BL_Card                                FPT_BL_Card
-#define BusMasterInit                  FPT_BusMasterInit
-#define CalcCrc16                      FPT_CalcCrc16
-#define CalcLrc                                FPT_CalcLrc
-#define ChkIfChipInitialized           FPT_ChkIfChipInitialized
-#define DiagBusMaster                  FPT_DiagBusMaster
-#define DiagEEPROM                     FPT_DiagEEPROM
-#define DiagXbow                       FPT_DiagXbow
-#define GetTarLun                      FPT_GetTarLun
-#define RNVRamData                     FPT_RNVRamData
-#define RdStack                                FPT_RdStack
-#define SccbMgrTableInitAll            FPT_SccbMgrTableInitAll
-#define SccbMgrTableInitCard           FPT_SccbMgrTableInitCard
-#define SccbMgrTableInitTarget         FPT_SccbMgrTableInitTarget
-#define SccbMgr_bad_isr                        FPT_SccbMgr_bad_isr
-#define SccbMgr_scsi_reset             FPT_SccbMgr_scsi_reset
-#define SccbMgr_timer_expired          FPT_SccbMgr_timer_expired
-#define SendMsg                                FPT_SendMsg
-#define Wait                           FPT_Wait
-#define Wait1Second                    FPT_Wait1Second
-#define WrStack                                FPT_WrStack
-#define XbowInit                       FPT_XbowInit
-#define autoCmdCmplt                   FPT_autoCmdCmplt
-#define autoLoadDefaultMap             FPT_autoLoadDefaultMap
-#define busMstrDataXferStart           FPT_busMstrDataXferStart
-#define busMstrSGDataXferStart         FPT_busMstrSGDataXferStart
-#define busMstrTimeOut                 FPT_busMstrTimeOut
-#define dataXferProcessor              FPT_dataXferProcessor
-#define default_intena                 FPT_default_intena
-#define hostDataXferAbort              FPT_hostDataXferAbort
-#define hostDataXferRestart            FPT_hostDataXferRestart
-#define inisci                         FPT_inisci
-#define mbCards                                FPT_mbCards
-#define nvRamInfo                      FPT_nvRamInfo
-#define phaseBusFree                   FPT_phaseBusFree
-#define phaseChkFifo                   FPT_phaseChkFifo
-#define phaseCommand                   FPT_phaseCommand
-#define phaseDataIn                    FPT_phaseDataIn
-#define phaseDataOut                   FPT_phaseDataOut
-#define phaseDecode                    FPT_phaseDecode
-#define phaseIllegal                   FPT_phaseIllegal
-#define phaseMsgIn                     FPT_phaseMsgIn
-#define phaseMsgOut                    FPT_phaseMsgOut
-#define phaseStatus                    FPT_phaseStatus
-#define queueAddSccb                   FPT_queueAddSccb
-#define queueCmdComplete               FPT_queueCmdComplete
-#define queueDisconnect                        FPT_queueDisconnect
-#define queueFindSccb                  FPT_queueFindSccb
-#define queueFlushSccb                 FPT_queueFlushSccb
-#define queueFlushTargSccb             FPT_queueFlushTargSccb
-#define queueSearchSelect              FPT_queueSearchSelect
-#define queueSelectFail                        FPT_queueSelectFail
-#define s_PhaseTbl                     FPT_s_PhaseTbl
-#define scamHAString                   FPT_scamHAString
-#define scamInfo                       FPT_scamInfo
-#define scarb                          FPT_scarb
-#define scasid                         FPT_scasid
-#define scbusf                         FPT_scbusf
-#define sccbMgrTbl                     FPT_sccbMgrTbl
-#define schkdd                         FPT_schkdd
-#define scini                          FPT_scini
-#define sciso                          FPT_sciso
-#define scmachid                       FPT_scmachid
-#define scsavdi                                FPT_scsavdi
-#define scsel                          FPT_scsel
-#define scsell                         FPT_scsell
-#define scsendi                                FPT_scsendi
-#define scvalq                         FPT_scvalq
-#define scwirod                                FPT_scwirod
-#define scwiros                                FPT_scwiros
-#define scwtsel                                FPT_scwtsel
-#define scxferc                                FPT_scxferc
-#define sdecm                          FPT_sdecm
-#define sfm                            FPT_sfm
-#define shandem                                FPT_shandem
-#define sinits                         FPT_sinits
-#define sisyncn                                FPT_sisyncn
-#define sisyncr                                FPT_sisyncr
-#define siwidn                         FPT_siwidn
-#define siwidr                         FPT_siwidr
-#define sres                           FPT_sres
-#define sresb                          FPT_sresb
-#define ssel                           FPT_ssel
-#define ssenss                         FPT_ssenss
-#define sssyncv                                FPT_sssyncv
-#define stsyncn                                FPT_stsyncn
-#define stwidn                         FPT_stwidn
-#define sxfrp                          FPT_sxfrp
-#define utilEERead                     FPT_utilEERead
-#define utilEEReadOrg                  FPT_utilEEReadOrg
-#define utilEESendCmdAddr              FPT_utilEESendCmdAddr
-#define utilEEWrite                    FPT_utilEEWrite
-#define utilEEWriteOnOff               FPT_utilEEWriteOnOff
-#define utilUpdateResidual             FPT_utilUpdateResidual
-
-
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   globals.h  $
- *
- *   Description:  Common shared global defines.
- *
- *   $Date: 1996/09/04 01:26:13 $
- *
- *   $Revision: 1.11 $
- *
- *----------------------------------------------------------------------*/
-#ifndef __GLOBALS_H__
-#define __GLOBALS_H__
-
-#define _UCB_MGR_  1
-#define _SCCB_MGR_ 2
-
-/*#include <osflags.h>*/
-
 #define MAX_CDBLEN  12
 
 #define SCAM_LEV_2     1
 
 #define CRCMASK        0xA001
 
-/*  In your osflags.h file, please ENSURE that only ONE OS FLAG 
-    is on at a time !!! Also, please make sure you turn set the 
-        variable FW_TYPE to either _UCB_MGR_ or _SCCB_MGR_  !!! */
-
-#if defined(DOS) || defined(WIN95_16) || defined(OS2) || defined(OTHER_16)
-   #define       COMPILER_16_BIT 1
-#elif defined(NETWARE) || defined(NT) || defined(WIN95_32) || defined(UNIX) || defined(OTHER_32) || defined(SOLARIS_REAL_MODE)
-   #define       COMPILER_32_BIT 1
-#endif
-
-
 #define     BL_VENDOR_ID      0x104B
 #define     FP_DEVICE_ID      0x8130
 #define     MM_DEVICE_ID      0x1040
 
 
-#ifndef FALSE
-#define FALSE           0
-#endif
-#ifndef TRUE
-#define TRUE            (!(FALSE))
-#endif
-
-#ifndef NULL
-#define NULL            0
-#endif
-
 #define FAILURE         0xFFFFFFFFL
 
 
@@ -222,26 +71,10 @@ typedef unsigned long * PULONG;
 typedef void *          PVOID;
 
 
-#if defined(COMPILER_16_BIT)
-typedef unsigned char far       * uchar_ptr;
-typedef unsigned short far      * ushort_ptr;
-typedef unsigned long far       * ulong_ptr;
-#endif  /* 16_BIT_COMPILER */
-
-#if defined(COMPILER_32_BIT)
 typedef unsigned char           * uchar_ptr;
 typedef unsigned short          * ushort_ptr;
 typedef unsigned long           * ulong_ptr;
-#endif  /* 32_BIT_COMPILER */
-
-
-/*                             NEW TYPE DEFINITIONS (shared with Mylex North)
 
-**  Use following type defines to avoid confusion in 16 and 32-bit
-**  environments.  Avoid using 'int' as it denotes 16 bits in 16-bit
-**  environment and 32 in 32-bit environments.
-
-*/
 
 #define s08bits        char
 #define s16bits        short
@@ -251,195 +84,19 @@ typedef unsigned long           * ulong_ptr;
 #define u16bits        unsigned s16bits
 #define u32bits        unsigned s32bits
 
-#if defined(COMPILER_16_BIT)
-
-typedef u08bits far    * pu08bits;
-typedef u16bits far    * pu16bits;
-typedef u32bits far    * pu32bits;
-
-#endif /* COMPILER_16_BIT */
-
-#if defined(COMPILER_32_BIT)
-
 typedef u08bits        * pu08bits;
 typedef u16bits        * pu16bits;
 typedef u32bits        * pu32bits;
 
-#endif /* COMPILER_32_BIT */
-
 
 #define BIT(x)          ((UCHAR)(1<<(x)))    /* single-bit mask in bit position x */
 #define BITW(x)          ((USHORT)(1<<(x)))  /* single-bit mask in bit position x */
 
 
 
-#if defined(DOS)
-/*#include <dos.h>*/
-       #undef inportb          /* undefine for Borland Lib */
-       #undef inport           /* they may have define I/O function in LIB */
-       #undef outportb
-       #undef outport
-
-       #define OS_InPortByte(ioport)           inportb(ioport)
-       #define OS_InPortWord(ioport)           inport(ioport)
-       #define OS_InPortLong(ioport)                   inportq(ioport, val)
-       #define OS_OutPortByte(ioport, val) outportb(ioport, val)
-       #define OS_OutPortWord(ioport, val)     outport(ioport, val)
-       #define OS_OutPortLong(ioport)          outportq(ioport, val)
-#endif /* DOS */
-
-#if defined(NETWARE) || defined(OTHER_32) ||  defined(OTHER_16)
-       extern u08bits  OS_InPortByte(u32bits ioport);
-       extern u16bits  OS_InPortWord(u32bits ioport);
-       extern u32bits  OS_InPortLong(u32bits ioport);
-
-       extern OS_InPortByteBuffer(u32bits ioport, pu08bits buffer, u32bits count);
-       extern OS_InPortWordBuffer(u32bits ioport, pu16bits buffer, u32bits count);
-       extern OS_OutPortByte(u32bits ioport, u08bits val);
-       extern OS_OutPortWord(u32bits ioport, u16bits val);
-       extern OS_OutPortLong(u32bits ioport, u32bits val);
-       extern OS_OutPortByteBuffer(u32bits ioport, pu08bits buffer, u32bits count);
-       extern OS_OutPortWordBuffer(u32bits ioport, pu16bits buffer, u32bits count);
-#endif /* NETWARE || OTHER_32 || OTHER_16 */
-
-#if defined (NT) || defined(WIN95_32) || defined(WIN95_16)
-       #if defined(NT)
-
-               extern __declspec(dllimport) u08bits ScsiPortReadPortUchar(pu08bits ioport);
-               extern __declspec(dllimport) u16bits ScsiPortReadPortUshort(pu16bits ioport);
-               extern __declspec(dllimport) u32bits ScsiPortReadPortUlong(pu32bits ioport);
-               extern __declspec(dllimport) void ScsiPortWritePortUchar(pu08bits ioport, u08bits val);
-               extern __declspec(dllimport) void ScsiPortWritePortUshort(pu16bits port, u16bits val);
-               extern __declspec(dllimport) void ScsiPortWritePortUlong(pu32bits port, u32bits val);
-
-       #else
-
-               extern u08bits ScsiPortReadPortUchar(pu08bits ioport);
-               extern u16bits ScsiPortReadPortUshort(pu16bits ioport);
-               extern u32bits ScsiPortReadPortUlong(pu32bits ioport);
-               extern void ScsiPortWritePortUchar(pu08bits ioport, u08bits val);
-               extern void ScsiPortWritePortUshort(pu16bits port, u16bits val);
-               extern void ScsiPortWritePortUlong(pu32bits port, u32bits val);
-       #endif
-
-
-       #define OS_InPortByte(ioport) ScsiPortReadPortUchar((pu08bits) ioport)
-       #define OS_InPortWord(ioport) ScsiPortReadPortUshort((pu16bits) ioport)
-       #define OS_InPortLong(ioport) ScsiPortReadPortUlong((pu32bits) ioport)
-
-       #define OS_OutPortByte(ioport, val) ScsiPortWritePortUchar((pu08bits) ioport, (u08bits) val)
-       #define OS_OutPortWord(ioport, val) ScsiPortWritePortUshort((pu16bits) ioport, (u16bits) val)
-       #define OS_OutPortLong(ioport, val) ScsiPortWritePortUlong((pu32bits) ioport, (u32bits) val)
-       #define OS_OutPortByteBuffer(ioport, buffer, count) \
-               ScsiPortWritePortBufferUchar((pu08bits)&port, (pu08bits) buffer, (u32bits) count)
-       #define OS_OutPortWordBuffer(ioport, buffer, count) \
-               ScsiPortWritePortBufferUshort((pu16bits)&port, (pu16bits) buffer, (u32bits) count)
-
-       #define OS_Lock(x)
-       #define OS_UnLock(x)
-#endif /* NT || WIN95_32 || WIN95_16 */
-
-#if defined (UNIX) && !defined(OS_InPortByte)
-       #define OS_InPortByte(ioport)    inb((u16bits)ioport)
-       #define OS_InPortWord(ioport)    inw((u16bits)ioport)
-       #define OS_InPortLong(ioport)    inl((u16bits)ioport)
-       #define OS_OutPortByte(ioport,val)  outb((u16bits)ioport, (u08bits)val)
-       #define OS_OutPortWord(ioport,val)  outw((u16bits)ioport, (u16bits)val)
-       #define OS_OutPortLong(ioport,val)  outl((u16bits)ioport, (u32bits)val)
-
-       #define OS_Lock(x)
-       #define OS_UnLock(x)
-#endif /* UNIX */
-
-
-#if defined(OS2)
-       extern u08bits  inb(u32bits ioport);
-       extern u16bits  inw(u32bits ioport);
-       extern void     outb(u32bits ioport, u08bits val);
-       extern void     outw(u32bits ioport, u16bits val);
-
-       #define OS_InPortByte(ioport)                   inb(ioport)
-       #define OS_InPortWord(ioport)                   inw(ioport)
-       #define OS_OutPortByte(ioport, val)     outb(ioport, val)
-       #define OS_OutPortWord(ioport, val)     outw(ioport, val)
-       extern u32bits  OS_InPortLong(u32bits ioport);
-       extern void     OS_OutPortLong(u32bits ioport, u32bits val);
-
-       #define OS_Lock(x)
-       #define OS_UnLock(x)
-#endif /* OS2 */
-
-#if defined(SOLARIS_REAL_MODE)
-
-extern unsigned char    inb(unsigned long ioport);
-extern unsigned short   inw(unsigned long ioport);
-
-#define OS_InPortByte(ioport)    inb(ioport)
-#define OS_InPortWord(ioport)    inw(ioport)
-
-extern void OS_OutPortByte(unsigned long ioport, unsigned char val);
-extern void OS_OutPortWord(unsigned long ioport, unsigned short val);
-extern unsigned long  OS_InPortLong(unsigned long ioport);
-extern void     OS_OutPortLong(unsigned long ioport, unsigned long val);
-
-#define OS_Lock(x)
-#define OS_UnLock(x)
-
-#endif  /* SOLARIS_REAL_MODE */
-
-#endif  /* __GLOBALS_H__ */
-
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   sccbmgr.h  $
- *
- *   Description:  Common shared SCCB Interface defines and SCCB 
- *                                              Manager specifics defines.
- *
- *   $Date: 1996/10/24 23:09:33 $
- *
- *   $Revision: 1.14 $
- *
- *----------------------------------------------------------------------*/
-
-#ifndef __SCCB_H__
-#define __SCCB_H__
-
-/*#include <osflags.h>*/
-/*#include <globals.h>*/
-
-#if defined(BUGBUG)
-#define debug_size 32
-#endif
-
-#if defined(DOS)
-
-   typedef struct _SCCB near *PSCCB;
-       #if (FW_TYPE == _SCCB_MGR_)
-       typedef void (*CALL_BK_FN)(PSCCB);
-       #endif
-
-#elif defined(OS2)
-
-   typedef struct _SCCB far *PSCCB;
-       #if (FW_TYPE == _SCCB_MGR_)
-       typedef void (far *CALL_BK_FN)(PSCCB);
-       #endif
-
-#else
-
-   typedef struct _SCCB *PSCCB;
-       #if (FW_TYPE == _SCCB_MGR_)
-       typedef void (*CALL_BK_FN)(PSCCB);
-       #endif
 
-#endif
+typedef struct _SCCB *PSCCB;
+typedef void (*CALL_BK_FN)(PSCCB);
 
 
 typedef struct SCCBMgr_info {
@@ -466,25 +123,13 @@ typedef struct SCCBMgr_info {
    ULONG    si_secondary_range;
 } SCCBMGR_INFO;
 
-#if defined(DOS)
-   typedef SCCBMGR_INFO *      PSCCBMGR_INFO;
-#else
-   #if defined (COMPILER_16_BIT)
-   typedef SCCBMGR_INFO far *  PSCCBMGR_INFO;
-   #else
-   typedef SCCBMGR_INFO *      PSCCBMGR_INFO;
-   #endif
-#endif // defined(DOS)
-
+typedef SCCBMGR_INFO *      PSCCBMGR_INFO;
 
 
-
-#if (FW_TYPE==_SCCB_MGR_)
-       #define SCSI_PARITY_ENA           0x0001
-       #define LOW_BYTE_TERM             0x0010
-       #define HIGH_BYTE_TERM            0x0020
-       #define BUSTYPE_PCI       0x3
-#endif
+#define SCSI_PARITY_ENA                  0x0001
+#define LOW_BYTE_TERM            0x0010
+#define HIGH_BYTE_TERM           0x0020
+#define BUSTYPE_PCI      0x3
 
 #define SUPPORT_16TAR_32LUN      0x0002
 #define SOFT_RESET               0x0004
@@ -553,9 +198,6 @@ typedef struct _SCCB {
    UCHAR   Save_CdbLen;
    UCHAR   Sccb_XferState;
    ULONG   Sccb_SGoffset;
-#if (FW_TYPE == _UCB_MGR_)
-   PUCB    Sccb_ucb_ptr;
-#endif
    } SCCB;
 
 #define SCCB_SIZE sizeof(SCCB)
@@ -626,25 +268,9 @@ typedef struct _SCCB {
 
 
 
-#if (FW_TYPE==_UCB_MGR_)  
-   #define  HBA_AUTO_SENSE_FAIL        0x1B  
-   #define  HBA_TQ_REJECTED            0x1C  
-   #define  HBA_UNSUPPORTED_MSG         0x1D  
-   #define  HBA_HW_ERROR               0x20  
-   #define  HBA_ATN_NOT_RESPONDED      0x21  
-   #define  HBA_SCSI_RESET_BY_ADAPTER  0x22
-   #define  HBA_SCSI_RESET_BY_TARGET   0x23
-   #define  HBA_WRONG_CONNECTION       0x24
-   #define  HBA_BUS_DEVICE_RESET       0x25
-   #define  HBA_ABORT_QUEUE            0x26
-
-#else // these are not defined in BUDI/UCB
-
-   #define SCCB_INVALID_DIRECTION      0x18  /* Invalid target direction */
-   #define SCCB_DUPLICATE_SCCB         0x19  /* Duplicate SCCB */
-   #define SCCB_SCSI_RST               0x35  /* SCSI RESET detected. */
-
-#endif // (FW_TYPE==_UCB_MGR_)  
+#define SCCB_INVALID_DIRECTION      0x18  /* Invalid target direction */
+#define SCCB_DUPLICATE_SCCB         0x19  /* Duplicate SCCB */
+#define SCCB_SCSI_RST               0x35  /* SCSI RESET detected. */
 
 
 #define SCCB_IN_PROCESS            0x00
@@ -657,115 +283,20 @@ typedef struct _SCCB {
 #define SCCB_SIZE sizeof(SCCB)
 
 
-
-
-#if (FW_TYPE == _UCB_MGR_)
-       void SccbMgr_start_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb);
-       s32bits SccbMgr_abort_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb);
-       u08bits SccbMgr_my_int(CARD_HANDLE pCurrCard);
-       s32bits SccbMgr_isr(CARD_HANDLE pCurrCard);
-       void SccbMgr_scsi_reset(CARD_HANDLE pCurrCard);
-       void SccbMgr_timer_expired(CARD_HANDLE pCurrCard);
-       void SccbMgr_unload_card(CARD_HANDLE pCurrCard);
-       void SccbMgr_restore_foreign_state(CARD_HANDLE pCurrCard);
-       void SccbMgr_restore_native_state(CARD_HANDLE pCurrCard);
-       void SccbMgr_save_foreign_state(PADAPTER_INFO pAdapterInfo);
-
-#endif
-
-
-#if (FW_TYPE == _SCCB_MGR_)
-
- #if defined (DOS)
-       int    SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo);
-       USHORT SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo);
-       void  SccbMgr_start_sccb(USHORT pCurrCard, PSCCB p_SCCB);
-       int   SccbMgr_abort_sccb(USHORT pCurrCard, PSCCB p_SCCB);
-       UCHAR SccbMgr_my_int(USHORT pCurrCard);
-       int   SccbMgr_isr(USHORT pCurrCard);
-       void  SccbMgr_scsi_reset(USHORT pCurrCard);
-       void  SccbMgr_timer_expired(USHORT pCurrCard);
-       USHORT SccbMgr_status(USHORT pCurrCard);
-       void SccbMgr_unload_card(USHORT pCurrCard);
-
- #else    //non-DOS
-
-       int   SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo);
-       ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo);
-       void  SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_SCCB);
-       int   SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_SCCB);
-       UCHAR SccbMgr_my_int(ULONG pCurrCard);
-       int   SccbMgr_isr(ULONG pCurrCard);
-       void  SccbMgr_scsi_reset(ULONG pCurrCard);
-       void  SccbMgr_enable_int(ULONG pCurrCard);
-       void  SccbMgr_disable_int(ULONG pCurrCard);
-       void  SccbMgr_timer_expired(ULONG pCurrCard);
-       void SccbMgr_unload_card(ULONG pCurrCard);
-
-  #endif
-#endif  // (FW_TYPE == _SCCB_MGR_)
-
-#endif  /* __SCCB_H__ */
-
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   blx30.h  $
- *
- *   Description: This module contains SCCB/UCB Manager implementation
- *                specific stuff.
- *
- *   $Date: 1996/11/13 18:34:22 $
- *
- *   $Revision: 1.10 $
- *
- *----------------------------------------------------------------------*/
-
-
-#ifndef __blx30_H__
-#define __blx30_H__
-
-/*#include <globals.h>*/
-
 #define  ORION_FW_REV      3110
 
-
-
-
 #define HARP_REVD    1
 
 
-#if defined(DOS)
-#define QUEUE_DEPTH     8+1            /*1 for Normal disconnect 0 for Q'ing. */
-#else
 #define QUEUE_DEPTH     254+1            /*1 for Normal disconnect 32 for Q'ing. */
-#endif   // defined(DOS)
 
 #define        MAX_MB_CARDS    4                                       /* Max. no of cards suppoerted on Mother Board */
 
 #define WIDE_SCSI       1
 
-#if defined(WIDE_SCSI)
-   #if defined(DOS)
-      #define MAX_SCSI_TAR    16
-      #define MAX_LUN         8
-               #define LUN_MASK                        0x07
-   #else
-      #define MAX_SCSI_TAR    16
-      #define MAX_LUN         32
-               #define LUN_MASK                        0x1f
-       
-   #endif
-#else
-   #define MAX_SCSI_TAR    8
-   #define MAX_LUN         8
-       #define LUN_MASK                        0x07
-#endif 
+#define MAX_SCSI_TAR    16
+#define MAX_LUN         32
+#define LUN_MASK                       0x1f
 
 #if defined(HARP_REVA)
 #define SG_BUF_CNT      15             /*Number of prefetched elements. */
@@ -778,116 +309,12 @@ typedef struct _SCCB {
 #define SG_ELEMENT_MASK 0xFFFFFFFFL
 
 
-#if (FW_TYPE == _UCB_MGR_)
-       #define OPC_DECODE_NORMAL       0x0f7f
-#endif   // _UCB_MGR_
-
-
-
-#if defined(DOS)
-
-/*#include <dos.h>*/
-       #define RD_HARPOON(ioport)          (OS_InPortByte(ioport))
-       #define RDW_HARPOON(ioport)         (OS_InPortWord(ioport))
-       #define WR_HARPOON(ioport,val)      (OS_OutPortByte(ioport,val))
-       #define WRW_HARPOON(ioport,val)     (OS_OutPortWord(ioport,val))
-
-       #define RD_HARP32(port,offset,data)  asm{db 66h;         \
-                                       push ax;             \
-                                       mov dx,port;         \
-                                       add dx, offset;      \
-                                       db 66h;              \
-                                       in ax,dx;            \
-                                       db 66h;              \
-                                       mov word ptr data,ax;\
-                                       db 66h;              \
-                                       pop ax}
-
-       #define WR_HARP32(port,offset,data) asm{db 66h;          \
-                                       push ax;             \
-                                       mov dx,port;         \
-                                       add dx, offset;      \
-                                       db 66h;              \
-                                       mov ax,word ptr data;\
-                                       db 66h;              \
-                                       out dx,ax;           \
-                                       db 66h;              \
-                                       pop ax}
-#endif /* DOS */
-
-#if defined(NETWARE) || defined(OTHER_32) ||  defined(OTHER_16)
-       #define RD_HARPOON(ioport)     OS_InPortByte((unsigned long)ioport)
-       #define RDW_HARPOON(ioport)    OS_InPortWord((unsigned long)ioport)
-       #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong(ioport + offset))
-       #define WR_HARPOON(ioport,val) OS_OutPortByte((ULONG)ioport,(UCHAR) val)
-       #define WRW_HARPOON(ioport,val)  OS_OutPortWord((ULONG)ioport,(USHORT)val)
-       #define WR_HARP32(ioport,offset,data)  OS_OutPortLong((ioport + offset), data)
-#endif /* NETWARE || OTHER_32 || OTHER_16 */
-
-#if defined(NT) || defined(WIN95_32) || defined(WIN95_16)
-       #define RD_HARPOON(ioport)          OS_InPortByte((ULONG)ioport)
-       #define RDW_HARPOON(ioport)         OS_InPortWord((ULONG)ioport)
-       #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((ULONG)(ioport + offset)))
-       #define WR_HARPOON(ioport,val)      OS_OutPortByte((ULONG)ioport,(UCHAR) val)
-       #define WRW_HARPOON(ioport,val)     OS_OutPortWord((ULONG)ioport,(USHORT)val)
-       #define WR_HARP32(ioport,offset,data)  OS_OutPortLong((ULONG)(ioport + offset), data)
-#endif /* NT || WIN95_32 || WIN95_16 */
-
-#if defined (UNIX)
-       #define RD_HARPOON(ioport)          OS_InPortByte((u32bits)ioport)
-       #define RDW_HARPOON(ioport)         OS_InPortWord((u32bits)ioport)
-       #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((u32bits)(ioport + offset)))
-       #define WR_HARPOON(ioport,val)      OS_OutPortByte((u32bits)ioport,(u08bits) val)
-       #define WRW_HARPOON(ioport,val)       OS_OutPortWord((u32bits)ioport,(u16bits)val)
-       #define WR_HARP32(ioport,offset,data)  OS_OutPortLong((u32bits)(ioport + offset), data)
-#endif /* UNIX */
-
-#if defined(OS2)
-       #define RD_HARPOON(ioport)          OS_InPortByte((unsigned long)ioport)
-       #define RDW_HARPOON(ioport)         OS_InPortWord((unsigned long)ioport)
-       #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((ULONG)(ioport + offset)))
-       #define WR_HARPOON(ioport,val)      OS_OutPortByte((ULONG)ioport,(UCHAR) val)
-       #define WRW_HARPOON(ioport,val)       OS_OutPortWord((ULONG)ioport,(USHORT)val)
-       #define WR_HARP32(ioport,offset,data)  OS_OutPortLong(((ULONG)(ioport + offset)), data)
-#endif /* OS2 */
-
-#if defined(SOLARIS_REAL_MODE)
-
-       #define RD_HARPOON(ioport)          OS_InPortByte((unsigned long)ioport)
-       #define RDW_HARPOON(ioport)         OS_InPortWord((unsigned long)ioport)
-       #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((ULONG)(ioport + offset)))
-       #define WR_HARPOON(ioport,val)      OS_OutPortByte((ULONG)ioport,(UCHAR) val)
-       #define WRW_HARPOON(ioport,val)       OS_OutPortWord((ULONG)ioport,(USHORT)val)
-       #define WR_HARP32(ioport,offset,data)  OS_OutPortLong((ULONG)(ioport + offset), (ULONG)data)
-
-#endif  /* SOLARIS_REAL_MODE */
-
-#endif  /* __BLX30_H__ */
-
-
-/*----------------------------------------------------------------------
- * 
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   target.h  $
- *
- *   Description:  Definitions for Target related structures
- *
- *   $Date: 1996/12/11 22:06:20 $
- *
- *   $Revision: 1.9 $
- *
- *----------------------------------------------------------------------*/
-
-#ifndef __TARGET__
-#define __TARGET__
-
-/*#include <globals.h>*/
-/*#include <blx30.h>*/
+#define RD_HARPOON(ioport)          OS_InPortByte((u32bits)ioport)
+#define RDW_HARPOON(ioport)         OS_InPortWord((u32bits)ioport)
+#define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((u32bits)(ioport + offset)))
+#define WR_HARPOON(ioport,val)      OS_OutPortByte((u32bits)ioport,(u08bits) val)
+#define WRW_HARPOON(ioport,val)       OS_OutPortWord((u32bits)ioport,(u16bits)val)
+#define WR_HARP32(ioport,offset,data)  OS_OutPortLong((u32bits)(ioport + offset), data)
 
 
 #define  TAR_SYNC_MASK     (BIT(7)+BIT(6))
@@ -919,16 +346,7 @@ typedef struct _SCCB {
 #define  EE_WIDE_SCSI      BIT(7)
 
 
-#if defined(DOS)
-   typedef struct SCCBMgr_tar_info near *PSCCBMgr_tar_info;
-
-#elif defined(OS2)
-   typedef struct SCCBMgr_tar_info far *PSCCBMgr_tar_info;
-
-#else
-   typedef struct SCCBMgr_tar_info *PSCCBMgr_tar_info;
-
-#endif
+typedef struct SCCBMgr_tar_info *PSCCBMgr_tar_info;
 
 
 typedef struct SCCBMgr_tar_info {
@@ -949,11 +367,7 @@ typedef struct SCCBMgr_tar_info {
 typedef struct NVRAMInfo {
        UCHAR           niModel;                                                                /* Model No. of card */
        UCHAR           niCardNo;                                                       /* Card no. */
-#if defined(DOS)
-       USHORT  niBaseAddr;                                                     /* Port Address of card */
-#else
        ULONG           niBaseAddr;                                                     /* Port Address of card */
-#endif
        UCHAR           niSysConf;                                                      /* Adapter Configuration byte - Byte 16 of eeprom map */
        UCHAR           niScsiConf;                                                     /* SCSI Configuration byte - Byte 17 of eeprom map */
        UCHAR           niScamConf;                                                     /* SCAM Configuration byte - Byte 20 of eeprom map */
@@ -962,13 +376,7 @@ typedef struct NVRAMInfo {
        UCHAR           niScamTbl[MAX_SCSI_TAR][4];     /* Compressed Scam name string of Targets */
 }NVRAMINFO;
 
-#if defined(DOS)
-typedef NVRAMINFO near *PNVRamInfo;
-#elif defined (OS2)
-typedef NVRAMINFO far *PNVRamInfo;
-#else
 typedef NVRAMINFO *PNVRamInfo;
-#endif
 
 #define        MODEL_LT                1
 #define        MODEL_DL                2
@@ -978,17 +386,9 @@ typedef NVRAMINFO *PNVRamInfo;
 
 typedef struct SCCBcard {
    PSCCB currentSCCB;
-#if (FW_TYPE==_SCCB_MGR_)
    PSCCBMGR_INFO cardInfo;
-#else
-   PADAPTER_INFO cardInfo;
-#endif
 
-#if defined(DOS)
-   USHORT ioPort;
-#else
    ULONG ioPort;
-#endif
 
    USHORT cmdCounter;
    UCHAR  discQCount;
@@ -1002,13 +402,7 @@ typedef struct SCCBcard {
       
 }SCCBCARD;
 
-#if defined(DOS)
-typedef struct SCCBcard near *PSCCBcard;
-#elif defined (OS2)
-typedef struct SCCBcard far *PSCCBcard;
-#else
 typedef struct SCCBcard *PSCCBcard;
-#endif
 
 
 #define F_TAG_STARTED          0x01
@@ -1063,29 +457,6 @@ typedef struct SCCBscam_info {
     
 } SCCBSCAM_INFO, *PSCCBSCAM_INFO;
 
-#endif
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   scsi2.h  $
- *
- *   Description:  Register definitions for HARPOON ASIC.
- *
- *   $Date: 1996/11/13 18:32:57 $
- *
- *   $Revision: 1.4 $
- *
- *----------------------------------------------------------------------*/
-
-#ifndef __SCSI_H__
-#define __SCSI_H__
-
-
 
 #define  SCSI_TEST_UNIT_READY    0x00
 #define  SCSI_REZERO_UNIT        0x01
@@ -1195,29 +566,6 @@ typedef struct SCCBscam_info {
 #define  SYNC5MBS                0x32
 #define  MAX_OFFSET              0x0F  /* Maxbyteoffset for Sync Xfers */
 
-#endif
-/*----------------------------------------------------------------------
- *  
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   eeprom.h  $
- *
- *   Description:  Definitions for EEPROM related structures
- *
- *   $Date: 1996/11/13 18:28:39 $
- *
- *   $Revision: 1.4 $
- *
- *----------------------------------------------------------------------*/
-
-#ifndef __EEPROM__
-#define __EEPROM__
-
-/*#include <globals.h>*/
 
 #define  EEPROM_WD_CNT     256
 
@@ -1280,31 +628,6 @@ typedef struct SCCBscam_info {
    #define  DISC_ENABLE_BIT   BIT(6)
 
 
-#endif
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   harpoon.h  $
- *
- *   Description:  Register definitions for HARPOON ASIC.
- *
- *   $Date: 1997/07/09 21:44:36 $
- *
- *   $Revision: 1.9 $
- *
- *----------------------------------------------------------------------*/
-
-
-/*#include <globals.h>*/
-
-#ifndef __HARPOON__
-#define __HARPOON__
-
 
    #define  hp_vendor_id_0       0x00          /* LSB */
       #define  ORION_VEND_0   0x4B
@@ -1578,8 +901,6 @@ typedef struct SCCBscam_info {
 
 
 
-   extern USHORT default_intena;
-
    #define  hp_intena           0x40
 
       #define  RESET            BITW(7)
@@ -1972,15 +1293,6 @@ typedef struct SCCBscam_info {
                                  xfercnt <<= 16,\
                                  xfercnt |= RDW_HARPOON((USHORT)(port+hp_xfercnt_0)))
  */
-#if defined(DOS)
-#define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((USHORT)(port+hp_host_addr_lo), (USHORT)(addr & 0x0000FFFFL)),\
-         addr >>= 16,\
-         WRW_HARPOON((USHORT)(port+hp_host_addr_hmi), (USHORT)(addr & 0x0000FFFFL)),\
-         WR_HARP32(port,hp_xfercnt_0,count),\
-         WRW_HARPOON((USHORT)(port+hp_xfer_cnt_lo), (USHORT)(count & 0x0000FFFFL)),\
-         count >>= 16,\
-         WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
-#else
 #define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((port+hp_host_addr_lo), (USHORT)(addr & 0x0000FFFFL)),\
          addr >>= 16,\
          WRW_HARPOON((port+hp_host_addr_hmi), (USHORT)(addr & 0x0000FFFFL)),\
@@ -1988,7 +1300,6 @@ typedef struct SCCBscam_info {
          WRW_HARPOON((port+hp_xfer_cnt_lo), (USHORT)(count & 0x0000FFFFL)),\
          count >>= 16,\
          WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
-#endif
 
 #define ACCEPT_MSG(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
                           WR_HARPOON(port+hp_scsisig, S_ILL_PH);}
@@ -2020,383 +1331,145 @@ typedef struct SCCBscam_info {
 
 
 
-#endif
-
-
-#if (FW_TYPE==_UCB_MGR_)
-void ReadNVRam(PSCCBcard pCurrCard,PUCB p_ucb);
-void WriteNVRam(PSCCBcard pCurrCard,PUCB p_ucb);
-void UpdateCheckSum(u32bits baseport);
-#endif // (FW_TYPE==_UCB_MGR_)
-
-#if defined(DOS)
-UCHAR sfm(USHORT port, PSCCB pcurrSCCB);
-void  scsiStartAuto(USHORT port);
-UCHAR sisyncn(USHORT port, UCHAR p_card, UCHAR syncFlag);
-void  ssel(USHORT port, UCHAR p_card);
-void  sres(USHORT port, UCHAR p_card, PSCCBcard pCurrCard);
-void  sdecm(UCHAR message, USHORT port, UCHAR p_card);
-void  shandem(USHORT port, UCHAR p_card,PSCCB pCurrSCCB);
-void  stsyncn(USHORT port, UCHAR p_card);
-void  sisyncr(USHORT port,UCHAR sync_pulse, UCHAR offset);
-void  sssyncv(USHORT p_port, UCHAR p_id, UCHAR p_sync_value, PSCCBMgr_tar_info currTar_Info);
-void  sresb(USHORT port, UCHAR p_card);
-void  sxfrp(USHORT p_port, UCHAR p_card);
-void  schkdd(USHORT port, UCHAR p_card);
-UCHAR RdStack(USHORT port, UCHAR index);
-void  WrStack(USHORT portBase, UCHAR index, UCHAR data);
-UCHAR ChkIfChipInitialized(USHORT ioPort);
-
-#if defined(V302)
-UCHAR GetTarLun(USHORT port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tag, PUCHAR lun);
-#endif
 
-void SendMsg(USHORT port, UCHAR message);
-void  queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, UCHAR error_code);
-UCHAR scsellDOS(USHORT p_port, UCHAR targ_id);
-#else
-UCHAR sfm(ULONG port, PSCCB pcurrSCCB);
 void  scsiStartAuto(ULONG port);
-UCHAR sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag);
-void  ssel(ULONG port, UCHAR p_card);
-void  sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard);
-void  sdecm(UCHAR message, ULONG port, UCHAR p_card);
-void  shandem(ULONG port, UCHAR p_card,PSCCB pCurrSCCB);
-void  stsyncn(ULONG port, UCHAR p_card);
-void  sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset);
-void  sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value, PSCCBMgr_tar_info currTar_Info);
-void  sresb(ULONG port, UCHAR p_card);
-void  sxfrp(ULONG p_port, UCHAR p_card);
-void  schkdd(ULONG port, UCHAR p_card);
-UCHAR RdStack(ULONG port, UCHAR index);
-void  WrStack(ULONG portBase, UCHAR index, UCHAR data);
-UCHAR ChkIfChipInitialized(ULONG ioPort);
-
-#if defined(V302)
-UCHAR GetTarLun(ULONG port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tar, PUCHAR lun);
-#endif
-
-void SendMsg(ULONG port, UCHAR message);
-void  queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, UCHAR error_code);
-#endif
-
-void  ssenss(PSCCBcard pCurrCard);
-void  sinits(PSCCB p_sccb, UCHAR p_card);
-void  RNVRamData(PNVRamInfo pNvRamInfo);
-
-#if defined(WIDE_SCSI)
-   #if defined(DOS)
-   UCHAR siwidn(USHORT port, UCHAR p_card);
-   void  stwidn(USHORT port, UCHAR p_card);
-   void  siwidr(USHORT port, UCHAR width);
-   #else
-   UCHAR siwidn(ULONG port, UCHAR p_card);
-   void  stwidn(ULONG port, UCHAR p_card);
-   void  siwidr(ULONG port, UCHAR width);
-   #endif
-#endif
-
+static UCHAR FPT_sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag);
+static void  FPT_ssel(ULONG port, UCHAR p_card);
+static void  FPT_sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard);
+static void  FPT_shandem(ULONG port, UCHAR p_card,PSCCB pCurrSCCB);
+static void  FPT_stsyncn(ULONG port, UCHAR p_card);
+static void  FPT_sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset);
+static void  FPT_sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value,
+                        PSCCBMgr_tar_info currTar_Info);
+static void  FPT_sresb(ULONG port, UCHAR p_card);
+static void  FPT_sxfrp(ULONG p_port, UCHAR p_card);
+static void  FPT_schkdd(ULONG port, UCHAR p_card);
+static UCHAR FPT_RdStack(ULONG port, UCHAR index);
+static void  FPT_WrStack(ULONG portBase, UCHAR index, UCHAR data);
+static UCHAR FPT_ChkIfChipInitialized(ULONG ioPort);
 
-void  queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card);
-void  queueDisconnect(PSCCB p_SCCB, UCHAR p_card);
-void  queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_SCCB, UCHAR p_card);
-void  queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card);
-void  queueFlushSccb(UCHAR p_card, UCHAR error_code);
-void  queueAddSccb(PSCCB p_SCCB, UCHAR card);
-UCHAR queueFindSccb(PSCCB p_SCCB, UCHAR p_card);
-void  utilUpdateResidual(PSCCB p_SCCB);
-USHORT CalcCrc16(UCHAR buffer[]);
-UCHAR  CalcLrc(UCHAR buffer[]);
-
-
-#if defined(DOS)
-void  Wait1Second(USHORT p_port);
-void  Wait(USHORT p_port, UCHAR p_delay);
-void  utilEEWriteOnOff(USHORT p_port,UCHAR p_mode);
-void  utilEEWrite(USHORT p_port, USHORT ee_data, USHORT ee_addr);
-USHORT utilEERead(USHORT p_port, USHORT ee_addr);
-USHORT utilEEReadOrg(USHORT p_port, USHORT ee_addr);
-void  utilEESendCmdAddr(USHORT p_port, UCHAR ee_cmd, USHORT ee_addr);
-#else
-void  Wait1Second(ULONG p_port);
-void  Wait(ULONG p_port, UCHAR p_delay);
-void  utilEEWriteOnOff(ULONG p_port,UCHAR p_mode);
-void  utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr);
-USHORT utilEERead(ULONG p_port, USHORT ee_addr);
-USHORT utilEEReadOrg(ULONG p_port, USHORT ee_addr);
-void  utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr);
-#endif
-
-
-
-#if defined(OS2)
-   void  far phaseDataOut(ULONG port, UCHAR p_card);
-   void  far phaseDataIn(ULONG port, UCHAR p_card);
-   void  far phaseCommand(ULONG port, UCHAR p_card);
-   void  far phaseStatus(ULONG port, UCHAR p_card);
-   void  far phaseMsgOut(ULONG port, UCHAR p_card);
-   void  far phaseMsgIn(ULONG port, UCHAR p_card);
-   void  far phaseIllegal(ULONG port, UCHAR p_card);
-#else
-   #if defined(DOS)
-      void  phaseDataOut(USHORT port, UCHAR p_card);
-      void  phaseDataIn(USHORT port, UCHAR p_card);
-      void  phaseCommand(USHORT port, UCHAR p_card);
-      void  phaseStatus(USHORT port, UCHAR p_card);
-      void  phaseMsgOut(USHORT port, UCHAR p_card);
-      void  phaseMsgIn(USHORT port, UCHAR p_card);
-      void  phaseIllegal(USHORT port, UCHAR p_card);
-   #else
-      void  phaseDataOut(ULONG port, UCHAR p_card);
-      void  phaseDataIn(ULONG port, UCHAR p_card);
-      void  phaseCommand(ULONG port, UCHAR p_card);
-      void  phaseStatus(ULONG port, UCHAR p_card);
-      void  phaseMsgOut(ULONG port, UCHAR p_card);
-      void  phaseMsgIn(ULONG port, UCHAR p_card);
-      void  phaseIllegal(ULONG port, UCHAR p_card);
-   #endif
-#endif
-
-#if defined(DOS)
-void  phaseDecode(USHORT port, UCHAR p_card);
-void  phaseChkFifo(USHORT port, UCHAR p_card);
-void  phaseBusFree(USHORT p_port, UCHAR p_card);
-#else
-void  phaseDecode(ULONG port, UCHAR p_card);
-void  phaseChkFifo(ULONG port, UCHAR p_card);
-void  phaseBusFree(ULONG p_port, UCHAR p_card);
-#endif
-
-
-
-
-#if defined(DOS)
-void  XbowInit(USHORT port, UCHAR scamFlg);
-void  BusMasterInit(USHORT p_port);
-int   DiagXbow(USHORT port);
-int   DiagBusMaster(USHORT port);
-void  DiagEEPROM(USHORT p_port);
-#else
-void  XbowInit(ULONG port, UCHAR scamFlg);
-void  BusMasterInit(ULONG p_port);
-int   DiagXbow(ULONG port);
-int   DiagBusMaster(ULONG port);
-void  DiagEEPROM(ULONG p_port);
-#endif
+static void FPT_SendMsg(ULONG port, UCHAR message);
+static void  FPT_queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg,
+                                   UCHAR error_code);
 
+static void  FPT_sinits(PSCCB p_sccb, UCHAR p_card);
+static void  FPT_RNVRamData(PNVRamInfo pNvRamInfo);
 
+static UCHAR FPT_siwidn(ULONG port, UCHAR p_card);
+static void  FPT_stwidn(ULONG port, UCHAR p_card);
+static void  FPT_siwidr(ULONG port, UCHAR width);
 
 
-#if defined(DOS)
-void  busMstrAbort(USHORT port);
-UCHAR busMstrTimeOut(USHORT port);
-void  dataXferProcessor(USHORT port, PSCCBcard pCurrCard);
-void  busMstrSGDataXferStart(USHORT port, PSCCB pCurrSCCB);
-void  busMstrDataXferStart(USHORT port, PSCCB pCurrSCCB);
-void  hostDataXferAbort(USHORT port, UCHAR p_card, PSCCB pCurrSCCB);
-#else
-void  busMstrAbort(ULONG port);
-UCHAR busMstrTimeOut(ULONG port);
-void  dataXferProcessor(ULONG port, PSCCBcard pCurrCard);
-void  busMstrSGDataXferStart(ULONG port, PSCCB pCurrSCCB);
-void  busMstrDataXferStart(ULONG port, PSCCB pCurrSCCB);
-void  hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB);
-#endif
-void  hostDataXferRestart(PSCCB currSCCB);
-
+static void  FPT_queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card);
+static void  FPT_queueDisconnect(PSCCB p_SCCB, UCHAR p_card);
+static void  FPT_queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_SCCB,
+                                 UCHAR p_card);
+static void  FPT_queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card);
+static void  FPT_queueFlushSccb(UCHAR p_card, UCHAR error_code);
+static void  FPT_queueAddSccb(PSCCB p_SCCB, UCHAR card);
+static UCHAR FPT_queueFindSccb(PSCCB p_SCCB, UCHAR p_card);
+static void  FPT_utilUpdateResidual(PSCCB p_SCCB);
+static USHORT FPT_CalcCrc16(UCHAR buffer[]);
+static UCHAR  FPT_CalcLrc(UCHAR buffer[]);
 
-#if defined (DOS)
-UCHAR SccbMgr_bad_isr(USHORT p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int);
-#else
-UCHAR SccbMgr_bad_isr(ULONG p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int);
-
-#endif
 
-void  SccbMgrTableInitAll(void);
-void  SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card);
-void  SccbMgrTableInitTarget(UCHAR p_card, UCHAR target);
-
-
-
-void  scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up);
-
-#if defined(DOS)
-int   scarb(USHORT p_port, UCHAR p_sel_type);
-void  scbusf(USHORT p_port);
-void  scsel(USHORT p_port);
-void  scasid(UCHAR p_card, USHORT p_port);
-UCHAR scxferc(USHORT p_port, UCHAR p_data);
-UCHAR scsendi(USHORT p_port, UCHAR p_id_string[]);
-UCHAR sciso(USHORT p_port, UCHAR p_id_string[]);
-void  scwirod(USHORT p_port, UCHAR p_data_bit);
-void  scwiros(USHORT p_port, UCHAR p_data_bit);
-UCHAR scvalq(UCHAR p_quintet);
-UCHAR scsell(USHORT p_port, UCHAR targ_id);
-void  scwtsel(USHORT p_port);
-void  inisci(UCHAR p_card, USHORT p_port, UCHAR p_our_id);
-void  scsavdi(UCHAR p_card, USHORT p_port);
-#else
-int   scarb(ULONG p_port, UCHAR p_sel_type);
-void  scbusf(ULONG p_port);
-void  scsel(ULONG p_port);
-void  scasid(UCHAR p_card, ULONG p_port);
-UCHAR scxferc(ULONG p_port, UCHAR p_data);
-UCHAR scsendi(ULONG p_port, UCHAR p_id_string[]);
-UCHAR sciso(ULONG p_port, UCHAR p_id_string[]);
-void  scwirod(ULONG p_port, UCHAR p_data_bit);
-void  scwiros(ULONG p_port, UCHAR p_data_bit);
-UCHAR scvalq(UCHAR p_quintet);
-UCHAR scsell(ULONG p_port, UCHAR targ_id);
-void  scwtsel(ULONG p_port);
-void  inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id);
-void  scsavdi(UCHAR p_card, ULONG p_port);
-#endif
-UCHAR scmachid(UCHAR p_card, UCHAR p_id_string[]);
+static void  FPT_Wait1Second(ULONG p_port);
+static void  FPT_Wait(ULONG p_port, UCHAR p_delay);
+static void  FPT_utilEEWriteOnOff(ULONG p_port,UCHAR p_mode);
+static void  FPT_utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr);
+static USHORT FPT_utilEERead(ULONG p_port, USHORT ee_addr);
+static USHORT FPT_utilEEReadOrg(ULONG p_port, USHORT ee_addr);
+static void  FPT_utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr);
 
 
-#if defined(DOS)
-void  autoCmdCmplt(USHORT p_port, UCHAR p_card);
-void  autoLoadDefaultMap(USHORT p_port);
-#else
-void  autoCmdCmplt(ULONG p_port, UCHAR p_card);
-void  autoLoadDefaultMap(ULONG p_port);
-#endif
 
+static void  FPT_phaseDataOut(ULONG port, UCHAR p_card);
+static void  FPT_phaseDataIn(ULONG port, UCHAR p_card);
+static void  FPT_phaseCommand(ULONG port, UCHAR p_card);
+static void  FPT_phaseStatus(ULONG port, UCHAR p_card);
+static void  FPT_phaseMsgOut(ULONG port, UCHAR p_card);
+static void  FPT_phaseMsgIn(ULONG port, UCHAR p_card);
+static void  FPT_phaseIllegal(ULONG port, UCHAR p_card);
 
+static void  FPT_phaseDecode(ULONG port, UCHAR p_card);
+static void  FPT_phaseChkFifo(ULONG port, UCHAR p_card);
+static void  FPT_phaseBusFree(ULONG p_port, UCHAR p_card);
 
-#if (FW_TYPE==_SCCB_MGR_)
-       void  OS_start_timer(unsigned long ioport, unsigned long timeout);
-       void  OS_stop_timer(unsigned long ioport, unsigned long timeout);
-       void  OS_disable_int(unsigned char intvec);
-       void  OS_enable_int(unsigned char intvec);
-       void  OS_delay(unsigned long count);
-       int   OS_VirtToPhys(u32bits CardHandle, u32bits *physaddr, u32bits *virtaddr);
-       #if !(defined(UNIX) || defined(OS2) || defined(SOLARIS_REAL_MODE)) 
-       void  OS_Lock(PSCCBMGR_INFO pCardInfo);
-       void  OS_UnLock(PSCCBMGR_INFO pCardInfo);
-#endif // if FW_TYPE == ...
 
-#endif
 
-extern SCCBCARD BL_Card[MAX_CARDS];
-extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
 
+static void  FPT_XbowInit(ULONG port, UCHAR scamFlg);
+static void  FPT_BusMasterInit(ULONG p_port);
+static void  FPT_DiagEEPROM(ULONG p_port);
 
-#if defined(OS2)
-   extern void (far *s_PhaseTbl[8]) (ULONG, UCHAR);
-#else
-   #if defined(DOS)
-      extern void (*s_PhaseTbl[8]) (USHORT, UCHAR);
-   #else
-      extern void (*s_PhaseTbl[8]) (ULONG, UCHAR);
-   #endif
-#endif
 
-extern SCCBSCAM_INFO scamInfo[MAX_SCSI_TAR];
-extern NVRAMINFO nvRamInfo[MAX_MB_CARDS];
-#if defined(DOS) || defined(OS2)
-extern UCHAR temp_id_string[ID_STRING_LENGTH];
-#endif
-extern UCHAR scamHAString[];
 
 
-extern UCHAR mbCards;
-#if defined(BUGBUG)
-extern UCHAR debug_int[MAX_CARDS][debug_size];
-extern UCHAR debug_index[MAX_CARDS];
-void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
-#endif
+void  busMstrAbort(ULONG port);
+static void  FPT_dataXferProcessor(ULONG port, PSCCBcard pCurrCard);
+static void  FPT_busMstrSGDataXferStart(ULONG port, PSCCB pCurrSCCB);
+static void  FPT_busMstrDataXferStart(ULONG port, PSCCB pCurrSCCB);
+static void  FPT_hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB);
+static void  FPT_hostDataXferRestart(PSCCB currSCCB);
 
-#if (FW_TYPE==_SCCB_MGR_)
-#if defined(DOS)
-   extern UCHAR first_time;
-#endif
-#endif /* (FW_TYPE==_SCCB_MGR_) */
 
-#if (FW_TYPE==_UCB_MGR_)
-#if defined(DOS)
-   extern u08bits first_time;
-#endif
-#endif /* (FW_TYPE==_UCB_MGR_) */
+static UCHAR FPT_SccbMgr_bad_isr(ULONG p_port, UCHAR p_card,
+                                PSCCBcard pCurrCard, USHORT p_int);
 
-#if defined(BUGBUG)
-void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
-#endif
+static void  FPT_SccbMgrTableInitAll(void);
+static void  FPT_SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card);
+static void  FPT_SccbMgrTableInitTarget(UCHAR p_card, UCHAR target);
 
-extern unsigned int SccbGlobalFlags;
 
 
-#ident "$Id: sccb.c 1.18 1997/06/10 16:47:04 mohan Exp $"
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   sccb.c  $
- *
- *   Description:  Functions relating to handling of the SCCB interface
- *                 between the device driver and the HARPOON.
- *
- *   $Date: 1997/06/10 16:47:04 $
- *
- *   $Revision: 1.18 $
- *
- *----------------------------------------------------------------------*/
+static void  FPT_scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up);
 
-/*#include <globals.h>*/
+static int   FPT_scarb(ULONG p_port, UCHAR p_sel_type);
+static void  FPT_scbusf(ULONG p_port);
+static void  FPT_scsel(ULONG p_port);
+static void  FPT_scasid(UCHAR p_card, ULONG p_port);
+static UCHAR FPT_scxferc(ULONG p_port, UCHAR p_data);
+static UCHAR FPT_scsendi(ULONG p_port, UCHAR p_id_string[]);
+static UCHAR FPT_sciso(ULONG p_port, UCHAR p_id_string[]);
+static void  FPT_scwirod(ULONG p_port, UCHAR p_data_bit);
+static void  FPT_scwiros(ULONG p_port, UCHAR p_data_bit);
+static UCHAR FPT_scvalq(UCHAR p_quintet);
+static UCHAR FPT_scsell(ULONG p_port, UCHAR targ_id);
+static void  FPT_scwtsel(ULONG p_port);
+static void  FPT_inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id);
+static void  FPT_scsavdi(UCHAR p_card, ULONG p_port);
+static UCHAR FPT_scmachid(UCHAR p_card, UCHAR p_id_string[]);
 
-#if (FW_TYPE==_UCB_MGR_)
-       /*#include <budi.h>*/
-       /*#include <budioctl.h>*/
-#endif
 
-/*#include <sccbmgr.h>*/
-/*#include <blx30.h>*/
-/*#include <target.h>*/
-/*#include <eeprom.h>*/
-/*#include <scsi2.h>*/
-/*#include <harpoon.h>*/
+static void  FPT_autoCmdCmplt(ULONG p_port, UCHAR p_card);
+static void  FPT_autoLoadDefaultMap(ULONG p_port);
 
 
 
-#if (FW_TYPE==_SCCB_MGR_)
-#define mOS_Lock(card)    OS_Lock((PSCCBMGR_INFO)(((PSCCBcard)card)->cardInfo))
-#define mOS_UnLock(card)  OS_UnLock((PSCCBMGR_INFO)(((PSCCBcard)card)->cardInfo))
-#else /* FW_TYPE==_UCB_MGR_ */
-#define mOS_Lock(card)    OS_Lock((u32bits)(((PSCCBcard)card)->ioPort))
-#define mOS_UnLock(card)  OS_UnLock((u32bits)(((PSCCBcard)card)->ioPort))
-#endif
+void  OS_start_timer(unsigned long ioport, unsigned long timeout);
+void  OS_stop_timer(unsigned long ioport, unsigned long timeout);
+void  OS_disable_int(unsigned char intvec);
+void  OS_enable_int(unsigned char intvec);
+void  OS_delay(unsigned long count);
+int   OS_VirtToPhys(u32bits CardHandle, u32bits *physaddr, u32bits *virtaddr);
 
+static SCCBMGR_TAR_INFO FPT_sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR] = { { { 0 } } };
+static SCCBCARD FPT_BL_Card[MAX_CARDS] = { { 0 } };
+static SCCBSCAM_INFO FPT_scamInfo[MAX_SCSI_TAR] = { { { 0 } } };
+static NVRAMINFO FPT_nvRamInfo[MAX_MB_CARDS] = { { 0 } };
 
-/*
-extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
-extern SCCBCARD BL_Card[MAX_CARDS];
 
-extern NVRAMINFO nvRamInfo[MAX_MB_CARDS];
-extern UCHAR mbCards;
+static UCHAR FPT_mbCards = 0;
+static UCHAR FPT_scamHAString[] = {0x63, 0x07, 'B', 'U', 'S', 'L', 'O', 'G', 'I', 'C', \
+                                  ' ', 'B', 'T', '-', '9', '3', '0', \
+                                  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \
+                                  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
 
-#if defined (OS2)
-   extern void (far *s_PhaseTbl[8]) (ULONG, UCHAR);
-#else
-   #if defined(DOS)
-      extern void (*s_PhaseTbl[8]) (USHORT, UCHAR);
-   #else
-      extern void (*s_PhaseTbl[8]) (ULONG, UCHAR);
-   #endif
-#endif
+static USHORT FPT_default_intena = 0;
 
 
-#if defined(BUGBUG)
-extern UCHAR debug_int[MAX_CARDS][debug_size];
-extern UCHAR debug_index[MAX_CARDS];
-void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
-#endif
-*/
+static void (*FPT_s_PhaseTbl[8]) (ULONG, UCHAR)= { 0 };
 
-#if (FW_TYPE==_SCCB_MGR_)
 
 /*---------------------------------------------------------------------
  *
@@ -2406,27 +1479,16 @@ void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
  *
  *---------------------------------------------------------------------*/
 
-int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
+static int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
 {
-#if defined(DOS)
-#else
    static UCHAR first_time = 1;
-#endif
 
    UCHAR i,j,id,ScamFlg;
    USHORT temp,temp2,temp3,temp4,temp5,temp6;
-#if defined(DOS)
-   USHORT ioport;
-#else
    ULONG ioport;
-#endif
        PNVRamInfo pCurrNvRam;
 
-#if defined(DOS)
-   ioport = (USHORT)pCardInfo->si_baseaddr;
-#else
    ioport = pCardInfo->si_baseaddr;
-#endif
 
 
    if (RD_HARPOON(ioport+hp_vendor_id_0) != ORION_VEND_0)
@@ -2455,36 +1517,31 @@ int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
 
    if (first_time)
       {
-      SccbMgrTableInitAll();
+      FPT_SccbMgrTableInitAll();
       first_time = 0;
-               mbCards = 0;
+               FPT_mbCards = 0;
       }
 
-       if(RdStack(ioport, 0) != 0x00) {
-               if(ChkIfChipInitialized(ioport) == FALSE)
+       if(FPT_RdStack(ioport, 0) != 0x00) {
+               if(FPT_ChkIfChipInitialized(ioport) == 0)
                {
                        pCurrNvRam = NULL;
                   WR_HARPOON(ioport+hp_semaphore, 0x00);
-                       XbowInit(ioport, 0);             /*Must Init the SCSI before attempting */
-                       DiagEEPROM(ioport);
+                       FPT_XbowInit(ioport, 0);             /*Must Init the SCSI before attempting */
+                       FPT_DiagEEPROM(ioport);
                }
                else
                {
-                       if(mbCards < MAX_MB_CARDS) {
-                               pCurrNvRam = &nvRamInfo[mbCards];
-                               mbCards++;
+                       if(FPT_mbCards < MAX_MB_CARDS) {
+                               pCurrNvRam = &FPT_nvRamInfo[FPT_mbCards];
+                               FPT_mbCards++;
                                pCurrNvRam->niBaseAddr = ioport;
-                               RNVRamData(pCurrNvRam);
+                               FPT_RNVRamData(pCurrNvRam);
                        }else
                                return((int) FAILURE);
                }
        }else
                pCurrNvRam = NULL;
-#if defined (NO_BIOS_OPTION)
-       pCurrNvRam = NULL;
-   XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
-   DiagEEPROM(ioport);
-#endif  /* No BIOS Option */
 
    WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
    WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
@@ -2492,7 +1549,7 @@ int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
        if(pCurrNvRam)
                pCardInfo->si_id = pCurrNvRam->niAdapId;
        else
-          pCardInfo->si_id = (UCHAR)(utilEERead(ioport, (ADAPTER_SCSI_ID/2)) &
+          pCardInfo->si_id = (UCHAR)(FPT_utilEERead(ioport, (ADAPTER_SCSI_ID/2)) &
           (UCHAR)0x0FF);
 
    pCardInfo->si_lun = 0x00;
@@ -2510,7 +1567,7 @@ int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
                        temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
                                         (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
                }else
-             temp = utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
+             temp = FPT_utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
 
       for (i = 0; i < 2; temp >>=8,i++) {
 
@@ -2549,12 +1606,12 @@ int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
        if(pCurrNvRam)
                i = pCurrNvRam->niSysConf;
        else
-          i = (UCHAR)(utilEERead(ioport, (SYSTEM_CONFIG/2)));
+          i = (UCHAR)(FPT_utilEERead(ioport, (SYSTEM_CONFIG/2)));
 
        if(pCurrNvRam)
                ScamFlg = pCurrNvRam->niScamConf;
        else
-          ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
+          ScamFlg = (UCHAR) FPT_utilEERead(ioport, SCAM_CONFIG/2);
 
    pCardInfo->si_flags = 0x0000;
 
@@ -2613,9 +1670,9 @@ int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
                                break;
                }
        }else{
-          temp = utilEERead(ioport, (MODEL_NUMB_0/2));
+          temp = FPT_utilEERead(ioport, (MODEL_NUMB_0/2));
        pCardInfo->si_card_model[0] = (UCHAR)(temp >> 8);
-          temp = utilEERead(ioport, (MODEL_NUMB_2/2));
+          temp = FPT_utilEERead(ioport, (MODEL_NUMB_2/2));
 
        pCardInfo->si_card_model[1] = (UCHAR)(temp & 0x00FF);
           pCardInfo->si_card_model[2] = (UCHAR)(temp >> 8);
@@ -2677,29 +1734,17 @@ int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
 
    SGRAM_ACCESS(ioport);
 
-   s_PhaseTbl[0] = phaseDataOut;
-   s_PhaseTbl[1] = phaseDataIn;
-   s_PhaseTbl[2] = phaseIllegal;
-   s_PhaseTbl[3] = phaseIllegal;
-   s_PhaseTbl[4] = phaseCommand;
-   s_PhaseTbl[5] = phaseStatus;
-   s_PhaseTbl[6] = phaseMsgOut;
-   s_PhaseTbl[7] = phaseMsgIn;
+   FPT_s_PhaseTbl[0] = FPT_phaseDataOut;
+   FPT_s_PhaseTbl[1] = FPT_phaseDataIn;
+   FPT_s_PhaseTbl[2] = FPT_phaseIllegal;
+   FPT_s_PhaseTbl[3] = FPT_phaseIllegal;
+   FPT_s_PhaseTbl[4] = FPT_phaseCommand;
+   FPT_s_PhaseTbl[5] = FPT_phaseStatus;
+   FPT_s_PhaseTbl[6] = FPT_phaseMsgOut;
+   FPT_s_PhaseTbl[7] = FPT_phaseMsgIn;
 
    pCardInfo->si_present = 0x01;
 
-#if defined(BUGBUG)
-
-
-   for (i = 0; i < MAX_CARDS; i++) {
-
-      for (id=0; id<debug_size; id++)
-         debug_int[i][id] =  (UCHAR)0x00;
-      debug_index[i] = 0;
-      }
-
-#endif
-
    return(0);
 }
 
@@ -2712,27 +1757,15 @@ int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-USHORT SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
-#else
-ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
-#endif
+static ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
 {
    PSCCBcard CurrCard = NULL;
        PNVRamInfo pCurrNvRam;
    UCHAR i,j,thisCard, ScamFlg;
    USHORT temp,sync_bit_map,id;
-#if defined(DOS)
-   USHORT ioport;
-#else
    ULONG ioport;
-#endif
 
-#if defined(DOS)
-   ioport = (USHORT)pCardInfo->si_baseaddr;
-#else
    ioport = pCardInfo->si_baseaddr;
-#endif
 
    for(thisCard =0; thisCard <= MAX_CARDS; thisCard++) {
 
@@ -2741,24 +1774,24 @@ ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
         return(FAILURE);
          }
 
-      if (BL_Card[thisCard].ioPort == ioport) {
+      if (FPT_BL_Card[thisCard].ioPort == ioport) {
 
-         CurrCard = &BL_Card[thisCard];
-         SccbMgrTableInitCard(CurrCard,thisCard);
+         CurrCard = &FPT_BL_Card[thisCard];
+         FPT_SccbMgrTableInitCard(CurrCard,thisCard);
          break;
          }
 
-      else if (BL_Card[thisCard].ioPort == 0x00) {
+      else if (FPT_BL_Card[thisCard].ioPort == 0x00) {
 
-         BL_Card[thisCard].ioPort = ioport;
-         CurrCard = &BL_Card[thisCard];
+         FPT_BL_Card[thisCard].ioPort = ioport;
+         CurrCard = &FPT_BL_Card[thisCard];
 
-                       if(mbCards)
-                               for(i = 0; i < mbCards; i++){
-                                       if(CurrCard->ioPort == nvRamInfo[i].niBaseAddr)
-                                               CurrCard->pNvRamInfo = &nvRamInfo[i];
+                       if(FPT_mbCards)
+                               for(i = 0; i < FPT_mbCards; i++){
+                                       if(CurrCard->ioPort == FPT_nvRamInfo[i].niBaseAddr)
+                                               CurrCard->pNvRamInfo = &FPT_nvRamInfo[i];
                                }
-         SccbMgrTableInitCard(CurrCard,thisCard);
+         FPT_SccbMgrTableInitCard(CurrCard,thisCard);
          CurrCard->cardIndex = thisCard;
          CurrCard->cardInfo = pCardInfo;
 
@@ -2772,22 +1805,14 @@ ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
                ScamFlg = pCurrNvRam->niScamConf;
        }
        else{
-          ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
+          ScamFlg = (UCHAR) FPT_utilEERead(ioport, SCAM_CONFIG/2);
        }
 
 
-   BusMasterInit(ioport);
-   XbowInit(ioport, ScamFlg);
-
-#if defined (NO_BIOS_OPTION)
-
+   FPT_BusMasterInit(ioport);
+   FPT_XbowInit(ioport, ScamFlg);
 
-   if (DiagXbow(ioport)) return(FAILURE);
-   if (DiagBusMaster(ioport)) return(FAILURE);
-
-#endif  /* No BIOS Option */
-
-   autoLoadDefaultMap(ioport);
+   FPT_autoLoadDefaultMap(ioport);
 
 
    for (i = 0,id = 0x01; i != pCardInfo->si_id; i++,id <<= 1){}
@@ -2814,1386 +1839,193 @@ ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
 
    if (!(pCardInfo->si_flags & SOFT_RESET)) {
 
-      sresb(ioport,thisCard);
-
-         scini(thisCard, pCardInfo->si_id, 0);
-      }
-
-
-
-   if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS)
-      CurrCard->globalFlags |= F_NO_FILTER;
-
-       if(pCurrNvRam){
-               if(pCurrNvRam->niSysConf & 0x10)
-                       CurrCard->globalFlags |= F_GREEN_PC;
-       }
-       else{
-          if (utilEERead(ioport, (SYSTEM_CONFIG/2)) & GREEN_PC_ENA)
-          CurrCard->globalFlags |= F_GREEN_PC;
-       }
-
-       /* Set global flag to indicate Re-Negotiation to be done on all
-               ckeck condition */
-       if(pCurrNvRam){
-               if(pCurrNvRam->niScsiConf & 0x04)
-                       CurrCard->globalFlags |= F_DO_RENEGO;
-       }
-       else{
-          if (utilEERead(ioport, (SCSI_CONFIG/2)) & RENEGO_ENA)
-          CurrCard->globalFlags |= F_DO_RENEGO;
-       }
-
-       if(pCurrNvRam){
-               if(pCurrNvRam->niScsiConf & 0x08)
-                       CurrCard->globalFlags |= F_CONLUN_IO;
-       }
-       else{
-          if (utilEERead(ioport, (SCSI_CONFIG/2)) & CONNIO_ENA)
-          CurrCard->globalFlags |= F_CONLUN_IO;
-       }
-
-
-   temp = pCardInfo->si_per_targ_no_disc;
-
-   for (i = 0,id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
-
-      if (temp & id)
-        sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
-      }
-
-   sync_bit_map = 0x0001;
-
-   for (id = 0; id < (MAX_SCSI_TAR/2); id++) {
-
-               if(pCurrNvRam){
-                       temp = (USHORT) pCurrNvRam->niSyncTbl[id];
-                       temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
-                                        (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
-               }else
-             temp = utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
-
-      for (i = 0; i < 2; temp >>=8,i++) {
-
-         if (pCardInfo->si_per_targ_init_sync & sync_bit_map) {
-
-            sccbMgrTbl[thisCard][id*2+i].TarEEValue = (UCHAR)temp;
-            }
-
-         else {
-           sccbMgrTbl[thisCard][id*2+i].TarStatus |= SYNC_SUPPORTED;
-            sccbMgrTbl[thisCard][id*2+i].TarEEValue =
-               (UCHAR)(temp & ~EE_SYNC_MASK);
-            }
-
-#if defined(WIDE_SCSI)
-/*         if ((pCardInfo->si_per_targ_wide_nego & sync_bit_map) ||
-            (id*2+i >= 8)){
-*/
-         if (pCardInfo->si_per_targ_wide_nego & sync_bit_map){
-
-            sccbMgrTbl[thisCard][id*2+i].TarEEValue |= EE_WIDE_SCSI;
-
-            }
-
-         else { /* NARROW SCSI */
-            sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
-            }
-
-#else
-         sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
-#endif
-
-
-        sync_bit_map <<= 1;
-
-
-
-         }
-      }
-
-   WR_HARPOON((ioport+hp_semaphore),
-      (UCHAR)(RD_HARPOON((ioport+hp_semaphore)) | SCCB_MGR_PRESENT));
-
-#if defined(DOS)
-   return((USHORT)CurrCard);
-#else
-   return((ULONG)CurrCard);
-#endif
-}
-
-#else                          /* end (FW_TYPE==_SCCB_MGR_)  */
-
-
-
-STATIC s16bits FP_PresenceCheck(PMGR_INFO pMgrInfo)
-{
-       PMGR_ENTRYPNTS  pMgr_EntryPnts = &pMgrInfo->mi_Functions;
-
-      pMgr_EntryPnts->UCBMgr_probe_adapter = probe_adapter;
-      pMgr_EntryPnts->UCBMgr_init_adapter = init_adapter;
-      pMgr_EntryPnts->UCBMgr_start_UCB = SccbMgr_start_sccb;
-      pMgr_EntryPnts->UCBMgr_build_UCB = build_UCB;
-      pMgr_EntryPnts->UCBMgr_abort_UCB = SccbMgr_abort_sccb;
-      pMgr_EntryPnts->UCBMgr_my_int = SccbMgr_my_int;
-      pMgr_EntryPnts->UCBMgr_isr = SccbMgr_isr;
-      pMgr_EntryPnts->UCBMgr_scsi_reset = SccbMgr_scsi_reset;
-      pMgr_EntryPnts->UCBMgr_timer_expired = SccbMgr_timer_expired;
-#ifndef NO_IOCTLS
-         pMgr_EntryPnts->UCBMgr_unload_card = SccbMgr_unload_card;
-         pMgr_EntryPnts->UCBMgr_save_foreign_state =
-                                                                               SccbMgr_save_foreign_state;
-         pMgr_EntryPnts->UCBMgr_restore_foreign_state =
-                                                                               SccbMgr_restore_foreign_state;
-         pMgr_EntryPnts->UCBMgr_restore_native_state =
-                                                                               SccbMgr_restore_native_state;
-#endif /*NO_IOCTLS*/
-
-      pMgrInfo->mi_SGListFormat=0x01;
-      pMgrInfo->mi_DataPtrFormat=0x01;
-      pMgrInfo->mi_MaxSGElements= (u16bits) 0xffffffff;
-      pMgrInfo->mi_MgrPrivateLen=sizeof(SCCB);
-      pMgrInfo->mi_PCIVendorID=BL_VENDOR_ID;
-      pMgrInfo->mi_PCIDeviceID=FP_DEVICE_ID;
-      pMgrInfo->mi_MgrAttributes= ATTR_IO_MAPPED +
-                                                                                        ATTR_PHYSICAL_ADDRESS +
-                                                                                        ATTR_VIRTUAL_ADDRESS +
-                                                                                        ATTR_OVERLAPPED_IO_IOCTLS_OK;
-      pMgrInfo->mi_IoRangeLen = 256;
-      return(0);
-}
-
-
-
-/*---------------------------------------------------------------------
- *
- * Function: probe_adapter
- *
- * Description: Setup and/or Search for cards and return info to caller.
- *
- *---------------------------------------------------------------------*/
-STATIC s32bits probe_adapter(PADAPTER_INFO pAdapterInfo)
-{
-   u16bits temp,temp2,temp3,temp4;
-   u08bits i,j,id;
-
-#if defined(DOS)
-#else
-   static u08bits first_time = 1;
-#endif
-   BASE_PORT ioport;
-       PNVRamInfo pCurrNvRam;
-
-   ioport = (BASE_PORT)pAdapterInfo->ai_baseaddr;
-
-
-
-   if (RD_HARPOON(ioport+hp_vendor_id_0) != ORION_VEND_0)
-      return(1);
-
-   if ((RD_HARPOON(ioport+hp_vendor_id_1) != ORION_VEND_1))
-      return(2);
-
-   if ((RD_HARPOON(ioport+hp_device_id_0) != ORION_DEV_0))
-      return(3);
-
-   if ((RD_HARPOON(ioport+hp_device_id_1) != ORION_DEV_1))
-      return(4);
-
-
-   if (RD_HARPOON(ioport+hp_rev_num) != 0x0f){
-
-
-/* For new Harpoon then check for sub_device ID LSB
-   the bits(0-3) must be all ZERO for compatible with
-   current version of SCCBMgr, else skip this Harpoon
-       device. */
-
-          if (RD_HARPOON(ioport+hp_sub_device_id_0) & 0x0f)
-             return(5);
-       }
-
-   if (first_time) {
-
-      SccbMgrTableInitAll();
-      first_time = 0;
-               mbCards = 0;
-      }
-
-       if(RdStack(ioport, 0) != 0x00) {
-               if(ChkIfChipInitialized(ioport) == FALSE)
-               {
-                       pCurrNvRam = NULL;
-                  WR_HARPOON(ioport+hp_semaphore, 0x00);
-                       XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
-                       DiagEEPROM(ioport);
-               }
-               else
-               {
-                       if(mbCards < MAX_MB_CARDS) {
-                               pCurrNvRam = &nvRamInfo[mbCards];
-                               mbCards++;
-                               pCurrNvRam->niBaseAddr = ioport;
-                               RNVRamData(pCurrNvRam);
-                       }else
-                               return((int) FAILURE);
-               }
-       }else
-               pCurrNvRam = NULL;
-
-#if defined (NO_BIOS_OPTION)
-       pCurrNvRam = NULL;
-   XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
-   DiagEEPROM(ioport);
-#endif  /* No BIOS Option */
-
-   WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
-   WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
-
-       if(pCurrNvRam)
-               pAdapterInfo->ai_id = pCurrNvRam->niAdapId;
-       else
-       pAdapterInfo->ai_id = (u08bits)(utilEERead(ioport, (ADAPTER_SCSI_ID/2)) &
-       (u08bits)0x0FF);
-
-   pAdapterInfo->ai_lun = 0x00;
-   pAdapterInfo->ai_fw_revision[0] = '3';
-   pAdapterInfo->ai_fw_revision[1] = '1';
-   pAdapterInfo->ai_fw_revision[2] = '1';
-   pAdapterInfo->ai_fw_revision[3] = ' ';
-   pAdapterInfo->ai_NumChannels = 1;
-
-   temp2 = 0x0000;
-   temp3 = 0x0000;
-   temp4 = 0x0000;
-
-   for (id = 0; id < (16/2); id++) {
-
-               if(pCurrNvRam){
-                       temp = (USHORT) pCurrNvRam->niSyncTbl[id];
-                       temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
-                                        (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
-               }else
-             temp = utilEERead(ioport, (u16bits)((SYNC_RATE_TBL/2)+id));
-
-      for (i = 0; i < 2; temp >>=8,i++) {
-
-         if ((temp & 0x03) != AUTO_RATE_00) {
-
-            temp2 >>= 0x01;
-            temp2 |= 0x8000;
-            }
-
-         else {
-            temp2 >>= 0x01;
-            }
-
-         if (temp & DISC_ENABLE_BIT) {
+      FPT_sresb(ioport,thisCard);
 
-            temp3 >>= 0x01;
-            temp3 |= 0x8000;
-            }
-
-         else {
-            temp3 >>= 0x01;
-            }
-
-         if (temp & WIDE_NEGO_BIT) {
-
-            temp4 >>= 0x01;
-            temp4 |= 0x8000;
-            }
-
-         else {
-            temp4 >>= 0x01;
-            }
-
-         }
-      }
-
-   pAdapterInfo->ai_per_targ_init_sync = temp2;
-   pAdapterInfo->ai_per_targ_no_disc = temp3;
-   pAdapterInfo->ai_per_targ_wide_nego = temp4;
-       if(pCurrNvRam)
-               i = pCurrNvRam->niSysConf;
-       else
-       i = (u08bits)(utilEERead(ioport, (SYSTEM_CONFIG/2)));
-
-   /*
-   ** interrupts always level-triggered for FlashPoint
-   */
-   pAdapterInfo->ai_stateinfo |= LEVEL_TRIG;
-
-   if (i & 0x01)
-      pAdapterInfo->ai_stateinfo |= SCSI_PARITY_ENA;
-
-       if (i & 0x02)   /* SCSI Bus reset in AutoSCSI Set ? */
-       {
-               if(pCurrNvRam)
-               {
-                       j = pCurrNvRam->niScamConf;
-               }
-               else
-               {
-               j = (u08bits) utilEERead(ioport, SCAM_CONFIG/2);
-               }
-               if(j & SCAM_ENABLED)
-               {
-                       if(j & SCAM_LEVEL2)
-                       {
-                               pAdapterInfo->ai_stateinfo |= SCAM2_ENA;
-                       }
-                       else
-                       {
-                               pAdapterInfo->ai_stateinfo |= SCAM1_ENA;
-                       }
-               }
-       }
-   j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
-   if (i & 0x04) {
-      j |= SCSI_TERM_ENA_L;
-      pAdapterInfo->ai_stateinfo |= LOW_BYTE_TERM_ENA;
-      }
-   WR_HARPOON(ioport+hp_bm_ctrl, j );
-
-   j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
-   if (i & 0x08) {
-      j |= SCSI_TERM_ENA_H;
-      pAdapterInfo->ai_stateinfo |= HIGH_BYTE_TERM_ENA;
+         FPT_scini(thisCard, pCardInfo->si_id, 0);
       }
-   WR_HARPOON(ioport+hp_ee_ctrl, j );
-
-       if(RD_HARPOON(ioport + hp_page_ctrl) & BIOS_SHADOW)
-       {
-               pAdapterInfo->ai_FlashRomSize = 64 * 1024;      /* 64k ROM */
-       }
-       else
-       {
-               pAdapterInfo->ai_FlashRomSize = 32 * 1024;      /* 32k ROM */
-       }
-
-   pAdapterInfo->ai_stateinfo |= (FAST20_ENA | TAG_QUEUE_ENA);
-   if (!(RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD))
-       {
-      pAdapterInfo->ai_attributes |= (WIDE_CAPABLE | FAST20_CAPABLE
-                                                                                                       | SCAM2_CAPABLE
-                                                                                                       | TAG_QUEUE_CAPABLE
-                                                                                                       | SUPRESS_UNDERRRUNS_CAPABLE
-                                                                                                       | SCSI_PARITY_CAPABLE);
-               pAdapterInfo->ai_MaxTarg = 16;
-               pAdapterInfo->ai_MaxLun  = 32;
-       }
-       else
-       {
-      pAdapterInfo->ai_attributes |= (FAST20_CAPABLE | SCAM2_CAPABLE
-                                                                                                       | TAG_QUEUE_CAPABLE
-                                                                                                       | SUPRESS_UNDERRRUNS_CAPABLE
-                                                                                                       | SCSI_PARITY_CAPABLE);
-               pAdapterInfo->ai_MaxTarg = 8;
-               pAdapterInfo->ai_MaxLun  = 8;
-       }
-
-   pAdapterInfo->ai_product_family = HARPOON_FAMILY;
-   pAdapterInfo->ai_HBAbustype = BUSTYPE_PCI;
-
-   for (i=0;i<CARD_MODEL_NAMELEN;i++)
-   {
-      pAdapterInfo->ai_card_model[i]=' '; /* initialize the ai_card_model */
-   }
 
-       if(pCurrNvRam){
-       pAdapterInfo->ai_card_model[0] = '9';
-               switch(pCurrNvRam->niModel & 0x0f){
-                       case MODEL_LT:
-                       pAdapterInfo->ai_card_model[1] = '3';
-                       pAdapterInfo->ai_card_model[2] = '0';
-                               break;
-                       case MODEL_LW:
-                       pAdapterInfo->ai_card_model[1] = '5';
-                       pAdapterInfo->ai_card_model[2] = '0';
-                               break;
-                       case MODEL_DL:
-                       pAdapterInfo->ai_card_model[1] = '3';
-                       pAdapterInfo->ai_card_model[2] = '2';
-                               break;
-                       case MODEL_DW:
-                       pAdapterInfo->ai_card_model[1] = '5';
-                       pAdapterInfo->ai_card_model[2] = '2';
-                               break;
-               }
-       }else{
-          temp = utilEERead(ioport, (MODEL_NUMB_0/2));
-               pAdapterInfo->ai_card_model[0] = (u08bits)(temp >> 8);
-          temp = utilEERead(ioport, (MODEL_NUMB_2/2));
-
-               pAdapterInfo->ai_card_model[1] = (u08bits)(temp & 0x00FF);
-          pAdapterInfo->ai_card_model[2] = (u08bits)(temp >> 8);
-       }
-
-
-
-   pAdapterInfo->ai_FiberProductType = 0;
-
-   pAdapterInfo->ai_secondary_range = 0;
-
-   for (i=0;i<WORLD_WIDE_NAMELEN;i++)
-   {
-      pAdapterInfo->ai_worldwidename[i]='\0';
-   }
-
-   for (i=0;i<VENDOR_NAMELEN;i++)
-   {
-      pAdapterInfo->ai_vendorstring[i]='\0';
-   }
-       pAdapterInfo->ai_vendorstring[0]='B';
-       pAdapterInfo->ai_vendorstring[1]='U';
-       pAdapterInfo->ai_vendorstring[2]='S';
-       pAdapterInfo->ai_vendorstring[3]='L';
-       pAdapterInfo->ai_vendorstring[4]='O';
-       pAdapterInfo->ai_vendorstring[5]='G';
-       pAdapterInfo->ai_vendorstring[6]='I';
-       pAdapterInfo->ai_vendorstring[7]='C';
-
-       for (i=0;i<FAMILY_NAMELEN;i++)
-       {
-          pAdapterInfo->ai_AdapterFamilyString[i]='\0';
-       }
-       pAdapterInfo->ai_AdapterFamilyString[0]='F';
-       pAdapterInfo->ai_AdapterFamilyString[1]='L';
-       pAdapterInfo->ai_AdapterFamilyString[2]='A';
-       pAdapterInfo->ai_AdapterFamilyString[3]='S';
-       pAdapterInfo->ai_AdapterFamilyString[4]='H';
-       pAdapterInfo->ai_AdapterFamilyString[5]='P';
-       pAdapterInfo->ai_AdapterFamilyString[6]='O';
-       pAdapterInfo->ai_AdapterFamilyString[7]='I';
-       pAdapterInfo->ai_AdapterFamilyString[8]='N';
-       pAdapterInfo->ai_AdapterFamilyString[9]='T';
-
-   ARAM_ACCESS(ioport);
-
-   for ( i = 0; i < 4; i++ ) {
-
-      pAdapterInfo->ai_XlatInfo[i] =
-         RD_HARPOON(ioport+hp_aramBase+BIOS_DATA_OFFSET+i);
-      }
-
-       /* return with -1 if no sort, else return with
-          logical card number sorted by BIOS (zero-based) */
-
-
-       pAdapterInfo->ai_relative_cardnum = 
-      (u08bits)(RD_HARPOON(ioport+hp_aramBase+BIOS_RELATIVE_CARD)-1); 
-
-   SGRAM_ACCESS(ioport);
-
-   s_PhaseTbl[0] = phaseDataOut;
-   s_PhaseTbl[1] = phaseDataIn;
-   s_PhaseTbl[2] = phaseIllegal;
-   s_PhaseTbl[3] = phaseIllegal;
-   s_PhaseTbl[4] = phaseCommand;
-   s_PhaseTbl[5] = phaseStatus;
-   s_PhaseTbl[6] = phaseMsgOut;
-   s_PhaseTbl[7] = phaseMsgIn;
-
-   pAdapterInfo->ai_present = 0x01;
-
-#if defined(BUGBUG)
-
-
-   for (i = 0; i < MAX_CARDS; i++) {
-
-      for (id=0; id<debug_size; id++)
-         debug_int[i][id] =  (u08bits)0x00;
-      debug_index[i] = 0;
-      }
-
-#endif
-
-   return(0);
-}
-
-
-
-
-
-/*---------------------------------------------------------------------
- *
- * Function: init_adapter, exported to BUDI via UCBMgr_init_adapter entry
- *
- *
- * Description: Setup adapter for normal operation (hard reset).
- *
- *---------------------------------------------------------------------*/
-STATIC CARD_HANDLE init_adapter(PADAPTER_INFO pCardInfo)
-{
-   PSCCBcard CurrCard;
-       PNVRamInfo pCurrNvRam;
-   u08bits i,j,thisCard, ScamFlg;
-   u16bits temp,sync_bit_map,id;
-   BASE_PORT ioport;
-
-   ioport = (BASE_PORT)pCardInfo->ai_baseaddr;
-
-   for(thisCard =0; thisCard <= MAX_CARDS; thisCard++) {
-
-      if (thisCard == MAX_CARDS) {
-
-         return(FAILURE);
-         }
-
-      if (BL_Card[thisCard].ioPort == ioport) {
-
-         CurrCard = &BL_Card[thisCard];
-         SccbMgrTableInitCard(CurrCard,thisCard);
-         break;
-         }
-
-      else if (BL_Card[thisCard].ioPort == 0x00) {
-
-         BL_Card[thisCard].ioPort = ioport;
-         CurrCard = &BL_Card[thisCard];
-
-                       if(mbCards)
-                               for(i = 0; i < mbCards; i++){
-                                       if(CurrCard->ioPort == nvRamInfo[i].niBaseAddr)
-                                               CurrCard->pNvRamInfo = &nvRamInfo[i];
-                               }
-         SccbMgrTableInitCard(CurrCard,thisCard);
-         CurrCard->cardIndex = thisCard;
-         CurrCard->cardInfo = pCardInfo;
-
-         break;
-         }
-      }
-
-       pCurrNvRam = CurrCard->pNvRamInfo;
-
-   
-       if(pCurrNvRam){
-               ScamFlg = pCurrNvRam->niScamConf;
-       }
-       else{
-          ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
-       }
-       
-
-   BusMasterInit(ioport);
-   XbowInit(ioport, ScamFlg);
-
-#if defined (NO_BIOS_OPTION)
-
-
-   if (DiagXbow(ioport)) return(FAILURE);
-   if (DiagBusMaster(ioport)) return(FAILURE);
-
-#endif  /* No BIOS Option */
-
-   autoLoadDefaultMap(ioport);
-
-
-   for (i = 0,id = 0x01; i != pCardInfo->ai_id; i++,id <<= 1){}
-
-   WR_HARPOON(ioport+hp_selfid_0, id);
-   WR_HARPOON(ioport+hp_selfid_1, 0x00);
-   WR_HARPOON(ioport+hp_arb_id, pCardInfo->ai_id);
-   CurrCard->ourId = (unsigned char) pCardInfo->ai_id;
-
-   i = (u08bits) pCardInfo->ai_stateinfo;
-   if (i & SCSI_PARITY_ENA)
-       WR_HARPOON(ioport+hp_portctrl_1,(HOST_MODE8 | CHK_SCSI_P));
-
-   j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
-   if (i & LOW_BYTE_TERM_ENA)
-      j |= SCSI_TERM_ENA_L;
-   WR_HARPOON(ioport+hp_bm_ctrl, j);
-
-   j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
-   if (i & HIGH_BYTE_TERM_ENA)
-      j |= SCSI_TERM_ENA_H;
-   WR_HARPOON(ioport+hp_ee_ctrl, j );
-
-
-   if (!(pCardInfo->ai_stateinfo & NO_RESET_IN_INIT)) {
-
-      sresb(ioport,thisCard);
-
-         scini(thisCard, (u08bits) pCardInfo->ai_id, 0);
-      }
-
-
-
-   if (pCardInfo->ai_stateinfo & SUPRESS_UNDERRRUNS_ENA)
-      CurrCard->globalFlags |= F_NO_FILTER;
-
-       if(pCurrNvRam){
-               if(pCurrNvRam->niSysConf & 0x10)
-                       CurrCard->globalFlags |= F_GREEN_PC;
-       }
-       else{
-          if (utilEERead(ioport, (SYSTEM_CONFIG/2)) & GREEN_PC_ENA)
-          CurrCard->globalFlags |= F_GREEN_PC;
-       }
-
-       /* Set global flag to indicate Re-Negotiation to be done on all
-               ckeck condition */
-       if(pCurrNvRam){
-               if(pCurrNvRam->niScsiConf & 0x04)
-                       CurrCard->globalFlags |= F_DO_RENEGO;
-       }
-       else{
-          if (utilEERead(ioport, (SCSI_CONFIG/2)) & RENEGO_ENA)
-          CurrCard->globalFlags |= F_DO_RENEGO;
-       }
-
-       if(pCurrNvRam){
-               if(pCurrNvRam->niScsiConf & 0x08)
-                       CurrCard->globalFlags |= F_CONLUN_IO;
-       }
-       else{
-          if (utilEERead(ioport, (SCSI_CONFIG/2)) & CONNIO_ENA)
-          CurrCard->globalFlags |= F_CONLUN_IO;
-       }
-
-   temp = pCardInfo->ai_per_targ_no_disc;
-
-   for (i = 0,id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
-
-      if (temp & id)
-         sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
-      }
-
-   sync_bit_map = 0x0001;
-
-   for (id = 0; id < (MAX_SCSI_TAR/2); id++){
-
-               if(pCurrNvRam){
-                       temp = (USHORT) pCurrNvRam->niSyncTbl[id];
-                       temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
-                                        (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
-               }else
-             temp = utilEERead(ioport, (u16bits)((SYNC_RATE_TBL/2)+id));
-
-      for (i = 0; i < 2; temp >>=8,i++){
-
-         if (pCardInfo->ai_per_targ_init_sync & sync_bit_map){
-
-            sccbMgrTbl[thisCard][id*2+i].TarEEValue = (u08bits)temp;
-            }
-
-         else {
-            sccbMgrTbl[thisCard][id*2+i].TarStatus |= SYNC_SUPPORTED;
-            sccbMgrTbl[thisCard][id*2+i].TarEEValue =
-               (u08bits)(temp & ~EE_SYNC_MASK);
-            }
-
-#if defined(WIDE_SCSI)
-/*         if ((pCardInfo->ai_per_targ_wide_nego & sync_bit_map) ||
-            (id*2+i >= 8)){
-*/
-         if (pCardInfo->ai_per_targ_wide_nego & sync_bit_map){
-
-            sccbMgrTbl[thisCard][id*2+i].TarEEValue |= EE_WIDE_SCSI;
-
-            }
-
-         else { /* NARROW SCSI */
-            sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
-            }
-
-#else
-         sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
-#endif
-
-
-         sync_bit_map <<= 1;
-         }
-      }
-
-
-   pCardInfo->ai_SGListFormat=0x01;
-   pCardInfo->ai_DataPtrFormat=0x01;
-   pCardInfo->ai_AEN_mask &= SCSI_RESET_COMPLETE;
-
-   WR_HARPOON((ioport+hp_semaphore),
-      (u08bits)(RD_HARPOON((ioport+hp_semaphore)) | SCCB_MGR_PRESENT));
-
-   return((u32bits)CurrCard);
-
-}
-
-
-/*---------------------------------------------------------------------
- *
- * Function: build_ucb, exported to BUDI via UCBMgr_build_ucb entry
- *
- * Description: prepare fw portion of ucb. do not start, resource not guaranteed
- *             so don't manipulate anything that's derived from states which
- *             may change
- *
- *---------------------------------------------------------------------*/
-void build_UCB(CARD_HANDLE pCurrCard, PUCB p_ucb)
-{
-
-   u08bits thisCard;
-   u08bits i,j;
-
-   PSCCB p_sccb;
-
-
-   thisCard = ((PSCCBcard) pCurrCard)->cardIndex;
-
-
-   p_sccb=(PSCCB)p_ucb->UCB_MgrPrivatePtr;
-
-
-   p_sccb->Sccb_ucb_ptr=p_ucb;
-
-   switch (p_ucb->UCB_opcode & (OPC_DEVICE_RESET+OPC_XFER_SG+OPC_CHK_RESIDUAL))
-   {
-      case OPC_DEVICE_RESET:
-         p_sccb->OperationCode=RESET_COMMAND;
-         break;
-      case OPC_XFER_SG:
-         p_sccb->OperationCode=SCATTER_GATHER_COMMAND;
-         break;
-      case OPC_XFER_SG+OPC_CHK_RESIDUAL:
-         p_sccb->OperationCode=RESIDUAL_SG_COMMAND;
-         break;
-      case OPC_CHK_RESIDUAL:
-
-             p_sccb->OperationCode=RESIDUAL_COMMAND;
-             break;
-      default:
-             p_sccb->OperationCode=SCSI_INITIATOR_COMMAND;
-             break;
-   }
-
-   if (p_ucb->UCB_opcode & OPC_TQ_ENABLE)
-   {
-      p_sccb->ControlByte = (u08bits)((p_ucb->UCB_opcode & OPC_TQ_MASK)>>2) | F_USE_CMD_Q;
-   }
-   else
-   {
-      p_sccb->ControlByte = 0;
-   }
-
-
-   p_sccb->CdbLength = (u08bits)p_ucb->UCB_cdblen;
-
-   if (p_ucb->UCB_opcode & OPC_NO_AUTO_SENSE)
-   {
-      p_sccb->RequestSenseLength = 0;
-   }
-   else
-   {
-      p_sccb->RequestSenseLength = (unsigned char) p_ucb->UCB_senselen;
-   }
-
-
-   if (p_ucb->UCB_opcode & OPC_XFER_SG)
-   {
-      p_sccb->DataPointer=p_ucb->UCB_virt_dataptr;
-      p_sccb->DataLength = (((u32bits)p_ucb->UCB_NumSgElements)<<3);
-   }
-   else
-   {
-      p_sccb->DataPointer=p_ucb->UCB_phys_dataptr;
-      p_sccb->DataLength=p_ucb->UCB_datalen;
-   };
-
-   p_sccb->HostStatus=0;
-   p_sccb->TargetStatus=0;
-   p_sccb->TargID=(unsigned char)p_ucb->UCB_targid;
-   p_sccb->Lun=(unsigned char) p_ucb->UCB_lun;
-   p_sccb->SccbIOPort=((PSCCBcard)pCurrCard)->ioPort;
-
-   j=p_ucb->UCB_cdblen;
-   for (i=0;i<j;i++)
-   {
-      p_sccb->Cdb[i] = p_ucb->UCB_cdb[i];
-   }
-
-   p_sccb->SensePointer=p_ucb->UCB_phys_senseptr;
-
-   sinits(p_sccb,thisCard);
-
-}
-#ifndef NO_IOCTLS
-
-/*---------------------------------------------------------------------
- *
- * Function: GetDevSyncRate
- *
- *---------------------------------------------------------------------*/
-STATIC  int GetDevSyncRate(PSCCBcard pCurrCard,PUCB p_ucb)
-{
-       struct _SYNC_RATE_INFO * pSyncStr;
-   PSCCBMgr_tar_info currTar_Info;
-       BASE_PORT ioport;
-       u08bits scsiID, j;
-
-#if (FW_TYPE != _SCCB_MGR_)
-       if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
-       {
-               return(1);
-       }
-#endif
-
-       ioport  = pCurrCard->ioPort;
-       pSyncStr        = (struct _SYNC_RATE_INFO *) p_ucb->UCB_virt_dataptr;
-       scsiID = (u08bits) p_ucb->UCB_targid;
-   currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
-       j = currTar_Info->TarSyncCtrl;
-
-       switch (currTar_Info->TarEEValue & EE_SYNC_MASK)
-       {
-               case EE_SYNC_ASYNC:
-                       pSyncStr->RequestMegaXferRate = 0x00;
-                       break;
-               case EE_SYNC_5MB:
-                       pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 50 : 100;
-                       break;
-               case EE_SYNC_10MB:
-                       pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 100 : 200;
-                       break;
-               case EE_SYNC_20MB:
-                       pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 200 : 400;
-                       break;
-       }
-
-       switch ((j >> 5) & 0x07)
-       {
-               case 0x00:
-                       if((j & 0x07) == 0x00)
-                       {
-                               pSyncStr->ActualMegaXferRate = 0x00;    /* Async Mode */
-                       }
-                       else
-                       {
-                               pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 200 : 400;
-                       }
-                       break;
-               case 0x01:
-                       pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 100 : 200;
-                       break;
-               case 0x02:
-                       pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 66 : 122;
-                       break;
-               case 0x03:
-                       pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 50 : 100;
-                       break;
-               case 0x04:
-                       pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 40 : 80;
-                       break;
-               case 0x05:
-                       pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 33 : 66;
-                       break;
-               case 0x06:
-                       pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 28 : 56;
-                       break;
-               case 0x07:
-                       pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 25 : 50;
-                       break;
-       }
-       pSyncStr->NegotiatedOffset = j & 0x0f;
-
-       return(0);
-}
-
-/*---------------------------------------------------------------------
- *
- * Function: SetDevSyncRate
- *
- *---------------------------------------------------------------------*/
-STATIC int SetDevSyncRate(PSCCBcard pCurrCard, PUCB p_ucb)
-{
-       struct _SYNC_RATE_INFO * pSyncStr;
-   PSCCBMgr_tar_info currTar_Info;
-       BASE_PORT ioPort;
-       u08bits scsiID, i, j, syncVal;
-       u16bits syncOffset, actualXferRate;
-       union {
-               u08bits tempb[2];
-               u16bits tempw;
-       }temp2;
-
-#if (FW_TYPE != _SCCB_MGR_)
-       if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
-       {
-               return(1);
-       }
-#endif
-
-       ioPort  = pCurrCard->ioPort;
-       pSyncStr        = (struct _SYNC_RATE_INFO *) p_ucb->UCB_virt_dataptr;
-       scsiID = (u08bits) p_ucb->UCB_targid;
-   currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
-       i = RD_HARPOON(ioPort+hp_xfer_pad);             /* Save current value */
-       WR_HARPOON(ioPort+hp_xfer_pad, (i | ID_UNLOCK));
-       WR_HARPOON(ioPort+hp_select_id, ((scsiID << 4) | scsiID));
-       j = RD_HARPOON(ioPort+hp_synctarg_0);
-       WR_HARPOON(ioPort+hp_xfer_pad, i);              /* restore value */
-
-       actualXferRate = pSyncStr->ActualMegaXferRate;
-       if(!(j & NARROW_SCSI))
-       {
-               actualXferRate <<= 1;
-       }
-       if(actualXferRate == 0x00)
-       {
-               syncVal = EE_SYNC_ASYNC;                        /* Async Mode */
-       }
-       if(actualXferRate == 0x0200)
-       {
-               syncVal = EE_SYNC_20MB;                         /* 20/40 MB Mode */
-       }
-       if(actualXferRate > 0x0050 && actualXferRate < 0x0200 )
-       {
-               syncVal = EE_SYNC_10MB;                         /* 10/20 MB Mode */
-       }
-       else
-       {
-               syncVal = EE_SYNC_5MB;                          /* 5/10 MB Mode */
-       }
-       if(currTar_Info->TarEEValue && EE_SYNC_MASK == syncVal)
-               return(0);
-       currTar_Info->TarEEValue = (currTar_Info->TarEEValue & !EE_SYNC_MASK)
-                                                                                       | syncVal;
-       syncOffset = (SYNC_RATE_TBL + scsiID) / 2;
-       temp2.tempw = utilEERead(ioPort, syncOffset);
-       if(scsiID & 0x01)
-       {
-               temp2.tempb[0] = (temp2.tempb[0] & !EE_SYNC_MASK) | syncVal;
-       }
-       else
-       {
-               temp2.tempb[1] = (temp2.tempb[1] & !EE_SYNC_MASK) | syncVal;
-       }
-       utilEEWriteOnOff(ioPort, 1);
-       utilEEWrite(ioPort, temp2.tempw, syncOffset);
-       utilEEWriteOnOff(ioPort, 0);
-       UpdateCheckSum(ioPort);
-
-       return(0);
-}
-/*---------------------------------------------------------------------
- *
- * Function: GetDevWideMode
- *
- *---------------------------------------------------------------------*/
-int GetDevWideMode(PSCCBcard pCurrCard,PUCB p_ucb)
-{
-       u08bits *pData;
-
-       pData = (u08bits *)p_ucb->UCB_virt_dataptr;
-       if(sccbMgrTbl[pCurrCard->cardIndex][p_ucb->UCB_targid].TarEEValue
-                               & EE_WIDE_SCSI)
-       {
-               *pData = 1;
-       }
-       else
-       {
-               *pData = 0;
-       }
-
-       return(0);
-}
-
-/*---------------------------------------------------------------------
- *
- * Function: SetDevWideMode
- *
- *---------------------------------------------------------------------*/
-int SetDevWideMode(PSCCBcard pCurrCard,PUCB p_ucb)
-{
-       u08bits *pData;
-   PSCCBMgr_tar_info currTar_Info;
-       BASE_PORT ioPort;
-       u08bits scsiID, scsiWideMode;
-       u16bits syncOffset;
-       union {
-               u08bits tempb[2];
-               u16bits tempw;
-       }temp2;
-
-#if (FW_TYPE != _SCCB_MGR_)
-       if( !(pCurrCard->cardInfo->ai_attributes & WIDE_CAPABLE) )
-       {
-               return(1);
-       }
-
-       if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
-       {
-               return(1);
-       }
-#endif
-
-       ioPort  = pCurrCard->ioPort;
-       pData = (u08bits *)p_ucb->UCB_virt_dataptr;
-       scsiID = (u08bits) p_ucb->UCB_targid;
-       currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
-
-       if(*pData)
-       {
-               if(currTar_Info->TarEEValue & EE_WIDE_SCSI)
-               {
-                       return(0);
-               }
-               else
-               {
-                       scsiWideMode = EE_WIDE_SCSI;
-               }
-       }
-       else
-       {
-               if(!(currTar_Info->TarEEValue & EE_WIDE_SCSI))
-               {
-                       return(0);
-               }
-               else
-               {
-                       scsiWideMode = 0;
-               }
-       }
-       currTar_Info->TarEEValue = (currTar_Info->TarEEValue & !EE_WIDE_SCSI)
-                                                                                       | scsiWideMode;
-
-       syncOffset = (SYNC_RATE_TBL + scsiID) / 2;
-       temp2.tempw = utilEERead(ioPort, syncOffset);
-       if(scsiID & 0x01)
-       {
-               temp2.tempb[0] = (temp2.tempb[0] & !EE_WIDE_SCSI) | scsiWideMode;
-       }
-       else
-       {
-               temp2.tempb[1] = (temp2.tempb[1] & !EE_WIDE_SCSI) | scsiWideMode;
-       }
-       utilEEWriteOnOff(ioPort, 1);
-       utilEEWrite(ioPort, temp2.tempw, syncOffset);
-       utilEEWriteOnOff(ioPort, 0);
-       UpdateCheckSum(ioPort);
-
-       return(0);
-}
-
-/*---------------------------------------------------------------------
- *
- * Function: ReadNVRam
- *
- *---------------------------------------------------------------------*/
-void ReadNVRam(PSCCBcard pCurrCard,PUCB p_ucb)
-{
-       u08bits *pdata;
-       u16bits i,numwrds,numbytes,offset,temp;
-       u08bits OneMore = FALSE;
-#if defined(DOS)
-       u16bits ioport;
-#else
-       u32bits ioport;
-#endif
-
-       numbytes = (u16bits) p_ucb->UCB_datalen;
-       ioport  = pCurrCard->ioPort;
-   pdata   = (u08bits *) p_ucb->UCB_virt_dataptr;
-       offset  = (u16bits) (p_ucb->UCB_IOCTLParams[0]);
-
-
-
-   if (offset & 0x1)
-       {
-           *((u16bits*) pdata) = utilEERead(ioport,(u16bits)((offset - 1) / 2)); /* 16 bit read */
-                *pdata = *(pdata + 1);
-                ++offset;
-        ++pdata;
-                --numbytes;
-       }
-
-       numwrds = numbytes / 2;
-       if (numbytes & 1)
-               OneMore = TRUE;
-
-       for (i = 0; i < numwrds; i++)
-       {
-       *((u16bits*) pdata) = utilEERead(ioport,(u16bits)(offset / 2));
-               pdata += 2;
-               offset += 2;
-   }
-       if (OneMore)
-       {
-               --pdata;
-               -- offset;
-       temp = utilEERead(ioport,(u16bits)(offset / 2));
-               *pdata = (u08bits) (temp);
-       }
-
-} /* end proc ReadNVRam */
-
-
-/*---------------------------------------------------------------------
- *
- * Function: WriteNVRam
- *
- *---------------------------------------------------------------------*/
-void WriteNVRam(PSCCBcard pCurrCard,PUCB p_ucb)
-{
-       u08bits *pdata;
-       u16bits i,numwrds,numbytes,offset, eeprom_end;
-       u08bits OneMore = FALSE;
-       union {
-               u08bits  tempb[2];
-               u16bits  tempw;
-       } temp2;
-
-#if defined(DOS)
-       u16bits ioport;
-#else
-       u32bits ioport;
-#endif
-
-       numbytes = (u16bits) p_ucb->UCB_datalen;
-       ioport  = pCurrCard->ioPort;
-   pdata   = (u08bits *) p_ucb->UCB_virt_dataptr;
-       offset  = (u16bits) (p_ucb->UCB_IOCTLParams[0]);
-
-   if (RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD)
-      eeprom_end = 512;
-   else
-      eeprom_end = 768;
-       
-       if(offset > eeprom_end)
-               return;
 
-       if((offset + numbytes) > eeprom_end)
-               numbytes = eeprom_end - offset;
 
-    utilEEWriteOnOff(ioport,1);   /* Enable write access to the EEPROM */
+   if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS)
+      CurrCard->globalFlags |= F_NO_FILTER;
 
+       if(pCurrNvRam){
+               if(pCurrNvRam->niSysConf & 0x10)
+                       CurrCard->globalFlags |= F_GREEN_PC;
+       }
+       else{
+          if (FPT_utilEERead(ioport, (SYSTEM_CONFIG/2)) & GREEN_PC_ENA)
+          CurrCard->globalFlags |= F_GREEN_PC;
+       }
 
+       /* Set global flag to indicate Re-Negotiation to be done on all
+               ckeck condition */
+       if(pCurrNvRam){
+               if(pCurrNvRam->niScsiConf & 0x04)
+                       CurrCard->globalFlags |= F_DO_RENEGO;
+       }
+       else{
+          if (FPT_utilEERead(ioport, (SCSI_CONFIG/2)) & RENEGO_ENA)
+          CurrCard->globalFlags |= F_DO_RENEGO;
+       }
 
-   if (offset & 0x1)
-       {
-           temp2.tempw = utilEERead(ioport,(u16bits)((offset - 1) / 2)); /* 16 bit read */
-                temp2.tempb[1] = *pdata;
-           utilEEWrite(ioport, temp2.tempw, (u16bits)((offset -1) / 2));
-                *pdata = *(pdata + 1);
-                ++offset;
-        ++pdata;
-                --numbytes;
+       if(pCurrNvRam){
+               if(pCurrNvRam->niScsiConf & 0x08)
+                       CurrCard->globalFlags |= F_CONLUN_IO;
+       }
+       else{
+          if (FPT_utilEERead(ioport, (SCSI_CONFIG/2)) & CONNIO_ENA)
+          CurrCard->globalFlags |= F_CONLUN_IO;
        }
 
-       numwrds = numbytes / 2;
-       if (numbytes & 1)
-               OneMore = TRUE;
 
-       for (i = 0; i < numwrds; i++)
-       {
-       utilEEWrite(ioport, *((pu16bits)pdata),(u16bits)(offset / 2));
-               pdata += 2;
-               offset += 2;
-   }
-       if (OneMore)
-       {
+   temp = pCardInfo->si_per_targ_no_disc;
 
-       temp2.tempw = utilEERead(ioport,(u16bits)(offset / 2));
-               temp2.tempb[0] = *pdata;
-       utilEEWrite(ioport, temp2.tempw, (u16bits)(offset / 2));
-       }
-   utilEEWriteOnOff(ioport,0);   /* Turn off write access */
-   UpdateCheckSum((u32bits)ioport);
+   for (i = 0,id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
 
-} /* end proc WriteNVRam */
+      if (temp & id)
+        FPT_sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
+      }
 
+   sync_bit_map = 0x0001;
 
+   for (id = 0; id < (MAX_SCSI_TAR/2); id++) {
 
-/*---------------------------------------------------------------------
- *
- * Function: UpdateCheckSum
- *
- * Description: Update Check Sum in EEPROM
- *
- *---------------------------------------------------------------------*/
+               if(pCurrNvRam){
+                       temp = (USHORT) pCurrNvRam->niSyncTbl[id];
+                       temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
+                                        (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
+               }else
+             temp = FPT_utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
 
+      for (i = 0; i < 2; temp >>=8,i++) {
 
-void UpdateCheckSum(u32bits baseport)
-{
-       USHORT i,sum_data, eeprom_end;
+         if (pCardInfo->si_per_targ_init_sync & sync_bit_map) {
 
-       sum_data = 0x0000;
+            FPT_sccbMgrTbl[thisCard][id*2+i].TarEEValue = (UCHAR)temp;
+            }
 
+         else {
+           FPT_sccbMgrTbl[thisCard][id*2+i].TarStatus |= SYNC_SUPPORTED;
+            FPT_sccbMgrTbl[thisCard][id*2+i].TarEEValue =
+               (UCHAR)(temp & ~EE_SYNC_MASK);
+            }
 
-   if (RD_HARPOON(baseport+hp_page_ctrl) & NARROW_SCSI_CARD)
-      eeprom_end = 512;
-   else
-      eeprom_end = 768;
+/*         if ((pCardInfo->si_per_targ_wide_nego & sync_bit_map) ||
+            (id*2+i >= 8)){
+*/
+         if (pCardInfo->si_per_targ_wide_nego & sync_bit_map){
 
-       for (i = 1; i < eeprom_end/2; i++)
-       {
-               sum_data += utilEERead(baseport, i);
-       }
+            FPT_sccbMgrTbl[thisCard][id*2+i].TarEEValue |= EE_WIDE_SCSI;
 
-   utilEEWriteOnOff(baseport,1);   /* Enable write access to the EEPROM */
+            }
 
-   utilEEWrite(baseport, sum_data, EEPROM_CHECK_SUM/2);
-   utilEEWriteOnOff(baseport,0);   /* Turn off write access */
-}
+         else { /* NARROW SCSI */
+            FPT_sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
+            }
 
-void SccbMgr_save_foreign_state(PADAPTER_INFO pAdapterInfo)
-{
-}
 
+        sync_bit_map <<= 1;
 
-void SccbMgr_restore_foreign_state(CARD_HANDLE pCurrCard)
-{
-}
 
-void SccbMgr_restore_native_state(CARD_HANDLE pCurrCard)
-{
-}
 
-#endif /* NO_IOCTLS */
+         }
+      }
 
-#endif /* (FW_TYPE==_UCB_MGR_)   */
+   WR_HARPOON((ioport+hp_semaphore),
+      (UCHAR)(RD_HARPOON((ioport+hp_semaphore)) | SCCB_MGR_PRESENT));
 
-#ifndef NO_IOCTLS
-#if (FW_TYPE==_UCB_MGR_)
-void SccbMgr_unload_card(CARD_HANDLE pCurrCard)
-#else
-#if defined(DOS)
-void SccbMgr_unload_card(USHORT pCurrCard)
-#else
-void SccbMgr_unload_card(ULONG pCurrCard)
-#endif
-#endif
+   return((ULONG)CurrCard);
+}
+
+static void SccbMgr_unload_card(ULONG pCurrCard)
 {
        UCHAR i;
-#if defined(DOS)
-       USHORT portBase;
-       USHORT regOffset;
-#else
        ULONG portBase;
        ULONG regOffset;
-#endif
        ULONG scamData;
-#if defined(OS2)
-       ULONG far *pScamTbl;
-#else
        ULONG *pScamTbl;
-#endif
        PNVRamInfo pCurrNvRam;
 
        pCurrNvRam = ((PSCCBcard)pCurrCard)->pNvRamInfo;
 
        if(pCurrNvRam){
-               WrStack(pCurrNvRam->niBaseAddr, 0, pCurrNvRam->niModel);
-               WrStack(pCurrNvRam->niBaseAddr, 1, pCurrNvRam->niSysConf);
-               WrStack(pCurrNvRam->niBaseAddr, 2, pCurrNvRam->niScsiConf);
-               WrStack(pCurrNvRam->niBaseAddr, 3, pCurrNvRam->niScamConf);
-               WrStack(pCurrNvRam->niBaseAddr, 4, pCurrNvRam->niAdapId);
+               FPT_WrStack(pCurrNvRam->niBaseAddr, 0, pCurrNvRam->niModel);
+               FPT_WrStack(pCurrNvRam->niBaseAddr, 1, pCurrNvRam->niSysConf);
+               FPT_WrStack(pCurrNvRam->niBaseAddr, 2, pCurrNvRam->niScsiConf);
+               FPT_WrStack(pCurrNvRam->niBaseAddr, 3, pCurrNvRam->niScamConf);
+               FPT_WrStack(pCurrNvRam->niBaseAddr, 4, pCurrNvRam->niAdapId);
 
                for(i = 0; i < MAX_SCSI_TAR / 2; i++)
-                       WrStack(pCurrNvRam->niBaseAddr, (UCHAR)(i+5), pCurrNvRam->niSyncTbl[i]);
+                       FPT_WrStack(pCurrNvRam->niBaseAddr, (UCHAR)(i+5), pCurrNvRam->niSyncTbl[i]);
 
                portBase = pCurrNvRam->niBaseAddr;
 
                for(i = 0; i < MAX_SCSI_TAR; i++){
                        regOffset = hp_aramBase + 64 + i*4;
-#if defined(OS2)
-                       pScamTbl = (ULONG far *) &pCurrNvRam->niScamTbl[i];
-#else
                        pScamTbl = (ULONG *) &pCurrNvRam->niScamTbl[i];
-#endif
                        scamData = *pScamTbl;
                        WR_HARP32(portBase, regOffset, scamData);
                }
 
        }else{
-               WrStack(((PSCCBcard)pCurrCard)->ioPort, 0, 0);
+               FPT_WrStack(((PSCCBcard)pCurrCard)->ioPort, 0, 0);
        }
 }
-#endif /* NO_IOCTLS */
 
 
-void RNVRamData(PNVRamInfo pNvRamInfo)
+static void FPT_RNVRamData(PNVRamInfo pNvRamInfo)
 {
        UCHAR i;
-#if defined(DOS)
-       USHORT portBase;
-       USHORT regOffset;
-#else
        ULONG portBase;
        ULONG regOffset;
-#endif
        ULONG scamData;
-#if defined (OS2)
-       ULONG far *pScamTbl;
-#else
        ULONG *pScamTbl;
-#endif
 
-       pNvRamInfo->niModel    = RdStack(pNvRamInfo->niBaseAddr, 0);
-       pNvRamInfo->niSysConf  = RdStack(pNvRamInfo->niBaseAddr, 1);
-       pNvRamInfo->niScsiConf = RdStack(pNvRamInfo->niBaseAddr, 2);
-       pNvRamInfo->niScamConf = RdStack(pNvRamInfo->niBaseAddr, 3);
-       pNvRamInfo->niAdapId   = RdStack(pNvRamInfo->niBaseAddr, 4);
+       pNvRamInfo->niModel    = FPT_RdStack(pNvRamInfo->niBaseAddr, 0);
+       pNvRamInfo->niSysConf  = FPT_RdStack(pNvRamInfo->niBaseAddr, 1);
+       pNvRamInfo->niScsiConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 2);
+       pNvRamInfo->niScamConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 3);
+       pNvRamInfo->niAdapId   = FPT_RdStack(pNvRamInfo->niBaseAddr, 4);
 
        for(i = 0; i < MAX_SCSI_TAR / 2; i++)
-               pNvRamInfo->niSyncTbl[i] = RdStack(pNvRamInfo->niBaseAddr, (UCHAR)(i+5));
+               pNvRamInfo->niSyncTbl[i] = FPT_RdStack(pNvRamInfo->niBaseAddr, (UCHAR)(i+5));
 
        portBase = pNvRamInfo->niBaseAddr;
 
        for(i = 0; i < MAX_SCSI_TAR; i++){
                regOffset = hp_aramBase + 64 + i*4;
                RD_HARP32(portBase, regOffset, scamData);
-#if defined(OS2)
-               pScamTbl = (ULONG far *) &pNvRamInfo->niScamTbl[i];
-#else
                pScamTbl = (ULONG *) &pNvRamInfo->niScamTbl[i];
-#endif
                *pScamTbl = scamData;
        }
 
 }
 
-#if defined(DOS)
-UCHAR RdStack(USHORT portBase, UCHAR index)
-#else
-UCHAR RdStack(ULONG portBase, UCHAR index)
-#endif
+static UCHAR FPT_RdStack(ULONG portBase, UCHAR index)
 {
        WR_HARPOON(portBase + hp_stack_addr, index);
        return(RD_HARPOON(portBase + hp_stack_data));
 }
 
-#if defined(DOS)
-void WrStack(USHORT portBase, UCHAR index, UCHAR data)
-#else
-void WrStack(ULONG portBase, UCHAR index, UCHAR data)
-#endif
+static void FPT_WrStack(ULONG portBase, UCHAR index, UCHAR data)
 {
        WR_HARPOON(portBase + hp_stack_addr, index);
        WR_HARPOON(portBase + hp_stack_data, data);
 }
 
 
-#if (FW_TYPE==_UCB_MGR_)
-u08bits ChkIfChipInitialized(BASE_PORT ioPort)
-#else
-#if defined(DOS)
-UCHAR ChkIfChipInitialized(USHORT ioPort)
-#else
-UCHAR ChkIfChipInitialized(ULONG ioPort)
-#endif
-#endif
+static UCHAR FPT_ChkIfChipInitialized(ULONG ioPort)
 {
-       if((RD_HARPOON(ioPort + hp_arb_id) & 0x0f) != RdStack(ioPort, 4))
-               return(FALSE);
+       if((RD_HARPOON(ioPort + hp_arb_id) & 0x0f) != FPT_RdStack(ioPort, 4))
+               return(0);
        if((RD_HARPOON(ioPort + hp_clkctrl_0) & CLKCTRL_DEFAULT)
                                                                != CLKCTRL_DEFAULT)
-               return(FALSE);
+               return(0);
        if((RD_HARPOON(ioPort + hp_seltimeout) == TO_250ms) ||
                (RD_HARPOON(ioPort + hp_seltimeout) == TO_290ms))
-               return(TRUE);
-       return(FALSE);
+               return(1);
+       return(0);
 
 }
 /*---------------------------------------------------------------------
@@ -4205,185 +2037,29 @@ UCHAR ChkIfChipInitialized(ULONG ioPort)
  *              callback function.
  *
  *---------------------------------------------------------------------*/
-#if (FW_TYPE==_UCB_MGR_)
-void SccbMgr_start_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb)
-#else
-#if defined(DOS)
-void SccbMgr_start_sccb(USHORT pCurrCard, PSCCB p_Sccb)
-#else
-void SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_Sccb)
-#endif
-#endif
+static void SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_Sccb)
 {
-#if defined(DOS)
-   USHORT ioport;
-#else
    ULONG ioport;
-#endif
    UCHAR thisCard, lun;
        PSCCB pSaveSccb;
    CALL_BK_FN callback;
 
-#if (FW_TYPE==_UCB_MGR_)
-   PSCCB p_Sccb;
-#endif
-
-   mOS_Lock((PSCCBcard)pCurrCard);
    thisCard = ((PSCCBcard) pCurrCard)->cardIndex;
    ioport = ((PSCCBcard) pCurrCard)->ioPort;
 
-#if (FW_TYPE==_UCB_MGR_)
-   p_Sccb = (PSCCB)p_ucb->UCB_MgrPrivatePtr;
-#endif
-
        if((p_Sccb->TargID > MAX_SCSI_TAR) || (p_Sccb->Lun > MAX_LUN))
        {
 
-#if (FW_TYPE==_UCB_MGR_)
-               p_ucb->UCB_hbastat = SCCB_COMPLETE;
-               p_ucb->UCB_status=SCCB_ERROR;
-               callback = (CALL_BK_FN)p_ucb->UCB_callback;
-               if (callback)
-                       callback(p_ucb);
-#endif
-
-#if (FW_TYPE==_SCCB_MGR_)
                p_Sccb->HostStatus = SCCB_COMPLETE;
                p_Sccb->SccbStatus = SCCB_ERROR;
                callback = (CALL_BK_FN)p_Sccb->SccbCallback;
                if (callback)
                        callback(p_Sccb);
-#endif
 
-               mOS_UnLock((PSCCBcard)pCurrCard);
                return;
        }
 
-#if (FW_TYPE==_SCCB_MGR_)
-   sinits(p_Sccb,thisCard);
-#endif
-
-
-#if (FW_TYPE==_UCB_MGR_)
-#ifndef NO_IOCTLS
-
-   if (p_ucb->UCB_opcode & OPC_IOCTL)
-       {
-
-               switch (p_ucb->UCB_IOCTLCommand) 
-               {
-                       case READ_NVRAM:
-                               ReadNVRam((PSCCBcard)pCurrCard,p_ucb);
-                               p_ucb->UCB_status=UCB_SUCCESS;
-                               callback = (CALL_BK_FN)p_ucb->UCB_callback;
-                               if (callback)
-                                       callback(p_ucb);
-                               mOS_UnLock((PSCCBcard)pCurrCard);
-                               return;
-
-                       case WRITE_NVRAM:
-                               WriteNVRam((PSCCBcard)pCurrCard,p_ucb);
-                               p_ucb->UCB_status=UCB_SUCCESS;
-                               callback = (CALL_BK_FN)p_ucb->UCB_callback;
-                               if (callback)
-                                       callback(p_ucb);
-                               mOS_UnLock((PSCCBcard)pCurrCard);
-                               return;
-
-                       case SEND_SCSI_PASSTHRU:
-#if (FW_TYPE != _SCCB_MGR_)
-                               if( p_ucb->UCB_targid >=
-                                   ((PSCCBcard)pCurrCard)->cardInfo->ai_MaxTarg )
-                               {
-                                       p_ucb->UCB_status = UCB_ERROR;
-                                       p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
-                                       callback = (CALL_BK_FN)p_ucb->UCB_callback;
-                                       if (callback)
-                                               callback(p_ucb);
-                                       mOS_UnLock((PSCCBcard)pCurrCard);
-                                       return;
-                               }
-#endif
-                               break;
-
-                       case HARD_RESET:
-                               p_ucb->UCB_status = UCB_INVALID;
-                               callback = (CALL_BK_FN)p_ucb->UCB_callback;
-                               if (callback)
-                                       callback(p_ucb);
-                               mOS_UnLock((PSCCBcard)pCurrCard);
-                               return;
-                       case GET_DEVICE_SYNCRATE:
-                               if( !GetDevSyncRate((PSCCBcard)pCurrCard,p_ucb) )
-                               {
-                                       p_ucb->UCB_status = UCB_SUCCESS;
-                               }
-                               else
-                               {
-                                       p_ucb->UCB_status = UCB_ERROR;
-                                       p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
-                               }
-                               callback = (CALL_BK_FN)p_ucb->UCB_callback;
-                               if (callback)
-                                       callback(p_ucb);
-                               mOS_UnLock((PSCCBcard)pCurrCard);
-                               return;
-                       case SET_DEVICE_SYNCRATE:
-                               if( !SetDevSyncRate((PSCCBcard)pCurrCard,p_ucb) )
-                               {
-                                       p_ucb->UCB_status = UCB_SUCCESS;
-                               }
-                               else
-                               {
-                                       p_ucb->UCB_status = UCB_ERROR;
-                                       p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
-                               }
-                               callback = (CALL_BK_FN)p_ucb->UCB_callback;
-                               if (callback)
-                                       callback(p_ucb);
-                               mOS_UnLock((PSCCBcard)pCurrCard);
-                               return;
-                       case GET_WIDE_MODE:
-                               if( !GetDevWideMode((PSCCBcard)pCurrCard,p_ucb) )
-                               {
-                                       p_ucb->UCB_status = UCB_SUCCESS;
-                               }
-                               else
-                               {
-                                       p_ucb->UCB_status = UCB_ERROR;
-                                       p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
-                               }
-                               callback = (CALL_BK_FN)p_ucb->UCB_callback;
-                               if (callback)
-                                       callback(p_ucb);
-                               mOS_UnLock((PSCCBcard)pCurrCard);
-                               return;
-                       case SET_WIDE_MODE:
-                               if( !SetDevWideMode((PSCCBcard)pCurrCard,p_ucb) )
-                               {
-                                       p_ucb->UCB_status = UCB_SUCCESS;
-                               }
-                               else
-                               {
-                                       p_ucb->UCB_status = UCB_ERROR;
-                                       p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
-                               }
-                               callback = (CALL_BK_FN)p_ucb->UCB_callback;
-                               if (callback)
-                                       callback(p_ucb);
-                               mOS_UnLock((PSCCBcard)pCurrCard);
-                               return;
-                       default:
-                               p_ucb->UCB_status=UCB_INVALID;
-                               callback = (CALL_BK_FN)p_ucb->UCB_callback;
-                               if (callback)
-                                       callback(p_ucb);
-                               mOS_UnLock((PSCCBcard)pCurrCard);
-                               return;
-               }
-       }
-#endif /* NO_IOCTLS */
-#endif /* (FW_TYPE==_UCB_MGR_) */
+   FPT_sinits(p_Sccb,thisCard);
 
 
    if (!((PSCCBcard) pCurrCard)->cmdCounter)
@@ -4408,12 +2084,12 @@ void SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_Sccb)
                        {
                                pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
                                ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
-                               queueSelectFail(&BL_Card[thisCard], thisCard);
+                               FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
                                ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
                        }
                else
                        {
-             queueAddSccb(p_Sccb,thisCard);
+             FPT_queueAddSccb(p_Sccb,thisCard);
                        }
       }
 
@@ -4423,12 +2099,12 @@ void SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_Sccb)
                                {
                                        pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
                                        ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
-                                       queueSelectFail(&BL_Card[thisCard], thisCard);
+                                       FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
                                        ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
                                }
                        else
                                {
-                     queueAddSccb(p_Sccb,thisCard);
+                     FPT_queueAddSccb(p_Sccb,thisCard);
                                }
       }
 
@@ -4437,23 +2113,17 @@ void SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_Sccb)
       MDISABLE_INT(ioport);
 
                if((((PSCCBcard) pCurrCard)->globalFlags & F_CONLUN_IO) && 
-                       ((sccbMgrTbl[thisCard][p_Sccb->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
+                       ((FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
                        lun = p_Sccb->Lun;
                else
                        lun = 0;
       if ((((PSCCBcard) pCurrCard)->currentSCCB == NULL) &&
-         (sccbMgrTbl[thisCard][p_Sccb->TargID].TarSelQ_Cnt == 0) &&
-         (sccbMgrTbl[thisCard][p_Sccb->TargID].TarLUNBusy[lun]
-         == FALSE)) {
+         (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarSelQ_Cnt == 0) &&
+         (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarLUNBusy[lun]
+         == 0)) {
 
             ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
-                          mOS_UnLock((PSCCBcard)pCurrCard);
-#if defined(DOS)
-            ssel((USHORT)p_Sccb->SccbIOPort,thisCard);
-#else
-           ssel(p_Sccb->SccbIOPort,thisCard);
-#endif
-                          mOS_Lock((PSCCBcard)pCurrCard);
+           FPT_ssel(p_Sccb->SccbIOPort,thisCard);
          }
 
       else {
@@ -4462,12 +2132,12 @@ void SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_Sccb)
                                {
                                        pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
                                        ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
-                                       queueSelectFail(&BL_Card[thisCard], thisCard);
+                                       FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
                                        ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
                                }
                        else
                                {
-                       queueAddSccb(p_Sccb,thisCard);
+                       FPT_queueAddSccb(p_Sccb,thisCard);
                                }
          }
 
@@ -4475,7 +2145,6 @@ void SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_Sccb)
       MENABLE_INT(ioport);
       }
 
-   mOS_UnLock((PSCCBcard)pCurrCard);
 }
 
 
@@ -4488,22 +2157,9 @@ void SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_Sccb)
  *              callback function.
  *
  *---------------------------------------------------------------------*/
-#if (FW_TYPE==_UCB_MGR_)
-s32bits SccbMgr_abort_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb)
-#else
-#if defined(DOS)
-int SccbMgr_abort_sccb(USHORT pCurrCard, PSCCB p_Sccb)
-#else
-int SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_Sccb)
-#endif
-#endif
-
+static int SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_Sccb)
 {
-#if defined(DOS)
-       USHORT ioport;
-#else
        ULONG ioport;
-#endif
 
        UCHAR thisCard;
        CALL_BK_FN callback;
@@ -4512,53 +2168,31 @@ int SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_Sccb)
        PSCCBMgr_tar_info currTar_Info;
 
 
-#if (FW_TYPE==_UCB_MGR_)
-       PSCCB    p_Sccb;
-       p_Sccb=(PSCCB)p_ucb->UCB_MgrPrivatePtr;
-#endif
-
        ioport = ((PSCCBcard) pCurrCard)->ioPort;
 
        thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
 
-       mOS_Lock((PSCCBcard)pCurrCard);
-
-       if (RD_HARPOON(ioport+hp_page_ctrl) & G_INT_DISABLE)
-       {
-               mOS_UnLock((PSCCBcard)pCurrCard);
-       }
-
-       else
+       if (!(RD_HARPOON(ioport+hp_page_ctrl) & G_INT_DISABLE))
        {
 
-               if (queueFindSccb(p_Sccb,thisCard))
+               if (FPT_queueFindSccb(p_Sccb,thisCard))
                {
 
-                       mOS_UnLock((PSCCBcard)pCurrCard);
-
                        ((PSCCBcard)pCurrCard)->cmdCounter--;
 
                        if (!((PSCCBcard)pCurrCard)->cmdCounter)
                                WR_HARPOON(ioport+hp_semaphore,(RD_HARPOON(ioport+hp_semaphore)
                                        & (UCHAR)(~(SCCB_MGR_ACTIVE | TICKLE_ME)) ));
 
-#if (FW_TYPE==_SCCB_MGR_)
                        p_Sccb->SccbStatus = SCCB_ABORT;
                        callback = p_Sccb->SccbCallback;
                        callback(p_Sccb);
-#else
-                       p_ucb->UCB_status=SCCB_ABORT;
-                       callback = (CALL_BK_FN)p_ucb->UCB_callback;
-                       callback(p_ucb);
-#endif
 
                        return(0);
                }
 
                else
                {
-                       mOS_UnLock((PSCCBcard)pCurrCard);
-
                        if (((PSCCBcard)pCurrCard)->currentSCCB == p_Sccb)
                        {
                                p_Sccb->SccbStatus = SCCB_ABORT;
@@ -4579,21 +2213,18 @@ int SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_Sccb)
                                        {
                                                p_Sccb->SccbStatus = SCCB_ABORT;
                                                p_Sccb->Sccb_scsistat = ABORT_ST;
-#if (FW_TYPE==_UCB_MGR_)
-                                               p_ucb->UCB_status=SCCB_ABORT;
-#endif
                                                p_Sccb->Sccb_scsimsg = SMABORT_TAG;
 
                                                if(((PSCCBcard) pCurrCard)->currentSCCB == NULL)
                                                {
                                                        ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
-                                                       ssel(ioport, thisCard);
+                                                       FPT_ssel(ioport, thisCard);
                                                }
                                                else
                                                {
                                                        pSaveSCCB = ((PSCCBcard) pCurrCard)->currentSCCB;
                                                        ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
-                                                       queueSelectFail((PSCCBcard) pCurrCard, thisCard);
+                                                       FPT_queueSelectFail((PSCCBcard) pCurrCard, thisCard);
                                                        ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSCCB;
                                                }
                                        }
@@ -4602,9 +2233,9 @@ int SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_Sccb)
                                }
                                else
                                {
-                                       currTar_Info = &sccbMgrTbl[thisCard][p_Sccb->TargID];
+                                       currTar_Info = &FPT_sccbMgrTbl[thisCard][p_Sccb->TargID];
 
-                                       if(BL_Card[thisCard].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_Sccb->Lun]] 
+                                       if(FPT_BL_Card[thisCard].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_Sccb->Lun]] 
                                                        == p_Sccb)
                                        {
                                                p_Sccb->SccbStatus = SCCB_ABORT;
@@ -4626,37 +2257,20 @@ int SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_Sccb)
  *              interrupt for this card and disable the IRQ Pin if so.
  *
  *---------------------------------------------------------------------*/
-#if (FW_TYPE==_UCB_MGR_)
-u08bits SccbMgr_my_int(CARD_HANDLE pCurrCard)
-#else
-#if defined(DOS)
-UCHAR SccbMgr_my_int(USHORT pCurrCard)
-#else
-UCHAR SccbMgr_my_int(ULONG pCurrCard)
-#endif
-#endif
+static UCHAR SccbMgr_my_int(ULONG pCurrCard)
 {
-#if defined(DOS)
-   USHORT ioport;
-#else
    ULONG ioport;
-#endif
 
    ioport = ((PSCCBcard)pCurrCard)->ioPort;
 
    if (RD_HARPOON(ioport+hp_int_status) & INT_ASSERTED)
    {
-
-#if defined(DOS)
-      MDISABLE_INT(ioport);
-#endif
-
-      return(TRUE);
+      return(1);
    }
 
    else
 
-      return(FALSE);
+      return(0);
 }
 
 
@@ -4670,37 +2284,19 @@ UCHAR SccbMgr_my_int(ULONG pCurrCard)
  *              us.
  *
  *---------------------------------------------------------------------*/
-#if (FW_TYPE==_UCB_MGR_)
-s32bits SccbMgr_isr(CARD_HANDLE pCurrCard)
-#else
-#if defined(DOS)
-int SccbMgr_isr(USHORT pCurrCard)
-#else
-int SccbMgr_isr(ULONG pCurrCard)
-#endif
-#endif
+static int SccbMgr_isr(ULONG pCurrCard)
 {
    PSCCB currSCCB;
    UCHAR thisCard,result,bm_status, bm_int_st;
    USHORT hp_int;
    UCHAR i, target;
-#if defined(DOS)
-   USHORT ioport;
-#else
    ULONG ioport;
-#endif
-
-   mOS_Lock((PSCCBcard)pCurrCard);
 
    thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
    ioport = ((PSCCBcard)pCurrCard)->ioPort;
 
    MDISABLE_INT(ioport);
 
-#if defined(BUGBUG)
-   WR_HARPOON(ioport+hp_user_defined_D, RD_HARPOON(ioport+hp_int_status));
-#endif
-
    if ((bm_int_st=RD_HARPOON(ioport+hp_int_status)) & EXT_STATUS_ON)
                bm_status = RD_HARPOON(ioport+hp_ext_status) & (UCHAR)BAD_EXT_STATUS;
    else
@@ -4708,33 +2304,20 @@ int SccbMgr_isr(ULONG pCurrCard)
 
    WR_HARPOON(ioport+hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
 
-   mOS_UnLock((PSCCBcard)pCurrCard);
-
-   while ((hp_int = RDW_HARPOON((ioport+hp_intstat)) & default_intena) |
+   while ((hp_int = RDW_HARPOON((ioport+hp_intstat)) & FPT_default_intena) |
          bm_status)
      {
 
        currSCCB = ((PSCCBcard)pCurrCard)->currentSCCB;
 
-#if defined(BUGBUG)
-   Debug_Load(thisCard,(UCHAR) 0XFF);
-   Debug_Load(thisCard,bm_int_st);
-
-   Debug_Load(thisCard,hp_int_0);
-   Debug_Load(thisCard,hp_int_1);
-#endif
-
-
       if (hp_int & (FIFO | TIMEOUT | RESET | SCAM_SEL) || bm_status) {
-         result = SccbMgr_bad_isr(ioport,thisCard,((PSCCBcard)pCurrCard),hp_int);
+         result = FPT_SccbMgr_bad_isr(ioport,thisCard,((PSCCBcard)pCurrCard),hp_int);
          WRW_HARPOON((ioport+hp_intstat), (FIFO | TIMEOUT | RESET | SCAM_SEL));
          bm_status = 0;
 
          if (result) {
 
-                          mOS_Lock((PSCCBcard)pCurrCard);
             MENABLE_INT(ioport);
-                          mOS_UnLock((PSCCBcard)pCurrCard);
             return(result);
             }
          }
@@ -4753,7 +2336,7 @@ int SccbMgr_isr(ULONG pCurrCard)
 
          if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT)
 
-            phaseChkFifo(ioport, thisCard);
+            FPT_phaseChkFifo(ioport, thisCard);
 
 /*         WRW_HARPOON((ioport+hp_intstat),
             (BUS_FREE | ICMD_COMP | ITAR_DISC | XFER_CNT_0));
@@ -4761,7 +2344,7 @@ int SccbMgr_isr(ULONG pCurrCard)
 
                 WRW_HARPOON((ioport+hp_intstat), CLR_ALL_INT_1);
 
-         autoCmdCmplt(ioport,thisCard);
+         FPT_autoCmdCmplt(ioport,thisCard);
 
          }
 
@@ -4771,7 +2354,7 @@ int SccbMgr_isr(ULONG pCurrCard)
 
          if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) {
 
-            phaseChkFifo(ioport, thisCard);
+            FPT_phaseChkFifo(ioport, thisCard);
 
             }
 
@@ -4784,7 +2367,7 @@ int SccbMgr_isr(ULONG pCurrCard)
             }
 
          currSCCB->Sccb_scsistat = DISCONNECT_ST;
-         queueDisconnect(currSCCB,thisCard);
+         FPT_queueDisconnect(currSCCB,thisCard);
 
             /* Wait for the BusFree before starting a new command.  We
                must also check for being reselected since the BusFree
@@ -4803,9 +2386,7 @@ int SccbMgr_isr(ULONG pCurrCard)
           */
           if (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL)))
             {
-              mOS_Lock((PSCCBcard)pCurrCard);
               MENABLE_INT(ioport);
-              mOS_UnLock((PSCCBcard)pCurrCard);
               return 0xFE;
             }
 
@@ -4825,7 +2406,7 @@ int SccbMgr_isr(ULONG pCurrCard)
                      {
             if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT)
                              {
-               phaseChkFifo(ioport, thisCard);
+               FPT_phaseChkFifo(ioport, thisCard);
                }
 
             if (RD_HARPOON(ioport+hp_gp_reg_1) == SMSAVE_DATA_PTR)
@@ -4837,11 +2418,11 @@ int SccbMgr_isr(ULONG pCurrCard)
 
             WRW_HARPOON((ioport+hp_intstat), (BUS_FREE | ITAR_DISC));
             currSCCB->Sccb_scsistat = DISCONNECT_ST;
-            queueDisconnect(currSCCB,thisCard);
+            FPT_queueDisconnect(currSCCB,thisCard);
             }
 
-         sres(ioport,thisCard,((PSCCBcard)pCurrCard));
-         phaseDecode(ioport,thisCard);
+         FPT_sres(ioport,thisCard,((PSCCBcard)pCurrCard));
+         FPT_phaseDecode(ioport,thisCard);
 
          }
 
@@ -4850,7 +2431,7 @@ int SccbMgr_isr(ULONG pCurrCard)
          {
 
             WRW_HARPOON((ioport+hp_intstat), (IDO_STRT | XFER_CNT_0));
-            phaseDecode(ioport,thisCard);
+            FPT_phaseDecode(ioport,thisCard);
 
          }
 
@@ -4860,7 +2441,7 @@ int SccbMgr_isr(ULONG pCurrCard)
                   WRW_HARPOON((ioport+hp_intstat), (PHASE | IUNKWN | PROG_HLT));
                   if ((RD_HARPOON(ioport+hp_prgmcnt_0) & (UCHAR)0x3f)< (UCHAR)SELCHK)
                        {
-                       phaseDecode(ioport,thisCard);
+                       FPT_phaseDecode(ioport,thisCard);
                        }
                   else
                        {
@@ -4885,7 +2466,7 @@ int SccbMgr_isr(ULONG pCurrCard)
 
          WRW_HARPOON((ioport+hp_intstat), XFER_CNT_0);
 
-         schkdd(ioport,thisCard);
+         FPT_schkdd(ioport,thisCard);
 
          }
 
@@ -4896,10 +2477,10 @@ int SccbMgr_isr(ULONG pCurrCard)
 
                if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) {
 
-               hostDataXferAbort(ioport,thisCard,currSCCB);
+               FPT_hostDataXferAbort(ioport,thisCard,currSCCB);
                                }
 
-         phaseBusFree(ioport,thisCard);
+         FPT_phaseBusFree(ioport,thisCard);
                        }
 
 
@@ -4919,12 +2500,12 @@ int SccbMgr_isr(ULONG pCurrCard)
 
          if (((PSCCBcard)pCurrCard)->currentSCCB == NULL) {
 
-            queueSearchSelect(((PSCCBcard)pCurrCard),thisCard);
+            FPT_queueSearchSelect(((PSCCBcard)pCurrCard),thisCard);
             }
 
          if (((PSCCBcard)pCurrCard)->currentSCCB != NULL) {
             ((PSCCBcard)pCurrCard)->globalFlags &= ~F_NEW_SCCB_CMD;
-            ssel(ioport,thisCard);
+            FPT_ssel(ioport,thisCard);
             }
 
          break;
@@ -4933,9 +2514,7 @@ int SccbMgr_isr(ULONG pCurrCard)
 
       }  /*end while */
 
-   mOS_Lock((PSCCBcard)pCurrCard);
    MENABLE_INT(ioport);
-   mOS_UnLock((PSCCBcard)pCurrCard);
 
    return(0);
 }
@@ -4950,18 +2529,12 @@ int SccbMgr_isr(ULONG pCurrCard)
  *              processing time.
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-UCHAR SccbMgr_bad_isr(USHORT p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int)
-#else
-UCHAR SccbMgr_bad_isr(ULONG p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int)
-#endif
+static UCHAR FPT_SccbMgr_bad_isr(ULONG p_port, UCHAR p_card,
+                                PSCCBcard pCurrCard, USHORT p_int)
 {
-#if defined(HARP_REVX)
-   ULONG timer;
-#endif
-UCHAR temp, ScamFlg;
-PSCCBMgr_tar_info currTar_Info;
-PNVRamInfo pCurrNvRam;
+   UCHAR temp, ScamFlg;
+   PSCCBMgr_tar_info currTar_Info;
+   PNVRamInfo pCurrNvRam;
 
 
    if (RD_HARPOON(p_port+hp_ext_status) &
@@ -4971,7 +2544,7 @@ PNVRamInfo pCurrNvRam;
       if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
          {
 
-         hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB);
+         FPT_hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB);
          }
 
       if (RD_HARPOON(p_port+hp_pci_stat_cfg) & REC_MASTER_ABORT)
@@ -4990,7 +2563,7 @@ PNVRamInfo pCurrNvRam;
          if (!pCurrCard->currentSCCB->HostStatus)
             pCurrCard->currentSCCB->HostStatus = SCCB_BM_ERR;
 
-         sxfrp(p_port,p_card);
+         FPT_sxfrp(p_port,p_card);
 
             temp = (UCHAR)(RD_HARPOON(p_port+hp_ee_ctrl) &
                                                        (EXT_ARB_ACK | SCSI_TERM_ENA_H));
@@ -4999,7 +2572,7 @@ PNVRamInfo pCurrNvRam;
 
          if (!(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)))
             {
-            phaseDecode(p_port,p_card);
+            FPT_phaseDecode(p_port,p_card);
             }
          }
       }
@@ -5014,13 +2587,13 @@ PNVRamInfo pCurrNvRam;
 
                if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
 
-               hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB);
+               FPT_hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB);
                }
 
 
            DISABLE_AUTO(p_port);
 
-           sresb(p_port,p_card);
+           FPT_sresb(p_port,p_card);
 
            while(RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST) {}
 
@@ -5029,12 +2602,12 @@ PNVRamInfo pCurrNvRam;
                                        ScamFlg = pCurrNvRam->niScamConf;
                                }
                                else{
-                                  ScamFlg = (UCHAR) utilEERead(p_port, SCAM_CONFIG/2);
+                                  ScamFlg = (UCHAR) FPT_utilEERead(p_port, SCAM_CONFIG/2);
                                }
 
-           XbowInit(p_port, ScamFlg);
+           FPT_XbowInit(p_port, ScamFlg);
 
-               scini(p_card, pCurrCard->ourId, 0);
+               FPT_scini(p_card, pCurrCard->ourId, 0);
 
            return(0xFF);
          }
@@ -5044,34 +2617,8 @@ PNVRamInfo pCurrNvRam;
 
       WRW_HARPOON((p_port+hp_intstat), FIFO);
 
-#if defined(HARP_REVX)
-
-      for (timer=0x00FFFFFFL; timer != 0x00000000L; timer--) {
-
-         if (RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY)
-            break;
-
-         if (RDW_HARPOON((p_port+hp_intstat)) & BUS_FREE)
-            break;
-         }
-
-
-      if ( (RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY) &&
-           (RD_HARPOON(p_port+hp_fiforead) !=
-            RD_HARPOON(p_port+hp_fifowrite)) &&
-           (RD_HARPOON(p_port+hp_xfercnt_0))
-         )
-
-            WR_HARPOON((p_port+hp_xferstat), 0x01);
-
-/*      else
- */
-/*         sxfrp(p_port,p_card);
- */
-#else
       if (pCurrCard->currentSCCB != NULL)
-         sxfrp(p_port,p_card);
-#endif
+         FPT_sxfrp(p_port,p_card);
       }
 
    else if (p_int & TIMEOUT)
@@ -5085,12 +2632,12 @@ PNVRamInfo pCurrNvRam;
       pCurrCard->currentSCCB->HostStatus = SCCB_SELECTION_TIMEOUT;
 
 
-               currTar_Info = &sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
+               currTar_Info = &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
                if((pCurrCard->globalFlags & F_CONLUN_IO) &&
                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
-             currTar_Info->TarLUNBusy[pCurrCard->currentSCCB->Lun] = FALSE;
+             currTar_Info->TarLUNBusy[pCurrCard->currentSCCB->Lun] = 0;
                else
-             currTar_Info->TarLUNBusy[0] = FALSE;
+             currTar_Info->TarLUNBusy[0] = 0;
 
 
       if (currTar_Info->TarEEValue & EE_SYNC_MASK)
@@ -5104,131 +2651,27 @@ PNVRamInfo pCurrNvRam;
          currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
          }
 
-      sssyncv(p_port, pCurrCard->currentSCCB->TargID, NARROW_SCSI,currTar_Info);
-
-      queueCmdComplete(pCurrCard, pCurrCard->currentSCCB, p_card);
-
-      }
-
-#if defined(SCAM_LEV_2)
-
-   else if (p_int & SCAM_SEL)
-      {
-
-      scarb(p_port,LEVEL2_TAR);
-      scsel(p_port);
-      scasid(p_card, p_port);
-
-      scbusf(p_port);
-
-      WRW_HARPOON((p_port+hp_intstat), SCAM_SEL);
-      }
-#endif
-
-   return(0x00);
-}
-
-
-/*---------------------------------------------------------------------
- *
- * Function: SccbMgr_scsi_reset
- *
- * Description: A SCSI bus reset will be generated and all outstanding
- *              Sccbs will be returned via the callback.
- *
- *---------------------------------------------------------------------*/
-#if (FW_TYPE==_UCB_MGR_)
-void SccbMgr_scsi_reset(CARD_HANDLE pCurrCard)
-#else
-#if defined(DOS)
-void SccbMgr_scsi_reset(USHORT pCurrCard)
-#else
-void SccbMgr_scsi_reset(ULONG pCurrCard)
-#endif
-#endif
-{
-   UCHAR thisCard;
-
-   thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
+      FPT_sssyncv(p_port, pCurrCard->currentSCCB->TargID, NARROW_SCSI,currTar_Info);
 
-   mOS_Lock((PSCCBcard)pCurrCard);
+      FPT_queueCmdComplete(pCurrCard, pCurrCard->currentSCCB, p_card);
 
-   if (((PSCCBcard) pCurrCard)->globalFlags & F_GREEN_PC)
-      {
-      WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_clkctrl_0, CLKCTRL_DEFAULT);
-      WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_sys_ctrl, 0x00);
       }
 
-   sresb(((PSCCBcard)pCurrCard)->ioPort,thisCard);
-
-   if (RD_HARPOON(((PSCCBcard)pCurrCard)->ioPort+hp_ext_status) & BM_CMD_BUSY)
+   else if (p_int & SCAM_SEL)
       {
-      WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_page_ctrl,
-         (RD_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_page_ctrl)
-         & ~SCATTER_EN));
 
-      WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_sg_addr,0x00);
+      FPT_scarb(p_port,LEVEL2_TAR);
+      FPT_scsel(p_port);
+      FPT_scasid(p_card, p_port);
 
-      ((PSCCBcard) pCurrCard)->globalFlags &= ~F_HOST_XFER_ACT;
-      busMstrTimeOut(((PSCCBcard) pCurrCard)->ioPort);
+      FPT_scbusf(p_port);
 
-      WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_int_mask,
-         (INT_CMD_COMPL | SCSI_INTERRUPT));
+      WRW_HARPOON((p_port+hp_intstat), SCAM_SEL);
       }
 
-/*
-      if (utilEERead(((PSCCBcard)pCurrCard)->ioPort, (SCAM_CONFIG/2))
-            & SCAM_ENABLED)
-*/
-         scini(thisCard, ((PSCCBcard)pCurrCard)->ourId, 0);
-
-#if (FW_TYPE==_UCB_MGR_)
-   ((PSCCBcard)pCurrCard)->cardInfo->ai_AEN_routine(0x01,pCurrCard,0,0,0,0);
-#endif
-
-   mOS_UnLock((PSCCBcard)pCurrCard);
-}
-
-
-/*---------------------------------------------------------------------
- *
- * Function: SccbMgr_timer_expired
- *
- * Description: This function allow me to kill my own job that has not
- *              yet completed, and has cause a timeout to occur.  This
- *              timeout has caused the upper level driver to call this
- *              function.
- *
- *---------------------------------------------------------------------*/
-
-#if (FW_TYPE==_UCB_MGR_)
-void SccbMgr_timer_expired(CARD_HANDLE pCurrCard)
-#else
-#if defined(DOS)
-void SccbMgr_timer_expired(USHORT pCurrCard)
-#else
-void SccbMgr_timer_expired(ULONG pCurrCard)
-#endif
-#endif
-{
+   return(0x00);
 }
 
-#if defined(DOS)
-/*---------------------------------------------------------------------
- *
- * Function: SccbMgr_status
- *
- * Description: This function returns the number of outstanding SCCB's.
- *              This is specific to the DOS enviroment, which needs this
- *              to help them keep protected and real mode commands staight.
- *
- *---------------------------------------------------------------------*/
-
-USHORT SccbMgr_status(USHORT pCurrCard)
-{
-   return(BL_Card[pCurrCard].cmdCounter);
-}
-#endif
 
 /*---------------------------------------------------------------------
  *
@@ -5238,19 +2681,19 @@ USHORT SccbMgr_status(USHORT pCurrCard)
  *
  *---------------------------------------------------------------------*/
 
-void SccbMgrTableInitAll()
+static void FPT_SccbMgrTableInitAll()
 {
    UCHAR thisCard;
 
    for (thisCard = 0; thisCard < MAX_CARDS; thisCard++)
       {
-      SccbMgrTableInitCard(&BL_Card[thisCard],thisCard);
+      FPT_SccbMgrTableInitCard(&FPT_BL_Card[thisCard],thisCard);
 
-      BL_Card[thisCard].ioPort      = 0x00;
-      BL_Card[thisCard].cardInfo    = NULL;
-      BL_Card[thisCard].cardIndex   = 0xFF;
-      BL_Card[thisCard].ourId       = 0x00;
-               BL_Card[thisCard].pNvRamInfo    = NULL;
+      FPT_BL_Card[thisCard].ioPort      = 0x00;
+      FPT_BL_Card[thisCard].cardInfo    = NULL;
+      FPT_BL_Card[thisCard].cardIndex   = 0xFF;
+      FPT_BL_Card[thisCard].ourId       = 0x00;
+               FPT_BL_Card[thisCard].pNvRamInfo        = NULL;
       }
 }
 
@@ -5263,20 +2706,20 @@ void SccbMgrTableInitAll()
  *
  *---------------------------------------------------------------------*/
 
-void SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card)
+static void FPT_SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card)
 {
    UCHAR scsiID, qtag;
 
        for (qtag = 0; qtag < QUEUE_DEPTH; qtag++)
        {
-               BL_Card[p_card].discQ_Tbl[qtag] = NULL;
+               FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
        }
 
    for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++)
       {
-      sccbMgrTbl[p_card][scsiID].TarStatus = 0;
-      sccbMgrTbl[p_card][scsiID].TarEEValue = 0;
-      SccbMgrTableInitTarget(p_card, scsiID);
+      FPT_sccbMgrTbl[p_card][scsiID].TarStatus = 0;
+      FPT_sccbMgrTbl[p_card][scsiID].TarEEValue = 0;
+      FPT_SccbMgrTableInitTarget(p_card, scsiID);
       }
 
    pCurrCard->scanIndex = 0x00;
@@ -5298,13 +2741,13 @@ void SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-void SccbMgrTableInitTarget(UCHAR p_card, UCHAR target)
+static void FPT_SccbMgrTableInitTarget(UCHAR p_card, UCHAR target)
 {
 
        UCHAR lun, qtag;
        PSCCBMgr_tar_info currTar_Info;
 
-       currTar_Info = &sccbMgrTbl[p_card][target];
+       currTar_Info = &FPT_sccbMgrTbl[p_card][target];
 
        currTar_Info->TarSelQ_Cnt = 0;
        currTar_Info->TarSyncCtrl = 0;
@@ -5312,160 +2755,28 @@ void SccbMgrTableInitTarget(UCHAR p_card, UCHAR target)
        currTar_Info->TarSelQ_Head = NULL;
        currTar_Info->TarSelQ_Tail = NULL;
        currTar_Info->TarTagQ_Cnt = 0;
-       currTar_Info->TarLUN_CA = FALSE;
+       currTar_Info->TarLUN_CA = 0;
 
 
        for (lun = 0; lun < MAX_LUN; lun++)
        {
-               currTar_Info->TarLUNBusy[lun] = FALSE;
+               currTar_Info->TarLUNBusy[lun] = 0;
                currTar_Info->LunDiscQ_Idx[lun] = 0;
        }
 
        for (qtag = 0; qtag < QUEUE_DEPTH; qtag++)
        {
-               if(BL_Card[p_card].discQ_Tbl[qtag] != NULL)
+               if(FPT_BL_Card[p_card].discQ_Tbl[qtag] != NULL)
                {
-                       if(BL_Card[p_card].discQ_Tbl[qtag]->TargID == target)
+                       if(FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == target)
                        {
-                               BL_Card[p_card].discQ_Tbl[qtag] = NULL;
-                               BL_Card[p_card].discQCount--;
+                               FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
+                               FPT_BL_Card[p_card].discQCount--;
                        }
                }
        }
 }
 
-#if defined(BUGBUG)
-
-/*****************************************************************
- * Save the current byte in the debug array
- *****************************************************************/
-
-
-void Debug_Load(UCHAR p_card, UCHAR p_bug_data)
-{
-   debug_int[p_card][debug_index[p_card]] = p_bug_data;
-   debug_index[p_card]++;
-
-   if (debug_index[p_card] == debug_size)
-
-      debug_index[p_card] = 0;
-}
-
-#endif
-#ident "$Id: sccb_dat.c 1.10 1997/02/22 03:16:02 awin Exp $"
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   sccb_dat.c  $
- *
- *   Description:  Functions relating to handling of the SCCB interface 
- *                 between the device driver and the HARPOON.
- *
- *   $Date: 1997/02/22 03:16:02 $
- *
- *   $Revision: 1.10 $
- *
- *----------------------------------------------------------------------*/
-
-/*#include <globals.h>*/
-
-#if (FW_TYPE==_UCB_MGR_)
-       /*#include <budi.h>*/
-#endif
-
-/*#include <sccbmgr.h>*/
-/*#include <blx30.h>*/
-/*#include <target.h>*/
-/*#include <harpoon.h>*/
-
-/*
-**  IMPORTANT NOTE!!!
-**
-**  You MUST preassign all data to a valid value or zero.  This is
-**  required due to the MS compiler bug under OS/2 and Solaris Real-Mode
-**  driver environment.
-*/
-
-
-SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR] = { { { 0 } } };
-SCCBCARD BL_Card[MAX_CARDS] = { { 0 } };
-SCCBSCAM_INFO scamInfo[MAX_SCSI_TAR] = { { { 0 } } };
-NVRAMINFO nvRamInfo[MAX_MB_CARDS] = { { 0 } };
-
-
-#if defined(OS2)
-void (far *s_PhaseTbl[8]) (ULONG, UCHAR) = { 0 };
-UCHAR temp_id_string[ID_STRING_LENGTH] = { 0 };
-#elif defined(SOLARIS_REAL_MODE) || defined(__STDC__)
-void (*s_PhaseTbl[8]) (ULONG, UCHAR) = { 0 };
-#else
-void (*s_PhaseTbl[8]) ();
-#endif
-
-#if defined(DOS)
-UCHAR first_time = 0;
-#endif
-
-UCHAR mbCards = 0;
-UCHAR scamHAString[] = {0x63, 0x07, 'B', 'U', 'S', 'L', 'O', 'G', 'I', 'C', \
-                                                               ' ', 'B', 'T', '-', '9', '3', '0', \
-                                                               0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \
-                                                               0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
-
-USHORT default_intena = 0;
-
-#if defined(BUGBUG)
-UCHAR    debug_int[MAX_CARDS][debug_size] = { 0 };
-UCHAR    debug_index[MAX_CARDS] = { 0 };
-UCHAR    reserved_1[3] = { 0 };
-#endif
-#ident "$Id: scsi.c 1.23 1997/07/09 21:42:54 mohan Exp $"
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   scsi.c  $
- *
- *   Description:  Functions for handling SCSI bus functions such as
- *                 selection/reselection, sync negotiation, message-in
- *                 decoding.
- *
- *   $Date: 1997/07/09 21:42:54 $
- *
- *   $Revision: 1.23 $
- *
- *----------------------------------------------------------------------*/
-
-/*#include <globals.h>*/
-
-#if (FW_TYPE==_UCB_MGR_)
-       /*#include <budi.h>*/
-#endif
-
-/*#include <sccbmgr.h>*/
-/*#include <blx30.h>*/
-/*#include <target.h>*/
-/*#include <scsi2.h>*/
-/*#include <eeprom.h>*/
-/*#include <harpoon.h>*/
-
-
-/*
-extern SCCBCARD BL_Card[MAX_CARDS];
-extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
-#if defined(BUGBUG)
-void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
-#endif
-*/
 
 /*---------------------------------------------------------------------
  *
@@ -5476,11 +2787,7 @@ void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-UCHAR sfm(USHORT port, PSCCB pCurrSCCB)
-#else
-UCHAR sfm(ULONG port, PSCCB pCurrSCCB)
-#endif
+static UCHAR FPT_sfm(ULONG port, PSCCB pCurrSCCB)
 {
        UCHAR message;
        USHORT TimeOutLoop;
@@ -5547,42 +2854,27 @@ UCHAR sfm(ULONG port, PSCCB pCurrSCCB)
 
 /*---------------------------------------------------------------------
  *
- * Function: ssel
+ * Function: FPT_ssel
  *
  * Description: Load up automation and select target device.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void ssel(USHORT port, UCHAR p_card)
-#else
-void ssel(ULONG port, UCHAR p_card)
-#endif
+static void FPT_ssel(ULONG port, UCHAR p_card)
 {
 
-#if defined(DOS)
-   UCHAR auto_loaded, i, target, *theCCB;
-#elif defined(OS2)
-   UCHAR auto_loaded, i, target;
-   UCHAR far *theCCB;
-#else
    UCHAR auto_loaded, i, target, *theCCB;
-#endif
 
-#if defined(DOS)
-   USHORT cdb_reg;
-#else
    ULONG cdb_reg;
-#endif
    PSCCBcard CurrCard;
    PSCCB currSCCB;
    PSCCBMgr_tar_info currTar_Info;
    UCHAR lastTag, lun;
 
-   CurrCard = &BL_Card[p_card];
+   CurrCard = &FPT_BL_Card[p_card];
    currSCCB = CurrCard->currentSCCB;
    target = currSCCB->TargID;
-   currTar_Info = &sccbMgrTbl[p_card][target];
+   currTar_Info = &FPT_sccbMgrTbl[p_card][target];
    lastTag = CurrCard->tagQ_Lst;
 
    ARAM_ACCESS(port);
@@ -5599,60 +2891,53 @@ void ssel(ULONG port, UCHAR p_card)
                lun = 0;
 
 
-#if defined(DOS)
-   currTar_Info->TarLUNBusy[lun] = TRUE;
-
-#else
-
    if (CurrCard->globalFlags & F_TAG_STARTED)
       {
       if (!(currSCCB->ControlByte & F_USE_CMD_Q))
          {
-       if ((currTar_Info->TarLUN_CA == FALSE)
+       if ((currTar_Info->TarLUN_CA == 0)
            && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
            == TAG_Q_TRYING))
             {
 
                 if (currTar_Info->TarTagQ_Cnt !=0)
                   {
-                          currTar_Info->TarLUNBusy[lun] = TRUE;
-                       queueSelectFail(CurrCard,p_card);
+                          currTar_Info->TarLUNBusy[lun] = 1;
+                       FPT_queueSelectFail(CurrCard,p_card);
                                           SGRAM_ACCESS(port);
                           return;
                           }
 
             else {
-                         currTar_Info->TarLUNBusy[lun] = TRUE;
+                         currTar_Info->TarLUNBusy[lun] = 1;
                          }
 
              }  /*End non-tagged */
 
              else {
-                currTar_Info->TarLUNBusy[lun] = TRUE;
+                currTar_Info->TarLUNBusy[lun] = 1;
                 }
 
              }  /*!Use cmd Q Tagged */
 
           else {
-            if (currTar_Info->TarLUN_CA == TRUE)
+            if (currTar_Info->TarLUN_CA == 1)
                {
-             queueSelectFail(CurrCard,p_card);
+             FPT_queueSelectFail(CurrCard,p_card);
                                   SGRAM_ACCESS(port);
              return;
                    }
 
-               currTar_Info->TarLUNBusy[lun] = TRUE;
+               currTar_Info->TarLUNBusy[lun] = 1;
 
             }  /*else use cmd Q tagged */
 
       }  /*if glob tagged started */
 
    else {
-        currTar_Info->TarLUNBusy[lun] = TRUE;
+        currTar_Info->TarLUNBusy[lun] = 1;
         }
 
-#endif /* DOS */
-
 
 
        if((((CurrCard->globalFlags & F_CONLUN_IO) && 
@@ -5661,8 +2946,8 @@ void ssel(ULONG port, UCHAR p_card)
        {
                if(CurrCard->discQCount >= QUEUE_DEPTH)
                {
-                       currTar_Info->TarLUNBusy[lun] = TRUE;
-                       queueSelectFail(CurrCard,p_card);
+                       currTar_Info->TarLUNBusy[lun] = 1;
+                       FPT_queueSelectFail(CurrCard,p_card);
                        SGRAM_ACCESS(port);
                        return;
                }
@@ -5680,8 +2965,8 @@ void ssel(ULONG port, UCHAR p_card)
                }
                if(i == QUEUE_DEPTH)
                {
-                       currTar_Info->TarLUNBusy[lun] = TRUE;
-                       queueSelectFail(CurrCard,p_card);
+                       currTar_Info->TarLUNBusy[lun] = 1;
+                       FPT_queueSelectFail(CurrCard,p_card);
                        SGRAM_ACCESS(port);
                        return;
                }
@@ -5689,7 +2974,7 @@ void ssel(ULONG port, UCHAR p_card)
 
 
 
-   auto_loaded = FALSE;
+   auto_loaded = 0;
 
    WR_HARPOON(port+hp_select_id, target);
    WR_HARPOON(port+hp_gp_reg_3, target);  /* Use by new automation logic */
@@ -5703,7 +2988,7 @@ void ssel(ULONG port, UCHAR p_card)
       currSCCB->Sccb_scsimsg = SMDEV_RESET;
 
       WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
-      auto_loaded = TRUE;
+      auto_loaded = 1;
       currSCCB->Sccb_scsistat = SELECT_BDR_ST;
 
       if (currTar_Info->TarEEValue & EE_SYNC_MASK)
@@ -5712,16 +2997,13 @@ void ssel(ULONG port, UCHAR p_card)
              currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
              }
 
-#if defined(WIDE_SCSI)
-
       if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
          {
        currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
        }
-#endif
 
-      sssyncv(port, target, NARROW_SCSI,currTar_Info);
-      SccbMgrTableInitTarget(p_card, target);
+      FPT_sssyncv(port, target, NARROW_SCSI,currTar_Info);
+      FPT_SccbMgrTableInitTarget(p_card, target);
 
       }
 
@@ -5740,24 +3022,18 @@ void ssel(ULONG port, UCHAR p_card)
                        WRW_HARPOON((port+SYNC_MSGS+4), (BRH_OP+ALWAYS+NP ));
 
                        WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
-                       auto_loaded = TRUE;
+                       auto_loaded = 1;
                
                }
 
-#if defined(WIDE_SCSI)
-
-
    else if (!(currTar_Info->TarStatus & WIDE_NEGOCIATED))  {
-      auto_loaded = siwidn(port,p_card);
+      auto_loaded = FPT_siwidn(port,p_card);
       currSCCB->Sccb_scsistat = SELECT_WN_ST;
       }
 
-#endif
-
-
    else if (!((currTar_Info->TarStatus & TAR_SYNC_MASK)
       == SYNC_SUPPORTED))  {
-      auto_loaded = sisyncn(port,p_card, FALSE);
+      auto_loaded = FPT_sisyncn(port,p_card, 0);
       currSCCB->Sccb_scsistat = SELECT_SN_ST;
       }
 
@@ -5765,7 +3041,6 @@ void ssel(ULONG port, UCHAR p_card)
    if (!auto_loaded)
       {
 
-#if !defined(DOS)
       if (currSCCB->ControlByte & F_USE_CMD_Q)
          {
 
@@ -5789,7 +3064,7 @@ void ssel(ULONG port, UCHAR p_card)
                the wheels fall off. */
             currSCCB->Sccb_scsistat = SELECT_ST;
 
-                currTar_Info->TarLUNBusy[lun] = TRUE;
+                currTar_Info->TarLUNBusy[lun] = 1;
             }
 
          else
@@ -5818,8 +3093,8 @@ void ssel(ULONG port, UCHAR p_card)
 
             if ( i == QUEUE_DEPTH )
                {
-                currTar_Info->TarLUNBusy[lun] = TRUE;
-               queueSelectFail(CurrCard,p_card);
+                currTar_Info->TarLUNBusy[lun] = 1;
+               FPT_queueSelectFail(CurrCard,p_card);
                                   SGRAM_ACCESS(port);
                 return;
                 }
@@ -5832,7 +3107,6 @@ void ssel(ULONG port, UCHAR p_card)
 
       else
          {
-#endif   /* !DOS */
 
          WRW_HARPOON((port+ID_MSG_STRT),BRH_OP+ALWAYS+NTCMD);
 
@@ -5842,16 +3116,10 @@ void ssel(ULONG port, UCHAR p_card)
          currSCCB->Sccb_scsistat = SELECT_ST;
 
          WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
-#if !defined(DOS)
          }
-#endif
 
 
-#if defined(OS2)
-      theCCB = (UCHAR far *)&currSCCB->Cdb[0];
-#else
       theCCB = (UCHAR *)&currSCCB->Cdb[0];
-#endif
 
       cdb_reg = port + CMD_STRT;
 
@@ -5867,10 +3135,8 @@ void ssel(ULONG port, UCHAR p_card)
 
       }  /* auto_loaded */
 
-#if defined(WIDE_SCSI)
    WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
    WR_HARPOON(port+hp_xferstat, 0x00);
-#endif
 
    WRW_HARPOON((port+hp_intstat), (PROG_HLT | TIMEOUT | SEL | BUS_FREE));
 
@@ -5899,30 +3165,16 @@ void ssel(ULONG port, UCHAR p_card)
 
 /*---------------------------------------------------------------------
  *
- * Function: sres
+ * Function: FPT_sres
  *
  * Description: Hookup the correct CCB and handle the incoming messages.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void sres(USHORT port, UCHAR p_card, PSCCBcard pCurrCard)
-#else
-void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
-#endif
+static void FPT_sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
 {
 
-#if defined(V302)
-#ifdef DOS
-   UCHAR our_target,message, msgRetryCount;
-   extern UCHAR lun, tag;
-#else
-   UCHAR our_target,message,lun,tag, msgRetryCount;
-#endif
-
-#else  /* V302 */
    UCHAR our_target, message, lun = 0, tag, msgRetryCount;
-#endif /* V302 */
 
 
    PSCCBMgr_tar_info currTar_Info;
@@ -5933,7 +3185,7 @@ void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
 
        if(pCurrCard->currentSCCB != NULL)
        {
-               currTar_Info = &sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
+               currTar_Info = &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
                DISABLE_AUTO(port);
 
 
@@ -5954,7 +3206,7 @@ void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
                if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                {
-       currTar_Info->TarLUNBusy[currSCCB->Lun] = FALSE;
+       currTar_Info->TarLUNBusy[currSCCB->Lun] = 0;
                        if(currSCCB->Sccb_scsistat != ABORT_ST)
                        {
                                pCurrCard->discQCount--;
@@ -5964,7 +3216,7 @@ void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
                }
                else
                {
-             currTar_Info->TarLUNBusy[0] = FALSE;
+             currTar_Info->TarLUNBusy[0] = 0;
                        if(currSCCB->Sccb_tag)
                        {
                                if(currSCCB->Sccb_scsistat != ABORT_ST)
@@ -5982,29 +3234,21 @@ void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
                        }
                }
 
-      queueSelectFail(&BL_Card[p_card],p_card);
+      FPT_queueSelectFail(&FPT_BL_Card[p_card],p_card);
        }
 
-#if defined(WIDE_SCSI)
        WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
-#endif
 
 
        our_target = (UCHAR)(RD_HARPOON(port+hp_select_id) >> 4);
-       currTar_Info = &sccbMgrTbl[p_card][our_target];
+       currTar_Info = &FPT_sccbMgrTbl[p_card][our_target];
 
 
        msgRetryCount = 0;
        do
        {
 
-#if defined(V302)
-
-               message = GetTarLun(port, p_card, our_target, pCurrCard, &tag, &lun);
-
-#else /* V302 */
-
-               currTar_Info = &sccbMgrTbl[p_card][our_target];
+               currTar_Info = &FPT_sccbMgrTbl[p_card][our_target];
                tag = 0;
 
 
@@ -6022,7 +3266,7 @@ void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
                if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH)
                {
 
-                       message = sfm(port,pCurrCard->currentSCCB);
+                       message = FPT_sfm(port,pCurrCard->currentSCCB);
                        if (message)
                        {
 
@@ -6030,7 +3274,6 @@ void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
                                {
                                        lun = message & (UCHAR)LUN_MASK;
 
-#if !defined(DOS)
                                        if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING)
                                        {
                                                if (currTar_Info->TarTagQ_Cnt != 0)
@@ -6041,21 +3284,21 @@ void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
                                                                ACCEPT_MSG(port);    /*Release the ACK for ID msg. */
 
 
-                                                               message = sfm(port,pCurrCard->currentSCCB);
+                                                               message = FPT_sfm(port,pCurrCard->currentSCCB);
                                                                if (message)
                                                                {
                                                                        ACCEPT_MSG(port);
                                                                }
 
                                                                else
-                                                               message = FALSE;
+                                                               message = 0;
 
-                                                               if(message != FALSE)
+                                                               if(message != 0)
                                                                {
-                                                                       tag = sfm(port,pCurrCard->currentSCCB);
+                                                                       tag = FPT_sfm(port,pCurrCard->currentSCCB);
 
                                                                        if (!(tag)) 
-                                                                               message = FALSE;
+                                                                               message = 0;
                                                                }
 
                                                        } /*C.A. exists! */
@@ -6063,7 +3306,6 @@ void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
                                                } /*End Q cnt != 0 */
 
                                        } /*End Tag cmds supported! */
-#endif /* !DOS */
 
                                } /*End valid ID message.  */
 
@@ -6078,7 +3320,7 @@ void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
                        else
                        {
 
-                               message = FALSE;
+                               message = 0;
                        }
                }
                else
@@ -6091,49 +3333,47 @@ void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
 
                        return;
                }
-       
-#endif /* V302 */
 
-               if(message == FALSE)
+               if(message == 0)
                {
                        msgRetryCount++;
                        if(msgRetryCount == 1)
                        {
-                               SendMsg(port, SMPARITY);
+                               FPT_SendMsg(port, SMPARITY);
                        }
                        else
                        {
-                               SendMsg(port, SMDEV_RESET);
+                               FPT_SendMsg(port, SMDEV_RESET);
 
-                               sssyncv(port, our_target, NARROW_SCSI,currTar_Info);
+                               FPT_sssyncv(port, our_target, NARROW_SCSI,currTar_Info);
 
-                               if (sccbMgrTbl[p_card][our_target].TarEEValue & EE_SYNC_MASK) 
+                               if (FPT_sccbMgrTbl[p_card][our_target].TarEEValue & EE_SYNC_MASK) 
                                {
                        
-                                       sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_SYNC_MASK;
+                                       FPT_sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_SYNC_MASK;
 
                                }
 
-                               if (sccbMgrTbl[p_card][our_target].TarEEValue & EE_WIDE_SCSI) 
+                               if (FPT_sccbMgrTbl[p_card][our_target].TarEEValue & EE_WIDE_SCSI) 
                                {
 
-                                       sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_WIDE_MASK;
+                                       FPT_sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_WIDE_MASK;
                                }
 
 
-                               queueFlushTargSccb(p_card, our_target, SCCB_COMPLETE);
-                               SccbMgrTableInitTarget(p_card,our_target);
+                               FPT_queueFlushTargSccb(p_card, our_target, SCCB_COMPLETE);
+                               FPT_SccbMgrTableInitTarget(p_card,our_target);
                                return;
                        }
                }
-       }while(message == FALSE);
+       }while(message == 0);
 
 
 
        if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
                ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
        {
-               currTar_Info->TarLUNBusy[lun] = TRUE;
+               currTar_Info->TarLUNBusy[lun] = 1;
                pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[lun]];
                if(pCurrCard->currentSCCB != NULL)
                {
@@ -6146,7 +3386,7 @@ void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
        }
        else
        {
-               currTar_Info->TarLUNBusy[0] = TRUE;
+               currTar_Info->TarLUNBusy[0] = 1;
 
 
                if (tag)
@@ -6182,7 +3422,7 @@ void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
                /* During Abort Tag command, the target could have got re-selected
                        and completed the command. Check the select Q and remove the CCB
                        if it is in the Select Q */
-                       queueFindSccb(pCurrCard->currentSCCB, p_card);
+                       FPT_queueFindSccb(pCurrCard->currentSCCB, p_card);
                }
        }
 
@@ -6192,106 +3432,7 @@ void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
          (RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ;
 }
 
-#if defined(V302)
-
-#if defined(DOS)
-UCHAR GetTarLun(USHORT port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tag, PUCHAR lun)
-#else
-UCHAR GetTarLun(ULONG port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tag, PUCHAR lun)
-#endif
-{
-   UCHAR message;
-   PSCCBMgr_tar_info currTar_Info;
-
-
-       currTar_Info = &sccbMgrTbl[p_card][our_target];
-       *tag = 0;
-
-
-       while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ))
-       {
-               if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY))
-               {
-
-                       WRW_HARPOON((port+hp_intstat), PHASE);
-                       return(TRUE);
-               }
-       }
-
-       WRW_HARPOON((port+hp_intstat), PHASE);
-       if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH)
-       {
-
-               message = sfm(port,pCurrCard->currentSCCB);
-               if (message)
-               {
-
-                       if (message <= (0x80 | LUN_MASK))
-                       {
-                               *lun = message & (UCHAR)LUN_MASK;
-
-#if !defined(DOS)
-                               if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING)
-                               {
-                                       if (currTar_Info->TarTagQ_Cnt != 0)
-                                       {
-
-                                               if (!(currTar_Info->TarLUN_CA))
-                                               {
-                                                       ACCEPT_MSG(port);    /*Release the ACK for ID msg. */
-
-
-                                                       message = sfm(port,pCurrCard->currentSCCB);
-                                                       if (message)
-                                                       {
-                                                               ACCEPT_MSG(port);
-                                                       }
-
-                                                       else
-                                                       return(FALSE);
-
-                                                       *tag = sfm(port,pCurrCard->currentSCCB);
-
-                                                       if (!(*tag)) return(FALSE);
-
-                                               } /*C.A. exists! */
-
-                                       } /*End Q cnt != 0 */
-
-                               } /*End Tag cmds supported! */
-#endif /* !DOS */
-
-                       } /*End valid ID message.  */
-
-                       else
-                       {
-
-                               ACCEPT_MSG_ATN(port);
-                       }
-
-               } /* End good id message. */
-
-               else
-               {
-
-                       return(FALSE);
-               }
-       }
-       else
-       {
-               ACCEPT_MSG_ATN(port);
-               return(TRUE);
-       }
-       return(TRUE);
-}
-
-#endif /* V302 */
-
-#if defined(DOS)
-void SendMsg(USHORT port, UCHAR message)
-#else
-void SendMsg(ULONG port, UCHAR message)
-#endif
+static void FPT_SendMsg(ULONG port, UCHAR message)
 {
        while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ))
        {
@@ -6334,26 +3475,22 @@ void SendMsg(ULONG port, UCHAR message)
 
 /*---------------------------------------------------------------------
  *
- * Function: sdecm
+ * Function: FPT_sdecm
  *
  * Description: Determine the proper responce to the message from the
  *              target device.
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-void sdecm(UCHAR message, USHORT port, UCHAR p_card)
-#else
-void sdecm(UCHAR message, ULONG port, UCHAR p_card)
-#endif
+static void FPT_sdecm(UCHAR message, ULONG port, UCHAR p_card)
 {
        PSCCB currSCCB;
        PSCCBcard CurrCard;
        PSCCBMgr_tar_info currTar_Info;
 
-       CurrCard = &BL_Card[p_card];
+       CurrCard = &FPT_BL_Card[p_card];
        currSCCB = CurrCard->currentSCCB;
 
-       currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
+       currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
 
        if (message == SMREST_DATA_PTR)
        {
@@ -6361,7 +3498,7 @@ void sdecm(UCHAR message, ULONG port, UCHAR p_card)
                {
                        currSCCB->Sccb_ATC = currSCCB->Sccb_savedATC;
 
-                       hostDataXferRestart(currSCCB);
+                       FPT_hostDataXferRestart(currSCCB);
                }
 
                ACCEPT_MSG(port);
@@ -6417,7 +3554,6 @@ void sdecm(UCHAR message, ULONG port, UCHAR p_card)
                                        currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
                                }
 
-#if defined(WIDE_SCSI)
                                else if ((currSCCB->Sccb_scsistat == SELECT_WN_ST))
                                {
 
@@ -6428,7 +3564,6 @@ void sdecm(UCHAR message, ULONG port, UCHAR p_card)
                                        currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
 
                                }
-#endif
 
                                else if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING )
                                {
@@ -6460,9 +3595,9 @@ void sdecm(UCHAR message, ULONG port, UCHAR p_card)
 
                                if((CurrCard->globalFlags & F_CONLUN_IO) &&
                                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
-                                       currTar_Info->TarLUNBusy[currSCCB->Lun] = TRUE;
+                                       currTar_Info->TarLUNBusy[currSCCB->Lun] = 1;
                                else
-                                       currTar_Info->TarLUNBusy[0] = TRUE;
+                                       currTar_Info->TarLUNBusy[0] = 1;
 
 
                                currSCCB->ControlByte &= ~(UCHAR)F_USE_CMD_Q;
@@ -6490,7 +3625,7 @@ void sdecm(UCHAR message, ULONG port, UCHAR p_card)
        {
 
                ACCEPT_MSG(port);
-               shandem(port,p_card,currSCCB);
+               FPT_shandem(port,p_card,currSCCB);
        }
 
        else if (message == SMIGNORWR)
@@ -6498,7 +3633,7 @@ void sdecm(UCHAR message, ULONG port, UCHAR p_card)
 
                ACCEPT_MSG(port);          /* ACK the RESIDUE MSG */
 
-               message = sfm(port,currSCCB);
+               message = FPT_sfm(port,currSCCB);
 
                if(currSCCB->Sccb_scsimsg != SMPARITY)
                        ACCEPT_MSG(port);
@@ -6520,25 +3655,21 @@ void sdecm(UCHAR message, ULONG port, UCHAR p_card)
 
 /*---------------------------------------------------------------------
  *
- * Function: shandem
+ * Function: FPT_shandem
  *
  * Description: Decide what to do with the extended message.
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-void shandem(USHORT port, UCHAR p_card, PSCCB pCurrSCCB)
-#else
-void shandem(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
-#endif
+static void FPT_shandem(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
 {
        UCHAR length,message;
 
-       length = sfm(port,pCurrSCCB);
+       length = FPT_sfm(port,pCurrSCCB);
        if (length) 
        {
 
                ACCEPT_MSG(port);
-               message = sfm(port,pCurrSCCB);
+               message = FPT_sfm(port,pCurrSCCB);
                if (message) 
                {
 
@@ -6549,7 +3680,7 @@ void shandem(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
                                {
 
                                        ACCEPT_MSG(port);
-                                       stsyncn(port,p_card);
+                                       FPT_stsyncn(port,p_card);
                                }
                                else 
                                {
@@ -6558,7 +3689,6 @@ void shandem(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
                                        ACCEPT_MSG_ATN(port);
                                }
                        }
-#if defined(WIDE_SCSI)
                        else if (message == SMWDTR) 
                        {
 
@@ -6566,7 +3696,7 @@ void shandem(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
                                {
 
                                        ACCEPT_MSG(port);
-                                       stwidn(port,p_card);
+                                       FPT_stwidn(port,p_card);
                                }
                                else 
                                {
@@ -6577,7 +3707,6 @@ void shandem(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
                                        WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                                }
                        }
-#endif
                        else 
                        {
 
@@ -6603,24 +3732,20 @@ void shandem(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
 
 /*---------------------------------------------------------------------
  *
- * Function: sisyncn
+ * Function: FPT_sisyncn
  *
  * Description: Read in a message byte from the SCSI bus, and check
  *              for a parity error.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-UCHAR sisyncn(USHORT port, UCHAR p_card, UCHAR syncFlag)
-#else
-UCHAR sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag)
-#endif
+static UCHAR FPT_sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag)
 {
    PSCCB currSCCB;
    PSCCBMgr_tar_info currTar_Info;
 
-   currSCCB = BL_Card[p_card].currentSCCB;
-   currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
+   currSCCB = FPT_BL_Card[p_card].currentSCCB;
+   currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
 
    if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)) {
 
@@ -6656,7 +3781,7 @@ UCHAR sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag)
       WRW_HARPOON((port+SYNC_MSGS+12),(BRH_OP+ALWAYS+NP      ));
 
 
-               if(syncFlag == FALSE)
+               if(syncFlag == 0)
                {
                   WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
              currTar_Info->TarStatus = ((currTar_Info->TarStatus &
@@ -6668,14 +3793,14 @@ UCHAR sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag)
                }
 
 
-      return(TRUE);
+      return(1);
       }
 
    else {
 
       currTar_Info->TarStatus |=        (UCHAR)SYNC_SUPPORTED;
       currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
-      return(FALSE);
+      return(0);
       }
 }
 
@@ -6683,26 +3808,22 @@ UCHAR sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag)
 
 /*---------------------------------------------------------------------
  *
- * Function: stsyncn
+ * Function: FPT_stsyncn
  *
  * Description: The has sent us a Sync Nego message so handle it as
  *              necessary.
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-void stsyncn(USHORT port, UCHAR p_card)
-#else
-void stsyncn(ULONG port, UCHAR p_card)
-#endif
+static void FPT_stsyncn(ULONG port, UCHAR p_card)
 {
    UCHAR sync_msg,offset,sync_reg,our_sync_msg;
    PSCCB currSCCB;
    PSCCBMgr_tar_info currTar_Info;
 
-   currSCCB = BL_Card[p_card].currentSCCB;
-   currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
+   currSCCB = FPT_BL_Card[p_card].currentSCCB;
+   currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
 
-   sync_msg = sfm(port,currSCCB);
+   sync_msg = FPT_sfm(port,currSCCB);
 
        if((sync_msg == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
        {
@@ -6713,7 +3834,7 @@ void stsyncn(ULONG port, UCHAR p_card)
    ACCEPT_MSG(port);
 
 
-   offset = sfm(port,currSCCB);
+   offset = FPT_sfm(port,currSCCB);
 
        if((offset == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
        {
@@ -6783,7 +3904,6 @@ void stsyncn(ULONG port, UCHAR p_card)
       }
 
 
-#if defined(WIDE_SCSI)
    if (currTar_Info->TarStatus & WIDE_ENABLED)
 
       sync_reg |= offset;
@@ -6792,11 +3912,7 @@ void stsyncn(ULONG port, UCHAR p_card)
 
       sync_reg |= (offset | NARROW_SCSI);
 
-#else
-   sync_reg |= (offset | NARROW_SCSI);
-#endif
-
-   sssyncv(port,currSCCB->TargID,sync_reg,currTar_Info);
+   FPT_sssyncv(port,currSCCB->TargID,sync_reg,currTar_Info);
 
 
    if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
@@ -6815,7 +3931,7 @@ void stsyncn(ULONG port, UCHAR p_card)
 
       ACCEPT_MSG_ATN(port);
 
-      sisyncr(port,sync_msg,offset);
+      FPT_sisyncr(port,sync_msg,offset);
 
       currTar_Info->TarStatus = ((currTar_Info->TarStatus &
          ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_SUPPORTED);
@@ -6825,16 +3941,12 @@ void stsyncn(ULONG port, UCHAR p_card)
 
 /*---------------------------------------------------------------------
  *
- * Function: sisyncr
+ * Function: FPT_sisyncr
  *
  * Description: Answer the targets sync message.
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-void sisyncr(USHORT port,UCHAR sync_pulse, UCHAR offset)
-#else
-void sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset)
-#endif
+static void FPT_sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset)
 {
    ARAM_ACCESS(port);
    WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
@@ -6856,28 +3968,22 @@ void sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset)
 
 
 
-#if defined(WIDE_SCSI)
-
 /*---------------------------------------------------------------------
  *
- * Function: siwidn
+ * Function: FPT_siwidn
  *
  * Description: Read in a message byte from the SCSI bus, and check
  *              for a parity error.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-UCHAR siwidn(USHORT port, UCHAR p_card)
-#else
-UCHAR siwidn(ULONG port, UCHAR p_card)
-#endif
+static UCHAR FPT_siwidn(ULONG port, UCHAR p_card)
 {
    PSCCB currSCCB;
    PSCCBMgr_tar_info currTar_Info;
 
-   currSCCB = BL_Card[p_card].currentSCCB;
-   currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
+   currSCCB = FPT_BL_Card[p_card].currentSCCB;
+   currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
 
    if (!((currTar_Info->TarStatus & TAR_WIDE_MASK) == WIDE_NEGOCIATED)) {
 
@@ -6900,7 +4006,7 @@ UCHAR siwidn(ULONG port, UCHAR p_card)
       currTar_Info->TarStatus = ((currTar_Info->TarStatus &
          ~(UCHAR)TAR_WIDE_MASK) | (UCHAR)WIDE_ENABLED);
 
-      return(TRUE);
+      return(1);
       }
 
    else {
@@ -6909,7 +4015,7 @@ UCHAR siwidn(ULONG port, UCHAR p_card)
                ~(UCHAR)TAR_WIDE_MASK) | WIDE_NEGOCIATED);
 
       currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
-      return(FALSE);
+      return(0);
       }
 }
 
@@ -6917,26 +4023,22 @@ UCHAR siwidn(ULONG port, UCHAR p_card)
 
 /*---------------------------------------------------------------------
  *
- * Function: stwidn
+ * Function: FPT_stwidn
  *
  * Description: The has sent us a Wide Nego message so handle it as
  *              necessary.
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-void stwidn(USHORT port, UCHAR p_card)
-#else
-void stwidn(ULONG port, UCHAR p_card)
-#endif
+static void FPT_stwidn(ULONG port, UCHAR p_card)
 {
    UCHAR width;
    PSCCB currSCCB;
    PSCCBMgr_tar_info currTar_Info;
 
-   currSCCB = BL_Card[p_card].currentSCCB;
-   currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
+   currSCCB = FPT_BL_Card[p_card].currentSCCB;
+   currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
 
-   width = sfm(port,currSCCB);
+   width = FPT_sfm(port,currSCCB);
 
        if((width == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
        {
@@ -6958,7 +4060,7 @@ void stwidn(ULONG port, UCHAR p_card)
       }
 
 
-   sssyncv(port,currSCCB->TargID,width,currTar_Info);
+   FPT_sssyncv(port,currSCCB->TargID,width,currTar_Info);
 
 
    if (currSCCB->Sccb_scsistat == SELECT_WN_ST)
@@ -6972,7 +4074,7 @@ void stwidn(ULONG port, UCHAR p_card)
                {
              ACCEPT_MSG_ATN(port);
                   ARAM_ACCESS(port);
-               sisyncn(port,p_card, TRUE);
+               FPT_sisyncn(port,p_card, 1);
              currSCCB->Sccb_scsistat = SELECT_SN_ST;
                   SGRAM_ACCESS(port);
                }
@@ -6993,7 +4095,7 @@ void stwidn(ULONG port, UCHAR p_card)
       else
         width = SM8BIT;
 
-      siwidr(port,width);
+      FPT_siwidr(port,width);
 
       currTar_Info->TarStatus |= (WIDE_NEGOCIATED | WIDE_ENABLED);
       }
@@ -7002,16 +4104,12 @@ void stwidn(ULONG port, UCHAR p_card)
 
 /*---------------------------------------------------------------------
  *
- * Function: siwidr
+ * Function: FPT_siwidr
  *
  * Description: Answer the targets Wide nego message.
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-void siwidr(USHORT port, UCHAR width)
-#else
-void siwidr(ULONG port, UCHAR width)
-#endif
+static void FPT_siwidr(ULONG port, UCHAR width)
 {
    ARAM_ACCESS(port);
    WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
@@ -7030,23 +4128,18 @@ void siwidr(ULONG port, UCHAR width)
    while (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | AUTO_INT))) {}
 }
 
-#endif
-
 
 
 /*---------------------------------------------------------------------
  *
- * Function: sssyncv
+ * Function: FPT_sssyncv
  *
  * Description: Write the desired value to the Sync Register for the
  *              ID specified.
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-void sssyncv(USHORT p_port, UCHAR p_id, UCHAR p_sync_value,PSCCBMgr_tar_info currTar_Info)
-#else
-void sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value,PSCCBMgr_tar_info currTar_Info)
-#endif
+static void FPT_sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value,
+                       PSCCBMgr_tar_info currTar_Info)
 {
    UCHAR index;
 
@@ -7112,16 +4205,12 @@ void sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value,PSCCBMgr_tar_info curr
 
 /*---------------------------------------------------------------------
  *
- * Function: sresb
+ * Function: FPT_sresb
  *
  * Description: Reset the desired card's SCSI bus.
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-void sresb(USHORT port, UCHAR p_card)
-#else
-void sresb(ULONG port, UCHAR p_card)
-#endif
+static void FPT_sresb(ULONG port, UCHAR p_card)
 {
    UCHAR scsiID, i;
 
@@ -7145,7 +4234,7 @@ void sresb(ULONG port, UCHAR p_card)
 
    WR_HARPOON(port+hp_scsictrl_0, ENA_SCAM_SEL);
 
-   Wait(port, TO_5ms);
+   FPT_Wait(port, TO_5ms);
 
    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
 
@@ -7153,7 +4242,7 @@ void sresb(ULONG port, UCHAR p_card)
 
    for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++)
       {
-      currTar_Info = &sccbMgrTbl[p_card][scsiID];
+      currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID];
 
       if (currTar_Info->TarEEValue & EE_SYNC_MASK)
          {
@@ -7166,21 +4255,21 @@ void sresb(ULONG port, UCHAR p_card)
        currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
        }
 
-      sssyncv(port, scsiID, NARROW_SCSI,currTar_Info);
+      FPT_sssyncv(port, scsiID, NARROW_SCSI,currTar_Info);
 
-      SccbMgrTableInitTarget(p_card, scsiID);
+      FPT_SccbMgrTableInitTarget(p_card, scsiID);
       }
 
-   BL_Card[p_card].scanIndex = 0x00;
-   BL_Card[p_card].currentSCCB = NULL;
-   BL_Card[p_card].globalFlags &= ~(F_TAG_STARTED | F_HOST_XFER_ACT 
+   FPT_BL_Card[p_card].scanIndex = 0x00;
+   FPT_BL_Card[p_card].currentSCCB = NULL;
+   FPT_BL_Card[p_card].globalFlags &= ~(F_TAG_STARTED | F_HOST_XFER_ACT 
                                                                                                        | F_NEW_SCCB_CMD);
-   BL_Card[p_card].cmdCounter  = 0x00;
-       BL_Card[p_card].discQCount = 0x00;
-   BL_Card[p_card].tagQ_Lst = 0x01; 
+   FPT_BL_Card[p_card].cmdCounter  = 0x00;
+       FPT_BL_Card[p_card].discQCount = 0x00;
+   FPT_BL_Card[p_card].tagQ_Lst = 0x01; 
 
        for(i = 0; i < QUEUE_DEPTH; i++)
-               BL_Card[p_card].discQ_Tbl[i] = NULL;
+               FPT_BL_Card[p_card].discQ_Tbl[i] = NULL;
 
    WR_HARPOON(port+hp_page_ctrl,
       (RD_HARPOON(port+hp_page_ctrl) & ~G_INT_DISABLE));
@@ -7189,12 +4278,12 @@ void sresb(ULONG port, UCHAR p_card)
 
 /*---------------------------------------------------------------------
  *
- * Function: ssenss
+ * Function: FPT_ssenss
  *
  * Description: Setup for the Auto Sense command.
  *
  *---------------------------------------------------------------------*/
-void ssenss(PSCCBcard pCurrCard)
+static void FPT_ssenss(PSCCBcard pCurrCard)
 {
    UCHAR i;
    PSCCB currSCCB;
@@ -7236,27 +4325,23 @@ void ssenss(PSCCBcard pCurrCard)
 
 /*---------------------------------------------------------------------
  *
- * Function: sxfrp
+ * Function: FPT_sxfrp
  *
  * Description: Transfer data into the bit bucket until the device
  *              decides to switch phase.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void sxfrp(USHORT p_port, UCHAR p_card)
-#else
-void sxfrp(ULONG p_port, UCHAR p_card)
-#endif
+static void FPT_sxfrp(ULONG p_port, UCHAR p_card)
 {
    UCHAR curr_phz;
 
 
    DISABLE_AUTO(p_port);
 
-   if (BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
+   if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
 
-      hostDataXferAbort(p_port,p_card,BL_Card[p_card].currentSCCB);
+      FPT_hostDataXferAbort(p_port,p_card,FPT_BL_Card[p_card].currentSCCB);
 
       }
 
@@ -7322,25 +4407,21 @@ void sxfrp(ULONG p_port, UCHAR p_card)
 
 /*---------------------------------------------------------------------
  *
- * Function: schkdd
+ * Function: FPT_schkdd
  *
  * Description: Make sure data has been flushed from both FIFOs and abort
  *              the operations if necessary.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void schkdd(USHORT port, UCHAR p_card)
-#else
-void schkdd(ULONG port, UCHAR p_card)
-#endif
+static void FPT_schkdd(ULONG port, UCHAR p_card)
 {
    USHORT TimeOutLoop;
        UCHAR sPhase;
 
    PSCCB currSCCB;
 
-   currSCCB = BL_Card[p_card].currentSCCB;
+   currSCCB = FPT_BL_Card[p_card].currentSCCB;
 
 
    if ((currSCCB->Sccb_scsistat != DATA_OUT_ST) &&
@@ -7378,7 +4459,7 @@ void schkdd(ULONG port, UCHAR p_card)
       }
 
 
-   hostDataXferAbort(port,p_card,currSCCB);
+   FPT_hostDataXferAbort(port,p_card,currSCCB);
 
 
    while (RD_HARPOON(port+hp_scsisig) & SCSI_ACK) {}
@@ -7412,21 +4493,21 @@ void schkdd(ULONG port, UCHAR p_card)
           if (!(currSCCB->Sccb_XferState & F_ALL_XFERRED))
          {
              if (currSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
-                phaseDataIn(port,p_card);
+                FPT_phaseDataIn(port,p_card);
                }
 
                else {
-              phaseDataOut(port,p_card);
+              FPT_phaseDataOut(port,p_card);
                }
                }
                else
        {
-               sxfrp(port,p_card);
+               FPT_sxfrp(port,p_card);
                if (!(RDW_HARPOON((port+hp_intstat)) &
                      (BUS_FREE | ICMD_COMP | ITAR_DISC | RESET)))
          {
                WRW_HARPOON((port+hp_intstat), AUTO_INT);
-                  phaseDecode(port,p_card);
+                  FPT_phaseDecode(port,p_card);
                   }
           }
 
@@ -7440,13 +4521,13 @@ void schkdd(ULONG port, UCHAR p_card)
 
 /*---------------------------------------------------------------------
  *
- * Function: sinits
+ * Function: FPT_sinits
  *
  * Description: Setup SCCB manager fields in this SCCB.
  *
  *---------------------------------------------------------------------*/
 
-void sinits(PSCCB p_sccb, UCHAR p_card)
+static void FPT_sinits(PSCCB p_sccb, UCHAR p_card)
 {
    PSCCBMgr_tar_info currTar_Info;
 
@@ -7454,7 +4535,7 @@ void sinits(PSCCB p_sccb, UCHAR p_card)
        {
                return;
        }
-   currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
+   currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
 
    p_sccb->Sccb_XferState     = 0x00;
    p_sccb->Sccb_XferCnt       = p_sccb->DataLength;
@@ -7485,7 +4566,7 @@ void sinits(PSCCB p_sccb, UCHAR p_card)
        else send Cmd with Disconnect Disable */
 
 /*
-   if (((!(BL_Card[p_card].globalFlags & F_SINGLE_DEVICE)) &&
+   if (((!(FPT_BL_Card[p_card].globalFlags & F_SINGLE_DEVICE)) &&
       (currTar_Info->TarStatus & TAR_ALLOW_DISC)) ||
       (currTar_Info->TarStatus & TAG_Q_TRYING)) {
 */
@@ -7518,55 +4599,6 @@ void sinits(PSCCB p_sccb, UCHAR p_card)
 }
 
 
-#ident "$Id: phase.c 1.11 1997/01/31 02:08:49 mohan Exp $"
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   phase.c  $
- *
- *   Description:  Functions to initially handle the SCSI bus phase when
- *                 the target asserts request (and the automation is not
- *                 enabled to handle the situation).
- *
- *   $Date: 1997/01/31 02:08:49 $
- *
- *   $Revision: 1.11 $
- *
- *----------------------------------------------------------------------*/
-
-/*#include <globals.h>*/
-
-#if (FW_TYPE==_UCB_MGR_)
-       /*#include <budi.h>*/
-#endif
-
-/*#include <sccbmgr.h>*/
-/*#include <blx30.h>*/
-/*#include <target.h>*/
-/*#include <scsi2.h>*/
-/*#include <harpoon.h>*/
-
-
-/*
-extern SCCBCARD BL_Card[MAX_CARDS];
-extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
-
-#if defined(OS2)
-   extern void (far *s_PhaseTbl[8]) (ULONG, UCHAR);
-#else
-   #if defined(DOS)
-      extern void (*s_PhaseTbl[8]) (USHORT, UCHAR);
-   #else
-      extern void (*s_PhaseTbl[8]) (ULONG, UCHAR);
-   #endif
-#endif
-*/
-
 /*---------------------------------------------------------------------
  *
  * Function: Phase Decode
@@ -7575,29 +4607,17 @@ extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void phaseDecode(USHORT p_port, UCHAR p_card)
-#else
-void phaseDecode(ULONG p_port, UCHAR p_card)
-#endif
+static void FPT_phaseDecode(ULONG p_port, UCHAR p_card)
 {
    unsigned char phase_ref;
-#if defined(OS2)
-   void (far *phase) (ULONG, UCHAR);
-#else
-   #if defined(DOS)
-      void (*phase) (USHORT, UCHAR);
-   #else
-      void (*phase) (ULONG, UCHAR);
-   #endif
-#endif
+   void (*phase) (ULONG, UCHAR);
 
 
    DISABLE_AUTO(p_port);
 
    phase_ref = (UCHAR) (RD_HARPOON(p_port+hp_scsisig) & S_SCSI_PHZ);
 
-   phase = s_PhaseTbl[phase_ref];
+   phase = FPT_s_PhaseTbl[phase_ref];
 
    (*phase)(p_port, p_card);           /* Call the correct phase func */
 }
@@ -7612,20 +4632,12 @@ void phaseDecode(ULONG p_port, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(OS2)
-void far phaseDataOut(ULONG port, UCHAR p_card)
-#else
-#if defined(DOS)
-void phaseDataOut(USHORT port, UCHAR p_card)
-#else
-void phaseDataOut(ULONG port, UCHAR p_card)
-#endif
-#endif
+static void FPT_phaseDataOut(ULONG port, UCHAR p_card)
 {
 
    PSCCB currSCCB;
 
-   currSCCB = BL_Card[p_card].currentSCCB;
+   currSCCB = FPT_BL_Card[p_card].currentSCCB;
    if (currSCCB == NULL)
       {
       return;  /* Exit if No SCCB record */
@@ -7640,14 +4652,7 @@ void phaseDataOut(ULONG port, UCHAR p_card)
 
    WR_HARPOON(port+hp_autostart_0, (END_DATA+END_DATA_START));
 
-   dataXferProcessor(port, &BL_Card[p_card]);
-
-#if defined(NOBUGBUG)
-   if (RDW_HARPOON((port+hp_intstat)) & XFER_CNT_0)
-      WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
-
-#endif
-
+   FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
 
    if (currSCCB->Sccb_XferCnt == 0) {
 
@@ -7656,9 +4661,9 @@ void phaseDataOut(ULONG port, UCHAR p_card)
         (currSCCB->HostStatus == SCCB_COMPLETE))
         currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
 
-      sxfrp(port,p_card);
+      FPT_sxfrp(port,p_card);
       if (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | RESET)))
-           phaseDecode(port,p_card);
+           FPT_phaseDecode(port,p_card);
       }
 }
 
@@ -7671,20 +4676,12 @@ void phaseDataOut(ULONG port, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(OS2)
-void far phaseDataIn(ULONG port, UCHAR p_card)
-#else
-#if defined(DOS)
-void phaseDataIn(USHORT port, UCHAR p_card)
-#else
-void phaseDataIn(ULONG port, UCHAR p_card)
-#endif
-#endif
+static void FPT_phaseDataIn(ULONG port, UCHAR p_card)
 {
 
    PSCCB currSCCB;
 
-   currSCCB = BL_Card[p_card].currentSCCB;
+   currSCCB = FPT_BL_Card[p_card].currentSCCB;
 
    if (currSCCB == NULL)
       {
@@ -7702,7 +4699,7 @@ void phaseDataIn(ULONG port, UCHAR p_card)
 
    WR_HARPOON(port+hp_autostart_0, (END_DATA+END_DATA_START));
 
-   dataXferProcessor(port, &BL_Card[p_card]);
+   FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
 
    if (currSCCB->Sccb_XferCnt == 0) {
 
@@ -7711,9 +4708,9 @@ void phaseDataIn(ULONG port, UCHAR p_card)
         (currSCCB->HostStatus == SCCB_COMPLETE))
         currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
 
-      sxfrp(port,p_card);
+      FPT_sxfrp(port,p_card);
       if (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | RESET)))
-           phaseDecode(port,p_card);
+           FPT_phaseDecode(port,p_card);
 
       }
 }
@@ -7726,25 +4723,13 @@ void phaseDataIn(ULONG port, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(OS2)
-void far phaseCommand(ULONG p_port, UCHAR p_card)
-#else
-#if defined(DOS)
-void phaseCommand(USHORT p_port, UCHAR p_card)
-#else
-void phaseCommand(ULONG p_port, UCHAR p_card)
-#endif
-#endif
+static void FPT_phaseCommand(ULONG p_port, UCHAR p_card)
 {
    PSCCB currSCCB;
-#if defined(DOS)
-   USHORT cdb_reg;
-#else
    ULONG cdb_reg;
-#endif
    UCHAR i;
 
-   currSCCB = BL_Card[p_card].currentSCCB;
+   currSCCB = FPT_BL_Card[p_card].currentSCCB;
 
    if (currSCCB->OperationCode == RESET_COMMAND) {
 
@@ -7790,15 +4775,7 @@ void phaseCommand(ULONG p_port, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(OS2)
-void far phaseStatus(ULONG port, UCHAR p_card)
-#else
-#if defined(DOS)
-void phaseStatus(USHORT port, UCHAR p_card)
-#else
-void phaseStatus(ULONG port, UCHAR p_card)
-#endif
-#endif
+static void FPT_phaseStatus(ULONG port, UCHAR p_card)
 {
    /* Start-up the automation to finish off this command and let the
       isr handle the interrupt for command complete when it comes in.
@@ -7820,21 +4797,13 @@ void phaseStatus(ULONG port, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(OS2)
-void far phaseMsgOut(ULONG port, UCHAR p_card)
-#else
-#if defined(DOS)
-void phaseMsgOut(USHORT port, UCHAR p_card)
-#else
-void phaseMsgOut(ULONG port, UCHAR p_card)
-#endif
-#endif
+static void FPT_phaseMsgOut(ULONG port, UCHAR p_card)
 {
        UCHAR message,scsiID;
        PSCCB currSCCB;
        PSCCBMgr_tar_info currTar_Info;
 
-       currSCCB = BL_Card[p_card].currentSCCB;
+       currSCCB = FPT_BL_Card[p_card].currentSCCB;
 
        if (currSCCB != NULL) {
 
@@ -7845,34 +4814,34 @@ void phaseMsgOut(ULONG port, UCHAR p_card)
                {
 
 
-                       currTar_Info = &sccbMgrTbl[p_card][scsiID];
+                       currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID];
                        currTar_Info->TarSyncCtrl = 0;
-                       sssyncv(port, scsiID, NARROW_SCSI,currTar_Info);
+                       FPT_sssyncv(port, scsiID, NARROW_SCSI,currTar_Info);
 
-                       if (sccbMgrTbl[p_card][scsiID].TarEEValue & EE_SYNC_MASK) 
+                       if (FPT_sccbMgrTbl[p_card][scsiID].TarEEValue & EE_SYNC_MASK) 
                        {
 
-                               sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_SYNC_MASK;
+                               FPT_sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_SYNC_MASK;
 
                        }
 
-                       if (sccbMgrTbl[p_card][scsiID].TarEEValue & EE_WIDE_SCSI) 
+                       if (FPT_sccbMgrTbl[p_card][scsiID].TarEEValue & EE_WIDE_SCSI) 
                        {
 
-                               sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_WIDE_MASK;
+                               FPT_sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_WIDE_MASK;
                        }
 
 
-                       queueFlushSccb(p_card,SCCB_COMPLETE);
-                       SccbMgrTableInitTarget(p_card,scsiID);
+                       FPT_queueFlushSccb(p_card,SCCB_COMPLETE);
+                       FPT_SccbMgrTableInitTarget(p_card,scsiID);
                }
                else if (currSCCB->Sccb_scsistat == ABORT_ST)
                {
                        currSCCB->HostStatus = SCCB_COMPLETE;
-                       if(BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] != NULL)
+                       if(FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] != NULL)
                        {
-                               BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
-                               sccbMgrTbl[p_card][scsiID].TarTagQ_Cnt--;
+                               FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
+                               FPT_sccbMgrTbl[p_card][scsiID].TarTagQ_Cnt--;
                        }
                                        
                }
@@ -7885,7 +4854,7 @@ void phaseMsgOut(ULONG port, UCHAR p_card)
                        {
                                currSCCB->Sccb_MGRFlags |= F_DEV_SELECTED;
                
-                               ssel(port,p_card);
+                               FPT_ssel(port,p_card);
                                return;
                        }
                }
@@ -7895,7 +4864,7 @@ void phaseMsgOut(ULONG port, UCHAR p_card)
 
                        if (message == SMABORT)
 
-                               queueFlushSccb(p_card,SCCB_COMPLETE);
+                               FPT_queueFlushSccb(p_card,SCCB_COMPLETE);
                }
 
        }
@@ -7930,25 +4899,25 @@ void phaseMsgOut(ULONG port, UCHAR p_card)
                        if (currSCCB != NULL) 
                        {
 
-                               if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
-                                       ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
-                                       sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
+                               if((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
+                                       ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
+                                       FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 0;
                                else
-                                       sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
+                                       FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0;
 
-                               queueCmdComplete(&BL_Card[p_card],currSCCB, p_card);
+                               FPT_queueCmdComplete(&FPT_BL_Card[p_card],currSCCB, p_card);
                        }
 
                        else 
                        {
-                               BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
+                               FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
                        }
                }
 
                else 
                {
 
-                       sxfrp(port,p_card);
+                       FPT_sxfrp(port,p_card);
                }
        }
 
@@ -7962,7 +4931,7 @@ void phaseMsgOut(ULONG port, UCHAR p_card)
                }
                else
                {
-                       sxfrp(port,p_card);
+                       FPT_sxfrp(port,p_card);
                }
        }
 }
@@ -7976,25 +4945,17 @@ void phaseMsgOut(ULONG port, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(OS2)
-void far phaseMsgIn(ULONG port, UCHAR p_card)
-#else
-#if defined(DOS)
-void phaseMsgIn(USHORT port, UCHAR p_card)
-#else
-void phaseMsgIn(ULONG port, UCHAR p_card)
-#endif
-#endif
+static void FPT_phaseMsgIn(ULONG port, UCHAR p_card)
 {
        UCHAR message;
        PSCCB currSCCB;
 
-       currSCCB = BL_Card[p_card].currentSCCB;
+       currSCCB = FPT_BL_Card[p_card].currentSCCB;
 
-       if (BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) 
+       if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) 
        {
 
-               phaseChkFifo(port, p_card);
+               FPT_phaseChkFifo(port, p_card);
        }
 
        message = RD_HARPOON(port+hp_scsidata_0);
@@ -8008,12 +4969,12 @@ void phaseMsgIn(ULONG port, UCHAR p_card)
        else 
        {
 
-               message = sfm(port,currSCCB);
+               message = FPT_sfm(port,currSCCB);
                if (message) 
                {
 
 
-                       sdecm(message,port,p_card);
+                       FPT_sdecm(message,port,p_card);
 
                }
                else
@@ -8037,19 +4998,11 @@ void phaseMsgIn(ULONG port, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(OS2)
-void far phaseIllegal(ULONG port, UCHAR p_card)
-#else
-#if defined(DOS)
-void phaseIllegal(USHORT port, UCHAR p_card)
-#else
-void phaseIllegal(ULONG port, UCHAR p_card)
-#endif
-#endif
+static void FPT_phaseIllegal(ULONG port, UCHAR p_card)
 {
    PSCCB currSCCB;
 
-   currSCCB = BL_Card[p_card].currentSCCB;
+   currSCCB = FPT_BL_Card[p_card].currentSCCB;
 
    WR_HARPOON(port+hp_scsisig, RD_HARPOON(port+hp_scsisig));
    if (currSCCB != NULL) {
@@ -8073,16 +5026,12 @@ void phaseIllegal(ULONG port, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void phaseChkFifo(USHORT port, UCHAR p_card)
-#else
-void phaseChkFifo(ULONG port, UCHAR p_card)
-#endif
+static void FPT_phaseChkFifo(ULONG port, UCHAR p_card)
 {
    ULONG xfercnt;
    PSCCB currSCCB;
 
-   currSCCB = BL_Card[p_card].currentSCCB;
+   currSCCB = FPT_BL_Card[p_card].currentSCCB;
 
    if (currSCCB->Sccb_scsistat == DATA_IN_ST)
       {
@@ -8104,9 +5053,9 @@ void phaseChkFifo(ULONG port, UCHAR p_card)
                 WRW_HARPOON((port+hp_intstat), PARITY);
                 }
 
-             hostDataXferAbort(port,p_card,currSCCB);
+             FPT_hostDataXferAbort(port,p_card,currSCCB);
 
-             dataXferProcessor(port, &BL_Card[p_card]);
+             FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
 
              while((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) &&
                 (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY)) {}
@@ -8116,22 +5065,7 @@ void phaseChkFifo(ULONG port, UCHAR p_card)
 
 
 
-#if defined(DOS)
-   asm { mov dx,port;
-      add dx,hp_xfercnt_2;
-      in  al,dx;
-      dec dx;
-      xor ah,ah;
-      mov word ptr xfercnt+2,ax;
-      in  al,dx;
-      dec dx;
-      mov ah,al;
-      in  al,dx;
-      mov word ptr xfercnt,ax;
-      }
-#else
    GET_XFER_CNT(port,xfercnt);
-#endif
 
 
    WR_HARPOON(port+hp_xfercnt_0, 0x00);
@@ -8151,7 +5085,7 @@ void phaseChkFifo(ULONG port, UCHAR p_card)
       }
 
 
-   hostDataXferAbort(port,p_card,currSCCB);
+   FPT_hostDataXferAbort(port,p_card,currSCCB);
 
 
    WR_HARPOON(port+hp_fifowrite, 0x00);
@@ -8170,15 +5104,11 @@ void phaseChkFifo(ULONG port, UCHAR p_card)
  *              because of command complete or from a disconnect.
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-void phaseBusFree(USHORT port, UCHAR p_card)
-#else
-void phaseBusFree(ULONG port, UCHAR p_card)
-#endif
+static void FPT_phaseBusFree(ULONG port, UCHAR p_card)
 {
    PSCCB currSCCB;
 
-   currSCCB = BL_Card[p_card].currentSCCB;
+   currSCCB = FPT_BL_Card[p_card].currentSCCB;
 
    if (currSCCB != NULL)
       {
@@ -8189,35 +5119,34 @@ void phaseBusFree(ULONG port, UCHAR p_card)
       if (currSCCB->OperationCode == RESET_COMMAND)
          {
 
-                       if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
-                               ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
-                        sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
+                       if((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
+                               ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
+                        FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 0;
                        else
-                        sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
+                        FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0;
 
-             queueCmdComplete(&BL_Card[p_card], currSCCB, p_card);
+             FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card);
 
-             queueSearchSelect(&BL_Card[p_card],p_card);
+             FPT_queueSearchSelect(&FPT_BL_Card[p_card],p_card);
 
              }
 
       else if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
              {
-             sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
+             FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
                                 (UCHAR)SYNC_SUPPORTED;
-             sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK;
+             FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK;
              }
 
       else if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
              {
-             sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
-                           (sccbMgrTbl[p_card][currSCCB->TargID].
+             FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
+                           (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
                   TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
 
-             sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI;
+             FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI;
              }
 
-#if !defined(DOS)
       else if(currSCCB->Sccb_scsistat == SELECT_Q_ST)
              {
              /* Make sure this is not a phony BUS_FREE.  If we were
@@ -8227,8 +5156,8 @@ void phaseBusFree(ULONG port, UCHAR p_card)
              if ((!(RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ||
                 (RDW_HARPOON((port+hp_intstat)) & RSEL))
                 {
-                sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_TAG_Q_MASK;
-                sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |= TAG_Q_REJECT;
+                FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_TAG_Q_MASK;
+                FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |= TAG_Q_REJECT;
                 }
 
              else
@@ -8236,7 +5165,6 @@ void phaseBusFree(ULONG port, UCHAR p_card)
                 return;
                 }
          }
-#endif
 
       else
              {
@@ -8248,18 +5176,18 @@ void phaseBusFree(ULONG port, UCHAR p_card)
                 currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
                 }
 
-                       if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
-                               ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
-                        sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
+                       if((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
+                               ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
+                        FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 0;
                        else
-                        sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
+                        FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0;
 
-             queueCmdComplete(&BL_Card[p_card], currSCCB, p_card);
+             FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card);
              return;
              }
 
 
-      BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
+      FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
 
       } /*end if !=null */
 }
@@ -8267,44 +5195,6 @@ void phaseBusFree(ULONG port, UCHAR p_card)
 
 
 
-#ident "$Id: automate.c 1.14 1997/01/31 02:11:46 mohan Exp $"
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   automate.c  $
- *
- *   Description:  Functions relating to programming the automation of
- *                 the HARPOON.
- *
- *   $Date: 1997/01/31 02:11:46 $
- *
- *   $Revision: 1.14 $
- *
- *----------------------------------------------------------------------*/
-
-/*#include <globals.h>*/
-
-#if (FW_TYPE==_UCB_MGR_)
-       /*#include <budi.h>*/
-#endif
-
-/*#include <sccbmgr.h>*/
-/*#include <blx30.h>*/
-/*#include <target.h>*/
-/*#include <scsi2.h>*/
-/*#include <harpoon.h>*/
-
-/*
-extern SCCBCARD BL_Card[MAX_CARDS];
-extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
-extern SCCBCARD BL_Card[MAX_CARDS];
-*/
-
 /*---------------------------------------------------------------------
  *
  * Function: Auto Load Default Map
@@ -8312,17 +5202,9 @@ extern SCCBCARD BL_Card[MAX_CARDS];
  * Description: Load the Automation RAM with the defualt map values.
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-void autoLoadDefaultMap(USHORT p_port)
-#else
-void autoLoadDefaultMap(ULONG p_port)
-#endif
+static void FPT_autoLoadDefaultMap(ULONG p_port)
 {
-#if defined(DOS)
-   USHORT map_addr;
-#else
    ULONG map_addr;
-#endif
 
    ARAM_ACCESS(p_port);
    map_addr = p_port + hp_aramBase;
@@ -8428,86 +5310,82 @@ void autoLoadDefaultMap(ULONG p_port)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void autoCmdCmplt(USHORT p_port, UCHAR p_card)
-#else
-void autoCmdCmplt(ULONG p_port, UCHAR p_card)
-#endif
+static void FPT_autoCmdCmplt(ULONG p_port, UCHAR p_card)
 {
    PSCCB currSCCB;
    UCHAR status_byte;
 
-   currSCCB = BL_Card[p_card].currentSCCB;
+   currSCCB = FPT_BL_Card[p_card].currentSCCB;
 
    status_byte = RD_HARPOON(p_port+hp_gp_reg_0);
 
-   sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA = FALSE;
+   FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA = 0;
 
    if (status_byte != SSGOOD) {
 
       if (status_byte == SSQ_FULL) {
 
 
-                       if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
-                               ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
+                       if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
+                               ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                        {
-                sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
-                               if(BL_Card[p_card].discQCount != 0)
-                                       BL_Card[p_card].discQCount--;
-                               BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
+                FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 1;
+                               if(FPT_BL_Card[p_card].discQCount != 0)
+                                       FPT_BL_Card[p_card].discQCount--;
+                               FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
                        }
                        else
                        {
-                sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
+                FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 1;
                                if(currSCCB->Sccb_tag)
                                {
-                                       if(BL_Card[p_card].discQCount != 0)
-                                               BL_Card[p_card].discQCount--;
-                                       BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
+                                       if(FPT_BL_Card[p_card].discQCount != 0)
+                                               FPT_BL_Card[p_card].discQCount--;
+                                       FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
                                }else
                                {
-                                       if(BL_Card[p_card].discQCount != 0)
-                                               BL_Card[p_card].discQCount--;
-                                       BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
+                                       if(FPT_BL_Card[p_card].discQCount != 0)
+                                               FPT_BL_Card[p_card].discQCount--;
+                                       FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
                                }
                        }
 
          currSCCB->Sccb_MGRFlags |= F_STATUSLOADED;
 
-         queueSelectFail(&BL_Card[p_card],p_card);
+         FPT_queueSelectFail(&FPT_BL_Card[p_card],p_card);
 
          return;
          }
 
       if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
          {
-         sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
+         FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
             (UCHAR)SYNC_SUPPORTED;
 
-             sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK;
-         BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
+             FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK;
+         FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
 
-                       if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
-                               ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
+                       if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
+                               ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                        {
-                sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
-                               if(BL_Card[p_card].discQCount != 0)
-                                       BL_Card[p_card].discQCount--;
-                               BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
+                FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 1;
+                               if(FPT_BL_Card[p_card].discQCount != 0)
+                                       FPT_BL_Card[p_card].discQCount--;
+                               FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
                        }
                        else
                        {
-                sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
+                FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 1;
                                if(currSCCB->Sccb_tag)
                                {
-                                       if(BL_Card[p_card].discQCount != 0)
-                                               BL_Card[p_card].discQCount--;
-                                       BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
+                                       if(FPT_BL_Card[p_card].discQCount != 0)
+                                               FPT_BL_Card[p_card].discQCount--;
+                                       FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
                                }else
                                {
-                                       if(BL_Card[p_card].discQCount != 0)
-                                               BL_Card[p_card].discQCount--;
-                                       BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
+                                       if(FPT_BL_Card[p_card].discQCount != 0)
+                                               FPT_BL_Card[p_card].discQCount--;
+                                       FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
                                }
                        }
          return;
@@ -8517,34 +5395,34 @@ void autoCmdCmplt(ULONG p_port, UCHAR p_card)
       if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
          {
 
-             sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
-                (sccbMgrTbl[p_card][currSCCB->TargID].
+             FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
+                (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
                 TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
 
-             sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI;
-         BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
+             FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI;
+         FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
 
-                       if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
-                               ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
+                       if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
+                               ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                        {
-                sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
-                               if(BL_Card[p_card].discQCount != 0)
-                                       BL_Card[p_card].discQCount--;
-                               BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
+                FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 1;
+                               if(FPT_BL_Card[p_card].discQCount != 0)
+                                       FPT_BL_Card[p_card].discQCount--;
+                               FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
                        }
                        else
                        {
-                sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
+                FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 1;
                                if(currSCCB->Sccb_tag)
                                {
-                                       if(BL_Card[p_card].discQCount != 0)
-                                               BL_Card[p_card].discQCount--;
-                                       BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
+                                       if(FPT_BL_Card[p_card].discQCount != 0)
+                                               FPT_BL_Card[p_card].discQCount--;
+                                       FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
                                }else
                                {
-                                       if(BL_Card[p_card].discQCount != 0)
-                                               BL_Card[p_card].discQCount--;
-                                       BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
+                                       if(FPT_BL_Card[p_card].discQCount != 0)
+                                               FPT_BL_Card[p_card].discQCount--;
+                                       FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
                                }
                        }
          return;
@@ -8553,15 +5431,15 @@ void autoCmdCmplt(ULONG p_port, UCHAR p_card)
      
           if (status_byte == SSCHECK) 
                {
-                       if(BL_Card[p_card].globalFlags & F_DO_RENEGO)
+                       if(FPT_BL_Card[p_card].globalFlags & F_DO_RENEGO)
                        {
-                               if (sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_SYNC_MASK)
+                               if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_SYNC_MASK)
                                {
-                                       sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_SYNC_MASK;
+                                       FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_SYNC_MASK;
                                }
-                               if (sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_WIDE_SCSI)
+                               if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_WIDE_SCSI)
                                {
-                                       sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_WIDE_MASK;
+                                       FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_WIDE_MASK;
                                }
                        }
                }
@@ -8573,135 +5451,61 @@ void autoCmdCmplt(ULONG p_port, UCHAR p_card)
 
          if (status_byte == SSCHECK) {
 
-            sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA
-               = TRUE;
+            FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA
+               = 1;
      
 
-#if (FW_TYPE==_SCCB_MGR_)
             if (currSCCB->RequestSenseLength != NO_AUTO_REQUEST_SENSE) {
 
                if (currSCCB->RequestSenseLength == 0)
                   currSCCB->RequestSenseLength = 14;
 
-               ssenss(&BL_Card[p_card]);
-               BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
+               FPT_ssenss(&FPT_BL_Card[p_card]);
+               FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
 
-                                       if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
-                                               ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
+                                       if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
+                                               ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                                        {
-                                sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
-                                               if(BL_Card[p_card].discQCount != 0)
-                                                       BL_Card[p_card].discQCount--;
-                                               BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
+                                FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 1;
+                                               if(FPT_BL_Card[p_card].discQCount != 0)
+                                                       FPT_BL_Card[p_card].discQCount--;
+                                               FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
                                        }
                                        else
                                        {
-                             sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
+                             FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 1;
                                                if(currSCCB->Sccb_tag)
                                                {
-                                                       if(BL_Card[p_card].discQCount != 0)
-                                                               BL_Card[p_card].discQCount--;
-                                                       BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
+                                                       if(FPT_BL_Card[p_card].discQCount != 0)
+                                                               FPT_BL_Card[p_card].discQCount--;
+                                                       FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
                                                }else
                                                {
-                                                       if(BL_Card[p_card].discQCount != 0)
-                                                               BL_Card[p_card].discQCount--;
-                                                       BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
+                                                       if(FPT_BL_Card[p_card].discQCount != 0)
+                                                               FPT_BL_Card[p_card].discQCount--;
+                                                       FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
                                                }
                                        }
                return;
                }
-#else
-                                  if ((!(currSCCB->Sccb_ucb_ptr->UCB_opcode & OPC_NO_AUTO_SENSE)) &&
-                                       (currSCCB->RequestSenseLength))
-                                  {
-                                       ssenss(&BL_Card[p_card]);
-                                     BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
-
-                                               if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
-                                                       ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
-                                               {
-                                  sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
-                                                       if(BL_Card[p_card].discQCount != 0)
-                                                               BL_Card[p_card].discQCount--;
-                                                       BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
-                                               }
-                                               else
-                                               {
-                                  sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
-                                                       if(currSCCB->Sccb_tag)
-                                                       {
-                                                               if(BL_Card[p_card].discQCount != 0)
-                                                                       BL_Card[p_card].discQCount--;
-                                                               BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
-                                                       }else
-                                                       {
-                                                               if(BL_Card[p_card].discQCount != 0)
-                                                                       BL_Card[p_card].discQCount--;
-                                                               BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
-                                                       }
-                                               }
-                                     return;
-                                  }
-
-#endif
             }
          }
       }
 
 
-       if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
-               ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
-          sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
+       if((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
+               ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
+          FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 0;
        else
-          sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
+          FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0;
 
 
-   queueCmdComplete(&BL_Card[p_card], currSCCB, p_card);
+   FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card);
 }
-#ident "$Id: busmstr.c 1.8 1997/01/31 02:10:27 mohan Exp $"
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   busmstr.c  $
- *
- *   Description:  Functions to start, stop, and abort BusMaster operations.
- *
- *   $Date: 1997/01/31 02:10:27 $
- *
- *   $Revision: 1.8 $
- *
- *----------------------------------------------------------------------*/
-
-/*#include <globals.h>*/
-
-#if (FW_TYPE==_UCB_MGR_)
-       /*#include <budi.h>*/
-#endif
-
-/*#include <sccbmgr.h>*/
-/*#include <blx30.h>*/
-/*#include <target.h>*/
-/*#include <scsi2.h>*/
-/*#include <harpoon.h>*/
-
-
-/*
-extern SCCBCARD BL_Card[MAX_CARDS];
-extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
-*/
 
 #define SHORT_WAIT   0x0000000F
 #define LONG_WAIT    0x0000FFFFL
 
-#if defined(BUGBUG)
-void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
-#endif
 
 /*---------------------------------------------------------------------
  *
@@ -8721,11 +5525,7 @@ void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
  *              
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void dataXferProcessor(USHORT port, PSCCBcard pCurrCard)
-#else
-void dataXferProcessor(ULONG port, PSCCBcard pCurrCard)
-#endif
+static void FPT_dataXferProcessor(ULONG port, PSCCBcard pCurrCard)
 {
    PSCCB currSCCB;
 
@@ -8741,7 +5541,7 @@ void dataXferProcessor(ULONG port, PSCCBcard pCurrCard)
                                }
                        pCurrCard->globalFlags |= F_HOST_XFER_ACT;
          
-         busMstrSGDataXferStart(port, currSCCB);
+         FPT_busMstrSGDataXferStart(port, currSCCB);
                        }
 
       else
@@ -8750,7 +5550,7 @@ void dataXferProcessor(ULONG port, PSCCBcard pCurrCard)
                                {
                                pCurrCard->globalFlags |= F_HOST_XFER_ACT;
          
-               busMstrDataXferStart(port, currSCCB);
+               FPT_busMstrDataXferStart(port, currSCCB);
                }
                        }
 }
@@ -8763,20 +5563,12 @@ void dataXferProcessor(ULONG port, PSCCBcard pCurrCard)
  * Description:
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-void busMstrSGDataXferStart(USHORT p_port, PSCCB pcurrSCCB)
-#else
-void busMstrSGDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
-#endif
+static void FPT_busMstrSGDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
 {
    ULONG count,addr,tmpSGCnt;
    UINT sg_index;
    UCHAR sg_count, i;
-#if defined(DOS)
-   USHORT reg_offset;
-#else
    ULONG reg_offset;
-#endif
 
 
    if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
@@ -8802,17 +5594,6 @@ void busMstrSGDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
    while ((sg_count < (UCHAR)SG_BUF_CNT) &&
       ((ULONG)(sg_index * (UINT)SG_ELEMENT_SIZE) < pcurrSCCB->DataLength) ) {
 
-#if defined(COMPILER_16_BIT) && !defined(DOS)
-      tmpSGCnt += *(((ULONG far *)pcurrSCCB->DataPointer)+
-         (sg_index * 2));
-
-      count |= *(((ULONG far *)pcurrSCCB->DataPointer)+
-         (sg_index * 2));
-
-      addr = *(((ULONG far *)pcurrSCCB->DataPointer)+
-         ((sg_index * 2) + 1));
-
-#else
       tmpSGCnt += *(((ULONG *)pcurrSCCB->DataPointer)+
          (sg_index * 2));
 
@@ -8821,7 +5602,6 @@ void busMstrSGDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
 
       addr = *(((ULONG *)pcurrSCCB->DataPointer)+
          ((sg_index * 2) + 1));
-#endif
 
 
       if ((!sg_count) && (pcurrSCCB->Sccb_SGoffset)) {
@@ -8888,11 +5668,7 @@ void busMstrSGDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
  * Description: 
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-void busMstrDataXferStart(USHORT p_port, PSCCB pcurrSCCB)
-#else
-void busMstrDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
-#endif
+static void FPT_busMstrDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
 {
    ULONG addr,count;
 
@@ -8909,37 +5685,7 @@ void busMstrDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
 
       }
 
-#if defined(DOS)
-   asm { mov dx,p_port;
-         mov ax,word ptr count;
-         add dx,hp_xfer_cnt_lo;
-         out dx,al;
-         inc dx;
-         xchg ah,al
-         out dx,al;
-         inc dx;
-         mov ax,word ptr count+2;
-         out dx,al;
-         inc dx;
-         inc dx;
-         mov ax,word ptr addr;
-         out dx,al;
-         inc dx;
-         xchg ah,al
-         out dx,al;
-         inc dx;
-         mov ax,word ptr addr+2;
-         out dx,al;
-         inc dx;
-         xchg ah,al
-         out dx,al;
-         }
-
-   WR_HARP32(p_port,hp_xfercnt_0,count);
-
-#else
    HP_SETUP_ADDR_CNT(p_port,addr,count);
-#endif
 
 
    if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
@@ -8975,11 +5721,7 @@ void busMstrDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
  *               command busy is also time out, it'll just give up.
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-UCHAR busMstrTimeOut(USHORT p_port)
-#else
-UCHAR busMstrTimeOut(ULONG p_port)
-#endif
+static UCHAR FPT_busMstrTimeOut(ULONG p_port)
 {
    ULONG timeout;
 
@@ -9001,11 +5743,11 @@ UCHAR busMstrTimeOut(ULONG p_port)
    RD_HARPOON(p_port+hp_int_status);           /*Clear command complete */
 
    if (RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) {
-      return(TRUE);
+      return(1);
       }
 
    else {
-      return(FALSE);
+      return(0);
       }
 }
 
@@ -9017,18 +5759,14 @@ UCHAR busMstrTimeOut(ULONG p_port)
  * Description: Abort any in progress transfer.
  *
  *---------------------------------------------------------------------*/
-#if defined(DOS)
-void hostDataXferAbort(USHORT port, UCHAR p_card, PSCCB pCurrSCCB)
-#else
-void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
-#endif
+static void FPT_hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
 {
 
    ULONG timeout;
    ULONG remain_cnt;
    UINT sg_ptr;
 
-   BL_Card[p_card].globalFlags &= ~F_HOST_XFER_ACT;
+   FPT_BL_Card[p_card].globalFlags &= ~F_HOST_XFER_ACT;
 
    if (pCurrSCCB->Sccb_XferState & F_AUTO_SENSE) {
 
@@ -9044,7 +5782,7 @@ void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
 
          if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
 
-            if (busMstrTimeOut(port)) {
+            if (FPT_busMstrTimeOut(port)) {
 
                if (pCurrSCCB->HostStatus == 0x00)
 
@@ -9060,10 +5798,6 @@ void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
 
                      {
                      pCurrSCCB->HostStatus = SCCB_BM_ERR;
-#if defined(BUGBUG)
-                     WR_HARPOON(port+hp_dual_addr_lo,
-                        RD_HARPOON(port+hp_ext_status));
-#endif
                      }
             }
          }
@@ -9092,22 +5826,12 @@ void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
 
             sg_ptr--;
 
-#if defined(COMPILER_16_BIT) && !defined(DOS)
-            if (remain_cnt > (ULONG)(*(((ULONG far *)pCurrSCCB->
-               DataPointer) + (sg_ptr * 2)))) {
-
-               remain_cnt -= (ULONG)(*(((ULONG far *)pCurrSCCB->
-                  DataPointer) + (sg_ptr * 2)));
-               }
-
-#else
             if (remain_cnt > (ULONG)(*(((ULONG *)pCurrSCCB->
                DataPointer) + (sg_ptr * 2)))) {
 
                remain_cnt -= (ULONG)(*(((ULONG *)pCurrSCCB->
                   DataPointer) + (sg_ptr * 2)));
                }
-#endif
 
             else {
 
@@ -9147,7 +5871,7 @@ void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
 
          if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
 
-            busMstrTimeOut(port);
+            FPT_busMstrTimeOut(port);
             }
 
          else {
@@ -9159,10 +5883,6 @@ void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
                   if (pCurrSCCB->HostStatus == 0x00) {
 
                      pCurrSCCB->HostStatus = SCCB_BM_ERR;
-#if defined(BUGBUG)
-                     WR_HARPOON(port+hp_dual_addr_lo,
-                        RD_HARPOON(port+hp_ext_status));
-#endif
                      }
                   }
                }
@@ -9203,7 +5923,7 @@ void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
                   pCurrSCCB->HostStatus = SCCB_BM_ERR;
                   }
 
-               busMstrTimeOut(port);
+               FPT_busMstrTimeOut(port);
                }
             }
 
@@ -9214,10 +5934,6 @@ void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
                if (pCurrSCCB->HostStatus == 0x00) {
 
                   pCurrSCCB->HostStatus = SCCB_BM_ERR;
-#if defined(BUGBUG)
-                  WR_HARPOON(port+hp_dual_addr_lo,
-                     RD_HARPOON(port+hp_ext_status));
-#endif
                   }
                }
             }
@@ -9241,7 +5957,7 @@ void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
                pCurrSCCB->HostStatus = SCCB_BM_ERR;
                }
 
-            busMstrTimeOut(port);
+            FPT_busMstrTimeOut(port);
             }
          }
 
@@ -9253,10 +5969,6 @@ void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
             if (pCurrSCCB->HostStatus == 0x00) {
 
                pCurrSCCB->HostStatus = SCCB_BM_ERR;
-#if defined(BUGBUG)
-               WR_HARPOON(port+hp_dual_addr_lo,
-                  RD_HARPOON(port+hp_ext_status));
-#endif
                }
             }
 
@@ -9305,15 +6017,11 @@ void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
  *              pointers message.
  *
  *---------------------------------------------------------------------*/
-void hostDataXferRestart(PSCCB currSCCB)
+static void FPT_hostDataXferRestart(PSCCB currSCCB)
 {
    ULONG data_count;
    UINT  sg_index;
-#if defined(COMPILER_16_BIT) && !defined(DOS)
-   ULONG far *sg_ptr;
-#else
    ULONG *sg_ptr;
-#endif
 
    if (currSCCB->Sccb_XferState & F_SG_XFER) {
 
@@ -9322,11 +6030,7 @@ void hostDataXferRestart(PSCCB currSCCB)
       sg_index = 0xffff;         /*Index by long words into sg list. */
       data_count = 0;            /*Running count of SG xfer counts. */
 
-#if defined(COMPILER_16_BIT) && !defined(DOS)
-      sg_ptr = (ULONG far *)currSCCB->DataPointer;
-#else
       sg_ptr = (ULONG *)currSCCB->DataPointer;
-#endif
 
       while (data_count < currSCCB->Sccb_ATC) {
 
@@ -9351,78 +6055,28 @@ void hostDataXferRestart(PSCCB currSCCB)
       currSCCB->Sccb_XferCnt = currSCCB->DataLength - currSCCB->Sccb_ATC;
       }
 }
-#ident "$Id: scam.c 1.17 1997/03/20 23:49:37 mohan Exp $"
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   scam.c  $
- *
- *   Description:  Functions relating to handling of the SCAM selection
- *                 and the determination of the SCSI IDs to be assigned
- *                 to all perspective SCSI targets.
- *
- *   $Date: 1997/03/20 23:49:37 $
- *
- *   $Revision: 1.17 $
- *
- *----------------------------------------------------------------------*/
-
-/*#include <globals.h>*/
-
-#if (FW_TYPE==_UCB_MGR_)
-       /*#include <budi.h>*/
-#endif
-
-/*#include <sccbmgr.h>*/
-/*#include <blx30.h>*/
-/*#include <target.h>*/
-/*#include <scsi2.h>*/
-/*#include <eeprom.h>*/
-/*#include <harpoon.h>*/
 
 
 
-/*
-extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
-extern SCCBCARD BL_Card[MAX_CARDS];
-extern SCCBSCAM_INFO scamInfo[MAX_SCSI_TAR];
-extern NVRAMINFO nvRamInfo[MAX_MB_CARDS];
-#if defined(DOS) || defined(OS2)
-extern UCHAR temp_id_string[ID_STRING_LENGTH];
-#endif
-extern UCHAR scamHAString[];
-*/
 /*---------------------------------------------------------------------
  *
- * Function: scini
+ * Function: FPT_scini
  *
  * Description: Setup all data structures necessary for SCAM selection.
  *
  *---------------------------------------------------------------------*/
 
-void scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up)
+static void FPT_scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up)
 {
 
-#if defined(SCAM_LEV_2)
    UCHAR loser,assigned_id;
-#endif
-#if defined(DOS)
-
-   USHORT p_port;
-#else
    ULONG p_port;
-#endif
 
    UCHAR i,k,ScamFlg ;
    PSCCBcard currCard;
        PNVRamInfo pCurrNvRam;
 
-   currCard = &BL_Card[p_card];
+   currCard = &FPT_BL_Card[p_card];
    p_port = currCard->ioPort;
        pCurrNvRam = currCard->pNvRamInfo;
 
@@ -9432,72 +6086,68 @@ void scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up)
                i = pCurrNvRam->niSysConf;
        }
        else{
-          ScamFlg = (UCHAR) utilEERead(p_port, SCAM_CONFIG/2);
-          i = (UCHAR)(utilEERead(p_port, (SYSTEM_CONFIG/2)));
+          ScamFlg = (UCHAR) FPT_utilEERead(p_port, SCAM_CONFIG/2);
+          i = (UCHAR)(FPT_utilEERead(p_port, (SYSTEM_CONFIG/2)));
        }
        if(!(i & 0x02)) /* check if reset bus in AutoSCSI parameter set */
                return;
 
-   inisci(p_card,p_port, p_our_id);
+   FPT_inisci(p_card,p_port, p_our_id);
 
    /* Force to wait 1 sec after SCSI bus reset. Some SCAM device FW
       too slow to return to SCAM selection */
 
    /* if (p_power_up)
-         Wait1Second(p_port);
+         FPT_Wait1Second(p_port);
       else
-         Wait(p_port, TO_250ms); */
-
-   Wait1Second(p_port);
+         FPT_Wait(p_port, TO_250ms); */
 
-#if defined(SCAM_LEV_2)
+   FPT_Wait1Second(p_port);
 
    if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
       {
-      while (!(scarb(p_port,INIT_SELTD))) {}
+      while (!(FPT_scarb(p_port,INIT_SELTD))) {}
 
-      scsel(p_port);
+      FPT_scsel(p_port);
 
       do {
-         scxferc(p_port,SYNC_PTRN);
-         scxferc(p_port,DOM_MSTR);
-         loser = scsendi(p_port,&scamInfo[p_our_id].id_string[0]);
+         FPT_scxferc(p_port,SYNC_PTRN);
+         FPT_scxferc(p_port,DOM_MSTR);
+         loser = FPT_scsendi(p_port,&FPT_scamInfo[p_our_id].id_string[0]);
          } while ( loser == 0xFF );
 
-      scbusf(p_port);
+      FPT_scbusf(p_port);
 
       if ((p_power_up) && (!loser))
          {
-         sresb(p_port,p_card);
-         Wait(p_port, TO_250ms);
+         FPT_sresb(p_port,p_card);
+         FPT_Wait(p_port, TO_250ms);
 
-         while (!(scarb(p_port,INIT_SELTD))) {}
+         while (!(FPT_scarb(p_port,INIT_SELTD))) {}
 
-         scsel(p_port);
+         FPT_scsel(p_port);
 
          do {
-            scxferc(p_port, SYNC_PTRN);
-            scxferc(p_port, DOM_MSTR);
-            loser = scsendi(p_port,&scamInfo[p_our_id].
+            FPT_scxferc(p_port, SYNC_PTRN);
+            FPT_scxferc(p_port, DOM_MSTR);
+            loser = FPT_scsendi(p_port,&FPT_scamInfo[p_our_id].
                id_string[0]);
             } while ( loser == 0xFF );
 
-         scbusf(p_port);
+         FPT_scbusf(p_port);
          }
       }
 
    else
       {
-      loser = FALSE;
+      loser = 0;
       }
 
 
    if (!loser)
       {
 
-#endif  /* SCAM_LEV_2 */
-
-      scamInfo[p_our_id].state = ID_ASSIGNED;
+      FPT_scamInfo[p_our_id].state = ID_ASSIGNED;
 
 
                if (ScamFlg & SCAM_ENABLED)
@@ -9505,18 +6155,18 @@ void scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up)
 
              for (i=0; i < MAX_SCSI_TAR; i++)
                   {
-          if ((scamInfo[i].state == ID_UNASSIGNED) ||
-                  (scamInfo[i].state == ID_UNUSED))
+          if ((FPT_scamInfo[i].state == ID_UNASSIGNED) ||
+                  (FPT_scamInfo[i].state == ID_UNUSED))
                      {
-                  if (scsell(p_port,i))
+                  if (FPT_scsell(p_port,i))
                   {
-                  scamInfo[i].state = LEGACY;
-                       if ((scamInfo[i].id_string[0] != 0xFF) ||
-                       (scamInfo[i].id_string[1] != 0xFA))
+                  FPT_scamInfo[i].state = LEGACY;
+                       if ((FPT_scamInfo[i].id_string[0] != 0xFF) ||
+                       (FPT_scamInfo[i].id_string[1] != 0xFA))
                         {
 
-                             scamInfo[i].id_string[0] = 0xFF;
-                          scamInfo[i].id_string[1] = 0xFA;
+                             FPT_scamInfo[i].id_string[0] = 0xFF;
+                          FPT_scamInfo[i].id_string[1] = 0xFA;
                                                        if(pCurrNvRam == NULL)
                                 currCard->globalFlags |= F_UPDATE_EEPROM;
                        }
@@ -9524,45 +6174,43 @@ void scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up)
                   }
        }
 
-             sresb(p_port,p_card);
-       Wait1Second(p_port);
-         while (!(scarb(p_port,INIT_SELTD))) {}
-         scsel(p_port);
-         scasid(p_card, p_port);
+             FPT_sresb(p_port,p_card);
+       FPT_Wait1Second(p_port);
+         while (!(FPT_scarb(p_port,INIT_SELTD))) {}
+         FPT_scsel(p_port);
+         FPT_scasid(p_card, p_port);
          }
 
-#if defined(SCAM_LEV_2)
-
       }
 
    else if ((loser) && (ScamFlg & SCAM_ENABLED))
       {
-      scamInfo[p_our_id].id_string[0] = SLV_TYPE_CODE0;
-      assigned_id = FALSE;
-      scwtsel(p_port);
+      FPT_scamInfo[p_our_id].id_string[0] = SLV_TYPE_CODE0;
+      assigned_id = 0;
+      FPT_scwtsel(p_port);
 
       do {
-         while (scxferc(p_port,0x00) != SYNC_PTRN) {}
+         while (FPT_scxferc(p_port,0x00) != SYNC_PTRN) {}
 
-         i = scxferc(p_port,0x00);
+         i = FPT_scxferc(p_port,0x00);
          if (i == ASSIGN_ID)
             {
-            if (!(scsendi(p_port,&scamInfo[p_our_id].id_string[0])))
+            if (!(FPT_scsendi(p_port,&FPT_scamInfo[p_our_id].id_string[0])))
                   {
-                  i = scxferc(p_port,0x00);
-                  if (scvalq(i))
+                  i = FPT_scxferc(p_port,0x00);
+                  if (FPT_scvalq(i))
                      {
-                     k = scxferc(p_port,0x00);
+                     k = FPT_scxferc(p_port,0x00);
 
-                     if (scvalq(k))
+                     if (FPT_scvalq(k))
                         {
                         currCard->ourId =
                            ((UCHAR)(i<<3)+(k & (UCHAR)7)) & (UCHAR) 0x3F;
-                        inisci(p_card, p_port, p_our_id);
-                        scamInfo[currCard->ourId].state = ID_ASSIGNED;
-                        scamInfo[currCard->ourId].id_string[0]
+                        FPT_inisci(p_card, p_port, p_our_id);
+                        FPT_scamInfo[currCard->ourId].state = ID_ASSIGNED;
+                        FPT_scamInfo[currCard->ourId].id_string[0]
                            = SLV_TYPE_CODE0;
-                        assigned_id = TRUE;
+                        assigned_id = 1;
                         }
                      }
                   }
@@ -9570,43 +6218,31 @@ void scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up)
 
          else if (i == SET_P_FLAG)
             {
-               if (!(scsendi(p_port,
-                        &scamInfo[p_our_id].id_string[0])))
-                        scamInfo[p_our_id].id_string[0] |= 0x80;
+               if (!(FPT_scsendi(p_port,
+                        &FPT_scamInfo[p_our_id].id_string[0])))
+                        FPT_scamInfo[p_our_id].id_string[0] |= 0x80;
             }
          }while (!assigned_id);
 
-      while (scxferc(p_port,0x00) != CFG_CMPLT) {}
+      while (FPT_scxferc(p_port,0x00) != CFG_CMPLT) {}
       }
 
-#endif   /* SCAM_LEV_2 */
    if (ScamFlg & SCAM_ENABLED)
       {
-      scbusf(p_port);
+      FPT_scbusf(p_port);
       if (currCard->globalFlags & F_UPDATE_EEPROM)
          {
-         scsavdi(p_card, p_port);
+         FPT_scsavdi(p_card, p_port);
          currCard->globalFlags &= ~F_UPDATE_EEPROM;
          }
       }
 
 
-#if defined(DOS)
-   for (i=0; i < MAX_SCSI_TAR; i++)
-   {
-       if (((ScamFlg & SCAM_ENABLED) && (scamInfo[i].state == LEGACY))
-                       || (i != p_our_id))
-               {
-         scsellDOS(p_port,i);
-             }
-       }
-#endif
-
 /*
    for (i=0,k=0; i < MAX_SCSI_TAR; i++)
       {
-      if ((scamInfo[i].state == ID_ASSIGNED) ||
-         (scamInfo[i].state == LEGACY))
+      if ((FPT_scamInfo[i].state == ID_ASSIGNED) ||
+         (FPT_scamInfo[i].state == LEGACY))
          k++;
       }
 
@@ -9620,17 +6256,13 @@ void scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up)
 
 /*---------------------------------------------------------------------
  *
- * Function: scarb
+ * Function: FPT_scarb
  *
  * Description: Gain control of the bus and wait SCAM select time (250ms)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-int scarb(USHORT p_port, UCHAR p_sel_type)
-#else
-int scarb(ULONG p_port, UCHAR p_sel_type)
-#endif
+static int FPT_scarb(ULONG p_port, UCHAR p_sel_type)
 {
    if (p_sel_type == INIT_SELTD)
       {
@@ -9639,10 +6271,10 @@ int scarb(ULONG p_port, UCHAR p_sel_type)
 
 
       if (RD_HARPOON(p_port+hp_scsisig) & SCSI_SEL)
-         return(FALSE);
+         return(0);
 
       if (RD_HARPOON(p_port+hp_scsidata_0) != 00)
-         return(FALSE);
+         return(0);
 
       WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_BSY));
 
@@ -9650,7 +6282,7 @@ int scarb(ULONG p_port, UCHAR p_sel_type)
 
          WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) &
             ~SCSI_BSY));
-         return(FALSE);
+         return(0);
          }
 
 
@@ -9660,7 +6292,7 @@ int scarb(ULONG p_port, UCHAR p_sel_type)
 
          WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) &
             ~(SCSI_BSY | SCSI_SEL)));
-         return(FALSE);
+         return(0);
          }
       }
 
@@ -9669,9 +6301,7 @@ int scarb(ULONG p_port, UCHAR p_sel_type)
       & ~ACTdeassert));
    WR_HARPOON(p_port+hp_scsireset, SCAM_EN);
    WR_HARPOON(p_port+hp_scsidata_0, 0x00);
-#if defined(WIDE_SCSI)
    WR_HARPOON(p_port+hp_scsidata_1, 0x00);
-#endif
    WR_HARPOON(p_port+hp_portctrl_0, SCSI_BUS_EN);
 
    WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_MSG));
@@ -9679,25 +6309,21 @@ int scarb(ULONG p_port, UCHAR p_sel_type)
    WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig)
       & ~SCSI_BSY));
 
-   Wait(p_port,TO_250ms);
+   FPT_Wait(p_port,TO_250ms);
 
-   return(TRUE);
+   return(1);
 }
 
 
 /*---------------------------------------------------------------------
  *
- * Function: scbusf
+ * Function: FPT_scbusf
  *
  * Description: Release the SCSI bus and disable SCAM selection.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void scbusf(USHORT p_port)
-#else
-void scbusf(ULONG p_port)
-#endif
+static void FPT_scbusf(ULONG p_port)
 {
    WR_HARPOON(p_port+hp_page_ctrl,
       (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
@@ -9717,11 +6343,7 @@ void scbusf(ULONG p_port)
    WR_HARPOON(p_port+hp_clkctrl_0, (RD_HARPOON(p_port+hp_clkctrl_0)
       | ACTdeassert));
 
-#if defined(SCAM_LEV_2)
    WRW_HARPOON((p_port+hp_intstat), (BUS_FREE | AUTO_INT | SCAM_SEL));
-#else
-   WRW_HARPOON((p_port+hp_intstat), (BUS_FREE | AUTO_INT));
-#endif
 
    WR_HARPOON(p_port+hp_page_ctrl,
       (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
@@ -9731,35 +6353,24 @@ void scbusf(ULONG p_port)
 
 /*---------------------------------------------------------------------
  *
- * Function: scasid
+ * Function: FPT_scasid
  *
  * Description: Assign an ID to all the SCAM devices.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void scasid(UCHAR p_card, USHORT p_port)
-#else
-void scasid(UCHAR p_card, ULONG p_port)
-#endif
+static void FPT_scasid(UCHAR p_card, ULONG p_port)
 {
-#if defined(DOS) || defined(OS2)
-   /* Use external defined in global space area, instead of Stack
-      space. WIN/95 DOS doesnot work TINY mode. The OS doesnot intialize
-      SS equal to DS. Thus the array allocated on stack doesnot get
-      access correctly */
-#else
    UCHAR temp_id_string[ID_STRING_LENGTH];
-#endif
 
    UCHAR i,k,scam_id;
        UCHAR crcBytes[3];
        PNVRamInfo pCurrNvRam;
        ushort_ptr pCrcBytes;
 
-       pCurrNvRam = BL_Card[p_card].pNvRamInfo;
+       pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
 
-   i=FALSE;
+   i=0;
 
    while (!i)
       {
@@ -9769,36 +6380,36 @@ void scasid(UCHAR p_card, ULONG p_port)
          temp_id_string[k] = (UCHAR) 0x00;
          }
 
-      scxferc(p_port,SYNC_PTRN);
-      scxferc(p_port,ASSIGN_ID);
+      FPT_scxferc(p_port,SYNC_PTRN);
+      FPT_scxferc(p_port,ASSIGN_ID);
 
-      if (!(sciso(p_port,&temp_id_string[0])))
+      if (!(FPT_sciso(p_port,&temp_id_string[0])))
          {
                        if(pCurrNvRam){
                                pCrcBytes = (ushort_ptr)&crcBytes[0];
-                               *pCrcBytes = CalcCrc16(&temp_id_string[0]);
-                               crcBytes[2] = CalcLrc(&temp_id_string[0]);
+                               *pCrcBytes = FPT_CalcCrc16(&temp_id_string[0]);
+                               crcBytes[2] = FPT_CalcLrc(&temp_id_string[0]);
                                temp_id_string[1] = crcBytes[2];
                                temp_id_string[2] = crcBytes[0];
                                temp_id_string[3] = crcBytes[1];
                                for(k = 4; k < ID_STRING_LENGTH; k++)
                                        temp_id_string[k] = (UCHAR) 0x00;
                        }
-         i = scmachid(p_card,temp_id_string);
+         i = FPT_scmachid(p_card,temp_id_string);
 
          if (i == CLR_PRIORITY)
             {
-            scxferc(p_port,MISC_CODE);
-            scxferc(p_port,CLR_P_FLAG);
-            i = FALSE;  /*Not the last ID yet. */
+            FPT_scxferc(p_port,MISC_CODE);
+            FPT_scxferc(p_port,CLR_P_FLAG);
+            i = 0;  /*Not the last ID yet. */
             }
 
          else if (i != NO_ID_AVAIL)
             {
             if (i < 8 )
-               scxferc(p_port,ID_0_7);
+               FPT_scxferc(p_port,ID_0_7);
             else
-               scxferc(p_port,ID_8_F);
+               FPT_scxferc(p_port,ID_8_F);
 
             scam_id = (i & (UCHAR) 0x07);
 
@@ -9807,21 +6418,21 @@ void scasid(UCHAR p_card, ULONG p_port)
                if (!( k & i ))
                   scam_id += 0x08;        /*Count number of zeros in DB0-3. */
 
-            scxferc(p_port,scam_id);
+            FPT_scxferc(p_port,scam_id);
 
-            i = FALSE;  /*Not the last ID yet. */
+            i = 0;  /*Not the last ID yet. */
             }
          }
 
       else
          {
-         i = TRUE;
+         i = 1;
          }
 
       }  /*End while */
 
-   scxferc(p_port,SYNC_PTRN);
-   scxferc(p_port,CFG_CMPLT);
+   FPT_scxferc(p_port,SYNC_PTRN);
+   FPT_scxferc(p_port,CFG_CMPLT);
 }
 
 
@@ -9830,21 +6441,17 @@ void scasid(UCHAR p_card, ULONG p_port)
 
 /*---------------------------------------------------------------------
  *
- * Function: scsel
+ * Function: FPT_scsel
  *
  * Description: Select all the SCAM devices.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void scsel(USHORT p_port)
-#else
-void scsel(ULONG p_port)
-#endif
+static void FPT_scsel(ULONG p_port)
 {
 
    WR_HARPOON(p_port+hp_scsisig, SCSI_SEL);
-   scwiros(p_port, SCSI_MSG);
+   FPT_scwiros(p_port, SCSI_MSG);
 
    WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY));
 
@@ -9855,11 +6462,11 @@ void scsel(ULONG p_port)
 
 
    WR_HARPOON(p_port+hp_scsisig, (SCSI_BSY | SCSI_IOBIT | SCSI_CD));
-   scwiros(p_port, SCSI_SEL);
+   FPT_scwiros(p_port, SCSI_SEL);
 
    WR_HARPOON(p_port+hp_scsidata_0, (UCHAR)(RD_HARPOON(p_port+hp_scsidata_0) &
       ~(UCHAR)BIT(6)));
-   scwirod(p_port, BIT(6));
+   FPT_scwirod(p_port, BIT(6));
 
    WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
 }
@@ -9868,17 +6475,13 @@ void scsel(ULONG p_port)
 
 /*---------------------------------------------------------------------
  *
- * Function: scxferc
+ * Function: FPT_scxferc
  *
  * Description: Handshake the p_data (DB4-0) across the bus.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-UCHAR scxferc(USHORT p_port, UCHAR p_data)
-#else
-UCHAR scxferc(ULONG p_port, UCHAR p_data)
-#endif
+static UCHAR FPT_scxferc(ULONG p_port, UCHAR p_data)
 {
    UCHAR curr_data, ret_data;
 
@@ -9890,7 +6493,7 @@ UCHAR scxferc(ULONG p_port, UCHAR p_data)
 
    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
 
-   scwirod(p_port,BIT(7));              /*Wait for DB7 to be released. */
+   FPT_scwirod(p_port,BIT(7));              /*Wait for DB7 to be released. */
        while (!(RD_HARPOON(p_port+hp_scsidata_0) & BIT(5)));
 
    ret_data = (RD_HARPOON(p_port+hp_scsidata_0) & (UCHAR) 0x1F);
@@ -9903,7 +6506,7 @@ UCHAR scxferc(ULONG p_port, UCHAR p_data)
 
    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
 
-   scwirod(p_port,BIT(5));              /*Wait for DB5 to be released. */
+   FPT_scwirod(p_port,BIT(5));              /*Wait for DB5 to be released. */
 
    curr_data &= ~(BIT(4)|BIT(3)|BIT(2)|BIT(1)|BIT(0)); /*Release data bits */
    curr_data |= BIT(7);
@@ -9914,7 +6517,7 @@ UCHAR scxferc(ULONG p_port, UCHAR p_data)
 
    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
 
-   scwirod(p_port,BIT(6));              /*Wait for DB6 to be released. */
+   FPT_scwirod(p_port,BIT(6));              /*Wait for DB6 to be released. */
 
    return(ret_data);
 }
@@ -9922,39 +6525,35 @@ UCHAR scxferc(ULONG p_port, UCHAR p_data)
 
 /*---------------------------------------------------------------------
  *
- * Function: scsendi
+ * Function: FPT_scsendi
  *
  * Description: Transfer our Identification string to determine if we
  *              will be the dominant master.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-UCHAR scsendi(USHORT p_port, UCHAR p_id_string[])
-#else
-UCHAR scsendi(ULONG p_port, UCHAR p_id_string[])
-#endif
+static UCHAR FPT_scsendi(ULONG p_port, UCHAR p_id_string[])
 {
    UCHAR ret_data,byte_cnt,bit_cnt,defer;
 
-   defer = FALSE;
+   defer = 0;
 
    for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
 
       for (bit_cnt = 0x80; bit_cnt != 0 ; bit_cnt >>= 1) {
 
          if (defer)
-            ret_data = scxferc(p_port,00);
+            ret_data = FPT_scxferc(p_port,00);
 
          else if (p_id_string[byte_cnt] & bit_cnt)
 
-               ret_data = scxferc(p_port,02);
+               ret_data = FPT_scxferc(p_port,02);
 
             else {
 
-               ret_data = scxferc(p_port,01);
+               ret_data = FPT_scxferc(p_port,01);
                if (ret_data & 02)
-                  defer = TRUE;
+                  defer = 1;
                }
 
          if ((ret_data & 0x1C) == 0x10)
@@ -9980,17 +6579,13 @@ UCHAR scsendi(ULONG p_port, UCHAR p_id_string[])
 
 /*---------------------------------------------------------------------
  *
- * Function: sciso
+ * Function: FPT_sciso
  *
  * Description: Transfer the Identification string.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-UCHAR sciso(USHORT p_port, UCHAR p_id_string[])
-#else
-UCHAR sciso(ULONG p_port, UCHAR p_id_string[])
-#endif
+static UCHAR FPT_sciso(ULONG p_port, UCHAR p_id_string[])
 {
    UCHAR ret_data,the_data,byte_cnt,bit_cnt;
 
@@ -10000,7 +6595,7 @@ UCHAR sciso(ULONG p_port, UCHAR p_id_string[])
 
       for (bit_cnt = 0; bit_cnt < 8; bit_cnt++) {
 
-         ret_data = scxferc(p_port,0);
+         ret_data = FPT_scxferc(p_port,0);
 
          if (ret_data & 0xFC)
             return(0xFF);
@@ -10020,8 +6615,8 @@ UCHAR sciso(ULONG p_port, UCHAR p_id_string[])
                                {
                                        byte_cnt = 0;
                                        bit_cnt = 0;
-                                       scxferc(p_port, SYNC_PTRN);
-                                       scxferc(p_port, ASSIGN_ID);
+                                       FPT_scxferc(p_port, SYNC_PTRN);
+                                       FPT_scxferc(p_port, ASSIGN_ID);
                                        continue;
                                }
 */
@@ -10044,18 +6639,14 @@ UCHAR sciso(ULONG p_port, UCHAR p_id_string[])
 
 /*---------------------------------------------------------------------
  *
- * Function: scwirod
+ * Function: FPT_scwirod
  *
  * Description: Sample the SCSI data bus making sure the signal has been
  *              deasserted for the correct number of consecutive samples.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void scwirod(USHORT p_port, UCHAR p_data_bit)
-#else
-void scwirod(ULONG p_port, UCHAR p_data_bit)
-#endif
+static void FPT_scwirod(ULONG p_port, UCHAR p_data_bit)
 {
    UCHAR i;
 
@@ -10077,166 +6668,70 @@ void scwirod(ULONG p_port, UCHAR p_data_bit)
 
 /*---------------------------------------------------------------------
  *
- * Function: scwiros
+ * Function: FPT_scwiros
  *
  * Description: Sample the SCSI Signal lines making sure the signal has been
  *              deasserted for the correct number of consecutive samples.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void scwiros(USHORT p_port, UCHAR p_data_bit)
-#else
-void scwiros(ULONG p_port, UCHAR p_data_bit)
-#endif
+static void FPT_scwiros(ULONG p_port, UCHAR p_data_bit)
 {
    UCHAR i;
 
-   i = 0;
-   while ( i < MAX_SCSI_TAR ) {
-
-      if (RD_HARPOON(p_port+hp_scsisig) & p_data_bit)
-
-         i = 0;
-
-      else
-
-         i++;
-
-      }
-}
-
-
-/*---------------------------------------------------------------------
- *
- * Function: scvalq
- *
- * Description: Make sure we received a valid data byte.
- *
- *---------------------------------------------------------------------*/
-
-UCHAR scvalq(UCHAR p_quintet)
-{
-   UCHAR count;
-
-   for (count=1; count < 0x08; count<<=1) {
-      if (!(p_quintet & count))
-         p_quintet -= 0x80;
-      }
-
-   if (p_quintet & 0x18)
-      return(FALSE);
-
-   else
-      return(TRUE);
-}
-
-
-/*---------------------------------------------------------------------
- *
- * Function: scsell
- *
- * Description: Select the specified device ID using a selection timeout
- *              less than 4ms.  If somebody responds then it is a legacy
- *              drive and this ID must be marked as such.
- *
- *---------------------------------------------------------------------*/
-
-#if defined(DOS)
-UCHAR scsell(USHORT p_port, UCHAR targ_id)
-#else
-UCHAR scsell(ULONG p_port, UCHAR targ_id)
-#endif
-{
-#if defined(DOS)
-   USHORT i;
-#else
-   ULONG i;
-#endif
-
-   WR_HARPOON(p_port+hp_page_ctrl,
-      (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
-
-   ARAM_ACCESS(p_port);
-
-   WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) | SCAM_TIMER));
-   WR_HARPOON(p_port+hp_seltimeout,TO_4ms);
-
-
-   for (i = p_port+CMD_STRT; i < p_port+CMD_STRT+12; i+=2) {
-      WRW_HARPOON(i, (MPM_OP+ACOMMAND));
-      }
-   WRW_HARPOON(i, (BRH_OP+ALWAYS+    NP));
-
-   WRW_HARPOON((p_port+hp_intstat),
-              (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
-
-   WR_HARPOON(p_port+hp_select_id, targ_id);
-
-   WR_HARPOON(p_port+hp_portctrl_0, SCSI_PORT);
-   WR_HARPOON(p_port+hp_autostart_3, (SELECT | CMD_ONLY_STRT));
-   WR_HARPOON(p_port+hp_scsictrl_0, (SEL_TAR | ENA_RESEL));
-
-
-   while (!(RDW_HARPOON((p_port+hp_intstat)) &
-           (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {}
-
-   if (RDW_HARPOON((p_port+hp_intstat)) & RESET)
-         Wait(p_port, TO_250ms);
-
-   DISABLE_AUTO(p_port);
-
-   WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) & ~SCAM_TIMER));
-   WR_HARPOON(p_port+hp_seltimeout,TO_290ms);
+   i = 0;
+   while ( i < MAX_SCSI_TAR ) {
 
-   SGRAM_ACCESS(p_port);
+      if (RD_HARPOON(p_port+hp_scsisig) & p_data_bit)
 
-   if (RDW_HARPOON((p_port+hp_intstat)) & (RESET | TIMEOUT) ) {
+         i = 0;
 
-      WRW_HARPOON((p_port+hp_intstat),
-                 (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
+      else
 
-      WR_HARPOON(p_port+hp_page_ctrl,
-         (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
+         i++;
 
-      return(FALSE);  /*No legacy device */
       }
+}
 
-   else {
-
-      while(!(RDW_HARPOON((p_port+hp_intstat)) & BUS_FREE)) {
-                               if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ)
-                                       {
-                                       WR_HARPOON(p_port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
-                       ACCEPT_MSG(p_port);
-                                       }
-               }
 
-      WRW_HARPOON((p_port+hp_intstat), CLR_ALL_INT_1);
+/*---------------------------------------------------------------------
+ *
+ * Function: FPT_scvalq
+ *
+ * Description: Make sure we received a valid data byte.
+ *
+ *---------------------------------------------------------------------*/
 
-      WR_HARPOON(p_port+hp_page_ctrl,
-         (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
+static UCHAR FPT_scvalq(UCHAR p_quintet)
+{
+   UCHAR count;
 
-      return(TRUE);  /*Found one of them oldies! */
+   for (count=1; count < 0x08; count<<=1) {
+      if (!(p_quintet & count))
+         p_quintet -= 0x80;
       }
+
+   if (p_quintet & 0x18)
+      return(0);
+
+   else
+      return(1);
 }
 
-#if defined(DOS)
+
 /*---------------------------------------------------------------------
  *
- * Function: scsell for DOS
+ * Function: FPT_scsell
  *
  * Description: Select the specified device ID using a selection timeout
- *              less than 2ms.  This was specially required to solve
- *              the problem with Plextor 12X CD-ROM drive. This drive
- *                                      was responding the Selection at the end of 4ms and 
- *                                      hanging the system.
+ *              less than 4ms.  If somebody responds then it is a legacy
+ *              drive and this ID must be marked as such.
  *
  *---------------------------------------------------------------------*/
 
-UCHAR scsellDOS(USHORT p_port, UCHAR targ_id)
+static UCHAR FPT_scsell(ULONG p_port, UCHAR targ_id)
 {
-   USHORT i;
+   ULONG i;
 
    WR_HARPOON(p_port+hp_page_ctrl,
       (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
@@ -10244,7 +6739,7 @@ UCHAR scsellDOS(USHORT p_port, UCHAR targ_id)
    ARAM_ACCESS(p_port);
 
    WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) | SCAM_TIMER));
-   WR_HARPOON(p_port+hp_seltimeout,TO_2ms);
+   WR_HARPOON(p_port+hp_seltimeout,TO_4ms);
 
 
    for (i = p_port+CMD_STRT; i < p_port+CMD_STRT+12; i+=2) {
@@ -10266,7 +6761,7 @@ UCHAR scsellDOS(USHORT p_port, UCHAR targ_id)
            (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {}
 
    if (RDW_HARPOON((p_port+hp_intstat)) & RESET)
-         Wait(p_port, TO_250ms);
+         FPT_Wait(p_port, TO_250ms);
 
    DISABLE_AUTO(p_port);
 
@@ -10283,7 +6778,7 @@ UCHAR scsellDOS(USHORT p_port, UCHAR targ_id)
       WR_HARPOON(p_port+hp_page_ctrl,
          (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
 
-      return(FALSE);  /*No legacy device */
+      return(0);  /*No legacy device */
       }
 
    else {
@@ -10301,24 +6796,19 @@ UCHAR scsellDOS(USHORT p_port, UCHAR targ_id)
       WR_HARPOON(p_port+hp_page_ctrl,
          (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
 
-      return(TRUE);  /*Found one of them oldies! */
+      return(1);  /*Found one of them oldies! */
       }
 }
-#endif  /* DOS */
 
 /*---------------------------------------------------------------------
  *
- * Function: scwtsel
+ * Function: FPT_scwtsel
  *
  * Description: Wait to be selected by another SCAM initiator.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void scwtsel(USHORT p_port)
-#else
-void scwtsel(ULONG p_port)
-#endif
+static void FPT_scwtsel(ULONG p_port)
 {
    while(!(RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL)) {}
 }
@@ -10326,23 +6816,19 @@ void scwtsel(ULONG p_port)
 
 /*---------------------------------------------------------------------
  *
- * Function: inisci
+ * Function: FPT_inisci
  *
  * Description: Setup the data Structure with the info from the EEPROM.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void inisci(UCHAR p_card, USHORT p_port, UCHAR p_our_id)
-#else
-void inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id)
-#endif
+static void FPT_inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id)
 {
    UCHAR i,k,max_id;
    USHORT ee_data;
        PNVRamInfo pCurrNvRam;
 
-       pCurrNvRam = BL_Card[p_card].pNvRamInfo;
+       pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
 
    if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
       max_id = 0x08;
@@ -10354,14 +6840,14 @@ void inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id)
                for(i = 0; i < max_id; i++){
 
                        for(k = 0; k < 4; k++)
-                               scamInfo[i].id_string[k] = pCurrNvRam->niScamTbl[i][k];
+                               FPT_scamInfo[i].id_string[k] = pCurrNvRam->niScamTbl[i][k];
                        for(k = 4; k < ID_STRING_LENGTH; k++)
-                               scamInfo[i].id_string[k] = (UCHAR) 0x00;
+                               FPT_scamInfo[i].id_string[k] = (UCHAR) 0x00;
 
-             if(scamInfo[i].id_string[0] == 0x00)
-          scamInfo[i].state = ID_UNUSED;  /*Default to unused ID. */
+             if(FPT_scamInfo[i].id_string[0] == 0x00)
+          FPT_scamInfo[i].state = ID_UNUSED;  /*Default to unused ID. */
              else
-             scamInfo[i].state = ID_UNASSIGNED;  /*Default to unassigned ID. */
+             FPT_scamInfo[i].state = ID_UNASSIGNED;  /*Default to unassigned ID. */
 
                }
        }else {
@@ -10369,38 +6855,38 @@ void inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id)
           {
        for (k=0; k < ID_STRING_LENGTH; k+=2)
                 {
-             ee_data = utilEERead(p_port, (USHORT)((EE_SCAMBASE/2) +
+             ee_data = FPT_utilEERead(p_port, (USHORT)((EE_SCAMBASE/2) +
             (USHORT) (i*((USHORT)ID_STRING_LENGTH/2)) + (USHORT)(k/2)));
-               scamInfo[i].id_string[k] = (UCHAR) ee_data;
+               FPT_scamInfo[i].id_string[k] = (UCHAR) ee_data;
                 ee_data >>= 8;
-             scamInfo[i].id_string[k+1] = (UCHAR) ee_data;
+             FPT_scamInfo[i].id_string[k+1] = (UCHAR) ee_data;
           }
 
-             if ((scamInfo[i].id_string[0] == 0x00) ||
-              (scamInfo[i].id_string[0] == 0xFF))
+             if ((FPT_scamInfo[i].id_string[0] == 0x00) ||
+              (FPT_scamInfo[i].id_string[0] == 0xFF))
 
-          scamInfo[i].state = ID_UNUSED;  /*Default to unused ID. */
+          FPT_scamInfo[i].state = ID_UNUSED;  /*Default to unused ID. */
 
              else
-             scamInfo[i].state = ID_UNASSIGNED;  /*Default to unassigned ID. */
+             FPT_scamInfo[i].state = ID_UNASSIGNED;  /*Default to unassigned ID. */
 
        }
        }
        for(k = 0; k < ID_STRING_LENGTH; k++)
-               scamInfo[p_our_id].id_string[k] = scamHAString[k];
+               FPT_scamInfo[p_our_id].id_string[k] = FPT_scamHAString[k];
 
 }
 
 /*---------------------------------------------------------------------
  *
- * Function: scmachid
+ * Function: FPT_scmachid
  *
  * Description: Match the Device ID string with our values stored in
  *              the EEPROM.
  *
  *---------------------------------------------------------------------*/
 
-UCHAR scmachid(UCHAR p_card, UCHAR p_id_string[])
+static UCHAR FPT_scmachid(UCHAR p_card, UCHAR p_id_string[])
 {
 
    UCHAR i,k,match;
@@ -10408,28 +6894,20 @@ UCHAR scmachid(UCHAR p_card, UCHAR p_id_string[])
 
    for (i=0; i < MAX_SCSI_TAR; i++) {
 
-#if !defined(SCAM_LEV_2)
-      if (scamInfo[i].state == ID_UNASSIGNED)
-         {
-#endif
-         match = TRUE;
+         match = 1;
 
          for (k=0; k < ID_STRING_LENGTH; k++)
             {
-            if (p_id_string[k] != scamInfo[i].id_string[k])
-               match = FALSE;
+            if (p_id_string[k] != FPT_scamInfo[i].id_string[k])
+               match = 0;
             }
 
          if (match)
             {
-            scamInfo[i].state = ID_ASSIGNED;
+            FPT_scamInfo[i].state = ID_ASSIGNED;
             return(i);
             }
 
-#if !defined(SCAM_LEV_2)
-         }
-#endif
-
       }
 
 
@@ -10448,17 +6926,17 @@ UCHAR scmachid(UCHAR p_card, UCHAR p_id_string[])
       {
       i--;
 
-      if (scamInfo[match].state == ID_UNUSED)
+      if (FPT_scamInfo[match].state == ID_UNUSED)
          {
          for (k=0; k < ID_STRING_LENGTH; k++)
             {
-            scamInfo[match].id_string[k] = p_id_string[k];
+            FPT_scamInfo[match].id_string[k] = p_id_string[k];
             }
 
-         scamInfo[match].state = ID_ASSIGNED;
+         FPT_scamInfo[match].state = ID_ASSIGNED;
 
-                       if(BL_Card[p_card].pNvRamInfo == NULL)
-                BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM;
+                       if(FPT_BL_Card[p_card].pNvRamInfo == NULL)
+                FPT_BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM;
          return(match);
 
          }
@@ -10498,17 +6976,17 @@ UCHAR scmachid(UCHAR p_card, UCHAR p_id_string[])
 
       i--;
 
-      if (scamInfo[match].state == ID_UNASSIGNED)
+      if (FPT_scamInfo[match].state == ID_UNASSIGNED)
          {
          for (k=0; k < ID_STRING_LENGTH; k++)
             {
-            scamInfo[match].id_string[k] = p_id_string[k];
+            FPT_scamInfo[match].id_string[k] = p_id_string[k];
             }
 
-         scamInfo[match].id_string[0] |= BIT(7);
-         scamInfo[match].state = ID_ASSIGNED;
-                       if(BL_Card[p_card].pNvRamInfo == NULL)
-                BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM;
+         FPT_scamInfo[match].id_string[0] |= BIT(7);
+         FPT_scamInfo[match].state = ID_ASSIGNED;
+                       if(FPT_BL_Card[p_card].pNvRamInfo == NULL)
+                FPT_BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM;
          return(match);
 
          }
@@ -10531,17 +7009,13 @@ UCHAR scmachid(UCHAR p_card, UCHAR p_id_string[])
 
 /*---------------------------------------------------------------------
  *
- * Function: scsavdi
+ * Function: FPT_scsavdi
  *
  * Description: Save off the device SCAM ID strings.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void scsavdi(UCHAR p_card, USHORT p_port)
-#else
-void scsavdi(UCHAR p_card, ULONG p_port)
-#endif
+static void FPT_scsavdi(UCHAR p_card, ULONG p_port)
 {
    UCHAR i,k,max_id;
    USHORT ee_data,sum_data;
@@ -10551,11 +7025,11 @@ void scsavdi(UCHAR p_card, ULONG p_port)
 
    for (i = 1; i < EE_SCAMBASE/2; i++)
       {
-      sum_data += utilEERead(p_port, i);
+      sum_data += FPT_utilEERead(p_port, i);
       }
 
 
-   utilEEWriteOnOff(p_port,1);   /* Enable write access to the EEPROM */
+   FPT_utilEEWriteOnOff(p_port,1);   /* Enable write access to the EEPROM */
 
    if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
       max_id = 0x08;
@@ -10568,64 +7042,29 @@ void scsavdi(UCHAR p_card, ULONG p_port)
 
       for (k=0; k < ID_STRING_LENGTH; k+=2)
          {
-         ee_data = scamInfo[i].id_string[k+1];
+         ee_data = FPT_scamInfo[i].id_string[k+1];
          ee_data <<= 8;
-         ee_data |= scamInfo[i].id_string[k];
+         ee_data |= FPT_scamInfo[i].id_string[k];
          sum_data += ee_data;
-         utilEEWrite(p_port, ee_data, (USHORT)((EE_SCAMBASE/2) +
+         FPT_utilEEWrite(p_port, ee_data, (USHORT)((EE_SCAMBASE/2) +
             (USHORT)(i*((USHORT)ID_STRING_LENGTH/2)) + (USHORT)(k/2)));
          }
       }
 
 
-   utilEEWrite(p_port, sum_data, EEPROM_CHECK_SUM/2);
-   utilEEWriteOnOff(p_port,0);   /* Turn off write access */
+   FPT_utilEEWrite(p_port, sum_data, EEPROM_CHECK_SUM/2);
+   FPT_utilEEWriteOnOff(p_port,0);   /* Turn off write access */
 }
-#ident "$Id: diagnose.c 1.10 1997/06/10 16:51:47 mohan Exp $"
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   diagnose.c  $
- *
- *   Description:  Diagnostic funtions for testing the integrity of
- *                 the HARPOON.
- *
- *   $Date: 1997/06/10 16:51:47 $
- *
- *   $Revision: 1.10 $
- *
- *----------------------------------------------------------------------*/
-
-/*#include <globals.h>*/
-
-#if (FW_TYPE==_UCB_MGR_)
-       /*#include <budi.h>*/
-#endif
-
-/*#include <sccbmgr.h>*/
-/*#include <blx30.h>*/
-/*#include <target.h>*/
-/*#include <eeprom.h>*/
-/*#include <harpoon.h>*/
 
 /*---------------------------------------------------------------------
  *
- * Function: XbowInit
+ * Function: FPT_XbowInit
  *
  * Description: Setup the Xbow for normal operation.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void XbowInit(USHORT port, UCHAR ScamFlg)
-#else
-void XbowInit(ULONG port, UCHAR ScamFlg)
-#endif
+static void FPT_XbowInit(ULONG port, UCHAR ScamFlg)
 {
 UCHAR i;
 
@@ -10647,18 +7086,13 @@ UCHAR i;
 
    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
 
-#if defined(SCAM_LEV_2)
-   default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
+   FPT_default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
                    BUS_FREE | XFER_CNT_0 | AUTO_INT;
 
    if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
-               default_intena |= SCAM_SEL;
+               FPT_default_intena |= SCAM_SEL;
 
-#else
-   default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
-                   BUS_FREE | XFER_CNT_0 | AUTO_INT;
-#endif
-   WRW_HARPOON((port+hp_intena), default_intena);
+   WRW_HARPOON((port+hp_intena), FPT_default_intena);
 
    WR_HARPOON(port+hp_seltimeout,TO_290ms);
 
@@ -10667,26 +7101,6 @@ UCHAR i;
    if (RD_HARPOON(port+hp_page_ctrl) & NARROW_SCSI_CARD)
       WR_HARPOON(port+hp_addstat,SCSI_MODE8);
 
-#if defined(NO_BIOS_OPTION)
-
-   WR_HARPOON(port+hp_synctarg_0,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_1,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_2,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_3,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_4,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_5,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_6,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_7,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_8,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_9,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_10,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_11,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_12,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_13,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_14,NARROW_SCSI);
-   WR_HARPOON(port+hp_synctarg_15,NARROW_SCSI);
-
-#endif
        WR_HARPOON(port+hp_page_ctrl, i);
 
 }
@@ -10694,17 +7108,13 @@ UCHAR i;
 
 /*---------------------------------------------------------------------
  *
- * Function: BusMasterInit
+ * Function: FPT_BusMasterInit
  *
  * Description: Initialize the BusMaster for normal operations.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void BusMasterInit(USHORT p_port)
-#else
-void BusMasterInit(ULONG p_port)
-#endif
+static void FPT_BusMasterInit(ULONG p_port)
 {
 
 
@@ -10719,13 +7129,6 @@ void BusMasterInit(ULONG p_port)
    WR_HARPOON(p_port+hp_ee_ctrl, (SCSI_TERM_ENA_H));
 
 
-#if defined(NT)
-
-   WR_HARPOON(p_port+hp_pci_cmd_cfg, (RD_HARPOON(p_port+hp_pci_cmd_cfg)
-      & ~MEM_SPACE_ENA));
-
-#endif
-
    RD_HARPOON(p_port+hp_int_status);        /*Clear interrupts. */
    WR_HARPOON(p_port+hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
    WR_HARPOON(p_port+hp_page_ctrl, (RD_HARPOON(p_port+hp_page_ctrl) &
@@ -10735,147 +7138,14 @@ void BusMasterInit(ULONG p_port)
 
 /*---------------------------------------------------------------------
  *
- * Function: DiagXbow
- *
- * Description: Test Xbow integrity.  Non-zero return indicates an error.
- *
- *---------------------------------------------------------------------*/
-
-#if defined(DOS)
-int DiagXbow(USHORT port)
-#else
-int DiagXbow(ULONG port)
-#endif
-{
-   unsigned char fifo_cnt,loop_cnt;
-
-   unsigned char fifodata[5];
-   fifodata[0] = 0x00;
-   fifodata[1] = 0xFF;
-   fifodata[2] = 0x55;
-   fifodata[3] = 0xAA;
-   fifodata[4] = 0x00;
-
-
-   WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
-   WRW_HARPOON((port+hp_intena), 0x0000);
-
-   WR_HARPOON(port+hp_seltimeout,TO_5ms);
-
-   WR_HARPOON(port+hp_portctrl_0,START_TO);
-
-
-   for(fifodata[4] = 0x01; fifodata[4] != (UCHAR) 0; fifodata[4] = fifodata[4] << 1) {
-
-      WR_HARPOON(port+hp_selfid_0,fifodata[4]);
-      WR_HARPOON(port+hp_selfid_1,fifodata[4]);
-
-      if ((RD_HARPOON(port+hp_selfid_0) != fifodata[4]) ||
-          (RD_HARPOON(port+hp_selfid_1) != fifodata[4]))
-         return(1);
-      }
-
-
-   for(loop_cnt = 0; loop_cnt < 4; loop_cnt++) {
-
-      WR_HARPOON(port+hp_portctrl_0,(HOST_PORT | HOST_WRT | START_TO));
-
-
-      for (fifo_cnt = 0; fifo_cnt < FIFO_LEN; fifo_cnt++) {
-
-         WR_HARPOON(port+hp_fifodata_0, fifodata[loop_cnt]);
-         }
-
-
-      if (!(RD_HARPOON(port+hp_xferstat) & FIFO_FULL))
-         return(1);
-
-
-      WR_HARPOON(port+hp_portctrl_0,(HOST_PORT | START_TO));
-
-      for (fifo_cnt = 0; fifo_cnt < FIFO_LEN; fifo_cnt++) {
-
-         if (RD_HARPOON(port+hp_fifodata_0) != fifodata[loop_cnt])
-            return(1);
-         }
-
-
-      if (!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY))
-         return(1);
-      }
-
-
-   while(!(RDW_HARPOON((port+hp_intstat)) & TIMEOUT)) {}
-
-
-   WR_HARPOON(port+hp_seltimeout,TO_290ms);
-
-   WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
-
-   WRW_HARPOON((port+hp_intena), default_intena);
-
-   return(0);
-}
-
-
-/*---------------------------------------------------------------------
- *
- * Function: DiagBusMaster
- *
- * Description: Test BusMaster integrity.  Non-zero return indicates an
- *              error.
- *
- *---------------------------------------------------------------------*/
-
-#if defined(DOS)
-int DiagBusMaster(USHORT port)
-#else
-int DiagBusMaster(ULONG port)
-#endif
-{
-   UCHAR testdata;
-
-   for(testdata = (UCHAR) 1; testdata != (UCHAR)0; testdata = testdata << 1) {
-
-      WR_HARPOON(port+hp_xfer_cnt_lo,testdata);
-      WR_HARPOON(port+hp_xfer_cnt_mi,testdata);
-      WR_HARPOON(port+hp_xfer_cnt_hi,testdata);
-      WR_HARPOON(port+hp_host_addr_lo,testdata);
-      WR_HARPOON(port+hp_host_addr_lmi,testdata);
-      WR_HARPOON(port+hp_host_addr_hmi,testdata);
-      WR_HARPOON(port+hp_host_addr_hi,testdata);
-
-      if ((RD_HARPOON(port+hp_xfer_cnt_lo) != testdata)   ||
-          (RD_HARPOON(port+hp_xfer_cnt_mi) != testdata)   ||
-          (RD_HARPOON(port+hp_xfer_cnt_hi) != testdata)   ||
-          (RD_HARPOON(port+hp_host_addr_lo) != testdata)  ||
-          (RD_HARPOON(port+hp_host_addr_lmi) != testdata) ||
-          (RD_HARPOON(port+hp_host_addr_hmi) != testdata) ||
-          (RD_HARPOON(port+hp_host_addr_hi) != testdata))
-
-         return(1);
-      }
-   RD_HARPOON(port+hp_int_status);        /*Clear interrupts. */
-   return(0);
-}
-
-
-
-/*---------------------------------------------------------------------
- *
- * Function: DiagEEPROM
+ * Function: FPT_DiagEEPROM
  *
  * Description: Verfiy checksum and 'Key' and initialize the EEPROM if
  *              necessary.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void DiagEEPROM(USHORT p_port)
-#else
-void DiagEEPROM(ULONG p_port)
-#endif
-
+static void FPT_DiagEEPROM(ULONG p_port)
 {
    USHORT index,temp,max_wd_cnt;
 
@@ -10884,185 +7154,148 @@ void DiagEEPROM(ULONG p_port)
    else
       max_wd_cnt = EEPROM_WD_CNT * 2;
 
-   temp = utilEERead(p_port, FW_SIGNATURE/2);
+   temp = FPT_utilEERead(p_port, FW_SIGNATURE/2);
 
    if (temp == 0x4641) {
 
       for (index = 2; index < max_wd_cnt; index++) {
 
-         temp += utilEERead(p_port, index);
+         temp += FPT_utilEERead(p_port, index);
 
          }
 
-      if (temp == utilEERead(p_port, EEPROM_CHECK_SUM/2)) {
+      if (temp == FPT_utilEERead(p_port, EEPROM_CHECK_SUM/2)) {
 
          return;          /*EEPROM is Okay so return now! */
          }
       }
 
 
-   utilEEWriteOnOff(p_port,(UCHAR)1);
+   FPT_utilEEWriteOnOff(p_port,(UCHAR)1);
 
    for (index = 0; index < max_wd_cnt; index++) {
 
-      utilEEWrite(p_port, 0x0000, index);
+      FPT_utilEEWrite(p_port, 0x0000, index);
       }
 
    temp = 0;
 
-   utilEEWrite(p_port, 0x4641, FW_SIGNATURE/2);
+   FPT_utilEEWrite(p_port, 0x4641, FW_SIGNATURE/2);
    temp += 0x4641;
-   utilEEWrite(p_port, 0x3920, MODEL_NUMB_0/2);
+   FPT_utilEEWrite(p_port, 0x3920, MODEL_NUMB_0/2);
    temp += 0x3920;
-   utilEEWrite(p_port, 0x3033, MODEL_NUMB_2/2);
+   FPT_utilEEWrite(p_port, 0x3033, MODEL_NUMB_2/2);
    temp += 0x3033;
-   utilEEWrite(p_port, 0x2020, MODEL_NUMB_4/2);
+   FPT_utilEEWrite(p_port, 0x2020, MODEL_NUMB_4/2);
    temp += 0x2020;
-   utilEEWrite(p_port, 0x70D3, SYSTEM_CONFIG/2);
+   FPT_utilEEWrite(p_port, 0x70D3, SYSTEM_CONFIG/2);
    temp += 0x70D3;
-   utilEEWrite(p_port, 0x0010, BIOS_CONFIG/2);
+   FPT_utilEEWrite(p_port, 0x0010, BIOS_CONFIG/2);
    temp += 0x0010;
-   utilEEWrite(p_port, 0x0003, SCAM_CONFIG/2);
+   FPT_utilEEWrite(p_port, 0x0003, SCAM_CONFIG/2);
    temp += 0x0003;
-   utilEEWrite(p_port, 0x0007, ADAPTER_SCSI_ID/2);
+   FPT_utilEEWrite(p_port, 0x0007, ADAPTER_SCSI_ID/2);
    temp += 0x0007;
 
-   utilEEWrite(p_port, 0x0000, IGNORE_B_SCAN/2);
+   FPT_utilEEWrite(p_port, 0x0000, IGNORE_B_SCAN/2);
    temp += 0x0000;
-   utilEEWrite(p_port, 0x0000, SEND_START_ENA/2);
+   FPT_utilEEWrite(p_port, 0x0000, SEND_START_ENA/2);
    temp += 0x0000;
-   utilEEWrite(p_port, 0x0000, DEVICE_ENABLE/2);
+   FPT_utilEEWrite(p_port, 0x0000, DEVICE_ENABLE/2);
    temp += 0x0000;
 
-   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL01/2);
+   FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL01/2);
    temp += 0x4242;
-   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL23/2);
+   FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL23/2);
    temp += 0x4242;
-   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL45/2);
+   FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL45/2);
    temp += 0x4242;
-   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL67/2);
+   FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL67/2);
    temp += 0x4242;
-   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL89/2);
+   FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL89/2);
    temp += 0x4242;
-   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLab/2);
+   FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLab/2);
    temp += 0x4242;
-   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLcd/2);
+   FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLcd/2);
    temp += 0x4242;
-   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLef/2);
+   FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLef/2);
    temp += 0x4242;
 
 
-   utilEEWrite(p_port, 0x6C46, 64/2);  /*PRODUCT ID */
+   FPT_utilEEWrite(p_port, 0x6C46, 64/2);  /*PRODUCT ID */
    temp += 0x6C46;
-   utilEEWrite(p_port, 0x7361, 66/2);  /* FlashPoint LT   */
+   FPT_utilEEWrite(p_port, 0x7361, 66/2);  /* FlashPoint LT   */
    temp += 0x7361;
-   utilEEWrite(p_port, 0x5068, 68/2);
+   FPT_utilEEWrite(p_port, 0x5068, 68/2);
    temp += 0x5068;
-   utilEEWrite(p_port, 0x696F, 70/2);
+   FPT_utilEEWrite(p_port, 0x696F, 70/2);
    temp += 0x696F;
-   utilEEWrite(p_port, 0x746E, 72/2);
+   FPT_utilEEWrite(p_port, 0x746E, 72/2);
    temp += 0x746E;
-   utilEEWrite(p_port, 0x4C20, 74/2);
+   FPT_utilEEWrite(p_port, 0x4C20, 74/2);
    temp += 0x4C20;
-   utilEEWrite(p_port, 0x2054, 76/2);
+   FPT_utilEEWrite(p_port, 0x2054, 76/2);
    temp += 0x2054;
-   utilEEWrite(p_port, 0x2020, 78/2);
+   FPT_utilEEWrite(p_port, 0x2020, 78/2);
    temp += 0x2020;
 
    index = ((EE_SCAMBASE/2)+(7*16));
-   utilEEWrite(p_port, (0x0700+TYPE_CODE0), index);
+   FPT_utilEEWrite(p_port, (0x0700+TYPE_CODE0), index);
    temp += (0x0700+TYPE_CODE0);
    index++;
-   utilEEWrite(p_port, 0x5542, index);            /*Vendor ID code */
+   FPT_utilEEWrite(p_port, 0x5542, index);            /*Vendor ID code */
    temp += 0x5542;                                /* BUSLOGIC      */
    index++;
-   utilEEWrite(p_port, 0x4C53, index);
+   FPT_utilEEWrite(p_port, 0x4C53, index);
    temp += 0x4C53;
    index++;
-   utilEEWrite(p_port, 0x474F, index);
+   FPT_utilEEWrite(p_port, 0x474F, index);
    temp += 0x474F;
    index++;
-   utilEEWrite(p_port, 0x4349, index);
+   FPT_utilEEWrite(p_port, 0x4349, index);
    temp += 0x4349;
    index++;
-   utilEEWrite(p_port, 0x5442, index);            /*Vendor unique code */
+   FPT_utilEEWrite(p_port, 0x5442, index);            /*Vendor unique code */
    temp += 0x5442;                         /* BT- 930           */
    index++;
-   utilEEWrite(p_port, 0x202D, index);
+   FPT_utilEEWrite(p_port, 0x202D, index);
    temp += 0x202D;
    index++;
-   utilEEWrite(p_port, 0x3339, index);
+   FPT_utilEEWrite(p_port, 0x3339, index);
    temp += 0x3339;
    index++;                                 /*Serial #          */
-   utilEEWrite(p_port, 0x2030, index);             /* 01234567         */
+   FPT_utilEEWrite(p_port, 0x2030, index);             /* 01234567         */
    temp += 0x2030;
    index++;
-   utilEEWrite(p_port, 0x5453, index);
+   FPT_utilEEWrite(p_port, 0x5453, index);
    temp += 0x5453;
    index++;
-   utilEEWrite(p_port, 0x5645, index);
+   FPT_utilEEWrite(p_port, 0x5645, index);
    temp += 0x5645;
    index++;
-   utilEEWrite(p_port, 0x2045, index);
+   FPT_utilEEWrite(p_port, 0x2045, index);
    temp += 0x2045;
    index++;
-   utilEEWrite(p_port, 0x202F, index);
+   FPT_utilEEWrite(p_port, 0x202F, index);
    temp += 0x202F;
    index++;
-   utilEEWrite(p_port, 0x4F4A, index);
+   FPT_utilEEWrite(p_port, 0x4F4A, index);
    temp += 0x4F4A;
    index++;
-   utilEEWrite(p_port, 0x204E, index);
+   FPT_utilEEWrite(p_port, 0x204E, index);
    temp += 0x204E;
    index++;
-   utilEEWrite(p_port, 0x3539, index);
+   FPT_utilEEWrite(p_port, 0x3539, index);
    temp += 0x3539;
 
 
 
-   utilEEWrite(p_port, temp, EEPROM_CHECK_SUM/2);
+   FPT_utilEEWrite(p_port, temp, EEPROM_CHECK_SUM/2);
 
-   utilEEWriteOnOff(p_port,(UCHAR)0);
+   FPT_utilEEWriteOnOff(p_port,(UCHAR)0);
 
 }
 
-#ident "$Id: utility.c 1.23 1997/06/10 16:55:06 mohan Exp $"
-/*----------------------------------------------------------------------
- *
- *
- *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
- *
- *   This file is available under both the GNU General Public License
- *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
- *
- *   $Workfile:   utility.c  $
- *
- *   Description:  Utility functions relating to queueing and EEPROM
- *                 manipulation and any other garbage functions.
- *
- *   $Date: 1997/06/10 16:55:06 $
- *
- *   $Revision: 1.23 $
- *
- *----------------------------------------------------------------------*/
-/*#include <globals.h>*/
-
-#if (FW_TYPE==_UCB_MGR_)
-       /*#include <budi.h>*/
-#endif
-
-/*#include <sccbmgr.h>*/
-/*#include <blx30.h>*/
-/*#include <target.h>*/
-/*#include <scsi2.h>*/
-/*#include <harpoon.h>*/
-
-
-/*
-extern SCCBCARD BL_Card[MAX_CARDS];
-extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
-extern unsigned int SccbGlobalFlags;
-*/
 
 /*---------------------------------------------------------------------
  *
@@ -11072,7 +7305,7 @@ extern unsigned int SccbGlobalFlags;
  *
  *---------------------------------------------------------------------*/
 
-void queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card)
+static void FPT_queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card)
 {
    UCHAR scan_ptr, lun;
    PSCCBMgr_tar_info currTar_Info;
@@ -11081,7 +7314,7 @@ void queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card)
    scan_ptr = pCurrCard->scanIndex;
        do 
        {
-               currTar_Info = &sccbMgrTbl[p_card][scan_ptr];
+               currTar_Info = &FPT_sccbMgrTbl[p_card][scan_ptr];
                if((pCurrCard->globalFlags & F_CONLUN_IO) && 
                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
                {
@@ -11094,7 +7327,7 @@ void queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card)
                                
                                for(lun=0; lun < MAX_LUN; lun++)
                                {
-                                       if(currTar_Info->TarLUNBusy[lun] == FALSE)
+                                       if(currTar_Info->TarLUNBusy[lun] == 0)
                                        {
 
                                                pCurrCard->currentSCCB = currTar_Info->TarSelQ_Head;
@@ -11153,7 +7386,7 @@ void queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card)
                else
                {
                        if ((currTar_Info->TarSelQ_Cnt != 0) &&
-                               (currTar_Info->TarLUNBusy[0] == FALSE))
+                               (currTar_Info->TarLUNBusy[0] == 0))
                        {
 
                                pCurrCard->currentSCCB = currTar_Info->TarSelQ_Head;
@@ -11203,7 +7436,7 @@ void queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-void queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card)
+static void FPT_queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card)
 {
    UCHAR thisTarg;
    PSCCBMgr_tar_info currTar_Info;
@@ -11211,7 +7444,7 @@ void queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card)
    if (pCurrCard->currentSCCB != NULL)
          {
          thisTarg = (UCHAR)(((PSCCB)(pCurrCard->currentSCCB))->TargID);
-      currTar_Info = &sccbMgrTbl[p_card][thisTarg];
+      currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
 
       pCurrCard->currentSCCB->Sccb_backlink = (PSCCB)NULL;
 
@@ -11242,103 +7475,10 @@ void queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-void queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_sccb, UCHAR p_card)
+static void FPT_queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_sccb,
+                                UCHAR p_card)
 {
 
-#if (FW_TYPE==_UCB_MGR_)
-
-   u08bits SCSIcmd;
-   CALL_BK_FN callback;
-   PSCCBMgr_tar_info currTar_Info;
-
-   PUCB p_ucb;
-   p_ucb=p_sccb->Sccb_ucb_ptr;
-
-   SCSIcmd = p_sccb->Cdb[0];
-
-
-   if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED))
-   {
-
-      if ((p_ucb->UCB_opcode & OPC_CHK_UNDER_OVER_RUN)                     &&
-         (p_sccb->HostStatus == SCCB_COMPLETE)                             &&
-         (p_sccb->TargetStatus != SSCHECK))
-
-         if ((SCSIcmd == SCSI_READ)             ||
-             (SCSIcmd == SCSI_WRITE)            ||
-             (SCSIcmd == SCSI_READ_EXTENDED)    ||
-             (SCSIcmd == SCSI_WRITE_EXTENDED)   ||
-             (SCSIcmd == SCSI_WRITE_AND_VERIFY) ||
-             (SCSIcmd == SCSI_START_STOP_UNIT)  ||
-             (pCurrCard->globalFlags & F_NO_FILTER)
-            )
-               p_sccb->HostStatus = SCCB_DATA_UNDER_RUN;
-   }
-
-   p_ucb->UCB_status=SCCB_SUCCESS;
-
-   if ((p_ucb->UCB_hbastat=p_sccb->HostStatus) || (p_ucb->UCB_scsistat=p_sccb->TargetStatus))
-   {
-      p_ucb->UCB_status=SCCB_ERROR;
-   }
-
-   if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
-      (p_sccb->OperationCode == RESIDUAL_COMMAND))
-   {
-
-         utilUpdateResidual(p_sccb);
-
-         p_ucb->UCB_datalen=p_sccb->DataLength;
-   }
-
-   pCurrCard->cmdCounter--;
-   if (!pCurrCard->cmdCounter)
-   {
-
-      if (pCurrCard->globalFlags & F_GREEN_PC)
-      {
-         WR_HARPOON(pCurrCard->ioPort+hp_clkctrl_0,(PWR_DWN | CLKCTRL_DEFAULT));
-         WR_HARPOON(pCurrCard->ioPort+hp_sys_ctrl, STOP_CLK);
-      }
-
-      WR_HARPOON(pCurrCard->ioPort+hp_semaphore,
-      (RD_HARPOON(pCurrCard->ioPort+hp_semaphore) & ~SCCB_MGR_ACTIVE));
-   }
-
-       if(pCurrCard->discQCount != 0)
-       {
-      currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
-               if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
-                       ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
-               {
-                       pCurrCard->discQCount--;
-                       pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = NULL;
-               }
-               else
-               {
-                       if(p_sccb->Sccb_tag)
-                       {
-                               pCurrCard->discQCount--;
-                               pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
-                       }else
-                       {
-                               pCurrCard->discQCount--;
-                               pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL;
-                       }
-               }
-
-       }
-   callback = (CALL_BK_FN)p_ucb->UCB_callback;
-   callback(p_ucb);
-   pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
-   pCurrCard->currentSCCB = NULL;
-}
-
-
-
-
-#else
-
    UCHAR i, SCSIcmd;
    CALL_BK_FN callback;
    PSCCBMgr_tar_info currTar_Info;
@@ -11383,7 +7523,7 @@ void queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_sccb, UCHAR p_card)
    if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
          (p_sccb->OperationCode == RESIDUAL_COMMAND)) {
 
-                utilUpdateResidual(p_sccb);
+                FPT_utilUpdateResidual(p_sccb);
                 }
 
    pCurrCard->cmdCounter--;
@@ -11401,7 +7541,7 @@ void queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_sccb, UCHAR p_card)
 
        if(pCurrCard->discQCount != 0)
        {
-      currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
+      currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
                if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                {
@@ -11428,7 +7568,6 @@ void queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_sccb, UCHAR p_card)
    pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
    pCurrCard->currentSCCB = NULL;
 }
-#endif /* ( if FW_TYPE==...) */
 
 
 /*---------------------------------------------------------------------
@@ -11438,30 +7577,30 @@ void queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_sccb, UCHAR p_card)
  * Description: Add SCCB to our disconnect array.
  *
  *---------------------------------------------------------------------*/
-void queueDisconnect(PSCCB p_sccb, UCHAR p_card)
+static void FPT_queueDisconnect(PSCCB p_sccb, UCHAR p_card)
 {
    PSCCBMgr_tar_info currTar_Info;
 
-       currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
+       currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
 
-       if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
+       if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
                ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
        {
-               BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = p_sccb;
+               FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = p_sccb;
        }
        else
        {
                if (p_sccb->Sccb_tag)
                {
-                       BL_Card[p_card].discQ_Tbl[p_sccb->Sccb_tag] = p_sccb;
-                       sccbMgrTbl[p_card][p_sccb->TargID].TarLUNBusy[0] = FALSE;
-                       sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++;
+                       FPT_BL_Card[p_card].discQ_Tbl[p_sccb->Sccb_tag] = p_sccb;
+                       FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarLUNBusy[0] = 0;
+                       FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++;
                }else
                {
-                       BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = p_sccb;
+                       FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = p_sccb;
                }
        }
-       BL_Card[p_card].currentSCCB = NULL;
+       FPT_BL_Card[p_card].currentSCCB = NULL;
 }
 
 
@@ -11473,29 +7612,29 @@ void queueDisconnect(PSCCB p_sccb, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-void  queueFlushSccb(UCHAR p_card, UCHAR error_code)
+static void  FPT_queueFlushSccb(UCHAR p_card, UCHAR error_code)
 {
    UCHAR qtag,thisTarg;
    PSCCB currSCCB;
    PSCCBMgr_tar_info currTar_Info;
 
-   currSCCB = BL_Card[p_card].currentSCCB;
+   currSCCB = FPT_BL_Card[p_card].currentSCCB;
        if(currSCCB != NULL)
        {
           thisTarg = (UCHAR)currSCCB->TargID;
-       currTar_Info = &sccbMgrTbl[p_card][thisTarg];
+       currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
 
           for (qtag=0; qtag<QUEUE_DEPTH; qtag++) {
 
-                 if (BL_Card[p_card].discQ_Tbl[qtag] && 
-                                       (BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg))
+                 if (FPT_BL_Card[p_card].discQ_Tbl[qtag] && 
+                                       (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg))
                         {
 
-                        BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code;
+                        FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code;
                        
-                        queueCmdComplete(&BL_Card[p_card],BL_Card[p_card].discQ_Tbl[qtag], p_card);
+                        FPT_queueCmdComplete(&FPT_BL_Card[p_card],FPT_BL_Card[p_card].discQ_Tbl[qtag], p_card);
 
-                        BL_Card[p_card].discQ_Tbl[qtag] = NULL;
+                        FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
                         currTar_Info->TarTagQ_Cnt--;
 
                         }
@@ -11512,24 +7651,25 @@ void  queueFlushSccb(UCHAR p_card, UCHAR error_code)
  *
  *---------------------------------------------------------------------*/
 
-void  queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, UCHAR error_code)
+static void  FPT_queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg,
+                                   UCHAR error_code)
 {
    UCHAR qtag;
    PSCCBMgr_tar_info currTar_Info;
 
-   currTar_Info = &sccbMgrTbl[p_card][thisTarg];
+   currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
 
    for (qtag=0; qtag<QUEUE_DEPTH; qtag++) {
 
-         if (BL_Card[p_card].discQ_Tbl[qtag] && 
-                               (BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg))
+         if (FPT_BL_Card[p_card].discQ_Tbl[qtag] && 
+                               (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg))
                 {
 
-                BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code;
+                FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code;
 
-                queueCmdComplete(&BL_Card[p_card],BL_Card[p_card].discQ_Tbl[qtag], p_card);
+                FPT_queueCmdComplete(&FPT_BL_Card[p_card],FPT_BL_Card[p_card].discQ_Tbl[qtag], p_card);
 
-                BL_Card[p_card].discQ_Tbl[qtag] = NULL;
+                FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
                 currTar_Info->TarTagQ_Cnt--;
 
                 }
@@ -11541,10 +7681,10 @@ void  queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, UCHAR error_code)
 
 
 
-void queueAddSccb(PSCCB p_SCCB, UCHAR p_card)
+static void FPT_queueAddSccb(PSCCB p_SCCB, UCHAR p_card)
 {
    PSCCBMgr_tar_info currTar_Info;
-   currTar_Info = &sccbMgrTbl[p_card][p_SCCB->TargID];
+   currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
 
    p_SCCB->Sccb_forwardlink = NULL;
 
@@ -11575,12 +7715,12 @@ void queueAddSccb(PSCCB p_SCCB, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-UCHAR queueFindSccb(PSCCB p_SCCB, UCHAR p_card)
+static UCHAR FPT_queueFindSccb(PSCCB p_SCCB, UCHAR p_card)
 {
    PSCCB q_ptr;
    PSCCBMgr_tar_info currTar_Info;
 
-   currTar_Info = &sccbMgrTbl[p_card][p_SCCB->TargID];
+   currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
 
    q_ptr = currTar_Info->TarSelQ_Head;
 
@@ -11609,7 +7749,7 @@ UCHAR queueFindSccb(PSCCB p_SCCB, UCHAR p_card)
 
                 currTar_Info->TarSelQ_Cnt--;
 
-                return(TRUE);
+                return(1);
                 }
 
          else {
@@ -11618,7 +7758,7 @@ UCHAR queueFindSccb(PSCCB p_SCCB, UCHAR p_card)
          }
 
 
-   return(FALSE);
+   return(0);
 
 }
 
@@ -11636,15 +7776,11 @@ UCHAR queueFindSccb(PSCCB p_SCCB, UCHAR p_card)
  *
  *---------------------------------------------------------------------*/
 
-void  utilUpdateResidual(PSCCB p_SCCB)
+static void  FPT_utilUpdateResidual(PSCCB p_SCCB)
 {
    ULONG partial_cnt;
    UINT  sg_index;
-#if defined(COMPILER_16_BIT) && !defined(DOS)
-   ULONG far *sg_ptr;
-#else
    ULONG *sg_ptr;
-#endif
 
    if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) {
 
@@ -11657,11 +7793,7 @@ void  utilUpdateResidual(PSCCB p_SCCB)
 
                 sg_index = p_SCCB->Sccb_sgseg;
 
-#if defined(COMPILER_16_BIT) && !defined(DOS)
-                sg_ptr = (ULONG far *)p_SCCB->DataPointer;
-#else
                 sg_ptr = (ULONG *)p_SCCB->DataPointer;
-#endif
 
                 if (p_SCCB->Sccb_SGoffset) {
 
@@ -11694,17 +7826,13 @@ void  utilUpdateResidual(PSCCB p_SCCB)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void Wait1Second(USHORT p_port)
-#else
-void Wait1Second(ULONG p_port)
-#endif
+static void FPT_Wait1Second(ULONG p_port)
 {
    UCHAR i;
 
    for(i=0; i < 4; i++) {
 
-         Wait(p_port, TO_250ms);
+         FPT_Wait(p_port, TO_250ms);
 
          if ((RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST))
                 break;
@@ -11717,17 +7845,13 @@ void Wait1Second(ULONG p_port)
 
 /*---------------------------------------------------------------------
  *
- * Function: Wait
+ * Function: FPT_Wait
  *
  * Description: Wait the desired delay.
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void Wait(USHORT p_port, UCHAR p_delay)
-#else
-void Wait(ULONG p_port, UCHAR p_delay)
-#endif
+static void FPT_Wait(ULONG p_port, UCHAR p_delay)
 {
    UCHAR old_timer;
    UCHAR green_flag;
@@ -11739,7 +7863,7 @@ void Wait(ULONG p_port, UCHAR p_delay)
 
    WR_HARPOON(p_port+hp_seltimeout,p_delay);
    WRW_HARPOON((p_port+hp_intstat), TIMEOUT);
-   WRW_HARPOON((p_port+hp_intena), (default_intena & ~TIMEOUT));
+   WRW_HARPOON((p_port+hp_intena), (FPT_default_intena & ~TIMEOUT));
 
 
    WR_HARPOON(p_port+hp_portctrl_0,
@@ -11758,7 +7882,7 @@ void Wait(ULONG p_port, UCHAR p_delay)
          (RD_HARPOON(p_port+hp_portctrl_0) & ~START_TO));
 
    WRW_HARPOON((p_port+hp_intstat), TIMEOUT);
-   WRW_HARPOON((p_port+hp_intena), default_intena);
+   WRW_HARPOON((p_port+hp_intena), FPT_default_intena);
 
    WR_HARPOON(p_port+hp_clkctrl_0,green_flag);
 
@@ -11775,11 +7899,7 @@ void Wait(ULONG p_port, UCHAR p_delay)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void utilEEWriteOnOff(USHORT p_port,UCHAR p_mode)
-#else
-void utilEEWriteOnOff(ULONG p_port,UCHAR p_mode)
-#endif
+static void FPT_utilEEWriteOnOff(ULONG p_port,UCHAR p_mode)
 {
    UCHAR ee_value;
 
@@ -11787,12 +7907,12 @@ void utilEEWriteOnOff(ULONG p_port,UCHAR p_mode)
 
    if (p_mode)
 
-         utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR);
+         FPT_utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR);
 
    else
 
 
-         utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR);
+         FPT_utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR);
 
    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */
    WR_HARPOON(p_port+hp_ee_ctrl, ee_value);       /*Turn off Master Select */
@@ -11808,11 +7928,7 @@ void utilEEWriteOnOff(ULONG p_port,UCHAR p_mode)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void utilEEWrite(USHORT p_port, USHORT ee_data, USHORT ee_addr)
-#else
-void utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr)
-#endif
+static void FPT_utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr)
 {
 
    UCHAR ee_value;
@@ -11823,7 +7939,7 @@ void utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr)
 
 
 
-   utilEESendCmdAddr(p_port, EE_WRITE, ee_addr);
+   FPT_utilEESendCmdAddr(p_port, EE_WRITE, ee_addr);
 
 
    ee_value |= (SEE_MS + SEE_CS);
@@ -11847,7 +7963,7 @@ void utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr)
    ee_value &= (EXT_ARB_ACK | SCSI_TERM_ENA_H);
    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS));
 
-   Wait(p_port, TO_10ms);
+   FPT_Wait(p_port, TO_10ms);
 
    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS | SEE_CS)); /* Set CS to EEPROM */
    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS));       /* Turn off CS */
@@ -11863,19 +7979,15 @@ void utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-USHORT utilEERead(USHORT p_port, USHORT ee_addr)
-#else
-USHORT utilEERead(ULONG p_port, USHORT ee_addr)
-#endif
+static USHORT FPT_utilEERead(ULONG p_port, USHORT ee_addr)
 {
    USHORT i, ee_data1, ee_data2;
 
        i = 0;
-       ee_data1 = utilEEReadOrg(p_port, ee_addr);
+       ee_data1 = FPT_utilEEReadOrg(p_port, ee_addr);
        do
        {
-               ee_data2 = utilEEReadOrg(p_port, ee_addr);
+               ee_data2 = FPT_utilEEReadOrg(p_port, ee_addr);
 
                if(ee_data1 == ee_data2)
                        return(ee_data1);
@@ -11897,11 +8009,7 @@ USHORT utilEERead(ULONG p_port, USHORT ee_addr)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-USHORT utilEEReadOrg(USHORT p_port, USHORT ee_addr)
-#else
-USHORT utilEEReadOrg(ULONG p_port, USHORT ee_addr)
-#endif
+static USHORT FPT_utilEEReadOrg(ULONG p_port, USHORT ee_addr)
 {
 
    UCHAR ee_value;
@@ -11911,7 +8019,7 @@ USHORT utilEEReadOrg(ULONG p_port, USHORT ee_addr)
                   (SEE_MS | SEE_CS));
 
 
-   utilEESendCmdAddr(p_port, EE_READ, ee_addr);
+   FPT_utilEESendCmdAddr(p_port, EE_READ, ee_addr);
 
 
    ee_value |= (SEE_MS + SEE_CS);
@@ -11949,11 +8057,7 @@ USHORT utilEEReadOrg(ULONG p_port, USHORT ee_addr)
  *
  *---------------------------------------------------------------------*/
 
-#if defined(DOS)
-void utilEESendCmdAddr(USHORT p_port, UCHAR ee_cmd, USHORT ee_addr)
-#else
-void utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr)
-#endif
+static void FPT_utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr)
 {
    UCHAR ee_value;
    UCHAR narrow_flg;
@@ -12016,7 +8120,7 @@ void utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr)
          }
 }
 
-USHORT CalcCrc16(UCHAR buffer[])
+static USHORT FPT_CalcCrc16(UCHAR buffer[])
 {
    USHORT crc=0;
        int i,j;
@@ -12036,7 +8140,7 @@ USHORT CalcCrc16(UCHAR buffer[])
        return(crc);
 }
 
-UCHAR CalcLrc(UCHAR buffer[])
+static UCHAR FPT_CalcLrc(UCHAR buffer[])
 {
        int i;
        UCHAR lrc;
@@ -12109,33 +8213,6 @@ FlashPoint__HandleInterrupt(FlashPoint_CardHandle_T CardHandle)
 #define FlashPoint_HandleInterrupt         FlashPoint__HandleInterrupt
 
 
-/*
-  FlashPoint_InquireTargetInfo returns the Synchronous Period, Synchronous
-  Offset, and Wide Transfers Active information for TargetID on CardHandle.
-*/
-
-void FlashPoint_InquireTargetInfo(FlashPoint_CardHandle_T CardHandle,
-                                 int TargetID,
-                                 unsigned char *SynchronousPeriod,
-                                 unsigned char *SynchronousOffset,
-                                 unsigned char *WideTransfersActive)
-{
-  SCCBMGR_TAR_INFO *TargetInfo =
-    &sccbMgrTbl[((SCCBCARD *)CardHandle)->cardIndex][TargetID];
-  if ((TargetInfo->TarSyncCtrl & SYNC_OFFSET) > 0)
-    {
-      *SynchronousPeriod = 5 * ((TargetInfo->TarSyncCtrl >> 5) + 1);
-      *SynchronousOffset = TargetInfo->TarSyncCtrl & SYNC_OFFSET;
-    }
-  else
-    {
-      *SynchronousPeriod = 0;
-      *SynchronousOffset = 0;
-    }
-  *WideTransfersActive = (TargetInfo->TarSyncCtrl & NARROW_SCSI ? 0 : 1);
-}
-
-
 #else  /* CONFIG_SCSI_OMIT_FLASHPOINT */
 
 
@@ -12151,9 +8228,6 @@ extern int FlashPoint_AbortCCB(FlashPoint_CardHandle_T, struct BusLogic_CCB *);
 extern boolean FlashPoint_InterruptPending(FlashPoint_CardHandle_T);
 extern int FlashPoint_HandleInterrupt(FlashPoint_CardHandle_T);
 extern void FlashPoint_ReleaseHostAdapter(FlashPoint_CardHandle_T);
-extern void FlashPoint_InquireTargetInfo(FlashPoint_CardHandle_T,
-                                        int, unsigned char *,
-                                        unsigned char *, unsigned char *);
 
 
 #endif /* CONFIG_SCSI_OMIT_FLASHPOINT */
index 1811cb240315a33c8aea5ddf9d6ccd24c5c51060..96df148ed96967f06e544893ae415ba2bb18699d 100644 (file)
@@ -137,6 +137,24 @@ config CHR_DEV_SG
 
          If unsure, say N.
 
+config CHR_DEV_SCH
+       tristate "SCSI media changer support"
+       depends on SCSI
+       ---help---
+         This is a driver for SCSI media changers.  Most common devices are
+         tape libraries and MOD/CDROM jukeboxes.  *Real* jukeboxes, you
+         don't need this for those tiny 6-slot cdrom changers.  Media
+         changers are listed as "Type: Medium Changer" in /proc/scsi/scsi.
+         If you have such hardware and want to use it with linux, say Y
+         here.  Check <file:Documentation/scsi-changer.txt> for details.
+       
+         If you want to compile this as a module ( = code which can be
+         inserted in and removed from the running kernel whenever you want),
+         say M here and read <file:Documentation/modules.txt> and
+         <file:Documentation/scsi.txt>. The module will be called ch.o.
+         If unsure, say N.
+       
+
 comment "Some SCSI devices (e.g. CD jukebox) support multiple LUNs"
        depends on SCSI
 
@@ -1192,28 +1210,6 @@ config SCSI_PAS16
          To compile this driver as a module, choose M here: the
          module will be called pas16.
 
-config SCSI_PCI2000
-       tristate "PCI2000 support"
-       depends on PCI && SCSI && BROKEN
-       help
-         This is support for the PCI2000I EIDE interface card which acts as a
-         SCSI host adapter.  Please read the SCSI-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here: the
-         module will be called pci2000.
-
-config SCSI_PCI2220I
-       tristate "PCI2220i support"
-       depends on PCI && SCSI && BROKEN
-       help
-         This is support for the PCI2220i EIDE interface card which acts as a
-         SCSI host adapter.  Please read the SCSI-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here: the
-         module will be called pci2220i.
-
 config SCSI_PSI240I
        tristate "PSI240i support"
        depends on ISA && SCSI
@@ -1752,7 +1748,7 @@ config SCSI_NCR53C7xx_FAST
 
 config SUN3_SCSI
        tristate "Sun3 NCR5380 SCSI"
-       depends on SUN3 && SCSI
+       depends on SUN3 && SCSI && BROKEN
        help
          This option will enable support for the OBIO (onboard io) NCR5380
          SCSI controller found in the Sun 3/50 and 3/60, as well as for
index 9cb9fe7d623aeda983c2e6b2f4cb57bdca796673..3746fb9fa2f5b0518bd347447bd8d83d4ec20d1d 100644 (file)
@@ -50,8 +50,6 @@ obj-$(CONFIG_MVME16x_SCSI)    += mvme16x.o    53c7xx.o
 obj-$(CONFIG_BVME6000_SCSI)    += bvme6000.o   53c7xx.o
 obj-$(CONFIG_SCSI_SIM710)      += 53c700.o     sim710.o
 obj-$(CONFIG_SCSI_ADVANSYS)    += advansys.o
-obj-$(CONFIG_SCSI_PCI2000)     += pci2000.o
-obj-$(CONFIG_SCSI_PCI2220I)    += pci2220i.o
 obj-$(CONFIG_SCSI_PSI240I)     += psi240i.o
 obj-$(CONFIG_SCSI_BUSLOGIC)    += BusLogic.o
 obj-$(CONFIG_SCSI_DPT_I2O)     += dpt_i2o.o
@@ -142,6 +140,7 @@ obj-$(CONFIG_CHR_DEV_OSST)  += osst.o
 obj-$(CONFIG_BLK_DEV_SD)       += sd_mod.o
 obj-$(CONFIG_BLK_DEV_SR)       += sr_mod.o
 obj-$(CONFIG_CHR_DEV_SG)       += sg.o
+obj-$(CONFIG_CHR_DEV_SCH)      += ch.o
 
 scsi_mod-y                     += scsi.o hosts.o scsi_ioctl.o constants.o \
                                   scsicam.o scsi_error.o scsi_lib.o \
index 770fa841e389e9e60981a918957a160d84f4a1b1..f8ec6fe7d85855a03457b0dabb80104f9f7d838f 100644 (file)
@@ -2825,39 +2825,17 @@ static int NCR5380_abort(Scsi_Cmnd * cmd) {
  * Locks: host lock taken by caller
  */
 
-static int NCR5380_bus_reset(Scsi_Cmnd * cmd) {
-       NCR5380_local_declare();
-       NCR5380_setup(cmd->device->host);
-
-       NCR5380_print_status(cmd->device->host);
-       do_reset(cmd->device->host);
-       return SUCCESS;
-}
-
-/* 
- * Function : int NCR5380_device_reset (Scsi_Cmnd *cmd)
- * 
- * Purpose : reset a SCSI device
- *
- * Returns : FAILED
- *
- * Locks: io_request_lock held by caller
- */
+static int NCR5380_bus_reset(Scsi_Cmnd * cmd)
+{
+       struct Scsi_Host *instance = cmd->device->host;
 
-static int NCR5380_device_reset(Scsi_Cmnd * cmd) {
-       return FAILED;
-}
+       NCR5380_local_declare();
+       NCR5380_setup(instance);
+       NCR5380_print_status(instance);
 
-/* 
- * Function : int NCR5380_host_reset (Scsi_Cmnd *cmd)
- * 
- * Purpose : reset a SCSI device
- *
- * Returns : FAILED
- *
- * Locks: io_request_lock held by caller
- */
+       spin_lock_irq(instance->host_lock);
+       do_reset(instance);
+       spin_unlock_irq(instance->host_lock);
 
-static int NCR5380_host_reset(Scsi_Cmnd * cmd) {
-       return FAILED;
+       return SUCCESS;
 }
index b5103f94d627aa8f8df5ab1cbaa0da4069c81a74..c3462e358d1cb512baed35b9748c2df69b15383d 100644 (file)
@@ -306,8 +306,6 @@ static void NCR5380_print(struct Scsi_Host *instance);
 #endif
 static int NCR5380_abort(Scsi_Cmnd * cmd);
 static int NCR5380_bus_reset(Scsi_Cmnd * cmd);
-static int NCR5380_host_reset(Scsi_Cmnd * cmd);
-static int NCR5380_device_reset(Scsi_Cmnd * cmd);
 static int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *));
 static int NCR5380_proc_info(struct Scsi_Host *instance, char *buffer, char **start,
 off_t offset, int length, int inout);
index 74b93564a258fdc44ee45e73c833a157b31ec0f5..6ceabbd42a3d22374106ca4d1d4f71e7e85b1e60 100644 (file)
@@ -94,7 +94,7 @@ enum {
 };
 
 /* The master ring of all esp hosts we are managing in this driver. */
-struct NCR_ESP *espchain;
+static struct NCR_ESP *espchain;
 int nesps = 0, esps_in_use = 0, esps_running = 0;
 
 irqreturn_t esp_intr(int irq, void *dev_id, struct pt_regs *pregs);
@@ -1467,14 +1467,12 @@ int esp_reset(Scsi_Cmnd *SCptr)
 {
        struct NCR_ESP *esp = (struct NCR_ESP *) SCptr->device->host->hostdata;
 
+       spin_lock_irq(esp->ehost->host_lock);
        (void) esp_do_resetbus(esp, esp->eregs);
-
        spin_unlock_irq(esp->ehost->host_lock);
 
        wait_event(esp->reset_queue, (esp->resetting_bus == 0));
 
-       spin_lock_irq(esp->ehost->host_lock);
-
        return SUCCESS;
 }
 
index c685d546f8381e68a8e99a348e5d054caf6c472c..b2002ba6e2aa4ce928f85499db9a5ab7ee14d4ac 100644 (file)
@@ -722,15 +722,12 @@ static int NCR53c406a_queue(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
        return 0;
 }
 
-static int NCR53c406a_abort(Scsi_Cmnd * SCpnt)
-{
-       DEB(printk("NCR53c406a_abort called\n"));
-       return FAILED;          /* Don't know how to abort */
-}
-
 static int NCR53c406a_host_reset(Scsi_Cmnd * SCpnt)
 {
        DEB(printk("NCR53c406a_reset called\n"));
+
+       spin_lock_irq(SCpnt->device->host->host_lock);
+
        outb(C4_IMG, CONFIG4);  /* Select reg set 0 */
        outb(CHIP_RESET, CMD_REG);
        outb(SCSI_NOP, CMD_REG);        /* required after reset */
@@ -738,17 +735,10 @@ static int NCR53c406a_host_reset(Scsi_Cmnd * SCpnt)
        chip_init();
 
        rtrc(2);
-       return SUCCESS;
-}
 
-static int NCR53c406a_device_reset(Scsi_Cmnd * SCpnt)
-{
-       return FAILED;
-}
+       spin_unlock_irq(SCpnt->device->host->host_lock);
 
-static int NCR53c406a_bus_reset(Scsi_Cmnd * SCpnt)
-{
-       return FAILED;
+       return SUCCESS;
 }
 
 static int NCR53c406a_biosparm(struct scsi_device *disk,
@@ -1075,9 +1065,6 @@ static Scsi_Host_Template driver_template =
      .release                  = NCR53c406a_release,
      .info                     = NCR53c406a_info               /* info */,             
      .queuecommand             = NCR53c406a_queue      /* queuecommand */,     
-     .eh_abort_handler         = NCR53c406a_abort      /* abort */,            
-     .eh_bus_reset_handler      = NCR53c406a_bus_reset /* reset */,            
-     .eh_device_reset_handler   = NCR53c406a_device_reset      /* reset */,            
      .eh_host_reset_handler     = NCR53c406a_host_reset        /* reset */,            
      .bios_param               = NCR53c406a_biosparm   /* biosparm */,         
      .can_queue                = 1                     /* can_queue */,        
index 9928a2fbce0cd315d6ea7b609b3ace5442b3dd87..f7a1751e892dc34b18376313213f087e0a4998c4 100644 (file)
@@ -221,7 +221,14 @@ int __init a2091_detect(Scsi_Host_Template *tpnt)
 static int a2091_bus_reset(Scsi_Cmnd *cmd)
 {
        /* FIXME perform bus-specific reset */
+
+       /* FIXME 2: kill this function, and let midlayer fall back
+          to the same action, calling wd33c93_host_reset() */
+
+       spin_lock_irq(cmd->device->host->host_lock);
        wd33c93_host_reset(cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
        return SUCCESS;
 }
 
index f8a89ec25042f9acba0e94d840a3f933e148f6ef..306caf56f3d9eaad59dea2916c42ca406abc5f67 100644 (file)
@@ -208,7 +208,14 @@ fail_register:
 static int a3000_bus_reset(Scsi_Cmnd *cmd)
 {
        /* FIXME perform bus-specific reset */
+       
+       /* FIXME 2: kill this entire function, which should
+          cause mid-layer to call wd33c93_host_reset anyway? */
+
+       spin_lock_irq(cmd->device->host->host_lock);
        wd33c93_host_reset(cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
        return SUCCESS;
 }
 
index f3fc35386060c7a3ecce277a4942c45d9c62fec7..f02c99641467394a8f266c662eca1ae8603b1460 100644 (file)
 #define        INQD_PDT_DMASK  0x1F    /* Peripheral Device Type Mask */
 #define        INQD_PDT_QMASK  0xE0    /* Peripheral Device Qualifer Mask */
 
-#define MAX_FIB_DATA (sizeof(struct hw_fib) - sizeof(FIB_HEADER))
-
-#define MAX_DRIVER_SG_SEGMENT_COUNT 17
-
 /*
  *     Sense codes
  */
@@ -158,6 +154,13 @@ MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0
 module_param(commit, int, 0);
 MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on");
 
+int numacb = -1;
+module_param(numacb, int, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control blocks (FIB) allocated. Valid\nvalues are 512 and down. Default is to use suggestion from Firmware.");
+
+int acbsize = -1;
+module_param(acbsize, int, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB) size. Valid values are 512,\n2048, 4096 and 8192. Default is to use suggestion from Firmware.");
 /**
  *     aac_get_config_status   -       check the adapter configuration
  *     @common: adapter to query
@@ -462,7 +465,7 @@ static int probe_container(struct aac_dev *dev, int cid)
                            1, 1,
                            NULL, NULL);
        if (status < 0) {
-               printk(KERN_WARNING "aacraid: probe_containers query failed.\n");
+               printk(KERN_WARNING "aacraid: probe_container query failed.\n");
                goto error;
        }
 
@@ -562,10 +565,10 @@ static void setinqstr(int devtype, void *data, int tindex)
        inqstrcpy ("V1.0", str->prl);
 }
 
-void set_sense(u8 *sense_buf, u8 sense_key, u8 sense_code,
-                   u8 a_sense_code, u8 incorrect_length,
-                   u8 bit_pointer, u16 field_pointer,
-                   u32 residue)
+static void set_sense(u8 *sense_buf, u8 sense_key, u8 sense_code,
+                     u8 a_sense_code, u8 incorrect_length,
+                     u8 bit_pointer, u16 field_pointer,
+                     u32 residue)
 {
        sense_buf[0] = 0xF0;    /* Sense data valid, err code 70h (current error) */
        sense_buf[1] = 0;       /* Segment number, always zero */
@@ -605,35 +608,63 @@ void set_sense(u8 *sense_buf, u8 sense_key, u8 sense_code,
 int aac_get_adapter_info(struct aac_dev* dev)
 {
        struct fib* fibptr;
-       struct aac_adapter_info* info;
        int rcode;
        u32 tmp;
+       struct aac_adapter_info * info;
+
        if (!(fibptr = fib_alloc(dev)))
                return -ENOMEM;
 
        fib_init(fibptr);
-       info = (struct aac_adapter_info*) fib_data(fibptr);
-
-       memset(info,0,sizeof(struct aac_adapter_info));
+       info = (struct aac_adapter_info *) fib_data(fibptr);
+       memset(info,0,sizeof(*info));
 
        rcode = fib_send(RequestAdapterInfo,
-                       fibptr, 
-                       sizeof(struct aac_adapter_info),
-                       FsaNormal, 
-                       1, 1, 
-                       NULL, 
-                       NULL);
+                        fibptr, 
+                        sizeof(*info),
+                        FsaNormal, 
+                        1, 1, 
+                        NULL, 
+                        NULL);
+
+       if (rcode < 0) {
+               fib_complete(fibptr);
+               fib_free(fibptr);
+               return rcode;
+       }
+       memcpy(&dev->adapter_info, info, sizeof(*info));
+
+       if (dev->adapter_info.options & AAC_OPT_SUPPLEMENT_ADAPTER_INFO) {
+               struct aac_supplement_adapter_info * info;
 
-       memcpy(&dev->adapter_info, info, sizeof(struct aac_adapter_info));
+               fib_init(fibptr);
+
+               info = (struct aac_supplement_adapter_info *) fib_data(fibptr);
+
+               memset(info,0,sizeof(*info));
+
+               rcode = fib_send(RequestSupplementAdapterInfo,
+                                fibptr,
+                                sizeof(*info),
+                                FsaNormal,
+                                1, 1,
+                                NULL,
+                                NULL);
+
+               if (rcode >= 0)
+                       memcpy(&dev->supplement_adapter_info, info, sizeof(*info));
+       }
 
        tmp = le32_to_cpu(dev->adapter_info.kernelrev);
-       printk(KERN_INFO "%s%d: kernel %d.%d-%d[%d]\n", 
+       printk(KERN_INFO "%s%d: kernel %d.%d-%d[%d] %.*s\n", 
                        dev->name, 
                        dev->id,
                        tmp>>24,
                        (tmp>>16)&0xff,
                        tmp&0xff,
-                       le32_to_cpu(dev->adapter_info.kernelbuild));
+                       le32_to_cpu(dev->adapter_info.kernelbuild),
+                       (int)sizeof(dev->supplement_adapter_info.BuildDate),
+                       dev->supplement_adapter_info.BuildDate);
        tmp = le32_to_cpu(dev->adapter_info.monitorrev);
        printk(KERN_INFO "%s%d: monitor %d.%d-%d[%d]\n", 
                        dev->name, dev->id,
@@ -707,6 +738,38 @@ int aac_get_adapter_info(struct aac_dev* dev)
                        rcode = -ENOMEM;
                }
        }
+       /* 
+        * 57 scatter gather elements 
+        */
+       dev->scsi_host_ptr->sg_tablesize = (dev->max_fib_size -
+               sizeof(struct aac_fibhdr) -
+               sizeof(struct aac_write) + sizeof(struct sgmap)) /
+                       sizeof(struct sgmap);
+       if (dev->dac_support) {
+               /* 
+                * 38 scatter gather elements 
+                */
+               dev->scsi_host_ptr->sg_tablesize =
+                       (dev->max_fib_size -
+                       sizeof(struct aac_fibhdr) -
+                       sizeof(struct aac_write64) +
+                       sizeof(struct sgmap64)) /
+                               sizeof(struct sgmap64);
+       }
+       dev->scsi_host_ptr->max_sectors = AAC_MAX_32BIT_SGBCOUNT;
+       if(!(dev->adapter_info.options & AAC_OPT_NEW_COMM)) {
+               /*
+                * Worst case size that could cause sg overflow when
+                * we break up SG elements that are larger than 64KB.
+                * Would be nice if we could tell the SCSI layer what
+                * the maximum SG element size can be. Worst case is
+                * (sg_tablesize-1) 4KB elements with one 64KB
+                * element.
+                *      32bit -> 468 or 238KB   64bit -> 424 or 212KB
+                */
+               dev->scsi_host_ptr->max_sectors =
+                 (dev->scsi_host_ptr->sg_tablesize * 8) + 112;
+       }
 
        fib_complete(fibptr);
        fib_free(fibptr);
@@ -747,8 +810,10 @@ static void read_callback(void *context, struct fib * fibptr)
        if (le32_to_cpu(readreply->status) == ST_OK)
                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
        else {
-               printk(KERN_WARNING "read_callback: read failed, status = %d\n",
-                               le32_to_cpu(readreply->status));
+#ifdef AAC_DETAILED_STATUS_INFO
+               printk(KERN_WARNING "read_callback: io failed, status = %d\n",
+                 le32_to_cpu(readreply->status));
+#endif
                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
                set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
                                    HARDWARE_ERROR,
@@ -813,7 +878,7 @@ static void write_callback(void *context, struct fib * fibptr)
        aac_io_done(scsicmd);
 }
 
-int aac_read(struct scsi_cmnd * scsicmd, int cid)
+static int aac_read(struct scsi_cmnd * scsicmd, int cid)
 {
        u32 lba;
        u32 count;
@@ -842,7 +907,8 @@ int aac_read(struct scsi_cmnd * scsicmd, int cid)
                lba = (scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
                count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8];
        }
-       dprintk((KERN_DEBUG "aac_read[cpu %d]: lba = %u, t = %ld.\n", smp_processor_id(), lba, jiffies));
+       dprintk((KERN_DEBUG "aac_read[cpu %d]: lba = %u, t = %ld.\n",
+         smp_processor_id(), (unsigned long long)lba, jiffies));
        /*
         *      Alocate and initialize a Fib
         */
@@ -852,7 +918,7 @@ int aac_read(struct scsi_cmnd * scsicmd, int cid)
 
        fib_init(cmd_fibcontext);
 
-       if(dev->dac_support == 1) {
+       if (dev->dac_support == 1) {
                struct aac_read64 *readcmd;
                readcmd = (struct aac_read64 *) fib_data(cmd_fibcontext);
                readcmd->command = cpu_to_le32(VM_CtHostRead64);
@@ -886,14 +952,11 @@ int aac_read(struct scsi_cmnd * scsicmd, int cid)
                readcmd->block = cpu_to_le32(lba);
                readcmd->count = cpu_to_le32(count * 512);
 
-               if (count * 512 > (64 * 1024))
-                       BUG();
-
                aac_build_sg(scsicmd, &readcmd->sg);
                fibsize = sizeof(struct aac_read) + 
                        ((le32_to_cpu(readcmd->sg.count) - 1) * 
                         sizeof (struct sgentry));
-               BUG_ON (fibsize > (sizeof(struct hw_fib) - 
+               BUG_ON (fibsize > (dev->max_fib_size -
                                        sizeof(struct aac_fibhdr)));
                /*
                 *      Now send the Fib to the adapter
@@ -976,7 +1039,7 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid)
                fibsize = sizeof(struct aac_write64) + 
                        ((le32_to_cpu(writecmd->sg.count) - 1) * 
                         sizeof (struct sgentry64));
-               BUG_ON (fibsize > (sizeof(struct hw_fib) - 
+               BUG_ON (fibsize > (dev->max_fib_size -
                                        sizeof(struct aac_fibhdr)));
                /*
                 *      Now send the Fib to the adapter
@@ -998,15 +1061,11 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid)
                writecmd->sg.count = cpu_to_le32(1);
                /* ->stable is not used - it did mean which type of write */
 
-               if (count * 512 > (64 * 1024)) {
-                       BUG();
-               }
-
                aac_build_sg(scsicmd, &writecmd->sg);
                fibsize = sizeof(struct aac_write) + 
                        ((le32_to_cpu(writecmd->sg.count) - 1) * 
                         sizeof (struct sgentry));
-               BUG_ON (fibsize > (sizeof(struct hw_fib) - 
+               BUG_ON (fibsize > (dev->max_fib_size -
                                        sizeof(struct aac_fibhdr)));
                /*
                 *      Now send the Fib to the adapter
@@ -1025,7 +1084,6 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid)
         */
        if (status == -EINPROGRESS)
        {
-               dprintk("write queued.\n");
                return 0;
        }
 
@@ -1111,7 +1169,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid)
                return SCSI_MLQUEUE_DEVICE_BUSY;
 
        /*
-        *      Alocate and initialize a Fib
+        *      Allocate and initialize a Fib
         */
        if (!(cmd_fibcontext = 
            fib_alloc((struct aac_dev *)scsicmd->device->host->hostdata))) 
@@ -1403,7 +1461,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
                        /*
                         *      Unhandled commands
                         */
-                       printk(KERN_WARNING "Unhandled SCSI Command: 0x%x.\n", scsicmd->cmnd[0]);
+                       dprintk((KERN_WARNING "Unhandled SCSI Command: 0x%x.\n", scsicmd->cmnd[0]));
                        scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
                        set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
                                ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
@@ -1818,7 +1876,7 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
                fibsize = sizeof (struct aac_srb) - sizeof (struct sgentry) +
                        ((le32_to_cpu(srbcmd->sg.count) & 0xff) * 
                         sizeof (struct sgentry64));
-               BUG_ON (fibsize > (sizeof(struct hw_fib) - 
+               BUG_ON (fibsize > (dev->max_fib_size -
                                        sizeof(struct aac_fibhdr)));
 
                /*
@@ -1840,7 +1898,7 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
                fibsize = sizeof (struct aac_srb) + 
                        (((le32_to_cpu(srbcmd->sg.count) & 0xff) - 1) * 
                         sizeof (struct sgentry));
-               BUG_ON (fibsize > (sizeof(struct hw_fib) - 
+               BUG_ON (fibsize > (dev->max_fib_size -
                                        sizeof(struct aac_fibhdr)));
 
                /*
@@ -1893,7 +1951,9 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
                }
                /* hba wants the size to be exact */
                if(byte_count > scsicmd->request_bufflen){
-                       psg->sg[i-1].count -= (byte_count - scsicmd->request_bufflen);
+                       u32 temp = le32_to_cpu(psg->sg[i-1].count) - 
+                               (byte_count - scsicmd->request_bufflen);
+                       psg->sg[i-1].count = cpu_to_le32(temp);
                        byte_count = scsicmd->request_bufflen;
                }
                /* Check for command underflow */
@@ -1922,7 +1982,7 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
 {
        struct aac_dev *dev;
        unsigned long byte_count = 0;
-       u64 le_addr;
+       u64 addr;
 
        dev = (struct aac_dev *)scsicmd->device->host->hostdata;
        // Get rid of old data
@@ -1943,16 +2003,18 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
                byte_count = 0;
 
                for (i = 0; i < sg_count; i++) {
-                       le_addr = cpu_to_le64(sg_dma_address(sg));
-                       psg->sg[i].addr[1] = (u32)(le_addr>>32);
-                       psg->sg[i].addr[0] = (u32)(le_addr & 0xffffffff);
+                       addr = sg_dma_address(sg);
+                       psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
+                       psg->sg[i].addr[1] = cpu_to_le32(addr>>32);
                        psg->sg[i].count = cpu_to_le32(sg_dma_len(sg));
                        byte_count += sg_dma_len(sg);
                        sg++;
                }
                /* hba wants the size to be exact */
                if(byte_count > scsicmd->request_bufflen){
-                       psg->sg[i-1].count -= (byte_count - scsicmd->request_bufflen);
+                       u32 temp = le32_to_cpu(psg->sg[i-1].count) - 
+                               (byte_count - scsicmd->request_bufflen);
+                       psg->sg[i-1].count = cpu_to_le32(temp);
                        byte_count = scsicmd->request_bufflen;
                }
                /* Check for command underflow */
@@ -1962,15 +2024,14 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
                }
        }
        else if(scsicmd->request_bufflen) {
-               dma_addr_t addr; 
+               u64 addr; 
                addr = pci_map_single(dev->pdev,
                                scsicmd->request_buffer,
                                scsicmd->request_bufflen,
                                scsicmd->sc_data_direction);
                psg->count = cpu_to_le32(1);
-               le_addr = cpu_to_le64(addr);
-               psg->sg[0].addr[1] = (u32)(le_addr>>32);
-               psg->sg[0].addr[0] = (u32)(le_addr & 0xffffffff);
+               psg->sg[0].addr[0] = cpu_to_le32(addr & 0xffffffff);
+               psg->sg[0].addr[1] = cpu_to_le32(addr >> 32);
                psg->sg[0].count = cpu_to_le32(scsicmd->request_bufflen);  
                scsicmd->SCp.dma_handle = addr;
                byte_count = scsicmd->request_bufflen;
index 700d90331c1cd9346668336e56888a7d85e6fb6c..42484417cef7d9b1d89beead3a9fcd21b24abdee 100644 (file)
@@ -8,12 +8,18 @@
 
 #define MAXIMUM_NUM_CONTAINERS 32
 
-#define AAC_NUM_FIB            (256 + 64)
-#define AAC_NUM_IO_FIB         100
+#define AAC_NUM_MGT_FIB         8
+#define AAC_NUM_IO_FIB         (512 - AAC_NUM_MGT_FIB)
+#define AAC_NUM_FIB            (AAC_NUM_IO_FIB + AAC_NUM_MGT_FIB)
 
 #define AAC_MAX_LUN            (8)
 
 #define AAC_MAX_HOSTPHYSMEMPAGES (0xfffff)
+/*
+ *  max_sectors is an unsigned short, otherwise limit is 0x100000000 / 512
+ * Linux has starvation problems if we permit larger than 4MB I/O ...
+ */
+#define AAC_MAX_32BIT_SGBCOUNT ((unsigned short)8192)
 
 /*
  * These macros convert from physical channels to virtual channels
@@ -89,11 +95,21 @@ struct diskparm
  *     on 64 bit systems not all cards support the 64 bit version
  */
 struct sgentry {
+       __le32  addr;   /* 32-bit address. */
+       __le32  count;  /* Length. */
+};
+
+struct user_sgentry {
        u32     addr;   /* 32-bit address. */
        u32     count;  /* Length. */
 };
 
 struct sgentry64 {
+       __le32  addr[2];        /* 64-bit addr. 2 pieces for data alignment */
+       __le32  count;  /* Length. */
+};
+
+struct user_sgentry64 {
        u32     addr[2];        /* 64-bit addr. 2 pieces for data alignment */
        u32     count;  /* Length. */
 };
@@ -106,15 +122,25 @@ struct sgentry64 {
  */
 
 struct sgmap {
-       u32             count;
+       __le32          count;
        struct sgentry  sg[1]; 
 };
 
-struct sgmap64 {
+struct user_sgmap {
        u32             count;
+       struct user_sgentry     sg[1]; 
+};
+
+struct sgmap64 {
+       __le32          count;
        struct sgentry64 sg[1];
 };
 
+struct user_sgmap64 {
+       u32             count;
+       struct user_sgentry64 sg[1];
+};
+
 struct creation_info
 {
        u8              buildnum;               /* e.g., 588 */
@@ -123,14 +149,14 @@ struct creation_info
                                                 *       2 = API
                                                 */
        u8              year;                   /* e.g., 1997 = 97 */
-       u32             date;                   /*
+       __le32          date;                   /*
                                                 * unsigned     Month           :4;     // 1 - 12
                                                 * unsigned     Day             :6;     // 1 - 32
                                                 * unsigned     Hour            :6;     // 0 - 23
                                                 * unsigned     Minute          :6;     // 0 - 60
                                                 * unsigned     Second          :6;     // 0 - 60
                                                 */
-       u32             serial[2];                      /* e.g., 0x1DEADB0BFAFAF001 */
+       __le32          serial[2];                      /* e.g., 0x1DEADB0BFAFAF001 */
 };
 
 
@@ -175,8 +201,8 @@ struct creation_info
  */
 
 struct aac_entry {
-       u32 size;          /* Size in bytes of Fib which this QE points to */
-       u32 addr; /* Receiver address of the FIB */
+       __le32 size; /* Size in bytes of Fib which this QE points to */
+       __le32 addr; /* Receiver address of the FIB */
 };
 
 /*
@@ -185,9 +211,10 @@ struct aac_entry {
  */
  
 struct aac_qhdr {
-       u64 header_addr;                /* Address to hand the adapter to access to this queue head */
-       u32 *producer;                  /* The producer index for this queue (host address) */
-       u32 *consumer;                  /* The consumer index for this queue (host address) */
+       __le64 header_addr;/* Address to hand the adapter to access 
+                             to this queue head */
+       __le32 *producer; /* The producer index for this queue (host address) */
+       __le32 *consumer; /* The consumer index for this queue (host address) */
 };
 
 /*
@@ -261,29 +288,30 @@ enum aac_queue_types {
  */
 
 struct aac_fibhdr {
-       u32 XferState;                  // Current transfer state for this CCB
-       u16 Command;                    // Routing information for the destination
-       u8 StructType;                  // Type FIB
-       u8 Flags;                       // Flags for FIB
-       u16 Size;                       // Size of this FIB in bytes
-       u16 SenderSize;                 // Size of the FIB in the sender (for response sizing)
-       u32 SenderFibAddress;           // Host defined data in the FIB
-       u32 ReceiverFibAddress;         // Logical address of this FIB for the adapter
-       u32 SenderData;                 // Place holder for the sender to store data
+       __le32 XferState;       /* Current transfer state for this CCB */
+       __le16 Command;         /* Routing information for the destination */
+       u8 StructType;          /* Type FIB */
+       u8 Flags;               /* Flags for FIB */
+       __le16 Size;            /* Size of this FIB in bytes */
+       __le16 SenderSize;      /* Size of the FIB in the sender 
+                                  (for response sizing) */
+       __le32 SenderFibAddress;  /* Host defined data in the FIB */
+       __le32 ReceiverFibAddress;/* Logical address of this FIB for 
+                                    the adapter */
+       u32 SenderData;         /* Place holder for the sender to store data */
        union {
                struct {
-                   u32 _ReceiverTimeStart;     // Timestamp for receipt of fib
-                   u32 _ReceiverTimeDone;      // Timestamp for completion of fib
+                   __le32 _ReceiverTimeStart;  /* Timestamp for 
+                                                  receipt of fib */
+                   __le32 _ReceiverTimeDone;   /* Timestamp for 
+                                                  completion of fib */
                } _s;
        } _u;
 };
 
-#define FIB_DATA_SIZE_IN_BYTES (512 - sizeof(struct aac_fibhdr))
-
-
 struct hw_fib {
        struct aac_fibhdr header;
-       u8 data[FIB_DATA_SIZE_IN_BYTES];                // Command specific data
+       u8 data[512-sizeof(struct aac_fibhdr)]; // Command specific data
 };
 
 /*
@@ -345,11 +373,12 @@ struct hw_fib {
 #define                RequestAdapterInfo              703
 #define                IsAdapterPaused                 704
 #define                SendHostTime                    705
-#define                LastMiscCommand                 706
+#define                RequestSupplementAdapterInfo    706
+#define                LastMiscCommand                 707
 
-//
-// Commands that will target the failover level on the FSA adapter
-//
+/*
+ * Commands that will target the failover level on the FSA adapter
+ */
 
 enum fib_xfer_state {
        HostOwned                       = (1<<0),
@@ -382,22 +411,32 @@ enum fib_xfer_state {
  */
 
 #define ADAPTER_INIT_STRUCT_REVISION           3
+#define ADAPTER_INIT_STRUCT_REVISION_4         4 // rocket science
 
 struct aac_init
 {
-       u32     InitStructRevision;
-       u32     MiniPortRevision;
-       u32     fsrev;
-       u32     CommHeaderAddress;
-       u32     FastIoCommAreaAddress;
-       u32     AdapterFibsPhysicalAddress;
-       u32     AdapterFibsVirtualAddress;
-       u32     AdapterFibsSize;
-       u32     AdapterFibAlign;
-       u32     printfbuf;
-       u32     printfbufsiz;
-       u32     HostPhysMemPages;               // number of 4k pages of host physical memory
-       u32     HostElapsedSeconds;             // number of seconds since 1970.
+       __le32  InitStructRevision;
+       __le32  MiniPortRevision;
+       __le32  fsrev;
+       __le32  CommHeaderAddress;
+       __le32  FastIoCommAreaAddress;
+       __le32  AdapterFibsPhysicalAddress;
+       __le32  AdapterFibsVirtualAddress;
+       __le32  AdapterFibsSize;
+       __le32  AdapterFibAlign;
+       __le32  printfbuf;
+       __le32  printfbufsiz;
+       __le32  HostPhysMemPages;   /* number of 4k pages of host 
+                                      physical memory */
+       __le32  HostElapsedSeconds; /* number of seconds since 1970. */
+       /*
+        * ADAPTER_INIT_STRUCT_REVISION_4 begins here
+        */
+       __le32  InitFlags;      /* flags for supported features */
+#define INITFLAGS_NEW_COMM_SUPPORTED   0x00000001
+       __le32  MaxIoCommands;  /* max outstanding commands */
+       __le32  MaxIoSize;      /* largest I/O command */
+       __le32  MaxFibSize;     /* largest FIB to adapter */
 };
 
 enum aac_log_level {
@@ -421,7 +460,7 @@ struct adapter_ops
 {
        void (*adapter_interrupt)(struct aac_dev *dev);
        void (*adapter_notify)(struct aac_dev *dev, u32 event);
-       int  (*adapter_sync_cmd)(struct aac_dev *dev, u32 command, u32 p1, u32 *status);
+       int  (*adapter_sync_cmd)(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *status, u32 *r1, u32 *r2, u32 *r3, u32 *r4);
        int  (*adapter_check_health)(struct aac_dev *dev);
 };
 
@@ -541,6 +580,7 @@ struct sa_drawbridge_CSR {
 #define Mailbox3       SaDbCSR.MAILBOX3
 #define Mailbox4       SaDbCSR.MAILBOX4
 #define Mailbox5       SaDbCSR.MAILBOX5
+#define Mailbox6       SaDbCSR.MAILBOX6
 #define Mailbox7       SaDbCSR.MAILBOX7
        
 #define DoorbellReg_p SaDbCSR.PRISETIRQ
@@ -763,29 +803,48 @@ struct fib {
  
 struct aac_adapter_info
 {
-       u32     platform;
-       u32     cpu;
-       u32     subcpu;
-       u32     clock;
-       u32     execmem;
-       u32     buffermem;
-       u32     totalmem;
-       u32     kernelrev;
-       u32     kernelbuild;
-       u32     monitorrev;
-       u32     monitorbuild;
-       u32     hwrev;
-       u32     hwbuild;
-       u32     biosrev;
-       u32     biosbuild;
-       u32     cluster;
-       u32     clusterchannelmask; 
-       u32     serial[2];
-       u32     battery;
-       u32     options;
-       u32     OEM;
+       __le32  platform;
+       __le32  cpu;
+       __le32  subcpu;
+       __le32  clock;
+       __le32  execmem;
+       __le32  buffermem;
+       __le32  totalmem;
+       __le32  kernelrev;
+       __le32  kernelbuild;
+       __le32  monitorrev;
+       __le32  monitorbuild;
+       __le32  hwrev;
+       __le32  hwbuild;
+       __le32  biosrev;
+       __le32  biosbuild;
+       __le32  cluster;
+       __le32  clusterchannelmask; 
+       __le32  serial[2];
+       __le32  battery;
+       __le32  options;
+       __le32  OEM;
 };
 
+struct aac_supplement_adapter_info
+{
+       u8      AdapterTypeText[17+1];
+       u8      Pad[2];
+       __le32  FlashMemoryByteSize;
+       __le32  FlashImageId;
+       __le32  MaxNumberPorts;
+       __le32  Version;
+       __le32  FeatureBits;
+       u8      SlotNumber;
+       u8      ReservedPad0[0];
+       u8      BuildDate[12];
+       __le32  CurrentNumberPorts;
+       __le32  ReservedGrowth[24];
+};
+#define AAC_FEATURE_FALCON     0x00000010
+#define AAC_SIS_VERSION_V3     3
+#define AAC_SIS_SLOT_UNKNOWN   0xFF
+
 /*
  * Battery platforms
  */
@@ -830,6 +889,12 @@ struct aac_dev
        int                     id;
 
        u16                     irq_mask;
+       /*
+        *      negotiated FIB settings
+        */
+       unsigned                max_fib_size;
+       unsigned                sg_tablesize;
+
        /*
         *      Map for 128 fib objects (64k)
         */     
@@ -889,12 +954,14 @@ struct aac_dev
        u32                     aif_thread;
        struct completion       aif_completion;
        struct aac_adapter_info adapter_info;
+       struct aac_supplement_adapter_info supplement_adapter_info;
        /* These are in adapter info but they are in the io flow so
         * lets break them out so we don't have to do an AND to check them
         */
        u8                      nondasd_support; 
        u8                      dac_support;
        u8                      raid_scsi_mode;
+       u8                      printf_enabled;
 };
 
 #define aac_adapter_interrupt(dev) \
@@ -903,6 +970,8 @@ struct aac_dev
 #define aac_adapter_notify(dev, event) \
        (dev)->a_ops.adapter_notify(dev, event)
 
+#define aac_adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4) \
+       (dev)->a_ops.adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4)
 
 #define aac_adapter_check_health(dev) \
        (dev)->a_ops.adapter_check_health(dev)
@@ -1016,82 +1085,101 @@ struct aac_dev
 
 struct aac_read
 {
-       u32             command;
-       u32             cid;
-       u32             block;
-       u32             count;
+       __le32          command;
+       __le32          cid;
+       __le32          block;
+       __le32          count;
        struct sgmap    sg;     // Must be last in struct because it is variable
 };
 
 struct aac_read64
 {
-       u32             command;
-       u16             cid;
-       u16             sector_count;
-       u32             block;
-       u16             pad;
-       u16             flags;
+       __le32          command;
+       __le16          cid;
+       __le16          sector_count;
+       __le32          block;
+       __le16          pad;
+       __le16          flags;
        struct sgmap64  sg;     // Must be last in struct because it is variable
 };
 
 struct aac_read_reply
 {
-       u32             status;
-       u32             count;
+       __le32          status;
+       __le32          count;
 };
 
 struct aac_write
 {
-       u32             command;
-       u32             cid;
-       u32             block;
-       u32             count;
-       u32             stable; // Not used
+       __le32          command;
+       __le32          cid;
+       __le32          block;
+       __le32          count;
+       __le32          stable; // Not used
        struct sgmap    sg;     // Must be last in struct because it is variable
 };
 
 struct aac_write64
 {
-       u32             command;
-       u16             cid;
-       u16             sector_count;
-       u32             block;
-       u16             pad;
-       u16             flags;
+       __le32          command;
+       __le16          cid;
+       __le16          sector_count;
+       __le32          block;
+       __le16          pad;
+       __le16          flags;
        struct sgmap64  sg;     // Must be last in struct because it is variable
 };
 struct aac_write_reply
 {
-       u32             status;
-       u32             count;
-       u32             committed;
+       __le32          status;
+       __le32          count;
+       __le32          committed;
 };
 
 #define CT_FLUSH_CACHE 129
 struct aac_synchronize {
-       u32             command;        /* VM_ContainerConfig */
-       u32             type;           /* CT_FLUSH_CACHE */
-       u32             cid;
-       u32             parm1;
-       u32             parm2;
-       u32             parm3;
-       u32             parm4;
-       u32             count;  /* sizeof(((struct aac_synchronize_reply *)NULL)->data) */
+       __le32          command;        /* VM_ContainerConfig */
+       __le32          type;           /* CT_FLUSH_CACHE */
+       __le32          cid;
+       __le32          parm1;
+       __le32          parm2;
+       __le32          parm3;
+       __le32          parm4;
+       __le32          count;  /* sizeof(((struct aac_synchronize_reply *)NULL)->data) */
 };
 
 struct aac_synchronize_reply {
-       u32             dummy0;
-       u32             dummy1;
-       u32             status; /* CT_OK */
-       u32             parm1;
-       u32             parm2;
-       u32             parm3;
-       u32             parm4;
-       u32             parm5;
+       __le32          dummy0;
+       __le32          dummy1;
+       __le32          status; /* CT_OK */
+       __le32          parm1;
+       __le32          parm2;
+       __le32          parm3;
+       __le32          parm4;
+       __le32          parm5;
        u8              data[16];
 };
 
 struct aac_srb
+{
+       __le32          function;
+       __le32          channel;
+       __le32          id;
+       __le32          lun;
+       __le32          timeout;
+       __le32          flags;
+       __le32          count;          // Data xfer size
+       __le32          retry_limit;
+       __le32          cdb_size;
+       u8              cdb[16];
+       struct  sgmap   sg;
+};
+
+/*
+ * This and assocated data structs are used by the 
+ * ioctl caller and are in cpu order.
+ */
+struct user_aac_srb
 {
        u32             function;
        u32             channel;
@@ -1103,20 +1191,18 @@ struct aac_srb
        u32             retry_limit;
        u32             cdb_size;
        u8              cdb[16];
-       struct  sgmap   sg;
+       struct  user_sgmap      sg;
 };
 
-
-
 #define                AAC_SENSE_BUFFERSIZE     30
 
 struct aac_srb_reply
 {
-       u32             status;
-       u32             srb_status;
-       u32             scsi_status;
-       u32             data_xfer_length;
-       u32             sense_data_size;
+       __le32          status;
+       __le32          srb_status;
+       __le32          scsi_status;
+       __le32          data_xfer_length;
+       __le32          sense_data_size;
        u8              sense_data[AAC_SENSE_BUFFERSIZE]; // Can this be SCSI_SENSE_BUFFERSIZE
 };
 /*
@@ -1223,14 +1309,14 @@ struct aac_srb_reply
  */
 
 struct aac_fsinfo {
-       u32  fsTotalSize;       /* Consumed by fs, incl. metadata */
-       u32  fsBlockSize;
-       u32  fsFragSize;
-       u32  fsMaxExtendSize;
-       u32  fsSpaceUnits;
-       u32  fsMaxNumFiles;
-       u32  fsNumFreeFiles;
-       u32  fsInodeDensity;
+       __le32  fsTotalSize;    /* Consumed by fs, incl. metadata */
+       __le32  fsBlockSize;
+       __le32  fsFragSize;
+       __le32  fsMaxExtendSize;
+       __le32  fsSpaceUnits;
+       __le32  fsMaxNumFiles;
+       __le32  fsNumFreeFiles;
+       __le32  fsInodeDensity;
 };     /* valid iff ObjType == FT_FILESYS && !(ContentState & FSCS_NOTCLEAN) */
 
 union aac_contentinfo {
@@ -1243,32 +1329,32 @@ union aac_contentinfo {
 
 #define CT_GET_CONFIG_STATUS 147
 struct aac_get_config_status {
-       u32             command;        /* VM_ContainerConfig */
-       u32             type;           /* CT_GET_CONFIG_STATUS */
-       u32             parm1;
-       u32             parm2;
-       u32             parm3;
-       u32             parm4;
-       u32             parm5;
-       u32             count;  /* sizeof(((struct aac_get_config_status_resp *)NULL)->data) */
+       __le32          command;        /* VM_ContainerConfig */
+       __le32          type;           /* CT_GET_CONFIG_STATUS */
+       __le32          parm1;
+       __le32          parm2;
+       __le32          parm3;
+       __le32          parm4;
+       __le32          parm5;
+       __le32          count;  /* sizeof(((struct aac_get_config_status_resp *)NULL)->data) */
 };
 
 #define CFACT_CONTINUE 0
 #define CFACT_PAUSE    1
 #define CFACT_ABORT    2
 struct aac_get_config_status_resp {
-       u32             response; /* ST_OK */
-       u32             dummy0;
-       u32             status; /* CT_OK */
-       u32             parm1;
-       u32             parm2;
-       u32             parm3;
-       u32             parm4;
-       u32             parm5;
+       __le32          response; /* ST_OK */
+       __le32          dummy0;
+       __le32          status; /* CT_OK */
+       __le32          parm1;
+       __le32          parm2;
+       __le32          parm3;
+       __le32          parm4;
+       __le32          parm5;
        struct {
-               u32     action; /* CFACT_CONTINUE, CFACT_PAUSE or CFACT_ABORT */
-               u16     flags;
-               s16     count;
+               __le32  action; /* CFACT_CONTINUE, CFACT_PAUSE or CFACT_ABORT */
+               __le16  flags;
+               __le16  count;
        }               data;
 };
 
@@ -1279,26 +1365,26 @@ struct aac_get_config_status_resp {
 #define CT_COMMIT_CONFIG 152
 
 struct aac_commit_config {
-       u32             command;        /* VM_ContainerConfig */
-       u32             type;           /* CT_COMMIT_CONFIG */
+       __le32          command;        /* VM_ContainerConfig */
+       __le32          type;           /* CT_COMMIT_CONFIG */
 };
 
 /*
- *     Query for Container Configuration Count
+ *     Query for Container Configuration Status
  */
 
 #define CT_GET_CONTAINER_COUNT 4
 struct aac_get_container_count {
-       u32             command;        /* VM_ContainerConfig */
-       u32             type;           /* CT_GET_CONTAINER_COUNT */
+       __le32          command;        /* VM_ContainerConfig */
+       __le32          type;           /* CT_GET_CONTAINER_COUNT */
 };
 
 struct aac_get_container_count_resp {
-       u32             response; /* ST_OK */
-       u32             dummy0;
-       u32             MaxContainers;
-       u32             ContainerSwitchEntries;
-       u32             MaxPartitions;
+       __le32          response; /* ST_OK */
+       __le32          dummy0;
+       __le32          MaxContainers;
+       __le32          ContainerSwitchEntries;
+       __le32          MaxPartitions;
 };
 
 
@@ -1308,15 +1394,19 @@ struct aac_get_container_count_resp {
  */
 
 struct aac_mntent {
-       u32                     oid;
-       u8                      name[16];       // if applicable
-       struct creation_info    create_info;    // if applicable
-       u32                     capacity;
-       u32                     vol;            // substrate structure
-       u32                     obj;            // FT_FILESYS, FT_DATABASE, etc.
-       u32                     state;          // unready for mounting, readonly, etc.
-       union aac_contentinfo   fileinfo;       // Info specific to content manager (eg, filesystem)
-       u32                     altoid;         // != oid <==> snapshot or broken mirror exists
+       __le32                  oid;
+       u8                      name[16];       /* if applicable */
+       struct creation_info    create_info;    /* if applicable */
+       __le32                  capacity;
+       __le32                  vol;            /* substrate structure */
+       __le32                  obj;            /* FT_FILESYS, 
+                                                  FT_DATABASE, etc. */
+       __le32                  state;          /* unready for mounting, 
+                                                  readonly, etc. */
+       union aac_contentinfo   fileinfo;       /* Info specific to content 
+                                                  manager (eg, filesystem) */
+       __le32                  altoid;         /* != oid <==> snapshot or 
+                                                  broken mirror exists */
 };
 
 #define FSCS_NOTCLEAN  0x0001  /* fsck is neccessary before mounting */
@@ -1324,40 +1414,40 @@ struct aac_mntent {
 #define FSCS_HIDDEN    0x0004  /* should be ignored - set during a clear */
 
 struct aac_query_mount {
-       u32             command;
-       u32             type;
-       u32             count;
+       __le32          command;
+       __le32          type;
+       __le32          count;
 };
 
 struct aac_mount {
-       u32             status;
-       u32             type;           /* should be same as that requested */
-       u32             count;
+       __le32          status;
+       __le32          type;           /* should be same as that requested */
+       __le32          count;
        struct aac_mntent mnt[1];
 };
 
 #define CT_READ_NAME 130
 struct aac_get_name {
-       u32             command;        /* VM_ContainerConfig */
-       u32             type;           /* CT_READ_NAME */
-       u32             cid;
-       u32             parm1;
-       u32             parm2;
-       u32             parm3;
-       u32             parm4;
-       u32             count;  /* sizeof(((struct aac_get_name_resp *)NULL)->data) */
+       __le32          command;        /* VM_ContainerConfig */
+       __le32          type;           /* CT_READ_NAME */
+       __le32          cid;
+       __le32          parm1;
+       __le32          parm2;
+       __le32          parm3;
+       __le32          parm4;
+       __le32          count;  /* sizeof(((struct aac_get_name_resp *)NULL)->data) */
 };
 
 #define CT_OK        218
 struct aac_get_name_resp {
-       u32             dummy0;
-       u32             dummy1;
-       u32             status; /* CT_OK */
-       u32             parm1;
-       u32             parm2;
-       u32             parm3;
-       u32             parm4;
-       u32             parm5;
+       __le32          dummy0;
+       __le32          dummy1;
+       __le32          status; /* CT_OK */
+       __le32          parm1;
+       __le32          parm2;
+       __le32          parm3;
+       __le32          parm4;
+       __le32          parm5;
        u8              data[16];
 };
 
@@ -1366,8 +1456,8 @@ struct aac_get_name_resp {
  */
 
 struct aac_close {
-       u32     command;
-       u32     cid;
+       __le32  command;
+       __le32  cid;
 };
 
 struct aac_query_disk
@@ -1434,6 +1524,7 @@ struct revision
 #define FSACTL_GET_PCI_INFO                    CTL_CODE(2119, METHOD_BUFFERED)
 #define FSACTL_FORCE_DELETE_DISK               CTL_CODE(2120, METHOD_NEITHER)
 #define FSACTL_GET_CONTAINERS                  2131
+#define FSACTL_SEND_LARGE_FIB                  CTL_CODE(2138, METHOD_BUFFERED)
 
 
 struct aac_common
@@ -1573,8 +1664,8 @@ extern struct aac_common aac_config;
  */
 
 struct aac_aifcmd {
-       u32 command;            /* Tell host what type of notify this is */
-       u32 seqnum;             /* To allow ordering of reports (if necessary) */
+       __le32 command;         /* Tell host what type of notify this is */
+       __le32 seqnum;          /* To allow ordering of reports (if necessary) */
        u8 data[1];             /* Undefined length (from kernel viewpoint) */
 };
 
@@ -1597,7 +1688,6 @@ int fib_setup(struct aac_dev *dev);
 void fib_map_free(struct aac_dev *dev);
 void fib_free(struct fib * context);
 void fib_init(struct fib * context);
-void fib_dealloc(struct fib * context);
 void aac_printf(struct aac_dev *dev, u32 val);
 int fib_send(u16 command, struct fib * context, unsigned long size, int priority, int wait, int reply, fib_callback callback, void *ctxt);
 int aac_consumer_get(struct aac_dev * dev, struct aac_queue * q, struct aac_entry **entry);
@@ -1621,3 +1711,5 @@ int fib_adapter_complete(struct fib * fibptr, unsigned short size);
 struct aac_driver_ident* aac_get_driver_ident(int devtype);
 int aac_get_adapter_info(struct aac_dev* dev);
 int aac_send_shutdown(struct aac_dev *dev);
+extern int numacb;
+extern int acbsize;
index 30dd1f7120f4b53dc10de359a6ca81a9bc363598..1fef92d55dee1097888c4b2b6f52eacc1611d210 100644 (file)
  *     This routine sends a fib to the adapter on behalf of a user level
  *     program.
  */
+# define AAC_DEBUG_PREAMBLE    KERN_INFO
+# define AAC_DEBUG_POSTAMBLE
  
 static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
 {
        struct hw_fib * kfib;
        struct fib *fibptr;
+       struct hw_fib * hw_fib = (struct hw_fib *)0;
+       dma_addr_t hw_fib_pa = (dma_addr_t)0LL;
+       unsigned size;
+       int retval;
 
        fibptr = fib_alloc(dev);
-       if(fibptr == NULL)
+       if(fibptr == NULL) {
                return -ENOMEM;
+       }
                
        kfib = fibptr->hw_fib;
        /*
@@ -74,19 +81,24 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
         *      will not overrun the buffer when we copy the memory. Return
         *      an error if we would.
         */
-       if (le16_to_cpu(kfib->header.Size) > 
-                       sizeof(struct hw_fib) - sizeof(struct aac_fibhdr)) {
-               fib_free(fibptr);
-               return -EINVAL;
+       size = le16_to_cpu(kfib->header.Size) + sizeof(struct aac_fibhdr);
+       if (size < le16_to_cpu(kfib->header.SenderSize))
+               size = le16_to_cpu(kfib->header.SenderSize);
+       if (size > dev->max_fib_size) {
+               /* Highjack the hw_fib */
+               hw_fib = fibptr->hw_fib;
+               hw_fib_pa = fibptr->hw_fib_pa;
+               fibptr->hw_fib = kfib = pci_alloc_consistent(dev->pdev, size, &fibptr->hw_fib_pa);
+               memset(((char *)kfib) + dev->max_fib_size, 0, size - dev->max_fib_size);
+               memcpy(kfib, hw_fib, dev->max_fib_size);
        }
 
-       if (copy_from_user(kfib, arg, le16_to_cpu(kfib->header.Size) +
-                               sizeof(struct aac_fibhdr))) {
-               fib_free(fibptr);
-               return -EFAULT;
+       if (copy_from_user(kfib, arg, size)) {
+               retval = -EFAULT;
+               goto cleanup;
        }
 
-       if (kfib->header.Command == cpu_to_le32(TakeABreakPt)) {
+       if (kfib->header.Command == cpu_to_le16(TakeABreakPt)) {
                aac_adapter_interrupt(dev);
                /*
                 * Since we didn't really send a fib, zero out the state to allow 
@@ -94,16 +106,15 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
                 */
                kfib->header.XferState = 0;
        } else {
-               int retval = fib_send(kfib->header.Command, fibptr,
+               retval = fib_send(le16_to_cpu(kfib->header.Command), fibptr,
                                le16_to_cpu(kfib->header.Size) , FsaNormal,
                                1, 1, NULL, NULL);
                if (retval) {
-                       fib_free(fibptr);
-                       return retval;
+                       goto cleanup;
                }
                if (fib_complete(fibptr) != 0) {
-                       fib_free(fibptr);
-                       return -EINVAL;
+                       retval = -EINVAL;
+                       goto cleanup;
                }
        }
        /*
@@ -114,12 +125,17 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
         *      was already included by the adapter.)
         */
 
-       if (copy_to_user(arg, (void *)kfib, kfib->header.Size)) {
-               fib_free(fibptr);
-               return -EFAULT;
+       retval = 0;
+       if (copy_to_user(arg, (void *)kfib, size))
+               retval = -EFAULT;
+cleanup:
+       if (hw_fib) {
+               pci_free_consistent(dev->pdev, size, kfib, fibptr->hw_fib_pa);
+               fibptr->hw_fib_pa = hw_fib_pa;
+               fibptr->hw_fib = hw_fib;
        }
        fib_free(fibptr);
-       return 0;
+       return retval;
 }
 
 /**
@@ -391,26 +407,28 @@ static int check_revision(struct aac_dev *dev, void __user *arg)
        struct revision response;
 
        response.compat = 1;
-       response.version = dev->adapter_info.kernelrev;
-       response.build = dev->adapter_info.kernelbuild;
+       response.version = le32_to_cpu(dev->adapter_info.kernelrev);
+       response.build = le32_to_cpu(dev->adapter_info.kernelbuild);
 
        if (copy_to_user(arg, &response, sizeof(response)))
                return -EFAULT;
        return 0;
 }
 
+
 /**
  *
  * aac_send_raw_scb
  *
  */
 
-int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
+static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
 {
        struct fib* srbfib;
        int status;
-       struct aac_srb *srbcmd;
-       struct aac_srb __user *user_srb = arg;
+       struct aac_srb *srbcmd = NULL;
+       struct user_aac_srb *user_srbcmd = NULL;
+       struct user_aac_srb __user *user_srb = arg;
        struct aac_srb_reply __user *user_reply;
        struct aac_srb_reply* reply;
        u32 fibsize = 0;
@@ -426,50 +444,59 @@ int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
 
 
        if (!capable(CAP_SYS_ADMIN)){
-               printk(KERN_DEBUG"aacraid: No permission to send raw srb\n"); 
+               dprintk((KERN_DEBUG"aacraid: No permission to send raw srb\n")); 
                return -EPERM;
        }
        /*
         *      Allocate and initialize a Fib then setup a BlockWrite command
         */
        if (!(srbfib = fib_alloc(dev))) {
-               return -1;
+               return -ENOMEM;
        }
        fib_init(srbfib);
 
        srbcmd = (struct aac_srb*) fib_data(srbfib);
 
+       memset(sg_list, 0, sizeof(sg_list)); /* cleanup may take issue */
        if(copy_from_user(&fibsize, &user_srb->count,sizeof(u32))){
-               printk(KERN_DEBUG"aacraid: Could not copy data size from user\n"); 
+               dprintk((KERN_DEBUG"aacraid: Could not copy data size from user\n")); 
                rcode = -EFAULT;
                goto cleanup;
        }
 
-       if (fibsize > FIB_DATA_SIZE_IN_BYTES) {
+       if (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))) {
                rcode = -EINVAL;
                goto cleanup;
        }
 
-       if(copy_from_user(srbcmd, user_srb,fibsize)){
-               printk(KERN_DEBUG"aacraid: Could not copy srb from user\n"); 
+       user_srbcmd = kmalloc(GFP_KERNEL, fibsize);
+       if (!user_srbcmd) {
+               dprintk((KERN_DEBUG"aacraid: Could not make a copy of the srb\n"));
+               rcode = -ENOMEM;
+               goto cleanup;
+       }
+       if(copy_from_user(user_srbcmd, user_srb,fibsize)){
+               dprintk((KERN_DEBUG"aacraid: Could not copy srb from user\n")); 
                rcode = -EFAULT;
                goto cleanup;
        }
 
        user_reply = arg+fibsize;
 
-       flags = srbcmd->flags;
+       flags = user_srbcmd->flags; /* from user in cpu order */
        // Fix up srb for endian and force some values
+
        srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi);       // Force this
-       srbcmd->channel  = cpu_to_le32(srbcmd->channel);
-       srbcmd->id       = cpu_to_le32(srbcmd->id);
-       srbcmd->lun      = cpu_to_le32(srbcmd->lun);
-       srbcmd->flags    = cpu_to_le32(srbcmd->flags);
-       srbcmd->timeout  = cpu_to_le32(srbcmd->timeout);
-       srbcmd->retry_limit =cpu_to_le32(0); // Obsolete parameter
-       srbcmd->cdb_size = cpu_to_le32(srbcmd->cdb_size);
+       srbcmd->channel  = cpu_to_le32(user_srbcmd->channel);
+       srbcmd->id       = cpu_to_le32(user_srbcmd->id);
+       srbcmd->lun      = cpu_to_le32(user_srbcmd->lun);
+       srbcmd->timeout  = cpu_to_le32(user_srbcmd->timeout);
+       srbcmd->flags    = cpu_to_le32(flags);
+       srbcmd->retry_limit = 0; // Obsolete parameter
+       srbcmd->cdb_size = cpu_to_le32(user_srbcmd->cdb_size);
+       memcpy(srbcmd->cdb, user_srbcmd->cdb, sizeof(srbcmd->cdb));
        
-       switch (srbcmd->flags & (SRB_DataIn | SRB_DataOut)) {
+       switch (flags & (SRB_DataIn | SRB_DataOut)) {
        case SRB_DataOut:
                data_dir = DMA_TO_DEVICE;
                break;
@@ -482,118 +509,148 @@ int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
        default:
                data_dir = DMA_NONE;
        }
+       if (user_srbcmd->sg.count > (sizeof(sg_list)/sizeof(sg_list[0]))) {
+               dprintk((KERN_DEBUG"aacraid: too many sg entries %d\n",
+                 le32_to_cpu(srbcmd->sg.count)));
+               rcode = -EINVAL;
+               goto cleanup;
+       }
        if (dev->dac_support == 1) {
-               struct sgmap64* psg = (struct sgmap64*)&srbcmd->sg;
+               struct user_sgmap64* upsg = (struct user_sgmap64*)&user_srbcmd->sg;
+               struct sgmap64* psg = (struct sgmap64*)&user_srbcmd->sg;
+               struct user_sgmap* usg;
                byte_count = 0;
 
                /*
                 * This should also catch if user used the 32 bit sgmap
                 */
                actual_fibsize = sizeof(struct aac_srb) - 
-                       sizeof(struct sgentry) + ((srbcmd->sg.count & 0xff) * 
-                               sizeof(struct sgentry64));
+                       sizeof(struct sgentry) +
+                       ((upsg->count & 0xff) * 
+                       sizeof(struct sgentry));
                if(actual_fibsize != fibsize){ // User made a mistake - should not continue
-                       printk(KERN_DEBUG"aacraid: Bad Size specified in Raw SRB command\n");
+                       dprintk((KERN_DEBUG"aacraid: Bad Size specified in Raw SRB command\n"));
                        rcode = -EINVAL;
                        goto cleanup;
                }
-               if ((data_dir == DMA_NONE) && psg->count) { 
-                       printk(KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n");
+               usg = kmalloc(actual_fibsize - sizeof(struct aac_srb)
+                 + sizeof(struct sgmap), GFP_KERNEL);
+               if (!usg) {
+                       dprintk((KERN_DEBUG"aacraid: Allocation error in Raw SRB command\n"));
+                       rcode = -ENOMEM;
+                       goto cleanup;
+               }
+               memcpy (usg, upsg, actual_fibsize - sizeof(struct aac_srb)
+                 + sizeof(struct sgmap));
+               actual_fibsize = sizeof(struct aac_srb) - 
+                       sizeof(struct sgentry) + ((usg->count & 0xff) * 
+                               sizeof(struct sgentry64));
+               if ((data_dir == DMA_NONE) && upsg->count) {
+                       kfree (usg);
+                       dprintk((KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n"));
                        rcode = -EINVAL;
                        goto cleanup;
                }
 
-               for (i = 0; i < psg->count; i++) {
-                       dma_addr_t addr; 
-                       u64 le_addr;
+               for (i = 0; i < usg->count; i++) {
+                       u64 addr;
                        void* p;
-                       p = kmalloc(psg->sg[i].count,GFP_KERNEL|__GFP_DMA);
+                       /* Does this really need to be GFP_DMA? */
+                       p = kmalloc(usg->sg[i].count,GFP_KERNEL|__GFP_DMA);
                        if(p == 0) {
-                               printk(KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
-                               psg->sg[i].count,i,psg->count);
+                               kfree (usg);
+                               dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
+                                 usg->sg[i].count,i,usg->count));
                                rcode = -ENOMEM;
                                goto cleanup;
                        }
-                       sg_user[i] = (void __user *)psg->sg[i].addr;
+                       sg_user[i] = (void __user *)usg->sg[i].addr;
                        sg_list[i] = p; // save so we can clean up later
                        sg_indx = i;
 
                        if( flags & SRB_DataOut ){
-                               if(copy_from_user(p,sg_user[i],psg->sg[i].count)){
-                                       printk(KERN_DEBUG"aacraid: Could not copy sg data from user\n"); 
+                               if(copy_from_user(p,sg_user[i],upsg->sg[i].count)){
+                                       kfree (usg);
+                                       dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n")); 
                                        rcode = -EFAULT;
                                        goto cleanup;
                                }
                        }
-                       addr = pci_map_single(dev->pdev, p, psg->sg[i].count, data_dir);
+                       addr = pci_map_single(dev->pdev, p, usg->sg[i].count, data_dir);
 
-                       le_addr = cpu_to_le64(addr);
-                       psg->sg[i].addr[1] = (u32)(le_addr>>32);
-                       psg->sg[i].addr[0] = (u32)(le_addr & 0xffffffff);
-                       psg->sg[i].count = cpu_to_le32(psg->sg[i].count);  
-                       byte_count += psg->sg[i].count;
+                       psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
+                       psg->sg[i].addr[1] = cpu_to_le32(addr>>32);
+                       psg->sg[i].count = cpu_to_le32(usg->sg[i].count);  
+                       byte_count += usg->sg[i].count;
                }
+               kfree (usg);
 
                srbcmd->count = cpu_to_le32(byte_count);
+               psg->count = cpu_to_le32(sg_indx+1);
                status = fib_send(ScsiPortCommand64, srbfib, actual_fibsize, FsaNormal, 1, 1,NULL,NULL);
        } else {
+               struct user_sgmap* upsg = &user_srbcmd->sg;
                struct sgmap* psg = &srbcmd->sg;
                byte_count = 0;
 
-               actual_fibsize = sizeof (struct aac_srb) + 
-                       (((le32_to_cpu(srbcmd->sg.count) & 0xff) - 1) * 
-                        sizeof (struct sgentry));
+               actual_fibsize = sizeof (struct aac_srb) + (((user_srbcmd->sg.count & 0xff) - 1) * sizeof (struct sgentry));
                if(actual_fibsize != fibsize){ // User made a mistake - should not continue
-                       printk(KERN_DEBUG"aacraid: Bad Size specified in Raw SRB command\n");
+                       dprintk((KERN_DEBUG"aacraid: Bad Size specified in Raw SRB command\n"));
                        rcode = -EINVAL;
                        goto cleanup;
                }
-               if ((data_dir == DMA_NONE) && psg->count) {
-                       printk(KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n");
+               if ((data_dir == DMA_NONE) && upsg->count) {
+                       dprintk((KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n"));
                        rcode = -EINVAL;
                        goto cleanup;
                }
-               for (i = 0; i < psg->count; i++) {
+               for (i = 0; i < upsg->count; i++) {
                        dma_addr_t addr; 
                        void* p;
-                       p = kmalloc(psg->sg[i].count,GFP_KERNEL);
+                       p = kmalloc(upsg->sg[i].count, GFP_KERNEL);
                        if(p == 0) {
-                               printk(KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
-                               psg->sg[i].count,i,psg->count);
+                               dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
+                                 upsg->sg[i].count, i, upsg->count));
                                rcode = -ENOMEM;
                                goto cleanup;
                        }
-                       sg_user[i] = (void __user *)(psg->sg[i].addr);
+                       sg_user[i] = (void __user *)upsg->sg[i].addr;
                        sg_list[i] = p; // save so we can clean up later
                        sg_indx = i;
 
                        if( flags & SRB_DataOut ){
-                               if(copy_from_user(p,sg_user[i],psg->sg[i].count)){
-                                       printk(KERN_DEBUG"aacraid: Could not copy sg data from user\n"); 
+                               if(copy_from_user(p, sg_user[i],
+                                               upsg->sg[i].count)) {
+                                       dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n")); 
                                        rcode = -EFAULT;
                                        goto cleanup;
                                }
                        }
-                       addr = pci_map_single(dev->pdev, p, psg->sg[i].count, data_dir);
+                       addr = pci_map_single(dev->pdev, p,
+                               upsg->sg[i].count, data_dir);
 
                        psg->sg[i].addr = cpu_to_le32(addr);
-                       psg->sg[i].count = cpu_to_le32(psg->sg[i].count);  
-                       byte_count += psg->sg[i].count;
+                       psg->sg[i].count = cpu_to_le32(upsg->sg[i].count);  
+                       byte_count += upsg->sg[i].count;
                }
                srbcmd->count = cpu_to_le32(byte_count);
+               psg->count = cpu_to_le32(sg_indx+1);
                status = fib_send(ScsiPortCommand, srbfib, actual_fibsize, FsaNormal, 1, 1, NULL, NULL);
        }
 
        if (status != 0){
-               printk(KERN_DEBUG"aacraid: Could not send raw srb fib to hba\n"); 
-               rcode = -1;
+               dprintk((KERN_DEBUG"aacraid: Could not send raw srb fib to hba\n")); 
+               rcode = -ENXIO;
                goto cleanup;
        }
 
        if( flags & SRB_DataIn ) {
                for(i = 0 ; i <= sg_indx; i++){
-                       if(copy_to_user(sg_user[i],sg_list[i],le32_to_cpu(srbcmd->sg.sg[i].count))){
-                               printk(KERN_DEBUG"aacraid: Could not copy sg data to user\n"); 
+                       byte_count = le32_to_cpu((dev->dac_support == 1)
+                             ? ((struct sgmap64*)&srbcmd->sg)->sg[i].count
+                             : srbcmd->sg.sg[i].count);
+                       if(copy_to_user(sg_user[i], sg_list[i], byte_count)){
+                               dprintk((KERN_DEBUG"aacraid: Could not copy sg data to user\n")); 
                                rcode = -EFAULT;
                                goto cleanup;
 
@@ -603,12 +660,13 @@ int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
 
        reply = (struct aac_srb_reply *) fib_data(srbfib);
        if(copy_to_user(user_reply,reply,sizeof(struct aac_srb_reply))){
-               printk(KERN_DEBUG"aacraid: Could not copy reply to user\n"); 
+               dprintk((KERN_DEBUG"aacraid: Could not copy reply to user\n")); 
                rcode = -EFAULT;
                goto cleanup;
        }
 
 cleanup:
+       kfree(user_srbcmd);
        for(i=0; i <= sg_indx; i++){
                kfree(sg_list[i]);
        }
@@ -618,14 +676,13 @@ cleanup:
        return rcode;
 }
 
-
 struct aac_pci_info {
         u32 bus;
         u32 slot;
 };
 
 
-int aac_get_pci_info(struct aac_dev* dev, void __user *arg)
+static int aac_get_pci_info(struct aac_dev* dev, void __user *arg)
 {
         struct aac_pci_info pci_info;
 
@@ -633,11 +690,11 @@ int aac_get_pci_info(struct aac_dev* dev, void __user *arg)
        pci_info.slot = PCI_SLOT(dev->pdev->devfn);
 
        if (copy_to_user(arg, &pci_info, sizeof(struct aac_pci_info))) {
-               printk(KERN_DEBUG "aacraid: Could not copy pci info\n");
+               dprintk((KERN_DEBUG "aacraid: Could not copy pci info\n"));
                return -EFAULT;
        }
         return 0;
- }
+}
  
 
 int aac_do_ioctl(struct aac_dev * dev, int cmd, void __user *arg)
@@ -656,6 +713,7 @@ int aac_do_ioctl(struct aac_dev * dev, int cmd, void __user *arg)
        case FSACTL_MINIPORT_REV_CHECK:
                status = check_revision(dev, arg);
                break;
+       case FSACTL_SEND_LARGE_FIB:
        case FSACTL_SENDFIB:
                status = ioctl_send_fib(dev, arg);
                break;
index 6832a55ca907bd6501945dfac15eab4cbbf2c4de..43557bf661f63098a2754c3fa255b693d02979c2 100644 (file)
@@ -39,6 +39,7 @@
 #include <linux/blkdev.h>
 #include <linux/completion.h>
 #include <linux/mm.h>
+#include <scsi/scsi_host.h>
 #include <asm/semaphore.h>
 
 #include "aacraid.h"
@@ -49,8 +50,8 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
 {
        unsigned char *base;
        unsigned long size, align;
-       unsigned long fibsize = 4096;
-       unsigned long printfbufsiz = 256;
+       const unsigned long fibsize = 4096;
+       const unsigned long printfbufsiz = 256;
        struct aac_init *init;
        dma_addr_t phys;
 
@@ -74,6 +75,8 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
        init = dev->init;
 
        init->InitStructRevision = cpu_to_le32(ADAPTER_INIT_STRUCT_REVISION);
+       if (dev->max_fib_size != sizeof(struct hw_fib))
+               init->InitStructRevision = cpu_to_le32(ADAPTER_INIT_STRUCT_REVISION_4);
        init->MiniPortRevision = cpu_to_le32(Sa_MINIPORT_REVISION);
        init->fsrev = cpu_to_le32(dev->fsrev);
 
@@ -110,6 +113,10 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
                init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES);
        }
 
+       init->InitFlags = 0;
+       init->MaxIoCommands = cpu_to_le32(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB);
+       init->MaxIoSize = cpu_to_le32(dev->scsi_host_ptr->max_sectors << 9);
+       init->MaxFibSize = cpu_to_le32(dev->max_fib_size);
 
        /*
         * Increment the base address by the amount already used
@@ -152,8 +159,8 @@ static void aac_queue_init(struct aac_dev * dev, struct aac_queue * q, u32 *mem,
        init_waitqueue_head(&q->qfull);
        spin_lock_init(&q->lockdata);
        q->lock = &q->lockdata;
-       q->headers.producer = mem;
-       q->headers.consumer = mem+1;
+       q->headers.producer = (__le32 *)mem;
+       q->headers.consumer = (__le32 *)(mem+1);
        *(q->headers.producer) = cpu_to_le32(qsize);
        *(q->headers.consumer) = cpu_to_le32(qsize);
        q->entries = qsize;
@@ -173,6 +180,8 @@ int aac_send_shutdown(struct aac_dev * dev)
        int status;
 
        fibctx = fib_alloc(dev);
+       if (!fibctx)
+               return -ENOMEM;
        fib_init(fibctx);
 
        cmd = (struct aac_close *) fib_data(fibctx);
@@ -204,7 +213,7 @@ int aac_send_shutdown(struct aac_dev * dev)
  *             0 - If there were errors initing. This is a fatal error.
  */
  
-int aac_comm_init(struct aac_dev * dev)
+static int aac_comm_init(struct aac_dev * dev)
 {
        unsigned long hdrsize = (sizeof(u32) * NUMBER_OF_COMM_QUEUES) * 2;
        unsigned long queuesize = sizeof(struct aac_entry) * TOTAL_QUEUE_ENTRIES;
@@ -293,6 +302,79 @@ int aac_comm_init(struct aac_dev * dev)
 
 struct aac_dev *aac_init_adapter(struct aac_dev *dev)
 {
+       u32 status[5];
+       struct Scsi_Host * host = dev->scsi_host_ptr;
+
+       /*
+        *      Check the preferred comm settings, defaults from template.
+        */
+       dev->max_fib_size = sizeof(struct hw_fib);
+       dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size
+               - sizeof(struct aac_fibhdr)
+               - sizeof(struct aac_write) + sizeof(struct sgmap))
+                       / sizeof(struct sgmap);
+       if ((!aac_adapter_sync_cmd(dev, GET_COMM_PREFERRED_SETTINGS,
+         0, 0, 0, 0, 0, 0,
+         status+0, status+1, status+2, status+3, status+4))
+        && (status[0] == 0x00000001)) {
+               /*
+                *      status[1] >> 16         maximum command size in KB
+                *      status[1] & 0xFFFF      maximum FIB size
+                *      status[2] >> 16         maximum SG elements to driver
+                *      status[2] & 0xFFFF      maximum SG elements from driver
+                *      status[3] & 0xFFFF      maximum number FIBs outstanding
+                */
+               host->max_sectors = (status[1] >> 16) << 1;
+               dev->max_fib_size = status[1] & 0xFFFF;
+               host->sg_tablesize = status[2] >> 16;
+               dev->sg_tablesize = status[2] & 0xFFFF;
+               host->can_queue = (status[3] & 0xFFFF) - AAC_NUM_MGT_FIB;
+               /*
+                *      NOTE:
+                *      All these overrides are based on a fixed internal
+                *      knowledge and understanding of existing adapters,
+                *      acbsize should be set with caution.
+                */
+               if (acbsize == 512) {
+                       host->max_sectors = AAC_MAX_32BIT_SGBCOUNT;
+                       dev->max_fib_size = 512;
+                       dev->sg_tablesize = host->sg_tablesize
+                         = (512 - sizeof(struct aac_fibhdr)
+                           - sizeof(struct aac_write) + sizeof(struct sgmap))
+                            / sizeof(struct sgmap);
+                       host->can_queue = AAC_NUM_IO_FIB;
+               } else if (acbsize == 2048) {
+                       host->max_sectors = 512;
+                       dev->max_fib_size = 2048;
+                       host->sg_tablesize = 65;
+                       dev->sg_tablesize = 81;
+                       host->can_queue = 512 - AAC_NUM_MGT_FIB;
+               } else if (acbsize == 4096) {
+                       host->max_sectors = 1024;
+                       dev->max_fib_size = 4096;
+                       host->sg_tablesize = 129;
+                       dev->sg_tablesize = 166;
+                       host->can_queue = 256 - AAC_NUM_MGT_FIB;
+               } else if (acbsize == 8192) {
+                       host->max_sectors = 2048;
+                       dev->max_fib_size = 8192;
+                       host->sg_tablesize = 257;
+                       dev->sg_tablesize = 337;
+                       host->can_queue = 128 - AAC_NUM_MGT_FIB;
+               } else if (acbsize > 0) {
+                       printk("Illegal acbsize=%d ignored\n", acbsize);
+               }
+       }
+       {
+
+               if (numacb > 0) {
+                       if (numacb < host->can_queue)
+                               host->can_queue = numacb;
+                       else
+                               printk("numacb=%d ignored\n", numacb);
+               }
+       }
+
        /*
         *      Ok now init the communication subsystem
         */
index 3f36dbaa2bb32b1452ee2267dd4d2cc7eb83f584..5322865942e28b1a3911d83a8d2d6104263dd869 100644 (file)
@@ -25,7 +25,7 @@
  *  commsup.c
  *
  * Abstract: Contain all routines that are required for FSA host/adapter
- *    commuication.
+ *    communication.
  *
  */
 
@@ -38,6 +38,7 @@
 #include <linux/slab.h>
 #include <linux/completion.h>
 #include <linux/blkdev.h>
+#include <scsi/scsi_host.h>
 #include <asm/semaphore.h>
 
 #include "aacraid.h"
  
 static int fib_map_alloc(struct aac_dev *dev)
 {
-       if((dev->hw_fib_va = pci_alloc_consistent(dev->pdev, sizeof(struct hw_fib) * AAC_NUM_FIB, &dev->hw_fib_pa))==NULL)
+       dprintk((KERN_INFO
+         "allocate hardware fibs pci_alloc_consistent(%p, %d * (%d + %d), %p)\n",
+         dev->pdev, dev->max_fib_size, dev->scsi_host_ptr->can_queue,
+         AAC_NUM_MGT_FIB, &dev->hw_fib_pa));
+       if((dev->hw_fib_va = pci_alloc_consistent(dev->pdev, dev->max_fib_size
+         * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB),
+         &dev->hw_fib_pa))==NULL)
                return -ENOMEM;
        return 0;
 }
@@ -67,7 +74,7 @@ static int fib_map_alloc(struct aac_dev *dev)
 
 void fib_map_free(struct aac_dev *dev)
 {
-       pci_free_consistent(dev->pdev, sizeof(struct hw_fib) * AAC_NUM_FIB, dev->hw_fib_va, dev->hw_fib_pa);
+       pci_free_consistent(dev->pdev, dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB), dev->hw_fib_va, dev->hw_fib_pa);
 }
 
 /**
@@ -84,17 +91,22 @@ int fib_setup(struct aac_dev * dev)
        struct hw_fib *hw_fib_va;
        dma_addr_t hw_fib_pa;
        int i;
-       
-       if(fib_map_alloc(dev)<0)
+
+       while (((i = fib_map_alloc(dev)) == -ENOMEM)
+        && (dev->scsi_host_ptr->can_queue > (64 - AAC_NUM_MGT_FIB))) {
+               dev->init->MaxIoCommands = cpu_to_le32((dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) >> 1);
+               dev->scsi_host_ptr->can_queue = le32_to_cpu(dev->init->MaxIoCommands) - AAC_NUM_MGT_FIB;
+       }
+       if (i<0)
                return -ENOMEM;
                
        hw_fib_va = dev->hw_fib_va;
        hw_fib_pa = dev->hw_fib_pa;
-       memset(hw_fib_va, 0, sizeof(struct hw_fib) * AAC_NUM_FIB);
+       memset(hw_fib_va, 0, dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB));
        /*
         *      Initialise the fibs
         */
-       for (i = 0, fibptr = &dev->fibs[i]; i < AAC_NUM_FIB; i++, fibptr++) 
+       for (i = 0, fibptr = &dev->fibs[i]; i < (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); i++, fibptr++) 
        {
                fibptr->dev = dev;
                fibptr->hw_fib = hw_fib_va;
@@ -102,16 +114,16 @@ int fib_setup(struct aac_dev * dev)
                fibptr->next = fibptr+1;        /* Forward chain the fibs */
                init_MUTEX_LOCKED(&fibptr->event_wait);
                spin_lock_init(&fibptr->event_lock);
-               hw_fib_va->header.XferState = 0xffffffff;
-               hw_fib_va->header.SenderSize = cpu_to_le16(sizeof(struct hw_fib));
+               hw_fib_va->header.XferState = cpu_to_le32(0xffffffff);
+               hw_fib_va->header.SenderSize = cpu_to_le16(dev->max_fib_size);
                fibptr->hw_fib_pa = hw_fib_pa;
-               hw_fib_va = (struct hw_fib *)((unsigned char *)hw_fib_va + sizeof(struct hw_fib));
-               hw_fib_pa = hw_fib_pa + sizeof(struct hw_fib); 
+               hw_fib_va = (struct hw_fib *)((unsigned char *)hw_fib_va + dev->max_fib_size);
+               hw_fib_pa = hw_fib_pa + dev->max_fib_size;
        }
        /*
         *      Add the fib chain to the free list
         */
-       dev->fibs[AAC_NUM_FIB-1].next = NULL;
+       dev->fibs[dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB - 1].next = NULL;
        /*
         *      Enable this to debug out of queue space
         */
@@ -124,7 +136,7 @@ int fib_setup(struct aac_dev * dev)
  *     @dev: Adapter to allocate the fib for
  *
  *     Allocate a fib from the adapter fib pool. If the pool is empty we
- *     wait for fibs to become free.
+ *     return NULL.
  */
  
 struct fib * fib_alloc(struct aac_dev *dev)
@@ -133,10 +145,10 @@ struct fib * fib_alloc(struct aac_dev *dev)
        unsigned long flags;
        spin_lock_irqsave(&dev->fib_lock, flags);
        fibptr = dev->free_fib; 
-       /* Cannot sleep here or you get hangs. Instead we did the
-          maths at compile time. */
-       if(!fibptr)
-               BUG();
+       if(!fibptr){
+               spin_unlock_irqrestore(&dev->fib_lock, flags);
+               return fibptr;
+       }
        dev->free_fib = fibptr->next;
        spin_unlock_irqrestore(&dev->fib_lock, flags);
        /*
@@ -196,11 +208,11 @@ void fib_init(struct fib *fibptr)
        struct hw_fib *hw_fib = fibptr->hw_fib;
 
        hw_fib->header.StructType = FIB_MAGIC;
-       hw_fib->header.Size = cpu_to_le16(sizeof(struct hw_fib));
-        hw_fib->header.XferState = cpu_to_le32(HostOwned | FibInitialized | FibEmpty | FastResponseCapable);
+       hw_fib->header.Size = cpu_to_le16(fibptr->dev->max_fib_size);
+       hw_fib->header.XferState = cpu_to_le32(HostOwned | FibInitialized | FibEmpty | FastResponseCapable);
        hw_fib->header.SenderFibAddress = cpu_to_le32(fibptr->hw_fib_pa);
        hw_fib->header.ReceiverFibAddress = cpu_to_le32(fibptr->hw_fib_pa);
-       hw_fib->header.SenderSize = cpu_to_le16(sizeof(struct hw_fib));
+       hw_fib->header.SenderSize = cpu_to_le16(fibptr->dev->max_fib_size);
 }
 
 /**
@@ -211,7 +223,7 @@ void fib_init(struct fib *fibptr)
  *     caller.
  */
  
-void fib_dealloc(struct fib * fibptr)
+static void fib_dealloc(struct fib * fibptr)
 {
        struct hw_fib *hw_fib = fibptr->hw_fib;
        if(hw_fib->header.StructType != FIB_MAGIC) 
@@ -279,7 +291,7 @@ static int aac_get_entry (struct aac_dev * dev, u32 qid, struct aac_entry **entr
        }
 
         if ((*index + 1) == le32_to_cpu(*(q->headers.consumer))) { /* Queue is full */
-               printk(KERN_WARNING "Queue %d full, %d outstanding.\n",
+               printk(KERN_WARNING "Queue %d full, %u outstanding.\n",
                                qid, q->numpending);
                return 0;
        } else {
@@ -658,9 +670,8 @@ int fib_adapter_complete(struct fib * fibptr, unsigned short size)
                        }
                        if (aac_insert_entry(dev, index, AdapHighRespQueue,  (nointr & (int)aac_config.irq_mod)) != 0) {
                        }
-               }
-               else if (hw_fib->header.XferState & NormalPriority) 
-               {
+               } else if (hw_fib->header.XferState & 
+                               cpu_to_le32(NormalPriority)) {
                        u32 index;
 
                        if (size) {
@@ -744,22 +755,25 @@ int fib_complete(struct fib * fibptr)
 
 void aac_printf(struct aac_dev *dev, u32 val)
 {
-       int length = val & 0xffff;
-       int level = (val >> 16) & 0xffff;
        char *cp = dev->printfbuf;
-       
-       /*
-        *      The size of the printfbuf is set in port.c
-        *      There is no variable or define for it
-        */
-       if (length > 255)
-               length = 255;
-       if (cp[length] != 0)
-               cp[length] = 0;
-       if (level == LOG_AAC_HIGH_ERROR)
-               printk(KERN_WARNING "aacraid:%s", cp);
-       else
-               printk(KERN_INFO "aacraid:%s", cp);
+       if (dev->printf_enabled)
+       {
+               int length = val & 0xffff;
+               int level = (val >> 16) & 0xffff;
+               
+               /*
+                *      The size of the printfbuf is set in port.c
+                *      There is no variable or define for it
+                */
+               if (length > 255)
+                       length = 255;
+               if (cp[length] != 0)
+                       cp[length] = 0;
+               if (level == LOG_AAC_HIGH_ERROR)
+                       printk(KERN_WARNING "aacraid:%s", cp);
+               else
+                       printk(KERN_INFO "aacraid:%s", cp);
+       }
        memset(cp, 0,  256);
 }
 
@@ -832,8 +846,8 @@ int aac_command_thread(struct aac_dev * dev)
                        aifcmd = (struct aac_aifcmd *) hw_fib->data;
                        if (aifcmd->command == cpu_to_le32(AifCmdDriverNotify)) {
                                /* Handle Driver Notify Events */
-                               *(u32 *)hw_fib->data = cpu_to_le32(ST_OK);
-                               fib_adapter_complete(fib, sizeof(u32));
+                               *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK);
+                               fib_adapter_complete(fib, (u16)sizeof(u32));
                        } else {
                                struct list_head *entry;
                                /* The u32 here is important and intended. We are using
@@ -916,7 +930,7 @@ int aac_command_thread(struct aac_dev * dev)
                                /*
                                 *      Set the status of this FIB
                                 */
-                               *(u32 *)hw_fib->data = cpu_to_le32(ST_OK);
+                               *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK);
                                fib_adapter_complete(fib, sizeof(u32));
                                spin_unlock_irqrestore(&dev->fib_lock, flagv);
                        }
index 8480b427a6d9398162c289eb164696d489203080..be2e98de9fabc565f25e2e9357224698af033e4d 100644 (file)
@@ -99,7 +99,7 @@ unsigned int aac_response_normal(struct aac_queue * q)
                        /*
                         *      Doctor the fib
                         */
-                       *(u32 *)hwfib->data = cpu_to_le32(ST_OK);
+                       *(__le32 *)hwfib->data = cpu_to_le32(ST_OK);
                        hwfib->header.XferState |= cpu_to_le32(AdapterProcessed);
                }
 
@@ -107,7 +107,7 @@ unsigned int aac_response_normal(struct aac_queue * q)
 
                if (hwfib->header.Command == cpu_to_le16(NuFileSystem))
                {
-                       u32 *pstatus = (u32 *)hwfib->data;
+                       __le32 *pstatus = (__le32 *)hwfib->data;
                        if (*pstatus & cpu_to_le32(0xffff0000))
                                *pstatus = cpu_to_le32(ST_OK);
                }
@@ -205,7 +205,7 @@ unsigned int aac_command_normal(struct aac_queue *q)
                        /*
                         *      Set the status of this FIB
                         */
-                       *(u32 *)hw_fib->data = cpu_to_le32(ST_OK);
+                       *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK);
                        fib_adapter_complete(fib, sizeof(u32));
                        spin_lock_irqsave(q->lock, flags);
                }               
index 242fa77513f5a6e3502d2ae12cf3be65ff82853c..f7e9c89c491548ce40080d0c355f4b0f98492602 100644 (file)
@@ -215,7 +215,7 @@ static int aac_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd
  *     Returns a static string describing the device in question
  */
 
-const char *aac_info(struct Scsi_Host *shost)
+static const char *aac_info(struct Scsi_Host *shost)
 {
        struct aac_dev *dev = (struct aac_dev *)shost->hostdata;
        return aac_drivers[dev->cardtype].name;
@@ -288,7 +288,7 @@ static int aac_biosparm(struct scsi_device *sdev, struct block_device *bdev,
         *      translations ( 64/32, 128/32, 255/63 ).
         */
        buf = scsi_bios_ptable(bdev);
-       if(*(unsigned short *)(buf + 0x40) == cpu_to_le16(0xaa55)) {
+       if(*(__le16 *)(buf + 0x40) == cpu_to_le16(0xaa55)) {
                struct partition *first = (struct partition * )buf;
                struct partition *entry = first;
                int saved_cylinders = param->cylinders;
@@ -347,10 +347,16 @@ static int aac_biosparm(struct scsi_device *sdev, struct block_device *bdev,
 
 static int aac_slave_configure(struct scsi_device *sdev)
 {
+       struct Scsi_Host *host = sdev->host;
+
        if (sdev->tagged_supported)
                scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, 128);
        else
                scsi_adjust_queue_depth(sdev, 0, 1);
+
+       if (host->max_sectors < AAC_MAX_32BIT_SGBCOUNT)
+               blk_queue_max_segment_size(sdev->request_queue, 65536);
+
        return 0;
 }
 
@@ -360,14 +366,6 @@ static int aac_ioctl(struct scsi_device *sdev, int cmd, void __user * arg)
        return aac_do_ioctl(dev, cmd, arg);
 }
 
-/*
- * XXX: does aac really need no error handling??
- */
-static int aac_eh_abort(struct scsi_cmnd *cmd)
-{
-       return FAILED;
-}
-
 /*
  *     aac_eh_reset    - Reset command handling
  *     @scsi_cmd:      SCSI command block causing the reset
@@ -386,10 +384,13 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
                                        AAC_DRIVERNAME);
 
 
+       spin_lock_irq(host->host_lock);
+
        aac = (struct aac_dev *)host->hostdata;
        if (aac_adapter_check_health(aac)) {
                printk(KERN_ERR "%s: Host adapter appears dead\n", 
                                AAC_DRIVERNAME);
+               spin_unlock_irq(host->host_lock);
                return -ENODEV;
        }
        /*
@@ -420,6 +421,7 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
                ssleep(1);
                spin_lock_irq(host->host_lock);
        }
+       spin_unlock_irq(host->host_lock);
        printk(KERN_ERR "%s: SCSI bus appears hung\n", AAC_DRIVERNAME);
        return -ETIMEDOUT;
 }
@@ -439,11 +441,11 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
 static int aac_cfg_open(struct inode *inode, struct file *file)
 {
        struct aac_dev *aac;
-       unsigned minor = iminor(inode);
+       unsigned minor_number = iminor(inode);
        int err = -ENODEV;
 
        list_for_each_entry(aac, &aac_devices, entry) {
-               if (aac->id == minor) {
+               if (aac->id == minor_number) {
                        file->private_data = aac;
                        err = 0;
                        break;
@@ -489,6 +491,7 @@ static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long
        case FSACTL_DELETE_DISK:
        case FSACTL_FORCE_DELETE_DISK:
        case FSACTL_GET_CONTAINERS: 
+       case FSACTL_SEND_LARGE_FIB:
                ret = aac_do_ioctl(dev, cmd, (void __user *)arg);
                break;
 
@@ -526,6 +529,134 @@ static long aac_compat_cfg_ioctl(struct file *file, unsigned cmd, unsigned long
 }
 #endif
 
+static ssize_t aac_show_model(struct class_device *class_dev,
+               char *buf)
+{
+       struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
+       int len;
+
+       len = snprintf(buf, PAGE_SIZE, "%s\n",
+                 aac_drivers[dev->cardtype].model);
+       return len;
+}
+
+static ssize_t aac_show_vendor(struct class_device *class_dev,
+               char *buf)
+{
+       struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
+       int len;
+
+       len = snprintf(buf, PAGE_SIZE, "%s\n",
+                 aac_drivers[dev->cardtype].vname);
+       return len;
+}
+
+static ssize_t aac_show_kernel_version(struct class_device *class_dev,
+               char *buf)
+{
+       struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
+       int len, tmp;
+
+       tmp = le32_to_cpu(dev->adapter_info.kernelrev);
+       len = snprintf(buf, PAGE_SIZE, "%d.%d-%d[%d]\n", 
+         tmp >> 24, (tmp >> 16) & 0xff, tmp & 0xff,
+         le32_to_cpu(dev->adapter_info.kernelbuild));
+       return len;
+}
+
+static ssize_t aac_show_monitor_version(struct class_device *class_dev,
+               char *buf)
+{
+       struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
+       int len, tmp;
+
+       tmp = le32_to_cpu(dev->adapter_info.monitorrev);
+       len = snprintf(buf, PAGE_SIZE, "%d.%d-%d[%d]\n", 
+         tmp >> 24, (tmp >> 16) & 0xff, tmp & 0xff,
+         le32_to_cpu(dev->adapter_info.monitorbuild));
+       return len;
+}
+
+static ssize_t aac_show_bios_version(struct class_device *class_dev,
+               char *buf)
+{
+       struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
+       int len, tmp;
+
+       tmp = le32_to_cpu(dev->adapter_info.biosrev);
+       len = snprintf(buf, PAGE_SIZE, "%d.%d-%d[%d]\n", 
+         tmp >> 24, (tmp >> 16) & 0xff, tmp & 0xff,
+         le32_to_cpu(dev->adapter_info.biosbuild));
+       return len;
+}
+
+static ssize_t aac_show_serial_number(struct class_device *class_dev,
+               char *buf)
+{
+       struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
+       int len = 0;
+
+       if (le32_to_cpu(dev->adapter_info.serial[0]) != 0xBAD0)
+               len = snprintf(buf, PAGE_SIZE, "%x\n",
+                 le32_to_cpu(dev->adapter_info.serial[0]));
+       return len;
+}
+
+
+static struct class_device_attribute aac_model = {
+       .attr = {
+               .name = "model",
+               .mode = S_IRUGO,
+       },
+       .show = aac_show_model,
+};
+static struct class_device_attribute aac_vendor = {
+       .attr = {
+               .name = "vendor",
+               .mode = S_IRUGO,
+       },
+       .show = aac_show_vendor,
+};
+static struct class_device_attribute aac_kernel_version = {
+       .attr = {
+               .name = "hba_kernel_version",
+               .mode = S_IRUGO,
+       },
+       .show = aac_show_kernel_version,
+};
+static struct class_device_attribute aac_monitor_version = {
+       .attr = {
+               .name = "hba_monitor_version",
+               .mode = S_IRUGO,
+       },
+       .show = aac_show_monitor_version,
+};
+static struct class_device_attribute aac_bios_version = {
+       .attr = {
+               .name = "hba_bios_version",
+               .mode = S_IRUGO,
+       },
+       .show = aac_show_bios_version,
+};
+static struct class_device_attribute aac_serial_number = {
+       .attr = {
+               .name = "serial_number",
+               .mode = S_IRUGO,
+       },
+       .show = aac_show_serial_number,
+};
+
+static struct class_device_attribute *aac_attrs[] = {
+       &aac_model,
+       &aac_vendor,
+       &aac_kernel_version,
+       &aac_monitor_version,
+       &aac_bios_version,
+       &aac_serial_number,
+       NULL
+};
+
+
 static struct file_operations aac_cfg_fops = {
        .owner          = THIS_MODULE,
        .ioctl          = aac_cfg_ioctl,
@@ -538,7 +669,7 @@ static struct file_operations aac_cfg_fops = {
 static struct scsi_host_template aac_driver_template = {
        .module                         = THIS_MODULE,
        .name                           = "AAC",
-       .proc_name                      = "aacraid",
+       .proc_name                      = AAC_DRIVERNAME,
        .info                           = aac_info,
        .ioctl                          = aac_ioctl,
 #ifdef CONFIG_COMPAT
@@ -546,8 +677,8 @@ static struct scsi_host_template aac_driver_template = {
 #endif
        .queuecommand                   = aac_queuecommand,
        .bios_param                     = aac_biosparm, 
+       .shost_attrs                    = aac_attrs,
        .slave_configure                = aac_slave_configure,
-       .eh_abort_handler               = aac_eh_abort,
        .eh_host_reset_handler          = aac_eh_reset,
        .can_queue                      = AAC_NUM_IO_FIB,       
        .this_id                        = 16,
@@ -612,7 +743,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
        aac->cardtype =  index;
        INIT_LIST_HEAD(&aac->entry);
 
-       aac->fibs = kmalloc(sizeof(struct fib) * AAC_NUM_FIB, GFP_KERNEL);
+       aac->fibs = kmalloc(sizeof(struct fib) * (shost->can_queue + AAC_NUM_MGT_FIB), GFP_KERNEL);
        if (!aac->fibs)
                goto out_free_host;
        spin_lock_init(&aac->fib_lock);
@@ -632,6 +763,24 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
        aac_get_adapter_info(aac);
 
        /*
+        * Lets override negotiations and drop the maximum SG limit to 34
+        */
+       if ((aac_drivers[index].quirks & AAC_QUIRK_34SG) && 
+                       (aac->scsi_host_ptr->sg_tablesize > 34)) {
+               aac->scsi_host_ptr->sg_tablesize = 34;
+               aac->scsi_host_ptr->max_sectors
+                 = (aac->scsi_host_ptr->sg_tablesize * 8) + 112;
+       }
+
+       /*
+        * Firware printf works only with older firmware.
+        */
+       if (aac_drivers[index].quirks & AAC_QUIRK_34SG) 
+               aac->printf_enabled = 1;
+       else
+               aac->printf_enabled = 0;
+       /*
         * max channel will be the physical channels plus 1 virtual channel
         * all containers are on the virtual channel 0
         * physical channels are address by their actual physical number+1
index 1b8ed47cfe30be3a7137141ff37da7140a48f336..7d68b7825137506b07af8a83e52f4302f11e31ff 100644 (file)
@@ -98,7 +98,9 @@ static irqreturn_t aac_rkt_intr(int irq, void *dev_id, struct pt_regs *regs)
  *     for its completion.
  */
 
-static int rkt_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
+static int rkt_sync_cmd(struct aac_dev *dev, u32 command,
+       u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6,
+       u32 *status, u32 *r1, u32 *r2, u32 *r3, u32 *r4)
 {
        unsigned long start;
        int ok;
@@ -107,12 +109,12 @@ static int rkt_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
         */
        rkt_writel(dev, InboundMailbox0, command);
        /*
-        *      Write the parameters into Mailboxes 1 - 4
+        *      Write the parameters into Mailboxes 1 - 6
         */
        rkt_writel(dev, InboundMailbox1, p1);
-       rkt_writel(dev, InboundMailbox2, 0);
-       rkt_writel(dev, InboundMailbox3, 0);
-       rkt_writel(dev, InboundMailbox4, 0);
+       rkt_writel(dev, InboundMailbox2, p2);
+       rkt_writel(dev, InboundMailbox3, p3);
+       rkt_writel(dev, InboundMailbox4, p4);
        /*
         *      Clear the synch command doorbell to start on a clean slate.
         */
@@ -169,6 +171,14 @@ static int rkt_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
         */
        if (status)
                *status = rkt_readl(dev, IndexRegs.Mailbox[0]);
+       if (r1)
+               *r1 = rkt_readl(dev, IndexRegs.Mailbox[1]);
+       if (r2)
+               *r2 = rkt_readl(dev, IndexRegs.Mailbox[2]);
+       if (r3)
+               *r3 = rkt_readl(dev, IndexRegs.Mailbox[3]);
+       if (r4)
+               *r4 = rkt_readl(dev, IndexRegs.Mailbox[4]);
        /*
         *      Clear the synch command doorbell.
         */
@@ -190,8 +200,8 @@ static int rkt_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
 
 static void aac_rkt_interrupt_adapter(struct aac_dev *dev)
 {
-       u32 ret;
-       rkt_sync_cmd(dev, BREAKPOINT_REQUEST, 0, &ret);
+       rkt_sync_cmd(dev, BREAKPOINT_REQUEST, 0, 0, 0, 0, 0, 0,
+         NULL, NULL, NULL, NULL, NULL);
 }
 
 /**
@@ -220,7 +230,8 @@ static void aac_rkt_notify_adapter(struct aac_dev *dev, u32 event)
                rkt_writel(dev, MUnit.IDR,INBOUNDDOORBELL_3);
                break;
        case HostShutdown:
-//             rkt_sync_cmd(dev, HOST_CRASHING, 0, 0, 0, 0, &ret);
+//             rkt_sync_cmd(dev, HOST_CRASHING, 0, 0, 0, 0, 0, 0,
+//               NULL, NULL, NULL, NULL, NULL);
                break;
        case FastIo:
                rkt_writel(dev, MUnit.IDR,INBOUNDDOORBELL_6);
@@ -243,16 +254,10 @@ static void aac_rkt_notify_adapter(struct aac_dev *dev, u32 event)
 
 static void aac_rkt_start_adapter(struct aac_dev *dev)
 {
-       u32 status;
        struct aac_init *init;
 
        init = dev->init;
        init->HostElapsedSeconds = cpu_to_le32(get_seconds());
-       /*
-        *      Tell the adapter we are back and up and running so it will scan
-        *      its command queues and enable our interrupts
-        */
-       dev->irq_mask = (DoorBellPrintfReady | OUTBOUNDDOORBELL_1 | OUTBOUNDDOORBELL_2 | OUTBOUNDDOORBELL_3 | OUTBOUNDDOORBELL_4);
        /*
         *      First clear out all interrupts.  Then enable the one's that we
         *      can handle.
@@ -263,7 +268,8 @@ static void aac_rkt_start_adapter(struct aac_dev *dev)
        rkt_writeb(dev, MUnit.OIMR, dev->OIMR = 0xfb);
 
        // We can only use a 32 bit address here
-       rkt_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa, &status);
+       rkt_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa,
+         0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
 }
 
 /**
@@ -288,8 +294,8 @@ static int aac_rkt_check_health(struct aac_dev *dev)
        if (status & KERNEL_PANIC) {
                char * buffer;
                struct POSTSTATUS {
-                       u32 Post_Command;
-                       u32 Post_Address;
+                       __le32 Post_Command;
+                       __le32 Post_Address;
                } * post;
                dma_addr_t paddr, baddr;
                int ret;
@@ -310,7 +316,8 @@ static int aac_rkt_check_health(struct aac_dev *dev)
                post->Post_Command = cpu_to_le32(COMMAND_POST_RESULTS);
                 post->Post_Address = cpu_to_le32(baddr);
                 rkt_writel(dev, MUnit.IMRx[0], paddr);
-                rkt_sync_cmd(dev, COMMAND_POST_RESULTS, baddr, &status);
+                rkt_sync_cmd(dev, COMMAND_POST_RESULTS, baddr, 0, 0, 0, 0, 0,
+                 NULL, NULL, NULL, NULL, NULL);
                pci_free_consistent(dev->pdev, sizeof(struct POSTSTATUS),
                  post, paddr);
                 if ((buffer[0] == '0') && (buffer[1] == 'x')) {
index 630b99e1fe83c41f2f18f2aadcd7e3c486e259d0..1ff25f49fadace646d6a1c19073527a222087f61 100644 (file)
@@ -63,7 +63,7 @@ static irqreturn_t aac_rx_intr(int irq, void *dev_id, struct pt_regs *regs)
        {
                bellbits = rx_readl(dev, OutboundDoorbellReg);
                if (bellbits & DoorBellPrintfReady) {
-                       aac_printf(dev, le32_to_cpu(rx_readl (dev, IndexRegs.Mailbox[5])));
+                       aac_printf(dev, rx_readl(dev, IndexRegs.Mailbox[5]));
                        rx_writel(dev, MUnit.ODR,DoorBellPrintfReady);
                        rx_writel(dev, InboundDoorbellReg,DoorBellPrintfDone);
                }
@@ -98,7 +98,9 @@ static irqreturn_t aac_rx_intr(int irq, void *dev_id, struct pt_regs *regs)
  *     for its completion.
  */
 
-static int rx_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
+static int rx_sync_cmd(struct aac_dev *dev, u32 command,
+       u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6,
+       u32 *status, u32 * r1, u32 * r2, u32 * r3, u32 * r4)
 {
        unsigned long start;
        int ok;
@@ -107,12 +109,12 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
         */
        rx_writel(dev, InboundMailbox0, command);
        /*
-        *      Write the parameters into Mailboxes 1 - 4
+        *      Write the parameters into Mailboxes 1 - 6
         */
        rx_writel(dev, InboundMailbox1, p1);
-       rx_writel(dev, InboundMailbox2, 0);
-       rx_writel(dev, InboundMailbox3, 0);
-       rx_writel(dev, InboundMailbox4, 0);
+       rx_writel(dev, InboundMailbox2, p2);
+       rx_writel(dev, InboundMailbox3, p3);
+       rx_writel(dev, InboundMailbox4, p4);
        /*
         *      Clear the synch command doorbell to start on a clean slate.
         */
@@ -120,7 +122,7 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
        /*
         *      Disable doorbell interrupts
         */
-       rx_writeb(dev, MUnit.OIMR, dev->OIMR |= 0x04);
+       rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xff);
        /*
         *      Force the completion of the mask register write before issuing
         *      the interrupt.
@@ -169,6 +171,14 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
         */
        if (status)
                *status = rx_readl(dev, IndexRegs.Mailbox[0]);
+       if (r1)
+               *r1 = rx_readl(dev, IndexRegs.Mailbox[1]);
+       if (r2)
+               *r2 = rx_readl(dev, IndexRegs.Mailbox[2]);
+       if (r3)
+               *r3 = rx_readl(dev, IndexRegs.Mailbox[3]);
+       if (r4)
+               *r4 = rx_readl(dev, IndexRegs.Mailbox[4]);
        /*
         *      Clear the synch command doorbell.
         */
@@ -190,8 +200,7 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
 
 static void aac_rx_interrupt_adapter(struct aac_dev *dev)
 {
-       u32 ret;
-       rx_sync_cmd(dev, BREAKPOINT_REQUEST, 0, &ret);
+       rx_sync_cmd(dev, BREAKPOINT_REQUEST, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
 }
 
 /**
@@ -220,7 +229,8 @@ static void aac_rx_notify_adapter(struct aac_dev *dev, u32 event)
                rx_writel(dev, MUnit.IDR,INBOUNDDOORBELL_3);
                break;
        case HostShutdown:
-//             rx_sync_cmd(dev, HOST_CRASHING, 0, 0, 0, 0, &ret);
+//             rx_sync_cmd(dev, HOST_CRASHING, 0, 0, 0, 0, 0, 0,
+//               NULL, NULL, NULL, NULL, NULL);
                break;
        case FastIo:
                rx_writel(dev, MUnit.IDR,INBOUNDDOORBELL_6);
@@ -243,16 +253,10 @@ static void aac_rx_notify_adapter(struct aac_dev *dev, u32 event)
 
 static void aac_rx_start_adapter(struct aac_dev *dev)
 {
-       u32 status;
        struct aac_init *init;
 
        init = dev->init;
        init->HostElapsedSeconds = cpu_to_le32(get_seconds());
-       /*
-        *      Tell the adapter we are back and up and running so it will scan
-        *      its command queues and enable our interrupts
-        */
-       dev->irq_mask = (DoorBellPrintfReady | OUTBOUNDDOORBELL_1 | OUTBOUNDDOORBELL_2 | OUTBOUNDDOORBELL_3 | OUTBOUNDDOORBELL_4);
        /*
         *      First clear out all interrupts.  Then enable the one's that we
         *      can handle.
@@ -263,7 +267,8 @@ static void aac_rx_start_adapter(struct aac_dev *dev)
        rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xfb);
 
        // We can only use a 32 bit address here
-       rx_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa, &status);
+       rx_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa,
+         0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
 }
 
 /**
@@ -288,8 +293,8 @@ static int aac_rx_check_health(struct aac_dev *dev)
        if (status & KERNEL_PANIC) {
                char * buffer;
                struct POSTSTATUS {
-                       u32 Post_Command;
-                       u32 Post_Address;
+                       __le32 Post_Command;
+                       __le32 Post_Address;
                } * post;
                dma_addr_t paddr, baddr;
                int ret;
@@ -310,7 +315,8 @@ static int aac_rx_check_health(struct aac_dev *dev)
                post->Post_Command = cpu_to_le32(COMMAND_POST_RESULTS);
                post->Post_Address = cpu_to_le32(baddr);
                rx_writel(dev, MUnit.IMRx[0], paddr);
-               rx_sync_cmd(dev, COMMAND_POST_RESULTS, baddr, &status);
+               rx_sync_cmd(dev, COMMAND_POST_RESULTS, baddr, 0, 0, 0, 0, 0,
+                 NULL, NULL, NULL, NULL, NULL);
                pci_free_consistent(dev->pdev, sizeof(struct POSTSTATUS),
                  post, paddr);
                if ((buffer[0] == '0') && (buffer[1] == 'x')) {
index bd6c30723fbaa233d82b762f49496a624928a1bf..0680249ab861600702d536bf92309e65ac23002d 100644 (file)
@@ -89,7 +89,7 @@ static irqreturn_t aac_sa_intr(int irq, void *dev_id, struct pt_regs *regs)
  *     Notify the adapter of an event
  */
  
-void aac_sa_notify_adapter(struct aac_dev *dev, u32 event)
+static void aac_sa_notify_adapter(struct aac_dev *dev, u32 event)
 {
        switch (event) {
 
@@ -106,7 +106,10 @@ void aac_sa_notify_adapter(struct aac_dev *dev, u32 event)
                sa_writew(dev, DoorbellReg_s,DOORBELL_3);
                break;
        case HostShutdown:
-               //sa_sync_cmd(dev, HOST_CRASHING, 0, &ret);
+               /*
+               sa_sync_cmd(dev, HOST_CRASHING, 0, 0, 0, 0, 0, 0,
+               NULL, NULL, NULL, NULL, NULL);
+               */
                break;
        case FastIo:
                sa_writew(dev, DoorbellReg_s,DOORBELL_6);
@@ -132,7 +135,9 @@ void aac_sa_notify_adapter(struct aac_dev *dev, u32 event)
  *     for its completion.
  */
 
-static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *ret)
+static int sa_sync_cmd(struct aac_dev *dev, u32 command, 
+               u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6,
+               u32 *ret, u32 *r1, u32 *r2, u32 *r3, u32 *r4)
 {
        unsigned long start;
        int ok;
@@ -144,9 +149,10 @@ static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *ret)
         *      Write the parameters into Mailboxes 1 - 4
         */
        sa_writel(dev, Mailbox1, p1);
-       sa_writel(dev, Mailbox2, 0);
-       sa_writel(dev, Mailbox3, 0);
-       sa_writel(dev, Mailbox4, 0);
+       sa_writel(dev, Mailbox2, p2);
+       sa_writel(dev, Mailbox3, p3);
+       sa_writel(dev, Mailbox4, p4);
+
        /*
         *      Clear the synch command doorbell to start on a clean slate.
         */
@@ -188,6 +194,14 @@ static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *ret)
         */
        if (ret)
                *ret = sa_readl(dev, Mailbox0);
+       if (r1)
+               *r1 = sa_readl(dev, Mailbox1);
+       if (r2)
+               *r2 = sa_readl(dev, Mailbox2);
+       if (r3)
+               *r3 = sa_readl(dev, Mailbox3);
+       if (r4)
+               *r4 = sa_readl(dev, Mailbox4);
        return 0;
 }
 
@@ -201,7 +215,8 @@ static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *ret)
 static void aac_sa_interrupt_adapter (struct aac_dev *dev)
 {
        u32 ret;
-       sa_sync_cmd(dev, BREAKPOINT_REQUEST, 0, &ret);
+       sa_sync_cmd(dev, BREAKPOINT_REQUEST, 0, 0, 0, 0, 0, 0,
+                       &ret, NULL, NULL, NULL, NULL);
 }
 
 /**
@@ -230,10 +245,12 @@ static void aac_sa_start_adapter(struct aac_dev *dev)
         *      First clear out all interrupts.  Then enable the one's that 
         *      we can handle.
         */
-       sa_writew(dev, SaDbCSR.PRISETIRQMASK, cpu_to_le16(0xffff));
+       sa_writew(dev, SaDbCSR.PRISETIRQMASK, 0xffff);
        sa_writew(dev, SaDbCSR.PRICLEARIRQMASK, (PrintfReady | DOORBELL_1 | DOORBELL_2 | DOORBELL_3 | DOORBELL_4));
        /* We can only use a 32 bit address here */
-       sa_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa, &ret);
+       sa_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, 
+                       (u32)(ulong)dev->init_pa, 0, 0, 0, 0, 0,
+                       &ret, NULL, NULL, NULL, NULL);
 }
 
 /**
index 88d119f4b97070d221a9f496625f676401d70401..630b11575230c7920e3aa465d650add5d1dd7243 100644 (file)
@@ -1225,8 +1225,6 @@ static int aha152x_device_reset(Scsi_Cmnd * SCpnt)
        }
 
        DO_UNLOCK(flags);
-
-       spin_lock_irq(shpnt->host_lock);
        return ret;
 }
 
index e9920a009593c8d55a75732f38179b29c7f80c84..9ec4641a634899fe03089af6e88e6106863fa190 100644 (file)
@@ -1348,20 +1348,6 @@ static int aha1542_restart(struct Scsi_Host *shost)
        return 0;
 }
 
-static int aha1542_abort(Scsi_Cmnd * SCpnt)
-{
-
-       /*
-        * The abort command does not leave the device in a clean state where
-        *  it is available to be used again.  Until this gets worked out, we
-        * will leave it commented out.  
-        */
-
-       printk(KERN_ERR "aha1542.c: Unable to abort command for target %d\n",
-              SCpnt->device->id);
-       return FAILED;
-}
-
 /*
  * This is a device reset.  This is handled by sending a special command
  * to the device.
@@ -1478,8 +1464,8 @@ static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
         * check for timeout, and if we are doing something like this
         * we are pretty desperate anyways.
         */
-       spin_unlock_irq(SCpnt->device->host->host_lock);
        ssleep(4);
+
        spin_lock_irq(SCpnt->device->host->host_lock);
 
        WAIT(STATUS(SCpnt->device->host->io_port),
@@ -1517,9 +1503,11 @@ static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
                }
        }
 
+       spin_unlock_irq(SCpnt->device->host->host_lock);
        return SUCCESS;
 
 fail:
+       spin_unlock_irq(SCpnt->device->host->host_lock);
        return FAILED;
 }
 
@@ -1542,7 +1530,6 @@ static int aha1542_host_reset(Scsi_Cmnd * SCpnt)
         * check for timeout, and if we are doing something like this
         * we are pretty desperate anyways.
         */
-       spin_unlock_irq(SCpnt->device->host->host_lock);
        ssleep(4);
        spin_lock_irq(SCpnt->device->host->host_lock);
 
@@ -1586,9 +1573,11 @@ static int aha1542_host_reset(Scsi_Cmnd * SCpnt)
                }
        }
 
+       spin_unlock_irq(SCpnt->device->host->host_lock);
        return SUCCESS;
 
 fail:
+       spin_unlock_irq(SCpnt->device->host->host_lock);
        return FAILED;
 }
 
@@ -1817,7 +1806,6 @@ static Scsi_Host_Template driver_template = {
        .detect                 = aha1542_detect,
        .release                = aha1542_release,
        .queuecommand           = aha1542_queuecommand,
-       .eh_abort_handler       = aha1542_abort,
        .eh_device_reset_handler= aha1542_dev_reset,
        .eh_bus_reset_handler   = aha1542_bus_reset,
        .eh_host_reset_handler  = aha1542_host_reset,
index c402351dc79a8ec7b6ccac9e8c645df15b8fdf1f..3821ee17f47114fe7493fb874b6d534d055a8a56 100644 (file)
@@ -133,7 +133,6 @@ struct ccb {                        /* Command Control Block 5.3 */
 
 static int aha1542_detect(Scsi_Host_Template *);
 static int aha1542_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
-static int aha1542_abort(Scsi_Cmnd * SCpnt);
 static int aha1542_bus_reset(Scsi_Cmnd * SCpnt);
 static int aha1542_dev_reset(Scsi_Cmnd * SCpnt);
 static int aha1542_host_reset(Scsi_Cmnd * SCpnt);
index da5bd33d982d7e521b6b0603adcb0911395b184d..9a547ca9c8648fe2c0fb7daa345f156a11f843fd 100644 (file)
 #include <linux/delay.h>
 #include <linux/interrupt.h>
 #include <linux/sched.h>
+#include <linux/dma-mapping.h>
 #include "scsi.h"
 #include <scsi/scsi_host.h>
 #include <linux/libata.h>
 #include <asm/io.h>
 
 #define DRV_NAME       "ahci"
-#define DRV_VERSION    "1.00"
+#define DRV_VERSION    "1.01"
 
 
 enum {
@@ -49,6 +50,7 @@ enum {
        AHCI_CMD_SLOT_SZ        = 32 * 32,
        AHCI_RX_FIS_SZ          = 256,
        AHCI_CMD_TBL_HDR        = 0x80,
+       AHCI_CMD_TBL_CDB        = 0x40,
        AHCI_CMD_TBL_SZ         = AHCI_CMD_TBL_HDR + (AHCI_MAX_SG * 16),
        AHCI_PORT_PRIV_DMA_SZ   = AHCI_CMD_SLOT_SZ + AHCI_CMD_TBL_SZ +
                                  AHCI_RX_FIS_SZ,
@@ -133,6 +135,9 @@ enum {
        PORT_CMD_ICC_ACTIVE     = (0x1 << 28), /* Put i/f in active state */
        PORT_CMD_ICC_PARTIAL    = (0x2 << 28), /* Put i/f in partial state */
        PORT_CMD_ICC_SLUMBER    = (0x6 << 28), /* Put i/f in slumber state */
+
+       /* hpriv->flags bits */
+       AHCI_FLAG_MSI           = (1 << 0),
 };
 
 struct ahci_cmd_hdr {
@@ -182,6 +187,7 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc);
 static u8 ahci_check_status(struct ata_port *ap);
 static u8 ahci_check_err(struct ata_port *ap);
 static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc);
+static void ahci_remove_one (struct pci_dev *pdev);
 
 static Scsi_Host_Template ahci_sht = {
        .module                 = THIS_MODULE,
@@ -271,7 +277,7 @@ static struct pci_driver ahci_pci_driver = {
        .name                   = DRV_NAME,
        .id_table               = ahci_pci_tbl,
        .probe                  = ahci_init_one,
-       .remove                 = ata_pci_remove_one,
+       .remove                 = ahci_remove_one,
 };
 
 
@@ -289,6 +295,8 @@ static void ahci_host_stop(struct ata_host_set *host_set)
 {
        struct ahci_host_priv *hpriv = host_set->private_data;
        kfree(hpriv);
+
+       ata_host_stop(host_set);
 }
 
 static int ahci_port_start(struct ata_port *ap)
@@ -503,7 +511,8 @@ static void ahci_fill_sg(struct ata_queued_cmd *qc)
 
 static void ahci_qc_prep(struct ata_queued_cmd *qc)
 {
-       struct ahci_port_priv *pp = qc->ap->private_data;
+       struct ata_port *ap = qc->ap;
+       struct ahci_port_priv *pp = ap->private_data;
        u32 opts;
        const u32 cmd_fis_len = 5; /* five dwords */
 
@@ -515,18 +524,8 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc)
        opts = (qc->n_elem << 16) | cmd_fis_len;
        if (qc->tf.flags & ATA_TFLAG_WRITE)
                opts |= AHCI_CMD_WRITE;
-
-       switch (qc->tf.protocol) {
-       case ATA_PROT_ATAPI:
-       case ATA_PROT_ATAPI_NODATA:
-       case ATA_PROT_ATAPI_DMA:
+       if (is_atapi_taskfile(&qc->tf))
                opts |= AHCI_CMD_ATAPI;
-               break;
-
-       default:
-               /* do nothing */
-               break;
-       }
 
        pp->cmd_slot[0].opts = cpu_to_le32(opts);
        pp->cmd_slot[0].status = 0;
@@ -538,6 +537,10 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc)
         * a SATA Register - Host to Device command FIS.
         */
        ata_tf_to_fis(&qc->tf, pp->cmd_tbl, 0);
+       if (opts & AHCI_CMD_ATAPI) {
+               memset(pp->cmd_tbl + AHCI_CMD_TBL_CDB, 0, 32);
+               memcpy(pp->cmd_tbl + AHCI_CMD_TBL_CDB, qc->cdb, ap->cdb_len);
+       }
 
        if (!(qc->flags & ATA_QCFLAG_DMAMAP))
                return;
@@ -792,8 +795,6 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent)
                                return rc;
                        }
                }
-
-               hpriv->flags |= HOST_CAP_64;
        } else {
                rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
                if (rc) {
@@ -876,15 +877,19 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent)
 }
 
 /* move to PCI layer, integrate w/ MSI stuff */
-static void pci_enable_intx(struct pci_dev *pdev)
+static void pci_intx(struct pci_dev *pdev, int enable)
 {
-       u16 pci_command;
+       u16 pci_command, new;
 
        pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
-       if (pci_command & PCI_COMMAND_INTX_DISABLE) {
-               pci_command &= ~PCI_COMMAND_INTX_DISABLE;
+
+       if (enable)
+               new = pci_command & ~PCI_COMMAND_INTX_DISABLE;
+       else
+               new = pci_command | PCI_COMMAND_INTX_DISABLE;
+
+       if (new != pci_command)
                pci_write_config_word(pdev, PCI_COMMAND, pci_command);
-       }
 }
 
 static void ahci_print_info(struct ata_probe_ent *probe_ent)
@@ -966,7 +971,7 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        unsigned long base;
        void *mmio_base;
        unsigned int board_idx = (unsigned int) ent->driver_data;
-       int pci_dev_busy = 0;
+       int have_msi, pci_dev_busy = 0;
        int rc;
 
        VPRINTK("ENTER\n");
@@ -984,12 +989,17 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                goto err_out;
        }
 
-       pci_enable_intx(pdev);
+       if (pci_enable_msi(pdev) == 0)
+               have_msi = 1;
+       else {
+               pci_intx(pdev, 1);
+               have_msi = 0;
+       }
 
        probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
        if (probe_ent == NULL) {
                rc = -ENOMEM;
-               goto err_out_regions;
+               goto err_out_msi;
        }
 
        memset(probe_ent, 0, sizeof(*probe_ent));
@@ -1022,6 +1032,9 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        probe_ent->mmio_base = mmio_base;
        probe_ent->private_data = hpriv;
 
+       if (have_msi)
+               hpriv->flags |= AHCI_FLAG_MSI;
+
        /* initialize adapter */
        rc = ahci_host_init(probe_ent);
        if (rc)
@@ -1041,7 +1054,11 @@ err_out_iounmap:
        iounmap(mmio_base);
 err_out_free_ent:
        kfree(probe_ent);
-err_out_regions:
+err_out_msi:
+       if (have_msi)
+               pci_disable_msi(pdev);
+       else
+               pci_intx(pdev, 0);
        pci_release_regions(pdev);
 err_out:
        if (!pci_dev_busy)
@@ -1049,6 +1066,42 @@ err_out:
        return rc;
 }
 
+static void ahci_remove_one (struct pci_dev *pdev)
+{
+       struct device *dev = pci_dev_to_dev(pdev);
+       struct ata_host_set *host_set = dev_get_drvdata(dev);
+       struct ahci_host_priv *hpriv = host_set->private_data;
+       struct ata_port *ap;
+       unsigned int i;
+       int have_msi;
+
+       for (i = 0; i < host_set->n_ports; i++) {
+               ap = host_set->ports[i];
+
+               scsi_remove_host(ap->host);
+       }
+
+       have_msi = hpriv->flags & AHCI_FLAG_MSI;
+       free_irq(host_set->irq, host_set);
+
+       for (i = 0; i < host_set->n_ports; i++) {
+               ap = host_set->ports[i];
+
+               ata_scsi_release(ap->host);
+               scsi_host_put(ap->host);
+       }
+
+       host_set->ops->host_stop(host_set);
+       kfree(host_set);
+
+       if (have_msi)
+               pci_disable_msi(pdev);
+       else
+               pci_intx(pdev, 0);
+       pci_release_regions(pdev);
+       pci_disable_device(pdev);
+       dev_set_drvdata(dev, NULL);
+}
 
 static int __init ahci_init(void)
 {
index c2b47f2bdffdf489233c3d6c106ac75c893c7844..d4ed5e9f830a29d8ec72bd442f2fe710552ef309 100644 (file)
 
 #include "aic7xxx_osm.h"
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 #include <linux/device.h>
 #include <linux/eisa.h>
 
-#define EISA_MFCTR_CHAR0(ID) (char)(((ID>>26) & 0x1F) | '@')  /* Bits 26-30 */
-#define EISA_MFCTR_CHAR1(ID) (char)(((ID>>21) & 0x1F) | '@')  /* Bits 21-25 */
-#define EISA_MFCTR_CHAR2(ID) (char)(((ID>>16) & 0x1F) | '@')  /* Bits 16-20 */
-#define EISA_PRODUCT_ID(ID)  (short)((ID>>4)  & 0xFFF)        /* Bits  4-15 */
-#define EISA_REVISION_ID(ID) (uint8_t)(ID & 0x0F)             /* Bits  0-3  */
-
-static int aic7770_eisa_dev_probe(struct device *dev);
-static int aic7770_eisa_dev_remove(struct device *dev);
-static struct eisa_driver aic7770_driver = {
-       .driver = {
-               .name   = "aic7xxx",
-               .probe  = aic7770_eisa_dev_probe,
-               .remove = aic7770_eisa_dev_remove,
-       }
-};
-
-typedef  struct device *aic7770_dev_t;
-#else
-#define MINSLOT                        1
-#define NUMSLOTS               16
-#define IDOFFSET               0x80
-
-typedef void *aic7770_dev_t;
-#endif
-
-static int aic7770_linux_config(struct aic7770_identity *entry,
-                               aic7770_dev_t dev, u_int eisaBase);
-
 int
-ahc_linux_eisa_init(void)
+aic7770_map_registers(struct ahc_softc *ahc, u_int port)
 {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-       struct eisa_device_id *eid;
-       struct aic7770_identity *id;
-       int i;
-
-       if (aic7xxx_probe_eisa_vl == 0)
-               return -ENODEV;
-
        /*
-        * Linux requires the EISA IDs to be specified in
-        * the EISA ID string format.  Perform the conversion
-        * and setup a table with a NUL terminal entry.
+        * Lock out other contenders for our i/o space.
         */
-       aic7770_driver.id_table = malloc(sizeof(struct eisa_device_id) *
-                                        (ahc_num_aic7770_devs + 1),
-                                        M_DEVBUF, M_NOWAIT);
-       if (aic7770_driver.id_table == NULL)
-               return -ENOMEM;
-
-       for (eid = (struct eisa_device_id *)aic7770_driver.id_table,
-            id = aic7770_ident_table, i = 0;
-            i < ahc_num_aic7770_devs; eid++, id++, i++) {
-
-               sprintf(eid->sig, "%c%c%c%03X%01X",
-                       EISA_MFCTR_CHAR0(id->full_id),
-                       EISA_MFCTR_CHAR1(id->full_id),
-                       EISA_MFCTR_CHAR2(id->full_id),
-                       EISA_PRODUCT_ID(id->full_id),
-                       EISA_REVISION_ID(id->full_id));
-               eid->driver_data = i;
-       }
-       eid->sig[0] = 0;
-
-       return eisa_driver_register(&aic7770_driver);
-#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) */
-       struct aic7770_identity *entry;
-       u_int  slot;
-       u_int  eisaBase;
-       u_int  i;
-       int ret = -ENODEV;
-
-       if (aic7xxx_probe_eisa_vl == 0)
-               return ret;
-
-       eisaBase = 0x1000 + AHC_EISA_SLOT_OFFSET;
-       for (slot = 1; slot < NUMSLOTS; eisaBase+=0x1000, slot++) {
-               uint32_t eisa_id;
-               size_t   id_size;
-
-               if (request_region(eisaBase, AHC_EISA_IOSIZE, "aic7xxx") == 0)
-                       continue;
-
-               eisa_id = 0;
-               id_size = sizeof(eisa_id);
-               for (i = 0; i < 4; i++) {
-                       /* VLcards require priming*/
-                       outb(0x80 + i, eisaBase + IDOFFSET);
-                       eisa_id |= inb(eisaBase + IDOFFSET + i)
-                                  << ((id_size-i-1) * 8);
-               }
-               release_region(eisaBase, AHC_EISA_IOSIZE);
-               if (eisa_id & 0x80000000)
-                       continue;  /* no EISA card in slot */
-
-               entry = aic7770_find_device(eisa_id);
-               if (entry != NULL) {
-                       aic7770_linux_config(entry, NULL, eisaBase);
-                       ret = 0;
-               }
-       }
-       return ret;
-#endif
+       if (request_region(port, AHC_EISA_IOSIZE, "aic7xxx") == 0)
+               return (ENOMEM);
+       ahc->tag = BUS_SPACE_PIO;
+       ahc->bsh.ioport = port;
+       return (0);
 }
 
-void
-ahc_linux_eisa_exit(void)
+int
+aic7770_map_int(struct ahc_softc *ahc, u_int irq)
 {
-       if(aic7xxx_probe_eisa_vl != 0 && aic7770_driver.id_table != NULL) {
-               eisa_driver_unregister(&aic7770_driver);
-               free(aic7770_driver.id_table, M_DEVBUF);
-       }
+       int error;
+       int shared;
+
+       shared = 0;
+       if ((ahc->flags & AHC_EDGE_INTERRUPT) == 0)
+               shared = SA_SHIRQ;
+
+       error = request_irq(irq, ahc_linux_isr, shared, "aic7xxx", ahc);
+       if (error == 0)
+               ahc->platform_data->irq = irq;
+       
+       return (-error);
 }
 
 static int
-aic7770_linux_config(struct aic7770_identity *entry, aic7770_dev_t dev,
-                    u_int eisaBase)
+aic7770_probe(struct device *dev)
 {
+       struct eisa_device *edev = to_eisa_device(dev);
+       u_int eisaBase = edev->base_addr+AHC_EISA_SLOT_OFFSET;
        struct  ahc_softc *ahc;
        char    buf[80];
        char   *name;
        int     error;
 
-       /*
-        * Allocate a softc for this card and
-        * set it up for attachment by our
-        * common detect routine.
-        */
        sprintf(buf, "ahc_eisa:%d", eisaBase >> 12);
        name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
        if (name == NULL)
@@ -181,84 +92,62 @@ aic7770_linux_config(struct aic7770_identity *entry, aic7770_dev_t dev,
        ahc = ahc_alloc(&aic7xxx_driver_template, name);
        if (ahc == NULL)
                return (ENOMEM);
-       error = aic7770_config(ahc, entry, eisaBase);
+       error = aic7770_config(ahc, aic7770_ident_table + edev->id.driver_data,
+                              eisaBase);
        if (error != 0) {
                ahc->bsh.ioport = 0;
                ahc_free(ahc);
                return (error);
        }
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-       dev->driver_data = (void *)ahc;
+
+       dev_set_drvdata(dev, ahc);
+
        if (aic7xxx_detect_complete)
                error = ahc_linux_register_host(ahc, &aic7xxx_driver_template);
-#endif
        return (error);
 }
 
-int
-aic7770_map_registers(struct ahc_softc *ahc, u_int port)
-{
-       /*
-        * Lock out other contenders for our i/o space.
-        */
-       if (request_region(port, AHC_EISA_IOSIZE, "aic7xxx") == 0)
-               return (ENOMEM);
-       ahc->tag = BUS_SPACE_PIO;
-       ahc->bsh.ioport = port;
-       return (0);
-}
-
-int
-aic7770_map_int(struct ahc_softc *ahc, u_int irq)
+static int
+aic7770_remove(struct device *dev)
 {
-       int error;
-       int shared;
+       struct ahc_softc *ahc = dev_get_drvdata(dev);
+       u_long s;
 
-       shared = 0;
-       if ((ahc->flags & AHC_EDGE_INTERRUPT) == 0)
-               shared = SA_SHIRQ;
+       ahc_lock(ahc, &s);
+       ahc_intr_enable(ahc, FALSE);
+       ahc_unlock(ahc, &s);
 
-       error = request_irq(irq, ahc_linux_isr, shared, "aic7xxx", ahc);
-       if (error == 0)
-               ahc->platform_data->irq = irq;
-       
-       return (-error);
+       ahc_free(ahc);
+       return 0;
 }
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-static int
-aic7770_eisa_dev_probe(struct device *dev)
+static struct eisa_device_id aic7770_ids[] = {
+       { "ADP7771", 0 }, /* AHA 274x */
+       { "ADP7756", 1 }, /* AHA 284x BIOS enabled */
+       { "ADP7757", 2 }, /* AHA 284x BIOS disabled */
+       { "ADP7782", 3 }, /* AHA 274x Olivetti OEM */
+       { "ADP7783", 4 }, /* AHA 274x Olivetti OEM (Differential) */
+       { "ADP7770", 5 }, /* AIC7770 generic */
+       { "" }
+};
+  
+static struct eisa_driver aic7770_driver = {
+       .id_table       = aic7770_ids,
+       .driver = {
+               .name   = "aic7xxx",
+               .probe  = aic7770_probe,
+               .remove = aic7770_remove,
+       }
+};
+  
+int
+ahc_linux_eisa_init(void)
 {
-       struct eisa_device *edev;
-
-       edev = to_eisa_device(dev);
-       return (aic7770_linux_config(aic7770_ident_table + edev->id.driver_data,
-                                   dev, edev->base_addr+AHC_EISA_SLOT_OFFSET));
+       return eisa_driver_register(&aic7770_driver);
 }
-
-static int
-aic7770_eisa_dev_remove(struct device *dev)
+  
+void
+ahc_linux_eisa_exit(void)
 {
-       struct ahc_softc *ahc;
-       u_long l;
-
-       /*
-        * We should be able to just perform
-        * the free directly, but check our
-        * list for extra sanity.
-        */
-       ahc_list_lock(&l);
-       ahc = ahc_find_softc((struct ahc_softc *)dev->driver_data);
-       if (ahc != NULL) {
-               u_long s;
-
-               ahc_lock(ahc, &s);
-               ahc_intr_enable(ahc, FALSE);
-               ahc_unlock(ahc, &s);
-               ahc_free(ahc);
-       }
-       ahc_list_unlock(&l);
-
-       return (0);
+       eisa_driver_unregister(&aic7770_driver);
 }
-#endif
index 550c9921691ad8df96602bf833d2c28ba7eba411..5f526dd0aaa1e1b2b8450109e9962ea6ead776da 100644 (file)
@@ -1511,17 +1511,17 @@ ahd_linux_dev_reset(Scsi_Cmnd *cmd)
                       ahd_name(ahd), cmd->device->channel, cmd->device->id,
                       cmd->device->lun, cmd);
 #endif
-       ahd_midlayer_entrypoint_lock(ahd, &s);
+       ahd_lock(ahd, &s);
 
        dev = ahd_linux_get_device(ahd, cmd->device->channel, cmd->device->id,
                                   cmd->device->lun, /*alloc*/FALSE);
        if (dev == NULL) {
-               ahd_midlayer_entrypoint_unlock(ahd, &s);
+               ahd_unlock(ahd, &s);
                kfree(recovery_cmd);
                return (FAILED);
        }
        if ((scb = ahd_get_scb(ahd, AHD_NEVER_COL_IDX)) == NULL) {
-               ahd_midlayer_entrypoint_unlock(ahd, &s);
+               ahd_unlock(ahd, &s);
                kfree(recovery_cmd);
                return (FAILED);
        }
@@ -1570,7 +1570,7 @@ ahd_linux_dev_reset(Scsi_Cmnd *cmd)
        spin_lock_irq(&ahd->platform_data->spin_lock);
        ahd_schedule_runq(ahd);
        ahd_linux_run_complete_queue(ahd);
-       ahd_midlayer_entrypoint_unlock(ahd, &s);
+       ahd_unlock(ahd, &s);
        printf("%s: Device reset returning 0x%x\n", ahd_name(ahd), retval);
        return (retval);
 }
@@ -1591,11 +1591,11 @@ ahd_linux_bus_reset(Scsi_Cmnd *cmd)
                printf("%s: Bus reset called for cmd %p\n",
                       ahd_name(ahd), cmd);
 #endif
-       ahd_midlayer_entrypoint_lock(ahd, &s);
+       ahd_lock(ahd, &s);
        found = ahd_reset_channel(ahd, cmd->device->channel + 'A',
                                  /*initiate reset*/TRUE);
        ahd_linux_run_complete_queue(ahd);
-       ahd_midlayer_entrypoint_unlock(ahd, &s);
+       ahd_unlock(ahd, &s);
 
        if (bootverbose)
                printf("%s: SCSI bus reset delivered. "
@@ -2488,7 +2488,7 @@ ahd_linux_dv_thread(void *data)
        sprintf(current->comm, "ahd_dv_%d", ahd->unit);
 #else
        daemonize("ahd_dv_%d", ahd->unit);
-       current->flags |= PF_FREEZE;
+       current->flags |= PF_NOFREEZE;
 #endif
        unlock_kernel();
 
index 605f92b6c5ca20641cbba971052ec4a98d6706f2..7823e52e99abb8e47f6a7d8148b89ab28a7a47b6 100644 (file)
@@ -112,23 +112,6 @@ typedef Scsi_Cmnd      *ahd_io_ctx_t;
 #define ahd_le32toh(x) le32_to_cpu(x)
 #define ahd_le64toh(x) le64_to_cpu(x)
 
-#ifndef LITTLE_ENDIAN
-#define LITTLE_ENDIAN 1234
-#endif
-
-#ifndef BIG_ENDIAN
-#define BIG_ENDIAN 4321
-#endif
-
-#ifndef BYTE_ORDER
-#if defined(__BIG_ENDIAN)
-#define BYTE_ORDER BIG_ENDIAN
-#endif
-#if defined(__LITTLE_ENDIAN)
-#define BYTE_ORDER LITTLE_ENDIAN
-#endif
-#endif /* BYTE_ORDER */
-
 /************************* Configuration Data *********************************/
 extern uint32_t aic79xx_allow_memio;
 extern int aic79xx_detect_complete;
index 8ff16fd8ed49ab98aac91961ed54b84e3218c112..0948d50ae75c5661353de44e560390b957ec930d 100644 (file)
@@ -346,7 +346,6 @@ typedef enum {
                                          * controller.
                                          */
        AHC_NEWEEPROM_FMT     = 0x4000,
-       AHC_RESOURCE_SHORTAGE = 0x8000,
        AHC_TQINFIFO_BLOCKED  = 0x10000,  /* Blocked waiting for ATIOs */
        AHC_INT50_SPEEDFLEX   = 0x20000,  /*
                                           * Internal 50pin connector
@@ -1200,7 +1199,6 @@ void                       ahc_pause_and_flushwork(struct ahc_softc *ahc);
 int                     ahc_suspend(struct ahc_softc *ahc); 
 int                     ahc_resume(struct ahc_softc *ahc);
 void                    ahc_softc_insert(struct ahc_softc *);
-struct ahc_softc       *ahc_find_softc(struct ahc_softc *ahc);
 void                    ahc_set_unit(struct ahc_softc *, int);
 void                    ahc_set_name(struct ahc_softc *, char *);
 void                    ahc_alloc_scbs(struct ahc_softc *ahc);
index 9a6b4a570aa704d93ef32cbabc7ccb6399e6cc05..8a2bb6f8d77b003396b4ac3721d24c9fa0717723 100644 (file)
@@ -3934,22 +3934,6 @@ ahc_softc_insert(struct ahc_softc *ahc)
        ahc->init_level++;
 }
 
-/*
- * Verify that the passed in softc pointer is for a
- * controller that is still configured.
- */
-struct ahc_softc *
-ahc_find_softc(struct ahc_softc *ahc)
-{
-       struct ahc_softc *list_ahc;
-
-       TAILQ_FOREACH(list_ahc, &ahc_tailq, links) {
-               if (list_ahc == ahc)
-                       return (ahc);
-       }
-       return (NULL);
-}
-
 void
 ahc_set_unit(struct ahc_softc *ahc, int unit)
 {
index d978e4a3e973742ca03475584f96e0b39fff0f48..b89094db14c1774bddda35ccdbac8eaaf20fe148 100644 (file)
 #include "aic7xxx_osm.h"
 #include "aic7xxx_inline.h"
 #include <scsi/scsicam.h>
-#include <scsi/scsi_transport.h>
-#include <scsi/scsi_transport_spi.h>
 
 static struct scsi_transport_template *ahc_linux_transport_template = NULL;
 
@@ -134,11 +132,6 @@ static struct scsi_transport_template *ahc_linux_transport_template = NULL;
 #include "aiclib.c"
 
 #include <linux/init.h>                /* __setup */
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-#include "sd.h"                        /* For geometry detection */
-#endif
-
 #include <linux/mm.h>          /* For fetching system memory size */
 #include <linux/blkdev.h>              /* For block_size() */
 #include <linux/delay.h>       /* For ssleep/msleep */
@@ -148,11 +141,6 @@ static struct scsi_transport_template *ahc_linux_transport_template = NULL;
  */
 spinlock_t ahc_list_spinlock;
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-/* For dynamic sglist size calculation. */
-u_int ahc_linux_nseg;
-#endif
-
 /*
  * Set this to the delay in seconds after SCSI bus reset.
  * Note, we honor this only for the initial bus reset.
@@ -341,22 +329,6 @@ static uint32_t aic7xxx_extended;
  */
 static uint32_t aic7xxx_pci_parity = ~0;
 
-/*
- * Certain newer motherboards have put new PCI based devices into the
- * IO spaces that used to typically be occupied by VLB or EISA cards.
- * This overlap can cause these newer motherboards to lock up when scanned
- * for older EISA and VLB devices.  Setting this option to non-0 will
- * cause the driver to skip scanning for any VLB or EISA controllers and
- * only support the PCI controllers.  NOTE: this means that if the kernel
- * os compiled with PCI support disabled, then setting this to non-0
- * would result in never finding any devices :)
- */
-#ifndef CONFIG_AIC7XXX_PROBE_EISA_VL
-uint32_t aic7xxx_probe_eisa_vl;
-#else
-uint32_t aic7xxx_probe_eisa_vl = ~0;
-#endif
-
 /*
  * There are lots of broken chipsets in the world.  Some of them will
  * violate the PCI spec when we issue byte sized memory writes to our
@@ -433,184 +405,37 @@ MODULE_PARM_DESC(aic7xxx,
 );
 
 static void ahc_linux_handle_scsi_status(struct ahc_softc *,
-                                        struct ahc_linux_device *,
+                                        struct scsi_device *,
                                         struct scb *);
 static void ahc_linux_queue_cmd_complete(struct ahc_softc *ahc,
-                                        Scsi_Cmnd *cmd);
+                                        struct scsi_cmnd *cmd);
 static void ahc_linux_sem_timeout(u_long arg);
 static void ahc_linux_freeze_simq(struct ahc_softc *ahc);
 static void ahc_linux_release_simq(u_long arg);
-static void ahc_linux_dev_timed_unfreeze(u_long arg);
-static int  ahc_linux_queue_recovery_cmd(Scsi_Cmnd *cmd, scb_flag flag);
+static int  ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag);
 static void ahc_linux_initialize_scsi_bus(struct ahc_softc *ahc);
-static void ahc_linux_size_nseg(void);
-static void ahc_linux_thread_run_complete_queue(struct ahc_softc *ahc);
 static u_int ahc_linux_user_tagdepth(struct ahc_softc *ahc,
                                     struct ahc_devinfo *devinfo);
-static void ahc_linux_device_queue_depth(struct ahc_softc *ahc,
-                                        struct ahc_linux_device *dev);
-static struct ahc_linux_target*        ahc_linux_alloc_target(struct ahc_softc*,
-                                                      u_int, u_int);
-static void                    ahc_linux_free_target(struct ahc_softc*,
-                                                     struct ahc_linux_target*);
-static struct ahc_linux_device*        ahc_linux_alloc_device(struct ahc_softc*,
-                                                      struct ahc_linux_target*,
-                                                      u_int);
-static void                    ahc_linux_free_device(struct ahc_softc*,
-                                                     struct ahc_linux_device*);
-static void ahc_linux_run_device_queue(struct ahc_softc*,
-                                      struct ahc_linux_device*);
+static void ahc_linux_device_queue_depth(struct scsi_device *);
+static int ahc_linux_run_command(struct ahc_softc*,
+                                struct ahc_linux_device *,
+                                struct scsi_cmnd *);
 static void ahc_linux_setup_tag_info_global(char *p);
 static aic_option_callback_t ahc_linux_setup_tag_info;
 static int  aic7xxx_setup(char *s);
 static int  ahc_linux_next_unit(void);
-static void ahc_runq_tasklet(unsigned long data);
-static struct ahc_cmd *ahc_linux_run_complete_queue(struct ahc_softc *ahc);
 
 /********************************* Inlines ************************************/
-static __inline void ahc_schedule_runq(struct ahc_softc *ahc);
-static __inline struct ahc_linux_device*
-                    ahc_linux_get_device(struct ahc_softc *ahc, u_int channel,
-                                         u_int target, u_int lun, int alloc);
-static __inline void ahc_schedule_completeq(struct ahc_softc *ahc);
-static __inline void ahc_linux_check_device_queue(struct ahc_softc *ahc,
-                                                 struct ahc_linux_device *dev);
-static __inline struct ahc_linux_device *
-                    ahc_linux_next_device_to_run(struct ahc_softc *ahc);
-static __inline void ahc_linux_run_device_queues(struct ahc_softc *ahc);
 static __inline void ahc_linux_unmap_scb(struct ahc_softc*, struct scb*);
 
 static __inline int ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb,
                                      struct ahc_dma_seg *sg,
                                      dma_addr_t addr, bus_size_t len);
 
-static __inline void
-ahc_schedule_completeq(struct ahc_softc *ahc)
-{
-       if ((ahc->platform_data->flags & AHC_RUN_CMPLT_Q_TIMER) == 0) {
-               ahc->platform_data->flags |= AHC_RUN_CMPLT_Q_TIMER;
-               ahc->platform_data->completeq_timer.expires = jiffies;
-               add_timer(&ahc->platform_data->completeq_timer);
-       }
-}
-
-/*
- * Must be called with our lock held.
- */
-static __inline void
-ahc_schedule_runq(struct ahc_softc *ahc)
-{
-       tasklet_schedule(&ahc->platform_data->runq_tasklet);
-}
-
-static __inline struct ahc_linux_device*
-ahc_linux_get_device(struct ahc_softc *ahc, u_int channel, u_int target,
-                    u_int lun, int alloc)
-{
-       struct ahc_linux_target *targ;
-       struct ahc_linux_device *dev;
-       u_int target_offset;
-
-       target_offset = target;
-       if (channel != 0)
-               target_offset += 8;
-       targ = ahc->platform_data->targets[target_offset];
-       if (targ == NULL) {
-               if (alloc != 0) {
-                       targ = ahc_linux_alloc_target(ahc, channel, target);
-                       if (targ == NULL)
-                               return (NULL);
-               } else
-                       return (NULL);
-       }
-       dev = targ->devices[lun];
-       if (dev == NULL && alloc != 0)
-               dev = ahc_linux_alloc_device(ahc, targ, lun);
-       return (dev);
-}
-
-#define AHC_LINUX_MAX_RETURNED_ERRORS 4
-static struct ahc_cmd *
-ahc_linux_run_complete_queue(struct ahc_softc *ahc)
-{
-       struct  ahc_cmd *acmd;
-       u_long  done_flags;
-       int     with_errors;
-
-       with_errors = 0;
-       ahc_done_lock(ahc, &done_flags);
-       while ((acmd = TAILQ_FIRST(&ahc->platform_data->completeq)) != NULL) {
-               Scsi_Cmnd *cmd;
-
-               if (with_errors > AHC_LINUX_MAX_RETURNED_ERRORS) {
-                       /*
-                        * Linux uses stack recursion to requeue
-                        * commands that need to be retried.  Avoid
-                        * blowing out the stack by "spoon feeding"
-                        * commands that completed with error back
-                        * the operating system in case they are going
-                        * to be retried. "ick"
-                        */
-                       ahc_schedule_completeq(ahc);
-                       break;
-               }
-               TAILQ_REMOVE(&ahc->platform_data->completeq,
-                            acmd, acmd_links.tqe);
-               cmd = &acmd_scsi_cmd(acmd);
-               cmd->host_scribble = NULL;
-               if (ahc_cmd_get_transaction_status(cmd) != DID_OK
-                || (cmd->result & 0xFF) != SCSI_STATUS_OK)
-                       with_errors++;
-
-               cmd->scsi_done(cmd);
-       }
-       ahc_done_unlock(ahc, &done_flags);
-       return (acmd);
-}
-
-static __inline void
-ahc_linux_check_device_queue(struct ahc_softc *ahc,
-                            struct ahc_linux_device *dev)
-{
-       if ((dev->flags & AHC_DEV_FREEZE_TIL_EMPTY) != 0
-        && dev->active == 0) {
-               dev->flags &= ~AHC_DEV_FREEZE_TIL_EMPTY;
-               dev->qfrozen--;
-       }
-
-       if (TAILQ_FIRST(&dev->busyq) == NULL
-        || dev->openings == 0 || dev->qfrozen != 0)
-               return;
-
-       ahc_linux_run_device_queue(ahc, dev);
-}
-
-static __inline struct ahc_linux_device *
-ahc_linux_next_device_to_run(struct ahc_softc *ahc)
-{
-       
-       if ((ahc->flags & AHC_RESOURCE_SHORTAGE) != 0
-           || (ahc->platform_data->qfrozen != 0))
-               return (NULL);
-       return (TAILQ_FIRST(&ahc->platform_data->device_runq));
-}
-
-static __inline void
-ahc_linux_run_device_queues(struct ahc_softc *ahc)
-{
-       struct ahc_linux_device *dev;
-
-       while ((dev = ahc_linux_next_device_to_run(ahc)) != NULL) {
-               TAILQ_REMOVE(&ahc->platform_data->device_runq, dev, links);
-               dev->flags &= ~AHC_DEV_ON_RUN_LIST;
-               ahc_linux_check_device_queue(ahc, dev);
-       }
-}
-
 static __inline void
 ahc_linux_unmap_scb(struct ahc_softc *ahc, struct scb *scb)
 {
-       Scsi_Cmnd *cmd;
+       struct scsi_cmnd *cmd;
 
        cmd = scb->io_ctx;
        ahc_sync_sglist(ahc, scb, BUS_DMASYNC_POSTWRITE);
@@ -650,121 +475,15 @@ ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb,
        return (consumed);
 }
 
-/************************  Host template entry points *************************/
-static int        ahc_linux_detect(Scsi_Host_Template *);
-static int        ahc_linux_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *));
-static const char *ahc_linux_info(struct Scsi_Host *);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-static int        ahc_linux_slave_alloc(Scsi_Device *);
-static int        ahc_linux_slave_configure(Scsi_Device *);
-static void       ahc_linux_slave_destroy(Scsi_Device *);
-#if defined(__i386__)
-static int        ahc_linux_biosparam(struct scsi_device*,
-                                      struct block_device*,
-                                      sector_t, int[]);
-#endif
-#else
-static int        ahc_linux_release(struct Scsi_Host *);
-static void       ahc_linux_select_queue_depth(struct Scsi_Host *host,
-                                               Scsi_Device *scsi_devs);
-#if defined(__i386__)
-static int        ahc_linux_biosparam(Disk *, kdev_t, int[]);
-#endif
-#endif
-static int        ahc_linux_bus_reset(Scsi_Cmnd *);
-static int        ahc_linux_dev_reset(Scsi_Cmnd *);
-static int        ahc_linux_abort(Scsi_Cmnd *);
-
-/*
- * Calculate a safe value for AHC_NSEG (as expressed through ahc_linux_nseg).
- *
- * In pre-2.5.X...
- * The midlayer allocates an S/G array dynamically when a command is issued
- * using SCSI malloc.  This array, which is in an OS dependent format that
- * must later be copied to our private S/G list, is sized to house just the
- * number of segments needed for the current transfer.  Since the code that
- * sizes the SCSI malloc pool does not take into consideration fragmentation
- * of the pool, executing transactions numbering just a fraction of our
- * concurrent transaction limit with list lengths aproaching AHC_NSEG will
- * quickly depleat the SCSI malloc pool of usable space.  Unfortunately, the
- * mid-layer does not properly handle this scsi malloc failures for the S/G
- * array and the result can be a lockup of the I/O subsystem.  We try to size
- * our S/G list so that it satisfies our drivers allocation requirements in
- * addition to avoiding fragmentation of the SCSI malloc pool.
- */
-static void
-ahc_linux_size_nseg(void)
-{
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-       u_int cur_size;
-       u_int best_size;
-
-       /*
-        * The SCSI allocator rounds to the nearest 512 bytes
-        * an cannot allocate across a page boundary.  Our algorithm
-        * is to start at 1K of scsi malloc space per-command and
-        * loop through all factors of the PAGE_SIZE and pick the best.
-        */
-       best_size = 0;
-       for (cur_size = 1024; cur_size <= PAGE_SIZE; cur_size *= 2) {
-               u_int nseg;
-
-               nseg = cur_size / sizeof(struct scatterlist);
-               if (nseg < AHC_LINUX_MIN_NSEG)
-                       continue;
-
-               if (best_size == 0) {
-                       best_size = cur_size;
-                       ahc_linux_nseg = nseg;
-               } else {
-                       u_int best_rem;
-                       u_int cur_rem;
-
-                       /*
-                        * Compare the traits of the current "best_size"
-                        * with the current size to determine if the
-                        * current size is a better size.
-                        */
-                       best_rem = best_size % sizeof(struct scatterlist);
-                       cur_rem = cur_size % sizeof(struct scatterlist);
-                       if (cur_rem < best_rem) {
-                               best_size = cur_size;
-                               ahc_linux_nseg = nseg;
-                       }
-               }
-       }
-#endif
-}
-
 /*
  * Try to detect an Adaptec 7XXX controller.
  */
 static int
-ahc_linux_detect(Scsi_Host_Template *template)
+ahc_linux_detect(struct scsi_host_template *template)
 {
        struct  ahc_softc *ahc;
        int     found = 0;
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-       /*
-        * It is a bug that the upper layer takes
-        * this lock just prior to calling us.
-        */
-       spin_unlock_irq(&io_request_lock);
-#endif
-
-       /*
-        * Sanity checking of Linux SCSI data structures so
-        * that some of our hacks^H^H^H^H^Hassumptions aren't
-        * violated.
-        */
-       if (offsetof(struct ahc_cmd_internal, end)
-         > offsetof(struct scsi_cmnd, host_scribble)) {
-               printf("ahc_linux_detect: SCSI data structures changed.\n");
-               printf("ahc_linux_detect: Unable to attach\n");
-               return (0);
-       }
-       ahc_linux_size_nseg();
        /*
         * If we've been passed any parameters, process them now.
         */
@@ -793,48 +512,11 @@ ahc_linux_detect(Scsi_Host_Template *template)
                        found++;
        }
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-       spin_lock_irq(&io_request_lock);
-#endif
        aic7xxx_detect_complete++;
 
        return (found);
 }
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-/*
- * Free the passed in Scsi_Host memory structures prior to unloading the
- * module.
- */
-int
-ahc_linux_release(struct Scsi_Host * host)
-{
-       struct ahc_softc *ahc;
-       u_long l;
-
-       ahc_list_lock(&l);
-       if (host != NULL) {
-
-               /*
-                * We should be able to just perform
-                * the free directly, but check our
-                * list for extra sanity.
-                */
-               ahc = ahc_find_softc(*(struct ahc_softc **)host->hostdata);
-               if (ahc != NULL) {
-                       u_long s;
-
-                       ahc_lock(ahc, &s);
-                       ahc_intr_enable(ahc, FALSE);
-                       ahc_unlock(ahc, &s);
-                       ahc_free(ahc);
-               }
-       }
-       ahc_list_unlock(&l);
-       return (0);
-}
-#endif
-
 /*
  * Return a string describing the driver.
  */
@@ -867,11 +549,10 @@ ahc_linux_info(struct Scsi_Host *host)
  * Queue an SCB to the controller.
  */
 static int
-ahc_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
+ahc_linux_queue(struct scsi_cmnd * cmd, void (*scsi_done) (struct scsi_cmnd *))
 {
        struct   ahc_softc *ahc;
-       struct   ahc_linux_device *dev;
-       u_long   flags;
+       struct   ahc_linux_device *dev = scsi_transport_device_data(cmd->device);
 
        ahc = *(struct ahc_softc **)cmd->device->host->hostdata;
 
@@ -880,205 +561,197 @@ ahc_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
         */
        cmd->scsi_done = scsi_done;
 
-       ahc_midlayer_entrypoint_lock(ahc, &flags);
-
        /*
         * Close the race of a command that was in the process of
         * being queued to us just as our simq was frozen.  Let
         * DV commands through so long as we are only frozen to
         * perform DV.
         */
-       if (ahc->platform_data->qfrozen != 0) {
+       if (ahc->platform_data->qfrozen != 0)
+               return SCSI_MLQUEUE_HOST_BUSY;
 
-               ahc_cmd_set_transaction_status(cmd, CAM_REQUEUE_REQ);
-               ahc_linux_queue_cmd_complete(ahc, cmd);
-               ahc_schedule_completeq(ahc);
-               ahc_midlayer_entrypoint_unlock(ahc, &flags);
-               return (0);
-       }
-       dev = ahc_linux_get_device(ahc, cmd->device->channel, cmd->device->id,
-                                  cmd->device->lun, /*alloc*/TRUE);
-       if (dev == NULL) {
-               ahc_cmd_set_transaction_status(cmd, CAM_RESRC_UNAVAIL);
-               ahc_linux_queue_cmd_complete(ahc, cmd);
-               ahc_schedule_completeq(ahc);
-               ahc_midlayer_entrypoint_unlock(ahc, &flags);
-               printf("%s: aic7xxx_linux_queue - Unable to allocate device!\n",
-                      ahc_name(ahc));
-               return (0);
-       }
        cmd->result = CAM_REQ_INPROG << 16;
-       TAILQ_INSERT_TAIL(&dev->busyq, (struct ahc_cmd *)cmd, acmd_links.tqe);
-       if ((dev->flags & AHC_DEV_ON_RUN_LIST) == 0) {
-               TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq, dev, links);
-               dev->flags |= AHC_DEV_ON_RUN_LIST;
-               ahc_linux_run_device_queues(ahc);
-       }
-       ahc_midlayer_entrypoint_unlock(ahc, &flags);
-       return (0);
+
+       return ahc_linux_run_command(ahc, dev, cmd);
+}
+
+static inline struct scsi_target **
+ahc_linux_target_in_softc(struct scsi_target *starget)
+{
+       struct  ahc_softc *ahc =
+               *((struct ahc_softc **)dev_to_shost(&starget->dev)->hostdata);
+       unsigned int target_offset;
+
+       target_offset = starget->id;
+       if (starget->channel != 0)
+               target_offset += 8;
+
+       return &ahc->platform_data->starget[target_offset];
 }
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 static int
-ahc_linux_slave_alloc(Scsi_Device *device)
+ahc_linux_target_alloc(struct scsi_target *starget)
 {
-       struct  ahc_softc *ahc;
+       struct  ahc_softc *ahc =
+               *((struct ahc_softc **)dev_to_shost(&starget->dev)->hostdata);
+       struct seeprom_config *sc = ahc->seep_config;
+       unsigned long flags;
+       struct scsi_target **ahc_targp = ahc_linux_target_in_softc(starget);
+       struct ahc_linux_target *targ = scsi_transport_target_data(starget);
+       unsigned short scsirate;
+       struct ahc_devinfo devinfo;
+       struct ahc_initiator_tinfo *tinfo;
+       struct ahc_tmode_tstate *tstate;
+       char channel = starget->channel + 'A';
+       unsigned int our_id = ahc->our_id;
+       unsigned int target_offset;
 
-       ahc = *((struct ahc_softc **)device->host->hostdata);
-       if (bootverbose)
-               printf("%s: Slave Alloc %d\n", ahc_name(ahc), device->id);
-       return (0);
+       target_offset = starget->id;
+       if (starget->channel != 0)
+               target_offset += 8;
+         
+       if (starget->channel)
+               our_id = ahc->our_id_b;
+
+       ahc_lock(ahc, &flags);
+
+       BUG_ON(*ahc_targp != NULL);
+
+       *ahc_targp = starget;
+       memset(targ, 0, sizeof(*targ));
+
+       if (sc) {
+               int maxsync = AHC_SYNCRATE_DT;
+               int ultra = 0;
+               int flags = sc->device_flags[target_offset];
+
+               if (ahc->flags & AHC_NEWEEPROM_FMT) {
+                   if (flags & CFSYNCHISULTRA)
+                       ultra = 1;
+               } else if (flags & CFULTRAEN)
+                       ultra = 1;
+               /* AIC nutcase; 10MHz appears as ultra = 1, CFXFER = 0x04
+                * change it to ultra=0, CFXFER = 0 */
+               if(ultra && (flags & CFXFER) == 0x04) {
+                       ultra = 0;
+                       flags &= ~CFXFER;
+               }
+           
+               if ((ahc->features & AHC_ULTRA2) != 0) {
+                       scsirate = (flags & CFXFER) | (ultra ? 0x8 : 0);
+               } else {
+                       scsirate = (flags & CFXFER) << 4;
+                       maxsync = ultra ? AHC_SYNCRATE_ULTRA : 
+                               AHC_SYNCRATE_FAST;
+               }
+               spi_max_width(starget) = (flags & CFWIDEB) ? 1 : 0;
+               if (!(flags & CFSYNCH))
+                       spi_max_offset(starget) = 0;
+               spi_min_period(starget) = 
+                       ahc_find_period(ahc, scsirate, maxsync);
+
+               tinfo = ahc_fetch_transinfo(ahc, channel, ahc->our_id,
+                                           starget->id, &tstate);
+       }
+       ahc_compile_devinfo(&devinfo, our_id, starget->id,
+                           CAM_LUN_WILDCARD, channel,
+                           ROLE_INITIATOR);
+       ahc_set_syncrate(ahc, &devinfo, NULL, 0, 0, 0,
+                        AHC_TRANS_GOAL, /*paused*/FALSE);
+       ahc_set_width(ahc, &devinfo, MSG_EXT_WDTR_BUS_8_BIT,
+                     AHC_TRANS_GOAL, /*paused*/FALSE);
+       ahc_unlock(ahc, &flags);
+
+       return 0;
+}
+
+static void
+ahc_linux_target_destroy(struct scsi_target *starget)
+{
+       struct scsi_target **ahc_targp = ahc_linux_target_in_softc(starget);
+
+       *ahc_targp = NULL;
 }
 
 static int
-ahc_linux_slave_configure(Scsi_Device *device)
+ahc_linux_slave_alloc(struct scsi_device *sdev)
 {
-       struct  ahc_softc *ahc;
-       struct  ahc_linux_device *dev;
-       u_long  flags;
+       struct  ahc_softc *ahc =
+               *((struct ahc_softc **)sdev->host->hostdata);
+       struct scsi_target *starget = sdev->sdev_target;
+       struct ahc_linux_target *targ = scsi_transport_target_data(starget);
+       struct ahc_linux_device *dev;
 
-       ahc = *((struct ahc_softc **)device->host->hostdata);
        if (bootverbose)
-               printf("%s: Slave Configure %d\n", ahc_name(ahc), device->id);
-       ahc_midlayer_entrypoint_lock(ahc, &flags);
+               printf("%s: Slave Alloc %d\n", ahc_name(ahc), sdev->id);
+
+       BUG_ON(targ->sdev[sdev->lun] != NULL);
+
+       dev = scsi_transport_device_data(sdev);
+       memset(dev, 0, sizeof(*dev));
+
        /*
-        * Since Linux has attached to the device, configure
-        * it so we don't free and allocate the device
-        * structure on every command.
+        * We start out life using untagged
+        * transactions of which we allow one.
         */
-       dev = ahc_linux_get_device(ahc, device->channel,
-                                  device->id, device->lun,
-                                  /*alloc*/TRUE);
-       if (dev != NULL) {
-               dev->flags &= ~AHC_DEV_UNCONFIGURED;
-               dev->scsi_device = device;
-               ahc_linux_device_queue_depth(ahc, dev);
-       }
-       ahc_midlayer_entrypoint_unlock(ahc, &flags);
+       dev->openings = 1;
 
-       /* Initial Domain Validation */
-       if (!spi_initial_dv(device->sdev_target))
-               spi_dv_device(device);
+       /*
+        * Set maxtags to 0.  This will be changed if we
+        * later determine that we are dealing with
+        * a tagged queuing capable device.
+        */
+       dev->maxtags = 0;
+       
+       targ->sdev[sdev->lun] = sdev;
 
-       return (0);
+       return 0;
 }
 
-static void
-ahc_linux_slave_destroy(Scsi_Device *device)
+static int
+ahc_linux_slave_configure(struct scsi_device *sdev)
 {
        struct  ahc_softc *ahc;
-       struct  ahc_linux_device *dev;
-       u_long  flags;
 
-       ahc = *((struct ahc_softc **)device->host->hostdata);
+       ahc = *((struct ahc_softc **)sdev->host->hostdata);
+
        if (bootverbose)
-               printf("%s: Slave Destroy %d\n", ahc_name(ahc), device->id);
-       ahc_midlayer_entrypoint_lock(ahc, &flags);
-       dev = ahc_linux_get_device(ahc, device->channel,
-                                  device->id, device->lun,
-                                          /*alloc*/FALSE);
-       /*
-        * Filter out "silly" deletions of real devices by only
-        * deleting devices that have had slave_configure()
-        * called on them.  All other devices that have not
-        * been configured will automatically be deleted by
-        * the refcounting process.
-        */
-       if (dev != NULL
-        && (dev->flags & AHC_DEV_SLAVE_CONFIGURED) != 0) {
-               dev->flags |= AHC_DEV_UNCONFIGURED;
-               if (TAILQ_EMPTY(&dev->busyq)
-                && dev->active == 0
-                && (dev->flags & AHC_DEV_TIMER_ACTIVE) == 0)
-                       ahc_linux_free_device(ahc, dev);
-       }
-       ahc_midlayer_entrypoint_unlock(ahc, &flags);
+               printf("%s: Slave Configure %d\n", ahc_name(ahc), sdev->id);
+
+       ahc_linux_device_queue_depth(sdev);
+
+       /* Initial Domain Validation */
+       if (!spi_initial_dv(sdev->sdev_target))
+               spi_dv_device(sdev);
+
+       return 0;
 }
-#else
-/*
- * Sets the queue depth for each SCSI device hanging
- * off the input host adapter.
- */
+
 static void
-ahc_linux_select_queue_depth(struct Scsi_Host *host, Scsi_Device *scsi_devs)
+ahc_linux_slave_destroy(struct scsi_device *sdev)
 {
-       Scsi_Device *device;
-       Scsi_Device *ldev;
        struct  ahc_softc *ahc;
-       u_long  flags;
-
-       ahc = *((struct ahc_softc **)host->hostdata);
-       ahc_lock(ahc, &flags);
-       for (device = scsi_devs; device != NULL; device = device->next) {
+       struct  ahc_linux_device *dev = scsi_transport_device_data(sdev);
+       struct  ahc_linux_target *targ = scsi_transport_target_data(sdev->sdev_target);
 
-               /*
-                * Watch out for duplicate devices.  This works around
-                * some quirks in how the SCSI scanning code does its
-                * device management.
-                */
-               for (ldev = scsi_devs; ldev != device; ldev = ldev->next) {
-                       if (ldev->host == device->host
-                        && ldev->channel == device->channel
-                        && ldev->id == device->id
-                        && ldev->lun == device->lun)
-                               break;
-               }
-               /* Skip duplicate. */
-               if (ldev != device)
-                       continue;
+       ahc = *((struct ahc_softc **)sdev->host->hostdata);
+       if (bootverbose)
+               printf("%s: Slave Destroy %d\n", ahc_name(ahc), sdev->id);
 
-               if (device->host == host) {
-                       struct   ahc_linux_device *dev;
+       BUG_ON(dev->active);
 
-                       /*
-                        * Since Linux has attached to the device, configure
-                        * it so we don't free and allocate the device
-                        * structure on every command.
-                        */
-                       dev = ahc_linux_get_device(ahc, device->channel,
-                                                  device->id, device->lun,
-                                                  /*alloc*/TRUE);
-                       if (dev != NULL) {
-                               dev->flags &= ~AHC_DEV_UNCONFIGURED;
-                               dev->scsi_device = device;
-                               ahc_linux_device_queue_depth(ahc, dev);
-                               device->queue_depth = dev->openings
-                                                   + dev->active;
-                               if ((dev->flags & (AHC_DEV_Q_BASIC
-                                               | AHC_DEV_Q_TAGGED)) == 0) {
-                                       /*
-                                        * We allow the OS to queue 2 untagged
-                                        * transactions to us at any time even
-                                        * though we can only execute them
-                                        * serially on the controller/device.
-                                        * This should remove some latency.
-                                        */
-                                       device->queue_depth = 2;
-                               }
-                       }
-               }
-       }
-       ahc_unlock(ahc, &flags);
+       targ->sdev[sdev->lun] = NULL;
 }
-#endif
 
 #if defined(__i386__)
 /*
  * Return the disk geometry for the given SCSI device.
  */
 static int
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 ahc_linux_biosparam(struct scsi_device *sdev, struct block_device *bdev,
                    sector_t capacity, int geom[])
 {
        uint8_t *bh;
-#else
-ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[])
-{
-       struct  scsi_device *sdev = disk->device;
-       u_long  capacity = disk->capacity;
-       struct  buffer_head *bh;
-#endif
        int      heads;
        int      sectors;
        int      cylinders;
@@ -1090,22 +763,11 @@ ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[])
        ahc = *((struct ahc_softc **)sdev->host->hostdata);
        channel = sdev->channel;
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
        bh = scsi_bios_ptable(bdev);
-#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,17)
-       bh = bread(MKDEV(MAJOR(dev), MINOR(dev) & ~0xf), 0, block_size(dev));
-#else
-       bh = bread(MKDEV(MAJOR(dev), MINOR(dev) & ~0xf), 0, 1024);
-#endif
-
        if (bh) {
                ret = scsi_partsize(bh, capacity,
                                    &geom[2], &geom[0], &geom[1]);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
                kfree(bh);
-#else
-               brelse(bh);
-#endif
                if (ret != -1)
                        return (ret);
        }
@@ -1135,7 +797,7 @@ ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[])
  * Abort the current SCSI command(s).
  */
 static int
-ahc_linux_abort(Scsi_Cmnd *cmd)
+ahc_linux_abort(struct scsi_cmnd *cmd)
 {
        int error;
 
@@ -1149,7 +811,7 @@ ahc_linux_abort(Scsi_Cmnd *cmd)
  * Attempt to send a target reset message to the device that timed out.
  */
 static int
-ahc_linux_dev_reset(Scsi_Cmnd *cmd)
+ahc_linux_dev_reset(struct scsi_cmnd *cmd)
 {
        int error;
 
@@ -1163,18 +825,18 @@ ahc_linux_dev_reset(Scsi_Cmnd *cmd)
  * Reset the SCSI bus.
  */
 static int
-ahc_linux_bus_reset(Scsi_Cmnd *cmd)
+ahc_linux_bus_reset(struct scsi_cmnd *cmd)
 {
        struct ahc_softc *ahc;
-       u_long s;
        int    found;
+       unsigned long flags;
 
        ahc = *(struct ahc_softc **)cmd->device->host->hostdata;
-       ahc_midlayer_entrypoint_lock(ahc, &s);
+
+       ahc_lock(ahc, &flags);
        found = ahc_reset_channel(ahc, cmd->device->channel + 'A',
                                  /*initiate reset*/TRUE);
-       ahc_linux_run_complete_queue(ahc);
-       ahc_midlayer_entrypoint_unlock(ahc, &s);
+       ahc_unlock(ahc, &flags);
 
        if (bootverbose)
                printf("%s: SCSI bus reset delivered. "
@@ -1183,7 +845,7 @@ ahc_linux_bus_reset(Scsi_Cmnd *cmd)
        return SUCCESS;
 }
 
-Scsi_Host_Template aic7xxx_driver_template = {
+struct scsi_host_template aic7xxx_driver_template = {
        .module                 = THIS_MODULE,
        .name                   = "aic7xxx",
        .proc_info              = ahc_linux_proc_info,
@@ -1202,37 +864,12 @@ Scsi_Host_Template aic7xxx_driver_template = {
        .slave_alloc            = ahc_linux_slave_alloc,
        .slave_configure        = ahc_linux_slave_configure,
        .slave_destroy          = ahc_linux_slave_destroy,
+       .target_alloc           = ahc_linux_target_alloc,
+       .target_destroy         = ahc_linux_target_destroy,
 };
 
 /**************************** Tasklet Handler *********************************/
 
-/*
- * In 2.4.X and above, this routine is called from a tasklet,
- * so we must re-acquire our lock prior to executing this code.
- * In all prior kernels, ahc_schedule_runq() calls this routine
- * directly and ahc_schedule_runq() is called with our lock held.
- */
-static void
-ahc_runq_tasklet(unsigned long data)
-{
-       struct ahc_softc* ahc;
-       struct ahc_linux_device *dev;
-       u_long flags;
-
-       ahc = (struct ahc_softc *)data;
-       ahc_lock(ahc, &flags);
-       while ((dev = ahc_linux_next_device_to_run(ahc)) != NULL) {
-       
-               TAILQ_REMOVE(&ahc->platform_data->device_runq, dev, links);
-               dev->flags &= ~AHC_DEV_ON_RUN_LIST;
-               ahc_linux_check_device_queue(ahc, dev);
-               /* Yeild to our interrupt handler */
-               ahc_unlock(ahc, &flags);
-               ahc_lock(ahc, &flags);
-       }
-       ahc_unlock(ahc, &flags);
-}
-
 /******************************** Macros **************************************/
 #define BUILD_SCSIID(ahc, cmd)                                             \
        ((((cmd)->device->id << TID_SHIFT) & TID)                           \
@@ -1278,37 +915,11 @@ int
 ahc_dmamem_alloc(struct ahc_softc *ahc, bus_dma_tag_t dmat, void** vaddr,
                 int flags, bus_dmamap_t *mapp)
 {
-       bus_dmamap_t map;
-
-       map = malloc(sizeof(*map), M_DEVBUF, M_NOWAIT);
-       if (map == NULL)
-               return (ENOMEM);
-       /*
-        * Although we can dma data above 4GB, our
-        * "consistent" memory is below 4GB for
-        * space efficiency reasons (only need a 4byte
-        * address).  For this reason, we have to reset
-        * our dma mask when doing allocations.
-        */
-       if (ahc->dev_softc != NULL)
-               if (pci_set_dma_mask(ahc->dev_softc, 0xFFFFFFFF)) {
-                       printk(KERN_WARNING "aic7xxx: No suitable DMA available.\n");
-                       kfree(map);
-                       return (ENODEV);
-               }
        *vaddr = pci_alloc_consistent(ahc->dev_softc,
-                                     dmat->maxsize, &map->bus_addr);
-       if (ahc->dev_softc != NULL)
-               if (pci_set_dma_mask(ahc->dev_softc,
-                                    ahc->platform_data->hw_dma_mask)) {
-                       printk(KERN_WARNING "aic7xxx: No suitable DMA available.\n");
-                       kfree(map);
-                       return (ENODEV);
-               }
+                                     dmat->maxsize, mapp);
        if (*vaddr == NULL)
-               return (ENOMEM);
-       *mapp = map;
-       return(0);
+               return ENOMEM;
+       return 0;
 }
 
 void
@@ -1316,7 +927,7 @@ ahc_dmamem_free(struct ahc_softc *ahc, bus_dma_tag_t dmat,
                void* vaddr, bus_dmamap_t map)
 {
        pci_free_consistent(ahc->dev_softc, dmat->maxsize,
-                           vaddr, map->bus_addr);
+                           vaddr, map);
 }
 
 int
@@ -1330,7 +941,7 @@ ahc_dmamap_load(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map,
         */
        bus_dma_segment_t stack_sg;
 
-       stack_sg.ds_addr = map->bus_addr;
+       stack_sg.ds_addr = map;
        stack_sg.ds_len = dmat->maxsize;
        cb(cb_arg, &stack_sg, /*nseg*/1, /*error*/0);
        return (0);
@@ -1339,12 +950,6 @@ ahc_dmamap_load(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map,
 void
 ahc_dmamap_destroy(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map)
 {
-       /*
-        * The map may is NULL in our < 2.3.X implementation.
-        * Now it's 2.6.5, but just in case...
-        */
-       BUG_ON(map == NULL);
-       free(map, M_DEVBUF);
 }
 
 int
@@ -1499,8 +1104,6 @@ aic7xxx_setup(char *s)
                { "debug", &ahc_debug },
 #endif
                { "reverse_scan", &aic7xxx_reverse_scan },
-               { "no_probe", &aic7xxx_probe_eisa_vl },
-               { "probe_eisa_vl", &aic7xxx_probe_eisa_vl },
                { "periodic_otag", &aic7xxx_periodic_otag },
                { "pci_parity", &aic7xxx_pci_parity },
                { "seltime", &aic7xxx_seltime },
@@ -1550,7 +1153,7 @@ __setup("aic7xxx=", aic7xxx_setup);
 uint32_t aic7xxx_verbose;
 
 int
-ahc_linux_register_host(struct ahc_softc *ahc, Scsi_Host_Template *template)
+ahc_linux_register_host(struct ahc_softc *ahc, struct scsi_host_template *template)
 {
        char     buf[80];
        struct   Scsi_Host *host;
@@ -1564,11 +1167,7 @@ ahc_linux_register_host(struct ahc_softc *ahc, Scsi_Host_Template *template)
 
        *((struct ahc_softc **)host->hostdata) = ahc;
        ahc_lock(ahc, &s);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
        scsi_assign_lock(host, &ahc->platform_data->spin_lock);
-#elif AHC_SCSI_HAS_HOST_LOCK != 0
-       host->lock = &ahc->platform_data->spin_lock;
-#endif
        ahc->platform_data->host = host;
        host->can_queue = AHC_MAX_QUEUE;
        host->cmd_per_lun = 2;
@@ -1587,19 +1186,14 @@ ahc_linux_register_host(struct ahc_softc *ahc, Scsi_Host_Template *template)
                ahc_set_name(ahc, new_name);
        }
        host->unique_id = ahc->unit;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-       scsi_set_pci_device(host, ahc->dev_softc);
-#endif
        ahc_linux_initialize_scsi_bus(ahc);
        ahc_intr_enable(ahc, TRUE);
        ahc_unlock(ahc, &s);
 
        host->transportt = ahc_linux_transport_template;
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
        scsi_add_host(host, (ahc->dev_softc ? &ahc->dev_softc->dev : NULL)); /* XXX handle failure */
        scsi_scan_host(host);
-#endif
        return (0);
 }
 
@@ -1717,19 +1311,9 @@ ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg)
        if (ahc->platform_data == NULL)
                return (ENOMEM);
        memset(ahc->platform_data, 0, sizeof(struct ahc_platform_data));
-       TAILQ_INIT(&ahc->platform_data->completeq);
-       TAILQ_INIT(&ahc->platform_data->device_runq);
        ahc->platform_data->irq = AHC_LINUX_NOIRQ;
-       ahc->platform_data->hw_dma_mask = 0xFFFFFFFF;
        ahc_lockinit(ahc);
-       ahc_done_lockinit(ahc);
-       init_timer(&ahc->platform_data->completeq_timer);
-       ahc->platform_data->completeq_timer.data = (u_long)ahc;
-       ahc->platform_data->completeq_timer.function =
-           (ahc_linux_callback_t *)ahc_linux_thread_run_complete_queue;
        init_MUTEX_LOCKED(&ahc->platform_data->eh_sem);
-       tasklet_init(&ahc->platform_data->runq_tasklet, ahc_runq_tasklet,
-                    (unsigned long)ahc);
        ahc->seltime = (aic7xxx_seltime & 0x3) << 4;
        ahc->seltime_b = (aic7xxx_seltime & 0x3) << 4;
        if (aic7xxx_pci_parity == 0)
@@ -1741,38 +1325,28 @@ ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg)
 void
 ahc_platform_free(struct ahc_softc *ahc)
 {
-       struct ahc_linux_target *targ;
-       struct ahc_linux_device *dev;
+       struct scsi_target *starget;
        int i, j;
 
        if (ahc->platform_data != NULL) {
-               del_timer_sync(&ahc->platform_data->completeq_timer);
-               tasklet_kill(&ahc->platform_data->runq_tasklet);
                if (ahc->platform_data->host != NULL) {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
                        scsi_remove_host(ahc->platform_data->host);
-#endif
                        scsi_host_put(ahc->platform_data->host);
                }
 
                /* destroy all of the device and target objects */
                for (i = 0; i < AHC_NUM_TARGETS; i++) {
-                       targ = ahc->platform_data->targets[i];
-                       if (targ != NULL) {
-                               /* Keep target around through the loop. */
-                               targ->refcount++;
+                       starget = ahc->platform_data->starget[i];
+                       if (starget != NULL) {
                                for (j = 0; j < AHC_NUM_LUNS; j++) {
+                                       struct ahc_linux_target *targ =
+                                               scsi_transport_target_data(starget);
 
-                                       if (targ->devices[j] == NULL)
+                                       if (targ->sdev[j] == NULL)
                                                continue;
-                                       dev = targ->devices[j];
-                                       ahc_linux_free_device(ahc, dev);
+                                       targ->sdev[j] = NULL;
                                }
-                               /*
-                                * Forcibly free the target now that
-                                * all devices are gone.
-                                */
-                               ahc_linux_free_target(ahc, targ);
+                               ahc->platform_data->starget[i] = NULL;
                        }
                }
 
@@ -1787,16 +1361,7 @@ ahc_platform_free(struct ahc_softc *ahc)
                        release_mem_region(ahc->platform_data->mem_busaddr,
                                           0x1000);
                }
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-               /*
-                * In 2.4 we detach from the scsi midlayer before the PCI
-                * layer invokes our remove callback.  No per-instance
-                * detach is provided, so we must reach inside the PCI
-                * subsystem's internals and detach our driver manually.
-                */
-               if (ahc->dev_softc != NULL)
-                       ahc->dev_softc->driver = NULL;
-#endif
+
                free(ahc->platform_data, M_DEVBUF);
        }
 }
@@ -1814,15 +1379,25 @@ void
 ahc_platform_set_tags(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
                      ahc_queue_alg alg)
 {
+       struct scsi_target *starget;
+       struct ahc_linux_target *targ;
        struct ahc_linux_device *dev;
+       struct scsi_device *sdev;
+       u_int target_offset;
        int was_queuing;
        int now_queuing;
 
-       dev = ahc_linux_get_device(ahc, devinfo->channel - 'A',
-                                  devinfo->target,
-                                  devinfo->lun, /*alloc*/FALSE);
-       if (dev == NULL)
+       target_offset = devinfo->target;
+       if (devinfo->channel != 'A')
+               target_offset += 8;
+       starget = ahc->platform_data->starget[target_offset];
+       targ = scsi_transport_target_data(starget);
+       BUG_ON(targ == NULL);
+       sdev = targ->sdev[devinfo->lun];
+       if (sdev == NULL)
                return;
+       dev = scsi_transport_device_data(sdev);
+
        was_queuing = dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED);
        switch (alg) {
        default:
@@ -1873,116 +1448,36 @@ ahc_platform_set_tags(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
                dev->maxtags = 0;
                dev->openings =  1 - dev->active;
        }
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-       if (dev->scsi_device != NULL) {
-               switch ((dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED))) {
-               case AHC_DEV_Q_BASIC:
-                       scsi_adjust_queue_depth(dev->scsi_device,
-                                               MSG_SIMPLE_TASK,
-                                               dev->openings + dev->active);
-                       break;
-               case AHC_DEV_Q_TAGGED:
-                       scsi_adjust_queue_depth(dev->scsi_device,
-                                               MSG_ORDERED_TASK,
-                                               dev->openings + dev->active);
-                       break;
-               default:
-                       /*
-                        * We allow the OS to queue 2 untagged transactions to
-                        * us at any time even though we can only execute them
-                        * serially on the controller/device.  This should
-                        * remove some latency.
-                        */
-                       scsi_adjust_queue_depth(dev->scsi_device,
-                                               /*NON-TAGGED*/0,
-                                               /*queue depth*/2);
-                       break;
-               }
+       switch ((dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED))) {
+       case AHC_DEV_Q_BASIC:
+               scsi_adjust_queue_depth(sdev,
+                                       MSG_SIMPLE_TASK,
+                                       dev->openings + dev->active);
+               break;
+       case AHC_DEV_Q_TAGGED:
+               scsi_adjust_queue_depth(sdev,
+                                       MSG_ORDERED_TASK,
+                                       dev->openings + dev->active);
+               break;
+       default:
+               /*
+                * We allow the OS to queue 2 untagged transactions to
+                * us at any time even though we can only execute them
+                * serially on the controller/device.  This should
+                * remove some latency.
+                */
+               scsi_adjust_queue_depth(sdev,
+                                       /*NON-TAGGED*/0,
+                                       /*queue depth*/2);
+               break;
        }
-#endif
 }
 
 int
 ahc_platform_abort_scbs(struct ahc_softc *ahc, int target, char channel,
                        int lun, u_int tag, role_t role, uint32_t status)
 {
-       int chan;
-       int maxchan;
-       int targ;
-       int maxtarg;
-       int clun;
-       int maxlun;
-       int count;
-
-       if (tag != SCB_LIST_NULL)
-               return (0);
-
-       chan = 0;
-       if (channel != ALL_CHANNELS) {
-               chan = channel - 'A';
-               maxchan = chan + 1;
-       } else {
-               maxchan = (ahc->features & AHC_TWIN) ? 2 : 1;
-       }
-       targ = 0;
-       if (target != CAM_TARGET_WILDCARD) {
-               targ = target;
-               maxtarg = targ + 1;
-       } else {
-               maxtarg = (ahc->features & AHC_WIDE) ? 16 : 8;
-       }
-       clun = 0;
-       if (lun != CAM_LUN_WILDCARD) {
-               clun = lun;
-               maxlun = clun + 1;
-       } else {
-               maxlun = AHC_NUM_LUNS;
-       }
-
-       count = 0;
-       for (; chan < maxchan; chan++) {
-
-               for (; targ < maxtarg; targ++) {
-
-                       for (; clun < maxlun; clun++) {
-                               struct ahc_linux_device *dev;
-                               struct ahc_busyq *busyq;
-                               struct ahc_cmd *acmd;
-
-                               dev = ahc_linux_get_device(ahc, chan,
-                                                          targ, clun,
-                                                          /*alloc*/FALSE);
-                               if (dev == NULL)
-                                       continue;
-
-                               busyq = &dev->busyq;
-                               while ((acmd = TAILQ_FIRST(busyq)) != NULL) {
-                                       Scsi_Cmnd *cmd;
-
-                                       cmd = &acmd_scsi_cmd(acmd);
-                                       TAILQ_REMOVE(busyq, acmd,
-                                                    acmd_links.tqe);
-                                       count++;
-                                       cmd->result = status << 16;
-                                       ahc_linux_queue_cmd_complete(ahc, cmd);
-                               }
-                       }
-               }
-       }
-
-       return (count);
-}
-
-static void
-ahc_linux_thread_run_complete_queue(struct ahc_softc *ahc)
-{
-       u_long flags;
-
-       ahc_lock(ahc, &flags);
-       del_timer(&ahc->platform_data->completeq_timer);
-       ahc->platform_data->flags &= ~AHC_RUN_CMPLT_Q_TIMER;
-       ahc_linux_run_complete_queue(ahc);
-       ahc_unlock(ahc, &flags);
+       return 0;
 }
 
 static u_int
@@ -2020,22 +1515,20 @@ ahc_linux_user_tagdepth(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
  * Determines the queue depth for a given device.
  */
 static void
-ahc_linux_device_queue_depth(struct ahc_softc *ahc,
-                            struct ahc_linux_device *dev)
+ahc_linux_device_queue_depth(struct scsi_device *sdev)
 {
        struct  ahc_devinfo devinfo;
        u_int   tags;
+       struct ahc_softc *ahc = *((struct ahc_softc **)sdev->host->hostdata);
 
        ahc_compile_devinfo(&devinfo,
-                           dev->target->channel == 0
+                           sdev->sdev_target->channel == 0
                          ? ahc->our_id : ahc->our_id_b,
-                           dev->target->target, dev->lun,
-                           dev->target->channel == 0 ? 'A' : 'B',
+                           sdev->sdev_target->id, sdev->lun,
+                           sdev->sdev_target->channel == 0 ? 'A' : 'B',
                            ROLE_INITIATOR);
        tags = ahc_linux_user_tagdepth(ahc, &devinfo);
-       if (tags != 0
-        && dev->scsi_device != NULL
-        && dev->scsi_device->tagged_supported != 0) {
+       if (tags != 0 && sdev->tagged_supported != 0) {
 
                ahc_set_tags(ahc, &devinfo, AHC_QUEUE_TAGGED);
                ahc_print_devinfo(ahc, &devinfo);
@@ -2045,213 +1538,199 @@ ahc_linux_device_queue_depth(struct ahc_softc *ahc,
        }
 }
 
-static void
-ahc_linux_run_device_queue(struct ahc_softc *ahc, struct ahc_linux_device *dev)
+static int
+ahc_linux_run_command(struct ahc_softc *ahc, struct ahc_linux_device *dev,
+                     struct scsi_cmnd *cmd)
 {
-       struct   ahc_cmd *acmd;
-       struct   scsi_cmnd *cmd;
        struct   scb *scb;
        struct   hardware_scb *hscb;
        struct   ahc_initiator_tinfo *tinfo;
        struct   ahc_tmode_tstate *tstate;
        uint16_t mask;
+       struct scb_tailq *untagged_q = NULL;
 
-       if ((dev->flags & AHC_DEV_ON_RUN_LIST) != 0)
-               panic("running device on run list");
+       /*
+        * Schedule us to run later.  The only reason we are not
+        * running is because the whole controller Q is frozen.
+        */
+       if (ahc->platform_data->qfrozen != 0)
+               return SCSI_MLQUEUE_HOST_BUSY;
 
-       while ((acmd = TAILQ_FIRST(&dev->busyq)) != NULL
-           && dev->openings > 0 && dev->qfrozen == 0) {
+       /*
+        * We only allow one untagged transaction
+        * per target in the initiator role unless
+        * we are storing a full busy target *lun*
+        * table in SCB space.
+        */
+       if (!blk_rq_tagged(cmd->request)
+           && (ahc->features & AHC_SCB_BTT) == 0) {
+               int target_offset;
 
-               /*
-                * Schedule us to run later.  The only reason we are not
-                * running is because the whole controller Q is frozen.
-                */
-               if (ahc->platform_data->qfrozen != 0) {
-                       TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq,
-                                         dev, links);
-                       dev->flags |= AHC_DEV_ON_RUN_LIST;
-                       return;
-               }
-               /*
-                * Get an scb to use.
-                */
-               if ((scb = ahc_get_scb(ahc)) == NULL) {
-                       TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq,
-                                        dev, links);
-                       dev->flags |= AHC_DEV_ON_RUN_LIST;
-                       ahc->flags |= AHC_RESOURCE_SHORTAGE;
-                       return;
-               }
-               TAILQ_REMOVE(&dev->busyq, acmd, acmd_links.tqe);
-               cmd = &acmd_scsi_cmd(acmd);
-               scb->io_ctx = cmd;
-               scb->platform_data->dev = dev;
-               hscb = scb->hscb;
-               cmd->host_scribble = (char *)scb;
+               target_offset = cmd->device->id + cmd->device->channel * 8;
+               untagged_q = &(ahc->untagged_queues[target_offset]);
+               if (!TAILQ_EMPTY(untagged_q))
+                       /* if we're already executing an untagged command
+                        * we're busy to another */
+                       return SCSI_MLQUEUE_DEVICE_BUSY;
+       }
 
-               /*
-                * Fill out basics of the HSCB.
-                */
-               hscb->control = 0;
-               hscb->scsiid = BUILD_SCSIID(ahc, cmd);
-               hscb->lun = cmd->device->lun;
-               mask = SCB_GET_TARGET_MASK(ahc, scb);
-               tinfo = ahc_fetch_transinfo(ahc, SCB_GET_CHANNEL(ahc, scb),
-                                           SCB_GET_OUR_ID(scb),
-                                           SCB_GET_TARGET(ahc, scb), &tstate);
-               hscb->scsirate = tinfo->scsirate;
-               hscb->scsioffset = tinfo->curr.offset;
-               if ((tstate->ultraenb & mask) != 0)
-                       hscb->control |= ULTRAENB;
-
-               if ((ahc->user_discenable & mask) != 0)
-                       hscb->control |= DISCENB;
-
-               if ((tstate->auto_negotiate & mask) != 0) {
-                       scb->flags |= SCB_AUTO_NEGOTIATE;
-                       scb->hscb->control |= MK_MESSAGE;
-               }
+       /*
+        * Get an scb to use.
+        */
+       scb = ahc_get_scb(ahc);
+       if (!scb)
+               return SCSI_MLQUEUE_HOST_BUSY;
 
-               if ((dev->flags & (AHC_DEV_Q_TAGGED|AHC_DEV_Q_BASIC)) != 0) {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-                       int     msg_bytes;
-                       uint8_t tag_msgs[2];
-
-                       msg_bytes = scsi_populate_tag_msg(cmd, tag_msgs);
-                       if (msg_bytes && tag_msgs[0] != MSG_SIMPLE_TASK) {
-                               hscb->control |= tag_msgs[0];
-                               if (tag_msgs[0] == MSG_ORDERED_TASK)
-                                       dev->commands_since_idle_or_otag = 0;
-                       } else
-#endif
-                       if (dev->commands_since_idle_or_otag == AHC_OTAG_THRESH
-                        && (dev->flags & AHC_DEV_Q_TAGGED) != 0) {
-                               hscb->control |= MSG_ORDERED_TASK;
-                               dev->commands_since_idle_or_otag = 0;
-                       } else {
-                               hscb->control |= MSG_SIMPLE_TASK;
-                       }
-               }
+       scb->io_ctx = cmd;
+       scb->platform_data->dev = dev;
+       hscb = scb->hscb;
+       cmd->host_scribble = (char *)scb;
 
-               hscb->cdb_len = cmd->cmd_len;
-               if (hscb->cdb_len <= 12) {
-                       memcpy(hscb->shared_data.cdb, cmd->cmnd, hscb->cdb_len);
+       /*
+        * Fill out basics of the HSCB.
+        */
+       hscb->control = 0;
+       hscb->scsiid = BUILD_SCSIID(ahc, cmd);
+       hscb->lun = cmd->device->lun;
+       mask = SCB_GET_TARGET_MASK(ahc, scb);
+       tinfo = ahc_fetch_transinfo(ahc, SCB_GET_CHANNEL(ahc, scb),
+                                   SCB_GET_OUR_ID(scb),
+                                   SCB_GET_TARGET(ahc, scb), &tstate);
+       hscb->scsirate = tinfo->scsirate;
+       hscb->scsioffset = tinfo->curr.offset;
+       if ((tstate->ultraenb & mask) != 0)
+               hscb->control |= ULTRAENB;
+       
+       if ((ahc->user_discenable & mask) != 0)
+               hscb->control |= DISCENB;
+       
+       if ((tstate->auto_negotiate & mask) != 0) {
+               scb->flags |= SCB_AUTO_NEGOTIATE;
+               scb->hscb->control |= MK_MESSAGE;
+       }
+
+       if ((dev->flags & (AHC_DEV_Q_TAGGED|AHC_DEV_Q_BASIC)) != 0) {
+               int     msg_bytes;
+               uint8_t tag_msgs[2];
+               
+               msg_bytes = scsi_populate_tag_msg(cmd, tag_msgs);
+               if (msg_bytes && tag_msgs[0] != MSG_SIMPLE_TASK) {
+                       hscb->control |= tag_msgs[0];
+                       if (tag_msgs[0] == MSG_ORDERED_TASK)
+                               dev->commands_since_idle_or_otag = 0;
+               } else if (dev->commands_since_idle_or_otag == AHC_OTAG_THRESH
+                               && (dev->flags & AHC_DEV_Q_TAGGED) != 0) {
+                       hscb->control |= MSG_ORDERED_TASK;
+                       dev->commands_since_idle_or_otag = 0;
                } else {
-                       memcpy(hscb->cdb32, cmd->cmnd, hscb->cdb_len);
-                       scb->flags |= SCB_CDB32_PTR;
+                       hscb->control |= MSG_SIMPLE_TASK;
                }
+       }
 
-               scb->platform_data->xfer_len = 0;
-               ahc_set_residual(scb, 0);
-               ahc_set_sense_residual(scb, 0);
-               scb->sg_count = 0;
-               if (cmd->use_sg != 0) {
-                       struct  ahc_dma_seg *sg;
-                       struct  scatterlist *cur_seg;
-                       struct  scatterlist *end_seg;
-                       int     nseg;
-
-                       cur_seg = (struct scatterlist *)cmd->request_buffer;
-                       nseg = pci_map_sg(ahc->dev_softc, cur_seg, cmd->use_sg,
-                           cmd->sc_data_direction);
-                       end_seg = cur_seg + nseg;
-                       /* Copy the segments into the SG list. */
-                       sg = scb->sg_list;
-                       /*
-                        * The sg_count may be larger than nseg if
-                        * a transfer crosses a 32bit page.
-                        */ 
-                       while (cur_seg < end_seg) {
-                               dma_addr_t addr;
-                               bus_size_t len;
-                               int consumed;
-
-                               addr = sg_dma_address(cur_seg);
-                               len = sg_dma_len(cur_seg);
-                               consumed = ahc_linux_map_seg(ahc, scb,
-                                                            sg, addr, len);
-                               sg += consumed;
-                               scb->sg_count += consumed;
-                               cur_seg++;
-                       }
-                       sg--;
-                       sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
-
-                       /*
-                        * Reset the sg list pointer.
-                        */
-                       scb->hscb->sgptr =
-                           ahc_htole32(scb->sg_list_phys | SG_FULL_RESID);
+       hscb->cdb_len = cmd->cmd_len;
+       if (hscb->cdb_len <= 12) {
+               memcpy(hscb->shared_data.cdb, cmd->cmnd, hscb->cdb_len);
+       } else {
+               memcpy(hscb->cdb32, cmd->cmnd, hscb->cdb_len);
+               scb->flags |= SCB_CDB32_PTR;
+       }
 
-                       /*
-                        * Copy the first SG into the "current"
-                        * data pointer area.
-                        */
-                       scb->hscb->dataptr = scb->sg_list->addr;
-                       scb->hscb->datacnt = scb->sg_list->len;
-               } else if (cmd->request_bufflen != 0) {
-                       struct   ahc_dma_seg *sg;
+       scb->platform_data->xfer_len = 0;
+       ahc_set_residual(scb, 0);
+       ahc_set_sense_residual(scb, 0);
+       scb->sg_count = 0;
+       if (cmd->use_sg != 0) {
+               struct  ahc_dma_seg *sg;
+               struct  scatterlist *cur_seg;
+               struct  scatterlist *end_seg;
+               int     nseg;
+
+               cur_seg = (struct scatterlist *)cmd->request_buffer;
+               nseg = pci_map_sg(ahc->dev_softc, cur_seg, cmd->use_sg,
+                                 cmd->sc_data_direction);
+               end_seg = cur_seg + nseg;
+               /* Copy the segments into the SG list. */
+               sg = scb->sg_list;
+               /*
+                * The sg_count may be larger than nseg if
+                * a transfer crosses a 32bit page.
+                */ 
+               while (cur_seg < end_seg) {
                        dma_addr_t addr;
-
-                       sg = scb->sg_list;
-                       addr = pci_map_single(ahc->dev_softc,
-                              cmd->request_buffer,
-                              cmd->request_bufflen,
-                              cmd->sc_data_direction);
-                       scb->platform_data->buf_busaddr = addr;
-                       scb->sg_count = ahc_linux_map_seg(ahc, scb,
-                                                         sg, addr,
-                                                         cmd->request_bufflen);
-                       sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
-
-                       /*
-                        * Reset the sg list pointer.
-                        */
-                       scb->hscb->sgptr =
-                           ahc_htole32(scb->sg_list_phys | SG_FULL_RESID);
-
-                       /*
-                        * Copy the first SG into the "current"
-                        * data pointer area.
-                        */
-                       scb->hscb->dataptr = sg->addr;
-                       scb->hscb->datacnt = sg->len;
-               } else {
-                       scb->hscb->sgptr = ahc_htole32(SG_LIST_NULL);
-                       scb->hscb->dataptr = 0;
-                       scb->hscb->datacnt = 0;
-                       scb->sg_count = 0;
+                       bus_size_t len;
+                       int consumed;
+
+                       addr = sg_dma_address(cur_seg);
+                       len = sg_dma_len(cur_seg);
+                       consumed = ahc_linux_map_seg(ahc, scb,
+                                                    sg, addr, len);
+                       sg += consumed;
+                       scb->sg_count += consumed;
+                       cur_seg++;
                }
+               sg--;
+               sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
 
-               ahc_sync_sglist(ahc, scb, BUS_DMASYNC_PREWRITE);
-               LIST_INSERT_HEAD(&ahc->pending_scbs, scb, pending_links);
-               dev->openings--;
-               dev->active++;
-               dev->commands_issued++;
-               if ((dev->flags & AHC_DEV_PERIODIC_OTAG) != 0)
-                       dev->commands_since_idle_or_otag++;
+               /*
+                * Reset the sg list pointer.
+                */
+               scb->hscb->sgptr =
+                       ahc_htole32(scb->sg_list_phys | SG_FULL_RESID);
+               
+               /*
+                * Copy the first SG into the "current"
+                * data pointer area.
+                */
+               scb->hscb->dataptr = scb->sg_list->addr;
+               scb->hscb->datacnt = scb->sg_list->len;
+       } else if (cmd->request_bufflen != 0) {
+               struct   ahc_dma_seg *sg;
+               dma_addr_t addr;
+
+               sg = scb->sg_list;
+               addr = pci_map_single(ahc->dev_softc,
+                                     cmd->request_buffer,
+                                     cmd->request_bufflen,
+                                     cmd->sc_data_direction);
+               scb->platform_data->buf_busaddr = addr;
+               scb->sg_count = ahc_linux_map_seg(ahc, scb,
+                                                 sg, addr,
+                                                 cmd->request_bufflen);
+               sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
 
                /*
-                * We only allow one untagged transaction
-                * per target in the initiator role unless
-                * we are storing a full busy target *lun*
-                * table in SCB space.
+                * Reset the sg list pointer.
                 */
-               if ((scb->hscb->control & (TARGET_SCB|TAG_ENB)) == 0
-                && (ahc->features & AHC_SCB_BTT) == 0) {
-                       struct scb_tailq *untagged_q;
-                       int target_offset;
-
-                       target_offset = SCB_GET_TARGET_OFFSET(ahc, scb);
-                       untagged_q = &(ahc->untagged_queues[target_offset]);
-                       TAILQ_INSERT_TAIL(untagged_q, scb, links.tqe);
-                       scb->flags |= SCB_UNTAGGEDQ;
-                       if (TAILQ_FIRST(untagged_q) != scb)
-                               continue;
-               }
-               scb->flags |= SCB_ACTIVE;
-               ahc_queue_scb(ahc, scb);
+               scb->hscb->sgptr =
+                       ahc_htole32(scb->sg_list_phys | SG_FULL_RESID);
+
+               /*
+                * Copy the first SG into the "current"
+                * data pointer area.
+                */
+               scb->hscb->dataptr = sg->addr;
+               scb->hscb->datacnt = sg->len;
+       } else {
+               scb->hscb->sgptr = ahc_htole32(SG_LIST_NULL);
+               scb->hscb->dataptr = 0;
+               scb->hscb->datacnt = 0;
+               scb->sg_count = 0;
+       }
+
+       LIST_INSERT_HEAD(&ahc->pending_scbs, scb, pending_links);
+       dev->openings--;
+       dev->active++;
+       dev->commands_issued++;
+       if ((dev->flags & AHC_DEV_PERIODIC_OTAG) != 0)
+               dev->commands_since_idle_or_otag++;
+       
+       scb->flags |= SCB_ACTIVE;
+       if (untagged_q) {
+               TAILQ_INSERT_TAIL(untagged_q, scb, links.tqe);
+               scb->flags |= SCB_UNTAGGEDQ;
        }
+       ahc_queue_scb(ahc, scb);
+       return 0;
 }
 
 /*
@@ -2267,9 +1746,6 @@ ahc_linux_isr(int irq, void *dev_id, struct pt_regs * regs)
        ahc = (struct ahc_softc *) dev_id;
        ahc_lock(ahc, &flags); 
        ours = ahc_intr(ahc);
-       if (ahc_linux_next_device_to_run(ahc) != NULL)
-               ahc_schedule_runq(ahc);
-       ahc_linux_run_complete_queue(ahc);
        ahc_unlock(ahc, &flags);
        return IRQ_RETVAL(ours);
 }
@@ -2278,118 +1754,6 @@ void
 ahc_platform_flushwork(struct ahc_softc *ahc)
 {
 
-       while (ahc_linux_run_complete_queue(ahc) != NULL)
-               ;
-}
-
-static struct ahc_linux_target*
-ahc_linux_alloc_target(struct ahc_softc *ahc, u_int channel, u_int target)
-{
-       struct ahc_linux_target *targ;
-       u_int target_offset;
-
-       target_offset = target;
-       if (channel != 0)
-               target_offset += 8;
-
-       targ = malloc(sizeof(*targ), M_DEVBUG, M_NOWAIT);
-       if (targ == NULL)
-               return (NULL);
-       memset(targ, 0, sizeof(*targ));
-       targ->channel = channel;
-       targ->target = target;
-       targ->ahc = ahc;
-       ahc->platform_data->targets[target_offset] = targ;
-       return (targ);
-}
-
-static void
-ahc_linux_free_target(struct ahc_softc *ahc, struct ahc_linux_target *targ)
-{
-       struct ahc_devinfo devinfo;
-       struct ahc_initiator_tinfo *tinfo;
-       struct ahc_tmode_tstate *tstate;
-       u_int our_id;
-       u_int target_offset;
-       char channel;
-
-       /*
-        * Force a negotiation to async/narrow on any
-        * future command to this device unless a bus
-        * reset occurs between now and that command.
-        */
-       channel = 'A' + targ->channel;
-       our_id = ahc->our_id;
-       target_offset = targ->target;
-       if (targ->channel != 0) {
-               target_offset += 8;
-               our_id = ahc->our_id_b;
-       }
-       tinfo = ahc_fetch_transinfo(ahc, channel, our_id,
-                                   targ->target, &tstate);
-       ahc_compile_devinfo(&devinfo, our_id, targ->target, CAM_LUN_WILDCARD,
-                           channel, ROLE_INITIATOR);
-       ahc_set_syncrate(ahc, &devinfo, NULL, 0, 0, 0,
-                        AHC_TRANS_GOAL, /*paused*/FALSE);
-       ahc_set_width(ahc, &devinfo, MSG_EXT_WDTR_BUS_8_BIT,
-                     AHC_TRANS_GOAL, /*paused*/FALSE);
-       ahc_update_neg_request(ahc, &devinfo, tstate, tinfo, AHC_NEG_ALWAYS);
-       ahc->platform_data->targets[target_offset] = NULL;
-       free(targ, M_DEVBUF);
-}
-
-static struct ahc_linux_device*
-ahc_linux_alloc_device(struct ahc_softc *ahc,
-                struct ahc_linux_target *targ, u_int lun)
-{
-       struct ahc_linux_device *dev;
-
-       dev = malloc(sizeof(*dev), M_DEVBUG, M_NOWAIT);
-       if (dev == NULL)
-               return (NULL);
-       memset(dev, 0, sizeof(*dev));
-       init_timer(&dev->timer);
-       TAILQ_INIT(&dev->busyq);
-       dev->flags = AHC_DEV_UNCONFIGURED;
-       dev->lun = lun;
-       dev->target = targ;
-
-       /*
-        * We start out life using untagged
-        * transactions of which we allow one.
-        */
-       dev->openings = 1;
-
-       /*
-        * Set maxtags to 0.  This will be changed if we
-        * later determine that we are dealing with
-        * a tagged queuing capable device.
-        */
-       dev->maxtags = 0;
-       
-       targ->refcount++;
-       targ->devices[lun] = dev;
-       return (dev);
-}
-
-static void
-__ahc_linux_free_device(struct ahc_softc *ahc, struct ahc_linux_device *dev)
-{
-       struct ahc_linux_target *targ;
-
-       targ = dev->target;
-       targ->devices[dev->lun] = NULL;
-       free(dev, M_DEVBUF);
-       targ->refcount--;
-       if (targ->refcount == 0)
-               ahc_linux_free_target(ahc, targ);
-}
-
-static void
-ahc_linux_free_device(struct ahc_softc *ahc, struct ahc_linux_device *dev)
-{
-       del_timer_sync(&dev->timer);
-       __ahc_linux_free_device(ahc, dev);
 }
 
 void
@@ -2400,11 +1764,15 @@ ahc_send_async(struct ahc_softc *ahc, char channel,
        case AC_TRANSFER_NEG:
        {
                char    buf[80];
+               struct  scsi_target *starget;
                struct  ahc_linux_target *targ;
                struct  info_str info;
                struct  ahc_initiator_tinfo *tinfo;
                struct  ahc_tmode_tstate *tstate;
                int     target_offset;
+               unsigned int target_ppr_options;
+
+               BUG_ON(target == CAM_TARGET_WILDCARD);
 
                info.buffer = buf;
                info.length = sizeof(buf);
@@ -2433,58 +1801,37 @@ ahc_send_async(struct ahc_softc *ahc, char channel,
                target_offset = target;
                if (channel == 'B')
                        target_offset += 8;
-               targ = ahc->platform_data->targets[target_offset];
+               starget = ahc->platform_data->starget[target_offset];
+               targ = scsi_transport_target_data(starget);
                if (targ == NULL)
                        break;
-               if (tinfo->curr.period == targ->last_tinfo.period
-                && tinfo->curr.width == targ->last_tinfo.width
-                && tinfo->curr.offset == targ->last_tinfo.offset
-                && tinfo->curr.ppr_options == targ->last_tinfo.ppr_options)
+
+               target_ppr_options =
+                       (spi_dt(starget) ? MSG_EXT_PPR_DT_REQ : 0)
+                       + (spi_qas(starget) ? MSG_EXT_PPR_QAS_REQ : 0)
+                       + (spi_iu(starget) ?  MSG_EXT_PPR_IU_REQ : 0);
+
+               if (tinfo->curr.period == spi_period(starget)
+                   && tinfo->curr.width == spi_width(starget)
+                   && tinfo->curr.offset == spi_offset(starget)
+                && tinfo->curr.ppr_options == target_ppr_options)
                        if (bootverbose == 0)
                                break;
 
-               targ->last_tinfo.period = tinfo->curr.period;
-               targ->last_tinfo.width = tinfo->curr.width;
-               targ->last_tinfo.offset = tinfo->curr.offset;
-               targ->last_tinfo.ppr_options = tinfo->curr.ppr_options;
-
-               printf("(%s:%c:", ahc_name(ahc), channel);
-               if (target == CAM_TARGET_WILDCARD)
-                       printf("*): ");
-               else
-                       printf("%d): ", target);
-               ahc_format_transinfo(&info, &tinfo->curr);
-               if (info.pos < info.length)
-                       *info.buffer = '\0';
-               else
-                       buf[info.length - 1] = '\0';
-               printf("%s", buf);
+               spi_period(starget) = tinfo->curr.period;
+               spi_width(starget) = tinfo->curr.width;
+               spi_offset(starget) = tinfo->curr.offset;
+               spi_dt(starget) = tinfo->curr.ppr_options & MSG_EXT_PPR_DT_REQ;
+               spi_qas(starget) = tinfo->curr.ppr_options & MSG_EXT_PPR_QAS_REQ;
+               spi_iu(starget) = tinfo->curr.ppr_options & MSG_EXT_PPR_IU_REQ;
+               spi_display_xfer_agreement(starget);
                break;
        }
         case AC_SENT_BDR:
        {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
                WARN_ON(lun != CAM_LUN_WILDCARD);
                scsi_report_device_reset(ahc->platform_data->host,
                                         channel - 'A', target);
-#else
-               Scsi_Device *scsi_dev;
-
-               /*
-                * Find the SCSI device associated with this
-                * request and indicate that a UA is expected.
-                */
-               for (scsi_dev = ahc->platform_data->host->host_queue;
-                    scsi_dev != NULL; scsi_dev = scsi_dev->next) {
-                       if (channel - 'A' == scsi_dev->channel
-                        && target == scsi_dev->id
-                        && (lun == CAM_LUN_WILDCARD
-                         || lun == scsi_dev->lun)) {
-                               scsi_dev->was_reset = 1;
-                               scsi_dev->expecting_cc_ua = 1;
-                       }
-               }
-#endif
                break;
        }
         case AC_BUS_RESET:
@@ -2504,7 +1851,7 @@ ahc_send_async(struct ahc_softc *ahc, char channel,
 void
 ahc_done(struct ahc_softc *ahc, struct scb *scb)
 {
-       Scsi_Cmnd *cmd;
+       struct scsi_cmnd *cmd;
        struct     ahc_linux_device *dev;
 
        LIST_REMOVE(scb, pending_links);
@@ -2515,7 +1862,7 @@ ahc_done(struct ahc_softc *ahc, struct scb *scb)
                target_offset = SCB_GET_TARGET_OFFSET(ahc, scb);
                untagged_q = &(ahc->untagged_queues[target_offset]);
                TAILQ_REMOVE(untagged_q, scb, links.tqe);
-               ahc_run_untagged_queue(ahc, untagged_q);
+               BUG_ON(!TAILQ_EMPTY(untagged_q));
        }
 
        if ((scb->flags & SCB_ACTIVE) == 0) {
@@ -2582,9 +1929,7 @@ ahc_done(struct ahc_softc *ahc, struct scb *scb)
                        ahc_set_transaction_status(scb, CAM_REQ_CMP);
                }
        } else if (ahc_get_transaction_status(scb) == CAM_SCSI_STATUS_ERROR) {
-               ahc_linux_handle_scsi_status(ahc, dev, scb);
-       } else if (ahc_get_transaction_status(scb) == CAM_SEL_TIMEOUT) {
-               dev->flags |= AHC_DEV_UNCONFIGURED;
+               ahc_linux_handle_scsi_status(ahc, cmd->device, scb);
        }
 
        if (dev->openings == 1
@@ -2606,16 +1951,6 @@ ahc_done(struct ahc_softc *ahc, struct scb *scb)
        if (dev->active == 0)
                dev->commands_since_idle_or_otag = 0;
 
-       if (TAILQ_EMPTY(&dev->busyq)) {
-               if ((dev->flags & AHC_DEV_UNCONFIGURED) != 0
-                && dev->active == 0
-                && (dev->flags & AHC_DEV_TIMER_ACTIVE) == 0)
-                       ahc_linux_free_device(ahc, dev);
-       } else if ((dev->flags & AHC_DEV_ON_RUN_LIST) == 0) {
-               TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq, dev, links);
-               dev->flags |= AHC_DEV_ON_RUN_LIST;
-       }
-
        if ((scb->flags & SCB_RECOVERY_SCB) != 0) {
                printf("Recovery SCB completes\n");
                if (ahc_get_transaction_status(scb) == CAM_BDR_SENT
@@ -2633,14 +1968,15 @@ ahc_done(struct ahc_softc *ahc, struct scb *scb)
 
 static void
 ahc_linux_handle_scsi_status(struct ahc_softc *ahc,
-                            struct ahc_linux_device *dev, struct scb *scb)
+                            struct scsi_device *sdev, struct scb *scb)
 {
        struct  ahc_devinfo devinfo;
+       struct ahc_linux_device *dev = scsi_transport_device_data(sdev);
 
        ahc_compile_devinfo(&devinfo,
                            ahc->our_id,
-                           dev->target->target, dev->lun,
-                           dev->target->channel == 0 ? 'A' : 'B',
+                           sdev->sdev_target->id, sdev->lun,
+                           sdev->sdev_target->channel == 0 ? 'A' : 'B',
                            ROLE_INITIATOR);
        
        /*
@@ -2659,7 +1995,7 @@ ahc_linux_handle_scsi_status(struct ahc_softc *ahc,
        case SCSI_STATUS_CHECK_COND:
        case SCSI_STATUS_CMD_TERMINATED:
        {
-               Scsi_Cmnd *cmd;
+               struct scsi_cmnd *cmd;
 
                /*
                 * Copy sense information to the OS's cmd
@@ -2754,51 +2090,14 @@ ahc_linux_handle_scsi_status(struct ahc_softc *ahc,
                ahc_platform_set_tags(ahc, &devinfo,
                             (dev->flags & AHC_DEV_Q_BASIC)
                           ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED);
-               /* FALLTHROUGH */
-       }
-       case SCSI_STATUS_BUSY:
-       {
-               /*
-                * Set a short timer to defer sending commands for
-                * a bit since Linux will not delay in this case.
-                */
-               if ((dev->flags & AHC_DEV_TIMER_ACTIVE) != 0) {
-                       printf("%s:%c:%d: Device Timer still active during "
-                              "busy processing\n", ahc_name(ahc),
-                               dev->target->channel, dev->target->target);
-                       break;
-               }
-               dev->flags |= AHC_DEV_TIMER_ACTIVE;
-               dev->qfrozen++;
-               init_timer(&dev->timer);
-               dev->timer.data = (u_long)dev;
-               dev->timer.expires = jiffies + (HZ/2);
-               dev->timer.function = ahc_linux_dev_timed_unfreeze;
-               add_timer(&dev->timer);
                break;
        }
        }
 }
 
 static void
-ahc_linux_queue_cmd_complete(struct ahc_softc *ahc, Scsi_Cmnd *cmd)
+ahc_linux_queue_cmd_complete(struct ahc_softc *ahc, struct scsi_cmnd *cmd)
 {
-       /*
-        * Typically, the complete queue has very few entries
-        * queued to it before the queue is emptied by
-        * ahc_linux_run_complete_queue, so sorting the entries
-        * by generation number should be inexpensive.
-        * We perform the sort so that commands that complete
-        * with an error are retuned in the order origionally
-        * queued to the controller so that any subsequent retries
-        * are performed in order.  The underlying ahc routines do
-        * not guarantee the order that aborted commands will be
-        * returned to us.
-        */
-       struct ahc_completeq *completeq;
-       struct ahc_cmd *list_cmd;
-       struct ahc_cmd *acmd;
-
        /*
         * Map CAM error codes into Linux Error codes.  We
         * avoid the conversion so that the DV code has the
@@ -2852,26 +2151,7 @@ ahc_linux_queue_cmd_complete(struct ahc_softc *ahc, Scsi_Cmnd *cmd)
                        new_status = DID_ERROR;
                        break;
                case CAM_REQUEUE_REQ:
-                       /*
-                        * If we want the request requeued, make sure there
-                        * are sufficent retries.  In the old scsi error code,
-                        * we used to be able to specify a result code that
-                        * bypassed the retry count.  Now we must use this
-                        * hack.  We also "fake" a check condition with
-                        * a sense code of ABORTED COMMAND.  This seems to
-                        * evoke a retry even if this command is being sent
-                        * via the eh thread.  Ick!  Ick!  Ick!
-                        */
-                       if (cmd->retries > 0)
-                               cmd->retries--;
-                       new_status = DID_OK;
-                       ahc_cmd_set_scsi_status(cmd, SCSI_STATUS_CHECK_COND);
-                       cmd->result |= (DRIVER_SENSE << 24);
-                       memset(cmd->sense_buffer, 0,
-                              sizeof(cmd->sense_buffer));
-                       cmd->sense_buffer[0] = SSD_ERRCODE_VALID
-                                            | SSD_CURRENT_ERROR;
-                       cmd->sense_buffer[2] = SSD_KEY_ABORTED_COMMAND;
+                       new_status = DID_REQUEUE;
                        break;
                default:
                        /* We should never get here */
@@ -2882,17 +2162,7 @@ ahc_linux_queue_cmd_complete(struct ahc_softc *ahc, Scsi_Cmnd *cmd)
                ahc_cmd_set_transaction_status(cmd, new_status);
        }
 
-       completeq = &ahc->platform_data->completeq;
-       list_cmd = TAILQ_FIRST(completeq);
-       acmd = (struct ahc_cmd *)cmd;
-       while (list_cmd != NULL
-           && acmd_scsi_cmd(list_cmd).serial_number
-            < acmd_scsi_cmd(acmd).serial_number)
-               list_cmd = TAILQ_NEXT(list_cmd, acmd_links.tqe);
-       if (list_cmd != NULL)
-               TAILQ_INSERT_BEFORE(list_cmd, acmd, acmd_links.tqe);
-       else
-               TAILQ_INSERT_TAIL(completeq, acmd, acmd_links.tqe);
+       cmd->scsi_done(cmd);
 }
 
 static void
@@ -2940,7 +2210,6 @@ ahc_linux_release_simq(u_long arg)
                ahc->platform_data->qfrozen--;
        if (ahc->platform_data->qfrozen == 0)
                unblock_reqs = 1;
-       ahc_schedule_runq(ahc);
        ahc_unlock(ahc, &s);
        /*
         * There is still a race here.  The mid-layer
@@ -2952,37 +2221,12 @@ ahc_linux_release_simq(u_long arg)
                scsi_unblock_requests(ahc->platform_data->host);
 }
 
-static void
-ahc_linux_dev_timed_unfreeze(u_long arg)
-{
-       struct ahc_linux_device *dev;
-       struct ahc_softc *ahc;
-       u_long s;
-
-       dev = (struct ahc_linux_device *)arg;
-       ahc = dev->target->ahc;
-       ahc_lock(ahc, &s);
-       dev->flags &= ~AHC_DEV_TIMER_ACTIVE;
-       if (dev->qfrozen > 0)
-               dev->qfrozen--;
-       if (dev->qfrozen == 0
-        && (dev->flags & AHC_DEV_ON_RUN_LIST) == 0)
-               ahc_linux_run_device_queue(ahc, dev);
-       if (TAILQ_EMPTY(&dev->busyq)
-        && dev->active == 0)
-               __ahc_linux_free_device(ahc, dev);
-       ahc_unlock(ahc, &s);
-}
-
 static int
-ahc_linux_queue_recovery_cmd(Scsi_Cmnd *cmd, scb_flag flag)
+ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
 {
        struct ahc_softc *ahc;
-       struct ahc_cmd *acmd;
-       struct ahc_cmd *list_acmd;
        struct ahc_linux_device *dev;
        struct scb *pending_scb;
-       u_long s;
        u_int  saved_scbptr;
        u_int  active_scb_index;
        u_int  last_phase;
@@ -2998,7 +2242,6 @@ ahc_linux_queue_recovery_cmd(Scsi_Cmnd *cmd, scb_flag flag)
        paused = FALSE;
        wait = FALSE;
        ahc = *(struct ahc_softc **)cmd->device->host->hostdata;
-       acmd = (struct ahc_cmd *)cmd;
 
        printf("%s:%d:%d:%d: Attempting to queue a%s message\n",
               ahc_name(ahc), cmd->device->channel,
@@ -3010,21 +2253,7 @@ ahc_linux_queue_recovery_cmd(Scsi_Cmnd *cmd, scb_flag flag)
                printf(" 0x%x", cmd->cmnd[cdb_byte]);
        printf("\n");
 
-       /*
-        * In all versions of Linux, we have to work around
-        * a major flaw in how the mid-layer is locked down
-        * if we are to sleep successfully in our error handler
-        * while allowing our interrupt handler to run.  Since
-        * the midlayer acquires either the io_request_lock or
-        * our lock prior to calling us, we must use the
-        * spin_unlock_irq() method for unlocking our lock.
-        * This will force interrupts to be enabled on the
-        * current CPU.  Since the EH thread should not have
-        * been running with CPU interrupts disabled other than
-        * by acquiring either the io_request_lock or our own
-        * lock, this *should* be safe.
-        */
-       ahc_midlayer_entrypoint_lock(ahc, &s);
+       spin_lock_irq(&ahc->platform_data->spin_lock);
 
        /*
         * First determine if we currently own this command.
@@ -3033,8 +2262,7 @@ ahc_linux_queue_recovery_cmd(Scsi_Cmnd *cmd, scb_flag flag)
         * at all, and the system wanted us to just abort the
         * command, return success.
         */
-       dev = ahc_linux_get_device(ahc, cmd->device->channel, cmd->device->id,
-                                  cmd->device->lun, /*alloc*/FALSE);
+       dev = scsi_transport_device_data(cmd->device);
 
        if (dev == NULL) {
                /*
@@ -3048,24 +2276,6 @@ ahc_linux_queue_recovery_cmd(Scsi_Cmnd *cmd, scb_flag flag)
                goto no_cmd;
        }
 
-       TAILQ_FOREACH(list_acmd, &dev->busyq, acmd_links.tqe) {
-               if (list_acmd == acmd)
-                       break;
-       }
-
-       if (list_acmd != NULL) {
-               printf("%s:%d:%d:%d: Command found on device queue\n",
-                      ahc_name(ahc), cmd->device->channel, cmd->device->id,
-                      cmd->device->lun);
-               if (flag == SCB_ABORT) {
-                       TAILQ_REMOVE(&dev->busyq, list_acmd, acmd_links.tqe);
-                       cmd->result = DID_ABORT << 16;
-                       ahc_linux_queue_cmd_complete(ahc, cmd);
-                       retval = SUCCESS;
-                       goto done;
-               }
-       }
-
        if ((dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED)) == 0
         && ahc_search_untagged_queues(ahc, cmd, cmd->device->id,
                                       cmd->device->channel + 'A',
@@ -3299,63 +2509,30 @@ done:
                }
                spin_lock_irq(&ahc->platform_data->spin_lock);
        }
-       ahc_schedule_runq(ahc);
-       ahc_linux_run_complete_queue(ahc);
-       ahc_midlayer_entrypoint_unlock(ahc, &s);
+
+       spin_unlock_irq(&ahc->platform_data->spin_lock);
        return (retval);
 }
 
 void
 ahc_platform_dump_card_state(struct ahc_softc *ahc)
 {
-       struct ahc_linux_device *dev;
-       int channel;
-       int maxchannel;
-       int target;
-       int maxtarget;
-       int lun;
-       int i;
-
-       maxchannel = (ahc->features & AHC_TWIN) ? 1 : 0;
-       maxtarget = (ahc->features & AHC_WIDE) ? 15 : 7;
-       for (channel = 0; channel <= maxchannel; channel++) {
-
-               for (target = 0; target <=maxtarget; target++) {
-
-                       for (lun = 0; lun < AHC_NUM_LUNS; lun++) {
-                               struct ahc_cmd *acmd;
-
-                               dev = ahc_linux_get_device(ahc, channel, target,
-                                                          lun, /*alloc*/FALSE);
-                               if (dev == NULL)
-                                       continue;
-
-                               printf("DevQ(%d:%d:%d): ",
-                                      channel, target, lun);
-                               i = 0;
-                               TAILQ_FOREACH(acmd, &dev->busyq,
-                                             acmd_links.tqe) {
-                                       if (i++ > AHC_SCB_MAX)
-                                               break;
-                               }
-                               printf("%d waiting\n", i);
-                       }
-               }
-       }
 }
 
 static void ahc_linux_exit(void);
 
-static void ahc_linux_get_period(struct scsi_target *starget)
+static void ahc_linux_set_width(struct scsi_target *starget, int width)
 {
        struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
        struct ahc_softc *ahc = *((struct ahc_softc **)shost->hostdata);
-       struct ahc_tmode_tstate *tstate;
-       struct ahc_initiator_tinfo *tinfo 
-               = ahc_fetch_transinfo(ahc,
-                                     starget->channel + 'A',
-                                     shost->this_id, starget->id, &tstate);
-       spi_period(starget) = tinfo->curr.period;
+       struct ahc_devinfo devinfo;
+       unsigned long flags;
+
+       ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
+                           starget->channel + 'A', ROLE_INITIATOR);
+       ahc_lock(ahc, &flags);
+       ahc_set_width(ahc, &devinfo, width, AHC_TRANS_GOAL, FALSE);
+       ahc_unlock(ahc, &flags);
 }
 
 static void ahc_linux_set_period(struct scsi_target *starget, int period)
@@ -3368,16 +2545,28 @@ static void ahc_linux_set_period(struct scsi_target *starget, int period)
                                      starget->channel + 'A',
                                      shost->this_id, starget->id, &tstate);
        struct ahc_devinfo devinfo;
-       unsigned int ppr_options = tinfo->curr.ppr_options;
+       unsigned int ppr_options = tinfo->goal.ppr_options;
        unsigned long flags;
-       unsigned long offset = tinfo->curr.offset;
+       unsigned long offset = tinfo->goal.offset;
        struct ahc_syncrate *syncrate;
 
        if (offset == 0)
                offset = MAX_OFFSET;
 
+       if (period < 9)
+               period = 9;     /* 12.5ns is our minimum */
+       if (period == 9)
+               ppr_options |= MSG_EXT_PPR_DT_REQ;
+
        ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
                            starget->channel + 'A', ROLE_INITIATOR);
+
+       /* all PPR requests apart from QAS require wide transfers */
+       if (ppr_options & ~MSG_EXT_PPR_QAS_REQ) {
+               if (spi_width(starget) == 0)
+                       ppr_options &= MSG_EXT_PPR_QAS_REQ;
+       }
+
        syncrate = ahc_find_syncrate(ahc, &period, &ppr_options, AHC_SYNCRATE_DT);
        ahc_lock(ahc, &flags);
        ahc_set_syncrate(ahc, &devinfo, syncrate, period, offset,
@@ -3385,18 +2574,6 @@ static void ahc_linux_set_period(struct scsi_target *starget, int period)
        ahc_unlock(ahc, &flags);
 }
 
-static void ahc_linux_get_offset(struct scsi_target *starget)
-{
-       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
-       struct ahc_softc *ahc = *((struct ahc_softc **)shost->hostdata);
-       struct ahc_tmode_tstate *tstate;
-       struct ahc_initiator_tinfo *tinfo 
-               = ahc_fetch_transinfo(ahc,
-                                     starget->channel + 'A',
-                                     shost->this_id, starget->id, &tstate);
-       spi_offset(starget) = tinfo->curr.offset;
-}
-
 static void ahc_linux_set_offset(struct scsi_target *starget, int offset)
 {
        struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
@@ -3416,8 +2593,8 @@ static void ahc_linux_set_offset(struct scsi_target *starget, int offset)
                            starget->channel + 'A', ROLE_INITIATOR);
        if (offset != 0) {
                syncrate = ahc_find_syncrate(ahc, &period, &ppr_options, AHC_SYNCRATE_DT);
-               period = tinfo->curr.period;
-               ppr_options = tinfo->curr.ppr_options;
+               period = tinfo->goal.period;
+               ppr_options = tinfo->goal.ppr_options;
        }
        ahc_lock(ahc, &flags);
        ahc_set_syncrate(ahc, &devinfo, syncrate, period, offset,
@@ -3425,44 +2602,6 @@ static void ahc_linux_set_offset(struct scsi_target *starget, int offset)
        ahc_unlock(ahc, &flags);
 }
 
-static void ahc_linux_get_width(struct scsi_target *starget)
-{
-       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
-       struct ahc_softc *ahc = *((struct ahc_softc **)shost->hostdata);
-       struct ahc_tmode_tstate *tstate;
-       struct ahc_initiator_tinfo *tinfo 
-               = ahc_fetch_transinfo(ahc,
-                                     starget->channel + 'A',
-                                     shost->this_id, starget->id, &tstate);
-       spi_width(starget) = tinfo->curr.width;
-}
-
-static void ahc_linux_set_width(struct scsi_target *starget, int width)
-{
-       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
-       struct ahc_softc *ahc = *((struct ahc_softc **)shost->hostdata);
-       struct ahc_devinfo devinfo;
-       unsigned long flags;
-
-       ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
-                           starget->channel + 'A', ROLE_INITIATOR);
-       ahc_lock(ahc, &flags);
-       ahc_set_width(ahc, &devinfo, width, AHC_TRANS_GOAL, FALSE);
-       ahc_unlock(ahc, &flags);
-}
-
-static void ahc_linux_get_dt(struct scsi_target *starget)
-{
-       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
-       struct ahc_softc *ahc = *((struct ahc_softc **)shost->hostdata);
-       struct ahc_tmode_tstate *tstate;
-       struct ahc_initiator_tinfo *tinfo 
-               = ahc_fetch_transinfo(ahc,
-                                     starget->channel + 'A',
-                                     shost->this_id, starget->id, &tstate);
-       spi_dt(starget) = tinfo->curr.ppr_options & MSG_EXT_PPR_DT_REQ;
-}
-
 static void ahc_linux_set_dt(struct scsi_target *starget, int dt)
 {
        struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
@@ -3473,34 +2612,27 @@ static void ahc_linux_set_dt(struct scsi_target *starget, int dt)
                                      starget->channel + 'A',
                                      shost->this_id, starget->id, &tstate);
        struct ahc_devinfo devinfo;
-       unsigned int ppr_options = tinfo->curr.ppr_options
+       unsigned int ppr_options = tinfo->goal.ppr_options
                & ~MSG_EXT_PPR_DT_REQ;
-       unsigned int period = tinfo->curr.period;
+       unsigned int period = tinfo->goal.period;
        unsigned long flags;
        struct ahc_syncrate *syncrate;
 
+       if (dt) {
+               period = 9;     /* 12.5ns is the only period valid for DT */
+               ppr_options |= MSG_EXT_PPR_DT_REQ;
+       } else if (period == 9)
+               period = 10;    /* if resetting DT, period must be >= 25ns */
+
        ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
                            starget->channel + 'A', ROLE_INITIATOR);
-       syncrate = ahc_find_syncrate(ahc, &period, &ppr_options,
-                                    dt ? AHC_SYNCRATE_DT : AHC_SYNCRATE_ULTRA2);
+       syncrate = ahc_find_syncrate(ahc, &period, &ppr_options,AHC_SYNCRATE_DT);
        ahc_lock(ahc, &flags);
-       ahc_set_syncrate(ahc, &devinfo, syncrate, period, tinfo->curr.offset,
+       ahc_set_syncrate(ahc, &devinfo, syncrate, period, tinfo->goal.offset,
                         ppr_options, AHC_TRANS_GOAL, FALSE);
        ahc_unlock(ahc, &flags);
 }
 
-static void ahc_linux_get_qas(struct scsi_target *starget)
-{
-       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
-       struct ahc_softc *ahc = *((struct ahc_softc **)shost->hostdata);
-       struct ahc_tmode_tstate *tstate;
-       struct ahc_initiator_tinfo *tinfo 
-               = ahc_fetch_transinfo(ahc,
-                                     starget->channel + 'A',
-                                     shost->this_id, starget->id, &tstate);
-       spi_dt(starget) = tinfo->curr.ppr_options & MSG_EXT_PPR_QAS_REQ;
-}
-
 static void ahc_linux_set_qas(struct scsi_target *starget, int qas)
 {
        struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
@@ -3511,10 +2643,9 @@ static void ahc_linux_set_qas(struct scsi_target *starget, int qas)
                                      starget->channel + 'A',
                                      shost->this_id, starget->id, &tstate);
        struct ahc_devinfo devinfo;
-       unsigned int ppr_options = tinfo->curr.ppr_options
+       unsigned int ppr_options = tinfo->goal.ppr_options
                & ~MSG_EXT_PPR_QAS_REQ;
-       unsigned int period = tinfo->curr.period;
-       unsigned int dt = ppr_options & MSG_EXT_PPR_DT_REQ;
+       unsigned int period = tinfo->goal.period;
        unsigned long flags;
        struct ahc_syncrate *syncrate;
 
@@ -3523,26 +2654,13 @@ static void ahc_linux_set_qas(struct scsi_target *starget, int qas)
 
        ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
                            starget->channel + 'A', ROLE_INITIATOR);
-       syncrate = ahc_find_syncrate(ahc, &period, &ppr_options,
-                                    dt ? AHC_SYNCRATE_DT : AHC_SYNCRATE_ULTRA2);
+       syncrate = ahc_find_syncrate(ahc, &period, &ppr_options, AHC_SYNCRATE_DT);
        ahc_lock(ahc, &flags);
-       ahc_set_syncrate(ahc, &devinfo, syncrate, period, tinfo->curr.offset,
+       ahc_set_syncrate(ahc, &devinfo, syncrate, period, tinfo->goal.offset,
                         ppr_options, AHC_TRANS_GOAL, FALSE);
        ahc_unlock(ahc, &flags);
 }
 
-static void ahc_linux_get_iu(struct scsi_target *starget)
-{
-       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
-       struct ahc_softc *ahc = *((struct ahc_softc **)shost->hostdata);
-       struct ahc_tmode_tstate *tstate;
-       struct ahc_initiator_tinfo *tinfo 
-               = ahc_fetch_transinfo(ahc,
-                                     starget->channel + 'A',
-                                     shost->this_id, starget->id, &tstate);
-       spi_dt(starget) = tinfo->curr.ppr_options & MSG_EXT_PPR_IU_REQ;
-}
-
 static void ahc_linux_set_iu(struct scsi_target *starget, int iu)
 {
        struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
@@ -3553,10 +2671,9 @@ static void ahc_linux_set_iu(struct scsi_target *starget, int iu)
                                      starget->channel + 'A',
                                      shost->this_id, starget->id, &tstate);
        struct ahc_devinfo devinfo;
-       unsigned int ppr_options = tinfo->curr.ppr_options
+       unsigned int ppr_options = tinfo->goal.ppr_options
                & ~MSG_EXT_PPR_IU_REQ;
-       unsigned int period = tinfo->curr.period;
-       unsigned int dt = ppr_options & MSG_EXT_PPR_DT_REQ;
+       unsigned int period = tinfo->goal.period;
        unsigned long flags;
        struct ahc_syncrate *syncrate;
 
@@ -3565,31 +2682,24 @@ static void ahc_linux_set_iu(struct scsi_target *starget, int iu)
 
        ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
                            starget->channel + 'A', ROLE_INITIATOR);
-       syncrate = ahc_find_syncrate(ahc, &period, &ppr_options,
-                                    dt ? AHC_SYNCRATE_DT : AHC_SYNCRATE_ULTRA2);
+       syncrate = ahc_find_syncrate(ahc, &period, &ppr_options, AHC_SYNCRATE_DT);
        ahc_lock(ahc, &flags);
-       ahc_set_syncrate(ahc, &devinfo, syncrate, period, tinfo->curr.offset,
+       ahc_set_syncrate(ahc, &devinfo, syncrate, period, tinfo->goal.offset,
                         ppr_options, AHC_TRANS_GOAL, FALSE);
        ahc_unlock(ahc, &flags);
 }
 
 static struct spi_function_template ahc_linux_transport_functions = {
-       .get_offset     = ahc_linux_get_offset,
        .set_offset     = ahc_linux_set_offset,
        .show_offset    = 1,
-       .get_period     = ahc_linux_get_period,
        .set_period     = ahc_linux_set_period,
        .show_period    = 1,
-       .get_width      = ahc_linux_get_width,
        .set_width      = ahc_linux_set_width,
        .show_width     = 1,
-       .get_dt         = ahc_linux_get_dt,
        .set_dt         = ahc_linux_set_dt,
        .show_dt        = 1,
-       .get_iu         = ahc_linux_get_iu,
        .set_iu         = ahc_linux_set_iu,
        .show_iu        = 1,
-       .get_qas        = ahc_linux_get_qas,
        .set_qas        = ahc_linux_set_qas,
        .show_qas       = 1,
 };
@@ -3599,38 +2709,23 @@ static struct spi_function_template ahc_linux_transport_functions = {
 static int __init
 ahc_linux_init(void)
 {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
        ahc_linux_transport_template = spi_attach_transport(&ahc_linux_transport_functions);
        if (!ahc_linux_transport_template)
                return -ENODEV;
+       scsi_transport_reserve_target(ahc_linux_transport_template,
+                                     sizeof(struct ahc_linux_target));
+       scsi_transport_reserve_device(ahc_linux_transport_template,
+                                     sizeof(struct ahc_linux_device));
        if (ahc_linux_detect(&aic7xxx_driver_template))
                return 0;
        spi_release_transport(ahc_linux_transport_template);
        ahc_linux_exit();
        return -ENODEV;
-#else
-       scsi_register_module(MODULE_SCSI_HA, &aic7xxx_driver_template);
-       if (aic7xxx_driver_template.present == 0) {
-               scsi_unregister_module(MODULE_SCSI_HA,
-                                      &aic7xxx_driver_template);
-               return (-ENODEV);
-       }
-
-       return (0);
-#endif
 }
 
 static void
 ahc_linux_exit(void)
 {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-       /*
-        * In 2.4 we have to unregister from the PCI core _after_
-        * unregistering from the scsi midlayer to avoid dangling
-        * references.
-        */
-       scsi_unregister_module(MODULE_SCSI_HA, &aic7xxx_driver_template);
-#endif
        ahc_linux_pci_exit();
        ahc_linux_eisa_exit();
        spi_release_transport(ahc_linux_transport_template);
index ed9027bd8a40917ed2a8788ac7246e0be10219d5..8ffe2d3e1d95420198f6e80c4ba8e03e2bd6b13b 100644 (file)
@@ -59,6 +59,7 @@
 #ifndef _AIC7XXX_LINUX_H_
 #define _AIC7XXX_LINUX_H_
 
+#include <linux/config.h>
 #include <linux/types.h>
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/pci.h>
 #include <linux/smp_lock.h>
 #include <linux/version.h>
+#include <linux/interrupt.h>
 #include <linux/module.h>
+#include <linux/slab.h>
 #include <asm/byteorder.h>
 #include <asm/io.h>
 
-#include <linux/interrupt.h> /* For tasklet support. */
-#include <linux/config.h>
-#include <linux/slab.h>
+#include <scsi/scsi.h>
+#include <scsi/scsi_cmnd.h>
+#include <scsi/scsi_eh.h>
+#include <scsi/scsi_device.h>
+#include <scsi/scsi_host.h>
+#include <scsi/scsi_tcq.h>
+#include <scsi/scsi_transport.h>
+#include <scsi/scsi_transport_spi.h>
 
 /* Core SCSI definitions */
 #define AIC_LIB_PREFIX ahc
-#include "scsi.h"
-#include <scsi/scsi_host.h>
 
 /* Name space conflict with BSD queue macros */
 #ifdef LIST_HEAD
 /************************* Forward Declarations *******************************/
 struct ahc_softc;
 typedef struct pci_dev *ahc_dev_softc_t;
-typedef Scsi_Cmnd      *ahc_io_ctx_t;
+typedef struct scsi_cmnd      *ahc_io_ctx_t;
 
 /******************************* Byte Order ***********************************/
 #define ahc_htobe16(x) cpu_to_be16(x)
@@ -123,28 +129,11 @@ typedef Scsi_Cmnd      *ahc_io_ctx_t;
 #define ahc_le32toh(x) le32_to_cpu(x)
 #define ahc_le64toh(x) le64_to_cpu(x)
 
-#ifndef LITTLE_ENDIAN
-#define LITTLE_ENDIAN 1234
-#endif
-
-#ifndef BIG_ENDIAN
-#define BIG_ENDIAN 4321
-#endif
-
-#ifndef BYTE_ORDER
-#if defined(__BIG_ENDIAN)
-#define BYTE_ORDER BIG_ENDIAN
-#endif
-#if defined(__LITTLE_ENDIAN)
-#define BYTE_ORDER LITTLE_ENDIAN
-#endif
-#endif /* BYTE_ORDER */
-
 /************************* Configuration Data *********************************/
 extern u_int aic7xxx_no_probe;
 extern u_int aic7xxx_allow_memio;
 extern int aic7xxx_detect_complete;
-extern Scsi_Host_Template aic7xxx_driver_template;
+extern struct scsi_host_template aic7xxx_driver_template;
 
 /***************************** Bus Space/DMA **********************************/
 
@@ -174,11 +163,7 @@ struct ahc_linux_dma_tag
 };
 typedef struct ahc_linux_dma_tag* bus_dma_tag_t;
 
-struct ahc_linux_dmamap
-{
-       dma_addr_t      bus_addr;
-};
-typedef struct ahc_linux_dmamap* bus_dmamap_t;
+typedef dma_addr_t bus_dmamap_t;
 
 typedef int bus_dma_filter_t(void*, dma_addr_t);
 typedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int);
@@ -281,43 +266,8 @@ ahc_scb_timer_reset(struct scb *scb, u_int usec)
 /***************************** SMP support ************************************/
 #include <linux/spinlock.h>
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) || defined(SCSI_HAS_HOST_LOCK))
-#define AHC_SCSI_HAS_HOST_LOCK 1
-#else
-#define AHC_SCSI_HAS_HOST_LOCK 0
-#endif
-
 #define AIC7XXX_DRIVER_VERSION "6.2.36"
 
-/**************************** Front End Queues ********************************/
-/*
- * Data structure used to cast the Linux struct scsi_cmnd to something
- * that allows us to use the queue macros.  The linux structure has
- * plenty of space to hold the links fields as required by the queue
- * macros, but the queue macors require them to have the correct type.
- */
-struct ahc_cmd_internal {
-       /* Area owned by the Linux scsi layer. */
-       uint8_t private[offsetof(struct scsi_cmnd, SCp.Status)];
-       union {
-               STAILQ_ENTRY(ahc_cmd)   ste;
-               LIST_ENTRY(ahc_cmd)     le;
-               TAILQ_ENTRY(ahc_cmd)    tqe;
-       } links;
-       uint32_t                        end;
-};
-
-struct ahc_cmd {
-       union {
-               struct ahc_cmd_internal icmd;
-               struct scsi_cmnd        scsi_cmd;
-       } un;
-};
-
-#define acmd_icmd(cmd) ((cmd)->un.icmd)
-#define acmd_scsi_cmd(cmd) ((cmd)->un.scsi_cmd)
-#define acmd_links un.icmd.links
-
 /*************************** Device Data Structures ***************************/
 /*
  * A per probed device structure used to deal with some error recovery
@@ -326,23 +276,15 @@ struct ahc_cmd {
  * after a successfully completed inquiry command to the target when
  * that inquiry data indicates a lun is present.
  */
-TAILQ_HEAD(ahc_busyq, ahc_cmd);
 typedef enum {
-       AHC_DEV_UNCONFIGURED     = 0x01,
        AHC_DEV_FREEZE_TIL_EMPTY = 0x02, /* Freeze queue until active == 0 */
-       AHC_DEV_TIMER_ACTIVE     = 0x04, /* Our timer is active */
-       AHC_DEV_ON_RUN_LIST      = 0x08, /* Queued to be run later */
        AHC_DEV_Q_BASIC          = 0x10, /* Allow basic device queuing */
        AHC_DEV_Q_TAGGED         = 0x20, /* Allow full SCSI2 command queueing */
        AHC_DEV_PERIODIC_OTAG    = 0x40, /* Send OTAG to prevent starvation */
-       AHC_DEV_SLAVE_CONFIGURED = 0x80  /* slave_configure() has been called */
 } ahc_linux_dev_flags;
 
 struct ahc_linux_target;
 struct ahc_linux_device {
-       TAILQ_ENTRY(ahc_linux_device) links;
-       struct          ahc_busyq busyq;
-
        /*
         * The number of transactions currently
         * queued to the device.
@@ -381,11 +323,6 @@ struct ahc_linux_device {
 
        ahc_linux_dev_flags     flags;
 
-       /*
-        * Per device timer.
-        */
-       struct timer_list       timer;
-
        /*
         * The high limit for the tags variable.
         */
@@ -417,17 +354,10 @@ struct ahc_linux_device {
         */
        u_int                   commands_since_idle_or_otag;
 #define AHC_OTAG_THRESH        500
-
-       int                     lun;
-       Scsi_Device            *scsi_device;
-       struct                  ahc_linux_target *target;
 };
 
 struct ahc_linux_target {
-       struct ahc_linux_device  *devices[AHC_NUM_LUNS];
-       int                       channel;
-       int                       target;
-       int                       refcount;
+       struct scsi_device       *sdev[AHC_NUM_LUNS];
        struct ahc_transinfo      last_tinfo;
        struct ahc_softc         *ahc;
 };
@@ -439,32 +369,16 @@ struct ahc_linux_target {
  * manner and are allocated below 4GB, the number of S/G segments is
  * unrestricted.
  */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-/*
- * We dynamically adjust the number of segments in pre-2.5 kernels to
- * avoid fragmentation issues in the SCSI mid-layer's private memory
- * allocator.  See aic7xxx_osm.c ahc_linux_size_nseg() for details.
- */
-extern u_int ahc_linux_nseg;
-#define        AHC_NSEG ahc_linux_nseg
-#define        AHC_LINUX_MIN_NSEG 64
-#else
 #define        AHC_NSEG 128
-#endif
 
 /*
  * Per-SCB OSM storage.
  */
-typedef enum {
-       AHC_UP_EH_SEMAPHORE = 0x1
-} ahc_linux_scb_flags;
-
 struct scb_platform_data {
        struct ahc_linux_device *dev;
        dma_addr_t               buf_busaddr;
        uint32_t                 xfer_len;
        uint32_t                 sense_resid;   /* Auto-Sense residual */
-       ahc_linux_scb_flags      flags;
 };
 
 /*
@@ -473,39 +387,24 @@ struct scb_platform_data {
  * alignment restrictions of the various platforms supported by
  * this driver.
  */
-typedef enum {
-       AHC_RUN_CMPLT_Q_TIMER    = 0x10
-} ahc_linux_softc_flags;
-
-TAILQ_HEAD(ahc_completeq, ahc_cmd);
-
 struct ahc_platform_data {
        /*
         * Fields accessed from interrupt context.
         */
-       struct ahc_linux_target *targets[AHC_NUM_TARGETS]; 
-       TAILQ_HEAD(, ahc_linux_device) device_runq;
-       struct ahc_completeq     completeq;
+       struct scsi_target *starget[AHC_NUM_TARGETS]; 
 
        spinlock_t               spin_lock;
-       struct tasklet_struct    runq_tasklet;
        u_int                    qfrozen;
-       pid_t                    dv_pid;
-       struct timer_list        completeq_timer;
        struct timer_list        reset_timer;
        struct semaphore         eh_sem;
-       struct semaphore         dv_sem;
-       struct semaphore         dv_cmd_sem;    /* XXX This needs to be in
-                                                * the target struct
-                                                */
-       struct scsi_device      *dv_scsi_dev;
        struct Scsi_Host        *host;          /* pointer to scsi host */
 #define AHC_LINUX_NOIRQ        ((uint32_t)~0)
        uint32_t                 irq;           /* IRQ for this adapter */
        uint32_t                 bios_address;
        uint32_t                 mem_busaddr;   /* Mem Base Addr */
-       uint64_t                 hw_dma_mask;
-       ahc_linux_softc_flags    flags;
+
+#define        AHC_UP_EH_SEMAPHORE      0x1
+       uint32_t                 flags;
 };
 
 /************************** OS Utility Wrappers *******************************/
@@ -594,7 +493,7 @@ ahc_insb(struct ahc_softc * ahc, long port, uint8_t *array, int count)
 
 /**************************** Initialization **********************************/
 int            ahc_linux_register_host(struct ahc_softc *,
-                                       Scsi_Host_Template *);
+                                       struct scsi_host_template *);
 
 uint64_t       ahc_linux_get_memsize(void);
 
@@ -615,17 +514,6 @@ static __inline void ahc_lockinit(struct ahc_softc *);
 static __inline void ahc_lock(struct ahc_softc *, unsigned long *flags);
 static __inline void ahc_unlock(struct ahc_softc *, unsigned long *flags);
 
-/* Lock acquisition and release of the above lock in midlayer entry points. */
-static __inline void ahc_midlayer_entrypoint_lock(struct ahc_softc *,
-                                                 unsigned long *flags);
-static __inline void ahc_midlayer_entrypoint_unlock(struct ahc_softc *,
-                                                   unsigned long *flags);
-
-/* Lock held during command compeletion to the upper layer */
-static __inline void ahc_done_lockinit(struct ahc_softc *);
-static __inline void ahc_done_lock(struct ahc_softc *, unsigned long *flags);
-static __inline void ahc_done_unlock(struct ahc_softc *, unsigned long *flags);
-
 /* Lock held during ahc_list manipulation and ahc softc frees */
 extern spinlock_t ahc_list_spinlock;
 static __inline void ahc_list_lockinit(void);
@@ -650,57 +538,6 @@ ahc_unlock(struct ahc_softc *ahc, unsigned long *flags)
        spin_unlock_irqrestore(&ahc->platform_data->spin_lock, *flags);
 }
 
-static __inline void
-ahc_midlayer_entrypoint_lock(struct ahc_softc *ahc, unsigned long *flags)
-{
-       /*
-        * In 2.5.X and some 2.4.X versions, the midlayer takes our
-        * lock just before calling us, so we avoid locking again.
-        * For other kernel versions, the io_request_lock is taken
-        * just before our entry point is called.  In this case, we
-        * trade the io_request_lock for our per-softc lock.
-        */
-#if AHC_SCSI_HAS_HOST_LOCK == 0
-       spin_unlock(&io_request_lock);
-       spin_lock(&ahc->platform_data->spin_lock);
-#endif
-}
-
-static __inline void
-ahc_midlayer_entrypoint_unlock(struct ahc_softc *ahc, unsigned long *flags)
-{
-#if AHC_SCSI_HAS_HOST_LOCK == 0
-       spin_unlock(&ahc->platform_data->spin_lock);
-       spin_lock(&io_request_lock);
-#endif
-}
-
-static __inline void
-ahc_done_lockinit(struct ahc_softc *ahc)
-{
-       /*
-        * In 2.5.X, our own lock is held during completions.
-        * In previous versions, the io_request_lock is used.
-        * In either case, we can't initialize this lock again.
-        */
-}
-
-static __inline void
-ahc_done_lock(struct ahc_softc *ahc, unsigned long *flags)
-{
-#if AHC_SCSI_HAS_HOST_LOCK == 0
-       spin_lock_irqsave(&io_request_lock, *flags);
-#endif
-}
-
-static __inline void
-ahc_done_unlock(struct ahc_softc *ahc, unsigned long *flags)
-{
-#if AHC_SCSI_HAS_HOST_LOCK == 0
-       spin_unlock_irqrestore(&io_request_lock, *flags);
-#endif
-}
-
 static __inline void
 ahc_list_lockinit(void)
 {
@@ -767,14 +604,7 @@ typedef enum
 } ahc_power_state;
 
 /**************************** VL/EISA Routines ********************************/
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) \
-  && (defined(__i386__) || defined(__alpha__)) \
-  && (!defined(CONFIG_EISA)))
-#define CONFIG_EISA
-#endif
-
 #ifdef CONFIG_EISA
-extern uint32_t aic7xxx_probe_eisa_vl;
 int                     ahc_linux_eisa_init(void);
 void                    ahc_linux_eisa_exit(void);
 int                     aic7770_map_registers(struct ahc_softc *ahc,
@@ -888,22 +718,18 @@ ahc_flush_device_writes(struct ahc_softc *ahc)
 }
 
 /**************************** Proc FS Support *********************************/
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-int    ahc_linux_proc_info(char *, char **, off_t, int, int, int);
-#else
 int    ahc_linux_proc_info(struct Scsi_Host *, char *, char **,
                            off_t, int, int);
-#endif
 
 /*************************** Domain Validation ********************************/
 /*********************** Transaction Access Wrappers *************************/
-static __inline void ahc_cmd_set_transaction_status(Scsi_Cmnd *, uint32_t);
+static __inline void ahc_cmd_set_transaction_status(struct scsi_cmnd *, uint32_t);
 static __inline void ahc_set_transaction_status(struct scb *, uint32_t);
-static __inline void ahc_cmd_set_scsi_status(Scsi_Cmnd *, uint32_t);
+static __inline void ahc_cmd_set_scsi_status(struct scsi_cmnd *, uint32_t);
 static __inline void ahc_set_scsi_status(struct scb *, uint32_t);
-static __inline uint32_t ahc_cmd_get_transaction_status(Scsi_Cmnd *cmd);
+static __inline uint32_t ahc_cmd_get_transaction_status(struct scsi_cmnd *cmd);
 static __inline uint32_t ahc_get_transaction_status(struct scb *);
-static __inline uint32_t ahc_cmd_get_scsi_status(Scsi_Cmnd *cmd);
+static __inline uint32_t ahc_cmd_get_scsi_status(struct scsi_cmnd *cmd);
 static __inline uint32_t ahc_get_scsi_status(struct scb *);
 static __inline void ahc_set_transaction_tag(struct scb *, int, u_int);
 static __inline u_long ahc_get_transfer_length(struct scb *);
@@ -922,7 +748,7 @@ static __inline void ahc_platform_scb_free(struct ahc_softc *ahc,
 static __inline void ahc_freeze_scb(struct scb *scb);
 
 static __inline
-void ahc_cmd_set_transaction_status(Scsi_Cmnd *cmd, uint32_t status)
+void ahc_cmd_set_transaction_status(struct scsi_cmnd *cmd, uint32_t status)
 {
        cmd->result &= ~(CAM_STATUS_MASK << 16);
        cmd->result |= status << 16;
@@ -935,7 +761,7 @@ void ahc_set_transaction_status(struct scb *scb, uint32_t status)
 }
 
 static __inline
-void ahc_cmd_set_scsi_status(Scsi_Cmnd *cmd, uint32_t status)
+void ahc_cmd_set_scsi_status(struct scsi_cmnd *cmd, uint32_t status)
 {
        cmd->result &= ~0xFFFF;
        cmd->result |= status;
@@ -948,7 +774,7 @@ void ahc_set_scsi_status(struct scb *scb, uint32_t status)
 }
 
 static __inline
-uint32_t ahc_cmd_get_transaction_status(Scsi_Cmnd *cmd)
+uint32_t ahc_cmd_get_transaction_status(struct scsi_cmnd *cmd)
 {
        return ((cmd->result >> 16) & CAM_STATUS_MASK);
 }
@@ -960,7 +786,7 @@ uint32_t ahc_get_transaction_status(struct scb *scb)
 }
 
 static __inline
-uint32_t ahc_cmd_get_scsi_status(Scsi_Cmnd *cmd)
+uint32_t ahc_cmd_get_scsi_status(struct scsi_cmnd *cmd)
 {
        return (cmd->result & 0xFFFF);
 }
@@ -1043,7 +869,6 @@ ahc_notify_xfer_settings_change(struct ahc_softc *ahc,
 static __inline void
 ahc_platform_scb_free(struct ahc_softc *ahc, struct scb *scb)
 {
-       ahc->flags &= ~AHC_RESOURCE_SHORTAGE;
 }
 
 int    ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg);
index 6f6674aa31ef4308700b2ed23b0741abceb59f35..89d737ee551a71c978f9670fdd58a096c9f0c6ae 100644 (file)
@@ -140,27 +140,17 @@ struct pci_driver aic7xxx_pci_driver = {
 static void
 ahc_linux_pci_dev_remove(struct pci_dev *pdev)
 {
-       struct ahc_softc *ahc;
-       u_long l;
+       struct ahc_softc *ahc = pci_get_drvdata(pdev);
+       u_long s;
 
-       /*
-        * We should be able to just perform
-        * the free directly, but check our
-        * list for extra sanity.
-        */
-       ahc_list_lock(&l);
-       ahc = ahc_find_softc((struct ahc_softc *)pci_get_drvdata(pdev));
-       if (ahc != NULL) {
-               u_long s;
+       ahc_list_lock(&s);
+       TAILQ_REMOVE(&ahc_tailq, ahc, links);
+       ahc_list_unlock(&s);
 
-               TAILQ_REMOVE(&ahc_tailq, ahc, links);
-               ahc_list_unlock(&l);
-               ahc_lock(ahc, &s);
-               ahc_intr_enable(ahc, FALSE);
-               ahc_unlock(ahc, &s);
-               ahc_free(ahc);
-       } else
-               ahc_list_unlock(&l);
+       ahc_lock(ahc, &s);
+       ahc_intr_enable(ahc, FALSE);
+       ahc_unlock(ahc, &s);
+       ahc_free(ahc);
 }
 
 static int
@@ -174,22 +164,6 @@ ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        char            *name;
        int              error;
 
-       /*
-        * Some BIOSen report the same device multiple times.
-        */
-       TAILQ_FOREACH(ahc, &ahc_tailq, links) {
-               struct pci_dev *probed_pdev;
-
-               probed_pdev = ahc->dev_softc;
-               if (probed_pdev->bus->number == pdev->bus->number
-                && probed_pdev->devfn == pdev->devfn)
-                       break;
-       }
-       if (ahc != NULL) {
-               /* Skip duplicate. */
-               return (-ENODEV);
-       }
-
        pci = pdev;
        entry = ahc_find_pci_device(pci);
        if (entry == NULL)
@@ -221,13 +195,11 @@ ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
         && ahc_linux_get_memsize() > 0x80000000
         && pci_set_dma_mask(pdev, mask_39bit) == 0) {
                ahc->flags |= AHC_39BIT_ADDRESSING;
-               ahc->platform_data->hw_dma_mask = mask_39bit;
        } else {
                if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
                        printk(KERN_WARNING "aic7xxx: No suitable DMA available.\n");
                        return (-ENODEV);
                }
-               ahc->platform_data->hw_dma_mask = DMA_32BIT_MASK;
        }
        ahc->dev_softc = pci;
        error = ahc_pci_config(ahc, entry);
@@ -236,15 +208,8 @@ ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                return (-error);
        }
        pci_set_drvdata(pdev, ahc);
-       if (aic7xxx_detect_complete) {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+       if (aic7xxx_detect_complete)
                ahc_linux_register_host(ahc, &aic7xxx_driver_template);
-#else
-               printf("aic7xxx: ignoring PCI device found after "
-                      "initialization\n");
-               return (-ENODEV);
-#endif
-       }
        return (0);
 }
 
index 85e80eecc9d044c539bc75a5b3d91d9a736ab6aa..ab4469d83fb1d95fee4f5e06fa87dcfa39491f12 100644 (file)
@@ -50,7 +50,7 @@ static void   ahc_dump_target_state(struct ahc_softc *ahc,
                                      u_int our_id, char channel,
                                      u_int target_id, u_int target_offset);
 static void    ahc_dump_device_state(struct info_str *info,
-                                     struct ahc_linux_device *dev);
+                                     struct scsi_device *dev);
 static int     ahc_proc_write_seeprom(struct ahc_softc *ahc,
                                       char *buffer, int length);
 
@@ -142,6 +142,7 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info,
                      u_int target_offset)
 {
        struct  ahc_linux_target *targ;
+       struct  scsi_target *starget;
        struct  ahc_initiator_tinfo *tinfo;
        struct  ahc_tmode_tstate *tstate;
        int     lun;
@@ -153,7 +154,8 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info,
        copy_info(info, "Target %d Negotiation Settings\n", target_id);
        copy_info(info, "\tUser: ");
        ahc_format_transinfo(info, &tinfo->user);
-       targ = ahc->platform_data->targets[target_offset];
+       starget = ahc->platform_data->starget[target_offset];
+       targ = scsi_transport_target_data(starget);
        if (targ == NULL)
                return;
 
@@ -163,22 +165,25 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info,
        ahc_format_transinfo(info, &tinfo->curr);
 
        for (lun = 0; lun < AHC_NUM_LUNS; lun++) {
-               struct ahc_linux_device *dev;
+               struct scsi_device *sdev;
 
-               dev = targ->devices[lun];
+               sdev = targ->sdev[lun];
 
-               if (dev == NULL)
+               if (sdev == NULL)
                        continue;
 
-               ahc_dump_device_state(info, dev);
+               ahc_dump_device_state(info, sdev);
        }
 }
 
 static void
-ahc_dump_device_state(struct info_str *info, struct ahc_linux_device *dev)
+ahc_dump_device_state(struct info_str *info, struct scsi_device *sdev)
 {
+       struct ahc_linux_device *dev = scsi_transport_device_data(sdev);
+
        copy_info(info, "\tChannel %c Target %d Lun %d Settings\n",
-                 dev->target->channel + 'A', dev->target->target, dev->lun);
+                 sdev->sdev_target->channel + 'A',
+                 sdev->sdev_target->id, sdev->lun);
 
        copy_info(info, "\t\tCommands Queued %ld\n", dev->commands_issued);
        copy_info(info, "\t\tCommands Active %d\n", dev->active);
@@ -289,36 +294,16 @@ done:
  * Return information to handle /proc support for the driver.
  */
 int
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-ahc_linux_proc_info(char *buffer, char **start, off_t offset,
-                   int length, int hostno, int inout)
-#else
 ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
                    off_t offset, int length, int inout)
-#endif
 {
-       struct  ahc_softc *ahc;
+       struct  ahc_softc *ahc = *(struct ahc_softc **)shost->hostdata;
        struct  info_str info;
        char    ahc_info[256];
-       u_long  s;
        u_int   max_targ;
        u_int   i;
        int     retval;
 
-       retval = -EINVAL;
-       ahc_list_lock(&s);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-       TAILQ_FOREACH(ahc, &ahc_tailq, links) {
-               if (ahc->platform_data->host->host_no == hostno)
-                       break;
-       }
-#else
-       ahc = ahc_find_softc(*(struct ahc_softc **)shost->hostdata);
-#endif
-
-       if (ahc == NULL)
-               goto done;
-
         /* Has data been written to the file? */ 
        if (inout == TRUE) {
                retval = ahc_proc_write_seeprom(ahc, buffer, length);
@@ -380,6 +365,5 @@ ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
        }
        retval = info.pos > info.offset ? info.pos - info.offset : 0;
 done:
-       ahc_list_unlock(&s);
        return (retval);
 }
index 79bfd9efd8ed924451701fb1e73bdf8fd79eca22..7c5a6db0e6724c5a0aa933575f57bc603090609b 100644 (file)
@@ -35,7 +35,6 @@
 #include <linux/version.h>
 
 /* Core SCSI definitions */
-#include "scsi.h"
 #include <scsi/scsi_host.h>
 #include "aiclib.h"
 #include "cam.h"
index 9e9d0c40187e50ed1af8e5199514611e0903f26f..fac091e7093c2e490d789704eaa9afdf6cf583ba 100644 (file)
@@ -10358,7 +10358,7 @@ aic7xxx_queue(Scsi_Cmnd *cmd, void (*fn)(Scsi_Cmnd *))
  *   Returns an enumerated type that indicates the status of the operation.
  *-F*************************************************************************/
 static int
-aic7xxx_bus_device_reset(Scsi_Cmnd *cmd)
+__aic7xxx_bus_device_reset(Scsi_Cmnd *cmd)
 {
   struct aic7xxx_host  *p;
   struct aic7xxx_scb   *scb;
@@ -10551,6 +10551,18 @@ aic7xxx_bus_device_reset(Scsi_Cmnd *cmd)
     return SUCCESS;
 }
 
+static int
+aic7xxx_bus_device_reset(Scsi_Cmnd *cmd)
+{
+      int rc;
+
+      spin_lock_irq(cmd->device->host->host_lock);
+      rc = __aic7xxx_bus_device_reset(cmd);
+      spin_unlock_irq(cmd->device->host->host_lock);
+
+      return rc;
+}
+
 
 /*+F*************************************************************************
  * Function:
@@ -10585,7 +10597,7 @@ aic7xxx_panic_abort(struct aic7xxx_host *p, Scsi_Cmnd *cmd)
  *   Abort the current SCSI command(s).
  *-F*************************************************************************/
 static int
-aic7xxx_abort(Scsi_Cmnd *cmd)
+__aic7xxx_abort(Scsi_Cmnd *cmd)
 {
   struct aic7xxx_scb  *scb = NULL;
   struct aic7xxx_host *p;
@@ -10802,6 +10814,19 @@ success:
   return SUCCESS;
 }
 
+static int
+aic7xxx_abort(Scsi_Cmnd *cmd)
+{
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = __aic7xxx_abort(cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
+}
+
+
 /*+F*************************************************************************
  * Function:
  *   aic7xxx_reset
@@ -10820,6 +10845,8 @@ aic7xxx_reset(Scsi_Cmnd *cmd)
   struct aic_dev_data *aic_dev;
 
   p = (struct aic7xxx_host *) cmd->device->host->hostdata;
+  spin_lock_irq(p->host->host_lock);
+
   aic_dev = AIC_DEV(cmd);
   if(aic7xxx_position(cmd) < p->scb_data->numscbs)
   {
@@ -10859,6 +10886,7 @@ aic7xxx_reset(Scsi_Cmnd *cmd)
      * longer have it.
      */
     unpause_sequencer(p, FALSE);
+    spin_unlock_irq(p->host->host_lock);
     return SUCCESS;
   }
     
@@ -10882,7 +10910,6 @@ aic7xxx_reset(Scsi_Cmnd *cmd)
   unpause_sequencer(p, FALSE);
   spin_unlock_irq(p->host->host_lock);
   ssleep(2);
-  spin_lock_irq(p->host->host_lock);
   return SUCCESS;
 }
 
index 27271bfc01d70a63ef5d288ae65c34bbf45b27b9..26498553a7cc52f2b216e1fa7176686aa756f5c1 100644 (file)
@@ -244,9 +244,7 @@ static Scsi_Host_Template cumanascsi_template = {
        .info                   = cumanascsi_info,
        .queuecommand           = cumanascsi_queue_command,
        .eh_abort_handler       = NCR5380_abort,
-       .eh_device_reset_handler= NCR5380_device_reset,
        .eh_bus_reset_handler   = NCR5380_bus_reset,
-       .eh_host_reset_handler  = NCR5380_host_reset,
        .can_queue              = 16,
        .this_id                = 7,
        .sg_tablesize           = SG_ALL,
index 303648a847090d080ccea83e8b6db5b4b329fd80..f8a7fdd3c46523b5b69081b5844331f3943aa4b0 100644 (file)
@@ -162,9 +162,7 @@ static Scsi_Host_Template ecoscsi_template =  {
        .info           = ecoscsi_info,
        .queuecommand   = ecoscsi_queue_command,
        .eh_abort_handler       = NCR5380_abort,
-       .eh_device_reset_handler= NCR5380_device_reset,
        .eh_bus_reset_handler   = NCR5380_bus_reset,
-       .eh_host_reset_handler  = NCR5380_host_reset,
        .can_queue      = 16,
        .this_id        = 7,
        .sg_tablesize   = SG_ALL,
index 78b7e543471bde15b91c36497c3258b96d209dab..ce711f166cfb5a16b58a009e8af5eceba4b6f1ea 100644 (file)
@@ -466,7 +466,7 @@ int eesoxscsi_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_
        return pos;
 }
 
-static ssize_t eesoxscsi_show_term(struct device *dev, char *buf)
+static ssize_t eesoxscsi_show_term(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        struct Scsi_Host *host = ecard_get_drvdata(ec);
@@ -475,7 +475,7 @@ static ssize_t eesoxscsi_show_term(struct device *dev, char *buf)
        return sprintf(buf, "%d\n", info->control & EESOX_TERM_ENABLE ? 1 : 0);
 }
 
-static ssize_t eesoxscsi_store_term(struct device *dev, const char *buf, size_t len)
+static ssize_t eesoxscsi_store_term(struct device *dev, struct device_attribute *attr, const char *buf, size_t len)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        struct Scsi_Host *host = ecard_get_drvdata(ec);
index 3838f88e1fe01ee38166b9bba6093520d6cf0728..4772fb317f3e5d9aa5f603e7e30d98b09e64a33a 100644 (file)
@@ -2659,6 +2659,8 @@ int fas216_eh_host_reset(Scsi_Cmnd *SCpnt)
 {
        FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
 
+       spin_lock_irq(info->host->host_lock);
+
        fas216_checkmagic(info);
 
        printk("scsi%d.%c: %s: resetting host\n",
@@ -2686,6 +2688,7 @@ int fas216_eh_host_reset(Scsi_Cmnd *SCpnt)
 
        fas216_init_chip(info);
 
+       spin_unlock_irq(info->host->host_lock);
        return SUCCESS;
 }
 
index ff2554f4cb802651189ca764c788c218e606d1c0..de24bb991f1d74ff1a50f34c2a6c8dd2a99de11d 100644 (file)
@@ -118,9 +118,7 @@ static Scsi_Host_Template oakscsi_template = {
        .info                   = oakscsi_info,
        .queuecommand           = oakscsi_queue_command,
        .eh_abort_handler       = NCR5380_abort,
-       .eh_device_reset_handler= NCR5380_device_reset,
        .eh_bus_reset_handler   = NCR5380_bus_reset,
-       .eh_host_reset_handler  = NCR5380_host_reset,
        .can_queue              = 16,
        .this_id                = 7,
        .sg_tablesize           = SG_ALL,
index 54f23be6460fdb7f450c3884c59aac64a82024e8..abda216113f1d03c470230b81a2885969d3e0263 100644 (file)
@@ -269,7 +269,7 @@ int powertecscsi_proc_info(struct Scsi_Host *host, char *buffer, char **start, o
        return pos;
 }
 
-static ssize_t powertecscsi_show_term(struct device *dev, char *buf)
+static ssize_t powertecscsi_show_term(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        struct Scsi_Host *host = ecard_get_drvdata(ec);
@@ -279,7 +279,7 @@ static ssize_t powertecscsi_show_term(struct device *dev, char *buf)
 }
 
 static ssize_t
-powertecscsi_store_term(struct device *dev, const char *buf, size_t len)
+powertecscsi_store_term(struct device *dev, struct device_attribute *attr, const char *buf, size_t len)
 {
        struct expansion_card *ec = ECARD_DEV(dev);
        struct Scsi_Host *host = ecard_get_drvdata(ec);
index 3867f91ef8c7bebe3d0edf0bd2e3b326a1d4061b..3be546439252332131fac6aca81cbdea71d9934a 100644 (file)
@@ -153,6 +153,7 @@ static struct ata_port_operations piix_pata_ops = {
 
        .port_start             = ata_port_start,
        .port_stop              = ata_port_stop,
+       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_operations piix_sata_ops = {
@@ -180,6 +181,7 @@ static struct ata_port_operations piix_sata_ops = {
 
        .port_start             = ata_port_start,
        .port_stop              = ata_port_stop,
+       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_info piix_port_info[] = {
@@ -663,15 +665,6 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        return ata_pci_init_one(pdev, port_info, n_ports);
 }
 
-/**
- *     piix_init -
- *
- *     LOCKING:
- *
- *     RETURNS:
- *
- */
-
 static int __init piix_init(void)
 {
        int rc;
@@ -687,13 +680,6 @@ static int __init piix_init(void)
        return 0;
 }
 
-/**
- *     piix_exit -
- *
- *     LOCKING:
- *
- */
-
 static void __exit piix_exit(void)
 {
        pci_unregister_driver(&piix_pci_driver);
index 45b75ddacaaba558314f031a62eaa486fc5cf801..e6153fe5842a204f65f4453b0924654c1b25b207 100644 (file)
@@ -3146,8 +3146,8 @@ static const char *atp870u_info(struct Scsi_Host *notused)
 }
 
 #define BLS buffer + len + size
-int atp870u_proc_info(struct Scsi_Host *HBAptr, char *buffer, 
-                     char **start, off_t offset, int length, int inout)
+static int atp870u_proc_info(struct Scsi_Host *HBAptr, char *buffer, 
+                            char **start, off_t offset, int length, int inout)
 {
        static u8 buff[512];
        int size = 0;
diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c
new file mode 100644 (file)
index 0000000..3900e28
--- /dev/null
@@ -0,0 +1,1026 @@
+/*
+ * SCSI Media Changer device driver for Linux 2.6
+ *
+ *     (c) 1996-2003 Gerd Knorr <kraxel@bytesex.org>
+ *
+ */
+
+#define VERSION "0.25"
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/fs.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/major.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/interrupt.h>
+#include <linux/blkdev.h>
+#include <linux/completion.h>
+#include <linux/devfs_fs_kernel.h>
+#include <linux/ioctl32.h>
+#include <linux/compat.h>
+#include <linux/chio.h>                        /* here are all the ioctls */
+
+#include <scsi/scsi.h>
+#include <scsi/scsi_cmnd.h>
+#include <scsi/scsi_driver.h>
+#include <scsi/scsi_ioctl.h>
+#include <scsi/scsi_host.h>
+#include <scsi/scsi_device.h>
+#include <scsi/scsi_request.h>
+#include <scsi/scsi_dbg.h>
+
+#define CH_DT_MAX       16
+#define CH_TYPES        8
+
+MODULE_DESCRIPTION("device driver for scsi media changer devices");
+MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org>");
+MODULE_LICENSE("GPL");
+
+static int init = 1;
+module_param(init, int, 0444);
+MODULE_PARM_DESC(init, \
+    "initialize element status on driver load (default: on)");
+
+static int timeout_move = 300;
+module_param(timeout_move, int, 0644);
+MODULE_PARM_DESC(timeout_move,"timeout for move commands "
+                "(default: 300 seconds)");
+
+static int timeout_init = 3600;
+module_param(timeout_init, int, 0644);
+MODULE_PARM_DESC(timeout_init,"timeout for INITIALIZE ELEMENT STATUS "
+                "(default: 3600 seconds)");
+
+static int verbose = 1;
+module_param(verbose, int, 0644);
+MODULE_PARM_DESC(verbose,"be verbose (default: on)");
+
+static int debug = 0;
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug,"enable/disable debug messages, also prints more "
+                "detailed sense codes on scsi errors (default: off)");
+
+static int dt_id[CH_DT_MAX] = { [ 0 ... (CH_DT_MAX-1) ] = -1 };
+static int dt_lun[CH_DT_MAX];
+module_param_array(dt_id,  int, NULL, 0444);
+module_param_array(dt_lun, int, NULL, 0444);
+
+/* tell the driver about vendor-specific slots */
+static int vendor_firsts[CH_TYPES-4];
+static int vendor_counts[CH_TYPES-4];
+module_param_array(vendor_firsts, int, NULL, 0444);
+module_param_array(vendor_counts, int, NULL, 0444);
+
+static char *vendor_labels[CH_TYPES-4] = {
+       "v0", "v1", "v2", "v3"
+};
+// module_param_string_array(vendor_labels, NULL, 0444);
+
+#define dprintk(fmt, arg...)    if (debug) \
+        printk(KERN_DEBUG "%s: " fmt, ch->name , ## arg)
+#define vprintk(fmt, arg...)    if (verbose) \
+        printk(KERN_INFO "%s: " fmt, ch->name , ## arg)
+
+/* ------------------------------------------------------------------- */
+
+#define MAX_RETRIES   1
+
+static int  ch_probe(struct device *);
+static int  ch_remove(struct device *);
+static int  ch_open(struct inode * inode, struct file * filp);
+static int  ch_release(struct inode * inode, struct file * filp);
+static int  ch_ioctl(struct inode * inode, struct file * filp,
+                    unsigned int cmd, unsigned long arg);
+#ifdef CONFIG_COMPAT
+static long ch_ioctl_compat(struct file * filp,
+                           unsigned int cmd, unsigned long arg);
+#endif
+
+static struct class * ch_sysfs_class;
+
+typedef struct {
+       struct list_head    list;
+       int                 minor;
+       char                name[8];
+       struct scsi_device  *device;
+       struct scsi_device  **dt;        /* ptrs to data transfer elements */
+       u_int               firsts[CH_TYPES];
+       u_int               counts[CH_TYPES];
+       u_int               unit_attention;
+       u_int               voltags;
+       struct semaphore    lock;
+} scsi_changer;
+
+static LIST_HEAD(ch_devlist);
+static spinlock_t ch_devlist_lock = SPIN_LOCK_UNLOCKED;
+static int ch_devcount;
+
+static struct scsi_driver ch_template =
+{
+       .owner          = THIS_MODULE,
+       .gendrv         = {
+               .name   = "ch",
+               .probe  = ch_probe,
+               .remove = ch_remove,
+       },
+};
+
+static struct file_operations changer_fops =
+{
+       .owner        = THIS_MODULE,
+       .open         = ch_open,
+       .release      = ch_release,
+       .ioctl        = ch_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = ch_ioctl_compat,
+#endif
+};
+
+static struct {
+       unsigned char  sense;
+       unsigned char  asc;
+       unsigned char  ascq;
+       int            errno;
+} err[] = {
+/* Just filled in what looks right. Hav'nt checked any standard paper for
+   these errno assignments, so they may be wrong... */
+       {
+               .sense  = ILLEGAL_REQUEST,
+               .asc    = 0x21,
+               .ascq   = 0x01,
+               .errno  = EBADSLT, /* Invalid element address */
+       },{
+               .sense  = ILLEGAL_REQUEST,
+               .asc    = 0x28,
+               .ascq   = 0x01,
+               .errno  = EBADE,   /* Import or export element accessed */
+       },{
+               .sense  = ILLEGAL_REQUEST,
+               .asc    = 0x3B,
+               .ascq   = 0x0D,
+               .errno  = EXFULL,  /* Medium destination element full */
+       },{
+               .sense  = ILLEGAL_REQUEST,
+               .asc    = 0x3B,
+               .ascq   = 0x0E,
+               .errno  = EBADE,   /* Medium source element empty */
+       },{
+               .sense  = ILLEGAL_REQUEST,
+               .asc    = 0x20,
+               .ascq   = 0x00,
+               .errno  = EBADRQC, /* Invalid command operation code */
+       },{
+               /* end of list */
+       }
+};
+
+/* ------------------------------------------------------------------- */
+
+static int ch_find_errno(unsigned char *sense_buffer)
+{
+       int i,errno = 0;
+
+       /* Check to see if additional sense information is available */
+       if (sense_buffer[7]  > 5 &&
+           sense_buffer[12] != 0) {
+               for (i = 0; err[i].errno != 0; i++) {
+                       if (err[i].sense == sense_buffer[ 2] &&
+                           err[i].asc   == sense_buffer[12] &&
+                           err[i].ascq  == sense_buffer[13]) {
+                               errno = -err[i].errno;
+                               break;
+                       }
+               }
+       }
+       if (errno == 0)
+               errno = -EIO;
+       return errno;
+}
+
+static int
+ch_do_scsi(scsi_changer *ch, unsigned char *cmd,
+          void *buffer, unsigned buflength,
+          enum dma_data_direction direction)
+{
+       int errno, retries = 0, timeout;
+       struct scsi_request *sr;
+       
+       sr = scsi_allocate_request(ch->device, GFP_KERNEL);
+       if (NULL == sr)
+               return -ENOMEM;
+
+       timeout = (cmd[0] == INITIALIZE_ELEMENT_STATUS)
+               ? timeout_init : timeout_move;
+
+ retry:
+       errno = 0;
+       if (debug) {
+               dprintk("command: ");
+               __scsi_print_command(cmd);
+       }
+
+        scsi_wait_req(sr, cmd, buffer, buflength,
+                     timeout * HZ, MAX_RETRIES);
+
+       dprintk("result: 0x%x\n",sr->sr_result);
+       if (driver_byte(sr->sr_result) & DRIVER_SENSE) {
+               if (debug)
+                       scsi_print_req_sense(ch->name, sr);
+               errno = ch_find_errno(sr->sr_sense_buffer);
+
+               switch(sr->sr_sense_buffer[2] & 0xf) {
+               case UNIT_ATTENTION:
+                       ch->unit_attention = 1;
+                       if (retries++ < 3)
+                               goto retry;
+                       break;
+               }
+       }
+       scsi_release_request(sr);
+       return errno;
+}
+
+/* ------------------------------------------------------------------------ */
+
+static int
+ch_elem_to_typecode(scsi_changer *ch, u_int elem)
+{
+       int i;
+       
+       for (i = 0; i < CH_TYPES; i++) {
+               if (elem >= ch->firsts[i]  &&
+                   elem <  ch->firsts[i] +
+                   ch->counts[i])
+                       return i+1;
+       }
+       return 0;
+}
+
+static int
+ch_read_element_status(scsi_changer *ch, u_int elem, char *data)
+{
+       u_char  cmd[12];
+       u_char  *buffer;
+       int     result;
+       
+       buffer = kmalloc(512, GFP_KERNEL | GFP_DMA);
+       if(!buffer)
+               return -ENOMEM;
+       
+ retry:
+       memset(cmd,0,sizeof(cmd));
+       cmd[0] = READ_ELEMENT_STATUS;
+       cmd[1] = (ch->device->lun << 5) | 
+               (ch->voltags ? 0x10 : 0) |
+               ch_elem_to_typecode(ch,elem);
+       cmd[2] = (elem >> 8) & 0xff;
+       cmd[3] = elem        & 0xff;
+       cmd[5] = 1;
+       cmd[9] = 255;
+       if (0 == (result = ch_do_scsi(ch, cmd, buffer, 256, DMA_FROM_DEVICE))) {
+               if (((buffer[16] << 8) | buffer[17]) != elem) {
+                       dprintk("asked for element 0x%02x, got 0x%02x\n",
+                               elem,(buffer[16] << 8) | buffer[17]);
+                       kfree(buffer);
+                       return -EIO;
+               }
+               memcpy(data,buffer+16,16);
+       } else {
+               if (ch->voltags) {
+                       ch->voltags = 0;
+                       vprintk("device has no volume tag support\n");
+                       goto retry;
+               }
+               dprintk("READ ELEMENT STATUS for element 0x%x failed\n",elem);
+       }
+       kfree(buffer);
+       return result;
+}
+
+static int 
+ch_init_elem(scsi_changer *ch)
+{
+       int err;
+       u_char cmd[6];
+
+       vprintk("INITIALIZE ELEMENT STATUS, may take some time ...\n");
+       memset(cmd,0,sizeof(cmd));
+       cmd[0] = INITIALIZE_ELEMENT_STATUS;
+       cmd[1] = ch->device->lun << 5;
+       err = ch_do_scsi(ch, cmd, NULL, 0, DMA_NONE);
+       vprintk("... finished\n");
+       return err;
+}
+
+static int
+ch_readconfig(scsi_changer *ch)
+{
+       u_char  cmd[10], data[16];
+       u_char  *buffer;
+       int     result,id,lun,i;
+       u_int   elem;
+
+       buffer = kmalloc(512, GFP_KERNEL | GFP_DMA);
+       if (!buffer)
+               return -ENOMEM;
+       memset(buffer,0,512);
+       
+       memset(cmd,0,sizeof(cmd));
+       cmd[0] = MODE_SENSE;
+       cmd[1] = ch->device->lun << 5;
+       cmd[2] = 0x1d;
+       cmd[4] = 255;
+       result = ch_do_scsi(ch, cmd, buffer, 255, DMA_FROM_DEVICE);
+       if (0 != result) {
+               cmd[1] |= (1<<3);
+               result  = ch_do_scsi(ch, cmd, buffer, 255, DMA_FROM_DEVICE);
+       }
+       if (0 == result) {
+               ch->firsts[CHET_MT] =
+                       (buffer[buffer[3]+ 6] << 8) | buffer[buffer[3]+ 7];
+               ch->counts[CHET_MT] =
+                       (buffer[buffer[3]+ 8] << 8) | buffer[buffer[3]+ 9];
+               ch->firsts[CHET_ST] =
+                       (buffer[buffer[3]+10] << 8) | buffer[buffer[3]+11];
+               ch->counts[CHET_ST] =
+                       (buffer[buffer[3]+12] << 8) | buffer[buffer[3]+13];
+               ch->firsts[CHET_IE] =
+                       (buffer[buffer[3]+14] << 8) | buffer[buffer[3]+15];
+               ch->counts[CHET_IE] =
+                       (buffer[buffer[3]+16] << 8) | buffer[buffer[3]+17];
+               ch->firsts[CHET_DT] =
+                       (buffer[buffer[3]+18] << 8) | buffer[buffer[3]+19];
+               ch->counts[CHET_DT] =
+                       (buffer[buffer[3]+20] << 8) | buffer[buffer[3]+21];
+               vprintk("type #1 (mt): 0x%x+%d [medium transport]\n",
+                       ch->firsts[CHET_MT],
+                       ch->counts[CHET_MT]);
+               vprintk("type #2 (st): 0x%x+%d [storage]\n",
+                       ch->firsts[CHET_ST],
+                       ch->counts[CHET_ST]);
+               vprintk("type #3 (ie): 0x%x+%d [import/export]\n",
+                       ch->firsts[CHET_IE],
+                       ch->counts[CHET_IE]);
+               vprintk("type #4 (dt): 0x%x+%d [data transfer]\n",
+                       ch->firsts[CHET_DT],
+                       ch->counts[CHET_DT]);
+       } else {
+               vprintk("reading element address assigment page failed!\n");
+       }
+       
+       /* vendor specific element types */
+       for (i = 0; i < 4; i++) {
+               if (0 == vendor_counts[i])
+                       continue;
+               if (NULL == vendor_labels[i])
+                       continue;
+               ch->firsts[CHET_V1+i] = vendor_firsts[i];
+               ch->counts[CHET_V1+i] = vendor_counts[i];
+               vprintk("type #%d (v%d): 0x%x+%d [%s, vendor specific]\n",
+                       i+5,i+1,vendor_firsts[i],vendor_counts[i],
+                       vendor_labels[i]);
+       }
+
+       /* look up the devices of the data transfer elements */
+       ch->dt = kmalloc(ch->counts[CHET_DT]*sizeof(struct scsi_device),
+                        GFP_KERNEL);
+       for (elem = 0; elem < ch->counts[CHET_DT]; elem++) {
+               id  = -1;
+               lun = 0;
+               if (elem < CH_DT_MAX  &&  -1 != dt_id[elem]) {
+                       id  = dt_id[elem];
+                       lun = dt_lun[elem];
+                       vprintk("dt 0x%x: [insmod option] ",
+                               elem+ch->firsts[CHET_DT]);
+               } else if (0 != ch_read_element_status
+                          (ch,elem+ch->firsts[CHET_DT],data)) {
+                       vprintk("dt 0x%x: READ ELEMENT STATUS failed\n",
+                               elem+ch->firsts[CHET_DT]);
+               } else {
+                       vprintk("dt 0x%x: ",elem+ch->firsts[CHET_DT]);
+                       if (data[6] & 0x80) {
+                               if (verbose)
+                                       printk("not this SCSI bus\n");
+                               ch->dt[elem] = NULL;
+                       } else if (0 == (data[6] & 0x30)) {
+                               if (verbose)
+                                       printk("ID/LUN unknown\n");
+                               ch->dt[elem] = NULL;
+                       } else {
+                               id  = ch->device->id;
+                               lun = 0;
+                               if (data[6] & 0x20) id  = data[7];
+                               if (data[6] & 0x10) lun = data[6] & 7;
+                       }
+               }
+               if (-1 != id) {
+                       if (verbose)
+                               printk("ID %i, LUN %i, ",id,lun);
+                       ch->dt[elem] =
+                               scsi_device_lookup(ch->device->host,
+                                                  ch->device->channel,
+                                                  id,lun);
+                       if (!ch->dt[elem]) {
+                               /* should not happen */
+                               if (verbose)
+                                       printk("Huh? device not found!\n");
+                       } else {
+                               if (verbose)
+                                       printk("name: %8.8s %16.16s %4.4s\n",
+                                              ch->dt[elem]->vendor,
+                                              ch->dt[elem]->model,
+                                              ch->dt[elem]->rev);
+                       }
+               }
+       }
+       ch->voltags = 1;
+       kfree(buffer);
+
+       return 0;
+}
+
+/* ------------------------------------------------------------------------ */
+
+static int
+ch_position(scsi_changer *ch, u_int trans, u_int elem, int rotate)
+{
+       u_char  cmd[10];
+       
+       dprintk("position: 0x%x\n",elem);
+       if (0 == trans)
+               trans = ch->firsts[CHET_MT];
+       memset(cmd,0,sizeof(cmd));
+       cmd[0]  = POSITION_TO_ELEMENT;
+       cmd[1]  = ch->device->lun << 5;
+       cmd[2]  = (trans >> 8) & 0xff;
+       cmd[3]  =  trans       & 0xff;
+       cmd[4]  = (elem  >> 8) & 0xff;
+       cmd[5]  =  elem        & 0xff;
+       cmd[8]  = rotate ? 1 : 0;
+       return ch_do_scsi(ch, cmd, NULL, 0, DMA_NONE);
+}
+
+static int
+ch_move(scsi_changer *ch, u_int trans, u_int src, u_int dest, int rotate)
+{
+       u_char  cmd[12];
+       
+       dprintk("move: 0x%x => 0x%x\n",src,dest);
+       if (0 == trans)
+               trans = ch->firsts[CHET_MT];
+       memset(cmd,0,sizeof(cmd));
+       cmd[0]  = MOVE_MEDIUM;
+       cmd[1]  = ch->device->lun << 5;
+       cmd[2]  = (trans >> 8) & 0xff;
+       cmd[3]  =  trans       & 0xff;
+       cmd[4]  = (src   >> 8) & 0xff;
+       cmd[5]  =  src         & 0xff;
+       cmd[6]  = (dest  >> 8) & 0xff;
+       cmd[7]  =  dest        & 0xff;
+       cmd[10] = rotate ? 1 : 0;
+       return ch_do_scsi(ch, cmd, NULL,0, DMA_NONE);
+}
+
+static int
+ch_exchange(scsi_changer *ch, u_int trans, u_int src,
+           u_int dest1, u_int dest2, int rotate1, int rotate2)
+{
+       u_char  cmd[12];
+       
+       dprintk("exchange: 0x%x => 0x%x => 0x%x\n",
+               src,dest1,dest2);
+       if (0 == trans)
+               trans = ch->firsts[CHET_MT];
+       memset(cmd,0,sizeof(cmd));
+       cmd[0]  = EXCHANGE_MEDIUM;
+       cmd[1]  = ch->device->lun << 5;
+       cmd[2]  = (trans >> 8) & 0xff;
+       cmd[3]  =  trans       & 0xff;
+       cmd[4]  = (src   >> 8) & 0xff;
+       cmd[5]  =  src         & 0xff;
+       cmd[6]  = (dest1 >> 8) & 0xff;
+       cmd[7]  =  dest1       & 0xff;
+       cmd[8]  = (dest2 >> 8) & 0xff;
+       cmd[9]  =  dest2       & 0xff;
+       cmd[10] = (rotate1 ? 1 : 0) | (rotate2 ? 2 : 0);
+       
+       return ch_do_scsi(ch, cmd, NULL,0, DMA_NONE);
+}
+
+static void
+ch_check_voltag(char *tag)
+{
+       int i;
+
+       for (i = 0; i < 32; i++) {
+               /* restrict to ascii */
+               if (tag[i] >= 0x7f || tag[i] < 0x20)
+                       tag[i] = ' ';
+               /* don't allow search wildcards */
+               if (tag[i] == '?' ||
+                   tag[i] == '*')
+                       tag[i] = ' ';
+       }
+}
+
+static int
+ch_set_voltag(scsi_changer *ch, u_int elem,
+             int alternate, int clear, u_char *tag)
+{
+       u_char  cmd[12];
+       u_char  *buffer;
+       int result;
+
+       buffer = kmalloc(512, GFP_KERNEL);
+       if (!buffer)
+               return -ENOMEM;
+       memset(buffer,0,512);
+
+       dprintk("%s %s voltag: 0x%x => \"%s\"\n",
+               clear     ? "clear"     : "set",
+               alternate ? "alternate" : "primary",
+               elem, tag);
+       memset(cmd,0,sizeof(cmd));
+       cmd[0]  = SEND_VOLUME_TAG;
+       cmd[1] = (ch->device->lun << 5) | 
+               ch_elem_to_typecode(ch,elem);
+       cmd[2] = (elem >> 8) & 0xff;
+       cmd[3] = elem        & 0xff;
+       cmd[5] = clear
+               ? (alternate ? 0x0d : 0x0c)
+               : (alternate ? 0x0b : 0x0a);
+       
+       cmd[9] = 255;
+
+       memcpy(buffer,tag,32);
+       ch_check_voltag(buffer);
+
+       result = ch_do_scsi(ch, cmd, buffer, 256, DMA_TO_DEVICE);
+       kfree(buffer);
+       return result;
+}
+
+static int ch_gstatus(scsi_changer *ch, int type, unsigned char *dest)
+{
+       int retval = 0;
+       u_char data[16];
+       unsigned int i;
+       
+       down(&ch->lock);
+       for (i = 0; i < ch->counts[type]; i++) {
+               if (0 != ch_read_element_status
+                   (ch, ch->firsts[type]+i,data)) {
+                       retval = -EIO;
+                       break;
+               }
+               put_user(data[2], dest+i);
+               if (data[2] & CESTATUS_EXCEPT)
+                       vprintk("element 0x%x: asc=0x%x, ascq=0x%x\n",
+                               ch->firsts[type]+i,
+                               (int)data[4],(int)data[5]);
+               retval = ch_read_element_status
+                       (ch, ch->firsts[type]+i,data);
+               if (0 != retval)
+                       break;
+       }
+       up(&ch->lock);
+       return retval;
+}
+
+/* ------------------------------------------------------------------------ */
+
+static int
+ch_release(struct inode *inode, struct file *file)
+{
+       scsi_changer *ch = file->private_data;
+
+       scsi_device_put(ch->device);
+       file->private_data = NULL;
+       return 0;
+}
+
+static int
+ch_open(struct inode *inode, struct file *file)
+{
+       scsi_changer *tmp, *ch;
+       int minor = iminor(inode);
+
+       spin_lock(&ch_devlist_lock);
+       ch = NULL;
+       list_for_each_entry(tmp,&ch_devlist,list) {
+               if (tmp->minor == minor)
+                       ch = tmp;
+       }
+       if (NULL == ch || scsi_device_get(ch->device)) {
+               spin_unlock(&ch_devlist_lock);
+               return -ENXIO;
+       }
+       spin_unlock(&ch_devlist_lock);
+
+       file->private_data = ch;
+       return 0;
+}
+
+static int
+ch_checkrange(scsi_changer *ch, unsigned int type, unsigned int unit)
+{
+       if (type >= CH_TYPES  ||  unit >= ch->counts[type])
+               return -1;
+       return 0;
+}
+
+static int ch_ioctl(struct inode * inode, struct file * file,
+                   unsigned int cmd, unsigned long arg)
+{
+       scsi_changer *ch = file->private_data;
+       int retval;
+       
+       switch (cmd) {
+       case CHIOGPARAMS:
+       {
+               struct changer_params params;
+               
+               params.cp_curpicker = 0;
+               params.cp_npickers  = ch->counts[CHET_MT];
+               params.cp_nslots    = ch->counts[CHET_ST];
+               params.cp_nportals  = ch->counts[CHET_IE];
+               params.cp_ndrives   = ch->counts[CHET_DT];
+               
+               if (copy_to_user((void *) arg, &params, sizeof(params)))
+                       return -EFAULT;
+               return 0;
+       }
+       case CHIOGVPARAMS:
+       {
+               struct changer_vendor_params vparams;
+
+               memset(&vparams,0,sizeof(vparams));
+               if (ch->counts[CHET_V1]) {
+                       vparams.cvp_n1  = ch->counts[CHET_V1];
+                       strncpy(vparams.cvp_label1,vendor_labels[0],16);
+               }
+               if (ch->counts[CHET_V2]) {
+                       vparams.cvp_n2  = ch->counts[CHET_V2];
+                       strncpy(vparams.cvp_label2,vendor_labels[1],16);
+               }
+               if (ch->counts[CHET_V3]) {
+                       vparams.cvp_n3  = ch->counts[CHET_V3];
+                       strncpy(vparams.cvp_label3,vendor_labels[2],16);
+               }
+               if (ch->counts[CHET_V4]) {
+                       vparams.cvp_n4  = ch->counts[CHET_V4];
+                       strncpy(vparams.cvp_label4,vendor_labels[3],16);
+               }
+               if (copy_to_user((void *) arg, &vparams, sizeof(vparams)))
+                       return -EFAULT;
+               return 0;
+       }
+       
+       case CHIOPOSITION:
+       {
+               struct changer_position pos;
+               
+               if (copy_from_user(&pos, (void*)arg, sizeof (pos)))
+                       return -EFAULT;
+
+               if (0 != ch_checkrange(ch, pos.cp_type, pos.cp_unit)) {
+                       dprintk("CHIOPOSITION: invalid parameter\n");
+                       return -EBADSLT;
+               }
+               down(&ch->lock);
+               retval = ch_position(ch,0,
+                                    ch->firsts[pos.cp_type] + pos.cp_unit,
+                                    pos.cp_flags & CP_INVERT);
+               up(&ch->lock);
+               return retval;
+       }
+       
+       case CHIOMOVE:
+       {
+               struct changer_move mv;
+
+               if (copy_from_user(&mv, (void*)arg, sizeof (mv)))
+                       return -EFAULT;
+
+               if (0 != ch_checkrange(ch, mv.cm_fromtype, mv.cm_fromunit) ||
+                   0 != ch_checkrange(ch, mv.cm_totype,   mv.cm_tounit  )) {
+                       dprintk("CHIOMOVE: invalid parameter\n");
+                       return -EBADSLT;
+               }
+               
+               down(&ch->lock);
+               retval = ch_move(ch,0,
+                                ch->firsts[mv.cm_fromtype] + mv.cm_fromunit,
+                                ch->firsts[mv.cm_totype]   + mv.cm_tounit,
+                                mv.cm_flags & CM_INVERT);
+               up(&ch->lock);
+               return retval;
+       }
+
+       case CHIOEXCHANGE:
+       {
+               struct changer_exchange mv;
+               
+               if (copy_from_user(&mv, (void*)arg, sizeof (mv)))
+                       return -EFAULT;
+
+               if (0 != ch_checkrange(ch, mv.ce_srctype,  mv.ce_srcunit ) ||
+                   0 != ch_checkrange(ch, mv.ce_fdsttype, mv.ce_fdstunit) ||
+                   0 != ch_checkrange(ch, mv.ce_sdsttype, mv.ce_sdstunit)) {
+                       dprintk("CHIOEXCHANGE: invalid parameter\n");
+                       return -EBADSLT;
+               }
+               
+               down(&ch->lock);
+               retval = ch_exchange
+                       (ch,0,
+                        ch->firsts[mv.ce_srctype]  + mv.ce_srcunit,
+                        ch->firsts[mv.ce_fdsttype] + mv.ce_fdstunit,
+                        ch->firsts[mv.ce_sdsttype] + mv.ce_sdstunit,
+                        mv.ce_flags & CE_INVERT1, mv.ce_flags & CE_INVERT2);
+               up(&ch->lock);
+               return retval;
+       }
+
+       case CHIOGSTATUS:
+       {
+               struct changer_element_status ces;
+               
+               if (copy_from_user(&ces, (void*)arg, sizeof (ces)))
+                       return -EFAULT;
+               if (ces.ces_type < 0 || ces.ces_type >= CH_TYPES)
+                       return -EINVAL;
+
+               return ch_gstatus(ch, ces.ces_type, ces.ces_data);
+       }
+
+       case CHIOGELEM:
+       {
+               struct changer_get_element cge;
+               u_char  cmd[12];
+               u_char  *buffer;
+               unsigned int elem;
+               int     result,i;
+               
+               if (copy_from_user(&cge, (void*)arg, sizeof (cge)))
+                       return -EFAULT;
+
+               if (0 != ch_checkrange(ch, cge.cge_type, cge.cge_unit))
+                       return -EINVAL;
+               elem = ch->firsts[cge.cge_type] + cge.cge_unit;
+               
+               buffer = kmalloc(512, GFP_KERNEL | GFP_DMA);
+               if (!buffer)
+                       return -ENOMEM;
+               down(&ch->lock);
+               
+       voltag_retry:
+               memset(cmd,0,sizeof(cmd));
+               cmd[0] = READ_ELEMENT_STATUS;
+               cmd[1] = (ch->device->lun << 5) |
+                       (ch->voltags ? 0x10 : 0) |
+                       ch_elem_to_typecode(ch,elem);
+               cmd[2] = (elem >> 8) & 0xff;
+               cmd[3] = elem        & 0xff;
+               cmd[5] = 1;
+               cmd[9] = 255;
+               
+               if (0 == (result = ch_do_scsi(ch, cmd, buffer, 256, DMA_FROM_DEVICE))) {
+                       cge.cge_status = buffer[18];
+                       cge.cge_flags = 0;
+                       if (buffer[18] & CESTATUS_EXCEPT) {
+                               cge.cge_errno = EIO;
+                       }
+                       if (buffer[25] & 0x80) {
+                               cge.cge_flags |= CGE_SRC;
+                               if (buffer[25] & 0x40)
+                                       cge.cge_flags |= CGE_INVERT;
+                               elem = (buffer[26]<<8) | buffer[27];
+                               for (i = 0; i < 4; i++) {
+                                       if (elem >= ch->firsts[i] &&
+                                           elem <  ch->firsts[i] + ch->counts[i]) {
+                                               cge.cge_srctype = i;
+                                               cge.cge_srcunit = elem-ch->firsts[i];
+                                       }
+                               }
+                       }
+                       if ((buffer[22] & 0x30) == 0x30) {
+                               cge.cge_flags |= CGE_IDLUN;
+                               cge.cge_id  = buffer[23];
+                               cge.cge_lun = buffer[22] & 7;
+                       }
+                       if (buffer[9] & 0x80) {
+                               cge.cge_flags |= CGE_PVOLTAG;
+                               memcpy(cge.cge_pvoltag,buffer+28,36);
+                       }
+                       if (buffer[9] & 0x40) {
+                               cge.cge_flags |= CGE_AVOLTAG;
+                               memcpy(cge.cge_avoltag,buffer+64,36);
+                       }
+               } else if (ch->voltags) {
+                       ch->voltags = 0;
+                       vprintk("device has no volume tag support\n");
+                       goto voltag_retry;
+               }
+               kfree(buffer);
+               up(&ch->lock);
+               
+               if (copy_to_user((void*)arg, &cge, sizeof (cge)))
+                       return -EFAULT;
+               return result;
+       }
+
+       case CHIOINITELEM:
+       {
+               down(&ch->lock);
+               retval = ch_init_elem(ch);
+               up(&ch->lock);
+               return retval;
+       }
+               
+       case CHIOSVOLTAG:
+       {
+               struct changer_set_voltag csv;
+               int elem;
+
+               if (copy_from_user(&csv, (void*)arg, sizeof(csv)))
+                       return -EFAULT;
+
+               if (0 != ch_checkrange(ch, csv.csv_type, csv.csv_unit)) {
+                       dprintk("CHIOSVOLTAG: invalid parameter\n");
+                       return -EBADSLT;
+               }
+               elem = ch->firsts[csv.csv_type] + csv.csv_unit;
+               down(&ch->lock);
+               retval = ch_set_voltag(ch, elem,
+                                      csv.csv_flags & CSV_AVOLTAG,
+                                      csv.csv_flags & CSV_CLEARTAG,
+                                      csv.csv_voltag);
+               up(&ch->lock);
+               return retval;
+       }
+
+       default:
+               return scsi_ioctl(ch->device, cmd, (void*)arg);
+
+       }
+}
+
+#ifdef CONFIG_COMPAT
+
+struct changer_element_status32 {
+       int             ces_type;
+       compat_uptr_t   ces_data;
+};
+#define CHIOGSTATUS32  _IOW('c', 8,struct changer_element_status32)
+
+static long ch_ioctl_compat(struct file * file,
+                           unsigned int cmd, unsigned long arg)
+{
+       scsi_changer *ch = file->private_data;
+       
+       switch (cmd) {
+       case CHIOGPARAMS:
+       case CHIOGVPARAMS:
+       case CHIOPOSITION:
+       case CHIOMOVE:
+       case CHIOEXCHANGE:
+       case CHIOGELEM:
+       case CHIOINITELEM:
+       case CHIOSVOLTAG:
+               /* compatible */
+               return ch_ioctl(NULL /* inode, unused */,
+                               file, cmd, arg);
+       case CHIOGSTATUS32:
+       {
+               struct changer_element_status32 ces32;
+               unsigned char *data;
+               
+               if (copy_from_user(&ces32, (void*)arg, sizeof (ces32)))
+                       return -EFAULT;
+               if (ces32.ces_type < 0 || ces32.ces_type >= CH_TYPES)
+                       return -EINVAL;
+
+               data = compat_ptr(ces32.ces_data);
+               return ch_gstatus(ch, ces32.ces_type, data);
+       }
+       default:
+               // return scsi_ioctl_compat(ch->device, cmd, (void*)arg);
+               return -ENOIOCTLCMD;
+
+       }
+}
+#endif
+
+/* ------------------------------------------------------------------------ */
+
+static int ch_probe(struct device *dev)
+{
+       struct scsi_device *sd = to_scsi_device(dev);
+       scsi_changer *ch;
+       
+       if (sd->type != TYPE_MEDIUM_CHANGER)
+               return -ENODEV;
+    
+       ch = kmalloc(sizeof(*ch), GFP_KERNEL);
+       if (NULL == ch)
+               return -ENOMEM;
+
+       memset(ch,0,sizeof(*ch));
+       ch->minor = ch_devcount;
+       sprintf(ch->name,"ch%d",ch->minor);
+       init_MUTEX(&ch->lock);
+       ch->device = sd;
+       ch_readconfig(ch);
+       if (init)
+               ch_init_elem(ch);
+
+       devfs_mk_cdev(MKDEV(SCSI_CHANGER_MAJOR,ch->minor),
+                     S_IFCHR | S_IRUGO | S_IWUGO, ch->name);
+       class_device_create(ch_sysfs_class,
+                           MKDEV(SCSI_CHANGER_MAJOR,ch->minor),
+                           dev, "s%s", ch->name);
+
+       printk(KERN_INFO "Attached scsi changer %s "
+              "at scsi%d, channel %d, id %d, lun %d\n", 
+              ch->name, sd->host->host_no, sd->channel, sd->id, sd->lun);
+       
+       spin_lock(&ch_devlist_lock);
+       list_add_tail(&ch->list,&ch_devlist);
+       ch_devcount++;
+       spin_unlock(&ch_devlist_lock);
+       return 0;
+}
+
+static int ch_remove(struct device *dev)
+{
+       struct scsi_device *sd = to_scsi_device(dev);
+       scsi_changer *tmp, *ch;
+
+       spin_lock(&ch_devlist_lock);
+       ch = NULL;
+       list_for_each_entry(tmp,&ch_devlist,list) {
+               if (tmp->device == sd)
+                       ch = tmp;
+       }
+       BUG_ON(NULL == ch);
+       list_del(&ch->list);
+       spin_unlock(&ch_devlist_lock);
+
+       class_device_destroy(ch_sysfs_class,
+                            MKDEV(SCSI_CHANGER_MAJOR,ch->minor));
+       devfs_remove(ch->name);
+       kfree(ch->dt);
+       kfree(ch);
+       ch_devcount--;
+       return 0;
+}
+
+static int __init init_ch_module(void)
+{
+       int rc;
+       
+       printk(KERN_INFO "SCSI Media Changer driver v" VERSION " \n");
+        ch_sysfs_class = class_create(THIS_MODULE, "scsi_changer");
+        if (IS_ERR(ch_sysfs_class)) {
+               rc = PTR_ERR(ch_sysfs_class);
+               return rc;
+        }
+       rc = register_chrdev(SCSI_CHANGER_MAJOR,"ch",&changer_fops);
+       if (rc < 0) {
+               printk("Unable to get major %d for SCSI-Changer\n",
+                      SCSI_CHANGER_MAJOR);
+               goto fail1;
+       }
+       rc = scsi_register_driver(&ch_template.gendrv);
+       if (rc < 0)
+               goto fail2;
+       return 0;
+
+ fail2:
+       unregister_chrdev(SCSI_CHANGER_MAJOR, "ch");
+ fail1:
+       class_destroy(ch_sysfs_class);
+       return rc;
+}
+
+static void __exit exit_ch_module(void) 
+{
+       scsi_unregister_driver(&ch_template.gendrv);
+       unregister_chrdev(SCSI_CHANGER_MAJOR, "ch");
+       class_destroy(ch_sysfs_class);
+}
+
+module_init(init_ch_module);
+module_exit(exit_ch_module);
+
+/*
+ * Local variables:
+ * c-basic-offset: 8
+ * End:
+ */
index cca41cf8d3e7cf23fc78cdb41e425c2cc2941767..ae13c002f60d2ec9895cf79c84d580503d89a596 100644 (file)
@@ -1310,7 +1310,7 @@ static void reset_dev_param(struct AdapterCtlBlk *acb)
  * @cmd - some command for this host (for fetching hooks)
  * Returns: SUCCESS (0x2002) on success, else FAILED (0x2003).
  */
-static int dc395x_eh_bus_reset(struct scsi_cmnd *cmd)
+static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd)
 {
        struct AdapterCtlBlk *acb =
                (struct AdapterCtlBlk *)cmd->device->host->hostdata;
@@ -1356,6 +1356,16 @@ static int dc395x_eh_bus_reset(struct scsi_cmnd *cmd)
        return SUCCESS;
 }
 
+static int dc395x_eh_bus_reset(struct scsi_cmnd *cmd)
+{
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = __dc395x_eh_bus_reset(cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
+}
 
 /*
  * abort an errant SCSI command
index 1d2242403db8f7f8531e7b08730b497e82003963..7905b904e01d8dae9351b4600bda767ad400a630 100644 (file)
@@ -61,8 +61,6 @@ static struct scsi_host_template dmx3191d_driver_template = {
        .queuecommand           = NCR5380_queue_command,
        .eh_abort_handler       = NCR5380_abort,
        .eh_bus_reset_handler   = NCR5380_bus_reset,
-       .eh_device_reset_handler= NCR5380_device_reset,
-       .eh_host_reset_handler  = NCR5380_host_reset,
        .can_queue              = 32,
        .this_id                = 7,
        .sg_tablesize           = SG_ALL,
index 53c9b93013f1c5fbb4912efb15fde88622a5b97a..9cc0015b717d7aa0c97c5ca054f959289e650c62 100644 (file)
@@ -113,7 +113,6 @@ static struct i2o_sys_tbl *sys_tbl = NULL;
 static int sys_tbl_ind = 0;
 static int sys_tbl_len = 0;
 
-static adpt_hba* hbas[DPTI_MAX_HBA];
 static adpt_hba* hba_chain = NULL;
 static int hba_count = 0;
 
@@ -691,7 +690,7 @@ static int adpt_device_reset(struct scsi_cmnd* cmd)
        u32 msg[4];
        u32 rcode;
        int old_state;
-       struct adpt_device* d = (void*) cmd->device->hostdata;
+       struct adpt_device* d = cmd->device->hostdata;
 
        pHba = (void*) cmd->device->host->hostdata[0];
        printk(KERN_INFO"%s: Trying to reset device\n",pHba->name);
@@ -707,7 +706,7 @@ static int adpt_device_reset(struct scsi_cmnd* cmd)
 
        old_state = d->state;
        d->state |= DPTI_DEV_RESET;
-       if( (rcode = adpt_i2o_post_wait(pHba, (void*)msg,sizeof(msg), FOREVER)) ){
+       if( (rcode = adpt_i2o_post_wait(pHba, msg,sizeof(msg), FOREVER)) ){
                d->state = old_state;
                if(rcode == -EOPNOTSUPP ){
                        printk(KERN_INFO"%s: Device reset not supported\n",pHba->name);
@@ -737,7 +736,7 @@ static int adpt_bus_reset(struct scsi_cmnd* cmd)
        msg[1] = (I2O_HBA_BUS_RESET<<24|HOST_TID<<12|pHba->channel[cmd->device->channel].tid);
        msg[2] = 0;
        msg[3] = 0;
-       if(adpt_i2o_post_wait(pHba, (void*)msg,sizeof(msg), FOREVER) ){
+       if(adpt_i2o_post_wait(pHba, msg,sizeof(msg), FOREVER) ){
                printk(KERN_WARNING"%s: Bus reset failed.\n",pHba->name);
                return FAILED;
        } else {
@@ -747,7 +746,7 @@ static int adpt_bus_reset(struct scsi_cmnd* cmd)
 }
 
 // This version of reset is called by the eh_error_handler
-static int adpt_reset(struct scsi_cmnd* cmd)
+static int __adpt_reset(struct scsi_cmnd* cmd)
 {
        adpt_hba* pHba;
        int rcode;
@@ -763,6 +762,17 @@ static int adpt_reset(struct scsi_cmnd* cmd)
        }
 }
 
+static int adpt_reset(struct scsi_cmnd* cmd)
+{
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = __adpt_reset(cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
+}
+
 // This version of reset is called by the ioctls and indirectly from eh_error_handler via adpt_reset
 static int adpt_hba_reset(adpt_hba* pHba)
 {
@@ -875,7 +885,6 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev
        void __iomem *msg_addr_virt = NULL;
 
        int raptorFlag = FALSE;
-       int i;
 
        if(pci_enable_device(pDev)) {
                return -EINVAL;
@@ -935,12 +944,6 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev
        memset(pHba, 0, sizeof(adpt_hba));
 
        down(&adpt_configuration_lock);
-       for(i=0;i<DPTI_MAX_HBA;i++) {
-               if(hbas[i]==NULL) {
-                       hbas[i]=pHba;
-                       break;
-               }
-       }
 
        if(hba_chain != NULL){
                for(p = hba_chain; p->next; p = p->next);
@@ -950,7 +953,7 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev
        }
        pHba->next = NULL;
        pHba->unit = hba_count;
-       sprintf(pHba->name, "dpti%d", i);
+       sprintf(pHba->name, "dpti%d", hba_count);
        hba_count++;
        
        up(&adpt_configuration_lock);
@@ -1015,11 +1018,6 @@ static void adpt_i2o_delete_hba(adpt_hba* pHba)
        if(pHba->host){
                free_irq(pHba->host->irq, pHba);
        }
-       for(i=0;i<DPTI_MAX_HBA;i++) {
-               if(hbas[i]==pHba) {
-                       hbas[i] = NULL;
-               }
-       }
        p2 = NULL;
        for( p1 = hba_chain; p1; p2 = p1,p1=p1->next){
                if(p1 == pHba) {
@@ -1076,12 +1074,7 @@ static void adpt_i2o_delete_hba(adpt_hba* pHba)
 
 static int adpt_init(void)
 {
-       int i;
-
        printk("Loading Adaptec I2O RAID: Version " DPT_I2O_VERSION "\n");
-       for (i = 0; i < DPTI_MAX_HBA; i++) {
-               hbas[i] = NULL;
-       }
 #ifdef REBOOT_NOTIFIER
        register_reboot_notifier(&adpt_reboot_notifier);
 #endif
@@ -1454,7 +1447,7 @@ static int adpt_i2o_parse_lct(adpt_hba* pHba)
                        return -ENOMEM;
                }
                
-               d->controller = (void*)pHba;
+               d->controller = pHba;
                d->next = NULL;
 
                memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
@@ -2000,7 +1993,7 @@ static irqreturn_t adpt_isr(int irq, void *dev_id, struct pt_regs *regs)
        struct scsi_cmnd* cmd;
        adpt_hba* pHba = dev_id;
        u32 m;
-       ulong reply;
+       void __iomem *reply;
        u32 status=0;
        u32 context;
        ulong flags = 0;
@@ -2025,11 +2018,11 @@ static irqreturn_t adpt_isr(int irq, void *dev_id, struct pt_regs *regs)
                                goto out;
                        }
                }
-               reply = (ulong)bus_to_virt(m);
+               reply = bus_to_virt(m);
 
                if (readl(reply) & MSG_FAIL) {
                        u32 old_m = readl(reply+28); 
-                       ulong msg;
+                       void __iomem *msg;
                        u32 old_context;
                        PDEBUG("%s: Failed message\n",pHba->name);
                        if(old_m >= 0x100000){
@@ -2038,16 +2031,16 @@ static irqreturn_t adpt_isr(int irq, void *dev_id, struct pt_regs *regs)
                                continue;
                        }
                        // Transaction context is 0 in failed reply frame
-                       msg = (ulong)(pHba->msg_addr_virt + old_m);
+                       msg = pHba->msg_addr_virt + old_m;
                        old_context = readl(msg+12);
                        writel(old_context, reply+12);
                        adpt_send_nop(pHba, old_m);
                } 
                context = readl(reply+8);
                if(context & 0x40000000){ // IOCTL
-                       ulong p = (ulong)(readl(reply+12));
-                       if( p != 0) {
-                               memcpy((void*)p, (void*)reply, REPLY_FRAME_SIZE * 4);
+                       void *p = (void *)readl(reply+12);
+                       if( p != NULL) {
+                               memcpy_fromio(p, reply, REPLY_FRAME_SIZE * 4);
                        }
                        // All IOCTLs will also be post wait
                }
@@ -2231,7 +2224,7 @@ static s32 adpt_scsi_register(adpt_hba* pHba,struct scsi_host_template * sht)
 }
 
 
-static s32 adpt_i2o_to_scsi(ulong reply, struct scsi_cmnd* cmd)
+static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd)
 {
        adpt_hba* pHba;
        u32 hba_status;
@@ -2323,7 +2316,7 @@ static s32 adpt_i2o_to_scsi(ulong reply, struct scsi_cmnd* cmd)
                        u32 len = sizeof(cmd->sense_buffer);
                        len = (len > 40) ?  40 : len;
                        // Copy over the sense data
-                       memcpy(cmd->sense_buffer, (void*)(reply+28) , len);
+                       memcpy_fromio(cmd->sense_buffer, (reply+28) , len);
                        if(cmd->sense_buffer[0] == 0x70 /* class 7 */ && 
                           cmd->sense_buffer[2] == DATA_PROTECT ){
                                /* This is to handle an array failed */
@@ -2438,7 +2431,7 @@ static s32 adpt_i2o_reparse_lct(adpt_hba* pHba)
                                        return -ENOMEM;
                                }
                                
-                               d->controller = (void*)pHba;
+                               d->controller = pHba;
                                d->next = NULL;
 
                                memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
@@ -2985,8 +2978,8 @@ static int adpt_i2o_build_sys_table(void)
                sys_tbl->iops[count].frame_size = pHba->status_block->inbound_frame_size;
                sys_tbl->iops[count].last_changed = sys_tbl_ind - 1; // ??
                sys_tbl->iops[count].iop_capabilities = pHba->status_block->iop_capabilities;
-               sys_tbl->iops[count].inbound_low = (u32)virt_to_bus((void*)pHba->post_port);
-               sys_tbl->iops[count].inbound_high = (u32)((u64)virt_to_bus((void*)pHba->post_port)>>32);
+               sys_tbl->iops[count].inbound_low = (u32)virt_to_bus(pHba->post_port);
+               sys_tbl->iops[count].inbound_high = (u32)((u64)virt_to_bus(pHba->post_port)>>32);
 
                count++;
        }
index 426e15dd490ed192fbdc4e303519eb21b18fc5e4..9821783c0164f051bb619cd6b70b8ecb4948f5ff 100644 (file)
@@ -296,7 +296,7 @@ static s32 adpt_i2o_status_get(adpt_hba* pHba);
 static s32 adpt_i2o_init_outbound_q(adpt_hba* pHba);
 static s32 adpt_i2o_hrt_get(adpt_hba* pHba);
 static s32 adpt_scsi_to_i2o(adpt_hba* pHba, struct scsi_cmnd* cmd, struct adpt_device* dptdevice);
-static s32 adpt_i2o_to_scsi(ulong reply, struct scsi_cmnd* cmd);
+static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd);
 static s32 adpt_scsi_register(adpt_hba* pHba,struct scsi_host_template * sht);
 static s32 adpt_hba_reset(adpt_hba* pHba);
 static s32 adpt_i2o_reset_hba(adpt_hba* pHba);
index da1aaa413fed3ab8011beb81f1a75db959945c48..ab9de39bb50b3fa11535b7e70e0bc2fec466536d 100644 (file)
@@ -482,8 +482,6 @@ static Scsi_Host_Template driver_template = {
        .queuecommand                   = dtc_queue_command,
        .eh_abort_handler               = dtc_abort,
        .eh_bus_reset_handler           = dtc_bus_reset,
-       .eh_device_reset_handler        = dtc_device_reset,
-       .eh_host_reset_handler          = dtc_host_reset,
        .bios_param                     = dtc_biosparam,
        .can_queue                      = CAN_QUEUE,
        .this_id                        = 7,
index c4bcdbf338a26e02a8fbe865619ed66dc3c1a414..ed73629eb2f9d6d6705b2a20e1608726f205fd1f 100644 (file)
@@ -34,8 +34,6 @@ static int dtc_biosparam(struct scsi_device *, struct block_device *,
 static int dtc_detect(Scsi_Host_Template *);
 static int dtc_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 static int dtc_bus_reset(Scsi_Cmnd *);
-static int dtc_device_reset(Scsi_Cmnd *);
-static int dtc_host_reset(Scsi_Cmnd *);
 
 #ifndef CMD_PER_LUN
 #define CMD_PER_LUN 2
@@ -86,8 +84,6 @@ static int dtc_host_reset(Scsi_Cmnd *);
 #define NCR5380_queue_command          dtc_queue_command
 #define NCR5380_abort                  dtc_abort
 #define NCR5380_bus_reset              dtc_bus_reset
-#define NCR5380_device_reset           dtc_device_reset
-#define NCR5380_host_reset             dtc_host_reset
 #define NCR5380_proc_info              dtc_proc_info 
 
 /* 15 12 11 10
index 81d16cfbe69e29143e58ba0dbc118dbf389d6d14..1bb8727eea3e5a2a2a7984bc7922451127c93426 100644 (file)
@@ -518,8 +518,6 @@ static struct scsi_host_template driver_template = {
        .release = eata2x_release,
        .queuecommand = eata2x_queuecommand,
        .eh_abort_handler = eata2x_eh_abort,
-       .eh_device_reset_handler = NULL,
-       .eh_bus_reset_handler = NULL,
        .eh_host_reset_handler = eata2x_eh_host_reset,
        .bios_param = eata2x_bios_param,
        .slave_configure = eata2x_slave_configure,
@@ -1950,16 +1948,20 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
               ha->board_name, SCarg->device->channel, SCarg->device->id,
               SCarg->device->lun, SCarg->pid);
 
+       spin_lock_irq(shost->host_lock);
+
        if (SCarg->host_scribble == NULL)
                printk("%s: reset, pid %ld inactive.\n", ha->board_name, SCarg->pid);
 
        if (ha->in_reset) {
                printk("%s: reset, exit, already in reset.\n", ha->board_name);
+               spin_unlock_irq(shost->host_lock);
                return FAILED;
        }
 
        if (wait_on_busy(shost->io_port, MAXLOOP)) {
                printk("%s: reset, exit, timeout error.\n", ha->board_name);
+               spin_unlock_irq(shost->host_lock);
                return FAILED;
        }
 
@@ -2014,6 +2016,7 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
 
        if (do_dma(shost->io_port, 0, RESET_PIO)) {
                printk("%s: reset, cannot reset, timeout error.\n", ha->board_name);
+               spin_unlock_irq(shost->host_lock);
                return FAILED;
        }
 
@@ -2026,9 +2029,12 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
        ha->in_reset = 1;
 
        spin_unlock_irq(shost->host_lock);
+
+       /* FIXME: use a sleep instead */
        time = jiffies;
        while ((jiffies - time) < (10 * HZ) && limit++ < 200000)
                udelay(100L);
+
        spin_lock_irq(shost->host_lock);
 
        printk("%s: reset, interrupts disabled, loops %d.\n", ha->board_name, limit);
@@ -2078,6 +2084,7 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
        else
                printk("%s: reset, exit.\n", ha->board_name);
 
+       spin_unlock_irq(shost->host_lock);
        return SUCCESS;
 }
 
index 0ee49dc50b85fd4dd6b32b5862e9edc44b5e2cde..04a06b71a5e23666956fd0bae203ada2ee959c7c 100644 (file)
@@ -486,8 +486,11 @@ static int eata_pio_host_reset(struct scsi_cmnd *cmd)
 
        DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset called pid:%ld target:" " %x lun: %x reason %x\n", cmd->pid, cmd->device->id, cmd->device->lun, cmd->abort_reason));
 
+       spin_lock_irq(host->host_lock);
+
        if (HD(cmd)->state == RESET) {
                printk(KERN_WARNING "eata_pio_reset: exit, already in reset.\n");
+               spin_unlock_irq(host->host_lock);
                return FAILED;
        }
 
@@ -536,6 +539,8 @@ static int eata_pio_host_reset(struct scsi_cmnd *cmd)
 
        HD(cmd)->state = 0;
 
+       spin_unlock_irq(host->host_lock);
+
        if (success) {          /* hmmm... */
                DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset: exit, success.\n"));
                return SUCCESS;
index 0dad89d4cb3ea77939feb5af3b27ff577539eace..a6f120dcdfc37ae8e5c452d45d6065ff40b9f01d 100644 (file)
@@ -311,7 +311,6 @@ static Scsi_Host_Template driver_template = {
        .use_clustering         = ENABLE_CLUSTERING,
        .eh_abort_handler       = fcp_scsi_abort,
        .eh_device_reset_handler = fcp_scsi_dev_reset,
-       .eh_bus_reset_handler   = fcp_scsi_bus_reset,
        .eh_host_reset_handler  = fcp_scsi_host_reset,
 };
 #include "scsi_module.c"
index 770930e2aec336e2f0f2268290dfcd58e1673bd2..fa652f8aa64392548ddf6097cec52a0a1e752e56 100644 (file)
@@ -1241,18 +1241,9 @@ static int fd_mcs_abort(Scsi_Cmnd * SCpnt)
        return SUCCESS;
 }
 
-static int fd_mcs_host_reset(Scsi_Cmnd * SCpnt)
-{
-       return FAILED;
-}
-
-static int fd_mcs_device_reset(Scsi_Cmnd * SCpnt) 
-{
-       return FAILED;
-}
-
 static int fd_mcs_bus_reset(Scsi_Cmnd * SCpnt) {
        struct Scsi_Host *shpnt = SCpnt->device->host;
+       unsigned long flags;
 
 #if DEBUG_RESET
        static int called_once = 0;
@@ -1269,6 +1260,8 @@ static int fd_mcs_bus_reset(Scsi_Cmnd * SCpnt) {
        called_once = 1;
 #endif
 
+       spin_lock_irqsave(shpnt->host_lock, flags);
+
        outb(1, SCSI_Cntl_port);
        do_pause(2);
        outb(0, SCSI_Cntl_port);
@@ -1276,6 +1269,8 @@ static int fd_mcs_bus_reset(Scsi_Cmnd * SCpnt) {
        outb(0, SCSI_Mode_Cntl_port);
        outb(PARITY_MASK, TMC_Cntl_port);
 
+       spin_unlock_irqrestore(shpnt->host_lock, flags);
+
        /* Unless this is the very first call (i.e., SCPnt == NULL), everything
           is probably hosed at this point.  We will, however, try to keep
           things going by informing the high-level code that we need help. */
@@ -1357,8 +1352,6 @@ static Scsi_Host_Template driver_template = {
        .queuecommand                   = fd_mcs_queue, 
        .eh_abort_handler               = fd_mcs_abort,
        .eh_bus_reset_handler           = fd_mcs_bus_reset,
-       .eh_host_reset_handler          = fd_mcs_host_reset,
-       .eh_device_reset_handler        = fd_mcs_device_reset,
        .bios_param                     = fd_mcs_biosparam,
        .can_queue                      = 1,
        .this_id                        = 7,
index a843c080c1d871f13aec43dc77465130e3f56bfd..4ba6a15cf43d2afb6715607174a843ccb6b7d9e6 100644 (file)
@@ -1543,12 +1543,18 @@ static int fdomain_16x0_abort(struct scsi_cmnd *SCpnt)
 
 int fdomain_16x0_bus_reset(struct scsi_cmnd *SCpnt)
 {
+   unsigned long flags;
+
+   local_irq_save(flags);
+
    outb(1, port_base + SCSI_Cntl);
    do_pause( 2 );
    outb(0, port_base + SCSI_Cntl);
    do_pause( 115 );
    outb(0, port_base + SCSI_Mode_Cntl);
    outb(PARITY_MASK, port_base + TMC_Cntl);
+
+   local_irq_restore(flags);
    return SUCCESS;
 }
 
index ca9d5bd26ca31bf87449b49f73c083d39daf4af5..a3aa729b9d3c4a6eb553bec2124fe2614ad8d064 100644 (file)
@@ -908,8 +908,6 @@ static Scsi_Host_Template driver_template = {
        .queuecommand           = generic_NCR5380_queue_command,
        .eh_abort_handler       = generic_NCR5380_abort,
        .eh_bus_reset_handler   = generic_NCR5380_bus_reset,
-       .eh_device_reset_handler = generic_NCR5380_device_reset,
-       .eh_host_reset_handler  = generic_NCR5380_host_reset,
        .bios_param             = NCR5380_BIOSPARAM,
        .can_queue              = CAN_QUEUE,
         .this_id               = 7,
index 0c04cefb2a88317aded8f106fcdfaefa6c64d654..c8adc5a948848381d80931daa396dccc793f4f21 100644 (file)
@@ -49,8 +49,6 @@ static int generic_NCR5380_detect(Scsi_Host_Template *);
 static int generic_NCR5380_release_resources(struct Scsi_Host *);
 static int generic_NCR5380_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 static int generic_NCR5380_bus_reset(Scsi_Cmnd *);
-static int generic_NCR5380_host_reset(Scsi_Cmnd *);
-static int generic_NCR5380_device_reset(Scsi_Cmnd *);
 static const char* generic_NCR5380_info(struct Scsi_Host *);
 
 #ifndef CMD_PER_LUN
@@ -114,8 +112,6 @@ static const char* generic_NCR5380_info(struct Scsi_Host *);
 #define NCR5380_queue_command generic_NCR5380_queue_command
 #define NCR5380_abort generic_NCR5380_abort
 #define NCR5380_bus_reset generic_NCR5380_bus_reset
-#define NCR5380_device_reset generic_NCR5380_device_reset
-#define NCR5380_host_reset generic_NCR5380_host_reset
 #define NCR5380_pread generic_NCR5380_pread
 #define NCR5380_pwrite generic_NCR5380_pwrite
 #define NCR5380_proc_info notyet_generic_proc_info
index a9eaab9fbd5ea7761e53d436dee64654a1402236..4552cccd283484e4b863d4c1f9a77e1c052f1647 100644 (file)
@@ -4703,19 +4703,6 @@ static const char *gdth_info(struct Scsi_Host *shp)
     return ((const char *)ha->binfo.type_string);
 }
 
-/* new error handling */
-static int gdth_eh_abort(Scsi_Cmnd *scp)
-{
-    TRACE2(("gdth_eh_abort()\n"));
-    return FAILED;
-}
-
-static int gdth_eh_device_reset(Scsi_Cmnd *scp)
-{
-    TRACE2(("gdth_eh_device_reset()\n"));
-    return FAILED;
-}
-
 static int gdth_eh_bus_reset(Scsi_Cmnd *scp)
 {
     int i, hanum;
@@ -4770,13 +4757,6 @@ static int gdth_eh_bus_reset(Scsi_Cmnd *scp)
     return SUCCESS;
 }
 
-static int gdth_eh_host_reset(Scsi_Cmnd *scp)
-{
-    TRACE2(("gdth_eh_host_reset()\n"));
-    return FAILED;
-}
-
-
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 static int gdth_bios_param(struct scsi_device *sdev,struct block_device *bdev,sector_t cap,int *ip)
 #else
@@ -5713,10 +5693,7 @@ static Scsi_Host_Template driver_template = {
         .release                = gdth_release,
         .info                   = gdth_info, 
         .queuecommand           = gdth_queuecommand,
-        .eh_abort_handler       = gdth_eh_abort, 
-        .eh_device_reset_handler = gdth_eh_device_reset,
         .eh_bus_reset_handler   = gdth_eh_bus_reset,
-        .eh_host_reset_handler  = gdth_eh_host_reset,
         .bios_param             = gdth_bios_param,
         .can_queue              = GDTH_MAXCMDS,
         .this_id                = -1,
index 30cbf73c7433d930c2ea197bf9c56dca3d89928d..d12342fa81999e5938313cbb9f33734a63f44998 100644 (file)
@@ -345,7 +345,15 @@ release:
 static int gvp11_bus_reset(Scsi_Cmnd *cmd)
 {
        /* FIXME perform bus-specific reset */
+
+       /* FIXME 2: shouldn't we no-op this function (return
+          FAILED), and fall back to host reset function,
+          wd33c93_host_reset ? */
+
+       spin_lock_irq(cmd->device->host->host_lock);
        wd33c93_host_reset(cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
        return SUCCESS;
 }
 
index a3fdead9bce99a64284647d4ea7c5024b07d9b52..b5dc3535557079d368444aa136f1ff28fcdae3ca 100644 (file)
@@ -2118,7 +2118,7 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
        return 0;
 }
 
-static int ibmmca_abort(Scsi_Cmnd * cmd)
+static int __ibmmca_abort(Scsi_Cmnd * cmd)
 {
        /* Abort does not work, as the adapter never generates an interrupt on
         * whatever situation is simulated, even when really pending commands
@@ -2225,7 +2225,19 @@ static int ibmmca_abort(Scsi_Cmnd * cmd)
        }
 }
 
-static int ibmmca_host_reset(Scsi_Cmnd * cmd)
+static int ibmmca_abort(Scsi_Cmnd * cmd)
+{
+       struct Scsi_Host *shpnt = cmd->device->host;
+       int rc;
+
+       spin_lock_irq(shpnt->host_lock);
+       rc = __ibmmca_abort(cmd);
+       spin_unlock_irq(shpnt->host_lock);
+
+       return rc;
+}
+
+static int __ibmmca_host_reset(Scsi_Cmnd * cmd)
 {
        struct Scsi_Host *shpnt;
        Scsi_Cmnd *cmd_aid;
@@ -2312,6 +2324,18 @@ static int ibmmca_host_reset(Scsi_Cmnd * cmd)
        return SUCCESS;
 }
 
+static int ibmmca_host_reset(Scsi_Cmnd * cmd)
+{
+       struct Scsi_Host *shpnt = cmd->device->host;
+       int rc;
+
+       spin_lock_irq(shpnt->host_lock);
+       rc = __ibmmca_host_reset(cmd);
+       spin_unlock_irq(shpnt->host_lock);
+
+       return rc;
+}
+
 static int ibmmca_biosparam(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int *info)
 {
        int size = capacity;
index e89f76e5dd531fc2c0a892b9ab63f79baf95ca30..d89b8eb3cdf374c9b3ed552b0c66457843f59882 100644 (file)
@@ -874,9 +874,7 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
                return FAILED;
        }
 
-       spin_unlock_irq(hostdata->host->host_lock);
        wait_for_completion(&evt->comp);
-       spin_lock_irq(hostdata->host->host_lock);
 
        /* make sure we got a good response */
        if (unlikely(srp_rsp.srp.generic.type != SRP_RSP_TYPE)) {
@@ -978,9 +976,7 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd)
                return FAILED;
        }
 
-       spin_unlock_irq(hostdata->host->host_lock);
        wait_for_completion(&evt->comp);
-       spin_lock_irq(hostdata->host->host_lock);
 
        /* make sure we got a good response */
        if (unlikely(srp_rsp.srp.generic.type != SRP_RSP_TYPE)) {
index 2e2486b035dd958352e648ff9012c2beeebc3552..3d62c9bcbff76931584364de2743060f9d398d68 100644 (file)
@@ -46,6 +46,7 @@
 #include <linux/slab.h>
 #include <linux/ide.h>
 #include <linux/scatterlist.h>
+#include <linux/delay.h>
 
 #include <asm/io.h>
 #include <asm/bitops.h>
@@ -179,8 +180,18 @@ static void idescsi_input_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsigne
                        return;
                }
                count = min(pc->sg->length - pc->b_count, bcount);
-               buf = page_address(pc->sg->page) + pc->sg->offset;
-               drive->hwif->atapi_input_bytes(drive, buf + pc->b_count, count);
+               if (PageHighMem(pc->sg->page)) {
+                       unsigned long flags;
+
+                       local_irq_save(flags);
+                       buf = kmap_atomic(pc->sg->page, KM_IRQ0) + pc->sg->offset;
+                       drive->hwif->atapi_input_bytes(drive, buf + pc->b_count, count);
+                       kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
+                       local_irq_restore(flags);
+               } else {
+                       buf = page_address(pc->sg->page) + pc->sg->offset;
+                       drive->hwif->atapi_input_bytes(drive, buf + pc->b_count, count);
+               }
                bcount -= count; pc->b_count += count;
                if (pc->b_count == pc->sg->length) {
                        pc->sg++;
@@ -201,8 +212,18 @@ static void idescsi_output_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsign
                        return;
                }
                count = min(pc->sg->length - pc->b_count, bcount);
-               buf = page_address(pc->sg->page) + pc->sg->offset;
-               drive->hwif->atapi_output_bytes(drive, buf + pc->b_count, count);
+               if (PageHighMem(pc->sg->page)) {
+                       unsigned long flags;
+
+                       local_irq_save(flags);
+                       buf = kmap_atomic(pc->sg->page, KM_IRQ0) + pc->sg->offset;
+                       drive->hwif->atapi_output_bytes(drive, buf + pc->b_count, count);
+                       kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
+                       local_irq_restore(flags);
+               } else {
+                       buf = page_address(pc->sg->page) + pc->sg->offset;
+                       drive->hwif->atapi_output_bytes(drive, buf + pc->b_count, count);
+               }
                bcount -= count; pc->b_count += count;
                if (pc->b_count == pc->sg->length) {
                        pc->sg++;
@@ -713,7 +734,6 @@ static void idescsi_add_settings(ide_drive_t *drive)
  */
 static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi)
 {
-       DRIVER(drive)->busy++;
        if (drive->id && (drive->id->config & 0x0060) == 0x20)
                set_bit (IDESCSI_DRQ_INTERRUPT, &scsi->flags);
        set_bit(IDESCSI_TRANSFORM, &scsi->transform);
@@ -722,17 +742,16 @@ static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi)
        set_bit(IDESCSI_LOG_CMD, &scsi->log);
 #endif /* IDESCSI_DEBUG_LOG */
        idescsi_add_settings(drive);
-       DRIVER(drive)->busy--;
 }
 
-static int idescsi_cleanup (ide_drive_t *drive)
+static int ide_scsi_remove(struct device *dev)
 {
+       ide_drive_t *drive = to_ide_device(dev);
        struct Scsi_Host *scsihost = drive->driver_data;
        struct ide_scsi_obj *scsi = scsihost_to_idescsi(scsihost);
        struct gendisk *g = scsi->disk;
 
-       if (ide_unregister_subdriver(drive))
-               return 1;
+       ide_unregister_subdriver(drive, scsi->driver);
 
        ide_unregister_region(g);
 
@@ -746,7 +765,7 @@ static int idescsi_cleanup (ide_drive_t *drive)
        return 0;
 }
 
-static int idescsi_attach(ide_drive_t *drive);
+static int ide_scsi_probe(struct device *);
 
 #ifdef CONFIG_PROC_FS
 static ide_proc_entry_t idescsi_proc[] = {
@@ -757,24 +776,22 @@ static ide_proc_entry_t idescsi_proc[] = {
 # define idescsi_proc  NULL
 #endif
 
-/*
- *     IDE subdriver functions, registered with ide.c
- */
 static ide_driver_t idescsi_driver = {
        .owner                  = THIS_MODULE,
-       .name                   = "ide-scsi",
+       .gen_driver = {
+               .name           = "ide-scsi",
+               .bus            = &ide_bus_type,
+               .probe          = ide_scsi_probe,
+               .remove         = ide_scsi_remove,
+       },
        .version                = IDESCSI_VERSION,
        .media                  = ide_scsi,
-       .busy                   = 0,
        .supports_dsc_overlap   = 0,
        .proc                   = idescsi_proc,
-       .attach                 = idescsi_attach,
-       .cleanup                = idescsi_cleanup,
        .do_request             = idescsi_do_request,
        .end_request            = idescsi_end_request,
        .error                  = idescsi_atapi_error,
        .abort                  = idescsi_atapi_abort,
-       .drives                 = LIST_HEAD_INIT(idescsi_driver.drives),
 };
 
 static int idescsi_ide_open(struct inode *inode, struct file *filp)
@@ -821,8 +838,6 @@ static struct block_device_operations idescsi_ops = {
        .ioctl          = idescsi_ide_ioctl,
 };
 
-static int idescsi_attach(ide_drive_t *drive);
-
 static int idescsi_slave_configure(struct scsi_device * sdp)
 {
        /* Configure detected device */
@@ -1012,11 +1027,13 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd)
                return FAILED;
        }
 
-       spin_lock_irq(&ide_lock);
+       spin_lock_irq(cmd->device->host->host_lock);
+       spin_lock(&ide_lock);
 
        if (!scsi->pc || (req = scsi->pc->rq) != HWGROUP(drive)->rq || !HWGROUP(drive)->handler) {
                printk (KERN_WARNING "ide-scsi: No active request in idescsi_eh_reset\n");
                spin_unlock(&ide_lock);
+               spin_unlock_irq(cmd->device->host->host_lock);
                return FAILED;
        }
 
@@ -1038,16 +1055,15 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd)
        HWGROUP(drive)->rq = NULL;
        HWGROUP(drive)->handler = NULL;
        HWGROUP(drive)->busy = 1;               /* will set this to zero when ide reset finished */
-       spin_unlock_irq(&ide_lock);
+       spin_unlock(&ide_lock);
 
        ide_do_reset(drive);
 
        /* ide_do_reset starts a polling handler which restarts itself every 50ms until the reset finishes */
 
        do {
-               set_current_state(TASK_UNINTERRUPTIBLE);
                spin_unlock_irq(cmd->device->host->host_lock);
-               schedule_timeout(HZ/20);
+               msleep(50);
                spin_lock_irq(cmd->device->host->host_lock);
        } while ( HWGROUP(drive)->handler );
 
@@ -1058,6 +1074,7 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd)
                ret = FAILED;
        }
 
+       spin_unlock_irq(cmd->device->host->host_lock);
        return ret;
 }
 
@@ -1095,8 +1112,9 @@ static struct scsi_host_template idescsi_template = {
        .proc_name              = "ide-scsi",
 };
 
-static int idescsi_attach(ide_drive_t *drive)
+static int ide_scsi_probe(struct device *dev)
 {
+       ide_drive_t *drive = to_ide_device(dev);
        idescsi_scsi_t *idescsi;
        struct Scsi_Host *host;
        struct gendisk *g;
@@ -1112,7 +1130,7 @@ static int idescsi_attach(ide_drive_t *drive)
            !drive->present ||
            drive->media == ide_disk ||
            !(host = scsi_host_alloc(&idescsi_template,sizeof(idescsi_scsi_t))))
-               return 1;
+               return -ENODEV;
 
        g = alloc_disk(1 << PARTN_BITS);
        if (!g)
@@ -1138,20 +1156,19 @@ static int idescsi_attach(ide_drive_t *drive)
        idescsi->host = host;
        idescsi->disk = g;
        g->private_data = &idescsi->driver;
-       err = ide_register_subdriver(drive, &idescsi_driver);
+       ide_register_subdriver(drive, &idescsi_driver);
+       err = 0;
+       idescsi_setup(drive, idescsi);
+       g->fops = &idescsi_ops;
+       ide_register_region(g);
+       err = scsi_add_host(host, &drive->gendev);
        if (!err) {
-               idescsi_setup (drive, idescsi);
-               g->fops = &idescsi_ops;
-               ide_register_region(g);
-               err = scsi_add_host(host, &drive->gendev);
-               if (!err) {
-                       scsi_scan_host(host);
-                       return 0;
-               }
-               /* fall through on error */
-               ide_unregister_region(g);
-               ide_unregister_subdriver(drive);
+               scsi_scan_host(host);
+               return 0;
        }
+       /* fall through on error */
+       ide_unregister_region(g);
+       ide_unregister_subdriver(drive, &idescsi_driver);
 
        put_disk(g);
 out_host_put:
@@ -1161,12 +1178,12 @@ out_host_put:
 
 static int __init init_idescsi_module(void)
 {
-       return ide_register_driver(&idescsi_driver);
+       return driver_register(&idescsi_driver.gen_driver);
 }
 
 static void __exit exit_idescsi_module(void)
 {
-       ide_unregister_driver(&idescsi_driver);
+       driver_unregister(&idescsi_driver.gen_driver);
 }
 
 module_init(init_idescsi_module);
index be7f2ca0183fdcaccb16ab7c8197a4084258e147..65e845665b85d26b24da8f1734a45a7ce04744ce 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/blkdev.h>
 #include <linux/parport.h>
 #include <linux/workqueue.h>
+#include <linux/delay.h>
 #include <asm/io.h>
 
 #include <scsi/scsi.h>
@@ -610,9 +611,9 @@ static int imm_init(imm_struct *dev)
        if (imm_connect(dev, 0) != 1)
                return -EIO;
        imm_reset_pulse(dev->base);
-       udelay(1000);   /* Delay to allow devices to settle */
+       mdelay(1);      /* Delay to allow devices to settle */
        imm_disconnect(dev);
-       udelay(1000);   /* Another delay to allow devices to settle */
+       mdelay(1);      /* Another delay to allow devices to settle */
        return device_check(dev);
 }
 
@@ -1026,9 +1027,9 @@ static int imm_reset(struct scsi_cmnd *cmd)
 
        imm_connect(dev, CONNECT_NORMAL);
        imm_reset_pulse(dev->base);
-       udelay(1000);           /* device settle delay */
+       mdelay(1);              /* device settle delay */
        imm_disconnect(dev);
-       udelay(1000);           /* device settle delay */
+       mdelay(1);              /* device settle delay */
        return SUCCESS;
 }
 
index 0bb0369efb2dafe325245f61fd5d2e31c72e029d..aed7e64865faebfe8dabf384b5904fedb2f68588 100644 (file)
@@ -1644,14 +1644,16 @@ static int in2000_bus_reset(Scsi_Cmnd * cmd)
        struct Scsi_Host *instance;
        struct IN2000_hostdata *hostdata;
        int x;
+       unsigned long flags;
 
        instance = cmd->device->host;
        hostdata = (struct IN2000_hostdata *) instance->hostdata;
 
        printk(KERN_WARNING "scsi%d: Reset. ", instance->host_no);
 
-       /* do scsi-reset here */
+       spin_lock_irqsave(instance->host_lock, flags);
 
+       /* do scsi-reset here */
        reset_hardware(instance, RESET_CARD_AND_BUS);
        for (x = 0; x < 8; x++) {
                hostdata->busy[x] = 0;
@@ -1668,21 +1670,12 @@ static int in2000_bus_reset(Scsi_Cmnd * cmd)
        hostdata->outgoing_len = 0;
 
        cmd->result = DID_RESET << 16;
-       return SUCCESS;
-}
 
-static int in2000_host_reset(Scsi_Cmnd * cmd)
-{
-       return FAILED;
-}
-
-static int in2000_device_reset(Scsi_Cmnd * cmd)
-{
-       return FAILED;
+       spin_unlock_irqrestore(instance->host_lock, flags);
+       return SUCCESS;
 }
 
-
-static int in2000_abort(Scsi_Cmnd * cmd)
+static int __in2000_abort(Scsi_Cmnd * cmd)
 {
        struct Scsi_Host *instance;
        struct IN2000_hostdata *hostdata;
@@ -1803,6 +1796,16 @@ static int in2000_abort(Scsi_Cmnd * cmd)
        return SUCCESS;
 }
 
+static int in2000_abort(Scsi_Cmnd * cmd)
+{
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = __in2000_abort(cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
+}
 
 
 #define MAX_IN2000_HOSTS 3
@@ -2311,8 +2314,6 @@ static Scsi_Host_Template driver_template = {
        .queuecommand                   = in2000_queuecommand,
        .eh_abort_handler               = in2000_abort,
        .eh_bus_reset_handler           = in2000_bus_reset,
-       .eh_device_reset_handler        = in2000_device_reset,
-       .eh_host_reset_handler  = in2000_host_reset, 
        .bios_param                     = in2000_biosparam, 
        .can_queue                      = IN2000_CAN_Q,
        .this_id                        = IN2000_HOST_ID,
index 019e45df30163c1ddfc77f927da7bf7d4d119e4c..a240b52554d81dc3c9020559d4b9e6909fad5900 100644 (file)
@@ -401,9 +401,7 @@ static int in2000_abort(Scsi_Cmnd *);
 static void in2000_setup(char *, int *) in2000__INIT;
 static int in2000_biosparam(struct scsi_device *, struct block_device *,
                sector_t, int *);
-static int in2000_host_reset(Scsi_Cmnd *);
 static int in2000_bus_reset(Scsi_Cmnd *);
-static int in2000_device_reset(Scsi_Cmnd *);
 
 
 #define IN2000_CAN_Q    16
index a7b74d8c53b9b64216c8115a643e9af3045110d0..f7ddc9f1ba41d19628c22c1e5d01627c93adf097 100644 (file)
@@ -3014,7 +3014,11 @@ static int i91u_bus_reset(struct scsi_cmnd * SCpnt)
        HCS *pHCB;
 
        pHCB = (HCS *) SCpnt->device->host->base;
+
+       spin_lock_irq(SCpnt->device->host->host_lock);
        tul_reset_scsi(pHCB, 0);
+       spin_unlock_irq(SCpnt->device->host->host_lock);
+
        return SUCCESS;
 }
 
index 5441531c0d8e54ad31f6849d30e423808dd21099..80d022625c82e25ccb8eb06f905631746e3d7113 100644 (file)
@@ -1053,7 +1053,7 @@ static void ipr_log_array_error(struct ipr_ioa_cfg *ioa_cfg,
                                array_entry->dev_res_addr.lun);
                }
 
-               if (array_entry->dev_res_addr.bus >= IPR_MAX_NUM_BUSES) {
+               if (array_entry->expected_dev_res_addr.bus >= IPR_MAX_NUM_BUSES) {
                        ipr_err("Expected Location: unknown\n");
                } else {
                        ipr_err("Expected Location: %d:%d:%d:%d\n",
@@ -2716,7 +2716,7 @@ static int ipr_change_queue_type(struct scsi_device *sdev, int tag_type)
  * Return value:
  *     number of bytes printed to buffer
  **/
-static ssize_t ipr_show_adapter_handle(struct device *dev, char *buf)
+static ssize_t ipr_show_adapter_handle(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct scsi_device *sdev = to_scsi_device(dev);
        struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata;
@@ -2885,7 +2885,7 @@ static int ipr_slave_alloc(struct scsi_device *sdev)
  * Return value:
  *     SUCCESS / FAILED
  **/
-static int ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd)
+static int __ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd)
 {
        struct ipr_ioa_cfg *ioa_cfg;
        int rc;
@@ -2905,6 +2905,17 @@ static int ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd)
        return rc;
 }
 
+static int ipr_eh_host_reset(struct scsi_cmnd * cmd)
+{
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = __ipr_eh_host_reset(cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
+}
+
 /**
  * ipr_eh_dev_reset - Reset the device
  * @scsi_cmd:  scsi command struct
@@ -2916,7 +2927,7 @@ static int ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd)
  * Return value:
  *     SUCCESS / FAILED
  **/
-static int ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd)
+static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd)
 {
        struct ipr_cmnd *ipr_cmd;
        struct ipr_ioa_cfg *ioa_cfg;
@@ -2970,6 +2981,17 @@ static int ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd)
        return (IPR_IOASC_SENSE_KEY(ioasc) ? FAILED : SUCCESS);
 }
 
+static int ipr_eh_dev_reset(struct scsi_cmnd * cmd)
+{
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = __ipr_eh_dev_reset(cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
+}
+
 /**
  * ipr_bus_reset_done - Op done function for bus reset.
  * @ipr_cmd:   ipr command struct
@@ -3068,6 +3090,12 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd)
        ioa_cfg = (struct ipr_ioa_cfg *)scsi_cmd->device->host->hostdata;
        res = scsi_cmd->device->hostdata;
 
+       /* If we are currently going through reset/reload, return failed.
+        * This will force the mid-layer to call ipr_eh_host_reset,
+        * which will then go to sleep and wait for the reset to complete
+        */
+       if (ioa_cfg->in_reset_reload || ioa_cfg->ioa_is_dead)
+               return FAILED;
        if (!res || (!ipr_is_gscsi(res) && !ipr_is_vset_device(res)))
                return FAILED;
 
@@ -3118,23 +3146,17 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd)
  **/
 static int ipr_eh_abort(struct scsi_cmnd * scsi_cmd)
 {
-       struct ipr_ioa_cfg *ioa_cfg;
+       unsigned long flags;
+       int rc;
 
        ENTER;
-       ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata;
 
-       /* If we are currently going through reset/reload, return failed. This will force the
-          mid-layer to call ipr_eh_host_reset, which will then go to sleep and wait for the
-          reset to complete */
-       if (ioa_cfg->in_reset_reload)
-               return FAILED;
-       if (ioa_cfg->ioa_is_dead)
-               return FAILED;
-       if (!scsi_cmd->device->hostdata)
-               return FAILED;
+       spin_lock_irqsave(scsi_cmd->device->host->host_lock, flags);
+       rc = ipr_cancel_op(scsi_cmd);
+       spin_unlock_irqrestore(scsi_cmd->device->host->host_lock, flags);
 
        LEAVE;
-       return ipr_cancel_op(scsi_cmd);
+       return rc;
 }
 
 /**
@@ -5886,6 +5908,7 @@ static void __ipr_remove(struct pci_dev *pdev)
 
        spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
        wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
+       flush_scheduled_work();
        spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
 
        spin_lock(&ipr_driver_lock);
@@ -5916,8 +5939,6 @@ static void ipr_remove(struct pci_dev *pdev)
 
        ENTER;
 
-       ioa_cfg->allow_cmds = 0;
-       flush_scheduled_work();
        ipr_remove_trace_file(&ioa_cfg->host->shost_classdev.kobj,
                              &ipr_trace_attr);
        ipr_remove_dump_file(&ioa_cfg->host->shost_classdev.kobj,
index 446f4259285b8bda90c767de4d124b6a6ba4ec58..cbff3ea3cd893eed312d6f094477315ca01713ef 100644 (file)
@@ -36,8 +36,8 @@
 /*
  * Literals
  */
-#define IPR_DRIVER_VERSION "2.0.13"
-#define IPR_DRIVER_DATE "(February 21, 2005)"
+#define IPR_DRIVER_VERSION "2.0.14"
+#define IPR_DRIVER_DATE "(May 2, 2005)"
 
 /*
  * IPR_DBG_TRACE: Setting this to 1 will turn on some general function tracing
index fbc2cb6667a1a349e81aa559311e472ad7a94f91..6dfcb4fbccdda1ed614b2833ea755ed81df7b9ea 100644 (file)
@@ -819,12 +819,15 @@ ips_eh_abort(Scsi_Cmnd * SC)
        ips_ha_t *ha;
        ips_copp_wait_item_t *item;
        int ret;
+       unsigned long cpu_flags;
+       struct Scsi_Host *host;
 
        METHOD_TRACE("ips_eh_abort", 1);
 
        if (!SC)
                return (FAILED);
 
+       host = SC->device->host;
        ha = (ips_ha_t *) SC->device->host->hostdata;
 
        if (!ha)
@@ -833,6 +836,8 @@ ips_eh_abort(Scsi_Cmnd * SC)
        if (!ha->active)
                return (FAILED);
 
+       IPS_LOCK_SAVE(host->host_lock, cpu_flags);
+
        /* See if the command is on the copp queue */
        item = ha->copp_waitlist.head;
        while ((item) && (item->scsi_cmd != SC))
@@ -851,6 +856,8 @@ ips_eh_abort(Scsi_Cmnd * SC)
                /* command must have already been sent */
                ret = (FAILED);
        }
+
+       IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags);
        return ret;
 }
 
@@ -866,7 +873,7 @@ ips_eh_abort(Scsi_Cmnd * SC)
 /*                                                                          */
 /****************************************************************************/
 static int
-ips_eh_reset(Scsi_Cmnd * SC)
+__ips_eh_reset(Scsi_Cmnd * SC)
 {
        int ret;
        int i;
@@ -1053,6 +1060,18 @@ ips_eh_reset(Scsi_Cmnd * SC)
 
 }
 
+static int
+ips_eh_reset(Scsi_Cmnd * SC)
+{
+       int rc;
+
+       spin_lock_irq(SC->device->host->host_lock);
+       rc = __ips_eh_reset(SC);
+       spin_unlock_irq(SC->device->host->host_lock);
+
+       return rc;
+}
+
 /****************************************************************************/
 /*                                                                          */
 /* Routine Name: ips_queue                                                  */
index 96355b05fe5c7e980df16820e59520783cb0fcf0..141de479caca949e4069bb765f741c1fbf71cbc6 100644 (file)
@@ -187,6 +187,28 @@ static void ata_tf_load_mmio(struct ata_port *ap, struct ata_taskfile *tf)
        ata_wait_idle(ap);
 }
 
+
+/**
+ *     ata_tf_load - send taskfile registers to host controller
+ *     @ap: Port to which output is sent
+ *     @tf: ATA taskfile register set
+ *
+ *     Outputs ATA taskfile to standard ATA host controller using MMIO
+ *     or PIO as indicated by the ATA_FLAG_MMIO flag.
+ *     Writes the control, feature, nsect, lbal, lbam, and lbah registers.
+ *     Optionally (ATA_TFLAG_LBA48) writes hob_feature, hob_nsect,
+ *     hob_lbal, hob_lbam, and hob_lbah.
+ *
+ *     This function waits for idle (!BUSY and !DRQ) after writing
+ *     registers.  If the control register has a new value, this
+ *     function also waits for idle after writing control and before
+ *     writing the remaining registers.
+ *
+ *     May be used as the tf_load() entry in ata_port_operations.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ */
 void ata_tf_load(struct ata_port *ap, struct ata_taskfile *tf)
 {
        if (ap->flags & ATA_FLAG_MMIO)
@@ -196,11 +218,11 @@ void ata_tf_load(struct ata_port *ap, struct ata_taskfile *tf)
 }
 
 /**
- *     ata_exec_command - issue ATA command to host controller
+ *     ata_exec_command_pio - issue ATA command to host controller
  *     @ap: port to which command is being issued
  *     @tf: ATA taskfile register set
  *
- *     Issues PIO/MMIO write to ATA command register, with proper
+ *     Issues PIO write to ATA command register, with proper
  *     synchronization with interrupt handler / other threads.
  *
  *     LOCKING:
@@ -236,6 +258,18 @@ static void ata_exec_command_mmio(struct ata_port *ap, struct ata_taskfile *tf)
        ata_pause(ap);
 }
 
+
+/**
+ *     ata_exec_command - issue ATA command to host controller
+ *     @ap: port to which command is being issued
+ *     @tf: ATA taskfile register set
+ *
+ *     Issues PIO/MMIO write to ATA command register, with proper
+ *     synchronization with interrupt handler / other threads.
+ *
+ *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
+ */
 void ata_exec_command(struct ata_port *ap, struct ata_taskfile *tf)
 {
        if (ap->flags & ATA_FLAG_MMIO)
@@ -306,7 +340,7 @@ void ata_tf_to_host_nolock(struct ata_port *ap, struct ata_taskfile *tf)
 }
 
 /**
- *     ata_tf_read - input device's ATA taskfile shadow registers
+ *     ata_tf_read_pio - input device's ATA taskfile shadow registers
  *     @ap: Port from which input is read
  *     @tf: ATA taskfile register set for storing input
  *
@@ -369,6 +403,23 @@ static void ata_tf_read_mmio(struct ata_port *ap, struct ata_taskfile *tf)
        }
 }
 
+
+/**
+ *     ata_tf_read - input device's ATA taskfile shadow registers
+ *     @ap: Port from which input is read
+ *     @tf: ATA taskfile register set for storing input
+ *
+ *     Reads ATA taskfile registers for currently-selected device
+ *     into @tf.
+ *
+ *     Reads nsect, lbal, lbam, lbah, and device.  If ATA_TFLAG_LBA48
+ *     is set, also reads the hob registers.
+ *
+ *     May be used as the tf_read() entry in ata_port_operations.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ */
 void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
 {
        if (ap->flags & ATA_FLAG_MMIO)
@@ -382,7 +433,7 @@ void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
  *     @ap: port where the device is
  *
  *     Reads ATA taskfile status register for currently-selected device
- *     and return it's value. This also clears pending interrupts
+ *     and return its value. This also clears pending interrupts
  *      from this device
  *
  *     LOCKING:
@@ -398,7 +449,7 @@ static u8 ata_check_status_pio(struct ata_port *ap)
  *     @ap: port where the device is
  *
  *     Reads ATA taskfile status register for currently-selected device
- *     via MMIO and return it's value. This also clears pending interrupts
+ *     via MMIO and return its value. This also clears pending interrupts
  *      from this device
  *
  *     LOCKING:
@@ -409,6 +460,20 @@ static u8 ata_check_status_mmio(struct ata_port *ap)
                return readb((void __iomem *) ap->ioaddr.status_addr);
 }
 
+
+/**
+ *     ata_check_status - Read device status reg & clear interrupt
+ *     @ap: port where the device is
+ *
+ *     Reads ATA taskfile status register for currently-selected device
+ *     and return its value. This also clears pending interrupts
+ *      from this device
+ *
+ *     May be used as the check_status() entry in ata_port_operations.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ */
 u8 ata_check_status(struct ata_port *ap)
 {
        if (ap->flags & ATA_FLAG_MMIO)
@@ -416,6 +481,20 @@ u8 ata_check_status(struct ata_port *ap)
        return ata_check_status_pio(ap);
 }
 
+
+/**
+ *     ata_altstatus - Read device alternate status reg
+ *     @ap: port where the device is
+ *
+ *     Reads ATA taskfile alternate status register for
+ *     currently-selected device and return its value.
+ *
+ *     Note: may NOT be used as the check_altstatus() entry in
+ *     ata_port_operations.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ */
 u8 ata_altstatus(struct ata_port *ap)
 {
        if (ap->ops->check_altstatus)
@@ -426,6 +505,20 @@ u8 ata_altstatus(struct ata_port *ap)
        return inb(ap->ioaddr.altstatus_addr);
 }
 
+
+/**
+ *     ata_chk_err - Read device error reg
+ *     @ap: port where the device is
+ *
+ *     Reads ATA taskfile error register for
+ *     currently-selected device and return its value.
+ *
+ *     Note: may NOT be used as the check_err() entry in
+ *     ata_port_operations.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ */
 u8 ata_chk_err(struct ata_port *ap)
 {
        if (ap->ops->check_err)
@@ -874,10 +967,24 @@ void ata_dev_id_string(u16 *id, unsigned char *s,
        }
 }
 
+
+/**
+ *     ata_noop_dev_select - Select device 0/1 on ATA bus
+ *     @ap: ATA channel to manipulate
+ *     @device: ATA device (numbered from zero) to select
+ *
+ *     This function performs no actual function.
+ *
+ *     May be used as the dev_select() entry in ata_port_operations.
+ *
+ *     LOCKING:
+ *     caller.
+ */
 void ata_noop_dev_select (struct ata_port *ap, unsigned int device)
 {
 }
 
+
 /**
  *     ata_std_dev_select - Select device 0/1 on ATA bus
  *     @ap: ATA channel to manipulate
@@ -885,7 +992,9 @@ void ata_noop_dev_select (struct ata_port *ap, unsigned int device)
  *
  *     Use the method defined in the ATA specification to
  *     make either device 0, or device 1, active on the
- *     ATA channel.
+ *     ATA channel.  Works with both PIO and MMIO.
+ *
+ *     May be used as the dev_select() entry in ata_port_operations.
  *
  *     LOCKING:
  *     caller.
@@ -1224,11 +1333,47 @@ err_out:
        DPRINTK("EXIT, err\n");
 }
 
+
+static inline u8 ata_dev_knobble(struct ata_port *ap)
+{
+       return ((ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(ap->device->id)));
+}
+
+/**
+ *     ata_dev_config - Run device specific handlers and check for
+ *                      SATA->PATA bridges
+ *     @ap: Bus 
+ *     @i:  Device
+ *
+ *     LOCKING:
+ */
+void ata_dev_config(struct ata_port *ap, unsigned int i)
+{
+       /* limit bridge transfers to udma5, 200 sectors */
+       if (ata_dev_knobble(ap)) {
+               printk(KERN_INFO "ata%u(%u): applying bridge limits\n",
+                       ap->id, ap->device->devno);
+               ap->udma_mask &= ATA_UDMA5;
+               ap->host->max_sectors = ATA_MAX_SECTORS;
+               ap->host->hostt->max_sectors = ATA_MAX_SECTORS;
+               ap->device->flags |= ATA_DFLAG_LOCK_SECTORS;
+       }
+
+       if (ap->ops->dev_config)
+               ap->ops->dev_config(ap, &ap->device[i]);
+}
+
 /**
  *     ata_bus_probe - Reset and probe ATA bus
  *     @ap: Bus to probe
  *
+ *     Master ATA bus probing function.  Initiates a hardware-dependent
+ *     bus reset, then attempts to identify any devices found on
+ *     the bus.
+ *
  *     LOCKING:
+ *     PCI/etc. bus probe sem.
  *
  *     RETURNS:
  *     Zero on success, non-zero on error.
@@ -1246,8 +1391,7 @@ static int ata_bus_probe(struct ata_port *ap)
                ata_dev_identify(ap, i);
                if (ata_dev_present(&ap->device[i])) {
                        found = 1;
-                       if (ap->ops->dev_config)
-                               ap->ops->dev_config(ap, &ap->device[i]);
+                       ata_dev_config(ap,i);
                }
        }
 
@@ -1267,10 +1411,14 @@ err_out:
 }
 
 /**
- *     ata_port_probe -
- *     @ap:
+ *     ata_port_probe - Mark port as enabled
+ *     @ap: Port for which we indicate enablement
  *
- *     LOCKING:
+ *     Modify @ap data structure such that the system
+ *     thinks that the entire port is enabled.
+ *
+ *     LOCKING: host_set lock, or some other form of
+ *     serialization.
  */
 
 void ata_port_probe(struct ata_port *ap)
@@ -1279,10 +1427,15 @@ void ata_port_probe(struct ata_port *ap)
 }
 
 /**
- *     __sata_phy_reset -
- *     @ap:
+ *     __sata_phy_reset - Wake/reset a low-level SATA PHY
+ *     @ap: SATA port associated with target SATA PHY.
+ *
+ *     This function issues commands to standard SATA Sxxx
+ *     PHY registers, to wake up the phy (and device), and
+ *     clear any reset condition.
  *
  *     LOCKING:
+ *     PCI/etc. bus probe sem.
  *
  */
 void __sata_phy_reset(struct ata_port *ap)
@@ -1291,11 +1444,11 @@ void __sata_phy_reset(struct ata_port *ap)
        unsigned long timeout = jiffies + (HZ * 5);
 
        if (ap->flags & ATA_FLAG_SATA_RESET) {
-               scr_write(ap, SCR_CONTROL, 0x301); /* issue phy wake/reset */
-               scr_read(ap, SCR_STATUS);       /* dummy read; flush */
+               /* issue phy wake/reset */
+               scr_write_flush(ap, SCR_CONTROL, 0x301);
                udelay(400);                    /* FIXME: a guess */
        }
-       scr_write(ap, SCR_CONTROL, 0x300);      /* issue phy wake/clear reset */
+       scr_write_flush(ap, SCR_CONTROL, 0x300); /* phy wake/clear reset */
 
        /* wait for phy to become ready, if necessary */
        do {
@@ -1327,10 +1480,14 @@ void __sata_phy_reset(struct ata_port *ap)
 }
 
 /**
- *     __sata_phy_reset -
- *     @ap:
+ *     sata_phy_reset - Reset SATA bus.
+ *     @ap: SATA port associated with target SATA PHY.
+ *
+ *     This function resets the SATA bus, and then probes
+ *     the bus for devices.
  *
  *     LOCKING:
+ *     PCI/etc. bus probe sem.
  *
  */
 void sata_phy_reset(struct ata_port *ap)
@@ -1342,10 +1499,16 @@ void sata_phy_reset(struct ata_port *ap)
 }
 
 /**
- *     ata_port_disable -
- *     @ap:
+ *     ata_port_disable - Disable port.
+ *     @ap: Port to be disabled.
  *
- *     LOCKING:
+ *     Modify @ap data structure such that the system
+ *     thinks that the entire port is disabled, and should
+ *     never attempt to probe or communicate with devices
+ *     on this port.
+ *
+ *     LOCKING: host_set lock, or some other form of
+ *     serialization.
  */
 
 void ata_port_disable(struct ata_port *ap)
@@ -1454,7 +1617,10 @@ static void ata_host_set_dma(struct ata_port *ap, u8 xfer_mode,
  *     ata_set_mode - Program timings and issue SET FEATURES - XFER
  *     @ap: port on which timings will be programmed
  *
+ *     Set ATA device disk transfer mode (PIO3, UDMA6, etc.).
+ *
  *     LOCKING:
+ *     PCI/etc. bus probe sem.
  *
  */
 static void ata_set_mode(struct ata_port *ap)
@@ -1505,7 +1671,10 @@ err_out:
  *     @tmout_pat: impatience timeout
  *     @tmout: overall timeout
  *
- *     LOCKING:
+ *     Sleep until ATA Status register bit BSY clears,
+ *     or a timeout occurs.
+ *
+ *     LOCKING: None.
  *
  */
 
@@ -1591,10 +1760,14 @@ static void ata_bus_post_reset(struct ata_port *ap, unsigned int devmask)
 }
 
 /**
- *     ata_bus_edd -
- *     @ap:
+ *     ata_bus_edd - Issue EXECUTE DEVICE DIAGNOSTIC command.
+ *     @ap: Port to reset and probe
+ *
+ *     Use the EXECUTE DEVICE DIAGNOSTIC command to reset and
+ *     probe the bus.  Not often used these days.
  *
  *     LOCKING:
+ *     PCI/etc. bus probe sem.
  *
  */
 
@@ -1671,8 +1844,8 @@ static unsigned int ata_bus_softreset(struct ata_port *ap,
  *     the device is ATA or ATAPI.
  *
  *     LOCKING:
- *     Inherited from caller.  Some functions called by this function
- *     obtain the host_set lock.
+ *     PCI/etc. bus probe sem.
+ *     Obtains host_set lock.
  *
  *     SIDE EFFECTS:
  *     Sets ATA_FLAG_PORT_DISABLED if bus reset fails.
@@ -1914,7 +2087,11 @@ static int fgb(u32 bitmap)
  *     @xfer_mode_out: (output) SET FEATURES - XFER MODE code
  *     @xfer_shift_out: (output) bit shift that selects this mode
  *
+ *     Based on host and device capabilities, determine the
+ *     maximum transfer mode that is amenable to all.
+ *
  *     LOCKING:
+ *     PCI/etc. bus probe sem.
  *
  *     RETURNS:
  *     Zero on success, negative on error.
@@ -1947,7 +2124,11 @@ static int ata_choose_xfer_mode(struct ata_port *ap,
  *     @ap: Port associated with device @dev
  *     @dev: Device to which command will be sent
  *
+ *     Issue SET FEATURES - XFER MODE command to device @dev
+ *     on port @ap.
+ *
  *     LOCKING:
+ *     PCI/etc. bus probe sem.
  */
 
 static void ata_dev_set_xfermode(struct ata_port *ap, struct ata_device *dev)
@@ -2033,10 +2214,13 @@ static void ata_dev_init_params(struct ata_port *ap, struct ata_device *dev)
 }
 
 /**
- *     ata_sg_clean -
- *     @qc:
+ *     ata_sg_clean - Unmap DMA memory associated with command
+ *     @qc: Command containing DMA memory to be released
+ *
+ *     Unmap all mapped DMA memory associated with this command.
  *
  *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
  */
 
 static void ata_sg_clean(struct ata_queued_cmd *qc)
@@ -2067,7 +2251,11 @@ static void ata_sg_clean(struct ata_queued_cmd *qc)
  *     ata_fill_sg - Fill PCI IDE PRD table
  *     @qc: Metadata associated with taskfile to be transferred
  *
+ *     Fill PCI IDE PRD (scatter-gather) table with segments
+ *     associated with the current disk command.
+ *
  *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
  *
  */
 static void ata_fill_sg(struct ata_queued_cmd *qc)
@@ -2114,7 +2302,13 @@ static void ata_fill_sg(struct ata_queued_cmd *qc)
  *     ata_check_atapi_dma - Check whether ATAPI DMA can be supported
  *     @qc: Metadata associated with taskfile to check
  *
+ *     Allow low-level driver to filter ATA PACKET commands, returning
+ *     a status indicating whether or not it is OK to use DMA for the
+ *     supplied PACKET command.
+ *
  *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
+ *
  *     RETURNS: 0 when ATAPI DMA can be used
  *               nonzero otherwise
  */
@@ -2132,6 +2326,8 @@ int ata_check_atapi_dma(struct ata_queued_cmd *qc)
  *     ata_qc_prep - Prepare taskfile for submission
  *     @qc: Metadata associated with taskfile to be prepared
  *
+ *     Prepare ATA taskfile for submission.
+ *
  *     LOCKING:
  *     spin_lock_irqsave(host_set lock)
  */
@@ -2143,6 +2339,32 @@ void ata_qc_prep(struct ata_queued_cmd *qc)
        ata_fill_sg(qc);
 }
 
+/**
+ *     ata_sg_init_one - Associate command with memory buffer
+ *     @qc: Command to be associated
+ *     @buf: Memory buffer
+ *     @buflen: Length of memory buffer, in bytes.
+ *
+ *     Initialize the data-related elements of queued_cmd @qc
+ *     to point to a single memory buffer, @buf of byte length @buflen.
+ *
+ *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
+ */
+
+
+
+/**
+ *     ata_sg_init_one - Prepare a one-entry scatter-gather list.
+ *     @qc:  Queued command
+ *     @buf:  transfer buffer
+ *     @buflen:  length of buf
+ *
+ *     Builds a single-entry scatter-gather list to initiate a
+ *     transfer utilizing the specified buffer.
+ *
+ *     LOCKING:
+ */
 void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen)
 {
        struct scatterlist *sg;
@@ -2157,9 +2379,35 @@ void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen)
        sg = qc->sg;
        sg->page = virt_to_page(buf);
        sg->offset = (unsigned long) buf & ~PAGE_MASK;
-       sg_dma_len(sg) = buflen;
+       sg->length = buflen;
 }
 
+/**
+ *     ata_sg_init - Associate command with scatter-gather table.
+ *     @qc: Command to be associated
+ *     @sg: Scatter-gather table.
+ *     @n_elem: Number of elements in s/g table.
+ *
+ *     Initialize the data-related elements of queued_cmd @qc
+ *     to point to a scatter-gather table @sg, containing @n_elem
+ *     elements.
+ *
+ *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
+ */
+
+
+/**
+ *     ata_sg_init - Assign a scatter gather list to a queued command
+ *     @qc:  Queued command
+ *     @sg:  Scatter-gather list
+ *     @n_elem:  length of sg list
+ *
+ *     Attaches a scatter-gather list to a queued command.
+ *
+ *     LOCKING:
+ */
+
 void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
                 unsigned int n_elem)
 {
@@ -2169,14 +2417,16 @@ void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
 }
 
 /**
- *     ata_sg_setup_one -
- *     @qc:
+ *     ata_sg_setup_one - DMA-map the memory buffer associated with a command.
+ *     @qc: Command with memory buffer to be mapped.
+ *
+ *     DMA-map the memory buffer associated with queued_cmd @qc.
  *
  *     LOCKING:
  *     spin_lock_irqsave(host_set lock)
  *
  *     RETURNS:
- *
+ *     Zero on success, negative on error.
  */
 
 static int ata_sg_setup_one(struct ata_queued_cmd *qc)
@@ -2187,11 +2437,12 @@ static int ata_sg_setup_one(struct ata_queued_cmd *qc)
        dma_addr_t dma_address;
 
        dma_address = dma_map_single(ap->host_set->dev, qc->buf_virt,
-                                    sg_dma_len(sg), dir);
+                                    sg->length, dir);
        if (dma_mapping_error(dma_address))
                return -1;
 
        sg_dma_address(sg) = dma_address;
+       sg_dma_len(sg) = sg->length;
 
        DPRINTK("mapped buffer of %d bytes for %s\n", sg_dma_len(sg),
                qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
@@ -2200,13 +2451,16 @@ static int ata_sg_setup_one(struct ata_queued_cmd *qc)
 }
 
 /**
- *     ata_sg_setup -
- *     @qc:
+ *     ata_sg_setup - DMA-map the scatter-gather table associated with a command.
+ *     @qc: Command with scatter-gather table to be mapped.
+ *
+ *     DMA-map the scatter-gather table associated with queued_cmd @qc.
  *
  *     LOCKING:
  *     spin_lock_irqsave(host_set lock)
  *
  *     RETURNS:
+ *     Zero on success, negative on error.
  *
  */
 
@@ -2236,6 +2490,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
  *     @ap:
  *
  *     LOCKING:
+ *     None.  (executing in kernel thread context)
  *
  *     RETURNS:
  *
@@ -2283,6 +2538,7 @@ static unsigned long ata_pio_poll(struct ata_port *ap)
  *     @ap:
  *
  *     LOCKING:
+ *     None.  (executing in kernel thread context)
  */
 
 static void ata_pio_complete (struct ata_port *ap)
@@ -2325,6 +2581,18 @@ static void ata_pio_complete (struct ata_port *ap)
        ata_qc_complete(qc, drv_stat);
 }
 
+
+/**
+ *     swap_buf_le16 -
+ *     @buf:  Buffer to swap
+ *     @buf_words:  Number of 16-bit words in buffer.
+ *
+ *     Swap halves of 16-bit words if needed to convert from
+ *     little-endian byte order to native cpu byte order, or
+ *     vice-versa.
+ *
+ *     LOCKING:
+ */
 void swap_buf_le16(u16 *buf, unsigned int buf_words)
 {
 #ifdef __BIG_ENDIAN
@@ -2396,7 +2664,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
        qc->cursect++;
        qc->cursg_ofs++;
 
-       if ((qc->cursg_ofs * ATA_SECT_SIZE) == sg_dma_len(&sg[qc->cursg])) {
+       if ((qc->cursg_ofs * ATA_SECT_SIZE) == (&sg[qc->cursg])->length) {
                qc->cursg++;
                qc->cursg_ofs = 0;
        }
@@ -2425,7 +2693,6 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
 next_sg:
        sg = &qc->sg[qc->cursg];
 
-next_page:
        page = sg->page;
        offset = sg->offset + qc->cursg_ofs;
 
@@ -2433,7 +2700,8 @@ next_page:
        page = nth_page(page, (offset >> PAGE_SHIFT));
        offset %= PAGE_SIZE;
 
-       count = min(sg_dma_len(sg) - qc->cursg_ofs, bytes);
+       /* don't overrun current sg */
+       count = min(sg->length - qc->cursg_ofs, bytes);
 
        /* don't cross page boundaries */
        count = min(count, (unsigned int)PAGE_SIZE - offset);
@@ -2444,7 +2712,7 @@ next_page:
        qc->curbytes += count;
        qc->cursg_ofs += count;
 
-       if (qc->cursg_ofs == sg_dma_len(sg)) {
+       if (qc->cursg_ofs == sg->length) {
                qc->cursg++;
                qc->cursg_ofs = 0;
        }
@@ -2457,8 +2725,6 @@ next_page:
        kunmap(page);
 
        if (bytes) {
-               if (qc->cursg_ofs < sg_dma_len(sg))
-                       goto next_page;
                goto next_sg;
        }
 }
@@ -2500,6 +2766,7 @@ err_out:
  *     @ap:
  *
  *     LOCKING:
+ *     None.  (executing in kernel thread context)
  */
 
 static void ata_pio_block(struct ata_port *ap)
@@ -2625,7 +2892,7 @@ static void atapi_request_sense(struct ata_port *ap, struct ata_device *dev,
        ata_sg_init_one(qc, cmd->sense_buffer, sizeof(cmd->sense_buffer));
        qc->dma_dir = DMA_FROM_DEVICE;
 
-       memset(&qc->cdb, 0, sizeof(ap->cdb_len));
+       memset(&qc->cdb, 0, ap->cdb_len);
        qc->cdb[0] = REQUEST_SENSE;
        qc->cdb[4] = SCSI_SENSE_BUFFERSIZE;
 
@@ -2668,6 +2935,7 @@ static void atapi_request_sense(struct ata_port *ap, struct ata_device *dev,
  *     transaction completed successfully.
  *
  *     LOCKING:
+ *     Inherited from SCSI layer (none, can sleep)
  */
 
 static void ata_qc_timeout(struct ata_queued_cmd *qc)
@@ -2777,6 +3045,7 @@ out:
  *     @dev: Device from whom we request an available command structure
  *
  *     LOCKING:
+ *     None.
  */
 
 static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap)
@@ -2802,6 +3071,7 @@ static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap)
  *     @dev: Device from whom we request an available command structure
  *
  *     LOCKING:
+ *     None.
  */
 
 struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
@@ -2870,6 +3140,7 @@ static void __ata_qc_complete(struct ata_queued_cmd *qc)
  *     in case something prevents using it.
  *
  *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
  *
  */
 void ata_qc_free(struct ata_queued_cmd *qc)
@@ -2883,9 +3154,13 @@ void ata_qc_free(struct ata_queued_cmd *qc)
 /**
  *     ata_qc_complete - Complete an active ATA command
  *     @qc: Command to complete
- *     @drv_stat: ATA status register contents
+ *     @drv_stat: ATA Status register contents
+ *
+ *     Indicate to the mid and upper layers that an ATA
+ *     command has completed, with either an ok or not-ok status.
  *
  *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
  *
  */
 
@@ -2901,6 +3176,7 @@ void ata_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat)
 
        /* call completion callback */
        rc = qc->complete_fn(qc, drv_stat);
+       qc->flags &= ~ATA_QCFLAG_ACTIVE;
 
        /* if callback indicates not to complete command (non-zero),
         * return immediately
@@ -2980,6 +3256,7 @@ err_out:
        return -1;
 }
 
+
 /**
  *     ata_qc_issue_prot - issue taskfile to device in proto-dependent manner
  *     @qc: command to issue to device
@@ -2989,6 +3266,8 @@ err_out:
  *     classes called "protocols", and issuing each type of protocol
  *     is slightly different.
  *
+ *     May be used as the qc_issue() entry in ata_port_operations.
+ *
  *     LOCKING:
  *     spin_lock_irqsave(host_set lock)
  *
@@ -3046,7 +3325,7 @@ int ata_qc_issue_prot(struct ata_queued_cmd *qc)
 }
 
 /**
- *     ata_bmdma_setup - Set up PCI IDE BMDMA transaction
+ *     ata_bmdma_setup_mmio - Set up PCI IDE BMDMA transaction
  *     @qc: Info associated with this ATA transaction.
  *
  *     LOCKING:
@@ -3153,6 +3432,18 @@ static void ata_bmdma_start_pio (struct ata_queued_cmd *qc)
             ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
 }
 
+
+/**
+ *     ata_bmdma_start - Start a PCI IDE BMDMA transaction
+ *     @qc: Info associated with this ATA transaction.
+ *
+ *     Writes the ATA_DMA_START flag to the DMA command register.
+ *
+ *     May be used as the bmdma_start() entry in ata_port_operations.
+ *
+ *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
+ */
 void ata_bmdma_start(struct ata_queued_cmd *qc)
 {
        if (qc->ap->flags & ATA_FLAG_MMIO)
@@ -3161,6 +3452,20 @@ void ata_bmdma_start(struct ata_queued_cmd *qc)
                ata_bmdma_start_pio(qc);
 }
 
+
+/**
+ *     ata_bmdma_setup - Set up PCI IDE BMDMA transaction
+ *     @qc: Info associated with this ATA transaction.
+ *
+ *     Writes address of PRD table to device's PRD Table Address
+ *     register, sets the DMA control register, and calls
+ *     ops->exec_command() to start the transfer.
+ *
+ *     May be used as the bmdma_setup() entry in ata_port_operations.
+ *
+ *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
+ */
 void ata_bmdma_setup(struct ata_queued_cmd *qc)
 {
        if (qc->ap->flags & ATA_FLAG_MMIO)
@@ -3169,6 +3474,19 @@ void ata_bmdma_setup(struct ata_queued_cmd *qc)
                ata_bmdma_setup_pio(qc);
 }
 
+
+/**
+ *     ata_bmdma_irq_clear - Clear PCI IDE BMDMA interrupt.
+ *     @ap: Port associated with this ATA transaction.
+ *
+ *     Clear interrupt and error flags in DMA status register.
+ *
+ *     May be used as the irq_clear() entry in ata_port_operations.
+ *
+ *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
+ */
+
 void ata_bmdma_irq_clear(struct ata_port *ap)
 {
     if (ap->flags & ATA_FLAG_MMIO) {
@@ -3181,6 +3499,19 @@ void ata_bmdma_irq_clear(struct ata_port *ap)
 
 }
 
+
+/**
+ *     ata_bmdma_status - Read PCI IDE BMDMA status
+ *     @ap: Port associated with this ATA transaction.
+ *
+ *     Read and return BMDMA status register.
+ *
+ *     May be used as the bmdma_status() entry in ata_port_operations.
+ *
+ *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
+ */
+
 u8 ata_bmdma_status(struct ata_port *ap)
 {
        u8 host_stat;
@@ -3192,6 +3523,19 @@ u8 ata_bmdma_status(struct ata_port *ap)
        return host_stat;
 }
 
+
+/**
+ *     ata_bmdma_stop - Stop PCI IDE BMDMA transfer
+ *     @ap: Port associated with this ATA transaction.
+ *
+ *     Clears the ATA_DMA_START flag in the dma control register
+ *
+ *     May be used as the bmdma_stop() entry in ata_port_operations.
+ *
+ *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
+ */
+
 void ata_bmdma_stop(struct ata_port *ap)
 {
        if (ap->flags & ATA_FLAG_MMIO) {
@@ -3291,13 +3635,18 @@ idle_irq:
 
 /**
  *     ata_interrupt - Default ATA host interrupt handler
- *     @irq: irq line
- *     @dev_instance: pointer to our host information structure
+ *     @irq: irq line (unused)
+ *     @dev_instance: pointer to our ata_host_set information structure
  *     @regs: unused
  *
+ *     Default interrupt handler for PCI IDE devices.  Calls
+ *     ata_host_intr() for each port that is not disabled.
+ *
  *     LOCKING:
+ *     Obtains host_set lock during operation.
  *
  *     RETURNS:
+ *     IRQ_NONE or IRQ_HANDLED.
  *
  */
 
@@ -3319,7 +3668,8 @@ irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
                        struct ata_queued_cmd *qc;
 
                        qc = ata_qc_from_tag(ap, ap->active_tag);
-                       if (qc && (!(qc->tf.ctl & ATA_NIEN)))
+                       if (qc && (!(qc->tf.ctl & ATA_NIEN)) &&
+                           (qc->flags & ATA_QCFLAG_ACTIVE))
                                handled |= ata_host_intr(ap, qc);
                }
        }
@@ -3389,6 +3739,19 @@ err_out:
        ata_qc_complete(qc, ATA_ERR);
 }
 
+
+/**
+ *     ata_port_start - Set port up for dma.
+ *     @ap: Port to initialize
+ *
+ *     Called just after data structures for each port are
+ *     initialized.  Allocates space for PRD table.
+ *
+ *     May be used as the port_start() entry in ata_port_operations.
+ *
+ *     LOCKING:
+ */
+
 int ata_port_start (struct ata_port *ap)
 {
        struct device *dev = ap->host_set->dev;
@@ -3402,6 +3765,18 @@ int ata_port_start (struct ata_port *ap)
        return 0;
 }
 
+
+/**
+ *     ata_port_stop - Undo ata_port_start()
+ *     @ap: Port to shut down
+ *
+ *     Frees the PRD table.
+ *
+ *     May be used as the port_stop() entry in ata_port_operations.
+ *
+ *     LOCKING:
+ */
+
 void ata_port_stop (struct ata_port *ap)
 {
        struct device *dev = ap->host_set->dev;
@@ -3409,6 +3784,13 @@ void ata_port_stop (struct ata_port *ap)
        dma_free_coherent(dev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma);
 }
 
+void ata_host_stop (struct ata_host_set *host_set)
+{
+       if (host_set->mmio_base)
+               iounmap(host_set->mmio_base);
+}
+
+
 /**
  *     ata_host_remove - Unregister SCSI host structure with upper layers
  *     @ap: Port to unregister
@@ -3437,7 +3819,11 @@ static void ata_host_remove(struct ata_port *ap, unsigned int do_unregister)
  *     @ent: Probe information provided by low-level driver
  *     @port_no: Port number associated with this ata_port
  *
+ *     Initialize a new ata_port structure, and its associated
+ *     scsi_host.
+ *
  *     LOCKING:
+ *     Inherited from caller.
  *
  */
 
@@ -3492,9 +3878,13 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host,
  *     @host_set: Collections of ports to which we add
  *     @port_no: Port number associated with this host
  *
+ *     Attach low-level ATA driver to system.
+ *
  *     LOCKING:
+ *     PCI/etc. bus probe sem.
  *
  *     RETURNS:
+ *     New ata_port on success, for NULL on error.
  *
  */
 
@@ -3527,12 +3917,22 @@ err_out:
 }
 
 /**
- *     ata_device_add -
- *     @ent:
+ *     ata_device_add - Register hardware device with ATA and SCSI layers
+ *     @ent: Probe information describing hardware device to be registered
+ *
+ *     This function processes the information provided in the probe
+ *     information struct @ent, allocates the necessary ATA and SCSI
+ *     host information structures, initializes them, and registers
+ *     everything with requisite kernel subsystems.
+ *
+ *     This function requests irqs, probes the ATA bus, and probes
+ *     the SCSI bus.
  *
  *     LOCKING:
+ *     PCI/etc. bus probe sem.
  *
  *     RETURNS:
+ *     Number of ports registered.  Zero on error (no ports registered).
  *
  */
 
@@ -3684,7 +4084,15 @@ int ata_scsi_release(struct Scsi_Host *host)
 /**
  *     ata_std_ports - initialize ioaddr with standard port offsets.
  *     @ioaddr: IO address structure to be initialized
+ *
+ *     Utility function which initializes data_addr, error_addr,
+ *     feature_addr, nsect_addr, lbal_addr, lbam_addr, lbah_addr,
+ *     device_addr, status_addr, and command_addr to standard offsets
+ *     relative to cmd_addr.
+ *
+ *     Does not set ctl_addr, altstatus_addr, bmdma_addr, or scr_addr.
  */
+
 void ata_std_ports(struct ata_ioports *ioaddr)
 {
        ioaddr->data_addr = ioaddr->cmd_addr + ATA_REG_DATA;
@@ -3726,6 +4134,20 @@ ata_probe_ent_alloc(struct device *dev, struct ata_port_info *port)
        return probe_ent;
 }
 
+
+
+/**
+ *     ata_pci_init_native_mode - Initialize native-mode driver
+ *     @pdev:  pci device to be initialized
+ *     @port:  array[2] of pointers to port info structures.
+ *
+ *     Utility function which allocates and initializes an
+ *     ata_probe_ent structure for a standard dual-port
+ *     PIO-based IDE controller.  The returned ata_probe_ent
+ *     structure can be passed to ata_device_add().  The returned
+ *     ata_probe_ent structure should then be freed with kfree().
+ */
+
 #ifdef CONFIG_PCI
 struct ata_probe_ent *
 ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port)
@@ -3807,10 +4229,19 @@ ata_pci_init_legacy_mode(struct pci_dev *pdev, struct ata_port_info **port,
  *     @port_info: Information from low-level host driver
  *     @n_ports: Number of ports attached to host controller
  *
+ *     This is a helper function which can be called from a driver's
+ *     xxx_init_one() probe function if the hardware uses traditional
+ *     IDE taskfile registers.
+ *
+ *     This function calls pci_enable_device(), reserves its register
+ *     regions, sets the dma mask, enables bus master mode, and calls
+ *     ata_device_add()
+ *
  *     LOCKING:
  *     Inherited from PCI layer (may sleep).
  *
  *     RETURNS:
+ *     Zero on success, negative on errno-based value on error.
  *
  */
 
@@ -3965,10 +4396,6 @@ void ata_pci_remove_one (struct pci_dev *pdev)
        }
 
        free_irq(host_set->irq, host_set);
-       if (host_set->ops->host_stop)
-               host_set->ops->host_stop(host_set);
-       if (host_set->mmio_base)
-               iounmap(host_set->mmio_base);
 
        for (i = 0; i < host_set->n_ports; i++) {
                ap = host_set->ports[i];
@@ -3987,6 +4414,9 @@ void ata_pci_remove_one (struct pci_dev *pdev)
                scsi_host_put(ap->host);
        }
 
+       if (host_set->ops->host_stop)
+               host_set->ops->host_stop(host_set);
+
        kfree(host_set);
 
        pci_release_regions(pdev);
@@ -4030,15 +4460,6 @@ int pci_test_config_bits(struct pci_dev *pdev, struct pci_bits *bits)
 #endif /* CONFIG_PCI */
 
 
-/**
- *     ata_init -
- *
- *     LOCKING:
- *
- *     RETURNS:
- *
- */
-
 static int __init ata_init(void)
 {
        ata_wq = create_workqueue("ata");
@@ -4084,6 +4505,7 @@ EXPORT_SYMBOL_GPL(ata_chk_err);
 EXPORT_SYMBOL_GPL(ata_exec_command);
 EXPORT_SYMBOL_GPL(ata_port_start);
 EXPORT_SYMBOL_GPL(ata_port_stop);
+EXPORT_SYMBOL_GPL(ata_host_stop);
 EXPORT_SYMBOL_GPL(ata_interrupt);
 EXPORT_SYMBOL_GPL(ata_qc_prep);
 EXPORT_SYMBOL_GPL(ata_bmdma_setup);
@@ -4104,6 +4526,7 @@ EXPORT_SYMBOL_GPL(ata_scsi_release);
 EXPORT_SYMBOL_GPL(ata_host_intr);
 EXPORT_SYMBOL_GPL(ata_dev_classify);
 EXPORT_SYMBOL_GPL(ata_dev_id_string);
+EXPORT_SYMBOL_GPL(ata_dev_config);
 EXPORT_SYMBOL_GPL(ata_scsi_simulate);
 
 #ifdef CONFIG_PCI
index 8b065ef0e39abaca243d67fc9158f9b52bfbf993..5367c10e4db85db08ee0be44654daffb07928af3 100644 (file)
@@ -347,7 +347,10 @@ int ata_scsi_slave_config(struct scsi_device *sdev)
                 */
                if ((dev->flags & ATA_DFLAG_LBA48) &&
                    ((dev->flags & ATA_DFLAG_LOCK_SECTORS) == 0)) {
-                       sdev->host->max_sectors = 2048;
+                       /*
+                        * do not overwrite sdev->host->max_sectors, since
+                        * other drives on this host may not support LBA48
+                        */
                        blk_queue_max_sectors(sdev->request_queue, 2048);
                }
        }
@@ -1008,7 +1011,7 @@ unsigned int ata_scsiop_inq_83(struct ata_scsi_args *args, u8 *rbuf,
 }
 
 /**
- *     ata_scsiop_noop -
+ *     ata_scsiop_noop - Command handler that simply returns success.
  *     @args: device IDENTIFY data / SCSI command of interest.
  *     @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
  *     @buflen: Response buffer length.
index 6518226b8f87f2e92d75694420d593498cba00e1..d90430bbb0de1032bc40e6835550962ac4dbdd5f 100644 (file)
@@ -26,7 +26,7 @@
 #define __LIBATA_H__
 
 #define DRV_NAME       "libata"
-#define DRV_VERSION    "1.10"  /* must be exactly four chars */
+#define DRV_VERSION    "1.11"  /* must be exactly four chars */
 
 struct ata_scsi_args {
        u16                     *id;
index 42fab03ad2baa5b0ef275aeefe01f857adda168d..f2aff3f4042baf4aa86bfa4134bb467a2e68dff6 100644 (file)
@@ -798,7 +798,7 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
 }
 
 static int
-lpfc_abort_handler(struct scsi_cmnd *cmnd)
+__lpfc_abort_handler(struct scsi_cmnd *cmnd)
 {
        struct lpfc_hba *phba =
                        (struct lpfc_hba *)cmnd->device->host->hostdata[0];
@@ -918,7 +918,17 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)
 }
 
 static int
-lpfc_reset_lun_handler(struct scsi_cmnd *cmnd)
+lpfc_abort_handler(struct scsi_cmnd *cmnd)
+{
+       int rc;
+       spin_lock_irq(cmnd->device->host->host_lock);
+       rc = __lpfc_abort_handler(cmnd);
+       spin_unlock_irq(cmnd->device->host->host_lock);
+       return rc;
+}
+
+static int
+__lpfc_reset_lun_handler(struct scsi_cmnd *cmnd)
 {
        struct Scsi_Host *shost = cmnd->device->host;
        struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0];
@@ -1030,11 +1040,21 @@ out:
        return ret;
 }
 
+static int
+lpfc_reset_lun_handler(struct scsi_cmnd *cmnd)
+{
+       int rc;
+       spin_lock_irq(cmnd->device->host->host_lock);
+       rc = __lpfc_reset_lun_handler(cmnd);
+       spin_unlock_irq(cmnd->device->host->host_lock);
+       return rc;
+}
+
 /*
  * Note: midlayer calls this function with the host_lock held
  */
 static int
-lpfc_reset_bus_handler(struct scsi_cmnd *cmnd)
+__lpfc_reset_bus_handler(struct scsi_cmnd *cmnd)
 {
        struct Scsi_Host *shost = cmnd->device->host;
        struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0];
@@ -1123,6 +1143,16 @@ out:
        return ret;
 }
 
+static int
+lpfc_reset_bus_handler(struct scsi_cmnd *cmnd)
+{
+       int rc;
+       spin_lock_irq(cmnd->device->host->host_lock);
+       rc = __lpfc_reset_bus_handler(cmnd);
+       spin_unlock_irq(cmnd->device->host->host_lock);
+       return rc;
+}
+
 static int
 lpfc_slave_alloc(struct scsi_device *sdev)
 {
index 3ef2a1443996d0700da7e1389e60b44ccf44a1b0..edd47d1f0b17567047ee6d76029d9268380e4717 100644 (file)
@@ -98,16 +98,14 @@ static int mac53c94_queue(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *
        return 0;
 }
 
-static int mac53c94_abort(struct scsi_cmnd *cmd)
-{
-       return FAILED;
-}
-
 static int mac53c94_host_reset(struct scsi_cmnd *cmd)
 {
        struct fsc_state *state = (struct fsc_state *) cmd->device->host->hostdata;
        struct mac53c94_regs __iomem *regs = state->regs;
        struct dbdma_regs __iomem *dma = state->dma;
+       unsigned long flags;
+
+       spin_lock_irqsave(cmd->device->host->host_lock, flags);
 
        writel((RUN|PAUSE|FLUSH|WAKE) << 16, &dma->control);
        writeb(CMD_SCSI_RESET, &regs->command); /* assert RST */
@@ -116,6 +114,8 @@ static int mac53c94_host_reset(struct scsi_cmnd *cmd)
        udelay(20);
        mac53c94_init(state);
        writeb(CMD_NOP, &regs->command);
+
+       spin_unlock_irqrestore(cmd->device->host->host_lock, flags);
        return SUCCESS;
 }
 
@@ -416,7 +416,6 @@ static struct scsi_host_template mac53c94_template = {
        .proc_name      = "53c94",
        .name           = "53C94",
        .queuecommand   = mac53c94_queue,
-       .eh_abort_handler = mac53c94_abort,
        .eh_host_reset_handler = mac53c94_host_reset,
        .can_queue      = 1,
        .this_id        = 7,
index d5fd17ef74dbb3bdc293c0721fd4e07c75dac79e..92d2c8379abf529989afd58f10976aedb901d325 100644 (file)
@@ -591,8 +591,6 @@ static Scsi_Host_Template driver_template = {
        .queuecommand                   = macscsi_queue_command,
        .eh_abort_handler               = macscsi_abort,
        .eh_bus_reset_handler           = macscsi_bus_reset,
-       .eh_device_reset_handler        = macscsi_device_reset,
-       .eh_host_reset_handler          = macscsi_host_reset,
        .can_queue                      = CAN_QUEUE,
        .this_id                        = 7,
        .sg_tablesize                   = SG_ALL,
index 23ab2c18a01644f90d1c69addf872ec2b81d5675..d26e331c6c12e3d6e37790e92ed124a74b34309d 100644 (file)
@@ -72,8 +72,6 @@
 #define NCR5380_queue_command macscsi_queue_command
 #define NCR5380_abort macscsi_abort
 #define NCR5380_bus_reset macscsi_bus_reset
-#define NCR5380_device_reset macscsi_device_reset
-#define NCR5380_host_reset macscsi_host_reset
 #define NCR5380_proc_info macscsi_proc_info
 
 #define BOARD_NORMAL   0
index 8d707b29027da4dcab34942adcc7aac9f5e11a8e..ec81532eb8455b5af006f0d34f25f685e1f2b698 100644 (file)
@@ -1938,7 +1938,7 @@ megaraid_abort(Scsi_Cmnd *cmd)
 
 
 static int
-megaraid_reset(Scsi_Cmnd *cmd)
+__megaraid_reset(Scsi_Cmnd *cmd)
 {
        adapter_t       *adapter;
        megacmd_t       mc;
@@ -1972,6 +1972,18 @@ megaraid_reset(Scsi_Cmnd *cmd)
        return rval;
 }
 
+static int
+megaraid_reset(Scsi_Cmnd *cmd)
+{
+       adapter_t *adapter = (adapter_t *)cmd->device->host->hostdata;
+       int rc;
+
+       spin_lock_irq(&adapter->lock);
+       rc = __megaraid_reset(cmd);
+       spin_unlock_irq(&adapter->lock);
+
+       return rc;
+}
 
 
 /**
index 18969a4946b752a88ba61cd4dc0eb088c41ebac9..69df1a9b935d64126c53838fc1c8d350ebf6ac6d 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/list.h>
 #include <linux/version.h>
 #include <linux/moduleparam.h>
+#include <linux/dma-mapping.h>
 #include <asm/semaphore.h>
 #include <scsi/scsi.h>
 #include <scsi/scsi_cmnd.h>
index 138fa481583371623124c419e1d2367cfb7da612..cbe4302462760b681ddd85d79cfd9d02f0258e7d 100644 (file)
@@ -10,7 +10,7 @@
  *        2 of the License, or (at your option) any later version.
  *
  * FILE                : megaraid_mbox.c
- * Version     : v2.20.4.5 (Feb 03 2005)
+ * Version     : v2.20.4.6 (Mar 07 2005)
  *
  * Authors:
  *     Atul Mukker             <Atul.Mukker@lsil.com>
@@ -124,7 +124,7 @@ static irqreturn_t megaraid_isr(int, void *, struct pt_regs *);
 static void megaraid_mbox_dpc(unsigned long);
 
 static ssize_t megaraid_sysfs_show_app_hndl(struct class_device *, char *);
-static ssize_t megaraid_sysfs_show_ldnum(struct device *, char *);
+static ssize_t megaraid_sysfs_show_ldnum(struct device *, struct device_attribute *attr, char *);
 
 static int megaraid_cmm_register(adapter_t *);
 static int megaraid_cmm_unregister(adapter_t *);
@@ -202,7 +202,7 @@ MODULE_PARM_DESC(debug_level, "Debug level for driver (default=0)");
  * ### global data ###
  */
 static uint8_t megaraid_mbox_version[8] =
-       { 0x02, 0x20, 0x04, 0x05, 2, 3, 20, 5 };
+       { 0x02, 0x20, 0x04, 0x06, 3, 7, 20, 5 };
 
 
 /*
@@ -229,9 +229,9 @@ static struct pci_device_id pci_id_table_g[] =  {
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_PERC4_QC,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC4_QC,
+               PCI_DEVICE_ID_VERDE,
+               PCI_ANY_ID,
+               PCI_ANY_ID,
        },
        {
                PCI_VENDOR_ID_DELL,
@@ -271,15 +271,9 @@ static struct pci_device_id pci_id_table_g[] =  {
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_PERC4E_DC_320_2E,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC4E_DC_320_2E,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_PERC4E_SC_320_1E,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC4E_SC_320_1E,
+               PCI_DEVICE_ID_DOBSON,
+               PCI_ANY_ID,
+               PCI_ANY_ID,
        },
        {
                PCI_VENDOR_ID_AMI,
@@ -329,36 +323,6 @@ static struct pci_device_id pci_id_table_g[] =  {
                PCI_VENDOR_ID_LSI_LOGIC,
                PCI_SUBSYS_ID_MEGARAID_SCSI_320_2,
        },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_0x,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_0x,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_2x,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_2x,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_4x,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_4x,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_1E,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_1E,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_2E,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_2E,
-       },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
                PCI_DEVICE_ID_MEGARAID_I4_133_RAID,
@@ -379,21 +343,9 @@ static struct pci_device_id pci_id_table_g[] =  {
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SATA_300_4x,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SATA_300_4x,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SATA_300_8x,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SATA_300_8x,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SRCU42X,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SRCU42X,
+               PCI_DEVICE_ID_LINDSAY,
+               PCI_ANY_ID,
+               PCI_ANY_ID,
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
@@ -401,60 +353,12 @@ static struct pci_device_id pci_id_table_g[] =  {
                PCI_VENDOR_ID_INTEL,
                PCI_SUBSYS_ID_INTEL_RAID_SRCS16,
        },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SRCU42E,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SRCU42E,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SRCZCRX,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SRCZCRX,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SRCS28X,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SRCS28X,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SROMBU42E_ALIEF,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SROMBU42E_ALIEF,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SROMBU42E_HARWICH,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SROMBU42E_HARWICH,
-       },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
                PCI_DEVICE_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK,
                PCI_VENDOR_ID_INTEL,
                PCI_SUBSYS_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK,
        },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_FSC_MEGARAID_PCI_EXPRESS_ROMB,
-               PCI_SUBSYS_ID_FSC,
-               PCI_SUBSYS_ID_FSC_MEGARAID_PCI_EXPRESS_ROMB,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_ACER_ROMB_2E,
-               PCI_VENDOR_ID_AI,
-               PCI_SUBSYS_ID_MEGARAID_ACER_ROMB_2E,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_NEC_ROMB_2E,
-               PCI_VENDOR_ID_NEC,
-               PCI_SUBSYS_ID_MEGARAID_NEC_ROMB_2E,
-       },
        {0}     /* Terminating entry */
 };
 MODULE_DEVICE_TABLE(pci, pci_id_table_g);
@@ -539,7 +443,8 @@ megaraid_init(void)
 
 
        // register as a PCI hot-plug driver module
-       if ((rval = pci_module_init(&megaraid_pci_driver_g))) {
+       rval = pci_register_driver(&megaraid_pci_driver_g);
+       if (rval < 0) {
                con_log(CL_ANN, (KERN_WARNING
                        "megaraid: could not register hotplug support.\n"));
        }
@@ -619,7 +524,7 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 
        // Setup the default DMA mask. This would be changed later on
        // depending on hardware capabilities
-       if (pci_set_dma_mask(adapter->pdev, 0xFFFFFFFF) != 0) {
+       if (pci_set_dma_mask(adapter->pdev, DMA_32BIT_MASK) != 0) {
 
                con_log(CL_ANN, (KERN_WARNING
                        "megaraid: pci_set_dma_mask failed:%d\n", __LINE__));
@@ -1031,7 +936,7 @@ megaraid_init_mbox(adapter_t *adapter)
 
        // Set the DMA mask to 64-bit. All supported controllers as capable of
        // DMA in this range
-       if (pci_set_dma_mask(adapter->pdev, 0xFFFFFFFFFFFFFFFFULL) != 0) {
+       if (pci_set_dma_mask(adapter->pdev, DMA_64BIT_MASK) != 0) {
 
                con_log(CL_ANN, (KERN_WARNING
                        "megaraid: could not set DMA mask for 64-bit.\n"));
@@ -2661,7 +2566,7 @@ megaraid_mbox_dpc(unsigned long devp)
  * aborted. All the commands issued to the F/W must complete.
  **/
 static int
-megaraid_abort_handler(struct scsi_cmnd *scp)
+__megaraid_abort_handler(struct scsi_cmnd *scp)
 {
        adapter_t               *adapter;
        mraid_device_t          *raid_dev;
@@ -2794,6 +2699,21 @@ megaraid_abort_handler(struct scsi_cmnd *scp)
        return FAILED;
 }
 
+static int
+megaraid_abort_handler(struct scsi_cmnd *scp)
+{
+       adapter_t       *adapter;
+       int rc;
+
+       adapter         = SCP2ADAPTER(scp);
+
+       spin_lock_irq(adapter->host_lock);
+       rc = __megaraid_abort_handler(scp);
+       spin_unlock_irq(adapter->host_lock);
+
+       return rc;
+}
+
 
 /**
  * megaraid_reset_handler - device reset hadler for mailbox based driver
@@ -2806,7 +2726,7 @@ megaraid_abort_handler(struct scsi_cmnd *scp)
  * host
  **/
 static int
-megaraid_reset_handler(struct scsi_cmnd *scp)
+__megaraid_reset_handler(struct scsi_cmnd *scp)
 {
        adapter_t       *adapter;
        scb_t           *scb;
@@ -2927,6 +2847,18 @@ megaraid_reset_handler(struct scsi_cmnd *scp)
        return rval;
 }
 
+static int
+megaraid_reset_handler(struct scsi_cmnd *cmd)
+{
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = __megaraid_reset_handler(cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
+}
+
 
 /*
  * START: internal commands library
@@ -4213,7 +4145,7 @@ megaraid_sysfs_show_app_hndl(struct class_device *cdev, char *buf)
  * @param buf  : buffer to send data to
  */
 static ssize_t
-megaraid_sysfs_show_ldnum(struct device *dev, char *buf)
+megaraid_sysfs_show_ldnum(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct scsi_device *sdev = to_scsi_device(dev);
        adapter_t       *adapter = (adapter_t *)SCSIHOST2ADAP(sdev->host);
index 07510009d110da5f01357f152026349bc7dbc377..644b91bdb0282cfd0269c569fc3bdeaa04719d2f 100644 (file)
@@ -21,8 +21,8 @@
 #include "megaraid_ioctl.h"
 
 
-#define MEGARAID_VERSION       "2.20.4.5"
-#define MEGARAID_EXT_VERSION   "(Release Date: Thu Feb 03 12:27:22 EST 2005)"
+#define MEGARAID_VERSION       "2.20.4.6"
+#define MEGARAID_EXT_VERSION   "(Release Date: Mon Mar 07 12:27:22 EST 2005)"
 
 
 /*
@@ -37,8 +37,7 @@
 #define PCI_DEVICE_ID_PERC4_DC                         0x1960
 #define PCI_SUBSYS_ID_PERC4_DC                         0x0518
 
-#define PCI_DEVICE_ID_PERC4_QC                         0x0407
-#define PCI_SUBSYS_ID_PERC4_QC                         0x0531
+#define PCI_DEVICE_ID_VERDE                            0x0407
 
 #define PCI_DEVICE_ID_PERC4_DI_EVERGLADES              0x000F
 #define PCI_SUBSYS_ID_PERC4_DI_EVERGLADES              0x014A
 #define PCI_DEVICE_ID_PERC4E_DI_GUADALUPE              0x0013
 #define PCI_SUBSYS_ID_PERC4E_DI_GUADALUPE              0x0170
 
-#define PCI_DEVICE_ID_PERC4E_DC_320_2E                 0x0408
-#define PCI_SUBSYS_ID_PERC4E_DC_320_2E                 0x0002
-
-#define PCI_DEVICE_ID_PERC4E_SC_320_1E                 0x0408
-#define PCI_SUBSYS_ID_PERC4E_SC_320_1E                 0x0001
+#define PCI_DEVICE_ID_DOBSON                           0x0408
 
 #define PCI_DEVICE_ID_MEGARAID_SCSI_320_0              0x1960
 #define PCI_SUBSYS_ID_MEGARAID_SCSI_320_0              0xA520
 #define PCI_DEVICE_ID_MEGARAID_SCSI_320_2              0x1960
 #define PCI_SUBSYS_ID_MEGARAID_SCSI_320_2              0x0518
 
-#define PCI_DEVICE_ID_MEGARAID_SCSI_320_0x             0x0407
-#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_0x             0x0530
-
-#define PCI_DEVICE_ID_MEGARAID_SCSI_320_2x             0x0407
-#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_2x             0x0532
-
-#define PCI_DEVICE_ID_MEGARAID_SCSI_320_4x             0x0407
-#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_4x             0x0531
-
-#define PCI_DEVICE_ID_MEGARAID_SCSI_320_1E             0x0408
-#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_1E             0x0001
-
-#define PCI_DEVICE_ID_MEGARAID_SCSI_320_2E             0x0408
-#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_2E             0x0002
-
 #define PCI_DEVICE_ID_MEGARAID_I4_133_RAID             0x1960
 #define PCI_SUBSYS_ID_MEGARAID_I4_133_RAID             0x0522
 
 #define PCI_DEVICE_ID_MEGARAID_SATA_150_6              0x1960
 #define PCI_SUBSYS_ID_MEGARAID_SATA_150_6              0x0523
 
-#define PCI_DEVICE_ID_MEGARAID_SATA_300_4x             0x0409
-#define PCI_SUBSYS_ID_MEGARAID_SATA_300_4x             0x3004
-
-#define PCI_DEVICE_ID_MEGARAID_SATA_300_8x             0x0409
-#define PCI_SUBSYS_ID_MEGARAID_SATA_300_8x             0x3008
-
-#define PCI_DEVICE_ID_INTEL_RAID_SRCU42X               0x0407
-#define PCI_SUBSYS_ID_INTEL_RAID_SRCU42X               0x0532
+#define PCI_DEVICE_ID_LINDSAY                          0x0409
 
 #define PCI_DEVICE_ID_INTEL_RAID_SRCS16                        0x1960
 #define PCI_SUBSYS_ID_INTEL_RAID_SRCS16                        0x0523
 
-#define PCI_DEVICE_ID_INTEL_RAID_SRCU42E               0x0408
-#define PCI_SUBSYS_ID_INTEL_RAID_SRCU42E               0x0002
-
-#define PCI_DEVICE_ID_INTEL_RAID_SRCZCRX               0x0407
-#define PCI_SUBSYS_ID_INTEL_RAID_SRCZCRX               0x0530
-
-#define PCI_DEVICE_ID_INTEL_RAID_SRCS28X               0x0409
-#define PCI_SUBSYS_ID_INTEL_RAID_SRCS28X               0x3008
-
-#define PCI_DEVICE_ID_INTEL_RAID_SROMBU42E_ALIEF       0x0408
-#define PCI_SUBSYS_ID_INTEL_RAID_SROMBU42E_ALIEF       0x3431
-
-#define PCI_DEVICE_ID_INTEL_RAID_SROMBU42E_HARWICH     0x0408
-#define PCI_SUBSYS_ID_INTEL_RAID_SROMBU42E_HARWICH     0x3499
-
 #define PCI_DEVICE_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK   0x1960
 #define PCI_SUBSYS_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK   0x0520
 
-#define PCI_DEVICE_ID_FSC_MEGARAID_PCI_EXPRESS_ROMB    0x0408
-#define PCI_SUBSYS_ID_FSC_MEGARAID_PCI_EXPRESS_ROMB    0x1065
-
-#define PCI_DEVICE_ID_MEGARAID_ACER_ROMB_2E            0x0408
-#define PCI_SUBSYS_ID_MEGARAID_ACER_ROMB_2E            0x004D
-
 #define PCI_SUBSYS_ID_PERC3_QC                         0x0471
 #define PCI_SUBSYS_ID_PERC3_DC                         0x0493
 #define PCI_SUBSYS_ID_PERC3_SC                         0x0475
 
-#define PCI_DEVICE_ID_MEGARAID_NEC_ROMB_2E             0x0408
-#define PCI_SUBSYS_ID_MEGARAID_NEC_ROMB_2E             0x8287
-
-#ifndef PCI_SUBSYS_ID_FSC
-#define PCI_SUBSYS_ID_FSC                              0x1734
-#endif
 
 #define MBOX_MAX_SCSI_CMDS     128     // number of cmds reserved for kernel
 #define MBOX_MAX_USER_CMDS     32      // number of cmds for applications
index 9f1b550713ecd12a7c5b5977280c7eff1606a7db..37d110e864c49c9c524e8347118e42050cdd3e49 100644 (file)
  *        2 of the License, or (at your option) any later version.
  *
  * FILE                : megaraid_mm.c
- * Version     : v2.20.2.5 (Jan 21 2005)
+ * Version     : v2.20.2.6 (Mar 7 2005)
  *
  * Common management module
  */
 
 #include "megaraid_mm.h"
-#include <linux/smp_lock.h>
 
 
 // Entry points for char node driver
@@ -61,7 +60,7 @@ EXPORT_SYMBOL(mraid_mm_unregister_adp);
 EXPORT_SYMBOL(mraid_mm_adapter_app_handle);
 
 static int majorno;
-static uint32_t drvr_ver       = 0x02200201;
+static uint32_t drvr_ver       = 0x02200206;
 
 static int adapters_count_g;
 static struct list_head adapters_list_g;
@@ -1231,9 +1230,9 @@ mraid_mm_compat_ioctl(struct file *filep, unsigned int cmd,
                      unsigned long arg)
 {
        int err;
-       lock_kernel();
+
        err = mraid_mm_ioctl(NULL, filep, cmd, arg);
-       unlock_kernel();
+
        return err;
 }
 #endif
index 948a0012ab8cd726df01c26557080515e653cbab..7e36c46e7c4362e543a7ee3bbebfc78123d6ac92 100644 (file)
@@ -29,9 +29,9 @@
 #include "megaraid_ioctl.h"
 
 
-#define LSI_COMMON_MOD_VERSION "2.20.2.5"
+#define LSI_COMMON_MOD_VERSION "2.20.2.6"
 #define LSI_COMMON_MOD_EXT_VERSION     \
-               "(Release Date: Fri Jan 21 00:01:03 EST 2005)"
+               "(Release Date: Mon Mar 7 00:01:03 EST 2005)"
 
 
 #define LSI_DBGLVL                     dbglevel
index f6da46d672f18f063d4a64179b74105445e60e18..b05737ae5eff8f4c368d109f528ec1b684839ef3 100644 (file)
@@ -1715,9 +1715,12 @@ static int mesh_host_reset(struct scsi_cmnd *cmd)
        struct mesh_state *ms = (struct mesh_state *) cmd->device->host->hostdata;
        volatile struct mesh_regs __iomem *mr = ms->mesh;
        volatile struct dbdma_regs __iomem *md = ms->dma;
+       unsigned long flags;
 
        printk(KERN_DEBUG "mesh_host_reset\n");
 
+       spin_lock_irqsave(ms->host->host_lock, flags);
+
        /* Reset the controller & dbdma channel */
        out_le32(&md->control, (RUN|PAUSE|FLUSH|WAKE) << 16);   /* stop dma */
        out_8(&mr->exception, 0xff);    /* clear all exception bits */
@@ -1739,6 +1742,7 @@ static int mesh_host_reset(struct scsi_cmnd *cmd)
        /* Complete pending commands */
        handle_reset(ms);
        
+       spin_unlock_irqrestore(ms->host->host_lock, flags);
        return SUCCESS;
 }
 
index e73b33f293a0aeb6b4ae33affcfc4a8b7546c64c..2fb31ee6d9f52a83ceb4a214ca98e7101a960cc2 100644 (file)
@@ -116,7 +116,14 @@ int mvme147_detect(Scsi_Host_Template *tpnt)
 static int mvme147_bus_reset(Scsi_Cmnd *cmd)
 {
        /* FIXME perform bus-specific reset */
+
+       /* FIXME 2: kill this function, and let midlayer fallback to 
+          the same result, calling wd33c93_host_reset() */
+
+       spin_lock_irq(cmd->device->host->host_lock);
        wd33c93_host_reset(cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
        return SUCCESS;
 }
 
index d28c0d99c3442c79808887672c1f78d26b7bfa94..5159ceea319eb99e34f8bb7fd10527562b179d5b 100644 (file)
@@ -294,7 +294,6 @@ static struct scsi_host_template nsp32_template = {
        .this_id                        = NSP32_HOST_SCSIID,
        .use_clustering                 = DISABLE_CLUSTERING,
        .eh_abort_handler               = nsp32_eh_abort,
-/*     .eh_device_reset_handler        = NULL, */
        .eh_bus_reset_handler           = nsp32_eh_bus_reset,
        .eh_host_reset_handler          = nsp32_eh_host_reset,
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,74))
@@ -2988,6 +2987,8 @@ static int nsp32_eh_bus_reset(struct scsi_cmnd *SCpnt)
        nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata;
        unsigned int   base = SCpnt->device->host->io_port;
 
+       spin_lock_irq(SCpnt->device->host->host_lock);
+
        nsp32_msg(KERN_INFO, "Bus Reset");      
        nsp32_dbg(NSP32_DEBUG_BUSRESET, "SCpnt=0x%x", SCpnt);
 
@@ -2995,6 +2996,7 @@ static int nsp32_eh_bus_reset(struct scsi_cmnd *SCpnt)
        nsp32_do_bus_reset(data);
        nsp32_write2(base, IRQ_CONTROL, 0);
 
+       spin_unlock_irq(SCpnt->device->host->host_lock);
        return SUCCESS; /* SCSI bus reset is succeeded at any time. */
 }
 
@@ -3049,11 +3051,14 @@ static int nsp32_eh_host_reset(struct scsi_cmnd *SCpnt)
        nsp32_msg(KERN_INFO, "Host Reset");     
        nsp32_dbg(NSP32_DEBUG_BUSRESET, "SCpnt=0x%x", SCpnt);
 
+       spin_lock_irq(SCpnt->device->host->host_lock);
+
        nsp32hw_init(data);
        nsp32_write2(base, IRQ_CONTROL, IRQ_CONTROL_ALL_IRQ_MASK);
        nsp32_do_bus_reset(data);
        nsp32_write2(base, IRQ_CONTROL, 0);
 
+       spin_unlock_irq(SCpnt->device->host->host_lock);
        return SUCCESS; /* Host reset is succeeded at any time. */
 }
 
index c585c7bef247c4cf7f5e051c6cf1898c3c996672..89a4a0615c22d67d6099527443347ec3f21f5026 100644 (file)
@@ -5608,13 +5608,13 @@ static ssize_t osst_filemark_cnt_show(struct class_device *class_dev, char *buf)
 
 CLASS_DEVICE_ATTR(file_count, S_IRUGO, osst_filemark_cnt_show, NULL);
 
-static struct class_simple * osst_sysfs_class;
+static struct class *osst_sysfs_class;
 
 static int osst_sysfs_valid = 0;
 
 static void osst_sysfs_init(void)
 {
-       osst_sysfs_class = class_simple_create(THIS_MODULE, "onstream_tape");
+       osst_sysfs_class = class_create(THIS_MODULE, "onstream_tape");
        if ( IS_ERR(osst_sysfs_class) )
                printk(KERN_WARNING "osst :W: Unable to register sysfs class\n");
        else
@@ -5627,7 +5627,7 @@ static void osst_sysfs_add(dev_t dev, struct device *device, struct osst_tape *
 
        if (!osst_sysfs_valid) return;
 
-       osst_class_member = class_simple_device_add(osst_sysfs_class, dev, device, "%s", name);
+       osst_class_member = class_device_create(osst_sysfs_class, dev, device, "%s", name);
        if (IS_ERR(osst_class_member)) {
                printk(KERN_WARNING "osst :W: Unable to add sysfs class member %s\n", name);
                return;
@@ -5645,13 +5645,13 @@ static void osst_sysfs_destroy(dev_t dev)
 {
        if (!osst_sysfs_valid) return; 
 
-       class_simple_device_remove(dev);
+       class_device_destroy(osst_sysfs_class, dev);
 }
 
 static void osst_sysfs_cleanup(void)
 {
        if (osst_sysfs_valid) {
-               class_simple_destroy(osst_sysfs_class);
+               class_destroy(osst_sysfs_class);
                osst_sysfs_valid = 0;
        }
 }
index 7976947c03225670d6c511b315c43b6eb1e401fd..363e0ebd4a390753de9de4e599c6d26c19dda3b4 100644 (file)
@@ -621,8 +621,6 @@ static Scsi_Host_Template driver_template = {
        .queuecommand   = pas16_queue_command,
        .eh_abort_handler = pas16_abort,
        .eh_bus_reset_handler = pas16_bus_reset,
-       .eh_device_reset_handler = pas16_device_reset,
-       .eh_host_reset_handler = pas16_host_reset,
        .bios_param     = pas16_biosparam, 
        .can_queue      = CAN_QUEUE,
        .this_id        = 7,
index 58d4d67aed241bd954bf49971b84c1f938b18cbb..65ce1cc40d9a362723fdedf139763ee4e0b9a720 100644 (file)
@@ -120,8 +120,6 @@ static int pas16_biosparam(struct scsi_device *, struct block_device *,
 static int pas16_detect(Scsi_Host_Template *);
 static int pas16_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 static int pas16_bus_reset(Scsi_Cmnd *);
-static int pas16_host_reset(Scsi_Cmnd *);
-static int pas16_device_reset(Scsi_Cmnd *);
 
 #ifndef CMD_PER_LUN
 #define CMD_PER_LUN 2
@@ -164,9 +162,7 @@ static int pas16_device_reset(Scsi_Cmnd *);
 #define do_NCR5380_intr do_pas16_intr
 #define NCR5380_queue_command pas16_queue_command
 #define NCR5380_abort pas16_abort
-#define NCR5380_device_reset pas16_device_reset
 #define NCR5380_bus_reset pas16_bus_reset
-#define NCR5380_host_reset pas16_host_reset
 #define NCR5380_proc_info pas16_proc_info
 
 /* 15 14 12 10 7 5 3 
diff --git a/drivers/scsi/pci2000.c b/drivers/scsi/pci2000.c
deleted file mode 100644 (file)
index 377a466..0000000
+++ /dev/null
@@ -1,836 +0,0 @@
-/****************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver for Linux.
- *
- * pci2000.c - Linux Host Driver for PCI-2000 IntelliCache SCSI Adapters
- *
- * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that redistributions of source
- * code retain the above copyright notice and this comment without
- * modification.
- *
- * Technical updates and product information at:
- *  http://www.psidisk.com
- *
- * Please send questions, comments, bug reports to:
- *  tech@psidisk.com Technical Support
- *
- *
- *     Revisions       1.10    Jan-21-1999
- *             - Fixed sign on message to reflect proper controller name.
- *             - Added support for RAID status monitoring and control.
- *
- *  Revisions  1.11    Mar-22-1999
- *             - Fixed control timeout to not lock up the entire system if
- *               controller goes offline completely.
- *
- *     Revisions 1.12          Mar-26-1999
- *             - Fixed spinlock and PCI configuration.
- *
- *     Revisions 1.20          Mar-27-2000
- *             - Added support for dynamic DMA
- *
- ****************************************************************************/
-#define PCI2000_VERSION                "1.20"
-
-#include <linux/blkdev.h>
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/string.h>
-#include <linux/pci.h>
-#include <linux/ioport.h>
-#include <linux/delay.h>
-#include <linux/sched.h>
-#include <linux/proc_fs.h>
-#include <linux/stat.h>
-#include <linux/spinlock.h>
-
-#include <asm/dma.h>
-#include <asm/system.h>
-#include <asm/io.h>
-
-#include "scsi.h"
-#include <scsi/scsi_host.h>
-#include "pci2000.h"
-#include "psi_roy.h"
-
-
-//#define DEBUG 1
-
-#ifdef DEBUG
-#define DEB(x) x
-#define STOP_HERE      {int st;for(st=0;st<100;st++){st=1;}}
-#else
-#define DEB(x)
-#define STOP_HERE
-#endif
-
-typedef struct
-       {
-       unsigned int    address;
-       unsigned int    length;
-       }       SCATGATH, *PSCATGATH;
-
-typedef struct
-       {
-       Scsi_Cmnd               *SCpnt;
-       PSCATGATH                scatGath;
-       dma_addr_t               scatGathDma;
-       UCHAR                   *cdb;
-       dma_addr_t               cdbDma; 
-       UCHAR                    tag;
-       }       DEV2000, *PDEV2000;
-
-typedef struct
-       {
-       ULONG                    basePort;
-       ULONG                    mb0;
-       ULONG                    mb1;
-       ULONG                    mb2;
-       ULONG                    mb3;
-       ULONG                    mb4;
-       ULONG                    cmd;
-       ULONG                    tag;
-       ULONG                    irqOwned;
-       struct pci_dev  *pdev;
-       DEV2000                  dev[MAX_BUS][MAX_UNITS];
-       }       ADAPTER2000, *PADAPTER2000;
-
-#define HOSTDATA(host) ((PADAPTER2000)&host->hostdata)
-#define consistentLen (MAX_BUS * MAX_UNITS * (16 * sizeof (SCATGATH) + MAX_COMMAND_SIZE))
-
-
-static struct  Scsi_Host          *PsiHost[MAXADAPTER] = {NULL,};  // One for each adapter
-static                 int                             NumAdapters = 0;
-/****************************************************************
- *     Name:                   WaitReady       :LOCAL
- *
- *     Description:    Wait for controller ready.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE on not ready.
- *
- ****************************************************************/
-static int WaitReady (PADAPTER2000 padapter)
-       {
-       ULONG   z;
-
-       for ( z = 0;  z < (TIMEOUT_COMMAND * 4);  z++ )
-               {
-               if ( !inb_p (padapter->cmd) )
-                       return FALSE;
-               udelay (250);
-               };                                                              
-       return TRUE;
-       }
-/****************************************************************
- *     Name:                   WaitReadyLong   :LOCAL
- *
- *     Description:    Wait for controller ready.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE on not ready.
- *
- ****************************************************************/
-static int WaitReadyLong (PADAPTER2000 padapter)
-       {
-       ULONG   z;
-
-       for ( z = 0;  z < (5000 * 4);  z++ )
-               {
-               if ( !inb_p (padapter->cmd) )
-                       return FALSE;
-               udelay (250);
-               };                                                              
-       return TRUE;
-       }
-/****************************************************************
- *     Name:   OpDone  :LOCAL
- *
- *     Description:    Clean up operation and issue done to caller.
- *
- *     Parameters:             SCpnt   - Pointer to SCSI command structure.
- *                                     status  - Caller status.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void OpDone (Scsi_Cmnd *SCpnt, ULONG status)
-       {
-       SCpnt->result = status;
-       SCpnt->scsi_done (SCpnt);
-       }
-/****************************************************************
- *     Name:   Command         :LOCAL
- *
- *     Description:    Issue queued command to the PCI-2000.
- *
- *     Parameters:             padapter - Pointer to adapter information structure.
- *                                     cmd              - PCI-2000 command byte.
- *
- *     Returns:                Non-zero command tag if operation is accepted.
- *
- ****************************************************************/
-static UCHAR Command (PADAPTER2000 padapter, UCHAR cmd)
-       {
-       outb_p (cmd, padapter->cmd);
-       if ( WaitReady (padapter) )
-               return 0;
-
-       if ( inw_p (padapter->mb0) )
-               return 0;
-
-       return inb_p (padapter->mb1);
-       }
-/****************************************************************
- *     Name:   BuildSgList             :LOCAL
- *
- *     Description:    Build the scatter gather list for controller.
- *
- *     Parameters:             SCpnt    - Pointer to SCSI command structure.
- *                                     padapter - Pointer to adapter information structure.
- *                                     pdev     - Pointer to adapter device structure.
- *
- *     Returns:                Non-zero in not scatter gather.
- *
- ****************************************************************/
-static int BuildSgList (Scsi_Cmnd *SCpnt, PADAPTER2000 padapter, PDEV2000 pdev)
-       {
-       int                                      z;
-       int                                      zc;
-       struct scatterlist      *sg;
-
-       if ( SCpnt->use_sg )
-               {
-               sg = (struct scatterlist *)SCpnt->request_buffer;
-               zc = pci_map_sg (padapter->pdev, sg, SCpnt->use_sg, SCpnt->sc_data_direction);
-               for ( z = 0;  z < zc;  z++ )
-                       {
-                       pdev->scatGath[z].address = cpu_to_le32 (sg_dma_address (sg));
-                       pdev->scatGath[z].length = cpu_to_le32 (sg_dma_len (sg++));
-                       }
-               outl (pdev->scatGathDma, padapter->mb2);
-               outl ((zc << 24) | SCpnt->request_bufflen, padapter->mb3);
-               return FALSE;
-               }
-       if ( !SCpnt->request_bufflen)
-               {
-               outl (0, padapter->mb2);
-               outl (0, padapter->mb3);
-               return TRUE;
-               }
-       SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev,
-                       SCpnt->request_buffer, SCpnt->request_bufflen,
-                       SCpnt->sc_data_direction);
-       outl (SCpnt->SCp.have_data_in, padapter->mb2);
-       outl (SCpnt->request_bufflen, padapter->mb3);
-       return TRUE;
-       }
-/*********************************************************************
- *     Name:   PsiRaidCmd
- *
- *     Description:    Execute a simple command.
- *
- *     Parameters:             padapter - Pointer to adapter control structure.
- *                                     cmd              - Roy command byte.
- *
- *     Returns:                Return error status.
- *
- ********************************************************************/
-static int PsiRaidCmd (PADAPTER2000 padapter, char cmd)
-       {
-       if ( WaitReady (padapter) )                                             // test for command register ready
-               return DID_TIME_OUT;
-       outb_p (cmd, padapter->cmd);                                    // issue command
-       if ( WaitReadyLong (padapter) )                                 // wait for adapter ready
-               return DID_TIME_OUT;
-       return DID_OK;
-       }
-/****************************************************************
- *     Name:   Irq_Handler     :LOCAL
- *
- *     Description:    Interrupt handler.
- *
- *     Parameters:             irq             - Hardware IRQ number.
- *                                     dev_id  -
- *                                     regs    -
- *
- *     Returns:                TRUE if drive is not ready in time.
- *
- ****************************************************************/
-static irqreturn_t Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
-       {
-       struct Scsi_Host   *shost = NULL;       // Pointer to host data block
-       PADAPTER2000            padapter;               // Pointer to adapter control structure
-       PDEV2000                        pdev;
-       Scsi_Cmnd                  *SCpnt;
-       UCHAR                           tag = 0;
-       UCHAR                           tag0;
-       ULONG                           error;
-       int                                     pun;
-       int                                     bus;
-       int                                     z;
-    unsigned long              flags;
-    int handled = 0;
-
-       DEB(printk ("\npci2000 received interrupt "));
-       for ( z = 0; z < NumAdapters;  z++ )                                                                            // scan for interrupt to process
-               {
-               if ( PsiHost[z]->irq == (UCHAR)(irq & 0xFF) )
-                       {
-                       tag = inb_p (HOSTDATA(PsiHost[z])->tag);
-                       if (  tag )
-                               {
-                               shost = PsiHost[z];
-                               break;
-                               }
-                       }
-               }
-
-       if ( !shost )
-               {
-               DEB (printk ("\npci2000: not my interrupt"));
-               goto out;
-               }
-
-    handled = 1;
-       spin_lock_irqsave(shost->host_lock, flags);
-       padapter = HOSTDATA(shost);
-
-       tag0 = tag & 0x7F;                                                                                                                      // mask off the error bit
-       for ( bus = 0;  bus < MAX_BUS;  bus++ )                                                                         // scan the busses
-       {
-               for ( pun = 0;  pun < MAX_UNITS;  pun++ )                                                               // scan the targets
-               {
-                       pdev = &padapter->dev[bus][pun];
-                       if ( !pdev->tag )
-                       continue;
-                       if ( pdev->tag == tag0 )                                                                                        // is this it?
-                               {
-                               pdev->tag = 0;
-                               SCpnt = pdev->SCpnt;
-                               goto unmapProceed;
-                       }
-                       }
-       }
-
-       outb_p (0xFF, padapter->tag);                                                                                           // clear the op interrupt
-       outb_p (CMD_DONE, padapter->cmd);                                                                                       // complete the op
-       goto irq_return;                                                                                                                        // done, but, with what?
-
-unmapProceed:;
-       if ( !bus )
-               {
-               switch ( SCpnt->cmnd[0] )
-                       {
-                       case SCSIOP_TEST_UNIT_READY:
-                               pci_unmap_single (padapter->pdev, SCpnt->SCp.have_data_in, sizeof (SCpnt->sense_buffer), PCI_DMA_FROMDEVICE);
-                               goto irqProceed;
-                       case SCSIOP_READ_CAPACITY:
-                               pci_unmap_single (padapter->pdev, SCpnt->SCp.have_data_in, 8, PCI_DMA_FROMDEVICE);
-                               goto irqProceed;
-                       case SCSIOP_VERIFY:
-                       case SCSIOP_START_STOP_UNIT:
-                       case SCSIOP_MEDIUM_REMOVAL:
-                               goto irqProceed;
-                       }
-               }
-       if ( SCpnt->SCp.have_data_in )
-               pci_unmap_single (padapter->pdev, SCpnt->SCp.have_data_in, SCpnt->request_bufflen, SCpnt->sc_data_direction);
-       else 
-               {
-               if ( SCpnt->use_sg )
-                       pci_unmap_sg (padapter->pdev, (struct scatterlist *)SCpnt->request_buffer, SCpnt->use_sg, SCpnt->sc_data_direction);
-               }
-
-irqProceed:;
-       if ( tag & ERR08_TAGGED )                                                                                               // is there an error here?
-               {
-               if ( WaitReady (padapter) )
-                       {
-                       OpDone (SCpnt, DID_TIME_OUT << 16);
-                       goto irq_return;
-                       }
-
-               outb_p (tag0, padapter->mb0);                                                                           // get real error code
-               outb_p (CMD_ERROR, padapter->cmd);
-               if ( WaitReady (padapter) )                                                                                     // wait for controller to suck up the op
-                       {
-                       OpDone (SCpnt, DID_TIME_OUT << 16);
-                       goto irq_return;
-                       }
-
-               error = inl (padapter->mb0);                                                                            // get error data
-               outb_p (0xFF, padapter->tag);                                                                           // clear the op interrupt
-               outb_p (CMD_DONE, padapter->cmd);                                                                       // complete the op
-
-               DEB (printk ("status: %lX ", error));
-               if ( error == 0x00020002 )                                                                                      // is this error a check condition?
-                       {
-                       if ( bus )                                                                                                              // are we doint SCSI commands?
-                               {
-                               OpDone (SCpnt, (DID_OK << 16) | 2);
-                               goto irq_return;
-                               }
-                       if ( *SCpnt->cmnd == SCSIOP_TEST_UNIT_READY )
-                               OpDone (SCpnt, (DRIVER_SENSE << 24) | (DID_OK << 16) | 2);      // test caller we have sense data too
-                       else
-                               OpDone (SCpnt, DID_ERROR << 16);
-                       goto irq_return;
-                       }
-               OpDone (SCpnt, DID_ERROR << 16);
-               goto irq_return;
-               }
-
-       outb_p (0xFF, padapter->tag);                                                                                   // clear the op interrupt
-       outb_p (CMD_DONE, padapter->cmd);                                                                               // complete the op
-       OpDone (SCpnt, DID_OK << 16);
-
-irq_return:
-    spin_unlock_irqrestore(shost->host_lock, flags);
-out:
-    return IRQ_RETVAL(handled);
-}
-/****************************************************************
- *     Name:   Pci2000_QueueCommand
- *
- *     Description:    Process a queued command from the SCSI manager.
- *
- *     Parameters:             SCpnt - Pointer to SCSI command structure.
- *                                     done  - Pointer to done function to call.
- *
- *     Returns:                Status code.
- *
- ****************************************************************/
-int Pci2000_QueueCommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
-       {
-       UCHAR              *cdb = (UCHAR *)SCpnt->cmnd;                                 // Pointer to SCSI CDB
-       PADAPTER2000    padapter = HOSTDATA(SCpnt->device->host);                       // Pointer to adapter control structure
-       int                             rc               = -1;                                                          // command return code
-       UCHAR                   bus              = SCpnt->device->channel;
-       UCHAR                   pun              = SCpnt->device->id;
-       UCHAR                   lun              = SCpnt->device->lun;
-       UCHAR                   cmd;
-       PDEV2000                pdev     = &padapter->dev[bus][pun];
-
-       if ( !done )
-               {
-               printk("pci2000_queuecommand: %02X: done can't be NULL\n", *cdb);
-               return 0;
-               }
-
-       SCpnt->scsi_done = done;
-       SCpnt->SCp.have_data_in = 0;
-       pdev->SCpnt = SCpnt;                                                                    // Save this command data
-
-       if ( WaitReady (padapter) )
-               {
-               rc = DID_ERROR;
-               goto finished;
-               }
-
-       outw_p (pun | (lun << 8), padapter->mb0);
-
-       if ( bus )
-               {
-               DEB (if(*cdb) printk ("\nCDB: %X-  %X %X %X %X %X %X %X %X %X %X ", SCpnt->cmd_len, cdb[0], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6], cdb[7], cdb[8], cdb[9]));
-               DEB (if(*cdb) printk ("\ntimeout_per_command: %d, timeout_total: %d, timeout: %d", SCpnt->timeout_per_command,
-                                                         SCpnt->timeout_total, SCpnt->timeout));
-               outl (SCpnt->timeout_per_command, padapter->mb1);
-               outb_p (CMD_SCSI_TIMEOUT, padapter->cmd);
-               if ( WaitReady (padapter) )
-                       {
-                       rc = DID_ERROR;
-                       goto finished;
-                       }
-
-               outw_p (pun | (lun << 8), padapter->mb0);
-               outw_p (SCpnt->cmd_len << 8, padapter->mb0 + 2);
-               memcpy (pdev->cdb, cdb, MAX_COMMAND_SIZE);
-
-               outl (pdev->cdbDma, padapter->mb1);
-               if ( BuildSgList (SCpnt, padapter, pdev) )
-                       cmd = CMD_SCSI_THRU;
-               else
-                       cmd = CMD_SCSI_THRU_SG;
-               if ( (pdev->tag = Command (padapter, cmd)) == 0 )
-                       rc = DID_TIME_OUT;
-               goto finished;
-               }
-       else
-               {
-               if ( lun )
-                       {
-                       rc = DID_BAD_TARGET;
-                       goto finished;
-                       }
-               }
-
-       switch ( *cdb )
-               {
-               case SCSIOP_INQUIRY:                                    // inquiry CDB
-                       if ( cdb[2] == SC_MY_RAID )
-                               {
-                               switch ( cdb[3] ) 
-                                       {
-                                       case MY_SCSI_REBUILD:
-                                               OpDone (SCpnt, PsiRaidCmd (padapter, CMD_RAID_REBUILD) << 16);
-                                               return 0;
-                                       case MY_SCSI_ALARMMUTE:
-                                               OpDone (SCpnt, PsiRaidCmd (padapter, CMD_RAID_MUTE) << 16);
-                                               return 0;
-                                       case MY_SCSI_DEMOFAIL:
-                                               OpDone (SCpnt, PsiRaidCmd (padapter, CMD_RAID_FAIL) << 16);
-                                               return 0;
-                                       default:
-                                               if ( SCpnt->use_sg )
-                                                       {
-                                                       rc = DID_ERROR;
-                                                       goto finished;
-                                                       }
-                                               else
-                                                       {
-                                                       SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, SCpnt->request_buffer, SCpnt->request_bufflen,
-                                                                                                         SCpnt->sc_data_direction);
-                                                       outl (SCpnt->SCp.have_data_in, padapter->mb2);
-                                                       }
-                                               outl (cdb[5], padapter->mb0);
-                                               outl (cdb[3], padapter->mb3);
-                                               cmd = CMD_DASD_RAID_RQ;
-                                               break;
-                                       }
-                               break;
-                               }
-                       
-                       if ( SCpnt->use_sg )
-                               {
-                               SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev,
-                                                                         ((struct scatterlist *)SCpnt->request_buffer)->address,
-                                                                         SCpnt->request_bufflen,
-                                                                         SCpnt->sc_data_direction);
-                               }
-                       else
-                               {
-                               SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, SCpnt->request_buffer,
-                                                                         SCpnt->request_bufflen,
-                                                                         SCpnt->sc_data_direction);
-                               }
-                       outl (SCpnt->SCp.have_data_in, padapter->mb2);
-                       outl (SCpnt->request_bufflen, padapter->mb3);
-                       cmd = CMD_DASD_SCSI_INQ;
-                       break;
-
-               case SCSIOP_TEST_UNIT_READY:                    // test unit ready CDB
-                       SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, SCpnt->sense_buffer, sizeof (SCpnt->sense_buffer), PCI_DMA_FROMDEVICE);
-                       outl (SCpnt->SCp.have_data_in, padapter->mb2);
-                       outl (sizeof (SCpnt->sense_buffer), padapter->mb3);
-                       cmd = CMD_TEST_READY;
-                       break;
-
-               case SCSIOP_READ_CAPACITY:                              // read capacity CDB
-                       if ( SCpnt->use_sg )
-                               {
-                               SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, ((struct scatterlist *)(SCpnt->request_buffer))->address,
-                                                                                 8, PCI_DMA_FROMDEVICE);
-                               }
-                       else
-                               SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, SCpnt->request_buffer, 8, PCI_DMA_FROMDEVICE);
-                       outl (SCpnt->SCp.have_data_in, padapter->mb2);
-                       outl (8, padapter->mb3);
-                       cmd = CMD_DASD_CAP;
-                       break;
-               case SCSIOP_VERIFY:                                             // verify CDB
-                       outw_p ((USHORT)cdb[8] | ((USHORT)cdb[7] << 8), padapter->mb0 + 2);
-                       outl (XSCSI2LONG (&cdb[2]), padapter->mb1);
-                       cmd = CMD_READ_SG;
-                       break;
-               case SCSIOP_READ:                                               // read10 CDB
-                       outw_p ((USHORT)cdb[8] | ((USHORT)cdb[7] << 8), padapter->mb0 + 2);
-                       outl (XSCSI2LONG (&cdb[2]), padapter->mb1);
-                       if ( BuildSgList (SCpnt, padapter, pdev) )
-                               cmd = CMD_READ;
-                       else
-                               cmd = CMD_READ_SG;
-                       break;
-               case SCSIOP_READ6:                                              // read6  CDB
-                       outw_p (cdb[4], padapter->mb0 + 2);
-                       outl ((SCSI2LONG (&cdb[1])) & 0x001FFFFF, padapter->mb1);
-                       if ( BuildSgList (SCpnt, padapter, pdev) )
-                               cmd = CMD_READ;
-                       else
-                               cmd = CMD_READ_SG;
-                       break;
-               case SCSIOP_WRITE:                                              // write10 CDB
-                       outw_p ((USHORT)cdb[8] | ((USHORT)cdb[7] << 8), padapter->mb0 + 2);
-                       outl (XSCSI2LONG (&cdb[2]), padapter->mb1);
-                       if ( BuildSgList (SCpnt, padapter, pdev) )
-                               cmd = CMD_WRITE;
-                       else
-                               cmd = CMD_WRITE_SG;
-                       break;
-               case SCSIOP_WRITE6:                                             // write6  CDB
-                       outw_p (cdb[4], padapter->mb0 + 2);
-                       outl ((SCSI2LONG (&cdb[1])) & 0x001FFFFF, padapter->mb1);
-                       if ( BuildSgList (SCpnt, padapter, pdev) )
-                               cmd = CMD_WRITE;
-                       else
-                               cmd = CMD_WRITE_SG;
-                       break;
-               case SCSIOP_START_STOP_UNIT:
-                       cmd = CMD_EJECT_MEDIA;
-                       break;
-               case SCSIOP_MEDIUM_REMOVAL:
-                       switch ( cdb[4] )
-                               {
-                               case 0:
-                                       cmd = CMD_UNLOCK_DOOR;
-                                       break;
-                               case 1:
-                                       cmd = CMD_LOCK_DOOR;
-                                       break;
-                               default:
-                                       cmd = 0;
-                                       break;
-                               }
-                       if ( cmd )
-                               break;
-               default:
-                       DEB (printk ("pci2000_queuecommand: Unsupported command %02X\n", *cdb));
-                       OpDone (SCpnt, DID_ERROR << 16);
-                       return 0;
-               }
-
-       if ( (pdev->tag = Command (padapter, cmd)) == 0 )
-               rc = DID_TIME_OUT;
-finished:;
-       if ( rc != -1 )
-               OpDone (SCpnt, rc << 16);
-       return 0;
-       }
-/****************************************************************
- *     Name:   Pci2000_Detect
- *
- *     Description:    Detect and initialize our boards.
- *
- *     Parameters:             tpnt - Pointer to SCSI host template structure.
- *
- *     Returns:                Number of adapters installed.
- *
- ****************************************************************/
-int Pci2000_Detect (Scsi_Host_Template *tpnt)
-       {
-       int                                     found = 0;
-       int                                     installed = 0;
-       struct Scsi_Host   *pshost;
-       PADAPTER2000        padapter;
-       int                                     z, zz;
-       int                                     setirq;
-       struct pci_dev     *pdev = NULL;
-       UCHAR                      *consistent;
-       dma_addr_t                      consistentDma;
-
-       while ( (pdev = pci_find_device (VENDOR_PSI, DEVICE_ROY_1, pdev)) != NULL )
-               {
-               if (pci_enable_device(pdev))
-                       continue;
-               pshost = scsi_register (tpnt, sizeof(ADAPTER2000));
-               if(pshost == NULL)
-                       continue;
-               padapter = HOSTDATA(pshost);
-
-               padapter->basePort = pci_resource_start (pdev, 1);
-               DEB (printk ("\nBase Regs = %#04X", padapter->basePort));                       // get the base I/O port address
-               padapter->mb0   = padapter->basePort + RTR_MAILBOX;                                     // get the 32 bit mail boxes
-               padapter->mb1   = padapter->basePort + RTR_MAILBOX + 4;
-               padapter->mb2   = padapter->basePort + RTR_MAILBOX + 8;
-               padapter->mb3   = padapter->basePort + RTR_MAILBOX + 12;
-               padapter->mb4   = padapter->basePort + RTR_MAILBOX + 16;
-               padapter->cmd   = padapter->basePort + RTR_LOCAL_DOORBELL;                      // command register
-               padapter->tag   = padapter->basePort + RTR_PCI_DOORBELL;                        // tag/response register
-               padapter->pdev = pdev;
-
-               if ( WaitReady (padapter) )
-                       goto unregister;
-               outb_p (0x84, padapter->mb0);
-               outb_p (CMD_SPECIFY, padapter->cmd);
-               if ( WaitReady (padapter) )
-                       goto unregister;
-
-               consistent = pci_alloc_consistent (pdev, consistentLen, &consistentDma);
-               if ( !consistent )
-                       {
-                       printk ("Unable to allocate DMA memory for PCI-2000 controller.\n");
-                       goto unregister;
-                       }
-               
-               scsi_set_device(pshost, &pdev->dev);
-               pshost->irq = pdev->irq;
-               setirq = 1;
-               padapter->irqOwned = 0;
-               for ( z = 0;  z < installed;  z++ )                                                                     // scan for shared interrupts
-                       {
-                       if ( PsiHost[z]->irq == pshost->irq )                                                   // if shared then, don't posses
-                               setirq = 0;
-                       }
-               if ( setirq )                                                                                           // if not shared, posses
-                       {
-                       if ( request_irq (pshost->irq, Irq_Handler, SA_SHIRQ, "pci2000", padapter) < 0 )
-                               {
-                               if ( request_irq (pshost->irq, Irq_Handler, SA_INTERRUPT | SA_SHIRQ, "pci2000", padapter) < 0 )
-                                       {
-                                       printk ("Unable to allocate IRQ for PCI-2000 controller.\n");
-                                       pci_free_consistent (pdev, consistentLen, consistent, consistentDma);
-                                       goto unregister;
-                                       }
-                               }
-                       padapter->irqOwned = pshost->irq;                                               // set IRQ as owned
-                       }
-               PsiHost[installed]      = pshost;                                                                               // save SCSI_HOST pointer
-
-               pshost->io_port         = padapter->basePort;
-               pshost->n_io_port       = 0xFF;
-               pshost->unique_id       = padapter->basePort;
-               pshost->max_id          = 16;
-               pshost->max_channel     = 1;
-
-               for ( zz = 0;  zz < MAX_BUS;  zz++ )
-                       for ( z = 0; z < MAX_UNITS;  z++ )
-                               {
-                               padapter->dev[zz][z].tag = 0;
-                               padapter->dev[zz][z].scatGath = (PSCATGATH)consistent;
-                               padapter->dev[zz][z].scatGathDma = consistentDma;
-                               consistent += 16 * sizeof (SCATGATH);
-                               consistentDma += 16 * sizeof (SCATGATH);
-                               padapter->dev[zz][z].cdb = (UCHAR *)consistent;
-                               padapter->dev[zz][z].cdbDma = consistentDma;
-                               consistent += MAX_COMMAND_SIZE;
-                               consistentDma += MAX_COMMAND_SIZE;
-                               }
-                       
-               printk("\nPSI-2000 Intelligent Storage SCSI CONTROLLER: at I/O = %lX  IRQ = %d\n", padapter->basePort, pshost->irq);
-               printk("Version %s, Compiled %s %s\n\n", PCI2000_VERSION,  __DATE__, __TIME__);
-               found++;
-               if ( ++installed < MAXADAPTER )
-                       continue;
-               break;
-unregister:;
-               scsi_unregister (pshost);
-               found++;
-               }
-       NumAdapters = installed;
-       return installed;
-       }
-/****************************************************************
- *     Name:   Pci2000_Abort
- *
- *     Description:    Process the Abort command from the SCSI manager.
- *
- *     Parameters:             SCpnt - Pointer to SCSI command structure.
- *
- *     Returns:                Allways snooze.
- *
- ****************************************************************/
-int Pci2000_Abort (Scsi_Cmnd *SCpnt)
-       {
-       DEB (printk ("pci2000_abort\n"));
-       return SCSI_ABORT_SNOOZE;
-       }
-/****************************************************************
- *     Name:   Pci2000_Reset
- *
- *     Description:    Process the Reset command from the SCSI manager.
- *
- *     Parameters:             SCpnt - Pointer to SCSI command structure.
- *                                     flags - Flags about the reset command
- *
- *     Returns:                No active command at this time, so this means
- *                                     that each time we got some kind of response the
- *                                     last time through.  Tell the mid-level code to
- *                                     request sense information in order to decide what
- *                                     to do next.
- *
- ****************************************************************/
-int Pci2000_Reset (Scsi_Cmnd *SCpnt, unsigned int reset_flags)
-       {
-       return SCSI_RESET_PUNT;
-       }
-/****************************************************************
- *     Name:   Pci2000_Release
- *
- *     Description:    Release resources allocated for a single each adapter.
- *
- *     Parameters:             pshost - Pointer to SCSI command structure.
- *
- *     Returns:                zero.
- *
- ****************************************************************/
-int Pci2000_Release (struct Scsi_Host *pshost)
-       {
-    PADAPTER2000       padapter = HOSTDATA (pshost);
-
-       if ( padapter->irqOwned )
-               free_irq (pshost->irq, padapter);
-       pci_free_consistent (padapter->pdev, consistentLen, padapter->dev[0][0].scatGath, padapter->dev[0][0].scatGathDma);
-       release_region (pshost->io_port, pshost->n_io_port);
-    scsi_unregister(pshost);
-    return 0;
-       }
-
-/****************************************************************
- *     Name:   Pci2000_BiosParam
- *
- *     Description:    Process the biosparam request from the SCSI manager to
- *                                     return C/H/S data.
- *
- *     Parameters:             disk - Pointer to SCSI disk structure.
- *                                     dev      - Major/minor number from kernel.
- *                                     geom - Pointer to integer array to place geometry data.
- *
- *     Returns:                zero.
- *
- ****************************************************************/
-int Pci2000_BiosParam (struct scsi_device *sdev, struct block_device *dev,
-               sector_t capacity, int geom[])
-       {
-       PADAPTER2000        padapter;
-
-       padapter = HOSTDATA(sdev->host);
-
-       if ( WaitReady (padapter) )
-               return 0;
-       outb_p (sdev->id, padapter->mb0);
-       outb_p (CMD_GET_PARMS, padapter->cmd);
-       if ( WaitReady (padapter) )
-               return 0;
-
-       geom[0] = inb_p (padapter->mb2 + 3);
-       geom[1] = inb_p (padapter->mb2 + 2);
-       geom[2] = inw_p (padapter->mb2);
-       return 0;
-       }
-
-
-MODULE_LICENSE("Dual BSD/GPL");
-
-static Scsi_Host_Template driver_template = {
-       .proc_name      = "pci2000",
-       .name           = "PCI-2000 SCSI Intelligent Disk Controller",
-       .detect         = Pci2000_Detect,
-       .release        = Pci2000_Release,
-       .queuecommand   = Pci2000_QueueCommand,
-       .abort          = Pci2000_Abort,
-       .reset          = Pci2000_Reset,
-       .bios_param     = Pci2000_BiosParam,
-       .can_queue      = 16,
-       .this_id        = -1,
-       .sg_tablesize   = 16,
-       .cmd_per_lun    = 1,
-       .use_clustering = DISABLE_CLUSTERING,
-};
-#include "scsi_module.c"
diff --git a/drivers/scsi/pci2220i.c b/drivers/scsi/pci2220i.c
deleted file mode 100644 (file)
index e395e42..0000000
+++ /dev/null
@@ -1,2915 +0,0 @@
-/****************************************************************************
- * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
- *
- * pci2220i.c - Linux Host Driver for PCI-2220I EIDE RAID Adapters
- *
- * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that redistributions of source
- * code retain the above copyright notice and this comment without
- * modification.
- *
- * Technical updates and product information at:
- *  http://www.psidisk.com
- *
- * Please send questions, comments, bug reports to:
- *  tech@psidisk.com Technical Support
- *
- *
- *     Revisions 1.10          Mar-26-1999
- *             - Updated driver for RAID and hot reconstruct support.
- *
- *     Revisions 1.11          Mar-26-1999
- *             - Fixed spinlock and PCI configuration.
- *
- *     Revision 2.00           December-1-1999
- *             - Added code for the PCI-2240I controller
- *             - Added code for ATAPI devices.
- *             - Double buffer for scatter/gather support
- *
- *     Revision 2.10           March-27-2000
- *             - Added support for dynamic DMA
- *
- ****************************************************************************/
-
-#error Convert me to understand page+offset based scatterlists
-
-//#define DEBUG 1
-
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/string.h>
-#include <linux/slab.h>
-#include <linux/pci.h>
-#include <linux/ioport.h>
-#include <linux/delay.h>
-#include <linux/sched.h>
-#include <linux/proc_fs.h>
-#include <linux/stat.h>
-#include <linux/blkdev.h>
-#include <linux/timer.h>
-#include <linux/spinlock.h>
-
-#include <asm/dma.h>
-#include <asm/system.h>
-#include <asm/io.h>
-
-#include "scsi.h"
-#include <scsi/scsi_host.h>
-#include "pci2220i.h"
-#include "psi_dale.h"
-
-
-#define        PCI2220I_VERSION                "2.10"
-#define        READ_CMD                                IDE_CMD_READ_MULTIPLE
-#define        WRITE_CMD                               IDE_CMD_WRITE_MULTIPLE
-#define        MAX_BUS_MASTER_BLOCKS   SECTORSXFER             // This is the maximum we can bus master
-
-#ifdef DEBUG
-#define DEB(x) x
-#define STOP_HERE()    {int st;for(st=0;st<100;st++){st=1;}}
-#else
-#define DEB(x)
-#define STOP_HERE()
-#endif
-
-#define MAXADAPTER 4                                   // Increase this and the sizes of the arrays below, if you need more.
-
-
-typedef struct
-       {
-       UCHAR                   byte6;                          // device select register image
-       UCHAR                   spigot;                         // spigot number
-       UCHAR                   spigots[2];                     // RAID spigots
-       UCHAR                   deviceID[2];            // device ID codes
-       USHORT                  sectors;                        // number of sectors per track
-       USHORT                  heads;                          // number of heads
-       USHORT                  cylinders;                      // number of cylinders for this device
-       USHORT                  spareword;                      // placeholder
-       ULONG                   blocks;                         // number of blocks on device
-       DISK_MIRROR             DiskMirror[2];          // RAID status and control
-       ULONG                   lastsectorlba[2];       // last addressable sector on the drive
-       USHORT                  raid;                           // RAID active flag
-       USHORT                  mirrorRecon;
-       UCHAR                   reconOn;
-       USHORT                  reconCount;
-       USHORT                  reconIsStarting;        // indicate hot reconstruct is starting
-       UCHAR                   cmdDrqInt;                      // flag for command interrupt
-       UCHAR                   packet;                         // command packet size in bytes
-       }       OUR_DEVICE, *POUR_DEVICE;       
-
-typedef struct
-       {
-       USHORT           bigD;                                  // identity is a PCI-2240I if true, otherwise a PCI-2220I
-       USHORT           atapi;                                 // this interface is for ATAPI devices only
-       ULONG            regDmaDesc;                    // address of the DMA discriptor register for direction of transfer
-       ULONG            regDmaCmdStat;                 // Byte #1 of DMA command status register
-       ULONG            regDmaAddrPci;                 // 32 bit register for PCI address of DMA
-       ULONG            regDmaAddrLoc;                 // 32 bit register for local bus address of DMA
-       ULONG            regDmaCount;                   // 32 bit register for DMA transfer count
-       ULONG            regDmaMode;                    // 32 bit register for DMA mode control
-       ULONG            regRemap;                              // 32 bit local space remap
-       ULONG            regDesc;                               // 32 bit local region descriptor
-       ULONG            regRange;                              // 32 bit local range
-       ULONG            regIrqControl;                 // 16 bit Interrupt enable/disable and status
-       ULONG            regScratchPad;                 // scratch pad I/O base address
-       ULONG            regBase;                               // Base I/O register for data space
-       ULONG            regData;                               // data register I/O address
-       ULONG            regError;                              // error register I/O address
-       ULONG            regSectCount;                  // sector count register I/O address
-       ULONG            regLba0;                               // least significant byte of LBA
-       ULONG            regLba8;                               // next least significant byte of LBA
-       ULONG            regLba16;                              // next most significan byte of LBA
-       ULONG            regLba24;                              // head and most 4 significant bits of LBA
-       ULONG            regStatCmd;                    // status on read and command on write register
-       ULONG            regStatSel;                    // board status on read and spigot select on write register
-       ULONG            regFail;                               // fail bits control register
-       ULONG            regAltStat;                    // alternate status and drive control register
-       ULONG            basePort;                              // PLX base I/O port
-       USHORT           timingMode;                    // timing mode currently set for adapter
-       USHORT           timingPIO;                             // TRUE if PIO timing is active
-       struct pci_dev  *pcidev;
-       ULONG            timingAddress;                 // address to use on adapter for current timing mode
-       ULONG            irqOwned;                              // owned IRQ or zero if shared
-       UCHAR            numberOfDrives;                // saved number of drives on this controller
-       UCHAR            failRegister;                  // current inverted data in fail register
-       OUR_DEVICE       device[BIGD_MAXDRIVES];
-       DISK_MIRROR     *raidData[BIGD_MAXDRIVES];
-       ULONG            startSector;
-       USHORT           sectorCount;
-       ULONG            readCount;
-       UCHAR           *currentSgBuffer;
-       ULONG            currentSgCount;
-       USHORT           nextSg;
-       UCHAR            cmd;
-       Scsi_Cmnd       *SCpnt;
-       POUR_DEVICE      pdev;                                  // current device opearating on
-       USHORT           devInReconIndex;
-       USHORT           expectingIRQ;
-       USHORT           reconOn;                               // Hot reconstruct is to be done.
-       USHORT           reconPhase;                    // Hot reconstruct operation is in progress.
-       ULONG            reconSize;
-       USHORT           demoFail;                              // flag for RAID failure demonstration
-       USHORT           survivor;
-       USHORT           failinprog;
-       struct timer_list       reconTimer;     
-       struct timer_list       timer;
-       UCHAR           *kBuffer;
-       dma_addr_t       kBufferDma;
-       UCHAR            reqSense;
-       UCHAR            atapiCdb[16];
-       UCHAR            atapiSpecial;
-       }       ADAPTER2220I, *PADAPTER2220I;
-
-#define HOSTDATA(host) ((PADAPTER2220I)&host->hostdata)
-
-#define        RECON_PHASE_READY               0x01
-#define        RECON_PHASE_COPY                0x02
-#define        RECON_PHASE_UPDATE              0x03
-#define        RECON_PHASE_LAST                0x04
-#define        RECON_PHASE_END                 0x07    
-#define        RECON_PHASE_MARKING             0x80
-#define        RECON_PHASE_FAILOVER    0xFF
-
-static struct  Scsi_Host          *PsiHost[MAXADAPTER] = {NULL,};  // One for each adapter
-static                 int                             NumAdapters = 0;
-static                 int                             Installed = 0;
-static                 SETUP                   DaleSetup;
-static                 DISK_MIRROR             DiskMirror[BIGD_MAXDRIVES];
-static                 ULONG                   ModeArray[] = {DALE_DATA_MODE2, DALE_DATA_MODE3, DALE_DATA_MODE4, DALE_DATA_MODE5};
-static                 ULONG                   ModeArray2[] = {BIGD_DATA_MODE2, BIGD_DATA_MODE3, BIGD_DATA_MODE4, BIGD_DATA_MODE5};
-
-static void ReconTimerExpiry (unsigned long data);
-
-/*******************************************************************************************************
- *     Name:                   Alarm
- *
- *     Description:    Sound the for the given device
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     device   - Device number.
- *     
- *     Returns:                Nothing.
- *
- ******************************************************************************************************/
-static void Alarm (PADAPTER2220I padapter, UCHAR device)
-       {
-       UCHAR   zc;
-
-       if ( padapter->bigD )
-               {
-               zc = device | (FAIL_ANY | FAIL_AUDIBLE);
-               if ( padapter->failRegister & FAIL_ANY ) 
-                       zc |= FAIL_MULTIPLE;
-               
-               padapter->failRegister = zc;
-               outb_p (~zc, padapter->regFail);
-               }
-       else
-               outb_p (0x3C | (1 << device), padapter->regFail);                       // sound alarm and set fail light               
-       }
-/****************************************************************
- *     Name:   MuteAlarm       :LOCAL
- *
- *     Description:    Mute the audible alarm.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static void MuteAlarm (PADAPTER2220I padapter)
-       {
-       UCHAR   old;
-
-       if ( padapter->bigD )
-               {
-               padapter->failRegister &= ~FAIL_AUDIBLE;
-               outb_p (~padapter->failRegister, padapter->regFail);
-               }
-       else
-               {
-               old = (inb_p (padapter->regStatSel) >> 3) | (inb_p (padapter->regStatSel) & 0x83);
-               outb_p (old | 0x40, padapter->regFail);
-               }
-       }
-/****************************************************************
- *     Name:   WaitReady       :LOCAL
- *
- *     Description:    Wait for device ready.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static int WaitReady (PADAPTER2220I padapter)
-       {
-       ULONG   z;
-       UCHAR   status;
-
-       for ( z = 0;  z < (TIMEOUT_READY * 4);  z++ )
-               {
-               status = inb_p (padapter->regStatCmd);
-               if ( (status & (IDE_STATUS_DRDY | IDE_STATUS_BUSY)) == IDE_STATUS_DRDY )
-                       return 0;
-               udelay (250);
-               }
-       return status;
-       }
-/****************************************************************
- *     Name:   WaitReadyReset  :LOCAL
- *
- *     Description:    Wait for device ready.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static int WaitReadyReset (PADAPTER2220I padapter)
-       {
-       ULONG   z;
-       UCHAR   status;
-
-       for ( z = 0;  z < (125 * 16);  z++ )                            // wait up to 1/4 second
-               {
-               status = inb_p (padapter->regStatCmd);
-               if ( (status & (IDE_STATUS_DRDY | IDE_STATUS_BUSY)) == IDE_STATUS_DRDY )
-                       {
-                       DEB (printk ("\nPCI2220I:  Reset took %ld mSec to be ready", z / 8));
-                       return 0;
-                       }
-               udelay (125);
-               }
-       DEB (printk ("\nPCI2220I:  Reset took more than 2 Seconds to come ready, Disk Failure"));
-       return status;
-       }
-/****************************************************************
- *     Name:   WaitDrq :LOCAL
- *
- *     Description:    Wait for device ready for data transfer.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static int WaitDrq (PADAPTER2220I padapter)
-       {
-       ULONG   z;
-       UCHAR   status;
-
-       for ( z = 0;  z < (TIMEOUT_DRQ * 4);  z++ )
-               {
-               status = inb_p (padapter->regStatCmd);
-               if ( status & IDE_STATUS_DRQ )
-                       return 0;
-               udelay (250);
-               }
-       return status;
-       }
-/****************************************************************
- *     Name:   AtapiWaitReady  :LOCAL
- *
- *     Description:    Wait for device busy and DRQ to be cleared.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     msec     - Number of milliseconds to wait.
- *
- *     Returns:                TRUE if drive does not clear busy in time.
- *
- ****************************************************************/
-static int AtapiWaitReady (PADAPTER2220I padapter, int msec)
-       {
-       int z;
-
-       for ( z = 0;  z < (msec * 16);  z++ )
-               {
-               if ( !(inb_p (padapter->regStatCmd) & (IDE_STATUS_BUSY | IDE_STATUS_DRQ)) )
-                       return FALSE;
-               udelay (125);
-               }
-       return TRUE;
-       }
-/****************************************************************
- *     Name:   AtapiWaitDrq    :LOCAL
- *
- *     Description:    Wait for device ready for data transfer.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     msec     - Number of milliseconds to wait.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static int AtapiWaitDrq (PADAPTER2220I padapter, int msec)
-       {
-       ULONG   z;
-
-       for ( z = 0;  z < (msec * 16);  z++ )
-               {
-               if ( inb_p (padapter->regStatCmd) & IDE_STATUS_DRQ )
-                       return 0;
-               udelay (128);
-               }
-       return TRUE;
-       }
-/****************************************************************
- *     Name:   HardReset       :LOCAL
- *
- *     Description:    Wait for device ready for data transfer.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device.
- *                                     spigot   - Spigot number.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static int HardReset (PADAPTER2220I padapter, POUR_DEVICE pdev, UCHAR spigot)
-       {
-       DEB (printk ("\npci2220i:RESET  spigot = %X  devices = %d, %d", spigot, pdev->deviceID[0], pdev->deviceID[1]));
-       mdelay (100);                                                                           // just wait 100 mSec to let drives flush       
-       SelectSpigot (padapter, spigot | SEL_IRQ_OFF);
-       
-       outb_p (0x0E, padapter->regAltStat);                                    // reset the suvivor
-       udelay (100);                                                                                   // wait a little        
-       outb_p (0x08, padapter->regAltStat);                                    // clear the reset
-       udelay (100);
-
-       outb_p (0xA0, padapter->regLba24);                                              // select the master drive
-       if ( WaitReadyReset (padapter) )
-               {
-               DEB (printk ("\npci2220i: master not ready after reset"));
-               return TRUE;
-               }
-       outb_p (0xB0, padapter->regLba24);                                              // try the slave drive
-       if ( (inb_p (padapter->regStatCmd) & (IDE_STATUS_DRDY | IDE_STATUS_BUSY)) == IDE_STATUS_DRDY ) 
-               {
-               DEB (printk ("\nPCI2220I: initializing slave drive on spigot %X", spigot));
-               outb_p (SECTORSXFER, padapter->regSectCount);
-               WriteCommand (padapter, IDE_CMD_SET_MULTIPLE);  
-               if ( WaitReady (padapter) )
-                       {
-                       DEB (printk ("\npci2220i: slave not ready after set multiple"));
-                       return TRUE;
-                       }
-               }
-       
-       outb_p (0xA0, padapter->regLba24);                              // select the drive
-       outb_p (SECTORSXFER, padapter->regSectCount);
-       WriteCommand (padapter, IDE_CMD_SET_MULTIPLE);  
-       if ( WaitReady (padapter) )
-               {
-               DEB (printk ("\npci2220i: master not ready after set multiple"));
-               return TRUE;
-               }
-       return FALSE;
-       }
-/****************************************************************
- *     Name:   AtapiReset      :LOCAL
- *
- *     Description:    Wait for device ready for data transfer.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device.
- *
- *     Returns:                TRUE if drive does not come ready.
- *
- ****************************************************************/
-static int AtapiReset (PADAPTER2220I padapter, POUR_DEVICE pdev)
-       {
-       SelectSpigot (padapter, pdev->spigot);
-       AtapiDevice (padapter, pdev->byte6);
-       AtapiCountLo (padapter, 0);
-       AtapiCountHi (padapter, 0);
-       WriteCommand (padapter, IDE_COMMAND_ATAPI_RESET);
-       udelay (125);
-       if ( AtapiWaitReady (padapter, 1000) )
-               return TRUE;
-       if ( inb_p (padapter->regStatCmd) || (inb_p (padapter->regLba8) != 0x14) || (inb_p (padapter->regLba16) != 0xEB) )
-               return TRUE;
-       return FALSE;
-       }
-/****************************************************************
- *     Name:   WalkScatGath    :LOCAL
- *
- *     Description:    Transfer data to/from scatter/gather buffers.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     datain   - TRUE if data read.
- *                                     length   - Number of bytes to transfer.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void WalkScatGath (PADAPTER2220I padapter, UCHAR datain, ULONG length)
-       {
-       ULONG    count;
-       UCHAR   *buffer = padapter->kBuffer;
-
-       while ( length )
-               {
-               count = ( length > padapter->currentSgCount ) ? padapter->currentSgCount : length; 
-               
-               if ( datain )
-                       memcpy (padapter->currentSgBuffer, buffer, count);
-               else
-                       memcpy (buffer, padapter->currentSgBuffer, count);
-
-               padapter->currentSgCount -= count;
-               if ( !padapter->currentSgCount )
-                       {
-                       if ( padapter->nextSg < padapter->SCpnt->use_sg )
-                               {
-                               padapter->currentSgBuffer = ((struct scatterlist *)padapter->SCpnt->request_buffer)[padapter->nextSg].address;
-                               padapter->currentSgCount = ((struct scatterlist *)padapter->SCpnt->request_buffer)[padapter->nextSg].length;
-                               padapter->nextSg++;
-                               }
-                       }
-               else
-                       padapter->currentSgBuffer += count;
-
-               length -= count;
-               buffer += count;
-               }
-       }
-/****************************************************************
- *     Name:   BusMaster       :LOCAL
- *
- *     Description:    Do a bus master I/O.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     datain   - TRUE if data read.
- *                                     irq              - TRUE if bus master interrupt expected.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void BusMaster (PADAPTER2220I padapter, UCHAR datain, UCHAR irq)
-       {
-       ULONG zl;
-       
-       zl = ( padapter->sectorCount > MAX_BUS_MASTER_BLOCKS ) ? MAX_BUS_MASTER_BLOCKS : padapter->sectorCount;
-       padapter->sectorCount -= zl;
-       zl *= (ULONG)BYTES_PER_SECTOR;
-
-       if ( datain )
-               {
-               padapter->readCount = zl;
-               outb_p (8, padapter->regDmaDesc);                                                       // read operation
-               if ( padapter->bigD )
-                       {
-                       if ( irq && !padapter->sectorCount )
-                               outb_p (0x0C, padapter->regDmaMode);                            // interrupt on
-                       else
-                               outb_p (0x08, padapter->regDmaMode);                            // no interrupt
-                       }
-               else 
-                       {
-                       if ( irq && !padapter->sectorCount )
-                               outb_p (0x05, padapter->regDmaMode);                            // interrupt on
-                       else
-                               outb_p (0x01, padapter->regDmaMode);                            // no interrupt
-                       }
-               }
-       else
-               {
-               outb_p (0x00, padapter->regDmaDesc);                                            // write operation
-               if ( padapter->bigD )
-                       outb_p (0x08, padapter->regDmaMode);                                    // no interrupt                                         
-               else
-                       outb_p (0x01, padapter->regDmaMode);                                    // no interrupt
-               WalkScatGath (padapter, FALSE, zl);     
-               }
-       
-       outl (padapter->timingAddress, padapter->regDmaAddrLoc);
-       outl (padapter->kBufferDma, padapter->regDmaAddrPci);
-       outl (zl, padapter->regDmaCount);
-       outb_p (0x03, padapter->regDmaCmdStat);                                                 // kick the DMA engine in gear
-       }
-/****************************************************************
- *     Name:   AtapiBusMaster  :LOCAL
- *
- *     Description:    Do a bus master I/O.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     datain   - TRUE if data read.
- *                                     length   - Number of bytes to transfer.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void AtapiBusMaster (PADAPTER2220I padapter, UCHAR datain, ULONG length)
-       {
-       outl (padapter->timingAddress, padapter->regDmaAddrLoc);
-       outl (padapter->kBufferDma, padapter->regDmaAddrPci);
-       outl (length, padapter->regDmaCount);
-       if ( datain )
-               {
-               if ( padapter->readCount )
-                               WalkScatGath (padapter, TRUE, padapter->readCount);
-               outb_p (0x08, padapter->regDmaDesc);                                            // read operation
-               outb_p (0x08, padapter->regDmaMode);                                            // no interrupt
-               padapter->readCount = length;
-               }
-       else
-               {
-               outb_p (0x00, padapter->regDmaDesc);                                            // write operation
-               outb_p (0x08, padapter->regDmaMode);                                            // no interrupt                                         
-               if ( !padapter->atapiSpecial )
-                       WalkScatGath (padapter, FALSE, length); 
-               }
-       outb_p (0x03, padapter->regDmaCmdStat);                                                 // kick the DMA engine in gear
-       }
-/****************************************************************
- *     Name:   WriteData       :LOCAL
- *
- *     Description:    Write data to device.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static int WriteData (PADAPTER2220I padapter)
-       {
-       ULONG   zl;
-       
-       if ( !WaitDrq (padapter) )
-               {
-               if ( padapter->timingPIO )
-                       {
-                       zl = (padapter->sectorCount > MAX_BUS_MASTER_BLOCKS) ? MAX_BUS_MASTER_BLOCKS : padapter->sectorCount;
-                       WalkScatGath (padapter, FALSE, zl * BYTES_PER_SECTOR);
-                       outsw (padapter->regData, padapter->kBuffer, zl * (BYTES_PER_SECTOR / 2));
-                       padapter->sectorCount -= zl;
-                       }
-               else
-                       BusMaster (padapter, 0, 0);
-               return 0;
-               }
-       padapter->cmd = 0;                                                                                              // null out the command byte
-       return 1;
-       }
-/****************************************************************
- *     Name:   WriteDataBoth   :LOCAL
- *
- *     Description:    Write data to device.
- *
- *     Parameters:             padapter - Pointer to adapter structure.
- *                                     pdev     - Pointer to device structure
- *
- *     Returns:                Index + 1 of drive not failed or zero for OK.
- *
- ****************************************************************/
-static int WriteDataBoth (PADAPTER2220I padapter, POUR_DEVICE pdev)
-       {
-       ULONG   zl;
-       UCHAR   status0, status1;
-
-       SelectSpigot (padapter, pdev->spigots[0]);
-       status0 = WaitDrq (padapter);
-       if ( !status0 )
-               {
-               SelectSpigot (padapter, pdev->spigots[1]);
-               status1 = WaitDrq (padapter);
-               if ( !status1 )
-                       {
-                       SelectSpigot (padapter, pdev->spigots[0] | pdev->spigots[1] | padapter->bigD);
-                       if ( padapter->timingPIO )
-                               {
-                               zl = (padapter->sectorCount > MAX_BUS_MASTER_BLOCKS) ? MAX_BUS_MASTER_BLOCKS : padapter->sectorCount;
-                               WalkScatGath (padapter, FALSE, zl * BYTES_PER_SECTOR);
-                               outsw (padapter->regData, padapter->kBuffer, zl * (BYTES_PER_SECTOR / 2));
-                               padapter->sectorCount -= zl;
-                               }
-                       else
-                               BusMaster (padapter, 0, 0);
-                       return 0;
-                       }
-               }
-       padapter->cmd = 0;                                                                                              // null out the command byte
-       if ( status0 )
-               return 2;
-       return 1;
-       }
-/****************************************************************
- *     Name:   IdeCmd  :LOCAL
- *
- *     Description:    Process an IDE command.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device.
- *
- *     Returns:                Zero if no error or status register contents on error.
- *
- ****************************************************************/
-static UCHAR IdeCmd (PADAPTER2220I padapter, POUR_DEVICE pdev)
-       {
-       UCHAR   status;
-
-       SelectSpigot (padapter, pdev->spigot | padapter->bigD);                                                 // select the spigot
-       outb_p (pdev->byte6 | ((UCHAR *)(&padapter->startSector))[3], padapter->regLba24);                      // select the drive
-       status = WaitReady (padapter);
-       if ( !status )
-               {
-               outb_p (padapter->sectorCount, padapter->regSectCount);
-               outb_p (((UCHAR *)(&padapter->startSector))[0], padapter->regLba0);
-               outb_p (((UCHAR *)(&padapter->startSector))[1], padapter->regLba8);
-               outb_p (((UCHAR *)(&padapter->startSector))[2], padapter->regLba16);
-               padapter->expectingIRQ = TRUE;
-               WriteCommand (padapter, padapter->cmd);
-               return 0;
-               }
-
-       padapter->cmd = 0;                                                                      // null out the command byte
-       return status;
-       }
-/****************************************************************
- *     Name:   IdeCmdBoth      :LOCAL
- *
- *     Description:    Process an IDE command to both drivers.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device structure
- *
- *     Returns:                Index + 1 of drive not failed or zero for OK.
- *
- ****************************************************************/
-static UCHAR IdeCmdBoth (PADAPTER2220I padapter, POUR_DEVICE pdev)
-       {
-       UCHAR   status0;
-       UCHAR   status1;
-
-       SelectSpigot (padapter, pdev->spigots[0] | pdev->spigots[1]);                                                           // select the spigots
-       outb_p (padapter->pdev->byte6 | ((UCHAR *)(&padapter->startSector))[3], padapter->regLba24);// select the drive
-       SelectSpigot (padapter, pdev->spigots[0]);
-       status0 = WaitReady (padapter);
-       if ( !status0 )
-               {
-               SelectSpigot (padapter, pdev->spigots[1]);
-               status1 = WaitReady (padapter);
-               if ( !status1 )
-                       {
-                       SelectSpigot (padapter, pdev->spigots[0] | pdev->spigots[1] | padapter->bigD);
-                       outb_p (padapter->sectorCount, padapter->regSectCount);
-                       outb_p (((UCHAR *)(&padapter->startSector))[0], padapter->regLba0);
-                       outb_p (((UCHAR *)(&padapter->startSector))[1], padapter->regLba8);
-                       outb_p (((UCHAR *)(&padapter->startSector))[2], padapter->regLba16);
-                       padapter->expectingIRQ = TRUE;
-                       WriteCommand (padapter, padapter->cmd);
-                       return 0;
-                       }
-               }
-       padapter->cmd = 0;                                                                      // null out the command byte
-       if ( status0 )
-               return 2;
-       return 1;
-       }
-/****************************************************************
- *     Name:   OpDone  :LOCAL
- *
- *     Description:    Complete an operatoin done sequence.
- *
- *     Parameters:             padapter - Pointer to host data block.
- *                                     spigot   - Spigot select code.
- *                                     device   - Device byte code.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void OpDone (PADAPTER2220I padapter, ULONG result)
-       {
-       Scsi_Cmnd          *SCpnt = padapter->SCpnt;
-       
-       if ( padapter->reconPhase )
-               {
-               padapter->reconPhase = 0;
-               if ( padapter->SCpnt )
-                       {
-                       Pci2220i_QueueCommand (SCpnt, SCpnt->scsi_done);
-                       }
-               else
-                       {
-                       if ( padapter->reconOn )
-                               {
-                               ReconTimerExpiry ((unsigned long)padapter);
-                               }
-                       }
-               }
-       else
-               {
-               padapter->cmd = 0;
-               padapter->SCpnt = NULL; 
-               padapter->pdev = NULL;
-               SCpnt->result = result;
-               SCpnt->scsi_done (SCpnt);
-               if ( padapter->reconOn && !padapter->reconTimer.data )
-                       {
-                       padapter->reconTimer.expires = jiffies + (HZ / 4);      // start in 1/4 second
-                       padapter->reconTimer.data = (unsigned long)padapter;
-                       add_timer (&padapter->reconTimer);
-                       }
-               }
-       }
-/****************************************************************
- *     Name:   InlineIdentify  :LOCAL
- *
- *     Description:    Do an intline inquiry on a drive.
- *
- *     Parameters:             padapter - Pointer to host data block.
- *                                     spigot   - Spigot select code.
- *                                     device   - Device byte code.
- *
- *     Returns:                Last addressable sector or zero if none.
- *
- ****************************************************************/
-static ULONG InlineIdentify (PADAPTER2220I padapter, UCHAR spigot, UCHAR device)
-       {
-       PIDENTIFY_DATA  pid = (PIDENTIFY_DATA)padapter->kBuffer;
-
-       SelectSpigot (padapter, spigot | SEL_IRQ_OFF);                                  // select the spigot
-       outb_p ((device << 4) | 0xA0, padapter->regLba24);                              // select the drive
-       if ( WaitReady (padapter) )
-               return 0;
-       WriteCommand (padapter, IDE_COMMAND_IDENTIFY);  
-       if ( WaitDrq (padapter) )
-               return 0;
-       insw (padapter->regData, padapter->kBuffer, sizeof (IDENTIFY_DATA) >> 1);
-       return (pid->LBATotalSectors - 1);
-       }
-/****************************************************************
- *     Name:   AtapiIdentify   :LOCAL
- *
- *     Description:    Do an intline inquiry on a drive.
- *
- *     Parameters:             padapter - Pointer to host data block.
- *                                     pdev     - Pointer to device table.
- *
- *     Returns:                TRUE on error.
- *
- ****************************************************************/
-static ULONG AtapiIdentify (PADAPTER2220I padapter, POUR_DEVICE pdev)
-       {
-       ATAPI_GENERAL_0         ag0;
-       USHORT                          zs;
-       int                                     z;
-
-       AtapiDevice (padapter, pdev->byte6);    
-       WriteCommand (padapter, IDE_COMMAND_ATAPI_IDENTIFY);    
-       if ( AtapiWaitDrq (padapter, 3000) )
-               return TRUE;
-
-       *(USHORT *)&ag0 = inw_p (padapter->regData);
-       for ( z = 0;  z < 255;  z++ )
-               zs = inw_p (padapter->regData);
-
-       if ( ag0.ProtocolType == 2 )
-               {
-               if ( ag0.CmdDrqType == 1 )
-                       pdev->cmdDrqInt = TRUE;
-               switch ( ag0.CmdPacketSize )
-                       {
-                       case 0:
-                               pdev->packet = 6;
-                               break;
-                       case 1:
-                               pdev->packet = 8;
-                               break;
-                       default:
-                               pdev->packet = 6;
-                               break;
-                       }
-               return FALSE;
-               }
-       return TRUE;
-       }
-/****************************************************************
- *     Name:   Atapi2Scsi
- *
- *     Description:    Convert ATAPI data to SCSI data.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     SCpnt    - Pointer to SCSI command structure.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-void Atapi2Scsi (PADAPTER2220I padapter, Scsi_Cmnd *SCpnt)
-       {
-       UCHAR   *buff = padapter->currentSgBuffer;
-       switch ( SCpnt->cmnd[0] )
-               {
-               case SCSIOP_MODE_SENSE:
-                       buff[0] = padapter->kBuffer[1];
-                       buff[1] = padapter->kBuffer[2];
-                       buff[2] = padapter->kBuffer[3];
-                       buff[3] = padapter->kBuffer[7];
-                       memcpy (&buff[4], &padapter->kBuffer[8], padapter->atapiCdb[8] - 8);
-                       break;
-               case SCSIOP_INQUIRY:
-                       padapter->kBuffer[2] = 2;
-                       memcpy (buff, padapter->kBuffer, padapter->currentSgCount);
-                       break;          
-               default:
-                       if ( padapter->readCount )
-                               WalkScatGath (padapter, TRUE, padapter->readCount);
-                       break;
-               }
-       }
-/****************************************************************
- *     Name:   Scsi2Atapi
- *
- *     Description:    Convert SCSI packet command to Atapi packet command.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     SCpnt    - Pointer to SCSI command structure.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void Scsi2Atapi (PADAPTER2220I padapter, Scsi_Cmnd *SCpnt)
-       {
-       UCHAR   *cdb = SCpnt->cmnd;
-       UCHAR   *buff = padapter->currentSgBuffer;
-
-       switch (cdb[0]) 
-               {
-               case SCSIOP_READ6:
-            padapter->atapiCdb[0] = SCSIOP_READ;
-                       padapter->atapiCdb[1] = cdb[1] & 0xE0;
-            padapter->atapiCdb[3] = cdb[1] & 0x1F;
-                       padapter->atapiCdb[4] = cdb[2];
-                       padapter->atapiCdb[5] = cdb[3];
-                       padapter->atapiCdb[8] = cdb[4];
-                       padapter->atapiCdb[9] = cdb[5];
-                       break;
-               case SCSIOP_WRITE6:
-            padapter->atapiCdb[0] = SCSIOP_WRITE;
-                       padapter->atapiCdb[1] = cdb[1] & 0xE0;
-            padapter->atapiCdb[3] = cdb[1] & 0x1F;
-                       padapter->atapiCdb[4] = cdb[2];
-                       padapter->atapiCdb[5] = cdb[3];
-                       padapter->atapiCdb[8] = cdb[4];
-                       padapter->atapiCdb[9] = cdb[5];
-                       break;
-        case SCSIOP_MODE_SENSE: 
-            padapter->atapiCdb[0] = SCSIOP_MODE_SENSE10;
-                       padapter->atapiCdb[2] = cdb[2];
-                       padapter->atapiCdb[8] = cdb[4] + 4;
-            break;
-
-        case SCSIOP_MODE_SELECT: 
-                       padapter->atapiSpecial = TRUE;
-                       padapter->atapiCdb[0] = SCSIOP_MODE_SELECT10;
-                       padapter->atapiCdb[1] = cdb[1] | 0x10;
-                       memcpy (padapter->kBuffer, buff, 4);
-                       padapter->kBuffer[4] = padapter->kBuffer[5] = 0;
-                       padapter->kBuffer[6] = padapter->kBuffer[7] = 0;
-                       memcpy (&padapter->kBuffer[8], &buff[4], cdb[4] - 4);
-                       padapter->atapiCdb[8] = cdb[4] + 4;
-                       break;
-           }
-       }
-/****************************************************************
- *     Name:   AtapiSendCdb
- *
- *     Description:    Send the CDB packet to the device.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device.
- *                                     cdb              - Pointer to 16 byte SCSI cdb.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void AtapiSendCdb (PADAPTER2220I padapter, POUR_DEVICE pdev, CHAR *cdb)
-       {
-       DEB (printk ("\nPCI2242I: CDB: %X %X %X %X %X %X %X %X %X %X %X %X", cdb[0], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6], cdb[7], cdb[8], cdb[9], cdb[10], cdb[11]));
-       outsw (padapter->regData, cdb, pdev->packet);
-       }
-/****************************************************************
- *     Name:   AtapiRequestSense
- *
- *     Description:    Send the CDB packet to the device.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device.
- *                                     SCpnt    - Pointer to SCSI command structure.
- *                                     pass     - If true then this is the second pass to send cdb.
- *
- *     Returns:                TRUE on error.
- *
- ****************************************************************/
-static int AtapiRequestSense (PADAPTER2220I padapter, POUR_DEVICE pdev, Scsi_Cmnd *SCpnt, UCHAR pass)
-       {
-       UCHAR   cdb[16] = {SCSIOP_REQUEST_SENSE,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0};                
-       
-       DEB (printk ("\nPCI2242I: AUTO REQUEST SENSE"));
-       cdb[4] = (UCHAR)(sizeof (SCpnt->sense_buffer));
-       if ( !pass )
-               {
-               padapter->reqSense = TRUE;
-               AtapiCountLo (padapter, cdb[4]);                                                
-               AtapiCountHi (padapter, 0);                                             
-               outb_p (0, padapter->regError);                                         
-               WriteCommand (padapter, IDE_COMMAND_ATAPI_PACKET);
-               if ( pdev->cmdDrqInt )
-                       return FALSE;
-
-               if ( AtapiWaitDrq (padapter, 500) )
-                       return TRUE;
-               }
-       AtapiSendCdb (padapter, pdev, cdb);     
-       return FALSE;
-       }
-/****************************************************************
- *     Name:   InlineReadSignature     :LOCAL
- *
- *     Description:    Do an inline read RAID sigature.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device.
- *                                     index    - index of data to read.
- *
- *     Returns:                Zero if no error or status register contents on error.
- *
- ****************************************************************/
-static UCHAR InlineReadSignature (PADAPTER2220I padapter, POUR_DEVICE pdev, int index)
-       {
-       UCHAR   status;
-       ULONG   zl = pdev->lastsectorlba[index];
-
-       SelectSpigot (padapter, pdev->spigots[index] | SEL_IRQ_OFF);    // select the spigot without interrupts
-       outb_p (pdev->byte6 | ((UCHAR *)&zl)[3], padapter->regLba24);           
-       status = WaitReady (padapter);
-       if ( !status )
-               {
-               outb_p (((UCHAR *)&zl)[2], padapter->regLba16);
-               outb_p (((UCHAR *)&zl)[1], padapter->regLba8); 
-               outb_p (((UCHAR *)&zl)[0], padapter->regLba0);
-               outb_p (1, padapter->regSectCount);
-               WriteCommand (padapter, IDE_COMMAND_READ);
-               status = WaitDrq (padapter);
-               if ( !status )
-                       {
-                       insw (padapter->regData, padapter->kBuffer, BYTES_PER_SECTOR / 2);
-                       ((ULONG *)(&pdev->DiskMirror[index]))[0] = ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[0];
-                       ((ULONG *)(&pdev->DiskMirror[index]))[1] = ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[1];
-                       // some drives assert DRQ before IRQ so let's make sure we clear the IRQ
-                       WaitReady (padapter);
-                       return 0;                       
-                       }
-               }
-       return status;
-       }
-/****************************************************************
- *     Name:   DecodeError     :LOCAL
- *
- *     Description:    Decode and process device errors.
- *
- *     Parameters:             padapter - Pointer to adapter data.
- *                                     status - Status register code.
- *
- *     Returns:                The driver status code.
- *
- ****************************************************************/
-static ULONG DecodeError (PADAPTER2220I        padapter, UCHAR status)
-       {
-       UCHAR                   error;
-
-       padapter->expectingIRQ = 0;
-       if ( status & IDE_STATUS_WRITE_FAULT )
-               {
-               return DID_PARITY << 16;
-               }
-       if ( status & IDE_STATUS_BUSY )
-               return DID_BUS_BUSY << 16;
-
-       error = inb_p (padapter->regError);
-       DEB(printk ("\npci2220i error register: %x", error));
-       switch ( error )
-               {
-               case IDE_ERROR_AMNF:
-               case IDE_ERROR_TKONF:
-               case IDE_ERROR_ABRT:
-               case IDE_ERROR_IDFN:
-               case IDE_ERROR_UNC:
-               case IDE_ERROR_BBK:
-               default:
-                       return DID_ERROR << 16;
-               }
-       return DID_ERROR << 16;
-       }
-/****************************************************************
- *     Name:   StartTimer      :LOCAL
- *
- *     Description:    Start the timer.
- *
- *     Parameters:             ipadapter - Pointer adapter data structure.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void StartTimer (PADAPTER2220I padapter)
-       {
-       padapter->timer.expires = jiffies + TIMEOUT_DATA;
-       add_timer (&padapter->timer);
-       }
-/****************************************************************
- *     Name:   WriteSignature  :LOCAL
- *
- *     Description:    Start the timer.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to our device.
- *                                     spigot   - Selected spigot.
- *                                     index    - index of mirror signature on device.
- *
- *     Returns:                TRUE on any error.
- *
- ****************************************************************/
-static int WriteSignature (PADAPTER2220I padapter, POUR_DEVICE pdev, UCHAR spigot, int index)
-       {
-       ULONG   zl;
-
-       SelectSpigot (padapter, spigot);
-       zl = pdev->lastsectorlba[index];
-       outb_p (pdev->byte6 | ((UCHAR *)&zl)[3], padapter->regLba24);           
-       outb_p (((UCHAR *)&zl)[2], padapter->regLba16);
-       outb_p (((UCHAR *)&zl)[1], padapter->regLba8);
-       outb_p (((UCHAR *)&zl)[0], padapter->regLba0);
-       outb_p (1, padapter->regSectCount);
-
-       WriteCommand (padapter, IDE_COMMAND_WRITE);     
-       if ( WaitDrq (padapter) )
-               return TRUE;
-       StartTimer (padapter);  
-       padapter->expectingIRQ = TRUE;
-       
-       ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[0] = ((ULONG *)(&pdev->DiskMirror[index]))[0];
-       ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[1] = ((ULONG *)(&pdev->DiskMirror[index]))[1];
-       outsw (padapter->regData, padapter->kBuffer, BYTES_PER_SECTOR / 2);
-       return FALSE;
-       }
-/*******************************************************************************************************
- *     Name:                   InitFailover
- *
- *     Description:    This is the beginning of the failover routine
- *
- *     Parameters:             SCpnt    - Pointer to SCSI command structure.
- *                                     padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to our device.
- *     
- *     Returns:                TRUE on error.
- *
- ******************************************************************************************************/
-static int InitFailover (PADAPTER2220I padapter, POUR_DEVICE pdev)
-       {
-       UCHAR   spigot;
-       
-       DEB (printk ("\npci2220i:  Initialize failover process - survivor = %d", pdev->deviceID[padapter->survivor]));
-       pdev->raid = FALSE;                                                                     //initializes system for non raid mode
-       pdev->reconOn = FALSE;
-       spigot = pdev->spigots[padapter->survivor];     
-
-       if ( pdev->DiskMirror[padapter->survivor].status & UCBF_REBUILD )
-               {
-               DEB (printk ("\n         failed, is survivor"));
-               return (TRUE); 
-               }
-
-       if ( HardReset (padapter, pdev, spigot) )
-               {
-               DEB (printk ("\n         failed, reset"));
-               return TRUE;
-               }
-
-       Alarm (padapter, pdev->deviceID[padapter->survivor ^ 1]);
-       pdev->DiskMirror[padapter->survivor].status = UCBF_MIRRORED | UCBF_SURVIVOR;    //clear present status
-       
-       if ( WriteSignature (padapter, pdev, spigot, padapter->survivor) )
-               {
-               DEB (printk ("\n         failed, write signature"));
-               return TRUE;
-               }
-       padapter->failinprog = TRUE;
-       return FALSE;
-       }
-/****************************************************************
- *     Name:   TimerExpiry     :LOCAL
- *
- *     Description:    Timer expiry routine.
- *
- *     Parameters:             data - Pointer adapter data structure.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void TimerExpiry (unsigned long data)
-       {
-       PADAPTER2220I   padapter = (PADAPTER2220I)data;
-       struct Scsi_Host *host = padapter->SCpnt->device->host;
-       POUR_DEVICE             pdev = padapter->pdev;
-       UCHAR                   status = IDE_STATUS_BUSY;
-       UCHAR                   temp, temp1;
-    unsigned long              flags;
-
-    /*
-     * Disable interrupts, if they aren't already disabled and acquire
-     * the I/O spinlock.
-     */
-    spin_lock_irqsave (host->host_lock, flags);
-       DEB (printk ("\nPCI2220I: Timeout expired "));
-
-       if ( padapter->failinprog )
-               {
-               DEB (printk ("in failover process"));
-               OpDone (padapter, DecodeError (padapter, inb_p (padapter->regStatCmd)));
-               goto timerExpiryDone;
-               }
-       
-       while ( padapter->reconPhase )
-               {
-               DEB (printk ("in recon phase %X", padapter->reconPhase));
-               switch ( padapter->reconPhase )
-                       {
-                       case RECON_PHASE_MARKING:
-                       case RECON_PHASE_LAST:
-                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 1 : 0;
-                               DEB (printk ("\npci2220i: FAILURE 1"));
-                               if ( InitFailover (padapter, pdev) )
-                                       OpDone (padapter, DID_ERROR << 16);
-                               goto timerExpiryDone;
-                       
-                       case RECON_PHASE_READY:
-                               OpDone (padapter, DID_ERROR << 16);
-                               goto timerExpiryDone;
-
-                       case RECON_PHASE_COPY:
-                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                               DEB (printk ("\npci2220i: FAILURE 2"));
-                               DEB (printk ("\n       spig/stat = %X", inb_p (padapter->regStatSel));
-                               if ( InitFailover (padapter, pdev) )
-                                       OpDone (padapter, DID_ERROR << 16);
-                               goto timerExpiryDone;
-
-                       case RECON_PHASE_UPDATE:
-                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                               DEB (printk ("\npci2220i: FAILURE 3")));
-                               if ( InitFailover (padapter, pdev) )
-                                       OpDone (padapter, DID_ERROR << 16);
-                               goto timerExpiryDone;
-
-                       case RECON_PHASE_END:
-                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                               DEB (printk ("\npci2220i: FAILURE 4"));
-                               if ( InitFailover (padapter, pdev) )
-                                       OpDone (padapter, DID_ERROR << 16);
-                               goto timerExpiryDone;
-                       
-                       default:
-                               goto timerExpiryDone;
-                       }
-               }
-       
-       while ( padapter->cmd )
-               {
-               outb_p (0x08, padapter->regDmaCmdStat);                                 // cancel interrupt from DMA engine
-               if ( pdev->raid )
-                       {
-                       if ( padapter->cmd == WRITE_CMD )
-                               {
-                               DEB (printk ("in RAID write operation"));
-                               temp = ( pdev->spigot & (SEL_1 | SEL_2) ) ? SEL_1 : SEL_3;
-                               if ( inb_p (padapter->regStatSel) & temp )
-                                       {
-                                       DEB (printk ("\npci2220i: Determined A OK"));
-                                       SelectSpigot (padapter, temp | SEL_IRQ_OFF); // Masking the interrupt during spigot select
-                                       temp = inb_p (padapter->regStatCmd);
-                                       }
-                               else
-                                       temp = IDE_STATUS_BUSY;
-
-                               temp1 = ( pdev->spigot & (SEL_1 | SEL_2) ) ? SEL_2 : SEL_4;
-                               if ( inb (padapter->regStatSel) & temp1 )
-                                       {
-                                       DEB (printk ("\npci2220i: Determined B OK"));
-                                       SelectSpigot (padapter, temp1 | SEL_IRQ_OFF); // Masking the interrupt during spigot select
-                                       temp1 = inb_p (padapter->regStatCmd);
-                                       }
-                               else
-                                       temp1 = IDE_STATUS_BUSY;
-                       
-                               if ( (temp & IDE_STATUS_BUSY) || (temp1 & IDE_STATUS_BUSY) )
-                                       {
-                                       DEB (printk ("\npci2220i: Status A: %X   B: %X", temp & 0xFF, temp1 & 0xFF));
-                                       if ( (temp & IDE_STATUS_BUSY) && (temp1 & IDE_STATUS_BUSY) ) 
-                                               {
-                                               status = temp;
-                                               break;
-                                               }               
-                                       else    
-                                               {
-                                               if ( temp & IDE_STATUS_BUSY )
-                                                       padapter->survivor = 1;
-                                               else
-                                                       padapter->survivor = 0;
-                                               if ( InitFailover (padapter, pdev) )
-                                                       {
-                                                       status = inb_p (padapter->regStatCmd);
-                                                       break;
-                                                       }
-                                               goto timerExpiryDone;
-                                               }
-                                       }
-                               }
-                       else
-                               {
-                               DEB (printk ("in RAID read operation"));
-                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                               DEB (printk ("\npci2220i: FAILURE 6"));
-                               if ( InitFailover (padapter, pdev) )
-                                       {
-                                       status = inb_p (padapter->regStatCmd);
-                                       break;
-                                       }
-                               goto timerExpiryDone;
-                               }
-                       }
-               else
-                       {
-                       DEB (printk ("in I/O operation"));
-                       status = inb_p (padapter->regStatCmd);
-                       }
-               break;
-               }
-       
-       OpDone (padapter, DecodeError (padapter, status));
-
-timerExpiryDone:;
-    /*
-     * Release the I/O spinlock and restore the original flags
-     * which will enable interrupts if and only if they were
-     * enabled on entry.
-     */
-    spin_unlock_irqrestore (host->host_lock, flags);
-       }
-/****************************************************************
- *     Name:                   SetReconstruct  :LOCAL
- *
- *     Description:    Set the reconstruct up.
- *
- *     Parameters:             pdev    - Pointer to device structure.
- *                                     index   - Mirror index number.
- *
- *     Returns:                Number of sectors on new disk required.
- *
- ****************************************************************/
-static LONG SetReconstruct (POUR_DEVICE pdev, int index)
-       {
-       pdev->DiskMirror[index].status = UCBF_MIRRORED;                                                 // setup the flags
-       pdev->DiskMirror[index ^ 1].status = UCBF_MIRRORED | UCBF_REBUILD;
-       pdev->DiskMirror[index ^ 1].reconstructPoint = 0;                                               // start the reconstruct
-       pdev->reconCount = 1990;                                                                                                // mark target drive early
-       return pdev->DiskMirror[index].reconstructPoint;
-       }
-/****************************************************************
- *     Name:   ReconTimerExpiry        :LOCAL
- *
- *     Description:    Reconstruct timer expiry routine.
- *
- *     Parameters:             data - Pointer adapter data structure.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void ReconTimerExpiry (unsigned long data)
-       {
-       PADAPTER2220I   padapter = (PADAPTER2220I)data;
-       struct Scsi_Host *host = padapter->SCpnt->device->host;
-       POUR_DEVICE             pdev;
-       ULONG                   testsize = 0;
-       PIDENTIFY_DATA  pid;
-       USHORT                  minmode;
-       ULONG                   zl;
-       UCHAR                   zc;
-       USHORT                  z;
-    unsigned long      flags;
-
-    /*
-     * Disable interrupts, if they aren't already disabled and acquire
-     * the I/O spinlock.
-     */
-    spin_lock_irqsave(host->host_lock, flags);
-
-       if ( padapter->SCpnt )
-               goto reconTimerExpiry;
-
-       padapter->reconTimer.data = 0;
-       for ( z = padapter->devInReconIndex + 1;  z < BIGD_MAXDRIVES;  z++ )
-               {
-               if ( padapter->device[z].reconOn )
-                       break;
-               }
-       if ( z < BIGD_MAXDRIVES )
-               pdev = &padapter->device[z];
-       else
-               {
-               for ( z = 0;  z < BIGD_MAXDRIVES;  z++ )
-                       {
-                       if ( padapter->device[z].reconOn )
-                               break;
-                       }
-               if ( z < BIGD_MAXDRIVES )
-                       pdev = &padapter->device[z];
-               else
-                       {
-                       padapter->reconOn = FALSE;
-                       goto reconTimerExpiry;
-                       }
-               }
-
-       padapter->devInReconIndex = z;
-       pid = (PIDENTIFY_DATA)padapter->kBuffer;
-       padapter->pdev = pdev;
-       if ( pdev->reconIsStarting )
-               {
-               pdev->reconIsStarting = FALSE;
-               pdev->reconOn = FALSE;
-
-               while ( (pdev->DiskMirror[0].signature == SIGNATURE) && (pdev->DiskMirror[1].signature == SIGNATURE) &&
-                        (pdev->DiskMirror[0].pairIdentifier == (pdev->DiskMirror[1].pairIdentifier ^ 1)) )
-                       {
-                       if ( (pdev->DiskMirror[0].status & UCBF_MATCHED) && (pdev->DiskMirror[1].status & UCBF_MATCHED) )
-                               break;
-
-                       if ( pdev->DiskMirror[0].status & UCBF_SURVIVOR )                               // is first drive survivor?
-                               testsize = SetReconstruct (pdev, 0);
-                       else
-                               if ( pdev->DiskMirror[1].status & UCBF_SURVIVOR )                       // is second drive survivor?
-                                       testsize = SetReconstruct (pdev, 1);
-
-                       if ( (pdev->DiskMirror[0].status & UCBF_REBUILD) || (pdev->DiskMirror[1].status & UCBF_REBUILD) )
-                               {
-                               if ( pdev->DiskMirror[0].status & UCBF_REBUILD )
-                                       pdev->mirrorRecon = 0;
-                               else
-                                       pdev->mirrorRecon = 1;
-                               pdev->reconOn = TRUE;
-                               }
-                       break;
-                       }
-
-               if ( !pdev->reconOn )
-                       goto reconTimerExpiry;
-
-               if ( padapter->bigD )
-                       {
-                       padapter->failRegister = 0;
-                       outb_p (~padapter->failRegister, padapter->regFail);
-                       }
-               else
-                       {
-                       zc = ((inb_p (padapter->regStatSel) >> 3) | inb_p (padapter->regStatSel)) & 0x83;               // mute the alarm
-                       outb_p (0xFF, padapter->regFail);
-                       }
-
-               while ( 1 )
-                       {
-                       DEB (printk ("\npci2220i: hard reset issue"));
-                       if ( HardReset (padapter, pdev, pdev->spigots[pdev->mirrorRecon]) )
-                               {
-                               DEB (printk ("\npci2220i: sub 1"));
-                               break;
-                               }
-
-                       pdev->lastsectorlba[pdev->mirrorRecon] = InlineIdentify (padapter, pdev->spigots[pdev->mirrorRecon], pdev->deviceID[pdev->mirrorRecon] & 1);
-
-                       if ( pdev->lastsectorlba[pdev->mirrorRecon] < testsize )
-                               {
-                               DEB (printk ("\npci2220i: sub 2 %ld %ld", pdev->lastsectorlba[pdev->mirrorRecon], testsize));
-                               break;
-                               }
-
-               // test LBA and multiper sector transfer compatibility
-                       if (!pid->SupportLBA || (pid->NumSectorsPerInt < SECTORSXFER) || !pid->Valid_64_70 )
-                               {
-                               DEB (printk ("\npci2220i: sub 3"));
-                               break;
-                               }
-
-               // test PIO/bus matering mode compatibility
-                       if ( (pid->MinPIOCycleWithoutFlow > 240) && !pid->SupportIORDYDisable && !padapter->timingPIO )
-                               {
-                               DEB (printk ("\npci2220i: sub 4"));
-                               break;
-                               }
-
-                       if ( pid->MinPIOCycleWithoutFlow <= 120 )       // setup timing mode of drive
-                               minmode = 5;
-                       else
-                               {
-                               if ( pid->MinPIOCylceWithFlow <= 150 )
-                                       minmode = 4;
-                               else
-                                       {
-                                       if ( pid->MinPIOCylceWithFlow <= 180 )
-                                               minmode = 3;
-                                       else
-                                               {
-                                               if ( pid->MinPIOCylceWithFlow <= 240 )
-                                                       minmode = 2;
-                                               else
-                                                       {
-                                                       DEB (printk ("\npci2220i: sub 5"));
-                                                       break;
-                                                       }
-                                               }
-                                       }
-                               }
-
-                       if ( padapter->timingMode > minmode )                                                                   // set minimum timing mode
-                               padapter->timingMode = minmode;
-                       if ( padapter->timingMode >= 2 )
-                               padapter->timingAddress = ModeArray[padapter->timingMode - 2];
-                       else
-                               padapter->timingPIO = TRUE;
-
-                       padapter->reconOn = TRUE;
-                       break;
-                       }
-
-               if ( !pdev->reconOn )
-                       {               
-                       padapter->survivor = pdev->mirrorRecon ^ 1;
-                       padapter->reconPhase = RECON_PHASE_FAILOVER;
-                       DEB (printk ("\npci2220i: FAILURE 7"));
-                       InitFailover (padapter, pdev);
-                       goto reconTimerExpiry;
-                       }
-
-               pdev->raid = TRUE;
-       
-               if ( WriteSignature (padapter, pdev, pdev->spigot, pdev->mirrorRecon ^ 1) )
-                       goto reconTimerExpiry;
-               padapter->reconPhase = RECON_PHASE_MARKING;
-               goto reconTimerExpiry;
-               }
-
-       //**********************************
-       // reconstruct copy starts here 
-       //**********************************
-       if ( pdev->reconCount++ > 2000 )
-               {
-               pdev->reconCount = 0;
-               if ( WriteSignature (padapter, pdev, pdev->spigots[pdev->mirrorRecon], pdev->mirrorRecon) )
-                       {
-                       padapter->survivor = pdev->mirrorRecon ^ 1;
-                       padapter->reconPhase = RECON_PHASE_FAILOVER;
-                       DEB (printk ("\npci2220i: FAILURE 8"));
-                       InitFailover (padapter, pdev);
-                       goto reconTimerExpiry;
-                       }
-               padapter->reconPhase = RECON_PHASE_UPDATE;
-               goto reconTimerExpiry;
-               }
-
-       zl = pdev->DiskMirror[pdev->mirrorRecon].reconstructPoint;      
-       padapter->reconSize = pdev->DiskMirror[pdev->mirrorRecon ^ 1].reconstructPoint - zl;
-       if ( padapter->reconSize > MAX_BUS_MASTER_BLOCKS )
-               padapter->reconSize = MAX_BUS_MASTER_BLOCKS;
-
-       if ( padapter->reconSize )
-               {
-               SelectSpigot (padapter, pdev->spigots[0] | pdev->spigots[1]);   // select the spigots
-               outb_p (pdev->byte6 | ((UCHAR *)(&zl))[3], padapter->regLba24); // select the drive
-               SelectSpigot (padapter, pdev->spigot);
-               if ( WaitReady (padapter) )
-                       goto reconTimerExpiry;
-
-               SelectSpigot (padapter, pdev->spigots[pdev->mirrorRecon]);
-               if ( WaitReady (padapter) )
-                       {
-                       padapter->survivor = pdev->mirrorRecon ^ 1;
-                       padapter->reconPhase = RECON_PHASE_FAILOVER;
-                       DEB (printk ("\npci2220i: FAILURE 9"));
-                       InitFailover (padapter, pdev);
-                       goto reconTimerExpiry;
-                       }
-       
-               SelectSpigot (padapter, pdev->spigots[0] | pdev->spigots[1]);
-               outb_p (padapter->reconSize & 0xFF, padapter->regSectCount);
-               outb_p (((UCHAR *)(&zl))[0], padapter->regLba0);
-               outb_p (((UCHAR *)(&zl))[1], padapter->regLba8);
-               outb_p (((UCHAR *)(&zl))[2], padapter->regLba16);
-               padapter->expectingIRQ = TRUE;
-               padapter->reconPhase = RECON_PHASE_READY;
-               SelectSpigot (padapter, pdev->spigots[pdev->mirrorRecon]);
-               WriteCommand (padapter, WRITE_CMD);
-               StartTimer (padapter);
-               SelectSpigot (padapter, pdev->spigot);
-               WriteCommand (padapter, READ_CMD);
-               goto reconTimerExpiry;
-               }
-
-       pdev->DiskMirror[pdev->mirrorRecon].status = UCBF_MIRRORED | UCBF_MATCHED;
-       pdev->DiskMirror[pdev->mirrorRecon ^ 1].status = UCBF_MIRRORED | UCBF_MATCHED;
-       if ( WriteSignature (padapter, pdev, pdev->spigot, pdev->mirrorRecon ^ 1) )
-               goto reconTimerExpiry;
-       padapter->reconPhase = RECON_PHASE_LAST;
-
-reconTimerExpiry:;
-    /*
-     * Release the I/O spinlock and restore the original flags
-     * which will enable interrupts if and only if they were
-     * enabled on entry.
-     */
-    spin_unlock_irqrestore(host->host_lock, flags);
-       }
-/****************************************************************
- *     Name:   Irq_Handler     :LOCAL
- *
- *     Description:    Interrupt handler.
- *
- *     Parameters:             irq             - Hardware IRQ number.
- *                                     dev_id  -
- *                                     regs    -
- *
- *     Returns:                TRUE if drive is not ready in time.
- *
- ****************************************************************/
-static irqreturn_t Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
-       {
-       struct Scsi_Host   *shost = NULL;       // Pointer to host data block
-       PADAPTER2220I           padapter;               // Pointer to adapter control structure
-       POUR_DEVICE                     pdev;
-       Scsi_Cmnd                  *SCpnt;
-       UCHAR                           status;
-       UCHAR                           status1;
-       ATAPI_STATUS            statusa;
-       ATAPI_REASON            reasona;
-       ATAPI_ERROR                     errora;
-       int                                     z;
-       ULONG                           zl;
-    unsigned long              flags;
-    int handled = 0;
-
-//     DEB (printk ("\npci2220i received interrupt\n"));
-
-       for ( z = 0; z < NumAdapters;  z++ )                                                            // scan for interrupt to process
-               {
-               if ( PsiHost[z]->irq == (UCHAR)(irq & 0xFF) )
-                       {
-                       if ( inw_p (HOSTDATA(PsiHost[z])->regIrqControl) & 0x8000 )
-                               {
-                               shost = PsiHost[z];
-                               break;
-                               }
-                       }
-               }
-
-       if ( !shost )
-               {
-               DEB (printk ("\npci2220i: not my interrupt"));
-               goto out;
-               }
-
-       handled = 1;
-       spin_lock_irqsave(shost->host_lock, flags);
-       padapter = HOSTDATA(shost);
-       pdev = padapter->pdev;
-       SCpnt = padapter->SCpnt;
-       outb_p (0x08, padapter->regDmaCmdStat);                                                                 // cancel interrupt from DMA engine
-
-       if ( padapter->atapi && SCpnt )
-               {
-               *(char *)&statusa = inb_p (padapter->regStatCmd);                                               // read the device status
-               *(char *)&reasona = inb_p (padapter->regSectCount);                                             // read the device interrupt reason
-       
-               if ( !statusa.bsy )
-                       {
-                       if ( statusa.drq )                                                                                                      // test for transfer phase
-                               {
-                               if ( !reasona.cod )                                                                                             // test for data phase
-                                       {
-                                       z = (ULONG)inb_p (padapter->regLba8) | (ULONG)(inb_p (padapter->regLba16) << 8);
-                                       if ( padapter->reqSense )
-                                               insw (padapter->regData, SCpnt->sense_buffer, z / 2);
-                                       else
-                                               AtapiBusMaster (padapter, reasona.io, z);
-                                       goto irq_return;
-                                       }
-                               if ( reasona.cod && !reasona.io )                                                               // test for command packet phase
-                                       {
-                                       if ( padapter->reqSense )
-                                               AtapiRequestSense (padapter, pdev, SCpnt, TRUE);
-                                       else
-                                               AtapiSendCdb (padapter, pdev, padapter->atapiCdb);
-                                       goto irq_return;
-                                       }
-                               }
-                       else
-                               {
-                               if ( reasona.io && statusa.drdy )                                                               // test for status phase
-                                       {
-                                       Atapi2Scsi (padapter, SCpnt);
-                                       if ( statusa.check )
-                                               {
-                                               *(UCHAR *)&errora = inb_p (padapter->regError);                 // read the device error
-                                               if ( errora.senseKey )
-                                                       {
-                                                       if ( padapter->reqSense || AtapiRequestSense (padapter, pdev, SCpnt, FALSE) )
-                                                               OpDone (padapter, DID_ERROR << 16);
-                                                       }
-                                               else
-                                                       {
-                                                       if ( errora.ili || errora.abort )
-                                                               OpDone (padapter, DID_ERROR << 16);
-                                                       else
-                                                               OpDone (padapter, DID_OK << 16);        
-                                                       }
-                                               }
-                                       else
-                                               if ( padapter->reqSense )
-                                                       {
-                                                       DEB (printk ("PCI2242I: Sense codes - %X %X %X ", ((UCHAR *)SCpnt->sense_buffer)[0], ((UCHAR *)SCpnt->sense_buffer)[12], ((UCHAR *)SCpnt->sense_buffer)[13]));
-                                                       OpDone (padapter, (DRIVER_SENSE << 24) | (DID_OK << 16) | 2);
-                                                       }
-                                               else
-                                                       OpDone (padapter, DID_OK << 16);        
-                                       }
-                               }
-                       }               
-               goto irq_return;
-               }
-       
-       if ( !padapter->expectingIRQ || !(SCpnt || padapter->reconPhase) )
-               {
-               DEB(printk ("\npci2220i Unsolicited interrupt\n"));
-               STOP_HERE ();
-               goto irq_return;
-               }
-       padapter->expectingIRQ = 0;
-
-       if ( padapter->failinprog )
-               {
-               DEB (printk ("\npci2220i interrupt failover complete"));
-               padapter->failinprog = FALSE;
-               status = inb_p (padapter->regStatCmd);                                                          // read the device status
-               if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                       {
-                       DEB (printk ("\npci2220i: interrupt failover error from drive %X", status));
-                       padapter->cmd = 0;
-                       }
-               else
-                       {
-                       DEB (printk ("\npci2220i: restarting failed opertation."));
-                       pdev->spigot = (padapter->survivor) ? pdev->spigots[1] : pdev->spigots[0];
-                       del_timer (&padapter->timer);
-                       if ( padapter->reconPhase )
-                               OpDone (padapter, DID_OK << 16);
-                       else
-                               Pci2220i_QueueCommand (SCpnt, SCpnt->scsi_done);
-                       goto irq_return;                
-                       }
-               }
-
-       if ( padapter->reconPhase )
-               {
-               switch ( padapter->reconPhase )
-                       {
-                       case RECON_PHASE_MARKING:
-                       case RECON_PHASE_LAST:
-                               status = inb_p (padapter->regStatCmd);                                          // read the device status
-                               del_timer (&padapter->timer);
-                               if ( padapter->reconPhase == RECON_PHASE_LAST )
-                                       {
-                                       if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                                               {
-                                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 1 : 0;
-                                               DEB (printk ("\npci2220i: FAILURE 10"));
-                                               if ( InitFailover (padapter, pdev) )
-                                                       OpDone (padapter, DecodeError (padapter, status));
-                                               goto irq_return;
-                                               }
-                                       if ( WriteSignature (padapter, pdev, pdev->spigots[pdev->mirrorRecon], pdev->mirrorRecon) )
-                                               {
-                                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                                               DEB (printk ("\npci2220i: FAILURE 11"));
-                                               if ( InitFailover (padapter, pdev) )
-                                                       OpDone (padapter, DecodeError (padapter, status));
-                                               goto irq_return;
-                                               }
-                                       padapter->reconPhase = RECON_PHASE_END; 
-                                       goto irq_return;
-                                       }
-                               OpDone (padapter, DID_OK << 16);
-                               goto irq_return;
-
-                       case RECON_PHASE_READY:
-                               status = inb_p (padapter->regStatCmd);                                          // read the device status
-                               if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                                       {
-                                       del_timer (&padapter->timer);
-                                       OpDone (padapter, DecodeError (padapter, status));
-                                       goto irq_return;
-                                       }
-                               SelectSpigot (padapter, pdev->spigots[pdev->mirrorRecon]);
-                               if ( WaitDrq (padapter) )
-                                       {
-                                       del_timer (&padapter->timer);
-                                       padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                                       DEB (printk ("\npci2220i: FAILURE 12"));
-                                       if ( InitFailover (padapter, pdev) )
-                                               OpDone (padapter, DecodeError (padapter, status));
-                                       goto irq_return;
-                                       }
-                               SelectSpigot (padapter, pdev->spigot | SEL_COPY | padapter->bigD);
-                               padapter->reconPhase = RECON_PHASE_COPY;
-                               padapter->expectingIRQ = TRUE;
-                               if ( padapter->timingPIO )
-                                       {
-                                       insw (padapter->regData, padapter->kBuffer, padapter->reconSize * (BYTES_PER_SECTOR / 2));
-                                       }
-                               else
-                                       {
-                                       if ( (padapter->timingMode > 3) )
-                                               {
-                                               if ( padapter->bigD )
-                                                       outl (BIGD_DATA_MODE3, padapter->regDmaAddrLoc);
-                                               else
-                                                       outl (DALE_DATA_MODE3, padapter->regDmaAddrLoc);
-                                               }
-                                       else
-                                               outl (padapter->timingAddress, padapter->regDmaAddrLoc);
-                                       outl (padapter->kBufferDma, padapter->regDmaAddrPci);
-                                       outl (padapter->reconSize * BYTES_PER_SECTOR, padapter->regDmaCount);
-                                       outb_p (8, padapter->regDmaDesc);                                               // read operation
-                                       if ( padapter->bigD )
-                                               outb_p (8, padapter->regDmaMode);                                       // no interrupt
-                                       else
-                                               outb_p (1, padapter->regDmaMode);                                       // no interrupt
-                                       outb_p (0x03, padapter->regDmaCmdStat);                                 // kick the DMA engine in gear
-                                       }
-                               goto irq_return;
-
-                       case RECON_PHASE_COPY:
-                               pdev->DiskMirror[pdev->mirrorRecon].reconstructPoint += padapter->reconSize;
-
-                       case RECON_PHASE_UPDATE:
-                               SelectSpigot (padapter, pdev->spigots[pdev->mirrorRecon] | SEL_IRQ_OFF);
-                               status = inb_p (padapter->regStatCmd);                                          // read the device status
-                               del_timer (&padapter->timer);
-                               if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                                       {
-                                       padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                                       DEB (printk ("\npci2220i: FAILURE 13"));
-                                       DEB (printk ("\n  status register = %X   error = %X", status, inb_p (padapter->regError)));
-                                       if ( InitFailover (padapter, pdev) )
-                                               OpDone (padapter, DecodeError (padapter, status));
-                                       goto irq_return;
-                                       }
-                               OpDone (padapter, DID_OK << 16);
-                               goto irq_return;
-
-                       case RECON_PHASE_END:
-                               status = inb_p (padapter->regStatCmd);                                          // read the device status
-                               del_timer (&padapter->timer);
-                               if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                                       {
-                                       padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                                       DEB (printk ("\npci2220i: FAILURE 14"));
-                                       if ( InitFailover (padapter, pdev) )
-                                               OpDone (padapter, DecodeError (padapter, status));
-                                       goto irq_return;
-                                       }
-                               pdev->reconOn = 0;
-                               if ( padapter->bigD )
-                                       {
-                                       for ( z = 0;  z < padapter->numberOfDrives;  z++ )
-                                               {
-                                               if ( padapter->device[z].DiskMirror[0].status & UCBF_SURVIVOR )
-                                                       {
-                                                       Alarm (padapter, padapter->device[z].deviceID[0] ^ 2);
-                                                       MuteAlarm (padapter);
-                                                       }
-                                               if ( padapter->device[z].DiskMirror[1].status & UCBF_SURVIVOR )
-                                                       {
-                                                       Alarm (padapter, padapter->device[z].deviceID[1] ^ 2);
-                                                       MuteAlarm (padapter);
-                                                       }
-                                               }
-                                       }
-                               OpDone (padapter, DID_OK << 16);
-                               goto irq_return;
-
-                       default:
-                               goto irq_return;
-                       }
-               }
-               
-       switch ( padapter->cmd )                                                                                                // decide how to handle the interrupt
-               {
-               case READ_CMD:
-                       if ( padapter->sectorCount )
-                               {
-                               status = inb_p (padapter->regStatCmd);                                          // read the device status
-                               if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                                       {
-                                       if ( pdev->raid )
-                                               {
-                                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 1 : 0;
-                                               del_timer (&padapter->timer);
-                                               DEB (printk ("\npci2220i: FAILURE 15"));
-                                               if ( !InitFailover (padapter, pdev) )
-                                                       goto irq_return;
-                                               }
-                                       break;  
-                                       }
-                               if ( padapter->timingPIO )
-                                       {
-                                       insw (padapter->regData, padapter->kBuffer, padapter->readCount / 2);
-                                       padapter->sectorCount -= padapter->readCount / BYTES_PER_SECTOR;
-                                       WalkScatGath (padapter, TRUE, padapter->readCount);
-                                       if ( !padapter->sectorCount )
-                                               {
-                                               status = 0;
-                                               break;
-                                               }
-                                       }
-                               else
-                                       {
-                                       if ( padapter->readCount )
-                                               WalkScatGath (padapter, TRUE, padapter->readCount);
-                                       BusMaster (padapter, 1, 1);
-                                       }
-                               padapter->expectingIRQ = TRUE;
-                               goto irq_return;
-                               }
-                       if ( padapter->readCount && !padapter->timingPIO )
-                               WalkScatGath (padapter, TRUE, padapter->readCount);
-                       status = 0;
-                       break;
-
-               case WRITE_CMD:
-                       if ( pdev->raid )
-                               {
-                               SelectSpigot (padapter, pdev->spigots[0] | SEL_IRQ_OFF);                                
-                               status = inb_p (padapter->regStatCmd);                                                          // read the device status
-                               SelectSpigot (padapter, pdev->spigots[1] | SEL_IRQ_OFF);                                
-                               status1 = inb_p (padapter->regStatCmd);                                                         // read the device status
-                               }
-                       else
-                               SelectSpigot (padapter, pdev->spigot | SEL_IRQ_OFF);                            
-                               status = inb_p (padapter->regStatCmd);                                                          // read the device status
-                               status1 = 0;
-               
-                       if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                               {       
-                               if ( pdev->raid && !(status1 & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT)) )
-                                       {
-                                       padapter->survivor = 1;
-                                       del_timer (&padapter->timer);
-                                       SelectSpigot (padapter, pdev->spigot | SEL_IRQ_OFF);
-                                       DEB (printk ("\npci2220i: FAILURE 16  status = %X  error = %X", status, inb_p (padapter->regError)));
-                                       if ( !InitFailover (padapter, pdev) )
-                                               goto irq_return;
-                                       }
-                               break;
-                               }
-                       if ( pdev->raid )
-                               {
-                               if ( status1 & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                                       {       
-                                       padapter->survivor = 0;
-                                       del_timer (&padapter->timer);
-                                       DEB (printk ("\npci2220i: FAILURE 17  status = %X  error = %X", status1, inb_p (padapter->regError)));
-                                       if ( !InitFailover (padapter, pdev) )
-                                               goto irq_return;
-                                       status = status1;
-                                       break;
-                                       }
-                               if ( padapter->sectorCount )
-                                       {
-                                       status = WriteDataBoth (padapter, pdev);
-                                       if ( status )
-                                               {
-                                               padapter->survivor = status >> 1;
-                                               del_timer (&padapter->timer);
-                                               DEB (printk ("\npci2220i: FAILURE 18"));
-                                               if ( !InitFailover (padapter, pdev) )
-                                                       goto irq_return;
-                                               SelectSpigot (padapter, pdev->spigots[status] | SEL_IRQ_OFF);                           
-                                               status = inb_p (padapter->regStatCmd);                                                          // read the device status
-                                               break;
-                                               }
-                                       padapter->expectingIRQ = TRUE;
-                                       goto irq_return;
-                                       }
-                               status = 0;
-                               break;
-                               }
-                       if ( padapter->sectorCount )    
-                               {       
-                               SelectSpigot (padapter, pdev->spigot | padapter->bigD);
-                               status = WriteData (padapter);
-                               if ( status )
-                                       break;
-                               padapter->expectingIRQ = TRUE;
-                               goto irq_return;
-                               }
-                       status = 0;
-                       break;
-
-               case IDE_COMMAND_IDENTIFY:
-                       {
-                       PINQUIRYDATA    pinquiryData  = SCpnt->request_buffer;
-                       PIDENTIFY_DATA  pid = (PIDENTIFY_DATA)padapter->kBuffer;
-
-                       status = inb_p (padapter->regStatCmd);
-                       if ( status & IDE_STATUS_DRQ )
-                               {
-                               insw (padapter->regData, pid, sizeof (IDENTIFY_DATA) >> 1);
-
-                               memset (pinquiryData, 0, SCpnt->request_bufflen);               // Zero INQUIRY data structure.
-                               pinquiryData->DeviceType = 0;
-                               pinquiryData->Versions = 2;
-                               pinquiryData->AdditionalLength = 35 - 4;
-
-                               // Fill in vendor identification fields.
-                               for ( z = 0;  z < 20;  z += 2 )
-                                       {
-                                       pinquiryData->VendorId[z]         = ((UCHAR *)pid->ModelNumber)[z + 1];
-                                       pinquiryData->VendorId[z + 1] = ((UCHAR *)pid->ModelNumber)[z];
-                                       }
-
-                               // Initialize unused portion of product id.
-                               for ( z = 0;  z < 4;  z++ )
-                                       pinquiryData->ProductId[12 + z] = ' ';
-
-                               // Move firmware revision from IDENTIFY data to
-                               // product revision in INQUIRY data.
-                               for ( z = 0;  z < 4;  z += 2 )
-                                       {
-                                       pinquiryData->ProductRevisionLevel[z]    = ((UCHAR *)pid->FirmwareRevision)[z + 1];
-                                       pinquiryData->ProductRevisionLevel[z + 1] = ((UCHAR *)pid->FirmwareRevision)[z];
-                                       }
-                               if ( pdev == padapter->device )
-                                       *((USHORT *)(&pinquiryData->VendorSpecific)) = DEVICE_DALE_1;
-                               
-                               status = 0;
-                               }
-                       break;
-                       }
-
-               default:
-                       status = 0;
-                       break;
-               }
-
-       del_timer (&padapter->timer);
-       if ( status )
-               {
-               DEB (printk ("\npci2220i Interrupt handler return error"));
-               zl = DecodeError (padapter, status);
-               }
-       else
-               zl = DID_OK << 16;
-
-       OpDone (padapter, zl);
-irq_return:
-    spin_unlock_irqrestore(shost->host_lock, flags);
-out:
-       return IRQ_RETVAL(handled);
-}
-
-/****************************************************************
- *     Name:   Pci2220i_QueueCommand
- *
- *     Description:    Process a queued command from the SCSI manager.
- *
- *     Parameters:             SCpnt - Pointer to SCSI command structure.
- *                                     done  - Pointer to done function to call.
- *
- *     Returns:                Status code.
- *
- ****************************************************************/
-int Pci2220i_QueueCommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
-       {
-       UCHAR              *cdb = (UCHAR *)SCpnt->cmnd;                                 // Pointer to SCSI CDB
-       PADAPTER2220I   padapter = HOSTDATA(SCpnt->device->host);                       // Pointer to adapter control structure
-       POUR_DEVICE             pdev     = &padapter->device[SCpnt->device->id];// Pointer to device information
-       UCHAR                   rc;                                                                                     // command return code
-       int                             z; 
-       PDEVICE_RAID1   pdr;
-
-       SCpnt->scsi_done = done;
-       padapter->SCpnt = SCpnt;                                                                        // Save this command data
-       padapter->readCount = 0;
-
-       if ( SCpnt->use_sg )
-               {
-               padapter->currentSgBuffer = ((struct scatterlist *)SCpnt->request_buffer)[0].address;
-               padapter->currentSgCount = ((struct scatterlist *)SCpnt->request_buffer)[0].length;
-               }
-       else
-               {
-               padapter->currentSgBuffer = SCpnt->request_buffer;
-               padapter->currentSgCount = SCpnt->request_bufflen;
-               }
-       padapter->nextSg = 1;
-
-       if ( !done )
-               {
-               printk("pci2220i_queuecommand: %02X: done can't be NULL\n", *cdb);
-               return 0;
-               }
-       
-       if ( padapter->atapi )
-               {
-               UCHAR                   zlo, zhi;
-
-               DEB (printk ("\nPCI2242I: ID %d, LUN %d opcode %X ", SCpnt->device->id, SCpnt->device->lun, *cdb));
-               padapter->pdev = pdev;
-               if ( !pdev->byte6 || SCpnt->device->lun )
-                       {
-                       OpDone (padapter, DID_BAD_TARGET << 16);
-                       return 0;
-                       }
-       
-               padapter->atapiSpecial = FALSE;
-               padapter->reqSense = FALSE;
-               memset (padapter->atapiCdb, 0, 16);
-               SelectSpigot (padapter, pdev->spigot);                                                                  // select the spigot
-               AtapiDevice (padapter, pdev->byte6);                                                                    // select the drive
-               if ( AtapiWaitReady (padapter, 100) )
-                       {
-                       OpDone (padapter, DID_NO_CONNECT << 16);
-                       return 0;
-                       }
-
-               switch ( cdb[0] ) 
-                       {
-                       case SCSIOP_MODE_SENSE:
-                       case SCSIOP_MODE_SELECT:
-                               Scsi2Atapi (padapter, SCpnt);
-                               z = SCpnt->request_bufflen + 4;
-                               break;
-                       case SCSIOP_READ6:
-                       case SCSIOP_WRITE6:
-                               Scsi2Atapi (padapter, SCpnt);
-                               z = SCpnt->request_bufflen;
-                               break;
-                       default:
-                               memcpy (padapter->atapiCdb, cdb, SCpnt->cmd_len);
-                               z = SCpnt->request_bufflen;
-                               break;
-                       }
-               if ( z > ATAPI_TRANSFER )
-                       z = ATAPI_TRANSFER;
-           zlo = (UCHAR)(z & 0xFF);
-           zhi = (UCHAR)(z >> 8);
-
-               AtapiCountLo (padapter, zlo);                                           
-               AtapiCountHi (padapter, zhi);                                           
-               outb_p (0, padapter->regError);                                         
-               WriteCommand (padapter, IDE_COMMAND_ATAPI_PACKET);
-               if ( pdev->cmdDrqInt )
-                       return 0;
-
-               if ( AtapiWaitDrq (padapter, 500) )
-                       {
-                       OpDone (padapter, DID_ERROR << 16);
-                       return 0;
-                       }
-               AtapiSendCdb (padapter, pdev, padapter->atapiCdb);      
-               return 0;
-               }
-       
-       if ( padapter->reconPhase )
-               return 0;
-       if ( padapter->reconTimer.data )
-               {
-               del_timer (&padapter->reconTimer);
-               padapter->reconTimer.data = 0;
-               }
-               
-       if ( (SCpnt->device->id >= padapter->numberOfDrives) || SCpnt->device->lun )
-               {
-               OpDone (padapter, DID_BAD_TARGET << 16);
-               return 0;
-               }
-       
-       switch ( *cdb )
-               {
-               case SCSIOP_INQUIRY:                                    // inquiry CDB
-                       {
-                       if ( cdb[2] == SC_MY_RAID )
-                               {
-                               switch ( cdb[3] ) 
-                                       {
-                                       case MY_SCSI_REBUILD:
-                                               for ( z = 0;  z < padapter->numberOfDrives;  z++ )
-                                                       {
-                                                       pdev = &padapter->device[z];
-                                                       if ( ((pdev->DiskMirror[0].status & UCBF_SURVIVOR) && (pdev->DiskMirror[1].status & UCBF_MIRRORED)) ||
-                                                                ((pdev->DiskMirror[1].status & UCBF_SURVIVOR) && (pdev->DiskMirror[0].status & UCBF_MIRRORED)) )
-                                                               {
-                                                               padapter->reconOn = pdev->reconOn = pdev->reconIsStarting = TRUE;
-                                                               }
-                                                       }
-                                               OpDone (padapter, DID_OK << 16);
-                                               break;
-                                       case MY_SCSI_ALARMMUTE:
-                                               MuteAlarm (padapter);
-                                               OpDone (padapter, DID_OK << 16);
-                                               break;
-                                       case MY_SCSI_DEMOFAIL:
-                                               padapter->demoFail = TRUE;                              
-                                               OpDone (padapter, DID_OK << 16);
-                                               break;
-                                       default:
-                                               z = cdb[5];                             // get index
-                                               pdr = (PDEVICE_RAID1)SCpnt->request_buffer;
-                                               if ( padapter->raidData[z] )
-                                                       {
-                                                       memcpy (&pdr->DiskRaid1, padapter->raidData[z], sizeof (DISK_MIRROR));
-                                                       if ( padapter->raidData[z]->reconstructPoint > padapter->raidData[z ^ 2]->reconstructPoint )
-                                                               pdr->TotalSectors = padapter->raidData[z]->reconstructPoint;
-                                                       else
-                                                               pdr->TotalSectors = padapter->raidData[z ^ 2]->reconstructPoint;
-                                                       }
-                                               else
-                                                       memset (pdr, 0, sizeof (DEVICE_RAID1));
-                                               OpDone (padapter, DID_OK << 16);
-                                               break;
-                                       }       
-                               return 0;
-                               }
-                       padapter->cmd = IDE_COMMAND_IDENTIFY;
-                       break;
-                       }
-
-               case SCSIOP_TEST_UNIT_READY:                    // test unit ready CDB
-                       OpDone (padapter, DID_OK << 16);
-                       return 0;
-               case SCSIOP_READ_CAPACITY:                              // read capctiy CDB
-                       {
-                       PREAD_CAPACITY_DATA     pdata = (PREAD_CAPACITY_DATA)SCpnt->request_buffer;
-
-                       pdata->blksiz = 0x20000;
-                       XANY2SCSI ((UCHAR *)&pdata->blks, pdev->blocks);
-                       OpDone (padapter, DID_OK << 16);
-                       return 0;
-                       }
-               case SCSIOP_VERIFY:                                             // verify CDB
-                       padapter->startSector = XSCSI2LONG (&cdb[2]);
-                       padapter->sectorCount = (UCHAR)((USHORT)cdb[8] | ((USHORT)cdb[7] << 8));
-                       padapter->cmd = IDE_COMMAND_VERIFY;
-                       break;
-               case SCSIOP_READ:                                               // read10 CDB
-                       padapter->startSector = XSCSI2LONG (&cdb[2]);
-                       padapter->sectorCount = (USHORT)cdb[8] | ((USHORT)cdb[7] << 8);
-                       padapter->cmd = READ_CMD;
-                       break;
-               case SCSIOP_READ6:                                              // read6  CDB
-                       padapter->startSector = SCSI2LONG (&cdb[1]);
-                       padapter->sectorCount = cdb[4];
-                       padapter->cmd = READ_CMD;
-                       break;
-               case SCSIOP_WRITE:                                              // write10 CDB
-                       padapter->startSector = XSCSI2LONG (&cdb[2]);
-                       padapter->sectorCount = (USHORT)cdb[8] | ((USHORT)cdb[7] << 8);
-                       padapter->cmd = WRITE_CMD;
-                       break;
-               case SCSIOP_WRITE6:                                             // write6  CDB
-                       padapter->startSector = SCSI2LONG (&cdb[1]);
-                       padapter->sectorCount = cdb[4];
-                       padapter->cmd = WRITE_CMD;
-                       break;
-               default:
-                       DEB (printk ("pci2220i_queuecommand: Unsupported command %02X\n", *cdb));
-                       OpDone (padapter, DID_ERROR << 16);
-                       return 0;
-               }
-
-       if ( padapter->reconPhase )
-               return 0;
-       
-       padapter->pdev = pdev;
-
-       while ( padapter->demoFail )
-               {
-               pdev = padapter->pdev = &padapter->device[0];
-               padapter->demoFail = FALSE;
-               if ( !pdev->raid || 
-                        (pdev->DiskMirror[0].status & UCBF_SURVIVOR) || 
-                        (pdev->DiskMirror[1].status & UCBF_SURVIVOR) )
-                       {
-                       break;
-                       }
-               if ( pdev->DiskMirror[0].status & UCBF_REBUILD )
-                       padapter->survivor = 1;
-               else
-                       padapter->survivor = 0;
-                               DEB (printk ("\npci2220i: FAILURE 19"));
-               if ( InitFailover (padapter, pdev) )
-                       break;
-               return 0;
-               }
-
-       StartTimer (padapter);
-       if ( pdev->raid && (padapter->cmd == WRITE_CMD) )
-               {
-               rc = IdeCmdBoth (padapter, pdev);
-               if ( !rc )
-                       rc = WriteDataBoth (padapter, pdev);
-               if ( rc )
-                       {
-                       del_timer (&padapter->timer);
-                       padapter->expectingIRQ = 0;
-                       padapter->survivor = rc >> 1;
-                               DEB (printk ("\npci2220i: FAILURE 20"));
-                       if ( InitFailover (padapter, pdev) )
-                               {
-                               OpDone (padapter, DID_ERROR << 16);
-                               return 0;
-                               }
-                       }
-               }
-       else
-               {
-               rc = IdeCmd (padapter, pdev);
-               if ( (padapter->cmd == WRITE_CMD) && !rc )
-                       rc = WriteData (padapter);
-               if ( rc )
-                       {
-                       del_timer (&padapter->timer);
-                       padapter->expectingIRQ = 0;
-                       if ( pdev->raid )
-                               {
-                               padapter->survivor = (pdev->spigot ^ 3) >> 1;
-                               DEB (printk ("\npci2220i: FAILURE 21"));
-                               if ( !InitFailover (padapter, pdev) )
-                                       return 0;
-                               }
-                       OpDone (padapter, DID_ERROR << 16);
-                       return 0;
-                       }
-               }
-       return 0;
-       }
-/****************************************************************
- *     Name:                   ReadFlash
- *
- *     Description:    Read information from controller Flash memory.
- *
- *     Parameters:             padapter - Pointer to host interface data structure.
- *                                     pdata    - Pointer to data structures.
- *                                     base     - base address in Flash.
- *                                     length   - lenght of data space in bytes.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static VOID ReadFlash (PADAPTER2220I padapter, VOID *pdata, ULONG base, ULONG length)
-       {
-       ULONG    oldremap;
-       UCHAR    olddesc;
-       ULONG    z;
-       UCHAR   *pd = (UCHAR *)pdata;
-
-       oldremap = inl (padapter->regRemap);                                                    // save values to restore later
-       olddesc  = inb_p (padapter->regDesc);
-
-       outl (base | 1, padapter->regRemap);                                                    // remap to Flash space as specified
-       outb_p (0x40, padapter->regDesc);                                                               // describe remap region as 8 bit
-       for ( z = 0;  z < length;  z++)                                                                 // get "length" data count
-               *pd++ = inb_p (padapter->regBase + z);                                          // read in the data
-
-       outl (oldremap, padapter->regRemap);                                                    // restore remap register values
-       outb_p (olddesc, padapter->regDesc);
-       }
-/****************************************************************
- *     Name:                   GetRegs
- *
- *     Description:    Initialize the regester information.
- *
- *     Parameters:             pshost            - Pointer to SCSI host data structure.
- *                                     bigd              - PCI-2240I identifier
- *                                     pcidev            - Pointer to device data structure.
- *
- *     Returns:                TRUE if failure to install.
- *
- ****************************************************************/
-static USHORT GetRegs (struct Scsi_Host *pshost, BOOL bigd, struct pci_dev *pcidev)
-       {
-       PADAPTER2220I   padapter;
-       int                             setirq;
-       int                             z;
-       USHORT                  zr, zl;
-       UCHAR              *consistent;
-       dma_addr_t              consistentDma;
-
-       padapter = HOSTDATA(pshost);
-       memset (padapter, 0, sizeof (ADAPTER2220I));
-       memset (&DaleSetup, 0, sizeof (DaleSetup));
-       memset (DiskMirror, 0, sizeof (DiskMirror));
-
-       zr = pci_resource_start (pcidev, 1);
-       zl = pci_resource_start (pcidev, 2);
-
-       padapter->basePort = zr;
-       padapter->regRemap              = zr + RTR_LOCAL_REMAP;                                 // 32 bit local space remap
-       padapter->regDesc               = zr + RTR_REGIONS;                                             // 32 bit local region descriptor
-       padapter->regRange              = zr + RTR_LOCAL_RANGE;                                 // 32 bit local range
-       padapter->regIrqControl = zr + RTR_INT_CONTROL_STATUS;                  // 16 bit interrupt control and status
-       padapter->regScratchPad = zr + RTR_MAILBOX;                                             // 16 byte scratchpad I/O base address
-
-       padapter->regBase               = zl;
-       padapter->regData               = zl + REG_DATA;                                                // data register I/O address
-       padapter->regError              = zl + REG_ERROR;                                               // error register I/O address
-       padapter->regSectCount  = zl + REG_SECTOR_COUNT;                                // sector count register I/O address
-       padapter->regLba0               = zl + REG_LBA_0;                                               // least significant byte of LBA
-       padapter->regLba8               = zl + REG_LBA_8;                                               // next least significant byte of LBA
-       padapter->regLba16              = zl + REG_LBA_16;                                              // next most significan byte of LBA
-       padapter->regLba24              = zl + REG_LBA_24;                                              // head and most 4 significant bits of LBA
-       padapter->regStatCmd    = zl + REG_STAT_CMD;                                    // status on read and command on write register
-       padapter->regStatSel    = zl + REG_STAT_SEL;                                    // board status on read and spigot select on write register
-       padapter->regFail               = zl + REG_FAIL;
-       padapter->regAltStat    = zl + REG_ALT_STAT;
-       padapter->pcidev                = pcidev;
-
-       if ( bigd )
-               {
-               padapter->regDmaDesc    = zr + RTR_DMA0_DESC_PTR;                       // address of the DMA discriptor register for direction of transfer
-               padapter->regDmaCmdStat = zr + RTR_DMA_COMMAND_STATUS;          // Byte #0 of DMA command status register
-               padapter->regDmaAddrPci = zr + RTR_DMA0_PCI_ADDR;                       // 32 bit register for PCI address of DMA
-               padapter->regDmaAddrLoc = zr + RTR_DMA0_LOCAL_ADDR;                     // 32 bit register for local bus address of DMA
-               padapter->regDmaCount   = zr + RTR_DMA0_COUNT;                          // 32 bit register for DMA transfer count
-               padapter->regDmaMode    = zr + RTR_DMA0_MODE + 1;                       // 32 bit register for DMA mode control
-               padapter->bigD                  = SEL_NEW_SPEED_1;                                      // set spigot speed control bit
-               }
-       else
-               {
-               padapter->regDmaDesc    = zl + RTL_DMA1_DESC_PTR;                       // address of the DMA discriptor register for direction of transfer
-               padapter->regDmaCmdStat = zl + RTL_DMA_COMMAND_STATUS + 1;      // Byte #1 of DMA command status register
-               padapter->regDmaAddrPci = zl + RTL_DMA1_PCI_ADDR;                       // 32 bit register for PCI address of DMA
-               padapter->regDmaAddrLoc = zl + RTL_DMA1_LOCAL_ADDR;                     // 32 bit register for local bus address of DMA
-               padapter->regDmaCount   = zl + RTL_DMA1_COUNT;                          // 32 bit register for DMA transfer count
-               padapter->regDmaMode    = zl + RTL_DMA1_MODE + 1;                       // 32 bit register for DMA mode control
-               }
-
-       padapter->numberOfDrives = inb_p (padapter->regScratchPad + BIGD_NUM_DRIVES);
-       if ( !bigd && !padapter->numberOfDrives )                                               // if no devices on this board
-               return TRUE;
-
-       pshost->irq = pcidev->irq;
-       setirq = 1;
-       for ( z = 0;  z < Installed;  z++ )                                                             // scan for shared interrupts
-               {
-               if ( PsiHost[z]->irq == pshost->irq )                                           // if shared then, don't posses
-                       setirq = 0;
-               }
-       if ( setirq )                                                                                                   // if not shared, posses
-               {
-               if ( request_irq (pshost->irq, Irq_Handler, SA_SHIRQ, "pci2220i", padapter) < 0 )
-                       {
-                       if ( request_irq (pshost->irq, Irq_Handler, SA_INTERRUPT | SA_SHIRQ, "pci2220i", padapter) < 0 )
-                               {
-                               printk ("Unable to allocate IRQ for PCI-2220I controller.\n");
-                               return TRUE;
-                               }
-                       }
-               padapter->irqOwned = pshost->irq;                                                       // set IRQ as owned
-               }
-
-       if ( padapter->numberOfDrives )
-               consistent = pci_alloc_consistent (pcidev, SECTORSXFER * BYTES_PER_SECTOR, &consistentDma);
-       else
-               consistent = pci_alloc_consistent (pcidev, ATAPI_TRANSFER, &consistentDma);
-       if ( !consistent )
-               {
-               printk ("Unable to allocate DMA buffer for PCI-2220I controller.\n");
-               free_irq (pshost->irq, padapter);
-               return TRUE;
-               }
-       padapter->kBuffer = consistent;
-       padapter->kBufferDma = consistentDma;
-
-       PsiHost[Installed]      = pshost;                                                                       // save SCSI_HOST pointer
-       pshost->io_port         = padapter->basePort;
-       pshost->n_io_port       = 0xFF;
-       pshost->unique_id       = padapter->regBase;
-
-       outb_p (0x01, padapter->regRange);                                                              // fix our range register because other drivers want to tromp on it
-
-       padapter->timingMode = inb_p (padapter->regScratchPad + DALE_TIMING_MODE);
-       if ( padapter->timingMode >= 2 )
-               {
-               if ( bigd )
-                       padapter->timingAddress = ModeArray2[padapter->timingMode - 2];
-               else
-                       padapter->timingAddress = ModeArray[padapter->timingMode - 2];
-               }
-       else
-               padapter->timingPIO = TRUE;
-
-       ReadFlash (padapter, &DaleSetup, DALE_FLASH_SETUP, sizeof (SETUP));
-       ReadFlash (padapter, &DiskMirror, DALE_FLASH_RAID, sizeof (DiskMirror));
-
-       return FALSE;
-       }
-/****************************************************************
- *     Name:                   SetupFinish
- *
- *     Description:    Complete the driver initialization process for a card
- *
- *     Parameters:             padapter  - Pointer to SCSI host data structure.
- *                                     str               - Pointer to board type string.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-VOID SetupFinish (PADAPTER2220I padapter, char *str, int irq)
-       {
-       init_timer (&padapter->timer);
-       padapter->timer.function = TimerExpiry;
-       padapter->timer.data = (unsigned long)padapter;
-       init_timer (&padapter->reconTimer);
-       padapter->reconTimer.function = ReconTimerExpiry;
-       padapter->reconTimer.data = (unsigned long)padapter;
-       printk("\nPCI-%sI EIDE CONTROLLER: at I/O = %lX/%lX  IRQ = %d\n", str, padapter->basePort, padapter->regBase, irq);
-       printk("Version %s, Compiled %s %s\n\n", PCI2220I_VERSION, __DATE__, __TIME__);
-       }       
-/****************************************************************
- *     Name:   Pci2220i_Detect
- *
- *     Description:    Detect and initialize our boards.
- *
- *     Parameters:             tpnt - Pointer to SCSI host template structure.
- *
- *     Returns:                Number of adapters installed.
- *
- ****************************************************************/
-int Pci2220i_Detect (Scsi_Host_Template *tpnt)
-       {
-       struct Scsi_Host   *pshost;
-       PADAPTER2220I       padapter;
-       POUR_DEVICE                     pdev;
-       int                                     unit;
-       int                                     z;
-       USHORT                          raidon;
-       UCHAR                           spigot1, spigot2;
-       UCHAR                           device;
-       struct pci_dev     *pcidev = NULL;
-
-       while ( (pcidev = pci_find_device (VENDOR_PSI, DEVICE_DALE_1, pcidev)) != NULL )
-               {
-               if (pci_enable_device(pcidev))
-                       continue;
-               pshost = scsi_register (tpnt, sizeof(ADAPTER2220I));
-               if(pshost==NULL)
-                       continue;
-                       
-               padapter = HOSTDATA(pshost);
-
-               if ( GetRegs (pshost, FALSE, pcidev) )
-                       goto unregister;
-
-               scsi_set_device(pshost, &pcidev->dev);
-               pshost->max_id = padapter->numberOfDrives;
-               for ( z = 0;  z < padapter->numberOfDrives;  z++ )
-                       {
-                       unit = inb_p (padapter->regScratchPad + DALE_CHANNEL_DEVICE_0 + z) & 0x0F;
-                       pdev = &padapter->device[z];
-                       pdev->byte6             = (UCHAR)(((unit & 1) << 4) | 0xE0);
-                       pdev->spigot    = (UCHAR)(1 << (unit >> 1));
-                       pdev->sectors   = DaleSetup.setupDevice[unit].sectors;
-                       pdev->heads             = DaleSetup.setupDevice[unit].heads;
-                       pdev->cylinders = DaleSetup.setupDevice[unit].cylinders;
-                       pdev->blocks    = DaleSetup.setupDevice[unit].blocks;
-
-                       if ( !z )
-                               {
-                               DiskMirror[0].status = inb_p (padapter->regScratchPad + DALE_RAID_0_STATUS);            
-                               DiskMirror[1].status = inb_p (padapter->regScratchPad + DALE_RAID_1_STATUS);            
-                               if ( (DiskMirror[0].signature == SIGNATURE) && (DiskMirror[1].signature == SIGNATURE) &&
-                                    (DiskMirror[0].pairIdentifier == (DiskMirror[1].pairIdentifier ^ 1)) )
-                                       {                        
-                                       raidon = TRUE;
-                                       if ( unit > (unit ^ 2) )
-                                               unit = unit ^ 2;
-                                       }       
-                               else
-                                       raidon = FALSE;
-
-                               memcpy (pdev->DiskMirror, DiskMirror, sizeof (DiskMirror));
-                               padapter->raidData[0] = &pdev->DiskMirror[0];
-                               padapter->raidData[2] = &pdev->DiskMirror[1];
-                               
-                               spigot1 = spigot2 = FALSE;
-                               pdev->spigots[0] = 1;
-                               pdev->spigots[1] = 2;
-                               pdev->lastsectorlba[0] = InlineIdentify (padapter, 1, 0);
-                               pdev->lastsectorlba[1] = InlineIdentify (padapter, 2, 0);
-                                               
-                               if ( !(pdev->DiskMirror[1].status & UCBF_SURVIVOR) && pdev->lastsectorlba[0] )
-                                       spigot1 = TRUE;
-                               if ( !(pdev->DiskMirror[0].status & UCBF_SURVIVOR) && pdev->lastsectorlba[1] )
-                                       spigot2 = TRUE;
-                               if ( pdev->DiskMirror[0].status & DiskMirror[1].status & UCBF_SURVIVOR )
-                                       spigot1 = TRUE;
-
-                               if ( spigot1 && (pdev->DiskMirror[0].status & UCBF_REBUILD) )
-                                       InlineReadSignature (padapter, pdev, 0);
-                               if ( spigot2 && (pdev->DiskMirror[1].status & UCBF_REBUILD) )
-                                       InlineReadSignature (padapter, pdev, 1);
-
-                               if ( spigot1 && spigot2 && raidon )
-                                       {
-                                       pdev->raid = 1;
-                                       if ( pdev->DiskMirror[0].status & UCBF_REBUILD )
-                                               pdev->spigot = 2;
-                                       else
-                                               pdev->spigot = 1;
-                                       if ( (pdev->DiskMirror[0].status & UCBF_REBUILD) || (pdev->DiskMirror[1].status & UCBF_REBUILD) )
-                                               padapter->reconOn = pdev->reconOn = pdev->reconIsStarting = TRUE;
-                                       }
-                               else
-                                       {
-                                       if ( spigot1 )
-                                               {
-                                               if ( pdev->DiskMirror[0].status & UCBF_REBUILD )
-                                                       goto unregister;
-                                               pdev->DiskMirror[0].status = UCBF_MIRRORED | UCBF_SURVIVOR;
-                                               pdev->spigot = 1;
-                                               }
-                                       else
-                                               {
-                                               if ( pdev->DiskMirror[1].status & UCBF_REBUILD )
-                                                       goto unregister;
-                                               pdev->DiskMirror[1].status = UCBF_MIRRORED | UCBF_SURVIVOR;
-                                               pdev->spigot = 2;
-                                               }
-                                       if ( DaleSetup.rebootRebuild && raidon )
-                                               padapter->reconOn = pdev->reconOn = pdev->reconIsStarting = TRUE;
-                                       }
-                       
-                               if ( raidon )
-                                       break;
-                               }
-                       }
-
-               SetupFinish (padapter, "2220", pshost->irq);
-       
-               if ( ++Installed < MAXADAPTER )
-                       continue;
-               break;
-unregister:;
-               scsi_unregister (pshost);
-               }
-
-       while ( (pcidev = pci_find_device (VENDOR_PSI, DEVICE_BIGD_1, pcidev)) != NULL )
-               {
-               pshost = scsi_register (tpnt, sizeof(ADAPTER2220I));
-               padapter = HOSTDATA(pshost);
-
-               if ( GetRegs (pshost, TRUE, pcidev) )
-                       goto unregister1;
-
-               for ( z = 0;  z < BIGD_MAXDRIVES;  z++ )
-                       DiskMirror[z].status = inb_p (padapter->regScratchPad + BIGD_RAID_0_STATUS + z);                
-
-               scsi_set_pci_device(pshost, pcidev);
-               pshost->max_id = padapter->numberOfDrives;
-               padapter->failRegister = inb_p (padapter->regScratchPad + BIGD_ALARM_IMAGE);
-               for ( z = 0;  z < padapter->numberOfDrives;  z++ )
-                       {
-                       unit = inb_p (padapter->regScratchPad + BIGD_DEVICE_0 + z);
-                       pdev = &padapter->device[z];
-                       pdev->byte6             = (UCHAR)(((unit & 1) << 4) | 0xE0);
-                       pdev->spigot    = (UCHAR)(1 << (unit >> 1));
-                       pdev->sectors   = DaleSetup.setupDevice[unit].sectors;
-                       pdev->heads             = DaleSetup.setupDevice[unit].heads;
-                       pdev->cylinders = DaleSetup.setupDevice[unit].cylinders;
-                       pdev->blocks    = DaleSetup.setupDevice[unit].blocks;
-                       
-                       if ( (DiskMirror[unit].signature == SIGNATURE) && (DiskMirror[unit ^ 2].signature == SIGNATURE) &&
-                            (DiskMirror[unit].pairIdentifier == (DiskMirror[unit ^ 2].pairIdentifier ^ 1)) )
-                               {                        
-                               raidon = TRUE;
-                               if ( unit > (unit ^ 2) )
-                                       unit = unit ^ 2;
-                               }       
-                       else
-                               raidon = FALSE;
-                               
-                       spigot1 = spigot2 = FALSE;
-                       memcpy (&pdev->DiskMirror[0], &DiskMirror[unit], sizeof (DISK_MIRROR));
-                       memcpy (&pdev->DiskMirror[1], &DiskMirror[unit ^ 2], sizeof (DISK_MIRROR));
-                       padapter->raidData[unit]         = &pdev->DiskMirror[0];
-                       padapter->raidData[unit ^ 2] = &pdev->DiskMirror[1];
-                       pdev->spigots[0] = 1 << (unit >> 1);
-                       pdev->spigots[1] = 1 << ((unit ^ 2) >> 1);
-                       pdev->deviceID[0] = unit;
-                       pdev->deviceID[1] = unit ^ 2;
-                       pdev->lastsectorlba[0] = InlineIdentify (padapter, pdev->spigots[0], unit & 1);
-                       pdev->lastsectorlba[1] = InlineIdentify (padapter, pdev->spigots[1], unit & 1);
-
-                       if ( !(pdev->DiskMirror[1].status & UCBF_SURVIVOR) && pdev->lastsectorlba[0] )
-                               spigot1 = TRUE;
-                       if ( !(pdev->DiskMirror[0].status & UCBF_SURVIVOR) && pdev->lastsectorlba[1] )
-                               spigot2 = TRUE;
-                       if ( pdev->DiskMirror[0].status & pdev->DiskMirror[1].status & UCBF_SURVIVOR )
-                               spigot1 = TRUE;
-
-                       if ( spigot1 && (pdev->DiskMirror[0].status & UCBF_REBUILD) )
-                               InlineReadSignature (padapter, pdev, 0);
-                       if ( spigot2 && (pdev->DiskMirror[1].status & UCBF_REBUILD) )
-                               InlineReadSignature (padapter, pdev, 1);
-
-                       if ( spigot1 && spigot2 && raidon )
-                               {
-                               pdev->raid = 1;
-                               if ( pdev->DiskMirror[0].status & UCBF_REBUILD )
-                                       pdev->spigot = pdev->spigots[1];
-                               else
-                                       pdev->spigot = pdev->spigots[0];
-                               if ( (pdev->DiskMirror[0].status & UCBF_REBUILD) || (pdev->DiskMirror[1].status & UCBF_REBUILD) )
-                                       padapter->reconOn = pdev->reconOn = pdev->reconIsStarting = TRUE;
-                               }
-                       else
-                               {
-                               if ( spigot1 )
-                                       {
-                                       if ( pdev->DiskMirror[0].status & UCBF_REBUILD )
-                                               goto unregister1;
-                                       pdev->DiskMirror[0].status = UCBF_MIRRORED | UCBF_SURVIVOR;
-                                       pdev->spigot = pdev->spigots[0];
-                                       }
-                               else
-                                       {
-                                       if ( pdev->DiskMirror[1].status & UCBF_REBUILD )
-                                               goto unregister;
-                                       pdev->DiskMirror[1].status = UCBF_MIRRORED | UCBF_SURVIVOR;
-                                       pdev->spigot = pdev->spigots[1];
-                                       }
-                               if ( DaleSetup.rebootRebuild && raidon )
-                                       padapter->reconOn = pdev->reconOn = pdev->reconIsStarting = TRUE;
-                               }
-                       }
-               
-               if ( !padapter->numberOfDrives )                                                                        // If no ATA devices then scan ATAPI
-                       {
-                       unit = 0;
-                       for ( spigot1 = 0;  spigot1 < 4;  spigot1++ )
-                               {
-                               for ( device = 0;  device < 2;  device++ )
-                                       {
-                                       DEB (printk ("\nPCI2242I: scanning for ID %d ", (spigot1 * 2) + device));
-                                       pdev = &(padapter->device[(spigot1 * 2) + device]);
-                                       pdev->byte6 = 0x0A | (device << 4);
-                                       pdev->spigot = 1 << spigot1;
-                                       if ( !AtapiReset (padapter, pdev) )
-                                               {
-                                               DEB (printk (" Device found "));
-                                               if ( !AtapiIdentify (padapter, pdev) )
-                                                       {
-                                                       DEB (printk (" Device verified"));
-                                                       unit++;
-                                                       continue;
-                                                       }
-                                               }
-                                       pdev->spigot = pdev->byte6 = 0;
-                                       }
-                               }
-
-                       if ( unit )
-                               {
-                               padapter->atapi = TRUE;
-                               padapter->timingAddress = DALE_DATA_MODE3;
-                               outw_p (0x0900, padapter->regIrqControl);                                       // Turn our interrupts on
-                               outw_p (0x0C41, padapter->regDmaMode - 1);                                      // setup for 16 bits, ready enabled, done IRQ enabled, no incriment
-                               outb_p (0xFF, padapter->regFail);                                                       // all fail lights and alarm off
-                               pshost->max_id = 8;
-                               }
-                       }
-               SetupFinish (padapter, "2240", pshost->irq);
-               
-               if ( ++Installed < MAXADAPTER )
-                       continue;
-               break;
-unregister1:;
-               scsi_unregister (pshost);
-               }
-
-       NumAdapters = Installed;
-       return Installed;
-       }
-/****************************************************************
- *     Name:   Pci2220i_Abort
- *
- *     Description:    Process the Abort command from the SCSI manager.
- *
- *     Parameters:             SCpnt - Pointer to SCSI command structure.
- *
- *     Returns:                Allways snooze.
- *
- ****************************************************************/
-int Pci2220i_Abort (Scsi_Cmnd *SCpnt)
-       {
-       PADAPTER2220I   padapter = HOSTDATA(SCpnt->device->host);                       // Pointer to adapter control structure
-       POUR_DEVICE             pdev     = &padapter->device[SCpnt->device->id];// Pointer to device information
-
-       if ( !padapter->SCpnt )
-               return SCSI_ABORT_NOT_RUNNING;
-       
-       if ( padapter->atapi )
-               {
-               if ( AtapiReset (padapter, pdev) )
-                       return SCSI_ABORT_ERROR;
-               OpDone (padapter, DID_ABORT << 16);
-               return SCSI_ABORT_SUCCESS;
-               }
-       return SCSI_ABORT_SNOOZE;
-       }
-/****************************************************************
- *     Name:   Pci2220i_Reset
- *
- *     Description:    Process the Reset command from the SCSI manager.
- *
- *     Parameters:             SCpnt - Pointer to SCSI command structure.
- *                                     flags - Flags about the reset command
- *
- *     Returns:                No active command at this time, so this means
- *                                     that each time we got some kind of response the
- *                                     last time through.  Tell the mid-level code to
- *                                     request sense information in order to decide what
- *                                     to do next.
- *
- ****************************************************************/
-int Pci2220i_Reset (Scsi_Cmnd *SCpnt, unsigned int reset_flags)
-       {
-       PADAPTER2220I   padapter = HOSTDATA(SCpnt->device->host);                       // Pointer to adapter control structure
-       POUR_DEVICE             pdev     = &padapter->device[SCpnt->device->id];// Pointer to device information
-
-       if ( padapter->atapi )
-               {
-               if ( AtapiReset (padapter, pdev) )
-                       return SCSI_RESET_ERROR;
-               return SCSI_RESET_SUCCESS;
-               }
-       return SCSI_RESET_PUNT;
-       }
-/****************************************************************
- *     Name:   Pci2220i_Release
- *
- *     Description:    Release resources allocated for a single each adapter.
- *
- *     Parameters:             pshost - Pointer to SCSI command structure.
- *
- *     Returns:                zero.
- *
- ****************************************************************/
-int Pci2220i_Release (struct Scsi_Host *pshost)
-       {
-    PADAPTER2220I      padapter = HOSTDATA (pshost);
-       USHORT                  z;
-
-       if ( padapter->reconOn )
-               {
-               padapter->reconOn = FALSE;                                              // shut down the hot reconstruct
-               if ( padapter->reconPhase )
-                       mdelay (300);
-               if ( padapter->reconTimer.data )                                // is the timer running?
-                       {
-                       del_timer (&padapter->reconTimer);
-                       padapter->reconTimer.data = 0;
-                       }
-               }
-
-       // save RAID status on the board
-       if ( padapter->bigD )
-               {
-               outb_p (padapter->failRegister, padapter->regScratchPad + BIGD_ALARM_IMAGE);
-               for ( z = 0;  z < BIGD_MAXDRIVES;  z++ )
-                       {
-                       if ( padapter->raidData )
-                               outb_p (padapter->raidData[z]->status, padapter->regScratchPad + BIGD_RAID_0_STATUS + z);       
-                       else
-                               outb_p (0, padapter->regScratchPad + BIGD_RAID_0_STATUS);       
-                       }
-               }
-       else
-               {
-               outb_p (padapter->device[0].DiskMirror[0].status, padapter->regScratchPad + DALE_RAID_0_STATUS);                
-               outb_p (padapter->device[0].DiskMirror[1].status, padapter->regScratchPad + DALE_RAID_1_STATUS);                
-               }
-
-       if ( padapter->irqOwned )
-               free_irq (pshost->irq, padapter);
-    release_region (pshost->io_port, pshost->n_io_port);
-       if ( padapter->numberOfDrives )
-               pci_free_consistent (padapter->pcidev, SECTORSXFER * BYTES_PER_SECTOR, padapter->kBuffer, padapter->kBufferDma);
-       else    
-               pci_free_consistent (padapter->pcidev, ATAPI_TRANSFER, padapter->kBuffer, padapter->kBufferDma);
-    scsi_unregister(pshost);
-    return 0;
-       }
-
-/****************************************************************
- *     Name:   Pci2220i_BiosParam
- *
- *     Description:    Process the biosparam request from the SCSI manager to
- *                                     return C/H/S data.
- *
- *     Parameters:             disk - Pointer to SCSI disk structure.
- *                                     dev      - Major/minor number from kernel.
- *                                     geom - Pointer to integer array to place geometry data.
- *
- *     Returns:                zero.
- *
- ****************************************************************/
-int Pci2220i_BiosParam (struct scsi_device *sdev, struct block_device *dev,
-               sector_t capacity, int geom[])
-       {
-       POUR_DEVICE     pdev;
-
-       if ( !(HOSTDATA(sdev->host))->atapi )
-               {
-               pdev = &(HOSTDATA(sdev->host)->device[sdev->id]);
-
-               geom[0] = pdev->heads;
-               geom[1] = pdev->sectors;
-               geom[2] = pdev->cylinders;
-               }
-       return 0;
-       }
-
-MODULE_LICENSE("Dual BSD/GPL");
-
-static Scsi_Host_Template driver_template = {
-       .proc_name              = "pci2220i",
-       .name                   = "PCI-2220I/PCI-2240I",
-       .detect                 = Pci2220i_Detect,
-       .release                = Pci2220i_Release,
-       .queuecommand           = Pci2220i_QueueCommand,
-       .abort                  = Pci2220i_Abort,
-       .reset                  = Pci2220i_Reset,
-       .bios_param             = Pci2220i_BiosParam,
-       .can_queue              = 1,
-       .this_id                = -1,
-       .sg_tablesize           = SG_ALL,
-       .cmd_per_lun            = 1,
-       .use_clustering         = DISABLE_CLUSTERING,
-};
-#include "scsi_module.c"
diff --git a/drivers/scsi/pci2220i.h b/drivers/scsi/pci2220i.h
deleted file mode 100644 (file)
index 6926056..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/****************************************************************************
- * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
- *
- * pci2220i.h - Linux Host Driver for PCI-2220i EIDE Adapters
- *
- * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that redistributions of source
- * code retain the above copyright notice and this comment without
- * modification.
- *
- * Technical updates and product information at:
- *  http://www.psidisk.com
- *
- * Please send questions, comments, bug reports to:
- *  tech@psidisk.com Technical Support
- *
- ****************************************************************************/
-#ifndef _PCI2220I_H
-#define _PCI2220I_H
-
-#ifndef LINUX_VERSION_CODE
-#include <linux/version.h>
-#endif 
-#define        LINUXVERSION(v,p,s)    (((v)<<16) + ((p)<<8) + (s))
-
-// function prototypes
-int Pci2220i_Detect                    (Scsi_Host_Template *tpnt);
-int Pci2220i_Command           (Scsi_Cmnd *SCpnt);
-int Pci2220i_QueueCommand      (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
-int Pci2220i_Abort                     (Scsi_Cmnd *SCpnt);
-int Pci2220i_Reset                     (Scsi_Cmnd *SCpnt, unsigned int flags);
-int Pci2220i_Release           (struct Scsi_Host *pshost);
-int Pci2220i_BiosParam         (struct scsi_device *sdev,
-                                       struct block_device *dev,
-                                       sector_t capacity, int geom[]);
-#endif
index 496c412c88546a854c9d13223c5d7123dc57a38b..3dddb323e7186a1224a6f3d0b8a6715ffeeced45 100644 (file)
@@ -92,9 +92,7 @@ static Scsi_Host_Template nsp_driver_template = {
 #endif
        .info                    = nsp_info,
        .queuecommand            = nsp_queuecommand,
-/*     .eh_strategy_handler     = nsp_eh_strategy,*/
 /*     .eh_abort_handler        = nsp_eh_abort,*/
-/*     .eh_device_reset_handler = nsp_eh_device_reset,*/
        .eh_bus_reset_handler    = nsp_eh_bus_reset,
        .eh_host_reset_handler   = nsp_eh_host_reset,
        .can_queue               = 1,
@@ -1536,11 +1534,6 @@ nsp_proc_info(
 /* error handler                                                 */
 /*---------------------------------------------------------------*/
 
-/*static int nsp_eh_strategy(struct Scsi_Host *Shost)
-{
-       return FAILED;
-}*/
-
 /*
 static int nsp_eh_abort(Scsi_Cmnd *SCpnt)
 {
@@ -1549,14 +1542,6 @@ static int nsp_eh_abort(Scsi_Cmnd *SCpnt)
        return nsp_eh_bus_reset(SCpnt);
 }*/
 
-/*
-static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt)
-{
-       nsp_dbg(NSP_DEBUG_BUSRESET, "%s: SCpnt=0x%p", SCpnt);
-
-       return FAILED;
-}*/
-
 static int nsp_bus_reset(nsp_hw_data *data)
 {
        unsigned int base = data->BaseAddress;
index 4766bcd6369265b125eca53cef412afae50d1667..a0175f5d11cd3e2430fada5124a42dc59abd58f6 100644 (file)
@@ -81,8 +81,6 @@ static Scsi_Host_Template qlogicfas_driver_template = {
        .queuecommand           = qlogicfas408_queuecommand,
        .eh_abort_handler       = qlogicfas408_abort,
        .eh_bus_reset_handler   = qlogicfas408_bus_reset,
-       .eh_device_reset_handler= qlogicfas408_device_reset,
-       .eh_host_reset_handler  = qlogicfas408_host_reset,
        .bios_param             = qlogicfas408_biosparam,
        .can_queue              = 1,
        .this_id                = -1,
index 8457d0d7748a9bb15c1879cbba6d20dcd01ed7f7..1667da9508b4a2d34c667b5bb1d92a30ac3df240 100644 (file)
@@ -627,7 +627,9 @@ SYM53C500_host_reset(struct scsi_cmnd *SCpnt)
        int port_base = SCpnt->device->host->io_port;
 
        DEB(printk("SYM53C500_host_reset called\n"));
+       spin_lock_irq(SCpnt->device->host->host_lock);
        SYM53C500_int_host_reset(port_base);
+       spin_unlock_irq(SCpnt->device->host->host_lock);
 
        return SUCCESS;
 }
index c01b7191fcf59cabfbd6f0b56238ef81665d8f25..623082d3a83f5369d8184be262d9eb1c0404459d 100644 (file)
@@ -354,7 +354,6 @@ static Scsi_Host_Template driver_template = {
        .use_clustering         = ENABLE_CLUSTERING,
        .eh_abort_handler       = fcp_scsi_abort,
        .eh_device_reset_handler = fcp_scsi_dev_reset,
-       .eh_bus_reset_handler   = fcp_scsi_bus_reset,
        .eh_host_reset_handler  = fcp_scsi_host_reset,
 };
 
index 96b4522523d94205312e98a16077b8fb53cbf1f7..fafcf5d185e761d43b0fe949be06e2d4f5a3898f 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/blkdev.h>
 #include <linux/parport.h>
 #include <linux/workqueue.h>
+#include <linux/delay.h>
 #include <asm/io.h>
 
 #include <scsi/scsi.h>
@@ -891,9 +892,9 @@ static int ppa_reset(struct scsi_cmnd *cmd)
 
        ppa_connect(dev, CONNECT_NORMAL);
        ppa_reset_pulse(dev->base);
-       udelay(1000);           /* device settle delay */
+       mdelay(1);              /* device settle delay */
        ppa_disconnect(dev);
-       udelay(1000);           /* device settle delay */
+       mdelay(1);              /* device settle delay */
        return SUCCESS;
 }
 
diff --git a/drivers/scsi/psi_dale.h b/drivers/scsi/psi_dale.h
deleted file mode 100644 (file)
index d672e3b..0000000
+++ /dev/null
@@ -1,564 +0,0 @@
-/****************************************************************************
- * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
- *
- * psi_dalei.h - Linux Host Driver for PCI-2220i EIDE Adapters
- *
- * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that redistributions of source
- * code retain the above copyright notice and this comment without
- * modification.
- *
- * Technical updates and product information at:
- *  http://www.psidisk.com
- *
- * Please send questions, comments, bug reports to:
- *  tech@psidisk.com Technical Support
- *
- ****************************************************************************/
-
-/************************************************/
-/*             Some defines that we like                               */
-/************************************************/
-#define        CHAR            char
-#define        UCHAR           unsigned char
-#define        SHORT           short
-#define        USHORT          unsigned short
-#define        BOOL            unsigned short
-#define        LONG            long
-#define        ULONG           unsigned long
-#define        VOID            void
-
-/************************************************/
-/*             Dale PCI setup                                                  */
-/************************************************/
-#define        VENDOR_PSI                      0x1256
-#define        DEVICE_DALE_1           0x4401          /* 'D1' */
-#define        DEVICE_BIGD_1           0x4201          /* 'B1' */
-#define        DEVICE_BIGD_2           0x4202          /* 'B2' */
-
-/************************************************/
-/*             Misc konstants                                                  */
-/************************************************/
-#define        DALE_MAXDRIVES                  4
-#define        BIGD_MAXDRIVES                  8
-#define        SECTORSXFER                             8
-#define        ATAPI_TRANSFER                  8192
-#define        BYTES_PER_SECTOR                512
-#define        DEFAULT_TIMING_MODE             5
-
-/************************************************/
-/*             EEPROM locations                                                */
-/************************************************/
-#define        DALE_FLASH_PAGE_SIZE    128                             // number of bytes per page
-#define        DALE_FLASH_SIZE                 65536L
-
-#define        DALE_FLASH_BIOS                 0x00080000L             // BIOS base address
-#define        DALE_FLASH_SETUP                0x00088000L             // SETUP PROGRAM base address offset from BIOS
-#define        DALE_FLASH_RAID                 0x00088400L             // RAID signature storage
-#define        DALE_FLASH_FACTORY              0x00089000L             // FACTORY data base address offset from BIOS
-
-#define        DALE_FLASH_BIOS_SIZE    32768U                  // size of FLASH BIOS REGION
-
-/************************************************/
-/*             DALE Register address offsets                   */
-/************************************************/
-#define        REG_DATA                                        0x80
-#define        REG_ERROR                                       0x84
-#define        REG_SECTOR_COUNT                        0x88
-#define        REG_LBA_0                                       0x8C
-#define        REG_LBA_8                                       0x90
-#define        REG_LBA_16                                      0x94
-#define        REG_LBA_24                                      0x98
-#define        REG_STAT_CMD                            0x9C
-#define        REG_STAT_SEL                            0xA0
-#define        REG_FAIL                                        0xB0
-#define        REG_ALT_STAT                            0xB8
-#define        REG_DRIVE_ADRS                          0xBC
-
-#define        DALE_DATA_SLOW                          0x00040000L
-#define        DALE_DATA_MODE2                         0x00040000L
-#define        DALE_DATA_MODE3                         0x00050000L
-#define        DALE_DATA_MODE4                         0x00060000L
-#define        DALE_DATA_MODE5                         0x00070000L
-
-#define        BIGD_DATA_SLOW                          0x00000000L
-#define        BIGD_DATA_MODE0                         0x00000000L
-#define        BIGD_DATA_MODE2                         0x00000000L
-#define        BIGD_DATA_MODE3                         0x00000008L
-#define        BIGD_DATA_MODE4                         0x00000010L
-#define        BIGD_DATA_MODE5                         0x00000020L
-
-#define RTR_LOCAL_RANGE                                0x000
-#define RTR_LOCAL_REMAP                                0x004
-#define RTR_EXP_RANGE                          0x010
-#define RTR_EXP_REMAP                          0x014
-#define RTR_REGIONS                                    0x018
-#define RTR_DM_MASK                                    0x01C
-#define RTR_DM_LOCAL_BASE                      0x020
-#define RTR_DM_IO_BASE                         0x024
-#define RTR_DM_PCI_REMAP                       0x028
-#define RTR_DM_IO_CONFIG                       0x02C
-#define RTR_MAILBOX                                    0x040
-#define RTR_LOCAL_DOORBELL                     0x060
-#define RTR_PCI_DOORBELL                       0x064
-#define RTR_INT_CONTROL_STATUS                 0x068
-#define RTR_EEPROM_CONTROL_STATUS      0x06C
-
-#define RTR_DMA0_MODE                          0x0080
-#define RTR_DMA0_PCI_ADDR                      0x0084
-#define RTR_DMA0_LOCAL_ADDR                    0x0088
-#define RTR_DMA0_COUNT                         0x008C
-#define RTR_DMA0_DESC_PTR                      0x0090
-#define RTR_DMA1_MODE                          0x0094
-#define RTR_DMA1_PCI_ADDR                      0x0098
-#define RTR_DMA1_LOCAL_ADDR                    0x009C
-#define RTR_DMA1_COUNT                         0x00A0
-#define RTR_DMA1_DESC_PTR                      0x00A4
-#define RTR_DMA_COMMAND_STATUS         0x00A8
-#define RTR_DMA_ARB0                           0x00AC
-#define RTR_DMA_ARB1                           0x00B0
-
-#define RTL_DMA0_MODE                          0x00
-#define RTL_DMA0_PCI_ADDR                      0x04
-#define RTL_DMA0_LOCAL_ADDR                    0x08
-#define RTL_DMA0_COUNT                         0x0C
-#define RTL_DMA0_DESC_PTR                      0x10
-#define RTL_DMA1_MODE                          0x14
-#define RTL_DMA1_PCI_ADDR                      0x18
-#define RTL_DMA1_LOCAL_ADDR                    0x1C
-#define RTL_DMA1_COUNT                         0x20
-#define RTL_DMA1_DESC_PTR                      0x24
-#define RTL_DMA_COMMAND_STATUS         0x28
-#define RTL_DMA_ARB0                           0x2C
-#define RTL_DMA_ARB1                           0x30
-
-/************************************************/
-/*             Dale Scratchpad locations                               */
-/************************************************/
-#define        DALE_CHANNEL_DEVICE_0           0               // device channel locations
-#define        DALE_CHANNEL_DEVICE_1           1
-#define        DALE_CHANNEL_DEVICE_2           2
-#define        DALE_CHANNEL_DEVICE_3           3
-
-#define        DALE_SCRATCH_DEVICE_0           4               // device type codes
-#define        DALE_SCRATCH_DEVICE_1           5
-#define DALE_SCRATCH_DEVICE_2          6
-#define        DALE_SCRATCH_DEVICE_3           7
-
-#define        DALE_RAID_0_STATUS                      8
-#define DALE_RAID_1_STATUS                     9
-
-#define        DALE_TIMING_MODE                        12              // bus master timing mode (2, 3, 4, 5)
-#define        DALE_NUM_DRIVES                         13              // number of addressable drives on this board
-#define        DALE_RAID_ON                            14              // RAID status On
-#define        DALE_LAST_ERROR                         15              // Last error code from BIOS
-
-/************************************************/
-/*             BigD Scratchpad locations                               */
-/************************************************/
-#define        BIGD_DEVICE_0                   0               // device channel locations
-#define        BIGD_DEVICE_1                   1
-#define        BIGD_DEVICE_2                   2
-#define        BIGD_DEVICE_3                   3
-
-#define        BIGD_DEVICE_4                   4               // device type codes
-#define        BIGD_DEVICE_5                   5
-#define BIGD_DEVICE_6                  6
-#define        BIGD_DEVICE_7                   7
-
-#define        BIGD_ALARM_IMAGE                11              // ~image of alarm fail register                
-#define        BIGD_TIMING_MODE                12              // bus master timing mode (2, 3, 4, 5)
-#define        BIGD_NUM_DRIVES                 13              // number of addressable drives on this board
-#define        BIGD_RAID_ON                    14              // RAID status is on for the whole board
-#define        BIGD_LAST_ERROR                 15              // Last error code from BIOS
-
-#define        BIGD_RAID_0_STATUS              16
-#define BIGD_RAID_1_STATUS             17
-#define        BIGD_RAID_2_STATUS              18
-#define        BIGD_RAID_3_STATUS              19
-#define        BIGD_RAID_4_STATUS              20
-#define BIGD_RAID_5_STATUS             21
-#define        BIGD_RAID_6_STATUS              22
-#define        BIGD_RAID_7_STATUS              23
-
-/************************************************/
-/*             Dale cable select bits                                  */
-/************************************************/
-#define        SEL_NONE                                        0x00
-#define        SEL_1                                           0x01
-#define        SEL_2                                           0x02
-#define        SEL_3                                           0x04
-#define        SEL_4                                           0x08
-#define        SEL_NEW_SPEED_1                         0x20
-#define        SEL_COPY                                        0x40
-#define        SEL_IRQ_OFF                                     0x80
-
-/************************************************/
-/*             Device/Geometry controls                                */
-/************************************************/
-#define GEOMETRY_NONE                          0x0                             // No device
-#define GEOMETRY_SET                           0x1                             // Geometry set
-#define        GEOMETRY_LBA                            0x2                             // Geometry set in default LBA mode
-#define        GEOMETRY_PHOENIX                        0x3                             // Geometry set in Pheonix BIOS compatibility mode
-
-#define        DEVICE_NONE                                     0x0                             // No device present
-#define        DEVICE_INACTIVE                         0x1                             // device present but not registered active
-#define        DEVICE_ATAPI                            0x2                             // ATAPI device (CD_ROM, Tape, Etc...)
-#define        DEVICE_DASD_NONLBA                      0x3                             // Non LBA incompatible device
-#define        DEVICE_DASD_LBA                         0x4                             // LBA compatible device
-
-/************************************************/
-/*             BigD fail register bits                                 */
-/************************************************/
-#define        FAIL_NONE                               0x00
-#define        FAIL_0                                  0x01
-#define        FAIL_1                                  0x02
-#define        FAIL_2                                  0x04
-#define        FAIL_MULTIPLE                   0x08
-#define        FAIL_GOOD                               0x20
-#define        FAIL_AUDIBLE                    0x40
-#define        FAIL_ANY                                0x80
-
-/************************************************/
-/*             Setup Structure Definitions                             */
-/************************************************/
-typedef struct         // device setup parameters
-       {
-       UCHAR   geometryControl;        // geometry control flags
-       UCHAR   device;                         // device code
-       USHORT  sectors;                        // number of sectors per track
-       USHORT  heads;                          // number of heads
-       USHORT  cylinders;                      // number of cylinders for this device
-       ULONG   blocks;                         // number of blocks on device
-       ULONG   realCapacity;           // number of real blocks on this device for drive changed testing
-       } SETUP_DEVICE, *PSETUP_DEVICE;
-
-typedef struct         // master setup structure
-       {
-       USHORT                  startupDelay;
-       BOOL                    promptBIOS;
-       BOOL                    fastFormat;
-       BOOL                    shareInterrupt;
-       BOOL                    rebootRebuild;
-       USHORT                  timingMode;
-       USHORT                  spare5;
-       USHORT                  spare6;
-       SETUP_DEVICE    setupDevice[BIGD_MAXDRIVES];
-       }       SETUP, *PSETUP;
-
-/************************************************/
-/*             RAID Structure Definitions                              */
-/************************************************/
-typedef        struct
-       {
-       UCHAR   signature;                      // 0x55 our mirror signature
-       UCHAR   status;                         // current status bits
-       UCHAR   pairIdentifier;         // unique identifier for pair
-       ULONG   reconstructPoint;       // recontruction point for hot reconstruct
-       }       DISK_MIRROR;
-
-typedef struct DEVICE_RAID1
-       {
-       long            TotalSectors;
-       DISK_MIRROR DiskRaid1;
-       }       DEVICE_RAID1, *PDEVICE_RAID1;
-
-#define        DISK_MIRROR_POSITION    0x01A8
-#define        SIGNATURE                               0x55
-
-#define        MASK_SERIAL_NUMBER      0x0FFE                  // mask for serial number matching
-#define        MASK_SERIAL_UNIT        0x0001                  // mask for unit portion of serial number
-
-// Status bits
-#define        UCBF_MIRRORED           0x0010                                                          // drive has a pair
-#define        UCBF_MATCHED            0x0020                                                          // drive pair is matched
-#define        UCBF_SURVIVOR           0x0040                                                          // this unit is a survivor of a pair
-#define        UCBF_REBUILD            0x0080                                                          // rebuild in progress on this device
-
-// SCSI controls for RAID
-#define        SC_MY_RAID                      0xBF                    // our special CDB command byte for Win95... interface
-#define        MY_SCSI_QUERY1          0x32                    // byte 1 subcommand to query driver for RAID 1 informatation
-#define        MY_SCSI_REBUILD         0x40                    // byte 1 subcommand to reconstruct a mirrored pair
-#define MY_SCSI_DEMOFAIL       0x54                    // byte 1 subcommand for RAID failure demonstration
-#define        MY_SCSI_ALARMMUTE       0x60                    // byte 1 subcommand to mute any alarm currently on
-
-/************************************************/
-/*             Timeout konstants                                               */
-/************************************************/
-#define        TIMEOUT_READY                           100                     // 100 mSec
-#define        TIMEOUT_DRQ                                     300                     // 300 mSec
-#define        TIMEOUT_DATA                            (3 * HZ)        // 3 seconds
-
-/************************************************/
-/*             Misc. macros                                                    */
-/************************************************/
-#define ANY2SCSI(up, p)                                        \
-((UCHAR *)up)[0] = (((ULONG)(p)) >> 8);        \
-((UCHAR *)up)[1] = ((ULONG)(p));
-
-#define SCSI2LONG(up)                                  \
-( (((long)*(((UCHAR *)up))) << 16)             \
-+ (((long)(((UCHAR *)up)[1])) << 8)            \
-+ ((long)(((UCHAR *)up)[2])) )
-
-#define XANY2SCSI(up, p)                               \
-((UCHAR *)up)[0] = ((long)(p)) >> 24;  \
-((UCHAR *)up)[1] = ((long)(p)) >> 16;  \
-((UCHAR *)up)[2] = ((long)(p)) >> 8;   \
-((UCHAR *)up)[3] = ((long)(p));
-
-#define XSCSI2LONG(up)                                 \
-( (((long)(((UCHAR *)up)[0])) << 24)   \
-+ (((long)(((UCHAR *)up)[1])) << 16)   \
-+ (((long)(((UCHAR *)up)[2])) <<  8)   \
-+ ((long)(((UCHAR *)up)[3])) )
-
-#define        SelectSpigot(padapter,spigot)   outb_p (spigot, padapter->regStatSel)
-#define WriteCommand(padapter,cmd)             outb_p (cmd, padapter->regStatCmd)
-#define        AtapiDevice(padapter,b)                 outb_p (b, padapter->regLba24);
-#define        AtapiCountLo(padapter,b)                outb_p (b, padapter->regLba8)
-#define        AtapiCountHi(padapter,b)                outb_p (b, padapter->regLba16)
-
-/************************************************/
-/*             SCSI CDB operation codes                                */
-/************************************************/
-#define SCSIOP_TEST_UNIT_READY         0x00
-#define SCSIOP_REZERO_UNIT                     0x01
-#define SCSIOP_REWIND                          0x01
-#define SCSIOP_REQUEST_BLOCK_ADDR      0x02
-#define SCSIOP_REQUEST_SENSE           0x03
-#define SCSIOP_FORMAT_UNIT                     0x04
-#define SCSIOP_READ_BLOCK_LIMITS       0x05
-#define SCSIOP_REASSIGN_BLOCKS         0x07
-#define SCSIOP_READ6                           0x08
-#define SCSIOP_RECEIVE                         0x08
-#define SCSIOP_WRITE6                          0x0A
-#define SCSIOP_PRINT                           0x0A
-#define SCSIOP_SEND                                    0x0A
-#define SCSIOP_SEEK6                           0x0B
-#define SCSIOP_TRACK_SELECT                    0x0B
-#define SCSIOP_SLEW_PRINT                      0x0B
-#define SCSIOP_SEEK_BLOCK                      0x0C
-#define SCSIOP_PARTITION                       0x0D
-#define SCSIOP_READ_REVERSE                    0x0F
-#define SCSIOP_WRITE_FILEMARKS         0x10
-#define SCSIOP_FLUSH_BUFFER                    0x10
-#define SCSIOP_SPACE                           0x11
-#define SCSIOP_INQUIRY                         0x12
-#define SCSIOP_VERIFY6                         0x13
-#define SCSIOP_RECOVER_BUF_DATA                0x14
-#define SCSIOP_MODE_SELECT                     0x15
-#define SCSIOP_RESERVE_UNIT                    0x16
-#define SCSIOP_RELEASE_UNIT                    0x17
-#define SCSIOP_COPY                                    0x18
-#define SCSIOP_ERASE                           0x19
-#define SCSIOP_MODE_SENSE                      0x1A
-#define SCSIOP_START_STOP_UNIT         0x1B
-#define SCSIOP_STOP_PRINT                      0x1B
-#define SCSIOP_LOAD_UNLOAD                     0x1B
-#define SCSIOP_RECEIVE_DIAGNOSTIC      0x1C
-#define SCSIOP_SEND_DIAGNOSTIC         0x1D
-#define SCSIOP_MEDIUM_REMOVAL          0x1E
-#define SCSIOP_READ_CAPACITY           0x25
-#define SCSIOP_READ                                    0x28
-#define SCSIOP_WRITE                           0x2A
-#define SCSIOP_SEEK                                    0x2B
-#define SCSIOP_LOCATE                          0x2B
-#define SCSIOP_WRITE_VERIFY                    0x2E
-#define SCSIOP_VERIFY                          0x2F
-#define SCSIOP_SEARCH_DATA_HIGH                0x30
-#define SCSIOP_SEARCH_DATA_EQUAL       0x31
-#define SCSIOP_SEARCH_DATA_LOW         0x32
-#define SCSIOP_SET_LIMITS                      0x33
-#define SCSIOP_READ_POSITION           0x34
-#define SCSIOP_SYNCHRONIZE_CACHE       0x35
-#define SCSIOP_COMPARE                         0x39
-#define SCSIOP_COPY_COMPARE                    0x3A
-#define SCSIOP_WRITE_DATA_BUFF         0x3B
-#define SCSIOP_READ_DATA_BUFF          0x3C
-#define SCSIOP_CHANGE_DEFINITION       0x40
-#define SCSIOP_READ_SUB_CHANNEL                0x42
-#define SCSIOP_READ_TOC                                0x43
-#define SCSIOP_READ_HEADER                     0x44
-#define SCSIOP_PLAY_AUDIO                      0x45
-#define SCSIOP_PLAY_AUDIO_MSF          0x47
-#define SCSIOP_PLAY_TRACK_INDEX                0x48
-#define SCSIOP_PLAY_TRACK_RELATIVE     0x49
-#define SCSIOP_PAUSE_RESUME                    0x4B
-#define SCSIOP_LOG_SELECT                      0x4C
-#define SCSIOP_LOG_SENSE                       0x4D
-#define SCSIOP_MODE_SELECT10           0x55
-#define SCSIOP_MODE_SENSE10                    0x5A
-#define SCSIOP_LOAD_UNLOAD_SLOT                0xA6
-#define SCSIOP_MECHANISM_STATUS                0xBD
-#define SCSIOP_READ_CD                         0xBE
-
-// IDE command definitions
-#define IDE_COMMAND_ATAPI_RESET                0x08
-#define IDE_COMMAND_READ                       0x20
-#define IDE_COMMAND_WRITE                      0x30
-#define IDE_COMMAND_RECALIBRATE                0x10
-#define IDE_COMMAND_SEEK                       0x70
-#define IDE_COMMAND_SET_PARAMETERS     0x91
-#define IDE_COMMAND_VERIFY                     0x40
-#define IDE_COMMAND_ATAPI_PACKET       0xA0
-#define IDE_COMMAND_ATAPI_IDENTIFY     0xA1
-#define        IDE_CMD_READ_MULTIPLE           0xC4
-#define        IDE_CMD_WRITE_MULTIPLE          0xC5
-#define        IDE_CMD_SET_MULTIPLE            0xC6
-#define IDE_COMMAND_IDENTIFY           0xEC
-
-// IDE status definitions
-#define IDE_STATUS_ERROR                       0x01
-#define IDE_STATUS_INDEX                       0x02
-#define IDE_STATUS_CORRECTED_ERROR     0x04
-#define IDE_STATUS_DRQ                         0x08
-#define IDE_STATUS_DSC                         0x10
-#define        IDE_STATUS_WRITE_FAULT          0x20
-#define IDE_STATUS_DRDY                                0x40
-#define IDE_STATUS_BUSY                                0x80
-
-typedef struct _ATAPI_STATUS
-       {
-       CHAR    check           :1;
-       CHAR    reserved1       :1;
-       CHAR    corr            :1;
-       CHAR    drq                     :1;
-       CHAR    dsc                     :1;
-       CHAR    reserved2       :1;
-       CHAR    drdy            :1;
-       CHAR    bsy                     :1;
-       }       ATAPI_STATUS;
-
-typedef struct _ATAPI_REASON
-       {
-       CHAR    cod                     :1;
-       CHAR    io                      :1;
-       CHAR    reserved1       :6;
-       }       ATAPI_REASON;
-
-typedef struct _ATAPI_ERROR
-       {
-       CHAR    ili                     :1;
-       CHAR    eom                     :1;
-       CHAR    abort           :1;
-       CHAR    mcr                     :1;
-       CHAR    senseKey        :4;
-       }       ATAPI_ERROR;
-
-// IDE error definitions
-#define        IDE_ERROR_AMNF                          0x01
-#define        IDE_ERROR_TKONF                         0x02
-#define        IDE_ERROR_ABRT                          0x04
-#define        IDE_ERROR_MCR                           0x08
-#define        IDE_ERROR_IDFN                          0x10
-#define        IDE_ERROR_MC                            0x20
-#define        IDE_ERROR_UNC                           0x40
-#define        IDE_ERROR_BBK                           0x80
-
-// SCSI read capacity structure
-typedef        struct _READ_CAPACITY_DATA
-       {
-       ULONG blks;                             /* total blocks (converted to little endian) */
-       ULONG blksiz;                   /* size of each (converted to little endian) */
-       }       READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
-
-// SCSI inquiry data
-typedef struct _INQUIRYDATA
-       {
-       UCHAR DeviceType                        :5;
-       UCHAR DeviceTypeQualifier       :3;
-       UCHAR DeviceTypeModifier        :7;
-       UCHAR RemovableMedia            :1;
-    UCHAR Versions;
-    UCHAR ResponseDataFormat;
-    UCHAR AdditionalLength;
-    UCHAR Reserved[2];
-       UCHAR SoftReset                         :1;
-       UCHAR CommandQueue                      :1;
-       UCHAR Reserved2                         :1;
-       UCHAR LinkedCommands            :1;
-       UCHAR Synchronous                       :1;
-       UCHAR Wide16Bit                         :1;
-       UCHAR Wide32Bit                         :1;
-       UCHAR RelativeAddressing        :1;
-    UCHAR VendorId[8];
-    UCHAR ProductId[16];
-    UCHAR ProductRevisionLevel[4];
-    UCHAR VendorSpecific[20];
-    UCHAR Reserved3[40];
-       }       INQUIRYDATA, *PINQUIRYDATA;
-
-// IDE IDENTIFY data
-#pragma pack (1)
-typedef struct _IDENTIFY_DATA
-       {
-    USHORT     GeneralConfiguration;           //  0
-    USHORT     NumberOfCylinders;                      //  1
-    USHORT     Reserved1;                                      //  2
-    USHORT     NumberOfHeads;                          //  3
-    USHORT     UnformattedBytesPerTrack;       //  4
-    USHORT     UnformattedBytesPerSector;      //  5
-    USHORT     SectorsPerTrack;                        //  6
-       USHORT  NumBytesISG;                            //  7 Byte Len - inter-sector gap
-       USHORT  NumBytesSync;                           //  8          - sync field
-       USHORT  NumWordsVUS;                            //  9 Len - Vendor Unique Info
-    USHORT     SerialNumber[10];                       // 10
-    USHORT     BufferType;                                     // 20
-    USHORT     BufferSectorSize;                       // 21
-    USHORT     NumberOfEccBytes;                       // 22
-    USHORT     FirmwareRevision[4];            // 23
-    USHORT     ModelNumber[20];                        // 27
-       USHORT  NumSectorsPerInt        :8;             // 47 Multiple Mode - Sec/Blk
-       USHORT  Reserved2                       :8;             // 47
-       USHORT  DoubleWordMode;                         // 48 flag for double word mode capable
-       USHORT  VendorUnique1           :8;             // 49
-       USHORT  SupportDMA                      :1;             // 49 DMA supported
-       USHORT  SupportLBA                      :1;             // 49 LBA supported
-       USHORT  SupportIORDYDisable     :1;             // 49 IORDY can be disabled
-       USHORT  SupportIORDY            :1;             // 49 IORDY supported
-       USHORT  ReservedPsuedoDMA       :1;             // 49 reserved for pseudo DMA mode support
-       USHORT  Reserved3                       :3;             // 49
-       USHORT  Reserved4;                                      // 50
-       USHORT  Reserved5                       :8;             // 51 Transfer Cycle Timing - PIO
-       USHORT  PIOCycleTime            :8;             // 51 Transfer Cycle Timing - PIO
-       USHORT  Reserved6                       :8;             // 52                       - DMA
-       USHORT  DMACycleTime            :8;             // 52                       - DMA
-       USHORT  Valid_54_58                     :1;             // 53 words 54 - 58 are valid
-       USHORT  Valid_64_70                     :1;             // 53 words 64 - 70 are valid
-       USHORT  Reserved7                       :14;    // 53
-       USHORT  LogNumCyl;                                      // 54 Current Translation - Num Cyl
-       USHORT  LogNumHeads;                            // 55                       Num Heads
-       USHORT  LogSectorsPerTrack;                     // 56                       Sec/Trk
-       ULONG   LogTotalSectors;                        // 57                       Total Sec
-       USHORT  CurrentNumSecPerInt     :8;             // 59 current setting for number of sectors per interrupt
-       USHORT  ValidNumSecPerInt       :1;             // 59 Current setting is valid for number of sectors per interrupt
-       USHORT  Reserved8                       :7;             // 59
-       ULONG   LBATotalSectors;                        // 60 LBA Mode - Sectors
-       USHORT  DMASWordFlags;                          // 62
-       USHORT  DMAMWordFlags;                          // 63
-       USHORT  AdvancedPIOSupport  :8;         // 64 Flow control PIO transfer modes supported
-       USHORT  Reserved9                       :8;             // 64
-       USHORT  MinMultiDMACycle;                       // 65 minimum multiword DMA transfer cycle time per word
-       USHORT  RecomendDMACycle;                       // 66 Manufacturer's recommende multiword DMA transfer cycle time
-       USHORT  MinPIOCycleWithoutFlow;         // 67 Minimum PIO transfer cycle time without flow control
-       USHORT  MinPIOCylceWithFlow;            // 68 Minimum PIO transfer cycle time with IORDY flow control
-       USHORT  ReservedSpace[256-69];          // 69
-       }       IDENTIFY_DATA, *PIDENTIFY_DATA;
-
-// ATAPI configuration bits
-typedef struct _ATAPI_GENERAL_0
-       {
-       USHORT  CmdPacketSize           :2;             // Command packet size
-       USHORT  Reserved1                       :3;
-       USHORT  CmdDrqType                      :2;
-       USHORT  Removable                       :1;
-       USHORT  DeviceType                      :5;
-       USHORT  Reserved2                       :1;
-       USHORT  ProtocolType            :2;
-       }       ATAPI_GENERAL_0;
-
-#pragma pack ()
diff --git a/drivers/scsi/psi_roy.h b/drivers/scsi/psi_roy.h
deleted file mode 100644 (file)
index c55b9c0..0000000
+++ /dev/null
@@ -1,331 +0,0 @@
-/****************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver for Linux.
- *
- * psi_roy.h - Linux Host Driver for PCI-2000 IntelliCache SCSI Adapters
- *
- * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that redistributions of source
- * code retain the above copyright notice and this comment without
- * modification.
- *
- * Technical updates and product information at:
- *  http://www.psidisk.com
- *
- * Please send questions, comments, bug reports to:
- *  tech@psidisk.com Technical Support
- *
- ****************************************************************************/
-
-#ifndef        ROY_HOST
-#define        ROY_HOST
-
-/************************************************/
-/*             PCI setup                                                               */
-/************************************************/
-#define        VENDOR_PSI                      0x1256
-#define        DEVICE_ROY_1            0x5201          /* 'R1' */
-
-/************************************************/
-/*             controller constants                                    */
-/************************************************/
-#define MAXADAPTER                     4                       // Increase this and the sizes of the arrays below, if you need more.
-#define        MAX_BUS                         2
-#define        MAX_UNITS                       16
-#define        TIMEOUT_COMMAND         400                     // number of milliSecondos for command busy timeout
-
-/************************************************/
-/*             I/O address offsets                                             */
-/************************************************/
-#define RTR_MAILBOX                                            0x040
-#define RTR_LOCAL_DOORBELL                             0x060
-#define RTR_PCI_DOORBELL                               0x064
-
-/************************************************/
-/*                                                                                             */
-/*                     Host command codes                                      */
-/*                                                                                             */
-/************************************************/
-#define        CMD_READ_CHS            0x01            /* read sectors as specified (CHS mode) */
-#define        CMD_READ                        0x02            /* read sectors as specified (RBA mode) */
-#define        CMD_READ_SG                     0x03            /* read sectors using scatter/gather list */
-#define        CMD_WRITE_CHS           0x04            /* write sectors as specified (CHS mode) */
-#define        CMD_WRITE                       0x05            /* write sectors as specified (RBA mode) */
-#define        CMD_WRITE_SG            0x06            /* write sectors using scatter/gather list (LBA mode) */
-#define        CMD_READ_CHS_SG         0x07            /* read sectors using scatter/gather list (CHS mode) */
-#define        CMD_WRITE_CHS_SG        0x08            /* write sectors using scatter/gather list (CHS mode) */
-#define        CMD_VERIFY_CHS          0x09            /* verify data on sectors as specified (CHS mode) */
-#define        CMD_VERIFY                      0x0A            /* verify data on sectors as specified (RBA mode) */
-#define        CMD_DASD_CDB            0x0B            /* process CDB for a DASD device */
-#define        CMD_DASD_CDB_SG         0x0C            /* process CDB for a DASD device with scatter/gather */
-
-#define        CMD_READ_ABS            0x10            /* read absolute disk */
-#define        CMD_WRITE_ABS           0x11            /* write absolute disk */
-#define        CMD_VERIFY_ABS          0x12            /* verify absolute disk */
-#define        CMD_TEST_READY          0x13            /* test unit ready and return status code */
-#define        CMD_LOCK_DOOR           0x14            /* lock device door */
-#define        CMD_UNLOCK_DOOR         0x15            /* unlock device door */
-#define        CMD_EJECT_MEDIA         0x16            /* eject the media */
-#define        CMD_UPDATE_CAP          0x17            /* update capacity information */
-#define        CMD_TEST_PRIV           0x18            /* test and setup private format media */
-
-
-#define        CMD_SCSI_THRU           0x30            /* SCSI pass through CDB */
-#define        CMD_SCSI_THRU_SG        0x31            /* SCSI pass through CDB with scatter/gather */
-#define        CMD_SCSI_REQ_SENSE      0x32            /* SCSI pass through request sense after check condition */
-
-#define        CMD_DASD_RAID_RQ        0x35            /* request DASD RAID drive data */
-#define        CMD_DASD_RAID_RQ0       0x31                    /* byte 1 subcommand to query for RAID 0 informatation */
-#define        CMD_DASD_RAID_RQ1       0x32                    /* byte 1 subcommand to query for RAID 1 informatation */
-#define        CMD_DASD_RAID_RQ5       0x33                    /* byte 1 subcommand to query for RAID 5 informatation */
-
-#define        CMD_DASD_SCSI_INQ       0x36            /* do DASD inquire and return in SCSI format */
-#define        CMD_DASD_CAP            0x37            /* read DASD capacity */
-#define        CMD_DASD_INQ            0x38            /* do DASD inquire for type data and return SCSI/EIDE inquiry */
-#define        CMD_SCSI_INQ            0x39            /* do SCSI inquire */
-#define        CMD_READ_SETUP          0x3A            /* Get setup structures from controller */
-#define        CMD_WRITE_SETUP         0x3B            /* Put setup structures in controller and burn in flash */
-#define        CMD_READ_CONFIG         0x3C            /* Get the entire configuration and setup structures */
-#define        CMD_WRITE_CONFIG        0x3D            /* Put the entire configuration and setup structures in flash */
-
-#define        CMD_TEXT_DEVICE         0x3E            /* obtain device text */
-#define        CMD_TEXT_SIGNON         0x3F            /* get sign on banner */
-
-#define        CMD_QUEUE                       0x40            /* any command below this generates a queue tag interrupt to host*/
-
-#define        CMD_PREFETCH            0x40            /* prefetch sectors as specified */
-#define        CMD_TEST_WRITE          0x41            /* Test a device for write protect */
-#define        CMD_LAST_STATUS         0x42            /* get last command status and error data*/
-#define        CMD_ABORT                       0x43            /* abort command as specified */
-#define        CMD_ERROR                       0x44            /* fetch error code from a tagged op */
-#define        CMD_DONE                        0x45            /* done with operation */
-#define        CMD_DIAGNOSTICS         0x46            /* execute controller diagnostics and wait for results */
-#define        CMD_FEATURE_MODE        0x47            /* feature mode control word */
-#define        CMD_DASD_INQUIRE        0x48            /* inquire as to DASD SCSI device (32 possible) */
-#define        CMD_FEATURE_QUERY       0x49            /* query the feature control word */
-#define        CMD_DASD_EJECT          0x4A            /* Eject removable media for DASD type */
-#define        CMD_DASD_LOCK           0x4B            /* Lock removable media for DASD type */
-#define        CMD_DASD_TYPE           0x4C            /* obtain DASD device type */
-#define        CMD_NUM_DEV                     0x4D            /* obtain the number of devices connected to the controller */
-#define        CMD_GET_PARMS           0x4E            /* obtain device parameters */
-#define        CMD_SPECIFY                     0x4F            /* specify operating system for scatter/gather operations */
-
-#define        CMD_RAID_GET_DEV        0x50            /* read RAID device geometry */
-#define CMD_RAID_READ          0x51            /* read RAID 1 parameter block */
-#define        CMD_RAID_WRITE          0x52            /* write RAID 1 parameter block */
-#define        CMD_RAID_LITEUP         0x53            /* Light up the drive light for identification */
-#define        CMD_RAID_REBUILD        0x54            /* issue a RAID 1 pair rebuild */
-#define        CMD_RAID_MUTE           0x55            /* mute RAID failure alarm */
-#define        CMD_RAID_FAIL           0x56            /* induce a RAID failure */
-#define        CMD_RAID_STATUS         0x57            /* get status of RAID pair */
-#define        CMD_RAID_STOP           0x58            /* stop any reconstruct in progress */
-#define CMD_RAID_START         0x59            /* start reconstruct */
-#define        CMD_RAID0_READ          0x5A            /* read RAID 0 parameter block */
-#define        CMD_RAID0_WRITE         0x5B            /* write RAID 0 parameter block */
-#define        CMD_RAID5_READ          0x5C            /* read RAID 5 parameter block */
-#define        CMD_RAID5_WRITE         0x5D            /* write RAID 5 parameter block */
-
-#define        CMD_ERASE_TABLES        0x5F            /* erase partition table and RAID signatutures */
-
-#define        CMD_SCSI_GET            0x60            /* get SCSI pass through devices */
-#define        CMD_SCSI_TIMEOUT        0x61            /* set SCSI pass through timeout */
-#define        CMD_SCSI_ERROR          0x62            /* get SCSI pass through request sense length and residual data count */
-#define        CMD_GET_SPARMS          0x63            /* get SCSI bus and user parms */
-#define        CMD_SCSI_ABORT          0x64            /* abort by setting time-out to zero */
-
-#define        CMD_CHIRP_CHIRP         0x77            /* make a chirp chirp sound */
-#define        CMD_GET_LAST_DONE       0x78            /* get tag of last done in progress */
-#define        CMD_GET_FEATURES        0x79            /* get feature code and ESN */
-#define CMD_CLEAR_CACHE                0x7A            /* Clear cache on specified device */
-#define        CMD_BIOS_TEST           0x7B            /* Test whether or not to load BIOS */
-#define        CMD_WAIT_FLUSH          0x7C            /* wait for cache flushed and invalidate read cache */
-#define        CMD_RESET_BUS           0x7D            /* reset the SCSI bus */
-#define        CMD_STARTUP_QRY         0x7E            /* startup in progress query */
-#define        CMD_RESET                       0x7F            /* reset the controller */
-
-#define        CMD_RESTART_RESET       0x80            /* reload and restart the controller at any reset issued */
-#define        CMD_SOFT_RESET          0x81            /* do a soft reset NOW! */
-
-/************************************************/
-/*                                                                                             */
-/*                             Host return errors                              */
-/*                                                                                             */
-/************************************************/
-#define        ERR08_TAGGED            0x80            /* doorbell error ored with tag */
-
-#define        ERR16_NONE                      0x0000          /* no errors */
-#define        ERR16_SC_COND_MET       0x0004          /* SCSI status - Condition Met */
-#define        ERR16_CMD                       0x0101          /* command error */
-#define        ERR16_SC_CHECK_COND     0x0002          /* SCSI status - Check Condition */
-#define        ERR16_CMD_NOT           0x0201          /* command not supported */
-#define ERR16_NO_DEVICE     0x0301             /* invalid device selection */
-#define        ERR16_SECTOR            0x0202          /* bad sector */
-#define        ERR16_PROTECT           0x0303          /* write protected */
-#define        ERR16_NOSECTOR          0x0404          /* sector not found */
-#define        ERR16_MEDIA                     0x0C0C          /* invalid media */
-#define        ERR16_CONTROL           0x2020          /* controller error */
-#define        ERR16_CONTROL_DMA       0x2120          /* controller DMA engine error */
-#define        ERR16_NO_ALARM          0x2220          /* alarm is not active */
-#define        ERR16_OP_BUSY           0x2320          /* operation busy */
-#define        ERR16_SEEK                      0x4040          /* seek failure */
-#define        ERR16_DEVICE_FAIL       0x4140          /* device has failed */
-#define ERR16_TIMEOUT          0x8080          /* timeout error */
-#define        ERR16_DEV_NOT_READY     0xAAAA          /* drive not ready */
-#define        ERR16_UNDEFINED         0xBBBB          /* undefined error */
-#define        ERR16_WRITE_FAULT       0xCCCC          /* write fault */
-#define ERR16_INVALID_DEV      0x4001          /* invalid device access */
-#define        ERR16_DEVICE_BUSY       0x4002          /* device is busy */
-#define        ERR16_MEMORY            0x4003          /* device pass thru requires too much memory */
-#define        ERR16_NO_FEATURE        0x40FA          /* feature no implemented */
-#define        ERR16_NOTAG                     0x40FD          /* no tag space available */
-#define        ERR16_NOT_READY         0x40FE          /* controller not ready error */
-#define        ERR16_SETUP_FLASH       0x5050          /* error when writing setup to flash memory */
-#define        ERR16_SETUP_SIZE        0x5051          /* setup block size error */
-#define        ERR16_SENSE                     0xFFFF          /* sense opereration failed */
-#define        ERR16_SC_BUSY           0x0008          /* SCSI status - Busy */
-#define        ERR16_SC_RES_CONFL      0x0018          /* SCSI status - Reservation Conflict */
-#define        ERR16_SC_CMD_TERM       0x0022          /* SCSI status - Command Terminated */
-#define        ERR16_SC_OTHER          0x00FF          /* SCSI status - not recognized (any value masked) */
-#define        ERR16_MEDIA_CHANGED     0x8001          /* devices media has been changed */
-
-#define        ERR32_NONE                      0x00000000      /* no errors */
-#define        ERR32_SC_COND_MET       0x00000004      /* SCSI status - Condition Met */
-#define        ERR32_CMD                       0x00010101      /* command error */
-#define        ERR32_SC_CHECK_COND     0x00020002      /* SCSI status - Check Condition */
-#define        ERR32_CMD_NOT           0x00030201      /* command not supported */
-#define ERR32_NO_DEVICE     0x00040301 /* invalid device selection */
-#define        ERR32_SECTOR            0x00050202      /* bad sector */
-#define        ERR32_PROTECT           0x00060303      /* write protected */
-#define        ERR32_NOSECTOR          0x00070404      /* sector not found */
-#define        ERR32_MEDIA                     0x00080C0C      /* invalid media */
-#define        ERR32_CONTROL           0x00092020      /* controller error */
-#define        ERR32_CONTROL_DMA       0x000A2120      /* Controller DMA error */
-#define        ERR32_NO_ALARM          0x000B2220      /* alarm is not active */
-#define        ERR32_OP_BUSY           0x000C2320      /* operation busy */
-#define        ERR32_SEEK                      0x000D4040      /* seek failure */
-#define        ERR32_DEVICE_FAIL       0x000E4140      /* device has failed */
-#define ERR32_TIMEOUT          0x000F8080      /* timeout error */
-#define        ERR32_DEV_NOT_READY     0x0010AAAA      /* drive not ready */
-#define        ERR32_UNDEFINED         0x0011BBBB      /* undefined error */
-#define        ERR32_WRITE_FAULT       0x0012CCCC      /* write fault */
-#define ERR32_INVALID_DEV      0x00134001      /* invalid device access */
-#define        ERR32_DEVICE_BUSY       0x00144002      /* device is busy */
-#define        ERR32_MEMORY            0x00154003      /* device pass thru requires too much memory */
-#define        ERR32_NO_FEATURE        0x001640FA      /* feature no implemented */
-#define        ERR32_NOTAG                     0x001740FD      /* no tag space available */
-#define        ERR32_NOT_READY         0x001840FE      /* controller not ready error */
-#define        ERR32_SETUP_FLASH       0x00195050      /* error when writing setup to flash memory */
-#define        ERR32_SETUP_SIZE        0x001A5051      /* setup block size error */
-#define        ERR32_SENSE                     0x001BFFFF      /* sense opereration failed */
-#define        ERR32_SC_BUSY           0x001C0008      /* SCSI status - Busy */
-#define        ERR32_SC_RES_CONFL      0x001D0018      /* SCSI status - Reservation Conflict */
-#define        ERR32_SC_CMD_TERM       0x001E0022      /* SCSI status - Command Terminated */
-#define        ERR32_SC_OTHER          0x001F00FF      /* SCSI status - not recognized (any value masked) */
-#define        ERR32_MEDIA_CHANGED     0x00208001      /* devices media has been changed */
-
-/************************************************/
-/*                                                                                             */
-/*     Host Operating System specification codes       */
-/*                                                                                             */
-/************************************************/
-#define        SPEC_INTERRUPT          0x80            /* specification requires host interrupt */
-#define        SPEC_BACKWARD_SG        0x40            /* specification requires scatter/gather items reversed */
-#define        SPEC_DOS_BLOCK          0x01            /* DOS DASD blocking on pass through */
-#define        SPEC_OS2_V3                     0x02            /* OS/2 Warp */
-#define        SPCE_SCO_3242           0x04            /* SCO 3.4.2.2 */
-#define        SPEC_QNX_4X                     0x05            /* QNX 4.XX */
-#define        SPEC_NOVELL_NWPA        0x08            /* Novell NWPA scatter/gather support */
-
-/************************************************/
-/*                                                                                             */
-/*     Inquire structures                                                      */
-/*                                                                                             */
-/************************************************/
-typedef        struct  _CNT_SCSI_INQ
-       {
-       UCHAR   devt;                                           /* 00: device type */
-       UCHAR   devtm;                                          /* 01: device type modifier */
-       UCHAR   svers;                                          /* 02: SCSI version */
-       UCHAR   rfmt;                                           /* 03: response data format */
-       UCHAR   adlen;                                          /* 04: additional length of data */
-       UCHAR   res1;                                           /* 05: */
-       UCHAR   res2;                                           /* 06: */
-       UCHAR   fncs;                                           /* 07: functional capabilities */
-       UCHAR   vid[8];                                         /* 08: vendor ID */
-       UCHAR   pid[16];                                        /* 10: product ID */
-       UCHAR   rev[4];                                         /* 20: product revision */
-       }       CNT_SCSI_INQ;
-
-typedef        struct  _CNT_IDE_INQ
-       {
-       USHORT  GeneralConfiguration;           /* 00 */
-       USHORT  NumberOfCylinders;                      /* 02 */
-       USHORT  Reserved1;                                      /* 04 */
-       USHORT  NumberOfHeads;                          /* 06 */
-       USHORT  UnformattedBytesPerTrack;       /* 08 */
-       USHORT  UnformattedBytesPerSector;      /* 0A */
-       USHORT  SectorsPerTrack;                        /* 0C */
-       USHORT  VendorUnique1[3];                       /* 0E */
-       USHORT  SerialNumber[10];                       /* 14 */
-       USHORT  BufferType;                                     /* 28 */
-       USHORT  BufferSectorSize;                       /* 2A */
-       USHORT  NumberOfEccBytes;                       /* 2C */
-       USHORT  FirmwareRevision[4];            /* 2E */
-       USHORT  ModelNumber[20];                        /* 36 */
-       UCHAR   MaximumBlockTransfer;           /* 5E */
-       UCHAR   VendorUnique2;                          /* 5F */
-       USHORT  DoubleWordIo;                           /* 60 */
-       USHORT  Capabilities;                           /* 62 */
-       USHORT  Reserved2;                                      /* 64 */
-       UCHAR   VendorUnique3;                          /* 66 */
-       UCHAR   PioCycleTimingMode;                     /* 67 */
-       UCHAR   VendorUnique4;                          /* 68 */
-       UCHAR   DmaCycleTimingMode;                     /* 69 */
-       USHORT  TranslationFieldsValid;         /* 6A */
-       USHORT  NumberOfCurrentCylinders;       /* 6C */
-       USHORT  NumberOfCurrentHeads;           /* 6E */
-       USHORT  CurrentSectorsPerTrack;         /* 70 */
-       ULONG   CurrentSectorCapacity;          /* 72 */
-       }       CNT_IDE_INQ;
-
-typedef struct _DASD_INQUIRE
-       {
-       ULONG   type;                                           /* 0 = SCSI, 1 = IDE */
-       union
-               {
-               CNT_SCSI_INQ    scsi;                   /* SCSI inquire data */
-               CNT_IDE_INQ             ide;                    /* IDE inquire data */
-               }       inq;
-       }       DASD_INQUIRE;
-
-/************************************************/
-/*                                                                                             */
-/*     Device Codes                                                            */
-/*                                                                                             */
-/************************************************/
-#define DEVC_DASD                      0x00            /* Direct-access Storage Device */
-#define DEVC_SEQACESS          0x01            /* Sequential-access device */
-#define DEVC_PRINTER           0x02            /* Printer device */
-#define DEVC_PROCESSOR         0x03            /* Processor device */
-#define DEVC_WRITEONCE         0x04            /* Write-once device */
-#define DEVC_CDROM                     0x05            /* CD-ROM device */
-#define DEVC_SCANNER           0x06            /* Scanner device */
-#define DEVC_OPTICAL           0x07            /* Optical memory device */
-#define DEVC_MEDCHGR           0x08            /* Medium changer device */
-#define        DEVC_DASD_REMOVABLE     0x80            /* Direct-access storage device, Removable */
-#define        DEVC_NONE                       0xFF            /* no device */
-
-// SCSI controls for RAID
-#define        SC_MY_RAID                      0xBF                    // our special CDB command byte for Win95... interface
-#define        MY_SCSI_QUERY0          0x31                    // byte 1 subcommand to query driver for RAID 0 informatation
-#define        MY_SCSI_QUERY1          0x32                    // byte 1 subcommand to query driver for RAID 1 informatation
-#define        MY_SCSI_QUERY5          0x33                    // byte 1 subcommand to query driver for RAID 5 informatation
-#define        MY_SCSI_REBUILD         0x40                    // byte 1 subcommand to reconstruct a mirrored pair
-#define MY_SCSI_DEMOFAIL       0x54                    // byte 1 subcommand for RAID failure demonstration
-#define        MY_SCSI_ALARMMUTE       0x60                    // byte 1 subcommand to mute any alarm currently on
-
-
-#endif
-
index 89d8e09ec387a37c24ff602934c25a091fbda58f..aaf9284a8b7db9442e248df4fc61b248caaaa95c 100644 (file)
  */
 
 /*
- *     Firmware Version 7.65.00 (14:17 Jul 20, 1999)
+ *     Firmware Version 7.65.06 (14:38 Jan 07, 2002)
  */
 
-static unsigned char firmware_version[] = {7,65,0};
+static unsigned char firmware_version[] = {7,65,6};
 
-#define FW_VERSION_STRING "7.65.0"
+#define FW_VERSION_STRING "7.65.06"
 
 static unsigned short risc_code_addr01 = 0x1000 ;
 
 static unsigned short risc_code01[] = { 
-       0x0078, 0x103a, 0x0000, 0x4057, 0x0000, 0x2043, 0x4f50, 0x5952,
+       0x0078, 0x103a, 0x0000, 0x4158, 0x0000, 0x2043, 0x4f50, 0x5952,
        0x4947, 0x4854, 0x2031, 0x3939, 0x3520, 0x514c, 0x4f47, 0x4943,
        0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
        0x3130, 0x3230, 0x2049, 0x2f54, 0x2046, 0x6972, 0x6d77, 0x6172,
@@ -45,7 +45,7 @@ static unsigned short risc_code01[] = {
        0x3031, 0x2024, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x0048,
        0x1045, 0x0038, 0x104b, 0x0078, 0x1047, 0x0028, 0x104b, 0x20b9,
        0x1212, 0x0078, 0x104d, 0x20b9, 0x2222, 0x20c1, 0x0008, 0x2071,
-       0x0010, 0x70c3, 0x0004, 0x20c9, 0x77ff, 0x2089, 0x1186, 0x70c7,
+       0x0010, 0x70c3, 0x0004, 0x20c9, 0x78ff, 0x2089, 0x1186, 0x70c7,
        0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0007, 0x3f00,
        0x70d6, 0x20c1, 0x0008, 0x2019, 0x0000, 0x2009, 0xfeff, 0x2100,
        0x200b, 0xa5a5, 0xa1ec, 0x7fff, 0x2d64, 0x206b, 0x0a0a, 0xaddc,
@@ -59,62 +59,62 @@ static unsigned short risc_code01[] = {
        0x118e, 0x284a, 0x263a, 0x98c0, 0xa188, 0x1000, 0x212c, 0x200b,
        0xa5a5, 0x2114, 0xa286, 0xa5a5, 0x0040, 0x10bc, 0x250a, 0xa18a,
        0x1000, 0x98c1, 0x0078, 0x10c1, 0x250a, 0x0078, 0x10c1, 0x2c6a,
-       0x2a5a, 0x2130, 0xa18a, 0x0040, 0x2128, 0xa1a2, 0x5100, 0x8424,
-       0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0xa192, 0x7800, 0x2009,
-       0x0000, 0x2001, 0x0031, 0x1078, 0x1cba, 0x2218, 0x2079, 0x5100,
+       0x2a5a, 0x2130, 0xa18a, 0x0040, 0x2128, 0xa1a2, 0x5200, 0x8424,
+       0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0xa192, 0x7900, 0x2009,
+       0x0000, 0x2001, 0x0031, 0x1078, 0x1d26, 0x2218, 0x2079, 0x5200,
        0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109,
        0x00c0, 0x10dc, 0x7ef2, 0x8528, 0x7de6, 0x7cea, 0x7bee, 0x7883,
        0x0000, 0x2031, 0x0030, 0x78cf, 0x0101, 0x780b, 0x0002, 0x780f,
-       0x0002, 0x784f, 0x0003, 0x2069, 0x5140, 0x2001, 0x04fd, 0x2004,
+       0x0002, 0x784f, 0x0003, 0x2069, 0x5240, 0x2001, 0x04fd, 0x2004,
        0xa082, 0x0005, 0x0048, 0x1104, 0x0038, 0x1100, 0x0078, 0x1108,
        0x681b, 0x003c, 0x0078, 0x110a, 0x00a8, 0x1108, 0x681b, 0x003c,
        0x681b, 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa, 0x680f, 0x0008,
        0x6813, 0x0005, 0x6823, 0x0000, 0x6827, 0x0006, 0x6817, 0x0008,
-       0x682b, 0x0000, 0x681f, 0x0019, 0x2069, 0x5380, 0x2011, 0x0020,
+       0x682b, 0x0000, 0x681f, 0x0019, 0x2069, 0x5480, 0x2011, 0x0020,
        0x2009, 0x0010, 0x680b, 0x080c, 0x680f, 0x0019, 0x6803, 0xfd00,
        0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004,
-       0x8109, 0x00c0, 0x1122, 0x2069, 0x5400, 0x2009, 0x0002, 0x20a9,
+       0x8109, 0x00c0, 0x1122, 0x2069, 0x5500, 0x2009, 0x0002, 0x20a9,
        0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bf0, 0xa386, 0xfeff,
        0x00c0, 0x1148, 0x6817, 0x0100, 0x681f, 0x0064, 0x0078, 0x114c,
        0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010, 0x0070, 0x1152,
-       0x0078, 0x1139, 0x8109, 0x00c0, 0x1137, 0x1078, 0x220a, 0x1078,
-       0x482c, 0x1078, 0x1963, 0x1078, 0x4d22, 0x3200, 0xa085, 0x000d,
+       0x0078, 0x1139, 0x8109, 0x00c0, 0x1137, 0x1078, 0x22a7, 0x1078,
+       0x493d, 0x1078, 0x19b5, 0x1078, 0x4e33, 0x3200, 0xa085, 0x000d,
        0x2090, 0x70c3, 0x0000, 0x0090, 0x116c, 0x70c0, 0xa086, 0x0002,
        0x00c0, 0x116c, 0x1078, 0x1284, 0x1078, 0x1196, 0x78cc, 0xa005,
-       0x00c0, 0x117a, 0x1078, 0x1ce3, 0x0010, 0x1180, 0x0068, 0x1180,
-       0x1078, 0x20e9, 0x0010, 0x1180, 0x0068, 0x1180, 0x1078, 0x1a48,
-       0x00e0, 0x116c, 0x1078, 0x4ba9, 0x0078, 0x116c, 0x118e, 0x1190,
-       0x240b, 0x240b, 0x48ad, 0x48ad, 0x240b, 0x240b, 0x0078, 0x118e,
+       0x00c0, 0x117a, 0x1078, 0x1d4f, 0x0010, 0x1180, 0x0068, 0x1180,
+       0x1078, 0x2186, 0x0010, 0x1180, 0x0068, 0x1180, 0x1078, 0x1ab9,
+       0x00e0, 0x116c, 0x1078, 0x4cba, 0x0078, 0x116c, 0x118e, 0x1190,
+       0x24ac, 0x24ac, 0x49be, 0x49be, 0x24ac, 0x24ac, 0x0078, 0x118e,
        0x0078, 0x1190, 0x0078, 0x1192, 0x0078, 0x1194, 0x0068, 0x1201,
        0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1201, 0x7814,
        0xa005, 0x00c0, 0x11a7, 0x0010, 0x1202, 0x0078, 0x1201, 0x2009,
-       0x515b, 0x2104, 0xa005, 0x00c0, 0x1201, 0x2009, 0x5164, 0x200b,
+       0x525b, 0x2104, 0xa005, 0x00c0, 0x1201, 0x2009, 0x5264, 0x200b,
        0x0000, 0x7914, 0xa186, 0x0042, 0x00c0, 0x11cc, 0x7816, 0x2009,
-       0x5162, 0x2164, 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014, 0x70ca,
+       0x5262, 0x2164, 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014, 0x70ca,
        0x611c, 0xa18c, 0xff00, 0x6020, 0xa084, 0x00ff, 0xa105, 0x70ce,
-       0x1078, 0x1948, 0x0078, 0x11ff, 0x7814, 0xa086, 0x0018, 0x00c0,
-       0x11d3, 0x1078, 0x165a, 0x7817, 0x0000, 0x2009, 0x5162, 0x2104,
-       0xa065, 0x0040, 0x11ef, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x19b3,
-       0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009, 0x000c, 0x6007,
-       0x0103, 0x1078, 0x1924, 0x00c0, 0x11fb, 0x1078, 0x1948, 0x2009,
-       0x5162, 0x200b, 0x0000, 0x2009, 0x515c, 0x2104, 0x200b, 0x0000,
+       0x1078, 0x199a, 0x0078, 0x11ff, 0x7814, 0xa086, 0x0018, 0x00c0,
+       0x11d3, 0x1078, 0x1678, 0x7817, 0x0000, 0x2009, 0x5262, 0x2104,
+       0xa065, 0x0040, 0x11ef, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x1a17,
+       0x0c7f, 0x609f, 0x0000, 0x1078, 0x174e, 0x2009, 0x000c, 0x6007,
+       0x0103, 0x1078, 0x1976, 0x00c0, 0x11fb, 0x1078, 0x199a, 0x2009,
+       0x5262, 0x200b, 0x0000, 0x2009, 0x525c, 0x2104, 0x200b, 0x0000,
        0xa005, 0x0040, 0x11ff, 0x2001, 0x4005, 0x0078, 0x1286, 0x0078,
        0x1284, 0x007c, 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000,
        0x70cf, 0x0000, 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x1252, 0x2038,
        0x0079, 0x1212, 0x1284, 0x12e5, 0x12a9, 0x12fe, 0x130d, 0x1313,
-       0x12a0, 0x1748, 0x1317, 0x1298, 0x12ad, 0x12af, 0x12b1, 0x12b3,
-       0x174d, 0x1298, 0x1329, 0x1360, 0x1672, 0x1742, 0x12b5, 0x1591,
-       0x15ad, 0x15c9, 0x15f4, 0x154a, 0x1558, 0x156c, 0x1580, 0x13df,
-       0x1298, 0x138d, 0x1393, 0x1398, 0x139d, 0x13a3, 0x13a8, 0x13ad,
-       0x13b2, 0x13b7, 0x13bb, 0x13d0, 0x13dc, 0x1298, 0x1298, 0x1298,
-       0x1298, 0x13eb, 0x13f4, 0x1403, 0x1429, 0x1433, 0x143a, 0x1480,
-       0x148f, 0x149e, 0x14b0, 0x152a, 0x153a, 0x1298, 0x1298, 0x1298,
-       0x1298, 0x153f, 0xa0bc, 0xffa0, 0x00c0, 0x1298, 0x2038, 0xa084,
-       0x001f, 0x0079, 0x125b, 0x1786, 0x1789, 0x1799, 0x1298, 0x1298,
-       0x18df, 0x18fc, 0x1298, 0x1298, 0x1298, 0x1900, 0x1908, 0x1298,
-       0x1298, 0x1298, 0x1298, 0x12db, 0x12f4, 0x131f, 0x1356, 0x1668,
-       0x1764, 0x1778, 0x1298, 0x1829, 0x190e, 0x18bb, 0x18c5, 0x18c9,
-       0x18d7, 0x1298, 0x1298, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078,
+       0x12a0, 0x1766, 0x1317, 0x1298, 0x12ad, 0x12af, 0x12b1, 0x12b3,
+       0x176b, 0x1298, 0x1329, 0x1365, 0x1690, 0x1760, 0x12b5, 0x15af,
+       0x15cb, 0x15e7, 0x1612, 0x1568, 0x1576, 0x158a, 0x159e, 0x13e9,
+       0x1298, 0x1397, 0x139d, 0x13a2, 0x13a7, 0x13ad, 0x13b2, 0x13b7,
+       0x13bc, 0x13c1, 0x13c5, 0x13da, 0x13e6, 0x1298, 0x1298, 0x1298,
+       0x1298, 0x13f5, 0x13fe, 0x140d, 0x1451, 0x145b, 0x1462, 0x14a8,
+       0x14b7, 0x14c6, 0x14d8, 0x1548, 0x1558, 0x1298, 0x1298, 0x1298,
+       0x1298, 0x155d, 0xa0bc, 0xffa0, 0x00c0, 0x1298, 0x2038, 0xa084,
+       0x001f, 0x0079, 0x125b, 0x17a4, 0x17a7, 0x17b7, 0x1298, 0x1298,
+       0x1931, 0x194e, 0x1298, 0x1298, 0x1298, 0x1952, 0x195a, 0x1298,
+       0x1298, 0x1298, 0x1298, 0x12db, 0x12f4, 0x131f, 0x135b, 0x1686,
+       0x1782, 0x1796, 0x1298, 0x1847, 0x1960, 0x190d, 0x1917, 0x191b,
+       0x1929, 0x1298, 0x1298, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078,
        0x1286, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068,
        0x1287, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x00e0,
        0x128f, 0x00e0, 0x1291, 0x0068, 0x1291, 0x2091, 0x4080, 0x007c,
@@ -126,1974 +126,2005 @@ static unsigned short risc_code01[] = {
        0x0007, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001, 0x2031,
        0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051, 0x0470, 0x2061,
        0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091, 0x5000, 0x2091,
-       0x4080, 0x0078, 0x0455, 0x1078, 0x1b53, 0x00c0, 0x129c, 0x75d8,
+       0x4080, 0x0078, 0x0455, 0x1078, 0x1bc4, 0x00c0, 0x129c, 0x75d8,
        0x74dc, 0x75da, 0x74de, 0x0078, 0x12e8, 0x2029, 0x0000, 0x2520,
-       0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1a8d, 0x0040, 0x1284,
-       0x70c3, 0x4002, 0x0078, 0x1284, 0x1078, 0x1b53, 0x00c0, 0x129c,
+       0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1afe, 0x0040, 0x1284,
+       0x70c3, 0x4002, 0x0078, 0x1284, 0x1078, 0x1bc4, 0x00c0, 0x129c,
        0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1301, 0x2029, 0x0000,
-       0x2520, 0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1aed, 0x0040,
+       0x2520, 0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1b5e, 0x0040,
        0x1284, 0x70c3, 0x4002, 0x0078, 0x1284, 0x71c4, 0x70c8, 0x2114,
        0x200a, 0x0078, 0x1282, 0x71c4, 0x2114, 0x0078, 0x1282, 0x70c7,
-       0x0007, 0x70cb, 0x0041, 0x70cf, 0x0000, 0x0078, 0x1284, 0x1078,
-       0x1b53, 0x00c0, 0x129c, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078,
+       0x0007, 0x70cb, 0x0041, 0x70cf, 0x0006, 0x0078, 0x1284, 0x1078,
+       0x1bc4, 0x00c0, 0x129c, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078,
        0x132c, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0,
-       0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x1350, 0x8001,
-       0x7892, 0xa084, 0xfc00, 0x0040, 0x1345, 0x78cc, 0xa085, 0x0001,
-       0x78ce, 0x2001, 0x4005, 0x0078, 0x1286, 0x7a9a, 0x7b9e, 0x7da2,
-       0x7ea6, 0x7c96, 0x78cc, 0xa084, 0xfffc, 0x78ce, 0x0078, 0x1354,
-       0x78cc, 0xa085, 0x0001, 0x78ce, 0x0078, 0x1284, 0x1078, 0x1b53,
-       0x00c0, 0x129c, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x1363,
-       0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6,
-       0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x1387, 0x8001, 0x78ae,
-       0xa084, 0xfc00, 0x0040, 0x137c, 0x78cc, 0xa085, 0x0100, 0x78ce,
-       0x2001, 0x4005, 0x0078, 0x1286, 0x7ab6, 0x7bba, 0x7dbe, 0x7ec2,
-       0x7cb2, 0x78cc, 0xa084, 0xfcff, 0x78ce, 0x0078, 0x138b, 0x78cc,
-       0xa085, 0x0100, 0x78ce, 0x0078, 0x1284, 0x2009, 0x5161, 0x210c,
-       0x7aec, 0x0078, 0x1282, 0x2009, 0x5141, 0x210c, 0x0078, 0x1283,
-       0x2009, 0x5142, 0x210c, 0x0078, 0x1283, 0x2061, 0x5140, 0x610c,
-       0x6210, 0x0078, 0x1282, 0x2009, 0x5145, 0x210c, 0x0078, 0x1283,
-       0x2009, 0x5146, 0x210c, 0x0078, 0x1283, 0x2009, 0x5148, 0x210c,
-       0x0078, 0x1283, 0x2009, 0x5149, 0x210c, 0x0078, 0x1283, 0x7908,
-       0x7a0c, 0x0078, 0x1282, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003,
-       0x8003, 0x8003, 0xa0e8, 0x5380, 0x6a00, 0x6804, 0xa084, 0x0008,
-       0x0040, 0x13cd, 0x6b08, 0x0078, 0x13ce, 0x6b0c, 0x0078, 0x1281,
-       0x77c4, 0x1078, 0x1973, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091,
-       0x8001, 0x2708, 0x0078, 0x1281, 0x794c, 0x0078, 0x1283, 0x77c4,
-       0x1078, 0x1973, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091,
-       0x8001, 0x0078, 0x1281, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x127c,
-       0x1078, 0x22e2, 0x0078, 0x1281, 0x71c4, 0xa182, 0x0010, 0x00c8,
-       0x127c, 0x2011, 0x5141, 0x2204, 0x007e, 0x2112, 0x1078, 0x229b,
-       0x017f, 0x0078, 0x1283, 0x71c4, 0x2011, 0x1421, 0x20a9, 0x0008,
-       0x2204, 0xa106, 0x0040, 0x1413, 0x8210, 0x0070, 0x1411, 0x0078,
-       0x1408, 0x0078, 0x127c, 0xa292, 0x1421, 0x027e, 0x2011, 0x5142,
-       0x2204, 0x2112, 0x017f, 0x007e, 0x1078, 0x22a7, 0x017f, 0x0078,
+       0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x1355, 0xa40a,
+       0x0040, 0x133c, 0x00c8, 0x1346, 0x8001, 0x7892, 0xa084, 0xfc00,
+       0x0040, 0x134a, 0x78cc, 0xa085, 0x0001, 0x78ce, 0x2001, 0x4005,
+       0x0078, 0x1286, 0x7a9a, 0x7b9e, 0x7da2, 0x7ea6, 0x7c96, 0x78cc,
+       0xa084, 0xfffc, 0x78ce, 0x0078, 0x1359, 0x78cc, 0xa085, 0x0001,
+       0x78ce, 0x0078, 0x1284, 0x1078, 0x1bc4, 0x00c0, 0x129c, 0x75d8,
+       0x76dc, 0x75da, 0x76de, 0x0078, 0x1368, 0x2029, 0x0000, 0x2530,
+       0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6,
+       0xa005, 0x0040, 0x1391, 0xa40a, 0x0040, 0x1378, 0x00c8, 0x1382,
+       0x8001, 0x78ae, 0xa084, 0xfc00, 0x0040, 0x1386, 0x78cc, 0xa085,
+       0x0100, 0x78ce, 0x2001, 0x4005, 0x0078, 0x1286, 0x7ab6, 0x7bba,
+       0x7dbe, 0x7ec2, 0x7cb2, 0x78cc, 0xa084, 0xfcff, 0x78ce, 0x0078,
+       0x1395, 0x78cc, 0xa085, 0x0100, 0x78ce, 0x0078, 0x1284, 0x2009,
+       0x5261, 0x210c, 0x7aec, 0x0078, 0x1282, 0x2009, 0x5241, 0x210c,
+       0x0078, 0x1283, 0x2009, 0x5242, 0x210c, 0x0078, 0x1283, 0x2061,
+       0x5240, 0x610c, 0x6210, 0x0078, 0x1282, 0x2009, 0x5245, 0x210c,
+       0x0078, 0x1283, 0x2009, 0x5246, 0x210c, 0x0078, 0x1283, 0x2009,
+       0x5248, 0x210c, 0x0078, 0x1283, 0x2009, 0x5249, 0x210c, 0x0078,
+       0x1283, 0x7908, 0x7a0c, 0x0078, 0x1282, 0x71c4, 0x8107, 0xa084,
+       0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8, 0x5480, 0x6a00, 0x6804,
+       0xa084, 0x0008, 0x0040, 0x13d7, 0x6b08, 0x0078, 0x13d8, 0x6b0c,
+       0x0078, 0x1281, 0x77c4, 0x1078, 0x19c5, 0x2091, 0x8000, 0x6b1c,
+       0x6a14, 0x2091, 0x8001, 0x2708, 0x0078, 0x1281, 0x794c, 0x0078,
+       0x1283, 0x77c4, 0x1078, 0x19c5, 0x2091, 0x8000, 0x6908, 0x6a18,
+       0x6b10, 0x2091, 0x8001, 0x0078, 0x1281, 0x71c4, 0xa182, 0x0010,
+       0x00c8, 0x127c, 0x1078, 0x237f, 0x0078, 0x1281, 0x71c4, 0xa182,
+       0x0010, 0x00c8, 0x127c, 0x2011, 0x5241, 0x2204, 0x007e, 0x2112,
+       0x1078, 0x2338, 0x017f, 0x0078, 0x1283, 0x71c4, 0x2019, 0x0100,
+       0x2304, 0xa082, 0x0006, 0x0048, 0x141b, 0x2011, 0x1449, 0x20a9,
+       0x0008, 0x0078, 0x141f, 0x2011, 0x1441, 0x20a9, 0x0008, 0x2204,
+       0xa106, 0x0040, 0x142a, 0x8210, 0x0070, 0x1428, 0x0078, 0x141f,
+       0x0078, 0x127c, 0x2304, 0xa082, 0x0006, 0x0048, 0x1433, 0xa292,
+       0x1449, 0x0078, 0x1435, 0xa292, 0x1441, 0x027e, 0x2011, 0x5242,
+       0x2204, 0x2112, 0x017f, 0x007e, 0x1078, 0x2344, 0x017f, 0x0078,
        0x1283, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032,
-       0x004b, 0x2061, 0x5140, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8,
-       0x6012, 0x0078, 0x1282, 0x2061, 0x5140, 0x6114, 0x70c4, 0x6016,
-       0x0078, 0x1283, 0x2061, 0x5140, 0x71c4, 0x2011, 0x0004, 0x601f,
-       0x0019, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040, 0x145b, 0x2011,
+       0x004b, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0004, 0x0001, 0x0002,
+       0x0003, 0x2061, 0x5240, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8,
+       0x6012, 0x0078, 0x1282, 0x2061, 0x5240, 0x6114, 0x70c4, 0x6016,
+       0x0078, 0x1283, 0x2061, 0x5240, 0x71c4, 0x2011, 0x0004, 0x601f,
+       0x0019, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040, 0x1483, 0x2011,
        0x0005, 0x601f, 0x0019, 0x2019, 0x1212, 0xa186, 0x0032, 0x0040,
-       0x145b, 0x2011, 0x0006, 0x601f, 0x000c, 0x2019, 0x2222, 0xa186,
+       0x1483, 0x2011, 0x0006, 0x601f, 0x000c, 0x2019, 0x2222, 0xa186,
        0x003c, 0x00c0, 0x127c, 0x6018, 0x007e, 0x611a, 0x7800, 0xa084,
-       0x0001, 0x00c0, 0x1476, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
-       0x0048, 0x146e, 0x0038, 0x1472, 0x0078, 0x1476, 0x0028, 0x1472,
-       0x0078, 0x1476, 0x2019, 0x2222, 0x0078, 0x1478, 0x2019, 0x1212,
-       0x23b8, 0x1078, 0x22b8, 0x1078, 0x4d22, 0x017f, 0x0078, 0x1283,
-       0x71c4, 0xa184, 0xffcf, 0x00c0, 0x127c, 0x2011, 0x5148, 0x2204,
-       0x2112, 0x007e, 0x1078, 0x22da, 0x017f, 0x0078, 0x1283, 0x71c4,
-       0xa182, 0x0010, 0x00c8, 0x127c, 0x2011, 0x5149, 0x2204, 0x007e,
-       0x2112, 0x1078, 0x22c9, 0x017f, 0x0078, 0x1283, 0x71c4, 0x72c8,
+       0x0001, 0x00c0, 0x149e, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
+       0x0048, 0x1496, 0x0038, 0x149a, 0x0078, 0x149e, 0x0028, 0x149a,
+       0x0078, 0x149e, 0x2019, 0x2222, 0x0078, 0x14a0, 0x2019, 0x1212,
+       0x23b8, 0x1078, 0x2355, 0x1078, 0x4e33, 0x017f, 0x0078, 0x1283,
+       0x71c4, 0xa184, 0xffcf, 0x00c0, 0x127c, 0x2011, 0x5248, 0x2204,
+       0x2112, 0x007e, 0x1078, 0x2377, 0x017f, 0x0078, 0x1283, 0x71c4,
+       0xa182, 0x0010, 0x00c8, 0x127c, 0x2011, 0x5249, 0x2204, 0x007e,
+       0x2112, 0x1078, 0x2366, 0x017f, 0x0078, 0x1283, 0x71c4, 0x72c8,
        0xa184, 0xfffd, 0x00c0, 0x127b, 0xa284, 0xfffd, 0x00c0, 0x127b,
        0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x1282,
        0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
-       0x5380, 0x2019, 0x0000, 0x72c8, 0xa284, 0x0080, 0x0040, 0x14c6,
-       0x6c14, 0x84ff, 0x00c0, 0x14c6, 0x6817, 0x0040, 0xa284, 0x0040,
-       0x0040, 0x14d0, 0x6c10, 0x84ff, 0x00c0, 0x14d0, 0x6813, 0x0001,
-       0x6800, 0x007e, 0xa226, 0x0040, 0x14f3, 0x6a02, 0xa484, 0x2000,
-       0x0040, 0x14dc, 0xa39d, 0x0010, 0xa484, 0x1000, 0x0040, 0x14e2,
-       0xa39d, 0x0008, 0xa484, 0x4000, 0x0040, 0x14f3, 0x810f, 0xa284,
-       0x4000, 0x0040, 0x14ef, 0x1078, 0x22fc, 0x0078, 0x14f3, 0x1078,
-       0x22ee, 0x0078, 0x14f3, 0x72cc, 0x6808, 0xa206, 0x0040, 0x1522,
-       0xa2a4, 0x00ff, 0x2061, 0x5140, 0x6118, 0xa186, 0x0028, 0x0040,
-       0x1509, 0xa186, 0x0032, 0x0040, 0x150f, 0xa186, 0x003c, 0x0040,
-       0x1515, 0xa482, 0x0064, 0x0048, 0x151f, 0x0078, 0x1519, 0xa482,
-       0x0050, 0x0048, 0x151f, 0x0078, 0x1519, 0xa482, 0x0043, 0x0048,
-       0x151f, 0x71c4, 0x71c6, 0x027f, 0x72ca, 0x0078, 0x127d, 0x6a0a,
-       0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4,
-       0x0078, 0x1281, 0x77c4, 0x1078, 0x1973, 0x2091, 0x8000, 0x6a14,
-       0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708,
-       0x0078, 0x1281, 0x70c4, 0x794c, 0x784e, 0x0078, 0x1283, 0x71c4,
-       0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8, 0x127c, 0x1078, 0x230a,
-       0x0078, 0x1281, 0x77c4, 0x1078, 0x1973, 0x2091, 0x8000, 0x6a08,
-       0xa295, 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282,
-       0x77c4, 0x1078, 0x1973, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9,
-       0x6a0a, 0x6804, 0xa005, 0x0040, 0x1567, 0x1078, 0x21d2, 0x2091,
-       0x8001, 0x2708, 0x0078, 0x1282, 0x77c4, 0x1078, 0x1973, 0x2091,
-       0x8000, 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040,
-       0x157b, 0x1078, 0x21d2, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282,
-       0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091,
-       0x8000, 0x1078, 0x1980, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078,
-       0x1282, 0x77c4, 0x72c8, 0x73cc, 0x77c6, 0x72ca, 0x73ce, 0x1078,
-       0x19e1, 0x00c0, 0x15a9, 0x6818, 0xa005, 0x0040, 0x15a9, 0x2708,
-       0x1078, 0x231a, 0x00c0, 0x15a9, 0x7817, 0x0015, 0x2091, 0x8001,
-       0x007c, 0x2091, 0x8001, 0x0078, 0x1284, 0x77c4, 0x77c6, 0x2041,
-       0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
-       0x1980, 0x2061, 0x5140, 0x606f, 0x0003, 0x6782, 0x6093, 0x000f,
-       0x6073, 0x0000, 0x7817, 0x0016, 0x1078, 0x21d2, 0x2091, 0x8001,
-       0x007c, 0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091,
-       0x8000, 0x2061, 0x5140, 0x606f, 0x0002, 0x6073, 0x0000, 0x6782,
-       0x6093, 0x000f, 0x7817, 0x0017, 0x1078, 0x21d2, 0x2091, 0x8001,
-       0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x2091, 0x8000,
-       0x1078, 0x1980, 0x70c8, 0x6836, 0x8738, 0xa784, 0x001f, 0x00c0,
-       0x15e8, 0x2091, 0x8001, 0x007c, 0x78cc, 0xa084, 0x0003, 0x00c0,
-       0x1618, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
-       0x0008, 0x1078, 0x1973, 0x2091, 0x8000, 0x6808, 0xa80d, 0x690a,
-       0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1601, 0xa7bc,
-       0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1601,
-       0x2091, 0x8000, 0x2069, 0x0100, 0x6830, 0xa084, 0x0040, 0x0040,
-       0x1641, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004,
-       0x0040, 0x162e, 0x0070, 0x162e, 0x0078, 0x1625, 0x684b, 0x0009,
-       0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040, 0x163b, 0x0070,
-       0x163b, 0x0078, 0x1632, 0x20a9, 0x00fa, 0x0070, 0x1641, 0x0078,
-       0x163d, 0x2079, 0x5100, 0x7817, 0x0018, 0x2061, 0x5140, 0x606f,
-       0x0001, 0x6073, 0x0000, 0x6093, 0x000f, 0x78cc, 0xa085, 0x0002,
-       0x78ce, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, 0x0048, 0x2091,
-       0x8001, 0x007c, 0x78cc, 0xa084, 0xfffd, 0x78ce, 0xa084, 0x0001,
-       0x00c0, 0x1664, 0x1078, 0x1a2b, 0x71c4, 0x71c6, 0x794a, 0x007c,
-       0x1078, 0x1b53, 0x00c0, 0x129c, 0x75d8, 0x74dc, 0x75da, 0x74de,
-       0x0078, 0x1675, 0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc,
-       0x71c6, 0x73ca, 0x72ce, 0x2079, 0x5100, 0x2091, 0x8000, 0x1078,
-       0x192e, 0x2091, 0x8001, 0x0040, 0x172c, 0x20a9, 0x0005, 0x20a1,
-       0x5118, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0020,
-       0x1078, 0x1929, 0x0040, 0x1698, 0x1078, 0x1948, 0x0078, 0x172c,
-       0x6004, 0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x16fb, 0x0c7e,
-       0x2c68, 0x2091, 0x8000, 0x1078, 0x192e, 0x2091, 0x8001, 0x0040,
-       0x16cc, 0x2c00, 0x689e, 0x8109, 0x00c0, 0x16a0, 0x609f, 0x0000,
-       0x0c7f, 0x0c7e, 0x7218, 0x731c, 0x7420, 0x7524, 0x2c68, 0x689c,
-       0xa065, 0x0040, 0x16fa, 0x2009, 0x0020, 0x1078, 0x1929, 0x00c0,
-       0x16e3, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0002, 0x00c0, 0x16cc,
-       0x2d00, 0x6002, 0x0078, 0x16b2, 0x0c7f, 0x0c7e, 0x609c, 0x2060,
-       0x1078, 0x19b3, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009,
-       0x000c, 0x6008, 0xa085, 0x0200, 0x600a, 0x1078, 0x1924, 0x1078,
-       0x1948, 0x0078, 0x172c, 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078,
-       0x19b3, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009, 0x000c,
-       0x6007, 0x0103, 0x601b, 0x0003, 0x1078, 0x1924, 0x1078, 0x1948,
-       0x0078, 0x172c, 0x0c7f, 0x74c4, 0x73c8, 0x72cc, 0x6014, 0x2091,
-       0x8000, 0x7817, 0x0012, 0x0e7e, 0x2071, 0x5140, 0x706f, 0x0005,
-       0x7073, 0x0000, 0x7376, 0x727a, 0x747e, 0x7082, 0x7087, 0x0000,
-       0x2c00, 0x708a, 0x708f, 0x0000, 0xa02e, 0x2530, 0x611c, 0x61a2,
-       0xa184, 0x0060, 0x0040, 0x171e, 0x1078, 0x47c2, 0x0e7f, 0x6596,
-       0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x1078,
-       0x21d2, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1287,
-       0x20a9, 0x0005, 0x2099, 0x5118, 0x2091, 0x8000, 0x530a, 0x2091,
-       0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
-       0x0000, 0x007c, 0x71c4, 0x70c7, 0x0000, 0x7906, 0x0078, 0x1284,
-       0x71c4, 0x71c6, 0x2168, 0x0078, 0x174f, 0x2069, 0x1000, 0x690c,
-       0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, 0x1751, 0xa285,
-       0x0000, 0x00c0, 0x175f, 0x70c3, 0x4000, 0x0078, 0x1761, 0x70c3,
-       0x4003, 0x70ca, 0x0078, 0x1287, 0x2011, 0x5167, 0x220c, 0x70c4,
-       0x8003, 0x0048, 0x1771, 0x1078, 0x3b7f, 0xa184, 0x7fff, 0x0078,
-       0x1775, 0x1078, 0x3b72, 0xa185, 0x8000, 0x2012, 0x0078, 0x1283,
-       0x71c4, 0x1078, 0x3b69, 0x6100, 0x2001, 0x5167, 0x2004, 0xa084,
-       0x8000, 0xa10d, 0x6204, 0x6308, 0x0078, 0x1281, 0x79e4, 0x0078,
-       0x1283, 0x71c4, 0x71c6, 0x2198, 0x20a1, 0x0042, 0x20a9, 0x0004,
-       0x53a3, 0x21a0, 0x2099, 0x0042, 0x20a9, 0x0004, 0x53a3, 0x0078,
-       0x1284, 0x70c4, 0x2068, 0x2079, 0x5100, 0x2091, 0x8000, 0x1078,
-       0x192e, 0x2091, 0x8001, 0x0040, 0x1825, 0x6007, 0x0001, 0x600b,
-       0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c, 0x000f,
-       0xa284, 0x00f0, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x6016,
-       0xa284, 0x0800, 0x0040, 0x17c0, 0x601b, 0x000a, 0x0078, 0x17c6,
-       0xa284, 0x1000, 0x0040, 0x17c6, 0x601b, 0x000c, 0xa284, 0x0300,
-       0x0040, 0x17cf, 0x602b, 0x0001, 0x8004, 0x8004, 0x8004, 0xa085,
-       0x0001, 0x601e, 0x6023, 0x0000, 0x6027, 0x0000, 0xa284, 0x0400,
-       0x0040, 0x17dc, 0x602b, 0x0000, 0x20a9, 0x0006, 0xac80, 0x000b,
-       0x20a0, 0xad80, 0x0005, 0x2098, 0x53a3, 0xa284, 0x0300, 0x00c0,
-       0x17f1, 0x6046, 0x604a, 0x604e, 0x6052, 0x6096, 0x609a, 0x0078,
-       0x17fb, 0x6800, 0x6046, 0x6804, 0x604a, 0x6e08, 0x664e, 0x6d0c,
-       0x6552, 0x6596, 0x669a, 0x6014, 0x2091, 0x8000, 0x7817, 0x0042,
-       0x2c08, 0x2061, 0x5140, 0x606f, 0x0005, 0x6073, 0x0000, 0x6077,
-       0x0000, 0x607b, 0x0000, 0x607f, 0x0000, 0x6082, 0x618a, 0xa284,
-       0x0400, 0x608e, 0x2091, 0x8001, 0x0e7e, 0x2071, 0x0020, 0x7007,
-       0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x0e7f, 0x2091, 0x8000,
-       0x1078, 0x21d2, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078,
-       0x1287, 0x0c7e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2091, 0x8000, 0x2071,
-       0x5140, 0x2079, 0x0100, 0x2061, 0x0010, 0x70a0, 0xa06d, 0x0040,
-       0x18b1, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0007, 0x0040, 0x1844,
-       0xa286, 0x000f, 0x00c0, 0x18b1, 0x691c, 0xa184, 0x0080, 0x00c0,
-       0x18b1, 0x6824, 0xa18c, 0xff00, 0xa085, 0x0019, 0x6826, 0x71b0,
-       0x81ff, 0x0040, 0x1867, 0x0d7e, 0x2069, 0x0020, 0x6807, 0x0010,
-       0x6908, 0x6808, 0xa106, 0x00c0, 0x1858, 0x690c, 0x680c, 0xa106,
-       0x00c0, 0x185d, 0xa184, 0x00ff, 0x00c0, 0x185d, 0x0d7f, 0x78b8,
-       0xa084, 0x801f, 0x00c0, 0x1867, 0x7848, 0xa085, 0x000c, 0x784a,
-       0x71b0, 0x81ff, 0x0040, 0x188a, 0x70b3, 0x0000, 0x0d7e, 0x2069,
-       0x0020, 0x6807, 0x0018, 0x6804, 0xa084, 0x0008, 0x00c0, 0x187b,
-       0x6807, 0x0008, 0x6804, 0xa084, 0x0008, 0x00c0, 0x1882, 0x6807,
-       0x0002, 0x0d7f, 0x61c4, 0x62c8, 0x63cc, 0x61c6, 0x62ca, 0x63ce,
-       0x0e7e, 0x2071, 0x5100, 0x7266, 0x736a, 0xae80, 0x0019, 0x0e7f,
-       0x7848, 0xa084, 0x000c, 0x00c0, 0x1898, 0x1078, 0x46db, 0x78a3,
-       0x0000, 0x7858, 0xa084, 0xedff, 0x785a, 0x70b4, 0xa080, 0x00df,
-       0x781a, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x0078,
-       0x1284, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x2001,
-       0x4005, 0x0078, 0x1286, 0x7980, 0x71c6, 0x71c4, 0xa182, 0x0003,
-       0x00c8, 0x127c, 0x7982, 0x0078, 0x1284, 0x7980, 0x71c6, 0x0078,
-       0x1284, 0x7974, 0x71c6, 0x71c4, 0x7976, 0x7978, 0x71ca, 0x71c8,
-       0x797a, 0x797c, 0x71ce, 0x71cc, 0x797e, 0x0078, 0x1284, 0x7974,
-       0x71c6, 0x7978, 0x71ca, 0x797c, 0x71ce, 0x0078, 0x1284, 0x7900,
-       0x71c6, 0x71c4, 0x7902, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
-       0x0048, 0x18ee, 0x0038, 0x18f0, 0x0078, 0x18fa, 0x00a8, 0x18fa,
-       0xa18c, 0x0001, 0x00c0, 0x18f8, 0x20b9, 0x2222, 0x0078, 0x18fa,
-       0x20b9, 0x1212, 0x0078, 0x1284, 0x7900, 0x71c6, 0x0078, 0x1284,
-       0x2009, 0x5174, 0x2104, 0x70c6, 0x70c4, 0x200a, 0x0078, 0x1284,
-       0x2009, 0x5174, 0x2104, 0x70c6, 0x0078, 0x1284, 0x71c4, 0x8107,
-       0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8, 0x5380, 0x6a14,
-       0xd2b4, 0x0040, 0x191f, 0x2011, 0x0001, 0x0078, 0x1921, 0x2011,
-       0x0000, 0x6b0c, 0x0078, 0x1281, 0xac80, 0x0001, 0x1078, 0x1b0f,
-       0x007c, 0xac80, 0x0001, 0x1078, 0x1aaf, 0x007c, 0x7850, 0xa065,
-       0x0040, 0x1936, 0x2c04, 0x7852, 0x2063, 0x0000, 0x007c, 0x0f7e,
-       0x2079, 0x5100, 0x7850, 0xa06d, 0x0040, 0x1946, 0x2d04, 0x7852,
-       0x6803, 0x0000, 0x6807, 0x0000, 0x680b, 0x0000, 0x0f7f, 0x007c,
-       0x2091, 0x8000, 0x0f7e, 0x2079, 0x5100, 0x7850, 0x2062, 0x2c00,
-       0xa005, 0x00c0, 0x1955, 0x1078, 0x23eb, 0x7852, 0x0f7f, 0x2091,
-       0x8001, 0x007c, 0x0f7e, 0x2079, 0x5100, 0x7850, 0x206a, 0x2d00,
-       0x7852, 0x0f7f, 0x007c, 0x2011, 0x7800, 0x7a52, 0x7bec, 0x8319,
-       0x0040, 0x1970, 0xa280, 0x0031, 0x2012, 0x2010, 0x0078, 0x1967,
-       0x2013, 0x0000, 0x007c, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f,
-       0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e8, 0x5400, 0x007c,
-       0x1078, 0x1973, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084,
-       0xffef, 0xa80d, 0x690a, 0x2009, 0x5152, 0x210c, 0x6804, 0xa005,
-       0x0040, 0x19b2, 0xa116, 0x00c0, 0x199d, 0x2060, 0x6000, 0x6806,
-       0x017e, 0x200b, 0x0000, 0x0078, 0x19a0, 0x2009, 0x0000, 0x017e,
-       0x6804, 0xa065, 0x0040, 0x19af, 0x6000, 0x6806, 0x1078, 0x19c0,
-       0x1078, 0x1c5f, 0x6810, 0x8001, 0x6812, 0x00c0, 0x19a0, 0x017f,
-       0x6902, 0x6906, 0x007c, 0xa065, 0x0040, 0x19bf, 0x609c, 0x609f,
-       0x0000, 0x2008, 0x1078, 0x1948, 0x2100, 0x0078, 0x19b3, 0x007c,
-       0x6007, 0x0103, 0x608f, 0x0000, 0x20a9, 0x001c, 0xac80, 0x0005,
-       0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828, 0x601a, 0x682c, 0x6022,
-       0x007c, 0x0e7e, 0x2071, 0x5140, 0x704c, 0xa08c, 0x0200, 0x00c0,
-       0x19df, 0xa088, 0x5180, 0x2d0a, 0x8000, 0x704e, 0xa006, 0x0e7f,
-       0x007c, 0x1078, 0x1973, 0x2091, 0x8000, 0x6804, 0x781e, 0xa065,
-       0x0040, 0x1a2a, 0x0078, 0x19f2, 0x2c00, 0x781e, 0x6000, 0xa065,
-       0x0040, 0x1a2a, 0x600c, 0xa306, 0x00c0, 0x19ec, 0x6010, 0xa206,
-       0x00c0, 0x19ec, 0x2c28, 0x2001, 0x5152, 0x2004, 0xac06, 0x00c0,
-       0x1a03, 0x0078, 0x1a28, 0x6804, 0xac06, 0x00c0, 0x1a10, 0x6000,
-       0xa065, 0x6806, 0x00c0, 0x1a1a, 0x6803, 0x0000, 0x0078, 0x1a1a,
-       0x6400, 0x781c, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1a1a,
-       0x2c00, 0x6802, 0x2560, 0x1078, 0x19c0, 0x601b, 0x0005, 0x6023,
-       0x0020, 0x1078, 0x1c5f, 0x6810, 0x8001, 0x1050, 0x23eb, 0x6812,
-       0xa085, 0xffff, 0x007c, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049,
-       0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x1980, 0x8738,
-       0xa784, 0x001f, 0x00c0, 0x1a35, 0xa7bc, 0xff00, 0x873f, 0x8738,
-       0x873f, 0xa784, 0x0f00, 0x00c0, 0x1a35, 0x2091, 0x8001, 0x007c,
-       0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1a59, 0x2091,
-       0x8000, 0x78e0, 0x78e3, 0x0000, 0x2091, 0x8001, 0xa005, 0x00c0,
-       0x1a5a, 0x007c, 0xa08c, 0xfff0, 0x0040, 0x1a60, 0x1078, 0x23eb,
-       0x0079, 0x1a62, 0x1a72, 0x1a75, 0x1a7b, 0x1a7f, 0x1a73, 0x1a83,
-       0x1a89, 0x1a73, 0x1a73, 0x1c29, 0x1c4d, 0x1c51, 0x1a73, 0x1a73,
-       0x1a73, 0x1a73, 0x007c, 0x1078, 0x23eb, 0x1078, 0x1a2b, 0x2001,
-       0x8001, 0x0078, 0x1c57, 0x2001, 0x8003, 0x0078, 0x1c57, 0x2001,
-       0x8004, 0x0078, 0x1c57, 0x1078, 0x1a2b, 0x2001, 0x8006, 0x0078,
-       0x1c57, 0x2001, 0x8007, 0x0078, 0x1c57, 0x2030, 0x2138, 0xa782,
-       0x0021, 0x0048, 0x1a95, 0x2009, 0x0020, 0x2600, 0x1078, 0x1aaf,
-       0x00c0, 0x1aae, 0xa7ba, 0x0020, 0x0048, 0x1aad, 0x0040, 0x1aad,
-       0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1,
-       0x0000, 0xa5a9, 0x0000, 0x0078, 0x1a8f, 0xa006, 0x007c, 0x81ff,
-       0x0040, 0x1aea, 0x2099, 0x0030, 0x20a0, 0x700c, 0xa084, 0x00ff,
-       0x0040, 0x1ac1, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
-       0x1abc, 0x21a8, 0x7017, 0x0000, 0x810b, 0x7112, 0x721a, 0x731e,
-       0x7422, 0x7526, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007, 0x0001,
-       0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x1ade, 0x2009,
-       0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x1ad0, 0x7008, 0x800b,
-       0x00c8, 0x1ad0, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x00c0, 0x1aea,
-       0x53a5, 0xa006, 0x7003, 0x0000, 0x007c, 0x2030, 0x2138, 0xa782,
-       0x0021, 0x0048, 0x1af5, 0x2009, 0x0020, 0x2600, 0x1078, 0x1b0f,
-       0x00c0, 0x1b0e, 0xa7ba, 0x0020, 0x0048, 0x1b0d, 0x0040, 0x1b0d,
-       0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1,
-       0x0000, 0xa5a9, 0x0000, 0x0078, 0x1aef, 0xa006, 0x007c, 0x81ff,
-       0x0040, 0x1b50, 0x2098, 0x20a1, 0x0030, 0x700c, 0xa084, 0x00ff,
-       0x0040, 0x1b21, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
-       0x1b1c, 0x21a8, 0x7017, 0x0000, 0x810b, 0x7112, 0x721a, 0x731e,
-       0x7422, 0x7526, 0x780c, 0xa085, 0x0000, 0x7002, 0x53a6, 0x7007,
-       0x0001, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x1b3f,
-       0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x1b31, 0x7010,
-       0xa084, 0xf000, 0x0040, 0x1b48, 0x7007, 0x0008, 0x0078, 0x1b4c,
-       0x7108, 0x8103, 0x00c8, 0x1b31, 0x7007, 0x0002, 0xa184, 0x01e0,
-       0x7003, 0x0000, 0x007c, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0004,
-       0x00c8, 0x1b5c, 0x0078, 0x1b5f, 0xa006, 0x0078, 0x1b61, 0xa085,
-       0x0001, 0x007c, 0x0e7e, 0x2071, 0x5100, 0x2d08, 0x7058, 0x6802,
-       0xa005, 0x00c0, 0x1b6c, 0x715e, 0x715a, 0x0e7f, 0x007c, 0x2c08,
-       0x7858, 0x6002, 0xa005, 0x00c0, 0x1b76, 0x795e, 0x795a, 0x007c,
-       0x2091, 0x8000, 0x6003, 0x0000, 0x2c08, 0x785c, 0xa065, 0x00c0,
-       0x1b84, 0x795a, 0x0078, 0x1b85, 0x6102, 0x795e, 0x2091, 0x8001,
-       0x1078, 0x21ef, 0x007c, 0x0e7e, 0x2071, 0x5100, 0x7058, 0xa06d,
-       0x0040, 0x1b99, 0x6800, 0x705a, 0xa005, 0x00c0, 0x1b98, 0x705e,
-       0x8dff, 0x0e7f, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x5100,
-       0xaf80, 0x0016, 0x2060, 0x6000, 0xa005, 0x0040, 0x1bc9, 0x2068,
-       0x6814, 0xa306, 0x00c0, 0x1bb2, 0x6828, 0xa084, 0x00ff, 0xa406,
-       0x0040, 0x1bb5, 0x2d60, 0x0078, 0x1ba3, 0x6800, 0xa005, 0x6002,
-       0x00c0, 0x1bc1, 0xaf80, 0x0016, 0xac06, 0x0040, 0x1bc0, 0x2c00,
-       0x785e, 0x0d7e, 0x689c, 0xa005, 0x0040, 0x1bc8, 0x1078, 0x19b3,
-       0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x0d7e, 0x0c7e,
-       0x0f7e, 0x2079, 0x5100, 0xaf80, 0x0016, 0x2060, 0x6000, 0xa005,
-       0x0040, 0x1bf8, 0x2068, 0x6814, 0xa084, 0x00ff, 0xa306, 0x0040,
-       0x1be4, 0x2d60, 0x0078, 0x1bd6, 0x6800, 0xa005, 0x6002, 0x00c0,
-       0x1bf0, 0xaf80, 0x0016, 0xac06, 0x0040, 0x1bef, 0x2c00, 0x785e,
-       0x0d7e, 0x689c, 0xa005, 0x0040, 0x1bf7, 0x1078, 0x19b3, 0x007f,
-       0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e,
-       0x2079, 0x5100, 0xaf80, 0x0016, 0x2060, 0x6000, 0xa06d, 0x0040,
-       0x1c24, 0x6814, 0xa306, 0x0040, 0x1c10, 0x2d60, 0x0078, 0x1c05,
-       0x6800, 0xa005, 0x6002, 0x00c0, 0x1c1c, 0xaf80, 0x0016, 0xac06,
-       0x0040, 0x1c1b, 0x2c00, 0x785e, 0x0d7e, 0x689c, 0xa005, 0x0040,
-       0x1c23, 0x1078, 0x19b3, 0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005,
-       0x007c, 0x2091, 0x8000, 0x2069, 0x5140, 0x6800, 0xa086, 0x0000,
-       0x0040, 0x1c37, 0x2091, 0x8001, 0x78e3, 0x0009, 0x007c, 0x6880,
-       0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010,
-       0x1078, 0x1980, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1c40, 0x2091,
-       0x8001, 0x2001, 0x800a, 0x0078, 0x1c57, 0x2001, 0x800c, 0x0078,
-       0x1c57, 0x1078, 0x1a2b, 0x2001, 0x800d, 0x0078, 0x1c57, 0x70c2,
-       0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x4080, 0x007c, 0x6004,
-       0x2c08, 0x2063, 0x0000, 0x7884, 0x8000, 0x7886, 0x7888, 0xa005,
-       0x798a, 0x0040, 0x1c6e, 0x2c02, 0x0078, 0x1c6f, 0x798e, 0x007c,
-       0x6807, 0x0103, 0x0c7e, 0x2061, 0x5100, 0x2d08, 0x206b, 0x0000,
-       0x6084, 0x8000, 0x6086, 0x6088, 0xa005, 0x618a, 0x0040, 0x1c83,
-       0x2d02, 0x0078, 0x1c84, 0x618e, 0x0c7f, 0x007c, 0x1078, 0x1c97,
-       0x0040, 0x1c96, 0x0c7e, 0x609c, 0xa065, 0x0040, 0x1c91, 0x1078,
-       0x19b3, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1948, 0x007c, 0x788c,
-       0xa065, 0x0040, 0x1ca9, 0x2091, 0x8000, 0x7884, 0x8001, 0x7886,
-       0x2c04, 0x788e, 0xa005, 0x00c0, 0x1ca7, 0x788a, 0x8000, 0x2091,
-       0x8001, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e,
-       0x00c8, 0x1cb3, 0xa200, 0x0070, 0x1cb7, 0x0078, 0x1cae, 0x8086,
-       0x818e, 0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x1cdd,
-       0xa11a, 0x00c8, 0x1cdd, 0x8213, 0x818d, 0x0048, 0x1cce, 0xa11a,
-       0x00c8, 0x1ccf, 0x0070, 0x1cd5, 0x0078, 0x1cc3, 0xa11a, 0x2308,
-       0x8210, 0x0070, 0x1cd5, 0x0078, 0x1cc3, 0x007e, 0x3200, 0xa084,
-       0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085,
-       0x0800, 0x0078, 0x1cd9, 0x7994, 0x70d0, 0xa106, 0x0040, 0x1d51,
-       0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x1d51,
-       0x7008, 0x7208, 0xa206, 0x00c0, 0x1d51, 0xa286, 0x0008, 0x00c0,
-       0x1d51, 0x2071, 0x0010, 0x1078, 0x192e, 0x0040, 0x1d51, 0x7a9c,
-       0x7b98, 0x7ca4, 0x7da0, 0xa184, 0xff00, 0x0040, 0x1d1f, 0x2031,
-       0x0000, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b,
-       0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x2100, 0xa210, 0x2600,
-       0xa319, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0078, 0x1d29, 0x8107,
-       0x8004, 0x8004, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
-       0x0000, 0x2009, 0x0020, 0x1078, 0x1929, 0x2091, 0x8001, 0x0040,
-       0x1d48, 0x1078, 0x1948, 0x78a8, 0x8000, 0x78aa, 0xa086, 0x0002,
-       0x00c0, 0x1d51, 0x2091, 0x8000, 0x78e3, 0x0002, 0x78ab, 0x0000,
-       0x78cc, 0xa085, 0x0003, 0x78ce, 0x2091, 0x8001, 0x0078, 0x1d51,
-       0x78ab, 0x0000, 0x1078, 0x20ac, 0x6004, 0xa084, 0x000f, 0x0079,
-       0x1d56, 0x2071, 0x0010, 0x2091, 0x8001, 0x007c, 0x1d66, 0x1d88,
-       0x1dae, 0x1d66, 0x1dcb, 0x1d75, 0x1f2c, 0x1f47, 0x1d66, 0x1d82,
-       0x1da8, 0x1e13, 0x1e82, 0x1ed2, 0x1ee4, 0x1f43, 0x2039, 0x0400,
-       0x78dc, 0xa705, 0x78de, 0x6008, 0xa705, 0x600a, 0x1078, 0x1fc7,
-       0x609c, 0x78da, 0x1078, 0x2094, 0x007c, 0x78dc, 0xa084, 0x0100,
-       0x0040, 0x1d7c, 0x0078, 0x1d66, 0x601c, 0xa085, 0x0080, 0x601e,
-       0x0078, 0x1d8f, 0x1078, 0x1b53, 0x00c0, 0x1d66, 0x1078, 0x20c6,
-       0x78dc, 0xa084, 0x0100, 0x0040, 0x1d8f, 0x0078, 0x1d66, 0x78df,
-       0x0000, 0x6004, 0x8007, 0xa084, 0x00ff, 0x78d2, 0x8001, 0x609f,
-       0x0000, 0x0040, 0x1da5, 0x1078, 0x1fc7, 0x0040, 0x1da5, 0x78dc,
-       0xa085, 0x0100, 0x78de, 0x0078, 0x1da7, 0x1078, 0x1feb, 0x007c,
-       0x1078, 0x1b53, 0x00c0, 0x1d66, 0x1078, 0x20c2, 0x78dc, 0xa08c,
-       0x0e00, 0x00c0, 0x1db7, 0xa084, 0x0100, 0x00c0, 0x1db9, 0x0078,
-       0x1d66, 0x1078, 0x1fc7, 0x00c0, 0x1dca, 0x6104, 0xa18c, 0x00ff,
-       0xa186, 0x0007, 0x0040, 0x1f84, 0xa186, 0x000f, 0x0040, 0x1f84,
-       0x1078, 0x1feb, 0x007c, 0x78dc, 0xa084, 0x0100, 0x0040, 0x1dd2,
-       0x0078, 0x1d66, 0x78df, 0x0000, 0x6714, 0x2011, 0x0001, 0x20a9,
-       0x0001, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040, 0x1df5, 0x2011,
-       0x0001, 0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0040,
-       0x1df5, 0x2039, 0x0000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e,
-       0x0002, 0x0040, 0x1df5, 0x0078, 0x1e10, 0x1078, 0x1973, 0x2091,
-       0x8000, 0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084, 0xffde,
-       0x680a, 0xade8, 0x0010, 0x2091, 0x8001, 0x0070, 0x1e09, 0x0078,
-       0x1df7, 0x8211, 0x0040, 0x1e10, 0x20a9, 0x0100, 0x0078, 0x1df7,
-       0x1078, 0x1948, 0x007c, 0x2001, 0x5167, 0x2004, 0xa084, 0x8000,
-       0x0040, 0x1fac, 0x6114, 0x1078, 0x20e3, 0x6900, 0xa184, 0x0001,
-       0x0040, 0x1e34, 0x6028, 0xa084, 0x00ff, 0x00c0, 0x1fa4, 0x6800,
-       0xa084, 0x0001, 0x0040, 0x1fac, 0x6803, 0x0000, 0x680b, 0x0000,
-       0x6807, 0x0000, 0x0078, 0x1fb4, 0x2011, 0x0001, 0x6020, 0xd0f4,
-       0x0040, 0x1e3c, 0xa295, 0x0002, 0xd0c4, 0x0040, 0x1e41, 0xa295,
-       0x0008, 0xd0cc, 0x0040, 0x1e46, 0xa295, 0x0400, 0x601c, 0xa084,
-       0x0002, 0x0040, 0x1e4d, 0xa295, 0x0004, 0x602c, 0xa08c, 0x00ff,
-       0xa182, 0x0002, 0x0048, 0x1fb0, 0xa182, 0x001b, 0x00c8, 0x1fb0,
-       0x0040, 0x1fb0, 0x690e, 0x602c, 0x8007, 0xa08c, 0x00ff, 0xa182,
-       0x0002, 0x0048, 0x1fb0, 0xa182, 0x001b, 0x00c8, 0x1fb0, 0x0040,
-       0x1fb0, 0x6912, 0x6030, 0xa005, 0x00c0, 0x1e70, 0x2001, 0x001e,
-       0x8000, 0x6816, 0x6028, 0xa084, 0x00ff, 0x0040, 0x1fac, 0x6806,
-       0x6028, 0x8007, 0xa084, 0x00ff, 0x0040, 0x1fac, 0x680a, 0x6a02,
-       0x0078, 0x1fb4, 0x2001, 0x5167, 0x2004, 0xa084, 0x8000, 0x0040,
-       0x1fac, 0x6114, 0x1078, 0x20e3, 0x2091, 0x8000, 0x6a04, 0x6b08,
-       0x6418, 0xa484, 0x0003, 0x0040, 0x1ea8, 0x6128, 0xa18c, 0x00ff,
-       0x8001, 0x00c0, 0x1ea1, 0x2100, 0xa210, 0x0048, 0x1ece, 0x0078,
-       0x1ea8, 0x8001, 0x00c0, 0x1ece, 0x2100, 0xa212, 0x0048, 0x1ece,
-       0xa484, 0x000c, 0x0040, 0x1ec2, 0x6128, 0x810f, 0xa18c, 0x00ff,
-       0xa082, 0x0004, 0x00c0, 0x1eba, 0x2100, 0xa318, 0x0048, 0x1ece,
-       0x0078, 0x1ec2, 0xa082, 0x0004, 0x00c0, 0x1ece, 0x2100, 0xa31a,
-       0x0048, 0x1ece, 0x6030, 0xa005, 0x0040, 0x1ec8, 0x8000, 0x6816,
-       0x6a06, 0x6b0a, 0x2091, 0x8001, 0x0078, 0x1fb4, 0x2091, 0x8001,
-       0x0078, 0x1fb0, 0x6114, 0x1078, 0x20e3, 0x2091, 0x8000, 0x6b08,
-       0x8318, 0x0048, 0x1ee0, 0x6b0a, 0x2091, 0x8001, 0x0078, 0x1fc3,
-       0x2091, 0x8001, 0x0078, 0x1fb0, 0x6024, 0x8007, 0xa084, 0x00ff,
-       0x0040, 0x1f02, 0xa086, 0x0080, 0x00c0, 0x1f2a, 0x20a9, 0x0008,
-       0x2069, 0x7510, 0x2091, 0x8000, 0x6800, 0xa084, 0xfcff, 0x6802,
-       0xade8, 0x0008, 0x0070, 0x1efe, 0x0078, 0x1ef4, 0x2091, 0x8001,
-       0x0078, 0x1fb4, 0x6028, 0xa015, 0x0040, 0x1f2a, 0x6114, 0x1078,
-       0x20e3, 0x0d7e, 0xade8, 0x0007, 0x2091, 0x8000, 0x6800, 0xa00d,
-       0x0040, 0x1f27, 0xa206, 0x0040, 0x1f18, 0x2168, 0x0078, 0x1f0e,
-       0x0c7e, 0x2160, 0x6000, 0x6802, 0x1078, 0x1948, 0x0c7f, 0x0d7f,
-       0x6808, 0x8000, 0x680a, 0x2091, 0x8001, 0x0078, 0x1fc3, 0x2091,
-       0x8001, 0x0d7f, 0x0078, 0x1fac, 0x6114, 0x1078, 0x20e3, 0x6800,
-       0xa084, 0x0001, 0x0040, 0x1f9c, 0x2091, 0x8000, 0x6a04, 0x8210,
-       0x0048, 0x1f3f, 0x6a06, 0x2091, 0x8001, 0x0078, 0x1fc3, 0x2091,
-       0x8001, 0x0078, 0x1fb0, 0x1078, 0x1b53, 0x00c0, 0x1d66, 0x6114,
-       0x1078, 0x20e3, 0x60be, 0x60bb, 0x0000, 0x6900, 0xa184, 0x0008,
-       0x0040, 0x1f56, 0x6020, 0xa085, 0x0100, 0x6022, 0xa184, 0x0001,
-       0x0040, 0x1fac, 0xa184, 0x0100, 0x00c0, 0x1f98, 0xa184, 0x0200,
-       0x00c0, 0x1f94, 0x681c, 0xa005, 0x00c0, 0x1fa0, 0x6004, 0xa084,
-       0x00ff, 0xa086, 0x000f, 0x00c0, 0x1f6f, 0x1078, 0x20c6, 0x78df,
-       0x0000, 0x6004, 0x8007, 0xa084, 0x00ff, 0x78d2, 0x8001, 0x609f,
-       0x0000, 0x0040, 0x1f84, 0x1078, 0x1fc7, 0x0040, 0x1f84, 0x78dc,
-       0xa085, 0x0100, 0x78de, 0x007c, 0x78d7, 0x0000, 0x78db, 0x0000,
-       0x6024, 0xa084, 0xff00, 0x6026, 0x1078, 0x39de, 0x0040, 0x1ce3,
-       0x1078, 0x1b78, 0x0078, 0x1ce3, 0x2009, 0x0017, 0x0078, 0x1fb6,
-       0x2009, 0x000e, 0x0078, 0x1fb6, 0x2009, 0x0007, 0x0078, 0x1fb6,
-       0x2009, 0x0035, 0x0078, 0x1fb6, 0x2009, 0x003e, 0x0078, 0x1fb6,
-       0x2009, 0x0004, 0x0078, 0x1fb6, 0x2009, 0x0006, 0x0078, 0x1fb6,
-       0x2009, 0x0016, 0x0078, 0x1fb6, 0x2009, 0x0001, 0x6024, 0xa084,
-       0xff00, 0xa105, 0x6026, 0x2091, 0x8000, 0x1078, 0x1c5f, 0x2091,
-       0x8001, 0x0078, 0x1ce3, 0x1078, 0x1948, 0x0078, 0x1ce3, 0x78d4,
-       0xa06d, 0x00c0, 0x1fd2, 0x2c00, 0x78d6, 0x78da, 0x609f, 0x0000,
-       0x0078, 0x1fde, 0x2c00, 0x689e, 0x609f, 0x0000, 0x78d6, 0x2d00,
-       0x6002, 0x78d8, 0xad06, 0x00c0, 0x1fde, 0x6002, 0x78d0, 0x8001,
-       0x78d2, 0x00c0, 0x1fea, 0x78dc, 0xa084, 0xfeff, 0x78de, 0x78d8,
-       0x2060, 0xa006, 0x007c, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184,
-       0xe1ff, 0x601e, 0xa184, 0x0060, 0x0040, 0x1ffa, 0x0e7e, 0x1078,
-       0x47c2, 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000,
-       0x60b3, 0x0000, 0x6714, 0x1078, 0x1973, 0x2091, 0x8000, 0x60a0,
-       0xa084, 0x8000, 0x00c0, 0x2021, 0x6808, 0xa084, 0x0001, 0x0040,
-       0x2021, 0x2091, 0x8001, 0x1078, 0x19c0, 0x2091, 0x8000, 0x1078,
-       0x1c5f, 0x2091, 0x8001, 0x78d7, 0x0000, 0x78db, 0x0000, 0x0078,
-       0x2093, 0x6024, 0xa096, 0x0001, 0x00c0, 0x2028, 0x8000, 0x6026,
-       0x6a10, 0x6814, 0x2091, 0x8001, 0xa202, 0x0048, 0x2037, 0x0040,
-       0x2037, 0x2039, 0x0200, 0x1078, 0x2094, 0x0078, 0x2093, 0x2c08,
-       0x2091, 0x8000, 0x60a0, 0xa084, 0x8000, 0x0040, 0x2064, 0x6800,
-       0xa065, 0x0040, 0x2069, 0x6a04, 0x0e7e, 0x2071, 0x5140, 0x7000,
-       0xa084, 0x0001, 0x0040, 0x205e, 0x7048, 0xa206, 0x00c0, 0x205e,
-       0x6b04, 0x231c, 0x2160, 0x6302, 0x2300, 0xa005, 0x00c0, 0x2059,
-       0x6902, 0x2260, 0x6102, 0x0e7f, 0x0078, 0x2070, 0x2160, 0x6202,
-       0x6906, 0x0e7f, 0x0078, 0x2070, 0x6800, 0xa065, 0x0040, 0x2069,
-       0x6102, 0x6902, 0x00c0, 0x206d, 0x6906, 0x2160, 0x6003, 0x0000,
-       0x2160, 0x60a0, 0xa084, 0x8000, 0x0040, 0x207a, 0x6808, 0xa084,
-       0xfffc, 0x680a, 0x6810, 0x8000, 0x6812, 0x2091, 0x8001, 0x6808,
-       0xa08c, 0x0040, 0x0040, 0x2089, 0xa086, 0x0040, 0x680a, 0x1078,
-       0x19d1, 0x2091, 0x8000, 0x1078, 0x21d2, 0x2091, 0x8001, 0x78db,
-       0x0000, 0x78d7, 0x0000, 0x007c, 0x6008, 0xa705, 0x600a, 0x2091,
-       0x8000, 0x1078, 0x1c5f, 0x2091, 0x8001, 0x78d8, 0xa065, 0x0040,
-       0x20a7, 0x609c, 0x78da, 0x609f, 0x0000, 0x0078, 0x2097, 0x78d7,
-       0x0000, 0x78db, 0x0000, 0x007c, 0x7990, 0x7894, 0x8000, 0xa10a,
-       0x00c8, 0x20b3, 0xa006, 0x7896, 0x70d2, 0x7804, 0xa005, 0x0040,
-       0x20c1, 0x8001, 0x7806, 0x00c0, 0x20c1, 0x0068, 0x20c1, 0x2091,
-       0x4080, 0x007c, 0x2039, 0x20da, 0x0078, 0x20c8, 0x2039, 0x20e0,
-       0x2704, 0xa005, 0x0040, 0x20d9, 0xac00, 0x2068, 0x6b08, 0x6c0c,
-       0x6910, 0x6a14, 0x690a, 0x6a0e, 0x6b12, 0x6c16, 0x8738, 0x0078,
-       0x20c8, 0x007c, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000,
-       0x0015, 0x001b, 0x0000, 0x0c7e, 0x1078, 0x3b69, 0x2c68, 0x0c7f,
-       0x007c, 0x0010, 0x215a, 0x0068, 0x215a, 0x2029, 0x0000, 0x78cb,
-       0x0000, 0x788c, 0xa065, 0x0040, 0x2153, 0x2009, 0x5174, 0x2104,
-       0xa084, 0x0001, 0x0040, 0x2121, 0x6004, 0xa086, 0x0103, 0x00c0,
-       0x2121, 0x6018, 0xa005, 0x00c0, 0x2121, 0x6014, 0xa005, 0x00c0,
-       0x2121, 0x0d7e, 0x2069, 0x0000, 0x6818, 0xa084, 0x0001, 0x00c0,
-       0x2120, 0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b,
-       0x0001, 0x2091, 0x4080, 0x0d7f, 0x1078, 0x1c86, 0x0078, 0x2158,
-       0x0d7f, 0x1078, 0x215b, 0x0040, 0x2153, 0x6204, 0xa294, 0x00ff,
-       0xa296, 0x0003, 0x0040, 0x2133, 0x6204, 0xa296, 0x0110, 0x00c0,
-       0x2141, 0x78cb, 0x0001, 0x6204, 0xa294, 0xff00, 0x8217, 0x8211,
-       0x0040, 0x2141, 0x85ff, 0x00c0, 0x2153, 0x8210, 0xa202, 0x00c8,
-       0x2153, 0x057e, 0x1078, 0x216a, 0x057f, 0x0040, 0x214e, 0x78e0,
-       0xa086, 0x0003, 0x0040, 0x2153, 0x0078, 0x2141, 0x8528, 0x78c8,
-       0xa005, 0x0040, 0x20f1, 0x85ff, 0x0040, 0x215a, 0x2091, 0x4080,
-       0x78b0, 0x70d6, 0x007c, 0x7bac, 0x79b0, 0x70d4, 0xa102, 0x00c0,
-       0x2164, 0x2300, 0xa005, 0x007c, 0x0048, 0x2168, 0xa302, 0x007c,
-       0x8002, 0x007c, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8,
-       0x2184, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0,
-       0x21b9, 0x7008, 0x7208, 0xa206, 0x00c0, 0x21b9, 0xa286, 0x0008,
-       0x00c0, 0x21b9, 0x2071, 0x0010, 0x1078, 0x21be, 0x2009, 0x0020,
-       0x6004, 0xa086, 0x0103, 0x00c0, 0x2193, 0x6028, 0xa005, 0x00c0,
-       0x2193, 0x2009, 0x000c, 0x1078, 0x1924, 0x0040, 0x21ac, 0x78c4,
-       0x8000, 0x78c6, 0xa086, 0x0002, 0x00c0, 0x21b9, 0x2091, 0x8000,
-       0x78e3, 0x0003, 0x78c7, 0x0000, 0x78cc, 0xa085, 0x0300, 0x78ce,
-       0x2091, 0x8001, 0x0078, 0x21b9, 0x78c7, 0x0000, 0x1078, 0x1c86,
-       0x79ac, 0x78b0, 0x8000, 0xa10a, 0x00c8, 0x21b7, 0xa006, 0x78b2,
-       0xa006, 0x2071, 0x0010, 0x2091, 0x8001, 0x007c, 0x8107, 0x8004,
-       0x8004, 0x7ab8, 0x7bb4, 0x7cc0, 0x7dbc, 0xa210, 0xa399, 0x0000,
-       0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x2009, 0x515b, 0x2091,
-       0x8000, 0x200a, 0x0f7e, 0x0e7e, 0x2071, 0x5140, 0x7000, 0xa086,
-       0x0000, 0x00c0, 0x21ec, 0x2009, 0x5112, 0x2104, 0xa005, 0x00c0,
-       0x21ec, 0x2079, 0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x21ec,
-       0x0018, 0x21ec, 0x781b, 0x004b, 0x0e7f, 0x0f7f, 0x007c, 0x0f7e,
-       0x0e7e, 0x2071, 0x5140, 0x2091, 0x8000, 0x7000, 0xa086, 0x0000,
-       0x00c0, 0x2205, 0x2079, 0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0,
-       0x2205, 0x0018, 0x2205, 0x781b, 0x004d, 0x2091, 0x8001, 0x0e7f,
-       0x0f7f, 0x007c, 0x127e, 0x2091, 0x2300, 0x2071, 0x5140, 0x2079,
-       0x0100, 0x784b, 0x000f, 0x0098, 0x2218, 0x7838, 0x0078, 0x2211,
-       0x20a9, 0x0040, 0x7800, 0xa082, 0x0004, 0x0048, 0x2221, 0x20a9,
-       0x0060, 0x789b, 0x0000, 0x78af, 0x0000, 0x78af, 0x0000, 0x0070,
-       0x222b, 0x0078, 0x2223, 0x7800, 0xa082, 0x0004, 0x0048, 0x223a,
-       0x70b7, 0x0096, 0x2019, 0x4ee7, 0x1078, 0x2276, 0x702f, 0x8001,
-       0x0078, 0x2246, 0x70b7, 0x0000, 0x2019, 0x4d5f, 0x1078, 0x2276,
-       0x2019, 0x4d9e, 0x1078, 0x2276, 0x702f, 0x8000, 0x7003, 0x0000,
-       0x1078, 0x237f, 0x7004, 0xa084, 0x000f, 0x017e, 0x2009, 0x04fd,
-       0x210c, 0xa18a, 0x0005, 0x0048, 0x225b, 0x0038, 0x2261, 0xa085,
-       0x6280, 0x0078, 0x2263, 0x0028, 0x2261, 0xa085, 0x6280, 0x0078,
-       0x2263, 0xa085, 0x62c0, 0x017f, 0x7806, 0x780f, 0xb204, 0x7843,
-       0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x7047, 0x0008, 0x7053,
-       0x517f, 0x704f, 0x0000, 0x127f, 0x2000, 0x007c, 0x137e, 0x147e,
-       0x157e, 0x047e, 0x20a1, 0x012b, 0x2304, 0xa005, 0x789a, 0x0040,
-       0x2296, 0x8318, 0x2324, 0x8318, 0x2398, 0x24a8, 0xa484, 0xff00,
-       0x0040, 0x228e, 0xa482, 0x0100, 0x20a9, 0x0100, 0x2020, 0x53a6,
-       0xa005, 0x00c0, 0x2285, 0x3318, 0x0078, 0x227c, 0x047f, 0x157f,
-       0x147f, 0x137f, 0x007c, 0xa18c, 0x000f, 0x2011, 0x0101, 0x2204,
-       0xa084, 0xfff0, 0xa105, 0x2012, 0x1078, 0x237f, 0x007c, 0x2011,
-       0x0101, 0x20a9, 0x0009, 0x810b, 0x0070, 0x22b0, 0x0078, 0x22ab,
-       0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c,
-       0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x0070, 0x22c1, 0x0078,
-       0x22bc, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a,
-       0x007c, 0x2011, 0x0101, 0x20a9, 0x000c, 0x810b, 0x0070, 0x22d2,
-       0x0078, 0x22cd, 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff, 0xa105,
-       0x2012, 0x007c, 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf, 0xa105,
-       0x2012, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061,
-       0x0100, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x8103, 0x8003,
-       0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa084,
-       0xffdf, 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022,
-       0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae,
-       0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061,
-       0x0100, 0x609a, 0x60a4, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018,
-       0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005,
-       0x0040, 0x235d, 0x2061, 0x7500, 0x1078, 0x2365, 0x0040, 0x2349,
-       0x20a9, 0x0000, 0x2061, 0x7400, 0x0c7e, 0x1078, 0x2365, 0x0040,
-       0x2339, 0x0c7f, 0x8c60, 0x0070, 0x2337, 0x0078, 0x232c, 0x0078,
-       0x235d, 0x007f, 0xa082, 0x7400, 0x2071, 0x5140, 0x7086, 0x7182,
-       0x2001, 0x0004, 0x706e, 0x7093, 0x000f, 0x1078, 0x21cd, 0x0078,
-       0x2359, 0x60c0, 0xa005, 0x00c0, 0x235d, 0x2071, 0x5140, 0x7182,
-       0x2c00, 0x708a, 0x2001, 0x0006, 0x706e, 0x7093, 0x000f, 0x1078,
-       0x21cd, 0x2001, 0x0000, 0x0078, 0x235f, 0x2001, 0x0001, 0x2091,
-       0x8001, 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2c04, 0xa005, 0x0040,
-       0x237c, 0x2060, 0x600c, 0xa306, 0x00c0, 0x2379, 0x6010, 0xa206,
-       0x00c0, 0x2379, 0x6014, 0xa106, 0x00c0, 0x2379, 0xa006, 0x0078,
-       0x237e, 0x6000, 0x0078, 0x2366, 0xa085, 0x0001, 0x007c, 0x2011,
-       0x5141, 0x220c, 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204, 0xa084,
-       0x0100, 0x0040, 0x2395, 0x2021, 0xff04, 0x2122, 0x810b, 0x810b,
-       0x810b, 0x810b, 0xa18d, 0x0f00, 0x2104, 0x007c, 0x0e7e, 0x68e4,
-       0xa08c, 0x0020, 0x0040, 0x23e9, 0xa084, 0x0006, 0x00c0, 0x23e9,
-       0x6014, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0f0,
-       0x5380, 0x7004, 0xa084, 0x000a, 0x00c0, 0x23e9, 0x7108, 0xa194,
-       0xff00, 0x0040, 0x23e9, 0xa18c, 0x00ff, 0x2001, 0x000c, 0xa106,
-       0x0040, 0x23d0, 0x2001, 0x0012, 0xa106, 0x0040, 0x23d4, 0x2001,
-       0x0014, 0xa106, 0x0040, 0x23d8, 0x2001, 0x0019, 0xa106, 0x0040,
-       0x23dc, 0x2001, 0x0032, 0xa106, 0x0040, 0x23e0, 0x0078, 0x23e4,
-       0x2009, 0x0012, 0x0078, 0x23e6, 0x2009, 0x0014, 0x0078, 0x23e6,
-       0x2009, 0x0019, 0x0078, 0x23e6, 0x2009, 0x0020, 0x0078, 0x23e6,
-       0x2009, 0x003f, 0x0078, 0x23e6, 0x2011, 0x0000, 0x2100, 0xa205,
-       0x700a, 0x0e7f, 0x007c, 0x0068, 0x23eb, 0x2091, 0x8000, 0x2071,
-       0x0000, 0x007e, 0x7018, 0xa084, 0x0001, 0x00c0, 0x23f2, 0x007f,
-       0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db,
-       0x0741, 0x70df, 0x0000, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091,
-       0x4080, 0x0078, 0x2409, 0x107e, 0x007e, 0x127e, 0x2091, 0x2300,
-       0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x77c2, 0x74c6, 0x76ca, 0x75ce,
-       0xa594, 0x003f, 0xa49c, 0x0003, 0xa484, 0x000f, 0x0079, 0x2420,
-       0x2432, 0x2432, 0x2432, 0x276c, 0x393b, 0x2430, 0x2461, 0x246b,
-       0x2430, 0x2430, 0x2430, 0x2430, 0x2430, 0x2430, 0x2430, 0x2430,
-       0x1078, 0x23eb, 0x8507, 0xa084, 0x001f, 0x0079, 0x2437, 0x2475,
-       0x276c, 0x2926, 0x2a23, 0x2a4b, 0x2ced, 0x2f98, 0x2fdb, 0x3026,
-       0x30ab, 0x3163, 0x320c, 0x2461, 0x2848, 0x2f6d, 0x2457, 0x3cc8,
-       0x3ce8, 0x3eae, 0x3eba, 0x3f8f, 0x2457, 0x2457, 0x4062, 0x4066,
-       0x3cc6, 0x2457, 0x3e19, 0x2457, 0x3b8c, 0x246b, 0x2457, 0x1078,
-       0x23eb, 0x0018, 0x2410, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f,
-       0x007c, 0x2019, 0x4e3b, 0x1078, 0x2276, 0x702f, 0x0001, 0x781b,
-       0x004f, 0x0078, 0x2459, 0x2019, 0x4d9e, 0x1078, 0x2276, 0x702f,
-       0x8000, 0x781b, 0x00d0, 0x0078, 0x2459, 0x7242, 0x2009, 0x510f,
-       0x200b, 0x0000, 0xa584, 0x0001, 0x00c0, 0x3ba0, 0x0040, 0x2492,
-       0x1078, 0x23eb, 0x7003, 0x0000, 0x704b, 0x0000, 0x7043, 0x0000,
-       0x7037, 0x0000, 0x1078, 0x3912, 0x0018, 0x2410, 0x2009, 0x510f,
-       0x200b, 0x0000, 0x7068, 0xa005, 0x00c0, 0x255d, 0x706c, 0xa084,
-       0x0007, 0x0079, 0x249b, 0x2594, 0x24a3, 0x24af, 0x24cc, 0x24ee,
-       0x253b, 0x2514, 0x24a3, 0x1078, 0x38fa, 0x2009, 0x0048, 0x1078,
-       0x2e39, 0x00c0, 0x24ad, 0x7003, 0x0004, 0x0078, 0x2459, 0x1078,
-       0x38fa, 0x00c0, 0x24ca, 0x7080, 0x8007, 0x7882, 0x789b, 0x0010,
-       0x78ab, 0x000c, 0x789b, 0x0060, 0x78ab, 0x0001, 0x785b, 0x0004,
-       0x2009, 0x00e0, 0x1078, 0x2e2d, 0x00c0, 0x24ca, 0x7003, 0x0004,
-       0x7093, 0x000f, 0x0078, 0x2459, 0x1078, 0x38fa, 0x00c0, 0x24ec,
-       0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d,
-       0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002,
-       0x785b, 0x0004, 0x2009, 0x00e0, 0x1078, 0x2e2d, 0x00c0, 0x24ec,
-       0x7003, 0x0004, 0x7093, 0x000f, 0x0078, 0x2459, 0x1078, 0x38fa,
-       0x00c0, 0x2512, 0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c,
-       0x001f, 0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x7184, 0x79aa,
-       0x78ab, 0x000d, 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b, 0x0004,
-       0x2009, 0x00e0, 0x1078, 0x2e2d, 0x00c0, 0x2512, 0x7003, 0x0004,
-       0x7093, 0x000f, 0x0078, 0x2459, 0x1078, 0x38fa, 0x00c0, 0x2539,
-       0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d,
-       0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002,
-       0x785b, 0x0004, 0x2009, 0x00e0, 0x1078, 0x2e2d, 0x00c0, 0x2539,
-       0x7088, 0x708b, 0x0000, 0x2068, 0x704a, 0x7003, 0x0002, 0x7093,
-       0x000f, 0x0078, 0x2459, 0x1078, 0x38fa, 0x00c0, 0x2459, 0x7088,
-       0x2068, 0x6f14, 0x1078, 0x37ef, 0x2c50, 0x1078, 0x39ac, 0x789b,
-       0x0010, 0x6814, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa, 0x6e1c,
-       0x2041, 0x0001, 0x708c, 0xa084, 0x0400, 0x2001, 0x0004, 0x0040,
-       0x255b, 0x2001, 0x0006, 0x0078, 0x267c, 0x1078, 0x38fa, 0x00c0,
-       0x2459, 0x789b, 0x0010, 0x7068, 0x2068, 0x6f14, 0x1078, 0x37ef,
-       0x2c50, 0x1078, 0x39ac, 0x6008, 0xa085, 0x0010, 0x600a, 0x6824,
-       0xa005, 0x0040, 0x257b, 0xa082, 0x0006, 0x0048, 0x2579, 0x0078,
-       0x257b, 0x6827, 0x0005, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0,
-       0x7058, 0xa084, 0x8000, 0x0040, 0x2589, 0xa684, 0x0001, 0x0040,
-       0x258b, 0xa39c, 0xffbf, 0x7baa, 0x2031, 0x0020, 0x2041, 0x0001,
-       0x2001, 0x0003, 0x0078, 0x267c, 0x0018, 0x2410, 0x744c, 0xa485,
-       0x0000, 0x0040, 0x25ae, 0xa080, 0x5180, 0x2030, 0x7150, 0x8108,
-       0xa12a, 0x0048, 0x25a5, 0x2009, 0x5180, 0x2164, 0x6504, 0x85ff,
-       0x00c0, 0x25bf, 0x8421, 0x00c0, 0x259f, 0x7152, 0x7003, 0x0000,
-       0x704b, 0x0000, 0x7040, 0xa005, 0x0040, 0x3ba0, 0x0078, 0x2459,
-       0x764c, 0xa6b0, 0x5180, 0x7150, 0x2600, 0x0078, 0x25aa, 0x7152,
-       0x2568, 0x2558, 0x754a, 0x2c50, 0x6034, 0xa085, 0x0000, 0x00c0,
-       0x25bc, 0x6708, 0x773a, 0xa784, 0x033f, 0x0040, 0x25f5, 0xa784,
-       0x0021, 0x00c0, 0x25bc, 0xa784, 0x0002, 0x0040, 0x25de, 0xa784,
-       0x0004, 0x0040, 0x25bc, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0008,
-       0x00c0, 0x25bc, 0xa784, 0x0010, 0x00c0, 0x25bc, 0xa784, 0x0200,
-       0x00c0, 0x25bc, 0xa784, 0x0100, 0x0040, 0x25f5, 0x6018, 0xa005,
-       0x00c0, 0x25bc, 0xa7bc, 0xfeff, 0x670a, 0x6823, 0x0000, 0x6e1c,
-       0xa684, 0x000e, 0x6118, 0x0040, 0x2605, 0x601c, 0xa102, 0x0048,
-       0x2608, 0x0040, 0x2608, 0x0078, 0x25b8, 0x81ff, 0x00c0, 0x25b8,
-       0x68c3, 0x0000, 0xa784, 0x0080, 0x00c0, 0x2610, 0x700c, 0x6022,
-       0xa7bc, 0xff7f, 0x670a, 0x1078, 0x39ac, 0x0018, 0x2410, 0x789b,
-       0x0010, 0xa046, 0x1078, 0x38fa, 0x00c0, 0x2459, 0x6b14, 0xa39c,
-       0x001f, 0xa39d, 0x00c0, 0x7058, 0xa084, 0x8000, 0x0040, 0x262c,
-       0xa684, 0x0001, 0x0040, 0x262e, 0xa39c, 0xffbf, 0xa684, 0x0010,
-       0x0040, 0x2634, 0xa39d, 0x0020, 0x7baa, 0x8840, 0xa684, 0x000e,
-       0x00c0, 0x263f, 0xa7bd, 0x0010, 0x670a, 0x0078, 0x267a, 0x7158,
-       0xa18c, 0x0800, 0x0040, 0x3401, 0x2011, 0x0020, 0xa684, 0x0008,
-       0x00c0, 0x2650, 0x8210, 0xa684, 0x0002, 0x00c0, 0x2650, 0x8210,
-       0x7aaa, 0x8840, 0x1078, 0x3912, 0x6a14, 0x610c, 0x8108, 0xa18c,
-       0x00ff, 0xa1e0, 0x7400, 0x2c64, 0x8cff, 0x0040, 0x2671, 0x6014,
-       0xa206, 0x00c0, 0x265b, 0x60b8, 0x8001, 0x60ba, 0x00c0, 0x2656,
-       0x0c7e, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f, 0x0078,
-       0x2594, 0x1078, 0x38fa, 0x00c0, 0x2459, 0x2a60, 0x610e, 0x79aa,
-       0x8840, 0x7132, 0x2001, 0x0001, 0x007e, 0x715c, 0xa184, 0x0018,
-       0x0040, 0x2697, 0xa184, 0x0010, 0x0040, 0x268a, 0x1078, 0x3604,
-       0x00c0, 0x26ba, 0xa184, 0x0008, 0x0040, 0x2697, 0x69a0, 0xa184,
-       0x0600, 0x00c0, 0x2697, 0x1078, 0x34f1, 0x0078, 0x26ba, 0x69a0,
-       0xa184, 0x0800, 0x0040, 0x26ae, 0x0c7e, 0x027e, 0x2960, 0x6000,
-       0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106, 0x027f,
-       0x0c7f, 0x1078, 0x3604, 0x00c0, 0x26ba, 0x69a0, 0xa184, 0x0200,
-       0x0040, 0x26b6, 0x1078, 0x3540, 0x0078, 0x26ba, 0xa184, 0x0400,
-       0x00c0, 0x2693, 0x69a0, 0xa184, 0x1000, 0x0040, 0x26c5, 0x6914,
-       0xa18c, 0xff00, 0x810f, 0x1078, 0x22ee, 0x007f, 0x7002, 0xa68c,
-       0x00e0, 0xa684, 0x0060, 0x0040, 0x26d3, 0xa086, 0x0060, 0x00c0,
-       0x26d3, 0xa18d, 0x4000, 0x88ff, 0x0040, 0x26d8, 0xa18d, 0x0004,
-       0x795a, 0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b, 0x0061,
-       0x6818, 0xa08d, 0x8000, 0xa084, 0x7fff, 0x691a, 0xa68c, 0x0080,
-       0x0040, 0x26f7, 0x7097, 0x0000, 0xa08a, 0x000d, 0x0050, 0x26f5,
-       0xa08a, 0x000c, 0x7196, 0x2001, 0x000c, 0x800c, 0x719a, 0x78aa,
-       0x8008, 0x810c, 0x0040, 0x3407, 0xa18c, 0x00f8, 0x00c0, 0x3407,
-       0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000,
-       0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f,
-       0x6814, 0x8007, 0x7882, 0x6d94, 0x7dd6, 0x7dde, 0x6e98, 0x7ed2,
-       0x7eda, 0x1078, 0x38fa, 0x00c0, 0x272e, 0x702c, 0x8003, 0x0048,
-       0x2727, 0x2019, 0x4d9e, 0x1078, 0x2276, 0x702f, 0x8000, 0x7830,
-       0xa084, 0x00c0, 0x00c0, 0x272e, 0x0098, 0x2736, 0x6008, 0xa084,
-       0xffef, 0x600a, 0x1078, 0x3912, 0x0078, 0x2482, 0x7200, 0xa284,
-       0x0007, 0xa086, 0x0001, 0x00c0, 0x2743, 0x781b, 0x004f, 0x1078,
-       0x3912, 0x0078, 0x2754, 0x6ab4, 0xa295, 0x2000, 0x7a5a, 0x781b,
-       0x004f, 0x1078, 0x3912, 0x7200, 0x2500, 0xa605, 0x0040, 0x2754,
-       0xa284, 0x0007, 0x1079, 0x2762, 0xad80, 0x0009, 0x7036, 0xa284,
-       0x0007, 0xa086, 0x0001, 0x00c0, 0x2459, 0x6018, 0x8000, 0x601a,
-       0x0078, 0x2459, 0x276a, 0x4a3a, 0x4a3a, 0x4a29, 0x4a3a, 0x276a,
-       0x4a29, 0x276a, 0x1078, 0x23eb, 0x1078, 0x38fa, 0x0f7e, 0x2079,
-       0x5100, 0x78cc, 0x0f7f, 0xa084, 0x0001, 0x0040, 0x2790, 0x706c,
-       0xa086, 0x0001, 0x00c0, 0x277f, 0x706e, 0x0078, 0x2823, 0x706c,
-       0xa086, 0x0005, 0x00c0, 0x278e, 0x7088, 0x2068, 0x681b, 0x0004,
-       0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x706f, 0x0000,
-       0x2011, 0x0004, 0x716c, 0xa186, 0x0001, 0x0040, 0x27b1, 0xa186,
-       0x0007, 0x00c0, 0x27a1, 0x2009, 0x5138, 0x200b, 0x0005, 0x0078,
-       0x27b1, 0x2009, 0x5113, 0x2104, 0x2009, 0x5112, 0x200a, 0x2009,
-       0x5138, 0x200b, 0x0001, 0x706f, 0x0000, 0x7073, 0x0001, 0x0078,
-       0x27b3, 0x706f, 0x0000, 0x1078, 0x4776, 0x157e, 0x20a9, 0x0010,
-       0x2039, 0x0000, 0x1078, 0x36e2, 0xa7b8, 0x0100, 0x0070, 0x27c2,
-       0x0078, 0x27ba, 0x157f, 0x7000, 0x0079, 0x27c6, 0x27f4, 0x27db,
-       0x27db, 0x27ce, 0x27f4, 0x27f4, 0x27f4, 0x27f4, 0x2021, 0x515a,
-       0x2404, 0xa005, 0x0040, 0x27f4, 0xad06, 0x00c0, 0x27db, 0x6800,
-       0x2022, 0x0078, 0x27eb, 0x6820, 0xa084, 0x0001, 0x00c0, 0x27e7,
-       0x6f14, 0x1078, 0x37ef, 0x1078, 0x33d8, 0x0078, 0x27eb, 0x7060,
-       0x2060, 0x6800, 0x6002, 0x6a1a, 0x6817, 0x0000, 0x6820, 0xa085,
-       0x0008, 0x6822, 0x1078, 0x1c70, 0x2021, 0x7500, 0x1078, 0x2830,
-       0x2021, 0x515a, 0x1078, 0x2830, 0x157e, 0x20a9, 0x0000, 0x2021,
-       0x7400, 0x1078, 0x2830, 0x8420, 0x0070, 0x2808, 0x0078, 0x2801,
-       0x2061, 0x5400, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6018, 0x6110,
-       0x81ff, 0x0040, 0x2817, 0xa102, 0x0050, 0x2817, 0x6012, 0x601b,
-       0x0000, 0xace0, 0x0010, 0x0070, 0x281f, 0x0078, 0x280e, 0x8421,
-       0x00c0, 0x280c, 0x157f, 0x709c, 0xa084, 0x8000, 0x0040, 0x282a,
-       0x1078, 0x3a00, 0x7003, 0x0000, 0x704b, 0x0000, 0x0078, 0x2459,
-       0x047e, 0x2404, 0xa005, 0x0040, 0x2844, 0x2068, 0x6800, 0x007e,
-       0x6a1a, 0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x1078,
-       0x1c70, 0x007f, 0x0078, 0x2832, 0x047f, 0x2023, 0x0000, 0x007c,
-       0xa282, 0x0003, 0x0050, 0x284e, 0x1078, 0x23eb, 0x2300, 0x0079,
-       0x2851, 0x2854, 0x28c7, 0x28e4, 0xa282, 0x0002, 0x0040, 0x285a,
-       0x1078, 0x23eb, 0x706c, 0x706f, 0x0000, 0x7093, 0x0000, 0x0079,
-       0x2861, 0x2869, 0x2869, 0x286b, 0x289f, 0x340d, 0x2869, 0x289f,
-       0x2869, 0x1078, 0x23eb, 0x7780, 0x1078, 0x36e2, 0x7780, 0xa7bc,
-       0x0f00, 0x1078, 0x37ef, 0x6018, 0xa005, 0x0040, 0x2896, 0x2021,
-       0x7500, 0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x28ff, 0x0040,
-       0x2896, 0x157e, 0x20a9, 0x0000, 0x2021, 0x7400, 0x047e, 0x2009,
-       0x0004, 0x2011, 0x0010, 0x1078, 0x28ff, 0x047f, 0x0040, 0x2895,
-       0x8420, 0x0070, 0x2895, 0x0078, 0x2886, 0x157f, 0x8738, 0xa784,
-       0x001f, 0x00c0, 0x2871, 0x0078, 0x2482, 0x0078, 0x2482, 0x7780,
-       0x1078, 0x37ef, 0x6018, 0xa005, 0x0040, 0x28c5, 0x2021, 0x7500,
-       0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x28ff, 0x0040, 0x28c5,
-       0x157e, 0x20a9, 0x0000, 0x2021, 0x7400, 0x047e, 0x2009, 0x0005,
-       0x2011, 0x0020, 0x1078, 0x28ff, 0x047f, 0x0040, 0x28c4, 0x8420,
-       0x0070, 0x28c4, 0x0078, 0x28b5, 0x157f, 0x0078, 0x2482, 0x2200,
-       0x0079, 0x28ca, 0x28cd, 0x28cf, 0x28cf, 0x1078, 0x23eb, 0x2009,
-       0x0012, 0x706c, 0xa086, 0x0002, 0x0040, 0x28d8, 0x2009, 0x000e,
-       0x6818, 0xa084, 0x8000, 0x0040, 0x28de, 0x691a, 0x706f, 0x0000,
-       0x7073, 0x0001, 0x0078, 0x3888, 0x2200, 0x0079, 0x28e7, 0x28ec,
-       0x28cf, 0x28ea, 0x1078, 0x23eb, 0x1078, 0x4776, 0x7000, 0xa086,
-       0x0001, 0x00c0, 0x339d, 0x1078, 0x33ee, 0x6008, 0xa084, 0xffef,
-       0x600a, 0x1078, 0x3390, 0x0040, 0x339d, 0x0078, 0x2594, 0x2404,
-       0xa005, 0x0040, 0x2922, 0x2068, 0x2d04, 0x007e, 0x6814, 0xa706,
-       0x0040, 0x290e, 0x2d20, 0x007f, 0x0078, 0x2900, 0x007f, 0x2022,
-       0x691a, 0x6817, 0x0000, 0x6820, 0xa205, 0x6822, 0x1078, 0x1c70,
-       0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078,
-       0x33ee, 0x007c, 0xa085, 0x0001, 0x0078, 0x2921, 0x2300, 0x0079,
-       0x2929, 0x292e, 0x292c, 0x29c7, 0x1078, 0x23eb, 0x78ec, 0xa084,
-       0x0001, 0x00c0, 0x2942, 0x7000, 0xa086, 0x0004, 0x00c0, 0x293a,
-       0x0078, 0x2965, 0x1078, 0x33ee, 0x6008, 0xa084, 0xffef, 0x600a,
-       0x0078, 0x339d, 0x78e4, 0xa005, 0x00d0, 0x2965, 0x0018, 0x2459,
-       0x2008, 0xa084, 0x0030, 0x00c0, 0x2951, 0x781b, 0x004f, 0x0078,
-       0x2459, 0x78ec, 0xa084, 0x0003, 0x0040, 0x294d, 0x2100, 0xa084,
-       0x0007, 0x0079, 0x295b, 0x299e, 0x29a9, 0x298f, 0x2963, 0x38ed,
-       0x38ed, 0x2963, 0x29b8, 0x1078, 0x23eb, 0x7000, 0xa086, 0x0004,
-       0x00c0, 0x297f, 0x706c, 0xa086, 0x0002, 0x00c0, 0x2975, 0x2011,
-       0x0002, 0x2019, 0x0000, 0x0078, 0x2848, 0x706c, 0xa086, 0x0006,
-       0x0040, 0x296f, 0x706c, 0xa086, 0x0004, 0x0040, 0x296f, 0x79e4,
-       0xa184, 0x0030, 0x0040, 0x2989, 0x78ec, 0xa084, 0x0003, 0x00c0,
-       0x298b, 0x0078, 0x2f6d, 0x2001, 0x0003, 0x0078, 0x2d01, 0x6818,
-       0xa084, 0x8000, 0x0040, 0x2996, 0x681b, 0x001d, 0x1078, 0x36c1,
-       0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x6818, 0xa084,
-       0x8000, 0x0040, 0x29a5, 0x681b, 0x001d, 0x1078, 0x36c1, 0x0078,
-       0x38b8, 0x6818, 0xa084, 0x8000, 0x0040, 0x29b0, 0x681b, 0x001d,
-       0x1078, 0x36c1, 0x782b, 0x3008, 0x781b, 0x00cd, 0x0078, 0x2459,
-       0x6818, 0xa084, 0x8000, 0x0040, 0x29bf, 0x681b, 0x001d, 0x1078,
-       0x36c1, 0x782b, 0x3008, 0x781b, 0x008e, 0x0078, 0x2459, 0xa584,
-       0x000f, 0x00c0, 0x29e4, 0x7000, 0x0079, 0x29ce, 0x2482, 0x29d8,
-       0x29d6, 0x339d, 0x339d, 0x339d, 0x339d, 0x29d6, 0x1078, 0x23eb,
-       0x1078, 0x33ee, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x3390,
-       0x0040, 0x339d, 0x0078, 0x2594, 0x78e4, 0xa005, 0x00d0, 0x2965,
-       0x0018, 0x2965, 0x2008, 0xa084, 0x0030, 0x00c0, 0x29f3, 0x781b,
-       0x004f, 0x0078, 0x2459, 0x78ec, 0xa084, 0x0003, 0x0040, 0x29ef,
-       0x2100, 0xa184, 0x0007, 0x0079, 0x29fd, 0x2a0f, 0x2a13, 0x2a07,
-       0x2a05, 0x38ed, 0x38ed, 0x2a05, 0x38e3, 0x1078, 0x23eb, 0x1078,
-       0x36c9, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x1078,
-       0x36c9, 0x0078, 0x38b8, 0x1078, 0x36c9, 0x782b, 0x3008, 0x781b,
-       0x00cd, 0x0078, 0x2459, 0x1078, 0x36c9, 0x782b, 0x3008, 0x781b,
-       0x008e, 0x0078, 0x2459, 0x2300, 0x0079, 0x2a26, 0x2a2b, 0x2a29,
-       0x2a2d, 0x1078, 0x23eb, 0x0078, 0x30ab, 0x681b, 0x0008, 0x78a3,
-       0x0000, 0x79e4, 0xa184, 0x0030, 0x0040, 0x30ab, 0x78ec, 0xa084,
-       0x0003, 0x0040, 0x30ab, 0xa184, 0x0007, 0x0079, 0x2a3f, 0x2a47,
-       0x2a13, 0x298f, 0x3888, 0x38ed, 0x38ed, 0x2a47, 0x38e3, 0x1078,
-       0x389c, 0x0078, 0x2459, 0xa282, 0x0005, 0x0050, 0x2a51, 0x1078,
-       0x23eb, 0x2300, 0x0079, 0x2a54, 0x2a57, 0x2cae, 0x2cbc, 0x2200,
-       0x0079, 0x2a5a, 0x2a74, 0x2a61, 0x2a74, 0x2a5f, 0x2c93, 0x1078,
-       0x23eb, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa082, 0x0020,
-       0x0048, 0x369d, 0xa08a, 0x0004, 0x00c8, 0x369d, 0x0079, 0x2a70,
-       0x369d, 0x369d, 0x369d, 0x364b, 0x789b, 0x0018, 0x79a8, 0xa184,
-       0x0080, 0x0040, 0x2a85, 0x0078, 0x369d, 0x7000, 0xa005, 0x00c0,
-       0x2a7b, 0x2011, 0x0004, 0x0078, 0x321f, 0xa184, 0x00ff, 0xa08a,
-       0x0010, 0x00c8, 0x369d, 0x0079, 0x2a8d, 0x2a9f, 0x2a9d, 0x2ab7,
-       0x2abb, 0x2b78, 0x369d, 0x369d, 0x2b7a, 0x369d, 0x369d, 0x2c8f,
-       0x2c8f, 0x369d, 0x369d, 0x369d, 0x2c91, 0x1078, 0x23eb, 0xa684,
-       0x1000, 0x0040, 0x2aac, 0x2001, 0x0500, 0x8000, 0x8000, 0x783a,
-       0x781b, 0x008c, 0x0078, 0x2459, 0x6818, 0xa084, 0x8000, 0x0040,
-       0x2ab5, 0x681b, 0x001d, 0x0078, 0x2aa3, 0x0078, 0x3888, 0x681b,
-       0x001d, 0x0078, 0x36ad, 0x6920, 0x6922, 0xa684, 0x1800, 0x00c0,
-       0x2afc, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2b04, 0x6818, 0xa086,
-       0x0008, 0x00c0, 0x2acd, 0x681b, 0x0000, 0xa684, 0x0400, 0x0040,
-       0x2b74, 0xa684, 0x0080, 0x0040, 0x2af8, 0x7097, 0x0000, 0x6818,
-       0xa084, 0x003f, 0xa08a, 0x000d, 0x0050, 0x2af8, 0xa08a, 0x000c,
-       0x7196, 0x2001, 0x000c, 0x800c, 0x719a, 0x789b, 0x0061, 0x78aa,
+       0x5480, 0x2019, 0x0000, 0x72c8, 0xd2bc, 0x0040, 0x14e9, 0xa39d,
+       0x0010, 0xd2b4, 0x0040, 0x14ee, 0xa39d, 0x0008, 0x6800, 0x007e,
+       0xa226, 0x0040, 0x1511, 0x6a02, 0xa484, 0x2000, 0x0040, 0x14fa,
+       0xa39d, 0x0010, 0xa484, 0x1000, 0x0040, 0x1500, 0xa39d, 0x0008,
+       0xa484, 0x4000, 0x0040, 0x1511, 0x810f, 0xa284, 0x4000, 0x0040,
+       0x150d, 0x1078, 0x2399, 0x0078, 0x1511, 0x1078, 0x238b, 0x0078,
+       0x1511, 0x72cc, 0x6808, 0xa206, 0x0040, 0x1540, 0xa2a4, 0x00ff,
+       0x2061, 0x5240, 0x6118, 0xa186, 0x0028, 0x0040, 0x1527, 0xa186,
+       0x0032, 0x0040, 0x152d, 0xa186, 0x003c, 0x0040, 0x1533, 0xa482,
+       0x0064, 0x0048, 0x153d, 0x0078, 0x1537, 0xa482, 0x0050, 0x0048,
+       0x153d, 0x0078, 0x1537, 0xa482, 0x0043, 0x0048, 0x153d, 0x71c4,
+       0x71c6, 0x027f, 0x72ca, 0x0078, 0x127d, 0x6a0a, 0xa39d, 0x000a,
+       0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4, 0x0078, 0x1281,
+       0x77c4, 0x1078, 0x19c5, 0x2091, 0x8000, 0x6a14, 0x6b1c, 0x2091,
+       0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708, 0x0078, 0x1281,
+       0x70c4, 0x794c, 0x784e, 0x0078, 0x1283, 0x71c4, 0x72c8, 0x73cc,
+       0xa182, 0x0010, 0x00c8, 0x127c, 0x1078, 0x23a7, 0x0078, 0x1281,
+       0x77c4, 0x1078, 0x19c5, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0002,
+       0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282, 0x77c4, 0x1078,
+       0x19c5, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804,
+       0xa005, 0x0040, 0x1585, 0x1078, 0x226f, 0x2091, 0x8001, 0x2708,
+       0x0078, 0x1282, 0x77c4, 0x1078, 0x19c5, 0x2091, 0x8000, 0x6a08,
+       0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x1599, 0x1078,
+       0x226f, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282, 0x77c4, 0x2041,
+       0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
+       0x19d2, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078, 0x1282, 0x77c4,
+       0x72c8, 0x73cc, 0x77c6, 0x72ca, 0x73ce, 0x1078, 0x1a52, 0x00c0,
+       0x15c7, 0x6818, 0xa005, 0x0040, 0x15c7, 0x2708, 0x1078, 0x23b7,
+       0x00c0, 0x15c7, 0x7817, 0x0015, 0x2091, 0x8001, 0x007c, 0x2091,
+       0x8001, 0x0078, 0x1284, 0x77c4, 0x77c6, 0x2041, 0x0021, 0x2049,
+       0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078, 0x19d2, 0x2061,
+       0x5240, 0x606f, 0x0003, 0x6782, 0x6093, 0x000f, 0x6073, 0x0000,
+       0x7817, 0x0016, 0x1078, 0x226f, 0x2091, 0x8001, 0x007c, 0x77c8,
+       0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091, 0x8000, 0x2061,
+       0x5240, 0x606f, 0x0002, 0x6073, 0x0000, 0x6782, 0x6093, 0x000f,
+       0x7817, 0x0017, 0x1078, 0x226f, 0x2091, 0x8001, 0x2041, 0x0021,
+       0x2049, 0x0004, 0x2051, 0x0010, 0x2091, 0x8000, 0x1078, 0x19d2,
+       0x70c8, 0x6836, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1606, 0x2091,
+       0x8001, 0x007c, 0x78cc, 0xa084, 0x0003, 0x00c0, 0x1636, 0x2039,
+       0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078,
+       0x19c5, 0x2091, 0x8000, 0x6808, 0xa80d, 0x690a, 0x2091, 0x8001,
+       0x8738, 0xa784, 0x001f, 0x00c0, 0x161f, 0xa7bc, 0xff00, 0x873f,
+       0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x161f, 0x2091, 0x8000,
+       0x2069, 0x0100, 0x6830, 0xa084, 0x0040, 0x0040, 0x165f, 0x684b,
+       0x0004, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004, 0x0040, 0x164c,
+       0x0070, 0x164c, 0x0078, 0x1643, 0x684b, 0x0009, 0x20a9, 0x0014,
+       0x6848, 0xa084, 0x0001, 0x0040, 0x1659, 0x0070, 0x1659, 0x0078,
+       0x1650, 0x20a9, 0x00fa, 0x0070, 0x165f, 0x0078, 0x165b, 0x2079,
+       0x5200, 0x7817, 0x0018, 0x2061, 0x5240, 0x606f, 0x0001, 0x6073,
+       0x0000, 0x6093, 0x000f, 0x78cc, 0xa085, 0x0002, 0x78ce, 0x6808,
+       0xa084, 0xfffd, 0x680a, 0x681b, 0x0048, 0x2091, 0x8001, 0x007c,
+       0x78cc, 0xa084, 0xfffd, 0x78ce, 0xa084, 0x0001, 0x00c0, 0x1682,
+       0x1078, 0x1a9c, 0x71c4, 0x71c6, 0x794a, 0x007c, 0x1078, 0x1bc4,
+       0x00c0, 0x129c, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1693,
+       0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca,
+       0x72ce, 0x2079, 0x5200, 0x2091, 0x8000, 0x1078, 0x1980, 0x2091,
+       0x8001, 0x0040, 0x174a, 0x20a9, 0x0005, 0x20a1, 0x5218, 0x2091,
+       0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0020, 0x1078, 0x197b,
+       0x0040, 0x16b6, 0x1078, 0x199a, 0x0078, 0x174a, 0x6004, 0xa084,
+       0xff00, 0x8007, 0x8009, 0x0040, 0x1719, 0x0c7e, 0x2c68, 0x2091,
+       0x8000, 0x1078, 0x1980, 0x2091, 0x8001, 0x0040, 0x16ea, 0x2c00,
+       0x689e, 0x8109, 0x00c0, 0x16be, 0x609f, 0x0000, 0x0c7f, 0x0c7e,
+       0x7218, 0x731c, 0x7420, 0x7524, 0x2c68, 0x689c, 0xa065, 0x0040,
+       0x1718, 0x2009, 0x0020, 0x1078, 0x197b, 0x00c0, 0x1701, 0x6004,
+       0xa084, 0x00ff, 0xa086, 0x0002, 0x00c0, 0x16ea, 0x2d00, 0x6002,
+       0x0078, 0x16d0, 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x1a17,
+       0x0c7f, 0x609f, 0x0000, 0x1078, 0x174e, 0x2009, 0x000c, 0x6008,
+       0xa085, 0x0200, 0x600a, 0x1078, 0x1976, 0x1078, 0x199a, 0x0078,
+       0x174a, 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x1a17, 0x0c7f,
+       0x609f, 0x0000, 0x1078, 0x174e, 0x2009, 0x000c, 0x6007, 0x0103,
+       0x601b, 0x0003, 0x1078, 0x1976, 0x1078, 0x199a, 0x0078, 0x174a,
+       0x0c7f, 0x74c4, 0x73c8, 0x72cc, 0x6014, 0x2091, 0x8000, 0x7817,
+       0x0012, 0x0e7e, 0x2071, 0x5240, 0x706f, 0x0005, 0x7073, 0x0000,
+       0x7376, 0x727a, 0x747e, 0x7082, 0x7087, 0x0000, 0x2c00, 0x708a,
+       0x708f, 0x0000, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184, 0x0060,
+       0x0040, 0x173c, 0x1078, 0x48d3, 0x0e7f, 0x6596, 0x65a6, 0x669a,
+       0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x1078, 0x226f, 0x2091,
+       0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1287, 0x20a9, 0x0005,
+       0x2099, 0x5218, 0x2091, 0x8000, 0x530a, 0x2091, 0x8001, 0x2100,
+       0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c,
+       0x71c4, 0x70c7, 0x0000, 0x7906, 0x0078, 0x1284, 0x71c4, 0x71c6,
+       0x2168, 0x0078, 0x176d, 0x2069, 0x1000, 0x690c, 0xa016, 0x2d04,
+       0xa210, 0x8d68, 0x8109, 0x00c0, 0x176f, 0xa285, 0x0000, 0x00c0,
+       0x177d, 0x70c3, 0x4000, 0x0078, 0x177f, 0x70c3, 0x4003, 0x70ca,
+       0x0078, 0x1287, 0x2011, 0x5267, 0x220c, 0x70c4, 0x8003, 0x0048,
+       0x178f, 0x1078, 0x3c51, 0xa184, 0x7fff, 0x0078, 0x1793, 0x1078,
+       0x3c44, 0xa185, 0x8000, 0x2012, 0x0078, 0x1283, 0x71c4, 0x1078,
+       0x3c3b, 0x6100, 0x2001, 0x5267, 0x2004, 0xa084, 0x8000, 0xa10d,
+       0x6204, 0x6308, 0x0078, 0x1281, 0x79e4, 0x0078, 0x1283, 0x71c4,
+       0x71c6, 0x2198, 0x20a1, 0x0042, 0x20a9, 0x0004, 0x53a3, 0x21a0,
+       0x2099, 0x0042, 0x20a9, 0x0004, 0x53a3, 0x0078, 0x1284, 0x70c4,
+       0x2068, 0x2079, 0x5200, 0x2091, 0x8000, 0x1078, 0x1980, 0x2091,
+       0x8001, 0x0040, 0x1843, 0x6007, 0x0001, 0x600b, 0x0000, 0x602b,
+       0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c, 0x000f, 0xa284, 0x00f0,
+       0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x6016, 0xa284, 0x0800,
+       0x0040, 0x17de, 0x601b, 0x000a, 0x0078, 0x17e4, 0xa284, 0x1000,
+       0x0040, 0x17e4, 0x601b, 0x000c, 0xa284, 0x0300, 0x0040, 0x17ed,
+       0x602b, 0x0001, 0x8004, 0x8004, 0x8004, 0xa085, 0x0001, 0x601e,
+       0x6023, 0x0000, 0x6027, 0x0000, 0xa284, 0x0400, 0x0040, 0x17fa,
+       0x602b, 0x0000, 0x20a9, 0x0006, 0xac80, 0x000b, 0x20a0, 0xad80,
+       0x0005, 0x2098, 0x53a3, 0xa284, 0x0300, 0x00c0, 0x180f, 0x6046,
+       0x604a, 0x604e, 0x6052, 0x6096, 0x609a, 0x0078, 0x1819, 0x6800,
+       0x6046, 0x6804, 0x604a, 0x6e08, 0x664e, 0x6d0c, 0x6552, 0x6596,
+       0x669a, 0x6014, 0x2091, 0x8000, 0x7817, 0x0042, 0x2c08, 0x2061,
+       0x5240, 0x606f, 0x0005, 0x6073, 0x0000, 0x6077, 0x0000, 0x607b,
+       0x0000, 0x607f, 0x0000, 0x6082, 0x618a, 0xa284, 0x0400, 0x608e,
+       0x2091, 0x8001, 0x0e7e, 0x2071, 0x0020, 0x7007, 0x000a, 0x7007,
+       0x0002, 0x7003, 0x0000, 0x0e7f, 0x2091, 0x8000, 0x1078, 0x226f,
+       0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1287, 0x0c7e,
+       0x0d7e, 0x0e7e, 0x0f7e, 0x2091, 0x8000, 0x2071, 0x5240, 0x2079,
+       0x0100, 0x2061, 0x0010, 0x70a0, 0xa06d, 0x0040, 0x1903, 0x6a04,
+       0xa294, 0x00ff, 0xa286, 0x0007, 0x0040, 0x1862, 0xa286, 0x000f,
+       0x00c0, 0x1903, 0x691c, 0xa184, 0x00c0, 0x0040, 0x1903, 0xa184,
+       0x0080, 0x00c0, 0x18d3, 0x6824, 0xa084, 0xff00, 0xa085, 0x0019,
+       0x6826, 0x71b0, 0x81ff, 0x0040, 0x1889, 0x0d7e, 0x2069, 0x0020,
+       0x6807, 0x0010, 0x6908, 0x6808, 0xa106, 0x00c0, 0x187a, 0x690c,
+       0x680c, 0xa106, 0x00c0, 0x187f, 0xa184, 0x00ff, 0x00c0, 0x187f,
+       0x0d7f, 0x78b8, 0xa084, 0x801f, 0x00c0, 0x1889, 0x7848, 0xa085,
+       0x000c, 0x784a, 0x71b0, 0x81ff, 0x0040, 0x18ac, 0x70b3, 0x0000,
+       0x0d7e, 0x2069, 0x0020, 0x6807, 0x0018, 0x6804, 0xa084, 0x0008,
+       0x00c0, 0x189d, 0x6807, 0x0008, 0x6804, 0xa084, 0x0008, 0x00c0,
+       0x18a4, 0x6807, 0x0002, 0x0d7f, 0x61c4, 0x62c8, 0x63cc, 0x61c6,
+       0x62ca, 0x63ce, 0x0e7e, 0x2071, 0x5200, 0x7266, 0x736a, 0xae80,
+       0x0019, 0x0e7f, 0x7848, 0xa084, 0x000c, 0x00c0, 0x18ba, 0x1078,
+       0x47e1, 0x78a3, 0x0000, 0x7858, 0xa084, 0xedff, 0x785a, 0x70b4,
+       0xa080, 0x00da, 0x781a, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091,
+       0x8001, 0x0078, 0x1284, 0x6824, 0xa084, 0xff00, 0xa085, 0x0019,
+       0x6826, 0x78b8, 0xa084, 0x801f, 0x00c0, 0x18d9, 0x7848, 0xa085,
+       0x000c, 0x784a, 0x7848, 0xa084, 0x000c, 0x00c0, 0x18e2, 0x71b0,
+       0x81ff, 0x0040, 0x1901, 0x70b3, 0x0000, 0x0d7e, 0x2069, 0x0020,
+       0x6807, 0x0018, 0x6804, 0xa084, 0x0008, 0x00c0, 0x18f2, 0x6807,
+       0x0008, 0x6804, 0xa084, 0x0008, 0x00c0, 0x18f9, 0x6807, 0x0002,
+       0x0d7f, 0x0078, 0x18cb, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091,
+       0x8001, 0x2001, 0x4005, 0x0078, 0x1286, 0x7980, 0x71c6, 0x71c4,
+       0xa182, 0x0003, 0x00c8, 0x127c, 0x7982, 0x0078, 0x1284, 0x7980,
+       0x71c6, 0x0078, 0x1284, 0x7974, 0x71c6, 0x71c4, 0x7976, 0x7978,
+       0x71ca, 0x71c8, 0x797a, 0x797c, 0x71ce, 0x71cc, 0x797e, 0x0078,
+       0x1284, 0x7974, 0x71c6, 0x7978, 0x71ca, 0x797c, 0x71ce, 0x0078,
+       0x1284, 0x7900, 0x71c6, 0x71c4, 0x7902, 0x2001, 0x04fd, 0x2004,
+       0xa082, 0x0005, 0x0048, 0x1940, 0x0038, 0x1942, 0x0078, 0x194c,
+       0x00a8, 0x194c, 0xa18c, 0x0001, 0x00c0, 0x194a, 0x20b9, 0x2222,
+       0x0078, 0x194c, 0x20b9, 0x1212, 0x0078, 0x1284, 0x7900, 0x71c6,
+       0x0078, 0x1284, 0x2009, 0x5274, 0x2104, 0x70c6, 0x70c4, 0x200a,
+       0x0078, 0x1284, 0x2009, 0x5274, 0x2104, 0x70c6, 0x0078, 0x1284,
+       0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
+       0x5480, 0x6a14, 0xd2b4, 0x0040, 0x1971, 0x2011, 0x0001, 0x0078,
+       0x1973, 0x2011, 0x0000, 0x6b0c, 0x0078, 0x1281, 0xac80, 0x0001,
+       0x1078, 0x1b80, 0x007c, 0xac80, 0x0001, 0x1078, 0x1b20, 0x007c,
+       0x7850, 0xa065, 0x0040, 0x1988, 0x2c04, 0x7852, 0x2063, 0x0000,
+       0x007c, 0x0f7e, 0x2079, 0x5200, 0x7850, 0xa06d, 0x0040, 0x1998,
+       0x2d04, 0x7852, 0x6803, 0x0000, 0x6807, 0x0000, 0x680b, 0x0000,
+       0x0f7f, 0x007c, 0x2091, 0x8000, 0x0f7e, 0x2079, 0x5200, 0x7850,
+       0x2062, 0x2c00, 0xa005, 0x00c0, 0x19a7, 0x1078, 0x248c, 0x7852,
+       0x0f7f, 0x2091, 0x8001, 0x007c, 0x0f7e, 0x2079, 0x5200, 0x7850,
+       0x206a, 0x2d00, 0x7852, 0x0f7f, 0x007c, 0x2011, 0x7900, 0x7a52,
+       0x7bec, 0x8319, 0x0040, 0x19c2, 0xa280, 0x0031, 0x2012, 0x2010,
+       0x0078, 0x19b9, 0x2013, 0x0000, 0x007c, 0xa784, 0x0f00, 0x800b,
+       0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e8,
+       0x5500, 0x007c, 0x1078, 0x19c5, 0x2900, 0x682a, 0x2a00, 0x682e,
+       0x6808, 0xa084, 0xffef, 0xa80d, 0x690a, 0x2009, 0x5252, 0x210c,
+       0x6804, 0xa005, 0x0040, 0x1a04, 0xa116, 0x00c0, 0x19ef, 0x2060,
+       0x6000, 0x6806, 0x017e, 0x200b, 0x0000, 0x0078, 0x19f2, 0x2009,
+       0x0000, 0x017e, 0x6804, 0xa065, 0x0040, 0x1a01, 0x6000, 0x6806,
+       0x1078, 0x1a31, 0x1078, 0x1ccb, 0x6810, 0x8001, 0x6812, 0x00c0,
+       0x19f2, 0x017f, 0x6902, 0x6906, 0x007c, 0xa065, 0x0040, 0x1a16,
+       0x2008, 0x609c, 0xa005, 0x0040, 0x1a13, 0x2062, 0x609f, 0x0000,
+       0xa065, 0x0078, 0x1a09, 0x7850, 0x7952, 0x2062, 0x007c, 0xa065,
+       0x0040, 0x1a30, 0x2008, 0x609c, 0xa005, 0x0040, 0x1a25, 0x2062,
+       0x609f, 0x0000, 0xa065, 0x0078, 0x1a1b, 0x0f7e, 0x2079, 0x5200,
+       0x2091, 0x8000, 0x7850, 0x7952, 0x0f7f, 0x2062, 0x2091, 0x8001,
+       0x007c, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9, 0x001c, 0xac80,
+       0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828, 0x601a, 0x682c,
+       0x6022, 0x007c, 0x0e7e, 0x2071, 0x5240, 0x704c, 0xa08c, 0x0200,
+       0x00c0, 0x1a50, 0xa088, 0x5280, 0x2d0a, 0x8000, 0x704e, 0xa006,
+       0x0e7f, 0x007c, 0x1078, 0x19c5, 0x2091, 0x8000, 0x6804, 0x781e,
+       0xa065, 0x0040, 0x1a9b, 0x0078, 0x1a63, 0x2c00, 0x781e, 0x6000,
+       0xa065, 0x0040, 0x1a9b, 0x600c, 0xa306, 0x00c0, 0x1a5d, 0x6010,
+       0xa206, 0x00c0, 0x1a5d, 0x2c28, 0x2001, 0x5252, 0x2004, 0xac06,
+       0x00c0, 0x1a74, 0x0078, 0x1a99, 0x6804, 0xac06, 0x00c0, 0x1a81,
+       0x6000, 0xa065, 0x6806, 0x00c0, 0x1a8b, 0x6803, 0x0000, 0x0078,
+       0x1a8b, 0x6400, 0x781c, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0,
+       0x1a8b, 0x2c00, 0x6802, 0x2560, 0x1078, 0x1a31, 0x601b, 0x0005,
+       0x6023, 0x0020, 0x1078, 0x1ccb, 0x6810, 0x8001, 0x1050, 0x248c,
+       0x6812, 0xa085, 0xffff, 0x007c, 0x2039, 0x0000, 0x2041, 0x0021,
+       0x2049, 0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x19d2,
+       0x8738, 0xa784, 0x001f, 0x00c0, 0x1aa6, 0xa7bc, 0xff00, 0x873f,
+       0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1aa6, 0x2091, 0x8001,
+       0x007c, 0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1aca,
+       0x2091, 0x8000, 0x78e0, 0x78e3, 0x0000, 0x2091, 0x8001, 0xa005,
+       0x00c0, 0x1acb, 0x007c, 0xa08c, 0xfff0, 0x0040, 0x1ad1, 0x1078,
+       0x248c, 0x0079, 0x1ad3, 0x1ae3, 0x1ae6, 0x1aec, 0x1af0, 0x1ae4,
+       0x1af4, 0x1afa, 0x1ae4, 0x1ae4, 0x1c95, 0x1cb9, 0x1cbd, 0x1ae4,
+       0x1ae4, 0x1ae4, 0x1ae4, 0x007c, 0x1078, 0x248c, 0x1078, 0x1a9c,
+       0x2001, 0x8001, 0x0078, 0x1cc3, 0x2001, 0x8003, 0x0078, 0x1cc3,
+       0x2001, 0x8004, 0x0078, 0x1cc3, 0x1078, 0x1a9c, 0x2001, 0x8006,
+       0x0078, 0x1cc3, 0x2001, 0x8007, 0x0078, 0x1cc3, 0x2030, 0x2138,
+       0xa782, 0x0021, 0x0048, 0x1b06, 0x2009, 0x0020, 0x2600, 0x1078,
+       0x1b20, 0x00c0, 0x1b1f, 0xa7ba, 0x0020, 0x0048, 0x1b1e, 0x0040,
+       0x1b1e, 0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399, 0x0000,
+       0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0078, 0x1b00, 0xa006, 0x007c,
+       0x81ff, 0x0040, 0x1b5b, 0x2099, 0x0030, 0x20a0, 0x700c, 0xa084,
+       0x00ff, 0x0040, 0x1b32, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004,
+       0x00c0, 0x1b2d, 0x21a8, 0x7017, 0x0000, 0x810b, 0x7112, 0x721a,
+       0x731e, 0x7422, 0x7526, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007,
+       0x0001, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x1b4f,
+       0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x1b41, 0x7008,
+       0x800b, 0x00c8, 0x1b41, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x00c0,
+       0x1b5b, 0x53a5, 0xa006, 0x7003, 0x0000, 0x007c, 0x2030, 0x2138,
+       0xa782, 0x0021, 0x0048, 0x1b66, 0x2009, 0x0020, 0x2600, 0x1078,
+       0x1b80, 0x00c0, 0x1b7f, 0xa7ba, 0x0020, 0x0048, 0x1b7e, 0x0040,
+       0x1b7e, 0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399, 0x0000,
+       0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0078, 0x1b60, 0xa006, 0x007c,
+       0x81ff, 0x0040, 0x1bc1, 0x2098, 0x20a1, 0x0030, 0x700c, 0xa084,
+       0x00ff, 0x0040, 0x1b92, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004,
+       0x00c0, 0x1b8d, 0x21a8, 0x7017, 0x0000, 0x810b, 0x7112, 0x721a,
+       0x731e, 0x7422, 0x7526, 0x780c, 0xa085, 0x0000, 0x7002, 0x53a6,
+       0x7007, 0x0001, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8,
+       0x1bb0, 0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x1ba2,
+       0x7010, 0xa084, 0xf000, 0x0040, 0x1bb9, 0x7007, 0x0008, 0x0078,
+       0x1bbd, 0x7108, 0x8103, 0x00c8, 0x1ba2, 0x7007, 0x0002, 0xa184,
+       0x01e0, 0x7003, 0x0000, 0x007c, 0x2001, 0x04fd, 0x2004, 0xa082,
+       0x0004, 0x00c8, 0x1bcd, 0x0078, 0x1bd0, 0xa006, 0x0078, 0x1bd2,
+       0xa085, 0x0001, 0x007c, 0x0e7e, 0x2071, 0x5200, 0x2d08, 0x7058,
+       0x6802, 0xa005, 0x00c0, 0x1bdd, 0x715e, 0x715a, 0x0e7f, 0x007c,
+       0x2c08, 0x7858, 0x6002, 0xa005, 0x00c0, 0x1be7, 0x795e, 0x795a,
+       0x007c, 0x2091, 0x8000, 0x6114, 0x1078, 0x2180, 0x6900, 0xa184,
+       0x0100, 0x00c0, 0x2035, 0xa184, 0x0200, 0x00c0, 0x2031, 0x681c,
+       0xa005, 0x00c0, 0x203d, 0x6003, 0x0000, 0x2c08, 0x785c, 0xa065,
+       0x00c0, 0x1c05, 0x795a, 0x0078, 0x1c06, 0x6102, 0x795e, 0x2091,
+       0x8001, 0x1078, 0x228c, 0x007c, 0x0e7e, 0x2071, 0x5200, 0x7058,
+       0xa06d, 0x0040, 0x1c1a, 0x6800, 0x705a, 0xa005, 0x00c0, 0x1c19,
+       0x705e, 0x8dff, 0x0e7f, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0x2079,
+       0x5200, 0xaf80, 0x0016, 0x2060, 0x6000, 0xa005, 0x0040, 0x1c43,
+       0x2068, 0x6814, 0xa306, 0x00c0, 0x1c33, 0x6828, 0xa084, 0x00ff,
+       0xa406, 0x0040, 0x1c36, 0x2d60, 0x0078, 0x1c24, 0x6800, 0xa005,
+       0x6002, 0x00c0, 0x1c42, 0xaf80, 0x0016, 0xac06, 0x0040, 0x1c41,
+       0x2c00, 0x785e, 0x2d00, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c,
+       0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x5200, 0xaf80, 0x0016, 0x2060,
+       0x6000, 0xa005, 0x0040, 0x1c6b, 0x2068, 0x6814, 0xa084, 0x00ff,
+       0xa306, 0x0040, 0x1c5e, 0x2d60, 0x0078, 0x1c50, 0x6800, 0xa005,
+       0x6002, 0x00c0, 0x1c6a, 0xaf80, 0x0016, 0xac06, 0x0040, 0x1c69,
+       0x2c00, 0x785e, 0x2d00, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c,
+       0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x5200, 0xaf80, 0x0016, 0x2060,
+       0x6000, 0xa06d, 0x0040, 0x1c90, 0x6814, 0xa306, 0x0040, 0x1c83,
+       0x2d60, 0x0078, 0x1c78, 0x6800, 0xa005, 0x6002, 0x00c0, 0x1c8f,
+       0xaf80, 0x0016, 0xac06, 0x0040, 0x1c8e, 0x2c00, 0x785e, 0x2d00,
+       0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x2091, 0x8000, 0x2069,
+       0x5240, 0x6800, 0xa086, 0x0000, 0x0040, 0x1ca3, 0x2091, 0x8001,
+       0x78e3, 0x0009, 0x007c, 0x6880, 0xa0bc, 0xff00, 0x2041, 0x0021,
+       0x2049, 0x0004, 0x2051, 0x0010, 0x1078, 0x19d2, 0x8738, 0xa784,
+       0x001f, 0x00c0, 0x1cac, 0x2091, 0x8001, 0x2001, 0x800a, 0x0078,
+       0x1cc3, 0x2001, 0x800c, 0x0078, 0x1cc3, 0x1078, 0x1a9c, 0x2001,
+       0x800d, 0x0078, 0x1cc3, 0x70c2, 0x2061, 0x0000, 0x601b, 0x0001,
+       0x2091, 0x4080, 0x007c, 0x6004, 0x2c08, 0x2063, 0x0000, 0x7884,
+       0x8000, 0x7886, 0x7888, 0xa005, 0x798a, 0x0040, 0x1cda, 0x2c02,
+       0x0078, 0x1cdb, 0x798e, 0x007c, 0x6807, 0x0103, 0x0c7e, 0x2061,
+       0x5200, 0x2d08, 0x206b, 0x0000, 0x6084, 0x8000, 0x6086, 0x6088,
+       0xa005, 0x618a, 0x0040, 0x1cef, 0x2d02, 0x0078, 0x1cf0, 0x618e,
+       0x0c7f, 0x007c, 0x1078, 0x1d03, 0x0040, 0x1d02, 0x0c7e, 0x609c,
+       0xa065, 0x0040, 0x1cfd, 0x1078, 0x1a17, 0x0c7f, 0x609f, 0x0000,
+       0x1078, 0x199a, 0x007c, 0x788c, 0xa065, 0x0040, 0x1d15, 0x2091,
+       0x8000, 0x7884, 0x8001, 0x7886, 0x2c04, 0x788e, 0xa005, 0x00c0,
+       0x1d13, 0x788a, 0x8000, 0x2091, 0x8001, 0x007c, 0x20a9, 0x0010,
+       0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x1d1f, 0xa200, 0x0070,
+       0x1d23, 0x0078, 0x1d1a, 0x8086, 0x818e, 0x007c, 0x157e, 0x20a9,
+       0x0010, 0xa005, 0x0040, 0x1d49, 0xa11a, 0x00c8, 0x1d49, 0x8213,
+       0x818d, 0x0048, 0x1d3a, 0xa11a, 0x00c8, 0x1d3b, 0x0070, 0x1d41,
+       0x0078, 0x1d2f, 0xa11a, 0x2308, 0x8210, 0x0070, 0x1d41, 0x0078,
+       0x1d2f, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f,
+       0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x1d45, 0x7994,
+       0x70d0, 0xa106, 0x0040, 0x1dbd, 0x2091, 0x8000, 0x2071, 0x0020,
+       0x7004, 0xa005, 0x00c0, 0x1dbd, 0x7008, 0x7208, 0xa206, 0x00c0,
+       0x1dbd, 0xa286, 0x0008, 0x00c0, 0x1dbd, 0x2071, 0x0010, 0x1078,
+       0x1980, 0x0040, 0x1dbd, 0x7a9c, 0x7b98, 0x7ca4, 0x7da0, 0xa184,
+       0xff00, 0x0040, 0x1d8b, 0x2031, 0x0000, 0x810b, 0x86b5, 0x810b,
+       0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b,
+       0x86b5, 0x2100, 0xa210, 0x2600, 0xa319, 0xa4a1, 0x0000, 0xa5a9,
+       0x0000, 0x0078, 0x1d95, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399,
+       0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x2009, 0x0020, 0x1078,
+       0x197b, 0x2091, 0x8001, 0x0040, 0x1db4, 0x1078, 0x199a, 0x78a8,
+       0x8000, 0x78aa, 0xa086, 0x0002, 0x00c0, 0x1dbd, 0x2091, 0x8000,
+       0x78e3, 0x0002, 0x78ab, 0x0000, 0x78cc, 0xa085, 0x0003, 0x78ce,
+       0x2091, 0x8001, 0x0078, 0x1dbd, 0x78ab, 0x0000, 0x1078, 0x2149,
+       0x6004, 0xa084, 0x000f, 0x0079, 0x1dc2, 0x2071, 0x0010, 0x2091,
+       0x8001, 0x007c, 0x1dd2, 0x1df4, 0x1e1a, 0x1dd2, 0x1e37, 0x1de1,
+       0x1fc9, 0x1fe4, 0x1dd2, 0x1dee, 0x1e14, 0x1e7f, 0x1eee, 0x1f57,
+       0x1f69, 0x1fe0, 0x2039, 0x0400, 0x78dc, 0xa705, 0x78de, 0x6008,
+       0xa705, 0x600a, 0x1078, 0x2064, 0x609c, 0x78da, 0x1078, 0x2131,
+       0x007c, 0x78dc, 0xa084, 0x0100, 0x0040, 0x1de8, 0x0078, 0x1dd2,
+       0x601c, 0xa085, 0x0080, 0x601e, 0x0078, 0x1dfb, 0x1078, 0x1bc4,
+       0x00c0, 0x1dd2, 0x1078, 0x2163, 0x78dc, 0xa084, 0x0100, 0x0040,
+       0x1dfb, 0x0078, 0x1dd2, 0x78df, 0x0000, 0x6004, 0x8007, 0xa084,
+       0x00ff, 0x78d2, 0x8001, 0x609f, 0x0000, 0x0040, 0x1e11, 0x1078,
+       0x2064, 0x0040, 0x1e11, 0x78dc, 0xa085, 0x0100, 0x78de, 0x0078,
+       0x1e13, 0x1078, 0x2088, 0x007c, 0x1078, 0x1bc4, 0x00c0, 0x1dd2,
+       0x1078, 0x215f, 0x78dc, 0xa08c, 0x0e00, 0x00c0, 0x1e23, 0xa084,
+       0x0100, 0x00c0, 0x1e25, 0x0078, 0x1dd2, 0x1078, 0x2064, 0x00c0,
+       0x1e36, 0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x2021,
+       0xa186, 0x000f, 0x0040, 0x2021, 0x1078, 0x2088, 0x007c, 0x78dc,
+       0xa084, 0x0100, 0x0040, 0x1e3e, 0x0078, 0x1dd2, 0x78df, 0x0000,
+       0x6714, 0x2011, 0x0001, 0x20a9, 0x0001, 0x6018, 0xa084, 0x00ff,
+       0xa005, 0x0040, 0x1e61, 0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9,
+       0x0020, 0xa08e, 0x0001, 0x0040, 0x1e61, 0x2039, 0x0000, 0x2011,
+       0x0002, 0x20a9, 0x0100, 0xa08e, 0x0002, 0x0040, 0x1e61, 0x0078,
+       0x1e7c, 0x1078, 0x19c5, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f,
+       0x0000, 0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010, 0x2091,
+       0x8001, 0x0070, 0x1e75, 0x0078, 0x1e63, 0x8211, 0x0040, 0x1e7c,
+       0x20a9, 0x0100, 0x0078, 0x1e63, 0x1078, 0x199a, 0x007c, 0x2001,
+       0x5267, 0x2004, 0xa084, 0x8000, 0x0040, 0x2049, 0x6114, 0x1078,
+       0x2180, 0x6900, 0xa184, 0x0001, 0x0040, 0x1ea0, 0x6028, 0xa084,
+       0x00ff, 0x00c0, 0x2041, 0x6800, 0xa084, 0x0001, 0x0040, 0x2049,
+       0x6803, 0x0000, 0x680b, 0x0000, 0x6807, 0x0000, 0x0078, 0x2051,
+       0x2011, 0x0001, 0x6020, 0xd0f4, 0x0040, 0x1ea8, 0xa295, 0x0002,
+       0xd0c4, 0x0040, 0x1ead, 0xa295, 0x0008, 0xd0cc, 0x0040, 0x1eb2,
+       0xa295, 0x0400, 0x601c, 0xa084, 0x0002, 0x0040, 0x1eb9, 0xa295,
+       0x0004, 0x602c, 0xa08c, 0x00ff, 0xa182, 0x0002, 0x0048, 0x204d,
+       0xa182, 0x001b, 0x00c8, 0x204d, 0x0040, 0x204d, 0x690e, 0x602c,
+       0x8007, 0xa08c, 0x00ff, 0xa182, 0x0002, 0x0048, 0x204d, 0xa182,
+       0x001b, 0x00c8, 0x204d, 0x0040, 0x204d, 0x6912, 0x6030, 0xa005,
+       0x00c0, 0x1edc, 0x2001, 0x001e, 0x8000, 0x6816, 0x6028, 0xa084,
+       0x00ff, 0x0040, 0x2049, 0x6806, 0x6028, 0x8007, 0xa084, 0x00ff,
+       0x0040, 0x2049, 0x680a, 0x6a02, 0x0078, 0x2051, 0x2001, 0x5240,
+       0x2004, 0xa086, 0x0007, 0x00c0, 0x1f53, 0x2001, 0x5267, 0x2004,
+       0xa084, 0x8000, 0x0040, 0x2049, 0x6114, 0x1078, 0x2180, 0x2001,
+       0x5252, 0x2004, 0x2010, 0x82ff, 0x0040, 0x1f0e, 0xa080, 0x0005,
+       0x2004, 0xa084, 0x00ff, 0xa106, 0x00c0, 0x1f53, 0x2091, 0x8000,
+       0x6a04, 0x6b08, 0x6418, 0xa484, 0x0003, 0x0040, 0x1f2d, 0x6128,
+       0xa18c, 0x00ff, 0x8001, 0x00c0, 0x1f23, 0x2100, 0xa210, 0x0048,
+       0x1f53, 0x0078, 0x1f2d, 0x8001, 0x00c0, 0x1f53, 0x2100, 0xa212,
+       0x0048, 0x1f53, 0x82ff, 0x0040, 0x1f53, 0xa484, 0x000c, 0x0040,
+       0x1f47, 0x6128, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004, 0x00c0,
+       0x1f3f, 0x2100, 0xa318, 0x0048, 0x1f53, 0x0078, 0x1f47, 0xa082,
+       0x0004, 0x00c0, 0x1f53, 0x2100, 0xa31a, 0x0048, 0x1f53, 0x6030,
+       0xa005, 0x0040, 0x1f4d, 0x8000, 0x6816, 0x6a06, 0x6b0a, 0x2091,
+       0x8001, 0x0078, 0x2051, 0x2091, 0x8001, 0x0078, 0x204d, 0x6114,
+       0x1078, 0x2180, 0x2091, 0x8000, 0x6b08, 0x8318, 0x0048, 0x1f65,
+       0x6b0a, 0x2091, 0x8001, 0x0078, 0x2060, 0x2091, 0x8001, 0x0078,
+       0x204d, 0x6024, 0x8007, 0xa084, 0x00ff, 0x0040, 0x1f87, 0xa086,
+       0x0080, 0x00c0, 0x1fc7, 0x20a9, 0x0008, 0x2069, 0x7610, 0x2091,
+       0x8000, 0x6800, 0xa084, 0xfcff, 0x6802, 0xade8, 0x0008, 0x0070,
+       0x1f83, 0x0078, 0x1f79, 0x2091, 0x8001, 0x0078, 0x2051, 0x6028,
+       0xa015, 0x0040, 0x1fc7, 0x6114, 0x1078, 0x2180, 0x0c7e, 0x0d7e,
+       0xade8, 0x0007, 0x2091, 0x8000, 0x6800, 0xa00d, 0x0040, 0x1fc3,
+       0xa206, 0x0040, 0x1f9e, 0x2168, 0x0078, 0x1f94, 0x2160, 0x6000,
+       0x6802, 0x2c68, 0x1078, 0x19ac, 0x0d7f, 0x6818, 0xa00d, 0x0040,
+       0x1fbb, 0x2060, 0x6200, 0x6a1a, 0x6a1c, 0x6202, 0x681e, 0x1078,
+       0x1989, 0x2da0, 0x2198, 0x20a9, 0x0031, 0x53a3, 0x2d60, 0x1078,
+       0x1ccb, 0x0078, 0x1fbe, 0x6808, 0x8000, 0x680a, 0x2091, 0x8001,
+       0x0c7f, 0x0078, 0x2060, 0x2091, 0x8001, 0x0d7f, 0x0c7f, 0x0078,
+       0x2049, 0x6114, 0x1078, 0x2180, 0x6800, 0xa084, 0x0001, 0x0040,
+       0x2039, 0x2091, 0x8000, 0x6a04, 0x8210, 0x0048, 0x1fdc, 0x6a06,
+       0x2091, 0x8001, 0x0078, 0x2060, 0x2091, 0x8001, 0x0078, 0x204d,
+       0x1078, 0x1bc4, 0x00c0, 0x1dd2, 0x6114, 0x1078, 0x2180, 0x60be,
+       0x60bb, 0x0000, 0x6900, 0xa184, 0x0008, 0x0040, 0x1ff3, 0x6020,
+       0xa085, 0x0100, 0x6022, 0xa184, 0x0001, 0x0040, 0x2049, 0xa184,
+       0x0100, 0x00c0, 0x2035, 0xa184, 0x0200, 0x00c0, 0x2031, 0x681c,
+       0xa005, 0x00c0, 0x203d, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000f,
+       0x00c0, 0x200c, 0x1078, 0x2163, 0x78df, 0x0000, 0x6004, 0x8007,
+       0xa084, 0x00ff, 0x78d2, 0x8001, 0x609f, 0x0000, 0x0040, 0x2021,
+       0x1078, 0x2064, 0x0040, 0x2021, 0x78dc, 0xa085, 0x0100, 0x78de,
+       0x007c, 0x78d7, 0x0000, 0x78db, 0x0000, 0x6024, 0xa084, 0xff00,
+       0x6026, 0x1078, 0x3aac, 0x0040, 0x1d4f, 0x1078, 0x1be9, 0x0078,
+       0x1d4f, 0x2009, 0x0017, 0x0078, 0x2053, 0x2009, 0x000e, 0x0078,
+       0x2053, 0x2009, 0x0007, 0x0078, 0x2053, 0x2009, 0x0035, 0x0078,
+       0x2053, 0x2009, 0x003e, 0x0078, 0x2053, 0x2009, 0x0004, 0x0078,
+       0x2053, 0x2009, 0x0006, 0x0078, 0x2053, 0x2009, 0x0016, 0x0078,
+       0x2053, 0x2009, 0x0001, 0x6024, 0xa084, 0xff00, 0xa105, 0x6026,
+       0x2091, 0x8000, 0x1078, 0x1ccb, 0x2091, 0x8001, 0x0078, 0x1d4f,
+       0x1078, 0x199a, 0x0078, 0x1d4f, 0x78d4, 0xa06d, 0x00c0, 0x206f,
+       0x2c00, 0x78d6, 0x78da, 0x609f, 0x0000, 0x0078, 0x207b, 0x2c00,
+       0x689e, 0x609f, 0x0000, 0x78d6, 0x2d00, 0x6002, 0x78d8, 0xad06,
+       0x00c0, 0x207b, 0x6002, 0x78d0, 0x8001, 0x78d2, 0x00c0, 0x2087,
+       0x78dc, 0xa084, 0xfeff, 0x78de, 0x78d8, 0x2060, 0xa006, 0x007c,
+       0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184, 0xe1ff, 0x601e, 0xa184,
+       0x0060, 0x0040, 0x2097, 0x0e7e, 0x1078, 0x48d3, 0x0e7f, 0x6596,
+       0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x6714,
+       0x1078, 0x19c5, 0x2091, 0x8000, 0x60a0, 0xa084, 0x8000, 0x00c0,
+       0x20be, 0x6808, 0xa084, 0x0001, 0x0040, 0x20be, 0x2091, 0x8001,
+       0x1078, 0x1a31, 0x2091, 0x8000, 0x1078, 0x1ccb, 0x2091, 0x8001,
+       0x78d7, 0x0000, 0x78db, 0x0000, 0x0078, 0x2130, 0x6024, 0xa096,
+       0x0001, 0x00c0, 0x20c5, 0x8000, 0x6026, 0x6a10, 0x6814, 0x2091,
+       0x8001, 0xa202, 0x0048, 0x20d4, 0x0040, 0x20d4, 0x2039, 0x0200,
+       0x1078, 0x2131, 0x0078, 0x2130, 0x2c08, 0x2091, 0x8000, 0x60a0,
+       0xa084, 0x8000, 0x0040, 0x2101, 0x6800, 0xa065, 0x0040, 0x2106,
+       0x6a04, 0x0e7e, 0x2071, 0x5240, 0x7000, 0xa084, 0x0001, 0x0040,
+       0x20fb, 0x7048, 0xa206, 0x00c0, 0x20fb, 0x6b04, 0x231c, 0x2160,
+       0x6302, 0x2300, 0xa005, 0x00c0, 0x20f6, 0x6902, 0x2260, 0x6102,
+       0x0e7f, 0x0078, 0x210d, 0x2160, 0x6202, 0x6906, 0x0e7f, 0x0078,
+       0x210d, 0x6800, 0xa065, 0x0040, 0x2106, 0x6102, 0x6902, 0x00c0,
+       0x210a, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160, 0x60a0, 0xa084,
+       0x8000, 0x0040, 0x2117, 0x6808, 0xa084, 0xfffc, 0x680a, 0x6810,
+       0x8000, 0x6812, 0x2091, 0x8001, 0x6808, 0xa08c, 0x0040, 0x0040,
+       0x2126, 0xa086, 0x0040, 0x680a, 0x1078, 0x1a42, 0x2091, 0x8000,
+       0x1078, 0x226f, 0x2091, 0x8001, 0x78db, 0x0000, 0x78d7, 0x0000,
+       0x007c, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x1ccb,
+       0x2091, 0x8001, 0x78d8, 0xa065, 0x0040, 0x2144, 0x609c, 0x78da,
+       0x609f, 0x0000, 0x0078, 0x2134, 0x78d7, 0x0000, 0x78db, 0x0000,
+       0x007c, 0x7990, 0x7894, 0x8000, 0xa10a, 0x00c8, 0x2150, 0xa006,
+       0x7896, 0x70d2, 0x7804, 0xa005, 0x0040, 0x215e, 0x8001, 0x7806,
+       0x00c0, 0x215e, 0x0068, 0x215e, 0x2091, 0x4080, 0x007c, 0x2039,
+       0x2177, 0x0078, 0x2165, 0x2039, 0x217d, 0x2704, 0xa005, 0x0040,
+       0x2176, 0xac00, 0x2068, 0x6b08, 0x6c0c, 0x6910, 0x6a14, 0x690a,
+       0x6a0e, 0x6b12, 0x6c16, 0x8738, 0x0078, 0x2165, 0x007c, 0x0003,
+       0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0015, 0x001b, 0x0000,
+       0x0c7e, 0x1078, 0x3c3b, 0x2c68, 0x0c7f, 0x007c, 0x0010, 0x21f7,
+       0x0068, 0x21f7, 0x2029, 0x0000, 0x78cb, 0x0000, 0x788c, 0xa065,
+       0x0040, 0x21f0, 0x2009, 0x5274, 0x2104, 0xa084, 0x0001, 0x0040,
+       0x21be, 0x6004, 0xa086, 0x0103, 0x00c0, 0x21be, 0x6018, 0xa005,
+       0x00c0, 0x21be, 0x6014, 0xa005, 0x00c0, 0x21be, 0x0d7e, 0x2069,
+       0x0000, 0x6818, 0xa084, 0x0001, 0x00c0, 0x21bd, 0x600c, 0x70c6,
+       0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, 0x2091, 0x4080,
+       0x0d7f, 0x1078, 0x1cf2, 0x0078, 0x21f5, 0x0d7f, 0x1078, 0x21f8,
+       0x0040, 0x21f0, 0x6204, 0xa294, 0x00ff, 0xa296, 0x0003, 0x0040,
+       0x21d0, 0x6204, 0xa296, 0x0110, 0x00c0, 0x21de, 0x78cb, 0x0001,
+       0x6204, 0xa294, 0xff00, 0x8217, 0x8211, 0x0040, 0x21de, 0x85ff,
+       0x00c0, 0x21f0, 0x8210, 0xa202, 0x00c8, 0x21f0, 0x057e, 0x1078,
+       0x2207, 0x057f, 0x0040, 0x21eb, 0x78e0, 0xa086, 0x0003, 0x0040,
+       0x21f0, 0x0078, 0x21de, 0x8528, 0x78c8, 0xa005, 0x0040, 0x218e,
+       0x85ff, 0x0040, 0x21f7, 0x2091, 0x4080, 0x78b0, 0x70d6, 0x007c,
+       0x7bac, 0x79b0, 0x70d4, 0xa102, 0x00c0, 0x2201, 0x2300, 0xa005,
+       0x007c, 0x0048, 0x2205, 0xa302, 0x007c, 0x8002, 0x007c, 0x2001,
+       0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x2221, 0x2091, 0x8000,
+       0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x2256, 0x7008, 0x7208,
+       0xa206, 0x00c0, 0x2256, 0xa286, 0x0008, 0x00c0, 0x2256, 0x2071,
+       0x0010, 0x1078, 0x225b, 0x2009, 0x0020, 0x6004, 0xa086, 0x0103,
+       0x00c0, 0x2230, 0x6028, 0xa005, 0x00c0, 0x2230, 0x2009, 0x000c,
+       0x1078, 0x1976, 0x0040, 0x2249, 0x78c4, 0x8000, 0x78c6, 0xa086,
+       0x0002, 0x00c0, 0x2256, 0x2091, 0x8000, 0x78e3, 0x0003, 0x78c7,
+       0x0000, 0x78cc, 0xa085, 0x0300, 0x78ce, 0x2091, 0x8001, 0x0078,
+       0x2256, 0x78c7, 0x0000, 0x1078, 0x1cf2, 0x79ac, 0x78b0, 0x8000,
+       0xa10a, 0x00c8, 0x2254, 0xa006, 0x78b2, 0xa006, 0x2071, 0x0010,
+       0x2091, 0x8001, 0x007c, 0x8107, 0x8004, 0x8004, 0x7ab8, 0x7bb4,
+       0x7cc0, 0x7dbc, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
+       0x0000, 0x007c, 0x2009, 0x525b, 0x2091, 0x8000, 0x200a, 0x0f7e,
+       0x0e7e, 0x2071, 0x5240, 0x7000, 0xa086, 0x0000, 0x00c0, 0x2289,
+       0x2009, 0x5212, 0x2104, 0xa005, 0x00c0, 0x2289, 0x2079, 0x0100,
+       0x7830, 0xa084, 0x00c0, 0x00c0, 0x2289, 0x0018, 0x2289, 0x781b,
+       0x004b, 0x0e7f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x5240,
+       0x2091, 0x8000, 0x7000, 0xa086, 0x0000, 0x00c0, 0x22a2, 0x2079,
+       0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x22a2, 0x0018, 0x22a2,
+       0x781b, 0x004d, 0x2091, 0x8001, 0x0e7f, 0x0f7f, 0x007c, 0x127e,
+       0x2091, 0x2300, 0x2071, 0x5240, 0x2079, 0x0100, 0x784b, 0x000f,
+       0x0098, 0x22b5, 0x7838, 0x0078, 0x22ae, 0x20a9, 0x0040, 0x7800,
+       0xa082, 0x0004, 0x0048, 0x22be, 0x20a9, 0x0060, 0x789b, 0x0000,
+       0x78af, 0x0000, 0x78af, 0x0000, 0x0070, 0x22c8, 0x0078, 0x22c0,
+       0x7800, 0xa082, 0x0004, 0x0048, 0x22d7, 0x70b7, 0x0093, 0x2019,
+       0x4ff0, 0x1078, 0x2313, 0x702f, 0x8001, 0x0078, 0x22e3, 0x70b7,
+       0x0000, 0x2019, 0x4e70, 0x1078, 0x2313, 0x2019, 0x4eaf, 0x1078,
+       0x2313, 0x702f, 0x8000, 0x7003, 0x0000, 0x1078, 0x2420, 0x7004,
+       0xa084, 0x000f, 0x017e, 0x2009, 0x04fd, 0x210c, 0xa18a, 0x0005,
+       0x0048, 0x22f8, 0x0038, 0x22fe, 0xa085, 0x6280, 0x0078, 0x2300,
+       0x0028, 0x22fe, 0xa085, 0x6280, 0x0078, 0x2300, 0xa085, 0x62c0,
+       0x017f, 0x7806, 0x780f, 0xb204, 0x7843, 0x00d8, 0x7853, 0x0080,
+       0x780b, 0x0008, 0x7047, 0x0008, 0x7053, 0x527f, 0x704f, 0x0000,
+       0x127f, 0x2000, 0x007c, 0x137e, 0x147e, 0x157e, 0x047e, 0x20a1,
+       0x012b, 0x2304, 0xa005, 0x789a, 0x0040, 0x2333, 0x8318, 0x2324,
+       0x8318, 0x2398, 0x24a8, 0xa484, 0xff00, 0x0040, 0x232b, 0xa482,
+       0x0100, 0x20a9, 0x0100, 0x2020, 0x53a6, 0xa005, 0x00c0, 0x2322,
+       0x3318, 0x0078, 0x2319, 0x047f, 0x157f, 0x147f, 0x137f, 0x007c,
+       0xa18c, 0x000f, 0x2011, 0x0101, 0x2204, 0xa084, 0xfff0, 0xa105,
+       0x2012, 0x1078, 0x2420, 0x007c, 0x2011, 0x0101, 0x20a9, 0x0009,
+       0x810b, 0x0070, 0x234d, 0x0078, 0x2348, 0xa18c, 0x0e00, 0x2204,
+       0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2009, 0x0101, 0x20a9,
+       0x0005, 0x8213, 0x0070, 0x235e, 0x0078, 0x2359, 0xa294, 0x00e0,
+       0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x007c, 0x2011, 0x0101,
+       0x20a9, 0x000c, 0x810b, 0x0070, 0x236f, 0x0078, 0x236a, 0xa18c,
+       0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x007c, 0x2011,
+       0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c, 0x8103,
+       0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x62ac,
+       0x63ac, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e,
+       0x2061, 0x0100, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x0c7f,
+       0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100,
+       0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae, 0x0c7f, 0x007c, 0x8103,
+       0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4,
+       0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x0c7f, 0x007c, 0x2091,
+       0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040, 0x23fe, 0x2061,
+       0x7600, 0x1078, 0x2406, 0x0040, 0x23e8, 0x20a9, 0x0000, 0x2061,
+       0x7500, 0x0c7e, 0x1078, 0x2406, 0x0040, 0x23d6, 0x0c7f, 0x8c60,
+       0x0070, 0x23d4, 0x0078, 0x23c9, 0x0078, 0x23fe, 0x007f, 0xa082,
+       0x7500, 0x2071, 0x5240, 0x7086, 0x7182, 0x2001, 0x0004, 0x706e,
+       0x7093, 0x000f, 0x7073, 0x0000, 0x1078, 0x226a, 0x0078, 0x23fa,
+       0x60c0, 0xa005, 0x00c0, 0x23fe, 0x2071, 0x5240, 0x7182, 0x2c00,
+       0x708a, 0x2001, 0x0006, 0x706e, 0x7093, 0x000f, 0x7073, 0x0000,
+       0x1078, 0x226a, 0x2001, 0x0000, 0x0078, 0x2400, 0x2001, 0x0001,
+       0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2c04, 0xa005,
+       0x0040, 0x241d, 0x2060, 0x600c, 0xa306, 0x00c0, 0x241a, 0x6010,
+       0xa206, 0x00c0, 0x241a, 0x6014, 0xa106, 0x00c0, 0x241a, 0xa006,
+       0x0078, 0x241f, 0x6000, 0x0078, 0x2407, 0xa085, 0x0001, 0x007c,
+       0x2011, 0x5241, 0x220c, 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204,
+       0xa084, 0x0100, 0x0040, 0x2436, 0x2021, 0xff04, 0x2122, 0x810b,
+       0x810b, 0x810b, 0x810b, 0xa18d, 0x0f00, 0x2104, 0x007c, 0x0e7e,
+       0x68e4, 0xa08c, 0x0020, 0x0040, 0x248a, 0xa084, 0x0006, 0x00c0,
+       0x248a, 0x6014, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
+       0xa0f0, 0x5480, 0x7004, 0xa084, 0x000a, 0x00c0, 0x248a, 0x7108,
+       0xa194, 0xff00, 0x0040, 0x248a, 0xa18c, 0x00ff, 0x2001, 0x000c,
+       0xa106, 0x0040, 0x2471, 0x2001, 0x0012, 0xa106, 0x0040, 0x2475,
+       0x2001, 0x0014, 0xa106, 0x0040, 0x2479, 0x2001, 0x0019, 0xa106,
+       0x0040, 0x247d, 0x2001, 0x0032, 0xa106, 0x0040, 0x2481, 0x0078,
+       0x2485, 0x2009, 0x0012, 0x0078, 0x2487, 0x2009, 0x0014, 0x0078,
+       0x2487, 0x2009, 0x0019, 0x0078, 0x2487, 0x2009, 0x0020, 0x0078,
+       0x2487, 0x2009, 0x003f, 0x0078, 0x2487, 0x2011, 0x0000, 0x2100,
+       0xa205, 0x700a, 0x0e7f, 0x007c, 0x0068, 0x248c, 0x2091, 0x8000,
+       0x2071, 0x0000, 0x007e, 0x7018, 0xa084, 0x0001, 0x00c0, 0x2493,
+       0x007f, 0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002,
+       0x70db, 0x0741, 0x70df, 0x0006, 0x2071, 0x0000, 0x701b, 0x0001,
+       0x2091, 0x4080, 0x0078, 0x24aa, 0x107e, 0x007e, 0x127e, 0x2091,
+       0x2300, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x77c2, 0x74c6, 0x76ca,
+       0x75ce, 0xa594, 0x003f, 0xa49c, 0x0003, 0xa484, 0x000f, 0x0079,
+       0x24c1, 0x24d3, 0x24d3, 0x24d3, 0x280d, 0x3a09, 0x24d1, 0x2502,
+       0x250c, 0x24d1, 0x24d1, 0x24d1, 0x24d1, 0x24d1, 0x24d1, 0x24d1,
+       0x24d1, 0x1078, 0x248c, 0x8507, 0xa084, 0x001f, 0x0079, 0x24d8,
+       0x2516, 0x280d, 0x29c7, 0x2ac4, 0x2aec, 0x2d8c, 0x3037, 0x309a,
+       0x30fb, 0x3180, 0x3238, 0x32d6, 0x2502, 0x28e9, 0x300c, 0x24f8,
+       0x3dac, 0x3dcc, 0x3f8f, 0x3f9b, 0x4074, 0x24f8, 0x24f8, 0x4149,
+       0x414d, 0x3daa, 0x24f8, 0x3efa, 0x24f8, 0x3c5e, 0x250c, 0x24f8,
+       0x1078, 0x248c, 0x0018, 0x24b1, 0x127f, 0x2091, 0x8001, 0x007f,
+       0x107f, 0x007c, 0x2019, 0x4f49, 0x1078, 0x2313, 0x702f, 0x0001,
+       0x781b, 0x004f, 0x0078, 0x24fa, 0x2019, 0x4eaf, 0x1078, 0x2313,
+       0x702f, 0x8000, 0x781b, 0x00cd, 0x0078, 0x24fa, 0x7242, 0x2009,
+       0x520f, 0x200b, 0x0000, 0xa584, 0x0001, 0x00c0, 0x3c72, 0x0040,
+       0x2533, 0x1078, 0x248c, 0x7003, 0x0000, 0x704b, 0x0000, 0x7043,
+       0x0000, 0x7037, 0x0000, 0x1078, 0x39e0, 0x0018, 0x24b1, 0x2009,
+       0x520f, 0x200b, 0x0000, 0x7068, 0xa005, 0x00c0, 0x25fe, 0x706c,
+       0xa084, 0x0007, 0x0079, 0x253c, 0x2635, 0x2544, 0x2550, 0x256d,
+       0x258f, 0x25dc, 0x25b5, 0x2544, 0x1078, 0x39c8, 0x2009, 0x0048,
+       0x1078, 0x2ed8, 0x00c0, 0x254e, 0x7003, 0x0004, 0x0078, 0x24fa,
+       0x1078, 0x39c8, 0x00c0, 0x256b, 0x7080, 0x8007, 0x7882, 0x789b,
+       0x0010, 0x78ab, 0x000c, 0x789b, 0x0060, 0x78ab, 0x0001, 0x785b,
+       0x0004, 0x2009, 0x00dd, 0x1078, 0x2ecc, 0x00c0, 0x256b, 0x7003,
+       0x0004, 0x7093, 0x000f, 0x0078, 0x24fa, 0x1078, 0x39c8, 0x00c0,
+       0x258d, 0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f,
+       0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab,
+       0x0002, 0x785b, 0x0004, 0x2009, 0x00dd, 0x1078, 0x2ecc, 0x00c0,
+       0x258d, 0x7003, 0x0004, 0x7093, 0x000f, 0x0078, 0x24fa, 0x1078,
+       0x39c8, 0x00c0, 0x25b3, 0x7180, 0x8107, 0x7882, 0x789b, 0x0010,
+       0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x7184,
+       0x79aa, 0x78ab, 0x000d, 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b,
+       0x0004, 0x2009, 0x00dd, 0x1078, 0x2ecc, 0x00c0, 0x25b3, 0x7003,
+       0x0004, 0x7093, 0x000f, 0x0078, 0x24fa, 0x1078, 0x39c8, 0x00c0,
+       0x25da, 0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f,
+       0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab,
+       0x0002, 0x785b, 0x0004, 0x2009, 0x00dd, 0x1078, 0x2ecc, 0x00c0,
+       0x25da, 0x7088, 0x708b, 0x0000, 0x2068, 0x704a, 0x7003, 0x0002,
+       0x7093, 0x000f, 0x0078, 0x24fa, 0x1078, 0x39c8, 0x00c0, 0x24fa,
+       0x7088, 0x2068, 0x6f14, 0x1078, 0x38bd, 0x2c50, 0x1078, 0x3a7a,
+       0x789b, 0x0010, 0x6814, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa,
+       0x6e1c, 0x2041, 0x0001, 0x708c, 0xa084, 0x0400, 0x2001, 0x0004,
+       0x0040, 0x25fc, 0x2001, 0x0006, 0x0078, 0x271d, 0x1078, 0x39c8,
+       0x00c0, 0x24fa, 0x789b, 0x0010, 0x7068, 0x2068, 0x6f14, 0x1078,
+       0x38bd, 0x2c50, 0x1078, 0x3a7a, 0x6008, 0xa085, 0x0010, 0x600a,
+       0x6824, 0xa005, 0x0040, 0x261c, 0xa082, 0x0006, 0x0048, 0x261a,
+       0x0078, 0x261c, 0x6827, 0x0005, 0x6b14, 0xa39c, 0x001f, 0xa39d,
+       0x00c0, 0x7058, 0xa084, 0x8000, 0x0040, 0x262a, 0xa684, 0x0001,
+       0x0040, 0x262c, 0xa39c, 0xffbf, 0x7baa, 0x2031, 0x0020, 0x2041,
+       0x0001, 0x2001, 0x0003, 0x0078, 0x271d, 0x0018, 0x24b1, 0x744c,
+       0xa485, 0x0000, 0x0040, 0x264f, 0xa080, 0x5280, 0x2030, 0x7150,
+       0x8108, 0xa12a, 0x0048, 0x2646, 0x2009, 0x5280, 0x2164, 0x6504,
+       0x85ff, 0x00c0, 0x2660, 0x8421, 0x00c0, 0x2640, 0x7152, 0x7003,
+       0x0000, 0x704b, 0x0000, 0x7040, 0xa005, 0x0040, 0x3c72, 0x0078,
+       0x24fa, 0x764c, 0xa6b0, 0x5280, 0x7150, 0x2600, 0x0078, 0x264b,
+       0x7152, 0x2568, 0x2558, 0x754a, 0x2c50, 0x6034, 0xa085, 0x0000,
+       0x00c0, 0x265d, 0x6708, 0x773a, 0xa784, 0x033f, 0x0040, 0x2696,
+       0xa784, 0x0021, 0x00c0, 0x265d, 0xa784, 0x0002, 0x0040, 0x267f,
+       0xa784, 0x0004, 0x0040, 0x265d, 0xa7bc, 0xfffb, 0x670a, 0xa784,
+       0x0008, 0x00c0, 0x265d, 0xa784, 0x0010, 0x00c0, 0x265d, 0xa784,
+       0x0200, 0x00c0, 0x265d, 0xa784, 0x0100, 0x0040, 0x2696, 0x6018,
+       0xa005, 0x00c0, 0x265d, 0xa7bc, 0xfeff, 0x670a, 0x6823, 0x0000,
+       0x6e1c, 0xa684, 0x000e, 0x6118, 0x0040, 0x26a6, 0x601c, 0xa102,
+       0x0048, 0x26a9, 0x0040, 0x26a9, 0x0078, 0x2659, 0x81ff, 0x00c0,
+       0x2659, 0x68c3, 0x0000, 0xa784, 0x0080, 0x00c0, 0x26b1, 0x700c,
+       0x6022, 0xa7bc, 0xff7f, 0x670a, 0x1078, 0x3a7a, 0x0018, 0x24b1,
+       0x789b, 0x0010, 0xa046, 0x1078, 0x39c8, 0x00c0, 0x24fa, 0x6b14,
+       0xa39c, 0x001f, 0xa39d, 0x00c0, 0x7058, 0xa084, 0x8000, 0x0040,
+       0x26cd, 0xa684, 0x0001, 0x0040, 0x26cf, 0xa39c, 0xffbf, 0xa684,
+       0x0010, 0x0040, 0x26d5, 0xa39d, 0x0020, 0x7baa, 0x8840, 0xa684,
+       0x000e, 0x00c0, 0x26e0, 0xa7bd, 0x0010, 0x670a, 0x0078, 0x271b,
+       0x7158, 0xa18c, 0x0800, 0x0040, 0x34cb, 0x2011, 0x0020, 0xa684,
+       0x0008, 0x00c0, 0x26f1, 0x8210, 0xa684, 0x0002, 0x00c0, 0x26f1,
+       0x8210, 0x7aaa, 0x8840, 0x1078, 0x39e0, 0x6a14, 0x610c, 0x8108,
+       0xa18c, 0x00ff, 0xa1e0, 0x7500, 0x2c64, 0x8cff, 0x0040, 0x2712,
+       0x6014, 0xa206, 0x00c0, 0x26fc, 0x60b8, 0x8001, 0x60ba, 0x00c0,
+       0x26f7, 0x0c7e, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f,
+       0x0078, 0x2635, 0x1078, 0x39c8, 0x00c0, 0x24fa, 0x2a60, 0x610e,
+       0x79aa, 0x8840, 0x7132, 0x2001, 0x0001, 0x007e, 0x715c, 0xa184,
+       0x0018, 0x0040, 0x2738, 0xa184, 0x0010, 0x0040, 0x272b, 0x1078,
+       0x36d0, 0x00c0, 0x275b, 0xa184, 0x0008, 0x0040, 0x2738, 0x69a0,
+       0xa184, 0x0600, 0x00c0, 0x2738, 0x1078, 0x35bb, 0x0078, 0x275b,
+       0x69a0, 0xa184, 0x0800, 0x0040, 0x274f, 0x0c7e, 0x027e, 0x2960,
+       0x6000, 0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106,
+       0x027f, 0x0c7f, 0x1078, 0x36d0, 0x00c0, 0x275b, 0x69a0, 0xa184,
+       0x0200, 0x0040, 0x2757, 0x1078, 0x360c, 0x0078, 0x275b, 0xa184,
+       0x0400, 0x00c0, 0x2734, 0x69a0, 0xa184, 0x1000, 0x0040, 0x2766,
+       0x6914, 0xa18c, 0xff00, 0x810f, 0x1078, 0x238b, 0x007f, 0x7002,
+       0xa68c, 0x00e0, 0xa684, 0x0060, 0x0040, 0x2774, 0xa086, 0x0060,
+       0x00c0, 0x2774, 0xa18d, 0x4000, 0x88ff, 0x0040, 0x2779, 0xa18d,
+       0x0004, 0x795a, 0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b,
+       0x0061, 0x6818, 0xa08d, 0x8000, 0xa084, 0x7fff, 0x691a, 0xa68c,
+       0x0080, 0x0040, 0x2798, 0x7097, 0x0000, 0xa08a, 0x000d, 0x0050,
+       0x2796, 0xa08a, 0x000c, 0x7196, 0x2001, 0x000c, 0x800c, 0x719a,
+       0x78aa, 0x8008, 0x810c, 0x0040, 0x34d1, 0xa18c, 0x00f8, 0x00c0,
+       0x34d1, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000,
+       0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f,
+       0x157f, 0x6814, 0x8007, 0x7882, 0x6d94, 0x7dd6, 0x7dde, 0x6e98,
+       0x7ed2, 0x7eda, 0x1078, 0x39c8, 0x00c0, 0x27cf, 0x702c, 0x8003,
+       0x0048, 0x27c8, 0x2019, 0x4eaf, 0x1078, 0x2313, 0x702f, 0x8000,
+       0x7830, 0xa084, 0x00c0, 0x00c0, 0x27cf, 0x0098, 0x27d7, 0x6008,
+       0xa084, 0xffef, 0x600a, 0x1078, 0x39e0, 0x0078, 0x2523, 0x7200,
+       0xa284, 0x0007, 0xa086, 0x0001, 0x00c0, 0x27e4, 0x781b, 0x004f,
+       0x1078, 0x39e0, 0x0078, 0x27f5, 0x6ab4, 0xa295, 0x2000, 0x7a5a,
+       0x781b, 0x004f, 0x1078, 0x39e0, 0x7200, 0x2500, 0xa605, 0x0040,
+       0x27f5, 0xa284, 0x0007, 0x1079, 0x2803, 0xad80, 0x0009, 0x7036,
+       0xa284, 0x0007, 0xa086, 0x0001, 0x00c0, 0x24fa, 0x6018, 0x8000,
+       0x601a, 0x0078, 0x24fa, 0x280b, 0x4b4b, 0x4b4b, 0x4b3a, 0x4b4b,
+       0x280b, 0x4b3a, 0x280b, 0x1078, 0x248c, 0x1078, 0x39c8, 0x0f7e,
+       0x2079, 0x5200, 0x78cc, 0x0f7f, 0xa084, 0x0001, 0x0040, 0x2831,
+       0x706c, 0xa086, 0x0001, 0x00c0, 0x2820, 0x706e, 0x0078, 0x28c4,
+       0x706c, 0xa086, 0x0005, 0x00c0, 0x282f, 0x7088, 0x2068, 0x681b,
+       0x0004, 0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x706f,
+       0x0000, 0x2011, 0x0004, 0x716c, 0xa186, 0x0001, 0x0040, 0x2852,
+       0xa186, 0x0007, 0x00c0, 0x2842, 0x2009, 0x5238, 0x200b, 0x0005,
+       0x0078, 0x2852, 0x2009, 0x5213, 0x2104, 0x2009, 0x5212, 0x200a,
+       0x2009, 0x5238, 0x200b, 0x0001, 0x706f, 0x0000, 0x7073, 0x0001,
+       0x0078, 0x2854, 0x706f, 0x0000, 0x1078, 0x4887, 0x157e, 0x20a9,
+       0x0010, 0x2039, 0x0000, 0x1078, 0x37b0, 0xa7b8, 0x0100, 0x0070,
+       0x2863, 0x0078, 0x285b, 0x157f, 0x7000, 0x0079, 0x2867, 0x2895,
+       0x287c, 0x287c, 0x286f, 0x2895, 0x2895, 0x2895, 0x2895, 0x2021,
+       0x525a, 0x2404, 0xa005, 0x0040, 0x2895, 0xad06, 0x00c0, 0x287c,
+       0x6800, 0x2022, 0x0078, 0x288c, 0x6820, 0xa084, 0x0001, 0x00c0,
+       0x2888, 0x6f14, 0x1078, 0x38bd, 0x1078, 0x34a2, 0x0078, 0x288c,
+       0x7060, 0x2060, 0x6800, 0x6002, 0x6a1a, 0x6817, 0x0000, 0x6820,
+       0xa085, 0x0008, 0x6822, 0x1078, 0x1cdc, 0x2021, 0x7600, 0x1078,
+       0x28d1, 0x2021, 0x525a, 0x1078, 0x28d1, 0x157e, 0x20a9, 0x0000,
+       0x2021, 0x7500, 0x1078, 0x28d1, 0x8420, 0x0070, 0x28a9, 0x0078,
+       0x28a2, 0x2061, 0x5500, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6018,
+       0x6110, 0x81ff, 0x0040, 0x28b8, 0xa102, 0x0050, 0x28b8, 0x6012,
+       0x601b, 0x0000, 0xace0, 0x0010, 0x0070, 0x28c0, 0x0078, 0x28af,
+       0x8421, 0x00c0, 0x28ad, 0x157f, 0x709c, 0xa084, 0x8000, 0x0040,
+       0x28cb, 0x1078, 0x3ace, 0x7003, 0x0000, 0x704b, 0x0000, 0x0078,
+       0x24fa, 0x047e, 0x2404, 0xa005, 0x0040, 0x28e5, 0x2068, 0x6800,
+       0x007e, 0x6a1a, 0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822,
+       0x1078, 0x1cdc, 0x007f, 0x0078, 0x28d3, 0x047f, 0x2023, 0x0000,
+       0x007c, 0xa282, 0x0003, 0x0050, 0x28ef, 0x1078, 0x248c, 0x2300,
+       0x0079, 0x28f2, 0x28f5, 0x2968, 0x2985, 0xa282, 0x0002, 0x0040,
+       0x28fb, 0x1078, 0x248c, 0x706c, 0x706f, 0x0000, 0x7093, 0x0000,
+       0x0079, 0x2902, 0x290a, 0x290a, 0x290c, 0x2940, 0x34d7, 0x290a,
+       0x2940, 0x290a, 0x1078, 0x248c, 0x7780, 0x1078, 0x37b0, 0x7780,
+       0xa7bc, 0x0f00, 0x1078, 0x38bd, 0x6018, 0xa005, 0x0040, 0x2937,
+       0x2021, 0x7600, 0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x29a0,
+       0x0040, 0x2937, 0x157e, 0x20a9, 0x0000, 0x2021, 0x7500, 0x047e,
+       0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x29a0, 0x047f, 0x0040,
+       0x2936, 0x8420, 0x0070, 0x2936, 0x0078, 0x2927, 0x157f, 0x8738,
+       0xa784, 0x001f, 0x00c0, 0x2912, 0x0078, 0x2523, 0x0078, 0x2523,
+       0x7780, 0x1078, 0x38bd, 0x6018, 0xa005, 0x0040, 0x2966, 0x2021,
+       0x7600, 0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x29a0, 0x0040,
+       0x2966, 0x157e, 0x20a9, 0x0000, 0x2021, 0x7500, 0x047e, 0x2009,
+       0x0005, 0x2011, 0x0020, 0x1078, 0x29a0, 0x047f, 0x0040, 0x2965,
+       0x8420, 0x0070, 0x2965, 0x0078, 0x2956, 0x157f, 0x0078, 0x2523,
+       0x2200, 0x0079, 0x296b, 0x296e, 0x2970, 0x2970, 0x1078, 0x248c,
+       0x2009, 0x0012, 0x706c, 0xa086, 0x0002, 0x0040, 0x2979, 0x2009,
+       0x000e, 0x6818, 0xa084, 0x8000, 0x0040, 0x297f, 0x691a, 0x706f,
+       0x0000, 0x7073, 0x0001, 0x0078, 0x3956, 0x2200, 0x0079, 0x2988,
+       0x298d, 0x2970, 0x298b, 0x1078, 0x248c, 0x1078, 0x4887, 0x7000,
+       0xa086, 0x0001, 0x00c0, 0x3467, 0x1078, 0x34b8, 0x6008, 0xa084,
+       0xffef, 0x600a, 0x1078, 0x345a, 0x0040, 0x3467, 0x0078, 0x2635,
+       0x2404, 0xa005, 0x0040, 0x29c3, 0x2068, 0x2d04, 0x007e, 0x6814,
+       0xa706, 0x0040, 0x29af, 0x2d20, 0x007f, 0x0078, 0x29a1, 0x007f,
+       0x2022, 0x691a, 0x6817, 0x0000, 0x6820, 0xa205, 0x6822, 0x1078,
+       0x1cdc, 0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a,
+       0x1078, 0x34b8, 0x007c, 0xa085, 0x0001, 0x0078, 0x29c2, 0x2300,
+       0x0079, 0x29ca, 0x29cf, 0x29cd, 0x2a68, 0x1078, 0x248c, 0x78ec,
+       0xa084, 0x0001, 0x00c0, 0x29e3, 0x7000, 0xa086, 0x0004, 0x00c0,
+       0x29db, 0x0078, 0x2a06, 0x1078, 0x34b8, 0x6008, 0xa084, 0xffef,
+       0x600a, 0x0078, 0x3467, 0x78e4, 0xa005, 0x00d0, 0x2a06, 0x0018,
+       0x24fa, 0x2008, 0xa084, 0x0030, 0x00c0, 0x29f2, 0x781b, 0x004f,
+       0x0078, 0x24fa, 0x78ec, 0xa084, 0x0003, 0x0040, 0x29ee, 0x2100,
+       0xa084, 0x0007, 0x0079, 0x29fc, 0x2a3f, 0x2a4a, 0x2a30, 0x2a04,
+       0x39bb, 0x39bb, 0x2a04, 0x2a59, 0x1078, 0x248c, 0x7000, 0xa086,
+       0x0004, 0x00c0, 0x2a20, 0x706c, 0xa086, 0x0002, 0x00c0, 0x2a16,
+       0x2011, 0x0002, 0x2019, 0x0000, 0x0078, 0x28e9, 0x706c, 0xa086,
+       0x0006, 0x0040, 0x2a10, 0x706c, 0xa086, 0x0004, 0x0040, 0x2a10,
+       0x79e4, 0xa184, 0x0030, 0x0040, 0x2a2a, 0x78ec, 0xa084, 0x0003,
+       0x00c0, 0x2a2c, 0x0078, 0x300c, 0x2001, 0x0003, 0x0078, 0x2da0,
+       0x6818, 0xa084, 0x8000, 0x0040, 0x2a37, 0x681b, 0x001d, 0x1078,
+       0x378f, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x24fa, 0x6818,
+       0xa084, 0x8000, 0x0040, 0x2a46, 0x681b, 0x001d, 0x1078, 0x378f,
+       0x0078, 0x3986, 0x6818, 0xa084, 0x8000, 0x0040, 0x2a51, 0x681b,
+       0x001d, 0x1078, 0x378f, 0x782b, 0x3008, 0x781b, 0x00ca, 0x0078,
+       0x24fa, 0x6818, 0xa084, 0x8000, 0x0040, 0x2a60, 0x681b, 0x001d,
+       0x1078, 0x378f, 0x782b, 0x3008, 0x781b, 0x008f, 0x0078, 0x24fa,
+       0xa584, 0x000f, 0x00c0, 0x2a85, 0x7000, 0x0079, 0x2a6f, 0x2523,
+       0x2a79, 0x2a77, 0x3467, 0x3467, 0x3467, 0x3467, 0x2a77, 0x1078,
+       0x248c, 0x1078, 0x34b8, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078,
+       0x345a, 0x0040, 0x3467, 0x0078, 0x2635, 0x78e4, 0xa005, 0x00d0,
+       0x2a06, 0x0018, 0x2a06, 0x2008, 0xa084, 0x0030, 0x00c0, 0x2a94,
+       0x781b, 0x004f, 0x0078, 0x24fa, 0x78ec, 0xa084, 0x0003, 0x0040,
+       0x2a90, 0x2100, 0xa184, 0x0007, 0x0079, 0x2a9e, 0x2ab0, 0x2ab4,
+       0x2aa8, 0x2aa6, 0x39bb, 0x39bb, 0x2aa6, 0x39b1, 0x1078, 0x248c,
+       0x1078, 0x3797, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x24fa,
+       0x1078, 0x3797, 0x0078, 0x3986, 0x1078, 0x3797, 0x782b, 0x3008,
+       0x781b, 0x00ca, 0x0078, 0x24fa, 0x1078, 0x3797, 0x782b, 0x3008,
+       0x781b, 0x008f, 0x0078, 0x24fa, 0x2300, 0x0079, 0x2ac7, 0x2acc,
+       0x2aca, 0x2ace, 0x1078, 0x248c, 0x0078, 0x3180, 0x681b, 0x0008,
+       0x78a3, 0x0000, 0x79e4, 0xa184, 0x0030, 0x0040, 0x3180, 0x78ec,
+       0xa084, 0x0003, 0x0040, 0x3180, 0xa184, 0x0007, 0x0079, 0x2ae0,
+       0x2ae8, 0x2ab4, 0x2a30, 0x3956, 0x39bb, 0x39bb, 0x2ae8, 0x39b1,
+       0x1078, 0x396a, 0x0078, 0x24fa, 0xa282, 0x0005, 0x0050, 0x2af2,
+       0x1078, 0x248c, 0x2300, 0x0079, 0x2af5, 0x2af8, 0x2d4d, 0x2d5b,
+       0x2200, 0x0079, 0x2afb, 0x2b15, 0x2b02, 0x2b15, 0x2b00, 0x2d32,
+       0x1078, 0x248c, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa082,
+       0x0020, 0x0048, 0x376b, 0xa08a, 0x0004, 0x00c8, 0x376b, 0x0079,
+       0x2b11, 0x376b, 0x376b, 0x376b, 0x3719, 0x789b, 0x0018, 0x79a8,
+       0xa184, 0x0080, 0x0040, 0x2b26, 0x0078, 0x376b, 0x7000, 0xa005,
+       0x00c0, 0x2b1c, 0x2011, 0x0004, 0x0078, 0x32e9, 0xa184, 0x00ff,
+       0xa08a, 0x0010, 0x00c8, 0x376b, 0x0079, 0x2b2e, 0x2b40, 0x2b3e,
+       0x2b58, 0x2b5c, 0x2c17, 0x376b, 0x376b, 0x2c19, 0x376b, 0x376b,
+       0x2d2e, 0x2d2e, 0x376b, 0x376b, 0x376b, 0x2d30, 0x1078, 0x248c,
+       0xa684, 0x1000, 0x0040, 0x2b4d, 0x2001, 0x0500, 0x8000, 0x8000,
+       0x783a, 0x781b, 0x008d, 0x0078, 0x24fa, 0x6818, 0xa084, 0x8000,
+       0x0040, 0x2b56, 0x681b, 0x001d, 0x0078, 0x2b44, 0x0078, 0x3956,
+       0x681b, 0x001d, 0x0078, 0x377b, 0x6920, 0x6922, 0xa684, 0x1800,
+       0x00c0, 0x2b9d, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2ba5, 0x6818,
+       0xa086, 0x0008, 0x00c0, 0x2b6e, 0x681b, 0x0000, 0xa684, 0x0400,
+       0x0040, 0x2c13, 0xa684, 0x0080, 0x0040, 0x2b99, 0x7097, 0x0000,
+       0x6818, 0xa084, 0x003f, 0xa08a, 0x000d, 0x0050, 0x2b99, 0xa08a,
+       0x000c, 0x7196, 0x2001, 0x000c, 0x800c, 0x719a, 0x789b, 0x0061,
+       0x78aa, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000,
+       0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f,
+       0x157f, 0x781b, 0x0058, 0x0078, 0x24fa, 0xa684, 0x1000, 0x0040,
+       0x2ba5, 0x781b, 0x0065, 0x0078, 0x24fa, 0xa684, 0x0060, 0x0040,
+       0x2c0f, 0xa684, 0x0800, 0x0040, 0x2c0f, 0xa684, 0x8000, 0x00c0,
+       0x2bb3, 0x0078, 0x2bcb, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb6, 0x7adc,
+       0x79d8, 0x78d0, 0x801b, 0x00c8, 0x2bbe, 0x8000, 0xa084, 0x003f,
+       0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94,
+       0x2200, 0xa303, 0x68ae, 0xa684, 0x4000, 0x0040, 0x2bd3, 0xa6b4,
+       0xbfff, 0x7e5a, 0x6eb6, 0x7000, 0xa086, 0x0003, 0x00c0, 0x2be0,
+       0x1078, 0x493d, 0x1078, 0x4b3a, 0x781b, 0x0064, 0x0078, 0x24fa,
+       0xa006, 0x1078, 0x4c41, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200,
+       0xa105, 0x0040, 0x2bef, 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa,
+       0x7cd2, 0x7cda, 0x6ba6, 0x7bd6, 0x7bde, 0x2300, 0xa405, 0x00c0,
+       0x2c01, 0xa6b5, 0x4000, 0x7e5a, 0x6eb6, 0x781b, 0x0064, 0x0078,
+       0x24fa, 0x781b, 0x0064, 0x2200, 0xa115, 0x00c0, 0x2c0b, 0x1078,
+       0x4b4b, 0x0078, 0x24fa, 0x1078, 0x4b96, 0x0078, 0x24fa, 0x781b,
+       0x0065, 0x0078, 0x24fa, 0x781b, 0x0058, 0x0078, 0x24fa, 0x1078,
+       0x248c, 0x0078, 0x2c7a, 0x6920, 0xa184, 0x0100, 0x0040, 0x2c31,
+       0xa18c, 0xfeff, 0x6922, 0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084,
+       0xefff, 0x6002, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078,
+       0x2c69, 0xa184, 0x0200, 0x0040, 0x2c69, 0xa18c, 0xfdff, 0x6922,
+       0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084, 0xdfff, 0x6002, 0x6004,
+       0xa084, 0xffef, 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008,
+       0x0040, 0x2c69, 0x1078, 0x38b9, 0x1078, 0x35bb, 0x88ff, 0x0040,
+       0x2c69, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5, 0x0004,
+       0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2c63, 0x782b, 0x3008, 0x781b,
+       0x0056, 0x0078, 0x24fa, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078,
+       0x24fa, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2c72, 0x781b, 0x0058,
+       0x0078, 0x24fa, 0x781b, 0x0065, 0x0078, 0x24fa, 0x0078, 0x3773,
+       0x0078, 0x3773, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x00c0,
+       0x2c88, 0x6820, 0xa084, 0x0100, 0x0040, 0x2c78, 0x2009, 0x0008,
+       0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x00c0,
+       0x2cbf, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, 0x2cb7,
+       0x0048, 0x2c9c, 0x0078, 0x2cb9, 0xa380, 0x0002, 0xa102, 0x00c8,
+       0x2cb7, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0c7e, 0x7054, 0x2060,
+       0x6000, 0xa084, 0xefef, 0x6002, 0x6004, 0xa084, 0xffe5, 0x6006,
+       0x0c7f, 0x7e58, 0xa6b4, 0xfffb, 0x7e5a, 0x0078, 0x2c6a, 0x0078,
+       0x2c1b, 0x24a8, 0x7aa8, 0x00f0, 0x2cb9, 0x0078, 0x2c8a, 0xa284,
+       0x00f0, 0xa086, 0x0020, 0x00c0, 0x2d1f, 0x8318, 0x8318, 0x2300,
+       0xa102, 0x0040, 0x2ccf, 0x0048, 0x2ccf, 0x0078, 0x2d1c, 0xa286,
+       0x0023, 0x0040, 0x2c78, 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58,
+       0xa684, 0xfff1, 0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008, 0xa085,
+       0x0010, 0x600a, 0x0c7e, 0x7054, 0x2060, 0x6004, 0x2008, 0x2c48,
+       0x0c7f, 0xa184, 0x0010, 0x0040, 0x2cf3, 0x1078, 0x38b9, 0x1078,
+       0x36d0, 0x0078, 0x2d02, 0x0c7e, 0x7054, 0x2060, 0x6004, 0x2008,
+       0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2c69, 0x1078, 0x38b9,
+       0x1078, 0x35bb, 0x88ff, 0x0040, 0x2c69, 0x789b, 0x0060, 0x2800,
+       0x78aa, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2d16,
+       0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x24fa, 0x782b, 0x3008,
+       0x781b, 0x0065, 0x0078, 0x24fa, 0x7aa8, 0x0078, 0x2c8a, 0x8318,
+       0x2300, 0xa102, 0x0040, 0x2d28, 0x0048, 0x2d28, 0x0078, 0x2c8a,
+       0xa284, 0x0080, 0x00c0, 0x377b, 0x0078, 0x3773, 0x0078, 0x377b,
+       0x0078, 0x376b, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa08e,
+       0x0001, 0x0040, 0x2d3d, 0x1078, 0x248c, 0x7aa8, 0xa294, 0x00ff,
+       0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x376b, 0x0079,
+       0x2d49, 0x376b, 0x3508, 0x376b, 0x3665, 0xa282, 0x0000, 0x00c0,
+       0x2d53, 0x1078, 0x248c, 0x1078, 0x378f, 0x782b, 0x3008, 0x781b,
+       0x0065, 0x0078, 0x24fa, 0xa282, 0x0003, 0x00c0, 0x2d61, 0x1078,
+       0x248c, 0xa484, 0x8000, 0x00c0, 0x2d84, 0x706c, 0xa005, 0x0040,
+       0x2d6b, 0x1078, 0x248c, 0x6f14, 0x7782, 0xa7bc, 0x0f00, 0x1078,
+       0x38bd, 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x001f,
+       0x00c0, 0x2d6f, 0x1078, 0x3793, 0x706f, 0x0002, 0x2009, 0x5238,
+       0x200b, 0x0009, 0x0078, 0x2d86, 0x1078, 0x379f, 0x782b, 0x3008,
+       0x781b, 0x0065, 0x0078, 0x24fa, 0xa282, 0x0004, 0x0050, 0x2d92,
+       0x1078, 0x248c, 0x2300, 0x0079, 0x2d95, 0x2d98, 0x2e81, 0x2eb4,
+       0xa286, 0x0003, 0x0040, 0x2d9e, 0x1078, 0x248c, 0x2001, 0x0000,
+       0x007e, 0x68c0, 0xa005, 0x0040, 0x2da7, 0x7003, 0x0003, 0x68a0,
+       0xa084, 0x2000, 0x0040, 0x2db0, 0x6008, 0xa085, 0x0002, 0x600a,
+       0x007f, 0x703e, 0x7000, 0xa084, 0x0007, 0x0079, 0x2db7, 0x2523,
+       0x2dc1, 0x2dc1, 0x2fb6, 0x2ff2, 0x2523, 0x2ff2, 0x2dbf, 0x1078,
+       0x248c, 0xa684, 0x1000, 0x00c0, 0x2dc9, 0x1078, 0x4887, 0x0040,
+       0x2e5b, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x2e11, 0xa186, 0x0008,
+       0x00c0, 0x2de0, 0x1078, 0x34b8, 0x6008, 0xa084, 0xffef, 0x600a,
+       0x1078, 0x345a, 0x0040, 0x2e11, 0x1078, 0x4887, 0x0078, 0x2df8,
+       0xa186, 0x0028, 0x00c0, 0x2e11, 0x1078, 0x4887, 0x6008, 0xa084,
+       0xffef, 0x600a, 0x6018, 0xa005, 0x0040, 0x2df8, 0x8001, 0x601a,
+       0xa005, 0x0040, 0x2df8, 0x8001, 0xa005, 0x0040, 0x2df8, 0x601e,
+       0x6820, 0xa084, 0x0001, 0x0040, 0x2523, 0x6820, 0xa084, 0xfffe,
+       0x6822, 0x7060, 0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004,
+       0x6802, 0xa005, 0x2d00, 0x00c0, 0x2e0e, 0x6002, 0x6006, 0x0078,
+       0x2523, 0x017e, 0x1078, 0x2ee5, 0x017f, 0xa684, 0xdf00, 0x681e,
+       0x682b, 0x0000, 0x6f14, 0x81ff, 0x0040, 0x2e5b, 0xa186, 0x0002,
+       0x00c0, 0x2e5b, 0xa684, 0x0800, 0x00c0, 0x2e2e, 0xa684, 0x0060,
+       0x0040, 0x2e2e, 0x78d8, 0x7adc, 0x682e, 0x6a32, 0x6820, 0xa084,
+       0x0800, 0x00c0, 0x2e5b, 0x8717, 0xa294, 0x000f, 0x8213, 0x8213,
+       0x8213, 0xa290, 0x5480, 0xa290, 0x0000, 0x221c, 0xa384, 0x0100,
+       0x00c0, 0x2e44, 0x0078, 0x2e4a, 0x8210, 0x2204, 0xa085, 0x0018,
+       0x2012, 0x8211, 0xa384, 0x0400, 0x0040, 0x2e57, 0x68a0, 0xa084,
+       0x0100, 0x00c0, 0x2e57, 0x1078, 0x2f69, 0x0078, 0x2523, 0x6008,
+       0xa085, 0x0002, 0x600a, 0x6916, 0x6818, 0xa084, 0x8000, 0x0040,
+       0x2e63, 0x703c, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x1078, 0x34a9,
+       0x1078, 0x34b8, 0x00c0, 0x2e70, 0x6008, 0xa084, 0xffef, 0x600a,
+       0x6820, 0xa084, 0x0001, 0x00c0, 0x2e79, 0x1078, 0x34a2, 0x0078,
+       0x2e7d, 0x7060, 0x2060, 0x6800, 0x6002, 0x1078, 0x1cdc, 0x0078,
+       0x2523, 0xa282, 0x0004, 0x0048, 0x2e87, 0x1078, 0x248c, 0x2200,
+       0x0079, 0x2e8a, 0x2e85, 0x2e8e, 0x2e9b, 0x2e8e, 0x7000, 0xa086,
+       0x0005, 0x0040, 0x2e97, 0x1078, 0x378f, 0x782b, 0x3008, 0x781b,
+       0x0065, 0x0078, 0x24fa, 0x7890, 0x8007, 0x8001, 0xa084, 0x0007,
+       0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa186, 0x0003,
+       0x0040, 0x2eb0, 0xa186, 0x0000, 0x0040, 0x2eb0, 0x0078, 0x376b,
+       0x781b, 0x0065, 0x0078, 0x24fa, 0x6820, 0xa085, 0x0004, 0x6822,
+       0x82ff, 0x00c0, 0x2ebf, 0x1078, 0x378f, 0x0078, 0x2ec6, 0x8211,
+       0x0040, 0x2ec4, 0x1078, 0x248c, 0x1078, 0x379f, 0x782b, 0x3008,
+       0x781b, 0x0065, 0x0078, 0x24fa, 0x702c, 0x8003, 0x0048, 0x2ed6,
+       0x2019, 0x4eaf, 0x1078, 0x2313, 0x702f, 0x8000, 0x1078, 0x39e0,
+       0x7830, 0xa084, 0x00c0, 0x00c0, 0x2ee2, 0x0018, 0x2ee2, 0x791a,
+       0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684, 0x0060, 0x00c0,
+       0x2eef, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2f68, 0xa684,
+       0x0800, 0x00c0, 0x2f11, 0x68b4, 0xa084, 0x4800, 0xa635, 0xa684,
+       0x0800, 0x00c0, 0x2f11, 0x6998, 0x6a94, 0x692e, 0x6a32, 0x703c,
+       0xa005, 0x00c0, 0x2f09, 0x2200, 0xa105, 0x0040, 0x2f10, 0x703f,
+       0x0015, 0x7000, 0xa086, 0x0006, 0x0040, 0x2f10, 0x1078, 0x4887,
+       0x007c, 0xa684, 0x0020, 0x0040, 0x2f33, 0xa684, 0x4000, 0x0040,
+       0x2f1f, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2f09, 0x68b4,
+       0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2f19, 0x703c,
+       0xa005, 0x00c0, 0x2f2d, 0x703f, 0x0015, 0x79d8, 0x7adc, 0x692e,
+       0x6a32, 0x0078, 0x2f09, 0xa684, 0x4000, 0x0040, 0x2f3d, 0x682f,
+       0x0000, 0x6833, 0x0000, 0x0078, 0x2f09, 0x68b4, 0xa084, 0x4800,
+       0xa635, 0xa684, 0x4000, 0x00c0, 0x2f37, 0x703c, 0xa005, 0x00c0,
+       0x2f4b, 0x703f, 0x0015, 0x79d8, 0x7adc, 0x78d0, 0x80fb, 0x00c8,
+       0x2f52, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x692e,
+       0x6a32, 0x2100, 0xa205, 0x00c0, 0x2f5f, 0x0078, 0x2f09, 0x7000,
+       0xa086, 0x0006, 0x0040, 0x2f68, 0x1078, 0x4c41, 0x0078, 0x2f09,
+       0x007c, 0x6008, 0xa085, 0x0200, 0x600a, 0xa384, 0x0200, 0x0040,
+       0x2f75, 0x6008, 0xa085, 0x0002, 0x600a, 0x681b, 0x0006, 0x688f,
+       0x0000, 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f,
+       0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b,
+       0x0020, 0x68b3, 0x0000, 0x68af, 0x0000, 0x7000, 0x0079, 0x2f90,
+       0x2523, 0x2f9a, 0x2fa3, 0x2f98, 0x2f98, 0x2f98, 0x2f98, 0x2f98,
+       0x1078, 0x248c, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2fa3, 0x1078,
+       0x34a2, 0x0078, 0x2fa9, 0x7060, 0x2c50, 0x2060, 0x6800, 0x6002,
+       0x2a60, 0x2021, 0x525a, 0x2404, 0xa005, 0x0040, 0x2fb2, 0x2020,
+       0x0078, 0x2fab, 0x2d22, 0x206b, 0x0000, 0x007c, 0x1078, 0x34a9,
+       0x1078, 0x34b8, 0x6008, 0xa084, 0xfdff, 0x600a, 0x682b, 0x0000,
+       0x789b, 0x000e, 0x6f14, 0x6817, 0x0002, 0x1078, 0x4c89, 0xa684,
+       0x0800, 0x0040, 0x2fcf, 0x691c, 0xa18d, 0x2000, 0x691e, 0x6818,
+       0xa084, 0x8000, 0x0040, 0x2fdf, 0x7868, 0xa08c, 0x00ff, 0x0040,
+       0x2fdd, 0x681b, 0x001e, 0x0078, 0x2fdf, 0x681b, 0x0000, 0x2021,
+       0x525a, 0x2404, 0xad06, 0x0040, 0x2fe6, 0x7460, 0x6800, 0x2022,
+       0x68c3, 0x0000, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x1078, 0x1cdc,
+       0x0078, 0x2523, 0x1078, 0x2ee5, 0x682b, 0x0000, 0x2001, 0x000e,
+       0x6f14, 0x1078, 0x39e6, 0xa08c, 0x00ff, 0x6916, 0x6818, 0xa084,
+       0x8000, 0x0040, 0x3005, 0x703c, 0x681a, 0xa68c, 0xdf00, 0x691e,
+       0x706f, 0x0000, 0x0078, 0x2523, 0x7000, 0xa005, 0x00c0, 0x3012,
+       0x0078, 0x2523, 0xa006, 0x1078, 0x4887, 0x6817, 0x0000, 0x681b,
+       0x0014, 0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa085,
+       0x00ff, 0x6822, 0x7000, 0x0079, 0x3025, 0x2523, 0x302f, 0x302f,
+       0x3031, 0x3031, 0x3031, 0x3031, 0x302d, 0x1078, 0x248c, 0x1078,
+       0x34b8, 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x3472, 0x2300,
+       0x0079, 0x303a, 0x303d, 0x303f, 0x3098, 0x1078, 0x248c, 0xa684,
+       0x8000, 0x00c0, 0x307d, 0x7000, 0x0079, 0x3046, 0x2523, 0x3050,
+       0x3050, 0x306c, 0x3050, 0x3079, 0x306c, 0x304e, 0x1078, 0x248c,
+       0xa684, 0x0060, 0xa086, 0x0060, 0x00c0, 0x3068, 0xa6b4, 0xffdf,
+       0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a, 0x6eb6, 0x681c, 0xa084,
+       0xffdf, 0x681e, 0x1078, 0x4887, 0x1078, 0x4b4b, 0x0078, 0x3956,
+       0xa684, 0x2000, 0x0040, 0x305a, 0x6818, 0xa084, 0x8000, 0x0040,
+       0x3079, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040, 0x3079, 0x681b,
+       0x0007, 0x1078, 0x396a, 0x0078, 0x24fa, 0xa6b4, 0x7fff, 0x7e5a,
+       0x7adc, 0x79d8, 0x78d0, 0x79d2, 0x801b, 0x00c8, 0x3088, 0x8000,
+       0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302,
+       0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x781b, 0x0065, 0x007c,
+       0x1078, 0x248c, 0x2300, 0x0079, 0x309d, 0x30a0, 0x30a2, 0x30eb,
+       0x1078, 0x248c, 0xa684, 0x8000, 0x00c0, 0x30da, 0x7000, 0x0079,
+       0x30a9, 0x2523, 0x30b3, 0x30b3, 0x30cf, 0x30b3, 0x30d6, 0x30cf,
+       0x30b1, 0x1078, 0x248c, 0xa684, 0x0060, 0xa086, 0x0060, 0x00c0,
+       0x30cb, 0xa6b4, 0xffbf, 0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a,
+       0x6eb6, 0x681c, 0xa084, 0xffbf, 0x681e, 0x1078, 0x4887, 0x1078,
+       0x4b4b, 0x0078, 0x3956, 0xa684, 0x2000, 0x0040, 0x30bd, 0x6818,
+       0xa084, 0x8000, 0x0040, 0x30d6, 0x681b, 0x0007, 0x781b, 0x00ca,
+       0x0078, 0x24fa, 0xa6b4, 0x7fff, 0x7e5a, 0x7adc, 0x79d8, 0x6b98,
+       0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x79d2,
+       0x781b, 0x0065, 0x007c, 0x6820, 0xa085, 0x0004, 0x6822, 0x1078,
+       0x3921, 0xa6b5, 0x0800, 0x1078, 0x378f, 0x782b, 0x3008, 0x781b,
+       0x0065, 0x0078, 0x24fa, 0x2300, 0x0079, 0x30fe, 0x3101, 0x3103,
+       0x3105, 0x1078, 0x248c, 0x0078, 0x377b, 0xa684, 0x0400, 0x00c0,
+       0x312e, 0x79e4, 0xa184, 0x0020, 0x0040, 0x3115, 0x78ec, 0xa084,
+       0x0003, 0x0040, 0x3115, 0x782b, 0x3009, 0x789b, 0x0060, 0x78ab,
+       0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4, 0xa184, 0x0020, 0x0040,
+       0x3126, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x312a, 0x2001, 0x0014,
+       0x0078, 0x2da0, 0xa184, 0x0007, 0x0079, 0x3166, 0x7a90, 0xa294,
+       0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff, 0x0040, 0x3164, 0x789b,
+       0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0, 0x3155, 0x7ba8, 0x7ba8,
+       0xa386, 0x0001, 0x00c0, 0x3148, 0x2009, 0xfff7, 0x0078, 0x314e,
+       0xa386, 0x0003, 0x00c0, 0x3155, 0x2009, 0xffef, 0x0c7e, 0x7054,
+       0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab,
+       0x0000, 0xa684, 0xfffb, 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c,
+       0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078, 0x3956, 0x2a3f, 0x2a4a,
+       0x3170, 0x3178, 0x316e, 0x316e, 0x3956, 0x3956, 0x1078, 0x248c,
+       0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078, 0x3960,
+       0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078, 0x3956,
+       0x79e4, 0xa184, 0x0030, 0x0040, 0x318a, 0x78ec, 0xa084, 0x0003,
+       0x00c0, 0x31b1, 0x7000, 0xa086, 0x0004, 0x00c0, 0x31a4, 0x706c,
+       0xa086, 0x0002, 0x00c0, 0x319a, 0x2011, 0x0002, 0x2019, 0x0000,
+       0x0078, 0x28e9, 0x706c, 0xa086, 0x0006, 0x0040, 0x3194, 0x706c,
+       0xa086, 0x0004, 0x0040, 0x3194, 0x7000, 0xa086, 0x0000, 0x0040,
+       0x24fa, 0x6818, 0xa085, 0x8000, 0x681a, 0x2001, 0x0014, 0x0078,
+       0x2da0, 0xa184, 0x0007, 0x0079, 0x31b5, 0x3956, 0x3956, 0x31bd,
+       0x3956, 0x39bb, 0x39bb, 0x3956, 0x3956, 0xa684, 0x0080, 0x0040,
+       0x31ec, 0x7194, 0x81ff, 0x0040, 0x31ec, 0xa182, 0x000d, 0x00d0,
+       0x31cd, 0x7097, 0x0000, 0x0078, 0x31d2, 0xa182, 0x000c, 0x7096,
+       0x2009, 0x000c, 0x789b, 0x0061, 0x79aa, 0x157e, 0x137e, 0x147e,
+       0x7098, 0x8114, 0xa210, 0x729a, 0xa080, 0x000b, 0xad00, 0x2098,
+       0x20a1, 0x012b, 0x789b, 0x0000, 0x8108, 0x81ac, 0x53a6, 0x147f,
+       0x137f, 0x157f, 0x0078, 0x3960, 0xa684, 0x0400, 0x00c0, 0x322d,
+       0x6820, 0xa084, 0x0001, 0x0040, 0x3960, 0xa68c, 0x0060, 0xa684,
+       0x0060, 0x0040, 0x3201, 0xa086, 0x0060, 0x00c0, 0x3201, 0xa18d,
+       0x4000, 0xa18c, 0xfffb, 0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab,
+       0x0000, 0x789b, 0x0061, 0x6818, 0xa085, 0x8000, 0x681a, 0x78aa,
+       0x8008, 0x810c, 0x0040, 0x34d1, 0xa18c, 0x00f8, 0x00c0, 0x34d1,
        0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000,
        0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f,
-       0x781b, 0x0058, 0x0078, 0x2459, 0xa684, 0x1000, 0x0040, 0x2b04,
-       0x781b, 0x0065, 0x0078, 0x2459, 0xa684, 0x0060, 0x0040, 0x2b70,
-       0xa684, 0x0800, 0x0040, 0x2b70, 0xa684, 0x8000, 0x00c0, 0x2b12,
-       0x0078, 0x2b2c, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb6, 0x789b, 0x0076,
-       0x7aac, 0x79ac, 0x78ac, 0x801b, 0x00c8, 0x2b1f, 0x8000, 0xa084,
-       0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2,
-       0x6b94, 0x2200, 0xa303, 0x68ae, 0xa684, 0x4000, 0x0040, 0x2b34,
-       0xa6b4, 0xbfff, 0x7e5a, 0x6eb6, 0x7000, 0xa086, 0x0003, 0x00c0,
-       0x2b41, 0x1078, 0x482c, 0x1078, 0x4a29, 0x781b, 0x0064, 0x0078,
-       0x2459, 0xa006, 0x1078, 0x4b30, 0x6ab0, 0x69ac, 0x6c98, 0x6b94,
-       0x2200, 0xa105, 0x0040, 0x2b50, 0x2200, 0xa422, 0x2100, 0xa31b,
-       0x6caa, 0x7cd2, 0x7cda, 0x6ba6, 0x7bd6, 0x7bde, 0x2300, 0xa405,
-       0x00c0, 0x2b62, 0xa6b5, 0x4000, 0x7e5a, 0x6eb6, 0x781b, 0x0064,
-       0x0078, 0x2459, 0x781b, 0x0064, 0x2200, 0xa115, 0x00c0, 0x2b6c,
-       0x1078, 0x4a3a, 0x0078, 0x2459, 0x1078, 0x4a85, 0x0078, 0x2459,
-       0x781b, 0x0065, 0x0078, 0x2459, 0x781b, 0x0058, 0x0078, 0x2459,
-       0x1078, 0x23eb, 0x0078, 0x2bdb, 0x6920, 0xa184, 0x0100, 0x0040,
-       0x2b92, 0xa18c, 0xfeff, 0x6922, 0x0c7e, 0x7054, 0x2060, 0x6000,
-       0xa084, 0xefff, 0x6002, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f,
-       0x0078, 0x2bca, 0xa184, 0x0200, 0x0040, 0x2bca, 0xa18c, 0xfdff,
-       0x6922, 0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084, 0xdfff, 0x6002,
-       0x6004, 0xa084, 0xffef, 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xa184,
-       0x0008, 0x0040, 0x2bca, 0x1078, 0x37eb, 0x1078, 0x34f1, 0x88ff,
-       0x0040, 0x2bca, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5,
-       0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2bc4, 0x782b, 0x3008,
-       0x781b, 0x0056, 0x0078, 0x2459, 0x782b, 0x3008, 0x781b, 0x0065,
-       0x0078, 0x2459, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2bd3, 0x781b,
-       0x0058, 0x0078, 0x2459, 0x781b, 0x0065, 0x0078, 0x2459, 0x0078,
-       0x36a5, 0x0078, 0x36a5, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007,
-       0x00c0, 0x2be9, 0x6820, 0xa084, 0x0100, 0x0040, 0x2bd9, 0x2009,
-       0x0008, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001,
-       0x00c0, 0x2c20, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040,
-       0x2c18, 0x0048, 0x2bfd, 0x0078, 0x2c1a, 0xa380, 0x0002, 0xa102,
-       0x00c8, 0x2c18, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0c7e, 0x7054,
-       0x2060, 0x6000, 0xa084, 0xefef, 0x6002, 0x6004, 0xa084, 0xffe5,
-       0x6006, 0x0c7f, 0x7e58, 0xa6b4, 0xfffb, 0x7e5a, 0x0078, 0x2bcb,
-       0x0078, 0x2b7c, 0x24a8, 0x7aa8, 0x00f0, 0x2c1a, 0x0078, 0x2beb,
-       0xa284, 0x00f0, 0xa086, 0x0020, 0x00c0, 0x2c80, 0x8318, 0x8318,
-       0x2300, 0xa102, 0x0040, 0x2c30, 0x0048, 0x2c30, 0x0078, 0x2c7d,
-       0xa286, 0x0023, 0x0040, 0x2bd9, 0x681c, 0xa084, 0xfff1, 0x681e,
-       0x7e58, 0xa684, 0xfff1, 0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008,
-       0xa085, 0x0010, 0x600a, 0x0c7e, 0x7054, 0x2060, 0x6004, 0x2008,
-       0x2c48, 0x0c7f, 0xa184, 0x0010, 0x0040, 0x2c54, 0x1078, 0x37eb,
-       0x1078, 0x3604, 0x0078, 0x2c63, 0x0c7e, 0x7054, 0x2060, 0x6004,
-       0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2bca, 0x1078,
-       0x37eb, 0x1078, 0x34f1, 0x88ff, 0x0040, 0x2bca, 0x789b, 0x0060,
-       0x2800, 0x78aa, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0,
-       0x2c77, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x782b,
-       0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x7aa8, 0x0078, 0x2beb,
-       0x8318, 0x2300, 0xa102, 0x0040, 0x2c89, 0x0048, 0x2c89, 0x0078,
-       0x2beb, 0xa284, 0x0080, 0x00c0, 0x36ad, 0x0078, 0x36a5, 0x0078,
-       0x36ad, 0x0078, 0x369d, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff,
-       0xa08e, 0x0001, 0x0040, 0x2c9e, 0x1078, 0x23eb, 0x7aa8, 0xa294,
-       0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x369d,
-       0x0079, 0x2caa, 0x369d, 0x343e, 0x369d, 0x3599, 0xa282, 0x0000,
-       0x00c0, 0x2cb4, 0x1078, 0x23eb, 0x1078, 0x36c1, 0x782b, 0x3008,
-       0x781b, 0x0065, 0x0078, 0x2459, 0xa282, 0x0003, 0x00c0, 0x2cc2,
-       0x1078, 0x23eb, 0xa484, 0x8000, 0x00c0, 0x2ce5, 0x706c, 0xa005,
-       0x0040, 0x2ccc, 0x1078, 0x23eb, 0x6f14, 0x7782, 0xa7bc, 0x0f00,
-       0x1078, 0x37ef, 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784,
-       0x001f, 0x00c0, 0x2cd0, 0x1078, 0x36c5, 0x706f, 0x0002, 0x2009,
-       0x5138, 0x200b, 0x0009, 0x0078, 0x2ce7, 0x1078, 0x36d1, 0x782b,
-       0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0xa282, 0x0004, 0x0050,
-       0x2cf3, 0x1078, 0x23eb, 0x2300, 0x0079, 0x2cf6, 0x2cf9, 0x2de2,
-       0x2e15, 0xa286, 0x0003, 0x0040, 0x2cff, 0x1078, 0x23eb, 0x2001,
-       0x0000, 0x007e, 0x68c0, 0xa005, 0x0040, 0x2d08, 0x7003, 0x0003,
-       0x68a0, 0xa084, 0x2000, 0x0040, 0x2d11, 0x6008, 0xa085, 0x0002,
-       0x600a, 0x007f, 0x703e, 0x7000, 0xa084, 0x0007, 0x0079, 0x2d18,
-       0x2482, 0x2d22, 0x2d22, 0x2f17, 0x2f53, 0x2482, 0x2f53, 0x2d20,
-       0x1078, 0x23eb, 0xa684, 0x1000, 0x00c0, 0x2d2a, 0x1078, 0x4776,
-       0x0040, 0x2dbc, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x2d72, 0xa186,
-       0x0008, 0x00c0, 0x2d41, 0x1078, 0x33ee, 0x6008, 0xa084, 0xffef,
-       0x600a, 0x1078, 0x3390, 0x0040, 0x2d72, 0x1078, 0x4776, 0x0078,
-       0x2d59, 0xa186, 0x0028, 0x00c0, 0x2d72, 0x1078, 0x4776, 0x6008,
-       0xa084, 0xffef, 0x600a, 0x6018, 0xa005, 0x0040, 0x2d59, 0x8001,
-       0x601a, 0xa005, 0x0040, 0x2d59, 0x8001, 0xa005, 0x0040, 0x2d59,
-       0x601e, 0x6820, 0xa084, 0x0001, 0x0040, 0x2482, 0x6820, 0xa084,
-       0xfffe, 0x6822, 0x7060, 0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f,
-       0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0, 0x2d6f, 0x6002, 0x6006,
-       0x0078, 0x2482, 0x017e, 0x1078, 0x2e46, 0x017f, 0xa684, 0xdf00,
-       0x681e, 0x682b, 0x0000, 0x6f14, 0x81ff, 0x0040, 0x2dbc, 0xa186,
-       0x0002, 0x00c0, 0x2dbc, 0xa684, 0x0800, 0x00c0, 0x2d8f, 0xa684,
-       0x0060, 0x0040, 0x2d8f, 0x78d8, 0x7adc, 0x682e, 0x6a32, 0x6820,
-       0xa084, 0x0800, 0x00c0, 0x2dbc, 0x8717, 0xa294, 0x000f, 0x8213,
-       0x8213, 0x8213, 0xa290, 0x5380, 0xa290, 0x0000, 0x221c, 0xa384,
-       0x0100, 0x00c0, 0x2da5, 0x0078, 0x2dab, 0x8210, 0x2204, 0xa085,
-       0x0018, 0x2012, 0x8211, 0xa384, 0x0400, 0x0040, 0x2db8, 0x68a0,
-       0xa084, 0x0100, 0x00c0, 0x2db8, 0x1078, 0x2eca, 0x0078, 0x2482,
-       0x6008, 0xa085, 0x0002, 0x600a, 0x6916, 0x6818, 0xa084, 0x8000,
-       0x0040, 0x2dc4, 0x703c, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x1078,
-       0x33df, 0x1078, 0x33ee, 0x00c0, 0x2dd1, 0x6008, 0xa084, 0xffef,
-       0x600a, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2dda, 0x1078, 0x33d8,
-       0x0078, 0x2dde, 0x7060, 0x2060, 0x6800, 0x6002, 0x1078, 0x1c70,
-       0x0078, 0x2482, 0xa282, 0x0004, 0x0048, 0x2de8, 0x1078, 0x23eb,
-       0x2200, 0x0079, 0x2deb, 0x2de6, 0x2def, 0x2dfc, 0x2def, 0x7000,
-       0xa086, 0x0005, 0x0040, 0x2df8, 0x1078, 0x36c1, 0x782b, 0x3008,
-       0x781b, 0x0065, 0x0078, 0x2459, 0x7890, 0x8007, 0x8001, 0xa084,
-       0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa186,
-       0x0003, 0x0040, 0x2e11, 0xa186, 0x0000, 0x0040, 0x2e11, 0x0078,
-       0x369d, 0x781b, 0x0065, 0x0078, 0x2459, 0x6820, 0xa085, 0x0004,
-       0x6822, 0x82ff, 0x00c0, 0x2e20, 0x1078, 0x36c1, 0x0078, 0x2e27,
-       0x8211, 0x0040, 0x2e25, 0x1078, 0x23eb, 0x1078, 0x36d1, 0x782b,
-       0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x702c, 0x8003, 0x0048,
-       0x2e37, 0x2019, 0x4d9e, 0x1078, 0x2276, 0x702f, 0x8000, 0x1078,
-       0x3912, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x2e43, 0x0018, 0x2e43,
-       0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684, 0x0060,
-       0x00c0, 0x2e50, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2ec9,
-       0xa684, 0x0800, 0x00c0, 0x2e72, 0x68b4, 0xa084, 0x4800, 0xa635,
-       0xa684, 0x0800, 0x00c0, 0x2e72, 0x6998, 0x6a94, 0x692e, 0x6a32,
-       0x703c, 0xa005, 0x00c0, 0x2e6a, 0x2200, 0xa105, 0x0040, 0x2e71,
-       0x703f, 0x0015, 0x7000, 0xa086, 0x0006, 0x0040, 0x2e71, 0x1078,
-       0x4776, 0x007c, 0xa684, 0x0020, 0x0040, 0x2e94, 0xa684, 0x4000,
-       0x0040, 0x2e80, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2e6a,
-       0x68b4, 0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2e7a,
-       0x703c, 0xa005, 0x00c0, 0x2e8e, 0x703f, 0x0015, 0x79d8, 0x7adc,
-       0x692e, 0x6a32, 0x0078, 0x2e6a, 0xa684, 0x4000, 0x0040, 0x2e9e,
-       0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2e6a, 0x68b4, 0xa084,
-       0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2e98, 0x703c, 0xa005,
-       0x00c0, 0x2eac, 0x703f, 0x0015, 0x79d8, 0x7adc, 0x78d0, 0x80fb,
-       0x00c8, 0x2eb3, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
-       0x692e, 0x6a32, 0x2100, 0xa205, 0x00c0, 0x2ec0, 0x0078, 0x2e6a,
-       0x7000, 0xa086, 0x0006, 0x0040, 0x2ec9, 0x1078, 0x4b30, 0x0078,
-       0x2e6a, 0x007c, 0x6008, 0xa085, 0x0200, 0x600a, 0xa384, 0x0200,
-       0x0040, 0x2ed6, 0x6008, 0xa085, 0x0002, 0x600a, 0x681b, 0x0006,
-       0x688f, 0x0000, 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942,
-       0x682f, 0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000,
-       0x689b, 0x0020, 0x68b3, 0x0000, 0x68af, 0x0000, 0x7000, 0x0079,
-       0x2ef1, 0x2482, 0x2efb, 0x2f04, 0x2ef9, 0x2ef9, 0x2ef9, 0x2ef9,
-       0x2ef9, 0x1078, 0x23eb, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2f04,
-       0x1078, 0x33d8, 0x0078, 0x2f0a, 0x7060, 0x2c50, 0x2060, 0x6800,
-       0x6002, 0x2a60, 0x2021, 0x515a, 0x2404, 0xa005, 0x0040, 0x2f13,
-       0x2020, 0x0078, 0x2f0c, 0x2d22, 0x206b, 0x0000, 0x007c, 0x1078,
-       0x33df, 0x1078, 0x33ee, 0x6008, 0xa084, 0xfdff, 0x600a, 0x682b,
-       0x0000, 0x789b, 0x000e, 0x6f14, 0x6817, 0x0002, 0x1078, 0x4b78,
-       0xa684, 0x0800, 0x0040, 0x2f30, 0x691c, 0xa18d, 0x2000, 0x691e,
-       0x6818, 0xa084, 0x8000, 0x0040, 0x2f40, 0x7868, 0xa08c, 0x00ff,
-       0x0040, 0x2f3e, 0x681b, 0x001e, 0x0078, 0x2f40, 0x681b, 0x0000,
-       0x2021, 0x515a, 0x2404, 0xad06, 0x0040, 0x2f47, 0x7460, 0x6800,
-       0x2022, 0x68c3, 0x0000, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x1078,
-       0x1c70, 0x0078, 0x2482, 0x1078, 0x2e46, 0x682b, 0x0000, 0x2001,
-       0x000e, 0x6f14, 0x1078, 0x3918, 0xa08c, 0x00ff, 0x6916, 0x6818,
-       0xa084, 0x8000, 0x0040, 0x2f66, 0x703c, 0x681a, 0xa68c, 0xdf00,
-       0x691e, 0x706f, 0x0000, 0x0078, 0x2482, 0x7000, 0xa005, 0x00c0,
-       0x2f73, 0x0078, 0x2482, 0xa006, 0x1078, 0x4776, 0x6817, 0x0000,
-       0x681b, 0x0014, 0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820,
-       0xa085, 0x00ff, 0x6822, 0x7000, 0x0079, 0x2f86, 0x2482, 0x2f90,
-       0x2f90, 0x2f92, 0x2f92, 0x2f92, 0x2f92, 0x2f8e, 0x1078, 0x23eb,
-       0x1078, 0x33ee, 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x33a8,
-       0x2300, 0x0079, 0x2f9b, 0x2f9e, 0x2fa0, 0x2fd9, 0x1078, 0x23eb,
-       0x7000, 0x0079, 0x2fa3, 0x2482, 0x2fad, 0x2fad, 0x2fc8, 0x2fad,
-       0x2fd5, 0x2fc8, 0x2fab, 0x1078, 0x23eb, 0xa684, 0x0060, 0xa086,
-       0x0060, 0x00c0, 0x2fc4, 0xa6b4, 0xffdf, 0xa6b4, 0xbfff, 0xa6b5,
-       0x2000, 0x7e5a, 0x681c, 0xa084, 0xffdf, 0x681e, 0x1078, 0x4776,
-       0x1078, 0x4a3a, 0x0078, 0x3888, 0xa684, 0x2000, 0x0040, 0x2fb7,
-       0x6818, 0xa084, 0x8000, 0x0040, 0x2fd5, 0x681b, 0x0015, 0xa684,
-       0x4000, 0x0040, 0x2fd5, 0x681b, 0x0007, 0x1078, 0x389c, 0x0078,
-       0x2459, 0x1078, 0x23eb, 0x2300, 0x0079, 0x2fde, 0x2fe1, 0x2fe3,
-       0x3016, 0x1078, 0x23eb, 0x7000, 0x0079, 0x2fe6, 0x2482, 0x2ff0,
-       0x2ff0, 0x300b, 0x2ff0, 0x3012, 0x300b, 0x2fee, 0x1078, 0x23eb,
-       0xa684, 0x0060, 0xa086, 0x0060, 0x00c0, 0x3007, 0xa6b4, 0xffbf,
-       0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a, 0x681c, 0xa084, 0xffbf,
-       0x681e, 0x1078, 0x4776, 0x1078, 0x4a3a, 0x0078, 0x3888, 0xa684,
-       0x2000, 0x0040, 0x2ffa, 0x6818, 0xa084, 0x8000, 0x0040, 0x3012,
-       0x681b, 0x0007, 0x781b, 0x00cd, 0x0078, 0x2459, 0x6820, 0xa085,
-       0x0004, 0x6822, 0x1078, 0x3853, 0xa6b5, 0x0800, 0x1078, 0x36c1,
-       0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x2300, 0x0079,
-       0x3029, 0x302c, 0x302e, 0x3030, 0x1078, 0x23eb, 0x0078, 0x36ad,
-       0xa684, 0x0400, 0x00c0, 0x3059, 0x79e4, 0xa184, 0x0020, 0x0040,
-       0x3040, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3040, 0x782b, 0x3009,
-       0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4,
-       0xa184, 0x0020, 0x0040, 0x3051, 0x78ec, 0xa084, 0x0003, 0x00c0,
-       0x3055, 0x2001, 0x0014, 0x0078, 0x2d01, 0xa184, 0x0007, 0x0079,
-       0x3091, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff,
-       0x0040, 0x308f, 0x789b, 0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0,
-       0x3080, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0, 0x3073, 0x2009,
-       0xfff7, 0x0078, 0x3079, 0xa386, 0x0003, 0x00c0, 0x3080, 0x2009,
-       0xffef, 0x0c7e, 0x7054, 0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f,
-       0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b,
-       0x3009, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078,
-       0x3888, 0x299e, 0x29a9, 0x309b, 0x30a3, 0x3099, 0x3099, 0x3888,
-       0x3888, 0x1078, 0x23eb, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
-       0x6922, 0x0078, 0x3892, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
-       0x6922, 0x0078, 0x3888, 0x79e4, 0xa184, 0x0030, 0x0040, 0x30b5,
-       0x78ec, 0xa084, 0x0003, 0x00c0, 0x30dc, 0x7000, 0xa086, 0x0004,
-       0x00c0, 0x30cf, 0x706c, 0xa086, 0x0002, 0x00c0, 0x30c5, 0x2011,
-       0x0002, 0x2019, 0x0000, 0x0078, 0x2848, 0x706c, 0xa086, 0x0006,
-       0x0040, 0x30bf, 0x706c, 0xa086, 0x0004, 0x0040, 0x30bf, 0x7000,
-       0xa086, 0x0000, 0x0040, 0x2459, 0x6818, 0xa085, 0x8000, 0x681a,
-       0x2001, 0x0014, 0x0078, 0x2d01, 0xa184, 0x0007, 0x0079, 0x30e0,
-       0x3888, 0x3888, 0x30e8, 0x3888, 0x38ed, 0x38ed, 0x3888, 0x3888,
-       0xa684, 0x0080, 0x0040, 0x3117, 0x7194, 0x81ff, 0x0040, 0x3117,
-       0xa182, 0x000d, 0x00d0, 0x30f8, 0x7097, 0x0000, 0x0078, 0x30fd,
-       0xa182, 0x000c, 0x7096, 0x2009, 0x000c, 0x789b, 0x0061, 0x79aa,
-       0x157e, 0x137e, 0x147e, 0x7098, 0x8114, 0xa210, 0x729a, 0xa080,
-       0x000b, 0xad00, 0x2098, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8108,
-       0x81ac, 0x53a6, 0x147f, 0x137f, 0x157f, 0x0078, 0x3892, 0xa684,
-       0x0400, 0x00c0, 0x3158, 0x6820, 0xa084, 0x0001, 0x0040, 0x3892,
-       0xa68c, 0x0060, 0xa684, 0x0060, 0x0040, 0x312c, 0xa086, 0x0060,
-       0x00c0, 0x312c, 0xa18d, 0x4000, 0xa18c, 0xfffb, 0x795a, 0x69b6,
-       0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6818, 0xa085,
-       0x8000, 0x681a, 0x78aa, 0x8008, 0x810c, 0x0040, 0x3407, 0xa18c,
-       0x00f8, 0x00c0, 0x3407, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012b,
-       0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6,
-       0x147f, 0x137f, 0x157f, 0x6814, 0x8007, 0x7882, 0x0078, 0x3892,
-       0x6818, 0xa084, 0x8000, 0x0040, 0x315f, 0x681b, 0x0008, 0x781b,
-       0x00c3, 0x0078, 0x2459, 0x2300, 0x0079, 0x3166, 0x316b, 0x320a,
-       0x3169, 0x1078, 0x23eb, 0x7000, 0xa084, 0x0007, 0x0079, 0x3170,
-       0x2482, 0x317a, 0x31af, 0x3185, 0x3178, 0x2482, 0x3178, 0x3178,
-       0x1078, 0x23eb, 0x681c, 0xa084, 0x2000, 0x0040, 0x3193, 0x6008,
-       0xa085, 0x0002, 0x600a, 0x0078, 0x3193, 0x68c0, 0xa005, 0x00c0,
-       0x31af, 0x6920, 0xa18d, 0x0001, 0x6922, 0x68c3, 0x0001, 0x6800,
-       0x706a, 0x0078, 0x31a9, 0x6920, 0xa18d, 0x0001, 0x6922, 0x6800,
-       0x6006, 0xa005, 0x00c0, 0x319d, 0x6002, 0x681c, 0xa084, 0x000e,
-       0x0040, 0x31a9, 0x7014, 0x68ba, 0x7130, 0xa188, 0x7400, 0x0078,
-       0x31ab, 0x2009, 0x7500, 0x2104, 0x6802, 0x2d0a, 0x7162, 0x6eb6,
-       0xa684, 0x0060, 0x0040, 0x3208, 0xa684, 0x0800, 0x00c0, 0x31c3,
-       0xa684, 0x7fff, 0x68b6, 0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078,
-       0x4776, 0x0078, 0x3208, 0xa684, 0x0020, 0x0040, 0x31d8, 0x68c0,
-       0xa005, 0x0040, 0x31cf, 0x1078, 0x4b78, 0x0078, 0x31d2, 0xa006,
-       0x1078, 0x4b30, 0x79d8, 0x7adc, 0x69aa, 0x6aa6, 0x0078, 0x31de,
-       0x1078, 0x37fc, 0x69aa, 0x6aa6, 0x1078, 0x4b30, 0xa684, 0x8000,
-       0x0040, 0x3208, 0xa684, 0x7fff, 0x68b6, 0x2001, 0x0076, 0x1078,
-       0x3918, 0x2010, 0x2001, 0x0078, 0x1078, 0x3918, 0x2008, 0xa684,
-       0x0020, 0x00c0, 0x3200, 0x2001, 0x007a, 0x1078, 0x3918, 0x801b,
-       0x00c8, 0x31fb, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
-       0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae,
-       0x0078, 0x2482, 0x0078, 0x36ad, 0x7037, 0x0000, 0xa282, 0x0006,
-       0x0050, 0x3214, 0x1078, 0x23eb, 0x7000, 0xa084, 0x0007, 0x10c0,
-       0x39be, 0x2300, 0x0079, 0x321c, 0x321f, 0x3248, 0x325c, 0x2200,
-       0x0079, 0x3222, 0x3246, 0x36ad, 0x3228, 0x3246, 0x3278, 0x32ba,
-       0x7003, 0x0005, 0x2001, 0x7610, 0x2068, 0x704a, 0x157e, 0x20a9,
-       0x0031, 0x2003, 0x0000, 0x8000, 0x0070, 0x3238, 0x0078, 0x3231,
-       0x157f, 0xad80, 0x0009, 0x7036, 0x6817, 0x0000, 0x68b7, 0x0700,
-       0x6823, 0x0800, 0x6827, 0x0003, 0x0078, 0x369d, 0x1078, 0x23eb,
-       0x7003, 0x0005, 0x2001, 0x7610, 0x2068, 0x704a, 0xad80, 0x0009,
-       0x7036, 0x2200, 0x0079, 0x3254, 0x36ad, 0x325a, 0x325a, 0x3278,
-       0x325a, 0x36ad, 0x1078, 0x23eb, 0x7003, 0x0005, 0x2001, 0x7610,
-       0x2068, 0x704a, 0xad80, 0x0009, 0x7036, 0x2200, 0x0079, 0x3268,
-       0x3270, 0x326e, 0x326e, 0x3270, 0x326e, 0x3270, 0x1078, 0x23eb,
-       0x1078, 0x36d1, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x2459,
-       0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8,
-       0xa484, 0x001f, 0xa215, 0x2069, 0x7500, 0x2d04, 0x2d08, 0x7162,
-       0x2068, 0xa005, 0x0040, 0x3293, 0x6814, 0xa206, 0x0040, 0x32af,
-       0x6800, 0x0078, 0x3286, 0x7003, 0x0005, 0x2001, 0x7610, 0x2068,
-       0x704a, 0x7036, 0x157e, 0x20a9, 0x0031, 0x2003, 0x0000, 0x8000,
-       0x0070, 0x32a4, 0x0078, 0x329d, 0x157f, 0xad80, 0x0009, 0x7036,
-       0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4,
-       0x7e5a, 0x6820, 0xa084, 0x0c00, 0x0040, 0x3309, 0x1078, 0x36c9,
-       0x0078, 0x3309, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b,
-       0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x79a8, 0x79a8, 0xa18c,
-       0x00ff, 0xa1e8, 0x7400, 0x2d04, 0x2d08, 0x7162, 0x2068, 0xa005,
-       0x0040, 0x32d9, 0x6814, 0xa206, 0x0040, 0x32f4, 0x6800, 0x0078,
-       0x32cc, 0x7003, 0x0005, 0x2001, 0x7610, 0x2068, 0x704a, 0x157e,
-       0x20a9, 0x0031, 0x2003, 0x0000, 0x8000, 0x0070, 0x32e9, 0x0078,
-       0x32e2, 0x157f, 0xad80, 0x0009, 0x7036, 0x6a16, 0x68b7, 0x0700,
-       0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084,
-       0x0c00, 0x0040, 0x3309, 0xa084, 0x0800, 0x0040, 0x3303, 0x1078,
-       0x36cd, 0x0078, 0x3309, 0x1078, 0x36c9, 0x708b, 0x0000, 0x0078,
-       0x3309, 0x027e, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
-       0xa080, 0x5380, 0x2060, 0x7056, 0x6000, 0x705a, 0x6004, 0x705e,
-       0xa684, 0x0060, 0x0040, 0x3361, 0x6b98, 0x6c94, 0x69ac, 0x68b0,
-       0xa105, 0x00c0, 0x3343, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa6b4,
-       0xb7ff, 0x7e5a, 0xa684, 0x0060, 0xa086, 0x0060, 0x0040, 0x3361,
-       0x68c0, 0xa005, 0x0040, 0x333c, 0x7003, 0x0003, 0x682b, 0x0000,
-       0x1078, 0x4a29, 0x0078, 0x333e, 0x1078, 0x4a3a, 0xa6b5, 0x2000,
-       0x7e5a, 0x0078, 0x3361, 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400,
-       0xa305, 0x0040, 0x3361, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0,
-       0xa6b4, 0xbfff, 0x7e5a, 0x007e, 0x68c0, 0xa005, 0x007f, 0x0040,
-       0x335f, 0x7003, 0x0003, 0x1078, 0x4a29, 0x0078, 0x3361, 0x1078,
-       0x4a85, 0x077f, 0x1078, 0x37ef, 0x2009, 0x0065, 0xa684, 0x0004,
-       0x0040, 0x3382, 0x78e4, 0xa084, 0x0030, 0x0040, 0x337a, 0x78ec,
-       0xa084, 0x0003, 0x0040, 0x337a, 0x782b, 0x3008, 0x2009, 0x0065,
-       0x0078, 0x3382, 0x0f7e, 0x2079, 0x5100, 0x1078, 0x4776, 0x0f7f,
-       0x0040, 0x2482, 0x791a, 0x2d00, 0x704a, 0x8207, 0xa084, 0x000f,
-       0x8003, 0x8003, 0x8003, 0xa080, 0x5380, 0x2048, 0x0078, 0x2459,
-       0x6020, 0xa005, 0x0040, 0x339c, 0x8001, 0x6022, 0x6008, 0xa085,
-       0x0008, 0x600a, 0x7010, 0x6026, 0x007c, 0xa006, 0x1078, 0x4776,
-       0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040, 0x681f, 0x0100,
-       0x7000, 0xa084, 0x0007, 0x0079, 0x33ad, 0x2482, 0x33b7, 0x33b7,
-       0x33d4, 0x33bf, 0x33bd, 0x33bf, 0x33b5, 0x1078, 0x23eb, 0x1078,
-       0x33df, 0x1078, 0x33d8, 0x1078, 0x1c70, 0x0078, 0x2482, 0x706c,
-       0x706f, 0x0000, 0x7093, 0x0000, 0x0079, 0x33c6, 0x33d0, 0x33d0,
-       0x33ce, 0x33ce, 0x33ce, 0x33d0, 0x33ce, 0x33d0, 0x0079, 0x2861,
-       0x706f, 0x0000, 0x0078, 0x2482, 0x681b, 0x0000, 0x0078, 0x2f17,
-       0x6800, 0xa005, 0x00c0, 0x33dd, 0x6002, 0x6006, 0x007c, 0x6010,
-       0xa005, 0x0040, 0x33e8, 0x8001, 0x00d0, 0x33e8, 0x1078, 0x23eb,
-       0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x007c, 0x6018, 0xa005,
-       0x0040, 0x33f4, 0x8001, 0x601a, 0x007c, 0x1078, 0x3912, 0x681b,
-       0x0018, 0x0078, 0x342b, 0x1078, 0x3912, 0x681b, 0x0019, 0x0078,
-       0x342b, 0x1078, 0x3912, 0x681b, 0x001a, 0x0078, 0x342b, 0x1078,
-       0x3912, 0x681b, 0x0003, 0x0078, 0x342b, 0x7780, 0x1078, 0x37ef,
-       0x7184, 0xa18c, 0x00ff, 0xa1e8, 0x7400, 0x2d04, 0x2d08, 0x2068,
-       0xa005, 0x00c0, 0x341d, 0x0078, 0x2482, 0x6814, 0x7280, 0xa206,
-       0x0040, 0x3425, 0x6800, 0x0078, 0x3416, 0x6800, 0x200a, 0x681b,
-       0x0005, 0x708b, 0x0000, 0x1078, 0x33df, 0x6820, 0xa084, 0x0001,
-       0x00c0, 0x3434, 0x1078, 0x33d8, 0x1078, 0x33ee, 0x681f, 0x0000,
-       0x6823, 0x0020, 0x1078, 0x1c70, 0x0078, 0x2482, 0xa282, 0x0003,
-       0x00c0, 0x369d, 0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4, 0x00ff,
-       0x6920, 0xa18d, 0x0080, 0x6922, 0xa184, 0x0100, 0x0040, 0x34a2,
-       0xa18c, 0xfeff, 0x6922, 0xa4a4, 0x00ff, 0x0040, 0x348c, 0xa482,
-       0x000c, 0x0048, 0x345f, 0x0040, 0x345f, 0x2021, 0x000c, 0x852b,
-       0x852b, 0x1078, 0x3760, 0x0040, 0x3469, 0x1078, 0x355b, 0x0078,
-       0x3495, 0x1078, 0x371b, 0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5,
-       0x6006, 0x1078, 0x3586, 0x0c7f, 0x6920, 0xa18d, 0x0100, 0x6922,
-       0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x3486,
-       0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x782b, 0x3008,
-       0x781b, 0x0065, 0x0078, 0x2459, 0x0c7e, 0x2960, 0x6004, 0xa084,
-       0xfff5, 0x6006, 0x1078, 0x3586, 0x0c7f, 0x7e58, 0xa684, 0x0400,
-       0x00c0, 0x349e, 0x781b, 0x0058, 0x0078, 0x2459, 0x781b, 0x0065,
-       0x0078, 0x2459, 0x0c7e, 0x7054, 0x2060, 0x6100, 0xa18c, 0x1000,
-       0x0040, 0x34e2, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c,
-       0x0048, 0x34b6, 0x0040, 0x34b6, 0x2011, 0x000c, 0x2400, 0xa202,
-       0x00c8, 0x34bb, 0x2220, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086,
-       0x0028, 0x00c0, 0x34cb, 0xa282, 0x0019, 0x00c8, 0x34d1, 0x2011,
-       0x0019, 0x0078, 0x34d1, 0xa282, 0x000c, 0x00c8, 0x34d1, 0x2011,
-       0x000c, 0x2200, 0xa502, 0x00c8, 0x34d6, 0x2228, 0x1078, 0x371f,
-       0x852b, 0x852b, 0x1078, 0x3760, 0x0040, 0x34e2, 0x1078, 0x355b,
-       0x0078, 0x34e6, 0x1078, 0x371b, 0x1078, 0x3586, 0x7858, 0xa085,
-       0x0004, 0x785a, 0x0c7f, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078,
-       0x2459, 0x0c7e, 0x2960, 0x6000, 0xa084, 0x1000, 0x00c0, 0x3509,
-       0x6010, 0xa084, 0x000f, 0x00c0, 0x3503, 0x6104, 0xa18c, 0xfff5,
-       0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078,
-       0x3530, 0x68a0, 0xa084, 0x0200, 0x00c0, 0x3503, 0x6208, 0xa294,
-       0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, 0x351e, 0xa282, 0x0019,
-       0x00c8, 0x3524, 0x2011, 0x0019, 0x0078, 0x3524, 0xa282, 0x000c,
-       0x00c8, 0x3524, 0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff,
-       0xa382, 0x000c, 0x0048, 0x3530, 0x0040, 0x3530, 0x2019, 0x000c,
-       0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa,
-       0xa8c0, 0x0005, 0x6820, 0xa085, 0x0100, 0x6822, 0x0c7f, 0x007c,
-       0x0c7e, 0x2960, 0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032, 0x2019,
-       0x0000, 0x0078, 0x354b, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
-       0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085, 0x0100,
-       0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x7154, 0x2160, 0x1078, 0x3562,
-       0x0c7f, 0x007c, 0x2008, 0xa084, 0xfff0, 0xa425, 0x7c86, 0x6018,
-       0x789a, 0x7cae, 0x6412, 0x78a4, 0xa084, 0xfff8, 0xa18c, 0x0007,
-       0xa105, 0x78a6, 0x6016, 0x788a, 0xa4a4, 0x000f, 0x8427, 0x8204,
-       0x8004, 0xa084, 0x00ff, 0xa405, 0x600e, 0x78ec, 0xd08c, 0x00c0,
-       0x3585, 0x6004, 0xa084, 0xfff5, 0x6006, 0x007c, 0x0c7e, 0x7054,
-       0x2060, 0x1078, 0x358d, 0x0c7f, 0x007c, 0x6018, 0x789a, 0x78a4,
-       0xa084, 0xfff0, 0x78a6, 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886,
-       0x007c, 0xa282, 0x0002, 0x00c0, 0x369d, 0x7aa8, 0x6920, 0xa18d,
-       0x0080, 0x6922, 0xa184, 0x0200, 0x0040, 0x35e2, 0xa18c, 0xfdff,
-       0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8, 0x369d, 0x1078,
-       0x362b, 0x1078, 0x3586, 0xa980, 0x0001, 0x200c, 0x1078, 0x37eb,
-       0x1078, 0x34f1, 0x88ff, 0x0040, 0x35d5, 0x789b, 0x0060, 0x2800,
-       0x78aa, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0,
-       0x35cf, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x782b,
-       0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x7e58, 0xa684, 0x0400,
-       0x00c0, 0x35de, 0x781b, 0x0058, 0x0078, 0x2459, 0x781b, 0x0065,
-       0x0078, 0x2459, 0xa282, 0x0002, 0x00c8, 0x35ea, 0xa284, 0x0001,
-       0x0040, 0x35f4, 0x7154, 0xa188, 0x0000, 0x210c, 0xa18c, 0x2000,
-       0x00c0, 0x35f4, 0x2011, 0x0000, 0x1078, 0x370d, 0x1078, 0x362b,
-       0x1078, 0x3586, 0x7858, 0xa085, 0x0004, 0x785a, 0x782b, 0x3008,
-       0x781b, 0x0065, 0x0078, 0x2459, 0x0c7e, 0x027e, 0x2960, 0x6000,
-       0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, 0x361b, 0x6014, 0xa084,
-       0x0040, 0x00c0, 0x3619, 0xa18c, 0xffef, 0x6106, 0xa006, 0x0078,
-       0x3628, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
-       0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x6820, 0xa085, 0x0200, 0x6822,
-       0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7054, 0x2060, 0x1078, 0x3632,
-       0x0c7f, 0x007c, 0x82ff, 0x0040, 0x3637, 0x2011, 0x0040, 0x6018,
-       0xa080, 0x0002, 0x789a, 0x78a4, 0xa084, 0xffbf, 0xa205, 0x78a6,
-       0x788a, 0x6016, 0x78ec, 0xd08c, 0x00c0, 0x364a, 0x6004, 0xa084,
-       0xffef, 0x6006, 0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040,
-       0x3654, 0x007f, 0x0078, 0x3657, 0x007f, 0x0078, 0x3699, 0xa684,
-       0x0020, 0x0040, 0x3699, 0x7888, 0xa084, 0x0040, 0x0040, 0x3699,
-       0x7bb8, 0xa384, 0x003f, 0x831b, 0x00c8, 0x3667, 0x8000, 0xa005,
-       0x0040, 0x367d, 0x831b, 0x00c8, 0x3670, 0x8001, 0x0040, 0x3695,
-       0xa684, 0x4000, 0x0040, 0x367d, 0x78b8, 0x801b, 0x00c8, 0x3679,
-       0x8000, 0xa084, 0x003f, 0x00c0, 0x3695, 0xa6b4, 0xbfff, 0x7e5a,
-       0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108, 0x00c8, 0x3689, 0xa291,
-       0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x4b30, 0x781b,
-       0x0064, 0x1078, 0x49b5, 0x0078, 0x2459, 0x781b, 0x0064, 0x0078,
-       0x2459, 0x781b, 0x0065, 0x0078, 0x2459, 0x1078, 0x36d5, 0x782b,
-       0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x1078, 0x36c1, 0x782b,
-       0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x6827, 0x0002, 0x1078,
-       0x36c9, 0x78e4, 0xa084, 0x0030, 0x0040, 0x2482, 0x78ec, 0xa084,
-       0x0003, 0x0040, 0x2482, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078,
-       0x2459, 0x2001, 0x0005, 0x0078, 0x36d7, 0x2001, 0x000c, 0x0078,
-       0x36d7, 0x2001, 0x0006, 0x0078, 0x36d7, 0x2001, 0x000d, 0x0078,
-       0x36d7, 0x2001, 0x0009, 0x0078, 0x36d7, 0x2001, 0x0007, 0x789b,
-       0x0010, 0x78aa, 0x789b, 0x0060, 0x78ab, 0x0001, 0xa6b5, 0x0004,
-       0x7e5a, 0x007c, 0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b,
-       0x8703, 0xa0e0, 0x5380, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184,
-       0x000f, 0x0040, 0x36fb, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004,
-       0xa085, 0x0008, 0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184,
-       0x0040, 0x0040, 0x370b, 0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004,
-       0xa085, 0x0010, 0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab,
-       0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060,
-       0x78ab, 0x0004, 0x007c, 0x2021, 0x0000, 0x2029, 0x0032, 0x789b,
-       0x0010, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa,
-       0x7caa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x007c, 0x157e, 0x8007,
-       0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4,
-       0xa18c, 0xfff0, 0x2001, 0x5146, 0x2004, 0xa082, 0x0028, 0x0040,
-       0x3749, 0x2021, 0x37d2, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078,
-       0x374f, 0x2021, 0x37de, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011,
-       0x0064, 0x2404, 0xa084, 0xfff0, 0xa106, 0x0040, 0x375e, 0x8420,
-       0x2300, 0xa210, 0x0070, 0x375e, 0x0078, 0x3751, 0x157f, 0x007c,
-       0x157e, 0x2009, 0x5146, 0x210c, 0xa182, 0x0032, 0x0048, 0x3774,
-       0x0040, 0x3778, 0x2009, 0x37c4, 0x2019, 0x0011, 0x20a9, 0x000e,
-       0x2011, 0x0032, 0x0078, 0x378a, 0xa182, 0x0028, 0x0040, 0x3782,
-       0x2009, 0x37d2, 0x2019, 0x0014, 0x20a9, 0x000c, 0x2011, 0x0064,
-       0x0078, 0x378a, 0x2009, 0x37de, 0x2019, 0x0019, 0x20a9, 0x000d,
-       0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x379a, 0x0048, 0x379a,
-       0x8108, 0x2300, 0xa210, 0x0070, 0x3797, 0x0078, 0x378a, 0x157f,
-       0xa006, 0x007c, 0x157f, 0xa582, 0x0064, 0x00c8, 0x37a9, 0x7808,
-       0xa085, 0x0070, 0x780a, 0x7044, 0xa085, 0x0070, 0x7046, 0x0078,
-       0x37a9, 0x78ec, 0xa084, 0x0300, 0x0040, 0x37b1, 0x2104, 0x0078,
-       0x37c2, 0x2104, 0xa09e, 0x1102, 0x00c0, 0x37c2, 0x2001, 0x04fd,
-       0x2004, 0xa082, 0x0005, 0x0048, 0x37c1, 0x2001, 0x1201, 0x0078,
-       0x37c2, 0x2104, 0xa005, 0x007c, 0x1102, 0x3002, 0x3202, 0x4203,
-       0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07,
-       0x0c07, 0x0e07, 0x3202, 0x4202, 0x5202, 0x6202, 0x7202, 0x6605,
-       0x7605, 0x7805, 0x7a05, 0x7c05, 0x7e05, 0x7f05, 0x2202, 0x3202,
-       0x4202, 0x5202, 0x5404, 0x6404, 0x7404, 0x7604, 0x7804, 0x7a04,
-       0x7c04, 0x7e04, 0x7f04, 0x789b, 0x0010, 0xa046, 0x007c, 0xa784,
-       0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003,
-       0xa105, 0xa0e0, 0x5400, 0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b,
-       0x00c8, 0x3803, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
-       0x007c, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x5140, 0x2091, 0x8000,
-       0x2104, 0x0079, 0x3813, 0x3849, 0x381d, 0x381d, 0x381d, 0x381d,
-       0x381d, 0x381d, 0x384d, 0x1078, 0x23eb, 0x784b, 0x0004, 0x7848,
-       0xa084, 0x0004, 0x00c0, 0x381f, 0x784b, 0x0008, 0x7848, 0xa084,
-       0x0008, 0x00c0, 0x3826, 0x68b4, 0xa085, 0x4000, 0x68b6, 0x7858,
-       0xa085, 0x4000, 0x785a, 0x7830, 0xa084, 0x0080, 0x00c0, 0x3849,
-       0x0018, 0x3849, 0x681c, 0xa084, 0x0020, 0x00c0, 0x3847, 0x0e7e,
-       0x2071, 0x5140, 0x1078, 0x389c, 0x0e7f, 0x0078, 0x3849, 0x781b,
-       0x00cd, 0x2091, 0x8001, 0x0f7f, 0x007c, 0x70b3, 0x0000, 0x1078,
-       0x3a76, 0x0078, 0x3849, 0x0c7e, 0x6814, 0x8007, 0xa084, 0x000f,
-       0x8003, 0x8003, 0x8003, 0xa0e0, 0x5380, 0x6004, 0xa084, 0x000a,
-       0x00c0, 0x3886, 0x6108, 0xa194, 0xff00, 0x0040, 0x3886, 0xa18c,
-       0x00ff, 0x2001, 0x0019, 0xa106, 0x0040, 0x3875, 0x2001, 0x0032,
-       0xa106, 0x0040, 0x3879, 0x0078, 0x387d, 0x2009, 0x0020, 0x0078,
-       0x387f, 0x2009, 0x003f, 0x0078, 0x387f, 0x2011, 0x0000, 0x2100,
-       0xa205, 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x0c7f, 0x007c,
-       0x781b, 0x0065, 0x0078, 0x2459, 0x782b, 0x3008, 0x781b, 0x0065,
-       0x0078, 0x2459, 0x781b, 0x0058, 0x0078, 0x2459, 0x782b, 0x3008,
-       0x781b, 0x0056, 0x0078, 0x2459, 0x2009, 0x5120, 0x210c, 0xa186,
-       0x0000, 0x0040, 0x38b0, 0xa186, 0x0001, 0x0040, 0x38b3, 0x2009,
-       0x5138, 0x200b, 0x000b, 0x706f, 0x0001, 0x781b, 0x0048, 0x007c,
-       0x781b, 0x00c7, 0x007c, 0x2009, 0x5138, 0x200b, 0x000a, 0x007c,
-       0x2009, 0x5120, 0x210c, 0xa186, 0x0000, 0x0040, 0x38d3, 0xa186,
-       0x0001, 0x0040, 0x38cd, 0x2009, 0x5138, 0x200b, 0x000b, 0x706f,
-       0x0001, 0x781b, 0x0048, 0x0078, 0x2459, 0x2009, 0x5138, 0x200b,
-       0x000a, 0x0078, 0x2459, 0x782b, 0x3008, 0x781b, 0x00c7, 0x0078,
-       0x2459, 0x781b, 0x00cd, 0x0078, 0x2459, 0x782b, 0x3008, 0x781b,
-       0x00cd, 0x0078, 0x2459, 0x781b, 0x008e, 0x0078, 0x2459, 0x782b,
-       0x3008, 0x781b, 0x008e, 0x0078, 0x2459, 0x6818, 0xa084, 0x8000,
-       0x0040, 0x38f4, 0x681b, 0x001d, 0x706f, 0x0001, 0x781b, 0x0048,
-       0x0078, 0x2459, 0x007e, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3910,
-       0x7808, 0xa084, 0xfffc, 0x780a, 0x0005, 0x0005, 0x0005, 0x0005,
-       0x78ec, 0xa084, 0x0021, 0x0040, 0x3910, 0x7044, 0x780a, 0xa005,
-       0x007f, 0x007c, 0x7044, 0xa085, 0x0002, 0x7046, 0x780a, 0x007c,
-       0x007e, 0x7830, 0xa084, 0x0040, 0x00c0, 0x3919, 0x0098, 0x3924,
-       0x007f, 0x789a, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a,
-       0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040,
-       0x3933, 0x0098, 0x3931, 0x007f, 0x789a, 0x78ac, 0x007e, 0x7044,
-       0x780a, 0x007f, 0x007c, 0x78ec, 0xa084, 0x0002, 0x00c0, 0x4760,
-       0xa784, 0x007d, 0x00c0, 0x3947, 0x2700, 0x1078, 0x23eb, 0xa784,
-       0x0001, 0x00c0, 0x2f6d, 0xa784, 0x0070, 0x0040, 0x3957, 0x0c7e,
-       0x2d60, 0x2f68, 0x1078, 0x2396, 0x2d78, 0x2c68, 0x0c7f, 0xa784,
-       0x0008, 0x0040, 0x3964, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
-       0x0040, 0x2482, 0x0078, 0x3888, 0xa784, 0x0004, 0x0040, 0x3997,
-       0x78b8, 0xa084, 0x4001, 0x0040, 0x3997, 0x784b, 0x0008, 0x78ec,
-       0xa084, 0x0003, 0x0040, 0x2482, 0x78e4, 0xa084, 0x0007, 0xa086,
-       0x0001, 0x00c0, 0x3997, 0x78c0, 0xa085, 0x4800, 0x2030, 0x7e5a,
-       0x781b, 0x00cd, 0x0078, 0x2459, 0x784b, 0x0008, 0x6818, 0xa084,
-       0x8000, 0x0040, 0x3993, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040,
-       0x3993, 0x681b, 0x0007, 0x1078, 0x389c, 0x0078, 0x2459, 0x681b,
-       0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x682f, 0x0000, 0x6833,
-       0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2965,
-       0x0018, 0x2459, 0x0078, 0x36a5, 0x6b14, 0x8307, 0xa084, 0x000f,
-       0x8003, 0x8003, 0x8003, 0xa080, 0x5380, 0x2060, 0x2048, 0x7056,
-       0x6000, 0x705a, 0x6004, 0x705e, 0x2a60, 0x007c, 0x0079, 0x39c0,
-       0x39c8, 0x39c9, 0x39c8, 0x39cb, 0x39c8, 0x39c8, 0x39c8, 0x39d0,
-       0x007c, 0x1078, 0x33ee, 0x1078, 0x4776, 0x7038, 0x600a, 0x007c,
-       0x70a0, 0xa005, 0x0040, 0x39dd, 0x2068, 0x1078, 0x1b62, 0x1078,
-       0x46f8, 0x1078, 0x46ff, 0x70a3, 0x0000, 0x007c, 0x0e7e, 0x2091,
-       0x8000, 0x2071, 0x5140, 0x7000, 0xa086, 0x0007, 0x00c0, 0x39f4,
-       0x6110, 0x70bc, 0xa106, 0x00c0, 0x39f4, 0x0e7f, 0x1078, 0x1b6f,
-       0x1078, 0x39fa, 0xa006, 0x007c, 0x2091, 0x8001, 0x0e7f, 0xa085,
-       0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x5140, 0x0078, 0x21fa,
-       0x785b, 0x0000, 0x70af, 0x000e, 0x2009, 0x0100, 0x017e, 0x70a0,
-       0xa06d, 0x0040, 0x3a0f, 0x70a3, 0x0000, 0x0078, 0x3a15, 0x70b3,
-       0x0000, 0x1078, 0x1b8b, 0x0040, 0x3a1b, 0x70ac, 0x6826, 0x1078,
-       0x3af8, 0x0078, 0x3a0f, 0x017f, 0x157e, 0x0c7e, 0x0d7e, 0x20a9,
-       0x0008, 0x2061, 0x7510, 0x6000, 0xa105, 0x6002, 0x601c, 0xa06d,
-       0x0040, 0x3a33, 0x6800, 0x601e, 0x1078, 0x195a, 0x6008, 0x8000,
-       0x600a, 0x0078, 0x3a26, 0x6018, 0xa06d, 0x0040, 0x3a3d, 0x6800,
-       0x601a, 0x1078, 0x195a, 0x0078, 0x3a33, 0xace0, 0x0008, 0x0070,
-       0x3a43, 0x0078, 0x3a23, 0x709c, 0xa084, 0x8000, 0x0040, 0x3a4a,
-       0x1078, 0x3b72, 0x0d7f, 0x0c7f, 0x157f, 0x007c, 0x127e, 0x2091,
-       0x2300, 0x6804, 0xa084, 0x000f, 0x0079, 0x3a56, 0x3a66, 0x3a66,
-       0x3a66, 0x3a66, 0x3a66, 0x3a66, 0x3a68, 0x3a6e, 0x3a66, 0x3a66,
-       0x3a66, 0x3a66, 0x3a66, 0x3a70, 0x3a66, 0x3a68, 0x1078, 0x23eb,
-       0x1078, 0x44d0, 0x1078, 0x195a, 0x0078, 0x3a74, 0x6827, 0x000b,
-       0x1078, 0x44d0, 0x1078, 0x3af8, 0x127f, 0x007c, 0x127e, 0x2091,
-       0x2300, 0x0098, 0x3a92, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3a92,
-       0x0d7e, 0x1078, 0x4708, 0x2d00, 0x682e, 0x2009, 0x0004, 0x2001,
-       0x0000, 0x6827, 0x0084, 0x1078, 0x46c1, 0x1078, 0x3af8, 0x0d7f,
-       0x0078, 0x3ac6, 0x7948, 0xa185, 0x4000, 0x784a, 0x0098, 0x3a9b,
-       0x794a, 0x0078, 0x3a80, 0x7828, 0xa086, 0x1834, 0x00c0, 0x3aa4,
-       0xa185, 0x0004, 0x0078, 0x3aab, 0x7828, 0xa086, 0x1814, 0x00c0,
-       0x3a98, 0xa185, 0x000c, 0x784a, 0x789b, 0x000e, 0x78ab, 0x0002,
-       0x7858, 0xa084, 0x00ff, 0xa085, 0x0400, 0x785a, 0x70b4, 0xa080,
-       0x0091, 0x781a, 0x6827, 0x0284, 0x682c, 0x6836, 0x6830, 0x683a,
-       0x2009, 0x0004, 0x2001, 0x0000, 0x1078, 0x46c1, 0x127f, 0x007c,
-       0x0d7e, 0x6b14, 0x1078, 0x1bfd, 0x0040, 0x3ad5, 0x2068, 0x6827,
-       0x0002, 0x1078, 0x3af8, 0x0078, 0x3aca, 0x0d7f, 0x007c, 0x0d7e,
-       0x6b14, 0x6c28, 0xa4a4, 0x00ff, 0x1078, 0x1b9b, 0x0040, 0x3ae5,
-       0x2068, 0x6827, 0x0002, 0x1078, 0x3af8, 0x0d7f, 0x007c, 0x0d7e,
-       0x6b14, 0xa39c, 0x00ff, 0x1078, 0x1bce, 0x0040, 0x3af6, 0x2068,
-       0x6827, 0x0002, 0x1078, 0x3af8, 0x0078, 0x3aeb, 0x0d7f, 0x007c,
-       0x0c7e, 0x6914, 0x1078, 0x3b69, 0x6904, 0xa18c, 0x00ff, 0xa186,
-       0x0006, 0x0040, 0x3b13, 0xa186, 0x000d, 0x0040, 0x3b32, 0xa186,
-       0x0017, 0x00c0, 0x3b0f, 0x1078, 0x195a, 0x0078, 0x3b11, 0x1078,
-       0x1c72, 0x0c7f, 0x007c, 0x6004, 0x8001, 0x0048, 0x3b30, 0x6006,
-       0x2009, 0x0000, 0xa684, 0x0001, 0x00c0, 0x3b20, 0xa18d, 0x8000,
-       0xa684, 0x0004, 0x0040, 0x3b26, 0xa18d, 0x0002, 0x691e, 0x6823,
-       0x0000, 0x7104, 0x810f, 0x6818, 0xa105, 0x681a, 0x0078, 0x3b0f,
-       0x1078, 0x23eb, 0x6018, 0xa005, 0x00c0, 0x3b41, 0x6008, 0x8001,
-       0x0048, 0x3b41, 0x600a, 0x601c, 0x6802, 0x2d00, 0x601e, 0x0078,
-       0x3b57, 0xac88, 0x0006, 0x2104, 0xa005, 0x0040, 0x3b4a, 0x2008,
-       0x0078, 0x3b43, 0x6802, 0x2d0a, 0x6008, 0x8001, 0x0048, 0x3b11,
-       0x600a, 0x6018, 0x2068, 0x6800, 0x601a, 0x0078, 0x3b3b, 0x157e,
-       0x137e, 0x147e, 0x0c7e, 0x0d7e, 0x1078, 0x1937, 0x2da0, 0x137f,
-       0x20a9, 0x0031, 0x53a3, 0x0c7f, 0x147f, 0x137f, 0x157f, 0x0078,
-       0x3b0f, 0xa184, 0x001f, 0x8003, 0x8003, 0x8003, 0xa080, 0x7510,
-       0x2060, 0x007c, 0x2019, 0x5151, 0x2304, 0xa085, 0x0001, 0x201a,
-       0x2019, 0x0102, 0x2304, 0xa085, 0x0001, 0x201a, 0x007c, 0x2019,
-       0x5151, 0x2304, 0xa084, 0xfffe, 0x201a, 0x2019, 0x0102, 0x2304,
-       0xa084, 0xfffe, 0x201a, 0x007c, 0x7990, 0xa18c, 0xfff8, 0x7992,
-       0x70b4, 0xa080, 0x00dd, 0x781a, 0x0078, 0x2459, 0x70a3, 0x0000,
-       0x7003, 0x0000, 0x7043, 0x0001, 0x7037, 0x0000, 0x0018, 0x2410,
-       0x1078, 0x1b8b, 0x0040, 0x3bc7, 0x2009, 0x510f, 0x200b, 0x0000,
-       0x68bc, 0x2060, 0x6100, 0xa184, 0x0300, 0x0040, 0x3bbb, 0x6827,
-       0x000e, 0xa084, 0x0200, 0x0040, 0x3bb7, 0x6827, 0x0017, 0x1078,
-       0x3af8, 0x0078, 0x3b96, 0x7000, 0xa086, 0x0007, 0x00c0, 0x3c29,
-       0x2d00, 0x70a2, 0xad80, 0x000f, 0x7036, 0x0078, 0x3bce, 0x7040,
-       0xa086, 0x0001, 0x0040, 0x2492, 0x0078, 0x2459, 0x2031, 0x0000,
-       0x691c, 0xa184, 0x0002, 0x0040, 0x3bd7, 0xa6b5, 0x0004, 0xa184,
-       0x00c0, 0x8003, 0x8003, 0x8007, 0xa080, 0x3cc2, 0x2004, 0xa635,
-       0x6820, 0xa084, 0x0400, 0x0040, 0x3bef, 0x789b, 0x0018, 0x78ab,
-       0x0003, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5, 0x1000, 0x6820,
-       0xa084, 0x8000, 0x00c0, 0x3bfd, 0x681c, 0xa084, 0x8000, 0x00c0,
-       0x3c04, 0xa6b5, 0x0800, 0x0078, 0x3c04, 0xa6b5, 0x0400, 0x789b,
-       0x000e, 0x6824, 0x8007, 0x78aa, 0x6820, 0xa084, 0x0100, 0x0040,
-       0x3c0b, 0xa6b5, 0x4000, 0xa684, 0x0200, 0x0040, 0x3c25, 0x682c,
-       0x78d2, 0x6830, 0x78d6, 0xa684, 0x0100, 0x0040, 0x3c23, 0x682c,
-       0xa084, 0x0001, 0x0040, 0x3c23, 0x7888, 0xa084, 0x0040, 0x0040,
-       0x3c23, 0xa6b5, 0x8000, 0x1078, 0x46f0, 0x7e5a, 0x6eb6, 0x0078,
-       0x4727, 0x1078, 0x38fa, 0x00c0, 0x3cbc, 0x702c, 0x8004, 0x0048,
-       0x3c37, 0x2019, 0x4e3b, 0x1078, 0x2276, 0x702f, 0x0001, 0x2041,
-       0x0001, 0x2031, 0x1000, 0x789b, 0x0018, 0x6814, 0xa084, 0x001f,
-       0xa085, 0x0080, 0x78aa, 0x691c, 0xa184, 0x0002, 0x0040, 0x3c50,
-       0xa6b5, 0x0004, 0x78ab, 0x0020, 0x6828, 0x78aa, 0xa8c0, 0x0002,
-       0x681c, 0xd0f4, 0x0040, 0x3c59, 0x2c50, 0x1078, 0x39ac, 0x1078,
-       0x45ff, 0x6820, 0xa084, 0x8000, 0x0040, 0x3c67, 0xa6b5, 0x0400,
-       0x789b, 0x000e, 0x6824, 0x8007, 0x78aa, 0x0078, 0x3c6e, 0x681c,
-       0xa084, 0x8000, 0x00c0, 0x3c6e, 0xa6b5, 0x0800, 0x6820, 0xa084,
-       0x0100, 0x0040, 0x3c75, 0xa6b5, 0x4000, 0x681c, 0xa084, 0x00c0,
-       0x8003, 0x8003, 0x8007, 0xa080, 0x3cc2, 0x2004, 0xa635, 0xa684,
-       0x0100, 0x0040, 0x3c8f, 0x682c, 0xa084, 0x0001, 0x0040, 0x3c8f,
-       0x7888, 0xa084, 0x0040, 0x0040, 0x3c8f, 0xa6b5, 0x8000, 0x789b,
-       0x007e, 0x7eae, 0x6eb6, 0x6814, 0x8007, 0x78aa, 0x7882, 0x2810,
-       0x7aaa, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3cbc, 0x0018, 0x3cbc,
-       0x70b4, 0xa080, 0x00e2, 0x781a, 0x1078, 0x3912, 0xa684, 0x0200,
-       0x0040, 0x3cb0, 0x682c, 0x78d2, 0x6830, 0x78d6, 0x1078, 0x46f0,
-       0x2d00, 0x70a2, 0x704a, 0x6810, 0x70be, 0x7003, 0x0007, 0xad80,
-       0x000f, 0x7036, 0x0078, 0x2459, 0x1078, 0x1b62, 0x1078, 0x3912,
-       0x0078, 0x2459, 0x0000, 0x0300, 0x0200, 0x0000, 0x1078, 0x23eb,
-       0x2300, 0x0079, 0x3ccb, 0x3cce, 0x3cce, 0x3cd0, 0x1078, 0x23eb,
-       0x1078, 0x46ff, 0x6924, 0xa184, 0x00ff, 0xa086, 0x000a, 0x0040,
-       0x3ce2, 0xa184, 0xff00, 0xa085, 0x000a, 0x6826, 0x1078, 0x1b62,
-       0x0078, 0x3b96, 0x2001, 0x000a, 0x1078, 0x4691, 0x0078, 0x3b96,
-       0xa282, 0x0005, 0x0050, 0x3cee, 0x1078, 0x23eb, 0x7000, 0xa084,
-       0x0007, 0x10c0, 0x39be, 0x1078, 0x1937, 0x00c0, 0x3d0d, 0xa684,
-       0x0004, 0x0040, 0x3cff, 0x2001, 0x2800, 0x0078, 0x3d01, 0x2001,
-       0x0800, 0x71b4, 0xa188, 0x0091, 0x789b, 0x000e, 0x78aa, 0x2031,
-       0x0400, 0x7e5a, 0x791a, 0x0078, 0x2459, 0x6807, 0x0106, 0x680b,
-       0x0000, 0x689f, 0x0000, 0x6827, 0x0000, 0xa386, 0x0002, 0x00c0,
-       0x3d2e, 0xa286, 0x0002, 0x00c0, 0x3d2e, 0x78a0, 0xa005, 0x00c0,
-       0x3d2e, 0xa484, 0x8000, 0x00c0, 0x3d2e, 0x78e4, 0xa084, 0x0008,
-       0x0040, 0x3d2e, 0xa6b5, 0x0008, 0x2019, 0x0000, 0x1078, 0x411e,
-       0x2d00, 0x70a2, 0x704a, 0x7003, 0x0007, 0x7037, 0x0000, 0x6824,
-       0xa084, 0x0080, 0x0040, 0x3d40, 0x1078, 0x41d0, 0x0078, 0x2459,
-       0x2300, 0x0079, 0x3d43, 0x3d46, 0x3dc7, 0x3de6, 0x2200, 0x0079,
-       0x3d49, 0x3d4e, 0x3d5e, 0x3d84, 0x3d90, 0x3db3, 0x2029, 0x0001,
-       0xa026, 0x2011, 0x0000, 0x1078, 0x42f1, 0x0079, 0x3d57, 0x3d5c,
-       0x2459, 0x3b96, 0x3d5c, 0x3d5c, 0x1078, 0x23eb, 0x7990, 0xa18c,
-       0x0007, 0x00c0, 0x3d65, 0x2009, 0x0008, 0x2011, 0x0001, 0xa684,
-       0x0004, 0x0040, 0x3d6d, 0x2011, 0x0003, 0x2220, 0xa12a, 0x2011,
-       0x0001, 0x1078, 0x42f1, 0x0079, 0x3d75, 0x3d7a, 0x2459, 0x3b96,
-       0x3d82, 0x3d7c, 0x0078, 0x472d, 0x70ab, 0x3d80, 0x0078, 0x2459,
-       0x0078, 0x3d7a, 0x1078, 0x23eb, 0xa684, 0x0010, 0x0040, 0x3d8e,
-       0x1078, 0x419f, 0x0040, 0x3d8e, 0x0078, 0x2459, 0x0078, 0x420c,
-       0x6000, 0xa084, 0x0002, 0x0040, 0x3dad, 0x70b4, 0xa080, 0x00d2,
-       0x781a, 0x0d7e, 0x1078, 0x4708, 0x2d00, 0x682e, 0x6827, 0x0000,
-       0x1078, 0x3af8, 0x0d7f, 0x1078, 0x195a, 0x7003, 0x0000, 0x7037,
-       0x0000, 0x704b, 0x0000, 0x0078, 0x3b96, 0xa684, 0x0004, 0x00c0,
-       0x3db3, 0x0078, 0x472d, 0x6000, 0xa084, 0x0004, 0x00c0, 0x3dc5,
-       0x6000, 0xa084, 0x0001, 0x0040, 0x3dc5, 0x70ab, 0x3dc5, 0x2001,
-       0x0007, 0x1078, 0x4689, 0x0078, 0x4733, 0x0078, 0x472d, 0x2200,
-       0x0079, 0x3dca, 0x3dcf, 0x3dcf, 0x3dcf, 0x3dd1, 0x3dcf, 0x1078,
-       0x23eb, 0x70a7, 0x3dd5, 0x0078, 0x4739, 0x2011, 0x0018, 0x1078,
-       0x42eb, 0x0079, 0x3ddb, 0x3de0, 0x2459, 0x3b96, 0x3de2, 0x3de4,
-       0x1078, 0x23eb, 0x1078, 0x23eb, 0x1078, 0x23eb, 0x2200, 0x0079,
-       0x3de9, 0x3dee, 0x3df0, 0x3df0, 0x3dee, 0x3dee, 0x1078, 0x23eb,
-       0x78e4, 0xa084, 0x0008, 0x0040, 0x3e05, 0x70a7, 0x3df9, 0x0078,
-       0x4739, 0x2011, 0x0004, 0x1078, 0x42eb, 0x0079, 0x3dff, 0x3e05,
-       0x2459, 0x3b96, 0x3e05, 0x3e0f, 0x3e13, 0x70ab, 0x3e0d, 0x2001,
-       0x0003, 0x1078, 0x4689, 0x0078, 0x4733, 0x0078, 0x472d, 0x70ab,
-       0x3e05, 0x0078, 0x2459, 0x70ab, 0x3e17, 0x0078, 0x2459, 0x0078,
-       0x3e0d, 0xa282, 0x0003, 0x0050, 0x3e1f, 0x1078, 0x23eb, 0xa386,
-       0x0002, 0x00c0, 0x3e38, 0xa286, 0x0002, 0x00c0, 0x3e3e, 0x78a0,
-       0xa005, 0x00c0, 0x3e3e, 0xa484, 0x8000, 0x00c0, 0x3e3e, 0x78e4,
-       0xa084, 0x0008, 0x0040, 0x3e38, 0xa6b5, 0x0008, 0x2019, 0x0000,
-       0xa684, 0x0008, 0x0040, 0x3e3e, 0x1078, 0x417c, 0x6810, 0x70be,
-       0x7003, 0x0007, 0x2300, 0x0079, 0x3e45, 0x3e48, 0x3e75, 0x3e7d,
-       0x2200, 0x0079, 0x3e4b, 0x3e50, 0x3e4e, 0x3e69, 0x1078, 0x23eb,
-       0x7990, 0xa1ac, 0x0007, 0xa026, 0x2011, 0x0001, 0x1078, 0x42f1,
-       0x0079, 0x3e5a, 0x3e5f, 0x2459, 0x3b96, 0x3e67, 0x3e61, 0x0078,
-       0x472d, 0x70ab, 0x3e65, 0x0078, 0x2459, 0x0078, 0x3e5f, 0x1078,
-       0x23eb, 0xa684, 0x0010, 0x0040, 0x3e73, 0x1078, 0x419f, 0x0040,
-       0x3e73, 0x0078, 0x2459, 0x0078, 0x420c, 0x2200, 0x0079, 0x3e78,
-       0x3e7b, 0x3e7b, 0x3e7b, 0x1078, 0x23eb, 0x2200, 0x0079, 0x3e80,
-       0x3e83, 0x3e85, 0x3e85, 0x1078, 0x23eb, 0x78e4, 0xa084, 0x0008,
-       0x0040, 0x3e9a, 0x70a7, 0x3e8e, 0x0078, 0x4739, 0x2011, 0x0004,
-       0x1078, 0x42eb, 0x0079, 0x3e94, 0x3e9a, 0x2459, 0x3b96, 0x3e9a,
-       0x3ea4, 0x3ea8, 0x70ab, 0x3ea2, 0x2001, 0x0003, 0x1078, 0x4689,
-       0x0078, 0x4733, 0x0078, 0x472d, 0x70ab, 0x3e9a, 0x0078, 0x2459,
-       0x70ab, 0x3eac, 0x0078, 0x2459, 0x0078, 0x3ea2, 0x2300, 0x0079,
-       0x3eb1, 0x3eb6, 0x3eb8, 0x3eb4, 0x1078, 0x23eb, 0x70a4, 0x007a,
-       0x70a4, 0x007a, 0xa282, 0x0002, 0x0050, 0x3ec0, 0x1078, 0x23eb,
-       0xa684, 0x0200, 0x0040, 0x3eca, 0x1078, 0x46f8, 0x1078, 0x42d3,
-       0x1078, 0x46ff, 0x2300, 0x0079, 0x3ecd, 0x3ed0, 0x3ef4, 0x3f5a,
-       0xa286, 0x0001, 0x0040, 0x3ed6, 0x1078, 0x23eb, 0xa684, 0x0200,
-       0x0040, 0x3ede, 0x1078, 0x46f8, 0x1078, 0x46ff, 0x2001, 0x0001,
-       0x1078, 0x4691, 0x78b8, 0xa084, 0xc001, 0x0040, 0x3ef0, 0x7848,
-       0xa085, 0x0008, 0x784a, 0x7848, 0xa084, 0x0008, 0x00c0, 0x3eeb,
-       0x7003, 0x0000, 0x0078, 0x3b96, 0x2200, 0x0079, 0x3ef7, 0x3ef9,
-       0x3f2a, 0x70a7, 0x3efd, 0x0078, 0x4739, 0x2011, 0x000d, 0x1078,
-       0x42eb, 0x0079, 0x3f03, 0x3f0a, 0x2459, 0x3b96, 0x3f12, 0x3f1a,
-       0x3f20, 0x3f22, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
-       0x0078, 0x4727, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
-       0x0078, 0x4727, 0x70ab, 0x3f1e, 0x0078, 0x2459, 0x0078, 0x3f0a,
-       0x1078, 0x23eb, 0x70ab, 0x3f26, 0x0078, 0x2459, 0x1078, 0x473f,
-       0x0078, 0x2459, 0x70a7, 0x3f2e, 0x0078, 0x4739, 0x2011, 0x0012,
-       0x1078, 0x42eb, 0x0079, 0x3f34, 0x3f3a, 0x2459, 0x3b96, 0x3f46,
-       0x3f4e, 0x3f54, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
-       0x70b4, 0xa080, 0x00a6, 0x781a, 0x0078, 0x2459, 0xa6b4, 0x00ff,
-       0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078, 0x4727, 0x70ab, 0x3f52,
-       0x0078, 0x2459, 0x0078, 0x3f3a, 0x70ab, 0x3f58, 0x0078, 0x2459,
-       0x0078, 0x3f46, 0xa286, 0x0001, 0x0040, 0x3f60, 0x1078, 0x23eb,
-       0x70a7, 0x3f64, 0x0078, 0x4739, 0x2011, 0x0015, 0x1078, 0x42eb,
-       0x0079, 0x3f6a, 0x3f6f, 0x2459, 0x3b96, 0x3f7d, 0x3f89, 0xa6b4,
-       0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x783b, 0x1301, 0x70b4,
-       0xa080, 0x00b4, 0x781a, 0x0078, 0x2459, 0xa6b4, 0x00ff, 0xa6b5,
-       0x0400, 0x6eb6, 0x7e5a, 0x70b4, 0xa080, 0x00a6, 0x781a, 0x0078,
-       0x2459, 0x70ab, 0x3f8d, 0x0078, 0x2459, 0x0078, 0x3f6f, 0xa282,
-       0x0003, 0x0050, 0x3f95, 0x1078, 0x23eb, 0x2300, 0x0079, 0x3f98,
-       0x3f9b, 0x3fd2, 0x402d, 0xa286, 0x0001, 0x0040, 0x3fa1, 0x1078,
-       0x23eb, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x3fae,
-       0x1078, 0x3af8, 0x7003, 0x0000, 0x0078, 0x3b96, 0x683b, 0x0000,
-       0x6837, 0x0000, 0xa684, 0x0200, 0x0040, 0x3fbc, 0x1078, 0x46f8,
-       0x1078, 0x42d3, 0x1078, 0x46ff, 0x2001, 0x0001, 0x1078, 0x4691,
-       0x78b8, 0xa084, 0xc001, 0x0040, 0x3fce, 0x7848, 0xa085, 0x0008,
-       0x784a, 0x7848, 0xa084, 0x0008, 0x00c0, 0x3fc9, 0x7003, 0x0000,
-       0x0078, 0x3b96, 0x2200, 0x0079, 0x3fd5, 0x3fd7, 0x4008, 0x70a7,
-       0x3fdb, 0x0078, 0x4739, 0x2011, 0x000d, 0x1078, 0x42eb, 0x0079,
-       0x3fe1, 0x3fe8, 0x2459, 0x3b96, 0x3ff0, 0x3ff8, 0x3ffe, 0x4000,
-       0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727,
-       0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727,
-       0x70ab, 0x3ffc, 0x0078, 0x2459, 0x0078, 0x3fe8, 0x1078, 0x23eb,
-       0x70ab, 0x4004, 0x0078, 0x2459, 0x1078, 0x473f, 0x0078, 0x2459,
-       0x70a7, 0x400c, 0x0078, 0x4739, 0x2011, 0x0005, 0x1078, 0x42eb,
-       0x0079, 0x4012, 0x4017, 0x2459, 0x3b96, 0x401f, 0x4027, 0xa6b4,
-       0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727, 0xa6b4,
-       0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727, 0x70ab,
-       0x402b, 0x0078, 0x2459, 0x0078, 0x4017, 0xa286, 0x0001, 0x0040,
-       0x4033, 0x1078, 0x23eb, 0x70a7, 0x4037, 0x0078, 0x4739, 0x2011,
-       0x0006, 0x1078, 0x42eb, 0x0079, 0x403d, 0x4042, 0x2459, 0x3b96,
-       0x4048, 0x4052, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727,
-       0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0xa6b5, 0x4000, 0x7e5a,
-       0x0078, 0x4727, 0x70ab, 0x4056, 0x0078, 0x2459, 0x0078, 0x4042,
-       0x2300, 0x0079, 0x405b, 0x4060, 0x405e, 0x405e, 0x1078, 0x23eb,
-       0x1078, 0x23eb, 0x2300, 0x71a8, 0xa005, 0x017a, 0x6810, 0x70be,
-       0xa282, 0x0003, 0x0050, 0x406e, 0x1078, 0x23eb, 0x2300, 0x0079,
-       0x4071, 0x4074, 0x4082, 0x40a4, 0xa684, 0x0200, 0x0040, 0x407c,
-       0x1078, 0x46f8, 0x1078, 0x46ff, 0x2001, 0x0001, 0x1078, 0x4691,
-       0x0078, 0x2459, 0xa296, 0x0002, 0x0040, 0x408b, 0x82ff, 0x0040,
-       0x408b, 0x1078, 0x23eb, 0x70a7, 0x408f, 0x0078, 0x4739, 0x2011,
-       0x0018, 0x1078, 0x42eb, 0x0079, 0x4095, 0x409a, 0x2459, 0x3b96,
-       0x409c, 0x409e, 0x0078, 0x4727, 0x0078, 0x4727, 0x70ab, 0x40a2,
-       0x0078, 0x2459, 0x0078, 0x409a, 0x2200, 0x0079, 0x40a7, 0x40a9,
-       0x40c2, 0x70a7, 0x40ad, 0x0078, 0x4739, 0x2011, 0x0017, 0x1078,
-       0x42eb, 0x0079, 0x40b3, 0x40b8, 0x2459, 0x3b96, 0x40ba, 0x40bc,
-       0x0078, 0x4727, 0x0078, 0x4727, 0x70ab, 0x40c0, 0x0078, 0x2459,
-       0x0078, 0x40b8, 0xa484, 0x8000, 0x00c0, 0x410c, 0xa684, 0x0100,
-       0x0040, 0x40d6, 0x1078, 0x46f8, 0x1078, 0x42d3, 0x1078, 0x46ff,
-       0x7848, 0xa085, 0x000c, 0x784a, 0x0078, 0x40da, 0x78d8, 0x78d2,
-       0x78dc, 0x78d6, 0xa6b4, 0xefff, 0x7e5a, 0x70a7, 0x40e1, 0x0078,
-       0x4739, 0x2011, 0x000d, 0x1078, 0x42eb, 0x0079, 0x40e7, 0x40ee,
-       0x2459, 0x3b96, 0x40ee, 0x40fc, 0x4102, 0x4104, 0xa684, 0x0100,
-       0x0040, 0x40fa, 0x1078, 0x46b6, 0x682c, 0x78d2, 0x6830, 0x78d6,
-       0x1078, 0x46f0, 0x0078, 0x4727, 0x70ab, 0x4100, 0x0078, 0x2459,
-       0x0078, 0x40ee, 0x1078, 0x23eb, 0x70ab, 0x4108, 0x0078, 0x2459,
-       0x1078, 0x473f, 0x0078, 0x2459, 0x1078, 0x46ff, 0x70ab, 0x4116,
-       0x2001, 0x0003, 0x1078, 0x4689, 0x0078, 0x4733, 0x1078, 0x46f0,
-       0x682c, 0x78d2, 0x6830, 0x78d6, 0x0078, 0x4727, 0x70b8, 0x6812,
-       0x70be, 0x8000, 0x70ba, 0x681b, 0x0000, 0xa684, 0x0008, 0x0040,
-       0x4141, 0x157e, 0x137e, 0x147e, 0x7890, 0x8004, 0x8004, 0x8004,
-       0x8004, 0xa084, 0x000f, 0x681a, 0x80ac, 0x789b, 0x0000, 0xaf80,
-       0x002b, 0x2098, 0xad80, 0x000b, 0x20a0, 0x53a5, 0x147f, 0x137f,
-       0x157f, 0xa6c4, 0x0f00, 0xa684, 0x0002, 0x00c0, 0x4150, 0x692c,
-       0x810d, 0x810d, 0x810d, 0xa184, 0x0007, 0x2008, 0x0078, 0x415f,
-       0x789b, 0x0010, 0x79ac, 0xa184, 0x0020, 0x0040, 0x415f, 0x017e,
-       0x2009, 0x0005, 0x2001, 0x3d00, 0x1078, 0x46c1, 0x017f, 0xa184,
-       0x001f, 0xa805, 0x6816, 0x1078, 0x3b69, 0x68be, 0xa684, 0x0004,
-       0x0040, 0x4170, 0xa18c, 0xff00, 0x78a8, 0xa084, 0x00ff, 0xa105,
-       0x682a, 0xa6b4, 0x00ff, 0x6000, 0xa084, 0x0008, 0x0040, 0x417a,
-       0xa6b5, 0x4000, 0x6eb6, 0x007c, 0x157e, 0x137e, 0x147e, 0x6918,
-       0x7890, 0x8004, 0x8004, 0x8004, 0x8004, 0xa084, 0x000f, 0x007e,
-       0xa100, 0x681a, 0x007f, 0x8000, 0x8004, 0x0040, 0x419b, 0x20a8,
-       0x8104, 0xa080, 0x000b, 0xad00, 0x20a0, 0x789b, 0x0000, 0xaf80,
-       0x002b, 0x2098, 0x53a5, 0x147f, 0x137f, 0x157f, 0x007c, 0x682c,
-       0xa084, 0x0020, 0x00c0, 0x41a7, 0x620c, 0x0078, 0x41a8, 0x6210,
-       0x6b18, 0x2300, 0xa202, 0x0040, 0x41c8, 0x2018, 0xa382, 0x000e,
-       0x0048, 0x41b8, 0x0040, 0x41b8, 0x2019, 0x000e, 0x0078, 0x41bc,
-       0x7858, 0xa084, 0xffef, 0x785a, 0x783b, 0x1b01, 0x7893, 0x0000,
-       0x7ba2, 0x70b4, 0xa080, 0x008e, 0x781a, 0xa085, 0x0001, 0x007c,
-       0x7858, 0xa084, 0xffef, 0x785a, 0x7893, 0x0000, 0xa006, 0x007c,
-       0x6904, 0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x41dd, 0xa196,
-       0x000f, 0x0040, 0x41dd, 0x6807, 0x0117, 0x6914, 0x1078, 0x3b69,
-       0x6100, 0x8104, 0x00c8, 0x41f8, 0x601c, 0xa005, 0x0040, 0x41ec,
-       0x2001, 0x0800, 0x0078, 0x41fa, 0x0d7e, 0x6824, 0x007e, 0x1078,
-       0x4708, 0x007f, 0x6826, 0x2d00, 0x682e, 0x1078, 0x3af8, 0x0d7f,
-       0x2001, 0x0200, 0x6826, 0x8007, 0x789b, 0x000e, 0x78aa, 0x6820,
-       0xa085, 0x8000, 0x6822, 0x2031, 0x0400, 0x6eb6, 0x7e5a, 0x71b4,
-       0xa188, 0x0091, 0x791a, 0x007c, 0xa6c4, 0x0f00, 0xa684, 0x0002,
-       0x00c0, 0x4220, 0x692c, 0x810d, 0x810d, 0x810d, 0xa184, 0x0007,
-       0x2008, 0xa805, 0x6816, 0x1078, 0x3b69, 0x68be, 0x0078, 0x4223,
-       0x6914, 0x1078, 0x3b69, 0x6100, 0x8104, 0x00c8, 0x4280, 0xa184,
-       0x0300, 0x0040, 0x422f, 0x6807, 0x0117, 0x0078, 0x424d, 0x6004,
-       0xa005, 0x00c0, 0x4256, 0x6807, 0x0117, 0x601c, 0xa005, 0x00c0,
-       0x4243, 0x0d7e, 0x1078, 0x4708, 0x6827, 0x0034, 0x2d00, 0x682e,
-       0x1078, 0x3af8, 0x0d7f, 0xa684, 0x0004, 0x0040, 0x424d, 0x2031,
-       0x0400, 0x2001, 0x2800, 0x0078, 0x4251, 0x2031, 0x0400, 0x2001,
-       0x0800, 0x71b4, 0xa188, 0x0091, 0x0078, 0x42ae, 0x6018, 0xa005,
-       0x00c0, 0x4243, 0x601c, 0xa005, 0x00c0, 0x4243, 0x689f, 0x0000,
-       0x6827, 0x003d, 0xa684, 0x0001, 0x0040, 0x42bc, 0xd694, 0x00c0,
-       0x4279, 0x6100, 0xd1d4, 0x0040, 0x4279, 0x692c, 0x81ff, 0x0040,
-       0x42bc, 0xa186, 0x0003, 0x0040, 0x42bc, 0xa186, 0x0012, 0x0040,
-       0x42bc, 0xa6b5, 0x0800, 0x71b4, 0xa188, 0x00af, 0x0078, 0x42b7,
-       0x6807, 0x0117, 0x2031, 0x0400, 0x692c, 0xa18c, 0x00ff, 0xa186,
-       0x0012, 0x00c0, 0x4291, 0x2001, 0x42c9, 0x2009, 0x0001, 0x0078,
-       0x42a2, 0xa186, 0x0003, 0x00c0, 0x429b, 0x2001, 0x42ca, 0x2009,
-       0x0012, 0x0078, 0x42a2, 0x2001, 0x0200, 0x71b4, 0xa188, 0x0091,
-       0x0078, 0x42ae, 0x1078, 0x46db, 0x78a3, 0x0000, 0x681c, 0xa085,
-       0x0040, 0x681e, 0x71b4, 0xa188, 0x00df, 0xa006, 0x6826, 0x8007,
-       0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822, 0x6eb6,
-       0x7e5a, 0x791a, 0x0078, 0x2459, 0x6eb6, 0x1078, 0x3af8, 0x6810,
-       0x70be, 0x7003, 0x0007, 0x70a3, 0x0000, 0x704b, 0x0000, 0x0078,
-       0x2459, 0x0023, 0x0070, 0x0005, 0x0000, 0x0a00, 0x0000, 0x0000,
-       0x0025, 0x0000, 0x0000, 0x683b, 0x0000, 0x6837, 0x0000, 0xa684,
-       0x0200, 0x0040, 0x42ea, 0x78b8, 0xa08c, 0x001f, 0xa084, 0x8000,
-       0x0040, 0x42e3, 0x8108, 0x78d8, 0xa100, 0x6836, 0x78dc, 0xa081,
-       0x0000, 0x683a, 0x007c, 0x7990, 0x810f, 0xa5ac, 0x0007, 0x2021,
-       0x0000, 0xa480, 0x0010, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa184,
-       0x0080, 0x00c0, 0x4319, 0xa182, 0x0020, 0x00c8, 0x4337, 0xa182,
-       0x0012, 0x00c8, 0x467b, 0x2100, 0x1079, 0x4307, 0x007c, 0x467b,
-       0x44e8, 0x467b, 0x467b, 0x4344, 0x4347, 0x4381, 0x43b7, 0x43eb,
-       0x43ee, 0x467b, 0x467b, 0x43a2, 0x4412, 0x444c, 0x467b, 0x467b,
-       0x4473, 0xa184, 0x0020, 0x00c0, 0x44a7, 0xa18c, 0x001f, 0x6814,
-       0xa084, 0x001f, 0xa106, 0x0040, 0x4334, 0x70b4, 0xa080, 0x00d2,
-       0x781a, 0x2001, 0x0014, 0x1078, 0x4691, 0x1078, 0x46ff, 0x7003,
-       0x0000, 0x2001, 0x0002, 0x007c, 0x2001, 0x0000, 0x007c, 0xa182,
-       0x0024, 0x00c8, 0x467b, 0xa184, 0x0003, 0x1079, 0x4307, 0x007c,
-       0x467b, 0x467b, 0x467b, 0x467b, 0x1078, 0x467b, 0x007c, 0x2200,
-       0x0079, 0x434a, 0x4476, 0x4476, 0x436e, 0x436e, 0x436e, 0x436e,
-       0x436e, 0x436e, 0x436e, 0x436e, 0x436c, 0x436e, 0x4363, 0x436e,
-       0x436e, 0x436e, 0x436e, 0x436e, 0x4376, 0x4379, 0x4476, 0x4379,
-       0x436e, 0x436e, 0x436e, 0x0c7e, 0x077e, 0x6f14, 0x1078, 0x36e2,
-       0x077f, 0x0c7f, 0x0078, 0x436e, 0x1078, 0x458b, 0x6827, 0x02b3,
-       0x2009, 0x000b, 0x2001, 0x4800, 0x0078, 0x44aa, 0x1078, 0x4670,
-       0x007c, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001, 0x4800, 0x0078,
-       0x4492, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
-       0x438b, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078, 0x4708, 0x6827,
-       0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078, 0x3ac8, 0x1078,
-       0x44d0, 0x2b68, 0x1078, 0x3af8, 0x0d7f, 0x1078, 0x3af8, 0x2001,
-       0x0002, 0x007c, 0x1078, 0x44d0, 0x2001, 0x0017, 0x1078, 0x4691,
-       0x70a3, 0x0000, 0x2009, 0x5138, 0x200b, 0x0006, 0x70af, 0x0017,
-       0x2009, 0x0200, 0x1078, 0x3a06, 0x2001, 0x0001, 0x007c, 0x2200,
-       0x0079, 0x43ba, 0x4476, 0x44a7, 0x44a7, 0x44a7, 0x43db, 0x44b7,
-       0x43e3, 0x44b7, 0x44b7, 0x44ba, 0x44ba, 0x44bf, 0x44bf, 0x43d3,
-       0x43d3, 0x44a7, 0x44a7, 0x44b7, 0x44a7, 0x43e3, 0x4476, 0x43e3,
-       0x43e3, 0x43e3, 0x43e3, 0x6827, 0x0084, 0x2009, 0x000b, 0x2001,
-       0x4300, 0x0078, 0x44c9, 0x6827, 0x000d, 0x2009, 0x000b, 0x2001,
-       0x4300, 0x0078, 0x44aa, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001,
-       0x4300, 0x0078, 0x4492, 0x2001, 0x0000, 0x007c, 0x2200, 0x0079,
-       0x43f1, 0x4476, 0x440a, 0x440a, 0x440a, 0x440a, 0x44b7, 0x44b7,
-       0x44b7, 0x44b7, 0x44b7, 0x44b7, 0x44b7, 0x44b7, 0x440a, 0x440a,
-       0x440a, 0x440a, 0x44b7, 0x440a, 0x440a, 0x44b7, 0x44b7, 0x44b7,
-       0x44b7, 0x4476, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001, 0x4300,
-       0x0078, 0x4492, 0xa684, 0x0004, 0x00c0, 0x4426, 0x6804, 0xa084,
-       0x00ff, 0xa086, 0x0006, 0x00c0, 0x467b, 0x1078, 0x44d0, 0x6807,
-       0x0117, 0x1078, 0x3af8, 0x2001, 0x0002, 0x007c, 0x6000, 0xa084,
-       0x0004, 0x0040, 0x467b, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086,
-       0x0006, 0x00c0, 0x4435, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078,
-       0x4708, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078,
-       0x3ad7, 0x1078, 0x44d0, 0x2b68, 0x1078, 0x3af8, 0x0d7f, 0x1078,
-       0x3af8, 0x2001, 0x0002, 0x007c, 0x6000, 0xa084, 0x0004, 0x0040,
-       0x467b, 0x2d58, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0006, 0x00c0,
-       0x445b, 0x6807, 0x0117, 0x6827, 0x0002, 0x2d58, 0x1078, 0x4708,
-       0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078, 0x3ae7,
-       0x1078, 0x44d0, 0x2b68, 0x1078, 0x3af8, 0x0d7f, 0x1078, 0x3af8,
-       0x2001, 0x0002, 0x007c, 0x1078, 0x467b, 0x007c, 0x70b4, 0xa080,
-       0x00d2, 0x781a, 0x2001, 0x0001, 0x1078, 0x4691, 0x1078, 0x46ff,
-       0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x1078, 0x46c1, 0x1078,
-       0x46f8, 0x1078, 0x42d3, 0x1078, 0x41d0, 0x1078, 0x46ff, 0x2001,
-       0x0001, 0x007c, 0x1078, 0x46c1, 0x1078, 0x46f8, 0x1078, 0x42d3,
-       0x70b4, 0xa080, 0x00d2, 0x781a, 0x2001, 0x0013, 0x1078, 0x4691,
-       0x1078, 0x46ff, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x1078,
-       0x467b, 0x007c, 0x1078, 0x46c1, 0x1078, 0x46f8, 0x1078, 0x42d3,
-       0x1078, 0x41d0, 0x1078, 0x46ff, 0x2001, 0x0001, 0x007c, 0x2001,
-       0x0003, 0x007c, 0x1078, 0x458b, 0x2001, 0x0000, 0x007c, 0x0c7e,
-       0x077e, 0x6f14, 0x1078, 0x36e2, 0x077f, 0x0c7f, 0x2001, 0x0000,
-       0x007c, 0x1078, 0x46c1, 0x1078, 0x467b, 0x2001, 0x0006, 0x007c,
-       0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x44db, 0xa186,
-       0x000f, 0x00c0, 0x44df, 0x1078, 0x46f8, 0x1078, 0x42d3, 0x70b4,
-       0xa080, 0x00d2, 0x781a, 0x1078, 0x46ff, 0x7003, 0x0000, 0x007c,
-       0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004,
-       0x00c8, 0x467b, 0x1079, 0x44f5, 0x007c, 0x467b, 0x44f9, 0x467b,
-       0x4592, 0xa282, 0x0003, 0x0040, 0x4500, 0x1078, 0x467b, 0x007c,
-       0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4, 0x00ff, 0x69b8, 0xa184,
-       0x0100, 0x0040, 0x453f, 0xa18c, 0xfeff, 0x69ba, 0x78a0, 0xa005,
-       0x00c0, 0x453f, 0xa4a4, 0x00ff, 0x0040, 0x4533, 0xa482, 0x000c,
-       0x0040, 0x451c, 0x00c8, 0x4526, 0x852b, 0x852b, 0x1078, 0x3760,
-       0x0040, 0x4526, 0x1078, 0x355b, 0x0078, 0x4535, 0x1078, 0x465d,
-       0x1078, 0x3586, 0x69b8, 0xa18d, 0x0100, 0x69ba, 0xa6b5, 0x1000,
-       0x7e5a, 0x0078, 0x4538, 0x1078, 0x3586, 0xa6b4, 0xefff, 0x7e5a,
-       0x70b4, 0xa080, 0x0091, 0x781a, 0x2001, 0x0001, 0x007c, 0x0c7e,
-       0x1078, 0x457f, 0x6200, 0xd2e4, 0x0040, 0x4570, 0x6208, 0x8217,
-       0xa294, 0x00ff, 0xa282, 0x000c, 0x0048, 0x4552, 0x0040, 0x4552,
-       0x2011, 0x000c, 0x2400, 0xa202, 0x00c8, 0x4557, 0x2220, 0x6208,
-       0xa294, 0x00ff, 0x701c, 0xa202, 0x00c8, 0x455f, 0x721c, 0x2200,
-       0xa502, 0x00c8, 0x4564, 0x2228, 0x1078, 0x4661, 0x852b, 0x852b,
-       0x1078, 0x3760, 0x0040, 0x4570, 0x1078, 0x3562, 0x0078, 0x4574,
-       0x1078, 0x465d, 0x1078, 0x358d, 0xa6b5, 0x1000, 0x7e5a, 0x70b4,
-       0xa080, 0x00be, 0x781a, 0x2001, 0x0004, 0x0c7f, 0x007c, 0x007e,
-       0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0,
-       0x5380, 0x007f, 0x007c, 0x0c7e, 0x1078, 0x457f, 0x1078, 0x358d,
-       0x0c7f, 0x007c, 0xa282, 0x0002, 0x00c0, 0x467b, 0x7aa8, 0xa294,
-       0x00ff, 0x69b8, 0xa184, 0x0200, 0x0040, 0x45c9, 0xa18c, 0xfdff,
-       0x69ba, 0x78a0, 0xa005, 0x00c0, 0x45c9, 0xa282, 0x0002, 0x00c8,
-       0x369d, 0x1078, 0x4627, 0x1078, 0x362b, 0x1078, 0x3586, 0xa684,
-       0x0100, 0x0040, 0x45bf, 0x682c, 0xa084, 0x0001, 0x0040, 0x45bf,
-       0xc6fc, 0x7888, 0xa084, 0x0040, 0x0040, 0x45bf, 0xc6fd, 0xa6b5,
-       0x1000, 0x7e5a, 0x70b4, 0xa080, 0x0091, 0x781a, 0x2001, 0x0001,
-       0x007c, 0x0c7e, 0x1078, 0x457f, 0xa284, 0xfffe, 0x0040, 0x45d4,
-       0x2011, 0x0001, 0x0078, 0x45d8, 0xa284, 0x0001, 0x0040, 0x45de,
-       0x6100, 0xd1ec, 0x00c0, 0x45de, 0x2011, 0x0000, 0x1078, 0x4619,
-       0x1078, 0x3632, 0x1078, 0x358d, 0xa684, 0x0100, 0x0040, 0x45f4,
-       0x682c, 0xa084, 0x0001, 0x0040, 0x45f4, 0xc6fc, 0x7888, 0xa084,
-       0x0040, 0x0040, 0x45f4, 0xc6fd, 0xa6b5, 0x1000, 0x7e5a, 0x70b4,
-       0xa080, 0x00be, 0x781a, 0x2001, 0x0004, 0x0c7f, 0x007c, 0x0c7e,
-       0x2960, 0x6000, 0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, 0x460a,
-       0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003,
-       0x7aaa, 0xa8c0, 0x0004, 0x68b8, 0xa085, 0x0200, 0x68ba, 0x0c7f,
-       0x007c, 0x789b, 0x0018, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
-       0x0003, 0x7aaa, 0x789b, 0x0081, 0x78ab, 0x0004, 0x007c, 0x0c7e,
-       0x7054, 0x2060, 0x6000, 0xa084, 0x1000, 0x00c0, 0x4635, 0x2029,
-       0x0032, 0x2021, 0x0000, 0x0078, 0x4655, 0x6508, 0xa5ac, 0x00ff,
-       0x7018, 0xa086, 0x0028, 0x00c0, 0x4645, 0xa582, 0x0019, 0x00c8,
-       0x464b, 0x2029, 0x0019, 0x0078, 0x464b, 0xa582, 0x000c, 0x00c8,
-       0x464b, 0x2029, 0x000c, 0x6408, 0x8427, 0xa4a4, 0x00ff, 0xa482,
-       0x000c, 0x0048, 0x4655, 0x2021, 0x000c, 0x1078, 0x4661, 0x68b8,
-       0xa085, 0x0100, 0x68ba, 0x0c7f, 0x007c, 0x2021, 0x0000, 0x2029,
-       0x0032, 0x789b, 0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
-       0x0001, 0x7daa, 0x7caa, 0x789b, 0x0081, 0x78ab, 0x0005, 0x007c,
-       0x2001, 0x0003, 0x1078, 0x4689, 0x70b4, 0xa080, 0x00be, 0x781a,
-       0x2001, 0x0005, 0x007c, 0x2001, 0x0007, 0x1078, 0x4689, 0xa6b5,
-       0x1000, 0x7e5a, 0x70b4, 0xa080, 0x00be, 0x781a, 0x2001, 0x0004,
-       0x007c, 0x789b, 0x0018, 0x78aa, 0x789b, 0x0081, 0x78ab, 0x0001,
-       0x007c, 0x6904, 0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x469f,
-       0xa196, 0x000f, 0x0040, 0x469f, 0x1078, 0x195a, 0x007c, 0x6924,
-       0xa194, 0x003f, 0x00c0, 0x46a8, 0xa18c, 0xffc0, 0xa105, 0x6826,
-       0x1078, 0x3af8, 0x691c, 0xa184, 0x0100, 0x0040, 0x46b5, 0x6914,
-       0x1078, 0x3b69, 0x6204, 0x8210, 0x6206, 0x007c, 0x692c, 0x6834,
-       0x682e, 0xa112, 0x6930, 0x6838, 0x6832, 0xa11b, 0xa200, 0xa301,
-       0x007c, 0x0c7e, 0xade0, 0x0018, 0x6003, 0x0070, 0x6106, 0x600b,
-       0x0000, 0x600f, 0x0a00, 0x6013, 0x0000, 0x6017, 0x0000, 0x8007,
-       0x601a, 0x601f, 0x0000, 0x6023, 0x0000, 0x0c7f, 0x6824, 0xa085,
-       0x0080, 0x6826, 0x007c, 0x157e, 0x137e, 0x147e, 0x2098, 0xaf80,
-       0x002d, 0x20a0, 0x81ac, 0x0040, 0x46e6, 0x53a6, 0xa184, 0x0001,
-       0x0040, 0x46ec, 0x3304, 0x78be, 0x147f, 0x137f, 0x157f, 0x007c,
-       0x70b0, 0xa005, 0x10c0, 0x23eb, 0x70b3, 0x8000, 0x0078, 0x4a3a,
-       0x71b0, 0x81ff, 0x0040, 0x46fe, 0x1078, 0x4b30, 0x007c, 0x71b0,
-       0x81ff, 0x0040, 0x4707, 0x70b3, 0x0000, 0x1078, 0x4776, 0x007c,
-       0x0c7e, 0x0d7e, 0x1078, 0x1937, 0x0c7f, 0x157e, 0x137e, 0x147e,
-       0x2da0, 0x2c98, 0x20a9, 0x0031, 0x53a3, 0x147f, 0x137f, 0x157f,
-       0x6807, 0x010d, 0x680b, 0x0000, 0x7004, 0x8007, 0x681a, 0x6823,
-       0x0000, 0x681f, 0x0000, 0x689f, 0x0000, 0x0c7f, 0x007c, 0x70b4,
-       0xa080, 0x0091, 0x781a, 0x0078, 0x2459, 0x70b4, 0xa080, 0x0081,
-       0x781a, 0x0078, 0x2459, 0x70b4, 0xa080, 0x00be, 0x781a, 0x0078,
-       0x2459, 0x70b4, 0xa080, 0x00c8, 0x781a, 0x0078, 0x2459, 0x6904,
-       0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x474c, 0xa196, 0x000f,
-       0x0040, 0x474c, 0x6807, 0x0117, 0x2001, 0x0200, 0x6826, 0x8007,
-       0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822, 0x2031,
-       0x0400, 0x6eb6, 0x7e5a, 0x71b4, 0xa188, 0x0091, 0x791a, 0x007c,
-       0x1078, 0x46ff, 0x7848, 0xa085, 0x000c, 0x784a, 0x70b4, 0xa080,
-       0x00d2, 0x781a, 0x2009, 0x000b, 0x2001, 0x4400, 0x1078, 0x46c1,
-       0x2001, 0x0013, 0x1078, 0x4691, 0x0078, 0x3b96, 0x127e, 0x2091,
-       0x2200, 0x2049, 0x4776, 0x7000, 0x7204, 0xa205, 0x720c, 0xa215,
-       0x7008, 0xa084, 0xfff7, 0xa205, 0x0040, 0x4788, 0x0078, 0x478d,
-       0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x7000, 0xa084, 0x0001,
-       0x00c0, 0x47bb, 0x7108, 0x8103, 0x00c8, 0x479a, 0x1078, 0x48bd,
-       0x0078, 0x4792, 0x700c, 0xa08c, 0x00ff, 0x0040, 0x47bb, 0x7004,
-       0x8004, 0x00c8, 0x47b2, 0x7014, 0xa005, 0x00c0, 0x47ae, 0x7010,
-       0xa005, 0x0040, 0x47b2, 0xa102, 0x00c8, 0x4792, 0x7007, 0x0010,
-       0x0078, 0x47bb, 0x8aff, 0x0040, 0x47bb, 0x1078, 0x4b07, 0x00c0,
-       0x47b5, 0x0040, 0x4792, 0x1078, 0x4846, 0x7003, 0x0000, 0x127f,
-       0x2000, 0x007c, 0x017e, 0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007,
-       0x0040, 0x47ce, 0xa18e, 0x000f, 0x00c0, 0x47d1, 0x6040, 0x0078,
-       0x47d2, 0x6428, 0x017f, 0x84ff, 0x0040, 0x47fc, 0x2c70, 0x7004,
-       0xa0bc, 0x000f, 0xa7b8, 0x480c, 0x273c, 0x87fb, 0x00c0, 0x47ea,
-       0x0048, 0x47e4, 0x1078, 0x23eb, 0x609c, 0xa075, 0x0040, 0x47fc,
-       0x0078, 0x47d7, 0x2704, 0xae68, 0x6808, 0xa630, 0x680c, 0xa529,
-       0x8421, 0x0040, 0x47fc, 0x8738, 0x2704, 0xa005, 0x00c0, 0x47eb,
-       0x709c, 0xa075, 0x00c0, 0x47d7, 0x007c, 0x0000, 0x0005, 0x0009,
-       0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003, 0x0009,
-       0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x4801, 0x47fe, 0x0000,
-       0x0000, 0x8000, 0x0000, 0x4801, 0x0000, 0x4809, 0x4806, 0x0000,
-       0x0000, 0x0000, 0x0000, 0x4809, 0x0000, 0x4804, 0x4804, 0x0000,
-       0x0000, 0x8000, 0x0000, 0x4804, 0x0000, 0x480a, 0x480a, 0x0000,
-       0x0000, 0x0000, 0x0000, 0x480a, 0x127e, 0x2091, 0x2200, 0x2079,
-       0x5100, 0x2071, 0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003,
-       0x0000, 0x2071, 0x0020, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003,
-       0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c, 0x2049, 0x4846,
-       0x2019, 0x0000, 0x7004, 0x8004, 0x00c8, 0x4899, 0x7007, 0x0012,
-       0x7108, 0x7008, 0xa106, 0x00c0, 0x4850, 0xa184, 0x01e0, 0x0040,
-       0x485b, 0x1078, 0x23eb, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
-       0x00c8, 0x4866, 0xa184, 0x4000, 0x00c0, 0x4850, 0xa19c, 0x300c,
-       0xa386, 0x2004, 0x0040, 0x4874, 0xa386, 0x0008, 0x0040, 0x487f,
-       0xa386, 0x200c, 0x00c0, 0x4850, 0x7200, 0x8204, 0x0048, 0x487f,
-       0x730c, 0xa384, 0x00ff, 0x0040, 0x487f, 0x1078, 0x23eb, 0x7007,
-       0x0012, 0x7000, 0xa084, 0x0001, 0x00c0, 0x4899, 0x7008, 0xa084,
-       0x01e0, 0x00c0, 0x4899, 0x7310, 0x7014, 0xa305, 0x0040, 0x4899,
-       0x710c, 0xa184, 0x0300, 0x00c0, 0x4899, 0xa184, 0x00ff, 0x00c0,
-       0x4846, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xa084, 0x0008,
-       0x00c0, 0x489d, 0x7007, 0x0012, 0x7108, 0x8103, 0x0048, 0x48a2,
-       0x7003, 0x0000, 0x2049, 0x0000, 0x007c, 0x107e, 0x007e, 0x127e,
-       0x157e, 0x2091, 0x2200, 0x7108, 0x1078, 0x48bd, 0x157f, 0x127f,
-       0x2091, 0x8001, 0x007f, 0x107f, 0x007c, 0x7204, 0x7500, 0x730c,
-       0xa384, 0x0300, 0x00c0, 0x48e4, 0xa184, 0x01e0, 0x00c0, 0x4908,
-       0x7108, 0xa184, 0x01e0, 0x00c0, 0x4908, 0x2001, 0x04fd, 0x2004,
-       0xa082, 0x0005, 0x00c8, 0x48d8, 0xa184, 0x4000, 0x00c0, 0x48c8,
-       0xa184, 0x0007, 0x0079, 0x48dc, 0x48e6, 0x48f8, 0x48e4, 0x48f8,
-       0x48e4, 0x4944, 0x48e4, 0x4942, 0x1078, 0x23eb, 0x7004, 0xa084,
-       0x0010, 0xa085, 0x0002, 0x7006, 0x8aff, 0x00c0, 0x48f3, 0x2049,
-       0x0000, 0x0078, 0x48f7, 0x1078, 0x4b07, 0x00c0, 0x48f3, 0x007c,
-       0x7004, 0xa084, 0x0010, 0xa085, 0x0002, 0x7006, 0x8aff, 0x00c0,
-       0x4903, 0x0078, 0x4907, 0x1078, 0x4b07, 0x00c0, 0x4903, 0x007c,
-       0x7007, 0x0012, 0x7108, 0x00e0, 0x490b, 0x2091, 0x6000, 0x00e0,
-       0x490f, 0x2091, 0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004,
-       0xa084, 0x0008, 0x00c0, 0x4917, 0x7007, 0x0012, 0x7108, 0x8103,
-       0x0048, 0x491c, 0x7003, 0x0000, 0x7000, 0xa005, 0x00c0, 0x4930,
-       0x7004, 0xa005, 0x00c0, 0x4930, 0x700c, 0xa005, 0x0040, 0x4932,
-       0x0078, 0x4913, 0x2049, 0x0000, 0x1078, 0x3809, 0x6818, 0xa084,
-       0x8000, 0x0040, 0x493d, 0x681b, 0x0002, 0x007c, 0x1078, 0x23eb,
-       0x1078, 0x23eb, 0x1078, 0x49a0, 0x7210, 0x7114, 0x700c, 0xa09c,
-       0x00ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, 0x1078, 0x49a0,
-       0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322, 0x630c, 0x2100,
-       0xa31b, 0x2400, 0xa305, 0x0040, 0x4967, 0x00c8, 0x4967, 0x8412,
-       0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078, 0x494e, 0x2b60,
-       0x8a07, 0x007e, 0x6004, 0xa084, 0x0008, 0x0040, 0x4973, 0xa7ba,
-       0x4806, 0x0078, 0x4975, 0xa7ba, 0x47fe, 0x007f, 0xa73d, 0x2c00,
-       0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7007, 0x0012, 0x1078, 0x4846,
-       0x007c, 0x8738, 0x2704, 0xa005, 0x00c0, 0x4994, 0x609c, 0xa005,
-       0x0040, 0x499d, 0x2060, 0x6004, 0xa084, 0x000f, 0xa080, 0x480c,
-       0x203c, 0x87fb, 0x1040, 0x23eb, 0x8a51, 0x0040, 0x499c, 0x7008,
-       0xa084, 0x0003, 0xa086, 0x0003, 0x007c, 0x2051, 0x0000, 0x007c,
-       0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x49b4, 0x6000, 0xa064,
-       0x00c0, 0x49ab, 0x2d60, 0x6004, 0xa084, 0x000f, 0xa080, 0x481c,
-       0x203c, 0x87fb, 0x1040, 0x23eb, 0x007c, 0x127e, 0x0d7e, 0x2091,
-       0x2200, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90, 0x8057,
-       0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804, 0xa084, 0x0008,
-       0x007f, 0x0040, 0x49cf, 0xa0b8, 0x4806, 0x0078, 0x49d1, 0xa0b8,
-       0x47fe, 0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186,
-       0x0007, 0x0040, 0x49df, 0xa18e, 0x000f, 0x00c0, 0x49e8, 0x681c,
-       0xa084, 0x0040, 0x0040, 0x49ef, 0xa6b5, 0x0001, 0x0078, 0x49ef,
-       0x681c, 0xa084, 0x0040, 0x0040, 0x49ef, 0xa6b5, 0x0001, 0x7007,
-       0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x49f1, 0x2400, 0xa305,
-       0x00c0, 0x49fc, 0x0078, 0x4a22, 0x2c58, 0x2704, 0x6104, 0xac60,
-       0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e, 0xa184, 0x0008,
-       0x0040, 0x4a12, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014, 0xa081,
-       0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c, 0x2300,
-       0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x1078, 0x4981,
-       0x0078, 0x4a24, 0x1078, 0x4b07, 0x00c0, 0x4a22, 0x127f, 0x2000,
-       0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x7007, 0x0004,
-       0x7004, 0xa084, 0x0004, 0x00c0, 0x4a30, 0x7003, 0x0008, 0x127f,
-       0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049,
-       0x4a3a, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4a43,
-       0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007,
-       0x0040, 0x4a56, 0xa18e, 0x000f, 0x00c0, 0x4a61, 0x681c, 0xa084,
-       0x0040, 0x0040, 0x4a5d, 0xa6b5, 0x0001, 0x6840, 0x2050, 0x0078,
-       0x4a6a, 0x681c, 0xa084, 0x0020, 0x00c0, 0x4a68, 0xa6b5, 0x0001,
-       0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x480c,
-       0x273c, 0x87fb, 0x00c0, 0x4a7e, 0x0048, 0x4a78, 0x1078, 0x23eb,
-       0x689c, 0xa065, 0x0040, 0x4a82, 0x0078, 0x4a6b, 0x1078, 0x4b07,
-       0x00c0, 0x4a7e, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e,
-       0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f, 0x047f, 0x7e08, 0xa6b5,
-       0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4a9c,
-       0xa18e, 0x000f, 0x00c0, 0x4aa5, 0x681c, 0xa084, 0x0040, 0x0040,
-       0x4aac, 0xa6b5, 0x0001, 0x0078, 0x4aac, 0x681c, 0xa084, 0x0040,
-       0x0040, 0x4aac, 0xa6b5, 0x0001, 0x2049, 0x4a85, 0x017e, 0x6904,
-       0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4aba, 0xa18e, 0x000f,
-       0x00c0, 0x4abd, 0x6840, 0x0078, 0x4abe, 0x6828, 0x017f, 0xa055,
-       0x0040, 0x4b04, 0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f, 0xa7b8,
-       0x480c, 0x273c, 0x87fb, 0x00c0, 0x4ad8, 0x0048, 0x4ad1, 0x1078,
-       0x23eb, 0x709c, 0xa075, 0x2060, 0x0040, 0x4b04, 0x0078, 0x4ac4,
-       0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0048, 0x4af1,
-       0x8a51, 0x00c0, 0x4ae5, 0x1078, 0x23eb, 0x8738, 0x2704, 0xa005,
-       0x00c0, 0x4ad9, 0x709c, 0xa075, 0x2060, 0x0040, 0x4b04, 0x0078,
-       0x4ac4, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x6908, 0x2400,
-       0xa122, 0x690c, 0x2300, 0xa11b, 0x00c8, 0x4b00, 0x1078, 0x23eb,
-       0x2071, 0x0020, 0x0078, 0x49ef, 0x127f, 0x2000, 0x007c, 0x7008,
-       0xa084, 0x0003, 0xa086, 0x0003, 0x0040, 0x4b2f, 0x2704, 0xac08,
-       0x2104, 0x701a, 0x8108, 0x2104, 0x701e, 0x8108, 0x2104, 0x7012,
-       0x8108, 0x2104, 0x7016, 0x6004, 0xa084, 0x0008, 0x0040, 0x4b26,
-       0x8108, 0x2104, 0x7022, 0x8108, 0x2104, 0x7026, 0x7602, 0x7004,
-       0xa084, 0x0010, 0xa085, 0x0001, 0x7006, 0x1078, 0x4981, 0x007c,
-       0x127e, 0x007e, 0x0d7e, 0x2091, 0x2200, 0x2049, 0x4b30, 0x0d7f,
-       0x087f, 0x7108, 0xa184, 0x0003, 0x00c0, 0x4b5a, 0x017e, 0x6904,
-       0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4b4a, 0xa18e, 0x000f,
-       0x00c0, 0x4b4d, 0x6840, 0x0078, 0x4b4e, 0x6828, 0x017f, 0xa005,
-       0x0040, 0x4b68, 0x0078, 0x478d, 0x0020, 0x4b5a, 0x1078, 0x4944,
-       0x0078, 0x4b68, 0x00a0, 0x4b61, 0x7108, 0x1078, 0x48bd, 0x0078,
-       0x4b39, 0x7007, 0x0010, 0x00a0, 0x4b63, 0x7108, 0x1078, 0x48bd,
-       0x7008, 0xa086, 0x0008, 0x00c0, 0x4b39, 0x7000, 0xa005, 0x00c0,
-       0x4b39, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c,
-       0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x2091, 0x2200,
-       0x0d7f, 0x2049, 0x4b78, 0xad80, 0x0011, 0x20a0, 0x2099, 0x0031,
-       0x700c, 0xa084, 0x00ff, 0x682a, 0x7007, 0x0008, 0x7007, 0x0002,
-       0x7003, 0x0001, 0x0040, 0x4b97, 0x8000, 0x80ac, 0x53a5, 0x7007,
-       0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4b99, 0x0c7f, 0x2049,
-       0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f, 0x2000,
-       0x007c, 0x2091, 0x6000, 0x2091, 0x8000, 0x78cc, 0xa005, 0x0040,
-       0x4bc0, 0x7994, 0x70d0, 0xa106, 0x00c0, 0x4bc0, 0x7804, 0xa005,
-       0x0040, 0x4bc0, 0x7807, 0x0000, 0x0068, 0x4bc0, 0x2091, 0x4080,
-       0x7820, 0x8001, 0x7822, 0x00c0, 0x4c1b, 0x7824, 0x7822, 0x2069,
-       0x5140, 0x6800, 0xa084, 0x0007, 0x0040, 0x4bde, 0xa086, 0x0002,
-       0x0040, 0x4bde, 0x6834, 0xa00d, 0x0040, 0x4bde, 0x2104, 0xa005,
-       0x0040, 0x4bde, 0x8001, 0x200a, 0x0040, 0x4cc3, 0x7848, 0xa005,
-       0x0040, 0x4bec, 0x8001, 0x784a, 0x00c0, 0x4bec, 0x2009, 0x0102,
-       0x6844, 0x200a, 0x1078, 0x21d2, 0x6890, 0xa005, 0x0040, 0x4bf8,
-       0x8001, 0x6892, 0x00c0, 0x4bf8, 0x686f, 0x0000, 0x6873, 0x0001,
-       0x2061, 0x5400, 0x20a9, 0x0100, 0x2009, 0x0002, 0x6034, 0xa005,
-       0x0040, 0x4c0e, 0x8001, 0x6036, 0x00c0, 0x4c0e, 0x6010, 0xa005,
-       0x0040, 0x4c0e, 0x017e, 0x1078, 0x21d2, 0x017f, 0xace0, 0x0010,
-       0x0070, 0x4c14, 0x0078, 0x4bfe, 0x8109, 0x0040, 0x4c1b, 0x20a9,
-       0x0100, 0x0078, 0x4bfe, 0x1078, 0x4c28, 0x1078, 0x4c4d, 0x2009,
-       0x5151, 0x2104, 0x2009, 0x0102, 0x200a, 0x2091, 0x8001, 0x007c,
-       0x7834, 0x8001, 0x7836, 0x00c0, 0x4c4c, 0x7838, 0x7836, 0x2091,
-       0x8000, 0x7844, 0xa005, 0x00c0, 0x4c37, 0x2001, 0x0101, 0x8001,
-       0x7846, 0xa080, 0x7400, 0x2040, 0x2004, 0xa065, 0x0040, 0x4c4c,
-       0x6024, 0xa005, 0x0040, 0x4c48, 0x8001, 0x6026, 0x0040, 0x4c7c,
-       0x6000, 0x2c40, 0x0078, 0x4c3d, 0x007c, 0x7828, 0x8001, 0x782a,
-       0x00c0, 0x4c7b, 0x782c, 0x782a, 0x7830, 0xa005, 0x00c0, 0x4c5a,
-       0x2001, 0x0200, 0x8001, 0x7832, 0x8003, 0x8003, 0x8003, 0x8003,
-       0xa090, 0x5400, 0xa298, 0x0002, 0x2304, 0xa084, 0x0008, 0x0040,
-       0x4c7b, 0xa290, 0x0009, 0x2204, 0xa005, 0x0040, 0x4c73, 0x8001,
-       0x2012, 0x00c0, 0x4c7b, 0x2304, 0xa084, 0xfff7, 0xa085, 0x0080,
-       0x201a, 0x1078, 0x21d2, 0x007c, 0x2069, 0x5140, 0x6800, 0xa005,
-       0x0040, 0x4c86, 0x6848, 0xac06, 0x0040, 0x4cc3, 0x601b, 0x0006,
-       0x60b4, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085,
-       0x0060, 0x6022, 0x6000, 0x2042, 0x6714, 0x6f82, 0x1078, 0x1973,
-       0x6818, 0xa005, 0x0040, 0x4c9e, 0x8001, 0x681a, 0x6808, 0xa084,
-       0xffef, 0x680a, 0x6810, 0x8001, 0x00d0, 0x4ca8, 0x1078, 0x23eb,
-       0x6812, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x1078, 0x1c70,
-       0x2069, 0x5140, 0x7944, 0xa184, 0x0100, 0x2001, 0x0006, 0x686e,
-       0x00c0, 0x4cbe, 0x6986, 0x2001, 0x0004, 0x686e, 0x1078, 0x21cd,
-       0x2091, 0x8001, 0x007c, 0x2069, 0x0100, 0x2009, 0x5140, 0x2104,
-       0xa084, 0x0007, 0x0040, 0x4d1f, 0xa086, 0x0007, 0x00c0, 0x4cd9,
-       0x0d7e, 0x2009, 0x5152, 0x216c, 0x1078, 0x3a4e, 0x0d7f, 0x0078,
-       0x4d1f, 0x2009, 0x5152, 0x2164, 0x1078, 0x2396, 0x601b, 0x0006,
-       0x6858, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085,
-       0x0048, 0x6022, 0x602f, 0x0000, 0x6033, 0x0000, 0x6830, 0xa084,
-       0x0040, 0x0040, 0x4d13, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848,
-       0xa084, 0x0004, 0x0040, 0x4d00, 0x0070, 0x4d00, 0x0078, 0x4cf7,
-       0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040,
-       0x4d0d, 0x0070, 0x4d0d, 0x0078, 0x4d04, 0x20a9, 0x00fa, 0x0070,
-       0x4d13, 0x0078, 0x4d0f, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b,
-       0x0048, 0x2009, 0x515b, 0x200b, 0x0007, 0x784c, 0x784a, 0x2091,
-       0x8001, 0x007c, 0x2079, 0x5100, 0x1078, 0x4d4d, 0x1078, 0x4d31,
-       0x1078, 0x4d3f, 0x7833, 0x0000, 0x7847, 0x0000, 0x784b, 0x0000,
-       0x007c, 0x2019, 0x0003, 0x2011, 0x5146, 0x2204, 0xa086, 0x003c,
-       0x0040, 0x4d3c, 0x2019, 0x0002, 0x7b2a, 0x7b2e, 0x007c, 0x2019,
-       0x0039, 0x2011, 0x5146, 0x2204, 0xa086, 0x003c, 0x0040, 0x4d4a,
-       0x2019, 0x0027, 0x7b36, 0x7b3a, 0x007c, 0x2019, 0x3971, 0x2011,
-       0x5146, 0x2204, 0xa086, 0x003c, 0x0040, 0x4d58, 0x2019, 0x2626,
-       0x7b22, 0x7b26, 0x783f, 0x0000, 0x7843, 0x000a, 0x007c, 0x0020,
-       0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014, 0x0014, 0x0014,
-       0x0014, 0x0014, 0x0014, 0x0014, 0x0080, 0x000f, 0x0000, 0x0201,
-       0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018, 0x300b, 0xa201,
-       0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0x0000, 0x006c, 0x0002,
-       0x0014, 0x98d0, 0x009e, 0x0096, 0xa202, 0x8838, 0x3806, 0x8839,
-       0x20c3, 0x0864, 0x9884, 0x28c1, 0x9cb1, 0xa203, 0x300c, 0x2846,
-       0x8161, 0x846a, 0x8300, 0x1856, 0x883a, 0x9865, 0x28f2, 0x9c90,
-       0x9858, 0x300c, 0x28e1, 0x9c90, 0x2802, 0xa206, 0x64c3, 0x282d,
-       0xa207, 0x64a0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7824, 0x68c1,
-       0x7864, 0x883e, 0x9878, 0x8576, 0x8677, 0x206b, 0x28c1, 0x9cb1,
-       0x2044, 0x2103, 0x20a2, 0x2081, 0x9865, 0xa209, 0x2901, 0x988c,
-       0x0014, 0xa205, 0xa300, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xc601,
-       0xa20a, 0x856e, 0x0704, 0x9c90, 0x0014, 0xa204, 0xa300, 0x3009,
-       0x19e2, 0xf868, 0x8176, 0x86eb, 0x85eb, 0x872e, 0x87a9, 0x883f,
-       0x08e6, 0x9890, 0xf881, 0x988b, 0xc801, 0x0014, 0xf8c1, 0x0016,
-       0x85b2, 0x80f0, 0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532, 0xf241,
-       0x0014, 0x1de2, 0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208, 0x6043,
-       0x8008, 0x1dc1, 0x0016, 0x8300, 0x8160, 0x842a, 0xf041, 0x3008,
-       0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016,
-       0x8000, 0x2847, 0x1011, 0x98c3, 0x8000, 0xa000, 0x2802, 0x1011,
-       0x98c9, 0x9865, 0x283e, 0x1011, 0x98cd, 0xa20b, 0x0017, 0x300c,
-       0xa300, 0x1de2, 0xdb81, 0x0014, 0x0210, 0x98da, 0x0014, 0x26e0,
-       0x873a, 0xfb02, 0x19f2, 0x1fe2, 0x0014, 0xa20d, 0x3806, 0x0210,
-       0x9cb6, 0x0704, 0x0000, 0x006c, 0x0002, 0x984f, 0x0014, 0x009e,
-       0x00a5, 0x0017, 0x60ff, 0x300c, 0x8720, 0xa211, 0x9cd5, 0x8772,
-       0x8837, 0x2101, 0x987a, 0x10d2, 0x78e2, 0x9cd8, 0x9859, 0xd984,
-       0xf0e2, 0xf0a1, 0x98d2, 0x0014, 0x8831, 0xd166, 0x8830, 0x800f,
-       0x9401, 0xb520, 0xc802, 0x8820, 0x987a, 0x2301, 0x987a, 0x10d2,
-       0x78e4, 0x9cd8, 0x8821, 0x8820, 0x9859, 0xf123, 0xf142, 0xf101,
-       0x98cb, 0x10d2, 0x70f6, 0x8832, 0x8203, 0x870c, 0xd99e, 0x6001,
-       0x0014, 0x6845, 0x0214, 0xa21b, 0x9cd5, 0x2001, 0x98ca, 0x8201,
-       0x1852, 0xd184, 0xd163, 0x8834, 0x8001, 0x988d, 0x3027, 0x84a8,
-       0x1a56, 0x8833, 0x0014, 0xa218, 0x6981, 0x9cc1, 0x692a, 0x6902,
-       0x1834, 0x989d, 0x1a14, 0x8010, 0x8592, 0x8026, 0x84b9, 0x7021,
-       0x0014, 0xa300, 0x69e1, 0x9caa, 0x694c, 0xa213, 0x9cba, 0x1462,
-       0xa213, 0x8000, 0x16e1, 0x98b4, 0x8023, 0x16e1, 0x8001, 0x10f1,
-       0x0016, 0x6968, 0xa214, 0x9cba, 0x8004, 0x16e1, 0x0101, 0x300a,
-       0x8827, 0x0014, 0x9cba, 0x0014, 0x61c2, 0x8002, 0x14e1, 0x0016,
-       0xa217, 0x9cc1, 0x0014, 0xa300, 0x8181, 0x842a, 0x84a8, 0x1ce6,
-       0x882c, 0x0016, 0xa212, 0x9cd5, 0x10d2, 0x70e4, 0x0004, 0x8007,
-       0x9424, 0xcc1a, 0x9cd8, 0x98ca, 0x8827, 0x300a, 0x0013, 0x8000,
-       0x84a4, 0x0016, 0x11c2, 0x211e, 0x870e, 0xa21d, 0x0014, 0x878e,
-       0x0016, 0xa21c, 0x1035, 0x9891, 0xa210, 0xa000, 0x8010, 0x8592,
-       0x853b, 0xd044, 0x8022, 0x3807, 0x84bb, 0x98ef, 0x8021, 0x3807,
-       0x84b9, 0x300c, 0x817e, 0x872b, 0x8772, 0x9891, 0x0000, 0x0020,
-       0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014, 0x0014, 0x98e5,
-       0x98d0, 0x0014, 0x0014, 0x0014, 0x0080, 0x013f, 0x0000, 0x0201,
-       0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018, 0x300b, 0xa201,
-       0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0xa202, 0x8838, 0x3806,
-       0x8839, 0x20c3, 0x0864, 0xa82e, 0x28c1, 0x9cb1, 0xa203, 0x300c,
-       0x2846, 0x8161, 0x846a, 0x8300, 0x1856, 0x883a, 0xa804, 0x28f2,
-       0x9c90, 0xa8f4, 0x300c, 0x28e1, 0x9c90, 0x2802, 0xa206, 0x64c3,
-       0x282d, 0xa207, 0x64a0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7824,
-       0x68c1, 0x7864, 0x883e, 0xa802, 0x8576, 0x8677, 0x206b, 0x28c1,
-       0x9cb1, 0x2044, 0x2103, 0x20a2, 0x2081, 0xa8e5, 0xa209, 0x2901,
-       0xa809, 0x0014, 0xa205, 0xa300, 0x1872, 0x879a, 0x883c, 0x1fe2,
-       0xc601, 0xa20a, 0x856e, 0x0704, 0x9c90, 0x0014, 0xa204, 0xa300,
-       0x3009, 0x19e2, 0xf868, 0x8176, 0x86eb, 0x85eb, 0x872e, 0x87a9,
-       0x883f, 0x08e6, 0xa8f3, 0xf881, 0xa8ec, 0xc801, 0x0014, 0xf8c1,
-       0x0016, 0x85b2, 0x80f0, 0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532,
-       0xf241, 0x0014, 0x1de2, 0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208,
-       0x6043, 0x8008, 0x1dc1, 0x0016, 0x8300, 0x8160, 0x842a, 0xf041,
-       0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d5, 0x8822,
-       0x0016, 0x8000, 0x2847, 0x1011, 0xa8fc, 0x8000, 0xa000, 0x2802,
-       0x1011, 0xa8fd, 0xa898, 0x283e, 0x1011, 0xa8fd, 0xa20b, 0x0017,
-       0x300c, 0xa300, 0x1de2, 0xdb81, 0x0014, 0x0210, 0xa801, 0x0014,
-       0x26e0, 0x873a, 0xfb02, 0x19f2, 0x1fe2, 0x0014, 0xa20d, 0x3806,
-       0x0210, 0x9cb6, 0x0704, 0x0017, 0x60ff, 0x300c, 0x8720, 0xa211,
-       0x9d6b, 0x8772, 0x8837, 0x2101, 0xa821, 0x10d2, 0x78e2, 0x9d6e,
-       0xa8fc, 0xd984, 0xf0e2, 0xf0a1, 0xa871, 0x0014, 0x8831, 0xd166,
-       0x8830, 0x800f, 0x9401, 0xb520, 0xc802, 0x8820, 0xa80f, 0x2301,
-       0xa80d, 0x10d2, 0x78e4, 0x9d6e, 0x8821, 0x8820, 0xa8e6, 0xf123,
-       0xf142, 0xf101, 0xa854, 0x10d2, 0x70f6, 0x8832, 0x8203, 0x870c,
-       0xd99e, 0x6001, 0x0014, 0x6845, 0x0214, 0xa21b, 0x9d6b, 0x2001,
-       0xa845, 0x8201, 0x1852, 0xd184, 0xd163, 0x8834, 0x8001, 0xa801,
-       0x3027, 0x84a8, 0x1a56, 0x8833, 0x0014, 0xa218, 0x6981, 0x9d57,
-       0x692a, 0x6902, 0x1834, 0xa805, 0x1a14, 0x8010, 0x8592, 0x8026,
-       0x84b9, 0x7021, 0x0014, 0xa300, 0x69e1, 0x9d40, 0x694c, 0xa213,
-       0x9d50, 0x1462, 0xa213, 0x8000, 0x16e1, 0xa80a, 0x8023, 0x16e1,
-       0x8001, 0x10f1, 0x0016, 0x6968, 0xa214, 0x9d50, 0x8004, 0x16e1,
-       0x0101, 0x300a, 0x8827, 0x0014, 0x9d50, 0x0014, 0x61c2, 0x8002,
-       0x14e1, 0x0016, 0xa217, 0x9d57, 0x0014, 0xa300, 0x8181, 0x842a,
-       0x84a8, 0x1ce6, 0x882c, 0x0016, 0xa212, 0x9d6b, 0x10d2, 0x70e4,
-       0x0004, 0x8007, 0x9424, 0xcc1a, 0x9d6e, 0xa8f8, 0x8827, 0x300a,
-       0x0013, 0x8000, 0x84a4, 0x0016, 0x11c2, 0x211e, 0x870e, 0xa21d,
-       0x0014, 0x878e, 0x0016, 0xa21c, 0x1035, 0xa8af, 0xa210, 0x3807,
-       0x300c, 0x817e, 0x872b, 0x8772, 0xa8a8, 0x0000, 0xdf21
+       0x6814, 0x8007, 0x7882, 0x0078, 0x3960, 0x6818, 0xa084, 0x8000,
+       0x0040, 0x3234, 0x681b, 0x0008, 0x781b, 0x00c0, 0x0078, 0x24fa,
+       0x2300, 0x0079, 0x323b, 0x3240, 0x32d4, 0x323e, 0x1078, 0x248c,
+       0x7000, 0xa084, 0x0007, 0x0079, 0x3245, 0x2523, 0x324f, 0x3284,
+       0x325a, 0x324d, 0x2523, 0x324d, 0x324d, 0x1078, 0x248c, 0x681c,
+       0xa084, 0x2000, 0x0040, 0x3268, 0x6008, 0xa085, 0x0002, 0x600a,
+       0x0078, 0x3268, 0x68c0, 0xa005, 0x00c0, 0x3284, 0x6920, 0xa18d,
+       0x0001, 0x6922, 0x68c3, 0x0001, 0x6800, 0x706a, 0x0078, 0x327e,
+       0x6920, 0xa18d, 0x0001, 0x6922, 0x6800, 0x6006, 0xa005, 0x00c0,
+       0x3272, 0x6002, 0x681c, 0xa084, 0x000e, 0x0040, 0x327e, 0x7014,
+       0x68ba, 0x7130, 0xa188, 0x7500, 0x0078, 0x3280, 0x2009, 0x7600,
+       0x2104, 0x6802, 0x2d0a, 0x7162, 0x6eb6, 0xa684, 0x0060, 0x0040,
+       0x32d2, 0xa684, 0x0800, 0x00c0, 0x3298, 0xa684, 0x7fff, 0x68b6,
+       0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078, 0x4887, 0x0078, 0x32d2,
+       0xa684, 0x0020, 0x0040, 0x32ad, 0x68c0, 0xa005, 0x0040, 0x32a4,
+       0x1078, 0x4c89, 0x0078, 0x32a7, 0xa006, 0x1078, 0x4c41, 0x79d8,
+       0x7adc, 0x69aa, 0x6aa6, 0x0078, 0x32b3, 0x1078, 0x38ca, 0x69aa,
+       0x6aa6, 0x1078, 0x4c41, 0xa684, 0x8000, 0x0040, 0x32d2, 0xa684,
+       0x7fff, 0x68b6, 0x7adc, 0x79d8, 0xa684, 0x0020, 0x00c0, 0x32ca,
+       0x78d0, 0x801b, 0x00c8, 0x32c5, 0x8000, 0xa084, 0x003f, 0xa108,
+       0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
+       0xa303, 0x68ae, 0x0078, 0x2523, 0x0078, 0x377b, 0x7037, 0x0000,
+       0xa282, 0x0006, 0x0050, 0x32de, 0x1078, 0x248c, 0x7000, 0xa084,
+       0x0007, 0x10c0, 0x3a8c, 0x2300, 0x0079, 0x32e6, 0x32e9, 0x3312,
+       0x3326, 0x2200, 0x0079, 0x32ec, 0x3310, 0x377b, 0x32f2, 0x3310,
+       0x3342, 0x3384, 0x7003, 0x0005, 0x2001, 0x7710, 0x2068, 0x704a,
+       0x157e, 0x20a9, 0x0031, 0x2003, 0x0000, 0x8000, 0x0070, 0x3302,
+       0x0078, 0x32fb, 0x157f, 0xad80, 0x0009, 0x7036, 0x6817, 0x0000,
+       0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x0078, 0x376b,
+       0x1078, 0x248c, 0x7003, 0x0005, 0x2001, 0x7710, 0x2068, 0x704a,
+       0xad80, 0x0009, 0x7036, 0x2200, 0x0079, 0x331e, 0x377b, 0x3324,
+       0x3324, 0x3342, 0x3324, 0x377b, 0x1078, 0x248c, 0x7003, 0x0005,
+       0x2001, 0x7710, 0x2068, 0x704a, 0xad80, 0x0009, 0x7036, 0x2200,
+       0x0079, 0x3332, 0x333a, 0x3338, 0x3338, 0x333a, 0x3338, 0x333a,
+       0x1078, 0x248c, 0x1078, 0x379f, 0x782b, 0x3008, 0x781b, 0x0065,
+       0x0078, 0x24fa, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b,
+       0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x7600, 0x2d04,
+       0x2d08, 0x7162, 0x2068, 0xa005, 0x0040, 0x335d, 0x6814, 0xa206,
+       0x0040, 0x3379, 0x6800, 0x0078, 0x3350, 0x7003, 0x0005, 0x2001,
+       0x7710, 0x2068, 0x704a, 0x7036, 0x157e, 0x20a9, 0x0031, 0x2003,
+       0x0000, 0x8000, 0x0070, 0x336e, 0x0078, 0x3367, 0x157f, 0xad80,
+       0x0009, 0x7036, 0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827,
+       0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084, 0x0c00, 0x0040, 0x33d3,
+       0x1078, 0x3797, 0x0078, 0x33d3, 0x7003, 0x0002, 0x7a80, 0xa294,
+       0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x79a8,
+       0x79a8, 0xa18c, 0x00ff, 0xa1e8, 0x7500, 0x2d04, 0x2d08, 0x7162,
+       0x2068, 0xa005, 0x0040, 0x33a3, 0x6814, 0xa206, 0x0040, 0x33be,
+       0x6800, 0x0078, 0x3396, 0x7003, 0x0005, 0x2001, 0x7710, 0x2068,
+       0x704a, 0x157e, 0x20a9, 0x0031, 0x2003, 0x0000, 0x8000, 0x0070,
+       0x33b3, 0x0078, 0x33ac, 0x157f, 0xad80, 0x0009, 0x7036, 0x6a16,
+       0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a,
+       0x6820, 0xa084, 0x0c00, 0x0040, 0x33d3, 0xa084, 0x0800, 0x0040,
+       0x33cd, 0x1078, 0x379b, 0x0078, 0x33d3, 0x1078, 0x3797, 0x708b,
+       0x0000, 0x0078, 0x33d3, 0x027e, 0x8207, 0xa084, 0x000f, 0x8003,
+       0x8003, 0x8003, 0xa080, 0x5480, 0x2060, 0x7056, 0x6000, 0x705a,
+       0x6004, 0x705e, 0xa684, 0x0060, 0x0040, 0x342b, 0x6b98, 0x6c94,
+       0x69ac, 0x68b0, 0xa105, 0x00c0, 0x340d, 0x7bd2, 0x7bda, 0x7cd6,
+       0x7cde, 0xa6b4, 0xb7ff, 0x7e5a, 0xa684, 0x0060, 0xa086, 0x0060,
+       0x0040, 0x342b, 0x68c0, 0xa005, 0x0040, 0x3406, 0x7003, 0x0003,
+       0x682b, 0x0000, 0x1078, 0x4b3a, 0x0078, 0x3408, 0x1078, 0x4b4b,
+       0xa6b5, 0x2000, 0x7e5a, 0x0078, 0x342b, 0x68b0, 0xa31a, 0x2100,
+       0xa423, 0x2400, 0xa305, 0x0040, 0x342b, 0x7bd2, 0x7bda, 0x7cd6,
+       0x7cde, 0x68b0, 0xa6b4, 0xbfff, 0x7e5a, 0x007e, 0x68c0, 0xa005,
+       0x007f, 0x0040, 0x3429, 0x7003, 0x0003, 0x1078, 0x4b3a, 0x0078,
+       0x342b, 0x1078, 0x4b96, 0x077f, 0x1078, 0x38bd, 0x2009, 0x0065,
+       0xa684, 0x0004, 0x0040, 0x344c, 0x78e4, 0xa084, 0x0030, 0x0040,
+       0x3444, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3444, 0x782b, 0x3008,
+       0x2009, 0x0065, 0x0078, 0x344c, 0x0f7e, 0x2079, 0x5200, 0x1078,
+       0x4887, 0x0f7f, 0x0040, 0x2523, 0x791a, 0x2d00, 0x704a, 0x8207,
+       0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x5480, 0x2048,
+       0x0078, 0x24fa, 0x6020, 0xa005, 0x0040, 0x3466, 0x8001, 0x6022,
+       0x6008, 0xa085, 0x0008, 0x600a, 0x7010, 0x6026, 0x007c, 0xa006,
+       0x1078, 0x4887, 0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040,
+       0x681f, 0x0100, 0x7000, 0xa084, 0x0007, 0x0079, 0x3477, 0x2523,
+       0x3481, 0x3481, 0x349e, 0x3489, 0x3487, 0x3489, 0x347f, 0x1078,
+       0x248c, 0x1078, 0x34a9, 0x1078, 0x34a2, 0x1078, 0x1cdc, 0x0078,
+       0x2523, 0x706c, 0x706f, 0x0000, 0x7093, 0x0000, 0x0079, 0x3490,
+       0x349a, 0x349a, 0x3498, 0x3498, 0x3498, 0x349a, 0x3498, 0x349a,
+       0x0079, 0x2902, 0x706f, 0x0000, 0x0078, 0x2523, 0x681b, 0x0000,
+       0x0078, 0x2fb6, 0x6800, 0xa005, 0x00c0, 0x34a7, 0x6002, 0x6006,
+       0x007c, 0x6010, 0xa005, 0x0040, 0x34b2, 0x8001, 0x00d0, 0x34b2,
+       0x1078, 0x248c, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x007c,
+       0x6018, 0xa005, 0x0040, 0x34be, 0x8001, 0x601a, 0x007c, 0x1078,
+       0x39e0, 0x681b, 0x0018, 0x0078, 0x34f5, 0x1078, 0x39e0, 0x681b,
+       0x0019, 0x0078, 0x34f5, 0x1078, 0x39e0, 0x681b, 0x001a, 0x0078,
+       0x34f5, 0x1078, 0x39e0, 0x681b, 0x0003, 0x0078, 0x34f5, 0x7780,
+       0x1078, 0x38bd, 0x7184, 0xa18c, 0x00ff, 0xa1e8, 0x7500, 0x2d04,
+       0x2d08, 0x2068, 0xa005, 0x00c0, 0x34e7, 0x0078, 0x2523, 0x6814,
+       0x7280, 0xa206, 0x0040, 0x34ef, 0x6800, 0x0078, 0x34e0, 0x6800,
+       0x200a, 0x681b, 0x0005, 0x708b, 0x0000, 0x1078, 0x34a9, 0x6820,
+       0xa084, 0x0001, 0x00c0, 0x34fe, 0x1078, 0x34a2, 0x1078, 0x34b8,
+       0x681f, 0x0000, 0x6823, 0x0020, 0x1078, 0x1cdc, 0x0078, 0x2523,
+       0xa282, 0x0003, 0x00c0, 0x376b, 0x7da8, 0xa5ac, 0x00ff, 0x7ca8,
+       0xa4a4, 0x00ff, 0x6920, 0xa18d, 0x0080, 0x6922, 0xa184, 0x0100,
+       0x0040, 0x356c, 0xa18c, 0xfeff, 0x6922, 0xa4a4, 0x00ff, 0x0040,
+       0x3556, 0xa482, 0x000c, 0x0048, 0x3529, 0x0040, 0x3529, 0x2021,
+       0x000c, 0x852b, 0x852b, 0x1078, 0x382e, 0x0040, 0x3533, 0x1078,
+       0x3627, 0x0078, 0x355f, 0x1078, 0x37e9, 0x0c7e, 0x2960, 0x6004,
+       0xa084, 0xfff5, 0x6006, 0x1078, 0x3652, 0x0c7f, 0x6920, 0xa18d,
+       0x0100, 0x6922, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400,
+       0x00c0, 0x3550, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x24fa,
+       0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x24fa, 0x0c7e, 0x2960,
+       0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3652, 0x0c7f, 0x7e58,
+       0xa684, 0x0400, 0x00c0, 0x3568, 0x781b, 0x0058, 0x0078, 0x24fa,
+       0x781b, 0x0065, 0x0078, 0x24fa, 0x0c7e, 0x7054, 0x2060, 0x6100,
+       0xa18c, 0x1000, 0x0040, 0x35ac, 0x6208, 0x8217, 0xa294, 0x00ff,
+       0xa282, 0x000c, 0x0048, 0x3580, 0x0040, 0x3580, 0x2011, 0x000c,
+       0x2400, 0xa202, 0x00c8, 0x3585, 0x2220, 0x6208, 0xa294, 0x00ff,
+       0x7018, 0xa086, 0x0028, 0x00c0, 0x3595, 0xa282, 0x0019, 0x00c8,
+       0x359b, 0x2011, 0x0019, 0x0078, 0x359b, 0xa282, 0x000c, 0x00c8,
+       0x359b, 0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, 0x35a0, 0x2228,
+       0x1078, 0x37ed, 0x852b, 0x852b, 0x1078, 0x382e, 0x0040, 0x35ac,
+       0x1078, 0x3627, 0x0078, 0x35b0, 0x1078, 0x37e9, 0x1078, 0x3652,
+       0x7858, 0xa085, 0x0004, 0x785a, 0x0c7f, 0x782b, 0x3008, 0x781b,
+       0x0065, 0x0078, 0x24fa, 0x0c7e, 0x2960, 0x6000, 0xd0e4, 0x00c0,
+       0x35d5, 0xd0b4, 0x00c0, 0x35cf, 0x6010, 0xa084, 0x000f, 0x00c0,
+       0x35cf, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011,
+       0x0032, 0x2019, 0x0000, 0x0078, 0x35fc, 0x68a0, 0xa084, 0x0200,
+       0x00c0, 0x35cf, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028,
+       0x00c0, 0x35ea, 0xa282, 0x0019, 0x00c8, 0x35f0, 0x2011, 0x0019,
+       0x0078, 0x35f0, 0xa282, 0x000c, 0x00c8, 0x35f0, 0x2011, 0x000c,
+       0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c, 0x0048, 0x35fc,
+       0x0040, 0x35fc, 0x2019, 0x000c, 0x78ab, 0x0001, 0x78ab, 0x0003,
+       0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085,
+       0x0100, 0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x2960, 0xa18c, 0xfff5,
+       0x6106, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, 0x3617, 0x78ab,
+       0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0,
+       0x0005, 0x6820, 0xa085, 0x0100, 0x6822, 0x0c7f, 0x007c, 0x0c7e,
+       0x7154, 0x2160, 0x1078, 0x362e, 0x0c7f, 0x007c, 0x2008, 0xa084,
+       0xfff0, 0xa425, 0x7c86, 0x6018, 0x789a, 0x7cae, 0x6412, 0x78a4,
+       0xa084, 0xfff8, 0xa18c, 0x0007, 0xa105, 0x78a6, 0x6016, 0x788a,
+       0xa4a4, 0x000f, 0x8427, 0x8204, 0x8004, 0xa084, 0x00ff, 0xa405,
+       0x600e, 0x78ec, 0xd08c, 0x00c0, 0x3651, 0x6004, 0xa084, 0xfff5,
+       0x6006, 0x007c, 0x0c7e, 0x7054, 0x2060, 0x1078, 0x3659, 0x0c7f,
+       0x007c, 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6, 0x6012,
+       0x7884, 0xa084, 0xfff0, 0x7886, 0x007c, 0xa282, 0x0002, 0x00c0,
+       0x376b, 0x7aa8, 0x6920, 0xa18d, 0x0080, 0x6922, 0xa184, 0x0200,
+       0x0040, 0x36ae, 0xa18c, 0xfdff, 0x6922, 0xa294, 0x00ff, 0xa282,
+       0x0002, 0x00c8, 0x376b, 0x1078, 0x36f9, 0x1078, 0x3652, 0xa980,
+       0x0001, 0x200c, 0x1078, 0x38b9, 0x1078, 0x35bb, 0x88ff, 0x0040,
+       0x36a1, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5, 0x0004,
+       0x7e5a, 0xa684, 0x0400, 0x00c0, 0x369b, 0x782b, 0x3008, 0x781b,
+       0x0056, 0x0078, 0x24fa, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078,
+       0x24fa, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x36aa, 0x781b, 0x0058,
+       0x0078, 0x24fa, 0x781b, 0x0065, 0x0078, 0x24fa, 0xa282, 0x0002,
+       0x00c8, 0x36b6, 0xa284, 0x0001, 0x0040, 0x36c0, 0x7154, 0xa188,
+       0x0000, 0x210c, 0xa18c, 0x2000, 0x00c0, 0x36c0, 0x2011, 0x0000,
+       0x1078, 0x37db, 0x1078, 0x36f9, 0x1078, 0x3652, 0x7858, 0xa085,
+       0x0004, 0x785a, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x24fa,
+       0x0c7e, 0x027e, 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec, 0x00c0,
+       0x36e9, 0xd0bc, 0x00c0, 0x36e7, 0x6014, 0xa084, 0x0040, 0x00c0,
+       0x36e7, 0xa18c, 0xffef, 0x6106, 0xa006, 0x0078, 0x36f6, 0x2011,
+       0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa,
+       0xa8c0, 0x0004, 0x6820, 0xa085, 0x0200, 0x6822, 0x027f, 0x0c7f,
+       0x007c, 0x0c7e, 0x7054, 0x2060, 0x1078, 0x3700, 0x0c7f, 0x007c,
+       0x82ff, 0x0040, 0x3705, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002,
+       0x789a, 0x78a4, 0xa084, 0xffbf, 0xa205, 0x78a6, 0x788a, 0x6016,
+       0x78ec, 0xd08c, 0x00c0, 0x3718, 0x6004, 0xa084, 0xffef, 0x6006,
+       0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040, 0x3722, 0x007f,
+       0x0078, 0x3725, 0x007f, 0x0078, 0x3767, 0xa684, 0x0020, 0x0040,
+       0x3767, 0x7888, 0xa084, 0x0040, 0x0040, 0x3767, 0x7bb8, 0xa384,
+       0x003f, 0x831b, 0x00c8, 0x3735, 0x8000, 0xa005, 0x0040, 0x374b,
+       0x831b, 0x00c8, 0x373e, 0x8001, 0x0040, 0x3763, 0xa684, 0x4000,
+       0x0040, 0x374b, 0x78b8, 0x801b, 0x00c8, 0x3747, 0x8000, 0xa084,
+       0x003f, 0x00c0, 0x3763, 0xa6b4, 0xbfff, 0x7e5a, 0x79d8, 0x7adc,
+       0x2001, 0x0001, 0xa108, 0x00c8, 0x3757, 0xa291, 0x0000, 0x79d2,
+       0x79da, 0x7ad6, 0x7ade, 0x1078, 0x4c41, 0x781b, 0x0064, 0x1078,
+       0x4ac6, 0x0078, 0x24fa, 0x781b, 0x0064, 0x0078, 0x24fa, 0x781b,
+       0x0065, 0x0078, 0x24fa, 0x1078, 0x37a3, 0x782b, 0x3008, 0x781b,
+       0x0065, 0x0078, 0x24fa, 0x1078, 0x378f, 0x782b, 0x3008, 0x781b,
+       0x0065, 0x0078, 0x24fa, 0x6827, 0x0002, 0x1078, 0x3797, 0x78e4,
+       0xa084, 0x0030, 0x0040, 0x2523, 0x78ec, 0xa084, 0x0003, 0x0040,
+       0x2523, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x24fa, 0x2001,
+       0x0005, 0x0078, 0x37a5, 0x2001, 0x000c, 0x0078, 0x37a5, 0x2001,
+       0x0006, 0x0078, 0x37a5, 0x2001, 0x000d, 0x0078, 0x37a5, 0x2001,
+       0x0009, 0x0078, 0x37a5, 0x2001, 0x0007, 0x789b, 0x0010, 0x78aa,
+       0x789b, 0x0060, 0x78ab, 0x0001, 0xa6b5, 0x0004, 0x7e5a, 0x007c,
+       0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0xa0e0,
+       0x5480, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f, 0x0040,
+       0x37c9, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004, 0xa085, 0x0008,
+       0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, 0x0040,
+       0x37d9, 0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004, 0xa085, 0x0010,
+       0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab,
+       0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004,
+       0x007c, 0x2021, 0x0000, 0x2029, 0x0032, 0x789b, 0x0010, 0x78ab,
+       0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7caa, 0x789b,
+       0x0060, 0x78ab, 0x0005, 0x007c, 0x157e, 0x8007, 0xa084, 0x00ff,
+       0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c, 0xfff0,
+       0x2001, 0x5246, 0x2004, 0xa082, 0x0028, 0x0040, 0x3817, 0x2021,
+       0x38a0, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078, 0x381d, 0x2021,
+       0x38ac, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064, 0x2404,
+       0xa084, 0xfff0, 0xa106, 0x0040, 0x382c, 0x8420, 0x2300, 0xa210,
+       0x0070, 0x382c, 0x0078, 0x381f, 0x157f, 0x007c, 0x157e, 0x2009,
+       0x5246, 0x210c, 0xa182, 0x0032, 0x0048, 0x3842, 0x0040, 0x3846,
+       0x2009, 0x3892, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0032,
+       0x0078, 0x3858, 0xa182, 0x0028, 0x0040, 0x3850, 0x2009, 0x38a0,
+       0x2019, 0x0014, 0x20a9, 0x000c, 0x2011, 0x0064, 0x0078, 0x3858,
+       0x2009, 0x38ac, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064,
+       0x2200, 0xa502, 0x0040, 0x3868, 0x0048, 0x3868, 0x8108, 0x2300,
+       0xa210, 0x0070, 0x3865, 0x0078, 0x3858, 0x157f, 0xa006, 0x007c,
+       0x157f, 0xa582, 0x0064, 0x00c8, 0x3877, 0x7808, 0xa085, 0x0070,
+       0x780a, 0x7044, 0xa085, 0x0070, 0x7046, 0x0078, 0x3877, 0x78ec,
+       0xa084, 0x0300, 0x0040, 0x387f, 0x2104, 0x0078, 0x3890, 0x2104,
+       0xa09e, 0x1102, 0x00c0, 0x3890, 0x2001, 0x04fd, 0x2004, 0xa082,
+       0x0005, 0x0048, 0x388f, 0x2001, 0x1201, 0x0078, 0x3890, 0x2104,
+       0xa005, 0x007c, 0x1102, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404,
+       0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07, 0x0e07,
+       0x3202, 0x4202, 0x5202, 0x6202, 0x7202, 0x6605, 0x7605, 0x7805,
+       0x7a05, 0x7c05, 0x7e05, 0x7f05, 0x2202, 0x3202, 0x4202, 0x5202,
+       0x5404, 0x6404, 0x7404, 0x7604, 0x7804, 0x7a04, 0x7c04, 0x7e04,
+       0x7f04, 0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00, 0x800b,
+       0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e0,
+       0x5500, 0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b, 0x00c8, 0x38d1,
+       0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x007c, 0x0f7e,
+       0x2079, 0x0100, 0x2009, 0x5240, 0x2091, 0x8000, 0x2104, 0x0079,
+       0x38e1, 0x3917, 0x38eb, 0x38eb, 0x38eb, 0x38eb, 0x38eb, 0x38eb,
+       0x391b, 0x1078, 0x248c, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004,
+       0x00c0, 0x38ed, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0,
+       0x38f4, 0x68b4, 0xa085, 0x4000, 0x68b6, 0x7858, 0xa085, 0x4000,
+       0x785a, 0x7830, 0xa084, 0x0080, 0x00c0, 0x3917, 0x0018, 0x3917,
+       0x681c, 0xa084, 0x0020, 0x00c0, 0x3915, 0x0e7e, 0x2071, 0x5240,
+       0x1078, 0x396a, 0x0e7f, 0x0078, 0x3917, 0x781b, 0x00ca, 0x2091,
+       0x8001, 0x0f7f, 0x007c, 0x70b3, 0x0000, 0x1078, 0x3b44, 0x0078,
+       0x3917, 0x0c7e, 0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003,
+       0x8003, 0xa0e0, 0x5480, 0x6004, 0xa084, 0x000a, 0x00c0, 0x3954,
+       0x6108, 0xa194, 0xff00, 0x0040, 0x3954, 0xa18c, 0x00ff, 0x2001,
+       0x0019, 0xa106, 0x0040, 0x3943, 0x2001, 0x0032, 0xa106, 0x0040,
+       0x3947, 0x0078, 0x394b, 0x2009, 0x0020, 0x0078, 0x394d, 0x2009,
+       0x003f, 0x0078, 0x394d, 0x2011, 0x0000, 0x2100, 0xa205, 0x600a,
+       0x6004, 0xa085, 0x0002, 0x6006, 0x0c7f, 0x007c, 0x781b, 0x0065,
+       0x0078, 0x24fa, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x24fa,
+       0x781b, 0x0058, 0x0078, 0x24fa, 0x782b, 0x3008, 0x781b, 0x0056,
+       0x0078, 0x24fa, 0x2009, 0x5220, 0x210c, 0xa186, 0x0000, 0x0040,
+       0x397e, 0xa186, 0x0001, 0x0040, 0x3981, 0x2009, 0x5238, 0x200b,
+       0x000b, 0x706f, 0x0001, 0x781b, 0x0048, 0x007c, 0x781b, 0x00c4,
+       0x007c, 0x2009, 0x5238, 0x200b, 0x000a, 0x007c, 0x2009, 0x5220,
+       0x210c, 0xa186, 0x0000, 0x0040, 0x39a1, 0xa186, 0x0001, 0x0040,
+       0x399b, 0x2009, 0x5238, 0x200b, 0x000b, 0x706f, 0x0001, 0x781b,
+       0x0048, 0x0078, 0x24fa, 0x2009, 0x5238, 0x200b, 0x000a, 0x0078,
+       0x24fa, 0x782b, 0x3008, 0x781b, 0x00c4, 0x0078, 0x24fa, 0x781b,
+       0x00ca, 0x0078, 0x24fa, 0x782b, 0x3008, 0x781b, 0x00ca, 0x0078,
+       0x24fa, 0x781b, 0x008f, 0x0078, 0x24fa, 0x782b, 0x3008, 0x781b,
+       0x008f, 0x0078, 0x24fa, 0x6818, 0xa084, 0x8000, 0x0040, 0x39c2,
+       0x681b, 0x001d, 0x706f, 0x0001, 0x781b, 0x0048, 0x0078, 0x24fa,
+       0x007e, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x39de, 0x7808, 0xa084,
+       0xfffc, 0x780a, 0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084,
+       0x0021, 0x0040, 0x39de, 0x7044, 0x780a, 0xa005, 0x007f, 0x007c,
+       0x7044, 0xa085, 0x0002, 0x7046, 0x780a, 0x007c, 0x007e, 0x7830,
+       0xa084, 0x0040, 0x00c0, 0x39e7, 0x0098, 0x39f2, 0x007f, 0x789a,
+       0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005,
+       0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x3a01, 0x0098,
+       0x39ff, 0x007f, 0x789a, 0x78ac, 0x007e, 0x7044, 0x780a, 0x007f,
+       0x007c, 0x78ec, 0xa084, 0x0002, 0x00c0, 0x4871, 0xa784, 0x007d,
+       0x00c0, 0x3a15, 0x2700, 0x1078, 0x248c, 0xa784, 0x0001, 0x00c0,
+       0x300c, 0xa784, 0x0070, 0x0040, 0x3a25, 0x0c7e, 0x2d60, 0x2f68,
+       0x1078, 0x2437, 0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040,
+       0x3a32, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2523,
+       0x0078, 0x3956, 0xa784, 0x0004, 0x0040, 0x3a65, 0x78b8, 0xa084,
+       0x4001, 0x0040, 0x3a65, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
+       0x0040, 0x2523, 0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0,
+       0x3a65, 0x78c0, 0xa085, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00ca,
+       0x0078, 0x24fa, 0x784b, 0x0008, 0x6818, 0xa084, 0x8000, 0x0040,
+       0x3a61, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040, 0x3a61, 0x681b,
+       0x0007, 0x1078, 0x396a, 0x0078, 0x24fa, 0x681b, 0x0003, 0x7858,
+       0xa084, 0x3f00, 0x681e, 0x682f, 0x0000, 0x6833, 0x0000, 0x784b,
+       0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2a06, 0x0018, 0x24fa,
+       0x0078, 0x3773, 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003,
+       0x8003, 0xa080, 0x5480, 0x2060, 0x2048, 0x7056, 0x6000, 0x705a,
+       0x6004, 0x705e, 0x2a60, 0x007c, 0x0079, 0x3a8e, 0x3a96, 0x3a97,
+       0x3a96, 0x3a99, 0x3a96, 0x3a96, 0x3a96, 0x3a9e, 0x007c, 0x1078,
+       0x34b8, 0x1078, 0x4887, 0x7038, 0x600a, 0x007c, 0x70a0, 0xa005,
+       0x0040, 0x3aab, 0x2068, 0x1078, 0x1bd3, 0x1078, 0x47fe, 0x1078,
+       0x4805, 0x70a3, 0x0000, 0x007c, 0x0e7e, 0x2091, 0x8000, 0x2071,
+       0x5240, 0x7000, 0xa086, 0x0007, 0x00c0, 0x3ac2, 0x6110, 0x70bc,
+       0xa106, 0x00c0, 0x3ac2, 0x0e7f, 0x1078, 0x1be0, 0x1078, 0x3ac8,
+       0xa006, 0x007c, 0x2091, 0x8001, 0x0e7f, 0xa085, 0x0001, 0x007c,
+       0x0f7e, 0x0e7e, 0x2071, 0x5240, 0x0078, 0x2297, 0x785b, 0x0000,
+       0x70af, 0x000e, 0x2009, 0x0100, 0x017e, 0x70a0, 0xa06d, 0x0040,
+       0x3add, 0x70a3, 0x0000, 0x0078, 0x3ae3, 0x70b3, 0x0000, 0x1078,
+       0x1c0c, 0x0040, 0x3ae9, 0x70ac, 0x6826, 0x1078, 0x3bc6, 0x0078,
+       0x3add, 0x017f, 0x157e, 0x0c7e, 0x0d7e, 0x20a9, 0x0008, 0x2061,
+       0x7610, 0x6000, 0xa105, 0x6002, 0x601c, 0xa06d, 0x0040, 0x3b01,
+       0x6800, 0x601e, 0x1078, 0x19ac, 0x6008, 0x8000, 0x600a, 0x0078,
+       0x3af4, 0x6018, 0xa06d, 0x0040, 0x3b0b, 0x6800, 0x601a, 0x1078,
+       0x19ac, 0x0078, 0x3b01, 0xace0, 0x0008, 0x0070, 0x3b11, 0x0078,
+       0x3af1, 0x709c, 0xa084, 0x8000, 0x0040, 0x3b18, 0x1078, 0x3c44,
+       0x0d7f, 0x0c7f, 0x157f, 0x007c, 0x127e, 0x2091, 0x2300, 0x6804,
+       0xa084, 0x000f, 0x0079, 0x3b24, 0x3b34, 0x3b34, 0x3b34, 0x3b34,
+       0x3b34, 0x3b34, 0x3b36, 0x3b3c, 0x3b34, 0x3b34, 0x3b34, 0x3b34,
+       0x3b34, 0x3b3e, 0x3b34, 0x3b36, 0x1078, 0x248c, 0x1078, 0x45d3,
+       0x1078, 0x19ac, 0x0078, 0x3b42, 0x6827, 0x000b, 0x1078, 0x45d3,
+       0x1078, 0x3bc6, 0x127f, 0x007c, 0x127e, 0x2091, 0x2300, 0x0098,
+       0x3b60, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3b60, 0x0d7e, 0x1078,
+       0x4812, 0x2d00, 0x682e, 0x2009, 0x0004, 0x2001, 0x0000, 0x6827,
+       0x0084, 0x1078, 0x47c7, 0x1078, 0x3bc6, 0x0d7f, 0x0078, 0x3b94,
+       0x7948, 0xa185, 0x4000, 0x784a, 0x0098, 0x3b69, 0x794a, 0x0078,
+       0x3b4e, 0x7828, 0xa086, 0x1834, 0x00c0, 0x3b72, 0xa185, 0x0004,
+       0x0078, 0x3b79, 0x7828, 0xa086, 0x1814, 0x00c0, 0x3b66, 0xa185,
+       0x000c, 0x784a, 0x789b, 0x000e, 0x78ab, 0x0002, 0x7858, 0xa084,
+       0x00ff, 0xa085, 0x0400, 0x785a, 0x70b4, 0xa080, 0x0091, 0x781a,
+       0x6827, 0x0284, 0x682c, 0x6836, 0x6830, 0x683a, 0x2009, 0x0004,
+       0x2001, 0x0000, 0x1078, 0x47c7, 0x127f, 0x007c, 0x0d7e, 0x6b14,
+       0x1078, 0x1c70, 0x0040, 0x3ba3, 0x2068, 0x6827, 0x0002, 0x1078,
+       0x3bc6, 0x0078, 0x3b98, 0x0d7f, 0x007c, 0x0d7e, 0x6b14, 0x6c28,
+       0xa4a4, 0x00ff, 0x1078, 0x1c1c, 0x0040, 0x3bb3, 0x2068, 0x6827,
+       0x0002, 0x1078, 0x3bc6, 0x0d7f, 0x007c, 0x0d7e, 0x6b14, 0xa39c,
+       0x00ff, 0x1078, 0x1c48, 0x0040, 0x3bc4, 0x2068, 0x6827, 0x0002,
+       0x1078, 0x3bc6, 0x0078, 0x3bb9, 0x0d7f, 0x007c, 0x0c7e, 0x6914,
+       0x1078, 0x3c3b, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0006, 0x0040,
+       0x3be1, 0xa186, 0x000d, 0x0040, 0x3c00, 0xa186, 0x0017, 0x00c0,
+       0x3bdd, 0x1078, 0x19ac, 0x0078, 0x3bdf, 0x1078, 0x1cde, 0x0c7f,
+       0x007c, 0x6004, 0x8001, 0x0048, 0x3bfe, 0x6006, 0x2009, 0x0000,
+       0xa684, 0x0001, 0x00c0, 0x3bee, 0xa18d, 0x8000, 0xa684, 0x0004,
+       0x0040, 0x3bf4, 0xa18d, 0x0002, 0x691e, 0x6823, 0x0000, 0x7104,
+       0x810f, 0x6818, 0xa105, 0x681a, 0x0078, 0x3bdd, 0x1078, 0x248c,
+       0x6018, 0xa005, 0x00c0, 0x3c0f, 0x6008, 0x8001, 0x0048, 0x3c0f,
+       0x600a, 0x601c, 0x6802, 0x2d00, 0x601e, 0x0078, 0x3c25, 0xac88,
+       0x0006, 0x2104, 0xa005, 0x0040, 0x3c18, 0x2008, 0x0078, 0x3c11,
+       0x6802, 0x2d0a, 0x6008, 0x8001, 0x0048, 0x3bdf, 0x600a, 0x6018,
+       0x2068, 0x6800, 0x601a, 0x0078, 0x3c09, 0x157e, 0x137e, 0x147e,
+       0x0c7e, 0x0d7e, 0x1078, 0x1989, 0x00c0, 0x3c30, 0x1078, 0x248c,
+       0x2da0, 0x137f, 0x20a9, 0x0031, 0x53a3, 0x0c7f, 0x147f, 0x137f,
+       0x157f, 0x0078, 0x3bdd, 0xa184, 0x001f, 0x8003, 0x8003, 0x8003,
+       0xa080, 0x7610, 0x2060, 0x007c, 0x2019, 0x5251, 0x2304, 0xa085,
+       0x0001, 0x201a, 0x2019, 0x0102, 0x2304, 0xa085, 0x0001, 0x201a,
+       0x007c, 0x2019, 0x5251, 0x2304, 0xa084, 0xfffe, 0x201a, 0x2019,
+       0x0102, 0x2304, 0xa084, 0xfffe, 0x201a, 0x007c, 0x7990, 0xa18c,
+       0xfff8, 0x7992, 0x70b4, 0xa080, 0x00d8, 0x781a, 0x0078, 0x24fa,
+       0x70a3, 0x0000, 0x7003, 0x0000, 0x7043, 0x0001, 0x7037, 0x0000,
+       0x0018, 0x24b1, 0x1078, 0x1c0c, 0x0040, 0x3c99, 0x2009, 0x520f,
+       0x200b, 0x0000, 0x68bc, 0x2060, 0x6100, 0xa184, 0x0300, 0x0040,
+       0x3c8d, 0x6827, 0x000e, 0xa084, 0x0200, 0x0040, 0x3c89, 0x6827,
+       0x0017, 0x1078, 0x3bc6, 0x0078, 0x3c68, 0x7000, 0xa086, 0x0007,
+       0x00c0, 0x3d0d, 0x2d00, 0x70a2, 0xad80, 0x000f, 0x7036, 0x0078,
+       0x3ca0, 0x7040, 0xa086, 0x0001, 0x0040, 0x2533, 0x0078, 0x24fa,
+       0x2031, 0x0000, 0x691c, 0xa184, 0x0002, 0x0040, 0x3ca9, 0xa6b5,
+       0x0004, 0xa184, 0x00c0, 0x8003, 0x8003, 0x8007, 0xa080, 0x3da6,
+       0x2004, 0xa635, 0x6820, 0xa084, 0x0400, 0x0040, 0x3cc1, 0x789b,
+       0x0018, 0x78ab, 0x0003, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5,
+       0x5000, 0x6820, 0xa084, 0x8000, 0x0040, 0x3ccf, 0xa6b5, 0x0400,
+       0x789b, 0x000e, 0x6824, 0x8007, 0x78aa, 0x0078, 0x3cef, 0x681c,
+       0xd0fc, 0x00c0, 0x3cdd, 0xa6b5, 0x0800, 0x6820, 0xd0c4, 0x0040,
+       0x3cef, 0xa6b5, 0x4000, 0x0078, 0x3cef, 0x6820, 0xd0c4, 0x0040,
+       0x3ce5, 0xa6b5, 0x4000, 0x0078, 0x3cef, 0x789b, 0x0018, 0x78ab,
+       0x0002, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5, 0x1000, 0xa684,
+       0x0200, 0x0040, 0x3d09, 0x682c, 0x78d2, 0x6830, 0x78d6, 0xa684,
+       0x0100, 0x0040, 0x3d07, 0x682c, 0xa084, 0x0001, 0x0040, 0x3d07,
+       0x7888, 0xa084, 0x0040, 0x0040, 0x3d07, 0xa6b5, 0x8000, 0x1078,
+       0x47f6, 0x7e5a, 0x6eb6, 0x0078, 0x4835, 0x1078, 0x39c8, 0x00c0,
+       0x3da0, 0x702c, 0x8004, 0x0048, 0x3d1b, 0x2019, 0x4f49, 0x1078,
+       0x2313, 0x702f, 0x0001, 0x2041, 0x0001, 0x2031, 0x1000, 0x789b,
+       0x0018, 0x6814, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa, 0x691c,
+       0xa184, 0x0002, 0x0040, 0x3d34, 0xa6b5, 0x0004, 0x78ab, 0x0020,
+       0x6828, 0x78aa, 0xa8c0, 0x0002, 0x681c, 0xd0f4, 0x0040, 0x3d3d,
+       0x2c50, 0x1078, 0x3a7a, 0x1078, 0x4702, 0x6820, 0xa084, 0x8000,
+       0x0040, 0x3d4b, 0xa6b5, 0x0400, 0x789b, 0x000e, 0x6824, 0x8007,
+       0x78aa, 0x0078, 0x3d52, 0x681c, 0xa084, 0x8000, 0x00c0, 0x3d52,
+       0xa6b5, 0x0800, 0x6820, 0xa084, 0x0100, 0x0040, 0x3d59, 0xa6b5,
+       0x4000, 0x681c, 0xa084, 0x00c0, 0x8003, 0x8003, 0x8007, 0xa080,
+       0x3da6, 0x2004, 0xa635, 0xa684, 0x0100, 0x0040, 0x3d73, 0x682c,
+       0xa084, 0x0001, 0x0040, 0x3d73, 0x7888, 0xa084, 0x0040, 0x0040,
+       0x3d73, 0xa6b5, 0x8000, 0x789b, 0x007e, 0x7eae, 0x6eb6, 0x6814,
+       0x8007, 0x78aa, 0x7882, 0x2810, 0x7aaa, 0x7830, 0xa084, 0x00c0,
+       0x00c0, 0x3da0, 0x0018, 0x3da0, 0x70b4, 0xa080, 0x00dd, 0x781a,
+       0x1078, 0x39e0, 0xa684, 0x0200, 0x0040, 0x3d94, 0x682c, 0x78d2,
+       0x6830, 0x78d6, 0x1078, 0x47f6, 0x2d00, 0x70a2, 0x704a, 0x6810,
+       0x70be, 0x7003, 0x0007, 0xad80, 0x000f, 0x7036, 0x0078, 0x24fa,
+       0x1078, 0x1bd3, 0x1078, 0x39e0, 0x0078, 0x24fa, 0x0000, 0x0300,
+       0x0200, 0x0000, 0x1078, 0x248c, 0x2300, 0x0079, 0x3daf, 0x3db2,
+       0x3db2, 0x3db4, 0x1078, 0x248c, 0x1078, 0x4805, 0x6924, 0xa184,
+       0x00ff, 0xa086, 0x000a, 0x0040, 0x3dc6, 0xa184, 0xff00, 0xa085,
+       0x000a, 0x6826, 0x1078, 0x1bd3, 0x0078, 0x3c68, 0x2001, 0x000a,
+       0x1078, 0x4797, 0x0078, 0x3c68, 0xa282, 0x0005, 0x0050, 0x3dd2,
+       0x1078, 0x248c, 0x7000, 0xa084, 0x0007, 0x10c0, 0x3a8c, 0x1078,
+       0x1989, 0x00c0, 0x3df4, 0x2069, 0xffff, 0xa684, 0x0004, 0x0040,
+       0x3de5, 0x2001, 0x2800, 0x0078, 0x3de7, 0x2001, 0x0800, 0x71b4,
+       0xa188, 0x0091, 0x789b, 0x000e, 0x8007, 0x78aa, 0x2031, 0x0400,
+       0x7e5a, 0x791a, 0x0078, 0x24fa, 0x6807, 0x0106, 0x680b, 0x0000,
+       0x689f, 0x0000, 0x6827, 0x0000, 0xa386, 0x0002, 0x00c0, 0x3e15,
+       0xa286, 0x0002, 0x00c0, 0x3e15, 0x78a0, 0xa005, 0x00c0, 0x3e15,
+       0xa484, 0x8000, 0x00c0, 0x3e15, 0x78e4, 0xa084, 0x0008, 0x0040,
+       0x3e15, 0xa6b5, 0x0008, 0x2019, 0x0000, 0x1078, 0x4217, 0x2d00,
+       0x70a2, 0x704a, 0x7003, 0x0007, 0x7037, 0x0000, 0x6824, 0xa084,
+       0x0080, 0x0040, 0x3e27, 0x1078, 0x42cd, 0x0078, 0x24fa, 0x2300,
+       0x0079, 0x3e2a, 0x3e2d, 0x3eae, 0x3ec7, 0x2200, 0x0079, 0x3e30,
+       0x3e35, 0x3e45, 0x3e6b, 0x3e77, 0x3e9a, 0x2029, 0x0001, 0xa026,
+       0x2011, 0x0000, 0x1078, 0x43f3, 0x0079, 0x3e3e, 0x3e43, 0x24fa,
+       0x3c68, 0x3e43, 0x3e43, 0x1078, 0x248c, 0x7990, 0xa18c, 0x0007,
+       0x00c0, 0x3e4c, 0x2009, 0x0008, 0x2011, 0x0001, 0xa684, 0x0004,
+       0x0040, 0x3e54, 0x2011, 0x0003, 0x2220, 0xa12a, 0x2011, 0x0001,
+       0x1078, 0x43f3, 0x0079, 0x3e5c, 0x3e61, 0x24fa, 0x3c68, 0x3e69,
+       0x3e63, 0x0078, 0x483b, 0x70ab, 0x3e67, 0x0078, 0x24fa, 0x0078,
+       0x3e61, 0x1078, 0x248c, 0xa684, 0x0010, 0x0040, 0x3e75, 0x1078,
+       0x429c, 0x0040, 0x3e75, 0x0078, 0x24fa, 0x0078, 0x430d, 0x6000,
+       0xa084, 0x0002, 0x0040, 0x3e94, 0x70b4, 0xa080, 0x00cd, 0x781a,
+       0x0d7e, 0x1078, 0x4812, 0x2d00, 0x682e, 0x6827, 0x0000, 0x1078,
+       0x3bc6, 0x0d7f, 0x1078, 0x19ac, 0x7003, 0x0000, 0x7037, 0x0000,
+       0x704b, 0x0000, 0x0078, 0x3c68, 0xa684, 0x0004, 0x00c0, 0x3e9a,
+       0x0078, 0x483b, 0x6000, 0xa084, 0x0004, 0x00c0, 0x3eac, 0x6000,
+       0xa084, 0x0001, 0x0040, 0x3eac, 0x70ab, 0x3eac, 0x2001, 0x0007,
+       0x1078, 0x478f, 0x0078, 0x4841, 0x0078, 0x483b, 0x2200, 0x0079,
+       0x3eb1, 0x3eb6, 0x3eb8, 0x3eb6, 0x3eb6, 0x3eb6, 0x1078, 0x248c,
+       0x70a7, 0x3ebc, 0x0078, 0x4847, 0x78e4, 0xa084, 0x0008, 0x00c0,
+       0x3eb8, 0x1078, 0x4781, 0x70ab, 0x3ec5, 0x0078, 0x483b, 0x2200,
+       0x0079, 0x3eca, 0x3ecf, 0x3ed1, 0x3ed1, 0x3ecf, 0x3ecf, 0x1078,
+       0x248c, 0x78e4, 0xa084, 0x0008, 0x0040, 0x3ee6, 0x70a7, 0x3eda,
+       0x0078, 0x4847, 0x2011, 0x0004, 0x1078, 0x43ed, 0x0079, 0x3ee0,
+       0x3ee6, 0x24fa, 0x3c68, 0x3ee6, 0x3ef0, 0x3ef4, 0x70ab, 0x3eee,
+       0x2001, 0x0003, 0x1078, 0x478f, 0x0078, 0x4841, 0x0078, 0x483b,
+       0x70ab, 0x3ee6, 0x0078, 0x24fa, 0x70ab, 0x3ef8, 0x0078, 0x24fa,
+       0x0078, 0x3eee, 0xa282, 0x0003, 0x0050, 0x3f00, 0x1078, 0x248c,
+       0xa386, 0x0002, 0x00c0, 0x3f19, 0xa286, 0x0002, 0x00c0, 0x3f1f,
+       0x78a0, 0xa005, 0x00c0, 0x3f1f, 0xa484, 0x8000, 0x00c0, 0x3f1f,
+       0x78e4, 0xa084, 0x0008, 0x0040, 0x3f19, 0xa6b5, 0x0008, 0x2019,
+       0x0000, 0xa684, 0x0008, 0x0040, 0x3f1f, 0x1078, 0x4279, 0x6810,
+       0x70be, 0x7003, 0x0007, 0x2300, 0x0079, 0x3f26, 0x3f29, 0x3f56,
+       0x3f5e, 0x2200, 0x0079, 0x3f2c, 0x3f31, 0x3f2f, 0x3f4a, 0x1078,
+       0x248c, 0x7990, 0xa1ac, 0x0007, 0xa026, 0x2011, 0x0001, 0x1078,
+       0x43f3, 0x0079, 0x3f3b, 0x3f40, 0x24fa, 0x3c68, 0x3f48, 0x3f42,
+       0x0078, 0x483b, 0x70ab, 0x3f46, 0x0078, 0x24fa, 0x0078, 0x3f40,
+       0x1078, 0x248c, 0xa684, 0x0010, 0x0040, 0x3f54, 0x1078, 0x429c,
+       0x0040, 0x3f54, 0x0078, 0x24fa, 0x0078, 0x430d, 0x2200, 0x0079,
+       0x3f59, 0x3f5c, 0x3f5c, 0x3f5c, 0x1078, 0x248c, 0x2200, 0x0079,
+       0x3f61, 0x3f64, 0x3f66, 0x3f66, 0x1078, 0x248c, 0x78e4, 0xa084,
+       0x0008, 0x0040, 0x3f7b, 0x70a7, 0x3f6f, 0x0078, 0x4847, 0x2011,
+       0x0004, 0x1078, 0x43ed, 0x0079, 0x3f75, 0x3f7b, 0x24fa, 0x3c68,
+       0x3f7b, 0x3f85, 0x3f89, 0x70ab, 0x3f83, 0x2001, 0x0003, 0x1078,
+       0x478f, 0x0078, 0x4841, 0x0078, 0x483b, 0x70ab, 0x3f7b, 0x0078,
+       0x24fa, 0x70ab, 0x3f8d, 0x0078, 0x24fa, 0x0078, 0x3f83, 0x2300,
+       0x0079, 0x3f92, 0x3f97, 0x3f99, 0x3f95, 0x1078, 0x248c, 0x70a4,
+       0x007a, 0x70a4, 0x007a, 0xa282, 0x0002, 0x0050, 0x3fa1, 0x1078,
+       0x248c, 0xa684, 0x0200, 0x0040, 0x3fab, 0x1078, 0x47fe, 0x1078,
+       0x43d5, 0x1078, 0x4805, 0x2300, 0x0079, 0x3fae, 0x3fb1, 0x3fd9,
+       0x403f, 0xad86, 0xffff, 0x0040, 0x3c68, 0xa286, 0x0001, 0x0040,
+       0x3fbb, 0x1078, 0x248c, 0xa684, 0x0200, 0x0040, 0x3fc3, 0x1078,
+       0x47fe, 0x1078, 0x4805, 0x2001, 0x0001, 0x1078, 0x4797, 0x78b8,
+       0xa084, 0xc001, 0x0040, 0x3fd5, 0x7848, 0xa085, 0x0008, 0x784a,
+       0x7848, 0xa084, 0x0008, 0x00c0, 0x3fd0, 0x7003, 0x0000, 0x0078,
+       0x3c68, 0x2200, 0x0079, 0x3fdc, 0x3fde, 0x400f, 0x70a7, 0x3fe2,
+       0x0078, 0x4847, 0x2011, 0x000d, 0x1078, 0x43ed, 0x0079, 0x3fe8,
+       0x3fef, 0x24fa, 0x3c68, 0x3ff7, 0x3fff, 0x4005, 0x4007, 0xa6b4,
+       0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0xa6b4,
+       0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0x70ab,
+       0x4003, 0x0078, 0x24fa, 0x0078, 0x3fef, 0x1078, 0x248c, 0x70ab,
+       0x400b, 0x0078, 0x24fa, 0x1078, 0x484d, 0x0078, 0x24fa, 0x70a7,
+       0x4013, 0x0078, 0x4847, 0x2011, 0x0012, 0x1078, 0x43ed, 0x0079,
+       0x4019, 0x401f, 0x24fa, 0x3c68, 0x402b, 0x4033, 0x4039, 0xa6b4,
+       0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x70b4, 0xa080, 0x00aa,
+       0x781a, 0x0078, 0x24fa, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6,
+       0x7e5a, 0x0078, 0x4835, 0x70ab, 0x4037, 0x0078, 0x24fa, 0x0078,
+       0x401f, 0x70ab, 0x403d, 0x0078, 0x24fa, 0x0078, 0x402b, 0xa286,
+       0x0001, 0x0040, 0x4045, 0x1078, 0x248c, 0x70a7, 0x4049, 0x0078,
+       0x4847, 0x2011, 0x0015, 0x1078, 0x43ed, 0x0079, 0x404f, 0x4054,
+       0x24fa, 0x3c68, 0x4062, 0x406e, 0xa6b4, 0x00ff, 0xa6b5, 0x0400,
+       0x6eb6, 0x7e5a, 0x783b, 0x1301, 0x70b4, 0xa080, 0x00b5, 0x781a,
+       0x0078, 0x24fa, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
+       0x70b4, 0xa080, 0x00aa, 0x781a, 0x0078, 0x24fa, 0x70ab, 0x4072,
+       0x0078, 0x24fa, 0x0078, 0x4054, 0xa282, 0x0003, 0x0050, 0x407a,
+       0x1078, 0x248c, 0x2300, 0x0079, 0x407d, 0x4080, 0x40b7, 0x4114,
+       0xa286, 0x0001, 0x0040, 0x4086, 0x1078, 0x248c, 0x6804, 0xa084,
+       0x00ff, 0xa086, 0x0006, 0x00c0, 0x4093, 0x1078, 0x3bc6, 0x7003,
+       0x0000, 0x0078, 0x3c68, 0x683b, 0x0000, 0x6837, 0x0000, 0xa684,
+       0x0200, 0x0040, 0x40a1, 0x1078, 0x47fe, 0x1078, 0x43d5, 0x1078,
+       0x4805, 0x2001, 0x0001, 0x1078, 0x4797, 0x78b8, 0xa084, 0xc001,
+       0x0040, 0x40b3, 0x7848, 0xa085, 0x0008, 0x784a, 0x7848, 0xa084,
+       0x0008, 0x00c0, 0x40ae, 0x7003, 0x0000, 0x0078, 0x3c68, 0x2200,
+       0x0079, 0x40ba, 0x40bc, 0x40ef, 0x70a7, 0x40c0, 0x0078, 0x4847,
+       0x2011, 0x000d, 0x1078, 0x43ed, 0x0079, 0x40c6, 0x40cd, 0x24fa,
+       0x3c68, 0x40d5, 0x40dd, 0x40e3, 0x40e5, 0xa6b4, 0x00ff, 0xa6b5,
+       0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0xa6b4, 0x00ff, 0xa6b5,
+       0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0x70ab, 0x40e1, 0x0078,
+       0x24fa, 0x0078, 0x40cd, 0x1078, 0x248c, 0x70ab, 0x40eb, 0x1078,
+       0x4805, 0x0078, 0x24fa, 0x1078, 0x484d, 0x0078, 0x24fa, 0x70a7,
+       0x40f3, 0x0078, 0x4847, 0x2011, 0x0005, 0x1078, 0x43ed, 0x0079,
+       0x40f9, 0x40fe, 0x24fa, 0x3c68, 0x4106, 0x410e, 0xa6b4, 0x00ff,
+       0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0xa6b4, 0x00ff,
+       0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0x70ab, 0x4112,
+       0x0078, 0x24fa, 0x0078, 0x40fe, 0xa286, 0x0001, 0x0040, 0x411a,
+       0x1078, 0x248c, 0x70a7, 0x411e, 0x0078, 0x4847, 0x2011, 0x0006,
+       0x1078, 0x43ed, 0x0079, 0x4124, 0x4129, 0x24fa, 0x3c68, 0x412f,
+       0x4139, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0xa6b4,
+       0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0xa6b5, 0x4000, 0x7e5a, 0x0078,
+       0x4835, 0x70ab, 0x413d, 0x0078, 0x24fa, 0x0078, 0x4129, 0x2300,
+       0x0079, 0x4142, 0x4147, 0x4145, 0x4145, 0x1078, 0x248c, 0x1078,
+       0x248c, 0x2300, 0x71a8, 0xa005, 0x017a, 0x6810, 0x70be, 0xa282,
+       0x0003, 0x0050, 0x4155, 0x1078, 0x248c, 0x2300, 0x0079, 0x4158,
+       0x415b, 0x4169, 0x418b, 0xa684, 0x0200, 0x0040, 0x4163, 0x1078,
+       0x47fe, 0x1078, 0x4805, 0x2001, 0x0001, 0x1078, 0x4797, 0x0078,
+       0x24fa, 0xa296, 0x0002, 0x0040, 0x4172, 0x82ff, 0x0040, 0x4172,
+       0x1078, 0x248c, 0x70a7, 0x4176, 0x0078, 0x4847, 0x2011, 0x0018,
+       0x1078, 0x43ed, 0x0079, 0x417c, 0x4181, 0x24fa, 0x3c68, 0x4183,
+       0x4185, 0x0078, 0x4835, 0x0078, 0x4835, 0x70ab, 0x4189, 0x0078,
+       0x24fa, 0x0078, 0x4181, 0x2200, 0x0079, 0x418e, 0x4190, 0x41a9,
+       0x70a7, 0x4194, 0x0078, 0x4847, 0x2011, 0x0017, 0x1078, 0x43ed,
+       0x0079, 0x419a, 0x419f, 0x24fa, 0x3c68, 0x41a1, 0x41a3, 0x0078,
+       0x4835, 0x0078, 0x4835, 0x70ab, 0x41a7, 0x0078, 0x24fa, 0x0078,
+       0x419f, 0xa484, 0x8000, 0x00c0, 0x4205, 0xa684, 0x0100, 0x0040,
+       0x41b5, 0x1078, 0x47fe, 0x1078, 0x43d5, 0x78d8, 0x78d2, 0x78dc,
+       0x78d6, 0xa6b4, 0xefff, 0x7e5a, 0x70a7, 0x41c0, 0x0078, 0x4847,
+       0x2011, 0x000d, 0x1078, 0x43ed, 0x0079, 0x41c6, 0x41cd, 0x24fa,
+       0x3c68, 0x41cd, 0x41f3, 0x41f9, 0x41fb, 0x78d8, 0x79dc, 0xa105,
+       0x00c0, 0x41df, 0x78b8, 0xa084, 0x001f, 0x00c0, 0x41df, 0x70b3,
+       0x0000, 0x7858, 0xa084, 0xfdff, 0x785a, 0x0078, 0x4835, 0xa684,
+       0x0100, 0x0040, 0x41f1, 0x7848, 0xa085, 0x0008, 0x784a, 0x1078,
+       0x47bc, 0x682c, 0x78d2, 0x6830, 0x78d6, 0x70b3, 0x0000, 0x1078,
+       0x47f6, 0x0078, 0x4835, 0x70ab, 0x41f7, 0x0078, 0x24fa, 0x0078,
+       0x41cd, 0x1078, 0x248c, 0x70ab, 0x4201, 0x1078, 0x4805, 0x0078,
+       0x24fa, 0x1078, 0x484d, 0x0078, 0x24fa, 0x1078, 0x4805, 0x70ab,
+       0x420f, 0x2001, 0x0003, 0x1078, 0x478f, 0x0078, 0x4841, 0x1078,
+       0x47f6, 0x682c, 0x78d2, 0x6830, 0x78d6, 0x0078, 0x4835, 0x70b8,
+       0x6812, 0x70be, 0x8000, 0x70ba, 0x681b, 0x0000, 0xa684, 0x0008,
+       0x0040, 0x423a, 0x157e, 0x137e, 0x147e, 0x7890, 0x8004, 0x8004,
+       0x8004, 0x8004, 0xa084, 0x000f, 0x681a, 0x80ac, 0x789b, 0x0000,
+       0xaf80, 0x002b, 0x2098, 0xad80, 0x000b, 0x20a0, 0x53a5, 0x147f,
+       0x137f, 0x157f, 0xa6c4, 0x0f00, 0xa684, 0x0002, 0x00c0, 0x4249,
+       0x692c, 0x810d, 0x810d, 0x810d, 0xa184, 0x0007, 0x2008, 0x0078,
+       0x425c, 0x789b, 0x0010, 0x79ac, 0xa184, 0x0020, 0x0040, 0x425c,
+       0x017e, 0x2009, 0x0005, 0x2001, 0x3d00, 0x1078, 0x47c7, 0x6824,
+       0xa085, 0x003b, 0x6826, 0x017f, 0xa184, 0x001f, 0xa805, 0x6816,
+       0x1078, 0x3c3b, 0x68be, 0xa684, 0x0004, 0x0040, 0x426d, 0xa18c,
+       0xff00, 0x78a8, 0xa084, 0x00ff, 0xa105, 0x682a, 0xa6b4, 0x00ff,
+       0x6000, 0xa084, 0x0008, 0x0040, 0x4277, 0xa6b5, 0x4000, 0x6eb6,
+       0x007c, 0x157e, 0x137e, 0x147e, 0x6918, 0x7890, 0x8004, 0x8004,
+       0x8004, 0x8004, 0xa084, 0x000f, 0x007e, 0xa100, 0x681a, 0x007f,
+       0x8000, 0x8004, 0x0040, 0x4298, 0x20a8, 0x8104, 0xa080, 0x000b,
+       0xad00, 0x20a0, 0x789b, 0x0000, 0xaf80, 0x002b, 0x2098, 0x53a5,
+       0x147f, 0x137f, 0x157f, 0x007c, 0x682c, 0xa084, 0x0020, 0x00c0,
+       0x42a4, 0x620c, 0x0078, 0x42a5, 0x6210, 0x6b18, 0x2300, 0xa202,
+       0x0040, 0x42c5, 0x2018, 0xa382, 0x000e, 0x0048, 0x42b5, 0x0040,
+       0x42b5, 0x2019, 0x000e, 0x0078, 0x42b9, 0x7858, 0xa084, 0xffef,
+       0x785a, 0x783b, 0x1b01, 0x7893, 0x0000, 0x7ba2, 0x70b4, 0xa080,
+       0x008e, 0x781a, 0xa085, 0x0001, 0x007c, 0x7858, 0xa084, 0xffef,
+       0x785a, 0x7893, 0x0000, 0xa006, 0x007c, 0x6904, 0xa18c, 0x00ff,
+       0xa196, 0x0007, 0x0040, 0x42da, 0xa196, 0x000f, 0x0040, 0x42da,
+       0x6807, 0x0117, 0x6914, 0x1078, 0x3c3b, 0x6100, 0x8104, 0x00c8,
+       0x42f5, 0x601c, 0xa005, 0x0040, 0x42e9, 0x2001, 0x0800, 0x0078,
+       0x42f7, 0x0d7e, 0x6824, 0x007e, 0x1078, 0x4812, 0x007f, 0x6826,
+       0x2d00, 0x682e, 0x1078, 0x3bc6, 0x0d7f, 0x2001, 0x0200, 0x6924,
+       0xa18c, 0x00ff, 0xa10d, 0x6926, 0x8007, 0x789b, 0x000e, 0x78aa,
+       0x6820, 0xa085, 0x8000, 0x6822, 0x2031, 0x0400, 0x6eb6, 0x7e5a,
+       0x71b4, 0xa188, 0x0091, 0x791a, 0x007c, 0xa6c4, 0x0f00, 0xa684,
+       0x0002, 0x00c0, 0x4321, 0x692c, 0x810d, 0x810d, 0x810d, 0xa184,
+       0x0007, 0x2008, 0xa805, 0x6816, 0x1078, 0x3c3b, 0x68be, 0x0078,
+       0x4324, 0x6914, 0x1078, 0x3c3b, 0x6100, 0x8104, 0x00c8, 0x4382,
+       0xa184, 0x0300, 0x0040, 0x4330, 0x6807, 0x0117, 0x0078, 0x434e,
+       0x6004, 0xa005, 0x00c0, 0x4357, 0x6807, 0x0117, 0x601c, 0xa005,
+       0x00c0, 0x4344, 0x0d7e, 0x1078, 0x4812, 0x6827, 0x0034, 0x2d00,
+       0x682e, 0x1078, 0x3bc6, 0x0d7f, 0xa684, 0x0004, 0x0040, 0x434e,
+       0x2031, 0x0400, 0x2001, 0x2800, 0x0078, 0x4352, 0x2031, 0x0400,
+       0x2001, 0x0800, 0x71b4, 0xa188, 0x0091, 0x0078, 0x43b0, 0x6018,
+       0xa005, 0x00c0, 0x4344, 0x601c, 0xa005, 0x00c0, 0x4344, 0x689f,
+       0x0000, 0x6827, 0x003d, 0xa684, 0x0001, 0x0040, 0x43be, 0xd694,
+       0x00c0, 0x437b, 0x6100, 0xd1d4, 0x0040, 0x437b, 0x692c, 0xa18c,
+       0x00ff, 0x0040, 0x43be, 0xa186, 0x0003, 0x0040, 0x43be, 0xa186,
+       0x0012, 0x0040, 0x43be, 0xa6b5, 0x0800, 0x71b4, 0xa188, 0x00ae,
+       0x0078, 0x43b9, 0x6807, 0x0117, 0x2031, 0x0400, 0x692c, 0xa18c,
+       0x00ff, 0xa186, 0x0012, 0x00c0, 0x4393, 0x2001, 0x43cb, 0x2009,
+       0x0001, 0x0078, 0x43a4, 0xa186, 0x0003, 0x00c0, 0x439d, 0x2001,
+       0x43cc, 0x2009, 0x0012, 0x0078, 0x43a4, 0x2001, 0x0200, 0x71b4,
+       0xa188, 0x0091, 0x0078, 0x43b0, 0x1078, 0x47e1, 0x78a3, 0x0000,
+       0x681c, 0xa085, 0x0040, 0x681e, 0x71b4, 0xa188, 0x00da, 0xa006,
+       0x6826, 0x8007, 0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000,
+       0x6822, 0x6eb6, 0x7e5a, 0x791a, 0x0078, 0x24fa, 0x6eb6, 0x1078,
+       0x3bc6, 0x6810, 0x70be, 0x7003, 0x0007, 0x70a3, 0x0000, 0x704b,
+       0x0000, 0x0078, 0x24fa, 0x0023, 0x0070, 0x0005, 0x0000, 0x0a00,
+       0x0000, 0x0000, 0x0025, 0x0000, 0x0000, 0x683b, 0x0000, 0x6837,
+       0x0000, 0xa684, 0x0200, 0x0040, 0x43ec, 0x78b8, 0xa08c, 0x001f,
+       0xa084, 0x8000, 0x0040, 0x43e5, 0x8108, 0x78d8, 0xa100, 0x6836,
+       0x78dc, 0xa081, 0x0000, 0x683a, 0x007c, 0x7990, 0x810f, 0xa5ac,
+       0x0007, 0x2021, 0x0000, 0xa480, 0x0010, 0x789a, 0x79a8, 0xa18c,
+       0x00ff, 0xa184, 0x0080, 0x00c0, 0x441b, 0xa182, 0x0020, 0x00c8,
+       0x4439, 0xa182, 0x0012, 0x00c8, 0x4781, 0x2100, 0x1079, 0x4409,
+       0x007c, 0x4781, 0x45eb, 0x4781, 0x4781, 0x4446, 0x4449, 0x4483,
+       0x44b9, 0x44ed, 0x44f0, 0x4781, 0x4781, 0x44a4, 0x4514, 0x454e,
+       0x4781, 0x4781, 0x4574, 0xa184, 0x0020, 0x00c0, 0x45a8, 0xa18c,
+       0x001f, 0x6814, 0xa084, 0x001f, 0xa106, 0x0040, 0x4436, 0x70b4,
+       0xa080, 0x00cd, 0x781a, 0x2001, 0x0014, 0x1078, 0x4797, 0x1078,
+       0x4805, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x2001, 0x0000,
+       0x007c, 0xa182, 0x0024, 0x00c8, 0x4781, 0xa184, 0x0003, 0x1079,
+       0x4409, 0x007c, 0x4781, 0x4781, 0x4781, 0x4781, 0x1078, 0x4781,
+       0x007c, 0x2200, 0x0079, 0x444c, 0x4577, 0x4577, 0x4470, 0x4470,
+       0x4470, 0x4470, 0x4470, 0x4470, 0x4470, 0x4470, 0x446e, 0x4470,
+       0x4465, 0x4470, 0x4470, 0x4470, 0x4470, 0x4470, 0x4478, 0x447b,
+       0x4577, 0x447b, 0x4470, 0x4470, 0x4470, 0x0c7e, 0x077e, 0x6f14,
+       0x1078, 0x37b0, 0x077f, 0x0c7f, 0x0078, 0x4470, 0x1078, 0x468e,
+       0x6827, 0x02b3, 0x2009, 0x000b, 0x2001, 0x4800, 0x0078, 0x45ab,
+       0x1078, 0x4773, 0x007c, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001,
+       0x4800, 0x0078, 0x4593, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086,
+       0x0006, 0x00c0, 0x448d, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078,
+       0x4812, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078,
+       0x3b96, 0x1078, 0x45d3, 0x2b68, 0x1078, 0x3bc6, 0x0d7f, 0x1078,
+       0x3bc6, 0x2001, 0x0002, 0x007c, 0x1078, 0x45d3, 0x2001, 0x0017,
+       0x1078, 0x4797, 0x70a3, 0x0000, 0x2009, 0x5238, 0x200b, 0x0006,
+       0x70af, 0x0017, 0x2009, 0x0200, 0x1078, 0x3ad4, 0x2001, 0x0001,
+       0x007c, 0x2200, 0x0079, 0x44bc, 0x4577, 0x45a8, 0x45a8, 0x45a8,
+       0x44dd, 0x45ba, 0x44e5, 0x45ba, 0x45ba, 0x45bd, 0x45bd, 0x45c2,
+       0x45c2, 0x44d5, 0x44d5, 0x45a8, 0x45a8, 0x45ba, 0x45a8, 0x44e5,
+       0x4577, 0x44e5, 0x44e5, 0x44e5, 0x44e5, 0x6827, 0x0084, 0x2009,
+       0x000b, 0x2001, 0x4300, 0x0078, 0x45cc, 0x6827, 0x000d, 0x2009,
+       0x000b, 0x2001, 0x4300, 0x0078, 0x45ab, 0x6827, 0x0093, 0x2009,
+       0x000b, 0x2001, 0x4300, 0x0078, 0x4593, 0x2001, 0x0000, 0x007c,
+       0x2200, 0x0079, 0x44f3, 0x4577, 0x450c, 0x450c, 0x450c, 0x450c,
+       0x45ba, 0x45ba, 0x45ba, 0x45ba, 0x45ba, 0x45ba, 0x45ba, 0x45ba,
+       0x450c, 0x450c, 0x450c, 0x450c, 0x45ba, 0x450c, 0x450c, 0x45ba,
+       0x45ba, 0x45ba, 0x45ba, 0x4577, 0x6827, 0x0093, 0x2009, 0x000b,
+       0x2001, 0x4300, 0x0078, 0x4593, 0xa684, 0x0004, 0x00c0, 0x4528,
+       0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x4781, 0x1078,
+       0x45d3, 0x6807, 0x0117, 0x1078, 0x3bc6, 0x2001, 0x0002, 0x007c,
+       0x6000, 0xa084, 0x0004, 0x0040, 0x4781, 0x2d58, 0x6804, 0xa084,
+       0x00ff, 0xa086, 0x0006, 0x00c0, 0x4537, 0x6807, 0x0117, 0x6827,
+       0x0002, 0x1078, 0x4812, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e,
+       0x0d7e, 0x1078, 0x3ba5, 0x1078, 0x45d3, 0x2b68, 0x1078, 0x3bc6,
+       0x0d7f, 0x1078, 0x3bc6, 0x2001, 0x0002, 0x007c, 0x6000, 0xa084,
+       0x0004, 0x0040, 0x4781, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0006,
+       0x00c0, 0x455c, 0x6807, 0x0117, 0x6827, 0x0002, 0x2d58, 0x1078,
+       0x4812, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078,
+       0x3bb5, 0x1078, 0x45d3, 0x2b68, 0x1078, 0x3bc6, 0x0d7f, 0x1078,
+       0x3bc6, 0x2001, 0x0002, 0x007c, 0x1078, 0x4781, 0x007c, 0x70b4,
+       0xa080, 0x00cd, 0x781a, 0x2001, 0x0001, 0x1078, 0x4797, 0x1078,
+       0x4805, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x1078, 0x47c7,
+       0x1078, 0x47fe, 0x1078, 0x43d5, 0x1078, 0x42cd, 0x1078, 0x4805,
+       0x2001, 0x0001, 0x007c, 0x1078, 0x47c7, 0x1078, 0x47fe, 0x1078,
+       0x43d5, 0x70b4, 0xa080, 0x00cd, 0x781a, 0x2001, 0x0013, 0x1078,
+       0x4797, 0x1078, 0x4805, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c,
+       0x1078, 0x4781, 0x007c, 0x1078, 0x47c7, 0x1078, 0x47fe, 0x1078,
+       0x43d5, 0x1078, 0x42cd, 0x1078, 0x4805, 0x1078, 0x484d, 0x2001,
+       0x0001, 0x007c, 0x2001, 0x0003, 0x007c, 0x1078, 0x468e, 0x2001,
+       0x0000, 0x007c, 0x0c7e, 0x077e, 0x6f14, 0x1078, 0x37b0, 0x077f,
+       0x0c7f, 0x2001, 0x0000, 0x007c, 0x1078, 0x47c7, 0x1078, 0x4781,
+       0x2001, 0x0006, 0x007c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007,
+       0x0040, 0x45de, 0xa186, 0x000f, 0x00c0, 0x45e2, 0x1078, 0x47fe,
+       0x1078, 0x43d5, 0x70b4, 0xa080, 0x00cd, 0x781a, 0x1078, 0x4805,
+       0x7003, 0x0000, 0x007c, 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084,
+       0x00ff, 0xa08a, 0x0004, 0x00c8, 0x4781, 0x1079, 0x45f8, 0x007c,
+       0x4781, 0x45fc, 0x4781, 0x4695, 0xa282, 0x0003, 0x0040, 0x4603,
+       0x1078, 0x4781, 0x007c, 0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4,
+       0x00ff, 0x69b8, 0xa184, 0x0100, 0x0040, 0x4642, 0xa18c, 0xfeff,
+       0x69ba, 0x78a0, 0xa005, 0x00c0, 0x4642, 0xa4a4, 0x00ff, 0x0040,
+       0x4636, 0xa482, 0x000c, 0x0040, 0x461f, 0x00c8, 0x4629, 0x852b,
+       0x852b, 0x1078, 0x382e, 0x0040, 0x4629, 0x1078, 0x3627, 0x0078,
+       0x4638, 0x1078, 0x4760, 0x1078, 0x3652, 0x69b8, 0xa18d, 0x0100,
+       0x69ba, 0xa6b5, 0x1000, 0x7e5a, 0x0078, 0x463b, 0x1078, 0x3652,
+       0xa6b4, 0xefff, 0x7e5a, 0x70b4, 0xa080, 0x0091, 0x781a, 0x2001,
+       0x0001, 0x007c, 0x0c7e, 0x1078, 0x4682, 0x6200, 0xd2e4, 0x0040,
+       0x4673, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c, 0x0048,
+       0x4655, 0x0040, 0x4655, 0x2011, 0x000c, 0x2400, 0xa202, 0x00c8,
+       0x465a, 0x2220, 0x6208, 0xa294, 0x00ff, 0x701c, 0xa202, 0x00c8,
+       0x4662, 0x721c, 0x2200, 0xa502, 0x00c8, 0x4667, 0x2228, 0x1078,
+       0x4764, 0x852b, 0x852b, 0x1078, 0x382e, 0x0040, 0x4673, 0x1078,
+       0x362e, 0x0078, 0x4677, 0x1078, 0x4760, 0x1078, 0x3659, 0xa6b5,
+       0x1000, 0x7e5a, 0x70b4, 0xa080, 0x00b9, 0x781a, 0x2001, 0x0004,
+       0x0c7f, 0x007c, 0x007e, 0x6814, 0x8007, 0xa084, 0x000f, 0x8003,
+       0x8003, 0x8003, 0xa0e0, 0x5480, 0x007f, 0x007c, 0x0c7e, 0x1078,
+       0x4682, 0x1078, 0x3659, 0x0c7f, 0x007c, 0xa282, 0x0002, 0x00c0,
+       0x4781, 0x7aa8, 0xa294, 0x00ff, 0x69b8, 0xa184, 0x0200, 0x0040,
+       0x46cc, 0xa18c, 0xfdff, 0x69ba, 0x78a0, 0xa005, 0x00c0, 0x46cc,
+       0xa282, 0x0002, 0x00c8, 0x376b, 0x1078, 0x472a, 0x1078, 0x36f9,
+       0x1078, 0x3652, 0xa684, 0x0100, 0x0040, 0x46c2, 0x682c, 0xa084,
+       0x0001, 0x0040, 0x46c2, 0xc6fc, 0x7888, 0xa084, 0x0040, 0x0040,
+       0x46c2, 0xc6fd, 0xa6b5, 0x1000, 0x7e5a, 0x70b4, 0xa080, 0x0091,
+       0x781a, 0x2001, 0x0001, 0x007c, 0x0c7e, 0x1078, 0x4682, 0xa284,
+       0xfffe, 0x0040, 0x46d7, 0x2011, 0x0001, 0x0078, 0x46db, 0xa284,
+       0x0001, 0x0040, 0x46e1, 0x6100, 0xd1ec, 0x00c0, 0x46e1, 0x2011,
+       0x0000, 0x1078, 0x471c, 0x1078, 0x3700, 0x1078, 0x3659, 0xa684,
+       0x0100, 0x0040, 0x46f7, 0x682c, 0xa084, 0x0001, 0x0040, 0x46f7,
+       0xc6fc, 0x7888, 0xa084, 0x0040, 0x0040, 0x46f7, 0xc6fd, 0xa6b5,
+       0x1000, 0x7e5a, 0x70b4, 0xa080, 0x00b9, 0x781a, 0x2001, 0x0004,
+       0x0c7f, 0x007c, 0x0c7e, 0x2960, 0x6000, 0x2011, 0x0001, 0xa084,
+       0x2000, 0x00c0, 0x470d, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab,
+       0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x68b8, 0xa085,
+       0x0200, 0x68ba, 0x0c7f, 0x007c, 0x789b, 0x0018, 0x78ab, 0x0001,
+       0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0081, 0x78ab,
+       0x0004, 0x007c, 0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084, 0x1000,
+       0x00c0, 0x4738, 0x2029, 0x0032, 0x2021, 0x0000, 0x0078, 0x4758,
+       0x6508, 0xa5ac, 0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, 0x4748,
+       0xa582, 0x0019, 0x00c8, 0x474e, 0x2029, 0x0019, 0x0078, 0x474e,
+       0xa582, 0x000c, 0x00c8, 0x474e, 0x2029, 0x000c, 0x6408, 0x8427,
+       0xa4a4, 0x00ff, 0xa482, 0x000c, 0x0048, 0x4758, 0x2021, 0x000c,
+       0x1078, 0x4764, 0x68b8, 0xa085, 0x0100, 0x68ba, 0x0c7f, 0x007c,
+       0x2021, 0x0000, 0x2029, 0x0032, 0x789b, 0x0018, 0x78ab, 0x0001,
+       0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7caa, 0x789b, 0x0081,
+       0x78ab, 0x0005, 0x007c, 0x2001, 0x0003, 0x1078, 0x478f, 0xa6b5,
+       0x1000, 0x7e5a, 0x70b4, 0xa080, 0x00b9, 0x781a, 0x2001, 0x0005,
+       0x007c, 0x2001, 0x0007, 0x1078, 0x478f, 0xa6b5, 0x1000, 0x7e5a,
+       0x70b4, 0xa080, 0x00b9, 0x781a, 0x2001, 0x0004, 0x007c, 0x789b,
+       0x0018, 0x78aa, 0x789b, 0x0081, 0x78ab, 0x0001, 0x007c, 0x6904,
+       0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x47a5, 0xa196, 0x000f,
+       0x0040, 0x47a5, 0x1078, 0x19ac, 0x007c, 0x6924, 0xa194, 0x003f,
+       0x00c0, 0x47ae, 0xa18c, 0xffc0, 0xa105, 0x6826, 0x1078, 0x3bc6,
+       0x691c, 0xa184, 0x0100, 0x0040, 0x47bb, 0x6914, 0x1078, 0x3c3b,
+       0x6204, 0x8210, 0x6206, 0x007c, 0x692c, 0x6834, 0x682e, 0xa112,
+       0x6930, 0x6838, 0x6832, 0xa11b, 0xa200, 0xa301, 0x007c, 0x0c7e,
+       0xade0, 0x0018, 0x6003, 0x0070, 0x6106, 0x600b, 0x0000, 0x600f,
+       0x0a00, 0x6013, 0x0000, 0x6017, 0x0000, 0x8007, 0x601a, 0x601f,
+       0x0000, 0x6023, 0x0000, 0x0c7f, 0x6824, 0xa085, 0x0080, 0x6826,
+       0x007c, 0x157e, 0x137e, 0x147e, 0x2098, 0xaf80, 0x002d, 0x20a0,
+       0x81ac, 0x0040, 0x47ec, 0x53a6, 0xa184, 0x0001, 0x0040, 0x47f2,
+       0x3304, 0x78be, 0x147f, 0x137f, 0x157f, 0x007c, 0x70b0, 0xa005,
+       0x10c0, 0x248c, 0x70b3, 0x8000, 0x0078, 0x4b4b, 0x71b0, 0x81ff,
+       0x0040, 0x4804, 0x1078, 0x4c41, 0x007c, 0x71b0, 0x81ff, 0x0040,
+       0x4811, 0x7848, 0xa085, 0x0008, 0x784a, 0x70b3, 0x0000, 0x1078,
+       0x4887, 0x007c, 0x0c7e, 0x0d7e, 0x1078, 0x1989, 0x00c0, 0x481a,
+       0x1078, 0x248c, 0x0c7f, 0x157e, 0x137e, 0x147e, 0x2da0, 0x2c98,
+       0x20a9, 0x0031, 0x53a3, 0x147f, 0x137f, 0x157f, 0x6807, 0x010d,
+       0x680b, 0x0000, 0x7004, 0x8007, 0x681a, 0x6823, 0x0000, 0x681f,
+       0x0000, 0x689f, 0x0000, 0x0c7f, 0x007c, 0x70b4, 0xa080, 0x0091,
+       0x781a, 0x0078, 0x24fa, 0x70b4, 0xa080, 0x0081, 0x781a, 0x0078,
+       0x24fa, 0x70b4, 0xa080, 0x00b9, 0x781a, 0x0078, 0x24fa, 0x70b4,
+       0xa080, 0x00c3, 0x781a, 0x0078, 0x24fa, 0x6904, 0xa18c, 0x00ff,
+       0xa196, 0x0007, 0x0040, 0x485a, 0xa196, 0x000f, 0x0040, 0x485a,
+       0x6807, 0x0117, 0x6824, 0xa084, 0x00ff, 0xa085, 0x0200, 0x6826,
+       0x8007, 0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822,
+       0x2031, 0x0400, 0x6eb6, 0x7e5a, 0x71b4, 0xa188, 0x0091, 0x791a,
+       0x007c, 0x1078, 0x4805, 0x7848, 0xa085, 0x000c, 0x784a, 0x70b4,
+       0xa080, 0x00cd, 0x781a, 0x2009, 0x000b, 0x2001, 0x4400, 0x1078,
+       0x47c7, 0x2001, 0x0013, 0x1078, 0x4797, 0x0078, 0x3c68, 0x127e,
+       0x2091, 0x2200, 0x2049, 0x4887, 0x7000, 0x7204, 0xa205, 0x720c,
+       0xa215, 0x7008, 0xa084, 0xfff7, 0xa205, 0x0040, 0x4899, 0x0078,
+       0x489e, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x7000, 0xa084,
+       0x0001, 0x00c0, 0x48cc, 0x7108, 0x8103, 0x00c8, 0x48ab, 0x1078,
+       0x49ce, 0x0078, 0x48a3, 0x700c, 0xa08c, 0x00ff, 0x0040, 0x48cc,
+       0x7004, 0x8004, 0x00c8, 0x48c3, 0x7014, 0xa005, 0x00c0, 0x48bf,
+       0x7010, 0xa005, 0x0040, 0x48c3, 0xa102, 0x00c8, 0x48a3, 0x7007,
+       0x0010, 0x0078, 0x48cc, 0x8aff, 0x0040, 0x48cc, 0x1078, 0x4c18,
+       0x00c0, 0x48c6, 0x0040, 0x48a3, 0x1078, 0x4957, 0x7003, 0x0000,
+       0x127f, 0x2000, 0x007c, 0x017e, 0x6104, 0xa18c, 0x00ff, 0xa186,
+       0x0007, 0x0040, 0x48df, 0xa18e, 0x000f, 0x00c0, 0x48e2, 0x6040,
+       0x0078, 0x48e3, 0x6428, 0x017f, 0x84ff, 0x0040, 0x490d, 0x2c70,
+       0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x491d, 0x273c, 0x87fb, 0x00c0,
+       0x48fb, 0x0048, 0x48f5, 0x1078, 0x248c, 0x609c, 0xa075, 0x0040,
+       0x490d, 0x0078, 0x48e8, 0x2704, 0xae68, 0x6808, 0xa630, 0x680c,
+       0xa529, 0x8421, 0x0040, 0x490d, 0x8738, 0x2704, 0xa005, 0x00c0,
+       0x48fc, 0x709c, 0xa075, 0x00c0, 0x48e8, 0x007c, 0x0000, 0x0005,
+       0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003,
+       0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x4912, 0x490f,
+       0x0000, 0x0000, 0x8000, 0x0000, 0x4912, 0x0000, 0x491a, 0x4917,
+       0x0000, 0x0000, 0x0000, 0x0000, 0x491a, 0x0000, 0x4915, 0x4915,
+       0x0000, 0x0000, 0x8000, 0x0000, 0x4915, 0x0000, 0x491b, 0x491b,
+       0x0000, 0x0000, 0x0000, 0x0000, 0x491b, 0x127e, 0x2091, 0x2200,
+       0x2079, 0x5200, 0x2071, 0x0010, 0x7007, 0x000a, 0x7007, 0x0002,
+       0x7003, 0x0000, 0x2071, 0x0020, 0x7007, 0x000a, 0x7007, 0x0002,
+       0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c, 0x2049,
+       0x4957, 0x2019, 0x0000, 0x7004, 0x8004, 0x00c8, 0x49aa, 0x7007,
+       0x0012, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4961, 0xa184, 0x01e0,
+       0x0040, 0x496c, 0x1078, 0x248c, 0x2001, 0x04fd, 0x2004, 0xa082,
+       0x0005, 0x00c8, 0x4977, 0xa184, 0x4000, 0x00c0, 0x4961, 0xa19c,
+       0x300c, 0xa386, 0x2004, 0x0040, 0x4985, 0xa386, 0x0008, 0x0040,
+       0x4990, 0xa386, 0x200c, 0x00c0, 0x4961, 0x7200, 0x8204, 0x0048,
+       0x4990, 0x730c, 0xa384, 0x00ff, 0x0040, 0x4990, 0x1078, 0x248c,
+       0x7007, 0x0012, 0x7000, 0xa084, 0x0001, 0x00c0, 0x49aa, 0x7008,
+       0xa084, 0x01e0, 0x00c0, 0x49aa, 0x7310, 0x7014, 0xa305, 0x0040,
+       0x49aa, 0x710c, 0xa184, 0x0300, 0x00c0, 0x49aa, 0xa184, 0x00ff,
+       0x00c0, 0x4957, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xa084,
+       0x0008, 0x00c0, 0x49ae, 0x7007, 0x0012, 0x7108, 0x8103, 0x0048,
+       0x49b3, 0x7003, 0x0000, 0x2049, 0x0000, 0x007c, 0x107e, 0x007e,
+       0x127e, 0x157e, 0x2091, 0x2200, 0x7108, 0x1078, 0x49ce, 0x157f,
+       0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c, 0x7204, 0x7500,
+       0x730c, 0xa384, 0x0300, 0x00c0, 0x49f5, 0xa184, 0x01e0, 0x00c0,
+       0x4a19, 0x7108, 0xa184, 0x01e0, 0x00c0, 0x4a19, 0x2001, 0x04fd,
+       0x2004, 0xa082, 0x0005, 0x00c8, 0x49e9, 0xa184, 0x4000, 0x00c0,
+       0x49d9, 0xa184, 0x0007, 0x0079, 0x49ed, 0x49f7, 0x4a09, 0x49f5,
+       0x4a09, 0x49f5, 0x4a55, 0x49f5, 0x4a53, 0x1078, 0x248c, 0x7004,
+       0xa084, 0x0010, 0xa085, 0x0002, 0x7006, 0x8aff, 0x00c0, 0x4a04,
+       0x2049, 0x0000, 0x0078, 0x4a08, 0x1078, 0x4c18, 0x00c0, 0x4a04,
+       0x007c, 0x7004, 0xa084, 0x0010, 0xa085, 0x0002, 0x7006, 0x8aff,
+       0x00c0, 0x4a14, 0x0078, 0x4a18, 0x1078, 0x4c18, 0x00c0, 0x4a14,
+       0x007c, 0x7007, 0x0012, 0x7108, 0x00e0, 0x4a1c, 0x2091, 0x6000,
+       0x00e0, 0x4a20, 0x2091, 0x6000, 0x7007, 0x0012, 0x7007, 0x0008,
+       0x7004, 0xa084, 0x0008, 0x00c0, 0x4a28, 0x7007, 0x0012, 0x7108,
+       0x8103, 0x0048, 0x4a2d, 0x7003, 0x0000, 0x7000, 0xa005, 0x00c0,
+       0x4a41, 0x7004, 0xa005, 0x00c0, 0x4a41, 0x700c, 0xa005, 0x0040,
+       0x4a43, 0x0078, 0x4a24, 0x2049, 0x0000, 0x1078, 0x38d7, 0x6818,
+       0xa084, 0x8000, 0x0040, 0x4a4e, 0x681b, 0x0002, 0x007c, 0x1078,
+       0x248c, 0x1078, 0x248c, 0x1078, 0x4ab1, 0x7210, 0x7114, 0x700c,
+       0xa09c, 0x00ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, 0x1078,
+       0x4ab1, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322, 0x630c,
+       0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x4a78, 0x00c8, 0x4a78,
+       0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078, 0x4a5f,
+       0x2b60, 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008, 0x0040, 0x4a84,
+       0xa7ba, 0x4917, 0x0078, 0x4a86, 0xa7ba, 0x490f, 0x007f, 0xa73d,
+       0x2c00, 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7007, 0x0012, 0x1078,
+       0x4957, 0x007c, 0x8738, 0x2704, 0xa005, 0x00c0, 0x4aa5, 0x609c,
+       0xa005, 0x0040, 0x4aae, 0x2060, 0x6004, 0xa084, 0x000f, 0xa080,
+       0x491d, 0x203c, 0x87fb, 0x1040, 0x248c, 0x8a51, 0x0040, 0x4aad,
+       0x7008, 0xa084, 0x0003, 0xa086, 0x0003, 0x007c, 0x2051, 0x0000,
+       0x007c, 0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x4ac5, 0x6000,
+       0xa064, 0x00c0, 0x4abc, 0x2d60, 0x6004, 0xa084, 0x000f, 0xa080,
+       0x492d, 0x203c, 0x87fb, 0x1040, 0x248c, 0x007c, 0x127e, 0x0d7e,
+       0x2091, 0x2200, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90,
+       0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804, 0xa084,
+       0x0008, 0x007f, 0x0040, 0x4ae0, 0xa0b8, 0x4917, 0x0078, 0x4ae2,
+       0xa0b8, 0x490f, 0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff,
+       0xa186, 0x0007, 0x0040, 0x4af0, 0xa18e, 0x000f, 0x00c0, 0x4af9,
+       0x681c, 0xa084, 0x0040, 0x0040, 0x4b00, 0xa6b5, 0x0001, 0x0078,
+       0x4b00, 0x681c, 0xa084, 0x0040, 0x0040, 0x4b00, 0xa6b5, 0x0001,
+       0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4b02, 0x2400,
+       0xa305, 0x00c0, 0x4b0d, 0x0078, 0x4b33, 0x2c58, 0x2704, 0x6104,
+       0xac60, 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e, 0xa184,
+       0x0008, 0x0040, 0x4b23, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014,
+       0xa081, 0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c,
+       0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x1078,
+       0x4a92, 0x0078, 0x4b35, 0x1078, 0x4c18, 0x00c0, 0x4b33, 0x127f,
+       0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x7007,
+       0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4b41, 0x7003, 0x0008,
+       0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f,
+       0x2049, 0x4b4b, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
+       0x4b54, 0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186,
+       0x0007, 0x0040, 0x4b67, 0xa18e, 0x000f, 0x00c0, 0x4b72, 0x681c,
+       0xa084, 0x0040, 0x0040, 0x4b6e, 0xa6b5, 0x0001, 0x6840, 0x2050,
+       0x0078, 0x4b7b, 0x681c, 0xa084, 0x0020, 0x00c0, 0x4b79, 0xa6b5,
+       0x0001, 0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8,
+       0x491d, 0x273c, 0x87fb, 0x00c0, 0x4b8f, 0x0048, 0x4b89, 0x1078,
+       0x248c, 0x689c, 0xa065, 0x0040, 0x4b93, 0x0078, 0x4b7c, 0x1078,
+       0x4c18, 0x00c0, 0x4b8f, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e,
+       0x017e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f, 0x047f, 0x7e08,
+       0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040,
+       0x4bad, 0xa18e, 0x000f, 0x00c0, 0x4bb6, 0x681c, 0xa084, 0x0040,
+       0x0040, 0x4bbd, 0xa6b5, 0x0001, 0x0078, 0x4bbd, 0x681c, 0xa084,
+       0x0040, 0x0040, 0x4bbd, 0xa6b5, 0x0001, 0x2049, 0x4b96, 0x017e,
+       0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4bcb, 0xa18e,
+       0x000f, 0x00c0, 0x4bce, 0x6840, 0x0078, 0x4bcf, 0x6828, 0x017f,
+       0xa055, 0x0040, 0x4c15, 0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f,
+       0xa7b8, 0x491d, 0x273c, 0x87fb, 0x00c0, 0x4be9, 0x0048, 0x4be2,
+       0x1078, 0x248c, 0x709c, 0xa075, 0x2060, 0x0040, 0x4c15, 0x0078,
+       0x4bd5, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0048,
+       0x4c02, 0x8a51, 0x00c0, 0x4bf6, 0x1078, 0x248c, 0x8738, 0x2704,
+       0xa005, 0x00c0, 0x4bea, 0x709c, 0xa075, 0x2060, 0x0040, 0x4c15,
+       0x0078, 0x4bd5, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x6908,
+       0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x00c8, 0x4c11, 0x1078,
+       0x248c, 0x2071, 0x0020, 0x0078, 0x4b00, 0x127f, 0x2000, 0x007c,
+       0x7008, 0xa084, 0x0003, 0xa086, 0x0003, 0x0040, 0x4c40, 0x2704,
+       0xac08, 0x2104, 0x701a, 0x8108, 0x2104, 0x701e, 0x8108, 0x2104,
+       0x7012, 0x8108, 0x2104, 0x7016, 0x6004, 0xa084, 0x0008, 0x0040,
+       0x4c37, 0x8108, 0x2104, 0x7022, 0x8108, 0x2104, 0x7026, 0x7602,
+       0x7004, 0xa084, 0x0010, 0xa085, 0x0001, 0x7006, 0x1078, 0x4a92,
+       0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x2200, 0x2049, 0x4c41,
+       0x0d7f, 0x087f, 0x7108, 0xa184, 0x0003, 0x00c0, 0x4c6b, 0x017e,
+       0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4c5b, 0xa18e,
+       0x000f, 0x00c0, 0x4c5e, 0x6840, 0x0078, 0x4c5f, 0x6828, 0x017f,
+       0xa005, 0x0040, 0x4c79, 0x0078, 0x489e, 0x0020, 0x4c6b, 0x1078,
+       0x4a55, 0x0078, 0x4c79, 0x00a0, 0x4c72, 0x7108, 0x1078, 0x49ce,
+       0x0078, 0x4c4a, 0x7007, 0x0010, 0x00a0, 0x4c74, 0x7108, 0x1078,
+       0x49ce, 0x7008, 0xa086, 0x0008, 0x00c0, 0x4c4a, 0x7000, 0xa005,
+       0x00c0, 0x4c4a, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000,
+       0x007c, 0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x2091,
+       0x2200, 0x0d7f, 0x2049, 0x4c89, 0xad80, 0x0011, 0x20a0, 0x2099,
+       0x0031, 0x700c, 0xa084, 0x00ff, 0x682a, 0x7007, 0x0008, 0x7007,
+       0x0002, 0x7003, 0x0001, 0x0040, 0x4ca8, 0x8000, 0x80ac, 0x53a5,
+       0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4caa, 0x0c7f,
+       0x2049, 0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f,
+       0x2000, 0x007c, 0x2091, 0x6000, 0x2091, 0x8000, 0x78cc, 0xa005,
+       0x0040, 0x4cd1, 0x7994, 0x70d0, 0xa106, 0x00c0, 0x4cd1, 0x7804,
+       0xa005, 0x0040, 0x4cd1, 0x7807, 0x0000, 0x0068, 0x4cd1, 0x2091,
+       0x4080, 0x7820, 0x8001, 0x7822, 0x00c0, 0x4d2c, 0x7824, 0x7822,
+       0x2069, 0x5240, 0x6800, 0xa084, 0x0007, 0x0040, 0x4cef, 0xa086,
+       0x0002, 0x0040, 0x4cef, 0x6834, 0xa00d, 0x0040, 0x4cef, 0x2104,
+       0xa005, 0x0040, 0x4cef, 0x8001, 0x200a, 0x0040, 0x4dd4, 0x7848,
+       0xa005, 0x0040, 0x4cfd, 0x8001, 0x784a, 0x00c0, 0x4cfd, 0x2009,
+       0x0102, 0x6844, 0x200a, 0x1078, 0x226f, 0x6890, 0xa005, 0x0040,
+       0x4d09, 0x8001, 0x6892, 0x00c0, 0x4d09, 0x686f, 0x0000, 0x6873,
+       0x0001, 0x2061, 0x5500, 0x20a9, 0x0100, 0x2009, 0x0002, 0x6034,
+       0xa005, 0x0040, 0x4d1f, 0x8001, 0x6036, 0x00c0, 0x4d1f, 0x6010,
+       0xa005, 0x0040, 0x4d1f, 0x017e, 0x1078, 0x226f, 0x017f, 0xace0,
+       0x0010, 0x0070, 0x4d25, 0x0078, 0x4d0f, 0x8109, 0x0040, 0x4d2c,
+       0x20a9, 0x0100, 0x0078, 0x4d0f, 0x1078, 0x4d39, 0x1078, 0x4d5e,
+       0x2009, 0x5251, 0x2104, 0x2009, 0x0102, 0x200a, 0x2091, 0x8001,
+       0x007c, 0x7834, 0x8001, 0x7836, 0x00c0, 0x4d5d, 0x7838, 0x7836,
+       0x2091, 0x8000, 0x7844, 0xa005, 0x00c0, 0x4d48, 0x2001, 0x0101,
+       0x8001, 0x7846, 0xa080, 0x7500, 0x2040, 0x2004, 0xa065, 0x0040,
+       0x4d5d, 0x6024, 0xa005, 0x0040, 0x4d59, 0x8001, 0x6026, 0x0040,
+       0x4d8d, 0x6000, 0x2c40, 0x0078, 0x4d4e, 0x007c, 0x7828, 0x8001,
+       0x782a, 0x00c0, 0x4d8c, 0x782c, 0x782a, 0x7830, 0xa005, 0x00c0,
+       0x4d6b, 0x2001, 0x0200, 0x8001, 0x7832, 0x8003, 0x8003, 0x8003,
+       0x8003, 0xa090, 0x5500, 0xa298, 0x0002, 0x2304, 0xa084, 0x0008,
+       0x0040, 0x4d8c, 0xa290, 0x0009, 0x2204, 0xa005, 0x0040, 0x4d84,
+       0x8001, 0x2012, 0x00c0, 0x4d8c, 0x2304, 0xa084, 0xfff7, 0xa085,
+       0x0080, 0x201a, 0x1078, 0x226f, 0x007c, 0x2069, 0x5240, 0x6800,
+       0xa005, 0x0040, 0x4d97, 0x6848, 0xac06, 0x0040, 0x4dd4, 0x601b,
+       0x0006, 0x60b4, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff,
+       0xa085, 0x0060, 0x6022, 0x6000, 0x2042, 0x6714, 0x6f82, 0x1078,
+       0x19c5, 0x6818, 0xa005, 0x0040, 0x4daf, 0x8001, 0x681a, 0x6808,
+       0xa084, 0xffef, 0x680a, 0x6810, 0x8001, 0x00d0, 0x4db9, 0x1078,
+       0x248c, 0x6812, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x1078,
+       0x1cdc, 0x2069, 0x5240, 0x7944, 0xa184, 0x0100, 0x2001, 0x0006,
+       0x686e, 0x00c0, 0x4dcf, 0x6986, 0x2001, 0x0004, 0x686e, 0x1078,
+       0x226a, 0x2091, 0x8001, 0x007c, 0x2069, 0x0100, 0x2009, 0x5240,
+       0x2104, 0xa084, 0x0007, 0x0040, 0x4e30, 0xa086, 0x0007, 0x00c0,
+       0x4dea, 0x0d7e, 0x2009, 0x5252, 0x216c, 0x1078, 0x3b1c, 0x0d7f,
+       0x0078, 0x4e30, 0x2009, 0x5252, 0x2164, 0x1078, 0x2437, 0x601b,
+       0x0006, 0x6858, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff,
+       0xa085, 0x0048, 0x6022, 0x602f, 0x0000, 0x6033, 0x0000, 0x6830,
+       0xa084, 0x0040, 0x0040, 0x4e24, 0x684b, 0x0004, 0x20a9, 0x0014,
+       0x6848, 0xa084, 0x0004, 0x0040, 0x4e11, 0x0070, 0x4e11, 0x0078,
+       0x4e08, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001,
+       0x0040, 0x4e1e, 0x0070, 0x4e1e, 0x0078, 0x4e15, 0x20a9, 0x00fa,
+       0x0070, 0x4e24, 0x0078, 0x4e20, 0x6808, 0xa084, 0xfffd, 0x680a,
+       0x681b, 0x0048, 0x2009, 0x525b, 0x200b, 0x0007, 0x784c, 0x784a,
+       0x2091, 0x8001, 0x007c, 0x2079, 0x5200, 0x1078, 0x4e5e, 0x1078,
+       0x4e42, 0x1078, 0x4e50, 0x7833, 0x0000, 0x7847, 0x0000, 0x784b,
+       0x0000, 0x007c, 0x2019, 0x0003, 0x2011, 0x5246, 0x2204, 0xa086,
+       0x003c, 0x0040, 0x4e4d, 0x2019, 0x0002, 0x7b2a, 0x7b2e, 0x007c,
+       0x2019, 0x0039, 0x2011, 0x5246, 0x2204, 0xa086, 0x003c, 0x0040,
+       0x4e5b, 0x2019, 0x0027, 0x7b36, 0x7b3a, 0x007c, 0x2019, 0x3971,
+       0x2011, 0x5246, 0x2204, 0xa086, 0x003c, 0x0040, 0x4e69, 0x2019,
+       0x2626, 0x7b22, 0x7b26, 0x783f, 0x0000, 0x7843, 0x000a, 0x007c,
+       0x0020, 0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
+       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
+       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
+       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
+       0x0000, 0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014, 0x0014,
+       0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0080, 0x000f, 0x0000,
+       0x0201, 0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018, 0x300b,
+       0xa201, 0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0x0000, 0x006c,
+       0x0002, 0x0014, 0x98cd, 0x009e, 0x0093, 0xa202, 0x8838, 0x3806,
+       0x8839, 0x20c3, 0x0864, 0x9885, 0x28c1, 0x9cae, 0xa203, 0x300c,
+       0x2846, 0x8161, 0x846a, 0x8300, 0x1856, 0x883a, 0x9865, 0x28f2,
+       0x9c91, 0x9858, 0x300c, 0x28e1, 0x9c91, 0x2802, 0xa206, 0x64c3,
+       0x282e, 0xa207, 0x64a0, 0x6de0, 0x67a0, 0x6fc0, 0x1814, 0x883b,
+       0x7824, 0x68c1, 0x7864, 0x883e, 0x9879, 0x8576, 0x8677, 0x206b,
+       0x28c1, 0x9cae, 0x2044, 0x2103, 0x20a2, 0x2081, 0x9865, 0xa209,
+       0x2901, 0x988d, 0x0014, 0xa205, 0xa300, 0x1872, 0x879a, 0x883c,
+       0x1fe2, 0xc601, 0xa20a, 0x856e, 0x0704, 0x9c91, 0x0014, 0xa204,
+       0xa300, 0x3009, 0x19e2, 0xf864, 0x856e, 0x883f, 0x08e6, 0x9891,
+       0xf881, 0x988c, 0xc801, 0x0014, 0xf8c1, 0x0016, 0x85b2, 0x80f0,
+       0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532, 0xf241, 0x0014, 0x1de2,
+       0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208, 0x6043, 0x8008, 0x1dc1,
+       0x0016, 0x8300, 0x8160, 0x842a, 0xf041, 0x3008, 0x84a8, 0x11d6,
+       0x7042, 0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016, 0x8000, 0x2847,
+       0x1011, 0x98c0, 0x8000, 0xa000, 0x2802, 0x1011, 0x98c6, 0x9865,
+       0x283e, 0x1011, 0x98ca, 0xa20b, 0x0017, 0x300c, 0xa300, 0x1de2,
+       0xdb81, 0x0014, 0x0210, 0x98d7, 0x0014, 0x26e0, 0x873a, 0xfb02,
+       0x19f2, 0x1fe2, 0x0014, 0xa20d, 0x3806, 0x0210, 0x9cb3, 0x0704,
+       0x0000, 0x006c, 0x0002, 0x984f, 0x0014, 0x009e, 0x00a0, 0x0017,
+       0x60ff, 0x300c, 0x8720, 0xa211, 0x9cd0, 0x8772, 0x8837, 0x2101,
+       0x987a, 0x10d2, 0x78e2, 0x9cd3, 0x9859, 0xd984, 0xf0e2, 0xf0a1,
+       0x98cd, 0x0014, 0x8831, 0xd166, 0x8830, 0x800f, 0x9401, 0xb520,
+       0xc802, 0x8820, 0x987a, 0x2301, 0x987a, 0x10d2, 0x78e4, 0x9cd3,
+       0x8821, 0x8820, 0x9859, 0xf123, 0xf142, 0xf101, 0x98c6, 0x10d2,
+       0x70f6, 0x8832, 0x8203, 0x870c, 0xd99e, 0x6001, 0x0014, 0x6845,
+       0x0214, 0xa21b, 0x9cd0, 0x2001, 0x98c5, 0x8201, 0x1852, 0xd184,
+       0xd163, 0x8834, 0x8001, 0x988d, 0x3027, 0x84a8, 0x1a56, 0x8833,
+       0x0014, 0xa218, 0x6981, 0x9cbc, 0x6926, 0x6902, 0x1a34, 0x9899,
+       0x1a14, 0x7021, 0x0014, 0xa300, 0x6141, 0x6964, 0x8010, 0x8592,
+       0x8026, 0x84b9, 0x69e4, 0x8023, 0x16e1, 0x8001, 0x10f1, 0x6946,
+       0xa213, 0x1462, 0xa213, 0x8000, 0x16e1, 0x98b5, 0x6969, 0xa214,
+       0x61c2, 0x8002, 0x14e1, 0x8004, 0x16e1, 0x0101, 0x300a, 0x8827,
+       0x0014, 0xa217, 0x9cbc, 0x0014, 0xa300, 0x8181, 0x842a, 0x84a8,
+       0x1ce6, 0x882c, 0x0016, 0xa212, 0x9cd0, 0x10d2, 0x70e4, 0x0004,
+       0x8007, 0x9424, 0xcc1a, 0x9cd3, 0x98c5, 0x8827, 0x300a, 0x0013,
+       0x8000, 0x84a4, 0x0016, 0x11c2, 0x211e, 0x870e, 0xa21d, 0x0014,
+       0x878e, 0x0016, 0xa21c, 0x1035, 0x9891, 0xa210, 0xa000, 0x8010,
+       0x8592, 0x853b, 0xd044, 0x8022, 0x3807, 0x84bb, 0x98ea, 0x8021,
+       0x3807, 0x84b9, 0x300c, 0x817e, 0x872b, 0x8772, 0x9891, 0x0000,
+       0x0020, 0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
+       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
+       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
+       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
+       0x0000, 0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014, 0x0014,
+       0x98e2, 0x98cd, 0x0014, 0x0014, 0x0014, 0x0080, 0x0137, 0x0000,
+       0x0201, 0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018, 0x300b,
+       0xa201, 0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0xa202, 0x8838,
+       0x3806, 0x8839, 0x20c3, 0x0864, 0xa82f, 0x28c1, 0x9cae, 0xa203,
+       0x300c, 0x2846, 0x8161, 0x846a, 0x8300, 0x1856, 0x883a, 0xa804,
+       0x28f2, 0x9c91, 0xa8f4, 0x300c, 0x28e1, 0x9c91, 0x2802, 0xa206,
+       0x64c3, 0x282e, 0xa207, 0x64a0, 0x6de0, 0x67a0, 0x6fc0, 0x1814,
+       0x883b, 0x7824, 0x68c1, 0x7864, 0x883e, 0xa802, 0x8576, 0x8677,
+       0x206b, 0x28c1, 0x9cae, 0x2044, 0x2103, 0x20a2, 0x2081, 0xa8e4,
+       0xa209, 0x2901, 0xa809, 0x0014, 0xa205, 0xa300, 0x1872, 0x879a,
+       0x883c, 0x1fe2, 0xc601, 0xa20a, 0x856e, 0x0704, 0x9c91, 0x0014,
+       0xa204, 0xa300, 0x3009, 0x19e2, 0xf864, 0x856e, 0x883f, 0x08e6,
+       0xa8f7, 0xf881, 0xa8f0, 0xc801, 0x0014, 0xf8c1, 0x0016, 0x85b2,
+       0x80f0, 0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532, 0xf241, 0x0014,
+       0x1de2, 0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208, 0x6043, 0x8008,
+       0x1dc1, 0x0016, 0x8300, 0x8160, 0x842a, 0xf041, 0x3008, 0x84a8,
+       0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016, 0x8000,
+       0x2847, 0x1011, 0xa8fc, 0x8000, 0xa000, 0x2802, 0x1011, 0xa8fd,
+       0xa89b, 0x283e, 0x1011, 0xa8fd, 0xa20b, 0x0017, 0x300c, 0xa300,
+       0x1de2, 0xdb81, 0x0014, 0x0210, 0xa801, 0x0014, 0x26e0, 0x873a,
+       0xfb02, 0x19f2, 0x1fe2, 0x0014, 0xa20d, 0x3806, 0x0210, 0x9cb3,
+       0x0704, 0x0017, 0x60ff, 0x300c, 0x8720, 0xa211, 0x9d63, 0x8772,
+       0x8837, 0x2101, 0xa821, 0x10d2, 0x78e2, 0x9d66, 0xa8fc, 0xd984,
+       0xf0e2, 0xf0a1, 0xa86c, 0x0014, 0x8831, 0xd166, 0x8830, 0x800f,
+       0x9401, 0xb520, 0xc802, 0x8820, 0xa80f, 0x2301, 0xa80d, 0x10d2,
+       0x78e4, 0x9d66, 0x8821, 0x8820, 0xa8e6, 0xf123, 0xf142, 0xf101,
+       0xa84f, 0x10d2, 0x70f6, 0x8832, 0x8203, 0x870c, 0xd99e, 0x6001,
+       0x0014, 0x6845, 0x0214, 0xa21b, 0x9d63, 0x2001, 0xa840, 0x8201,
+       0x1852, 0xd184, 0xd163, 0x8834, 0x8001, 0xa801, 0x3027, 0x84a8,
+       0x1a56, 0x8833, 0x0014, 0xa218, 0x6981, 0x9d4f, 0x6926, 0x6902,
+       0x1a34, 0xa801, 0x1a14, 0x7021, 0x0014, 0xa300, 0x6141, 0x6964,
+       0x8010, 0x8592, 0x8026, 0x84b9, 0x69e4, 0x8023, 0x16e1, 0x8001,
+       0x10f1, 0x6946, 0xa213, 0x1462, 0xa213, 0x8000, 0x16e1, 0xa807,
+       0x6969, 0xa214, 0x61c2, 0x8002, 0x14e1, 0x8004, 0x16e1, 0x0101,
+       0x300a, 0x8827, 0x0014, 0xa217, 0x9d4f, 0x0014, 0xa300, 0x8181,
+       0x842a, 0x84a8, 0x1ce6, 0x882c, 0x0016, 0xa212, 0x9d63, 0x10d2,
+       0x70e4, 0x0004, 0x8007, 0x9424, 0xcc1a, 0x9d66, 0xa8f8, 0x8827,
+       0x300a, 0x0013, 0x8000, 0x84a4, 0x0016, 0x11c2, 0x211e, 0x870e,
+       0xa21d, 0x0014, 0x878e, 0x0016, 0xa21c, 0x1035, 0xa8b4, 0xa210,
+       0x3807, 0x300c, 0x817e, 0x872b, 0x8772, 0xa8ad, 0x0000, 0x0d0c
 };
-static unsigned short   risc_code_length01 = 0x4057;
-
+static unsigned short risc_code_length01 = 0x4158;
index 9db6a208c9f862e0d6c995a1a2d4e477b9f27b65..d89dac0cc9d4aa75544c17af6fc7a4f424f19a96 100644 (file)
  ************************************************************************/
 
 /*
- *     Firmware Version 10.04.32 (12:03 May 09, 2001)
+ *     Firmware Version 10.04.42 (15:44 Apr 18, 2003)
  */
 
 #ifdef UNIQUE_FW_NAME
-static unsigned char fw12160i_version_str[] = {10,4,32};
+static unsigned char fw12160i_version_str[] = {10,4,42};
 #else
-static unsigned char firmware_version[] = {10,4,32};
+static unsigned char firmware_version[] = {10,4,42};
 #endif
 
 #ifdef UNIQUE_FW_NAME
-#define fw12160i_VERSION_STRING "10.04.32"
+#define fw12160i_VERSION_STRING "10.04.42"
 #else
-#define FW_VERSION_STRING "10.04.32"
+#define FW_VERSION_STRING "10.04.42"
 #endif
 
 #ifdef UNIQUE_FW_NAME
@@ -48,7 +48,7 @@ static unsigned short fw12160i_code01[] = {
 #else
 static unsigned short risc_code01[] = {
 #endif
-       0x0804, 0x1041, 0x0000, 0x35e6, 0x0000, 0x2043, 0x4f50, 0x5952,
+       0x0804, 0x1041, 0x0000, 0x36c9, 0x0000, 0x2043, 0x4f50, 0x5952,
        0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31,
        0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320,
        0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350,
@@ -56,112 +56,112 @@ static unsigned short risc_code01[] = {
        0x6572, 0x7369, 0x6f6e, 0x2031, 0x302e, 0x3034, 0x2020, 0x2043,
        0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3030, 0x2050,
        0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020, 0x3030, 0x2020,
-       0x2400, 0x20c9, 0x8fff, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2001,
+       0x2400, 0x20c9, 0x90ff, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2001,
        0x01ff, 0x2004, 0xd0fc, 0x1120, 0x2071, 0x0100, 0x70a0, 0x70a2,
        0x20c1, 0x0020, 0x2089, 0x1221, 0x2071, 0x0010, 0x70c3, 0x0004,
        0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x000a,
        0x2001, 0x04fd, 0x2004, 0x70d6, 0x2009, 0xfeff, 0x2130, 0x2128,
-       0xa1a2, 0x4600, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424,
-       0xa192, 0x9000, 0x2009, 0x0000, 0x2001, 0x0032, 0x080c, 0x1de8,
-       0x2218, 0x2079, 0x4600, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9,
+       0xa1a2, 0x4700, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424,
+       0xa192, 0x9100, 0x2009, 0x0000, 0x2001, 0x0032, 0x080c, 0x1e05,
+       0x2218, 0x2079, 0x4700, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9,
        0x0040, 0x42a4, 0x8109, 0x1dd8, 0x2009, 0xff00, 0x3400, 0xa102,
        0x0218, 0x0110, 0x20a8, 0x42a4, 0x781b, 0x0064, 0x7814, 0xc0cd,
-       0xc0d5, 0x7816, 0x2071, 0x0200, 0x00d6, 0x2069, 0x4640, 0x080c,
-       0x459a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1130, 0x2069, 0x4680,
-       0x2071, 0x0100, 0x080c, 0x459a, 0x7814, 0xc0d4, 0x7816, 0x00de,
+       0xc0d5, 0x7816, 0x2071, 0x0200, 0x00d6, 0x2069, 0x4740, 0x080c,
+       0x465c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1130, 0x2069, 0x4780,
+       0x2071, 0x0100, 0x080c, 0x465c, 0x7814, 0xc0d4, 0x7816, 0x00de,
        0x7eca, 0x7cc2, 0x7bc6, 0x7867, 0x0000, 0x7800, 0xc08d, 0x7802,
        0x2031, 0x0030, 0x78af, 0x0101, 0x7823, 0x0002, 0x7827, 0x0002,
-       0x2009, 0x0002, 0x2069, 0x4640, 0x681b, 0x0003, 0x6823, 0x0007,
+       0x2009, 0x0002, 0x2069, 0x4740, 0x681b, 0x0003, 0x6823, 0x0007,
        0x6827, 0x00fa, 0x682b, 0x0008, 0x682f, 0x0028, 0x6837, 0x0006,
        0x6833, 0x0008, 0x683b, 0x0000, 0x8109, 0x0500, 0x68cf, 0x000a,
-       0x68bf, 0x46c0, 0x2079, 0x4600, 0x68d3, 0x762d, 0x68c3, 0x4bc0,
-       0x68c7, 0x4ac0, 0x68cb, 0x8bc0, 0x68a7, 0x8e44, 0x68ab, 0x8e49,
-       0x68af, 0x8e44, 0x68b3, 0x8e44, 0x68a3, 0x0001, 0x2001, 0x01ff,
-       0x2004, 0xd0fc, 0x11c8, 0x2069, 0x4680, 0x0870, 0x68cf, 0x000a,
-       0x68bf, 0x48c0, 0x68d3, 0x7839, 0x68c3, 0x6bc0, 0x68c7, 0x4b40,
-       0x68cb, 0x8cd0, 0x68a7, 0x8e49, 0x68ab, 0x8e4e, 0x68af, 0x8e49,
-       0x68b3, 0x8e49, 0x68a3, 0x0001, 0x00e6, 0x2069, 0x4ac0, 0x2071,
+       0x68bf, 0x47c0, 0x2079, 0x4700, 0x68d3, 0x762d, 0x68c3, 0x4cc0,
+       0x68c7, 0x4bc0, 0x68cb, 0x8cc0, 0x68a7, 0x8f44, 0x68ab, 0x8f49,
+       0x68af, 0x8f44, 0x68b3, 0x8f44, 0x68a3, 0x0001, 0x2001, 0x01ff,
+       0x2004, 0xd0fc, 0x11c8, 0x2069, 0x4780, 0x0870, 0x68cf, 0x000a,
+       0x68bf, 0x49c0, 0x68d3, 0x7839, 0x68c3, 0x6cc0, 0x68c7, 0x4c40,
+       0x68cb, 0x8dd0, 0x68a7, 0x8f49, 0x68ab, 0x8f4e, 0x68af, 0x8f49,
+       0x68b3, 0x8f49, 0x68a3, 0x0001, 0x00e6, 0x2069, 0x4bc0, 0x2071,
        0x0200, 0x70ec, 0xd0e4, 0x2019, 0x1809, 0x2021, 0x0009, 0x1120,
-       0x2019, 0x180c, 0x2021, 0x000c, 0x080c, 0x1d58, 0x2001, 0x01ff,
-       0x2004, 0xd0fc, 0x1188, 0x2069, 0x4b40, 0x2071, 0x0100, 0x70ec,
+       0x2019, 0x180c, 0x2021, 0x000c, 0x080c, 0x1d75, 0x2001, 0x01ff,
+       0x2004, 0xd0fc, 0x1188, 0x2069, 0x4c40, 0x2071, 0x0100, 0x70ec,
        0xd0e4, 0x2019, 0x1809, 0x2021, 0x0009, 0x1120, 0x2019, 0x180c,
-       0x2021, 0x000c, 0x080c, 0x1d58, 0x00ee, 0x2011, 0x0002, 0x2069,
-       0x4bc0, 0x2009, 0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b,
+       0x2021, 0x000c, 0x080c, 0x1d75, 0x00ee, 0x2011, 0x0002, 0x2069,
+       0x4cc0, 0x2009, 0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b,
        0x0040, 0x7bc8, 0xa386, 0xfeff, 0x1128, 0x6817, 0x0100, 0x681f,
        0x0064, 0x0020, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010,
        0x1f04, 0x1135, 0x8109, 0x1d38, 0x2001, 0x01ff, 0x2004, 0xd0fc,
-       0x1128, 0x8211, 0x0118, 0x2069, 0x6bc0, 0x08d8, 0x080c, 0x22cf,
-       0x080c, 0x4015, 0x080c, 0x1b6d, 0x080c, 0x4553, 0x2091, 0x2200,
-       0x2079, 0x4600, 0x2071, 0x0050, 0x2091, 0x2400, 0x2079, 0x4600,
-       0x2071, 0x0020, 0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x4640,
-       0x2091, 0x2800, 0x2079, 0x0100, 0x2071, 0x4680, 0x2091, 0x2000,
-       0x2079, 0x4600, 0x2071, 0x0010, 0x3200, 0xa085, 0x303d, 0x2090,
+       0x1128, 0x8211, 0x0118, 0x2069, 0x6cc0, 0x08d8, 0x080c, 0x22f6,
+       0x080c, 0x403d, 0x080c, 0x1b8c, 0x080c, 0x4615, 0x2091, 0x2200,
+       0x2079, 0x4700, 0x2071, 0x0050, 0x2091, 0x2400, 0x2079, 0x4700,
+       0x2071, 0x0020, 0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x4740,
+       0x2091, 0x2800, 0x2079, 0x0100, 0x2071, 0x4780, 0x2091, 0x2000,
+       0x2079, 0x4700, 0x2071, 0x0010, 0x3200, 0xa085, 0x303d, 0x2090,
        0x2071, 0x0010, 0x70c3, 0x0000, 0x1004, 0x118c, 0x70c0, 0xa086,
        0x0002, 0x1110, 0x080c, 0x13ba, 0x2039, 0x0000, 0x080c, 0x12ab,
        0x78ac, 0xa005, 0x1180, 0x0e04, 0x119a, 0x786c, 0xa065, 0x0110,
-       0x080c, 0x207a, 0x080c, 0x1e09, 0x0e04, 0x11af, 0x786c, 0xa065,
-       0x0110, 0x080c, 0x207a, 0x0e04, 0x11af, 0x2009, 0x4647, 0x2011,
-       0x4687, 0x2104, 0x220c, 0xa105, 0x0110, 0x080c, 0x1c7c, 0x2071,
-       0x4640, 0x70a0, 0xa005, 0x01e8, 0x744c, 0xa485, 0x0000, 0x01c8,
+       0x080c, 0x20a1, 0x080c, 0x1e26, 0x0e04, 0x11af, 0x786c, 0xa065,
+       0x0110, 0x080c, 0x20a1, 0x0e04, 0x11af, 0x2009, 0x4747, 0x2011,
+       0x4787, 0x2104, 0x220c, 0xa105, 0x0110, 0x080c, 0x1c9b, 0x2071,
+       0x4740, 0x70a0, 0xa005, 0x01e8, 0x744c, 0xa485, 0x0000, 0x01c8,
        0x2079, 0x0200, 0x2091, 0x8000, 0x72d0, 0xa28c, 0x303d, 0x2190,
-       0x080c, 0x2720, 0x2091, 0x8000, 0x2091, 0x303d, 0x0e04, 0x11d1,
-       0x2079, 0x4600, 0x786c, 0xa065, 0x0120, 0x2071, 0x0010, 0x080c,
-       0x207a, 0x1d04, 0x11d9, 0x2079, 0x4600, 0x2071, 0x0010, 0x080c,
-       0x4370, 0x2071, 0x4680, 0x70a0, 0xa005, 0x0188, 0x704c, 0xa025,
+       0x080c, 0x274c, 0x2091, 0x8000, 0x2091, 0x303d, 0x0e04, 0x11d1,
+       0x2079, 0x4700, 0x786c, 0xa065, 0x0120, 0x2071, 0x0010, 0x080c,
+       0x20a1, 0x1d04, 0x11d9, 0x2079, 0x4700, 0x2071, 0x0010, 0x080c,
+       0x4429, 0x2071, 0x4780, 0x70a0, 0xa005, 0x0188, 0x704c, 0xa025,
        0x0170, 0x2079, 0x0100, 0x2091, 0x8000, 0x72d0, 0xa28c, 0x303d,
-       0x2190, 0x080c, 0x2720, 0x2091, 0x8000, 0x2091, 0x303d, 0x2079,
-       0x4600, 0x2071, 0x0010, 0x0e04, 0x11fa, 0x786c, 0xa065, 0x0110,
-       0x080c, 0x207a, 0x1d04, 0x118e, 0x080c, 0x4370, 0x0804, 0x118e,
+       0x2190, 0x080c, 0x274c, 0x2091, 0x8000, 0x2091, 0x303d, 0x2079,
+       0x4700, 0x2071, 0x0010, 0x0e04, 0x11fa, 0x786c, 0xa065, 0x0110,
+       0x080c, 0x20a1, 0x1d04, 0x118e, 0x080c, 0x4429, 0x0804, 0x118e,
        0x3c00, 0xa084, 0x0007, 0x0002, 0x120c, 0x120c, 0x120e, 0x120e,
-       0x1213, 0x1213, 0x1218, 0x1218, 0x080c, 0x254c, 0x2091, 0x2400,
-       0x080c, 0x40ad, 0x0005, 0x2091, 0x2200, 0x080c, 0x40ad, 0x0005,
-       0x2091, 0x2200, 0x080c, 0x40ad, 0x2091, 0x2400, 0x080c, 0x40ad,
+       0x1213, 0x1213, 0x1218, 0x1218, 0x080c, 0x2575, 0x2091, 0x2400,
+       0x080c, 0x40d5, 0x0005, 0x2091, 0x2200, 0x080c, 0x40d5, 0x0005,
+       0x2091, 0x2200, 0x080c, 0x40d5, 0x2091, 0x2400, 0x080c, 0x40d5,
        0x0005, 0x1241, 0x1241, 0x1242, 0x1242, 0x124d, 0x124d, 0x124d,
        0x124d, 0x1256, 0x1256, 0x1261, 0x1261, 0x124d, 0x124d, 0x124d,
        0x124d, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270,
        0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270,
        0x1270, 0x0cf8, 0x0006, 0x0106, 0x0126, 0x2091, 0x2800, 0x080c,
-       0x2569, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106, 0x0126,
+       0x2592, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106, 0x0126,
        0x080c, 0x1200, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106,
-       0x0126, 0x2091, 0x2600, 0x080c, 0x2569, 0x012e, 0x010e, 0x000e,
-       0x000d, 0x0006, 0x0106, 0x0126, 0x2091, 0x2600, 0x080c, 0x2569,
-       0x2091, 0x2800, 0x080c, 0x2569, 0x012e, 0x010e, 0x000e, 0x000d,
-       0x0006, 0x0106, 0x0126, 0x00d6, 0x00e6, 0x00f6, 0x2079, 0x4600,
-       0x2071, 0x0200, 0x2069, 0x4640, 0x3d00, 0xd08c, 0x0130, 0x70ec,
-       0xa084, 0x1c00, 0x78e2, 0x080c, 0x459a, 0x3d00, 0xd084, 0x0150,
-       0x2069, 0x4680, 0x2071, 0x0100, 0x70ec, 0xa084, 0x1c00, 0x78e6,
-       0x080c, 0x459a, 0x080c, 0x24fd, 0x00fe, 0x00ee, 0x00de, 0x012e,
+       0x0126, 0x2091, 0x2600, 0x080c, 0x2592, 0x012e, 0x010e, 0x000e,
+       0x000d, 0x0006, 0x0106, 0x0126, 0x2091, 0x2600, 0x080c, 0x2592,
+       0x2091, 0x2800, 0x080c, 0x2592, 0x012e, 0x010e, 0x000e, 0x000d,
+       0x0006, 0x0106, 0x0126, 0x00d6, 0x00e6, 0x00f6, 0x2079, 0x4700,
+       0x2071, 0x0200, 0x2069, 0x4740, 0x3d00, 0xd08c, 0x0130, 0x70ec,
+       0xa084, 0x1c00, 0x78e2, 0x080c, 0x465c, 0x3d00, 0xd084, 0x0150,
+       0x2069, 0x4780, 0x2071, 0x0100, 0x70ec, 0xa084, 0x1c00, 0x78e6,
+       0x080c, 0x465c, 0x080c, 0x2526, 0x00fe, 0x00ee, 0x00de, 0x012e,
        0x010e, 0x000e, 0x000d, 0x7008, 0x800b, 0x1240, 0x7007, 0x0002,
        0xa08c, 0x01e0, 0x1120, 0xd09c, 0x0108, 0x0887, 0x0897, 0x70c3,
        0x4002, 0x0804, 0x13bd, 0x0e04, 0x131e, 0x2061, 0x0000, 0x6018,
        0xd084, 0x1904, 0x131e, 0x7828, 0xa005, 0x1120, 0x0004, 0x131f,
-       0x0804, 0x131e, 0xd0fc, 0x0130, 0x0006, 0x080c, 0x1b0a, 0x000e,
-       0x0150, 0x0028, 0x0006, 0x080c, 0x1aff, 0x000e, 0x0120, 0x2001,
-       0x4007, 0x0804, 0x13bc, 0x7910, 0xd0fc, 0x1128, 0x2061, 0x4640,
-       0xc19c, 0xc7fc, 0x0020, 0x2061, 0x4680, 0xc19d, 0xc7fd, 0x6060,
+       0x0804, 0x131e, 0xd0fc, 0x0130, 0x0006, 0x080c, 0x1b29, 0x000e,
+       0x0150, 0x0028, 0x0006, 0x080c, 0x1b1e, 0x000e, 0x0120, 0x2001,
+       0x4007, 0x0804, 0x13bc, 0x7910, 0xd0fc, 0x1128, 0x2061, 0x4740,
+       0xc19c, 0xc7fc, 0x0020, 0x2061, 0x4780, 0xc19d, 0xc7fd, 0x6060,
        0xa005, 0x1904, 0x131e, 0x7912, 0x607e, 0x7828, 0xc0fc, 0xa086,
-       0x0018, 0x1120, 0x00c6, 0x080c, 0x1916, 0x00ce, 0x782b, 0x0000,
-       0x6078, 0xa065, 0x01e0, 0x00c6, 0x609c, 0x080c, 0x1bd4, 0x00ce,
-       0x609f, 0x0000, 0x080c, 0x1a41, 0x2009, 0x0018, 0x6087, 0x0103,
+       0x0018, 0x1120, 0x00c6, 0x080c, 0x1926, 0x00ce, 0x782b, 0x0000,
+       0x6078, 0xa065, 0x01e0, 0x00c6, 0x609c, 0x080c, 0x1bf3, 0x00ce,
+       0x609f, 0x0000, 0x080c, 0x1a60, 0x2009, 0x0018, 0x6087, 0x0103,
        0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812,
-       0x080c, 0x1b15, 0x000e, 0x7812, 0x1198, 0x080c, 0x1b60, 0x7810,
-       0xd09c, 0x1118, 0x2061, 0x4640, 0x0020, 0x2061, 0x4680, 0xc09c,
+       0x080c, 0x1b34, 0x000e, 0x7812, 0x1198, 0x080c, 0x1b7f, 0x7810,
+       0xd09c, 0x1118, 0x2061, 0x4740, 0x0020, 0x2061, 0x4780, 0xc09c,
        0x7812, 0x607b, 0x0000, 0x60d0, 0xd0c4, 0x0130, 0xc0c4, 0x60d2,
        0x2001, 0x4005, 0x0804, 0x13bc, 0x0804, 0x13ba, 0x0005, 0xa006,
        0x70c2, 0x70c6, 0x70ca, 0x70ce, 0x70da, 0x70c0, 0xa03d, 0xa08a,
        0x0040, 0x1a04, 0x136c, 0x0002, 0x13ba, 0x1408, 0x13d6, 0x143c,
-       0x1470, 0x1470, 0x13ce, 0x1a59, 0x147a, 0x13c8, 0x13da, 0x13db,
-       0x13dc, 0x13dd, 0x1a5d, 0x13c8, 0x1487, 0x14db, 0x1931, 0x1a53,
-       0x13de, 0x17ba, 0x17f0, 0x1822, 0x1868, 0x1777, 0x1784, 0x1797,
-       0x17a9, 0x15b0, 0x13c8, 0x150d, 0x1518, 0x1526, 0x1534, 0x154b,
-       0x1559, 0x155c, 0x156a, 0x1578, 0x1582, 0x1596, 0x15a2, 0x13c8,
-       0x13c8, 0x13c8, 0x13c8, 0x15bd, 0x15ce, 0x15e8, 0x161c, 0x1645,
-       0x1657, 0x165a, 0x1685, 0x16be, 0x16d0, 0x1745, 0x1755, 0x13c8,
-       0x13c8, 0x13c8, 0x13c8, 0x1767, 0x2100, 0xa08a, 0x0040, 0x1a04,
-       0x13c8, 0x0002, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x1a7f,
-       0x1a85, 0x13c8, 0x13c8, 0x13c8, 0x1a89, 0x1ac9, 0x13c8, 0x13c8,
-       0x13c8, 0x13c8, 0x1403, 0x146b, 0x1482, 0x14d6, 0x192c, 0x13c8,
-       0x13c8, 0x18fb, 0x13c8, 0x1acd, 0x1a71, 0x1a7b, 0x13c8, 0x13c8,
+       0x1470, 0x1470, 0x13ce, 0x1a78, 0x147a, 0x13c8, 0x13da, 0x13db,
+       0x13dc, 0x13dd, 0x1a7c, 0x13c8, 0x1487, 0x14db, 0x1941, 0x1a72,
+       0x13de, 0x17c8, 0x17fe, 0x1830, 0x1876, 0x1785, 0x1792, 0x17a5,
+       0x17b7, 0x15bf, 0x13c8, 0x150d, 0x1518, 0x1526, 0x1534, 0x154b,
+       0x1559, 0x155c, 0x156e, 0x157c, 0x1586, 0x15a5, 0x15b1, 0x13c8,
+       0x13c8, 0x13c8, 0x13c8, 0x15cc, 0x15dd, 0x15f7, 0x162b, 0x1654,
+       0x1666, 0x1669, 0x1693, 0x16cc, 0x16de, 0x1753, 0x1763, 0x13c8,
+       0x13c8, 0x13c8, 0x13c8, 0x1775, 0x2100, 0xa08a, 0x0040, 0x1a04,
+       0x13c8, 0x0002, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x1a9e,
+       0x1aa4, 0x13c8, 0x13c8, 0x13c8, 0x1aa8, 0x1ae8, 0x13c8, 0x13c8,
+       0x13c8, 0x13c8, 0x1403, 0x146b, 0x1482, 0x14d6, 0x193c, 0x13c8,
+       0x13c8, 0x190b, 0x13c8, 0x1aec, 0x1a90, 0x1a9a, 0x13c8, 0x13c8,
        0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
        0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
        0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
@@ -191,7 +191,7 @@ static unsigned short risc_code01[] = {
        0x0001, 0x7008, 0xd0fc, 0x0de8, 0xa084, 0x01e0, 0x0d48, 0x70c3,
        0x4002, 0x0804, 0x13bd, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0878,
        0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x1108, 0x200a, 0x72ca,
-       0x0804, 0x13b9, 0x70c7, 0x000a, 0x70cb, 0x0004, 0x70cf, 0x0020,
+       0x0804, 0x13b9, 0x70c7, 0x000a, 0x70cb, 0x0004, 0x70cf, 0x002a,
        0x0804, 0x13ba, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0018, 0x2029,
        0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca,
        0x73ce, 0x74d2, 0xa005, 0x05e8, 0xa40a, 0x0108, 0x1240, 0x8001,
@@ -211,1281 +211,1286 @@ static unsigned short risc_code01[] = {
        0xc2c5, 0x7a12, 0x7c96, 0x78ac, 0xa084, 0xfcff, 0x78ae, 0x0018,
        0x78ac, 0xc0c5, 0x78ae, 0x0804, 0x13ba, 0x2009, 0x0000, 0x786c,
        0xa065, 0x0118, 0x8108, 0x6000, 0x0cd8, 0x7ac4, 0x0804, 0x13b8,
-       0x2009, 0x4648, 0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904,
-       0x13b9, 0x2011, 0x4688, 0x2214, 0x0804, 0x13b8, 0x2009, 0x4649,
+       0x2009, 0x4748, 0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904,
+       0x13b9, 0x2011, 0x4788, 0x2214, 0x0804, 0x13b8, 0x2009, 0x4749,
        0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011,
-       0x4689, 0x2214, 0x0804, 0x13b8, 0x2061, 0x4640, 0x6128, 0x622c,
+       0x4789, 0x2214, 0x0804, 0x13b8, 0x2061, 0x4740, 0x6128, 0x622c,
        0x8214, 0x8214, 0x8214, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1148,
-       0x2061, 0x4680, 0x6328, 0x73da, 0x632c, 0x831c, 0x831c, 0x831c,
-       0x73de, 0x0804, 0x13b8, 0x2009, 0x464c, 0x210c, 0x2001, 0x01ff,
-       0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011, 0x468c, 0x2214, 0x0804,
-       0x13b8, 0x7918, 0x0804, 0x13b9, 0x2009, 0x0202, 0x210c, 0x2001,
-       0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011, 0x0102, 0x2214,
-       0x0804, 0x13b8, 0x2009, 0x464d, 0x210c, 0x2001, 0x01ff, 0x2004,
-       0xd0fc, 0x1904, 0x13b9, 0x2011, 0x468d, 0x2214, 0x0804, 0x13b8,
-       0x7920, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x7a24,
-       0x0804, 0x13b8, 0x2011, 0x4b40, 0x71c4, 0xd1fc, 0x1110, 0x2011,
-       0x4ac0, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268,
-       0x6a00, 0x6b08, 0x6c1c, 0x74da, 0x0804, 0x13b7, 0x77c4, 0x080c,
-       0x1b7b, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708,
-       0x0804, 0x13b7, 0x2061, 0x4640, 0x6118, 0x2001, 0x01ff, 0x2004,
-       0xd0fc, 0x1904, 0x13b9, 0x2061, 0x4680, 0x6218, 0x0804, 0x13b8,
-       0x77c4, 0x080c, 0x1b7b, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10,
-       0x77da, 0x2091, 0x8001, 0x0804, 0x13b7, 0x71c4, 0x2110, 0xa294,
-       0x000f, 0xa282, 0x0010, 0x1a04, 0x13b3, 0x080c, 0x238b, 0xa384,
-       0x4000, 0x0110, 0xa295, 0x0020, 0x0804, 0x13b7, 0x71c4, 0x2100,
-       0xc0bc, 0xa082, 0x0010, 0x1a04, 0x13b3, 0xd1bc, 0x1120, 0x2011,
-       0x4648, 0x2204, 0x0020, 0x2011, 0x4688, 0x2204, 0xc0bd, 0x0006,
-       0x2100, 0xc0bc, 0x2012, 0x080c, 0x2331, 0x001e, 0x0804, 0x13b9,
-       0x71c4, 0x2021, 0x4649, 0x2404, 0x70c6, 0x2019, 0x0000, 0x0030,
-       0x71c8, 0x2021, 0x4689, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x1614,
-       0x20a9, 0x0008, 0x2204, 0xa106, 0x0138, 0x8210, 0x1f04, 0x15fa,
-       0x71c4, 0x72c8, 0x0804, 0x13b2, 0xa292, 0x1614, 0x0026, 0x2122,
-       0x001e, 0x080c, 0x2343, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1110,
-       0xd3fc, 0x09f0, 0x0804, 0x13ba, 0x03e8, 0x00fa, 0x01f4, 0x02ee,
-       0x0004, 0x0001, 0x0002, 0x0003, 0x2061, 0x4640, 0x6128, 0x622c,
-       0x8214, 0x8214, 0x8214, 0x70c4, 0x602a, 0x70c8, 0x8003, 0x8003,
-       0x8003, 0x602e, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x11a0, 0x0026,
-       0x0016, 0x2061, 0x4680, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214,
-       0x70d8, 0x602a, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602e, 0x71da,
-       0x72de, 0x001e, 0x002e, 0x0804, 0x13b8, 0x2061, 0x4640, 0x6130,
-       0x70c4, 0x6032, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9,
-       0x2061, 0x4680, 0x6230, 0x70c8, 0x6032, 0x0804, 0x13b8, 0x7918,
-       0x0804, 0x13b9, 0x71c4, 0xa184, 0xf0cf, 0x0148, 0x2001, 0x01ff,
-       0x2004, 0xd0fc, 0x1904, 0x13b3, 0x72c8, 0x0804, 0x13b2, 0x0006,
-       0x2019, 0x0000, 0x080c, 0x237f, 0x2001, 0x01ff, 0x2004, 0xd0fc,
-       0x0118, 0x001e, 0x0804, 0x13b9, 0x71c8, 0xa184, 0xf0cf, 0x0128,
-       0x0006, 0x2110, 0x71c4, 0x0804, 0x13b2, 0x0006, 0xc3fd, 0x080c,
-       0x237f, 0x002e, 0x001e, 0x0804, 0x13b8, 0x71c4, 0xa182, 0x0010,
-       0x0248, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b3, 0x72c8,
-       0x0804, 0x13b2, 0x2011, 0x464d, 0x2204, 0x0006, 0x8104, 0x1208,
-       0x8108, 0x2112, 0x2019, 0x0000, 0x080c, 0x236c, 0x2001, 0x01ff,
-       0x2004, 0xd0fc, 0x0118, 0x001e, 0x0804, 0x13b9, 0x71c8, 0xa182,
-       0x0010, 0x0228, 0x0006, 0x2110, 0x71c4, 0x0804, 0x13b2, 0x2011,
-       0x468d, 0x2204, 0x0006, 0x8104, 0x1208, 0x8108, 0x2112, 0xc3fd,
-       0x080c, 0x236c, 0x002e, 0x001e, 0x0804, 0x13b8, 0x71c4, 0x72c8,
-       0xa184, 0xfffd, 0x1904, 0x13b2, 0xa284, 0xfffd, 0x1904, 0x13b2,
-       0x2100, 0x7920, 0x7822, 0x2200, 0x7a24, 0x7826, 0x0804, 0x13b8,
-       0x2011, 0x4b40, 0x71c4, 0xd1fc, 0x1110, 0x2011, 0x4ac0, 0x8107,
-       0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268, 0x72c8, 0x73cc,
-       0x74d8, 0x71c6, 0x6800, 0x70ca, 0x73ce, 0x74da, 0x2091, 0x8000,
-       0x6a02, 0xd2ac, 0x1118, 0x2021, 0x0000, 0x0090, 0xa484, 0x00ff,
-       0xa082, 0x0002, 0x1a04, 0x1741, 0x843f, 0xa7bc, 0x00ff, 0x0140,
-       0xa786, 0x0002, 0x1904, 0x1741, 0xa484, 0x00ff, 0x0904, 0x1741,
-       0x2061, 0x0200, 0xd1fc, 0x0110, 0x2061, 0x0100, 0x2029, 0x0009,
-       0x2031, 0x0062, 0x843f, 0xa7bc, 0x00ff, 0x0130, 0x8307, 0xa084,
-       0x00ff, 0x1110, 0xa73d, 0x1138, 0x2041, 0x0019, 0xa384, 0x00ff,
-       0xa082, 0x001a, 0x0210, 0xa4a4, 0x00ff, 0x8307, 0xa084, 0x00ff,
-       0x0188, 0xa842, 0x02f0, 0xa086, 0x0010, 0x1120, 0xa39c, 0x00ff,
-       0xa39d, 0x0f00, 0xa3bc, 0x00ff, 0x2500, 0xa702, 0x0290, 0x2600,
-       0xa702, 0x1278, 0x2039, 0x003a, 0x6804, 0xa705, 0x6806, 0x6b0a,
-       0x6b0c, 0x73ce, 0x681c, 0x70da, 0x6c1e, 0x2091, 0x8001, 0x0804,
-       0x13ba, 0x2091, 0x8001, 0x0804, 0x13b4, 0x77c4, 0x080c, 0x1b7b,
-       0x2091, 0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816,
-       0x70cc, 0x681e, 0x2708, 0x0804, 0x13b7, 0x70c4, 0x2061, 0x4640,
-       0x6118, 0x601a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9,
-       0x70c8, 0x2061, 0x4680, 0x6218, 0x601a, 0x0804, 0x13b8, 0x71c4,
-       0x72c8, 0x73cc, 0xa182, 0x0010, 0x1a04, 0x13b3, 0x080c, 0x23af,
-       0xa384, 0x4000, 0x0110, 0xa295, 0x0020, 0x0804, 0x13b7, 0x77c4,
-       0x080c, 0x1b7b, 0x2091, 0x8000, 0x6a08, 0xc28d, 0x6a0a, 0x2091,
-       0x8001, 0x2708, 0x0804, 0x13b8, 0x77c4, 0x080c, 0x1b7b, 0x2091,
-       0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0110,
-       0x080c, 0x22ae, 0x2091, 0x8001, 0x2708, 0x0804, 0x13b8, 0x77c4,
-       0x080c, 0x1b7b, 0x2091, 0x8000, 0x6a08, 0xc295, 0x6a0a, 0x6804,
-       0xa005, 0x0110, 0x080c, 0x22ae, 0x2091, 0x8001, 0x2708, 0x0804,
-       0x13b8, 0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020,
-       0x2091, 0x8000, 0x080c, 0x1b93, 0x2091, 0x8001, 0x2708, 0x6a08,
-       0x0804, 0x13b8, 0x77c4, 0xd7fc, 0x0128, 0x080c, 0x1b0a, 0x0138,
-       0x0804, 0x13bc, 0x080c, 0x1aff, 0x0110, 0x0804, 0x13bc, 0x73c8,
-       0x72cc, 0x77c6, 0x73ca, 0x72ce, 0x080c, 0x1c0b, 0x11e8, 0x6818,
-       0xa005, 0x01a0, 0x2708, 0x0076, 0x080c, 0x23ce, 0x007e, 0x1170,
-       0x2001, 0x0015, 0xd7fc, 0x1118, 0x2061, 0x4640, 0x0018, 0xc0fd,
-       0x2061, 0x4680, 0x782a, 0x2091, 0x8001, 0x0005, 0x2091, 0x8001,
-       0x2001, 0x4005, 0x0804, 0x13bc, 0x2091, 0x8001, 0x0804, 0x13ba,
-       0x77c4, 0xd7fc, 0x0128, 0x080c, 0x1b0a, 0x0138, 0x0804, 0x13bc,
-       0x080c, 0x1aff, 0x0110, 0x0804, 0x13bc, 0x77c6, 0x2041, 0x0021,
-       0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x080c, 0x1b93,
-       0x2009, 0x0016, 0xd7fc, 0x1118, 0x2061, 0x4640, 0x0018, 0x2061,
-       0x4680, 0xc1fd, 0x6063, 0x0003, 0x607b, 0x0000, 0x6772, 0x607f,
-       0x000f, 0x792a, 0x61d0, 0xc1c4, 0x61d2, 0x080c, 0x22ae, 0x2091,
-       0x8001, 0x0005, 0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xd7fc, 0x0128,
-       0x080c, 0x1b0a, 0x0138, 0x0804, 0x13bc, 0x080c, 0x1aff, 0x0110,
-       0x0804, 0x13bc, 0xa7bc, 0xff00, 0x2091, 0x8000, 0x2009, 0x0017,
-       0xd7fc, 0x1118, 0x2061, 0x4640, 0x0018, 0x2061, 0x4680, 0xc1fd,
-       0x607b, 0x0000, 0x6063, 0x0002, 0x6772, 0x607f, 0x000f, 0x792a,
-       0x61d0, 0xc1c4, 0x61d2, 0x080c, 0x22ae, 0x2091, 0x8001, 0x2041,
-       0x0021, 0x2049, 0x0005, 0x2051, 0x0030, 0x2091, 0x8000, 0x70c8,
-       0xa005, 0x0118, 0x60d0, 0xc0fd, 0x60d2, 0x080c, 0x1b93, 0x70c8,
-       0x6836, 0x8738, 0xa784, 0x001f, 0x1dc0, 0x2091, 0x8001, 0x0005,
-       0x2019, 0x0000, 0x72c8, 0xd284, 0x0128, 0x080c, 0x1b0a, 0x0138,
-       0x0804, 0x13bc, 0x080c, 0x1aff, 0x0110, 0x0804, 0x13bc, 0x72c8,
-       0x72ca, 0x78ac, 0xa084, 0x0003, 0x1508, 0x2039, 0x0000, 0xd284,
-       0x0108, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008,
-       0x080c, 0x1b7b, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d, 0x690a,
-       0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x1d90, 0xa7bc, 0xff00,
-       0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x1d50, 0x2091, 0x8000,
+       0x2061, 0x4780, 0x6328, 0x73da, 0x632c, 0x831c, 0x831c, 0x831c,
+       0x73de, 0x0804, 0x13b8, 0x2009, 0x474c, 0x210c, 0x2001, 0x01ff,
+       0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011, 0x478c, 0x2214, 0x0804,
+       0x13b8, 0x7918, 0x0804, 0x13b9, 0x2009, 0x0202, 0x210c, 0xa18c,
+       0x0f30, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011,
+       0x0102, 0x2214, 0xa294, 0x0f30, 0x0804, 0x13b8, 0x2009, 0x474d,
+       0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011,
+       0x478d, 0x2214, 0x0804, 0x13b8, 0x7920, 0x2001, 0x01ff, 0x2004,
+       0xd0fc, 0x1904, 0x13b9, 0x7a24, 0x0804, 0x13b8, 0x2011, 0x4c40,
+       0x71c4, 0xd1fc, 0x1110, 0x2011, 0x4bc0, 0x8107, 0xa084, 0x000f,
+       0x8003, 0x8003, 0x8003, 0xa268, 0x6a00, 0x6b08, 0x6c1c, 0x74da,
+       0xd1fc, 0x1118, 0x2021, 0x023b, 0x0010, 0x2021, 0x013b, 0x2424,
+       0xa4a4, 0x1c00, 0x74de, 0x0804, 0x13b7, 0x77c4, 0x080c, 0x1b9a,
+       0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0804,
+       0x13b7, 0x2061, 0x4740, 0x6118, 0x2001, 0x01ff, 0x2004, 0xd0fc,
+       0x1904, 0x13b9, 0x2061, 0x4780, 0x6218, 0x0804, 0x13b8, 0x77c4,
+       0x080c, 0x1b9a, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x77da,
+       0x2091, 0x8001, 0x0804, 0x13b7, 0x71c4, 0x2110, 0xa294, 0x000f,
+       0xa282, 0x0010, 0x1a04, 0x13b3, 0x080c, 0x23b4, 0xa384, 0x4000,
+       0x0110, 0xa295, 0x0020, 0x0804, 0x13b7, 0x71c4, 0x2100, 0xc0bc,
+       0xa082, 0x0010, 0x1a04, 0x13b3, 0xd1bc, 0x1120, 0x2011, 0x4748,
+       0x2204, 0x0020, 0x2011, 0x4788, 0x2204, 0xc0bd, 0x0006, 0x2100,
+       0xc0bc, 0x2012, 0x080c, 0x2358, 0x001e, 0x0804, 0x13b9, 0x71c4,
+       0x2021, 0x4749, 0x2404, 0x70c6, 0x2019, 0x0000, 0x0030, 0x71c8,
+       0x2021, 0x4789, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x1623, 0x20a9,
+       0x0008, 0x2204, 0xa106, 0x0138, 0x8210, 0x1f04, 0x1609, 0x71c4,
+       0x72c8, 0x0804, 0x13b2, 0xa292, 0x1623, 0x0026, 0x2122, 0x001e,
+       0x080c, 0x236a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1110, 0xd3fc,
+       0x09f0, 0x0804, 0x13ba, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0004,
+       0x0001, 0x0002, 0x0003, 0x2061, 0x4740, 0x6128, 0x622c, 0x8214,
+       0x8214, 0x8214, 0x70c4, 0x602a, 0x70c8, 0x8003, 0x8003, 0x8003,
+       0x602e, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x11a0, 0x0026, 0x0016,
+       0x2061, 0x4780, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214, 0x70d8,
+       0x602a, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602e, 0x71da, 0x72de,
+       0x001e, 0x002e, 0x0804, 0x13b8, 0x2061, 0x4740, 0x6130, 0x70c4,
+       0x6032, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2061,
+       0x4780, 0x6230, 0x70c8, 0x6032, 0x0804, 0x13b8, 0x7918, 0x0804,
+       0x13b9, 0x71c4, 0xa184, 0xf0cf, 0x0148, 0x2001, 0x01ff, 0x2004,
+       0xd0fc, 0x1904, 0x13b3, 0x72c8, 0x0804, 0x13b2, 0x2019, 0x0000,
+       0x080c, 0x23a6, 0x0036, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x0118,
+       0x001e, 0x0804, 0x13b9, 0x71c8, 0xa184, 0xf0cf, 0x0128, 0x000e,
+       0x2110, 0x71c4, 0x0804, 0x13b2, 0xc3fd, 0x080c, 0x23a6, 0x2310,
+       0x001e, 0x0804, 0x13b8, 0x71c4, 0xa182, 0x0010, 0x0248, 0x2001,
+       0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b3, 0x72c8, 0x0804, 0x13b2,
+       0x2011, 0x474d, 0x2204, 0x0006, 0x8104, 0x1208, 0x8108, 0x2112,
+       0x2019, 0x0000, 0x080c, 0x2393, 0x2001, 0x01ff, 0x2004, 0xd0fc,
+       0x0118, 0x001e, 0x0804, 0x13b9, 0x71c8, 0xa182, 0x0010, 0x0228,
+       0x0006, 0x2110, 0x71c4, 0x0804, 0x13b2, 0x2011, 0x478d, 0x2204,
+       0x0006, 0x8104, 0x1208, 0x8108, 0x2112, 0xc3fd, 0x080c, 0x2393,
+       0x002e, 0x001e, 0x0804, 0x13b8, 0x71c4, 0x72c8, 0xa184, 0xfffd,
+       0x1904, 0x13b2, 0xa284, 0xfffd, 0x1904, 0x13b2, 0x2100, 0x7920,
+       0x7822, 0x2200, 0x7a24, 0x7826, 0x0804, 0x13b8, 0x2011, 0x4c40,
+       0x71c4, 0xd1fc, 0x1110, 0x2011, 0x4bc0, 0x8107, 0xa084, 0x000f,
+       0x8003, 0x8003, 0x8003, 0xa268, 0x72c8, 0x73cc, 0x74d8, 0x71c6,
+       0x6800, 0x70ca, 0x73ce, 0x74da, 0x2091, 0x8000, 0x6a02, 0xd2ac,
+       0x1118, 0x2021, 0x0000, 0x0090, 0xa484, 0x00ff, 0xa082, 0x0002,
+       0x1a04, 0x174f, 0x843f, 0xa7bc, 0x00ff, 0x0140, 0xa786, 0x0002,
+       0x1904, 0x174f, 0xa484, 0x00ff, 0x0904, 0x174f, 0x2061, 0x0200,
+       0xd1fc, 0x0110, 0x2061, 0x0100, 0x2029, 0x0009, 0x2031, 0x0062,
+       0x843f, 0xa7bc, 0x00ff, 0x0130, 0x8307, 0xa084, 0x00ff, 0x1110,
+       0xa73d, 0x1138, 0x2041, 0x0019, 0xa384, 0x00ff, 0xa082, 0x001a,
+       0x0210, 0xa4a4, 0x00ff, 0x8307, 0xa084, 0x00ff, 0x0188, 0xa842,
+       0x02f0, 0xa086, 0x0010, 0x1120, 0xa39c, 0x00ff, 0xa39d, 0x0f00,
+       0xa3bc, 0x00ff, 0x2500, 0xa702, 0x0290, 0x2600, 0xa702, 0x1278,
+       0x2039, 0x003a, 0x6804, 0xa705, 0x6806, 0x6b0a, 0x6b0c, 0x73ce,
+       0x681c, 0x70da, 0x6c1e, 0x2091, 0x8001, 0x0804, 0x13ba, 0x2091,
+       0x8001, 0x0804, 0x13b4, 0x77c4, 0x080c, 0x1b9a, 0x2091, 0x8000,
+       0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e,
+       0x2708, 0x0804, 0x13b7, 0x70c4, 0x2061, 0x4740, 0x6118, 0x601a,
+       0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x70c8, 0x2061,
+       0x4780, 0x6218, 0x601a, 0x0804, 0x13b8, 0x71c4, 0x72c8, 0x73cc,
+       0xa182, 0x0010, 0x1a04, 0x13b3, 0x080c, 0x23d8, 0xa384, 0x4000,
+       0x0110, 0xa295, 0x0020, 0x0804, 0x13b7, 0x77c4, 0x080c, 0x1b9a,
+       0x2091, 0x8000, 0x6a08, 0xc28d, 0x6a0a, 0x2091, 0x8001, 0x2708,
+       0x0804, 0x13b8, 0x77c4, 0x080c, 0x1b9a, 0x2091, 0x8000, 0x6a08,
+       0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0110, 0x080c, 0x22d5,
+       0x2091, 0x8001, 0x2708, 0x0804, 0x13b8, 0x77c4, 0x080c, 0x1b9a,
+       0x2091, 0x8000, 0x6a08, 0xc295, 0x6a0a, 0x6804, 0xa005, 0x0110,
+       0x080c, 0x22d5, 0x2091, 0x8001, 0x2708, 0x0804, 0x13b8, 0x77c4,
+       0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000,
+       0x080c, 0x1bb2, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0804, 0x13b8,
+       0x77c4, 0xd7fc, 0x0128, 0x080c, 0x1b29, 0x0138, 0x0804, 0x13bc,
+       0x080c, 0x1b1e, 0x0110, 0x0804, 0x13bc, 0x73c8, 0x72cc, 0x77c6,
+       0x73ca, 0x72ce, 0x080c, 0x1c2a, 0x11e8, 0x6818, 0xa005, 0x01a0,
+       0x2708, 0x0076, 0x080c, 0x23f7, 0x007e, 0x1170, 0x2001, 0x0015,
+       0xd7fc, 0x1118, 0x2061, 0x4740, 0x0018, 0xc0fd, 0x2061, 0x4780,
+       0x782a, 0x2091, 0x8001, 0x0005, 0x2091, 0x8001, 0x2001, 0x4005,
+       0x0804, 0x13bc, 0x2091, 0x8001, 0x0804, 0x13ba, 0x77c4, 0xd7fc,
+       0x0128, 0x080c, 0x1b29, 0x0138, 0x0804, 0x13bc, 0x080c, 0x1b1e,
+       0x0110, 0x0804, 0x13bc, 0x77c6, 0x2041, 0x0021, 0x2049, 0x0005,
+       0x2051, 0x0020, 0x2091, 0x8000, 0x080c, 0x1bb2, 0x2009, 0x0016,
+       0xd7fc, 0x1118, 0x2061, 0x4740, 0x0018, 0x2061, 0x4780, 0xc1fd,
+       0x6063, 0x0003, 0x607b, 0x0000, 0x6772, 0x607f, 0x000f, 0x792a,
+       0x61d0, 0xc1c4, 0x61d2, 0x080c, 0x22d5, 0x2091, 0x8001, 0x0005,
+       0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xd7fc, 0x0128, 0x080c, 0x1b29,
+       0x0138, 0x0804, 0x13bc, 0x080c, 0x1b1e, 0x0110, 0x0804, 0x13bc,
+       0xa7bc, 0xff00, 0x2091, 0x8000, 0x2009, 0x0017, 0xd7fc, 0x1118,
+       0x2061, 0x4740, 0x0018, 0x2061, 0x4780, 0xc1fd, 0x607b, 0x0000,
+       0x6063, 0x0002, 0x6772, 0x607f, 0x000f, 0x792a, 0x61d0, 0xc1c4,
+       0x61d2, 0x080c, 0x22d5, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049,
+       0x0005, 0x2051, 0x0010, 0x2091, 0x8000, 0x70c8, 0xa005, 0x0118,
+       0x60d0, 0xc0fd, 0x60d2, 0x080c, 0x1bb2, 0x70c8, 0x6836, 0x8738,
+       0xa784, 0x001f, 0x1dc0, 0x2091, 0x8001, 0x0005, 0x2019, 0x0000,
+       0x72c8, 0xd284, 0x0128, 0x080c, 0x1b29, 0x0138, 0x0804, 0x13bc,
+       0x080c, 0x1b1e, 0x0110, 0x0804, 0x13bc, 0x72c8, 0x72ca, 0x78ac,
+       0xa084, 0x0003, 0x1518, 0x2039, 0x0000, 0xd284, 0x0108, 0xc7fd,
+       0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x080c, 0x1b9a,
+       0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d, 0x690a, 0x6837, 0x0000,
+       0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x1d80, 0xa7bc, 0xff00,
+       0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x1d40, 0x2091, 0x8000,
        0x72c8, 0x2069, 0x0100, 0xd284, 0x1110, 0x2069, 0x0200, 0x6808,
        0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, 0x01b0, 0x684b, 0x0004,
-       0x20a9, 0x0014, 0x6848, 0xd094, 0x0110, 0x1f04, 0x18b2, 0x684b,
-       0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, 0x0110, 0x1f04, 0x18bb,
-       0x20a9, 0x00fa, 0x1f04, 0x18c2, 0x2079, 0x4600, 0x2009, 0x0018,
-       0x72c8, 0xd284, 0x1118, 0x2061, 0x4640, 0x0018, 0x2061, 0x4680,
+       0x20a9, 0x0014, 0x6848, 0xd094, 0x0110, 0x1f04, 0x18c2, 0x684b,
+       0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, 0x0110, 0x1f04, 0x18cb,
+       0x20a9, 0x00fa, 0x1f04, 0x18d2, 0x2079, 0x4700, 0x2009, 0x0018,
+       0x72c8, 0xd284, 0x1118, 0x2061, 0x4740, 0x0018, 0x2061, 0x4780,
        0xc1fd, 0x607b, 0x0000, 0x792a, 0x6063, 0x0001, 0x607f, 0x000f,
        0x60a3, 0x0000, 0x60a4, 0x60ae, 0x60b2, 0x60d0, 0xd0b4, 0x0160,
        0xc0b4, 0x60d2, 0x00c6, 0x60b4, 0xa065, 0x6008, 0xc0d4, 0x600a,
        0x6018, 0x8001, 0x601a, 0x00ce, 0x60d0, 0xa084, 0x7eff, 0x60d2,
        0x78ac, 0xc08d, 0x78ae, 0x83ff, 0x0108, 0x0005, 0x681b, 0x0054,
-       0x2091, 0x8001, 0x0005, 0x73cc, 0x080c, 0x186a, 0x69ec, 0x6a48,
+       0x2091, 0x8001, 0x0005, 0x73cc, 0x080c, 0x1878, 0x69ec, 0x6a48,
        0xa185, 0x1800, 0x684a, 0xa185, 0x0040, 0x68ee, 0x73cc, 0x2021,
-       0x0004, 0x20a9, 0x09ff, 0x1f04, 0x190b, 0x8421, 0x1dd0, 0x8319,
+       0x0004, 0x20a9, 0x09ff, 0x1f04, 0x191b, 0x8421, 0x1dd0, 0x8319,
        0x1db0, 0x69ee, 0x6a4a, 0x2091, 0x8001, 0x0005, 0xd7fc, 0x1118,
-       0x2069, 0x4640, 0x0010, 0x2069, 0x4680, 0x71c4, 0x71c6, 0x6916,
+       0x2069, 0x4740, 0x0010, 0x2069, 0x4780, 0x71c4, 0x71c6, 0x6916,
        0x81ff, 0x1110, 0x68a3, 0x0001, 0x78ac, 0xc08c, 0x78ae, 0xd084,
-       0x1110, 0x080c, 0x1c5b, 0x0005, 0x75d8, 0x74dc, 0x75da, 0x74de,
+       0x1110, 0x080c, 0x1c7a, 0x0005, 0x75d8, 0x74dc, 0x75da, 0x74de,
        0x0010, 0xa02e, 0x2520, 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca,
-       0x72ce, 0x2079, 0x4600, 0x7dde, 0x7cda, 0x7bd6, 0x7ad2, 0x080c,
-       0x1b58, 0x0904, 0x1a3d, 0x20a9, 0x0005, 0x20a1, 0x4614, 0x2091,
-       0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0040, 0x080c, 0x1d24,
-       0x0120, 0x080c, 0x1b60, 0x0804, 0x1a3d, 0x6004, 0xa08c, 0x00ff,
-       0xa18e, 0x0009, 0x1120, 0x0006, 0x080c, 0x205f, 0x000e, 0xa084,
-       0xff00, 0x8007, 0x8009, 0x0904, 0x19e1, 0x00c6, 0x2c68, 0x080c,
-       0x1b58, 0x05a8, 0x2c00, 0x689e, 0x8109, 0x1dc0, 0x609f, 0x0000,
+       0x72ce, 0x2079, 0x4700, 0x7dde, 0x7cda, 0x7bd6, 0x7ad2, 0x080c,
+       0x1b77, 0x0904, 0x1a5c, 0x20a9, 0x0005, 0x20a1, 0x4714, 0x2091,
+       0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0040, 0x080c, 0x1d41,
+       0x0120, 0x080c, 0x1b7f, 0x0804, 0x1a5c, 0x6004, 0xa08c, 0x00ff,
+       0xa18e, 0x0009, 0x1120, 0x0006, 0x080c, 0x2086, 0x000e, 0xa084,
+       0xff00, 0x8007, 0x8009, 0x0904, 0x19f1, 0x00c6, 0x2c68, 0x080c,
+       0x1b77, 0x05a8, 0x2c00, 0x689e, 0x8109, 0x1dc0, 0x609f, 0x0000,
        0x00ce, 0x00c6, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, 0x0040,
        0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, 0x7cda,
-       0x7bd6, 0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0904, 0x19e0, 0x2009,
-       0x0040, 0x080c, 0x1d24, 0x15a0, 0x6004, 0xa084, 0x00ff, 0xa086,
-       0x0002, 0x1168, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000a, 0x1120,
-       0x0016, 0x080c, 0x205c, 0x001e, 0x2d00, 0x6002, 0x0898, 0x00ce,
-       0x00c6, 0x609c, 0x080c, 0x1bd4, 0x00ce, 0x609f, 0x0000, 0x080c,
-       0x1a41, 0x2009, 0x0018, 0x6008, 0xc0cd, 0x600a, 0x6004, 0x6086,
+       0x7bd6, 0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0904, 0x19f0, 0x2009,
+       0x0040, 0x080c, 0x1d41, 0x15a0, 0x6004, 0xa084, 0x00ff, 0xa086,
+       0x0002, 0x0150, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000a, 0x1138,
+       0x0016, 0x080c, 0x2083, 0x001e, 0x2d00, 0x6002, 0x0898, 0x00ce,
+       0x00c6, 0x609c, 0x080c, 0x1bf3, 0x00ce, 0x609f, 0x0000, 0x080c,
+       0x1a60, 0x2009, 0x0018, 0x6008, 0xc0cd, 0x600a, 0x6004, 0x6086,
        0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812,
-       0x080c, 0x1b15, 0x000e, 0x7812, 0x080c, 0x1b60, 0x0804, 0x1a3d,
-       0x00ce, 0x00c6, 0x609c, 0x080c, 0x1bd4, 0x00ce, 0x609f, 0x0000,
-       0x080c, 0x1a41, 0x2009, 0x0018, 0x6087, 0x0103, 0x601b, 0x0003,
+       0x080c, 0x1b34, 0x000e, 0x7812, 0x080c, 0x1b7f, 0x0804, 0x1a5c,
+       0x00ce, 0x00c6, 0x609c, 0x080c, 0x1bf3, 0x00ce, 0x609f, 0x0000,
+       0x080c, 0x1a60, 0x2009, 0x0018, 0x6087, 0x0103, 0x601b, 0x0003,
        0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812,
-       0x080c, 0x1b15, 0x000e, 0x7812, 0x080c, 0x1b60, 0x0804, 0x1a3d,
-       0x00ce, 0x6114, 0xd1fc, 0x0120, 0x080c, 0x1b0a, 0x01f0, 0x0018,
-       0x080c, 0x1aff, 0x01d0, 0x080c, 0x1a41, 0x2009, 0x0018, 0x6087,
+       0x080c, 0x1b34, 0x000e, 0x7812, 0x080c, 0x1b7f, 0x0804, 0x1a5c,
+       0x00ce, 0x6114, 0xd1fc, 0x0120, 0x080c, 0x1b29, 0x01f0, 0x0018,
+       0x080c, 0x1b1e, 0x01d0, 0x080c, 0x1a60, 0x2009, 0x0018, 0x6087,
        0x0103, 0x601b, 0x0021, 0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff,
-       0x0110, 0xc0c5, 0x7812, 0x080c, 0x1b15, 0x000e, 0x7812, 0x080c,
-       0x1b60, 0x2001, 0x4007, 0x0804, 0x13bc, 0x74c4, 0x73c8, 0x72cc,
-       0x6014, 0x2091, 0x8000, 0x00e6, 0x2009, 0x0012, 0xd0fc, 0x1118,
-       0x2071, 0x4640, 0x0018, 0x2071, 0x4680, 0xc1fd, 0x792a, 0x7063,
-       0x0005, 0x71d0, 0xc1c4, 0x71d2, 0x7366, 0x726a, 0x746e, 0x7072,
-       0x7077, 0x0000, 0x2c00, 0x707a, 0xa02e, 0x2530, 0x611c, 0xa184,
-       0x0060, 0x0110, 0x080c, 0x3fc1, 0x00ee, 0x6596, 0x65a6, 0x669a,
-       0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x6714, 0x6023, 0x0000,
-       0x080c, 0x22ae, 0x2091, 0x8001, 0x0005, 0x70c3, 0x4005, 0x0804,
-       0x13bd, 0x20a9, 0x0005, 0x2099, 0x4614, 0x2091, 0x8000, 0x530a,
-       0x2091, 0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000,
-       0xa5a9, 0x0000, 0x0005, 0x71c4, 0x70c7, 0x0000, 0x791e, 0x0804,
-       0x13ba, 0x71c4, 0x71c6, 0x2168, 0x0010, 0x2069, 0x1000, 0x690c,
-       0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x1dd8, 0xa285, 0x0000,
-       0x1118, 0x70c3, 0x4000, 0x0010, 0x70c3, 0x4003, 0x70ca, 0x0804,
-       0x13bd, 0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x1a04, 0x13b3,
-       0x7966, 0x0804, 0x13ba, 0x7964, 0x71c6, 0x0804, 0x13ba, 0x7900,
-       0x71c6, 0x71c4, 0x7902, 0x0804, 0x13ba, 0x7900, 0x71c6, 0x0804,
-       0x13ba, 0x70c4, 0x2011, 0x0000, 0xa08c, 0x000d, 0x0160, 0x810c,
-       0x0230, 0x8210, 0x810c, 0x810c, 0x0210, 0x8210, 0x810c, 0x81ff,
-       0x1904, 0x13b4, 0x8210, 0x7a0e, 0xd28c, 0x0538, 0x7910, 0xc1cd,
-       0x7912, 0x2009, 0x0021, 0x2019, 0x0003, 0xd284, 0x01c0, 0x8108,
-       0x2019, 0x0041, 0x2011, 0x8e4e, 0x2312, 0x2019, 0x0042, 0x8210,
-       0x2312, 0x2019, 0x0043, 0x8210, 0x2312, 0x2019, 0x0046, 0x8210,
-       0x2312, 0x2019, 0x0047, 0x8210, 0x2312, 0x2019, 0x0006, 0x2011,
-       0x8e53, 0x2112, 0x2011, 0x8e73, 0x2312, 0x7904, 0x7806, 0x0804,
-       0x13b9, 0x7804, 0x70c6, 0x0804, 0x13ba, 0x71c4, 0xd1fc, 0x1118,
-       0x2011, 0x4ac0, 0x0010, 0x2011, 0x4b40, 0x8107, 0xa084, 0x000f,
-       0x8003, 0x8003, 0x8003, 0xa268, 0x2011, 0x0000, 0x6814, 0xd0fc,
-       0x0110, 0xa295, 0x0200, 0xd0b4, 0x0110, 0xa295, 0x0001, 0x6b0c,
-       0x6800, 0x70da, 0x0804, 0x13b7, 0x7814, 0xd0f4, 0x0130, 0x2001,
-       0x4007, 0x70db, 0x0000, 0xa005, 0x0048, 0xd0fc, 0x0130, 0x2001,
-       0x4007, 0x70db, 0x0001, 0xa005, 0x0008, 0xa006, 0x0005, 0x7814,
-       0xd0f4, 0x0130, 0x2001, 0x4007, 0x70db, 0x0000, 0xa005, 0x0008,
-       0xa006, 0x0005, 0x7814, 0xd0fc, 0x0130, 0x2001, 0x4007, 0x70db,
-       0x0001, 0xa005, 0x0008, 0xa006, 0x0005, 0x7112, 0x721a, 0x731e,
-       0x7810, 0xd0c4, 0x0110, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108,
-       0x810c, 0x81a9, 0x8098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x6084,
-       0x20a2, 0x53a6, 0x7007, 0x0001, 0x7974, 0xa184, 0xff00, 0x0140,
-       0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018,
-       0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006, 0xa211,
-       0x7d10, 0xd5c4, 0x0120, 0x7b84, 0xa319, 0x7c80, 0xa421, 0x7008,
-       0xd0fc, 0x0de8, 0x7003, 0x0001, 0x7007, 0x0006, 0x711a, 0x721e,
-       0x7d10, 0xd5c4, 0x0110, 0x7322, 0x7426, 0xa084, 0x01e0, 0x0005,
-       0x7848, 0xa065, 0x0120, 0x2c04, 0x784a, 0x2063, 0x0000, 0x0005,
-       0x00f6, 0x2079, 0x4600, 0x7848, 0x2062, 0x2c00, 0xa005, 0x1110,
-       0x080c, 0x254c, 0x784a, 0x00fe, 0x0005, 0x2011, 0x9000, 0x7a4a,
-       0x7bc4, 0x8319, 0x0128, 0xa280, 0x0032, 0x2012, 0x2010, 0x0cc8,
-       0x2013, 0x0000, 0x0005, 0x0016, 0x0026, 0xd7fc, 0x1118, 0x2011,
-       0x4bc0, 0x0010, 0x2011, 0x6bc0, 0xa784, 0x0f00, 0x800b, 0xa784,
-       0x001f, 0x0120, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa268,
-       0x002e, 0x001e, 0x0005, 0x0c39, 0x2900, 0x682a, 0x2a00, 0x682e,
-       0x6808, 0xa084, 0xf9ef, 0xa80d, 0x690a, 0x00e6, 0xd7fc, 0x1128,
-       0x2009, 0x4652, 0x2071, 0x4640, 0x0020, 0x2009, 0x4692, 0x2071,
-       0x4680, 0x210c, 0x6804, 0xa005, 0x0148, 0xa116, 0x1138, 0x2060,
-       0x6000, 0x6806, 0x0016, 0x200b, 0x0000, 0x0018, 0x2009, 0x0000,
-       0x0016, 0x6804, 0xa065, 0x0178, 0x6000, 0x6806, 0x0421, 0x080c,
-       0x1d95, 0x6810, 0x7908, 0x8109, 0x790a, 0x8001, 0x6812, 0x1d88,
-       0x7910, 0xc1a5, 0x7912, 0x001e, 0x6902, 0x6906, 0x2d00, 0x2060,
-       0x080c, 0x2693, 0x00ee, 0x0005, 0xa065, 0x0160, 0x2008, 0x609c,
-       0xa005, 0x0128, 0x2062, 0x609f, 0x0000, 0xa065, 0x0cc0, 0x7848,
-       0x794a, 0x2062, 0x0005, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9,
-       0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828,
-       0x601a, 0x682c, 0x6022, 0x0005, 0x00e6, 0xd7fc, 0x1128, 0x2071,
-       0x4640, 0x2031, 0x46c0, 0x0020, 0x2071, 0x4680, 0x2031, 0x48c0,
-       0x704c, 0xa08c, 0x0200, 0x1128, 0xa608, 0x2d0a, 0x8000, 0x704e,
-       0xa006, 0x00ee, 0x0005, 0x00f6, 0xd7fc, 0x1118, 0x2079, 0x4640,
-       0x0010, 0x2079, 0x4680, 0x080c, 0x1b7b, 0x2091, 0x8000, 0x6804,
-       0x780a, 0xa065, 0x05f0, 0x0030, 0x2c00, 0x780a, 0x2060, 0x6000,
-       0xa065, 0x05b8, 0x6010, 0xa306, 0x1db8, 0x600c, 0xa206, 0x1da0,
-       0x2c28, 0x7848, 0xac06, 0x1108, 0x0448, 0x6804, 0xac06, 0x1140,
-       0x6000, 0x2060, 0x6806, 0xa005, 0x1118, 0x6803, 0x0000, 0x0048,
-       0x6400, 0x7808, 0x2060, 0x6402, 0xa486, 0x0000, 0x1110, 0x2c00,
-       0x6802, 0x2560, 0x080c, 0x1be3, 0x601b, 0x0005, 0x6023, 0x0020,
-       0x00fe, 0x080c, 0x1d95, 0x00f6, 0x7908, 0x8109, 0x790a, 0x6810,
-       0x8001, 0x6812, 0x1118, 0x7810, 0xc0a5, 0x7812, 0x2001, 0xffff,
-       0xa005, 0x00fe, 0x0005, 0x0076, 0x2700, 0x2039, 0x0000, 0xd0fc,
-       0x0108, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008,
-       0x2091, 0x8000, 0x080c, 0x1b93, 0x8738, 0xa784, 0x001f, 0x1dd0,
-       0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x1d90,
-       0x2091, 0x8001, 0x007e, 0x0005, 0x786c, 0x2009, 0x8e74, 0x210c,
-       0xa10d, 0x0118, 0xa065, 0x0804, 0x207a, 0x2061, 0x0000, 0x6018,
-       0xd084, 0x11b8, 0x7810, 0xd08c, 0x0130, 0xc08c, 0x7812, 0xc7fc,
-       0x2069, 0x4640, 0x0028, 0xc08d, 0x7812, 0x2069, 0x4680, 0xc7fd,
-       0x2091, 0x8000, 0x681c, 0x681f, 0x0000, 0x2091, 0x8001, 0xa005,
-       0x1108, 0x0005, 0xa08c, 0xfff0, 0x0110, 0x080c, 0x254c, 0x0002,
-       0x1cb8, 0x1cbb, 0x1cc1, 0x1cc5, 0x1cb9, 0x1cc9, 0x1cb9, 0x1cb9,
-       0x1cb9, 0x1ccf, 0x1cfb, 0x1cfe, 0x1d03, 0x1d0c, 0x1cb9, 0x1cb9,
-       0x0005, 0x080c, 0x254c, 0x080c, 0x1c5b, 0x2001, 0x8001, 0x0804,
-       0x1d15, 0x2001, 0x8003, 0x0804, 0x1d15, 0x2001, 0x8004, 0x0804,
-       0x1d15, 0x080c, 0x1c5b, 0x2001, 0x8006, 0x0804, 0x1d15, 0x2091,
-       0x8000, 0x0076, 0xd7fc, 0x1128, 0x2069, 0x4640, 0x2039, 0x0009,
-       0x0020, 0x2069, 0x4680, 0x2039, 0x0009, 0x6800, 0xa086, 0x0000,
-       0x0128, 0x000e, 0x6f1e, 0x2091, 0x8001, 0x0005, 0x6870, 0x007e,
-       0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010,
-       0x080c, 0x1b93, 0x8738, 0xa784, 0x001f, 0x1dd0, 0x2091, 0x8001,
-       0x2001, 0x800a, 0x00d0, 0x2001, 0x800c, 0x00b8, 0x080c, 0x1c5b,
-       0x2001, 0x800d, 0x0090, 0xd7fc, 0x0110, 0x78e4, 0x0008, 0x78e0,
-       0x70c6, 0x2001, 0x800e, 0x0048, 0xd7fc, 0x0110, 0x78ec, 0x0008,
-       0x78e8, 0x70c6, 0x2001, 0x800f, 0x0000, 0x70c2, 0xd7fc, 0x1118,
-       0x70db, 0x0000, 0x0010, 0x70db, 0x0001, 0x2061, 0x0000, 0x601b,
-       0x0001, 0x2091, 0x4080, 0x0005, 0xac80, 0x0001, 0x81ff, 0x0518,
-       0x2099, 0x0030, 0x20a0, 0x700c, 0xa084, 0x07ff, 0x0100, 0x7018,
-       0x0006, 0x701c, 0x0006, 0x7020, 0x0006, 0x7024, 0x0006, 0x7112,
-       0x81ac, 0x721a, 0x731e, 0x7422, 0x7526, 0x7003, 0x0001, 0x7007,
-       0x0001, 0x7008, 0x800b, 0x1ee8, 0x7007, 0x0002, 0xa08c, 0x01e0,
-       0x1110, 0x53a5, 0xa006, 0x7003, 0x0000, 0x7007, 0x0004, 0x000e,
-       0x7026, 0x000e, 0x7022, 0x000e, 0x701e, 0x000e, 0x701a, 0x0005,
-       0x2011, 0x0020, 0x2009, 0x0010, 0x6b0a, 0x6c0e, 0x681f, 0x0201,
-       0x6803, 0xfd20, 0x6807, 0x0038, 0x6a1a, 0x2d00, 0xa0e8, 0x0008,
-       0xa290, 0x0004, 0x8109, 0x1d80, 0x0005, 0x70ec, 0xd0dc, 0x1520,
-       0x2029, 0x0001, 0x7814, 0xd0cc, 0x1160, 0x70ec, 0xd0e4, 0x2019,
-       0x0c0a, 0x2021, 0x000a, 0x1120, 0x2019, 0x0c0c, 0x2021, 0x000c,
-       0x0070, 0x70ec, 0xd0e4, 0x1128, 0x2019, 0x180c, 0x2021, 0x000c,
-       0x0030, 0x2019, 0x1809, 0x2021, 0x0009, 0xa5ad, 0x0200, 0x6b0a,
-       0x6c0e, 0x6d1e, 0x6807, 0x0038, 0x0005, 0x6004, 0x6086, 0x2c08,
-       0x2063, 0x0000, 0x7868, 0xa005, 0x796a, 0x0110, 0x2c02, 0x0008,
-       0x796e, 0x0005, 0x00c6, 0x2061, 0x4600, 0x6887, 0x0103, 0x2d08,
-       0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0110, 0x2d02, 0x0008,
-       0x616e, 0x00ce, 0x0005, 0x2091, 0x8000, 0x2c04, 0x786e, 0xa005,
-       0x1108, 0x786a, 0x2091, 0x8001, 0x609c, 0xa005, 0x0188, 0x00c6,
-       0x2060, 0x2008, 0x609c, 0xa005, 0x0138, 0x2062, 0x609f, 0x0000,
-       0xa065, 0x609c, 0xa005, 0x1dc8, 0x7848, 0x794a, 0x2062, 0x00ce,
-       0x7848, 0x2062, 0x609f, 0x0000, 0xac85, 0x0000, 0x1110, 0x080c,
-       0x254c, 0x784a, 0x0005, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086,
-       0x818e, 0x1208, 0xa200, 0x1f04, 0x1ddf, 0x8086, 0x818e, 0x0005,
-       0x0156, 0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213,
-       0x818d, 0x0228, 0xa11a, 0x1220, 0x1f04, 0x1def, 0x0028, 0xa11a,
-       0x2308, 0x8210, 0x1f04, 0x1def, 0x0006, 0x3200, 0xa084, 0xefff,
-       0x2080, 0x000e, 0x015e, 0x0005, 0x0006, 0x3200, 0xa085, 0x1000,
-       0x0cb8, 0x7d74, 0x70d0, 0xa506, 0x0904, 0x1ebd, 0x7810, 0x2050,
-       0x080c, 0x1b58, 0x0904, 0x1ebd, 0xa046, 0x7970, 0x2500, 0x8000,
-       0xa112, 0x2009, 0x0040, 0x1208, 0x0030, 0x72d0, 0xa206, 0x0118,
-       0x8840, 0x2009, 0x0080, 0x00c6, 0x7112, 0x7007, 0x0001, 0x2099,
-       0x0030, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0, 0x2061, 0x0000,
-       0x88ff, 0x0110, 0x080c, 0x1b58, 0x7008, 0xd0fc, 0x0de8, 0x7007,
-       0x0002, 0x2091, 0x8001, 0xa08c, 0x01e0, 0x1538, 0x53a5, 0x8cff,
-       0x1120, 0x88ff, 0x0904, 0x1eaa, 0x0050, 0x2c00, 0x788e, 0x20a9,
-       0x0020, 0xac80, 0x0001, 0x20a0, 0x53a5, 0x0804, 0x1eaa, 0xa046,
-       0x7218, 0x731c, 0xdac4, 0x0110, 0x7420, 0x7524, 0xa292, 0x0040,
-       0xa39b, 0x0000, 0xa4a3, 0x0000, 0xa5ab, 0x0000, 0x721a, 0x731e,
-       0xdac4, 0x0118, 0x7422, 0x7526, 0xa006, 0x7007, 0x0004, 0x0904,
-       0x1eaa, 0x8cff, 0x0110, 0x080c, 0x1b60, 0x00ce, 0x080c, 0x1b60,
-       0xa046, 0x7888, 0x8000, 0x788a, 0xa086, 0x0002, 0x01c0, 0x7a7c,
-       0x7b78, 0xdac4, 0x0110, 0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004,
-       0x8004, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
-       0x721a, 0x731e, 0xdac4, 0x0588, 0x7422, 0x7526, 0x0470, 0x6014,
-       0xd0fc, 0x1118, 0x2069, 0x4640, 0x0010, 0x2069, 0x4680, 0x2091,
-       0x8000, 0x681f, 0x0002, 0x88ff, 0x0120, 0xa046, 0x788c, 0x2060,
-       0x0c70, 0x788b, 0x0000, 0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091,
-       0x8001, 0x0098, 0x00ce, 0x788b, 0x0000, 0x080c, 0x2035, 0x6004,
-       0xa084, 0x000f, 0x0059, 0x88ff, 0x0130, 0x788c, 0x2060, 0x6004,
-       0xa084, 0x000f, 0x0019, 0x0804, 0x1e09, 0x0005, 0x0002, 0x1ecf,
-       0x1eea, 0x1f03, 0x1ecf, 0x1f10, 0x1ee0, 0x1ecf, 0x1ecf, 0x1ecf,
-       0x1ee8, 0x1f01, 0x1ecf, 0x1ecf, 0x1ecf, 0x1ecf, 0x1ecf, 0x2039,
-       0x0400, 0x78bc, 0xa705, 0x78be, 0x6008, 0xa705, 0x600a, 0x080c,
-       0x1f4c, 0x609c, 0x78ba, 0x609f, 0x0000, 0x080c, 0x2021, 0x0005,
-       0x78bc, 0xd0c4, 0x0108, 0x0c58, 0x601c, 0xc0bd, 0x601e, 0x0030,
-       0x080c, 0x205f, 0x78bc, 0xd0c4, 0x0108, 0x0c08, 0x78bf, 0x0000,
-       0x6004, 0x8007, 0xa084, 0x00ff, 0x78b2, 0x8001, 0x0138, 0x080c,
-       0x1f4c, 0x0120, 0x78bc, 0xc0c5, 0x78be, 0x0010, 0x0804, 0x1f67,
-       0x0005, 0x080c, 0x205c, 0x78bc, 0xa08c, 0x0e00, 0x1110, 0xd0c4,
-       0x1108, 0x0828, 0x080c, 0x1f4c, 0x1110, 0x0804, 0x1f67, 0x0005,
-       0x78bc, 0xd0c4, 0x0110, 0x0804, 0x1ecf, 0x78bf, 0x0000, 0x6714,
-       0x2011, 0x0001, 0x22a8, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0188,
-       0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0150, 0xa7bc,
-       0x8000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e, 0x0002, 0x0108,
-       0x00c0, 0x080c, 0x1b7b, 0x2d00, 0x2091, 0x8000, 0x682b, 0x0000,
-       0x682f, 0x0000, 0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010,
-       0x2091, 0x8001, 0x1f04, 0x1f34, 0x8211, 0x0118, 0x20a9, 0x0100,
-       0x0c58, 0x080c, 0x1b60, 0x0005, 0x609f, 0x0000, 0x78b4, 0xa06d,
-       0x2c00, 0x78b6, 0x1110, 0x78ba, 0x0038, 0x689e, 0x2d00, 0x6002,
-       0x78b8, 0xad06, 0x1108, 0x6002, 0x78b0, 0x8001, 0x78b2, 0x1130,
-       0x78bc, 0xc0c4, 0x78be, 0x78b8, 0x2060, 0xa006, 0x0005, 0x00e6,
-       0xa02e, 0x2530, 0x7dba, 0x7db6, 0x65ae, 0x65b2, 0x601c, 0x60a2,
-       0x2048, 0xa984, 0xe1ff, 0x601e, 0xa984, 0x0060, 0x0110, 0x080c,
-       0x3fc1, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x6714, 0x2071, 0x4680,
-       0xd7fc, 0x1110, 0x2071, 0x4640, 0xa784, 0x0f00, 0x800b, 0xa784,
-       0x001f, 0x0120, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x71c0,
-       0xa168, 0x2700, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
-       0x71c4, 0xa100, 0x60c2, 0x2091, 0x8000, 0x7814, 0xd0c4, 0x0138,
-       0xd7fc, 0x1118, 0xd0f4, 0x1140, 0x0010, 0xd0fc, 0x1128, 0x6e08,
-       0xd684, 0x01f0, 0xd9fc, 0x11e0, 0x2091, 0x8001, 0x080c, 0x1be3,
-       0x2091, 0x8000, 0x080c, 0x1d95, 0x2091, 0x8001, 0x7814, 0xd0c4,
-       0x0904, 0x201f, 0xd7fc, 0x1120, 0xd0f4, 0x1130, 0x0804, 0x201f,
-       0xd0fc, 0x1110, 0x0804, 0x201f, 0x601b, 0x0021, 0x0804, 0x201f,
-       0x6024, 0xa096, 0x0001, 0x1110, 0x8000, 0x6026, 0x6a10, 0x6814,
-       0xa202, 0x0268, 0x0160, 0x2091, 0x8001, 0x2039, 0x0200, 0x609c,
-       0x78ba, 0x609f, 0x0000, 0x080c, 0x2021, 0x0804, 0x201f, 0x2c08,
-       0xd9fc, 0x01f0, 0x6800, 0xa065, 0x01d8, 0x6a04, 0x7000, 0xa084,
-       0x0002, 0x0168, 0x7048, 0xa206, 0x1150, 0x6b04, 0x2160, 0x2304,
-       0x6002, 0xa005, 0x1108, 0x6902, 0x2260, 0x6102, 0x0098, 0x2d00,
-       0x2060, 0x080c, 0x2693, 0x6e08, 0x2160, 0x6202, 0x6906, 0x0050,
-       0x6800, 0x6902, 0xa065, 0x0110, 0x6102, 0x0008, 0x6906, 0x2160,
-       0x6003, 0x0000, 0x2160, 0xd9fc, 0x0118, 0xa6b4, 0xfffc, 0x6e0a,
-       0x6810, 0x7d08, 0x8528, 0x7d0a, 0x8000, 0x6812, 0x2091, 0x8001,
-       0xd6b4, 0x0128, 0xa6b6, 0x0040, 0x6e0a, 0x080c, 0x1bf4, 0x00ee,
-       0x0005, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x080c, 0x1d95,
-       0x2091, 0x8001, 0x78b8, 0xa065, 0x0128, 0x609c, 0x78ba, 0x609f,
-       0x0000, 0x0c78, 0x78b6, 0x78ba, 0x0005, 0x7970, 0x7874, 0x2818,
-       0xd384, 0x0118, 0x8000, 0xa112, 0x0220, 0x8000, 0xa112, 0x1278,
-       0xc384, 0x7a7c, 0x721a, 0x7a78, 0x721e, 0xdac4, 0x0120, 0x7a84,
-       0x7222, 0x7a80, 0x7226, 0xa006, 0xd384, 0x0108, 0x8000, 0x7876,
-       0x70d2, 0x781c, 0xa005, 0x0138, 0x8001, 0x781e, 0x1120, 0x0e04,
-       0x205b, 0x2091, 0x4080, 0x0005, 0x2039, 0x2071, 0x0010, 0x2039,
-       0x2077, 0x2704, 0xa005, 0x0160, 0xac00, 0x2068, 0x6908, 0x6810,
-       0x6912, 0x680a, 0x690c, 0x6814, 0x6916, 0x680e, 0x8738, 0x0c88,
-       0x0005, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0015,
-       0x001b, 0x0000, 0x2041, 0x0000, 0x780c, 0x0002, 0x2223, 0x21fe,
-       0x2082, 0x20f2, 0x2039, 0x8e74, 0x2734, 0x7d10, 0x00c0, 0x6084,
-       0xa086, 0x0103, 0x1904, 0x20dc, 0x6114, 0x6018, 0xa105, 0x0120,
-       0x86ff, 0x11d8, 0x0804, 0x20dc, 0x8603, 0xa080, 0x8e55, 0x620c,
-       0x2202, 0x8000, 0x6210, 0x2202, 0x080c, 0x1db3, 0x8630, 0xa68e,
-       0x000f, 0x0904, 0x215d, 0x786c, 0xa065, 0x1d08, 0x7808, 0xa602,
-       0x1220, 0xd5ac, 0x1110, 0x263a, 0x0005, 0xa682, 0x0003, 0x1a04,
-       0x215d, 0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x11f8,
-       0x2011, 0x8e55, 0x2204, 0x70c6, 0x8210, 0x2204, 0x70ca, 0xd684,
-       0x1130, 0x8210, 0x2204, 0x70da, 0x8210, 0x2204, 0x70de, 0xa685,
-       0x8020, 0x70c2, 0x681b, 0x0001, 0x2091, 0x4080, 0x7810, 0xa084,
-       0xffcf, 0x7812, 0x2091, 0x8001, 0x203b, 0x0000, 0x0005, 0x7810,
-       0xc0ad, 0x7812, 0x0804, 0x215d, 0x263a, 0x080c, 0x2229, 0x1904,
-       0x2245, 0x786c, 0xa065, 0x1904, 0x2087, 0x2091, 0x8000, 0x7810,
-       0xa084, 0xffcf, 0x86ff, 0x0108, 0xc0ad, 0x7812, 0x2091, 0x8001,
-       0x0804, 0x2245, 0x2039, 0x8e74, 0x2734, 0x7d10, 0x00a0, 0x6084,
-       0xa086, 0x0103, 0x1904, 0x2147, 0x6114, 0x6018, 0xa105, 0x0120,
-       0x86ff, 0x11b8, 0x0804, 0x2147, 0xa680, 0x8e55, 0x620c, 0x2202,
-       0x080c, 0x1db3, 0x8630, 0xa68e, 0x001e, 0x0904, 0x215d, 0x786c,
-       0xa065, 0x1d28, 0x7808, 0xa602, 0x1220, 0xd5ac, 0x1110, 0x263a,
-       0x0005, 0xa682, 0x0006, 0x1a04, 0x215d, 0x2091, 0x8000, 0x2069,
-       0x0000, 0x6818, 0xd084, 0x11f8, 0x2011, 0x8e55, 0x2009, 0x8e4e,
-       0x26a8, 0x211c, 0x2204, 0x201a, 0x8108, 0x8210, 0x1f04, 0x2129,
-       0xa685, 0x8030, 0x70c2, 0x681b, 0x0001, 0x2091, 0x4080, 0x7810,
-       0xa084, 0xffcf, 0x7812, 0x2091, 0x8001, 0xa006, 0x2009, 0x8e75,
-       0x200a, 0x203a, 0x0005, 0x7810, 0xc0ad, 0x7812, 0x00b0, 0x263a,
-       0x080c, 0x2229, 0x1904, 0x2245, 0x786c, 0xa065, 0x1904, 0x20f7,
-       0x2091, 0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0108, 0xc0ad,
-       0x7812, 0x2091, 0x8001, 0x0804, 0x2245, 0x2091, 0x8000, 0x7007,
-       0x0004, 0x7994, 0x70d4, 0xa102, 0x0228, 0x0168, 0x7b90, 0xa302,
-       0x1150, 0x0010, 0x8002, 0x1138, 0x263a, 0x7810, 0xc0ad, 0x7812,
-       0x2091, 0x8001, 0x0005, 0xa184, 0xff00, 0x0140, 0x810f, 0x810c,
-       0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018, 0x8107, 0x8004,
-       0x8004, 0x7a9c, 0xa210, 0x721a, 0x7a98, 0xa006, 0xa211, 0x721e,
-       0xd4c4, 0x0130, 0x7aa4, 0xa211, 0x7222, 0x7aa0, 0xa211, 0x7226,
-       0x20a1, 0x0030, 0x7003, 0x0000, 0x2009, 0x8e54, 0x260a, 0x8109,
-       0x2198, 0x2104, 0xd084, 0x0108, 0x8633, 0xa6b0, 0x0002, 0x26a8,
-       0x53a6, 0x8603, 0x7012, 0x7007, 0x0001, 0x7990, 0x7894, 0x8000,
-       0xa10a, 0x1208, 0xa006, 0x2028, 0x7974, 0xa184, 0xff00, 0x0140,
-       0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018,
-       0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006, 0xa211,
-       0xd4c4, 0x0120, 0x7b84, 0xa319, 0x7c80, 0xa421, 0x7008, 0xd0fc,
-       0x0de8, 0xa084, 0x01e0, 0x01d0, 0x7d10, 0x2031, 0x8e54, 0x2634,
-       0x78a8, 0x8000, 0x78aa, 0xd08c, 0x1138, 0x7007, 0x0006, 0x7004,
-       0xd094, 0x1de8, 0x0804, 0x215f, 0x2069, 0x4647, 0x206b, 0x0003,
-       0x78ac, 0xa085, 0x0300, 0x78ae, 0xa006, 0x0048, 0x2030, 0x75d6,
-       0x2091, 0x4080, 0x7d96, 0x7d10, 0xa5ac, 0xffcf, 0x7d12, 0x2091,
-       0x8001, 0x78aa, 0x7007, 0x0006, 0x263a, 0x7003, 0x0001, 0x711a,
-       0x721e, 0xd5c4, 0x0110, 0x7322, 0x7426, 0x0005, 0x6084, 0xa086,
-       0x0103, 0x11d8, 0x6114, 0x6018, 0xa105, 0x11b8, 0x2069, 0x0000,
-       0x6818, 0xd084, 0x1190, 0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3,
-       0x8020, 0x681b, 0x0001, 0x2091, 0x4080, 0x080c, 0x1db3, 0x0e04,
-       0x221c, 0x786c, 0xa065, 0x1d10, 0x0005, 0x0059, 0x1530, 0x786c,
-       0xa065, 0x19e0, 0x0410, 0x0029, 0x1500, 0x786c, 0xa065, 0x1dd8,
-       0x00e0, 0x6084, 0xa086, 0x0103, 0x1168, 0x6018, 0xc0fc, 0x601a,
-       0xa086, 0x0004, 0x1138, 0x7804, 0xd0a4, 0x0120, 0x080c, 0x1db3,
-       0xa006, 0x0005, 0x0079, 0x1118, 0xa085, 0x0001, 0x0005, 0x00b9,
-       0x1110, 0x2041, 0x0001, 0x7d10, 0x0005, 0x88ff, 0x0110, 0x2091,
-       0x4080, 0x0005, 0x7b90, 0x7994, 0x70d4, 0xa102, 0x1118, 0xa385,
-       0x0000, 0x0005, 0x0210, 0xa302, 0x0005, 0x8002, 0x0005, 0xa184,
-       0xff00, 0x0140, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007,
-       0xa100, 0x0018, 0x8107, 0x8004, 0x8004, 0x7a9c, 0x7b98, 0x7ca4,
-       0x7da0, 0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009, 0x0018,
-       0x6028, 0xa005, 0x0110, 0x2009, 0x0040, 0x080c, 0x1b15, 0x01d0,
-       0x78a8, 0x8000, 0x78aa, 0xd08c, 0x1510, 0x6014, 0xd0fc, 0x1118,
-       0x2069, 0x4640, 0x0010, 0x2069, 0x4680, 0x2091, 0x8000, 0x681f,
-       0x0003, 0x78ab, 0x0000, 0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091,
-       0x8001, 0x0068, 0x78ab, 0x0000, 0x080c, 0x1db3, 0x7990, 0x7894,
-       0x8000, 0xa10a, 0x1208, 0xa006, 0x7896, 0x70d6, 0xa006, 0x2071,
-       0x0010, 0x2091, 0x8001, 0x0005, 0xd7fc, 0x1118, 0x2009, 0x4658,
-       0x0010, 0x2009, 0x4698, 0x2091, 0x8000, 0x200a, 0x00f6, 0x2009,
-       0x4680, 0x2079, 0x0100, 0xd7fc, 0x1120, 0x2009, 0x4640, 0x2079,
-       0x0200, 0x2104, 0xa086, 0x0000, 0x1180, 0xd7fc, 0x1118, 0x2009,
-       0x4645, 0x0010, 0x2009, 0x4685, 0x2104, 0xa005, 0x1130, 0x7830,
-       0xa084, 0x00c0, 0x1110, 0x781b, 0x0052, 0x00fe, 0x0005, 0x2009,
-       0x0002, 0x2069, 0x4600, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904,
-       0x2324, 0x2071, 0x4680, 0x2079, 0x0100, 0x2021, 0x48bf, 0x784b,
-       0x000f, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x0118, 0x2019, 0x3e0f,
-       0x0030, 0x20a1, 0x012b, 0x2019, 0x3e0f, 0xd184, 0x0110, 0x20a1,
-       0x022b, 0x2304, 0xa005, 0x0140, 0x789a, 0x8318, 0x23ac, 0x8318,
-       0x2398, 0x53a6, 0x3318, 0x0ca8, 0x789b, 0x0000, 0x789b, 0x0020,
-       0x20a9, 0x0010, 0x78af, 0x0000, 0x78af, 0x2020, 0x1f04, 0x2302,
-       0x7003, 0x0000, 0x0016, 0xd18c, 0x2009, 0x0000, 0x0108, 0xc1bd,
-       0x080c, 0x2443, 0x001e, 0x7020, 0xa084, 0x000f, 0xa085, 0x6300,
-       0x7806, 0x780f, 0x9000, 0x7843, 0x00d8, 0x7853, 0x0090, 0x780b,
-       0x2f08, 0x7452, 0x704f, 0x0000, 0x8109, 0x0140, 0x2071, 0x4640,
-       0x2079, 0x0200, 0x2021, 0x46bf, 0x0804, 0x22df, 0x080c, 0x24fd,
-       0x0005, 0x0016, 0x2011, 0x0101, 0xd1bc, 0x1110, 0x2011, 0x0201,
-       0xa18c, 0x000f, 0x2204, 0xa084, 0xfff0, 0xa105, 0x2012, 0x001e,
-       0x080c, 0x2443, 0x0005, 0x2011, 0x0101, 0xd3fc, 0x1110, 0x2011,
-       0x0201, 0x20a9, 0x0009, 0x810b, 0x1f04, 0x234b, 0xa18c, 0x0e00,
-       0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x0005, 0x2019, 0x0002,
-       0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x1f04, 0x235c, 0xa294,
-       0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x8319, 0x0118,
-       0x2009, 0x0201, 0x0c78, 0x0005, 0x2011, 0x0101, 0xd3fc, 0x1110,
-       0x2011, 0x0201, 0x20a9, 0x000c, 0x810b, 0x1f04, 0x2374, 0xa18c,
-       0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x0005, 0x2011,
-       0x0102, 0xd3fc, 0x1110, 0x2011, 0x0202, 0x2204, 0xa084, 0xf0cf,
-       0xa105, 0x2012, 0x0005, 0x00c6, 0x2061, 0x0100, 0xd1bc, 0x1110,
-       0x2061, 0x0200, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a,
-       0x62ac, 0x63ac, 0x00ce, 0x0005, 0x00c6, 0x2061, 0x0100, 0xd1bc,
-       0x1110, 0x2061, 0x0200, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0022,
-       0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x00ce, 0x0005, 0x00c6,
-       0x2061, 0x0100, 0xd1bc, 0x1110, 0x2061, 0x0200, 0xc1bc, 0x8103,
-       0x8003, 0xa080, 0x0020, 0x609a, 0x60a4, 0xa28c, 0x0020, 0x0118,
-       0xc2ac, 0xa39d, 0x4000, 0xc3ec, 0xd3b4, 0x1108, 0xc3ed, 0x62ae,
-       0x2010, 0x60a4, 0x63ae, 0x2018, 0x00ce, 0x0005, 0x2091, 0x8000,
-       0x00c6, 0x00e6, 0x6818, 0xa005, 0x0904, 0x2427, 0xd1fc, 0x0118,
-       0x2061, 0x8dd0, 0x0010, 0x2061, 0x8cc0, 0x080c, 0x242f, 0x0560,
-       0x20a9, 0x0101, 0xd1fc, 0x0118, 0x2061, 0x8cd0, 0x0010, 0x2061,
-       0x8bc0, 0x00c6, 0x080c, 0x242f, 0x0128, 0x00ce, 0x8c60, 0x1f04,
-       0x23e9, 0x04a8, 0x000e, 0xd1fc, 0x0128, 0xa082, 0x8cd0, 0x2071,
-       0x4680, 0x0020, 0xa082, 0x8bc0, 0x2071, 0x4640, 0x7076, 0x7172,
-       0x2138, 0x2001, 0x0004, 0x7062, 0x707f, 0x000f, 0x71d0, 0xc1c4,
-       0x71d2, 0x080c, 0x22a4, 0x00c0, 0xd1fc, 0x1118, 0x2071, 0x4640,
-       0x0010, 0x2071, 0x4680, 0x6020, 0xc0dd, 0x6022, 0x7172, 0x2138,
-       0x2c00, 0x707a, 0x2001, 0x0006, 0x7062, 0x707f, 0x000f, 0x71d0,
-       0xc1c4, 0x71d2, 0x080c, 0x22a4, 0x2001, 0x0000, 0x0010, 0x2001,
-       0x0001, 0x2091, 0x8001, 0xa005, 0x00ee, 0x00ce, 0x0005, 0x2c04,
-       0xa005, 0x0170, 0x2060, 0x6010, 0xa306, 0x1140, 0x600c, 0xa206,
-       0x1128, 0x6014, 0xa106, 0x1110, 0xa006, 0x0020, 0x6000, 0x0c80,
-       0xa085, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x0016, 0x2079, 0x4680,
-       0x2071, 0x0100, 0xd1bc, 0x1120, 0x2079, 0x4640, 0x2071, 0x0200,
-       0x7920, 0xa18c, 0x000f, 0x70ec, 0xd0c4, 0x1110, 0x001e, 0x0060,
-       0x810b, 0x810b, 0x810b, 0x810b, 0x000e, 0xa18d, 0x0800, 0xd0bc,
-       0x1110, 0xa18d, 0x0f00, 0x2104, 0x00ee, 0x00fe, 0x0005, 0x2001,
-       0x4601, 0x2004, 0xd0ac, 0x1138, 0x68e4, 0xd0ac, 0x0120, 0xa084,
-       0x0006, 0x1108, 0x0009, 0x0005, 0x6014, 0x00e6, 0x0036, 0x2018,
-       0x2071, 0x4b40, 0xd0fc, 0x1110, 0x2071, 0x4ac0, 0x8007, 0xa084,
-       0x000f, 0x8003, 0x8003, 0x8003, 0xae70, 0x7004, 0xa084, 0x000a,
-       0x1904, 0x24fa, 0x7108, 0xa194, 0xff00, 0x0904, 0x24fa, 0xa18c,
-       0x00ff, 0x701c, 0xa084, 0xff00, 0x01c0, 0x7004, 0xa085, 0x003a,
-       0x7006, 0x2001, 0x0009, 0xa102, 0x16d8, 0x2001, 0x000a, 0xa102,
-       0x16d0, 0x2001, 0x000c, 0xa102, 0x16c8, 0x701c, 0xa084, 0x00ff,
-       0x701e, 0x7004, 0xa084, 0xffdf, 0x7006, 0x2001, 0x000a, 0xa106,
-       0x01a8, 0x2001, 0x000c, 0xa106, 0x01a0, 0x2001, 0x0012, 0xa106,
-       0x0198, 0x2001, 0x0014, 0xa106, 0x0190, 0x2001, 0x0019, 0xa106,
-       0x0188, 0x2001, 0x0032, 0xa106, 0x0180, 0x00d8, 0x2009, 0x000c,
-       0x00d0, 0x2009, 0x0012, 0x00b8, 0x2009, 0x0014, 0x00a0, 0x2009,
-       0x0019, 0x0088, 0x2009, 0x0020, 0x0070, 0x2009, 0x003f, 0x0058,
-       0x2009, 0x000a, 0x0040, 0x2009, 0x000c, 0x0028, 0x2009, 0x0019,
-       0x0010, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a, 0x7004, 0xa085,
-       0x000a, 0x7006, 0x2071, 0x4600, 0x7004, 0xd0bc, 0x0158, 0xd3fc,
-       0x1120, 0x73ea, 0x2071, 0x4640, 0x0018, 0x73ee, 0x2071, 0x4680,
-       0x701f, 0x000d, 0x003e, 0x00ee, 0x0005, 0x2001, 0x01ff, 0x2004,
-       0xd0fc, 0x11d0, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x12a0,
-       0x2071, 0x0200, 0x71ec, 0xa18c, 0x1c00, 0x810f, 0x810c, 0x810c,
-       0x2079, 0x0100, 0x78ec, 0xa084, 0x1c00, 0x8007, 0x8004, 0x8004,
-       0xa105, 0xa08a, 0x0007, 0x0208, 0x0005, 0x0002, 0x254b, 0x2532,
-       0x254b, 0x2532, 0x2525, 0x253f, 0x2525, 0x7008, 0xa084, 0xc3ff,
-       0xa085, 0x3000, 0x700a, 0x7808, 0xa084, 0xc3ff, 0xa085, 0x3000,
-       0x780a, 0x0005, 0x7008, 0xa084, 0xc3ff, 0xa085, 0x2000, 0x700a,
-       0x7808, 0xa084, 0xc3ff, 0xa085, 0x2000, 0x780a, 0x0005, 0x7008,
-       0xa084, 0xc3ff, 0xa085, 0x0c00, 0x700a, 0x7808, 0xa084, 0xc3ff,
-       0xa085, 0x0c00, 0x780a, 0x0005, 0x0e04, 0x254c, 0x2091, 0x8000,
-       0x2071, 0x0000, 0x0006, 0x7018, 0xd084, 0x1de8, 0x000e, 0x2071,
-       0x0010, 0x70ca, 0x000e, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x0a04,
-       0x70df, 0x0020, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080,
-       0x0cf8, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, 0x708a, 0x758e,
-       0x7492, 0x7696, 0x779a, 0xa594, 0x003f, 0xd4f4, 0x0138, 0xd7bc,
-       0x1128, 0xa784, 0x007d, 0x1904, 0x3c74, 0x0871, 0xa49c, 0x000f,
-       0xa382, 0x0004, 0x0320, 0xa3a6, 0x0007, 0x1930, 0x2418, 0x8507,
-       0xa084, 0x000f, 0x0002, 0x2b49, 0x2c34, 0x2c72, 0x2ed8, 0x3256,
-       0x32ad, 0x3353, 0x33e2, 0x34b6, 0x3588, 0x259e, 0x259b, 0x2970,
-       0x2a56, 0x322a, 0x259b, 0x080c, 0x254c, 0x0005, 0xa006, 0x0038,
-       0x7808, 0xc08d, 0x780a, 0xa006, 0x7002, 0x704a, 0x7042, 0x70ce,
-       0x705c, 0xa005, 0x1904, 0x26ec, 0x7060, 0xa084, 0x0007, 0x0002,
-       0x25b8, 0x2626, 0x262e, 0x2637, 0x2640, 0x26d2, 0x2649, 0x2626,
-       0x7830, 0xd0bc, 0x1d10, 0x71d0, 0xd1bc, 0x19f8, 0xd1b4, 0x1904,
-       0x2603, 0x70a0, 0xa086, 0x0001, 0x09c0, 0x70b0, 0xa06d, 0x6800,
-       0xa065, 0xa055, 0x789b, 0x0080, 0x6b0c, 0x7baa, 0x6808, 0xa045,
-       0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0118, 0x69bc,
-       0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001, 0x0010, 0x0804,
-       0x281f, 0x705c, 0xa005, 0x1904, 0x259d, 0x00c6, 0x00d6, 0x70b0,
-       0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0080, 0x6b0c, 0x7baa,
-       0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001,
-       0x0118, 0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001,
-       0x0020, 0x0804, 0x281f, 0x080c, 0x3c33, 0x1904, 0x259d, 0x781b,
-       0x0068, 0x70b8, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de,
-       0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a, 0x68bc, 0x703e,
-       0xc1b4, 0x71d2, 0x70b4, 0xa065, 0x68c0, 0x7056, 0x7003, 0x0002,
-       0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x0005, 0x080c, 0x3c33,
-       0x1120, 0x781b, 0x0054, 0x7003, 0x0004, 0x0005, 0x080c, 0x3c33,
-       0x1128, 0x2011, 0x000c, 0x0419, 0x7003, 0x0004, 0x0005, 0x080c,
-       0x3c33, 0x1128, 0x2011, 0x0006, 0x00d1, 0x7003, 0x0004, 0x0005,
-       0x080c, 0x3c33, 0x1128, 0x2011, 0x000d, 0x0089, 0x7003, 0x0004,
-       0x0005, 0x080c, 0x3c33, 0x1150, 0x2011, 0x0006, 0x0041, 0x7078,
-       0x707b, 0x0000, 0x2068, 0x704a, 0x7003, 0x0004, 0x0005, 0x7170,
-       0xc1fc, 0x8107, 0x7882, 0x789b, 0x0080, 0xa286, 0x000c, 0x1120,
-       0x7aaa, 0x2001, 0x0001, 0x0098, 0xa18c, 0x001f, 0xa18d, 0x00c0,
-       0x79aa, 0xa286, 0x000d, 0x0120, 0x7aaa, 0x2001, 0x0002, 0x0038,
-       0x78ab, 0x0020, 0x7174, 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b,
-       0x0060, 0x78aa, 0x785b, 0x0004, 0x781b, 0x0113, 0x080c, 0x3c46,
-       0x707f, 0x000f, 0x70d0, 0xd0b4, 0x0168, 0xc0b4, 0x70d2, 0x00c6,
-       0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
-       0x601a, 0x00ce, 0x0005, 0x7014, 0xa005, 0x1138, 0x70d0, 0xd0b4,
-       0x0128, 0x70b4, 0xac06, 0x1110, 0x0c29, 0x0005, 0x0016, 0x71a0,
-       0xa186, 0x0001, 0x0528, 0x00d6, 0x0026, 0x2100, 0x2011, 0x0001,
-       0xa212, 0x70b0, 0x2068, 0x6800, 0xac06, 0x0120, 0x8211, 0x01b0,
-       0x00c9, 0x0cc8, 0x00c6, 0x2100, 0x2011, 0x0001, 0xa212, 0x70b0,
-       0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef, 0x600a, 0x8211,
-       0x0110, 0x0041, 0x0cb0, 0x70a3, 0x0001, 0x00ce, 0x002e, 0x00de,
-       0x001e, 0x0005, 0xade8, 0x0005, 0x70a8, 0xad06, 0x1110, 0x70a4,
-       0x2068, 0x0005, 0x080c, 0x3c33, 0x1904, 0x259d, 0x7078, 0x2068,
-       0x7770, 0x080c, 0x3b6f, 0x2c50, 0x080c, 0x3cce, 0x789b, 0x0080,
-       0x6814, 0xa084, 0x001f, 0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001,
-       0x2001, 0x0004, 0x0804, 0x2824, 0x080c, 0x3c33, 0x1904, 0x259d,
-       0x789b, 0x0080, 0x705c, 0x2068, 0x6f14, 0x70d0, 0xd0b4, 0x0168,
-       0xc0b4, 0x70d2, 0x00c6, 0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef,
-       0x600a, 0x6018, 0x8001, 0x601a, 0x00ce, 0x080c, 0x3b6f, 0x2c50,
-       0x080c, 0x3cce, 0x6824, 0xa005, 0x0130, 0xa082, 0x0006, 0x0208,
-       0x0010, 0x6827, 0x0005, 0x6814, 0xa084, 0x001f, 0xc0bd, 0x78aa,
-       0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003, 0x0804, 0x2824,
-       0xc28d, 0x72d2, 0x72bc, 0xa200, 0xa015, 0x7150, 0x8108, 0xa12a,
-       0x0208, 0x71bc, 0x2164, 0x6504, 0x85ff, 0x1170, 0x7152, 0x8421,
-       0x1da8, 0x70d0, 0xd08c, 0x0128, 0x70cc, 0xa005, 0x1110, 0x70cf,
-       0x000a, 0x0005, 0x2200, 0x0c90, 0x70d0, 0xc08c, 0x70d2, 0x70cf,
-       0x0000, 0x6034, 0xa005, 0x1db0, 0x6708, 0xa784, 0x073f, 0x01d0,
-       0xd7d4, 0x1d80, 0xa784, 0x0021, 0x1d68, 0xa784, 0x0002, 0x0130,
-       0xa784, 0x0004, 0x0d38, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0218,
-       0x1d08, 0xa784, 0x0100, 0x0130, 0x6018, 0xa005, 0x19d8, 0xa7bc,
-       0xfeff, 0x670a, 0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684, 0x000e,
-       0x6318, 0x0128, 0x601c, 0xa302, 0x0220, 0x0118, 0x0858, 0x83ff,
-       0x1948, 0x2d58, 0x2c50, 0x7152, 0xd7bc, 0x1120, 0x7028, 0x6022,
-       0x603a, 0x0010, 0xc7bc, 0x670a, 0x68c0, 0xa065, 0xa04d, 0x6100,
-       0x2a60, 0x2041, 0x0001, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0,
-       0xd1fc, 0x0110, 0xd684, 0x0110, 0xa39c, 0xffbf, 0xd6a4, 0x0110,
-       0xa39d, 0x0020, 0xa684, 0x000e, 0x1904, 0x27d6, 0xc7a5, 0x670a,
-       0x2c00, 0x68c6, 0x77a0, 0xa786, 0x0001, 0x1178, 0x70d0, 0xd0b4,
-       0x1160, 0x7000, 0xa082, 0x0002, 0x1240, 0x7830, 0xd0bc, 0x1128,
-       0x789b, 0x0080, 0x7baa, 0x0804, 0x281d, 0x8739, 0x77a2, 0x2750,
-       0x77ac, 0xa7b0, 0x0005, 0x70a8, 0xa606, 0x1108, 0x76a4, 0x76ae,
-       0x2c3a, 0x8738, 0x2d3a, 0x8738, 0x283a, 0x8738, 0x233a, 0x8738,
-       0x253a, 0x7830, 0xd0bc, 0x0150, 0x2091, 0x8000, 0x2091, 0x303d,
-       0x70d0, 0xa084, 0x303d, 0x2091, 0x8000, 0x2090, 0xaad5, 0x0000,
-       0x0120, 0x8421, 0x2200, 0x1904, 0x2725, 0x0005, 0xd1dc, 0x0904,
-       0x37ce, 0x2029, 0x0020, 0xd69c, 0x1120, 0x8528, 0xd68c, 0x1108,
-       0x8528, 0x8840, 0x6f14, 0x610c, 0x8108, 0xa18c, 0x00ff, 0x70c8,
-       0xa160, 0x2c64, 0x8cff, 0x0188, 0x6014, 0xa706, 0x1dd0, 0x60b8,
-       0x8001, 0x60ba, 0x1d88, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a,
-       0x2200, 0x8421, 0x1904, 0x2725, 0x0005, 0x2a60, 0x610e, 0x69be,
-       0x2c00, 0x68c6, 0x8840, 0x6008, 0xc0d5, 0x600a, 0x77a0, 0xa786,
-       0x0001, 0x1904, 0x27ad, 0x70d0, 0xd0b4, 0x1904, 0x27ad, 0x7000,
-       0xa082, 0x0002, 0x1a04, 0x27ad, 0x7830, 0xd0bc, 0x1904, 0x27ad,
-       0x789b, 0x0080, 0x7baa, 0x7daa, 0x79aa, 0x2001, 0x0002, 0x0006,
-       0x6018, 0x8000, 0x601a, 0x0008, 0x0006, 0x2960, 0x6104, 0x2a60,
-       0x080c, 0x3ce1, 0x1590, 0xa184, 0x0018, 0x0180, 0xa184, 0x0010,
-       0x0118, 0x080c, 0x3977, 0x1548, 0xa184, 0x0008, 0x0138, 0x69a0,
-       0xa184, 0x0600, 0x1118, 0x080c, 0x3895, 0x00f8, 0x69a0, 0xa184,
-       0x1e00, 0x0528, 0xa184, 0x0800, 0x0178, 0x00c6, 0x2960, 0x6000,
-       0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106, 0x00ce,
-       0x080c, 0x3977, 0x1150, 0x69a0, 0xa184, 0x0200, 0x0118, 0x080c,
-       0x38da, 0x0018, 0xa184, 0x0400, 0x19f0, 0x69a0, 0xa184, 0x1000,
-       0x0130, 0x6914, 0xa18c, 0xff00, 0x810f, 0x080c, 0x239c, 0x002e,
-       0xa68c, 0x00e0, 0xa684, 0x0060, 0x0128, 0xa086, 0x0060, 0x1110,
-       0xa18d, 0x4000, 0xa18d, 0x0104, 0x69b6, 0x789b, 0x0060, 0x2800,
-       0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, 0x0168, 0xc0fc, 0x7083,
-       0x0000, 0xa08a, 0x000d, 0x0328, 0xa08a, 0x000c, 0x7182, 0x2001,
-       0x000c, 0x800c, 0x7186, 0x78aa, 0x3518, 0x3340, 0x3428, 0x8000,
-       0x80ac, 0xaf80, 0x002b, 0x20a0, 0x789b, 0x0000, 0xad80, 0x000b,
-       0x2098, 0x53a6, 0x23a8, 0x2898, 0x25a0, 0xa286, 0x0020, 0x1508,
-       0x70d0, 0xc0b5, 0x70d2, 0x2c00, 0x70b6, 0x2d00, 0x70ba, 0x6814,
-       0xc0fc, 0x8007, 0x7882, 0xa286, 0x0002, 0x0904, 0x28f5, 0x70a0,
-       0x8000, 0x70a2, 0x74b0, 0xa498, 0x0005, 0x70a8, 0xa306, 0x1108,
-       0x73a4, 0x73b2, 0xa286, 0x0010, 0x0904, 0x259d, 0x00de, 0x00ce,
-       0x0005, 0x7000, 0xa005, 0x19e0, 0xa286, 0x0002, 0x1904, 0x290c,
-       0x080c, 0x3c33, 0x19a8, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x2091,
-       0x8000, 0x781b, 0x0068, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de,
-       0x6898, 0x78d2, 0x78da, 0x2091, 0x8001, 0x7808, 0xc08d, 0x780a,
-       0x0126, 0x00d6, 0x00c6, 0x70d0, 0xa084, 0x2e00, 0x2090, 0x00ce,
-       0x00de, 0x012e, 0x2900, 0x7056, 0x68bc, 0x703e, 0x7003, 0x0002,
-       0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x7830, 0xd0bc, 0x0140,
-       0x2091, 0x303d, 0x70d0, 0xa084, 0x303d, 0x2091, 0x8000, 0x2090,
-       0x70a0, 0xa005, 0x1108, 0x0005, 0x8421, 0x0de8, 0x724c, 0x70bc,
-       0xa200, 0xa015, 0x0804, 0x2725, 0xa286, 0x0010, 0x1560, 0x080c,
-       0x3c33, 0x1904, 0x28a0, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x781b,
-       0x0068, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
-       0x78da, 0x7808, 0xc08d, 0x780a, 0x70a0, 0x8000, 0x70a2, 0x74b0,
-       0xa490, 0x0005, 0x70a8, 0xa206, 0x1108, 0x72a4, 0x72b2, 0x2900,
-       0x7056, 0x68bc, 0x703e, 0x7003, 0x0002, 0x2d00, 0x704a, 0xad80,
-       0x0009, 0x7042, 0x0005, 0x6bb4, 0xa39d, 0x2000, 0x7b5a, 0x6814,
-       0xc0fc, 0x8007, 0x7882, 0x6b94, 0x7bd6, 0x7bde, 0x6e98, 0x7ed2,
-       0x7eda, 0x781b, 0x0068, 0x2900, 0x7056, 0x7202, 0x7808, 0xc08d,
-       0x780a, 0x2300, 0xa605, 0x0170, 0x70d0, 0xa084, 0x2e00, 0xa086,
-       0x2600, 0x1118, 0x2009, 0x0000, 0x0010, 0x2009, 0x0001, 0xa284,
-       0x000f, 0x0023, 0xad80, 0x0009, 0x7042, 0x0005, 0x296e, 0x41d9,
-       0x41d9, 0x41c7, 0x41d9, 0x296e, 0x296e, 0x296e, 0x080c, 0x254c,
-       0x7808, 0xa084, 0xfffd, 0x780a, 0x00f6, 0x2079, 0x4600, 0x78ac,
-       0x00fe, 0xd084, 0x01b0, 0x7060, 0xa086, 0x0001, 0x0904, 0x2a32,
-       0x7060, 0xa086, 0x0005, 0x1158, 0x7078, 0x2068, 0x681b, 0x0004,
+       0x0110, 0xc0c5, 0x7812, 0x080c, 0x1b34, 0x000e, 0x7812, 0x080c,
+       0x1b7f, 0x2001, 0x4007, 0x0804, 0x13bc, 0x6104, 0xa18c, 0x00ff,
+       0xa186, 0x0005, 0x1118, 0x601c, 0xc0bd, 0x601e, 0x74c4, 0x73c8,
+       0x72cc, 0x6014, 0x2091, 0x8000, 0x00e6, 0x2009, 0x0012, 0xd0fc,
+       0x1118, 0x2071, 0x4740, 0x0018, 0x2071, 0x4780, 0xc1fd, 0x792a,
+       0x7063, 0x0005, 0x71d0, 0xc1c4, 0x71d2, 0x7366, 0x726a, 0x746e,
+       0x7072, 0x7077, 0x0000, 0x2c00, 0x707a, 0xa02e, 0x2530, 0x611c,
+       0xa184, 0x0060, 0x0110, 0x080c, 0x3fe9, 0x00ee, 0x6596, 0x65a6,
+       0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x6714, 0x6023,
+       0x0000, 0x6024, 0xa096, 0x0001, 0x1110, 0x8000, 0x6026, 0x080c,
+       0x22d5, 0x2091, 0x8001, 0x0005, 0x70c3, 0x4005, 0x0804, 0x13bd,
+       0x20a9, 0x0005, 0x2099, 0x4714, 0x2091, 0x8000, 0x530a, 0x2091,
+       0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
+       0x0000, 0x0005, 0x71c4, 0x70c7, 0x0000, 0x791e, 0x0804, 0x13ba,
+       0x71c4, 0x71c6, 0x2168, 0x0010, 0x2069, 0x1000, 0x690c, 0xa016,
+       0x2d04, 0xa210, 0x8d68, 0x8109, 0x1dd8, 0xa285, 0x0000, 0x1118,
+       0x70c3, 0x4000, 0x0010, 0x70c3, 0x4003, 0x70ca, 0x0804, 0x13bd,
+       0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x1a04, 0x13b3, 0x7966,
+       0x0804, 0x13ba, 0x7964, 0x71c6, 0x0804, 0x13ba, 0x7900, 0x71c6,
+       0x71c4, 0x7902, 0x0804, 0x13ba, 0x7900, 0x71c6, 0x0804, 0x13ba,
+       0x70c4, 0x2011, 0x0000, 0xa08c, 0x000d, 0x0160, 0x810c, 0x0230,
+       0x8210, 0x810c, 0x810c, 0x0210, 0x8210, 0x810c, 0x81ff, 0x1904,
+       0x13b4, 0x8210, 0x7a0e, 0xd28c, 0x0538, 0x7910, 0xc1cd, 0x7912,
+       0x2009, 0x0021, 0x2019, 0x0003, 0xd284, 0x01c0, 0x8108, 0x2019,
+       0x0041, 0x2011, 0x8f4e, 0x2312, 0x2019, 0x0042, 0x8210, 0x2312,
+       0x2019, 0x0043, 0x8210, 0x2312, 0x2019, 0x0046, 0x8210, 0x2312,
+       0x2019, 0x0047, 0x8210, 0x2312, 0x2019, 0x0006, 0x2011, 0x8f53,
+       0x2112, 0x2011, 0x8f73, 0x2312, 0x7904, 0x7806, 0x0804, 0x13b9,
+       0x7804, 0x70c6, 0x0804, 0x13ba, 0x71c4, 0xd1fc, 0x1118, 0x2011,
+       0x4bc0, 0x0010, 0x2011, 0x4c40, 0x8107, 0xa084, 0x000f, 0x8003,
+       0x8003, 0x8003, 0xa268, 0x2011, 0x0000, 0x6814, 0xd0fc, 0x0110,
+       0xa295, 0x0200, 0xd0b4, 0x0110, 0xa295, 0x0001, 0x6b0c, 0x6800,
+       0x70da, 0x0804, 0x13b7, 0x7814, 0xd0f4, 0x0130, 0x2001, 0x4007,
+       0x70db, 0x0000, 0xa005, 0x0048, 0xd0fc, 0x0130, 0x2001, 0x4007,
+       0x70db, 0x0001, 0xa005, 0x0008, 0xa006, 0x0005, 0x7814, 0xd0f4,
+       0x0130, 0x2001, 0x4007, 0x70db, 0x0000, 0xa005, 0x0008, 0xa006,
+       0x0005, 0x7814, 0xd0fc, 0x0130, 0x2001, 0x4007, 0x70db, 0x0001,
+       0xa005, 0x0008, 0xa006, 0x0005, 0x7112, 0x721a, 0x731e, 0x7810,
+       0xd0c4, 0x0110, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108, 0x810c,
+       0x81a9, 0x8098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x6084, 0x20a2,
+       0x53a6, 0x7007, 0x0001, 0x7974, 0xa184, 0xff00, 0x0140, 0x810f,
+       0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018, 0x8107,
+       0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006, 0xa211, 0x7d10,
+       0xd5c4, 0x0120, 0x7b84, 0xa319, 0x7c80, 0xa421, 0x7008, 0xd0fc,
+       0x0de8, 0x7003, 0x0001, 0x7007, 0x0006, 0x711a, 0x721e, 0x7d10,
+       0xd5c4, 0x0110, 0x7322, 0x7426, 0xa084, 0x01e0, 0x0005, 0x7848,
+       0xa065, 0x0120, 0x2c04, 0x784a, 0x2063, 0x0000, 0x0005, 0x00f6,
+       0x2079, 0x4700, 0x7848, 0x2062, 0x2c00, 0xa005, 0x1110, 0x080c,
+       0x2575, 0x784a, 0x00fe, 0x0005, 0x2011, 0x9100, 0x7a4a, 0x7bc4,
+       0x8319, 0x0128, 0xa280, 0x0032, 0x2012, 0x2010, 0x0cc8, 0x2013,
+       0x0000, 0x0005, 0x0016, 0x0026, 0xd7fc, 0x1118, 0x2011, 0x4cc0,
+       0x0010, 0x2011, 0x6cc0, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f,
+       0x0120, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa268, 0x002e,
+       0x001e, 0x0005, 0x0c39, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808,
+       0xa084, 0xf9ef, 0xa80d, 0x690a, 0x00e6, 0xd7fc, 0x1128, 0x2009,
+       0x4752, 0x2071, 0x4740, 0x0020, 0x2009, 0x4792, 0x2071, 0x4780,
+       0x210c, 0x6804, 0xa005, 0x0148, 0xa116, 0x1138, 0x2060, 0x6000,
+       0x6806, 0x0016, 0x200b, 0x0000, 0x0018, 0x2009, 0x0000, 0x0016,
+       0x6804, 0xa065, 0x0178, 0x6000, 0x6806, 0x0421, 0x080c, 0x1db2,
+       0x6810, 0x7908, 0x8109, 0x790a, 0x8001, 0x6812, 0x1d88, 0x7910,
+       0xc1a5, 0x7912, 0x001e, 0x6902, 0x6906, 0x2d00, 0x2060, 0x080c,
+       0x26bf, 0x00ee, 0x0005, 0xa065, 0x0160, 0x2008, 0x609c, 0xa005,
+       0x0128, 0x2062, 0x609f, 0x0000, 0xa065, 0x0cc0, 0x7848, 0x794a,
+       0x2062, 0x0005, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9, 0x001c,
+       0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828, 0x601a,
+       0x682c, 0x6022, 0x0005, 0x00e6, 0xd7fc, 0x1128, 0x2071, 0x4740,
+       0x2031, 0x47c0, 0x0020, 0x2071, 0x4780, 0x2031, 0x49c0, 0x704c,
+       0xa08c, 0x0200, 0x1128, 0xa608, 0x2d0a, 0x8000, 0x704e, 0xa006,
+       0x00ee, 0x0005, 0x00f6, 0xd7fc, 0x1118, 0x2079, 0x4740, 0x0010,
+       0x2079, 0x4780, 0x080c, 0x1b9a, 0x2091, 0x8000, 0x6804, 0x780a,
+       0xa065, 0x05f0, 0x0030, 0x2c00, 0x780a, 0x2060, 0x6000, 0xa065,
+       0x05b8, 0x6010, 0xa306, 0x1db8, 0x600c, 0xa206, 0x1da0, 0x2c28,
+       0x7848, 0xac06, 0x1108, 0x0448, 0x6804, 0xac06, 0x1140, 0x6000,
+       0x2060, 0x6806, 0xa005, 0x1118, 0x6803, 0x0000, 0x0048, 0x6400,
+       0x7808, 0x2060, 0x6402, 0xa486, 0x0000, 0x1110, 0x2c00, 0x6802,
+       0x2560, 0x080c, 0x1c02, 0x601b, 0x0005, 0x6023, 0x0020, 0x00fe,
+       0x080c, 0x1db2, 0x00f6, 0x7908, 0x8109, 0x790a, 0x6810, 0x8001,
+       0x6812, 0x1118, 0x7810, 0xc0a5, 0x7812, 0x2001, 0xffff, 0xa005,
+       0x00fe, 0x0005, 0x0076, 0x2700, 0x2039, 0x0000, 0xd0fc, 0x0108,
+       0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x2091,
+       0x8000, 0x080c, 0x1bb2, 0x8738, 0xa784, 0x001f, 0x1dd0, 0xa7bc,
+       0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x1d90, 0x2091,
+       0x8001, 0x007e, 0x0005, 0x786c, 0x2009, 0x8f74, 0x210c, 0xa10d,
+       0x0118, 0xa065, 0x0804, 0x20a1, 0x2061, 0x0000, 0x6018, 0xd084,
+       0x11b8, 0x7810, 0xd08c, 0x0130, 0xc08c, 0x7812, 0xc7fc, 0x2069,
+       0x4740, 0x0028, 0xc08d, 0x7812, 0x2069, 0x4780, 0xc7fd, 0x2091,
+       0x8000, 0x681c, 0x681f, 0x0000, 0x2091, 0x8001, 0xa005, 0x1108,
+       0x0005, 0xa08c, 0xfff0, 0x0110, 0x080c, 0x2575, 0x0002, 0x1cd7,
+       0x1cda, 0x1ce0, 0x1ce4, 0x1cd8, 0x1ce8, 0x1cd8, 0x1cd8, 0x1cd8,
+       0x1cee, 0x1d18, 0x1d1b, 0x1d20, 0x1d29, 0x1cd8, 0x1cd8, 0x0005,
+       0x080c, 0x2575, 0x080c, 0x1c7a, 0x2001, 0x8001, 0x0804, 0x1d32,
+       0x2001, 0x8003, 0x0804, 0x1d32, 0x2001, 0x8004, 0x0804, 0x1d32,
+       0x080c, 0x1c7a, 0x2001, 0x8006, 0x0804, 0x1d32, 0x2011, 0x800a,
+       0x2091, 0x8000, 0xd7fc, 0x1118, 0x2069, 0x4740, 0x0010, 0x2069,
+       0x4780, 0x2038, 0x6800, 0xa086, 0x0000, 0x0120, 0x6f1e, 0x2091,
+       0x8001, 0x0005, 0x0026, 0x6870, 0xa0bc, 0xff00, 0x2041, 0x0021,
+       0x2049, 0x0004, 0x2051, 0x0010, 0x080c, 0x1bb2, 0x8738, 0xa784,
+       0x001f, 0x1dd0, 0x2091, 0x8001, 0x000e, 0x6970, 0x71c6, 0x00d0,
+       0x2001, 0x800c, 0x00b8, 0x080c, 0x1c7a, 0x2001, 0x800d, 0x0090,
+       0xd7fc, 0x0110, 0x78e4, 0x0008, 0x78e0, 0x70c6, 0x2001, 0x800e,
+       0x0048, 0xd7fc, 0x0110, 0x78ec, 0x0008, 0x78e8, 0x70c6, 0x2001,
+       0x800f, 0x0000, 0x70c2, 0xd7fc, 0x1118, 0x70db, 0x0000, 0x0010,
+       0x70db, 0x0001, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x4080,
+       0x0005, 0xac80, 0x0001, 0x81ff, 0x0518, 0x2099, 0x0030, 0x20a0,
+       0x700c, 0xa084, 0x07ff, 0x0100, 0x7018, 0x0006, 0x701c, 0x0006,
+       0x7020, 0x0006, 0x7024, 0x0006, 0x7112, 0x81ac, 0x721a, 0x731e,
+       0x7422, 0x7526, 0x7003, 0x0001, 0x7007, 0x0001, 0x7008, 0x800b,
+       0x1ee8, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x1110, 0x53a5, 0xa006,
+       0x7003, 0x0000, 0x7007, 0x0004, 0x000e, 0x7026, 0x000e, 0x7022,
+       0x000e, 0x701e, 0x000e, 0x701a, 0x0005, 0x2011, 0x0020, 0x2009,
+       0x0010, 0x6b0a, 0x6c0e, 0x681f, 0x0201, 0x6803, 0xfd20, 0x6807,
+       0x0038, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004, 0x8109,
+       0x1d80, 0x0005, 0x70ec, 0xd0dc, 0x1520, 0x2029, 0x0001, 0x7814,
+       0xd0cc, 0x1160, 0x70ec, 0xd0e4, 0x2019, 0x0c0a, 0x2021, 0x000a,
+       0x1120, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x0070, 0x70ec, 0xd0e4,
+       0x1128, 0x2019, 0x180c, 0x2021, 0x000c, 0x0030, 0x2019, 0x1809,
+       0x2021, 0x0009, 0xa5ad, 0x0200, 0x6b0a, 0x6c0e, 0x6d1e, 0x6807,
+       0x0038, 0x0005, 0x6004, 0x6086, 0x2c08, 0x2063, 0x0000, 0x7868,
+       0xa005, 0x796a, 0x0110, 0x2c02, 0x0008, 0x796e, 0x0005, 0x00c6,
+       0x2061, 0x4700, 0x6887, 0x0103, 0x2d08, 0x206b, 0x0000, 0x6068,
+       0xa005, 0x616a, 0x0110, 0x2d02, 0x0008, 0x616e, 0x00ce, 0x0005,
+       0x2091, 0x8000, 0x2c04, 0x786e, 0xa005, 0x1108, 0x786a, 0x2091,
+       0x8001, 0x609c, 0xa005, 0x0188, 0x00c6, 0x2060, 0x2008, 0x609c,
+       0xa005, 0x0138, 0x2062, 0x609f, 0x0000, 0xa065, 0x609c, 0xa005,
+       0x1dc8, 0x7848, 0x794a, 0x2062, 0x00ce, 0x7848, 0x2062, 0x609f,
+       0x0000, 0xac85, 0x0000, 0x1110, 0x080c, 0x2575, 0x784a, 0x0005,
+       0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x1208, 0xa200,
+       0x1f04, 0x1dfc, 0x8086, 0x818e, 0x0005, 0x0156, 0x20a9, 0x0010,
+       0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213, 0x818d, 0x0228, 0xa11a,
+       0x1220, 0x1f04, 0x1e0c, 0x0028, 0xa11a, 0x2308, 0x8210, 0x1f04,
+       0x1e0c, 0x0006, 0x3200, 0xa084, 0xefff, 0x2080, 0x000e, 0x015e,
+       0x0005, 0x0006, 0x3200, 0xa085, 0x1000, 0x0cb8, 0x7d74, 0x70d0,
+       0xa506, 0x0904, 0x1eda, 0x7810, 0x2050, 0x080c, 0x1b77, 0x0904,
+       0x1eda, 0xa046, 0x7970, 0x2500, 0x8000, 0xa112, 0x2009, 0x0040,
+       0x1208, 0x0030, 0x72d0, 0xa206, 0x0118, 0x8840, 0x2009, 0x0080,
+       0x00c6, 0x7112, 0x7007, 0x0001, 0x2099, 0x0030, 0x20a9, 0x0020,
+       0xac80, 0x0001, 0x20a0, 0x2061, 0x0000, 0x88ff, 0x0110, 0x080c,
+       0x1b77, 0x7008, 0xd0fc, 0x0de8, 0x7007, 0x0002, 0x2091, 0x8001,
+       0xa08c, 0x01e0, 0x1538, 0x53a5, 0x8cff, 0x1120, 0x88ff, 0x0904,
+       0x1ec7, 0x0050, 0x2c00, 0x788e, 0x20a9, 0x0020, 0xac80, 0x0001,
+       0x20a0, 0x53a5, 0x0804, 0x1ec7, 0xa046, 0x7218, 0x731c, 0xdac4,
+       0x0110, 0x7420, 0x7524, 0xa292, 0x0040, 0xa39b, 0x0000, 0xa4a3,
+       0x0000, 0xa5ab, 0x0000, 0x721a, 0x731e, 0xdac4, 0x0118, 0x7422,
+       0x7526, 0xa006, 0x7007, 0x0004, 0x0904, 0x1ec7, 0x8cff, 0x0110,
+       0x080c, 0x1b7f, 0x00ce, 0x080c, 0x1b7f, 0xa046, 0x7888, 0x8000,
+       0x788a, 0xa086, 0x0002, 0x01c0, 0x7a7c, 0x7b78, 0xdac4, 0x0110,
+       0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399,
+       0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x721a, 0x731e, 0xdac4,
+       0x0588, 0x7422, 0x7526, 0x0470, 0x6014, 0xd0fc, 0x1118, 0x2069,
+       0x4740, 0x0010, 0x2069, 0x4780, 0x2091, 0x8000, 0x681f, 0x0002,
+       0x88ff, 0x0120, 0xa046, 0x788c, 0x2060, 0x0c70, 0x788b, 0x0000,
+       0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091, 0x8001, 0x0098, 0x00ce,
+       0x788b, 0x0000, 0x080c, 0x205c, 0x6004, 0xa084, 0x000f, 0x0059,
+       0x88ff, 0x0130, 0x788c, 0x2060, 0x6004, 0xa084, 0x000f, 0x0019,
+       0x0804, 0x1e26, 0x0005, 0x0002, 0x1eec, 0x1f07, 0x1f20, 0x1eec,
+       0x1f2d, 0x1efd, 0x1eec, 0x1eec, 0x1eec, 0x1f05, 0x1f1e, 0x1eec,
+       0x1eec, 0x1eec, 0x1eec, 0x1eec, 0x2039, 0x0400, 0x78bc, 0xa705,
+       0x78be, 0x6008, 0xa705, 0x600a, 0x080c, 0x1f69, 0x609c, 0x78ba,
+       0x609f, 0x0000, 0x080c, 0x2048, 0x0005, 0x78bc, 0xd0c4, 0x0108,
+       0x0c58, 0x601c, 0xc0bd, 0x601e, 0x0030, 0x080c, 0x2086, 0x78bc,
+       0xd0c4, 0x0108, 0x0c08, 0x78bf, 0x0000, 0x6004, 0x8007, 0xa084,
+       0x00ff, 0x78b2, 0x8001, 0x0138, 0x080c, 0x1f69, 0x0120, 0x78bc,
+       0xc0c5, 0x78be, 0x0010, 0x0804, 0x1f84, 0x0005, 0x080c, 0x2083,
+       0x78bc, 0xa08c, 0x0e00, 0x1110, 0xd0c4, 0x1108, 0x0828, 0x080c,
+       0x1f69, 0x1110, 0x0804, 0x1f84, 0x0005, 0x78bc, 0xd0c4, 0x0110,
+       0x0804, 0x1eec, 0x78bf, 0x0000, 0x6714, 0x2011, 0x0001, 0x22a8,
+       0x6018, 0xa084, 0x00ff, 0xa005, 0x0188, 0xa7bc, 0xff00, 0x20a9,
+       0x0020, 0xa08e, 0x0001, 0x0150, 0xa7bc, 0x8000, 0x2011, 0x0002,
+       0x20a9, 0x0100, 0xa08e, 0x0002, 0x0108, 0x00c0, 0x080c, 0x1b9a,
+       0x2d00, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000, 0x6808,
+       0xa084, 0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001, 0x1f04,
+       0x1f51, 0x8211, 0x0118, 0x20a9, 0x0100, 0x0c58, 0x080c, 0x1b7f,
+       0x0005, 0x609f, 0x0000, 0x78b4, 0xa06d, 0x2c00, 0x78b6, 0x1110,
+       0x78ba, 0x0038, 0x689e, 0x2d00, 0x6002, 0x78b8, 0xad06, 0x1108,
+       0x6002, 0x78b0, 0x8001, 0x78b2, 0x1130, 0x78bc, 0xc0c4, 0x78be,
+       0x78b8, 0x2060, 0xa006, 0x0005, 0x00e6, 0xa02e, 0x2530, 0x7dba,
+       0x7db6, 0x65ae, 0x65b2, 0x601c, 0x60a2, 0x2048, 0xa984, 0xe1ff,
+       0x601e, 0xa984, 0x0060, 0x0160, 0x080c, 0x3fe9, 0x86ff, 0x1140,
+       0x85ff, 0x1130, 0x2039, 0x0800, 0x080c, 0x2048, 0x0804, 0x2046,
+       0x6596, 0x65a6, 0x669a, 0x66aa, 0x6714, 0x2071, 0x4780, 0xd7fc,
+       0x1110, 0x2071, 0x4740, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f,
+       0x0120, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x71c0, 0xa168,
+       0x2700, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x71c4,
+       0xa100, 0x60c2, 0x2091, 0x8000, 0x7814, 0xd0c4, 0x0138, 0xd7fc,
+       0x1118, 0xd0f4, 0x1140, 0x0010, 0xd0fc, 0x1128, 0x6e08, 0xd684,
+       0x01f0, 0xd9fc, 0x11e0, 0x2091, 0x8001, 0x080c, 0x1c02, 0x2091,
+       0x8000, 0x080c, 0x1db2, 0x2091, 0x8001, 0x7814, 0xd0c4, 0x0904,
+       0x2046, 0xd7fc, 0x1120, 0xd0f4, 0x1130, 0x0804, 0x2046, 0xd0fc,
+       0x1110, 0x0804, 0x2046, 0x601b, 0x0021, 0x0804, 0x2046, 0x6024,
+       0xa096, 0x0001, 0x1110, 0x8000, 0x6026, 0x6a10, 0x6814, 0xa202,
+       0x0268, 0x0160, 0x2091, 0x8001, 0x2039, 0x0200, 0x609c, 0x78ba,
+       0x609f, 0x0000, 0x080c, 0x2048, 0x0804, 0x2046, 0x2c08, 0xd9fc,
+       0x01f0, 0x6800, 0xa065, 0x01d8, 0x6a04, 0x7000, 0xa084, 0x0002,
+       0x0168, 0x7048, 0xa206, 0x1150, 0x6b04, 0x2160, 0x2304, 0x6002,
+       0xa005, 0x1108, 0x6902, 0x2260, 0x6102, 0x0098, 0x2d00, 0x2060,
+       0x080c, 0x26bf, 0x6e08, 0x2160, 0x6202, 0x6906, 0x0050, 0x6800,
+       0x6902, 0xa065, 0x0110, 0x6102, 0x0008, 0x6906, 0x2160, 0x6003,
+       0x0000, 0x2160, 0xd9fc, 0x0118, 0xa6b4, 0xfffc, 0x6e0a, 0x6810,
+       0x7d08, 0x8528, 0x7d0a, 0x8000, 0x6812, 0x2091, 0x8001, 0xd6b4,
+       0x0128, 0xa6b6, 0x0040, 0x6e0a, 0x080c, 0x1c13, 0x00ee, 0x0005,
+       0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x080c, 0x1db2, 0x2091,
+       0x8001, 0x78b8, 0xa065, 0x0128, 0x609c, 0x78ba, 0x609f, 0x0000,
+       0x0c78, 0x78b6, 0x78ba, 0x0005, 0x7970, 0x7874, 0x2818, 0xd384,
+       0x0118, 0x8000, 0xa112, 0x0220, 0x8000, 0xa112, 0x1278, 0xc384,
+       0x7a7c, 0x721a, 0x7a78, 0x721e, 0xdac4, 0x0120, 0x7a84, 0x7222,
+       0x7a80, 0x7226, 0xa006, 0xd384, 0x0108, 0x8000, 0x7876, 0x70d2,
+       0x781c, 0xa005, 0x0138, 0x8001, 0x781e, 0x1120, 0x0e04, 0x2082,
+       0x2091, 0x4080, 0x0005, 0x2039, 0x2098, 0x0010, 0x2039, 0x209e,
+       0x2704, 0xa005, 0x0160, 0xac00, 0x2068, 0x6908, 0x6810, 0x6912,
+       0x680a, 0x690c, 0x6814, 0x6916, 0x680e, 0x8738, 0x0c88, 0x0005,
+       0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0015, 0x001b,
+       0x0000, 0x2041, 0x0000, 0x780c, 0x0002, 0x224a, 0x2225, 0x20a9,
+       0x2119, 0x2039, 0x8f74, 0x2734, 0x7d10, 0x00c0, 0x6084, 0xa086,
+       0x0103, 0x1904, 0x2103, 0x6114, 0x6018, 0xa105, 0x0120, 0x86ff,
+       0x11d8, 0x0804, 0x2103, 0x8603, 0xa080, 0x8f55, 0x620c, 0x2202,
+       0x8000, 0x6210, 0x2202, 0x080c, 0x1dd0, 0x8630, 0xa68e, 0x000f,
+       0x0904, 0x2184, 0x786c, 0xa065, 0x1d08, 0x7808, 0xa602, 0x1220,
+       0xd5ac, 0x1110, 0x263a, 0x0005, 0xa682, 0x0003, 0x1a04, 0x2184,
+       0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x11f8, 0x2011,
+       0x8f55, 0x2204, 0x70c6, 0x8210, 0x2204, 0x70ca, 0xd684, 0x1130,
+       0x8210, 0x2204, 0x70da, 0x8210, 0x2204, 0x70de, 0xa685, 0x8020,
+       0x70c2, 0x681b, 0x0001, 0x2091, 0x4080, 0x7810, 0xa084, 0xffcf,
+       0x7812, 0x2091, 0x8001, 0x203b, 0x0000, 0x0005, 0x7810, 0xc0ad,
+       0x7812, 0x0804, 0x2184, 0x263a, 0x080c, 0x2250, 0x1904, 0x226c,
+       0x786c, 0xa065, 0x1904, 0x20ae, 0x2091, 0x8000, 0x7810, 0xa084,
+       0xffcf, 0x86ff, 0x0108, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0804,
+       0x226c, 0x2039, 0x8f74, 0x2734, 0x7d10, 0x00a0, 0x6084, 0xa086,
+       0x0103, 0x1904, 0x216e, 0x6114, 0x6018, 0xa105, 0x0120, 0x86ff,
+       0x11b8, 0x0804, 0x216e, 0xa680, 0x8f55, 0x620c, 0x2202, 0x080c,
+       0x1dd0, 0x8630, 0xa68e, 0x001e, 0x0904, 0x2184, 0x786c, 0xa065,
+       0x1d28, 0x7808, 0xa602, 0x1220, 0xd5ac, 0x1110, 0x263a, 0x0005,
+       0xa682, 0x0006, 0x1a04, 0x2184, 0x2091, 0x8000, 0x2069, 0x0000,
+       0x6818, 0xd084, 0x11f8, 0x2011, 0x8f55, 0x2009, 0x8f4e, 0x26a8,
+       0x211c, 0x2204, 0x201a, 0x8108, 0x8210, 0x1f04, 0x2150, 0xa685,
+       0x8030, 0x70c2, 0x681b, 0x0001, 0x2091, 0x4080, 0x7810, 0xa084,
+       0xffcf, 0x7812, 0x2091, 0x8001, 0xa006, 0x2009, 0x8f75, 0x200a,
+       0x203a, 0x0005, 0x7810, 0xc0ad, 0x7812, 0x00b0, 0x263a, 0x080c,
+       0x2250, 0x1904, 0x226c, 0x786c, 0xa065, 0x1904, 0x211e, 0x2091,
+       0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0108, 0xc0ad, 0x7812,
+       0x2091, 0x8001, 0x0804, 0x226c, 0x2091, 0x8000, 0x7007, 0x0004,
+       0x7994, 0x70d4, 0xa102, 0x0228, 0x0168, 0x7b90, 0xa302, 0x1150,
+       0x0010, 0x8002, 0x1138, 0x263a, 0x7810, 0xc0ad, 0x7812, 0x2091,
+       0x8001, 0x0005, 0xa184, 0xff00, 0x0140, 0x810f, 0x810c, 0x810c,
+       0x8004, 0x8004, 0x8007, 0xa100, 0x0018, 0x8107, 0x8004, 0x8004,
+       0x7a9c, 0xa210, 0x721a, 0x7a98, 0xa006, 0xa211, 0x721e, 0xd4c4,
+       0x0130, 0x7aa4, 0xa211, 0x7222, 0x7aa0, 0xa211, 0x7226, 0x20a1,
+       0x0030, 0x7003, 0x0000, 0x2009, 0x8f54, 0x260a, 0x8109, 0x2198,
+       0x2104, 0xd084, 0x0108, 0x8633, 0xa6b0, 0x0002, 0x26a8, 0x53a6,
+       0x8603, 0x7012, 0x7007, 0x0001, 0x7990, 0x7894, 0x8000, 0xa10a,
+       0x1208, 0xa006, 0x2028, 0x7974, 0xa184, 0xff00, 0x0140, 0x810f,
+       0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018, 0x8107,
+       0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006, 0xa211, 0xd4c4,
+       0x0120, 0x7b84, 0xa319, 0x7c80, 0xa421, 0x7008, 0xd0fc, 0x0de8,
+       0xa084, 0x01e0, 0x01d0, 0x7d10, 0x2031, 0x8f54, 0x2634, 0x78a8,
+       0x8000, 0x78aa, 0xd08c, 0x1138, 0x7007, 0x0006, 0x7004, 0xd094,
+       0x1de8, 0x0804, 0x2186, 0x2069, 0x4747, 0x206b, 0x0003, 0x78ac,
+       0xa085, 0x0300, 0x78ae, 0xa006, 0x0048, 0x2030, 0x75d6, 0x2091,
+       0x4080, 0x7d96, 0x7d10, 0xa5ac, 0xffcf, 0x7d12, 0x2091, 0x8001,
+       0x78aa, 0x7007, 0x0006, 0x263a, 0x7003, 0x0001, 0x711a, 0x721e,
+       0xd5c4, 0x0110, 0x7322, 0x7426, 0x0005, 0x6084, 0xa086, 0x0103,
+       0x11d8, 0x6114, 0x6018, 0xa105, 0x11b8, 0x2069, 0x0000, 0x6818,
+       0xd084, 0x1190, 0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020,
+       0x681b, 0x0001, 0x2091, 0x4080, 0x080c, 0x1dd0, 0x0e04, 0x2243,
+       0x786c, 0xa065, 0x1d10, 0x0005, 0x0059, 0x1530, 0x786c, 0xa065,
+       0x19e0, 0x0410, 0x0029, 0x1500, 0x786c, 0xa065, 0x1dd8, 0x00e0,
+       0x6084, 0xa086, 0x0103, 0x1168, 0x6018, 0xc0fc, 0x601a, 0xa086,
+       0x0004, 0x1138, 0x7804, 0xd0a4, 0x0120, 0x080c, 0x1dd0, 0xa006,
+       0x0005, 0x0079, 0x1118, 0xa085, 0x0001, 0x0005, 0x00b9, 0x1110,
+       0x2041, 0x0001, 0x7d10, 0x0005, 0x88ff, 0x0110, 0x2091, 0x4080,
+       0x0005, 0x7b90, 0x7994, 0x70d4, 0xa102, 0x1118, 0xa385, 0x0000,
+       0x0005, 0x0210, 0xa302, 0x0005, 0x8002, 0x0005, 0xa184, 0xff00,
+       0x0140, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
+       0x0018, 0x8107, 0x8004, 0x8004, 0x7a9c, 0x7b98, 0x7ca4, 0x7da0,
+       0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009, 0x0018, 0x6028,
+       0xa005, 0x0110, 0x2009, 0x0040, 0x080c, 0x1b34, 0x01d0, 0x78a8,
+       0x8000, 0x78aa, 0xd08c, 0x1510, 0x6014, 0xd0fc, 0x1118, 0x2069,
+       0x4740, 0x0010, 0x2069, 0x4780, 0x2091, 0x8000, 0x681f, 0x0003,
+       0x78ab, 0x0000, 0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091, 0x8001,
+       0x0068, 0x78ab, 0x0000, 0x080c, 0x1dd0, 0x7990, 0x7894, 0x8000,
+       0xa10a, 0x1208, 0xa006, 0x7896, 0x70d6, 0xa006, 0x2071, 0x0010,
+       0x2091, 0x8001, 0x0005, 0xd7fc, 0x1118, 0x2009, 0x4758, 0x0010,
+       0x2009, 0x4798, 0x2091, 0x8000, 0x200a, 0x00f6, 0x2009, 0x4780,
+       0x2079, 0x0100, 0xd7fc, 0x1120, 0x2009, 0x4740, 0x2079, 0x0200,
+       0x2104, 0xa086, 0x0000, 0x1180, 0xd7fc, 0x1118, 0x2009, 0x4745,
+       0x0010, 0x2009, 0x4785, 0x2104, 0xa005, 0x1130, 0x7830, 0xa084,
+       0x00c0, 0x1110, 0x781b, 0x0052, 0x00fe, 0x0005, 0x2009, 0x0002,
+       0x2069, 0x4700, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x234b,
+       0x2071, 0x4780, 0x2079, 0x0100, 0x2021, 0x49bf, 0x784b, 0x000f,
+       0x2001, 0x01ff, 0x2004, 0xd0fc, 0x0118, 0x2019, 0x3e37, 0x0030,
+       0x20a1, 0x012b, 0x2019, 0x3e37, 0xd184, 0x0110, 0x20a1, 0x022b,
+       0x2304, 0xa005, 0x0140, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398,
+       0x53a6, 0x3318, 0x0ca8, 0x789b, 0x0000, 0x789b, 0x0020, 0x20a9,
+       0x0010, 0x78af, 0x0000, 0x78af, 0x2020, 0x1f04, 0x2329, 0x7003,
+       0x0000, 0x0016, 0xd18c, 0x2009, 0x0000, 0x0108, 0xc1bd, 0x080c,
+       0x246c, 0x001e, 0x7020, 0xa084, 0x000f, 0xa085, 0x6300, 0x7806,
+       0x780f, 0x9000, 0x7843, 0x00d8, 0x7853, 0x0090, 0x780b, 0x2f08,
+       0x7452, 0x704f, 0x0000, 0x8109, 0x0140, 0x2071, 0x4740, 0x2079,
+       0x0200, 0x2021, 0x47bf, 0x0804, 0x2306, 0x080c, 0x2526, 0x0005,
+       0x0016, 0x2011, 0x0101, 0xd1bc, 0x1110, 0x2011, 0x0201, 0xa18c,
+       0x000f, 0x2204, 0xa084, 0xfff0, 0xa105, 0x2012, 0x001e, 0x080c,
+       0x246c, 0x0005, 0x2011, 0x0101, 0xd3fc, 0x1110, 0x2011, 0x0201,
+       0x20a9, 0x0009, 0x810b, 0x1f04, 0x2372, 0xa18c, 0x0e00, 0x2204,
+       0xa084, 0xf1ff, 0xa105, 0x2012, 0x0005, 0x2019, 0x0002, 0x2009,
+       0x0101, 0x20a9, 0x0005, 0x8213, 0x1f04, 0x2383, 0xa294, 0x00e0,
+       0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x8319, 0x0118, 0x2009,
+       0x0201, 0x0c78, 0x0005, 0x2011, 0x0101, 0xd3fc, 0x1110, 0x2011,
+       0x0201, 0x20a9, 0x000c, 0x810b, 0x1f04, 0x239b, 0xa18c, 0xf000,
+       0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x0005, 0x2011, 0x0102,
+       0xd3fc, 0x1110, 0x2011, 0x0202, 0x2204, 0xa09c, 0x0f30, 0xa084,
+       0xf0cf, 0xa105, 0x2012, 0x0005, 0x00c6, 0x2061, 0x0100, 0xd1bc,
+       0x1110, 0x2061, 0x0200, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020,
+       0x609a, 0x62ac, 0x63ac, 0x00ce, 0x0005, 0x00c6, 0x2061, 0x0100,
+       0xd1bc, 0x1110, 0x2061, 0x0200, 0xc1bc, 0x8103, 0x8003, 0xa080,
+       0x0022, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x00ce, 0x0005,
+       0x00c6, 0x2061, 0x0100, 0xd1bc, 0x1110, 0x2061, 0x0200, 0xc1bc,
+       0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x60a4, 0xa28c, 0x0020,
+       0x0118, 0xc2ac, 0xa39d, 0x4000, 0xc3ec, 0xd3b4, 0x1108, 0xc3ed,
+       0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x00ce, 0x0005, 0x2091,
+       0x8000, 0x00c6, 0x00e6, 0x6818, 0xa005, 0x0904, 0x2450, 0xd1fc,
+       0x0118, 0x2061, 0x8ed0, 0x0010, 0x2061, 0x8dc0, 0x080c, 0x2458,
+       0x0560, 0x20a9, 0x0101, 0xd1fc, 0x0118, 0x2061, 0x8dd0, 0x0010,
+       0x2061, 0x8cc0, 0x00c6, 0x080c, 0x2458, 0x0128, 0x00ce, 0x8c60,
+       0x1f04, 0x2412, 0x04a8, 0x000e, 0xd1fc, 0x0128, 0xa082, 0x8dd0,
+       0x2071, 0x4780, 0x0020, 0xa082, 0x8cc0, 0x2071, 0x4740, 0x7076,
+       0x7172, 0x2138, 0x2001, 0x0004, 0x7062, 0x707f, 0x000f, 0x71d0,
+       0xc1c4, 0x71d2, 0x080c, 0x22cb, 0x00c0, 0xd1fc, 0x1118, 0x2071,
+       0x4740, 0x0010, 0x2071, 0x4780, 0x6020, 0xc0dd, 0x6022, 0x7172,
+       0x2138, 0x2c00, 0x707a, 0x2001, 0x0006, 0x7062, 0x707f, 0x000f,
+       0x71d0, 0xc1c4, 0x71d2, 0x080c, 0x22cb, 0x2001, 0x0000, 0x0010,
+       0x2001, 0x0001, 0x2091, 0x8001, 0xa005, 0x00ee, 0x00ce, 0x0005,
+       0x2c04, 0xa005, 0x0170, 0x2060, 0x6010, 0xa306, 0x1140, 0x600c,
+       0xa206, 0x1128, 0x6014, 0xa106, 0x1110, 0xa006, 0x0020, 0x6000,
+       0x0c80, 0xa085, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x0016, 0x2079,
+       0x4780, 0x2071, 0x0100, 0xd1bc, 0x1120, 0x2079, 0x4740, 0x2071,
+       0x0200, 0x7920, 0xa18c, 0x000f, 0x70ec, 0xd0c4, 0x1110, 0x001e,
+       0x0060, 0x810b, 0x810b, 0x810b, 0x810b, 0x000e, 0xa18d, 0x0800,
+       0xd0bc, 0x1110, 0xa18d, 0x0f00, 0x2104, 0x00ee, 0x00fe, 0x0005,
+       0x2001, 0x4701, 0x2004, 0xd0ac, 0x1138, 0x68e4, 0xd0ac, 0x0120,
+       0xa084, 0x0006, 0x1108, 0x0009, 0x0005, 0x6014, 0x00e6, 0x0036,
+       0x2018, 0x2071, 0x4c40, 0xd0fc, 0x1110, 0x2071, 0x4bc0, 0x8007,
+       0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xae70, 0x7004, 0xa084,
+       0x000a, 0x1904, 0x2523, 0x7108, 0xa194, 0xff00, 0x0904, 0x2523,
+       0xa18c, 0x00ff, 0x701c, 0xa084, 0xff00, 0x01c0, 0x7004, 0xa085,
+       0x003a, 0x7006, 0x2001, 0x0009, 0xa102, 0x16d8, 0x2001, 0x000a,
+       0xa102, 0x16d0, 0x2001, 0x000c, 0xa102, 0x16c8, 0x701c, 0xa084,
+       0x00ff, 0x701e, 0x7004, 0xa084, 0xffdf, 0x7006, 0x2001, 0x000a,
+       0xa106, 0x01a8, 0x2001, 0x000c, 0xa106, 0x01a0, 0x2001, 0x0012,
+       0xa106, 0x0198, 0x2001, 0x0014, 0xa106, 0x0190, 0x2001, 0x0019,
+       0xa106, 0x0188, 0x2001, 0x0032, 0xa106, 0x0180, 0x00d8, 0x2009,
+       0x000c, 0x00d0, 0x2009, 0x0012, 0x00b8, 0x2009, 0x0014, 0x00a0,
+       0x2009, 0x0019, 0x0088, 0x2009, 0x0020, 0x0070, 0x2009, 0x003f,
+       0x0058, 0x2009, 0x000a, 0x0040, 0x2009, 0x000c, 0x0028, 0x2009,
+       0x0019, 0x0010, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a, 0x7004,
+       0xa085, 0x000a, 0x7006, 0x2071, 0x4700, 0x7004, 0xd0bc, 0x0158,
+       0xd3fc, 0x1120, 0x73ea, 0x2071, 0x4740, 0x0018, 0x73ee, 0x2071,
+       0x4780, 0x701f, 0x000d, 0x003e, 0x00ee, 0x0005, 0x2001, 0x01ff,
+       0x2004, 0xd0fc, 0x11d0, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
+       0x12a0, 0x2071, 0x0200, 0x71ec, 0xa18c, 0x1c00, 0x810f, 0x810c,
+       0x810c, 0x2079, 0x0100, 0x78ec, 0xa084, 0x1c00, 0x8007, 0x8004,
+       0x8004, 0xa105, 0xa08a, 0x0007, 0x0208, 0x0005, 0x0002, 0x2574,
+       0x255b, 0x2574, 0x255b, 0x254e, 0x2568, 0x254e, 0x7008, 0xa084,
+       0xc3ff, 0xa085, 0x3000, 0x700a, 0x7808, 0xa084, 0xc3ff, 0xa085,
+       0x3000, 0x780a, 0x0005, 0x7008, 0xa084, 0xc3ff, 0xa085, 0x2000,
+       0x700a, 0x7808, 0xa084, 0xc3ff, 0xa085, 0x2000, 0x780a, 0x0005,
+       0x7008, 0xa084, 0xc3ff, 0xa085, 0x0c00, 0x700a, 0x7808, 0xa084,
+       0xc3ff, 0xa085, 0x0c00, 0x780a, 0x0005, 0x0e04, 0x2575, 0x2091,
+       0x8000, 0x2071, 0x0000, 0x0006, 0x7018, 0xd084, 0x1de8, 0x000e,
+       0x2071, 0x0010, 0x70ca, 0x000e, 0x70c6, 0x70c3, 0x8002, 0x70db,
+       0x0a04, 0x70df, 0x002a, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091,
+       0x4080, 0x0cf8, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, 0x708a,
+       0x758e, 0x7492, 0x7696, 0x779a, 0xa594, 0x003f, 0xd4f4, 0x0138,
+       0xd7bc, 0x1128, 0xa784, 0x007d, 0x1904, 0x3c9c, 0x0871, 0xa49c,
+       0x000f, 0xa382, 0x0004, 0x0320, 0xa3a6, 0x0007, 0x1930, 0x2418,
+       0x8507, 0xa084, 0x000f, 0x0002, 0x2b6c, 0x2c57, 0x2c95, 0x2efb,
+       0x3279, 0x32d0, 0x3376, 0x3405, 0x34d9, 0x35ab, 0x25c7, 0x25c4,
+       0x299e, 0x2a85, 0x324d, 0x25c4, 0x080c, 0x2575, 0x0005, 0xa006,
+       0x0038, 0x7808, 0xc08d, 0x780a, 0xa006, 0x7002, 0x704a, 0x7042,
+       0x70ce, 0x705c, 0xa005, 0x1904, 0x2718, 0x7060, 0xa084, 0x0007,
+       0x0002, 0x25e1, 0x2652, 0x265a, 0x2663, 0x266c, 0x26fe, 0x2675,
+       0x2652, 0x7830, 0xd0bc, 0x1d10, 0x71d0, 0xd1bc, 0x19f8, 0xd1b4,
+       0x1904, 0x262f, 0x70a0, 0xa086, 0x0001, 0x09c0, 0x7014, 0xa005,
+       0x19a8, 0x70b0, 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0080,
+       0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d,
+       0xa886, 0x0001, 0x0118, 0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d,
+       0x6e1c, 0x2001, 0x0010, 0x0804, 0x284b, 0x705c, 0xa005, 0x1904,
+       0x25c6, 0x00c6, 0x00d6, 0x70b0, 0xa06d, 0x6800, 0xa065, 0xa055,
+       0x789b, 0x0080, 0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804,
+       0xa06d, 0xa05d, 0xa886, 0x0001, 0x0118, 0x69bc, 0x7daa, 0x79aa,
+       0x68c0, 0xa04d, 0x6e1c, 0x2001, 0x0020, 0x0804, 0x284b, 0x080c,
+       0x3c5b, 0x1904, 0x25c6, 0x781b, 0x0068, 0x70b8, 0xa06d, 0x68b4,
+       0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808,
+       0xc08d, 0x780a, 0x68bc, 0x703e, 0xc1b4, 0x71d2, 0x70b4, 0xa065,
+       0x68c0, 0x7056, 0x7003, 0x0002, 0x2d00, 0x704a, 0xad80, 0x0009,
+       0x7042, 0x0005, 0x080c, 0x3c5b, 0x1120, 0x781b, 0x0054, 0x7003,
+       0x0004, 0x0005, 0x080c, 0x3c5b, 0x1128, 0x2011, 0x000c, 0x0419,
+       0x7003, 0x0004, 0x0005, 0x080c, 0x3c5b, 0x1128, 0x2011, 0x0006,
+       0x00d1, 0x7003, 0x0004, 0x0005, 0x080c, 0x3c5b, 0x1128, 0x2011,
+       0x000d, 0x0089, 0x7003, 0x0004, 0x0005, 0x080c, 0x3c5b, 0x1150,
+       0x2011, 0x0006, 0x0041, 0x7078, 0x707b, 0x0000, 0x2068, 0x704a,
+       0x7003, 0x0004, 0x0005, 0x7170, 0xc1fc, 0x8107, 0x7882, 0x789b,
+       0x0080, 0xa286, 0x000c, 0x1120, 0x7aaa, 0x2001, 0x0001, 0x0098,
+       0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0xa286, 0x000d, 0x0120,
+       0x7aaa, 0x2001, 0x0002, 0x0038, 0x78ab, 0x0020, 0x7174, 0x79aa,
+       0x7aaa, 0x2001, 0x0004, 0x789b, 0x0060, 0x78aa, 0x785b, 0x0004,
+       0x781b, 0x0113, 0x080c, 0x3c6e, 0x707f, 0x000f, 0x70d0, 0xd0b4,
+       0x0168, 0xc0b4, 0x70d2, 0x00c6, 0x70b4, 0xa065, 0x6008, 0xa084,
+       0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x00ce, 0x0005, 0x7014,
+       0xa005, 0x1138, 0x70d0, 0xd0b4, 0x0128, 0x70b4, 0xac06, 0x1110,
+       0x0c29, 0x0005, 0x0016, 0x71a0, 0xa186, 0x0001, 0x0528, 0x00d6,
+       0x0026, 0x2100, 0x2011, 0x0001, 0xa212, 0x70b0, 0x2068, 0x6800,
+       0xac06, 0x0120, 0x8211, 0x01b0, 0x00c9, 0x0cc8, 0x00c6, 0x2100,
+       0x2011, 0x0001, 0xa212, 0x70b0, 0x2068, 0x6800, 0x2060, 0x6008,
+       0xa084, 0xfbef, 0x600a, 0x8211, 0x0110, 0x0041, 0x0cb0, 0x70a3,
+       0x0001, 0x00ce, 0x002e, 0x00de, 0x001e, 0x0005, 0xade8, 0x0005,
+       0x70a8, 0xad06, 0x1110, 0x70a4, 0x2068, 0x0005, 0x080c, 0x3c5b,
+       0x1904, 0x25c6, 0x7078, 0x2068, 0x7770, 0x080c, 0x3b95, 0x2c50,
+       0x080c, 0x3cf6, 0x789b, 0x0080, 0x6814, 0xa084, 0x001f, 0xc0bd,
+       0x78aa, 0x6e1c, 0x2041, 0x0001, 0x2001, 0x0004, 0x0804, 0x2850,
+       0x080c, 0x3c5b, 0x1904, 0x25c6, 0x789b, 0x0080, 0x705c, 0x2068,
+       0x6f14, 0x70d0, 0xd0b4, 0x0168, 0xc0b4, 0x70d2, 0x00c6, 0x70b4,
+       0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a,
+       0x00ce, 0x080c, 0x3b95, 0x2c50, 0x080c, 0x3cf6, 0x6824, 0xa005,
+       0x0130, 0xa082, 0x0006, 0x0208, 0x0010, 0x6827, 0x0005, 0x6814,
+       0xa084, 0x001f, 0xc0bd, 0x78aa, 0x2031, 0x0020, 0x2041, 0x0001,
+       0x2001, 0x0003, 0x0804, 0x2850, 0xc28d, 0x72d2, 0x72bc, 0xa200,
+       0xa015, 0x7150, 0x8108, 0xa12a, 0x0208, 0x71bc, 0x2164, 0x6504,
+       0x85ff, 0x1170, 0x7152, 0x8421, 0x1da8, 0x70d0, 0xd08c, 0x0128,
+       0x70cc, 0xa005, 0x1110, 0x70cf, 0x000a, 0x0005, 0x2200, 0x0c90,
+       0x70d0, 0xc08c, 0x70d2, 0x70cf, 0x0000, 0x6034, 0xa005, 0x1db0,
+       0x6708, 0xa784, 0x073f, 0x01d0, 0xd7d4, 0x1d80, 0xa784, 0x0021,
+       0x1d68, 0xa784, 0x0002, 0x0130, 0xa784, 0x0004, 0x0d38, 0xa7bc,
+       0xfffb, 0x670a, 0xa784, 0x0218, 0x1d08, 0xa784, 0x0100, 0x0130,
+       0x6018, 0xa005, 0x19d8, 0xa7bc, 0xfeff, 0x670a, 0x2568, 0x6823,
+       0x0000, 0x6e1c, 0xa684, 0x000e, 0x6318, 0x0128, 0x601c, 0xa302,
+       0x0220, 0x0118, 0x0858, 0x83ff, 0x1948, 0x2d58, 0x2c50, 0x7152,
+       0xd7bc, 0x1120, 0x7028, 0x6022, 0x603a, 0x0010, 0xc7bc, 0x670a,
+       0x68c0, 0xa065, 0xa04d, 0x6100, 0x2a60, 0x2041, 0x0001, 0x6b14,
+       0xa39c, 0x001f, 0xa39d, 0x00c0, 0xd1fc, 0x0110, 0xd684, 0x0110,
+       0xa39c, 0xffbf, 0xd6a4, 0x0110, 0xa39d, 0x0020, 0xa684, 0x000e,
+       0x1904, 0x2802, 0xc7a5, 0x670a, 0x2c00, 0x68c6, 0x77a0, 0xa786,
+       0x0001, 0x1178, 0x70d0, 0xd0b4, 0x1160, 0x7000, 0xa082, 0x0002,
+       0x1240, 0x7830, 0xd0bc, 0x1128, 0x789b, 0x0080, 0x7baa, 0x0804,
+       0x2849, 0x8739, 0x77a2, 0x2750, 0x77ac, 0xa7b0, 0x0005, 0x70a8,
+       0xa606, 0x1108, 0x76a4, 0x76ae, 0x2c3a, 0x8738, 0x2d3a, 0x8738,
+       0x283a, 0x8738, 0x233a, 0x8738, 0x253a, 0x7830, 0xd0bc, 0x0150,
+       0x2091, 0x8000, 0x2091, 0x303d, 0x70d0, 0xa084, 0x303d, 0x2091,
+       0x8000, 0x2090, 0xaad5, 0x0000, 0x0120, 0x8421, 0x2200, 0x1904,
+       0x2751, 0x0005, 0xd1dc, 0x0904, 0x37f1, 0x2029, 0x0020, 0xd69c,
+       0x1120, 0x8528, 0xd68c, 0x1108, 0x8528, 0x8840, 0x6f14, 0x610c,
+       0x8108, 0xa18c, 0x00ff, 0x70c8, 0xa160, 0x2c64, 0x8cff, 0x0188,
+       0x6014, 0xa706, 0x1dd0, 0x60b8, 0x8001, 0x60ba, 0x1d88, 0x2a60,
+       0x6008, 0xa085, 0x0100, 0x600a, 0x2200, 0x8421, 0x1904, 0x2751,
+       0x0005, 0x2a60, 0x610e, 0x69be, 0x2c00, 0x68c6, 0x8840, 0x6008,
+       0xc0d5, 0x600a, 0x77a0, 0xa786, 0x0001, 0x1904, 0x27d9, 0x70d0,
+       0xd0b4, 0x1904, 0x27d9, 0x7000, 0xa082, 0x0002, 0x1a04, 0x27d9,
+       0x7830, 0xd0bc, 0x1904, 0x27d9, 0x789b, 0x0080, 0x7baa, 0x7daa,
+       0x79aa, 0x2001, 0x0002, 0x0006, 0x6018, 0x8000, 0x601a, 0x0008,
+       0x0006, 0x2960, 0x6104, 0x2a60, 0x080c, 0x3d09, 0x1590, 0xa184,
+       0x0018, 0x0180, 0xa184, 0x0010, 0x0118, 0x080c, 0x399a, 0x1548,
+       0xa184, 0x0008, 0x0138, 0x69a0, 0xa184, 0x0600, 0x1118, 0x080c,
+       0x38b8, 0x00f8, 0x69a0, 0xa184, 0x1e00, 0x0528, 0xa184, 0x0800,
+       0x0178, 0x00c6, 0x2960, 0x6000, 0xa085, 0x2000, 0x6002, 0x6104,
+       0xa18d, 0x0010, 0x6106, 0x00ce, 0x080c, 0x399a, 0x1150, 0x69a0,
+       0xa184, 0x0200, 0x0118, 0x080c, 0x38fd, 0x0018, 0xa184, 0x0400,
+       0x19f0, 0x69a0, 0xa184, 0x1000, 0x0130, 0x6914, 0xa18c, 0xff00,
+       0x810f, 0x080c, 0x23c5, 0x002e, 0xa68c, 0x00e0, 0xa684, 0x0060,
+       0x0128, 0xa086, 0x0060, 0x1110, 0xa18d, 0x4000, 0xa18d, 0x0104,
+       0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x6818, 0xc0fd, 0x681a,
+       0xd6bc, 0x0168, 0xc0fc, 0x7083, 0x0000, 0xa08a, 0x000d, 0x0328,
+       0xa08a, 0x000c, 0x7182, 0x2001, 0x000c, 0x800c, 0x7186, 0x78aa,
+       0x3518, 0x3340, 0x3428, 0x8000, 0x80ac, 0xaf80, 0x002b, 0x20a0,
+       0x789b, 0x0000, 0xad80, 0x000b, 0x2098, 0x53a6, 0x23a8, 0x2898,
+       0x25a0, 0xa286, 0x0020, 0x1508, 0x70d0, 0xc0b5, 0x70d2, 0x2c00,
+       0x70b6, 0x2d00, 0x70ba, 0x6814, 0xc0fc, 0x8007, 0x7882, 0xa286,
+       0x0002, 0x0904, 0x2921, 0x70a0, 0x8000, 0x70a2, 0x74b0, 0xa498,
+       0x0005, 0x70a8, 0xa306, 0x1108, 0x73a4, 0x73b2, 0xa286, 0x0010,
+       0x0904, 0x25c6, 0x00de, 0x00ce, 0x0005, 0x7000, 0xa005, 0x19e0,
+       0xa286, 0x0002, 0x1904, 0x2938, 0x080c, 0x3c5b, 0x19a8, 0x6814,
+       0xc0fc, 0x8007, 0x7882, 0x2091, 0x8000, 0x781b, 0x0068, 0x68b4,
+       0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x2091,
+       0x8001, 0x7808, 0xc08d, 0x780a, 0x0126, 0x00d6, 0x00c6, 0x70d0,
+       0xa084, 0x2e00, 0x2090, 0x00ce, 0x00de, 0x012e, 0x2900, 0x7056,
+       0x68bc, 0x703e, 0x7003, 0x0002, 0x2d00, 0x704a, 0xad80, 0x0009,
+       0x7042, 0x7830, 0xd0bc, 0x0140, 0x2091, 0x303d, 0x70d0, 0xa084,
+       0x303d, 0x2091, 0x8000, 0x2090, 0x70a0, 0xa005, 0x1108, 0x0005,
+       0x8421, 0x0de8, 0x724c, 0x70bc, 0xa200, 0xa015, 0x0804, 0x2751,
+       0xa286, 0x0010, 0x1560, 0x080c, 0x3c5b, 0x1904, 0x28cc, 0x6814,
+       0xc0fc, 0x8007, 0x7882, 0x781b, 0x0068, 0x68b4, 0x785a, 0x6894,
+       0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a,
+       0x70a0, 0x8000, 0x70a2, 0x74b0, 0xa490, 0x0005, 0x70a8, 0xa206,
+       0x1108, 0x72a4, 0x72b2, 0x2900, 0x7056, 0x68bc, 0x703e, 0x7003,
+       0x0002, 0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x0005, 0x6bb4,
+       0xa39d, 0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x6b94,
+       0x7bd6, 0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, 0x0068, 0x2900,
+       0x7056, 0x7202, 0x7808, 0xc08d, 0x780a, 0x2300, 0xa605, 0x0170,
+       0x70d0, 0xa084, 0x2e00, 0xa086, 0x2600, 0x1118, 0x2009, 0x0000,
+       0x0010, 0x2009, 0x0001, 0xa284, 0x000f, 0x0033, 0xad80, 0x0009,
+       0x7042, 0x2d00, 0x704a, 0x0005, 0x299c, 0x4208, 0x4208, 0x41f6,
+       0x4208, 0x299c, 0x299c, 0x299c, 0x080c, 0x2575, 0x7808, 0xa084,
+       0xfffd, 0x780a, 0x00f6, 0x2079, 0x4700, 0x78ac, 0x00fe, 0xd084,
+       0x01c0, 0x7160, 0xa186, 0x0001, 0x0904, 0x2a61, 0xa186, 0x0007,
+       0x0170, 0xa186, 0x0005, 0x1158, 0x7078, 0x2068, 0x681b, 0x0004,
        0x6817, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x7063,
-       0x0000, 0x70a3, 0x0000, 0x70a4, 0x70ae, 0x70b2, 0x080c, 0x2682,
-       0x0156, 0x2011, 0x0004, 0x7160, 0xa186, 0x0001, 0x0160, 0xa186,
-       0x0007, 0x1118, 0x701f, 0x0005, 0x0030, 0x701f, 0x0001, 0x70d0,
-       0xc0c5, 0x70d2, 0x0000, 0x2001, 0x460a, 0x2004, 0xa084, 0x00ff,
-       0xa086, 0x0018, 0x0130, 0x7018, 0x7016, 0xa005, 0x1110, 0x70a3,
-       0x0001, 0x0066, 0x080c, 0x3f26, 0x20a9, 0x0010, 0x2039, 0x0000,
-       0x080c, 0x3a66, 0xa7b8, 0x0100, 0x1f04, 0x29c0, 0x006e, 0x7000,
-       0x0002, 0x29fd, 0x29db, 0x29db, 0x29d3, 0x29fd, 0x29fd, 0x29fd,
-       0x29d1, 0x080c, 0x254c, 0x705c, 0xa005, 0x0538, 0xad06, 0x1118,
-       0x6800, 0x705e, 0x0080, 0x6820, 0xd084, 0x1148, 0x6f14, 0x080c,
-       0x3b6f, 0x6008, 0xc0d4, 0x600a, 0x080c, 0x37a4, 0x0020, 0x7058,
-       0x2060, 0x6800, 0x6002, 0xa684, 0x5f00, 0x681e, 0x6818, 0xd0fc,
-       0x0108, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x6820, 0xa084,
-       0x00ff, 0xc09d, 0x6822, 0x080c, 0x1da2, 0x2011, 0x0004, 0x74c8,
-       0xa4a0, 0x0100, 0x04b1, 0xaea0, 0x0017, 0x0499, 0x20a9, 0x0101,
-       0x74c8, 0x0479, 0x8420, 0x1f04, 0x2a09, 0x70c0, 0x2060, 0x2021,
-       0x0002, 0x20a9, 0x0100, 0x6110, 0x81ff, 0x0198, 0x6018, 0x0016,
-       0x0006, 0x2011, 0x4602, 0x220c, 0xa102, 0x2012, 0x000e, 0x001e,
-       0xa102, 0x0338, 0x6012, 0x1128, 0x2011, 0x4604, 0x2204, 0xc0a5,
-       0x2012, 0x601b, 0x0000, 0xace0, 0x0010, 0x1f04, 0x2a13, 0x8421,
-       0x1d00, 0x015e, 0x7063, 0x0000, 0x7003, 0x0000, 0x704b, 0x0000,
-       0x0005, 0x0046, 0x2404, 0xa005, 0x01a8, 0x2068, 0x6800, 0x0006,
-       0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00,
-       0x681e, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x080c, 0x1da2,
-       0x000e, 0x0c48, 0x004e, 0x2023, 0x0000, 0x0005, 0xa282, 0x0003,
-       0x0310, 0x080c, 0x254c, 0x2300, 0x0002, 0x2a60, 0x2add, 0x2af7,
-       0xa282, 0x0002, 0x0110, 0x080c, 0x254c, 0x7060, 0x7063, 0x0000,
-       0x707f, 0x0000, 0x0022, 0x77d0, 0xc7c5, 0x77d2, 0x0002, 0x2a77,
-       0x2a77, 0x2a79, 0x2ab1, 0x37d8, 0x2a77, 0x2ab1, 0x2a77, 0x080c,
-       0x254c, 0x7770, 0x080c, 0x3a66, 0x7770, 0xa7bc, 0x8f00, 0x080c,
-       0x3b6f, 0x6018, 0xa005, 0x0528, 0xd7fc, 0x1118, 0x2021, 0x8cc0,
-       0x0010, 0x2021, 0x8dd0, 0x2009, 0x0005, 0x2011, 0x0010, 0x080c,
-       0x2b11, 0x01b8, 0x0156, 0x20a9, 0x0101, 0xd7fc, 0x1118, 0x2021,
-       0x8bc0, 0x0010, 0x2021, 0x8cd0, 0x0046, 0x2009, 0x0005, 0x2011,
-       0x0010, 0x080c, 0x2b11, 0x004e, 0x0118, 0x8420, 0x1f04, 0x2a9c,
-       0x015e, 0x8738, 0xa784, 0x001f, 0x1990, 0x0804, 0x25a0, 0x0804,
-       0x25a0, 0x7770, 0x080c, 0x3b6f, 0x6018, 0xa005, 0x0520, 0xd7fc,
-       0x1118, 0x2021, 0x8cc0, 0x0010, 0x2021, 0x8dd0, 0x2009, 0x0005,
-       0x2011, 0x0020, 0x080c, 0x2b11, 0x01b0, 0x0156, 0x20a9, 0x0101,
-       0xd7fc, 0x1118, 0x2021, 0x8bc0, 0x0010, 0x2021, 0x8cd0, 0x0046,
-       0x2009, 0x0005, 0x2011, 0x0020, 0x04e1, 0x004e, 0x0118, 0x8420,
-       0x1f04, 0x2acf, 0x015e, 0x0804, 0x25a0, 0x2200, 0x0002, 0x2ae2,
-       0x2ae4, 0x2ae4, 0x080c, 0x254c, 0x2009, 0x0012, 0x7060, 0xa086,
-       0x0002, 0x0110, 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0108, 0x691a,
-       0x7063, 0x0000, 0x70d0, 0xc0c5, 0x70d2, 0x0804, 0x3be5, 0x2200,
-       0x0002, 0x2afe, 0x2ae4, 0x2afc, 0x080c, 0x254c, 0x080c, 0x3f26,
-       0x7000, 0xa086, 0x0002, 0x1904, 0x375d, 0x080c, 0x37be, 0x6008,
-       0xa084, 0xfbef, 0x600a, 0x080c, 0x374f, 0x0904, 0x375d, 0x0804,
-       0x25a0, 0x2404, 0xa005, 0x0590, 0x2068, 0x2d04, 0x0006, 0x6814,
-       0xa706, 0x0118, 0x2d20, 0x000e, 0x0ca8, 0x000e, 0x2022, 0x691a,
+       0x0000, 0x70a3, 0x0000, 0x70a4, 0x70ae, 0x70b2, 0x080c, 0x26ae,
+       0x0156, 0x2011, 0x0004, 0x7160, 0xa186, 0x0001, 0x0158, 0xa186,
+       0x0007, 0x1118, 0x701f, 0x0005, 0x0010, 0x701f, 0x0001, 0x70d0,
+       0xc0c5, 0x70d2, 0x2001, 0x470a, 0x2004, 0xa084, 0x00ff, 0xa086,
+       0x0018, 0x0130, 0x7018, 0x7016, 0xa005, 0x1110, 0x70a3, 0x0001,
+       0x0066, 0x080c, 0x3f4e, 0x20a9, 0x0010, 0x2039, 0x0000, 0x080c,
+       0x3a8b, 0xa7b8, 0x0100, 0x1f04, 0x29ef, 0x006e, 0x7000, 0x0002,
+       0x2a2c, 0x2a0a, 0x2a0a, 0x2a02, 0x2a2c, 0x2a2c, 0x2a2c, 0x2a00,
+       0x080c, 0x2575, 0x705c, 0xa005, 0x0538, 0xad06, 0x1118, 0x6800,
+       0x705e, 0x0080, 0x6820, 0xd084, 0x1148, 0x6f14, 0x080c, 0x3b95,
+       0x6008, 0xc0d4, 0x600a, 0x080c, 0x37c7, 0x0020, 0x7058, 0x2060,
+       0x6800, 0x6002, 0xa684, 0x5f00, 0x681e, 0x6818, 0xd0fc, 0x0108,
+       0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff,
+       0xc09d, 0x6822, 0x080c, 0x1dbf, 0x2011, 0x0004, 0x74c8, 0xa4a0,
+       0x0100, 0x04b1, 0xaea0, 0x0017, 0x0499, 0x20a9, 0x0101, 0x74c8,
+       0x0479, 0x8420, 0x1f04, 0x2a38, 0x70c0, 0x2060, 0x2021, 0x0002,
+       0x20a9, 0x0100, 0x6110, 0x81ff, 0x0198, 0x6018, 0x0016, 0x0006,
+       0x2011, 0x4702, 0x220c, 0xa102, 0x2012, 0x000e, 0x001e, 0xa102,
+       0x0338, 0x6012, 0x1128, 0x2011, 0x4704, 0x2204, 0xc0a5, 0x2012,
+       0x601b, 0x0000, 0xace0, 0x0010, 0x1f04, 0x2a42, 0x8421, 0x1d00,
+       0x015e, 0x7063, 0x0000, 0x7003, 0x0000, 0x704b, 0x0000, 0x0005,
+       0x0046, 0x2404, 0xa005, 0x01a8, 0x2068, 0x6800, 0x0006, 0x6a1a,
        0x6817, 0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e,
-       0x6820, 0xa084, 0x00ff, 0xa205, 0x6822, 0x080c, 0x1da2, 0x2021,
-       0x4602, 0x241c, 0x8319, 0x2322, 0x6010, 0x8001, 0x6012, 0x1128,
-       0x2021, 0x4604, 0x2404, 0xc0a5, 0x2022, 0x6008, 0xa084, 0xf9ef,
-       0x600a, 0x080c, 0x269e, 0x080c, 0x37be, 0x0005, 0xa085, 0x0001,
-       0x0ce0, 0x2300, 0x0002, 0x2b50, 0x2b4e, 0x2bcb, 0x080c, 0x254c,
-       0x78e4, 0xa005, 0x17b0, 0x3208, 0xa18c, 0x0800, 0x0118, 0x0104,
-       0x259d, 0x0010, 0x0304, 0x259d, 0x2008, 0xa084, 0x0030, 0x1110,
-       0x0804, 0x322a, 0x78ec, 0xa084, 0x0003, 0x0dd0, 0x7884, 0xd0fc,
-       0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004,
-       0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005,
-       0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x2bae,
-       0x2bb7, 0x2ba4, 0x2b87, 0x3c29, 0x3c29, 0x2b87, 0x2bc1, 0x080c,
-       0x254c, 0x7000, 0xa086, 0x0004, 0x1190, 0x7060, 0xa086, 0x0002,
-       0x1130, 0x2011, 0x0002, 0x2019, 0x0000, 0x0804, 0x2a56, 0x7060,
-       0xa086, 0x0006, 0x0db0, 0x7060, 0xa086, 0x0004, 0x0d90, 0x79e4,
-       0x2001, 0x0003, 0x0804, 0x2f18, 0x6818, 0xd0fc, 0x0110, 0x681b,
-       0x001d, 0x080c, 0x3a3c, 0x781b, 0x006e, 0x0005, 0x6818, 0xd0fc,
-       0x0110, 0x681b, 0x001d, 0x080c, 0x3a3c, 0x0804, 0x3c07, 0x6818,
-       0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3a3c, 0x781b, 0x00fa,
-       0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3a3c,
-       0x781b, 0x00cb, 0x0005, 0xa584, 0x000f, 0x11c0, 0x7000, 0x0002,
-       0x25a0, 0x2bd8, 0x2bda, 0x375d, 0x375d, 0x375d, 0x2bd8, 0x2bd8,
-       0x080c, 0x254c, 0x080c, 0x37be, 0x6008, 0xa084, 0xfbef, 0x600a,
-       0x080c, 0x374f, 0x0904, 0x375d, 0x0804, 0x25a0, 0x78e4, 0xa005,
-       0x1b04, 0x2b89, 0x3208, 0xa18c, 0x0800, 0x0118, 0x0104, 0x2b89,
-       0x0010, 0x0304, 0x2b89, 0x2008, 0xa084, 0x0030, 0x1118, 0x781b,
-       0x0068, 0x0005, 0x78ec, 0xa084, 0x0003, 0x0dc8, 0x7884, 0xd0fc,
-       0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004,
-       0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005,
-       0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x2c26,
-       0x2c2a, 0x2c21, 0x2c1f, 0x3c29, 0x3c29, 0x2c1f, 0x3c23, 0x080c,
-       0x254c, 0x080c, 0x3a42, 0x781b, 0x006e, 0x0005, 0x080c, 0x3a42,
-       0x0804, 0x3c07, 0x080c, 0x3a42, 0x781b, 0x00fa, 0x0005, 0x080c,
-       0x3a42, 0x781b, 0x00cb, 0x0005, 0x2300, 0x0002, 0x2c3b, 0x2c39,
-       0x2c3d, 0x080c, 0x254c, 0x0804, 0x33e2, 0x681b, 0x0016, 0x78a3,
-       0x0000, 0x79e4, 0xa184, 0x0030, 0x0904, 0x33e2, 0x78ec, 0xa084,
-       0x0003, 0x0904, 0x33e2, 0xa184, 0x0100, 0x0d98, 0x7884, 0xd0fc,
+       0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x080c, 0x1dbf, 0x000e,
+       0x0c48, 0x004e, 0x2023, 0x0000, 0x0005, 0xa282, 0x0003, 0x0310,
+       0x080c, 0x2575, 0x2300, 0x0002, 0x2a8f, 0x2b0c, 0x2b1a, 0xa282,
+       0x0002, 0x0110, 0x080c, 0x2575, 0x7060, 0x7063, 0x0000, 0x707f,
+       0x0000, 0x0022, 0x77d0, 0xc7c5, 0x77d2, 0x0002, 0x2aa6, 0x2aa6,
+       0x2aa8, 0x2ae0, 0x37fb, 0x2aa6, 0x2ae0, 0x2aa6, 0x080c, 0x2575,
+       0x7770, 0x080c, 0x3a8b, 0x7770, 0xa7bc, 0x8f00, 0x080c, 0x3b95,
+       0x6018, 0xa005, 0x0528, 0xd7fc, 0x1118, 0x2021, 0x8dc0, 0x0010,
+       0x2021, 0x8ed0, 0x2009, 0x0005, 0x2011, 0x0010, 0x080c, 0x2b34,
+       0x01b8, 0x0156, 0x20a9, 0x0101, 0xd7fc, 0x1118, 0x2021, 0x8cc0,
+       0x0010, 0x2021, 0x8dd0, 0x0046, 0x2009, 0x0005, 0x2011, 0x0010,
+       0x080c, 0x2b34, 0x004e, 0x0118, 0x8420, 0x1f04, 0x2acb, 0x015e,
+       0x8738, 0xa784, 0x001f, 0x1990, 0x0804, 0x25c9, 0x0804, 0x25c9,
+       0x7770, 0x080c, 0x3b95, 0x6018, 0xa005, 0x0520, 0xd7fc, 0x1118,
+       0x2021, 0x8dc0, 0x0010, 0x2021, 0x8ed0, 0x2009, 0x0005, 0x2011,
+       0x0020, 0x080c, 0x2b34, 0x01b0, 0x0156, 0x20a9, 0x0101, 0xd7fc,
+       0x1118, 0x2021, 0x8cc0, 0x0010, 0x2021, 0x8dd0, 0x0046, 0x2009,
+       0x0005, 0x2011, 0x0020, 0x0481, 0x004e, 0x0118, 0x8420, 0x1f04,
+       0x2afe, 0x015e, 0x0804, 0x25c9, 0x2200, 0x0002, 0x2b11, 0x2b13,
+       0x2b13, 0x080c, 0x2575, 0x7063, 0x0000, 0x70d0, 0xc0c5, 0x70d2,
+       0x0804, 0x25c9, 0x2200, 0x0002, 0x2b21, 0x2b13, 0x2b1f, 0x080c,
+       0x2575, 0x080c, 0x3f4e, 0x7000, 0xa086, 0x0002, 0x1904, 0x3780,
+       0x080c, 0x37e1, 0x6008, 0xa084, 0xfbef, 0x600a, 0x080c, 0x3772,
+       0x0904, 0x3780, 0x0804, 0x25c9, 0x2404, 0xa005, 0x0590, 0x2068,
+       0x2d04, 0x0006, 0x6814, 0xa706, 0x0118, 0x2d20, 0x000e, 0x0ca8,
+       0x000e, 0x2022, 0x691a, 0x6817, 0x0000, 0x682b, 0x0000, 0x68b4,
+       0xa084, 0x5f00, 0x681e, 0x6820, 0xa084, 0x00ff, 0xa205, 0x6822,
+       0x080c, 0x1dbf, 0x2021, 0x4702, 0x241c, 0x8319, 0x2322, 0x6010,
+       0x8001, 0x6012, 0x1128, 0x2021, 0x4704, 0x2404, 0xc0a5, 0x2022,
+       0x6008, 0xa084, 0xf9ef, 0x600a, 0x080c, 0x26ca, 0x080c, 0x37e1,
+       0x0005, 0xa085, 0x0001, 0x0ce0, 0x2300, 0x0002, 0x2b73, 0x2b71,
+       0x2bee, 0x080c, 0x2575, 0x78e4, 0xa005, 0x17b0, 0x3208, 0xa18c,
+       0x0800, 0x0118, 0x0104, 0x25c6, 0x0010, 0x0304, 0x25c6, 0x2008,
+       0xa084, 0x0030, 0x1110, 0x0804, 0x324d, 0x78ec, 0xa084, 0x0003,
+       0x0dd0, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007, 0x0090, 0xa184,
+       0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000, 0x0050, 0xa184,
+       0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007, 0x0010, 0x2001,
+       0x0001, 0x0002, 0x2bd1, 0x2bda, 0x2bc7, 0x2baa, 0x3c4f, 0x3c4f,
+       0x2baa, 0x2be4, 0x080c, 0x2575, 0x7000, 0xa086, 0x0004, 0x1190,
+       0x7060, 0xa086, 0x0002, 0x1130, 0x2011, 0x0002, 0x2019, 0x0000,
+       0x0804, 0x2a85, 0x7060, 0xa086, 0x0006, 0x0db0, 0x7060, 0xa086,
+       0x0004, 0x0d90, 0x79e4, 0x2001, 0x0003, 0x0804, 0x2f3b, 0x6818,
+       0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3a61, 0x781b, 0x006e,
+       0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3a61,
+       0x0804, 0x3c2d, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c,
+       0x3a61, 0x781b, 0x00fa, 0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b,
+       0x001d, 0x080c, 0x3a61, 0x781b, 0x00cb, 0x0005, 0xa584, 0x000f,
+       0x11c0, 0x7000, 0x0002, 0x25c9, 0x2bfb, 0x2bfd, 0x3780, 0x3780,
+       0x3780, 0x2bfb, 0x2bfb, 0x080c, 0x2575, 0x080c, 0x37e1, 0x6008,
+       0xa084, 0xfbef, 0x600a, 0x080c, 0x3772, 0x0904, 0x3780, 0x0804,
+       0x25c9, 0x78e4, 0xa005, 0x1b04, 0x2bac, 0x3208, 0xa18c, 0x0800,
+       0x0118, 0x0104, 0x2bac, 0x0010, 0x0304, 0x2bac, 0x2008, 0xa084,
+       0x0030, 0x1118, 0x781b, 0x0068, 0x0005, 0x78ec, 0xa084, 0x0003,
+       0x0dc8, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007, 0x0090, 0xa184,
+       0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000, 0x0050, 0xa184,
+       0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007, 0x0010, 0x2001,
+       0x0001, 0x0002, 0x2c49, 0x2c4d, 0x2c44, 0x2c42, 0x3c4f, 0x3c4f,
+       0x2c42, 0x3c49, 0x080c, 0x2575, 0x080c, 0x3a67, 0x781b, 0x006e,
+       0x0005, 0x080c, 0x3a67, 0x0804, 0x3c2d, 0x080c, 0x3a67, 0x781b,
+       0x00fa, 0x0005, 0x080c, 0x3a67, 0x781b, 0x00cb, 0x0005, 0x2300,
+       0x0002, 0x2c5e, 0x2c5c, 0x2c60, 0x080c, 0x2575, 0x0804, 0x3405,
+       0x681b, 0x0016, 0x78a3, 0x0000, 0x79e4, 0xa184, 0x0030, 0x0904,
+       0x3405, 0x78ec, 0xa084, 0x0003, 0x0904, 0x3405, 0xa184, 0x0100,
+       0x0d98, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007, 0x0090, 0xa184,
+       0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000, 0x0050, 0xa184,
+       0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007, 0x0010, 0x2001,
+       0x0001, 0x0002, 0x2c92, 0x2c4d, 0x2bc7, 0x3c0b, 0x3c4f, 0x3c4f,
+       0x3c0b, 0x3c49, 0x080c, 0x3c17, 0x0005, 0xa282, 0x0005, 0x0310,
+       0x080c, 0x2575, 0x7898, 0x2040, 0x2300, 0x0002, 0x2ca1, 0x2ecb,
+       0x2ed5, 0x2200, 0x0002, 0x2cbd, 0x2caa, 0x2cbd, 0x2ca8, 0x2ead,
+       0x080c, 0x2575, 0x789b, 0x0018, 0x78a8, 0x2010, 0xa084, 0x00ff,
+       0xa082, 0x0020, 0x0a04, 0x3a30, 0xa08a, 0x0004, 0x1a04, 0x3a30,
+       0x0002, 0x3a30, 0x3a30, 0x3a30, 0x39e4, 0x789b, 0x0018, 0x79a8,
+       0xa184, 0x0080, 0x0148, 0x0804, 0x3a30, 0x7000, 0xa005, 0x1dd8,
+       0x2011, 0x0004, 0x0804, 0x35b7, 0xa184, 0x00ff, 0xa08a, 0x0010,
+       0x1a04, 0x3a30, 0x0002, 0x2ce5, 0x2ce3, 0x2cf7, 0x2cfb, 0x2da9,
+       0x3a30, 0x3a30, 0x2dab, 0x3a30, 0x3a30, 0x2ea9, 0x2ea9, 0x3a30,
+       0x3a30, 0x3a30, 0x2eab, 0x080c, 0x2575, 0xd6e4, 0x0140, 0x2001,
+       0x0300, 0x8000, 0x8000, 0x783a, 0x781b, 0x00c7, 0x0005, 0x6818,
+       0xd0fc, 0x0118, 0x681b, 0x001d, 0x0c90, 0x0804, 0x3c0b, 0x681b,
+       0x001d, 0x0804, 0x3a5b, 0x6920, 0x6922, 0xa684, 0x1800, 0x1904,
+       0x2d4c, 0x6820, 0xd084, 0x1904, 0x2d54, 0x6818, 0xa086, 0x0008,
+       0x1110, 0x681b, 0x0000, 0xd6d4, 0x0568, 0xd6bc, 0x0558, 0x7083,
+       0x0000, 0x6818, 0xa084, 0x003f, 0xa08a, 0x000d, 0x0718, 0xa08a,
+       0x000c, 0x7182, 0x2001, 0x000c, 0x800c, 0x7186, 0x789b, 0x0061,
+       0x78aa, 0x0156, 0x0136, 0x0146, 0x0016, 0x3208, 0xa18c, 0x0600,
+       0x0118, 0x20a1, 0x022b, 0x0010, 0x20a1, 0x012b, 0x001e, 0x789b,
+       0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x014e,
+       0x013e, 0x015e, 0x6038, 0xa005, 0x1150, 0x681c, 0xa084, 0x000e,
+       0x0904, 0x3a5b, 0x080c, 0x3a6d, 0x782b, 0x3008, 0x0010, 0x8001,
+       0x603a, 0x781b, 0x0071, 0x0005, 0xd6e4, 0x0130, 0x781b, 0x0083,
+       0x0005, 0x781b, 0x0083, 0x0005, 0xa684, 0x0060, 0x0dd0, 0xd6dc,
+       0x0dc0, 0xd6fc, 0x01a0, 0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8,
+       0x78d0, 0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x6b98,
+       0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0xd6f4,
+       0x0118, 0xc6f4, 0x7e5a, 0x6eb6, 0x7000, 0xa086, 0x0003, 0x1148,
+       0x0006, 0x080c, 0x3f4e, 0x080c, 0x4208, 0x000e, 0x781b, 0x0080,
+       0x0005, 0xa006, 0x080c, 0x42e8, 0x6ab0, 0x69ac, 0x6c98, 0x6b94,
+       0x2200, 0xa105, 0x0120, 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa,
+       0x7cd2, 0x7cda, 0x6ba6, 0x7bd6, 0x7bde, 0x2300, 0xa405, 0x1130,
+       0xc6f5, 0x7e5a, 0x6eb6, 0x781b, 0x0080, 0x0005, 0x781b, 0x0080,
+       0x2200, 0xa115, 0x1118, 0x080c, 0x4208, 0x0005, 0x080c, 0x4235,
+       0x0005, 0x080c, 0x2575, 0x0804, 0x2e3f, 0x00c6, 0x7054, 0x2060,
+       0x6920, 0xa18c, 0xecff, 0x6922, 0x6000, 0xa084, 0xcfdf, 0x6002,
+       0x080c, 0x3917, 0xa006, 0x2040, 0x2038, 0x080c, 0x39bf, 0x0804,
+       0x2e33, 0x00c6, 0x7054, 0x2060, 0x2c48, 0x7aa8, 0xa294, 0x00ff,
+       0xa286, 0x0004, 0x11d8, 0x6920, 0xd1e4, 0x1170, 0x2039, 0x0000,
+       0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x391a,
+       0x080c, 0x39bf, 0x0804, 0x2e33, 0xa18c, 0xecff, 0x6922, 0x6104,
+       0xa18c, 0xffdd, 0x6106, 0x6000, 0xc0ac, 0x6002, 0xa286, 0x0003,
+       0x01d0, 0x6104, 0xa184, 0x0010, 0x0548, 0x080c, 0x3b91, 0x080c,
+       0x399a, 0x88ff, 0x0518, 0x00ce, 0x789b, 0x0060, 0x2800, 0x78aa,
+       0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005,
+       0x781b, 0x0082, 0x0005, 0x6920, 0xd1cc, 0x0130, 0xa18c, 0xfdff,
+       0x6922, 0x6000, 0xc0ec, 0x6002, 0x2039, 0x0000, 0x2041, 0x0000,
+       0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x39bf, 0xa286, 0x0001,
+       0x0158, 0x6104, 0xa184, 0x0008, 0x01b0, 0x080c, 0x3b91, 0x080c,
+       0x38b8, 0x88ff, 0x1980, 0x0078, 0x6920, 0xd1c4, 0x0130, 0xa18c,
+       0xfeff, 0x6922, 0x6000, 0xc0e4, 0x6002, 0x2031, 0x0000, 0xa006,
+       0x2010, 0x080c, 0x391a, 0x00ce, 0x7e58, 0xd6d4, 0x1118, 0x781b,
+       0x0071, 0x0005, 0x781b, 0x0083, 0x0005, 0x0804, 0x3a57, 0x2808,
+       0x789b, 0x0080, 0x2019, 0x0080, 0x78a8, 0xa094, 0x00ff, 0xa286,
+       0x0001, 0x11b8, 0x2300, 0xa102, 0xa086, 0x0001, 0x0904, 0x2dad,
+       0x7ca8, 0xa4a4, 0x00ff, 0xa480, 0x0002, 0xa300, 0x2018, 0xa102,
+       0x0a04, 0x2dc1, 0x0904, 0x2dc1, 0x24a8, 0x7aa8, 0x1f04, 0x2e5d,
+       0x0c18, 0xa284, 0x00f0, 0xa082, 0x0020, 0x06b8, 0x2200, 0xa082,
+       0x0021, 0x1698, 0x7aa8, 0x8318, 0x8318, 0x2100, 0xa302, 0x0aa0,
+       0xa286, 0x0023, 0x0950, 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58,
+       0xa684, 0xfff1, 0xc0a5, 0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a,
+       0x78a0, 0xa005, 0x0904, 0x2e34, 0x20a8, 0x7998, 0x789b, 0x0060,
+       0x78aa, 0x2011, 0x0080, 0x799a, 0x78a8, 0x7998, 0x7a9a, 0x78aa,
+       0x7a98, 0x1f04, 0x2e8b, 0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b,
+       0x006e, 0x0005, 0x781b, 0x0082, 0x0005, 0x8318, 0x2100, 0xa302,
+       0x0a04, 0x2e44, 0xa284, 0x0080, 0x1904, 0x3a5b, 0x78a0, 0xa005,
+       0x08c8, 0x0804, 0x3a5b, 0x0804, 0x3a30, 0x7054, 0xa04d, 0x789b,
+       0x0018, 0x78a8, 0xa084, 0x00ff, 0xa08e, 0x0001, 0x0110, 0x080c,
+       0x2575, 0x7aa8, 0xa294, 0x00ff, 0x784b, 0x0008, 0x78a8, 0xa084,
+       0x00ff, 0xa08a, 0x0005, 0x1a04, 0x3a30, 0x0002, 0x3a30, 0x382f,
+       0x3a30, 0x394a, 0x3d59, 0xa282, 0x0000, 0x1110, 0x080c, 0x2575,
+       0x080c, 0x3a61, 0x781b, 0x0082, 0x0005, 0xa282, 0x0003, 0x1110,
+       0x080c, 0x2575, 0xd4fc, 0x11d0, 0x7060, 0xa005, 0x0110, 0x080c,
+       0x2575, 0x6f14, 0x7772, 0xa7bc, 0x8f00, 0x080c, 0x3b95, 0x6008,
+       0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x001f, 0x1db0, 0x080c,
+       0x3a64, 0x7063, 0x0002, 0x701f, 0x0009, 0x0010, 0x080c, 0x3a70,
+       0x781b, 0x0082, 0x0005, 0xa282, 0x0004, 0x0310, 0x080c, 0x2575,
+       0x2300, 0x0002, 0x2f05, 0x309b, 0x30d7, 0xa286, 0x0003, 0x0598,
+       0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x71d0, 0xd1b4, 0x0528, 0xd1bc,
+       0x1518, 0x2001, 0x4701, 0x2004, 0xd0c4, 0x11f0, 0x7868, 0xa084,
+       0x00ff, 0x11d0, 0xa282, 0x0002, 0x12b8, 0x00d6, 0x783b, 0x8300,
+       0x781b, 0x0059, 0x70b8, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6,
+       0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030,
+       0x00de, 0x2001, 0x0000, 0x0058, 0x783b, 0x1300, 0x781b, 0x0057,
+       0x2001, 0x0000, 0x0020, 0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x7046,
+       0x68a0, 0xd0ec, 0x0118, 0x6008, 0xc08d, 0x600a, 0xa284, 0x000f,
+       0x0002, 0x307c, 0x2f56, 0x2f53, 0x31a7, 0x3232, 0x25c9, 0x2f51,
+       0x2f51, 0x080c, 0x2575, 0x6008, 0xc0d4, 0x600a, 0xd6e4, 0x0120,
+       0x7044, 0xa086, 0x0014, 0x11e8, 0x080c, 0x3f4e, 0x2009, 0x0000,
+       0x6818, 0xd0fc, 0x0108, 0x7044, 0xa086, 0x0014, 0x0168, 0x6818,
+       0xa086, 0x0008, 0x1904, 0x303e, 0x7858, 0xd09c, 0x0904, 0x303e,
+       0x6820, 0xd0ac, 0x0904, 0x303e, 0x681b, 0x0014, 0x2009, 0x0002,
+       0x04a8, 0x7868, 0xa08c, 0x00ff, 0x0588, 0xa186, 0x0008, 0x1158,
+       0x6008, 0xc0a4, 0x600a, 0x080c, 0x3772, 0x0540, 0x080c, 0x37e1,
+       0x080c, 0x3f4e, 0x0060, 0xa186, 0x0028, 0x1500, 0x6018, 0xa005,
+       0x0d78, 0x8001, 0x0d68, 0x8001, 0x0d58, 0x601e, 0x0c48, 0x6820,
+       0xd084, 0x0904, 0x25c9, 0xc084, 0x6822, 0x080c, 0x26bf, 0x7058,
+       0x00c6, 0x2060, 0x6800, 0x6002, 0x00ce, 0x6004, 0x6802, 0xa005,
+       0x2d00, 0x1108, 0x6002, 0x6006, 0x0804, 0x25c9, 0x0016, 0x81ff,
+       0x15f0, 0x7000, 0xa086, 0x0030, 0x05d0, 0x71d0, 0xd1bc, 0x15b8,
+       0xd1b4, 0x11e8, 0x705c, 0xa005, 0x1590, 0x70a0, 0xa086, 0x0001,
+       0x0570, 0x7003, 0x0000, 0x0046, 0x0056, 0x0076, 0x0066, 0x00c6,
+       0x00d6, 0x080c, 0x25f1, 0x00de, 0x00ce, 0x006e, 0x007e, 0x005e,
+       0x004e, 0x71d0, 0xd1b4, 0x11d8, 0x7003, 0x0040, 0x00c0, 0x080c,
+       0x3c5b, 0x11a8, 0x781b, 0x0068, 0x00d6, 0x70b8, 0xa06d, 0x68b4,
+       0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4,
+       0x71d2, 0x7003, 0x0030, 0x7808, 0xc08d, 0x780a, 0x00de, 0x080c,
+       0x30ff, 0x001e, 0x81ff, 0x0904, 0x303e, 0xa684, 0xdf00, 0x681e,
+       0x682b, 0x0000, 0x6f14, 0xa186, 0x0002, 0x1904, 0x303f, 0x6818,
+       0xa086, 0x0014, 0x1130, 0x2008, 0xd6e4, 0x0118, 0x7868, 0xa08c,
+       0x00ff, 0x080c, 0x3a7a, 0x080c, 0x26ca, 0x6820, 0xd0dc, 0x1578,
+       0x8717, 0xa294, 0x000f, 0x8213, 0x8213, 0x8213, 0xb284, 0x0600,
+       0x0118, 0xa290, 0x4bc0, 0x0010, 0xa290, 0x4c40, 0xa290, 0x0000,
+       0x221c, 0xd3c4, 0x0170, 0x6820, 0xd0e4, 0x0128, 0xa084, 0xefff,
+       0x6822, 0xc3ac, 0x2312, 0x8210, 0x2204, 0xa085, 0x0038, 0x2012,
+       0x8211, 0xd3d4, 0x0138, 0x68a0, 0xd0c4, 0x1120, 0x080c, 0x3167,
+       0x0804, 0x25c9, 0x6008, 0xc08d, 0x600a, 0x0008, 0x692a, 0x6916,
+       0x6818, 0xd0fc, 0x0110, 0x7044, 0x681a, 0xa68c, 0xdf00, 0x691e,
+       0x6410, 0x84ff, 0x0168, 0x2009, 0x4702, 0x2104, 0x8001, 0x200a,
+       0x8421, 0x6412, 0x1128, 0x2021, 0x4704, 0x2404, 0xc0a5, 0x2022,
+       0x6018, 0xa005, 0x0118, 0x8001, 0x601a, 0x1118, 0x6008, 0xc0a4,
+       0x600a, 0x6820, 0xd084, 0x1130, 0x6800, 0xa005, 0x1108, 0x6002,
+       0x6006, 0x0020, 0x7058, 0x2060, 0x6800, 0x6002, 0x2061, 0x4700,
+       0x6887, 0x0103, 0x2d08, 0x206b, 0x0000, 0x6068, 0xa005, 0x616a,
+       0x0110, 0x2d02, 0x0008, 0x616e, 0x7200, 0xa286, 0x0030, 0x0158,
+       0xa286, 0x0040, 0x1904, 0x25c9, 0x7003, 0x0002, 0x7048, 0x2068,
+       0x68c4, 0x2060, 0x0005, 0x7003, 0x0002, 0x70b8, 0xa06d, 0x68bc,
+       0x703e, 0x70b4, 0xa065, 0x68c0, 0x7056, 0x2d00, 0x704a, 0xad80,
+       0x0009, 0x7042, 0x0005, 0xa282, 0x0004, 0x0210, 0x080c, 0x2575,
+       0x2200, 0x0002, 0x30a6, 0x30b5, 0x30c1, 0x30b5, 0xa586, 0x1300,
+       0x0160, 0xa586, 0x8300, 0x1d90, 0x7003, 0x0000, 0x6018, 0x8001,
+       0x601a, 0x6008, 0xa084, 0xfbef, 0x600a, 0x7000, 0xa086, 0x0005,
+       0x0128, 0x080c, 0x3a61, 0x781b, 0x0082, 0x0005, 0x781b, 0x0083,
+       0x0005, 0x7890, 0x8007, 0x8001, 0xa084, 0x0007, 0xa080, 0x0018,
+       0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa186, 0x0003, 0x0128, 0xa186,
+       0x0000, 0x0110, 0x0804, 0x3a30, 0x781b, 0x0083, 0x0005, 0x6820,
+       0xc095, 0x6822, 0x82ff, 0x1118, 0x080c, 0x3a61, 0x0030, 0x8211,
+       0x0110, 0x080c, 0x2575, 0x080c, 0x3a70, 0x781b, 0x0082, 0x0005,
+       0x080c, 0x3c6e, 0x7830, 0xa084, 0x00c0, 0x1170, 0x0016, 0x3208,
+       0xa18c, 0x0800, 0x001e, 0x0118, 0x0104, 0x30fc, 0x0010, 0x0304,
+       0x30fc, 0x791a, 0xa006, 0x0005, 0xa085, 0x0001, 0x0005, 0xa684,
+       0x0060, 0x1130, 0x682f, 0x0000, 0x6833, 0x0000, 0x0804, 0x3166,
+       0xd6dc, 0x1198, 0x68b4, 0xd0dc, 0x1180, 0x6998, 0x6a94, 0x692e,
+       0x6a32, 0x7044, 0xa005, 0x1130, 0x2200, 0xa105, 0x0904, 0x3f4e,
+       0x7047, 0x0015, 0x0804, 0x3f4e, 0x0005, 0xd6ac, 0x01f0, 0xd6f4,
+       0x0130, 0x682f, 0x0000, 0x6833, 0x0000, 0x0804, 0x3f4e, 0x68b4,
+       0xa084, 0x4000, 0xa635, 0xd6f4, 0x1da0, 0x7044, 0xa005, 0x1110,
+       0x7047, 0x0015, 0xd6dc, 0x1128, 0x68b4, 0xd0dc, 0x0110, 0x6ca8,
+       0x6da4, 0x6c2e, 0x6d32, 0x0804, 0x3f4e, 0xd6f4, 0x0130, 0x682f,
+       0x0000, 0x6833, 0x0000, 0x0804, 0x3f4e, 0x68b4, 0xa084, 0x4800,
+       0xa635, 0xd6f4, 0x1da0, 0x7044, 0xa005, 0x1110, 0x7047, 0x0015,
+       0x2408, 0x2510, 0x2700, 0x8007, 0xa084, 0x007f, 0xa108, 0xa291,
+       0x0000, 0x692e, 0x6a32, 0x2100, 0xa205, 0x1110, 0x0804, 0x3f4e,
+       0x7000, 0xa086, 0x0006, 0x0110, 0x0804, 0x3f4e, 0x0005, 0x6946,
+       0x6008, 0xc0cd, 0xd3cc, 0x0108, 0xc08d, 0x600a, 0x6818, 0x683a,
+       0x681b, 0x0006, 0x688f, 0x0000, 0x6893, 0x0000, 0x6a30, 0x692c,
+       0x6a3e, 0x6942, 0x682f, 0x0003, 0x6833, 0x0000, 0x6837, 0x0020,
+       0x6897, 0x0000, 0x689b, 0x0020, 0x7000, 0x0002, 0x25c9, 0x3196,
+       0x3190, 0x318e, 0x318e, 0x318e, 0x318e, 0x318e, 0x080c, 0x2575,
+       0x6820, 0xd084, 0x1118, 0x080c, 0x37c7, 0x0030, 0x7058, 0x2c50,
+       0x2060, 0x6800, 0x6002, 0x2a60, 0xaea0, 0x0017, 0x2404, 0xa005,
+       0x0110, 0x2020, 0x0cd8, 0x2d22, 0x206b, 0x0000, 0x0005, 0x080c,
+       0x37cd, 0x080c, 0x37e1, 0x6008, 0xc0cc, 0x600a, 0x682b, 0x0000,
+       0x789b, 0x000e, 0x6f14, 0x6938, 0x691a, 0x6944, 0x6916, 0x2009,
+       0x0000, 0xae86, 0x4740, 0x0110, 0x2009, 0x0001, 0x080c, 0x431f,
+       0xd6dc, 0x01c8, 0x691c, 0xc1ed, 0x691e, 0x6828, 0xa082, 0x000e,
+       0x0290, 0x6848, 0xa084, 0x000f, 0xa086, 0x000b, 0x1160, 0x685c,
+       0xa086, 0x0047, 0x1140, 0x2001, 0x4701, 0x2004, 0xd0ac, 0x1118,
+       0x2700, 0x080c, 0x249e, 0x6818, 0xd0fc, 0x0140, 0x681b, 0x0000,
+       0x7868, 0xa08c, 0x00ff, 0x0110, 0x681b, 0x001e, 0xaea0, 0x0017,
+       0x6800, 0x2022, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x68c0, 0x2060,
+       0x6000, 0xd0a4, 0x0580, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051,
+       0x0020, 0x00d6, 0x00f6, 0x0156, 0x0146, 0x2079, 0x4700, 0x080c,
+       0x1bb2, 0x014e, 0x015e, 0x00fe, 0x70c8, 0x2010, 0x2009, 0x0101,
+       0x0026, 0x2204, 0xa06d, 0x0140, 0x6814, 0xa706, 0x0110, 0x6800,
+       0x0cc8, 0x6820, 0xc0d5, 0x6822, 0x002e, 0x8210, 0x8109, 0x1d80,
+       0x00de, 0x7063, 0x0003, 0x707b, 0x0000, 0x7772, 0x707f, 0x000f,
+       0x71d0, 0xc1c4, 0x71d2, 0x6818, 0xa086, 0x0002, 0x1138, 0x6817,
+       0x0000, 0x682b, 0x0000, 0x681c, 0xc0ec, 0x681e, 0x080c, 0x1dbf,
+       0x0804, 0x25c9, 0x7cd8, 0x7ddc, 0x7fd0, 0x080c, 0x30ff, 0x682b,
+       0x0000, 0x789b, 0x000e, 0x6f14, 0x080c, 0x3c72, 0xa08c, 0x00ff,
+       0x6916, 0x6818, 0xd0fc, 0x0110, 0x7044, 0x681a, 0xa68c, 0xdf00,
+       0x691e, 0x7063, 0x0000, 0x0804, 0x25c9, 0x7000, 0xa005, 0x1110,
+       0x0804, 0x25c9, 0xa006, 0x080c, 0x3f4e, 0x6920, 0xd1ac, 0x1110,
+       0x681b, 0x0014, 0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820,
+       0xa084, 0x00ff, 0x6822, 0x7000, 0x0002, 0x25c9, 0x326f, 0x326f,
+       0x3272, 0x3272, 0x3272, 0x326d, 0x326d, 0x080c, 0x2575, 0x6818,
+       0x0804, 0x2f3b, 0x6008, 0xc0a4, 0x600a, 0x6817, 0x0000, 0x0804,
+       0x3795, 0x2300, 0x0002, 0x327e, 0x3280, 0x32ce, 0x080c, 0x2575,
+       0xd6fc, 0x1904, 0x2d5b, 0x7000, 0xa00d, 0x0002, 0x25c9, 0x3290,
+       0x3290, 0x32ba, 0x3290, 0x32cb, 0x328e, 0x328e, 0x080c, 0x2575,
+       0xa684, 0x0060, 0x0538, 0xa086, 0x0060, 0x1510, 0xc6ac, 0xc6f4,
+       0xc6ed, 0x7e5a, 0x6eb6, 0x681c, 0xc0ac, 0x681e, 0xa186, 0x0002,
+       0x0148, 0x080c, 0x3f4e, 0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c,
+       0x4235, 0x0010, 0x080c, 0x4208, 0x781b, 0x0083, 0x71d0, 0xd1b4,
+       0x1904, 0x25c6, 0x70a0, 0xa086, 0x0001, 0x1904, 0x260d, 0x0005,
+       0xd6ec, 0x09f0, 0x6818, 0xd0fc, 0x0170, 0xd6f4, 0x1130, 0x681b,
+       0x0015, 0x781b, 0x0083, 0x0804, 0x25c6, 0x681b, 0x0007, 0x682f,
+       0x0000, 0x6833, 0x0000, 0x080c, 0x3c17, 0x0005, 0x080c, 0x2575,
+       0x2300, 0x0002, 0x32d7, 0x32f9, 0x3351, 0x080c, 0x2575, 0x7000,
+       0x0002, 0x32e1, 0x32e3, 0x32ea, 0x32e1, 0x32e1, 0x32e1, 0x32e1,
+       0x32e1, 0x080c, 0x2575, 0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c,
+       0x4235, 0x0010, 0x080c, 0x4208, 0x681c, 0xc0b4, 0x681e, 0x70d0,
+       0xd0b4, 0x1904, 0x25c6, 0x70a0, 0xa086, 0x0001, 0x1904, 0x260d,
+       0x0005, 0xd6fc, 0x1904, 0x3341, 0x7000, 0xa00d, 0x0002, 0x25c9,
+       0x330f, 0x3309, 0x3339, 0x330f, 0x333e, 0x3307, 0x3307, 0x080c,
+       0x2575, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684,
+       0x0060, 0x0538, 0xa086, 0x0060, 0x1510, 0xa6b4, 0xbfbf, 0xc6ed,
+       0x7e5a, 0x6eb6, 0xa186, 0x0002, 0x0148, 0x080c, 0x3f4e, 0x69ac,
+       0x68b0, 0xa115, 0x0118, 0x080c, 0x4235, 0x0010, 0x080c, 0x4208,
+       0x781b, 0x0083, 0x681c, 0xc0b4, 0x681e, 0x71d0, 0xd1b4, 0x1904,
+       0x25c6, 0x70a0, 0xa086, 0x0001, 0x1904, 0x260d, 0x0005, 0xd6ec,
+       0x09f0, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x0007, 0x781b, 0x00fb,
+       0x0005, 0xc6fc, 0x7e5a, 0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302,
+       0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x79d2, 0x781b, 0x0083,
+       0x0005, 0xd6dc, 0x0130, 0x782b, 0x3009, 0x781b, 0x0083, 0x0804,
+       0x25c6, 0x7884, 0xc0ac, 0x7886, 0x78e4, 0xa084, 0x0008, 0x1150,
+       0xa484, 0x0200, 0x0108, 0xc6f5, 0xc6dd, 0x7e5a, 0x781b, 0x0083,
+       0x0804, 0x25c6, 0x6820, 0xc095, 0x6822, 0x080c, 0x3c02, 0xc6dd,
+       0x080c, 0x3a61, 0x781b, 0x0082, 0x0804, 0x25c6, 0x2300, 0x0002,
+       0x337b, 0x337d, 0x337f, 0x080c, 0x2575, 0x0804, 0x3a5b, 0x7d98,
+       0xd6d4, 0x15a8, 0x79e4, 0xd1ac, 0x0130, 0x78ec, 0xa084, 0x0003,
+       0x0110, 0x782b, 0x3009, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684,
+       0xfffb, 0x785a, 0x7d9a, 0x79e4, 0xd1ac, 0x0120, 0x78ec, 0xa084,
+       0x0003, 0x1120, 0x2001, 0x0014, 0x0804, 0x2f3b, 0x7884, 0xd0fc,
        0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004,
        0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005,
-       0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x2c6f,
-       0x2c2a, 0x2ba4, 0x3be5, 0x3c29, 0x3c29, 0x3be5, 0x3c23, 0x080c,
-       0x3bf1, 0x0005, 0xa282, 0x0005, 0x0310, 0x080c, 0x254c, 0x7898,
-       0x2040, 0x2300, 0x0002, 0x2c7e, 0x2ea8, 0x2eb2, 0x2200, 0x0002,
-       0x2c9a, 0x2c87, 0x2c9a, 0x2c85, 0x2e8a, 0x080c, 0x254c, 0x789b,
-       0x0018, 0x78a8, 0x2010, 0xa084, 0x00ff, 0xa082, 0x0020, 0x0a04,
-       0x3a0b, 0xa08a, 0x0004, 0x1a04, 0x3a0b, 0x0002, 0x3a0b, 0x3a0b,
-       0x3a0b, 0x39c1, 0x789b, 0x0018, 0x79a8, 0xa184, 0x0080, 0x0148,
-       0x0804, 0x3a0b, 0x7000, 0xa005, 0x1dd8, 0x2011, 0x0004, 0x0804,
-       0x3594, 0xa184, 0x00ff, 0xa08a, 0x0010, 0x1a04, 0x3a0b, 0x0002,
-       0x2cc2, 0x2cc0, 0x2cd4, 0x2cd8, 0x2d86, 0x3a0b, 0x3a0b, 0x2d88,
-       0x3a0b, 0x3a0b, 0x2e86, 0x2e86, 0x3a0b, 0x3a0b, 0x3a0b, 0x2e88,
-       0x080c, 0x254c, 0xd6e4, 0x0140, 0x2001, 0x0300, 0x8000, 0x8000,
-       0x783a, 0x781b, 0x00c7, 0x0005, 0x6818, 0xd0fc, 0x0118, 0x681b,
-       0x001d, 0x0c90, 0x0804, 0x3be5, 0x681b, 0x001d, 0x0804, 0x3a36,
-       0x6920, 0x6922, 0xa684, 0x1800, 0x1904, 0x2d29, 0x6820, 0xd084,
-       0x1904, 0x2d31, 0x6818, 0xa086, 0x0008, 0x1110, 0x681b, 0x0000,
-       0xd6d4, 0x0568, 0xd6bc, 0x0558, 0x7083, 0x0000, 0x6818, 0xa084,
-       0x003f, 0xa08a, 0x000d, 0x0718, 0xa08a, 0x000c, 0x7182, 0x2001,
-       0x000c, 0x800c, 0x7186, 0x789b, 0x0061, 0x78aa, 0x0156, 0x0136,
-       0x0146, 0x0016, 0x3208, 0xa18c, 0x0600, 0x0118, 0x20a1, 0x022b,
-       0x0010, 0x20a1, 0x012b, 0x001e, 0x789b, 0x0000, 0x8000, 0x80ac,
-       0xad80, 0x000b, 0x2098, 0x53a6, 0x014e, 0x013e, 0x015e, 0x6038,
-       0xa005, 0x1150, 0x681c, 0xa084, 0x000e, 0x0904, 0x3a36, 0x080c,
-       0x3a48, 0x782b, 0x3008, 0x0010, 0x8001, 0x603a, 0x781b, 0x0071,
-       0x0005, 0xd6e4, 0x0130, 0x781b, 0x0083, 0x0005, 0x781b, 0x0083,
-       0x0005, 0xa684, 0x0060, 0x0dd0, 0xd6dc, 0x0dc0, 0xd6fc, 0x01a0,
-       0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0, 0x8007, 0xa084,
-       0x007f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2,
-       0x6b94, 0x2200, 0xa303, 0x68ae, 0xd6f4, 0x0118, 0xc6f4, 0x7e5a,
-       0x6eb6, 0x7000, 0xa086, 0x0003, 0x1148, 0x0006, 0x080c, 0x3f26,
-       0x080c, 0x41d9, 0x000e, 0x781b, 0x0080, 0x0005, 0xa006, 0x080c,
-       0x42b5, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0120,
-       0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, 0x6ba6,
-       0x7bd6, 0x7bde, 0x2300, 0xa405, 0x1130, 0xc6f5, 0x7e5a, 0x6eb6,
-       0x781b, 0x0080, 0x0005, 0x781b, 0x0080, 0x2200, 0xa115, 0x1118,
-       0x080c, 0x41d9, 0x0005, 0x080c, 0x4206, 0x0005, 0x080c, 0x254c,
-       0x0804, 0x2e1c, 0x00c6, 0x7054, 0x2060, 0x6920, 0xa18c, 0xecff,
-       0x6922, 0x6000, 0xa084, 0xcfdf, 0x6002, 0x080c, 0x38f4, 0xa006,
-       0x2040, 0x2038, 0x080c, 0x399c, 0x0804, 0x2e10, 0x00c6, 0x7054,
-       0x2060, 0x2c48, 0x7aa8, 0xa294, 0x00ff, 0xa286, 0x0004, 0x11d8,
-       0x6920, 0xd1e4, 0x1170, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031,
-       0x0000, 0xa006, 0x2010, 0x080c, 0x38f7, 0x080c, 0x399c, 0x0804,
-       0x2e10, 0xa18c, 0xecff, 0x6922, 0x6104, 0xa18c, 0xffdd, 0x6106,
-       0x6000, 0xc0ac, 0x6002, 0xa286, 0x0003, 0x01d0, 0x6104, 0xa184,
-       0x0010, 0x0548, 0x080c, 0x3b6b, 0x080c, 0x3977, 0x88ff, 0x0518,
-       0x00ce, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a,
-       0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, 0x781b, 0x0082, 0x0005,
-       0x6920, 0xd1cc, 0x0130, 0xa18c, 0xfdff, 0x6922, 0x6000, 0xc0ec,
-       0x6002, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031, 0x0000, 0xa006,
-       0x2010, 0x080c, 0x399c, 0xa286, 0x0001, 0x0158, 0x6104, 0xa184,
-       0x0008, 0x01b0, 0x080c, 0x3b6b, 0x080c, 0x3895, 0x88ff, 0x1980,
-       0x0078, 0x6920, 0xd1c4, 0x0130, 0xa18c, 0xfeff, 0x6922, 0x6000,
-       0xc0e4, 0x6002, 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x38f7,
-       0x00ce, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b,
-       0x0083, 0x0005, 0x0804, 0x3a32, 0x2808, 0x789b, 0x0080, 0x2019,
-       0x0080, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x11b8, 0x2300,
-       0xa102, 0xa086, 0x0001, 0x0904, 0x2d8a, 0x7ca8, 0xa4a4, 0x00ff,
-       0xa480, 0x0002, 0xa300, 0x2018, 0xa102, 0x0a04, 0x2d9e, 0x0904,
-       0x2d9e, 0x24a8, 0x7aa8, 0x1f04, 0x2e3a, 0x0c18, 0xa284, 0x00f0,
-       0xa082, 0x0020, 0x06b8, 0x2200, 0xa082, 0x0021, 0x1698, 0x7aa8,
-       0x8318, 0x8318, 0x2100, 0xa302, 0x0aa0, 0xa286, 0x0023, 0x0950,
-       0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1, 0xc0a5,
-       0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x78a0, 0x8001, 0x0904,
-       0x2e10, 0x20a8, 0x7998, 0x789b, 0x0060, 0x78aa, 0x2011, 0x0080,
-       0x799a, 0x78a8, 0x7998, 0x7a9a, 0x78aa, 0x7a98, 0x1f04, 0x2e68,
-       0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, 0x781b,
-       0x0082, 0x0005, 0x8318, 0x2100, 0xa302, 0x0a04, 0x2e21, 0xa284,
-       0x0080, 0x1904, 0x3a36, 0x78a0, 0xa005, 0x08c8, 0x0804, 0x3a36,
-       0x0804, 0x3a0b, 0x7054, 0xa04d, 0x789b, 0x0018, 0x78a8, 0xa084,
-       0x00ff, 0xa08e, 0x0001, 0x0110, 0x080c, 0x254c, 0x7aa8, 0xa294,
-       0x00ff, 0x784b, 0x0008, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0005,
-       0x1a04, 0x3a0b, 0x0002, 0x3a0b, 0x380c, 0x3a0b, 0x3927, 0x3d31,
-       0xa282, 0x0000, 0x1110, 0x080c, 0x254c, 0x080c, 0x3a3c, 0x781b,
-       0x0082, 0x0005, 0xa282, 0x0003, 0x1110, 0x080c, 0x254c, 0xd4fc,
-       0x11d0, 0x7060, 0xa005, 0x0110, 0x080c, 0x254c, 0x6f14, 0x7772,
-       0xa7bc, 0x8f00, 0x080c, 0x3b6f, 0x6008, 0xa085, 0x0021, 0x600a,
-       0x8738, 0xa784, 0x001f, 0x1db0, 0x080c, 0x3a3f, 0x7063, 0x0002,
-       0x701f, 0x0009, 0x0010, 0x080c, 0x3a4b, 0x781b, 0x0082, 0x0005,
-       0xa282, 0x0004, 0x0310, 0x080c, 0x254c, 0x2300, 0x0002, 0x2ee2,
-       0x3078, 0x30b4, 0xa286, 0x0003, 0x0598, 0x7200, 0x7cd8, 0x7ddc,
-       0x7fd0, 0x71d0, 0xd1b4, 0x0528, 0xd1bc, 0x1518, 0x2001, 0x4601,
-       0x2004, 0xd0c4, 0x11f0, 0x7868, 0xa084, 0x00ff, 0x11d0, 0xa282,
-       0x0002, 0x12b8, 0x00d6, 0x783b, 0x8300, 0x781b, 0x0059, 0x70b8,
-       0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
-       0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030, 0x00de, 0x2001, 0x0000,
-       0x0058, 0x783b, 0x1300, 0x781b, 0x0057, 0x2001, 0x0000, 0x0020,
-       0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x7046, 0x68a0, 0xd0ec, 0x0118,
-       0x6008, 0xc08d, 0x600a, 0xa284, 0x000f, 0x0002, 0x3059, 0x2f33,
-       0x2f30, 0x3184, 0x320f, 0x25a0, 0x2f2e, 0x2f2e, 0x080c, 0x254c,
-       0x6008, 0xc0d4, 0x600a, 0xd6e4, 0x0120, 0x7044, 0xa086, 0x0014,
-       0x11e8, 0x080c, 0x3f26, 0x2009, 0x0000, 0x6818, 0xd0fc, 0x0108,
-       0x7044, 0xa086, 0x0014, 0x0168, 0x6818, 0xa086, 0x0008, 0x1904,
-       0x301b, 0x7858, 0xd09c, 0x0904, 0x301b, 0x6820, 0xd0ac, 0x0904,
-       0x301b, 0x681b, 0x0014, 0x2009, 0x0002, 0x04a8, 0x7868, 0xa08c,
-       0x00ff, 0x0588, 0xa186, 0x0008, 0x1158, 0x6008, 0xc0a4, 0x600a,
-       0x080c, 0x374f, 0x0540, 0x080c, 0x37be, 0x080c, 0x3f26, 0x0060,
-       0xa186, 0x0028, 0x1500, 0x6018, 0xa005, 0x0d78, 0x8001, 0x0d68,
-       0x8001, 0x0d58, 0x601e, 0x0c48, 0x6820, 0xd084, 0x0904, 0x25a0,
-       0xc084, 0x6822, 0x080c, 0x2693, 0x7058, 0x00c6, 0x2060, 0x6800,
-       0x6002, 0x00ce, 0x6004, 0x6802, 0xa005, 0x2d00, 0x1108, 0x6002,
-       0x6006, 0x0804, 0x25a0, 0x0016, 0x81ff, 0x15f0, 0x7000, 0xa086,
-       0x0030, 0x05d0, 0x71d0, 0xd1bc, 0x15b8, 0xd1b4, 0x11e8, 0x705c,
-       0xa005, 0x1590, 0x70a0, 0xa086, 0x0001, 0x0570, 0x7003, 0x0000,
-       0x0046, 0x0056, 0x0076, 0x0066, 0x00c6, 0x00d6, 0x080c, 0x25c5,
-       0x00de, 0x00ce, 0x006e, 0x007e, 0x005e, 0x004e, 0x71d0, 0xd1b4,
-       0x11d8, 0x7003, 0x0040, 0x00c0, 0x080c, 0x3c33, 0x11a8, 0x781b,
-       0x0068, 0x00d6, 0x70b8, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6,
-       0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030,
-       0x7808, 0xc08d, 0x780a, 0x00de, 0x080c, 0x30dc, 0x001e, 0x81ff,
-       0x0904, 0x301b, 0xa684, 0xdf00, 0x681e, 0x682b, 0x0000, 0x6f14,
-       0xa186, 0x0002, 0x1904, 0x301c, 0x6818, 0xa086, 0x0014, 0x1130,
-       0x2008, 0xd6e4, 0x0118, 0x7868, 0xa08c, 0x00ff, 0x080c, 0x3a55,
-       0x080c, 0x269e, 0x6820, 0xd0dc, 0x1578, 0x8717, 0xa294, 0x000f,
-       0x8213, 0x8213, 0x8213, 0xb284, 0x0600, 0x0118, 0xa290, 0x4ac0,
-       0x0010, 0xa290, 0x4b40, 0xa290, 0x0000, 0x221c, 0xd3c4, 0x0170,
-       0x6820, 0xd0e4, 0x0128, 0xa084, 0xefff, 0x6822, 0xc3ac, 0x2312,
-       0x8210, 0x2204, 0xa085, 0x0038, 0x2012, 0x8211, 0xd3d4, 0x0138,
-       0x68a0, 0xd0c4, 0x1120, 0x080c, 0x3144, 0x0804, 0x25a0, 0x6008,
-       0xc08d, 0x600a, 0x0008, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0110,
-       0x7044, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x6410, 0x84ff, 0x0168,
-       0x2009, 0x4602, 0x2104, 0x8001, 0x200a, 0x8421, 0x6412, 0x1128,
-       0x2021, 0x4604, 0x2404, 0xc0a5, 0x2022, 0x6018, 0xa005, 0x0118,
-       0x8001, 0x601a, 0x1118, 0x6008, 0xc0a4, 0x600a, 0x6820, 0xd084,
-       0x1130, 0x6800, 0xa005, 0x1108, 0x6002, 0x6006, 0x0020, 0x7058,
-       0x2060, 0x6800, 0x6002, 0x2061, 0x4600, 0x6887, 0x0103, 0x2d08,
-       0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0110, 0x2d02, 0x0008,
-       0x616e, 0x7200, 0xa286, 0x0030, 0x0158, 0xa286, 0x0040, 0x1904,
-       0x25a0, 0x7003, 0x0002, 0x7048, 0x2068, 0x68c4, 0x2060, 0x0005,
-       0x7003, 0x0002, 0x70b8, 0xa06d, 0x68bc, 0x703e, 0x70b4, 0xa065,
-       0x68c0, 0x7056, 0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x0005,
-       0xa282, 0x0004, 0x0210, 0x080c, 0x254c, 0x2200, 0x0002, 0x3083,
-       0x3092, 0x309e, 0x3092, 0xa586, 0x1300, 0x0160, 0xa586, 0x8300,
-       0x1d90, 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084,
-       0xfbef, 0x600a, 0x7000, 0xa086, 0x0005, 0x0128, 0x080c, 0x3a3c,
-       0x781b, 0x0082, 0x0005, 0x781b, 0x0083, 0x0005, 0x7890, 0x8007,
-       0x8001, 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c,
-       0x00ff, 0xa186, 0x0003, 0x0128, 0xa186, 0x0000, 0x0110, 0x0804,
-       0x3a0b, 0x781b, 0x0083, 0x0005, 0x6820, 0xc095, 0x6822, 0x82ff,
-       0x1118, 0x080c, 0x3a3c, 0x0030, 0x8211, 0x0110, 0x080c, 0x254c,
-       0x080c, 0x3a4b, 0x781b, 0x0082, 0x0005, 0x080c, 0x3c46, 0x7830,
-       0xa084, 0x00c0, 0x1170, 0x0016, 0x3208, 0xa18c, 0x0800, 0x001e,
-       0x0118, 0x0104, 0x30d9, 0x0010, 0x0304, 0x30d9, 0x791a, 0xa006,
-       0x0005, 0xa085, 0x0001, 0x0005, 0xa684, 0x0060, 0x1130, 0x682f,
-       0x0000, 0x6833, 0x0000, 0x0804, 0x3143, 0xd6dc, 0x1198, 0x68b4,
-       0xd0dc, 0x1180, 0x6998, 0x6a94, 0x692e, 0x6a32, 0x7044, 0xa005,
-       0x1130, 0x2200, 0xa105, 0x0904, 0x3f26, 0x7047, 0x0015, 0x0804,
-       0x3f26, 0x0005, 0xd6ac, 0x01f0, 0xd6f4, 0x0130, 0x682f, 0x0000,
-       0x6833, 0x0000, 0x0804, 0x3f26, 0x68b4, 0xa084, 0x4000, 0xa635,
-       0xd6f4, 0x1da0, 0x7044, 0xa005, 0x1110, 0x7047, 0x0015, 0xd6dc,
-       0x1128, 0x68b4, 0xd0dc, 0x0110, 0x6ca8, 0x6da4, 0x6c2e, 0x6d32,
-       0x0804, 0x3f26, 0xd6f4, 0x0130, 0x682f, 0x0000, 0x6833, 0x0000,
-       0x0804, 0x3f26, 0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4, 0x1da0,
-       0x7044, 0xa005, 0x1110, 0x7047, 0x0015, 0x2408, 0x2510, 0x2700,
-       0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x692e, 0x6a32,
-       0x2100, 0xa205, 0x1110, 0x0804, 0x3f26, 0x7000, 0xa086, 0x0006,
-       0x0110, 0x0804, 0x3f26, 0x0005, 0x6946, 0x6008, 0xc0cd, 0xd3cc,
-       0x0108, 0xc08d, 0x600a, 0x6818, 0x683a, 0x681b, 0x0006, 0x688f,
-       0x0000, 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f,
-       0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b,
-       0x0020, 0x7000, 0x0002, 0x25a0, 0x3173, 0x316d, 0x316b, 0x316b,
-       0x316b, 0x316b, 0x316b, 0x080c, 0x254c, 0x6820, 0xd084, 0x1118,
-       0x080c, 0x37a4, 0x0030, 0x7058, 0x2c50, 0x2060, 0x6800, 0x6002,
-       0x2a60, 0xaea0, 0x0017, 0x2404, 0xa005, 0x0110, 0x2020, 0x0cd8,
-       0x2d22, 0x206b, 0x0000, 0x0005, 0x080c, 0x37aa, 0x080c, 0x37be,
-       0x6008, 0xc0cc, 0x600a, 0x682b, 0x0000, 0x789b, 0x000e, 0x6f14,
-       0x6938, 0x691a, 0x6944, 0x6916, 0x2009, 0x0000, 0xae86, 0x4640,
-       0x0110, 0x2009, 0x0001, 0x080c, 0x42ec, 0xd6dc, 0x01c8, 0x691c,
-       0xc1ed, 0x691e, 0x6828, 0xa082, 0x000e, 0x0290, 0x6848, 0xa084,
-       0x000f, 0xa086, 0x000b, 0x1160, 0x685c, 0xa086, 0x0047, 0x1140,
-       0x2001, 0x4601, 0x2004, 0xd0ac, 0x1118, 0x2700, 0x080c, 0x2475,
-       0x6818, 0xd0fc, 0x0140, 0x681b, 0x0000, 0x7868, 0xa08c, 0x00ff,
-       0x0110, 0x681b, 0x001e, 0xaea0, 0x0017, 0x6800, 0x2022, 0x6a3c,
-       0x6940, 0x6a32, 0x692e, 0x68c0, 0x2060, 0x6000, 0xd0a4, 0x0580,
-       0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x00d6, 0x00f6,
-       0x0156, 0x0146, 0x2079, 0x4600, 0x080c, 0x1b93, 0x014e, 0x015e,
-       0x00fe, 0x70c8, 0x2010, 0x2009, 0x0101, 0x0026, 0x2204, 0xa06d,
-       0x0140, 0x6814, 0xa706, 0x0110, 0x6800, 0x0cc8, 0x6820, 0xc0d5,
-       0x6822, 0x002e, 0x8210, 0x8109, 0x1d80, 0x00de, 0x7063, 0x0003,
-       0x707b, 0x0000, 0x7772, 0x707f, 0x000f, 0x71d0, 0xc1c4, 0x71d2,
-       0x6818, 0xa086, 0x0002, 0x1138, 0x6817, 0x0000, 0x682b, 0x0000,
-       0x681c, 0xc0ec, 0x681e, 0x080c, 0x1da2, 0x0804, 0x25a0, 0x7cd8,
-       0x7ddc, 0x7fd0, 0x080c, 0x30dc, 0x682b, 0x0000, 0x789b, 0x000e,
-       0x6f14, 0x080c, 0x3c4a, 0xa08c, 0x00ff, 0x6916, 0x6818, 0xd0fc,
-       0x0110, 0x7044, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x7063, 0x0000,
-       0x0804, 0x25a0, 0x7000, 0xa005, 0x1110, 0x0804, 0x25a0, 0xa006,
-       0x080c, 0x3f26, 0x6920, 0xd1ac, 0x1110, 0x681b, 0x0014, 0xa68c,
-       0xdf00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff, 0x6822,
-       0x7000, 0x0002, 0x25a0, 0x324c, 0x324c, 0x324f, 0x324f, 0x324f,
-       0x324a, 0x324a, 0x080c, 0x254c, 0x6818, 0x0804, 0x2f18, 0x6008,
-       0xc0a4, 0x600a, 0x6817, 0x0000, 0x0804, 0x3772, 0x2300, 0x0002,
-       0x325b, 0x325d, 0x32ab, 0x080c, 0x254c, 0xd6fc, 0x1904, 0x2d38,
-       0x7000, 0xa00d, 0x0002, 0x25a0, 0x326d, 0x326d, 0x3297, 0x326d,
-       0x32a8, 0x326b, 0x326b, 0x080c, 0x254c, 0xa684, 0x0060, 0x0538,
-       0xa086, 0x0060, 0x1510, 0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a, 0x6eb6,
-       0x681c, 0xc0ac, 0x681e, 0xa186, 0x0002, 0x0148, 0x080c, 0x3f26,
-       0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c, 0x4206, 0x0010, 0x080c,
-       0x41d9, 0x781b, 0x0083, 0x71d0, 0xd1b4, 0x1904, 0x259d, 0x70a0,
-       0xa086, 0x0001, 0x1904, 0x25e1, 0x0005, 0xd6ec, 0x09f0, 0x6818,
-       0xd0fc, 0x0170, 0xd6f4, 0x1130, 0x681b, 0x0015, 0x781b, 0x0083,
-       0x0804, 0x259d, 0x681b, 0x0007, 0x682f, 0x0000, 0x6833, 0x0000,
-       0x080c, 0x3bf1, 0x0005, 0x080c, 0x254c, 0x2300, 0x0002, 0x32b4,
-       0x32d6, 0x332e, 0x080c, 0x254c, 0x7000, 0x0002, 0x32be, 0x32c0,
-       0x32c7, 0x32be, 0x32be, 0x32be, 0x32be, 0x32be, 0x080c, 0x254c,
-       0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c, 0x4206, 0x0010, 0x080c,
-       0x41d9, 0x681c, 0xc0b4, 0x681e, 0x70d0, 0xd0b4, 0x1904, 0x259d,
-       0x70a0, 0xa086, 0x0001, 0x1904, 0x25e1, 0x0005, 0xd6fc, 0x1904,
-       0x331e, 0x7000, 0xa00d, 0x0002, 0x25a0, 0x32ec, 0x32e6, 0x3316,
-       0x32ec, 0x331b, 0x32e4, 0x32e4, 0x080c, 0x254c, 0x6894, 0x78d6,
-       0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060, 0x0538, 0xa086,
-       0x0060, 0x1510, 0xa6b4, 0xbfbf, 0xc6ed, 0x7e5a, 0x6eb6, 0xa186,
-       0x0002, 0x0148, 0x080c, 0x3f26, 0x69ac, 0x68b0, 0xa115, 0x0118,
-       0x080c, 0x4206, 0x0010, 0x080c, 0x41d9, 0x781b, 0x0083, 0x681c,
-       0xc0b4, 0x681e, 0x71d0, 0xd1b4, 0x1904, 0x259d, 0x70a0, 0xa086,
-       0x0001, 0x1904, 0x25e1, 0x0005, 0xd6ec, 0x09f0, 0x6818, 0xd0fc,
-       0x0110, 0x681b, 0x0007, 0x781b, 0x00fb, 0x0005, 0xc6fc, 0x7e5a,
-       0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
-       0xa303, 0x68ae, 0x79d2, 0x781b, 0x0083, 0x0005, 0xd6dc, 0x0130,
-       0x782b, 0x3009, 0x781b, 0x0083, 0x0804, 0x259d, 0x7884, 0xc0ac,
-       0x7886, 0x78e4, 0xa084, 0x0008, 0x1150, 0xa484, 0x0200, 0x0108,
-       0xc6f5, 0xc6dd, 0x7e5a, 0x781b, 0x0083, 0x0804, 0x259d, 0x6820,
-       0xc095, 0x6822, 0x080c, 0x3bdc, 0xc6dd, 0x080c, 0x3a3c, 0x781b,
-       0x0082, 0x0804, 0x259d, 0x2300, 0x0002, 0x3358, 0x335a, 0x335c,
-       0x080c, 0x254c, 0x0804, 0x3a36, 0x7d98, 0xd6d4, 0x15a8, 0x79e4,
-       0xd1ac, 0x0130, 0x78ec, 0xa084, 0x0003, 0x0110, 0x782b, 0x3009,
-       0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x7d9a,
-       0x79e4, 0xd1ac, 0x0120, 0x78ec, 0xa084, 0x0003, 0x1120, 0x2001,
-       0x0014, 0x0804, 0x2f18, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007,
+       0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x04c2, 0x7a90,
+       0xa294, 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff, 0x0568, 0x789b,
+       0x0080, 0x7ba8, 0xa384, 0x0001, 0x11d0, 0x7ba8, 0x7ba8, 0xa386,
+       0x0004, 0x1118, 0x2009, 0xffdf, 0x0058, 0xa386, 0x0001, 0x1118,
+       0x2009, 0xfff7, 0x0028, 0xa386, 0x0003, 0x1148, 0x2009, 0xffef,
+       0x00c6, 0x7054, 0x2060, 0x6004, 0xa104, 0x6006, 0x00ce, 0x789b,
+       0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b, 0x3009,
+       0x6920, 0xa18c, 0xecff, 0x6922, 0x7d9a, 0x0804, 0x3c0b, 0x2bd1,
+       0x2bda, 0x33f9, 0x33ff, 0x33f7, 0x33f7, 0x3c0b, 0x3c0b, 0x080c,
+       0x2575, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0804, 0x3c11, 0x6920,
+       0xa18c, 0xfcff, 0x6922, 0x0804, 0x3c0b, 0x79e4, 0xa184, 0x0030,
+       0x0120, 0x78ec, 0xa084, 0x0003, 0x1570, 0x7000, 0xa086, 0x0004,
+       0x1190, 0x7060, 0xa086, 0x0002, 0x1130, 0x2011, 0x0002, 0x2019,
+       0x0000, 0x0804, 0x2a85, 0x7060, 0xa086, 0x0006, 0x0db0, 0x7060,
+       0xa086, 0x0004, 0x0d90, 0x7000, 0xa086, 0x0000, 0x0904, 0x25c6,
+       0x6920, 0xa184, 0x0420, 0x0128, 0xc1d4, 0x6922, 0x6818, 0x0804,
+       0x2f3b, 0x6818, 0xa08e, 0x0002, 0x0120, 0xc0fd, 0x681a, 0x2001,
+       0x0014, 0x0804, 0x2f3b, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007,
        0x0090, 0xa184, 0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000,
        0x0050, 0xa184, 0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007,
-       0x0010, 0x2001, 0x0001, 0x04c2, 0x7a90, 0xa294, 0x0007, 0x789b,
-       0x0060, 0x79a8, 0x81ff, 0x0568, 0x789b, 0x0080, 0x7ba8, 0xa384,
-       0x0001, 0x11d0, 0x7ba8, 0x7ba8, 0xa386, 0x0004, 0x1118, 0x2009,
-       0xffdf, 0x0058, 0xa386, 0x0001, 0x1118, 0x2009, 0xfff7, 0x0028,
-       0xa386, 0x0003, 0x1148, 0x2009, 0xffef, 0x00c6, 0x7054, 0x2060,
-       0x6004, 0xa104, 0x6006, 0x00ce, 0x789b, 0x0060, 0x78ab, 0x0000,
-       0xa684, 0xfffb, 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xecff,
-       0x6922, 0x7d9a, 0x0804, 0x3be5, 0x2bae, 0x2bb7, 0x33d6, 0x33dc,
-       0x33d4, 0x33d4, 0x3be5, 0x3be5, 0x080c, 0x254c, 0x6920, 0xa18c,
-       0xfcff, 0x6922, 0x0804, 0x3beb, 0x6920, 0xa18c, 0xfcff, 0x6922,
-       0x0804, 0x3be5, 0x79e4, 0xa184, 0x0030, 0x0120, 0x78ec, 0xa084,
-       0x0003, 0x1570, 0x7000, 0xa086, 0x0004, 0x1190, 0x7060, 0xa086,
-       0x0002, 0x1130, 0x2011, 0x0002, 0x2019, 0x0000, 0x0804, 0x2a56,
-       0x7060, 0xa086, 0x0006, 0x0db0, 0x7060, 0xa086, 0x0004, 0x0d90,
-       0x7000, 0xa086, 0x0000, 0x0904, 0x259d, 0x6920, 0xa184, 0x0420,
-       0x0128, 0xc1d4, 0x6922, 0x6818, 0x0804, 0x2f18, 0x6818, 0xa08e,
-       0x0002, 0x0120, 0xc0fd, 0x681a, 0x2001, 0x0014, 0x0804, 0x2f18,
-       0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007,
-       0xa086, 0x0004, 0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007,
-       0xa086, 0x0005, 0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001,
-       0x0002, 0x3be5, 0x3be5, 0x3439, 0x3be5, 0x3c29, 0x3c29, 0x3be5,
-       0x3be5, 0xd6bc, 0x0570, 0x7180, 0x81ff, 0x0558, 0xa182, 0x000d,
-       0x1318, 0x7083, 0x0000, 0x0028, 0xa182, 0x000c, 0x7082, 0x2009,
-       0x000c, 0x789b, 0x0061, 0x79aa, 0x0156, 0x0136, 0x0146, 0x7084,
-       0x8114, 0xa210, 0x7286, 0xa080, 0x000b, 0xad00, 0x2098, 0xb284,
-       0x0600, 0x0118, 0x20a1, 0x022b, 0x0010, 0x20a1, 0x012b, 0x789b,
-       0x0000, 0x8108, 0x81ac, 0x53a6, 0x014e, 0x013e, 0x015e, 0x0804,
-       0x3beb, 0xd6d4, 0x1904, 0x34ac, 0x6820, 0xd084, 0x0904, 0x3beb,
-       0xa68c, 0x0060, 0xa684, 0x0060, 0x0120, 0xa086, 0x0060, 0x1108,
-       0xc1f5, 0xc194, 0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab, 0x0000,
-       0x789b, 0x0061, 0x6818, 0xc0fd, 0x681a, 0x78aa, 0x8008, 0x810c,
-       0x0904, 0x37d3, 0xa18c, 0x00f8, 0x1904, 0x37d3, 0x0156, 0x0136,
-       0x0146, 0x0016, 0x20a1, 0x012b, 0x3208, 0xa18c, 0x0600, 0x0110,
-       0x20a1, 0x022b, 0x001e, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80,
-       0x000b, 0x2098, 0x53a6, 0x014e, 0x013e, 0x015e, 0x6814, 0xc0fc,
-       0x8007, 0x7882, 0x0804, 0x3beb, 0x6818, 0xd0fc, 0x0110, 0x681b,
-       0x0008, 0x080c, 0x3a3c, 0x781b, 0x00ed, 0x0005, 0x2300, 0x0002,
-       0x34bd, 0x357a, 0x34bb, 0x080c, 0x254c, 0x7cd8, 0x7ddc, 0x7fd0,
-       0x82ff, 0x1528, 0x7200, 0xa286, 0x0003, 0x0904, 0x2ee6, 0x71d0,
-       0xd1bc, 0x11f8, 0xd1b4, 0x01e8, 0x2001, 0x4601, 0x2004, 0xd0c4,
-       0x11c0, 0x00d6, 0x783b, 0x8800, 0x781b, 0x0059, 0x70b8, 0xa06d,
-       0x68b4, 0xc0a5, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
-       0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030, 0x00de, 0x0030, 0x7200,
-       0x0020, 0x783b, 0x1800, 0x781b, 0x0057, 0xa284, 0x000f, 0x0002,
-       0x3565, 0x3522, 0x34fa, 0x2f15, 0x34f8, 0x3565, 0x34f8, 0x34f8,
-       0x080c, 0x254c, 0x681c, 0xd0ec, 0x0118, 0x6008, 0xc08d, 0x600a,
-       0x6920, 0xc185, 0x6922, 0x6800, 0x6006, 0xa005, 0x1108, 0x6002,
-       0x6008, 0xc0d4, 0x600a, 0x681c, 0xa084, 0x000e, 0x1120, 0x71c8,
-       0xa188, 0x0100, 0x0028, 0x7030, 0x68ba, 0x713c, 0x70c8, 0xa108,
-       0x2104, 0x6802, 0x2d0a, 0x715a, 0xd6dc, 0x1120, 0xc6fc, 0x6eb6,
-       0x0804, 0x3565, 0x6eb6, 0xa684, 0x0060, 0x1120, 0xa684, 0x7fff,
-       0x68b6, 0x04d8, 0xd6dc, 0x1150, 0xa684, 0x7fff, 0x68b6, 0x6894,
-       0x68a6, 0x6898, 0x68aa, 0x080c, 0x3f26, 0x0478, 0xd6ac, 0x0140,
-       0xa006, 0x080c, 0x3f26, 0x2408, 0x2510, 0x69aa, 0x6aa6, 0x0068,
-       0x2408, 0x2510, 0x2700, 0x8007, 0xa084, 0x007f, 0xa108, 0xa291,
-       0x0000, 0x69aa, 0x6aa6, 0x080c, 0x3f26, 0xd6fc, 0x01b0, 0xa684,
-       0x7fff, 0x68b6, 0x2510, 0x2408, 0xd6ac, 0x1138, 0x2700, 0x8007,
-       0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302,
-       0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x7000, 0xa086, 0x0030,
-       0x1904, 0x25a0, 0x7003, 0x0002, 0x70b8, 0xa06d, 0x68bc, 0x703e,
-       0x70b4, 0xa065, 0x68c0, 0x7056, 0x2d00, 0x704a, 0xad80, 0x0009,
-       0x7042, 0x0005, 0xa586, 0x8800, 0x1148, 0x7003, 0x0000, 0x6018,
-       0x8001, 0x601a, 0x6008, 0xa084, 0xfbef, 0x600a, 0x0804, 0x3a36,
-       0x7043, 0x0000, 0xa282, 0x0006, 0x0310, 0x080c, 0x254c, 0x2300,
-       0x0002, 0x3594, 0x35a5, 0x35af, 0x2200, 0x0002, 0x359c, 0x3a36,
-       0x359e, 0x359c, 0x35e0, 0x362e, 0x080c, 0x254c, 0x7a80, 0xa294,
-       0x0f00, 0x080c, 0x3682, 0x0804, 0x3a0b, 0x00c1, 0x0002, 0x3a36,
-       0x35ad, 0x35ad, 0x35e0, 0x35ad, 0x3a36, 0x080c, 0x254c, 0x0071,
-       0x0002, 0x35b9, 0x35b7, 0x35b7, 0x35b9, 0x35b7, 0x35b9, 0x080c,
-       0x254c, 0x080c, 0x3a4b, 0x781b, 0x0082, 0x0005, 0x7000, 0xa086,
-       0x0002, 0x1150, 0x080c, 0x37be, 0x0010, 0x080c, 0x3f26, 0x6008,
-       0xa084, 0xfbef, 0x600a, 0x0020, 0x7000, 0xa086, 0x0003, 0x0da8,
-       0x7003, 0x0005, 0x2001, 0x8de0, 0xae8e, 0x4640, 0x0110, 0x2001,
-       0x8e12, 0x2068, 0x704a, 0xad80, 0x0009, 0x7042, 0x2200, 0x0005,
-       0x7000, 0xa086, 0x0002, 0x1158, 0x70d0, 0xc0b5, 0x70d2, 0x2c00,
-       0x70b6, 0x2d00, 0x70ba, 0x0038, 0x080c, 0x3f26, 0x0020, 0x7000,
-       0xa086, 0x0003, 0x0dc8, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00,
-       0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x8cc0,
-       0xb284, 0x0600, 0x1118, 0xc2fd, 0x2069, 0x8dd0, 0x2d04, 0x2d08,
-       0x715a, 0xa06d, 0x0128, 0x6814, 0xa206, 0x0120, 0x6800, 0x0cb8,
-       0x080c, 0x3682, 0x6eb4, 0x7e5a, 0x6920, 0xa184, 0x0c00, 0x0904,
-       0x36a8, 0x7060, 0xa086, 0x0006, 0x1128, 0x7070, 0xa206, 0x1110,
-       0x7062, 0x707a, 0x681b, 0x0005, 0xc1ad, 0x681b, 0x0005, 0xc1ad,
-       0xc1d4, 0x6922, 0x080c, 0x3a42, 0x0804, 0x36a8, 0x7200, 0xa286,
-       0x0002, 0x1158, 0x70d0, 0xc0b5, 0x70d2, 0x2c00, 0x70b6, 0x2d00,
-       0x70ba, 0x0030, 0x080c, 0x3f26, 0x0018, 0xa286, 0x0003, 0x0dd0,
-       0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8,
-       0xa484, 0x001f, 0xa215, 0xae86, 0x4640, 0x0108, 0xc2fd, 0x79a8,
-       0x79a8, 0xa18c, 0x00ff, 0x2118, 0x70c8, 0xa168, 0x2d04, 0x2d08,
-       0x715a, 0xa06d, 0x0128, 0x6814, 0xa206, 0x0118, 0x6800, 0x0cb8,
-       0x0409, 0x6eb4, 0x6920, 0xa184, 0x0c00, 0x0904, 0x36a8, 0xd0dc,
-       0x0178, 0x7060, 0xa086, 0x0004, 0x1140, 0x7070, 0xa206, 0x1128,
-       0x7074, 0xa306, 0x1110, 0x7062, 0x707a, 0x080c, 0x3a48, 0x0480,
-       0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922, 0x080c, 0x3a42, 0x707b,
-       0x0000, 0x0430, 0x7003, 0x0005, 0xb284, 0x0600, 0x0118, 0x2001,
-       0x8de0, 0x0010, 0x2001, 0x8e12, 0x2068, 0x704a, 0x0156, 0x20a9,
-       0x0032, 0x2003, 0x0000, 0x8000, 0x1f04, 0x3691, 0x015e, 0xb284,
-       0x0600, 0x0110, 0xc2fc, 0x0008, 0xc2fd, 0x6a16, 0xad80, 0x0009,
-       0x7042, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x0005,
-       0xc6ec, 0xa6ac, 0x0060, 0x0904, 0x36ef, 0x6b98, 0x6c94, 0x69ac,
-       0x68b0, 0xa105, 0x11e0, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa586,
-       0x0060, 0x05c8, 0xd6f4, 0x1108, 0xc6ed, 0xa6b4, 0xb7ff, 0x7e5a,
-       0x2009, 0x0083, 0xd69c, 0x0128, 0x2009, 0x0082, 0x2019, 0x0000,
-       0x2320, 0x791a, 0xd6ec, 0x0588, 0x080c, 0x41d9, 0x0470, 0x68b0,
-       0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x01f8, 0x7bd2, 0x7bda,
-       0x7cd6, 0x7cde, 0x68b0, 0xd6f4, 0x1108, 0xc6ed, 0xc6f4, 0x7e5a,
-       0x2011, 0x0083, 0xd69c, 0x0128, 0x2011, 0x0082, 0x2019, 0x0000,
-       0x2320, 0x7a1a, 0xd6ec, 0x0188, 0x080c, 0x4206, 0x0070, 0x2019,
-       0x0000, 0x2320, 0x0010, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0083,
-       0xd69c, 0x0110, 0x2009, 0x0082, 0x791a, 0x68c0, 0x7056, 0x2d00,
-       0x704a, 0x68c4, 0x2060, 0x71d0, 0x2001, 0x4601, 0x2004, 0xd0c4,
-       0x15c8, 0x70d4, 0xa02d, 0x01b8, 0xd1bc, 0x0548, 0x7a80, 0xa294,
-       0x0f00, 0x70d8, 0xa206, 0x0118, 0x78e0, 0xa504, 0x1558, 0x70d6,
-       0xc1bc, 0x71d2, 0x0438, 0x2031, 0x0001, 0x852c, 0x0218, 0x8633,
-       0x8210, 0x0cd8, 0x0005, 0x7de0, 0xa594, 0xff00, 0x0130, 0x2011,
-       0x0008, 0x852f, 0x0c81, 0x8637, 0x0008, 0x0c69, 0x8217, 0x7880,
-       0xa084, 0x0f00, 0xa206, 0x0170, 0x72da, 0x76d6, 0x0058, 0x7a80,
-       0xa294, 0x0f00, 0x70d8, 0xa236, 0x0dc0, 0x78e0, 0xa534, 0x0da8,
-       0xc1bd, 0x71d2, 0xd1b4, 0x1904, 0x259d, 0x2300, 0xa405, 0x0904,
-       0x259d, 0x70a0, 0xa086, 0x0001, 0x1904, 0x25e1, 0x0005, 0x6020,
-       0xa005, 0x0150, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008, 0x600a,
-       0x700f, 0x0100, 0x702c, 0x6026, 0x0005, 0xa006, 0x080c, 0x3f26,
-       0x7000, 0xa086, 0x0002, 0x0120, 0x7060, 0xa086, 0x0005, 0x1150,
-       0x682b, 0x0000, 0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040,
-       0x681f, 0x0100, 0x7000, 0xa084, 0x000f, 0x0002, 0x25a0, 0x3783,
-       0x3780, 0x37a0, 0x378c, 0x25a0, 0x377e, 0x377e, 0x080c, 0x254c,
-       0x0449, 0x0411, 0x0028, 0x0431, 0x7058, 0x2060, 0x6800, 0x6002,
-       0x080c, 0x1da2, 0x0804, 0x25a0, 0x7060, 0x7063, 0x0000, 0x707f,
-       0x0000, 0x0002, 0x379c, 0x379c, 0x379a, 0x379a, 0x379a, 0x379c,
-       0x379a, 0x379c, 0x0804, 0x2a6b, 0x7063, 0x0000, 0x0804, 0x25a0,
-       0x681b, 0x0000, 0x0804, 0x3184, 0x6800, 0xa005, 0x1108, 0x6002,
-       0x6006, 0x0005, 0x6410, 0x84ff, 0x0168, 0x2009, 0x4602, 0x2104,
-       0x8001, 0x200a, 0x8421, 0x6412, 0x1128, 0x2021, 0x4604, 0x2404,
-       0xc0a5, 0x2022, 0x6008, 0xc0a4, 0x600a, 0x0005, 0x6018, 0xa005,
-       0x0110, 0x8001, 0x601a, 0x0005, 0x080c, 0x3c46, 0x681b, 0x0018,
-       0x0490, 0x080c, 0x3c46, 0x681b, 0x0019, 0x0468, 0x080c, 0x3c46,
-       0x681b, 0x001a, 0x0440, 0x080c, 0x3c46, 0x681b, 0x0003, 0x0418,
-       0x7770, 0x080c, 0x3b6f, 0x7174, 0xa18c, 0x00ff, 0x3210, 0xa294,
-       0x0600, 0x0118, 0xa1e8, 0x8bc0, 0x0010, 0xa1e8, 0x8cd0, 0x2d04,
-       0x2d08, 0x2068, 0xa005, 0x1118, 0x707a, 0x0804, 0x25a0, 0x6814,
-       0x7270, 0xa206, 0x0110, 0x6800, 0x0c98, 0x6800, 0x200a, 0x681b,
-       0x0005, 0x707b, 0x0000, 0x080c, 0x37aa, 0x6820, 0xd084, 0x1110,
-       0x080c, 0x37a4, 0x080c, 0x37be, 0x681f, 0x0000, 0x6823, 0x0020,
-       0x080c, 0x1da2, 0x0804, 0x25a0, 0xa282, 0x0003, 0x1904, 0x3a10,
-       0x7da8, 0xa5ac, 0x00ff, 0x7ea8, 0xa6b4, 0x00ff, 0x6920, 0xc1bd,
-       0x6922, 0xd1c4, 0x05b0, 0xc1c4, 0x6922, 0xa6b4, 0x00ff, 0x0530,
-       0xa682, 0x0018, 0x0218, 0x0110, 0x2031, 0x0018, 0xa686, 0x0010,
-       0x1108, 0x8630, 0x852b, 0x852b, 0x2041, 0x0000, 0x080c, 0x3ac9,
-       0x0118, 0x080c, 0x38f7, 0x00a0, 0x080c, 0x3a95, 0x080c, 0x38f4,
-       0x6920, 0xc1c5, 0x6922, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1118,
-       0x781b, 0x006e, 0x0005, 0x781b, 0x0082, 0x0005, 0x080c, 0x38f4,
+       0x0010, 0x2001, 0x0001, 0x0002, 0x3c0b, 0x3c0b, 0x345c, 0x3c0b,
+       0x3c4f, 0x3c4f, 0x3c0b, 0x3c0b, 0xd6bc, 0x0570, 0x7180, 0x81ff,
+       0x0558, 0xa182, 0x000d, 0x1318, 0x7083, 0x0000, 0x0028, 0xa182,
+       0x000c, 0x7082, 0x2009, 0x000c, 0x789b, 0x0061, 0x79aa, 0x0156,
+       0x0136, 0x0146, 0x7084, 0x8114, 0xa210, 0x7286, 0xa080, 0x000b,
+       0xad00, 0x2098, 0xb284, 0x0600, 0x0118, 0x20a1, 0x022b, 0x0010,
+       0x20a1, 0x012b, 0x789b, 0x0000, 0x8108, 0x81ac, 0x53a6, 0x014e,
+       0x013e, 0x015e, 0x0804, 0x3c11, 0xd6d4, 0x1904, 0x34cf, 0x6820,
+       0xd084, 0x0904, 0x3c11, 0xa68c, 0x0060, 0xa684, 0x0060, 0x0120,
+       0xa086, 0x0060, 0x1108, 0xc1f5, 0xc194, 0x795a, 0x69b6, 0x789b,
+       0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6818, 0xc0fd, 0x681a,
+       0x78aa, 0x8008, 0x810c, 0x0904, 0x37f6, 0xa18c, 0x00f8, 0x1904,
+       0x37f6, 0x0156, 0x0136, 0x0146, 0x0016, 0x20a1, 0x012b, 0x3208,
+       0xa18c, 0x0600, 0x0110, 0x20a1, 0x022b, 0x001e, 0x789b, 0x0000,
+       0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x014e, 0x013e,
+       0x015e, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x0804, 0x3c11, 0x6818,
+       0xd0fc, 0x0110, 0x681b, 0x0008, 0x080c, 0x3a61, 0x781b, 0x00ed,
+       0x0005, 0x2300, 0x0002, 0x34e0, 0x359d, 0x34de, 0x080c, 0x2575,
+       0x7cd8, 0x7ddc, 0x7fd0, 0x82ff, 0x1528, 0x7200, 0xa286, 0x0003,
+       0x0904, 0x2f09, 0x71d0, 0xd1bc, 0x11f8, 0xd1b4, 0x01e8, 0x2001,
+       0x4701, 0x2004, 0xd0c4, 0x11c0, 0x00d6, 0x783b, 0x8800, 0x781b,
+       0x0059, 0x70b8, 0xa06d, 0x68b4, 0xc0a5, 0x785a, 0x6894, 0x78d6,
+       0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030,
+       0x00de, 0x0030, 0x7200, 0x0020, 0x783b, 0x1800, 0x781b, 0x0057,
+       0xa284, 0x000f, 0x0002, 0x3588, 0x3545, 0x351d, 0x2f38, 0x351b,
+       0x3588, 0x351b, 0x351b, 0x080c, 0x2575, 0x681c, 0xd0ec, 0x0118,
+       0x6008, 0xc08d, 0x600a, 0x6920, 0xc185, 0x6922, 0x6800, 0x6006,
+       0xa005, 0x1108, 0x6002, 0x6008, 0xc0d4, 0x600a, 0x681c, 0xa084,
+       0x000e, 0x1120, 0x71c8, 0xa188, 0x0100, 0x0028, 0x7030, 0x68ba,
+       0x713c, 0x70c8, 0xa108, 0x2104, 0x6802, 0x2d0a, 0x715a, 0xd6dc,
+       0x1120, 0xc6fc, 0x6eb6, 0x0804, 0x3588, 0x6eb6, 0xa684, 0x0060,
+       0x1120, 0xa684, 0x7fff, 0x68b6, 0x04d8, 0xd6dc, 0x1150, 0xa684,
+       0x7fff, 0x68b6, 0x6894, 0x68a6, 0x6898, 0x68aa, 0x080c, 0x3f4e,
+       0x0478, 0xd6ac, 0x0140, 0xa006, 0x080c, 0x3f4e, 0x2408, 0x2510,
+       0x69aa, 0x6aa6, 0x0068, 0x2408, 0x2510, 0x2700, 0x8007, 0xa084,
+       0x007f, 0xa108, 0xa291, 0x0000, 0x69aa, 0x6aa6, 0x080c, 0x3f4e,
+       0xd6fc, 0x01b0, 0xa684, 0x7fff, 0x68b6, 0x2510, 0x2408, 0xd6ac,
+       0x1138, 0x2700, 0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000,
+       0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae,
+       0x7000, 0xa086, 0x0030, 0x1904, 0x25c9, 0x7003, 0x0002, 0x70b8,
+       0xa06d, 0x68bc, 0x703e, 0x70b4, 0xa065, 0x68c0, 0x7056, 0x2d00,
+       0x704a, 0xad80, 0x0009, 0x7042, 0x0005, 0xa586, 0x8800, 0x1148,
+       0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084, 0xfbef,
+       0x600a, 0x0804, 0x3a5b, 0x7043, 0x0000, 0xa282, 0x0006, 0x0310,
+       0x080c, 0x2575, 0x2300, 0x0002, 0x35b7, 0x35c8, 0x35d2, 0x2200,
+       0x0002, 0x35bf, 0x3a5b, 0x35c1, 0x35bf, 0x3603, 0x3651, 0x080c,
+       0x2575, 0x7a80, 0xa294, 0x0f00, 0x080c, 0x36a5, 0x0804, 0x3a30,
+       0x00c1, 0x0002, 0x3a5b, 0x35d0, 0x35d0, 0x3603, 0x35d0, 0x3a5b,
+       0x080c, 0x2575, 0x0071, 0x0002, 0x35dc, 0x35da, 0x35da, 0x35dc,
+       0x35da, 0x35dc, 0x080c, 0x2575, 0x080c, 0x3a70, 0x781b, 0x0082,
+       0x0005, 0x7000, 0xa086, 0x0002, 0x1150, 0x080c, 0x37e1, 0x0010,
+       0x080c, 0x3f4e, 0x6008, 0xa084, 0xfbef, 0x600a, 0x0020, 0x7000,
+       0xa086, 0x0003, 0x0da8, 0x7003, 0x0005, 0x2001, 0x8ee0, 0xae8e,
+       0x4740, 0x0110, 0x2001, 0x8f12, 0x2068, 0x704a, 0xad80, 0x0009,
+       0x7042, 0x2200, 0x0005, 0x7000, 0xa086, 0x0002, 0x1158, 0x70d0,
+       0xc0b5, 0x70d2, 0x2c00, 0x70b6, 0x2d00, 0x70ba, 0x0038, 0x080c,
+       0x3f4e, 0x0020, 0x7000, 0xa086, 0x0003, 0x0dc8, 0x7003, 0x0001,
+       0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f,
+       0xa215, 0x2069, 0x8dc0, 0xb284, 0x0600, 0x1118, 0xc2fd, 0x2069,
+       0x8ed0, 0x2d04, 0x2d08, 0x715a, 0xa06d, 0x0128, 0x6814, 0xa206,
+       0x0120, 0x6800, 0x0cb8, 0x080c, 0x36a5, 0x6eb4, 0x7e5a, 0x6920,
+       0xa184, 0x0c00, 0x0904, 0x36cb, 0x7060, 0xa086, 0x0006, 0x1128,
+       0x7070, 0xa206, 0x1110, 0x7062, 0x707a, 0x681b, 0x0005, 0xc1ad,
+       0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922, 0x080c, 0x3a67, 0x0804,
+       0x36cb, 0x7200, 0xa286, 0x0002, 0x1158, 0x70d0, 0xc0b5, 0x70d2,
+       0x2c00, 0x70b6, 0x2d00, 0x70ba, 0x0030, 0x080c, 0x3f4e, 0x0018,
+       0xa286, 0x0003, 0x0dd0, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00,
+       0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0xae86, 0x4740,
+       0x0108, 0xc2fd, 0x79a8, 0x79a8, 0xa18c, 0x00ff, 0x2118, 0x70c8,
+       0xa168, 0x2d04, 0x2d08, 0x715a, 0xa06d, 0x0128, 0x6814, 0xa206,
+       0x0118, 0x6800, 0x0cb8, 0x0409, 0x6eb4, 0x6920, 0xa184, 0x0c00,
+       0x0904, 0x36cb, 0xd0dc, 0x0178, 0x7060, 0xa086, 0x0004, 0x1140,
+       0x7070, 0xa206, 0x1128, 0x7074, 0xa306, 0x1110, 0x7062, 0x707a,
+       0x080c, 0x3a6d, 0x0480, 0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922,
+       0x080c, 0x3a67, 0x707b, 0x0000, 0x0430, 0x7003, 0x0005, 0xb284,
+       0x0600, 0x0118, 0x2001, 0x8ee0, 0x0010, 0x2001, 0x8f12, 0x2068,
+       0x704a, 0x0156, 0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x1f04,
+       0x36b4, 0x015e, 0xb284, 0x0600, 0x0110, 0xc2fc, 0x0008, 0xc2fd,
+       0x6a16, 0xad80, 0x0009, 0x7042, 0x68b7, 0x0700, 0x6823, 0x0800,
+       0x6827, 0x0003, 0x0005, 0xc6ec, 0xa6ac, 0x0060, 0x0904, 0x3712,
+       0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x11e0, 0x7bd2, 0x7bda,
+       0x7cd6, 0x7cde, 0xa586, 0x0060, 0x05c8, 0xd6f4, 0x1108, 0xc6ed,
+       0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0083, 0xd69c, 0x0128, 0x2009,
+       0x0082, 0x2019, 0x0000, 0x2320, 0x791a, 0xd6ec, 0x0588, 0x080c,
+       0x4208, 0x0470, 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305,
+       0x01f8, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0, 0xd6f4, 0x1108,
+       0xc6ed, 0xc6f4, 0x7e5a, 0x2011, 0x0083, 0xd69c, 0x0128, 0x2011,
+       0x0082, 0x2019, 0x0000, 0x2320, 0x7a1a, 0xd6ec, 0x0188, 0x080c,
+       0x4235, 0x0070, 0x2019, 0x0000, 0x2320, 0x0010, 0xa6b4, 0xb7ff,
+       0x7e5a, 0x2009, 0x0083, 0xd69c, 0x0110, 0x2009, 0x0082, 0x791a,
+       0x68c0, 0x7056, 0x2d00, 0x704a, 0x68c4, 0x2060, 0x71d0, 0x2001,
+       0x4701, 0x2004, 0xd0c4, 0x15c8, 0x70d4, 0xa02d, 0x01b8, 0xd1bc,
+       0x0548, 0x7a80, 0xa294, 0x0f00, 0x70d8, 0xa206, 0x0118, 0x78e0,
+       0xa504, 0x1558, 0x70d6, 0xc1bc, 0x71d2, 0x0438, 0x2031, 0x0001,
+       0x852c, 0x0218, 0x8633, 0x8210, 0x0cd8, 0x0005, 0x7de0, 0xa594,
+       0xff00, 0x0130, 0x2011, 0x0008, 0x852f, 0x0c81, 0x8637, 0x0008,
+       0x0c69, 0x8217, 0x7880, 0xa084, 0x0f00, 0xa206, 0x0170, 0x72da,
+       0x76d6, 0x0058, 0x7a80, 0xa294, 0x0f00, 0x70d8, 0xa236, 0x0dc0,
+       0x78e0, 0xa534, 0x0da8, 0xc1bd, 0x71d2, 0xd1b4, 0x1904, 0x25c6,
+       0x2300, 0xa405, 0x0904, 0x25c6, 0x70a0, 0xa086, 0x0001, 0x1904,
+       0x260d, 0x0005, 0x6020, 0xa005, 0x0150, 0x8001, 0x6022, 0x6008,
+       0xa085, 0x0008, 0x600a, 0x700f, 0x0100, 0x702c, 0x6026, 0x0005,
+       0xa006, 0x080c, 0x3f4e, 0x7000, 0xa086, 0x0002, 0x0120, 0x7060,
+       0xa086, 0x0005, 0x1150, 0x682b, 0x0000, 0x6817, 0x0000, 0x681b,
+       0x0001, 0x6823, 0x0040, 0x681f, 0x0100, 0x7000, 0xa084, 0x000f,
+       0x0002, 0x25c9, 0x37a6, 0x37a3, 0x37c3, 0x37af, 0x25c9, 0x37a1,
+       0x37a1, 0x080c, 0x2575, 0x0449, 0x0411, 0x0028, 0x0431, 0x7058,
+       0x2060, 0x6800, 0x6002, 0x080c, 0x1dbf, 0x0804, 0x25c9, 0x7060,
+       0x7063, 0x0000, 0x707f, 0x0000, 0x0002, 0x37bf, 0x37bf, 0x37bd,
+       0x37bd, 0x37bd, 0x37bf, 0x37bd, 0x37bf, 0x0804, 0x2a9a, 0x7063,
+       0x0000, 0x0804, 0x25c9, 0x681b, 0x0000, 0x0804, 0x31a7, 0x6800,
+       0xa005, 0x1108, 0x6002, 0x6006, 0x0005, 0x6410, 0x84ff, 0x0168,
+       0x2009, 0x4702, 0x2104, 0x8001, 0x200a, 0x8421, 0x6412, 0x1128,
+       0x2021, 0x4704, 0x2404, 0xc0a5, 0x2022, 0x6008, 0xc0a4, 0x600a,
+       0x0005, 0x6018, 0xa005, 0x0110, 0x8001, 0x601a, 0x0005, 0x080c,
+       0x3c6e, 0x681b, 0x0018, 0x0490, 0x080c, 0x3c6e, 0x681b, 0x0019,
+       0x0468, 0x080c, 0x3c6e, 0x681b, 0x001a, 0x0440, 0x080c, 0x3c6e,
+       0x681b, 0x0003, 0x0418, 0x7770, 0x080c, 0x3b95, 0x7174, 0xa18c,
+       0x00ff, 0x3210, 0xa294, 0x0600, 0x0118, 0xa1e8, 0x8cc0, 0x0010,
+       0xa1e8, 0x8dd0, 0x2d04, 0x2d08, 0x2068, 0xa005, 0x1118, 0x707a,
+       0x0804, 0x25c9, 0x6814, 0x7270, 0xa206, 0x0110, 0x6800, 0x0c98,
+       0x6800, 0x200a, 0x681b, 0x0005, 0x707b, 0x0000, 0x080c, 0x37cd,
+       0x6820, 0xd084, 0x1110, 0x080c, 0x37c7, 0x080c, 0x37e1, 0x681f,
+       0x0000, 0x6823, 0x0020, 0x080c, 0x1dbf, 0x0804, 0x25c9, 0xa282,
+       0x0003, 0x1904, 0x3a35, 0x7da8, 0xa5ac, 0x00ff, 0x7ea8, 0xa6b4,
+       0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1c4, 0x05b0, 0xc1c4, 0x6922,
+       0xa6b4, 0x00ff, 0x0530, 0xa682, 0x0018, 0x0218, 0x0110, 0x2031,
+       0x0018, 0xa686, 0x0010, 0x1108, 0x8630, 0x852b, 0x852b, 0x2041,
+       0x0000, 0x080c, 0x3aee, 0x0118, 0x080c, 0x391a, 0x00a0, 0x080c,
+       0x3aba, 0x080c, 0x3917, 0x6920, 0xc1c5, 0x6922, 0x7e58, 0xc695,
+       0x7e5a, 0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, 0x781b, 0x0082,
+       0x0005, 0x080c, 0x3917, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x0071,
+       0x0005, 0x781b, 0x0083, 0x0005, 0x00c6, 0x7054, 0x2060, 0x6100,
+       0xd1e4, 0x0598, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x0018,
+       0x0218, 0x0110, 0x2011, 0x0018, 0x2600, 0xa202, 0x1208, 0x2230,
+       0xa686, 0x0010, 0x1108, 0x8630, 0x6208, 0xa294, 0x00ff, 0x78ec,
+       0xd0e4, 0x0130, 0xa282, 0x000a, 0x1240, 0x2011, 0x000a, 0x0028,
+       0xa282, 0x000c, 0x1210, 0x2011, 0x000c, 0x2200, 0xa502, 0x1208,
+       0x2228, 0x080c, 0x3abe, 0x852b, 0x852b, 0x2041, 0x0000, 0x080c,
+       0x3aee, 0x0118, 0x080c, 0x391a, 0x0020, 0x080c, 0x3aba, 0x080c,
+       0x3917, 0x7858, 0xc095, 0x785a, 0x00ce, 0x781b, 0x0082, 0x0005,
+       0x00c6, 0x2960, 0x6000, 0xd0e4, 0x1188, 0xd0b4, 0x1150, 0x6010,
+       0xa084, 0x000f, 0x1130, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x00ce,
+       0x0005, 0x2011, 0x0032, 0x2019, 0x0000, 0x00f0, 0x68a0, 0xd0cc,
+       0x1dc0, 0x6208, 0xa294, 0x00ff, 0x78ec, 0xd0e4, 0x0130, 0xa282,
+       0x000b, 0x1218, 0x2011, 0x000a, 0x0028, 0xa282, 0x000c, 0x1210,
+       0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x0018,
+       0x0218, 0x0110, 0x2019, 0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003,
+       0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5,
+       0x6822, 0x080c, 0x3a7a, 0x00ce, 0x0005, 0x00c6, 0x2960, 0x6104,
+       0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032, 0x2019, 0x0000, 0x0000,
+       0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa,
+       0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822, 0x00ce, 0x0005, 0xa006,
+       0x2030, 0x2010, 0x00c6, 0x7154, 0x2160, 0x2018, 0x2008, 0xa084,
+       0xffe0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4,
+       0xa084, 0x7770, 0xa18c, 0x000f, 0xa105, 0x2029, 0x4705, 0x252c,
+       0xd5cc, 0x0140, 0xd3a4, 0x0110, 0xa085, 0x0800, 0xd3fc, 0x0110,
+       0xa085, 0x8080, 0x78a6, 0x6016, 0x788a, 0xa6b4, 0x001f, 0x8637,
+       0x8204, 0x8004, 0xa605, 0x600e, 0x6004, 0xa084, 0xffd5, 0x6006,
+       0x00ce, 0x0005, 0xa282, 0x0002, 0x1904, 0x3a3f, 0x7aa8, 0x6920,
+       0xc1bd, 0x6922, 0xd1cc, 0x0568, 0xc1cc, 0x6922, 0xa294, 0x00ff,
+       0xa282, 0x0002, 0x1a04, 0x3a30, 0x080c, 0x39c1, 0x080c, 0x3917,
+       0xa980, 0x0001, 0x200c, 0x080c, 0x3b91, 0x080c, 0x38b8, 0x88ff,
+       0x0178, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a,
+       0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, 0x781b, 0x0082, 0x0005,
        0x7e58, 0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b, 0x0083,
-       0x0005, 0x00c6, 0x7054, 0x2060, 0x6100, 0xd1e4, 0x0598, 0x6208,
-       0x8217, 0xa294, 0x00ff, 0xa282, 0x0018, 0x0218, 0x0110, 0x2011,
-       0x0018, 0x2600, 0xa202, 0x1208, 0x2230, 0xa686, 0x0010, 0x1108,
-       0x8630, 0x6208, 0xa294, 0x00ff, 0x78ec, 0xd0e4, 0x0130, 0xa282,
-       0x000a, 0x1240, 0x2011, 0x000a, 0x0028, 0xa282, 0x000c, 0x1210,
-       0x2011, 0x000c, 0x2200, 0xa502, 0x1208, 0x2228, 0x080c, 0x3a99,
-       0x852b, 0x852b, 0x2041, 0x0000, 0x080c, 0x3ac9, 0x0118, 0x080c,
-       0x38f7, 0x0020, 0x080c, 0x3a95, 0x080c, 0x38f4, 0x7858, 0xc095,
-       0x785a, 0x00ce, 0x781b, 0x0082, 0x0005, 0x00c6, 0x2960, 0x6000,
-       0xd0e4, 0x1188, 0xd0b4, 0x1150, 0x6010, 0xa084, 0x000f, 0x1130,
-       0x6104, 0xa18c, 0xfff5, 0x6106, 0x00ce, 0x0005, 0x2011, 0x0032,
-       0x2019, 0x0000, 0x00f0, 0x68a0, 0xd0cc, 0x1dc0, 0x6208, 0xa294,
-       0x00ff, 0x78ec, 0xd0e4, 0x0130, 0xa282, 0x000b, 0x1218, 0x2011,
-       0x000a, 0x0028, 0xa282, 0x000c, 0x1210, 0x2011, 0x000c, 0x6308,
-       0x831f, 0xa39c, 0x00ff, 0xa382, 0x0018, 0x0218, 0x0110, 0x2019,
-       0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa,
-       0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822, 0x080c, 0x3a55,
-       0x00ce, 0x0005, 0x00c6, 0x2960, 0x6104, 0xa18c, 0xfff5, 0x6106,
-       0x2011, 0x0032, 0x2019, 0x0000, 0x0000, 0x78ab, 0x0001, 0x78ab,
-       0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820,
-       0xc0c5, 0x6822, 0x00ce, 0x0005, 0xa006, 0x2030, 0x2010, 0x00c6,
-       0x7154, 0x2160, 0x2018, 0x2008, 0xa084, 0xffe0, 0xa635, 0x7e86,
-       0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4, 0xa084, 0x7770, 0xa18c,
-       0x000f, 0xa105, 0x2029, 0x4605, 0x252c, 0xd5cc, 0x0140, 0xd3a4,
-       0x0110, 0xa085, 0x0800, 0xd3fc, 0x0110, 0xa085, 0x8080, 0x78a6,
-       0x6016, 0x788a, 0xa6b4, 0x001f, 0x8637, 0x8204, 0x8004, 0xa605,
-       0x600e, 0x6004, 0xa084, 0xffd5, 0x6006, 0x00ce, 0x0005, 0xa282,
-       0x0002, 0x1904, 0x3a1a, 0x7aa8, 0x6920, 0xc1bd, 0x6922, 0xd1cc,
-       0x0568, 0xc1cc, 0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x1a04,
-       0x3a0b, 0x080c, 0x399e, 0x080c, 0x38f4, 0xa980, 0x0001, 0x200c,
-       0x080c, 0x3b6b, 0x080c, 0x3895, 0x88ff, 0x0178, 0x789b, 0x0060,
-       0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b,
-       0x006e, 0x0005, 0x781b, 0x0082, 0x0005, 0x7e58, 0xd6d4, 0x1118,
-       0x781b, 0x0071, 0x0005, 0x781b, 0x0083, 0x0005, 0xa282, 0x0002,
-       0x1218, 0xa284, 0x0001, 0x0140, 0x7154, 0xa188, 0x0000, 0x210c,
-       0xd1ec, 0x1110, 0x2011, 0x0000, 0x080c, 0x3a87, 0x0479, 0x080c,
-       0x38f4, 0x7858, 0xc095, 0x785a, 0x781b, 0x0082, 0x0005, 0x00c6,
-       0x0026, 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec, 0x1158, 0xd0bc,
-       0x1138, 0x6014, 0xd0b4, 0x1120, 0xc1a4, 0x6106, 0xa006, 0x0088,
-       0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003,
-       0x7aaa, 0xa8c0, 0x0004, 0x080c, 0x3a55, 0x6820, 0xa085, 0x0200,
-       0x6822, 0x002e, 0x00ce, 0x0005, 0x8807, 0xa715, 0x00c6, 0x2009,
-       0x0000, 0x7054, 0x2060, 0x82ff, 0x0110, 0x2009, 0x0040, 0x6018,
-       0xa080, 0x0002, 0x789a, 0x78a4, 0xa084, 0xff9f, 0xa105, 0xc0ec,
-       0xd0b4, 0x1108, 0xc0ed, 0x6100, 0xd1f4, 0x0110, 0xa085, 0x0020,
-       0x78a6, 0x6016, 0x788a, 0x6004, 0xa084, 0xffef, 0x6006, 0x00ce,
-       0x0005, 0x0006, 0x7000, 0xa086, 0x0003, 0x0110, 0x000e, 0x0010,
-       0x000e, 0x0488, 0xd6ac, 0x0578, 0x7888, 0xa084, 0x0040, 0x0558,
-       0x7bb8, 0x8307, 0xa084, 0x007f, 0x1508, 0x8207, 0xa084, 0x00ff,
-       0xa09e, 0x0001, 0x1904, 0x3a32, 0xd6f4, 0x11d0, 0x79d8, 0x7adc,
-       0xa108, 0xa291, 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x080c,
-       0x42b5, 0x781b, 0x0080, 0xb284, 0x0600, 0x0118, 0x2001, 0x0000,
-       0x0010, 0x2001, 0x0001, 0x080c, 0x4172, 0x0005, 0x080c, 0x254c,
-       0x781b, 0x0080, 0x0005, 0x781b, 0x0083, 0x0005, 0x2039, 0x0000,
-       0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x38f7,
-       0x080c, 0x399c, 0x7e58, 0x080c, 0x3a4e, 0x781b, 0x0082, 0x0005,
-       0x0cd1, 0x6820, 0xc0c4, 0x6822, 0x00c6, 0x7054, 0x2060, 0x080c,
-       0x3921, 0x00b0, 0x0c81, 0x6820, 0xc0cc, 0x6822, 0x00c6, 0x7054,
-       0x2060, 0x080c, 0x39bb, 0x0060, 0x0c31, 0x6820, 0xa084, 0xecff,
-       0x6822, 0x00c6, 0x7054, 0x2060, 0x6004, 0xa084, 0xffc5, 0x6006,
-       0x00ce, 0x0005, 0x0049, 0x781b, 0x0082, 0x0005, 0x6827, 0x0002,
-       0x0049, 0x781b, 0x0082, 0x0005, 0x2001, 0x0005, 0x0088, 0x2001,
-       0x000c, 0x0070, 0x6820, 0xc0d5, 0x6822, 0x2001, 0x0006, 0x0040,
-       0x2001, 0x000d, 0x0028, 0x2001, 0x0009, 0x0010, 0x2001, 0x0007,
-       0x789b, 0x007e, 0x78aa, 0xc69d, 0x7e5a, 0x70d0, 0xd0b4, 0x0168,
-       0xc0b4, 0x70d2, 0x00c6, 0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef,
-       0x600a, 0x6018, 0x8001, 0x601a, 0x00ce, 0x0005, 0x0076, 0x873f,
-       0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0xa0e0, 0x4ac0, 0xae8e,
-       0x4640, 0x0110, 0xa0e0, 0x4b40, 0xa7b8, 0x0020, 0x7f9a, 0x79a4,
-       0xa184, 0x7fe0, 0x78ae, 0x6012, 0x79a4, 0xa184, 0x773f, 0x78a6,
-       0x6016, 0x6004, 0xa085, 0x0038, 0x6006, 0x007e, 0x0005, 0x789b,
-       0x0080, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa,
-       0x789b, 0x0060, 0x78ab, 0x0004, 0x0800, 0x2031, 0x0000, 0x2029,
-       0x0032, 0x789b, 0x0080, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
-       0x0001, 0x7daa, 0x7eaa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x0804,
-       0x3a55, 0x0156, 0x8007, 0xa084, 0x00ff, 0x8003, 0x8003, 0xa080,
-       0x0020, 0x789a, 0x79a4, 0xa18c, 0xffe0, 0x2021, 0x3b54, 0x2019,
-       0x0011, 0x20a9, 0x000e, 0x2011, 0x0032, 0x2404, 0xa084, 0xffe0,
-       0xa106, 0x0128, 0x8420, 0x2300, 0xa210, 0x1f04, 0x3abd, 0x015e,
-       0x0005, 0x0156, 0x04f8, 0x2021, 0x3b62, 0x20a9, 0x0009, 0x2011,
-       0x0029, 0xa582, 0x0028, 0x0550, 0x8420, 0x95a9, 0x2011, 0x0033,
-       0xa582, 0x0033, 0x0618, 0x8420, 0x95a9, 0x2019, 0x000a, 0x2011,
-       0x0065, 0x2200, 0xa502, 0x02d0, 0x8420, 0x2300, 0xa210, 0x1f04,
-       0x3ae1, 0x015e, 0x0088, 0x2021, 0x3b54, 0x2019, 0x0011, 0x20a9,
-       0x000e, 0x2011, 0x0033, 0x2200, 0xa502, 0x0240, 0x8420, 0x2300,
-       0xa210, 0x1f04, 0x3af3, 0x015e, 0xa006, 0x0005, 0x8211, 0x015e,
-       0xa582, 0x0064, 0x1220, 0x7808, 0xa085, 0x0070, 0x780a, 0x2404,
-       0xa005, 0x0005, 0xa886, 0x0002, 0x01e8, 0x2021, 0x3b40, 0x20a9,
-       0x000d, 0x2011, 0x0028, 0xa582, 0x0028, 0x0d48, 0x8420, 0x2019,
-       0x0019, 0x2011, 0x0033, 0x2200, 0xa502, 0x0e00, 0x8420, 0x2300,
-       0xa210, 0x1f04, 0x3b1b, 0x015e, 0x2011, 0x0184, 0xa582, 0x0185,
-       0x0ab0, 0x0890, 0x2021, 0x3b4f, 0x20a9, 0x0003, 0x2011, 0x0024,
-       0xa586, 0x0024, 0x0960, 0x8420, 0x2011, 0x0028, 0xa586, 0x0028,
-       0x0930, 0x8420, 0x2019, 0x0019, 0x2011, 0x0033, 0x0804, 0x3af3,
-       0x1021, 0x2202, 0x3403, 0x4604, 0x5805, 0x6a06, 0x7c07, 0x4610,
-       0x4612, 0x5812, 0x5a12, 0x6a14, 0x6c14, 0x6e14, 0x7e17, 0x9021,
-       0xb002, 0xe204, 0xe210, 0xe210, 0x1209, 0x3002, 0x3202, 0x4203,
-       0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07,
-       0x0c07, 0x0e07, 0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06, 0x6c06,
-       0x7c07, 0x7e07, 0x0e00, 0x789b, 0x0080, 0xa046, 0x0005, 0xa784,
-       0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003,
-       0xa105, 0xd7fc, 0x0118, 0xa0e0, 0x6bc0, 0x0010, 0xa0e0, 0x4bc0,
-       0x0005, 0x00e6, 0x00f6, 0xd084, 0x0138, 0x2079, 0x0100, 0x2009,
-       0x4680, 0x2071, 0x4680, 0x0030, 0x2009, 0x4640, 0x2079, 0x0200,
-       0x2071, 0x4640, 0x2091, 0x8000, 0x2104, 0xa084, 0x000f, 0x0002,
-       0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba0, 0x3ba0,
-       0x080c, 0x254c, 0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005,
-       0x0580, 0x7858, 0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828,
-       0xa086, 0x1814, 0x1530, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004,
-       0x1de0, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x1de0, 0x7830,
-       0xd0bc, 0x11b8, 0xb284, 0x0800, 0x0118, 0x0104, 0x3bd9, 0x0010,
-       0x0304, 0x3bd9, 0x79e4, 0xa184, 0x0030, 0x0158, 0x78ec, 0xa084,
-       0x0003, 0x0138, 0x681c, 0xd0ac, 0x1110, 0x00d9, 0x0010, 0x781b,
-       0x00fb, 0x00fe, 0x00ee, 0x0005, 0x2001, 0x4601, 0x2004, 0xd0ac,
-       0x1118, 0x6814, 0x080c, 0x2475, 0x0005, 0x781b, 0x0083, 0x0005,
-       0x781b, 0x0082, 0x0005, 0x781b, 0x0071, 0x0005, 0x781b, 0x006e,
-       0x0005, 0x2009, 0x4619, 0x210c, 0xa186, 0x0000, 0x0150, 0xa186,
-       0x0001, 0x0150, 0x701f, 0x000b, 0x7063, 0x0001, 0x781b, 0x0054,
-       0x0005, 0x781b, 0x00f3, 0x0005, 0x701f, 0x000a, 0x0005, 0x2009,
-       0x4619, 0x210c, 0xa186, 0x0000, 0x0168, 0xa186, 0x0001, 0x0138,
-       0x701f, 0x000b, 0x7063, 0x0001, 0x781b, 0x0054, 0x0005, 0x701f,
-       0x000a, 0x0005, 0x781b, 0x00f2, 0x0005, 0x781b, 0x00fb, 0x0005,
-       0x781b, 0x00fa, 0x0005, 0x781b, 0x00cc, 0x0005, 0x781b, 0x00cb,
-       0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x7063, 0x0001,
+       0x0005, 0xa282, 0x0002, 0x1218, 0xa284, 0x0001, 0x0140, 0x7154,
+       0xa188, 0x0000, 0x210c, 0xd1ec, 0x1110, 0x2011, 0x0000, 0x080c,
+       0x3aac, 0x0479, 0x080c, 0x3917, 0x7858, 0xc095, 0x785a, 0x781b,
+       0x0082, 0x0005, 0x00c6, 0x0026, 0x2960, 0x6000, 0x2011, 0x0001,
+       0xd0ec, 0x1158, 0xd0bc, 0x1138, 0x6014, 0xd0b4, 0x1120, 0xc1a4,
+       0x6106, 0xa006, 0x0088, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab,
+       0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x080c, 0x3a7a,
+       0x6820, 0xa085, 0x0200, 0x6822, 0x002e, 0x00ce, 0x0005, 0x8807,
+       0xa715, 0x00c6, 0x2009, 0x0000, 0x7054, 0x2060, 0x82ff, 0x0110,
+       0x2009, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, 0x78a4, 0xa084,
+       0xff9f, 0xa105, 0xc0ec, 0xd0b4, 0x1108, 0xc0ed, 0x6100, 0xd1f4,
+       0x0110, 0xa085, 0x0020, 0x78a6, 0x6016, 0x788a, 0x6004, 0xa084,
+       0xffef, 0x6006, 0x00ce, 0x0005, 0x0006, 0x7000, 0xa086, 0x0003,
+       0x0110, 0x000e, 0x0010, 0x000e, 0x0498, 0xd6ac, 0x0588, 0x7888,
+       0xa084, 0x0040, 0x0568, 0x7bb8, 0x8307, 0xa084, 0x007f, 0x1518,
+       0x8207, 0xa084, 0x00ff, 0x0904, 0x3a57, 0xa09a, 0x0004, 0x1a04,
+       0x3a57, 0xd6f4, 0x11d0, 0x79d8, 0x7adc, 0xa108, 0xa291, 0x0000,
+       0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x080c, 0x42e8, 0x781b, 0x0080,
+       0xb284, 0x0600, 0x0118, 0x2001, 0x0000, 0x0010, 0x2001, 0x0001,
+       0x080c, 0x419a, 0x0005, 0x080c, 0x2575, 0x781b, 0x0080, 0x0005,
+       0x781b, 0x0083, 0x0005, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031,
+       0x0000, 0xa006, 0x2010, 0x080c, 0x391a, 0x080c, 0x39bf, 0x7e58,
+       0x080c, 0x3a73, 0x781b, 0x0082, 0x0005, 0x0cd1, 0x6820, 0xc0c4,
+       0x6822, 0x00c6, 0x7054, 0x2060, 0x080c, 0x3944, 0x00b0, 0x0c81,
+       0x6820, 0xc0cc, 0x6822, 0x00c6, 0x7054, 0x2060, 0x080c, 0x39de,
+       0x0060, 0x0c31, 0x6820, 0xa084, 0xecff, 0x6822, 0x00c6, 0x7054,
+       0x2060, 0x6004, 0xa084, 0xffc5, 0x6006, 0x00ce, 0x0005, 0x0049,
+       0x781b, 0x0082, 0x0005, 0x6827, 0x0002, 0x0049, 0x781b, 0x0082,
+       0x0005, 0x2001, 0x0005, 0x0088, 0x2001, 0x000c, 0x0070, 0x6820,
+       0xc0d5, 0x6822, 0x2001, 0x0006, 0x0040, 0x2001, 0x000d, 0x0028,
+       0x2001, 0x0009, 0x0010, 0x2001, 0x0007, 0x789b, 0x007e, 0x78aa,
+       0xc69d, 0x7e5a, 0x70d0, 0xd0b4, 0x0168, 0xc0b4, 0x70d2, 0x00c6,
+       0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
+       0x601a, 0x00ce, 0x0005, 0x0076, 0x873f, 0xa7bc, 0x000f, 0x873b,
+       0x873b, 0x8703, 0xa0e0, 0x4bc0, 0xae8e, 0x4740, 0x0110, 0xa0e0,
+       0x4c40, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x7fe0, 0x78ae,
+       0x6012, 0x79a4, 0xa184, 0x773f, 0x78a6, 0x6016, 0x6004, 0xa085,
+       0x0038, 0x6006, 0x007e, 0x0005, 0x789b, 0x0080, 0x78ab, 0x0001,
+       0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab,
+       0x0004, 0x0800, 0x2031, 0x0000, 0x2029, 0x0032, 0x789b, 0x0080,
+       0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7eaa,
+       0x789b, 0x0060, 0x78ab, 0x0005, 0x0804, 0x3a7a, 0x0156, 0x8007,
+       0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4,
+       0xa18c, 0xffe0, 0x2021, 0x3b7a, 0x2019, 0x0011, 0x20a9, 0x000e,
+       0x2011, 0x0032, 0x2404, 0xa084, 0xffe0, 0xa106, 0x0128, 0x8420,
+       0x2300, 0xa210, 0x1f04, 0x3ae2, 0x015e, 0x0005, 0x0156, 0x0804,
+       0x3b30, 0x2021, 0x3b88, 0x20a9, 0x0009, 0x2011, 0x0029, 0xa582,
+       0x0028, 0x0550, 0x8420, 0x95a9, 0x2011, 0x0033, 0xa582, 0x0033,
+       0x0618, 0x8420, 0x95a9, 0x2019, 0x000a, 0x2011, 0x0065, 0x2200,
+       0xa502, 0x02d0, 0x8420, 0x2300, 0xa210, 0x1f04, 0x3b07, 0x015e,
+       0x0088, 0x2021, 0x3b7a, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011,
+       0x0033, 0x2200, 0xa502, 0x0240, 0x8420, 0x2300, 0xa210, 0x1f04,
+       0x3b19, 0x015e, 0xa006, 0x0005, 0x8211, 0x015e, 0xa582, 0x0064,
+       0x1220, 0x7808, 0xa085, 0x0070, 0x780a, 0x2404, 0xa005, 0x0005,
+       0xa886, 0x0002, 0x01e8, 0x2021, 0x3b66, 0x20a9, 0x000d, 0x2011,
+       0x0028, 0xa582, 0x0028, 0x0d48, 0x8420, 0x2019, 0x0019, 0x2011,
+       0x0033, 0x2200, 0xa502, 0x0e00, 0x8420, 0x2300, 0xa210, 0x1f04,
+       0x3b41, 0x015e, 0x2011, 0x0184, 0xa582, 0x0185, 0x0ab0, 0x0890,
+       0x2021, 0x3b75, 0x20a9, 0x0003, 0x2011, 0x0024, 0xa586, 0x0024,
+       0x0960, 0x8420, 0x2011, 0x0028, 0xa586, 0x0028, 0x0930, 0x8420,
+       0x2019, 0x0019, 0x2011, 0x0033, 0x0804, 0x3b19, 0x1021, 0x2202,
+       0x3403, 0x4604, 0x5805, 0x6a06, 0x7c07, 0x4610, 0x4612, 0x5812,
+       0x5a12, 0x6a14, 0x6c14, 0x6e14, 0x7e17, 0x9021, 0xb002, 0xe204,
+       0xe210, 0xe210, 0x1209, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404,
+       0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07, 0x0e07,
+       0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06, 0x6c06, 0x7c07, 0x7e07,
+       0x0e00, 0x789b, 0x0080, 0xa046, 0x0005, 0xa784, 0x0f00, 0x800b,
+       0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xd7fc,
+       0x0118, 0xa0e0, 0x6cc0, 0x0010, 0xa0e0, 0x4cc0, 0x0005, 0x00e6,
+       0x00f6, 0xd084, 0x0138, 0x2079, 0x0100, 0x2009, 0x4780, 0x2071,
+       0x4780, 0x0030, 0x2009, 0x4740, 0x2079, 0x0200, 0x2071, 0x4740,
+       0x2091, 0x8000, 0x2104, 0xa084, 0x000f, 0x0002, 0x3bc8, 0x3bc8,
+       0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc6, 0x3bc6, 0x080c, 0x2575,
+       0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005, 0x0580, 0x7858,
+       0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828, 0xa086, 0x1814,
+       0x1530, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004, 0x1de0, 0x784b,
+       0x0008, 0x7848, 0xa084, 0x0008, 0x1de0, 0x7830, 0xd0bc, 0x11b8,
+       0xb284, 0x0800, 0x0118, 0x0104, 0x3bff, 0x0010, 0x0304, 0x3bff,
+       0x79e4, 0xa184, 0x0030, 0x0158, 0x78ec, 0xa084, 0x0003, 0x0138,
+       0x681c, 0xd0ac, 0x1110, 0x00d9, 0x0010, 0x781b, 0x00fb, 0x00fe,
+       0x00ee, 0x0005, 0x2001, 0x4701, 0x2004, 0xd0ac, 0x1118, 0x6814,
+       0x080c, 0x249e, 0x0005, 0x781b, 0x0083, 0x0005, 0x781b, 0x0082,
+       0x0005, 0x781b, 0x0071, 0x0005, 0x781b, 0x006e, 0x0005, 0x2009,
+       0x4719, 0x210c, 0xa186, 0x0000, 0x0150, 0xa186, 0x0001, 0x0150,
+       0x701f, 0x000b, 0x7063, 0x0001, 0x781b, 0x0054, 0x0005, 0x781b,
+       0x00f3, 0x0005, 0x701f, 0x000a, 0x0005, 0x2009, 0x4719, 0x210c,
+       0xa186, 0x0000, 0x0168, 0xa186, 0x0001, 0x0138, 0x701f, 0x000b,
+       0x7063, 0x0001, 0x781b, 0x0054, 0x0005, 0x701f, 0x000a, 0x0005,
+       0x781b, 0x00f2, 0x0005, 0x781b, 0x00fb, 0x0005, 0x781b, 0x00fa,
+       0x0005, 0x781b, 0x00cc, 0x0005, 0x781b, 0x00cb, 0x0005, 0x6818,
+       0xd0fc, 0x0110, 0x681b, 0x001d, 0x701f, 0x000b, 0x7063, 0x0001,
        0x781b, 0x0054, 0x0005, 0x7830, 0xa084, 0x00c0, 0x1170, 0x7808,
        0xc08c, 0x780a, 0xe000, 0xe000, 0xe000, 0xe000, 0x78ec, 0xa084,
        0x0021, 0x0118, 0x7808, 0xc08d, 0x780a, 0x0005, 0x7808, 0xc08d,
        0x780a, 0x0005, 0x7830, 0xa084, 0x0040, 0x1de0, 0xb284, 0x0800,
-       0x0118, 0x1104, 0x3c58, 0x0010, 0x1304, 0x3c58, 0x78ac, 0x0005,
+       0x0118, 0x1104, 0x3c80, 0x0010, 0x1304, 0x3c80, 0x78ac, 0x0005,
        0x7808, 0xa084, 0xfffd, 0x780a, 0xe000, 0xe000, 0xe000, 0xe000,
        0x78ec, 0xa084, 0x0021, 0x0140, 0xb284, 0x0800, 0x0118, 0x1104,
-       0x3c67, 0x0010, 0x1304, 0x3c6a, 0x78ac, 0x0006, 0x7808, 0xa085,
-       0x0002, 0x780a, 0x000e, 0x0005, 0xa784, 0x0001, 0x1904, 0x322a,
-       0xa784, 0x0070, 0x0140, 0x00c6, 0x2d60, 0x2f68, 0x080c, 0x2467,
+       0x3c8f, 0x0010, 0x1304, 0x3c92, 0x78ac, 0x0006, 0x7808, 0xa085,
+       0x0002, 0x780a, 0x000e, 0x0005, 0xa784, 0x0001, 0x1904, 0x324d,
+       0xa784, 0x0070, 0x0140, 0x00c6, 0x2d60, 0x2f68, 0x080c, 0x2490,
        0x2d78, 0x2c68, 0x00ce, 0xa784, 0x0008, 0x0148, 0x784b, 0x0008,
-       0x78ec, 0xa084, 0x0003, 0x0904, 0x322a, 0x0804, 0x3be5, 0xa784,
+       0x78ec, 0xa084, 0x0003, 0x0904, 0x324d, 0x0804, 0x3c0b, 0xa784,
        0x0004, 0x01c8, 0x78b8, 0xa084, 0x8000, 0x01a8, 0x784b, 0x0008,
-       0x78ec, 0xa084, 0x0003, 0x0904, 0x322a, 0x78e4, 0xa084, 0x0007,
+       0x78ec, 0xa084, 0x0003, 0x0904, 0x324d, 0x78e4, 0xa084, 0x0007,
        0xa086, 0x0001, 0x1140, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a,
        0x781b, 0x00fb, 0x0005, 0xa784, 0x0080, 0x0140, 0x7884, 0xd0fc,
-       0x0128, 0x080c, 0x3a32, 0x681b, 0x0022, 0x0005, 0x681b, 0x0003,
+       0x0128, 0x080c, 0x3a57, 0x681b, 0x0022, 0x0005, 0x681b, 0x0003,
        0x7858, 0xa084, 0x5f00, 0x681e, 0x682f, 0x0000, 0x6833, 0x0000,
-       0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0904, 0x2b89, 0xb284,
-       0x0800, 0x0110, 0x0104, 0x259d, 0x0304, 0x259d, 0x6b14, 0x8307,
+       0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0904, 0x2bac, 0xb284,
+       0x0800, 0x0110, 0x0104, 0x25c6, 0x0304, 0x25c6, 0x6b14, 0x8307,
        0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xd3fc, 0x0118, 0xa080,
-       0x4b40, 0x0010, 0xa080, 0x4ac0, 0x2060, 0x2048, 0x7056, 0x2a60,
-       0x0005, 0x00c6, 0x2960, 0x6000, 0xd0ac, 0x0904, 0x3d2f, 0x68a0,
-       0xd1ac, 0x1120, 0xa084, 0x0e00, 0x0904, 0x3d2d, 0x6108, 0x8117,
+       0x4c40, 0x0010, 0xa080, 0x4bc0, 0x2060, 0x2048, 0x7056, 0x2a60,
+       0x0005, 0x00c6, 0x2960, 0x6000, 0xd0ac, 0x0904, 0x3d57, 0x68a0,
+       0xd1ac, 0x1120, 0xa084, 0x0e00, 0x0904, 0x3d55, 0x6108, 0x8117,
        0xa18c, 0x00ff, 0x631c, 0x832f, 0xd0dc, 0x0110, 0xa39d, 0x0001,
        0xd0cc, 0x11c8, 0xa584, 0x00ff, 0x0138, 0x78ec, 0xd0e4, 0x0110,
        0x8213, 0x00b8, 0x2029, 0x0000, 0xa182, 0x000c, 0x1290, 0x78ec,
@@ -1493,23 +1498,23 @@ static unsigned short risc_code01[] = {
        0x2009, 0x000a, 0x0030, 0x2009, 0x0032, 0x2011, 0x0000, 0x2029,
        0x0000, 0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab, 0x0004, 0x79aa,
        0x78ab, 0x0000, 0x7aaa, 0x7baa, 0x7daa, 0xa8c0, 0x0008, 0x6820,
-       0xa085, 0x1000, 0x6822, 0x080c, 0x3a55, 0xa085, 0x0001, 0x00ce,
-       0x0005, 0xa282, 0x0006, 0x1904, 0x3a24, 0x7da8, 0x7eac, 0x8637,
+       0xa085, 0x1000, 0x6822, 0x080c, 0x3a7a, 0xa085, 0x0001, 0x00ce,
+       0x0005, 0xa282, 0x0006, 0x1904, 0x3a49, 0x7da8, 0x7eac, 0x8637,
        0xa5ac, 0x00ff, 0xa6b4, 0x00ff, 0x7fac, 0x8747, 0xa7bc, 0x00ff,
-       0xa8c4, 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1e4, 0x0904, 0x3da3,
-       0xa18c, 0xecff, 0x6922, 0xa782, 0x0002, 0x1a04, 0x39fe, 0xa6b4,
-       0x00ff, 0x0904, 0x3da0, 0xa682, 0x0031, 0x1a04, 0x39fe, 0xa582,
-       0x0009, 0x0a04, 0x39fe, 0xa882, 0x0003, 0x1a04, 0x39fe, 0xa886,
-       0x0002, 0x01d0, 0xa886, 0x0000, 0x1904, 0x39fe, 0x2001, 0x000c,
+       0xa8c4, 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1e4, 0x0904, 0x3dcb,
+       0xa18c, 0xecff, 0x6922, 0xa782, 0x0002, 0x1a04, 0x3a23, 0xa6b4,
+       0x00ff, 0x0904, 0x3dc8, 0xa682, 0x0031, 0x1a04, 0x3a23, 0xa582,
+       0x0009, 0x0a04, 0x3a23, 0xa882, 0x0003, 0x1a04, 0x3a23, 0xa886,
+       0x0002, 0x01d0, 0xa886, 0x0000, 0x1904, 0x3a23, 0x2001, 0x000c,
        0x79ec, 0xd1e4, 0x0110, 0x2001, 0x000a, 0xa502, 0x1290, 0x080c,
-       0x39fe, 0x00c6, 0x2960, 0x6004, 0xa085, 0x001a, 0x6006, 0x6000,
-       0xc0ac, 0x6002, 0x00ce, 0x0005, 0xa786, 0x0000, 0x0904, 0x39fe,
+       0x3a23, 0x00c6, 0x2960, 0x6004, 0xa085, 0x001a, 0x6006, 0x6000,
+       0xc0ac, 0x6002, 0x00ce, 0x0005, 0xa786, 0x0000, 0x0904, 0x3a23,
        0x8634, 0xa682, 0x0018, 0x0228, 0x0120, 0x2031, 0x0018, 0x0804,
-       0x3df1, 0xa686, 0x0010, 0x1108, 0x8630, 0x852b, 0x852b, 0x080c,
-       0x3ac9, 0x0904, 0x39fe, 0x080c, 0x38f7, 0x080c, 0x399c, 0x7e58,
+       0x3e19, 0xa686, 0x0010, 0x1108, 0x8630, 0x852b, 0x852b, 0x080c,
+       0x3aee, 0x0904, 0x3a23, 0x080c, 0x391a, 0x080c, 0x39bf, 0x7e58,
        0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b, 0x0083, 0x0005,
-       0x080c, 0x38f4, 0x0c90, 0xa886, 0x0002, 0x1108, 0x8634, 0x7154,
-       0xa188, 0x0000, 0x210c, 0xd1ac, 0x0904, 0x39fe, 0xd1ec, 0x1120,
+       0x080c, 0x3917, 0x0c90, 0xa886, 0x0002, 0x1108, 0x8634, 0x7154,
+       0xa188, 0x0000, 0x210c, 0xd1ac, 0x0904, 0x3a23, 0xd1ec, 0x1120,
        0x2039, 0x0000, 0x2041, 0x0000, 0xd1e4, 0x1120, 0x2031, 0x0000,
        0x2041, 0x0000, 0xa782, 0x0002, 0x12c8, 0x621c, 0xa284, 0x00ff,
        0xa706, 0x0110, 0x2039, 0x0000, 0xa605, 0x0190, 0x6108, 0x811f,
@@ -1517,11 +1522,11 @@ static unsigned short risc_code01[] = {
        0xa086, 0x0201, 0x0160, 0xa886, 0x0000, 0x0168, 0x2039, 0x0000,
        0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x0070, 0xa284,
        0xff00, 0x1108, 0x2040, 0xa184, 0x00ff, 0xa502, 0x0108, 0x2128,
-       0x852b, 0x852b, 0x080c, 0x3ac9, 0x0d58, 0x080c, 0x38f7, 0x080c,
-       0x399c, 0x789b, 0x0080, 0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab,
+       0x852b, 0x852b, 0x080c, 0x3aee, 0x0d58, 0x080c, 0x391a, 0x080c,
+       0x39bf, 0x789b, 0x0080, 0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab,
        0x0004, 0x7daa, 0x78ab, 0x0000, 0x7eaa, 0x7faa, 0x2800, 0x78aa,
        0x789b, 0x0060, 0x78ab, 0x0008, 0x6820, 0xc0e5, 0x6822, 0x080c,
-       0x3a55, 0x7858, 0xc095, 0x785a, 0x781b, 0x0082, 0x0005, 0x0020,
+       0x3a7a, 0x7858, 0xc095, 0x785a, 0x781b, 0x0082, 0x0005, 0x0020,
        0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
        0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
        0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
@@ -1559,223 +1564,248 @@ static unsigned short risc_code01[] = {
        0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016, 0x0000, 0x0126, 0x70d0,
        0xa084, 0x4c00, 0x8004, 0x2090, 0x7204, 0x7008, 0xc09c, 0xa205,
        0x11a0, 0x720c, 0x82ff, 0x0128, 0x8aff, 0x1178, 0x7200, 0xd284,
-       0x1160, 0x7804, 0xd0cc, 0x0110, 0x080c, 0x4328, 0x7007, 0x0008,
+       0x1160, 0x7804, 0xd0cc, 0x0110, 0x080c, 0x435b, 0x7007, 0x0008,
        0x7003, 0x0008, 0x012e, 0x2000, 0x0005, 0x7000, 0xa084, 0x0003,
        0x7002, 0xc69c, 0xd084, 0x0588, 0x7108, 0xe000, 0x7008, 0xa106,
-       0x1dd8, 0xa184, 0x0003, 0x0904, 0x3fa2, 0xa184, 0x01e0, 0x1904,
-       0x3fa2, 0xd1f4, 0x1d88, 0xa184, 0x3000, 0xa086, 0x1000, 0x0d60,
+       0x1dd8, 0xa184, 0x0003, 0x0904, 0x3fca, 0xa184, 0x01e0, 0x1904,
+       0x3fca, 0xd1f4, 0x1d88, 0xa184, 0x3000, 0xa086, 0x1000, 0x0d60,
        0x2011, 0x0180, 0x710c, 0x8211, 0x0130, 0x7008, 0xd0f4, 0x1d20,
        0x700c, 0xa106, 0x0dc0, 0x7007, 0x0012, 0x7108, 0xe000, 0x7008,
        0xa106, 0x1dd8, 0xa184, 0x0003, 0x0568, 0xd194, 0x0db0, 0xd1f4,
        0x0548, 0x7007, 0x0002, 0x0880, 0x0428, 0x7108, 0xd1fc, 0x0130,
-       0x080c, 0x40ae, 0x8aff, 0x0904, 0x3f2c, 0x0cb8, 0x700c, 0xa08c,
+       0x080c, 0x40d6, 0x8aff, 0x0904, 0x3f54, 0x0cb8, 0x700c, 0xa08c,
        0x07ff, 0x01e8, 0x7004, 0xd084, 0x0178, 0x7014, 0xa005, 0x1148,
        0x7010, 0x7310, 0xa306, 0x1de0, 0x2300, 0xa005, 0x0128, 0xa102,
-       0x1e20, 0x7007, 0x0010, 0x0030, 0x8aff, 0x0148, 0x080c, 0x426b,
-       0x1de8, 0x09d8, 0x080c, 0x4034, 0x012e, 0x2000, 0x0005, 0x7204,
+       0x1e20, 0x7007, 0x0010, 0x0030, 0x8aff, 0x0148, 0x080c, 0x429a,
+       0x1de8, 0x09d8, 0x080c, 0x405c, 0x012e, 0x2000, 0x0005, 0x7204,
        0x7108, 0xc19c, 0x8103, 0x1218, 0x7007, 0x0002, 0x0cc0, 0xa205,
-       0x1d88, 0x7007, 0x0008, 0x7003, 0x0008, 0x0006, 0x2001, 0x4601,
-       0x2004, 0xd0cc, 0x0110, 0x080c, 0x4328, 0x000e, 0x012e, 0x2000,
+       0x1d88, 0x7007, 0x0008, 0x7003, 0x0008, 0x0006, 0x2001, 0x4701,
+       0x2004, 0xd0cc, 0x0110, 0x080c, 0x435b, 0x000e, 0x012e, 0x2000,
        0x0005, 0x6428, 0x84ff, 0x0508, 0x2c70, 0x7004, 0xa0bc, 0x000f,
-       0xa7b8, 0x3ff5, 0x273c, 0x87fb, 0x1148, 0x0210, 0x080c, 0x254c,
-       0x609c, 0xa075, 0x0190, 0x0c88, 0x2039, 0x3fea, 0x2704, 0xae68,
+       0xa7b8, 0x401d, 0x273c, 0x87fb, 0x1148, 0x0210, 0x080c, 0x2575,
+       0x609c, 0xa075, 0x0190, 0x0c88, 0x2039, 0x4012, 0x2704, 0xae68,
        0x6808, 0xa630, 0x680c, 0xa529, 0x8421, 0x0138, 0x8738, 0x2704,
        0xa005, 0x1da8, 0x709c, 0xa075, 0x1d00, 0x0005, 0x0000, 0x0005,
        0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003,
-       0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x3fea, 0x3fe7,
-       0x0000, 0x0000, 0x8000, 0x0000, 0x3fea, 0x0000, 0x3ff2, 0x3fef,
-       0x0000, 0x0000, 0x0000, 0x0000, 0x3ff2, 0x0000, 0x3fed, 0x3fed,
-       0x0000, 0x0000, 0x8000, 0x0000, 0x3fed, 0x0000, 0x3ff3, 0x3ff3,
-       0x0000, 0x0000, 0x0000, 0x0000, 0x3ff3, 0x2079, 0x4600, 0x2071,
+       0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x4012, 0x400f,
+       0x0000, 0x0000, 0x8000, 0x0000, 0x4012, 0x0000, 0x401a, 0x4017,
+       0x0000, 0x0000, 0x0000, 0x0000, 0x401a, 0x0000, 0x4015, 0x4015,
+       0x0000, 0x0000, 0x8000, 0x0000, 0x4015, 0x0000, 0x401b, 0x401b,
+       0x0000, 0x0000, 0x0000, 0x0000, 0x401b, 0x2079, 0x4700, 0x2071,
        0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0001, 0x2009,
        0x0002, 0x2071, 0x0050, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003,
        0x0000, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1128, 0x8109, 0x0118,
-       0x2071, 0x0020, 0x0c80, 0x0005, 0x7004, 0x8004, 0x1a04, 0x408a,
+       0x2071, 0x0020, 0x0c80, 0x0005, 0x7004, 0x8004, 0x1a04, 0x40b2,
        0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0120, 0x080c,
-       0x40e6, 0x0804, 0x40aa, 0x7007, 0x0012, 0x2019, 0x0000, 0x7108,
-       0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0120, 0x080c, 0x40e6,
-       0x0804, 0x40aa, 0xa19c, 0x300c, 0xa386, 0x2004, 0x0190, 0xa386,
+       0x410e, 0x0804, 0x40d2, 0x7007, 0x0012, 0x2019, 0x0000, 0x7108,
+       0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0120, 0x080c, 0x410e,
+       0x0804, 0x40d2, 0xa19c, 0x300c, 0xa386, 0x2004, 0x0190, 0xa386,
        0x0008, 0x01c0, 0x7004, 0xd084, 0x1148, 0x7108, 0x7008, 0xa106,
-       0x1de0, 0xa184, 0x0003, 0x0110, 0x0804, 0x40e6, 0xa386, 0x200c,
+       0x1de0, 0xa184, 0x0003, 0x0110, 0x0804, 0x410e, 0xa386, 0x200c,
        0x19f0, 0x7200, 0x8204, 0x0230, 0x730c, 0xa384, 0x07ff, 0x0110,
-       0x080c, 0x254c, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0,
-       0x0118, 0x080c, 0x40e6, 0x0470, 0x7007, 0x0012, 0x7000, 0xd084,
+       0x080c, 0x2575, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0,
+       0x0118, 0x080c, 0x410e, 0x0470, 0x7007, 0x0012, 0x7000, 0xd084,
        0x1148, 0x7310, 0x7014, 0xa305, 0x0128, 0x710c, 0xa184, 0x07ff,
-       0x1904, 0x4034, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0,
-       0x0118, 0x080c, 0x40e6, 0x00b0, 0x7007, 0x0012, 0x7007, 0x0008,
+       0x1904, 0x405c, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0,
+       0x0118, 0x080c, 0x410e, 0x00b0, 0x7007, 0x0012, 0x7007, 0x0008,
        0x7004, 0xd09c, 0x1de8, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184,
-       0x01e0, 0x0118, 0x080c, 0x40e6, 0x0028, 0x7007, 0x0012, 0x7108,
+       0x01e0, 0x0118, 0x080c, 0x410e, 0x0028, 0x7007, 0x0012, 0x7108,
        0x8103, 0x0e88, 0x7003, 0x0008, 0x0005, 0x7108, 0xa184, 0x01e0,
        0x15a8, 0x7108, 0xa184, 0x01e0, 0x1588, 0xa184, 0x0007, 0x0002,
-       0x40c2, 0x40d0, 0x40c0, 0x40d0, 0x40c0, 0x4120, 0x40c0, 0x411e,
-       0x080c, 0x254c, 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff,
-       0x1118, 0x2049, 0x0000, 0x0005, 0x080c, 0x426b, 0x1de8, 0x0005,
+       0x40ea, 0x40f8, 0x40e8, 0x40f8, 0x40e8, 0x4148, 0x40e8, 0x4146,
+       0x080c, 0x2575, 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff,
+       0x1118, 0x2049, 0x0000, 0x0005, 0x080c, 0x429a, 0x1de8, 0x0005,
        0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x7004, 0xd084, 0x1140,
        0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x0003, 0x0108, 0x0030,
-       0x8aff, 0x0118, 0x080c, 0x426b, 0x1de8, 0x0005, 0x7007, 0x0012,
-       0x7108, 0x1d04, 0x40e9, 0x2091, 0x6000, 0x1d04, 0x40ed, 0x2091,
+       0x8aff, 0x0118, 0x080c, 0x429a, 0x1de8, 0x0005, 0x7007, 0x0012,
+       0x7108, 0x1d04, 0x4111, 0x2091, 0x6000, 0x1d04, 0x4115, 0x2091,
        0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xd09c, 0x1de8,
        0x7007, 0x0012, 0x7108, 0xd1fc, 0x1dd8, 0x7003, 0x0000, 0x7000,
        0xa005, 0x1130, 0x7004, 0xa005, 0x1118, 0x700c, 0xa005, 0x0108,
        0x0c40, 0x2049, 0x0000, 0xb284, 0x0200, 0x0118, 0x2001, 0x0000,
-       0x0010, 0x2001, 0x0001, 0x080c, 0x3b81, 0x681b, 0x0002, 0x2051,
-       0x0000, 0x0005, 0x080c, 0x254c, 0x080c, 0x254c, 0x080c, 0x415f,
+       0x0010, 0x2001, 0x0001, 0x080c, 0x3ba7, 0x681b, 0x0002, 0x2051,
+       0x0000, 0x0005, 0x080c, 0x2575, 0x080c, 0x2575, 0x080c, 0x4187,
        0x7210, 0x7114, 0x700c, 0xa09c, 0x07ff, 0x2800, 0xa300, 0xa211,
        0xa189, 0x0000, 0x04a1, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200,
        0xa322, 0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0140, 0x1238,
        0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0c58, 0x2b60,
-       0x8a07, 0x0006, 0x6004, 0xd09c, 0x0118, 0xa7ba, 0x3fef, 0x0010,
-       0xa7ba, 0x3fe7, 0x000e, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92,
+       0x8a07, 0x0006, 0x6004, 0xd09c, 0x0118, 0xa7ba, 0x4017, 0x0010,
+       0xa7ba, 0x400f, 0x000e, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92,
        0x6b8e, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0110,
-       0x080c, 0x40e6, 0x7007, 0x0012, 0x080c, 0x4034, 0x0005, 0x8a50,
+       0x080c, 0x410e, 0x7007, 0x0012, 0x080c, 0x405c, 0x0005, 0x8a50,
        0x8739, 0x2704, 0xa004, 0x1168, 0x6000, 0xa064, 0x1108, 0x2d60,
-       0x6004, 0xa084, 0x000f, 0xa080, 0x4005, 0x203c, 0x87fb, 0x090c,
-       0x254c, 0x0005, 0x0126, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004,
+       0x6004, 0xa084, 0x000f, 0xa080, 0x402d, 0x203c, 0x87fb, 0x090c,
+       0x2575, 0x0005, 0x0126, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004,
        0x2090, 0x00de, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90, 0x8057,
        0xaad4, 0x00ff, 0xa084, 0x00ff, 0x0006, 0x6804, 0xa084, 0x0008,
-       0x000e, 0x0118, 0xa0b8, 0x3fef, 0x0010, 0xa0b8, 0x3fe7, 0xb284,
+       0x000e, 0x0118, 0xa0b8, 0x4017, 0x0010, 0xa0b8, 0x400f, 0xb284,
        0x0200, 0x0110, 0x7e20, 0x0008, 0x7e24, 0xa6b5, 0x000c, 0x681c,
-       0xd0b4, 0x0108, 0xc685, 0x2400, 0xa305, 0x0518, 0x2c58, 0x2704,
-       0x6104, 0xac60, 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e,
-       0xd19c, 0x0140, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014, 0xa081,
-       0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c, 0x2300,
-       0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x080c, 0x4292,
-       0x0010, 0x080c, 0x426b, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126,
-       0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, 0x7007,
-       0x0004, 0x7004, 0xd094, 0x1de8, 0x7003, 0x0008, 0x012e, 0x2000,
-       0x0005, 0x0126, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090,
-       0x00de, 0x7e20, 0xb284, 0x0200, 0x1108, 0x7e24, 0xa6b5, 0x000c,
-       0x681c, 0xd0ac, 0x1118, 0xc685, 0x7003, 0x0000, 0x6828, 0x2050,
-       0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x3ff5, 0x273c, 0x87fb,
-       0x1138, 0x0210, 0x080c, 0x254c, 0x689c, 0xa065, 0x0120, 0x0c88,
-       0x080c, 0x426b, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126, 0x0006,
-       0x0016, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x7e20,
-       0xb284, 0x0200, 0x1108, 0x7e24, 0x00de, 0x003e, 0x004e, 0xa6b5,
-       0x000c, 0x681c, 0xd0b4, 0x0128, 0xc685, 0x7003, 0x0000, 0x7007,
-       0x0004, 0x2049, 0x4206, 0x6828, 0xa055, 0x00d6, 0x0904, 0x4267,
-       0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x3ff5, 0x273c,
-       0x87fb, 0x1140, 0x0210, 0x080c, 0x254c, 0x709c, 0xa075, 0x2060,
-       0x0570, 0x0c80, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b,
-       0x0268, 0x8a51, 0x1110, 0x080c, 0x254c, 0x8738, 0x2704, 0xa005,
-       0x1d90, 0x709c, 0xa075, 0x2060, 0x01d0, 0x08e0, 0x8422, 0x8420,
-       0x831a, 0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300,
-       0xa11b, 0x1210, 0x080c, 0x254c, 0xb284, 0x0200, 0x0118, 0x2071,
-       0x0050, 0x0010, 0x2071, 0x0020, 0x00de, 0x0804, 0x419b, 0x00de,
-       0x012e, 0x2000, 0x0005, 0x7008, 0x0006, 0xa084, 0x01e0, 0x000e,
-       0x0110, 0xa006, 0x0005, 0xa084, 0x0003, 0xa086, 0x0003, 0x1108,
-       0x0005, 0x2704, 0xac78, 0x7800, 0x701a, 0x7804, 0x701e, 0x7808,
-       0x7012, 0x780c, 0x7016, 0x6004, 0xd09c, 0x0120, 0x7810, 0x7022,
-       0x7814, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010, 0xc085, 0x7006,
-       0x2079, 0x4600, 0x8a51, 0x01e8, 0x8738, 0x2704, 0xa005, 0x1168,
-       0x609c, 0xa005, 0x01b8, 0x2060, 0x6004, 0xa084, 0x000f, 0xa080,
-       0x3ff5, 0x203c, 0x87fb, 0x090c, 0x254c, 0x7008, 0x0006, 0xa084,
-       0x01e0, 0x000e, 0x0110, 0xa006, 0x0028, 0xa084, 0x0003, 0xa086,
-       0x0003, 0x0005, 0x2051, 0x0000, 0x0005, 0x0126, 0x0006, 0x00d6,
-       0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, 0x008e, 0x7108,
-       0xa184, 0x0003, 0x1128, 0x6828, 0xa005, 0x0178, 0x0804, 0x3f45,
-       0x7108, 0xd1fc, 0x0118, 0x080c, 0x40ae, 0x0c88, 0x7007, 0x0010,
-       0x7108, 0xd1fc, 0x0de8, 0x080c, 0x40ae, 0x7008, 0xa086, 0x0008,
-       0x1d30, 0x7000, 0xa005, 0x1d18, 0x7003, 0x0000, 0x2049, 0x0000,
-       0x0006, 0x2001, 0x4601, 0x2004, 0xd0cc, 0x0110, 0x080c, 0x4328,
-       0x000e, 0x012e, 0x2000, 0x0005, 0x0126, 0x0146, 0x0136, 0x0156,
-       0x00c6, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de,
-       0x2049, 0x42ec, 0xad80, 0x0011, 0x20a0, 0xb284, 0x0200, 0x0118,
-       0x2099, 0x0032, 0x0010, 0x2099, 0x0031, 0x700c, 0xa084, 0x07ff,
-       0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0118,
-       0x8000, 0x80ac, 0x53a5, 0x700c, 0xa084, 0x07ff, 0x0130, 0x7007,
-       0x0004, 0x7004, 0xa084, 0x0004, 0x1de0, 0x00ce, 0x2049, 0x0000,
-       0x7003, 0x0000, 0x015e, 0x013e, 0x014e, 0x012e, 0x2000, 0x0005,
-       0x6814, 0xd0fc, 0x0904, 0x436b, 0x7000, 0xd084, 0x05e0, 0x7e24,
-       0xa6b5, 0x0004, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x1de0,
-       0x7118, 0x0016, 0x711c, 0x0016, 0x7120, 0x0016, 0x7124, 0x0016,
-       0x701b, 0x0000, 0x701f, 0x3fff, 0x7023, 0x0000, 0x7027, 0x0000,
-       0x7013, 0x0004, 0x7017, 0x0000, 0x7602, 0x7007, 0x0001, 0x2001,
-       0xffff, 0x2009, 0x0031, 0x200a, 0x200a, 0x7108, 0x7008, 0xa106,
-       0x1de0, 0xd1fc, 0x0dd0, 0x002e, 0x7226, 0x002e, 0x7222, 0x002e,
-       0x721e, 0x002e, 0x721a, 0x7007, 0x0002, 0x7008, 0xa086, 0x0008,
-       0x0110, 0x0804, 0x40e6, 0x7007, 0x0004, 0x7003, 0x0000, 0x0005,
-       0x2091, 0x8000, 0x2091, 0x6000, 0x78ac, 0xa005, 0x1168, 0x7974,
-       0x70d0, 0xa106, 0x1148, 0x781c, 0xa005, 0x0130, 0x781f, 0x0000,
-       0x0e04, 0x4384, 0x2091, 0x4080, 0x2069, 0x4680, 0xd7fc, 0x1110,
-       0x2069, 0x4640, 0x6800, 0xa084, 0x000f, 0x1198, 0x68d0, 0xd0b4,
-       0x0180, 0xd0bc, 0x1170, 0x00f6, 0x2079, 0x0100, 0xd7fc, 0x1110,
-       0x2079, 0x0200, 0x7830, 0xa084, 0x00c0, 0x1110, 0x080c, 0x22ae,
-       0x00fe, 0x7830, 0x8001, 0x7832, 0x1904, 0x440b, 0x7834, 0x7832,
-       0x2061, 0x6bc0, 0x2069, 0x4680, 0xc7fd, 0x68cc, 0xa005, 0x0128,
-       0x8001, 0x68ce, 0x1110, 0x080c, 0x4577, 0x6800, 0xa084, 0x000f,
-       0x0168, 0xa086, 0x0001, 0x0150, 0x6840, 0xa00d, 0x0138, 0x2104,
-       0xa005, 0x0120, 0x8001, 0x200a, 0x0904, 0x4514, 0x6814, 0xa005,
-       0x01a8, 0x8001, 0x6816, 0x1190, 0x68a3, 0x0001, 0x00f6, 0xd7fc,
-       0x1118, 0x2079, 0x0200, 0x0010, 0x2079, 0x0100, 0x080c, 0x3c46,
-       0x00fe, 0x6860, 0xa005, 0x0110, 0x080c, 0x22ae, 0x687c, 0xa005,
-       0x0140, 0x8001, 0x687e, 0x1128, 0x6863, 0x0000, 0x68d0, 0xc0c5,
-       0x68d2, 0x68d0, 0xd0fc, 0x01b0, 0xc0fc, 0x68d2, 0x20a9, 0x0200,
-       0x6034, 0xa005, 0x0158, 0x8001, 0x6036, 0x68d0, 0xc0fd, 0x68d2,
-       0x1128, 0x6010, 0xa005, 0x0110, 0x080c, 0x22ae, 0xace0, 0x0010,
-       0x1f04, 0x43f0, 0xd7fc, 0x0138, 0x2061, 0x4bc0, 0x2069, 0x4640,
-       0xc7fc, 0x0804, 0x43ad, 0x0459, 0x7838, 0x8001, 0x783a, 0x11a0,
-       0x783c, 0x783a, 0x2061, 0x4bc0, 0x2069, 0x4640, 0xc7fc, 0x680c,
-       0xa005, 0x0110, 0x080c, 0x4487, 0xd7fc, 0x1130, 0x2061, 0x6bc0,
-       0x2069, 0x4680, 0xc7fd, 0x0c98, 0x7810, 0xd0cc, 0x0168, 0xd0ac,
-       0x1120, 0xd0a4, 0x0148, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0e04,
-       0x4433, 0x080c, 0x207a, 0x0005, 0x2091, 0x8001, 0x0005, 0x7840,
-       0x8001, 0x7842, 0x1904, 0x4486, 0x7844, 0x7842, 0x2069, 0x4640,
-       0xc7fc, 0x2079, 0x0200, 0x68d4, 0xa005, 0x0138, 0x7de0, 0xa504,
-       0x1120, 0x68d6, 0x68d0, 0xc0bc, 0x68d2, 0x2079, 0x4600, 0x6810,
-       0xa005, 0x1110, 0x2001, 0x0101, 0x8001, 0x6812, 0xd7fc, 0x0118,
-       0xa080, 0x8cd0, 0x0010, 0xa080, 0x8bc0, 0x2040, 0x2004, 0xa065,
-       0x01e0, 0x6024, 0xa005, 0x01b0, 0x8001, 0x6026, 0x1198, 0x6800,
-       0xa005, 0x0130, 0x6848, 0xac06, 0x1118, 0x080c, 0x4514, 0x0068,
-       0x6860, 0xa005, 0x0118, 0x6027, 0x0001, 0x0020, 0x080c, 0x44c8,
-       0x2804, 0x0c28, 0x6000, 0x2c40, 0x0c10, 0xd7fc, 0x1138, 0x2069,
-       0x4680, 0xc7fd, 0x2079, 0x0100, 0x0804, 0x4443, 0x0005, 0x2009,
-       0x0000, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0558, 0x6024, 0xa005,
-       0x0118, 0x8001, 0x6026, 0x0418, 0x6008, 0xc09c, 0xd084, 0x1110,
-       0xd0ac, 0x01c0, 0x600a, 0x6004, 0xa005, 0x01d8, 0x00d6, 0x00c6,
-       0x0016, 0x2068, 0x6010, 0x8001, 0x6012, 0x080c, 0x37a4, 0x2d00,
-       0x2c68, 0x2060, 0x080c, 0x1be3, 0x080c, 0x1d95, 0x001e, 0x00ce,
-       0x00de, 0x0038, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0010, 0xa18d,
-       0x0100, 0xace0, 0x0010, 0x1f04, 0x448b, 0xa184, 0x0001, 0x0130,
-       0xa18c, 0xfffe, 0x690e, 0x080c, 0x22ae, 0x0008, 0x690e, 0x0005,
-       0x2c00, 0x687a, 0x6714, 0x6f72, 0x6017, 0x0000, 0x602b, 0x0000,
-       0x601b, 0x0006, 0x60b4, 0xa084, 0x5f00, 0x601e, 0x6020, 0xa084,
-       0x00ff, 0xa085, 0x0060, 0x6022, 0x6000, 0x2042, 0x6858, 0xac06,
-       0x1110, 0x2800, 0x685a, 0x080c, 0x1b7b, 0x6818, 0xa005, 0x0110,
-       0x8001, 0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810, 0x7908, 0x8109,
-       0x790a, 0x8001, 0x1310, 0x080c, 0x254c, 0x6812, 0x1118, 0x7910,
-       0xc1a5, 0x7912, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x080c,
-       0x1da2, 0xd7fc, 0x1118, 0x2069, 0x4640, 0x0010, 0x2069, 0x4680,
-       0x6910, 0xa184, 0x0100, 0x2001, 0x0006, 0x1118, 0x6976, 0x2001,
-       0x0004, 0x080c, 0x22a4, 0x0005, 0x00d6, 0x6948, 0x2160, 0xd7fc,
-       0x1118, 0x2069, 0x0200, 0x0010, 0x2069, 0x0100, 0x080c, 0x2467,
-       0x601b, 0x0006, 0x6858, 0xa084, 0x5f00, 0x601e, 0x6020, 0xa084,
-       0x00ff, 0xa085, 0x0048, 0x6022, 0x602f, 0x0000, 0x6033, 0x0000,
-       0x6808, 0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, 0x01b0, 0x684b,
-       0x0004, 0x20a9, 0x0014, 0x6848, 0xd094, 0x0110, 0x1f04, 0x453b,
-       0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, 0x0110, 0x1f04,
-       0x4544, 0x20a9, 0x00fa, 0x1f04, 0x454b, 0x681b, 0x0054, 0x00de,
-       0x6863, 0x0007, 0x0005, 0x2079, 0x4600, 0x00e1, 0x0089, 0x00a9,
-       0x2009, 0x0002, 0x2069, 0x4680, 0x680f, 0x0000, 0x6813, 0x0000,
-       0x6817, 0x0000, 0x8109, 0x0118, 0x2069, 0x4640, 0x0ca8, 0x0005,
-       0x2019, 0x00a3, 0x7b3a, 0x7b3e, 0x0005, 0x2019, 0x0033, 0x7b42,
-       0x7b46, 0x0005, 0x2019, 0x32dd, 0x7b32, 0x7b36, 0x0005, 0x6a4c,
-       0xa285, 0x0000, 0x01f0, 0x6950, 0x6bbc, 0xa300, 0x00c6, 0x2164,
-       0x6304, 0x83ff, 0x1138, 0x8211, 0x0148, 0x8108, 0xa11a, 0x0eb8,
-       0x69bc, 0x0ca8, 0x68cf, 0x000a, 0x00ce, 0x0005, 0x694c, 0x6abc,
-       0x2264, 0x6008, 0xc0b5, 0x600a, 0x8210, 0x8109, 0x1dc8, 0x694e,
-       0x00ce, 0x0005, 0x1d04, 0x459a, 0x2091, 0x6000, 0x1d04, 0x459e,
-       0x2091, 0x6000, 0x70ec, 0xd0dc, 0x1118, 0xd0d4, 0x0190, 0x0098,
-       0xae8e, 0x0100, 0x0138, 0x7814, 0xc0f5, 0xc0c5, 0x7816, 0xd0d4,
-       0x1578, 0x0458, 0x7814, 0xc0fd, 0xc0c5, 0x7816, 0xd0d4, 0x1540,
-       0x0420, 0xd0e4, 0x0538, 0x1d04, 0x45bb, 0x2091, 0x6000, 0x2009,
-       0x000c, 0x1d04, 0x45c1, 0x2091, 0x6000, 0x8109, 0x1dd0, 0x70e4,
-       0xa084, 0x01ff, 0xa086, 0x01ff, 0x1110, 0x70ec, 0x08c8, 0xae8e,
-       0x0100, 0x0128, 0x7814, 0xc0f4, 0xd0fc, 0x1130, 0x0020, 0x7814,
-       0xc0fc, 0xd0f4, 0x1108, 0xc0c4, 0x7816, 0x7804, 0xd08c, 0x0110,
-       0x681f, 0x000c, 0x70a0, 0x70a2, 0x0005, 0x7c12
+       0xd0b4, 0x0108, 0xc685, 0x2400, 0xa305, 0x0550, 0x2c58, 0x2704,
+       0x6104, 0xac60, 0x6000, 0xa400, 0x2048, 0xa9cc, 0x0004, 0x0118,
+       0x080c, 0x43a3, 0x0400, 0x701a, 0x6004, 0xa301, 0x701e, 0xd19c,
+       0x0140, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014, 0xa081, 0x0000,
+       0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c, 0x2300, 0xa203,
+       0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x080c, 0x42c5, 0x0010,
+       0x080c, 0x429a, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126, 0x00d6,
+       0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, 0x7007, 0x0004,
+       0x7004, 0xd094, 0x1de8, 0x7003, 0x0008, 0x012e, 0x2000, 0x0005,
+       0x0126, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de,
+       0x7e20, 0xb284, 0x0200, 0x1108, 0x7e24, 0xa6b5, 0x000c, 0x681c,
+       0xd0ac, 0x1118, 0xc685, 0x7003, 0x0000, 0x6828, 0x2050, 0x2d60,
+       0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x401d, 0x273c, 0x87fb, 0x1138,
+       0x0210, 0x080c, 0x2575, 0x689c, 0xa065, 0x0120, 0x0c88, 0x080c,
+       0x429a, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126, 0x0006, 0x0016,
+       0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x7e20, 0xb284,
+       0x0200, 0x1108, 0x7e24, 0x00de, 0x003e, 0x004e, 0xa6b5, 0x000c,
+       0x681c, 0xd0b4, 0x0128, 0xc685, 0x7003, 0x0000, 0x7007, 0x0004,
+       0x2049, 0x4235, 0x6828, 0xa055, 0x00d6, 0x0904, 0x4296, 0x2d70,
+       0x2e60, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x401d, 0x273c, 0x87fb,
+       0x1140, 0x0210, 0x080c, 0x2575, 0x709c, 0xa075, 0x2060, 0x0570,
+       0x0c80, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0268,
+       0x8a51, 0x1110, 0x080c, 0x2575, 0x8738, 0x2704, 0xa005, 0x1d90,
+       0x709c, 0xa075, 0x2060, 0x01d0, 0x08e0, 0x8422, 0x8420, 0x831a,
+       0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b,
+       0x1210, 0x080c, 0x2575, 0xb284, 0x0200, 0x0118, 0x2071, 0x0050,
+       0x0010, 0x2071, 0x0020, 0x00de, 0x0804, 0x41c3, 0x00de, 0x012e,
+       0x2000, 0x0005, 0x7008, 0x0006, 0xa084, 0x01e0, 0x000e, 0x0110,
+       0xa006, 0x0005, 0xa084, 0x0003, 0xa086, 0x0003, 0x1108, 0x0005,
+       0x2704, 0xac78, 0x7800, 0x2f08, 0xd094, 0x1904, 0x43a6, 0x701a,
+       0x7804, 0x701e, 0x7808, 0x7012, 0x780c, 0x7016, 0x6004, 0xd09c,
+       0x0120, 0x7810, 0x7022, 0x7814, 0x7026, 0x7602, 0x7004, 0xa084,
+       0x0010, 0xc085, 0x7006, 0x2079, 0x4700, 0x8a51, 0x01e8, 0x8738,
+       0x2704, 0xa005, 0x1168, 0x609c, 0xa005, 0x01b8, 0x2060, 0x6004,
+       0xa084, 0x000f, 0xa080, 0x401d, 0x203c, 0x87fb, 0x090c, 0x2575,
+       0x7008, 0x0006, 0xa084, 0x01e0, 0x000e, 0x0110, 0xa006, 0x0028,
+       0xa084, 0x0003, 0xa086, 0x0003, 0x0005, 0x2051, 0x0000, 0x0005,
+       0x0126, 0x0006, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090,
+       0x00de, 0x008e, 0x7108, 0xa184, 0x0003, 0x1128, 0x6828, 0xa005,
+       0x0178, 0x0804, 0x3f6d, 0x7108, 0xd1fc, 0x0118, 0x080c, 0x40d6,
+       0x0c88, 0x7007, 0x0010, 0x7108, 0xd1fc, 0x0de8, 0x080c, 0x40d6,
+       0x7008, 0xa086, 0x0008, 0x1d30, 0x7000, 0xa005, 0x1d18, 0x7003,
+       0x0000, 0x2049, 0x0000, 0x0006, 0x2001, 0x4701, 0x2004, 0xd0cc,
+       0x0110, 0x080c, 0x435b, 0x000e, 0x012e, 0x2000, 0x0005, 0x0126,
+       0x0146, 0x0136, 0x0156, 0x00c6, 0x00d6, 0x70d0, 0xa084, 0x4c00,
+       0x8004, 0x2090, 0x00de, 0x2049, 0x431f, 0xad80, 0x0011, 0x20a0,
+       0xb284, 0x0200, 0x0118, 0x2099, 0x0032, 0x0010, 0x2099, 0x0031,
+       0x700c, 0xa084, 0x07ff, 0x682a, 0x7007, 0x0008, 0x7007, 0x0002,
+       0x7003, 0x0001, 0x0118, 0x8000, 0x80ac, 0x53a5, 0x700c, 0xa084,
+       0x07ff, 0x0130, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x1de0,
+       0x00ce, 0x2049, 0x0000, 0x7003, 0x0000, 0x015e, 0x013e, 0x014e,
+       0x012e, 0x2000, 0x0005, 0x6814, 0xd0fc, 0x0904, 0x439e, 0x7000,
+       0xd084, 0x05e0, 0x7e24, 0xa6b5, 0x0004, 0x7007, 0x0004, 0x7004,
+       0xa084, 0x0004, 0x1de0, 0x7118, 0x0016, 0x711c, 0x0016, 0x7120,
+       0x0016, 0x7124, 0x0016, 0x701b, 0x0000, 0x701f, 0x3fff, 0x7023,
+       0x0000, 0x7027, 0x0000, 0x7013, 0x0004, 0x7017, 0x0000, 0x7602,
+       0x7007, 0x0001, 0x2001, 0xffff, 0x2009, 0x0031, 0x200a, 0x200a,
+       0x7108, 0x7008, 0xa106, 0x1de0, 0xd1fc, 0x0dd0, 0x002e, 0x7226,
+       0x002e, 0x7222, 0x002e, 0x721e, 0x002e, 0x721a, 0x7007, 0x0002,
+       0x7008, 0xa086, 0x0008, 0x0110, 0x0804, 0x410e, 0x7007, 0x0004,
+       0x7003, 0x0000, 0x0005, 0x2049, 0x41c3, 0x0068, 0x7008, 0xa084,
+       0x0003, 0x0110, 0xa006, 0x0005, 0xa006, 0x2020, 0x2018, 0x2c58,
+       0x2160, 0x2049, 0x0000, 0x8b58, 0x6100, 0x2100, 0xa408, 0x711a,
+       0x6004, 0xa301, 0x701e, 0x0006, 0x2b04, 0xa084, 0x0008, 0x0150,
+       0x6010, 0xa081, 0x0000, 0x7022, 0x0006, 0x6014, 0xa081, 0x0000,
+       0x7026, 0x0006, 0xa184, 0x0007, 0x2011, 0x0008, 0xa22a, 0x6208,
+       0x2400, 0xa212, 0x0026, 0x620c, 0x2240, 0x2300, 0xa843, 0x002e,
+       0x88ff, 0x1170, 0x2500, 0xa202, 0x0108, 0x1250, 0x2220, 0x2041,
+       0x0000, 0x2b04, 0xd09c, 0x0110, 0x000e, 0x000e, 0x000e, 0x0450,
+       0x7512, 0x7017, 0x0000, 0x7602, 0xa986, 0x41c3, 0x1118, 0x7007,
+       0x0001, 0x0028, 0x7004, 0xa084, 0x0010, 0xc085, 0x7006, 0x2500,
+       0xa100, 0x701a, 0x2b04, 0xa084, 0x0008, 0x0110, 0x000e, 0x004e,
+       0x001e, 0xa189, 0x0000, 0x711e, 0x2b0c, 0xa18c, 0x0008, 0x0130,
+       0xa4a1, 0x0000, 0x7422, 0xa081, 0x0000, 0x7026, 0x2500, 0xa222,
+       0xa8c3, 0x0000, 0x7412, 0x2820, 0x7416, 0x7602, 0xa986, 0x41c3,
+       0x1118, 0x7007, 0x0001, 0x0028, 0x7004, 0xa084, 0x0010, 0xc085,
+       0x7006, 0x8b59, 0x2b60, 0x2079, 0x4700, 0x080c, 0x42c5, 0xa006,
+       0x0005, 0x2091, 0x8000, 0x2091, 0x6000, 0x78ac, 0xa005, 0x1168,
+       0x7974, 0x70d0, 0xa106, 0x1148, 0x781c, 0xa005, 0x0130, 0x781f,
+       0x0000, 0x0e04, 0x443d, 0x2091, 0x4080, 0x2069, 0x4780, 0xc7fd,
+       0x6800, 0xa084, 0x000f, 0x1198, 0x68d0, 0xd0b4, 0x0180, 0xd0bc,
+       0x1170, 0x00f6, 0x2079, 0x0100, 0xd7fc, 0x1110, 0x2079, 0x0200,
+       0x7830, 0xa084, 0x00c0, 0x1110, 0x080c, 0x22d5, 0x00fe, 0xd7fc,
+       0x0120, 0x2069, 0x4740, 0xc7fc, 0x0c18, 0x7830, 0x8001, 0x7832,
+       0x1904, 0x44c7, 0x7834, 0x7832, 0x2061, 0x6cc0, 0x2069, 0x4780,
+       0xc7fd, 0x68cc, 0xa005, 0x0128, 0x8001, 0x68ce, 0x1110, 0x080c,
+       0x4639, 0x6800, 0xa084, 0x000f, 0x0168, 0xa086, 0x0001, 0x0150,
+       0x6840, 0xa00d, 0x0138, 0x2104, 0xa005, 0x0120, 0x8001, 0x200a,
+       0x0904, 0x45d6, 0x6814, 0xa005, 0x01a8, 0x8001, 0x6816, 0x1190,
+       0x68a3, 0x0001, 0x00f6, 0xd7fc, 0x1118, 0x2079, 0x0200, 0x0010,
+       0x2079, 0x0100, 0x080c, 0x3c6e, 0x00fe, 0x6860, 0xa005, 0x0110,
+       0x080c, 0x22d5, 0x687c, 0xa005, 0x0140, 0x8001, 0x687e, 0x1128,
+       0x6863, 0x0000, 0x68d0, 0xc0c5, 0x68d2, 0x68d0, 0xd0fc, 0x01b0,
+       0xc0fc, 0x68d2, 0x20a9, 0x0200, 0x6034, 0xa005, 0x0158, 0x8001,
+       0x6036, 0x68d0, 0xc0fd, 0x68d2, 0x1128, 0x6010, 0xa005, 0x0110,
+       0x080c, 0x22d5, 0xace0, 0x0010, 0x1f04, 0x44ac, 0xd7fc, 0x0138,
+       0x2061, 0x4cc0, 0x2069, 0x4740, 0xc7fc, 0x0804, 0x4469, 0x0459,
+       0x7838, 0x8001, 0x783a, 0x11a0, 0x783c, 0x783a, 0x2061, 0x4cc0,
+       0x2069, 0x4740, 0xc7fc, 0x680c, 0xa005, 0x0110, 0x080c, 0x4543,
+       0xd7fc, 0x1130, 0x2061, 0x6cc0, 0x2069, 0x4780, 0xc7fd, 0x0c98,
+       0x7810, 0xd0cc, 0x0168, 0xd0ac, 0x1120, 0xd0a4, 0x0148, 0xc0ad,
+       0x7812, 0x2091, 0x8001, 0x0e04, 0x44ef, 0x080c, 0x20a1, 0x0005,
+       0x2091, 0x8001, 0x0005, 0x7840, 0x8001, 0x7842, 0x1904, 0x4542,
+       0x7844, 0x7842, 0x2069, 0x4740, 0xc7fc, 0x2079, 0x0200, 0x68d4,
+       0xa005, 0x0138, 0x7de0, 0xa504, 0x1120, 0x68d6, 0x68d0, 0xc0bc,
+       0x68d2, 0x2079, 0x4700, 0x6810, 0xa005, 0x1110, 0x2001, 0x0101,
+       0x8001, 0x6812, 0xd7fc, 0x0118, 0xa080, 0x8dd0, 0x0010, 0xa080,
+       0x8cc0, 0x2040, 0x2004, 0xa065, 0x01e0, 0x6024, 0xa005, 0x01b0,
+       0x8001, 0x6026, 0x1198, 0x6800, 0xa005, 0x0130, 0x6848, 0xac06,
+       0x1118, 0x080c, 0x45d6, 0x0068, 0x6860, 0xa005, 0x0118, 0x6027,
+       0x0001, 0x0020, 0x080c, 0x4584, 0x2804, 0x0c28, 0x6000, 0x2c40,
+       0x0c10, 0xd7fc, 0x1138, 0x2069, 0x4780, 0xc7fd, 0x2079, 0x0100,
+       0x0804, 0x44ff, 0x0005, 0x2009, 0x0000, 0x20a9, 0x0200, 0x6008,
+       0xd09c, 0x0558, 0x6024, 0xa005, 0x0118, 0x8001, 0x6026, 0x0418,
+       0x6008, 0xc09c, 0xd084, 0x1110, 0xd0ac, 0x01c0, 0x600a, 0x6004,
+       0xa005, 0x01d8, 0x00d6, 0x00c6, 0x0016, 0x2068, 0x6010, 0x8001,
+       0x6012, 0x080c, 0x37c7, 0x2d00, 0x2c68, 0x2060, 0x080c, 0x1c02,
+       0x080c, 0x1db2, 0x001e, 0x00ce, 0x00de, 0x0038, 0xc0bd, 0x600a,
+       0xa18d, 0x0001, 0x0010, 0xa18d, 0x0100, 0xace0, 0x0010, 0x1f04,
+       0x4547, 0xa184, 0x0001, 0x0130, 0xa18c, 0xfffe, 0x690e, 0x080c,
+       0x22d5, 0x0008, 0x690e, 0x0005, 0x2c00, 0x687a, 0x6714, 0x6f72,
+       0x6017, 0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x60b4, 0xa084,
+       0x5f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0060, 0x6022,
+       0x6000, 0x2042, 0x2069, 0x4780, 0xd7fc, 0x1110, 0x2069, 0x4740,
+       0x6858, 0xac06, 0x1110, 0x2800, 0x685a, 0x080c, 0x1b9a, 0x6818,
+       0xa005, 0x0110, 0x8001, 0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810,
+       0x7908, 0x8109, 0x790a, 0x8001, 0x1310, 0x080c, 0x2575, 0x6812,
+       0x1118, 0x7910, 0xc1a5, 0x7912, 0x602f, 0x0000, 0x6033, 0x0000,
+       0x2c68, 0x080c, 0x1dbf, 0xd7fc, 0x1118, 0x2069, 0x4740, 0x0010,
+       0x2069, 0x4780, 0x6910, 0xa184, 0x0100, 0x2001, 0x0006, 0x1118,
+       0x6976, 0x2001, 0x0004, 0x080c, 0x22cb, 0x0005, 0x00d6, 0x6948,
+       0x2160, 0xd7fc, 0x1118, 0x2069, 0x0200, 0x0010, 0x2069, 0x0100,
+       0x080c, 0x2490, 0x601b, 0x0006, 0x6858, 0xa084, 0x5f00, 0x601e,
+       0x6020, 0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f, 0x0000,
+       0x6033, 0x0000, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4,
+       0x01b0, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xd094, 0x0110,
+       0x1f04, 0x45fd, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xd084,
+       0x0110, 0x1f04, 0x4606, 0x20a9, 0x00fa, 0x1f04, 0x460d, 0x681b,
+       0x0054, 0x00de, 0x6863, 0x0007, 0x0005, 0x2079, 0x4700, 0x00e1,
+       0x0089, 0x00a9, 0x2009, 0x0002, 0x2069, 0x4780, 0x680f, 0x0000,
+       0x6813, 0x0000, 0x6817, 0x0000, 0x8109, 0x0118, 0x2069, 0x4740,
+       0x0ca8, 0x0005, 0x2019, 0x00a3, 0x7b3a, 0x7b3e, 0x0005, 0x2019,
+       0x0033, 0x7b42, 0x7b46, 0x0005, 0x2019, 0x32dd, 0x7b32, 0x7b36,
+       0x0005, 0x6a4c, 0xa285, 0x0000, 0x01f0, 0x6950, 0x6bbc, 0xa300,
+       0x00c6, 0x2164, 0x6304, 0x83ff, 0x1138, 0x8211, 0x0148, 0x8108,
+       0xa11a, 0x0eb8, 0x69bc, 0x0ca8, 0x68cf, 0x000a, 0x00ce, 0x0005,
+       0x694c, 0x6abc, 0x2264, 0x6008, 0xc0b5, 0x600a, 0x8210, 0x8109,
+       0x1dc8, 0x694e, 0x00ce, 0x0005, 0x0016, 0x1d04, 0x465d, 0x2091,
+       0x6000, 0x1d04, 0x4661, 0x2091, 0x6000, 0x70ec, 0xd0dc, 0x1118,
+       0xd0d4, 0x0190, 0x00a0, 0xae8e, 0x0100, 0x0138, 0x7814, 0xc0f5,
+       0xc0c5, 0x7816, 0xd0d4, 0x1580, 0x0460, 0x7814, 0xc0fd, 0xc0c5,
+       0x7816, 0xd0d4, 0x1548, 0x0428, 0xd0e4, 0x0904, 0x46c4, 0x1d04,
+       0x467f, 0x2091, 0x6000, 0x2009, 0x000c, 0x1d04, 0x4685, 0x2091,
+       0x6000, 0x8109, 0x1dd0, 0x70e4, 0xa084, 0x01ff, 0xa086, 0x01ff,
+       0x1110, 0x70ec, 0x08c0, 0xae8e, 0x0100, 0x0128, 0x7814, 0xc0f4,
+       0xd0fc, 0x1130, 0x0020, 0x7814, 0xc0fc, 0xd0f4, 0x1108, 0xc0c4,
+       0x7816, 0x7804, 0xd08c, 0x0500, 0x00c6, 0x2061, 0x0000, 0x6018,
+       0xd084, 0x11b8, 0xae86, 0x0200, 0x00e6, 0x2071, 0x0010, 0x0120,
+       0x70db, 0x0001, 0x78e4, 0x0018, 0x70db, 0x0000, 0x78e0, 0x70c6,
+       0x70c3, 0x800e, 0x601b, 0x0001, 0x2091, 0x4080, 0x00ee, 0x00ce,
+       0x0018, 0x00ce, 0x681f, 0x000c, 0x001e, 0x70a0, 0x70a2, 0x0005,
+       0x0c26
 };
 #ifdef UNIQUE_FW_NAME
-static unsigned short   fw12160i_length01 = 0x35e6;
+static unsigned short fw12160i_length01 = 0x36c9;
 #else
-static unsigned short   risc_code_length01 = 0x35e6;
+static unsigned short risc_code_length01 = 0x36c9;
 #endif
+
index 2621e99a4311a3bfa0eead4c2119bbd8ef4ce341..784f2a04bf281376308655fbf98b42be8123dabf 100644 (file)
 
 
 /*
- *     Firmware Version 8.15.00 (14:35 Aug 22, 2000)
+ *     Firmware Version 8.15.11 (10:20 Jan 02, 2002)
  */
 
 #ifdef UNIQUE_FW_NAME
-static unsigned char fw1280ei_version_str[] = {8,15,0};
+static unsigned char fw1280ei_version_str[] = {8,15,11};
 #else
-static unsigned char firmware_version[] = {8,15,0};
+static unsigned char firmware_version[] = {8,15,11};
 #endif
 
 #ifdef UNIQUE_FW_NAME
-#define fw1280ei_VERSION_STRING "8.15.00"
+#define fw1280ei_VERSION_STRING "8.15.11"
 #else
-#define FW_VERSION_STRING "8.15.00"
+#define FW_VERSION_STRING "8.15.11"
 #endif
 
 #ifdef UNIQUE_FW_NAME
-static unsigned short fw1280ei_addr01 = 0x1000;
+static unsigned short fw1280ei_addr01 = 0x1000 ;
 #else
-static unsigned short risc_code_addr01 = 0x1000;
+static unsigned short risc_code_addr01 = 0x1000 ;
 #endif
 
 #ifdef UNIQUE_FW_NAME
@@ -49,7 +49,7 @@ static unsigned short fw1280ei_code01[] = {
 #else
 static unsigned short risc_code01[] = {
 #endif
-       0x0078, 0x1041, 0x0000, 0x3d3b, 0x0000, 0x2043, 0x4f50, 0x5952,
+       0x0078, 0x1041, 0x0000, 0x3e2e, 0x0000, 0x2043, 0x4f50, 0x5952,
        0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31,
        0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320,
        0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350,
@@ -57,7 +57,7 @@ static unsigned short risc_code01[] = {
        0x6572, 0x7369, 0x6f6e, 0x2030, 0x382e, 0x3135, 0x2020, 0x2043,
        0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3030, 0x2050,
        0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020, 0x3030, 0x2020,
-       0x2400, 0x20c9, 0x97ff, 0x2001, 0x04fc, 0x2004, 0xa086, 0x1080,
+       0x2400, 0x20c9, 0x98ff, 0x2001, 0x04fc, 0x2004, 0xa086, 0x1080,
        0x00c0, 0x1054, 0x2071, 0x0100, 0x70a0, 0x70a2, 0x20c1, 0x0010,
        0x2089, 0x1374, 0x0078, 0x106d, 0x2001, 0x04fc, 0x2004, 0xa086,
        0x1280, 0x00c0, 0x1069, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2071,
@@ -70,1660 +70,1670 @@ static unsigned short risc_code01[] = {
        0xa286, 0xa5a5, 0x0040, 0x10a4, 0xa386, 0x000f, 0x0040, 0x10a0,
        0x2c6a, 0x2a5a, 0x20c1, 0x0020, 0x2019, 0x000f, 0x0078, 0x1080,
        0x2c6a, 0x2a5a, 0x0078, 0x10a2, 0x2c6a, 0x2a5a, 0x2130, 0x2128,
-       0xa1a2, 0x4e00, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424,
-       0xa192, 0x9800, 0x2009, 0x0000, 0x2001, 0x0032, 0x1078, 0x207a,
-       0x2218, 0x2079, 0x4e00, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9,
+       0xa1a2, 0x4f00, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424,
+       0xa192, 0x9900, 0x2009, 0x0000, 0x2001, 0x0032, 0x1078, 0x20c1,
+       0x2218, 0x2079, 0x4f00, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9,
        0x0040, 0x42a4, 0x8109, 0x00c0, 0x10bf, 0x2009, 0xff00, 0x3400,
        0xa102, 0x0048, 0x10cf, 0x0040, 0x10cf, 0x20a8, 0x42a4, 0x2001,
        0x04fc, 0x2004, 0xa086, 0x1080, 0x00c0, 0x10e5, 0x2071, 0x0100,
-       0x0d7e, 0x2069, 0x4e40, 0x1078, 0x4cdd, 0x0d7f, 0x7810, 0xc0ed,
+       0x0d7e, 0x2069, 0x4f40, 0x1078, 0x4db0, 0x0d7f, 0x7810, 0xc0ed,
        0x7812, 0x781b, 0x0064, 0x0078, 0x110a, 0x2001, 0x04fc, 0x2004,
        0xa086, 0x1280, 0x00c0, 0x1105, 0x7814, 0xc0ed, 0xc0d5, 0x7816,
-       0x781b, 0x0064, 0x2071, 0x0200, 0x0d7e, 0x2069, 0x4e40, 0x1078,
-       0x4cdd, 0x2069, 0x4e80, 0x2071, 0x0100, 0x1078, 0x4cdd, 0x7814,
+       0x781b, 0x0064, 0x2071, 0x0200, 0x0d7e, 0x2069, 0x4f40, 0x1078,
+       0x4db0, 0x2069, 0x4f80, 0x2071, 0x0100, 0x1078, 0x4db0, 0x7814,
        0xc0d4, 0x7816, 0x0d7f, 0x0078, 0x110a, 0x7814, 0xc0e5, 0x7816,
        0x781b, 0x003c, 0x7eca, 0x7cc2, 0x7bc6, 0x7867, 0x0000, 0x7800,
        0xc08d, 0x7802, 0x2031, 0x0030, 0x78af, 0x0101, 0x7823, 0x0002,
-       0x7827, 0x0002, 0x2009, 0x0002, 0x2069, 0x4e40, 0x681b, 0x0003,
+       0x7827, 0x0002, 0x2009, 0x0002, 0x2069, 0x4f40, 0x681b, 0x0003,
        0x6823, 0x0007, 0x6827, 0x00fa, 0x682b, 0x0008, 0x682f, 0x0028,
        0x6837, 0x0000, 0x683b, 0x0006, 0x6833, 0x0008, 0x683f, 0x0000,
-       0x8109, 0x0040, 0x115e, 0x68d3, 0x000a, 0x68c3, 0x4ec0, 0x2079,
-       0x4e00, 0x7814, 0xd0e4, 0x00c0, 0x1144, 0xd0ec, 0x00c0, 0x1148,
+       0x8109, 0x0040, 0x115e, 0x68d3, 0x000a, 0x68c3, 0x4fc0, 0x2079,
+       0x4f00, 0x7814, 0xd0e4, 0x00c0, 0x1144, 0xd0ec, 0x00c0, 0x1148,
        0x68d7, 0x7329, 0x0078, 0x114a, 0x68d7, 0x730d, 0x0078, 0x114a,
-       0x68d7, 0x732d, 0x68c7, 0x53c0, 0x68cb, 0x52c0, 0x68cf, 0x93c0,
-       0x68ab, 0x9644, 0x68af, 0x9649, 0x68b3, 0x9644, 0x68b7, 0x9644,
-       0x68a7, 0x0001, 0x2069, 0x4e80, 0x0078, 0x111e, 0x68d3, 0x000a,
-       0x68c3, 0x50c0, 0x7814, 0xd0e4, 0x00c0, 0x116a, 0x68d7, 0x7439,
-       0x0078, 0x116c, 0x68d7, 0x7419, 0x68c7, 0x73c0, 0x68cb, 0x5340,
-       0x68cf, 0x94d0, 0x68ab, 0x9649, 0x68af, 0x964e, 0x68b3, 0x9649,
-       0x68b7, 0x9649, 0x68a7, 0x0001, 0x7810, 0xd0ec, 0x00c0, 0x11c2,
-       0x7814, 0xd0e4, 0x00c0, 0x11b4, 0x0e7e, 0x2069, 0x52c0, 0x2071,
+       0x68d7, 0x732d, 0x68c7, 0x54c0, 0x68cb, 0x53c0, 0x68cf, 0x94c0,
+       0x68ab, 0x9744, 0x68af, 0x9749, 0x68b3, 0x9744, 0x68b7, 0x9744,
+       0x68a7, 0x0001, 0x2069, 0x4f80, 0x0078, 0x111e, 0x68d3, 0x000a,
+       0x68c3, 0x51c0, 0x7814, 0xd0e4, 0x00c0, 0x116a, 0x68d7, 0x7439,
+       0x0078, 0x116c, 0x68d7, 0x7419, 0x68c7, 0x74c0, 0x68cb, 0x5440,
+       0x68cf, 0x95d0, 0x68ab, 0x9749, 0x68af, 0x974e, 0x68b3, 0x9749,
+       0x68b7, 0x9749, 0x68a7, 0x0001, 0x7810, 0xd0ec, 0x00c0, 0x11c2,
+       0x7814, 0xd0e4, 0x00c0, 0x11b4, 0x0e7e, 0x2069, 0x53c0, 0x2071,
        0x0200, 0x70ec, 0xd0e4, 0x00c0, 0x1195, 0x2019, 0x0c0c, 0x2021,
-       0x000c, 0x1078, 0x2009, 0x0078, 0x119b, 0x2019, 0x0c0a, 0x2021,
-       0x000a, 0x1078, 0x2009, 0x2069, 0x5340, 0x2071, 0x0100, 0x70ec,
+       0x000c, 0x1078, 0x2050, 0x0078, 0x119b, 0x2019, 0x0c0a, 0x2021,
+       0x000a, 0x1078, 0x2050, 0x2069, 0x5440, 0x2071, 0x0100, 0x70ec,
        0xd0e4, 0x00c0, 0x11ab, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x1078,
-       0x2009, 0x0078, 0x11b1, 0x2019, 0x0c0a, 0x2021, 0x000a, 0x1078,
-       0x2009, 0x0e7f, 0x0078, 0x11db, 0x2019, 0x0c0c, 0x2021, 0x000c,
-       0x2069, 0x52c0, 0x1078, 0x2009, 0x2069, 0x5340, 0x1078, 0x2009,
-       0x0078, 0x11db, 0x2069, 0x52c0, 0x0e7e, 0x2071, 0x0100, 0x70ec,
+       0x2050, 0x0078, 0x11b1, 0x2019, 0x0c0a, 0x2021, 0x000a, 0x1078,
+       0x2050, 0x0e7f, 0x0078, 0x11db, 0x2019, 0x0c0c, 0x2021, 0x000c,
+       0x2069, 0x53c0, 0x1078, 0x2050, 0x2069, 0x5440, 0x1078, 0x2050,
+       0x0078, 0x11db, 0x2069, 0x53c0, 0x0e7e, 0x2071, 0x0100, 0x70ec,
        0xd0e4, 0x00c0, 0x11d4, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x1078,
-       0x2009, 0x0e7f, 0x0078, 0x11db, 0x2019, 0x0c0a, 0x2021, 0x000a,
-       0x1078, 0x2009, 0x0e7f, 0x2011, 0x0002, 0x2069, 0x53c0, 0x2009,
+       0x2050, 0x0e7f, 0x0078, 0x11db, 0x2019, 0x0c0a, 0x2021, 0x000a,
+       0x1078, 0x2050, 0x0e7f, 0x2011, 0x0002, 0x2069, 0x54c0, 0x2009,
        0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bc8,
        0xa386, 0xfeff, 0x00c0, 0x11f2, 0x6817, 0x0100, 0x681f, 0x0064,
        0x0078, 0x11f6, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010,
        0x00f0, 0x11e3, 0x8109, 0x00c0, 0x11e1, 0x8211, 0x0040, 0x1204,
-       0x2069, 0x73c0, 0x0078, 0x11df, 0x1078, 0x265b, 0x1078, 0x468e,
-       0x1078, 0x1dd4, 0x1078, 0x4c6f, 0x2091, 0x2100, 0x2079, 0x4e00,
+       0x2069, 0x74c0, 0x0078, 0x11df, 0x1078, 0x26a2, 0x1078, 0x4712,
+       0x1078, 0x1e1b, 0x1078, 0x4d42, 0x2091, 0x2100, 0x2079, 0x4f00,
        0x7810, 0xd0ec, 0x0040, 0x1218, 0x2071, 0x0020, 0x0078, 0x121a,
-       0x2071, 0x0050, 0x2091, 0x2200, 0x2079, 0x4e00, 0x2071, 0x0020,
-       0x2091, 0x2300, 0x2079, 0x4e00, 0x7810, 0xd0ec, 0x0040, 0x122c,
-       0x2079, 0x0100, 0x0078, 0x122e, 0x2079, 0x0200, 0x2071, 0x4e40,
-       0x2091, 0x2400, 0x2079, 0x0100, 0x2071, 0x4e80, 0x2091, 0x2000,
-       0x2079, 0x4e00, 0x2071, 0x0010, 0x3200, 0xa085, 0x303d, 0x2090,
+       0x2071, 0x0050, 0x2091, 0x2200, 0x2079, 0x4f00, 0x2071, 0x0020,
+       0x2091, 0x2300, 0x2079, 0x4f00, 0x7810, 0xd0ec, 0x0040, 0x122c,
+       0x2079, 0x0100, 0x0078, 0x122e, 0x2079, 0x0200, 0x2071, 0x4f40,
+       0x2091, 0x2400, 0x2079, 0x0100, 0x2071, 0x4f80, 0x2091, 0x2000,
+       0x2079, 0x4f00, 0x2071, 0x0010, 0x3200, 0xa085, 0x303d, 0x2090,
        0x2071, 0x0010, 0x70c3, 0x0000, 0x0090, 0x124d, 0x70c0, 0xa086,
-       0x0002, 0x00c0, 0x124d, 0x1078, 0x15ba, 0x2039, 0x0000, 0x7810,
+       0x0002, 0x00c0, 0x124d, 0x1078, 0x15c1, 0x2039, 0x0000, 0x7810,
        0xd0ec, 0x00c0, 0x12cf, 0x1078, 0x148e, 0x78ac, 0xa005, 0x00c0,
        0x126b, 0x0068, 0x1261, 0x786c, 0xa065, 0x0040, 0x1261, 0x1078,
-       0x2395, 0x1078, 0x20a1, 0x0068, 0x1278, 0x786c, 0xa065, 0x0040,
-       0x126b, 0x1078, 0x2395, 0x0068, 0x1278, 0x2009, 0x4e47, 0x2011,
-       0x4e87, 0x2104, 0x220c, 0xa105, 0x0040, 0x1278, 0x1078, 0x1f0a,
-       0x2071, 0x4e40, 0x70a4, 0xa005, 0x0040, 0x129d, 0x7450, 0xa485,
+       0x23dc, 0x1078, 0x20e8, 0x0068, 0x1278, 0x786c, 0xa065, 0x0040,
+       0x126b, 0x1078, 0x23dc, 0x0068, 0x1278, 0x2009, 0x4f47, 0x2011,
+       0x4f87, 0x2104, 0x220c, 0xa105, 0x0040, 0x1278, 0x1078, 0x1f51,
+       0x2071, 0x4f40, 0x70a4, 0xa005, 0x0040, 0x129d, 0x7450, 0xa485,
        0x0000, 0x0040, 0x129d, 0x2079, 0x0200, 0x2091, 0x8000, 0x72d4,
-       0xa28c, 0x303d, 0x2190, 0x1078, 0x2b6a, 0x2091, 0x8000, 0x2091,
-       0x303d, 0x0068, 0x129d, 0x2079, 0x4e00, 0x786c, 0xa065, 0x0040,
-       0x129d, 0x2071, 0x0010, 0x1078, 0x2395, 0x00e0, 0x12a5, 0x2079,
-       0x4e00, 0x2071, 0x0010, 0x1078, 0x4a43, 0x2071, 0x4e80, 0x70a4,
+       0xa28c, 0x303d, 0x2190, 0x1078, 0x2bb1, 0x2091, 0x8000, 0x2091,
+       0x303d, 0x0068, 0x129d, 0x2079, 0x4f00, 0x786c, 0xa065, 0x0040,
+       0x129d, 0x2071, 0x0010, 0x1078, 0x23dc, 0x00e0, 0x12a5, 0x2079,
+       0x4f00, 0x2071, 0x0010, 0x1078, 0x4b16, 0x2071, 0x4f80, 0x70a4,
        0xa005, 0x0040, 0x12bd, 0x7050, 0xa025, 0x0040, 0x12bd, 0x2079,
        0x0100, 0x2091, 0x8000, 0x72d4, 0xa28c, 0x303d, 0x2190, 0x1078,
-       0x2b6a, 0x2091, 0x8000, 0x2091, 0x303d, 0x2079, 0x4e00, 0x2071,
+       0x2bb1, 0x2091, 0x8000, 0x2091, 0x303d, 0x2079, 0x4f00, 0x2071,
        0x0010, 0x0068, 0x12c9, 0x786c, 0xa065, 0x0040, 0x12c9, 0x1078,
-       0x2395, 0x00e0, 0x1253, 0x1078, 0x4a43, 0x0078, 0x1253, 0x1078,
+       0x23dc, 0x00e0, 0x1253, 0x1078, 0x4b16, 0x0078, 0x1253, 0x1078,
        0x148e, 0x78ac, 0xa005, 0x00c0, 0x12e7, 0x0068, 0x12dd, 0x786c,
-       0xa065, 0x0040, 0x12dd, 0x1078, 0x2395, 0x1078, 0x20a1, 0x0068,
-       0x12f1, 0x786c, 0xa065, 0x0040, 0x12e7, 0x1078, 0x2395, 0x0068,
-       0x12f1, 0x2009, 0x4e47, 0x2104, 0xa005, 0x0040, 0x12f1, 0x1078,
-       0x1f0a, 0x2071, 0x4e40, 0x70a4, 0xa005, 0x0040, 0x130c, 0x7450,
+       0xa065, 0x0040, 0x12dd, 0x1078, 0x23dc, 0x1078, 0x20e8, 0x0068,
+       0x12f1, 0x786c, 0xa065, 0x0040, 0x12e7, 0x1078, 0x23dc, 0x0068,
+       0x12f1, 0x2009, 0x4f47, 0x2104, 0xa005, 0x0040, 0x12f1, 0x1078,
+       0x1f51, 0x2071, 0x4f40, 0x70a4, 0xa005, 0x0040, 0x130c, 0x7450,
        0xa485, 0x0000, 0x0040, 0x130c, 0x2079, 0x0100, 0x2091, 0x8000,
-       0x72d4, 0xa28c, 0x303d, 0x2190, 0x1078, 0x2b6a, 0x2091, 0x8000,
-       0x2091, 0x303d, 0x2079, 0x4e00, 0x2071, 0x0010, 0x0068, 0x1316,
-       0x786c, 0xa065, 0x0040, 0x1316, 0x1078, 0x2395, 0x00e0, 0x12cf,
-       0x1078, 0x4a43, 0x0078, 0x12cf, 0x133c, 0x133c, 0x133e, 0x133e,
+       0x72d4, 0xa28c, 0x303d, 0x2190, 0x1078, 0x2bb1, 0x2091, 0x8000,
+       0x2091, 0x303d, 0x2079, 0x4f00, 0x2071, 0x0010, 0x0068, 0x1316,
+       0x786c, 0xa065, 0x0040, 0x1316, 0x1078, 0x23dc, 0x00e0, 0x12cf,
+       0x1078, 0x4b16, 0x0078, 0x12cf, 0x133c, 0x133c, 0x133e, 0x133e,
        0x134b, 0x134b, 0x134b, 0x134b, 0x1356, 0x1356, 0x1363, 0x1363,
        0x134b, 0x134b, 0x134b, 0x134b, 0x133c, 0x133c, 0x133e, 0x133e,
        0x134b, 0x134b, 0x134b, 0x134b, 0x1356, 0x1356, 0x1363, 0x1363,
        0x134b, 0x134b, 0x134b, 0x134b, 0x0078, 0x133c, 0x007e, 0x107e,
-       0x127e, 0x2091, 0x2400, 0x1078, 0x298a, 0x127f, 0x107f, 0x007f,
+       0x127e, 0x2091, 0x2400, 0x1078, 0x29d1, 0x127f, 0x107f, 0x007f,
        0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13c8,
        0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e,
-       0x127e, 0x2091, 0x2300, 0x1078, 0x298a, 0x127f, 0x107f, 0x007f,
+       0x127e, 0x2091, 0x2300, 0x1078, 0x29d1, 0x127f, 0x107f, 0x007f,
        0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300,
-       0x1078, 0x298a, 0x2091, 0x2400, 0x1078, 0x298a, 0x127f, 0x107f,
+       0x1078, 0x29d1, 0x2091, 0x2400, 0x1078, 0x29d1, 0x127f, 0x107f,
        0x007f, 0x2091, 0x8001, 0x007c, 0x1394, 0x1394, 0x1396, 0x1396,
        0x13a3, 0x13a3, 0x13a3, 0x13a3, 0x13ae, 0x13ae, 0x1396, 0x1396,
        0x13a3, 0x13a3, 0x13a3, 0x13a3, 0x13af, 0x13af, 0x13af, 0x13af,
        0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af,
        0x13af, 0x13af, 0x13af, 0x13af, 0x0078, 0x1394, 0x007e, 0x107e,
-       0x127e, 0x2091, 0x2300, 0x1078, 0x298a, 0x127f, 0x107f, 0x007f,
+       0x127e, 0x2091, 0x2300, 0x1078, 0x29d1, 0x127f, 0x107f, 0x007f,
        0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13d5,
        0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007c, 0x107e,
        0x127e, 0x0d7e, 0x0e7e, 0x0f7e, 0x007e, 0x2071, 0x0100, 0x2069,
-       0x4e40, 0x2079, 0x4e00, 0x70ec, 0xa084, 0x1c00, 0x78e2, 0x1078,
-       0x4cdd, 0x007f, 0x0f7f, 0x0e7f, 0x0d7f, 0x127f, 0x107f, 0x007c,
+       0x4f40, 0x2079, 0x4f00, 0x70ec, 0xa084, 0x1c00, 0x78e2, 0x1078,
+       0x4db0, 0x007f, 0x0f7f, 0x0e7f, 0x0d7f, 0x127f, 0x107f, 0x007c,
        0x3c00, 0xa084, 0x0007, 0x0079, 0x13cd, 0x13de, 0x13de, 0x13e0,
        0x13e0, 0x13e5, 0x13e5, 0x13ea, 0x13ea, 0x3c00, 0xa084, 0x0003,
-       0x0079, 0x13da, 0x13de, 0x13de, 0x13f3, 0x13f3, 0x1078, 0x296b,
-       0x2091, 0x2200, 0x1078, 0x4768, 0x007c, 0x2091, 0x2100, 0x1078,
-       0x4768, 0x007c, 0x2091, 0x2100, 0x1078, 0x4768, 0x2091, 0x2200,
-       0x1078, 0x4768, 0x007c, 0x2091, 0x2100, 0x1078, 0x4768, 0x007c,
+       0x0079, 0x13da, 0x13de, 0x13de, 0x13f3, 0x13f3, 0x1078, 0x29b2,
+       0x2091, 0x2200, 0x1078, 0x47ec, 0x007c, 0x2091, 0x2100, 0x1078,
+       0x47ec, 0x007c, 0x2091, 0x2100, 0x1078, 0x47ec, 0x2091, 0x2200,
+       0x1078, 0x47ec, 0x007c, 0x2091, 0x2100, 0x1078, 0x47ec, 0x007c,
        0x1418, 0x1418, 0x141a, 0x141a, 0x1427, 0x1427, 0x1427, 0x1427,
        0x1432, 0x1432, 0x143f, 0x143f, 0x1427, 0x1427, 0x1427, 0x1427,
        0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450,
        0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450,
        0x0078, 0x1418, 0x007e, 0x107e, 0x127e, 0x2091, 0x2400, 0x1078,
-       0x298a, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e,
+       0x29d1, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e,
        0x107e, 0x127e, 0x1078, 0x13c8, 0x127f, 0x107f, 0x007f, 0x2091,
        0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, 0x1078,
-       0x298a, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e,
-       0x107e, 0x127e, 0x2091, 0x2300, 0x1078, 0x298a, 0x2091, 0x2400,
-       0x1078, 0x298a, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c,
-       0x007e, 0x107e, 0x127e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2079, 0x4e00,
-       0x2071, 0x0200, 0x2069, 0x4e40, 0x3d00, 0xd08c, 0x0040, 0x1466,
-       0x70ec, 0xa084, 0x1c00, 0x78e2, 0x1078, 0x4cdd, 0x3d00, 0xd084,
-       0x0040, 0x1474, 0x2069, 0x4e80, 0x2071, 0x0100, 0x70ec, 0xa084,
-       0x1c00, 0x78e6, 0x1078, 0x4cdd, 0x0f7f, 0x0e7f, 0x0d7f, 0x127f,
+       0x29d1, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e,
+       0x107e, 0x127e, 0x2091, 0x2300, 0x1078, 0x29d1, 0x2091, 0x2400,
+       0x1078, 0x29d1, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c,
+       0x007e, 0x107e, 0x127e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2079, 0x4f00,
+       0x2071, 0x0200, 0x2069, 0x4f40, 0x3d00, 0xd08c, 0x0040, 0x1466,
+       0x70ec, 0xa084, 0x1c00, 0x78e2, 0x1078, 0x4db0, 0x3d00, 0xd084,
+       0x0040, 0x1474, 0x2069, 0x4f80, 0x2071, 0x0100, 0x70ec, 0xa084,
+       0x1c00, 0x78e6, 0x1078, 0x4db0, 0x0f7f, 0x0e7f, 0x0d7f, 0x127f,
        0x107f, 0x007f, 0x007c, 0x7008, 0x800b, 0x00c8, 0x1489, 0x7007,
        0x0002, 0xa08c, 0x01e0, 0x00c0, 0x148a, 0xd09c, 0x0040, 0x1489,
-       0x087a, 0x097a, 0x70c3, 0x4002, 0x0078, 0x15bd, 0x0068, 0x1513,
-       0x2061, 0x0000, 0x6018, 0xd084, 0x00c0, 0x1513, 0x7828, 0xa005,
-       0x00c0, 0x149e, 0x0010, 0x1514, 0x0078, 0x1513, 0x7910, 0xd1f4,
-       0x0040, 0x14a6, 0x2001, 0x4007, 0x0078, 0x15bc, 0x7914, 0xd1ec,
-       0x0040, 0x14c1, 0xd0fc, 0x0040, 0x14b7, 0x007e, 0x1078, 0x1d64,
-       0x007f, 0x0040, 0x14c1, 0x2001, 0x4007, 0x0078, 0x15bc, 0x007e,
-       0x1078, 0x1d54, 0x007f, 0x0040, 0x14c1, 0x2001, 0x4007, 0x0078,
-       0x15bc, 0x7910, 0xd0fc, 0x00c0, 0x14cb, 0x2061, 0x4e40, 0xc19c,
-       0xc7fc, 0x0078, 0x14cf, 0x2061, 0x4e80, 0xc19d, 0xc7fd, 0x6064,
-       0xa005, 0x00c0, 0x1513, 0x7912, 0x6083, 0x0000, 0x7828, 0xc0fc,
-       0xa086, 0x0018, 0x00c0, 0x14e0, 0x0c7e, 0x1078, 0x1b5b, 0x0c7f,
-       0x782b, 0x0000, 0x607c, 0xa065, 0x0040, 0x14f9, 0x0c7e, 0x609c,
-       0x1078, 0x1e49, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1c84, 0x2009,
-       0x0018, 0x6087, 0x0103, 0x1078, 0x1d74, 0x00c0, 0x150d, 0x1078,
-       0x1dc6, 0x7810, 0xd09c, 0x00c0, 0x1501, 0x2061, 0x4e40, 0x0078,
-       0x1505, 0x2061, 0x4e80, 0xc09c, 0x7812, 0x607f, 0x0000, 0x60d4,
-       0xd0dc, 0x0040, 0x1511, 0xc0dc, 0x60d6, 0x2001, 0x4005, 0x0078,
-       0x15bc, 0x0078, 0x15ba, 0x007c, 0x7810, 0xd0f4, 0x0040, 0x151c,
-       0x2001, 0x4007, 0x0078, 0x15bc, 0xa006, 0x70c2, 0x70c6, 0x70ca,
-       0x70ce, 0x70da, 0x70c0, 0xa03d, 0xa08a, 0x0040, 0x00c8, 0x152a,
-       0x0079, 0x1531, 0x2100, 0xa08a, 0x0040, 0x00c8, 0x15c8, 0x0079,
-       0x1571, 0x15ba, 0x1610, 0x15d9, 0x1648, 0x1680, 0x1680, 0x15d0,
-       0x1c9c, 0x168b, 0x15c8, 0x15dd, 0x15df, 0x15e1, 0x15e3, 0x1ca1,
-       0x15c8, 0x1699, 0x16f6, 0x1b7b, 0x1c96, 0x15e5, 0x19c0, 0x1a02,
-       0x1a3d, 0x1a8e, 0x197b, 0x1988, 0x199c, 0x19af, 0x17cb, 0x15c8,
-       0x172d, 0x173a, 0x1746, 0x1752, 0x1768, 0x1774, 0x1777, 0x1783,
-       0x178f, 0x1797, 0x17b3, 0x17bf, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
-       0x17d8, 0x17ea, 0x1806, 0x183c, 0x1864, 0x1874, 0x1877, 0x18a8,
-       0x18d9, 0x18eb, 0x194a, 0x195a, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
-       0x196a, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x1cc6, 0x1ccc,
-       0x15c8, 0x15c8, 0x15c8, 0x1cd0, 0x1d15, 0x15c8, 0x15c8, 0x15c8,
-       0x15c8, 0x160a, 0x167a, 0x1693, 0x16f0, 0x1b75, 0x15c8, 0x15c8,
-       0x1b3e, 0x15c8, 0x1d19, 0x1cb8, 0x1cc2, 0x15c8, 0x15c8, 0x15c8,
-       0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
-       0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
-       0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
-       0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
-       0x15c8, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078, 0x15bc, 0x73ce,
-       0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068, 0x15bd, 0x2061,
-       0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x007c,
-       0x70c3, 0x4001, 0x0078, 0x15bd, 0x70c3, 0x4006, 0x0078, 0x15bd,
-       0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078,
-       0x15ba, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x15ba, 0x0078,
-       0x15ba, 0x0078, 0x15ba, 0x0078, 0x15ba, 0x2091, 0x8000, 0x70c3,
-       0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3,
-       0x0008, 0x2001, 0x000f, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001,
-       0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x041a, 0x2051, 0x0445,
-       0x2061, 0x0447, 0x20c1, 0x0020, 0x2091, 0x5000, 0x2091, 0x4080,
-       0x0078, 0x0418, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1613,
-       0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0,
-       0x2099, 0x0030, 0x7003, 0x0001, 0x7007, 0x0006, 0x731a, 0x721e,
-       0x7422, 0x7526, 0x2021, 0x0040, 0x81ff, 0x0040, 0x15ba, 0xa182,
-       0x0040, 0x00c8, 0x162d, 0x2120, 0xa006, 0x2008, 0x8403, 0x7012,
-       0x7007, 0x0004, 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0040, 0x1634,
-       0x7007, 0x0002, 0xa084, 0x01e0, 0x0040, 0x1642, 0x70c3, 0x4002,
-       0x0078, 0x15bd, 0x24a8, 0x53a5, 0x0078, 0x1624, 0x0078, 0x15ba,
-       0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x2098,
-       0x20a1, 0x0030, 0x7003, 0x0000, 0x7007, 0x0006, 0x731a, 0x721e,
-       0x7422, 0x7526, 0x2021, 0x0040, 0x7007, 0x0006, 0x81ff, 0x0040,
-       0x15ba, 0xa182, 0x0040, 0x00c8, 0x1667, 0x2120, 0xa006, 0x2008,
-       0x8403, 0x7012, 0x24a8, 0x53a6, 0x7007, 0x0001, 0x7008, 0xd0fc,
-       0x0040, 0x166e, 0xa084, 0x01e0, 0x0040, 0x165c, 0x70c3, 0x4002,
-       0x0078, 0x15bd, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x164b,
-       0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x00c0, 0x1688, 0x200a,
-       0x72ca, 0x0078, 0x15b9, 0x70c7, 0x0008, 0x70cb, 0x000f, 0x70cf,
-       0x0000, 0x0078, 0x15ba, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078,
-       0x169c, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0,
-       0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x16eb, 0xa40a,
-       0x0040, 0x16ac, 0x00c8, 0x16b5, 0x8001, 0x7872, 0xa084, 0xfc00,
-       0x0040, 0x16b9, 0x78ac, 0xc085, 0x78ae, 0x2001, 0x4005, 0x0078,
-       0x15bc, 0x7b7e, 0x7a7a, 0x7e86, 0x7d82, 0x7c76, 0xa48c, 0xff00,
-       0x0040, 0x16d1, 0x8407, 0x8004, 0x8004, 0x810c, 0x810c, 0x810f,
-       0xa118, 0xa291, 0x0000, 0xa6b1, 0x0000, 0xa581, 0x0000, 0x0078,
-       0x16db, 0x8407, 0x8004, 0x8004, 0xa318, 0xa291, 0x0000, 0xa6b1,
-       0x0000, 0xa581, 0x0000, 0x731a, 0x721e, 0x7622, 0x7026, 0xa605,
-       0x0040, 0x16e5, 0x7a10, 0xc2c5, 0x7a12, 0x78ac, 0xa084, 0xfffc,
-       0x78ae, 0x0078, 0x16ee, 0x78ac, 0xc085, 0x78ae, 0x0078, 0x15ba,
-       0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x16f9, 0x2029, 0x0000,
-       0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce,
-       0x74d6, 0xa005, 0x0040, 0x1728, 0xa40a, 0x0040, 0x1709, 0x00c8,
-       0x15bc, 0x8001, 0x7892, 0xa084, 0xfc00, 0x0040, 0x1716, 0x78ac,
-       0xc0c5, 0x78ae, 0x2001, 0x4005, 0x0078, 0x15bc, 0x7a9a, 0x7b9e,
-       0x7da2, 0x7ea6, 0x2600, 0xa505, 0x0040, 0x1721, 0x7a10, 0xc2c5,
-       0x7a12, 0x7c96, 0x78ac, 0xa084, 0xfcff, 0x78ae, 0x0078, 0x172b,
-       0x78ac, 0xc0c5, 0x78ae, 0x0078, 0x15ba, 0x2009, 0x0000, 0x786c,
-       0xa065, 0x0040, 0x1737, 0x8108, 0x6000, 0x0078, 0x1730, 0x7ac4,
-       0x0078, 0x15b8, 0x2009, 0x4e48, 0x210c, 0x7810, 0xd0ec, 0x00c0,
-       0x15b9, 0x2011, 0x4e88, 0x2214, 0x0078, 0x15b8, 0x2009, 0x4e49,
-       0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2011, 0x4e89, 0x2214,
-       0x0078, 0x15b8, 0x2061, 0x4e40, 0x6128, 0x622c, 0x8214, 0x8214,
-       0x8214, 0x7810, 0xd0ec, 0x00c0, 0x1766, 0x2061, 0x4e80, 0x6328,
-       0x73da, 0x632c, 0x831c, 0x831c, 0x831c, 0x73de, 0x0078, 0x15b8,
-       0x2009, 0x4e4c, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2011,
-       0x4e8c, 0x2214, 0x0078, 0x15b8, 0x7918, 0x0078, 0x15b9, 0x2009,
-       0x4e4d, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2011, 0x4e8d,
-       0x2214, 0x0078, 0x15b8, 0x2009, 0x4e4e, 0x210c, 0x7810, 0xd0ec,
-       0x00c0, 0x15b9, 0x2011, 0x4e8e, 0x2214, 0x0078, 0x15b8, 0x7920,
-       0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x7a24, 0x0078, 0x15b8, 0x71c4,
-       0xd1fc, 0x00c0, 0x179f, 0x2011, 0x52c0, 0x0078, 0x17a1, 0x2011,
-       0x5340, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268,
-       0x6a00, 0x6804, 0xd09c, 0x0040, 0x17b0, 0x6b08, 0x0078, 0x17b1,
-       0x6b0c, 0x0078, 0x15b7, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000,
-       0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0078, 0x15b7, 0x2061,
-       0x4e40, 0x6118, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2061, 0x4e80,
-       0x6218, 0x0078, 0x15b8, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000,
-       0x6908, 0x6a18, 0x6b10, 0x77da, 0x2091, 0x8001, 0x0078, 0x15b7,
-       0x71c4, 0x2110, 0xa294, 0x000f, 0xa282, 0x0010, 0x00c8, 0x15b2,
-       0x1078, 0x277f, 0xa384, 0x4000, 0x0040, 0x17e8, 0xa295, 0x0020,
-       0x0078, 0x15b7, 0x71c4, 0x2100, 0xc0bc, 0xa082, 0x0010, 0x00c8,
-       0x15b2, 0xd1bc, 0x00c0, 0x17f9, 0x2011, 0x4e48, 0x2204, 0x0078,
-       0x17fd, 0x2011, 0x4e88, 0x2204, 0xc0bd, 0x007e, 0x2100, 0xc0bc,
-       0x2012, 0x1078, 0x26dc, 0x017f, 0x0078, 0x15b9, 0x71c4, 0x2021,
-       0x4e49, 0x2404, 0x70c6, 0x2019, 0x0000, 0x0078, 0x1815, 0x71c8,
-       0x2021, 0x4e89, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x1834, 0x20a9,
-       0x0008, 0x2204, 0xa106, 0x0040, 0x1824, 0x8210, 0x00f0, 0x1819,
-       0x71c4, 0x72c8, 0x0078, 0x15b1, 0xa292, 0x1834, 0x027e, 0x2122,
-       0x017f, 0x1078, 0x26fd, 0x7810, 0xd0ec, 0x00c0, 0x1832, 0xd3fc,
-       0x0040, 0x180f, 0x0078, 0x15ba, 0x03e8, 0x00fa, 0x01f4, 0x02ee,
-       0x0004, 0x0001, 0x0002, 0x0003, 0x2061, 0x4e40, 0x6128, 0x622c,
+       0x087a, 0x097a, 0x70c3, 0x4002, 0x0078, 0x15c4, 0x0068, 0x151a,
+       0x2061, 0x0000, 0x6018, 0xd084, 0x00c0, 0x151a, 0x7828, 0xa005,
+       0x00c0, 0x149e, 0x0010, 0x151b, 0x0078, 0x151a, 0x7910, 0xd1f4,
+       0x0040, 0x14a4, 0x0078, 0x14b9, 0x7914, 0xd1ec, 0x0040, 0x14bd,
+       0xd0fc, 0x0040, 0x14b3, 0x007e, 0x1078, 0x1dae, 0x007f, 0x0040,
+       0x14bd, 0x0078, 0x14b9, 0x007e, 0x1078, 0x1da1, 0x007f, 0x0040,
+       0x14bd, 0x2001, 0x4007, 0x0078, 0x15c3, 0x7910, 0xd0fc, 0x00c0,
+       0x14c7, 0x2061, 0x4f40, 0xc19c, 0xc7fc, 0x0078, 0x14cb, 0x2061,
+       0x4f80, 0xc19d, 0xc7fd, 0x6064, 0xa005, 0x00c0, 0x151a, 0x7912,
+       0x6082, 0x7828, 0xc0fc, 0xa086, 0x0018, 0x00c0, 0x14db, 0x0c7e,
+       0x1078, 0x1b85, 0x0c7f, 0x782b, 0x0000, 0x607c, 0xa065, 0x0040,
+       0x1500, 0x0c7e, 0x609c, 0x1078, 0x1e90, 0x0c7f, 0x609f, 0x0000,
+       0x1078, 0x1cd5, 0x2009, 0x0018, 0x6087, 0x0103, 0x7810, 0x007e,
+       0x84ff, 0x00c0, 0x14f6, 0x85ff, 0x0040, 0x14f8, 0xc0c5, 0x7812,
+       0x1078, 0x1dbb, 0x007f, 0x7812, 0x00c0, 0x1514, 0x1078, 0x1e0d,
+       0x7810, 0xd09c, 0x00c0, 0x1508, 0x2061, 0x4f40, 0x0078, 0x150c,
+       0x2061, 0x4f80, 0xc09c, 0x7812, 0x607f, 0x0000, 0x60d4, 0xd0dc,
+       0x0040, 0x1518, 0xc0dc, 0x60d6, 0x2001, 0x4005, 0x0078, 0x15c3,
+       0x0078, 0x15c1, 0x007c, 0x7810, 0xd0f4, 0x0040, 0x1523, 0x2001,
+       0x4007, 0x0078, 0x15c3, 0xa006, 0x70c2, 0x70c6, 0x70ca, 0x70ce,
+       0x70da, 0x70c0, 0xa03d, 0xa08a, 0x0040, 0x00c8, 0x1531, 0x0079,
+       0x1538, 0x2100, 0xa08a, 0x0040, 0x00c8, 0x15cf, 0x0079, 0x1578,
+       0x15c1, 0x1617, 0x15e0, 0x164f, 0x1687, 0x1687, 0x15d7, 0x1ced,
+       0x1692, 0x15cf, 0x15e4, 0x15e6, 0x15e8, 0x15ea, 0x1cf2, 0x15cf,
+       0x16a0, 0x16fd, 0x1ba5, 0x1ce7, 0x15ec, 0x19ea, 0x1a2c, 0x1a67,
+       0x1ab8, 0x19a5, 0x19b2, 0x19c6, 0x19d9, 0x17eb, 0x15cf, 0x1734,
+       0x1741, 0x174d, 0x1759, 0x176f, 0x177b, 0x177e, 0x178a, 0x1796,
+       0x179e, 0x17d3, 0x17df, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x17f8,
+       0x180a, 0x1826, 0x185c, 0x1884, 0x1894, 0x1897, 0x18c8, 0x18f9,
+       0x190b, 0x1974, 0x1984, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x1994,
+       0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x1d17, 0x1d1d, 0x15cf,
+       0x15cf, 0x15cf, 0x1d21, 0x1d66, 0x15cf, 0x15cf, 0x15cf, 0x15cf,
+       0x1611, 0x1681, 0x169a, 0x16f7, 0x1b9f, 0x15cf, 0x15cf, 0x1b68,
+       0x15cf, 0x1d6a, 0x1d09, 0x1d13, 0x15cf, 0x15cf, 0x15cf, 0x15cf,
+       0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf,
+       0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf,
+       0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf,
+       0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf,
+       0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078, 0x15c3, 0x73ce, 0x72ca,
+       0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068, 0x15c4, 0x2061, 0x0000,
+       0x601b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x007c, 0x70c3,
+       0x4001, 0x0078, 0x15c4, 0x70c3, 0x4006, 0x0078, 0x15c4, 0x2099,
+       0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078, 0x15c1,
+       0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x15c1, 0x0078, 0x15c1,
+       0x0078, 0x15c1, 0x0078, 0x15c1, 0x2091, 0x8000, 0x70c3, 0x0004,
+       0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0008,
+       0x2001, 0x000f, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001, 0x2031,
+       0x0030, 0x2059, 0x1000, 0x2029, 0x041a, 0x2051, 0x0445, 0x2061,
+       0x0447, 0x20c1, 0x0020, 0x2091, 0x5000, 0x2091, 0x4080, 0x0078,
+       0x0418, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x161a, 0x2029,
+       0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0, 0x2099,
+       0x0030, 0x7003, 0x0001, 0x7007, 0x0006, 0x731a, 0x721e, 0x7422,
+       0x7526, 0x2021, 0x0040, 0x81ff, 0x0040, 0x15c1, 0xa182, 0x0040,
+       0x00c8, 0x1634, 0x2120, 0xa006, 0x2008, 0x8403, 0x7012, 0x7007,
+       0x0004, 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0040, 0x163b, 0x7007,
+       0x0002, 0xa084, 0x01e0, 0x0040, 0x1649, 0x70c3, 0x4002, 0x0078,
+       0x15c4, 0x24a8, 0x53a5, 0x0078, 0x162b, 0x0078, 0x15c1, 0x2029,
+       0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x2098, 0x20a1,
+       0x0030, 0x7003, 0x0000, 0x7007, 0x0006, 0x731a, 0x721e, 0x7422,
+       0x7526, 0x2021, 0x0040, 0x7007, 0x0006, 0x81ff, 0x0040, 0x15c1,
+       0xa182, 0x0040, 0x00c8, 0x166e, 0x2120, 0xa006, 0x2008, 0x8403,
+       0x7012, 0x24a8, 0x53a6, 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0040,
+       0x1675, 0xa084, 0x01e0, 0x0040, 0x1663, 0x70c3, 0x4002, 0x0078,
+       0x15c4, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1652, 0x71c4,
+       0x70c8, 0x2114, 0xa79e, 0x0004, 0x00c0, 0x168f, 0x200a, 0x72ca,
+       0x0078, 0x15c0, 0x70c7, 0x0008, 0x70cb, 0x000f, 0x70cf, 0x000b,
+       0x0078, 0x15c1, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x16a3,
+       0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6,
+       0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x16f2, 0xa40a, 0x0040,
+       0x16b3, 0x00c8, 0x16bc, 0x8001, 0x7872, 0xa084, 0xfc00, 0x0040,
+       0x16c0, 0x78ac, 0xc085, 0x78ae, 0x2001, 0x4005, 0x0078, 0x15c3,
+       0x7b7e, 0x7a7a, 0x7e86, 0x7d82, 0x7c76, 0xa48c, 0xff00, 0x0040,
+       0x16d8, 0x8407, 0x8004, 0x8004, 0x810c, 0x810c, 0x810f, 0xa118,
+       0xa291, 0x0000, 0xa6b1, 0x0000, 0xa581, 0x0000, 0x0078, 0x16e2,
+       0x8407, 0x8004, 0x8004, 0xa318, 0xa291, 0x0000, 0xa6b1, 0x0000,
+       0xa581, 0x0000, 0x731a, 0x721e, 0x7622, 0x7026, 0xa605, 0x0040,
+       0x16ec, 0x7a10, 0xc2c5, 0x7a12, 0x78ac, 0xa084, 0xfffc, 0x78ae,
+       0x0078, 0x16f5, 0x78ac, 0xc085, 0x78ae, 0x0078, 0x15c1, 0x75d8,
+       0x76dc, 0x75da, 0x76de, 0x0078, 0x1700, 0x2029, 0x0000, 0x2530,
+       0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6,
+       0xa005, 0x0040, 0x172f, 0xa40a, 0x0040, 0x1710, 0x00c8, 0x1719,
+       0x8001, 0x7892, 0xa084, 0xfc00, 0x0040, 0x171d, 0x78ac, 0xc0c5,
+       0x78ae, 0x2001, 0x4005, 0x0078, 0x15c3, 0x7a9a, 0x7b9e, 0x7da2,
+       0x7ea6, 0x2600, 0xa505, 0x0040, 0x1728, 0x7a10, 0xc2c5, 0x7a12,
+       0x7c96, 0x78ac, 0xa084, 0xfcff, 0x78ae, 0x0078, 0x1732, 0x78ac,
+       0xc0c5, 0x78ae, 0x0078, 0x15c1, 0x2009, 0x0000, 0x786c, 0xa065,
+       0x0040, 0x173e, 0x8108, 0x6000, 0x0078, 0x1737, 0x7ac4, 0x0078,
+       0x15bf, 0x2009, 0x4f48, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15c0,
+       0x2011, 0x4f88, 0x2214, 0x0078, 0x15bf, 0x2009, 0x4f49, 0x210c,
+       0x7810, 0xd0ec, 0x00c0, 0x15c0, 0x2011, 0x4f89, 0x2214, 0x0078,
+       0x15bf, 0x2061, 0x4f40, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214,
+       0x7810, 0xd0ec, 0x00c0, 0x176d, 0x2061, 0x4f80, 0x6328, 0x73da,
+       0x632c, 0x831c, 0x831c, 0x831c, 0x73de, 0x0078, 0x15bf, 0x2009,
+       0x4f4c, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15c0, 0x2011, 0x4f8c,
+       0x2214, 0x0078, 0x15bf, 0x7918, 0x0078, 0x15c0, 0x2009, 0x4f4d,
+       0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15c0, 0x2011, 0x4f8d, 0x2214,
+       0x0078, 0x15bf, 0x2009, 0x4f4e, 0x210c, 0x7810, 0xd0ec, 0x00c0,
+       0x15c0, 0x2011, 0x4f8e, 0x2214, 0x0078, 0x15bf, 0x7920, 0x7810,
+       0xd0ec, 0x00c0, 0x15c0, 0x7a24, 0x0078, 0x15bf, 0x71c4, 0xd1fc,
+       0x00c0, 0x17a6, 0x2011, 0x53c0, 0x0078, 0x17a8, 0x2011, 0x5440,
+       0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268, 0x6a00,
+       0x6804, 0xd09c, 0x0040, 0x17b7, 0x6b08, 0x0078, 0x17b8, 0x6b0c,
+       0xd1fc, 0x00c0, 0x17bf, 0x2021, 0x023b, 0x0078, 0x17c1, 0x2021,
+       0x013b, 0x2424, 0x7914, 0xd1e4, 0x0040, 0x17cd, 0xd4c4, 0x00c0,
+       0x17cc, 0xc4d5, 0x0078, 0x17cd, 0xc4dd, 0xa4a4, 0x1c00, 0x74de,
+       0x71c4, 0x0078, 0x15be, 0x77c4, 0x1078, 0x1e2b, 0x2091, 0x8000,
+       0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0078, 0x15be, 0x2061,
+       0x4f40, 0x6118, 0x7810, 0xd0ec, 0x00c0, 0x15c0, 0x2061, 0x4f80,
+       0x6218, 0x0078, 0x15bf, 0x77c4, 0x1078, 0x1e2b, 0x2091, 0x8000,
+       0x6908, 0x6a18, 0x6b10, 0x77da, 0x2091, 0x8001, 0x0078, 0x15be,
+       0x71c4, 0x2110, 0xa294, 0x000f, 0xa282, 0x0010, 0x00c8, 0x15b9,
+       0x1078, 0x27c6, 0xa384, 0x4000, 0x0040, 0x1808, 0xa295, 0x0020,
+       0x0078, 0x15be, 0x71c4, 0x2100, 0xc0bc, 0xa082, 0x0010, 0x00c8,
+       0x15b9, 0xd1bc, 0x00c0, 0x1819, 0x2011, 0x4f48, 0x2204, 0x0078,
+       0x181d, 0x2011, 0x4f88, 0x2204, 0xc0bd, 0x007e, 0x2100, 0xc0bc,
+       0x2012, 0x1078, 0x2723, 0x017f, 0x0078, 0x15c0, 0x71c4, 0x2021,
+       0x4f49, 0x2404, 0x70c6, 0x2019, 0x0000, 0x0078, 0x1835, 0x71c8,
+       0x2021, 0x4f89, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x1854, 0x20a9,
+       0x0008, 0x2204, 0xa106, 0x0040, 0x1844, 0x8210, 0x00f0, 0x1839,
+       0x71c4, 0x72c8, 0x0078, 0x15b8, 0xa292, 0x1854, 0x027e, 0x2122,
+       0x017f, 0x1078, 0x2744, 0x7810, 0xd0ec, 0x00c0, 0x1852, 0xd3fc,
+       0x0040, 0x182f, 0x0078, 0x15c1, 0x03e8, 0x00fa, 0x01f4, 0x02ee,
+       0x0004, 0x0001, 0x0002, 0x0003, 0x2061, 0x4f40, 0x6128, 0x622c,
        0x8214, 0x8214, 0x8214, 0x70c4, 0x602a, 0x70c8, 0x8003, 0x8003,
-       0x8003, 0x602e, 0x7810, 0xd0ec, 0x00c0, 0x1862, 0x027e, 0x017e,
-       0x2061, 0x4e80, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214, 0x70d8,
+       0x8003, 0x602e, 0x7810, 0xd0ec, 0x00c0, 0x1882, 0x027e, 0x017e,
+       0x2061, 0x4f80, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214, 0x70d8,
        0x602a, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602e, 0x71da, 0x72de,
-       0x017f, 0x027f, 0x0078, 0x15b8, 0x2061, 0x4e40, 0x6130, 0x70c4,
-       0x6032, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2061, 0x4e80, 0x6230,
-       0x70c8, 0x6032, 0x0078, 0x15b8, 0x7918, 0x0078, 0x15b9, 0x71c4,
-       0xa184, 0xffcf, 0x0040, 0x1883, 0x7810, 0xd0ec, 0x00c0, 0x15b2,
-       0x72c8, 0x0078, 0x15b1, 0x2011, 0x4e4d, 0x2204, 0x2112, 0x007e,
-       0x2019, 0x0000, 0x1078, 0x2764, 0x7810, 0xd0ec, 0x0040, 0x1893,
-       0x017f, 0x0078, 0x15b9, 0x71c8, 0xa184, 0xffcf, 0x0040, 0x189c,
-       0x2110, 0x71c4, 0x0078, 0x15b1, 0x2011, 0x4e8d, 0x2204, 0x2112,
-       0x007e, 0xc3fd, 0x1078, 0x2764, 0x027f, 0x017f, 0x0078, 0x15b8,
-       0x71c4, 0xa182, 0x0010, 0x0048, 0x18b4, 0x7810, 0xd0ec, 0x00c0,
-       0x15b2, 0x72c8, 0x0078, 0x15b1, 0x2011, 0x4e4e, 0x2204, 0x007e,
-       0x2112, 0x2019, 0x0000, 0x1078, 0x2742, 0x7810, 0xd0ec, 0x0040,
-       0x18c4, 0x017f, 0x0078, 0x15b9, 0x71c8, 0xa182, 0x0010, 0x0048,
-       0x18cd, 0x2110, 0x71c4, 0x0078, 0x15b1, 0x2011, 0x4e8e, 0x2204,
-       0x007e, 0x2112, 0xc3fd, 0x1078, 0x2742, 0x027f, 0x017f, 0x0078,
-       0x15b8, 0x71c4, 0x72c8, 0xa184, 0xfffd, 0x00c0, 0x15b1, 0xa284,
-       0xfffd, 0x00c0, 0x15b1, 0x2100, 0x7920, 0x7822, 0x2200, 0x7a24,
-       0x7826, 0x0078, 0x15b8, 0x71c4, 0xd1fc, 0x00c0, 0x18f3, 0x2011,
-       0x52c0, 0x0078, 0x18f5, 0x2011, 0x5340, 0x8107, 0xa084, 0x000f,
-       0x8003, 0x8003, 0x8003, 0xa268, 0x2019, 0x0000, 0x72c8, 0x2091,
-       0x8000, 0x6800, 0x007e, 0xa226, 0x0040, 0x191e, 0x6a02, 0xd4ec,
-       0x0040, 0x190b, 0xc3a5, 0xd4e4, 0x0040, 0x190f, 0xc39d, 0xd4f4,
-       0x0040, 0x191e, 0x810f, 0xd2f4, 0x0040, 0x191a, 0x1078, 0x27c1,
-       0x0078, 0x191e, 0x1078, 0x279f, 0x0078, 0x191e, 0x72cc, 0x6808,
-       0xa206, 0x0040, 0x1940, 0xa2a4, 0x00ff, 0x7814, 0xd0e4, 0x00c0,
-       0x1931, 0xa482, 0x0028, 0x0048, 0x193d, 0x0040, 0x193d, 0x0078,
-       0x1935, 0xa482, 0x0043, 0x0048, 0x193d, 0x71c4, 0x71c6, 0x027f,
-       0x72ca, 0x2091, 0x8001, 0x0078, 0x15b3, 0x6a0a, 0xa39d, 0x000a,
-       0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4, 0x2091, 0x8001,
-       0x0078, 0x15b7, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000, 0x6a14,
-       0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708,
-       0x0078, 0x15b7, 0x70c4, 0x2061, 0x4e40, 0x6118, 0x601a, 0x7810,
-       0xd0ec, 0x00c0, 0x15b9, 0x70c8, 0x2061, 0x4e80, 0x6218, 0x601a,
-       0x0078, 0x15b8, 0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8,
-       0x15b2, 0x1078, 0x27e3, 0xa384, 0x4000, 0x0040, 0x1979, 0xa295,
-       0x0020, 0x0078, 0x15b7, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000,
-       0x6a08, 0xc28d, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x15b8,
-       0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9,
-       0x6a0a, 0x6804, 0xa005, 0x0040, 0x1997, 0x1078, 0x2628, 0x2091,
-       0x8001, 0x2708, 0x0078, 0x15b8, 0x77c4, 0x1078, 0x1de4, 0x2091,
-       0x8000, 0x6a08, 0xc295, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x19aa,
-       0x1078, 0x2628, 0x2091, 0x8001, 0x2708, 0x0078, 0x15b8, 0x77c4,
-       0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000,
-       0x1078, 0x1dff, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078, 0x15b8,
-       0x77c4, 0x7814, 0xd0e4, 0x00c0, 0x19d4, 0xd7fc, 0x0040, 0x19ce,
-       0x1078, 0x1d64, 0x0040, 0x19d4, 0x0078, 0x15bc, 0x1078, 0x1d54,
-       0x0040, 0x19d4, 0x0078, 0x15bc, 0x73c8, 0x72cc, 0x77c6, 0x73ca,
-       0x72ce, 0x1078, 0x1e86, 0x00c0, 0x19fe, 0x6818, 0xa005, 0x0040,
-       0x19f8, 0x2708, 0x077e, 0x1078, 0x2813, 0x077f, 0x00c0, 0x19f8,
-       0x2001, 0x0015, 0xd7fc, 0x00c0, 0x19f1, 0x2061, 0x4e40, 0x0078,
-       0x19f4, 0xc0fd, 0x2061, 0x4e80, 0x782a, 0x2091, 0x8001, 0x007c,
-       0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x15bc, 0x2091, 0x8001,
-       0x0078, 0x15ba, 0x77c4, 0x7814, 0xd0e4, 0x00c0, 0x1a16, 0xd7fc,
-       0x0040, 0x1a10, 0x1078, 0x1d64, 0x0040, 0x1a16, 0x0078, 0x15bc,
-       0x1078, 0x1d54, 0x0040, 0x1a16, 0x0078, 0x15bc, 0x77c6, 0x2041,
-       0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
-       0x1dff, 0x2009, 0x0016, 0xd7fc, 0x00c0, 0x1a2a, 0x2061, 0x4e40,
-       0x0078, 0x1a2d, 0x2061, 0x4e80, 0xc1fd, 0x6067, 0x0003, 0x607f,
-       0x0000, 0x6776, 0x6083, 0x000f, 0x792a, 0x61d4, 0xc1dc, 0x61d6,
-       0x1078, 0x2628, 0x2091, 0x8001, 0x007c, 0x77c8, 0x77ca, 0x77c4,
-       0x77c6, 0x7814, 0xd0e4, 0x00c0, 0x1a54, 0xd7fc, 0x0040, 0x1a4e,
-       0x1078, 0x1d64, 0x0040, 0x1a54, 0x0078, 0x15bc, 0x1078, 0x1d54,
-       0x0040, 0x1a54, 0x0078, 0x15bc, 0xa7bc, 0xff00, 0x2091, 0x8000,
-       0x2009, 0x0017, 0xd7fc, 0x00c0, 0x1a61, 0x2061, 0x4e40, 0x0078,
-       0x1a64, 0x2061, 0x4e80, 0xc1fd, 0x607f, 0x0000, 0x6067, 0x0002,
-       0x6776, 0x6083, 0x000f, 0x792a, 0x61d4, 0xc1dc, 0x61d6, 0x1078,
-       0x2628, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051,
-       0x0010, 0x2091, 0x8000, 0x70c8, 0xa005, 0x0040, 0x1a82, 0x60d4,
-       0xc0fd, 0x60d6, 0x1078, 0x1dff, 0x70c8, 0x6836, 0x8738, 0xa784,
-       0x001f, 0x00c0, 0x1a82, 0x2091, 0x8001, 0x007c, 0x2019, 0x0000,
-       0x7814, 0xd0e4, 0x00c0, 0x1aa4, 0x72c8, 0xd284, 0x0040, 0x1a9e,
-       0x1078, 0x1d64, 0x0040, 0x1aa4, 0x0078, 0x15bc, 0x1078, 0x1d54,
-       0x0040, 0x1aa4, 0x0078, 0x15bc, 0x72c8, 0x72ca, 0x78ac, 0xa084,
-       0x0003, 0x00c0, 0x1acf, 0x2039, 0x0000, 0xd284, 0x0040, 0x1ab1,
-       0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078,
-       0x1de4, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d, 0x690a, 0x2091,
-       0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1ab7, 0xa7bc, 0xff00,
-       0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1ab7, 0x2091,
-       0x8000, 0x72c8, 0xd284, 0x00c0, 0x1ae1, 0x7810, 0xd0ec, 0x0040,
-       0x1add, 0x2069, 0x0100, 0x0078, 0x1ae3, 0x2069, 0x0200, 0x0078,
-       0x1ae3, 0x2069, 0x0100, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830,
-       0xd0b4, 0x0040, 0x1b03, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848,
-       0xd094, 0x0040, 0x1af5, 0x00f0, 0x1aef, 0x684b, 0x0009, 0x20a9,
-       0x0014, 0x6848, 0xd084, 0x0040, 0x1aff, 0x00f0, 0x1af9, 0x20a9,
-       0x00fa, 0x00f0, 0x1b01, 0x2079, 0x4e00, 0x2009, 0x0018, 0x72c8,
-       0xd284, 0x00c0, 0x1b0f, 0x2061, 0x4e40, 0x0078, 0x1b12, 0x2061,
-       0x4e80, 0xc1fd, 0x607f, 0x0000, 0x792a, 0x6067, 0x0001, 0x6083,
-       0x000f, 0x60a7, 0x0000, 0x60a8, 0x60b2, 0x60b6, 0x60d4, 0xd0b4,
-       0x0040, 0x1b2e, 0xc0b4, 0x60d6, 0x0c7e, 0x60b8, 0xa065, 0x6008,
-       0xc0d4, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x60d4, 0xa084,
-       0x77ff, 0x60d6, 0x78ac, 0xc08d, 0x78ae, 0x83ff, 0x0040, 0x1b39,
-       0x007c, 0x681b, 0x0047, 0x2091, 0x8001, 0x007c, 0x73cc, 0x1078,
-       0x1a90, 0x69ec, 0x6a48, 0xa185, 0x1800, 0x684a, 0xa185, 0x0040,
-       0x68ee, 0x73cc, 0x2021, 0x0004, 0x20a9, 0x09ff, 0x00f0, 0x1b4e,
-       0x8421, 0x00c0, 0x1b4c, 0x8319, 0x00c0, 0x1b4a, 0x69ee, 0x6a4a,
-       0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x1b62, 0x2069, 0x4e40,
-       0x0078, 0x1b64, 0x2069, 0x4e80, 0x71c4, 0x71c6, 0x6916, 0x81ff,
-       0x00c0, 0x1b6c, 0x68a7, 0x0001, 0x78ac, 0xc08c, 0x78ae, 0xd084,
-       0x00c0, 0x1b74, 0x1078, 0x1ee6, 0x007c, 0x75d8, 0x74dc, 0x75da,
-       0x74de, 0x0078, 0x1b7e, 0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8,
-       0x72cc, 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x4e00, 0x7dde, 0x7cda,
-       0x7bd6, 0x7ad2, 0x1078, 0x1dbd, 0x0040, 0x1c80, 0x20a9, 0x0005,
-       0x20a1, 0x4e14, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009,
-       0x0040, 0x1078, 0x1fd1, 0x0040, 0x1ba1, 0x1078, 0x1dc6, 0x0078,
-       0x1c80, 0x6004, 0xa08c, 0x00ff, 0xa18e, 0x0009, 0x00c0, 0x1bac,
-       0x007e, 0x1078, 0x2378, 0x007f, 0xa084, 0xff00, 0x8007, 0x8009,
-       0x0040, 0x1c20, 0x0c7e, 0x2c68, 0x1078, 0x1dbd, 0x0040, 0x1bf2,
-       0x2c00, 0x689e, 0x8109, 0x00c0, 0x1bb3, 0x609f, 0x0000, 0x0c7f,
-       0x0c7e, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, 0x0040, 0xa399,
-       0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, 0x7cda, 0x7bd6,
-       0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0040, 0x1c1f, 0x2009, 0x0040,
-       0x1078, 0x1fd1, 0x00c0, 0x1c09, 0x6004, 0xa084, 0x00ff, 0xa086,
-       0x0002, 0x00c0, 0x1bf2, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000a,
-       0x00c0, 0x1bee, 0x017e, 0x1078, 0x2374, 0x017f, 0x2d00, 0x6002,
-       0x0078, 0x1bc1, 0x0c7f, 0x0c7e, 0x609c, 0x1078, 0x1e49, 0x0c7f,
-       0x609f, 0x0000, 0x1078, 0x1c84, 0x2009, 0x0018, 0x6008, 0xc0cd,
-       0x600a, 0x6004, 0x6086, 0x1078, 0x1d74, 0x1078, 0x1dc6, 0x0078,
-       0x1c80, 0x0c7f, 0x0c7e, 0x609c, 0x1078, 0x1e49, 0x0c7f, 0x609f,
-       0x0000, 0x1078, 0x1c84, 0x2009, 0x0018, 0x6087, 0x0103, 0x601b,
-       0x0003, 0x1078, 0x1d74, 0x1078, 0x1dc6, 0x0078, 0x1c80, 0x0c7f,
-       0x7814, 0xd0e4, 0x00c0, 0x1c45, 0x6114, 0xd1fc, 0x0040, 0x1c2e,
-       0x1078, 0x1d64, 0x0040, 0x1c45, 0x0078, 0x1c32, 0x1078, 0x1d54,
-       0x0040, 0x1c45, 0x2029, 0x0000, 0x2520, 0x2009, 0x0018, 0x73c8,
-       0x72cc, 0x6087, 0x0103, 0x601b, 0x0021, 0x1078, 0x1d74, 0x1078,
-       0x1dc6, 0x2001, 0x4007, 0x0078, 0x15bc, 0x74c4, 0x73c8, 0x72cc,
-       0x6014, 0x2091, 0x8000, 0x0e7e, 0x2009, 0x0012, 0xd0fc, 0x00c0,
-       0x1c55, 0x2071, 0x4e40, 0x0078, 0x1c58, 0x2071, 0x4e80, 0xc1fd,
-       0x792a, 0x7067, 0x0005, 0x71d4, 0xc1dc, 0x71d6, 0x736a, 0x726e,
-       0x7472, 0x7076, 0x707b, 0x0000, 0x2c00, 0x707e, 0xa02e, 0x2530,
-       0x611c, 0xa184, 0x0060, 0x0040, 0x1c6f, 0x1078, 0x4632, 0x0e7f,
-       0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000,
-       0x6714, 0x6023, 0x0000, 0x1078, 0x2628, 0x2091, 0x8001, 0x007c,
-       0x70c3, 0x4005, 0x0078, 0x15bd, 0x20a9, 0x0005, 0x2099, 0x4e14,
-       0x2091, 0x8000, 0x530a, 0x2091, 0x8001, 0x2100, 0xa210, 0xa399,
-       0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x71c4, 0x70c7,
-       0x0000, 0x791e, 0x0078, 0x15ba, 0x71c4, 0x71c6, 0x2168, 0x0078,
-       0x1ca3, 0x2069, 0x1000, 0x690c, 0xa016, 0x2d04, 0xa210, 0x8d68,
-       0x8109, 0x00c0, 0x1ca5, 0xa285, 0x0000, 0x00c0, 0x1cb3, 0x70c3,
-       0x4000, 0x0078, 0x1cb5, 0x70c3, 0x4003, 0x70ca, 0x0078, 0x15bd,
-       0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8, 0x15b2, 0x7966,
-       0x0078, 0x15ba, 0x7964, 0x71c6, 0x0078, 0x15ba, 0x7900, 0x71c6,
-       0x71c4, 0x7902, 0x0078, 0x15ba, 0x7900, 0x71c6, 0x0078, 0x15ba,
-       0x70c4, 0x2011, 0x0000, 0xa08c, 0x000d, 0x0040, 0x1ce5, 0x810c,
-       0x0048, 0x1ce1, 0x8210, 0x810c, 0x810c, 0x0048, 0x1ce1, 0x8210,
-       0x810c, 0x81ff, 0x00c0, 0x15b3, 0x8210, 0x7a0e, 0xd28c, 0x0040,
-       0x1d11, 0x7910, 0xc1cd, 0x7912, 0x2009, 0x0021, 0x2019, 0x0003,
-       0xd284, 0x0040, 0x1d0b, 0x8108, 0x2019, 0x0041, 0x2011, 0x964e,
-       0x2312, 0x2019, 0x0042, 0x8210, 0x2312, 0x2019, 0x0043, 0x8210,
-       0x2312, 0x2019, 0x0046, 0x8210, 0x2312, 0x2019, 0x0047, 0x8210,
-       0x2312, 0x2019, 0x0006, 0x2011, 0x9653, 0x2112, 0x2011, 0x9673,
-       0x2312, 0x7904, 0x7806, 0x0078, 0x15b9, 0x7804, 0x70c6, 0x0078,
-       0x15ba, 0x71c4, 0xd1fc, 0x00c0, 0x1d21, 0x2011, 0x52c0, 0x0078,
-       0x1d23, 0x2011, 0x5340, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003,
-       0x8003, 0xa268, 0x6a14, 0xd2b4, 0x0040, 0x1d32, 0x2011, 0x0001,
-       0x0078, 0x1d34, 0x2011, 0x0000, 0x6b0c, 0x6800, 0x70da, 0x0078,
-       0x15b7, 0x017e, 0x7814, 0xd0f4, 0x0040, 0x1d46, 0x2001, 0x4007,
-       0x70db, 0x0000, 0xa18d, 0x0001, 0x0078, 0x1d52, 0xd0fc, 0x0040,
-       0x1d51, 0x2001, 0x4007, 0x70db, 0x0001, 0xa18d, 0x0001, 0x0078,
-       0x1d52, 0xa006, 0x017f, 0x007c, 0x017e, 0x7814, 0xd0f4, 0x0040,
-       0x1d61, 0x2001, 0x4007, 0x70db, 0x0000, 0xa18d, 0x0001, 0x0078,
-       0x1d62, 0xa006, 0x017f, 0x007c, 0x017e, 0x7814, 0xd0fc, 0x0040,
-       0x1d71, 0x2001, 0x4007, 0x70db, 0x0001, 0xa18d, 0x0001, 0x0078,
-       0x1d72, 0xa006, 0x017f, 0x007c, 0x7112, 0x721a, 0x731e, 0x7810,
-       0xd0c4, 0x0040, 0x1d7d, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108,
-       0x810c, 0x81a9, 0x8098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x6084,
-       0x20a2, 0x53a6, 0x7007, 0x0001, 0x7974, 0xa184, 0xff00, 0x0040,
-       0x1d9a, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
-       0x0078, 0x1d9d, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78,
-       0xa006, 0xa211, 0x7d10, 0xd5c4, 0x0040, 0x1daa, 0x7b84, 0xa319,
-       0x7c80, 0xa421, 0x7008, 0xd0fc, 0x0040, 0x1daa, 0x7003, 0x0001,
-       0x7007, 0x0006, 0x711a, 0x721e, 0x7d10, 0xd5c4, 0x0040, 0x1dba,
-       0x7322, 0x7426, 0xa084, 0x01e0, 0x007c, 0x7848, 0xa065, 0x0040,
-       0x1dc5, 0x2c04, 0x784a, 0x2063, 0x0000, 0x007c, 0x0f7e, 0x2079,
-       0x4e00, 0x7848, 0x2062, 0x2c00, 0xa005, 0x00c0, 0x1dd1, 0x1078,
-       0x296b, 0x784a, 0x0f7f, 0x007c, 0x2011, 0x9800, 0x7a4a, 0x7bc4,
-       0x8319, 0x0040, 0x1de1, 0xa280, 0x0032, 0x2012, 0x2010, 0x0078,
-       0x1dd8, 0x2013, 0x0000, 0x007c, 0x017e, 0x027e, 0xd7fc, 0x00c0,
-       0x1ded, 0x2011, 0x53c0, 0x0078, 0x1def, 0x2011, 0x73c0, 0xa784,
-       0x0f00, 0x800b, 0xa784, 0x001f, 0x0040, 0x1dfa, 0x8003, 0x8003,
-       0x8003, 0x8003, 0xa105, 0xa268, 0x027f, 0x017f, 0x007c, 0x1078,
-       0x1de4, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xf9ef,
-       0xa80d, 0x690a, 0x0e7e, 0xd7fc, 0x00c0, 0x1e14, 0x2009, 0x4e53,
-       0x2071, 0x4e40, 0x0078, 0x1e18, 0x2009, 0x4e93, 0x2071, 0x4e80,
-       0x210c, 0x6804, 0xa005, 0x0040, 0x1e28, 0xa116, 0x00c0, 0x1e28,
-       0x2060, 0x6000, 0x6806, 0x017e, 0x200b, 0x0000, 0x0078, 0x1e2b,
-       0x2009, 0x0000, 0x017e, 0x6804, 0xa065, 0x0040, 0x1e40, 0x6000,
-       0x6806, 0x1078, 0x1e5b, 0x1078, 0x201d, 0x6810, 0x7908, 0x8109,
-       0x790a, 0x8001, 0x6812, 0x00c0, 0x1e2b, 0x7910, 0xc1a5, 0x7912,
-       0x017f, 0x6902, 0x6906, 0x2d00, 0x2060, 0x1078, 0x2acc, 0x0e7f,
-       0x007c, 0xa065, 0x0040, 0x1e5a, 0x2008, 0x609c, 0xa005, 0x0040,
-       0x1e57, 0x2062, 0x609f, 0x0000, 0xa065, 0x0078, 0x1e4d, 0x7848,
-       0x794a, 0x2062, 0x007c, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9,
-       0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828,
-       0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e, 0xd7fc, 0x00c0, 0x1e76,
-       0x2071, 0x4e40, 0x2031, 0x4ec0, 0x0078, 0x1e7a, 0x2071, 0x4e80,
-       0x2031, 0x50c0, 0x7050, 0xa08c, 0x0200, 0x00c0, 0x1e84, 0xa608,
-       0x2d0a, 0x8000, 0x7052, 0xa006, 0x0e7f, 0x007c, 0x0f7e, 0xd7fc,
-       0x00c0, 0x1e8e, 0x2079, 0x4e40, 0x0078, 0x1e90, 0x2079, 0x4e80,
-       0x1078, 0x1de4, 0x2091, 0x8000, 0x6804, 0x780a, 0xa065, 0x0040,
-       0x1ee4, 0x0078, 0x1ea2, 0x2c00, 0x780a, 0x2060, 0x6000, 0xa065,
-       0x0040, 0x1ee4, 0x6010, 0xa306, 0x00c0, 0x1e9b, 0x600c, 0xa206,
-       0x00c0, 0x1e9b, 0x2c28, 0x784c, 0xac06, 0x00c0, 0x1eb1, 0x0078,
-       0x1ee1, 0x6804, 0xac06, 0x00c0, 0x1ebf, 0x6000, 0x2060, 0x6806,
-       0xa005, 0x00c0, 0x1ebf, 0x6803, 0x0000, 0x0078, 0x1ec9, 0x6400,
-       0x7808, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1ec9, 0x2c00,
-       0x6802, 0x2560, 0x0f7f, 0x1078, 0x1e5b, 0x0f7e, 0x601b, 0x0005,
-       0x6023, 0x0020, 0x0f7f, 0x1078, 0x201d, 0x0f7e, 0x7908, 0x8109,
-       0x790a, 0x6810, 0x8001, 0x6812, 0x00c0, 0x1ee1, 0x7810, 0xc0a5,
-       0x7812, 0x2001, 0xffff, 0xa005, 0x0f7f, 0x007c, 0x077e, 0x2700,
-       0x2039, 0x0000, 0xd0fc, 0x0040, 0x1eee, 0xc7fd, 0x2041, 0x0021,
-       0x2049, 0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x1dff,
-       0x8738, 0xa784, 0x001f, 0x00c0, 0x1ef6, 0xa7bc, 0xff00, 0x873f,
-       0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1ef6, 0x2091, 0x8001,
-       0x077f, 0x007c, 0x786c, 0x2009, 0x9674, 0x210c, 0xa10d, 0x0040,
-       0x1f14, 0xa065, 0x0078, 0x2395, 0x2061, 0x0000, 0x6018, 0xd084,
-       0x00c0, 0x1f34, 0x7810, 0xd08c, 0x0040, 0x1f25, 0xc08c, 0x7812,
-       0xc7fc, 0x2069, 0x4e40, 0x0078, 0x1f2a, 0xc08d, 0x7812, 0x2069,
-       0x4e80, 0xc7fd, 0x2091, 0x8000, 0x681c, 0x681f, 0x0000, 0x2091,
-       0x8001, 0xa005, 0x00c0, 0x1f35, 0x007c, 0xa08c, 0xfff0, 0x0040,
-       0x1f3b, 0x1078, 0x296b, 0x0079, 0x1f3d, 0x1f4d, 0x1f50, 0x1f56,
-       0x1f5a, 0x1f4e, 0x1f5e, 0x1f4e, 0x1f4e, 0x1f4e, 0x1f64, 0x1f95,
-       0x1f99, 0x1f9f, 0x1fb4, 0x1f4e, 0x1f4e, 0x007c, 0x1078, 0x296b,
-       0x1078, 0x1ee6, 0x2001, 0x8001, 0x0078, 0x1fc0, 0x2001, 0x8003,
-       0x0078, 0x1fc0, 0x2001, 0x8004, 0x0078, 0x1fc0, 0x1078, 0x1ee6,
-       0x2001, 0x8006, 0x0078, 0x1fc0, 0x2091, 0x8000, 0x077e, 0xd7fc,
-       0x00c0, 0x1f70, 0x2069, 0x4e40, 0x2039, 0x0009, 0x0078, 0x1f74,
-       0x2069, 0x4e80, 0x2039, 0x0009, 0x6800, 0xa086, 0x0000, 0x0040,
-       0x1f7e, 0x007f, 0x6f1e, 0x2091, 0x8001, 0x007c, 0x6874, 0x077f,
-       0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010,
-       0x1078, 0x1dff, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1f88, 0x2091,
-       0x8001, 0x2001, 0x800a, 0x0078, 0x1fc0, 0x2001, 0x800c, 0x0078,
-       0x1fc0, 0x1078, 0x1ee6, 0x2001, 0x800d, 0x0078, 0x1fc0, 0x7814,
-       0xd0e4, 0x00c0, 0x1fb2, 0xd0ec, 0x0040, 0x1fac, 0xd7fc, 0x0040,
-       0x1fac, 0x78e4, 0x0078, 0x1fad, 0x78e0, 0x70c6, 0x2001, 0x800e,
-       0x0078, 0x1fc0, 0x0078, 0x1f4e, 0xd7fc, 0x0040, 0x1fba, 0x78ec,
-       0x0078, 0x1fbb, 0x78e8, 0x70c6, 0x2001, 0x800f, 0x0078, 0x1fc0,
-       0x70c2, 0xd7fc, 0x00c0, 0x1fc8, 0x70db, 0x0000, 0x0078, 0x1fca,
-       0x70db, 0x0001, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x4080,
-       0x007c, 0xac80, 0x0001, 0x81ff, 0x0040, 0x1ffc, 0x2099, 0x0030,
-       0x20a0, 0x700c, 0xa084, 0x03ff, 0x0040, 0x1fde, 0x7018, 0x007e,
-       0x701c, 0x007e, 0x7020, 0x007e, 0x7024, 0x007e, 0x7112, 0x81ac,
-       0x721a, 0x731e, 0x7422, 0x7526, 0x7003, 0x0001, 0x7007, 0x0001,
-       0x7008, 0x800b, 0x00c8, 0x1ff0, 0x7007, 0x0002, 0xa08c, 0x01e0,
-       0x00c0, 0x1ffc, 0x53a5, 0xa006, 0x7003, 0x0000, 0x7007, 0x0004,
-       0x007f, 0x7026, 0x007f, 0x7022, 0x007f, 0x701e, 0x007f, 0x701a,
-       0x007c, 0x2011, 0x0020, 0x2009, 0x0010, 0x6b0a, 0x6c0e, 0x6803,
-       0xfd00, 0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290,
-       0x0004, 0x8109, 0x00c0, 0x200d, 0x007c, 0x6004, 0x6086, 0x2c08,
-       0x2063, 0x0000, 0x7868, 0xa005, 0x796a, 0x0040, 0x202a, 0x2c02,
-       0x0078, 0x202b, 0x796e, 0x007c, 0x0c7e, 0x2061, 0x4e00, 0x6887,
-       0x0103, 0x2d08, 0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0040,
-       0x203c, 0x2d02, 0x0078, 0x203d, 0x616e, 0x0c7f, 0x007c, 0x2091,
-       0x8000, 0x2c04, 0x786e, 0xa005, 0x00c0, 0x2047, 0x786a, 0x2091,
-       0x8001, 0x609c, 0xa005, 0x0040, 0x2060, 0x0c7e, 0x2060, 0x2008,
-       0x609c, 0xa005, 0x0040, 0x205c, 0x2062, 0x609f, 0x0000, 0xa065,
-       0x609c, 0xa005, 0x00c0, 0x2054, 0x7848, 0x794a, 0x2062, 0x0c7f,
-       0x7848, 0x2062, 0x609f, 0x0000, 0xac85, 0x0000, 0x00c0, 0x206a,
-       0x1078, 0x296b, 0x784a, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004,
-       0x8086, 0x818e, 0x00c8, 0x2075, 0xa200, 0x00f0, 0x2070, 0x8086,
-       0x818e, 0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x209b,
-       0xa11a, 0x00c8, 0x209b, 0x8213, 0x818d, 0x0048, 0x208e, 0xa11a,
-       0x00c8, 0x208f, 0x00f0, 0x2083, 0x0078, 0x2093, 0xa11a, 0x2308,
-       0x8210, 0x00f0, 0x2083, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080,
-       0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078,
-       0x2097, 0x7d74, 0x70d0, 0xa506, 0x0040, 0x2187, 0x7810, 0x2050,
-       0x7800, 0xd08c, 0x0040, 0x20c3, 0xdaec, 0x0040, 0x20c3, 0x0e7e,
-       0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x20c0,
-       0x7008, 0x0e7f, 0xa086, 0x0008, 0x0040, 0x20c3, 0x0078, 0x2187,
-       0x0e7f, 0x0078, 0x2187, 0x1078, 0x1dbd, 0x0040, 0x2187, 0xa046,
-       0x7970, 0x2500, 0x8000, 0xa112, 0x2009, 0x0040, 0x00c8, 0x20d2,
-       0x0078, 0x20d9, 0x72d0, 0xa206, 0x0040, 0x20d9, 0x8840, 0x2009,
-       0x0080, 0x0c7e, 0x7112, 0x7007, 0x0001, 0x2099, 0x0030, 0x20a9,
-       0x0020, 0xac80, 0x0001, 0x20a0, 0x2061, 0x0000, 0x88ff, 0x0040,
-       0x20eb, 0x1078, 0x1dbd, 0x7008, 0xd0fc, 0x0040, 0x20eb, 0x7007,
-       0x0002, 0x2091, 0x8001, 0xa08c, 0x01e0, 0x00c0, 0x2122, 0x53a5,
-       0x8cff, 0x00c0, 0x2100, 0x88ff, 0x0040, 0x2171, 0x0078, 0x210a,
-       0x2c00, 0x788e, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0, 0x53a5,
-       0x0078, 0x2171, 0xa046, 0x7218, 0x731c, 0xdac4, 0x0040, 0x2112,
-       0x7420, 0x7524, 0xa292, 0x0040, 0xa39b, 0x0000, 0xa4a3, 0x0000,
-       0xa5ab, 0x0000, 0x721a, 0x731e, 0xdac4, 0x0040, 0x2122, 0x7422,
-       0x7526, 0xa006, 0x7007, 0x0004, 0x0040, 0x2171, 0x8cff, 0x0040,
-       0x212b, 0x1078, 0x1dc6, 0x0c7f, 0x1078, 0x1dc6, 0xa046, 0x7888,
-       0x8000, 0x788a, 0xa086, 0x0002, 0x0040, 0x2151, 0x7a7c, 0x7b78,
-       0xdac4, 0x0040, 0x213d, 0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004,
-       0x8004, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
-       0x721a, 0x731e, 0xdac4, 0x0040, 0x2187, 0x7422, 0x7526, 0x0078,
-       0x2187, 0x6014, 0xd0fc, 0x00c0, 0x2159, 0x2069, 0x4e40, 0x0078,
-       0x215b, 0x2069, 0x4e80, 0x2091, 0x8000, 0x681f, 0x0002, 0x88ff,
-       0x0040, 0x2167, 0xa046, 0x788c, 0x2060, 0x0078, 0x2151, 0x788b,
-       0x0000, 0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091, 0x8001, 0x0078,
-       0x2187, 0x0c7f, 0x788b, 0x0000, 0x1078, 0x2346, 0x6004, 0xa084,
-       0x000f, 0x1078, 0x2188, 0x88ff, 0x0040, 0x2185, 0x788c, 0x2060,
-       0x6004, 0xa084, 0x000f, 0x1078, 0x2188, 0x0078, 0x20a1, 0x007c,
-       0x0079, 0x218a, 0x219a, 0x21b8, 0x21d6, 0x219a, 0x21e7, 0x21ab,
-       0x219a, 0x219a, 0x219a, 0x21b6, 0x21d4, 0x219a, 0x219a, 0x219a,
-       0x219a, 0x219a, 0x2039, 0x0400, 0x78bc, 0xa705, 0x78be, 0x6008,
-       0xa705, 0x600a, 0x1078, 0x222a, 0x609c, 0x78ba, 0x609f, 0x0000,
-       0x1078, 0x2330, 0x007c, 0x78bc, 0xd0c4, 0x0040, 0x21b1, 0x0078,
-       0x219a, 0x601c, 0xc0bd, 0x601e, 0x0078, 0x21be, 0x1078, 0x2378,
-       0x78bc, 0xd0c4, 0x0040, 0x21be, 0x0078, 0x219a, 0x78bf, 0x0000,
-       0x6004, 0x8007, 0xa084, 0x00ff, 0x78b2, 0x8001, 0x0040, 0x21d1,
-       0x1078, 0x222a, 0x0040, 0x21d1, 0x78bc, 0xc0c5, 0x78be, 0x0078,
-       0x21d3, 0x0078, 0x2249, 0x007c, 0x1078, 0x2374, 0x78bc, 0xa08c,
-       0x0e00, 0x00c0, 0x21de, 0xd0c4, 0x00c0, 0x21e0, 0x0078, 0x219a,
-       0x1078, 0x222a, 0x00c0, 0x21e6, 0x0078, 0x2249, 0x007c, 0x78bc,
-       0xd0c4, 0x0040, 0x21ed, 0x0078, 0x219a, 0x78bf, 0x0000, 0x6714,
-       0x2011, 0x0001, 0x22a8, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040,
-       0x220d, 0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0040,
-       0x220d, 0xa7bc, 0x8000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e,
-       0x0002, 0x0040, 0x220d, 0x0078, 0x2227, 0x1078, 0x1de4, 0x2d00,
-       0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084,
-       0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001, 0x00f0, 0x2210,
-       0x8211, 0x0040, 0x2227, 0x20a9, 0x0100, 0x0078, 0x2210, 0x1078,
-       0x1dc6, 0x007c, 0x609f, 0x0000, 0x78b4, 0xa06d, 0x2c00, 0x78b6,
-       0x00c0, 0x2235, 0x78ba, 0x0078, 0x223d, 0x689e, 0x2d00, 0x6002,
-       0x78b8, 0xad06, 0x00c0, 0x223d, 0x6002, 0x78b0, 0x8001, 0x78b2,
-       0x00c0, 0x2248, 0x78bc, 0xc0c4, 0x78be, 0x78b8, 0x2060, 0xa006,
-       0x007c, 0x0e7e, 0xa02e, 0x2530, 0x7dba, 0x7db6, 0x65ae, 0x65b2,
-       0x601c, 0x60a2, 0x2048, 0xa984, 0xe1ff, 0x601e, 0xa984, 0x0060,
-       0x0040, 0x225c, 0x1078, 0x4632, 0x6596, 0x65a6, 0x669a, 0x66aa,
-       0x6714, 0x2071, 0x4e80, 0xd7fc, 0x00c0, 0x2268, 0x2071, 0x4e40,
-       0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x0040, 0x2273, 0x8003,
-       0x8003, 0x8003, 0x8003, 0xa105, 0x71c4, 0xa168, 0x2700, 0x8007,
-       0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x71c8, 0xa100, 0x60c2,
-       0x2091, 0x8000, 0x7814, 0xd0c4, 0x0040, 0x2298, 0xd0ec, 0x0040,
-       0x2294, 0xd7fc, 0x00c0, 0x2291, 0xd0f4, 0x00c0, 0x229f, 0x0078,
-       0x2298, 0xd0fc, 0x00c0, 0x229f, 0x7810, 0xd0f4, 0x00c0, 0x229f,
-       0x6e08, 0xd684, 0x0040, 0x22c9, 0xd9fc, 0x00c0, 0x22c9, 0x2091,
-       0x8001, 0x1078, 0x1e5b, 0x2091, 0x8000, 0x1078, 0x201d, 0x2091,
-       0x8001, 0x7814, 0xd0e4, 0x00c0, 0x232e, 0x7814, 0xd0c4, 0x0040,
-       0x232e, 0xd0ec, 0x0040, 0x22c1, 0xd7fc, 0x00c0, 0x22bc, 0xd0f4,
-       0x00c0, 0x22c5, 0x0078, 0x232e, 0xd0fc, 0x00c0, 0x22c5, 0x0078,
-       0x232e, 0x7810, 0xd0f4, 0x0040, 0x232e, 0x601b, 0x0021, 0x0078,
-       0x232e, 0x6024, 0xa096, 0x0001, 0x00c0, 0x22d0, 0x8000, 0x6026,
-       0x6a10, 0x6814, 0xa202, 0x0048, 0x22e3, 0x0040, 0x22e3, 0x2091,
-       0x8001, 0x2039, 0x0200, 0x609c, 0x78ba, 0x609f, 0x0000, 0x1078,
-       0x2330, 0x0078, 0x232e, 0x2c08, 0xd9fc, 0x0040, 0x230b, 0x6800,
-       0xa065, 0x0040, 0x230b, 0x6a04, 0x7000, 0xa084, 0x0002, 0x0040,
-       0x2301, 0x704c, 0xa206, 0x00c0, 0x2301, 0x6b04, 0x2160, 0x2304,
-       0x6002, 0xa005, 0x00c0, 0x22fd, 0x6902, 0x2260, 0x6102, 0x0078,
-       0x2317, 0x2d00, 0x2060, 0x1078, 0x2acc, 0x6e08, 0x2160, 0x6202,
-       0x6906, 0x0078, 0x2317, 0x6800, 0x6902, 0xa065, 0x0040, 0x2313,
-       0x6102, 0x0078, 0x2314, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160,
-       0xd9fc, 0x0040, 0x231e, 0xa6b4, 0xfffc, 0x6e0a, 0x6810, 0x7d08,
-       0x8528, 0x7d0a, 0x8000, 0x6812, 0x2091, 0x8001, 0xd6b4, 0x0040,
-       0x232e, 0xa6b6, 0x0040, 0x6e0a, 0x1078, 0x1e6c, 0x0e7f, 0x007c,
-       0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x201d, 0x2091,
-       0x8001, 0x78b8, 0xa065, 0x0040, 0x2343, 0x609c, 0x78ba, 0x609f,
-       0x0000, 0x0078, 0x2330, 0x78b6, 0x78ba, 0x007c, 0x7970, 0x7874,
-       0x2818, 0xd384, 0x0040, 0x2350, 0x8000, 0xa112, 0x0048, 0x2355,
-       0x8000, 0xa112, 0x00c8, 0x2365, 0xc384, 0x7a7c, 0x721a, 0x7a78,
-       0x721e, 0xdac4, 0x0040, 0x2360, 0x7a84, 0x7222, 0x7a80, 0x7226,
-       0xa006, 0xd384, 0x0040, 0x2365, 0x8000, 0x7876, 0x70d2, 0x781c,
-       0xa005, 0x0040, 0x2373, 0x8001, 0x781e, 0x00c0, 0x2373, 0x0068,
-       0x2373, 0x2091, 0x4080, 0x007c, 0x2039, 0x238c, 0x0078, 0x237a,
-       0x2039, 0x2392, 0x2704, 0xa005, 0x0040, 0x238b, 0xac00, 0x2068,
-       0x6908, 0x6810, 0x6912, 0x680a, 0x690c, 0x6814, 0x6916, 0x680e,
-       0x8738, 0x0078, 0x237a, 0x007c, 0x0003, 0x0009, 0x000f, 0x0015,
-       0x001b, 0x0000, 0x0015, 0x001b, 0x0000, 0x2041, 0x0000, 0x780c,
-       0x0079, 0x239a, 0x256c, 0x253f, 0x239e, 0x2417, 0x2039, 0x9674,
-       0x2734, 0x7d10, 0x0078, 0x23be, 0x6084, 0xa086, 0x0103, 0x00c0,
-       0x2400, 0x6114, 0x6018, 0xa105, 0x0040, 0x23b3, 0x86ff, 0x00c0,
-       0x23cf, 0x0078, 0x2400, 0x8603, 0xa080, 0x9655, 0x620c, 0x2202,
-       0x8000, 0x6210, 0x2202, 0x1078, 0x203f, 0x8630, 0xa68e, 0x000f,
-       0x0040, 0x248b, 0x786c, 0xa065, 0x00c0, 0x23a4, 0x7808, 0xa602,
-       0x00c8, 0x23cf, 0xd5ac, 0x00c0, 0x23cf, 0x263a, 0x007c, 0xa682,
-       0x0003, 0x00c8, 0x248b, 0x2091, 0x8000, 0x2069, 0x0000, 0x6818,
-       0xd084, 0x00c0, 0x23fb, 0x2011, 0x9655, 0x2204, 0x70c6, 0x8210,
-       0x2204, 0x70ca, 0xd684, 0x00c0, 0x23eb, 0x8210, 0x2204, 0x70da,
-       0x8210, 0x2204, 0x70de, 0xa685, 0x8020, 0x70c2, 0x681b, 0x0001,
+       0x017f, 0x027f, 0x0078, 0x15bf, 0x2061, 0x4f40, 0x6130, 0x70c4,
+       0x6032, 0x7810, 0xd0ec, 0x00c0, 0x15c0, 0x2061, 0x4f80, 0x6230,
+       0x70c8, 0x6032, 0x0078, 0x15bf, 0x7918, 0x0078, 0x15c0, 0x71c4,
+       0xa184, 0xffcf, 0x0040, 0x18a3, 0x7810, 0xd0ec, 0x00c0, 0x15b9,
+       0x72c8, 0x0078, 0x15b8, 0x2011, 0x4f4d, 0x2204, 0x2112, 0x007e,
+       0x2019, 0x0000, 0x1078, 0x27ab, 0x7810, 0xd0ec, 0x0040, 0x18b3,
+       0x017f, 0x0078, 0x15c0, 0x71c8, 0xa184, 0xffcf, 0x0040, 0x18bc,
+       0x2110, 0x71c4, 0x0078, 0x15b8, 0x2011, 0x4f8d, 0x2204, 0x2112,
+       0x007e, 0xc3fd, 0x1078, 0x27ab, 0x027f, 0x017f, 0x0078, 0x15bf,
+       0x71c4, 0xa182, 0x0010, 0x0048, 0x18d4, 0x7810, 0xd0ec, 0x00c0,
+       0x15b9, 0x72c8, 0x0078, 0x15b8, 0x2011, 0x4f4e, 0x2204, 0x007e,
+       0x2112, 0x2019, 0x0000, 0x1078, 0x2789, 0x7810, 0xd0ec, 0x0040,
+       0x18e4, 0x017f, 0x0078, 0x15c0, 0x71c8, 0xa182, 0x0010, 0x0048,
+       0x18ed, 0x2110, 0x71c4, 0x0078, 0x15b8, 0x2011, 0x4f8e, 0x2204,
+       0x007e, 0x2112, 0xc3fd, 0x1078, 0x2789, 0x027f, 0x017f, 0x0078,
+       0x15bf, 0x71c4, 0x72c8, 0xa184, 0xfffd, 0x00c0, 0x15b8, 0xa284,
+       0xfffd, 0x00c0, 0x15b8, 0x2100, 0x7920, 0x7822, 0x2200, 0x7a24,
+       0x7826, 0x0078, 0x15bf, 0x71c4, 0xd1fc, 0x00c0, 0x1913, 0x2011,
+       0x53c0, 0x0078, 0x1915, 0x2011, 0x5440, 0x8107, 0xa084, 0x000f,
+       0x8003, 0x8003, 0x8003, 0xa268, 0x2019, 0x0000, 0x72c8, 0xd2bc,
+       0x0040, 0x1924, 0xa39d, 0x0010, 0xd2b4, 0x0040, 0x1929, 0xa39d,
+       0x0008, 0x2091, 0x8000, 0x6800, 0x007e, 0xa226, 0x0040, 0x1948,
+       0x6a02, 0xd4ec, 0x0040, 0x1935, 0xc3a5, 0xd4e4, 0x0040, 0x1939,
+       0xc39d, 0xd4f4, 0x0040, 0x1948, 0x810f, 0xd2f4, 0x0040, 0x1944,
+       0x1078, 0x2808, 0x0078, 0x1948, 0x1078, 0x27e6, 0x0078, 0x1948,
+       0x72cc, 0x6808, 0xa206, 0x0040, 0x196a, 0xa2a4, 0x00ff, 0x7814,
+       0xd0e4, 0x00c0, 0x195b, 0xa482, 0x0028, 0x0048, 0x1967, 0x0040,
+       0x1967, 0x0078, 0x195f, 0xa482, 0x0043, 0x0048, 0x1967, 0x71c4,
+       0x71c6, 0x027f, 0x72ca, 0x2091, 0x8001, 0x0078, 0x15ba, 0x6a0a,
+       0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4,
+       0x2091, 0x8001, 0x0078, 0x15be, 0x77c4, 0x1078, 0x1e2b, 0x2091,
+       0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc,
+       0x681e, 0x2708, 0x0078, 0x15be, 0x70c4, 0x2061, 0x4f40, 0x6118,
+       0x601a, 0x7810, 0xd0ec, 0x00c0, 0x15c0, 0x70c8, 0x2061, 0x4f80,
+       0x6218, 0x601a, 0x0078, 0x15bf, 0x71c4, 0x72c8, 0x73cc, 0xa182,
+       0x0010, 0x00c8, 0x15b9, 0x1078, 0x282a, 0xa384, 0x4000, 0x0040,
+       0x19a3, 0xa295, 0x0020, 0x0078, 0x15be, 0x77c4, 0x1078, 0x1e2b,
+       0x2091, 0x8000, 0x6a08, 0xc28d, 0x6a0a, 0x2091, 0x8001, 0x2708,
+       0x0078, 0x15bf, 0x77c4, 0x1078, 0x1e2b, 0x2091, 0x8000, 0x6a08,
+       0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x19c1, 0x1078,
+       0x266f, 0x2091, 0x8001, 0x2708, 0x0078, 0x15bf, 0x77c4, 0x1078,
+       0x1e2b, 0x2091, 0x8000, 0x6a08, 0xc295, 0x6a0a, 0x6804, 0xa005,
+       0x0040, 0x19d4, 0x1078, 0x266f, 0x2091, 0x8001, 0x2708, 0x0078,
+       0x15bf, 0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020,
+       0x2091, 0x8000, 0x1078, 0x1e46, 0x2091, 0x8001, 0x2708, 0x6a08,
+       0x0078, 0x15bf, 0x77c4, 0x7814, 0xd0e4, 0x00c0, 0x19fe, 0xd7fc,
+       0x0040, 0x19f8, 0x1078, 0x1dae, 0x0040, 0x19fe, 0x0078, 0x15c3,
+       0x1078, 0x1da1, 0x0040, 0x19fe, 0x0078, 0x15c3, 0x73c8, 0x72cc,
+       0x77c6, 0x73ca, 0x72ce, 0x1078, 0x1ecd, 0x00c0, 0x1a28, 0x6818,
+       0xa005, 0x0040, 0x1a22, 0x2708, 0x077e, 0x1078, 0x285a, 0x077f,
+       0x00c0, 0x1a22, 0x2001, 0x0015, 0xd7fc, 0x00c0, 0x1a1b, 0x2061,
+       0x4f40, 0x0078, 0x1a1e, 0xc0fd, 0x2061, 0x4f80, 0x782a, 0x2091,
+       0x8001, 0x007c, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x15c3,
+       0x2091, 0x8001, 0x0078, 0x15c1, 0x77c4, 0x7814, 0xd0e4, 0x00c0,
+       0x1a40, 0xd7fc, 0x0040, 0x1a3a, 0x1078, 0x1dae, 0x0040, 0x1a40,
+       0x0078, 0x15c3, 0x1078, 0x1da1, 0x0040, 0x1a40, 0x0078, 0x15c3,
+       0x77c6, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091,
+       0x8000, 0x1078, 0x1e46, 0x2009, 0x0016, 0xd7fc, 0x00c0, 0x1a54,
+       0x2061, 0x4f40, 0x0078, 0x1a57, 0x2061, 0x4f80, 0xc1fd, 0x6067,
+       0x0003, 0x607f, 0x0000, 0x6776, 0x6083, 0x000f, 0x792a, 0x61d4,
+       0xc1dc, 0x61d6, 0x1078, 0x266f, 0x2091, 0x8001, 0x007c, 0x77c8,
+       0x77ca, 0x77c4, 0x77c6, 0x7814, 0xd0e4, 0x00c0, 0x1a7e, 0xd7fc,
+       0x0040, 0x1a78, 0x1078, 0x1dae, 0x0040, 0x1a7e, 0x0078, 0x15c3,
+       0x1078, 0x1da1, 0x0040, 0x1a7e, 0x0078, 0x15c3, 0xa7bc, 0xff00,
+       0x2091, 0x8000, 0x2009, 0x0017, 0xd7fc, 0x00c0, 0x1a8b, 0x2061,
+       0x4f40, 0x0078, 0x1a8e, 0x2061, 0x4f80, 0xc1fd, 0x607f, 0x0000,
+       0x6067, 0x0002, 0x6776, 0x6083, 0x000f, 0x792a, 0x61d4, 0xc1dc,
+       0x61d6, 0x1078, 0x266f, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049,
+       0x0005, 0x2051, 0x0010, 0x2091, 0x8000, 0x70c8, 0xa005, 0x0040,
+       0x1aac, 0x60d4, 0xc0fd, 0x60d6, 0x1078, 0x1e46, 0x70c8, 0x6836,
+       0x8738, 0xa784, 0x001f, 0x00c0, 0x1aac, 0x2091, 0x8001, 0x007c,
+       0x2019, 0x0000, 0x7814, 0xd0e4, 0x00c0, 0x1ace, 0x72c8, 0xd284,
+       0x0040, 0x1ac8, 0x1078, 0x1dae, 0x0040, 0x1ace, 0x0078, 0x15c3,
+       0x1078, 0x1da1, 0x0040, 0x1ace, 0x0078, 0x15c3, 0x72c8, 0x72ca,
+       0x78ac, 0xa084, 0x0003, 0x00c0, 0x1af9, 0x2039, 0x0000, 0xd284,
+       0x0040, 0x1adb, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
+       0x0008, 0x1078, 0x1e2b, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d,
+       0x690a, 0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1ae1,
+       0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0,
+       0x1ae1, 0x2091, 0x8000, 0x72c8, 0xd284, 0x00c0, 0x1b0b, 0x7810,
+       0xd0ec, 0x0040, 0x1b07, 0x2069, 0x0100, 0x0078, 0x1b0d, 0x2069,
+       0x0200, 0x0078, 0x1b0d, 0x2069, 0x0100, 0x6808, 0xa084, 0xfffd,
+       0x680a, 0x6830, 0xd0b4, 0x0040, 0x1b2d, 0x684b, 0x0004, 0x20a9,
+       0x0014, 0x6848, 0xd094, 0x0040, 0x1b1f, 0x00f0, 0x1b19, 0x684b,
+       0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, 0x0040, 0x1b29, 0x00f0,
+       0x1b23, 0x20a9, 0x00fa, 0x00f0, 0x1b2b, 0x2079, 0x4f00, 0x2009,
+       0x0018, 0x72c8, 0xd284, 0x00c0, 0x1b39, 0x2061, 0x4f40, 0x0078,
+       0x1b3c, 0x2061, 0x4f80, 0xc1fd, 0x607f, 0x0000, 0x792a, 0x6067,
+       0x0001, 0x6083, 0x000f, 0x60a7, 0x0000, 0x60a8, 0x60b2, 0x60b6,
+       0x60d4, 0xd0b4, 0x0040, 0x1b58, 0xc0b4, 0x60d6, 0x0c7e, 0x60b8,
+       0xa065, 0x6008, 0xc0d4, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f,
+       0x60d4, 0xa084, 0x77ff, 0x60d6, 0x78ac, 0xc08d, 0x78ae, 0x83ff,
+       0x0040, 0x1b63, 0x007c, 0x681b, 0x0047, 0x2091, 0x8001, 0x007c,
+       0x73cc, 0x1078, 0x1aba, 0x69ec, 0x6a48, 0xa185, 0x1800, 0x684a,
+       0xa185, 0x0040, 0x68ee, 0x73cc, 0x2021, 0x0004, 0x20a9, 0x09ff,
+       0x00f0, 0x1b78, 0x8421, 0x00c0, 0x1b76, 0x8319, 0x00c0, 0x1b74,
+       0x69ee, 0x6a4a, 0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x1b8c,
+       0x2069, 0x4f40, 0x0078, 0x1b8e, 0x2069, 0x4f80, 0x71c4, 0x71c6,
+       0x6916, 0x81ff, 0x00c0, 0x1b96, 0x68a7, 0x0001, 0x78ac, 0xc08c,
+       0x78ae, 0xd084, 0x00c0, 0x1b9e, 0x1078, 0x1f2d, 0x007c, 0x75d8,
+       0x74dc, 0x75da, 0x74de, 0x0078, 0x1ba7, 0xa02e, 0x2520, 0x71c4,
+       0x73c8, 0x72cc, 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x4f00, 0x7dde,
+       0x7cda, 0x7bd6, 0x7ad2, 0x1078, 0x1e04, 0x0040, 0x1cd1, 0x20a9,
+       0x0005, 0x20a1, 0x4f14, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001,
+       0x2009, 0x0040, 0x1078, 0x2018, 0x0040, 0x1bca, 0x1078, 0x1e0d,
+       0x0078, 0x1cd1, 0x6004, 0xa08c, 0x00ff, 0xa18e, 0x0009, 0x00c0,
+       0x1bd5, 0x007e, 0x1078, 0x23bf, 0x007f, 0xa084, 0xff00, 0x8007,
+       0x8009, 0x0040, 0x1c61, 0x0c7e, 0x2c68, 0x1078, 0x1e04, 0x0040,
+       0x1c1b, 0x2c00, 0x689e, 0x8109, 0x00c0, 0x1bdc, 0x609f, 0x0000,
+       0x0c7f, 0x0c7e, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, 0x0040,
+       0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, 0x7cda,
+       0x7bd6, 0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0040, 0x1c60, 0x2009,
+       0x0040, 0x1078, 0x2018, 0x00c0, 0x1c3e, 0x6004, 0xa084, 0x00ff,
+       0xa086, 0x0002, 0x00c0, 0x1c1b, 0x6004, 0xa084, 0x00ff, 0xa086,
+       0x000a, 0x00c0, 0x1c17, 0x017e, 0x1078, 0x23bb, 0x017f, 0x2d00,
+       0x6002, 0x0078, 0x1bea, 0x0c7f, 0x0c7e, 0x609c, 0x1078, 0x1e90,
+       0x0c7f, 0x609f, 0x0000, 0x1078, 0x1cd5, 0x2009, 0x0018, 0x6008,
+       0xc0cd, 0x600a, 0x6004, 0x6086, 0x7810, 0x007e, 0x84ff, 0x00c0,
+       0x1c34, 0x85ff, 0x0040, 0x1c36, 0xc0c5, 0x7812, 0x1078, 0x1dbb,
+       0x007f, 0x7812, 0x1078, 0x1e0d, 0x0078, 0x1cd1, 0x0c7f, 0x0c7e,
+       0x609c, 0x1078, 0x1e90, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1cd5,
+       0x2009, 0x0018, 0x6087, 0x0103, 0x601b, 0x0003, 0x7810, 0x007e,
+       0x84ff, 0x00c0, 0x1c56, 0x85ff, 0x0040, 0x1c58, 0xc0c5, 0x7812,
+       0x1078, 0x1dbb, 0x007f, 0x7812, 0x1078, 0x1e0d, 0x0078, 0x1cd1,
+       0x0c7f, 0x7814, 0xd0e4, 0x00c0, 0x1c8f, 0x6114, 0xd1fc, 0x0040,
+       0x1c6f, 0x1078, 0x1dae, 0x0040, 0x1c8f, 0x0078, 0x1c73, 0x1078,
+       0x1da1, 0x0040, 0x1c8f, 0x1078, 0x1cd5, 0x2009, 0x0018, 0x6087,
+       0x0103, 0x601b, 0x0021, 0x7810, 0x007e, 0x84ff, 0x00c0, 0x1c83,
+       0x85ff, 0x0040, 0x1c85, 0xc0c5, 0x7812, 0x1078, 0x1dbb, 0x007f,
+       0x7812, 0x1078, 0x1e0d, 0x2001, 0x4007, 0x0078, 0x15c3, 0x74c4,
+       0x73c8, 0x72cc, 0x6014, 0x2091, 0x8000, 0x0e7e, 0x2009, 0x0012,
+       0xd0fc, 0x00c0, 0x1c9f, 0x2071, 0x4f40, 0x0078, 0x1ca2, 0x2071,
+       0x4f80, 0xc1fd, 0x792a, 0x7067, 0x0005, 0x71d4, 0xc1dc, 0x71d6,
+       0x736a, 0x726e, 0x7472, 0x7076, 0x707b, 0x0000, 0x2c00, 0x707e,
+       0xa02e, 0x2530, 0x611c, 0xa184, 0x0060, 0x0040, 0x1cb9, 0x1078,
+       0x46b6, 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000,
+       0x60b3, 0x0000, 0x6714, 0x6023, 0x0000, 0x6024, 0xa096, 0x0001,
+       0x00c0, 0x1ccc, 0x8000, 0x6026, 0x1078, 0x266f, 0x2091, 0x8001,
+       0x007c, 0x70c3, 0x4005, 0x0078, 0x15c4, 0x20a9, 0x0005, 0x2099,
+       0x4f14, 0x2091, 0x8000, 0x530a, 0x2091, 0x8001, 0x2100, 0xa210,
+       0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x71c4,
+       0x70c7, 0x0000, 0x791e, 0x0078, 0x15c1, 0x71c4, 0x71c6, 0x2168,
+       0x0078, 0x1cf4, 0x2069, 0x1000, 0x690c, 0xa016, 0x2d04, 0xa210,
+       0x8d68, 0x8109, 0x00c0, 0x1cf6, 0xa285, 0x0000, 0x00c0, 0x1d04,
+       0x70c3, 0x4000, 0x0078, 0x1d06, 0x70c3, 0x4003, 0x70ca, 0x0078,
+       0x15c4, 0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8, 0x15b9,
+       0x7966, 0x0078, 0x15c1, 0x7964, 0x71c6, 0x0078, 0x15c1, 0x7900,
+       0x71c6, 0x71c4, 0x7902, 0x0078, 0x15c1, 0x7900, 0x71c6, 0x0078,
+       0x15c1, 0x70c4, 0x2011, 0x0000, 0xa08c, 0x000d, 0x0040, 0x1d36,
+       0x810c, 0x0048, 0x1d32, 0x8210, 0x810c, 0x810c, 0x0048, 0x1d32,
+       0x8210, 0x810c, 0x81ff, 0x00c0, 0x15ba, 0x8210, 0x7a0e, 0xd28c,
+       0x0040, 0x1d62, 0x7910, 0xc1cd, 0x7912, 0x2009, 0x0021, 0x2019,
+       0x0003, 0xd284, 0x0040, 0x1d5c, 0x8108, 0x2019, 0x0041, 0x2011,
+       0x974e, 0x2312, 0x2019, 0x0042, 0x8210, 0x2312, 0x2019, 0x0043,
+       0x8210, 0x2312, 0x2019, 0x0046, 0x8210, 0x2312, 0x2019, 0x0047,
+       0x8210, 0x2312, 0x2019, 0x0006, 0x2011, 0x9753, 0x2112, 0x2011,
+       0x9773, 0x2312, 0x7904, 0x7806, 0x0078, 0x15c0, 0x7804, 0x70c6,
+       0x0078, 0x15c1, 0x71c4, 0xd1fc, 0x00c0, 0x1d72, 0x2011, 0x53c0,
+       0x0078, 0x1d74, 0x2011, 0x5440, 0x8107, 0xa084, 0x000f, 0x8003,
+       0x8003, 0x8003, 0xa268, 0x6a14, 0xd2b4, 0x0040, 0x1d83, 0x2011,
+       0x0001, 0x0078, 0x1d85, 0x2011, 0x0000, 0x6b0c, 0x6800, 0x70da,
+       0x0078, 0x15be, 0x7814, 0xd0f4, 0x0040, 0x1d95, 0x2001, 0x4007,
+       0x70db, 0x0000, 0xa005, 0x0078, 0x1da0, 0xd0fc, 0x0040, 0x1d9f,
+       0x2001, 0x4007, 0x70db, 0x0001, 0xa005, 0x0078, 0x1da0, 0xa006,
+       0x007c, 0x7814, 0xd0f4, 0x0040, 0x1dac, 0x2001, 0x4007, 0x70db,
+       0x0000, 0xa005, 0x0078, 0x1dad, 0xa006, 0x007c, 0x7814, 0xd0fc,
+       0x0040, 0x1db9, 0x2001, 0x4007, 0x70db, 0x0001, 0xa005, 0x0078,
+       0x1dba, 0xa006, 0x007c, 0x7112, 0x721a, 0x731e, 0x7810, 0xd0c4,
+       0x0040, 0x1dc4, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108, 0x810c,
+       0x81a9, 0x8098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x6084, 0x20a2,
+       0x53a6, 0x7007, 0x0001, 0x7974, 0xa184, 0xff00, 0x0040, 0x1de1,
+       0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0078,
+       0x1de4, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006,
+       0xa211, 0x7d10, 0xd5c4, 0x0040, 0x1df1, 0x7b84, 0xa319, 0x7c80,
+       0xa421, 0x7008, 0xd0fc, 0x0040, 0x1df1, 0x7003, 0x0001, 0x7007,
+       0x0006, 0x711a, 0x721e, 0x7d10, 0xd5c4, 0x0040, 0x1e01, 0x7322,
+       0x7426, 0xa084, 0x01e0, 0x007c, 0x7848, 0xa065, 0x0040, 0x1e0c,
+       0x2c04, 0x784a, 0x2063, 0x0000, 0x007c, 0x0f7e, 0x2079, 0x4f00,
+       0x7848, 0x2062, 0x2c00, 0xa005, 0x00c0, 0x1e18, 0x1078, 0x29b2,
+       0x784a, 0x0f7f, 0x007c, 0x2011, 0x9900, 0x7a4a, 0x7bc4, 0x8319,
+       0x0040, 0x1e28, 0xa280, 0x0032, 0x2012, 0x2010, 0x0078, 0x1e1f,
+       0x2013, 0x0000, 0x007c, 0x017e, 0x027e, 0xd7fc, 0x00c0, 0x1e34,
+       0x2011, 0x54c0, 0x0078, 0x1e36, 0x2011, 0x74c0, 0xa784, 0x0f00,
+       0x800b, 0xa784, 0x001f, 0x0040, 0x1e41, 0x8003, 0x8003, 0x8003,
+       0x8003, 0xa105, 0xa268, 0x027f, 0x017f, 0x007c, 0x1078, 0x1e2b,
+       0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xf9ef, 0xa80d,
+       0x690a, 0x0e7e, 0xd7fc, 0x00c0, 0x1e5b, 0x2009, 0x4f53, 0x2071,
+       0x4f40, 0x0078, 0x1e5f, 0x2009, 0x4f93, 0x2071, 0x4f80, 0x210c,
+       0x6804, 0xa005, 0x0040, 0x1e6f, 0xa116, 0x00c0, 0x1e6f, 0x2060,
+       0x6000, 0x6806, 0x017e, 0x200b, 0x0000, 0x0078, 0x1e72, 0x2009,
+       0x0000, 0x017e, 0x6804, 0xa065, 0x0040, 0x1e87, 0x6000, 0x6806,
+       0x1078, 0x1ea2, 0x1078, 0x2064, 0x6810, 0x7908, 0x8109, 0x790a,
+       0x8001, 0x6812, 0x00c0, 0x1e72, 0x7910, 0xc1a5, 0x7912, 0x017f,
+       0x6902, 0x6906, 0x2d00, 0x2060, 0x1078, 0x2b13, 0x0e7f, 0x007c,
+       0xa065, 0x0040, 0x1ea1, 0x2008, 0x609c, 0xa005, 0x0040, 0x1e9e,
+       0x2062, 0x609f, 0x0000, 0xa065, 0x0078, 0x1e94, 0x7848, 0x794a,
+       0x2062, 0x007c, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9, 0x001c,
+       0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828, 0x601a,
+       0x682c, 0x6022, 0x007c, 0x0e7e, 0xd7fc, 0x00c0, 0x1ebd, 0x2071,
+       0x4f40, 0x2031, 0x4fc0, 0x0078, 0x1ec1, 0x2071, 0x4f80, 0x2031,
+       0x51c0, 0x7050, 0xa08c, 0x0200, 0x00c0, 0x1ecb, 0xa608, 0x2d0a,
+       0x8000, 0x7052, 0xa006, 0x0e7f, 0x007c, 0x0f7e, 0xd7fc, 0x00c0,
+       0x1ed5, 0x2079, 0x4f40, 0x0078, 0x1ed7, 0x2079, 0x4f80, 0x1078,
+       0x1e2b, 0x2091, 0x8000, 0x6804, 0x780a, 0xa065, 0x0040, 0x1f2b,
+       0x0078, 0x1ee9, 0x2c00, 0x780a, 0x2060, 0x6000, 0xa065, 0x0040,
+       0x1f2b, 0x6010, 0xa306, 0x00c0, 0x1ee2, 0x600c, 0xa206, 0x00c0,
+       0x1ee2, 0x2c28, 0x784c, 0xac06, 0x00c0, 0x1ef8, 0x0078, 0x1f28,
+       0x6804, 0xac06, 0x00c0, 0x1f06, 0x6000, 0x2060, 0x6806, 0xa005,
+       0x00c0, 0x1f06, 0x6803, 0x0000, 0x0078, 0x1f10, 0x6400, 0x7808,
+       0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1f10, 0x2c00, 0x6802,
+       0x2560, 0x0f7f, 0x1078, 0x1ea2, 0x0f7e, 0x601b, 0x0005, 0x6023,
+       0x0020, 0x0f7f, 0x1078, 0x2064, 0x0f7e, 0x7908, 0x8109, 0x790a,
+       0x6810, 0x8001, 0x6812, 0x00c0, 0x1f28, 0x7810, 0xc0a5, 0x7812,
+       0x2001, 0xffff, 0xa005, 0x0f7f, 0x007c, 0x077e, 0x2700, 0x2039,
+       0x0000, 0xd0fc, 0x0040, 0x1f35, 0xc7fd, 0x2041, 0x0021, 0x2049,
+       0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x1e46, 0x8738,
+       0xa784, 0x001f, 0x00c0, 0x1f3d, 0xa7bc, 0xff00, 0x873f, 0x8738,
+       0x873f, 0xa784, 0x0f00, 0x00c0, 0x1f3d, 0x2091, 0x8001, 0x077f,
+       0x007c, 0x786c, 0x2009, 0x9774, 0x210c, 0xa10d, 0x0040, 0x1f5b,
+       0xa065, 0x0078, 0x23dc, 0x2061, 0x0000, 0x6018, 0xd084, 0x00c0,
+       0x1f7b, 0x7810, 0xd08c, 0x0040, 0x1f6c, 0xc08c, 0x7812, 0xc7fc,
+       0x2069, 0x4f40, 0x0078, 0x1f71, 0xc08d, 0x7812, 0x2069, 0x4f80,
+       0xc7fd, 0x2091, 0x8000, 0x681c, 0x681f, 0x0000, 0x2091, 0x8001,
+       0xa005, 0x00c0, 0x1f7c, 0x007c, 0xa08c, 0xfff0, 0x0040, 0x1f82,
+       0x1078, 0x29b2, 0x0079, 0x1f84, 0x1f94, 0x1f97, 0x1f9d, 0x1fa1,
+       0x1f95, 0x1fa5, 0x1f95, 0x1f95, 0x1f95, 0x1fab, 0x1fdc, 0x1fe0,
+       0x1fe6, 0x1ffb, 0x1f95, 0x1f95, 0x007c, 0x1078, 0x29b2, 0x1078,
+       0x1f2d, 0x2001, 0x8001, 0x0078, 0x2007, 0x2001, 0x8003, 0x0078,
+       0x2007, 0x2001, 0x8004, 0x0078, 0x2007, 0x1078, 0x1f2d, 0x2001,
+       0x8006, 0x0078, 0x2007, 0x2091, 0x8000, 0x077e, 0xd7fc, 0x00c0,
+       0x1fb7, 0x2069, 0x4f40, 0x2039, 0x0009, 0x0078, 0x1fbb, 0x2069,
+       0x4f80, 0x2039, 0x0009, 0x6800, 0xa086, 0x0000, 0x0040, 0x1fc5,
+       0x007f, 0x6f1e, 0x2091, 0x8001, 0x007c, 0x6874, 0x077f, 0xa0bc,
+       0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x1078,
+       0x1e46, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1fcf, 0x2091, 0x8001,
+       0x2001, 0x800a, 0x0078, 0x2007, 0x2001, 0x800c, 0x0078, 0x2007,
+       0x1078, 0x1f2d, 0x2001, 0x800d, 0x0078, 0x2007, 0x7814, 0xd0e4,
+       0x00c0, 0x1ff9, 0xd0ec, 0x0040, 0x1ff3, 0xd7fc, 0x0040, 0x1ff3,
+       0x78e4, 0x0078, 0x1ff4, 0x78e0, 0x70c6, 0x2001, 0x800e, 0x0078,
+       0x2007, 0x0078, 0x1f95, 0xd7fc, 0x0040, 0x2001, 0x78ec, 0x0078,
+       0x2002, 0x78e8, 0x70c6, 0x2001, 0x800f, 0x0078, 0x2007, 0x70c2,
+       0xd7fc, 0x00c0, 0x200f, 0x70db, 0x0000, 0x0078, 0x2011, 0x70db,
+       0x0001, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x4080, 0x007c,
+       0xac80, 0x0001, 0x81ff, 0x0040, 0x2043, 0x2099, 0x0030, 0x20a0,
+       0x700c, 0xa084, 0x03ff, 0x0040, 0x2025, 0x7018, 0x007e, 0x701c,
+       0x007e, 0x7020, 0x007e, 0x7024, 0x007e, 0x7112, 0x81ac, 0x721a,
+       0x731e, 0x7422, 0x7526, 0x7003, 0x0001, 0x7007, 0x0001, 0x7008,
+       0x800b, 0x00c8, 0x2037, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x00c0,
+       0x2043, 0x53a5, 0xa006, 0x7003, 0x0000, 0x7007, 0x0004, 0x007f,
+       0x7026, 0x007f, 0x7022, 0x007f, 0x701e, 0x007f, 0x701a, 0x007c,
+       0x2011, 0x0020, 0x2009, 0x0010, 0x6b0a, 0x6c0e, 0x6803, 0xfd00,
+       0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004,
+       0x8109, 0x00c0, 0x2054, 0x007c, 0x6004, 0x6086, 0x2c08, 0x2063,
+       0x0000, 0x7868, 0xa005, 0x796a, 0x0040, 0x2071, 0x2c02, 0x0078,
+       0x2072, 0x796e, 0x007c, 0x0c7e, 0x2061, 0x4f00, 0x6887, 0x0103,
+       0x2d08, 0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0040, 0x2083,
+       0x2d02, 0x0078, 0x2084, 0x616e, 0x0c7f, 0x007c, 0x2091, 0x8000,
+       0x2c04, 0x786e, 0xa005, 0x00c0, 0x208e, 0x786a, 0x2091, 0x8001,
+       0x609c, 0xa005, 0x0040, 0x20a7, 0x0c7e, 0x2060, 0x2008, 0x609c,
+       0xa005, 0x0040, 0x20a3, 0x2062, 0x609f, 0x0000, 0xa065, 0x609c,
+       0xa005, 0x00c0, 0x209b, 0x7848, 0x794a, 0x2062, 0x0c7f, 0x7848,
+       0x2062, 0x609f, 0x0000, 0xac85, 0x0000, 0x00c0, 0x20b1, 0x1078,
+       0x29b2, 0x784a, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086,
+       0x818e, 0x00c8, 0x20bc, 0xa200, 0x00f0, 0x20b7, 0x8086, 0x818e,
+       0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x20e2, 0xa11a,
+       0x00c8, 0x20e2, 0x8213, 0x818d, 0x0048, 0x20d5, 0xa11a, 0x00c8,
+       0x20d6, 0x00f0, 0x20ca, 0x0078, 0x20da, 0xa11a, 0x2308, 0x8210,
+       0x00f0, 0x20ca, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f,
+       0x157f, 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x20de,
+       0x7d74, 0x70d0, 0xa506, 0x0040, 0x21ce, 0x7810, 0x2050, 0x7800,
+       0xd08c, 0x0040, 0x210a, 0xdaec, 0x0040, 0x210a, 0x0e7e, 0x2091,
+       0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x2107, 0x7008,
+       0x0e7f, 0xa086, 0x0008, 0x0040, 0x210a, 0x0078, 0x21ce, 0x0e7f,
+       0x0078, 0x21ce, 0x1078, 0x1e04, 0x0040, 0x21ce, 0xa046, 0x7970,
+       0x2500, 0x8000, 0xa112, 0x2009, 0x0040, 0x00c8, 0x2119, 0x0078,
+       0x2120, 0x72d0, 0xa206, 0x0040, 0x2120, 0x8840, 0x2009, 0x0080,
+       0x0c7e, 0x7112, 0x7007, 0x0001, 0x2099, 0x0030, 0x20a9, 0x0020,
+       0xac80, 0x0001, 0x20a0, 0x2061, 0x0000, 0x88ff, 0x0040, 0x2132,
+       0x1078, 0x1e04, 0x7008, 0xd0fc, 0x0040, 0x2132, 0x7007, 0x0002,
+       0x2091, 0x8001, 0xa08c, 0x01e0, 0x00c0, 0x2169, 0x53a5, 0x8cff,
+       0x00c0, 0x2147, 0x88ff, 0x0040, 0x21b8, 0x0078, 0x2151, 0x2c00,
+       0x788e, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0, 0x53a5, 0x0078,
+       0x21b8, 0xa046, 0x7218, 0x731c, 0xdac4, 0x0040, 0x2159, 0x7420,
+       0x7524, 0xa292, 0x0040, 0xa39b, 0x0000, 0xa4a3, 0x0000, 0xa5ab,
+       0x0000, 0x721a, 0x731e, 0xdac4, 0x0040, 0x2169, 0x7422, 0x7526,
+       0xa006, 0x7007, 0x0004, 0x0040, 0x21b8, 0x8cff, 0x0040, 0x2172,
+       0x1078, 0x1e0d, 0x0c7f, 0x1078, 0x1e0d, 0xa046, 0x7888, 0x8000,
+       0x788a, 0xa086, 0x0002, 0x0040, 0x2198, 0x7a7c, 0x7b78, 0xdac4,
+       0x0040, 0x2184, 0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004, 0x8004,
+       0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x721a,
+       0x731e, 0xdac4, 0x0040, 0x21ce, 0x7422, 0x7526, 0x0078, 0x21ce,
+       0x6014, 0xd0fc, 0x00c0, 0x21a0, 0x2069, 0x4f40, 0x0078, 0x21a2,
+       0x2069, 0x4f80, 0x2091, 0x8000, 0x681f, 0x0002, 0x88ff, 0x0040,
+       0x21ae, 0xa046, 0x788c, 0x2060, 0x0078, 0x2198, 0x788b, 0x0000,
+       0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091, 0x8001, 0x0078, 0x21ce,
+       0x0c7f, 0x788b, 0x0000, 0x1078, 0x238d, 0x6004, 0xa084, 0x000f,
+       0x1078, 0x21cf, 0x88ff, 0x0040, 0x21cc, 0x788c, 0x2060, 0x6004,
+       0xa084, 0x000f, 0x1078, 0x21cf, 0x0078, 0x20e8, 0x007c, 0x0079,
+       0x21d1, 0x21e1, 0x21ff, 0x221d, 0x21e1, 0x222e, 0x21f2, 0x21e1,
+       0x21e1, 0x21e1, 0x21fd, 0x221b, 0x21e1, 0x21e1, 0x21e1, 0x21e1,
+       0x21e1, 0x2039, 0x0400, 0x78bc, 0xa705, 0x78be, 0x6008, 0xa705,
+       0x600a, 0x1078, 0x2271, 0x609c, 0x78ba, 0x609f, 0x0000, 0x1078,
+       0x2377, 0x007c, 0x78bc, 0xd0c4, 0x0040, 0x21f8, 0x0078, 0x21e1,
+       0x601c, 0xc0bd, 0x601e, 0x0078, 0x2205, 0x1078, 0x23bf, 0x78bc,
+       0xd0c4, 0x0040, 0x2205, 0x0078, 0x21e1, 0x78bf, 0x0000, 0x6004,
+       0x8007, 0xa084, 0x00ff, 0x78b2, 0x8001, 0x0040, 0x2218, 0x1078,
+       0x2271, 0x0040, 0x2218, 0x78bc, 0xc0c5, 0x78be, 0x0078, 0x221a,
+       0x0078, 0x2290, 0x007c, 0x1078, 0x23bb, 0x78bc, 0xa08c, 0x0e00,
+       0x00c0, 0x2225, 0xd0c4, 0x00c0, 0x2227, 0x0078, 0x21e1, 0x1078,
+       0x2271, 0x00c0, 0x222d, 0x0078, 0x2290, 0x007c, 0x78bc, 0xd0c4,
+       0x0040, 0x2234, 0x0078, 0x21e1, 0x78bf, 0x0000, 0x6714, 0x2011,
+       0x0001, 0x22a8, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040, 0x2254,
+       0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0040, 0x2254,
+       0xa7bc, 0x8000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e, 0x0002,
+       0x0040, 0x2254, 0x0078, 0x226e, 0x1078, 0x1e2b, 0x2d00, 0x2091,
+       0x8000, 0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084, 0xffde,
+       0x680a, 0xade8, 0x0010, 0x2091, 0x8001, 0x00f0, 0x2257, 0x8211,
+       0x0040, 0x226e, 0x20a9, 0x0100, 0x0078, 0x2257, 0x1078, 0x1e0d,
+       0x007c, 0x609f, 0x0000, 0x78b4, 0xa06d, 0x2c00, 0x78b6, 0x00c0,
+       0x227c, 0x78ba, 0x0078, 0x2284, 0x689e, 0x2d00, 0x6002, 0x78b8,
+       0xad06, 0x00c0, 0x2284, 0x6002, 0x78b0, 0x8001, 0x78b2, 0x00c0,
+       0x228f, 0x78bc, 0xc0c4, 0x78be, 0x78b8, 0x2060, 0xa006, 0x007c,
+       0x0e7e, 0xa02e, 0x2530, 0x7dba, 0x7db6, 0x65ae, 0x65b2, 0x601c,
+       0x60a2, 0x2048, 0xa984, 0xe1ff, 0x601e, 0xa984, 0x0060, 0x0040,
+       0x22a3, 0x1078, 0x46b6, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x6714,
+       0x2071, 0x4f80, 0xd7fc, 0x00c0, 0x22af, 0x2071, 0x4f40, 0xa784,
+       0x0f00, 0x800b, 0xa784, 0x001f, 0x0040, 0x22ba, 0x8003, 0x8003,
+       0x8003, 0x8003, 0xa105, 0x71c4, 0xa168, 0x2700, 0x8007, 0xa084,
+       0x000f, 0x8003, 0x8003, 0x8003, 0x71c8, 0xa100, 0x60c2, 0x2091,
+       0x8000, 0x7814, 0xd0c4, 0x0040, 0x22df, 0xd0ec, 0x0040, 0x22db,
+       0xd7fc, 0x00c0, 0x22d8, 0xd0f4, 0x00c0, 0x22e6, 0x0078, 0x22df,
+       0xd0fc, 0x00c0, 0x22e6, 0x7810, 0xd0f4, 0x00c0, 0x22e6, 0x6e08,
+       0xd684, 0x0040, 0x2310, 0xd9fc, 0x00c0, 0x2310, 0x2091, 0x8001,
+       0x1078, 0x1ea2, 0x2091, 0x8000, 0x1078, 0x2064, 0x2091, 0x8001,
+       0x7814, 0xd0e4, 0x00c0, 0x2375, 0x7814, 0xd0c4, 0x0040, 0x2375,
+       0xd0ec, 0x0040, 0x2308, 0xd7fc, 0x00c0, 0x2303, 0xd0f4, 0x00c0,
+       0x230c, 0x0078, 0x2375, 0xd0fc, 0x00c0, 0x230c, 0x0078, 0x2375,
+       0x7810, 0xd0f4, 0x0040, 0x2375, 0x601b, 0x0021, 0x0078, 0x2375,
+       0x6024, 0xa096, 0x0001, 0x00c0, 0x2317, 0x8000, 0x6026, 0x6a10,
+       0x6814, 0xa202, 0x0048, 0x232a, 0x0040, 0x232a, 0x2091, 0x8001,
+       0x2039, 0x0200, 0x609c, 0x78ba, 0x609f, 0x0000, 0x1078, 0x2377,
+       0x0078, 0x2375, 0x2c08, 0xd9fc, 0x0040, 0x2352, 0x6800, 0xa065,
+       0x0040, 0x2352, 0x6a04, 0x7000, 0xa084, 0x0002, 0x0040, 0x2348,
+       0x704c, 0xa206, 0x00c0, 0x2348, 0x6b04, 0x2160, 0x2304, 0x6002,
+       0xa005, 0x00c0, 0x2344, 0x6902, 0x2260, 0x6102, 0x0078, 0x235e,
+       0x2d00, 0x2060, 0x1078, 0x2b13, 0x6e08, 0x2160, 0x6202, 0x6906,
+       0x0078, 0x235e, 0x6800, 0x6902, 0xa065, 0x0040, 0x235a, 0x6102,
+       0x0078, 0x235b, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160, 0xd9fc,
+       0x0040, 0x2365, 0xa6b4, 0xfffc, 0x6e0a, 0x6810, 0x7d08, 0x8528,
+       0x7d0a, 0x8000, 0x6812, 0x2091, 0x8001, 0xd6b4, 0x0040, 0x2375,
+       0xa6b6, 0x0040, 0x6e0a, 0x1078, 0x1eb3, 0x0e7f, 0x007c, 0x6008,
+       0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x2064, 0x2091, 0x8001,
+       0x78b8, 0xa065, 0x0040, 0x238a, 0x609c, 0x78ba, 0x609f, 0x0000,
+       0x0078, 0x2377, 0x78b6, 0x78ba, 0x007c, 0x7970, 0x7874, 0x2818,
+       0xd384, 0x0040, 0x2397, 0x8000, 0xa112, 0x0048, 0x239c, 0x8000,
+       0xa112, 0x00c8, 0x23ac, 0xc384, 0x7a7c, 0x721a, 0x7a78, 0x721e,
+       0xdac4, 0x0040, 0x23a7, 0x7a84, 0x7222, 0x7a80, 0x7226, 0xa006,
+       0xd384, 0x0040, 0x23ac, 0x8000, 0x7876, 0x70d2, 0x781c, 0xa005,
+       0x0040, 0x23ba, 0x8001, 0x781e, 0x00c0, 0x23ba, 0x0068, 0x23ba,
+       0x2091, 0x4080, 0x007c, 0x2039, 0x23d3, 0x0078, 0x23c1, 0x2039,
+       0x23d9, 0x2704, 0xa005, 0x0040, 0x23d2, 0xac00, 0x2068, 0x6908,
+       0x6810, 0x6912, 0x680a, 0x690c, 0x6814, 0x6916, 0x680e, 0x8738,
+       0x0078, 0x23c1, 0x007c, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b,
+       0x0000, 0x0015, 0x001b, 0x0000, 0x2041, 0x0000, 0x780c, 0x0079,
+       0x23e1, 0x25b3, 0x2586, 0x23e5, 0x245e, 0x2039, 0x9774, 0x2734,
+       0x7d10, 0x0078, 0x2405, 0x6084, 0xa086, 0x0103, 0x00c0, 0x2447,
+       0x6114, 0x6018, 0xa105, 0x0040, 0x23fa, 0x86ff, 0x00c0, 0x2416,
+       0x0078, 0x2447, 0x8603, 0xa080, 0x9755, 0x620c, 0x2202, 0x8000,
+       0x6210, 0x2202, 0x1078, 0x2086, 0x8630, 0xa68e, 0x000f, 0x0040,
+       0x24d2, 0x786c, 0xa065, 0x00c0, 0x23eb, 0x7808, 0xa602, 0x00c8,
+       0x2416, 0xd5ac, 0x00c0, 0x2416, 0x263a, 0x007c, 0xa682, 0x0003,
+       0x00c8, 0x24d2, 0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084,
+       0x00c0, 0x2442, 0x2011, 0x9755, 0x2204, 0x70c6, 0x8210, 0x2204,
+       0x70ca, 0xd684, 0x00c0, 0x2432, 0x8210, 0x2204, 0x70da, 0x8210,
+       0x2204, 0x70de, 0xa685, 0x8020, 0x70c2, 0x681b, 0x0001, 0x2091,
+       0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091, 0x8001, 0x203b,
+       0x0000, 0x007c, 0x7810, 0xc0ad, 0x7812, 0x0078, 0x24d2, 0x263a,
+       0x1078, 0x25bd, 0x00c0, 0x25e0, 0x786c, 0xa065, 0x00c0, 0x23eb,
+       0x2091, 0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0040, 0x2459,
+       0xc0ad, 0x7812, 0x2091, 0x8001, 0x0078, 0x25e0, 0x2039, 0x9774,
+       0x2734, 0x7d10, 0x0078, 0x247a, 0x6084, 0xa086, 0x0103, 0x00c0,
+       0x24bb, 0x6114, 0x6018, 0xa105, 0x0040, 0x2473, 0x86ff, 0x00c0,
+       0x248b, 0x0078, 0x24bb, 0xa680, 0x9755, 0x620c, 0x2202, 0x1078,
+       0x2086, 0x8630, 0xa68e, 0x001e, 0x0040, 0x24d2, 0x786c, 0xa065,
+       0x00c0, 0x2464, 0x7808, 0xa602, 0x00c8, 0x248b, 0xd5ac, 0x00c0,
+       0x248b, 0x263a, 0x007c, 0xa682, 0x0006, 0x00c8, 0x24d2, 0x2091,
+       0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, 0x24b6, 0x2011,
+       0x9755, 0x2009, 0x974e, 0x26a8, 0x211c, 0x2204, 0x201a, 0x8108,
+       0x8210, 0x00f0, 0x249c, 0xa685, 0x8030, 0x70c2, 0x681b, 0x0001,
        0x2091, 0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091, 0x8001,
-       0x203b, 0x0000, 0x007c, 0x7810, 0xc0ad, 0x7812, 0x0078, 0x248b,
-       0x263a, 0x1078, 0x2576, 0x00c0, 0x2599, 0x786c, 0xa065, 0x00c0,
-       0x23a4, 0x2091, 0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0040,
-       0x2412, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0078, 0x2599, 0x2039,
-       0x9674, 0x2734, 0x7d10, 0x0078, 0x2433, 0x6084, 0xa086, 0x0103,
-       0x00c0, 0x2474, 0x6114, 0x6018, 0xa105, 0x0040, 0x242c, 0x86ff,
-       0x00c0, 0x2444, 0x0078, 0x2474, 0xa680, 0x9655, 0x620c, 0x2202,
-       0x1078, 0x203f, 0x8630, 0xa68e, 0x001e, 0x0040, 0x248b, 0x786c,
-       0xa065, 0x00c0, 0x241d, 0x7808, 0xa602, 0x00c8, 0x2444, 0xd5ac,
-       0x00c0, 0x2444, 0x263a, 0x007c, 0xa682, 0x0006, 0x00c8, 0x248b,
-       0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, 0x246f,
-       0x2011, 0x9655, 0x2009, 0x964e, 0x26a8, 0x211c, 0x2204, 0x201a,
-       0x8108, 0x8210, 0x00f0, 0x2455, 0xa685, 0x8030, 0x70c2, 0x681b,
-       0x0001, 0x2091, 0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091,
-       0x8001, 0xa006, 0x2009, 0x9675, 0x200a, 0x203a, 0x007c, 0x7810,
-       0xc0ad, 0x7812, 0x0078, 0x248b, 0x263a, 0x1078, 0x2576, 0x00c0,
-       0x2599, 0x786c, 0xa065, 0x00c0, 0x241d, 0x2091, 0x8000, 0x7810,
-       0xa084, 0xffcf, 0x86ff, 0x0040, 0x2486, 0xc0ad, 0x7812, 0x2091,
-       0x8001, 0x0078, 0x2599, 0x2091, 0x8000, 0x7007, 0x0004, 0x7994,
-       0x70d4, 0xa102, 0x0048, 0x249c, 0x0040, 0x24a6, 0x7b90, 0xa302,
-       0x00c0, 0x24a6, 0x0078, 0x249f, 0x8002, 0x00c0, 0x24a6, 0x263a,
-       0x7810, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x007c, 0xa184, 0xff00,
-       0x0040, 0x24b3, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007,
-       0xa100, 0x0078, 0x24b6, 0x8107, 0x8004, 0x8004, 0x7a9c, 0xa210,
-       0x721a, 0x7a98, 0xa006, 0xa211, 0x721e, 0xd4c4, 0x0040, 0x24c6,
-       0x7aa4, 0xa211, 0x7222, 0x7aa0, 0xa211, 0x7226, 0x20a1, 0x0030,
-       0x7003, 0x0000, 0x2009, 0x9654, 0x260a, 0x8109, 0x2198, 0x2104,
-       0xd084, 0x0040, 0x24d4, 0x8633, 0xa6b0, 0x0002, 0x26a8, 0x53a6,
-       0x8603, 0x7012, 0x7007, 0x0001, 0x7990, 0x7894, 0x8000, 0xa10a,
-       0x00c8, 0x24e3, 0xa006, 0x2028, 0x7974, 0xa184, 0xff00, 0x0040,
-       0x24f2, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
-       0x0078, 0x24f5, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78,
-       0xa006, 0xa211, 0xd4c4, 0x0040, 0x2501, 0x7b84, 0xa319, 0x7c80,
-       0xa421, 0x7008, 0xd0fc, 0x0040, 0x2501, 0xa084, 0x01e0, 0x0040,
-       0x2526, 0x7d10, 0x2031, 0x9654, 0x2634, 0x78a8, 0x8000, 0x78aa,
-       0xd08c, 0x00c0, 0x251b, 0x7007, 0x0006, 0x7004, 0xd094, 0x00c0,
-       0x2515, 0x0078, 0x248d, 0x2069, 0x4e47, 0x206b, 0x0003, 0x78ac,
-       0xa085, 0x0300, 0x78ae, 0xa006, 0x0078, 0x252f, 0x2030, 0x75d6,
-       0x2091, 0x4080, 0x7d96, 0x7d10, 0xa5ac, 0xffcf, 0x7d12, 0x2091,
-       0x8001, 0x78aa, 0x7007, 0x0006, 0x263a, 0x7003, 0x0001, 0x711a,
-       0x721e, 0xd5c4, 0x0040, 0x253e, 0x7322, 0x7426, 0x007c, 0x6084,
-       0xa086, 0x0103, 0x00c0, 0x2562, 0x6114, 0x6018, 0xa105, 0x00c0,
-       0x2562, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, 0x2562, 0x600c,
-       0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, 0x2091,
-       0x4080, 0x1078, 0x203f, 0x0068, 0x2561, 0x786c, 0xa065, 0x00c0,
-       0x253f, 0x007c, 0x1078, 0x2576, 0x00c0, 0x2599, 0x786c, 0xa065,
-       0x00c0, 0x253f, 0x0078, 0x2599, 0x1078, 0x2576, 0x00c0, 0x2599,
-       0x786c, 0xa065, 0x00c0, 0x256c, 0x0078, 0x2599, 0x6084, 0xa086,
-       0x0103, 0x00c0, 0x258a, 0x6018, 0xc0fc, 0x601a, 0xa086, 0x0004,
-       0x00c0, 0x258a, 0x7804, 0xd0a4, 0x0040, 0x258a, 0x1078, 0x203f,
-       0xa006, 0x007c, 0x1078, 0x259f, 0x00c0, 0x2591, 0xa085, 0x0001,
-       0x007c, 0x1078, 0x25ae, 0x00c0, 0x2597, 0x2041, 0x0001, 0x7d10,
-       0x007c, 0x88ff, 0x0040, 0x259e, 0x2091, 0x4080, 0x007c, 0x7b90,
-       0x7994, 0x70d4, 0xa102, 0x00c0, 0x25a8, 0xa385, 0x0000, 0x007c,
-       0x0048, 0x25ac, 0xa302, 0x007c, 0x8002, 0x007c, 0x7810, 0xd0ec,
-       0x0040, 0x25c6, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004,
-       0xa005, 0x00c0, 0x25c3, 0x7008, 0x0e7f, 0xa086, 0x0008, 0x0040,
-       0x25c6, 0x0078, 0x2617, 0x0e7f, 0x0078, 0x2617, 0xa184, 0xff00,
-       0x0040, 0x25d3, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007,
-       0xa100, 0x0078, 0x25d6, 0x8107, 0x8004, 0x8004, 0x7a9c, 0x7b98,
-       0x7ca4, 0x7da0, 0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009,
-       0x0018, 0x6028, 0xa005, 0x0040, 0x25e7, 0x2009, 0x0040, 0x1078,
-       0x1d74, 0x0040, 0x2609, 0x78a8, 0x8000, 0x78aa, 0xd08c, 0x00c0,
-       0x2617, 0x6014, 0xd0fc, 0x00c0, 0x25f9, 0x2069, 0x4e40, 0x0078,
-       0x25fb, 0x2069, 0x4e80, 0x2091, 0x8000, 0x681f, 0x0003, 0x78ab,
-       0x0000, 0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091, 0x8001, 0x0078,
-       0x2617, 0x78ab, 0x0000, 0x1078, 0x203f, 0x7990, 0x7894, 0x8000,
-       0xa10a, 0x00c8, 0x2614, 0xa006, 0x7896, 0x70d6, 0xa006, 0x2071,
-       0x0010, 0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x2623, 0x2009,
-       0x4e59, 0x0078, 0x2625, 0x2009, 0x4e99, 0x2091, 0x8000, 0x200a,
-       0x0f7e, 0xd7fc, 0x00c0, 0x263c, 0x2009, 0x4e40, 0x2001, 0x4e04,
-       0x2004, 0xd0ec, 0x0040, 0x2638, 0x2079, 0x0100, 0x0078, 0x2640,
-       0x2079, 0x0200, 0x0078, 0x2640, 0x2009, 0x4e80, 0x2079, 0x0100,
-       0x2104, 0xa086, 0x0000, 0x00c0, 0x2659, 0xd7fc, 0x00c0, 0x264c,
-       0x2009, 0x4e45, 0x0078, 0x264e, 0x2009, 0x4e85, 0x2104, 0xa005,
-       0x00c0, 0x2659, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x2659, 0x781b,
-       0x0045, 0x0f7f, 0x007c, 0x2009, 0x0002, 0x2069, 0x4e00, 0x6810,
-       0xd0ec, 0x00c0, 0x26c8, 0x2071, 0x4e80, 0x2079, 0x0100, 0x2021,
-       0x50bf, 0x784b, 0x000f, 0x2019, 0x4457, 0xd184, 0x0040, 0x267c,
-       0x6810, 0xd0ec, 0x0040, 0x2678, 0x20a1, 0x012b, 0x0078, 0x267e,
-       0x20a1, 0x022b, 0x0078, 0x267e, 0x20a1, 0x012b, 0x2304, 0xa005,
-       0x0040, 0x268b, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398, 0x53a6,
-       0x3318, 0x0078, 0x267e, 0x789b, 0x0020, 0x20a9, 0x0010, 0x6814,
-       0xd0e4, 0x0040, 0x269b, 0x78af, 0x0000, 0x78af, 0x9020, 0x00f0,
-       0x2693, 0x0078, 0x26a1, 0x78af, 0x0000, 0x78af, 0x8020, 0x00f0,
-       0x269b, 0x7003, 0x0000, 0x017e, 0xd18c, 0x2009, 0x0000, 0x0040,
-       0x26aa, 0xc1bd, 0x1078, 0x289b, 0x017f, 0x7020, 0xa084, 0x000f,
-       0x007e, 0x6814, 0xd0e4, 0x007f, 0x00c0, 0x26ba, 0xa085, 0x6340,
-       0x0078, 0x26bc, 0xa085, 0x62c0, 0x7806, 0x780f, 0x9200, 0x7843,
-       0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x7456, 0x7053, 0x0000,
-       0x8109, 0x0040, 0x26db, 0x2071, 0x4e40, 0x6810, 0xd0ec, 0x0040,
-       0x26d5, 0x2079, 0x0100, 0x0078, 0x26d7, 0x2079, 0x0200, 0x2021,
-       0x4ebf, 0x0078, 0x2669, 0x007c, 0x017e, 0xd1bc, 0x00c0, 0x26f0,
-       0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x26ec,
-       0x2011, 0x0101, 0x0078, 0x26f2, 0x2011, 0x0201, 0x0078, 0x26f2,
-       0x2011, 0x0101, 0xa18c, 0x000f, 0x2204, 0xa084, 0xfff0, 0xa105,
-       0x2012, 0x017f, 0x1078, 0x289b, 0x007c, 0xd3fc, 0x00c0, 0x2710,
-       0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x270c,
-       0x2011, 0x0101, 0x0078, 0x2712, 0x2011, 0x0201, 0x0078, 0x2712,
-       0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, 0x00f0, 0x2714, 0xa18c,
-       0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2019,
-       0x0002, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x0040, 0x272c, 0x8319,
-       0x2009, 0x0101, 0x0078, 0x272e, 0x2009, 0x0101, 0x20a9, 0x0005,
-       0x8213, 0x00f0, 0x2730, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f,
-       0xa205, 0x200a, 0x8319, 0x0040, 0x2741, 0x2009, 0x0201, 0x0078,
-       0x272e, 0x007c, 0xd3fc, 0x00c0, 0x2755, 0x007e, 0x2001, 0x4e04,
-       0x2004, 0xd0ec, 0x007f, 0x0040, 0x2751, 0x2011, 0x0101, 0x0078,
-       0x2757, 0x2011, 0x0201, 0x0078, 0x2757, 0x2011, 0x0101, 0x20a9,
-       0x000c, 0x810b, 0x00f0, 0x2759, 0xa18c, 0xf000, 0x2204, 0xa084,
-       0x0fff, 0xa105, 0x2012, 0x007c, 0xd3fc, 0x00c0, 0x2777, 0x007e,
-       0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2773, 0x2011,
-       0x0102, 0x0078, 0x2779, 0x2011, 0x0202, 0x0078, 0x2779, 0x2011,
-       0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c, 0x0c7e,
-       0xd1bc, 0x00c0, 0x2793, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec,
-       0x007f, 0x0040, 0x278f, 0x2061, 0x0100, 0x0078, 0x2795, 0x2061,
-       0x0200, 0x0078, 0x2795, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003,
-       0xa080, 0x0020, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x0c7e,
-       0xd1bc, 0x00c0, 0x27b3, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec,
-       0x007f, 0x0040, 0x27af, 0x2061, 0x0100, 0x0078, 0x27b5, 0x2061,
-       0x0200, 0x0078, 0x27b5, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003,
-       0xa080, 0x0022, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x0c7f,
-       0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x27d5, 0x007e, 0x2001, 0x4e04,
-       0x2004, 0xd0ec, 0x007f, 0x0040, 0x27d1, 0x2061, 0x0100, 0x0078,
-       0x27d7, 0x2061, 0x0200, 0x0078, 0x27d7, 0x2061, 0x0100, 0xc1bc,
-       0x8103, 0x8003, 0xa080, 0x0022, 0x609a, 0x60a4, 0xa085, 0x0020,
-       0x60ae, 0x0c7f, 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x27f7, 0x007e,
-       0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x27f3, 0x2061,
-       0x0100, 0x0078, 0x27f9, 0x2061, 0x0200, 0x0078, 0x27f9, 0x2061,
-       0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x60a4,
-       0xa28c, 0x0020, 0x0040, 0x2807, 0xc2ac, 0xa39d, 0x4000, 0xc3fc,
-       0xd3b4, 0x00c0, 0x280c, 0xc3fd, 0x62ae, 0x2010, 0x60a4, 0x63ae,
-       0x2018, 0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818,
-       0xa005, 0x0040, 0x2879, 0xd1fc, 0x0040, 0x2822, 0x2061, 0x95d0,
-       0x0078, 0x2824, 0x2061, 0x94c0, 0x1078, 0x2881, 0x0040, 0x285b,
-       0x20a9, 0x0101, 0xd1fc, 0x0040, 0x2831, 0x2061, 0x94d0, 0x0078,
-       0x2833, 0x2061, 0x93c0, 0x0c7e, 0x1078, 0x2881, 0x0040, 0x283e,
-       0x0c7f, 0x8c60, 0x00f0, 0x2833, 0x0078, 0x2879, 0x007f, 0xd1fc,
-       0x0040, 0x2848, 0xa082, 0x94d0, 0x2071, 0x4e80, 0x0078, 0x284c,
-       0xa082, 0x93c0, 0x2071, 0x4e40, 0x707a, 0x7176, 0x2138, 0x2001,
-       0x0004, 0x7066, 0x7083, 0x000f, 0x71d4, 0xc1dc, 0x71d6, 0x1078,
-       0x261c, 0x0078, 0x2875, 0xd1fc, 0x00c0, 0x2862, 0x2071, 0x4e40,
-       0x0078, 0x2864, 0x2071, 0x4e80, 0x6020, 0xc0dd, 0x6022, 0x7176,
-       0x2138, 0x2c00, 0x707e, 0x2001, 0x0006, 0x7066, 0x7083, 0x000f,
-       0x71d4, 0xc1dc, 0x71d6, 0x1078, 0x261c, 0x2001, 0x0000, 0x0078,
-       0x287b, 0x2001, 0x0001, 0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f,
-       0x007c, 0x2c04, 0xa005, 0x0040, 0x2898, 0x2060, 0x6010, 0xa306,
-       0x00c0, 0x2895, 0x600c, 0xa206, 0x00c0, 0x2895, 0x6014, 0xa106,
-       0x00c0, 0x2895, 0xa006, 0x0078, 0x289a, 0x6000, 0x0078, 0x2882,
-       0xa085, 0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x017e, 0xd1bc, 0x00c0,
-       0x28b3, 0x2079, 0x4e40, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec,
-       0x007f, 0x0040, 0x28af, 0x2071, 0x0100, 0x0078, 0x28b7, 0x2071,
-       0x0200, 0x0078, 0x28b7, 0x2079, 0x4e80, 0x2071, 0x0100, 0x7920,
-       0xa18c, 0x000f, 0x70ec, 0xd0c4, 0x00c0, 0x28c1, 0x017f, 0x0078,
-       0x28dc, 0x810b, 0x810b, 0x810b, 0x810b, 0x007f, 0xd0bc, 0x00c0,
-       0x28d9, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040,
-       0x28d5, 0xa18d, 0x0f00, 0x0078, 0x28db, 0xa18d, 0x0f00, 0x0078,
-       0x28db, 0xa18d, 0x0800, 0x2104, 0x0e7f, 0x0f7f, 0x007c, 0x0e7e,
-       0x2001, 0x4e01, 0x2004, 0xd0ac, 0x00c0, 0x295c, 0x68e4, 0xd0ac,
-       0x0040, 0x295c, 0xa084, 0x0006, 0x00c0, 0x295c, 0x6014, 0xd0fc,
-       0x00c0, 0x28f6, 0x2071, 0x52c0, 0x0078, 0x28f8, 0x2071, 0x5340,
-       0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xae70, 0x7004,
-       0xa084, 0x000a, 0x00c0, 0x295c, 0x7108, 0xa194, 0xff00, 0x0040,
-       0x295c, 0xa18c, 0x00ff, 0x2001, 0x000a, 0xa106, 0x0040, 0x292b,
-       0x2001, 0x000c, 0xa106, 0x0040, 0x292f, 0x2001, 0x0012, 0xa106,
-       0x0040, 0x2933, 0x2001, 0x0014, 0xa106, 0x0040, 0x2937, 0x2001,
-       0x0019, 0xa106, 0x0040, 0x293b, 0x2001, 0x0032, 0xa106, 0x0040,
-       0x293f, 0x0078, 0x2943, 0x2009, 0x000c, 0x0078, 0x2945, 0x2009,
-       0x0012, 0x0078, 0x2945, 0x2009, 0x0014, 0x0078, 0x2945, 0x2009,
-       0x0019, 0x0078, 0x2945, 0x2009, 0x0020, 0x0078, 0x2945, 0x2009,
-       0x003f, 0x0078, 0x2945, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a,
-       0x2071, 0x4e00, 0x7004, 0xd0bc, 0x0040, 0x295c, 0x6014, 0xd0fc,
-       0x00c0, 0x2957, 0x70ea, 0x2071, 0x4e40, 0x0078, 0x295a, 0x70ee,
-       0x2071, 0x4e80, 0x701f, 0x000d, 0x0e7f, 0x007c, 0x2001, 0x4e05,
-       0x2004, 0xd0e4, 0x00c0, 0x296a, 0x7804, 0xa084, 0xff1f, 0xa085,
-       0x6340, 0x7806, 0x007c, 0x0068, 0x296b, 0x2091, 0x8000, 0x2071,
-       0x0000, 0x007e, 0x7018, 0xd084, 0x00c0, 0x2972, 0x007f, 0x2071,
-       0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x080f,
-       0x70df, 0x0000, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080,
-       0x0078, 0x2988, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, 0x708e,
-       0x7592, 0x7496, 0x769a, 0x779e, 0xa594, 0x003f, 0xd4f4, 0x0040,
-       0x299f, 0xa784, 0x007d, 0x00c0, 0x43cd, 0x1078, 0x296b, 0xa49c,
-       0x000f, 0xa382, 0x0004, 0x0050, 0x29aa, 0xa3a6, 0x0007, 0x00c0,
-       0x296b, 0x2418, 0x8507, 0xa084, 0x000f, 0x0079, 0x29af, 0x3028,
-       0x3119, 0x3144, 0x33b6, 0x379f, 0x3819, 0x38ce, 0x395f, 0x3a4d,
-       0x3b3c, 0x29c2, 0x29bf, 0x2df9, 0x2f1c, 0x3770, 0x29bf, 0x1078,
-       0x296b, 0x007c, 0xa006, 0x0078, 0x29cc, 0x7808, 0xc08d, 0x780a,
-       0xa006, 0x7002, 0x704e, 0x7046, 0x70d2, 0x7060, 0xa005, 0x00c0,
-       0x2b32, 0x7064, 0xa084, 0x0007, 0x0079, 0x29d6, 0x29de, 0x2a51,
-       0x2a5a, 0x2a65, 0x2a70, 0x2b18, 0x2a7b, 0x2a51, 0x7830, 0xd0bc,
-       0x00c0, 0x29c1, 0x71d4, 0xd1bc, 0x00c0, 0x29c1, 0xd1b4, 0x00c0,
-       0x2a2e, 0x70a4, 0xa086, 0x0001, 0x0040, 0x29c1, 0x70b4, 0xa06d,
-       0x6800, 0xa065, 0xa055, 0x789b, 0x0010, 0x6b0c, 0x7baa, 0x6808,
-       0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0040,
-       0x2a04, 0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001,
-       0x0010, 0x0078, 0x2c8c, 0x7060, 0xa005, 0x00c0, 0x29c1, 0x0c7e,
-       0x0d7e, 0x70b4, 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0010,
-       0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d,
-       0xa886, 0x0001, 0x0040, 0x2a27, 0x69bc, 0x7daa, 0x79aa, 0x68c0,
-       0xa04d, 0x6e1c, 0x2001, 0x0020, 0x0078, 0x2c8c, 0x1078, 0x4360,
-       0x00c0, 0x29c1, 0x781b, 0x005b, 0x70bc, 0xa06d, 0x68b4, 0x785a,
-       0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d,
-       0x780a, 0x68bc, 0x7042, 0xc1b4, 0x71d6, 0x70b8, 0xa065, 0x68c0,
-       0x705a, 0x7003, 0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046,
-       0x007c, 0x1078, 0x4360, 0x00c0, 0x2a59, 0x781b, 0x0047, 0x7003,
-       0x0004, 0x007c, 0x1078, 0x4360, 0x00c0, 0x2a64, 0x2011, 0x000c,
-       0x1078, 0x2a8b, 0x7003, 0x0004, 0x007c, 0x1078, 0x4360, 0x00c0,
-       0x2a6f, 0x2011, 0x0006, 0x1078, 0x2a8b, 0x7003, 0x0004, 0x007c,
-       0x1078, 0x4360, 0x00c0, 0x2a7a, 0x2011, 0x000d, 0x1078, 0x2a8b,
-       0x7003, 0x0004, 0x007c, 0x1078, 0x4360, 0x00c0, 0x2a8a, 0x2011,
-       0x0006, 0x1078, 0x2a8b, 0x707c, 0x707f, 0x0000, 0x2068, 0x704e,
-       0x7003, 0x0001, 0x007c, 0x7174, 0xc1fc, 0x8107, 0x7882, 0x789b,
-       0x0010, 0xa286, 0x000c, 0x00c0, 0x2a9a, 0x7aaa, 0x2001, 0x0001,
-       0x0078, 0x2aaf, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0xa286,
-       0x000d, 0x0040, 0x2aa8, 0x7aaa, 0x2001, 0x0002, 0x0078, 0x2aaf,
-       0x78ab, 0x0020, 0x7178, 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b,
-       0x0060, 0x78aa, 0x785b, 0x0004, 0x781b, 0x0116, 0x1078, 0x4383,
-       0x7083, 0x000f, 0x70d4, 0xd0b4, 0x0040, 0x2acb, 0xc0b4, 0x70d6,
-       0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018,
-       0x8001, 0x601a, 0x0c7f, 0x007c, 0x7014, 0xa005, 0x00c0, 0x2ada,
-       0x70d4, 0xd0b4, 0x0040, 0x2adb, 0x70b8, 0xac06, 0x00c0, 0x2adb,
-       0x1078, 0x2aba, 0x007c, 0x017e, 0x71a4, 0xa186, 0x0001, 0x0040,
-       0x2b0d, 0x0d7e, 0x027e, 0x2100, 0x2011, 0x0001, 0xa212, 0x70b4,
-       0x2068, 0x6800, 0xac06, 0x0040, 0x2af4, 0x8211, 0x0040, 0x2b0b,
-       0x1078, 0x2b0f, 0x0078, 0x2ae9, 0x0c7e, 0x2100, 0x2011, 0x0001,
-       0xa212, 0x70b4, 0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef,
-       0x600a, 0x8211, 0x0040, 0x2b08, 0x1078, 0x2b0f, 0x0078, 0x2afb,
-       0x70a7, 0x0001, 0x0c7f, 0x027f, 0x0d7f, 0x017f, 0x007c, 0xade8,
-       0x0005, 0x70ac, 0xad06, 0x00c0, 0x2b17, 0x70a8, 0x2068, 0x007c,
-       0x1078, 0x4360, 0x00c0, 0x29c1, 0x707c, 0x2068, 0x7774, 0x1078,
-       0x41fe, 0x2c50, 0x1078, 0x4442, 0x789b, 0x0010, 0x6814, 0xa084,
-       0x001f, 0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001, 0x2001, 0x0004,
-       0x0078, 0x2c92, 0x1078, 0x4360, 0x00c0, 0x29c1, 0x789b, 0x0010,
-       0x7060, 0x2068, 0x6f14, 0x70d4, 0xd0b4, 0x0040, 0x2b4c, 0xc0b4,
-       0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a,
-       0x6018, 0x8001, 0x601a, 0x0c7f, 0x1078, 0x41fe, 0x2c50, 0x1078,
-       0x4442, 0x6824, 0xa005, 0x0040, 0x2b5d, 0xa082, 0x0006, 0x0048,
-       0x2b5b, 0x0078, 0x2b5d, 0x6827, 0x0005, 0x6814, 0xa084, 0x001f,
-       0xc0bd, 0x78aa, 0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003,
-       0x0078, 0x2c92, 0xc28d, 0x72d6, 0x72c0, 0xa200, 0xa015, 0x7154,
-       0x8108, 0xa12a, 0x0048, 0x2b75, 0x71c0, 0x2164, 0x6504, 0x85ff,
-       0x00c0, 0x2b8c, 0x7156, 0x8421, 0x00c0, 0x2b70, 0x70d4, 0xd08c,
-       0x0040, 0x2b88, 0x70d0, 0xa005, 0x00c0, 0x2b88, 0x70d3, 0x000a,
-       0x007c, 0x2200, 0x0078, 0x2b7a, 0x70d4, 0xc08c, 0x70d6, 0x70d3,
-       0x0000, 0x6034, 0xa005, 0x00c0, 0x2b89, 0x6708, 0xa784, 0x073f,
-       0x0040, 0x2bbb, 0xd7d4, 0x00c0, 0x2b89, 0xa784, 0x0021, 0x00c0,
-       0x2b89, 0xa784, 0x0002, 0x0040, 0x2bac, 0xa784, 0x0004, 0x0040,
-       0x2b89, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0218, 0x00c0, 0x2b89,
-       0xa784, 0x0100, 0x0040, 0x2bbb, 0x6018, 0xa005, 0x00c0, 0x2b89,
-       0xa7bc, 0xfeff, 0x670a, 0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684,
-       0x000e, 0x6318, 0x0040, 0x2bcc, 0x601c, 0xa302, 0x0048, 0x2bcf,
-       0x0040, 0x2bcf, 0x0078, 0x2b89, 0x83ff, 0x00c0, 0x2b89, 0x2d58,
-       0x2c50, 0x7156, 0xd7bc, 0x00c0, 0x2bd8, 0x7028, 0x6022, 0x603a,
-       0xc7bc, 0x670a, 0x68c0, 0xa065, 0xa04d, 0x6100, 0x2a60, 0x2041,
-       0x0001, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0xd1fc, 0x0040,
-       0x2bec, 0xd684, 0x0040, 0x2bee, 0xa39c, 0xffbf, 0xd6a4, 0x0040,
-       0x2bf3, 0xa39d, 0x0020, 0xa684, 0x000e, 0x00c0, 0x2c3e, 0xc7a5,
-       0x670a, 0x2c00, 0x68c6, 0x77a4, 0xa786, 0x0001, 0x00c0, 0x2c12,
-       0x70d4, 0xd0b4, 0x00c0, 0x2c12, 0x7000, 0xa082, 0x0002, 0x00c8,
-       0x2c12, 0x7830, 0xd0bc, 0x00c0, 0x2c12, 0x789b, 0x0010, 0x7baa,
-       0x0078, 0x2c8a, 0x8739, 0x77a6, 0x2750, 0x77b0, 0xa7b0, 0x0005,
-       0x70ac, 0xa606, 0x00c0, 0x2c1d, 0x76a8, 0x76b2, 0x2c3a, 0x8738,
-       0x2d3a, 0x8738, 0x283a, 0x8738, 0x233a, 0x8738, 0x253a, 0x7830,
-       0xd0bc, 0x0040, 0x2c35, 0x2091, 0x8000, 0x2091, 0x303d, 0x70d4,
-       0xa084, 0x303d, 0x2091, 0x8000, 0x2090, 0xaad5, 0x0000, 0x0040,
-       0x2c3d, 0x8421, 0x2200, 0x00c0, 0x2b6f, 0x007c, 0xd1dc, 0x0040,
-       0x3e00, 0x2029, 0x0020, 0xd69c, 0x00c0, 0x2c4b, 0x8528, 0xd68c,
-       0x00c0, 0x2c4b, 0x8528, 0x8840, 0x6f14, 0x610c, 0x8108, 0xa18c,
-       0x00ff, 0x70cc, 0xa160, 0x2c64, 0x8cff, 0x0040, 0x2c6a, 0x6014,
-       0xa706, 0x00c0, 0x2c53, 0x60b8, 0x8001, 0x60ba, 0x00c0, 0x2c4e,
-       0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x2200, 0x8421, 0x00c0,
-       0x2b6f, 0x007c, 0x2a60, 0x610e, 0x69be, 0x2c00, 0x68c6, 0x8840,
-       0x6008, 0xc0d5, 0x600a, 0x77a4, 0xa786, 0x0001, 0x00c0, 0x2c12,
-       0x70d4, 0xd0b4, 0x00c0, 0x2c12, 0x7000, 0xa082, 0x0002, 0x00c8,
-       0x2c12, 0x7830, 0xd0bc, 0x00c0, 0x2c12, 0x789b, 0x0010, 0x7baa,
-       0x7daa, 0x79aa, 0x2001, 0x0002, 0x007e, 0x6018, 0x8000, 0x601a,
-       0x0078, 0x2c93, 0x007e, 0x2960, 0x6104, 0x2a60, 0xa184, 0x0018,
-       0x0040, 0x2caf, 0xa184, 0x0010, 0x0040, 0x2ca2, 0x1078, 0x4011,
-       0x00c0, 0x2cd4, 0xa184, 0x0008, 0x0040, 0x2caf, 0x69a0, 0xa184,
-       0x0600, 0x00c0, 0x2caf, 0x1078, 0x3ef5, 0x0078, 0x2cd4, 0x69a0,
-       0xa184, 0x1e00, 0x0040, 0x2cdf, 0xa184, 0x0800, 0x0040, 0x2cc8,
-       0x0c7e, 0x2960, 0x6000, 0xa085, 0x2000, 0x6002, 0x6104, 0xa18d,
-       0x0010, 0x6106, 0x0c7f, 0x1078, 0x4011, 0x00c0, 0x2cd4, 0x69a0,
-       0xa184, 0x0200, 0x0040, 0x2cd0, 0x1078, 0x3f54, 0x0078, 0x2cd4,
-       0xa184, 0x0400, 0x00c0, 0x2cab, 0x69a0, 0xa184, 0x1000, 0x0040,
-       0x2cdf, 0x6914, 0xa18c, 0xff00, 0x810f, 0x1078, 0x279f, 0x027f,
-       0xa68c, 0x00e0, 0xa684, 0x0060, 0x0040, 0x2cec, 0xa086, 0x0060,
-       0x00c0, 0x2cec, 0xa18d, 0x4000, 0xa18d, 0x0104, 0x69b6, 0x789b,
-       0x0060, 0x2800, 0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, 0x0040,
-       0x2d07, 0xc0fc, 0x7087, 0x0000, 0xa08a, 0x000d, 0x0050, 0x2d05,
-       0xa08a, 0x000c, 0x7186, 0x2001, 0x000c, 0x800c, 0x718a, 0x78aa,
-       0x3518, 0x3340, 0x3428, 0x8000, 0x80ac, 0xaf80, 0x002b, 0x20a0,
-       0x789b, 0x0000, 0xad80, 0x000b, 0x2098, 0x53a6, 0x23a8, 0x2898,
-       0x25a0, 0xa286, 0x0020, 0x00c0, 0x2d3f, 0x70d4, 0xc0b5, 0x70d6,
-       0x2c00, 0x70ba, 0x2d00, 0x70be, 0x6814, 0xc0fc, 0x8007, 0x7882,
-       0xa286, 0x0002, 0x0040, 0x2d75, 0x70a4, 0x8000, 0x70a6, 0x74b4,
-       0xa498, 0x0005, 0x70ac, 0xa306, 0x00c0, 0x2d37, 0x73a8, 0x73b6,
-       0xa286, 0x0010, 0x0040, 0x29c1, 0x0d7f, 0x0c7f, 0x007c, 0x7000,
-       0xa005, 0x00c0, 0x2d1d, 0xa286, 0x0002, 0x00c0, 0x2d8f, 0x1078,
-       0x4360, 0x00c0, 0x2d1d, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x2091,
-       0x8000, 0x781b, 0x005b, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de,
-       0x6898, 0x78d2, 0x78da, 0x2091, 0x8001, 0x7808, 0xc08d, 0x780a,
-       0x127e, 0x0d7e, 0x0c7e, 0x70d4, 0xa084, 0x2700, 0x2090, 0x0c7f,
-       0x0d7f, 0x127f, 0x2900, 0x705a, 0x68bc, 0x7042, 0x7003, 0x0002,
-       0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x7830, 0xd0bc, 0x0040,
-       0x2d81, 0x2091, 0x303d, 0x70d4, 0xa084, 0x303d, 0x2091, 0x8000,
-       0x2090, 0x70a4, 0xa005, 0x00c0, 0x2d86, 0x007c, 0x8421, 0x0040,
-       0x2d85, 0x7250, 0x70c0, 0xa200, 0xa015, 0x0078, 0x2b6f, 0xa286,
-       0x0010, 0x00c0, 0x2dc0, 0x1078, 0x4360, 0x00c0, 0x2d1d, 0x6814,
-       0xc0fc, 0x8007, 0x7882, 0x781b, 0x005b, 0x68b4, 0x785a, 0x6894,
+       0xa006, 0x2009, 0x9775, 0x200a, 0x203a, 0x007c, 0x7810, 0xc0ad,
+       0x7812, 0x0078, 0x24d2, 0x263a, 0x1078, 0x25bd, 0x00c0, 0x25e0,
+       0x786c, 0xa065, 0x00c0, 0x2464, 0x2091, 0x8000, 0x7810, 0xa084,
+       0xffcf, 0x86ff, 0x0040, 0x24cd, 0xc0ad, 0x7812, 0x2091, 0x8001,
+       0x0078, 0x25e0, 0x2091, 0x8000, 0x7007, 0x0004, 0x7994, 0x70d4,
+       0xa102, 0x0048, 0x24e3, 0x0040, 0x24ed, 0x7b90, 0xa302, 0x00c0,
+       0x24ed, 0x0078, 0x24e6, 0x8002, 0x00c0, 0x24ed, 0x263a, 0x7810,
+       0xc0ad, 0x7812, 0x2091, 0x8001, 0x007c, 0xa184, 0xff00, 0x0040,
+       0x24fa, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
+       0x0078, 0x24fd, 0x8107, 0x8004, 0x8004, 0x7a9c, 0xa210, 0x721a,
+       0x7a98, 0xa006, 0xa211, 0x721e, 0xd4c4, 0x0040, 0x250d, 0x7aa4,
+       0xa211, 0x7222, 0x7aa0, 0xa211, 0x7226, 0x20a1, 0x0030, 0x7003,
+       0x0000, 0x2009, 0x9754, 0x260a, 0x8109, 0x2198, 0x2104, 0xd084,
+       0x0040, 0x251b, 0x8633, 0xa6b0, 0x0002, 0x26a8, 0x53a6, 0x8603,
+       0x7012, 0x7007, 0x0001, 0x7990, 0x7894, 0x8000, 0xa10a, 0x00c8,
+       0x252a, 0xa006, 0x2028, 0x7974, 0xa184, 0xff00, 0x0040, 0x2539,
+       0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0078,
+       0x253c, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006,
+       0xa211, 0xd4c4, 0x0040, 0x2548, 0x7b84, 0xa319, 0x7c80, 0xa421,
+       0x7008, 0xd0fc, 0x0040, 0x2548, 0xa084, 0x01e0, 0x0040, 0x256d,
+       0x7d10, 0x2031, 0x9754, 0x2634, 0x78a8, 0x8000, 0x78aa, 0xd08c,
+       0x00c0, 0x2562, 0x7007, 0x0006, 0x7004, 0xd094, 0x00c0, 0x255c,
+       0x0078, 0x24d4, 0x2069, 0x4f47, 0x206b, 0x0003, 0x78ac, 0xa085,
+       0x0300, 0x78ae, 0xa006, 0x0078, 0x2576, 0x2030, 0x75d6, 0x2091,
+       0x4080, 0x7d96, 0x7d10, 0xa5ac, 0xffcf, 0x7d12, 0x2091, 0x8001,
+       0x78aa, 0x7007, 0x0006, 0x263a, 0x7003, 0x0001, 0x711a, 0x721e,
+       0xd5c4, 0x0040, 0x2585, 0x7322, 0x7426, 0x007c, 0x6084, 0xa086,
+       0x0103, 0x00c0, 0x25a9, 0x6114, 0x6018, 0xa105, 0x00c0, 0x25a9,
+       0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, 0x25a9, 0x600c, 0x70c6,
+       0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, 0x2091, 0x4080,
+       0x1078, 0x2086, 0x0068, 0x25a8, 0x786c, 0xa065, 0x00c0, 0x2586,
+       0x007c, 0x1078, 0x25bd, 0x00c0, 0x25e0, 0x786c, 0xa065, 0x00c0,
+       0x2586, 0x0078, 0x25e0, 0x1078, 0x25bd, 0x00c0, 0x25e0, 0x786c,
+       0xa065, 0x00c0, 0x25b3, 0x0078, 0x25e0, 0x6084, 0xa086, 0x0103,
+       0x00c0, 0x25d1, 0x6018, 0xc0fc, 0x601a, 0xa086, 0x0004, 0x00c0,
+       0x25d1, 0x7804, 0xd0a4, 0x0040, 0x25d1, 0x1078, 0x2086, 0xa006,
+       0x007c, 0x1078, 0x25e6, 0x00c0, 0x25d8, 0xa085, 0x0001, 0x007c,
+       0x1078, 0x25f5, 0x00c0, 0x25de, 0x2041, 0x0001, 0x7d10, 0x007c,
+       0x88ff, 0x0040, 0x25e5, 0x2091, 0x4080, 0x007c, 0x7b90, 0x7994,
+       0x70d4, 0xa102, 0x00c0, 0x25ef, 0xa385, 0x0000, 0x007c, 0x0048,
+       0x25f3, 0xa302, 0x007c, 0x8002, 0x007c, 0x7810, 0xd0ec, 0x0040,
+       0x260d, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005,
+       0x00c0, 0x260a, 0x7008, 0x0e7f, 0xa086, 0x0008, 0x0040, 0x260d,
+       0x0078, 0x265e, 0x0e7f, 0x0078, 0x265e, 0xa184, 0xff00, 0x0040,
+       0x261a, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
+       0x0078, 0x261d, 0x8107, 0x8004, 0x8004, 0x7a9c, 0x7b98, 0x7ca4,
+       0x7da0, 0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009, 0x0018,
+       0x6028, 0xa005, 0x0040, 0x262e, 0x2009, 0x0040, 0x1078, 0x1dbb,
+       0x0040, 0x2650, 0x78a8, 0x8000, 0x78aa, 0xd08c, 0x00c0, 0x265e,
+       0x6014, 0xd0fc, 0x00c0, 0x2640, 0x2069, 0x4f40, 0x0078, 0x2642,
+       0x2069, 0x4f80, 0x2091, 0x8000, 0x681f, 0x0003, 0x78ab, 0x0000,
+       0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091, 0x8001, 0x0078, 0x265e,
+       0x78ab, 0x0000, 0x1078, 0x2086, 0x7990, 0x7894, 0x8000, 0xa10a,
+       0x00c8, 0x265b, 0xa006, 0x7896, 0x70d6, 0xa006, 0x2071, 0x0010,
+       0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x266a, 0x2009, 0x4f59,
+       0x0078, 0x266c, 0x2009, 0x4f99, 0x2091, 0x8000, 0x200a, 0x0f7e,
+       0xd7fc, 0x00c0, 0x2683, 0x2009, 0x4f40, 0x2001, 0x4f04, 0x2004,
+       0xd0ec, 0x0040, 0x267f, 0x2079, 0x0100, 0x0078, 0x2687, 0x2079,
+       0x0200, 0x0078, 0x2687, 0x2009, 0x4f80, 0x2079, 0x0100, 0x2104,
+       0xa086, 0x0000, 0x00c0, 0x26a0, 0xd7fc, 0x00c0, 0x2693, 0x2009,
+       0x4f45, 0x0078, 0x2695, 0x2009, 0x4f85, 0x2104, 0xa005, 0x00c0,
+       0x26a0, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x26a0, 0x781b, 0x0045,
+       0x0f7f, 0x007c, 0x2009, 0x0002, 0x2069, 0x4f00, 0x6810, 0xd0ec,
+       0x00c0, 0x270f, 0x2071, 0x4f80, 0x2079, 0x0100, 0x2021, 0x51bf,
+       0x784b, 0x000f, 0x2019, 0x44a7, 0xd184, 0x0040, 0x26c3, 0x6810,
+       0xd0ec, 0x0040, 0x26bf, 0x20a1, 0x012b, 0x0078, 0x26c5, 0x20a1,
+       0x022b, 0x0078, 0x26c5, 0x20a1, 0x012b, 0x2304, 0xa005, 0x0040,
+       0x26d2, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398, 0x53a6, 0x3318,
+       0x0078, 0x26c5, 0x789b, 0x0020, 0x20a9, 0x0010, 0x6814, 0xd0e4,
+       0x0040, 0x26e2, 0x78af, 0x0000, 0x78af, 0x9020, 0x00f0, 0x26da,
+       0x0078, 0x26e8, 0x78af, 0x0000, 0x78af, 0x8020, 0x00f0, 0x26e2,
+       0x7003, 0x0000, 0x017e, 0xd18c, 0x2009, 0x0000, 0x0040, 0x26f1,
+       0xc1bd, 0x1078, 0x28e2, 0x017f, 0x7020, 0xa084, 0x000f, 0x007e,
+       0x6814, 0xd0e4, 0x007f, 0x00c0, 0x2701, 0xa085, 0x6340, 0x0078,
+       0x2703, 0xa085, 0x62c0, 0x7806, 0x780f, 0x9200, 0x7843, 0x00d8,
+       0x7853, 0x0080, 0x780b, 0x0008, 0x7456, 0x7053, 0x0000, 0x8109,
+       0x0040, 0x2722, 0x2071, 0x4f40, 0x6810, 0xd0ec, 0x0040, 0x271c,
+       0x2079, 0x0100, 0x0078, 0x271e, 0x2079, 0x0200, 0x2021, 0x4fbf,
+       0x0078, 0x26b0, 0x007c, 0x017e, 0xd1bc, 0x00c0, 0x2737, 0x007e,
+       0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2733, 0x2011,
+       0x0101, 0x0078, 0x2739, 0x2011, 0x0201, 0x0078, 0x2739, 0x2011,
+       0x0101, 0xa18c, 0x000f, 0x2204, 0xa084, 0xfff0, 0xa105, 0x2012,
+       0x017f, 0x1078, 0x28e2, 0x007c, 0xd3fc, 0x00c0, 0x2757, 0x007e,
+       0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2753, 0x2011,
+       0x0101, 0x0078, 0x2759, 0x2011, 0x0201, 0x0078, 0x2759, 0x2011,
+       0x0101, 0x20a9, 0x0009, 0x810b, 0x00f0, 0x275b, 0xa18c, 0x0e00,
+       0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2019, 0x0002,
+       0x2001, 0x4f04, 0x2004, 0xd0ec, 0x0040, 0x2773, 0x8319, 0x2009,
+       0x0101, 0x0078, 0x2775, 0x2009, 0x0101, 0x20a9, 0x0005, 0x8213,
+       0x00f0, 0x2777, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205,
+       0x200a, 0x8319, 0x0040, 0x2788, 0x2009, 0x0201, 0x0078, 0x2775,
+       0x007c, 0xd3fc, 0x00c0, 0x279c, 0x007e, 0x2001, 0x4f04, 0x2004,
+       0xd0ec, 0x007f, 0x0040, 0x2798, 0x2011, 0x0101, 0x0078, 0x279e,
+       0x2011, 0x0201, 0x0078, 0x279e, 0x2011, 0x0101, 0x20a9, 0x000c,
+       0x810b, 0x00f0, 0x27a0, 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff,
+       0xa105, 0x2012, 0x007c, 0xd3fc, 0x00c0, 0x27be, 0x007e, 0x2001,
+       0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x27ba, 0x2011, 0x0102,
+       0x0078, 0x27c0, 0x2011, 0x0202, 0x0078, 0x27c0, 0x2011, 0x0102,
+       0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c, 0x0c7e, 0xd1bc,
+       0x00c0, 0x27da, 0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f,
+       0x0040, 0x27d6, 0x2061, 0x0100, 0x0078, 0x27dc, 0x2061, 0x0200,
+       0x0078, 0x27dc, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080,
+       0x0020, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x0c7e, 0xd1bc,
+       0x00c0, 0x27fa, 0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f,
+       0x0040, 0x27f6, 0x2061, 0x0100, 0x0078, 0x27fc, 0x2061, 0x0200,
+       0x0078, 0x27fc, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080,
+       0x0022, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x0c7f, 0x007c,
+       0x0c7e, 0xd1bc, 0x00c0, 0x281c, 0x007e, 0x2001, 0x4f04, 0x2004,
+       0xd0ec, 0x007f, 0x0040, 0x2818, 0x2061, 0x0100, 0x0078, 0x281e,
+       0x2061, 0x0200, 0x0078, 0x281e, 0x2061, 0x0100, 0xc1bc, 0x8103,
+       0x8003, 0xa080, 0x0022, 0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae,
+       0x0c7f, 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x283e, 0x007e, 0x2001,
+       0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x283a, 0x2061, 0x0100,
+       0x0078, 0x2840, 0x2061, 0x0200, 0x0078, 0x2840, 0x2061, 0x0100,
+       0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x60a4, 0xa28c,
+       0x0020, 0x0040, 0x284e, 0xc2ac, 0xa39d, 0x4000, 0xc3fc, 0xd3b4,
+       0x00c0, 0x2853, 0xc3fd, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018,
+       0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005,
+       0x0040, 0x28c0, 0xd1fc, 0x0040, 0x2869, 0x2061, 0x96d0, 0x0078,
+       0x286b, 0x2061, 0x95c0, 0x1078, 0x28c8, 0x0040, 0x28a2, 0x20a9,
+       0x0101, 0xd1fc, 0x0040, 0x2878, 0x2061, 0x95d0, 0x0078, 0x287a,
+       0x2061, 0x94c0, 0x0c7e, 0x1078, 0x28c8, 0x0040, 0x2885, 0x0c7f,
+       0x8c60, 0x00f0, 0x287a, 0x0078, 0x28c0, 0x007f, 0xd1fc, 0x0040,
+       0x288f, 0xa082, 0x95d0, 0x2071, 0x4f80, 0x0078, 0x2893, 0xa082,
+       0x94c0, 0x2071, 0x4f40, 0x707a, 0x7176, 0x2138, 0x2001, 0x0004,
+       0x7066, 0x7083, 0x000f, 0x71d4, 0xc1dc, 0x71d6, 0x1078, 0x2663,
+       0x0078, 0x28bc, 0xd1fc, 0x00c0, 0x28a9, 0x2071, 0x4f40, 0x0078,
+       0x28ab, 0x2071, 0x4f80, 0x6020, 0xc0dd, 0x6022, 0x7176, 0x2138,
+       0x2c00, 0x707e, 0x2001, 0x0006, 0x7066, 0x7083, 0x000f, 0x71d4,
+       0xc1dc, 0x71d6, 0x1078, 0x2663, 0x2001, 0x0000, 0x0078, 0x28c2,
+       0x2001, 0x0001, 0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f, 0x007c,
+       0x2c04, 0xa005, 0x0040, 0x28df, 0x2060, 0x6010, 0xa306, 0x00c0,
+       0x28dc, 0x600c, 0xa206, 0x00c0, 0x28dc, 0x6014, 0xa106, 0x00c0,
+       0x28dc, 0xa006, 0x0078, 0x28e1, 0x6000, 0x0078, 0x28c9, 0xa085,
+       0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x017e, 0xd1bc, 0x00c0, 0x28fa,
+       0x2079, 0x4f40, 0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f,
+       0x0040, 0x28f6, 0x2071, 0x0100, 0x0078, 0x28fe, 0x2071, 0x0200,
+       0x0078, 0x28fe, 0x2079, 0x4f80, 0x2071, 0x0100, 0x7920, 0xa18c,
+       0x000f, 0x70ec, 0xd0c4, 0x00c0, 0x2908, 0x017f, 0x0078, 0x2923,
+       0x810b, 0x810b, 0x810b, 0x810b, 0x007f, 0xd0bc, 0x00c0, 0x2920,
+       0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x291c,
+       0xa18d, 0x0f00, 0x0078, 0x2922, 0xa18d, 0x0f00, 0x0078, 0x2922,
+       0xa18d, 0x0800, 0x2104, 0x0e7f, 0x0f7f, 0x007c, 0x0e7e, 0x2001,
+       0x4f01, 0x2004, 0xd0ac, 0x00c0, 0x29a3, 0x68e4, 0xd0ac, 0x0040,
+       0x29a3, 0xa084, 0x0006, 0x00c0, 0x29a3, 0x6014, 0xd0fc, 0x00c0,
+       0x293d, 0x2071, 0x53c0, 0x0078, 0x293f, 0x2071, 0x5440, 0x8007,
+       0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xae70, 0x7004, 0xa084,
+       0x000a, 0x00c0, 0x29a3, 0x7108, 0xa194, 0xff00, 0x0040, 0x29a3,
+       0xa18c, 0x00ff, 0x2001, 0x000a, 0xa106, 0x0040, 0x2972, 0x2001,
+       0x000c, 0xa106, 0x0040, 0x2976, 0x2001, 0x0012, 0xa106, 0x0040,
+       0x297a, 0x2001, 0x0014, 0xa106, 0x0040, 0x297e, 0x2001, 0x0019,
+       0xa106, 0x0040, 0x2982, 0x2001, 0x0032, 0xa106, 0x0040, 0x2986,
+       0x0078, 0x298a, 0x2009, 0x000c, 0x0078, 0x298c, 0x2009, 0x0012,
+       0x0078, 0x298c, 0x2009, 0x0014, 0x0078, 0x298c, 0x2009, 0x0019,
+       0x0078, 0x298c, 0x2009, 0x0020, 0x0078, 0x298c, 0x2009, 0x003f,
+       0x0078, 0x298c, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a, 0x2071,
+       0x4f00, 0x7004, 0xd0bc, 0x0040, 0x29a3, 0x6014, 0xd0fc, 0x00c0,
+       0x299e, 0x70ea, 0x2071, 0x4f40, 0x0078, 0x29a1, 0x70ee, 0x2071,
+       0x4f80, 0x701f, 0x000d, 0x0e7f, 0x007c, 0x2001, 0x4f05, 0x2004,
+       0xd0e4, 0x00c0, 0x29b1, 0x7804, 0xa084, 0xff1f, 0xa085, 0x6340,
+       0x7806, 0x007c, 0x0068, 0x29b2, 0x2091, 0x8000, 0x2071, 0x0000,
+       0x007e, 0x7018, 0xd084, 0x00c0, 0x29b9, 0x007f, 0x2071, 0x0010,
+       0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x080f, 0x70df,
+       0x000b, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078,
+       0x29cf, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, 0x708e, 0x7592,
+       0x7496, 0x769a, 0x779e, 0xa594, 0x003f, 0xd4f4, 0x0040, 0x29e6,
+       0xa784, 0x007d, 0x00c0, 0x441d, 0x1078, 0x29b2, 0xa49c, 0x000f,
+       0xa382, 0x0004, 0x0050, 0x29f1, 0xa3a6, 0x0007, 0x00c0, 0x29b2,
+       0x2418, 0x8507, 0xa084, 0x000f, 0x0079, 0x29f6, 0x3071, 0x3162,
+       0x318d, 0x33ff, 0x37e8, 0x3862, 0x3917, 0x39a8, 0x3a96, 0x3b85,
+       0x2a09, 0x2a06, 0x2e42, 0x2f65, 0x37b9, 0x2a06, 0x1078, 0x29b2,
+       0x007c, 0xa006, 0x0078, 0x2a13, 0x7808, 0xc08d, 0x780a, 0xa006,
+       0x7002, 0x704e, 0x7046, 0x70d2, 0x7060, 0xa005, 0x00c0, 0x2b79,
+       0x7064, 0xa084, 0x0007, 0x0079, 0x2a1d, 0x2a25, 0x2a98, 0x2aa1,
+       0x2aac, 0x2ab7, 0x2b5f, 0x2ac2, 0x2a98, 0x7830, 0xd0bc, 0x00c0,
+       0x2a08, 0x71d4, 0xd1bc, 0x00c0, 0x2a08, 0xd1b4, 0x00c0, 0x2a75,
+       0x70a4, 0xa086, 0x0001, 0x0040, 0x2a08, 0x70b4, 0xa06d, 0x6800,
+       0xa065, 0xa055, 0x789b, 0x0010, 0x6b0c, 0x7baa, 0x6808, 0xa045,
+       0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0040, 0x2a4b,
+       0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001, 0x0010,
+       0x0078, 0x2cd3, 0x7060, 0xa005, 0x00c0, 0x2a08, 0x0c7e, 0x0d7e,
+       0x70b4, 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0010, 0x6b0c,
+       0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886,
+       0x0001, 0x0040, 0x2a6e, 0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d,
+       0x6e1c, 0x2001, 0x0020, 0x0078, 0x2cd3, 0x1078, 0x43b0, 0x00c0,
+       0x2a08, 0x781b, 0x005b, 0x70bc, 0xa06d, 0x68b4, 0x785a, 0x6894,
        0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a,
-       0x70a4, 0x8000, 0x70a6, 0x74b4, 0xa490, 0x0005, 0x70ac, 0xa206,
-       0x00c0, 0x2db3, 0x72a8, 0x72b6, 0x2900, 0x705a, 0x68bc, 0x7042,
+       0x68bc, 0x7042, 0xc1b4, 0x71d6, 0x70b8, 0xa065, 0x68c0, 0x705a,
        0x7003, 0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x007c,
-       0x6bb4, 0xa39d, 0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, 0x7882,
-       0x6b94, 0x7bd6, 0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, 0x005b,
-       0x2900, 0x705a, 0x7202, 0x7808, 0xc08d, 0x780a, 0x2300, 0xa605,
-       0x0040, 0x2deb, 0x70d4, 0xa084, 0x2700, 0xa086, 0x2300, 0x00c0,
-       0x2de5, 0x2009, 0x0000, 0x0078, 0x2de7, 0x2009, 0x0001, 0xa284,
-       0x000f, 0x1079, 0x2def, 0xad80, 0x0009, 0x7046, 0x007c, 0x2df7,
-       0x48bd, 0x48bd, 0x48aa, 0x48bd, 0x2df7, 0x2df7, 0x2df7, 0x1078,
-       0x296b, 0x7808, 0xa084, 0xfffd, 0x780a, 0x1078, 0x295e, 0x0f7e,
-       0x2079, 0x4e00, 0x78ac, 0x0f7f, 0xd084, 0x0040, 0x2e21, 0x7064,
-       0xa086, 0x0001, 0x00c0, 0x2e0f, 0x7066, 0x0078, 0x2ef8, 0x7064,
-       0xa086, 0x0005, 0x00c0, 0x2e1f, 0x707c, 0x2068, 0x681b, 0x0004,
-       0x6817, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x7067,
-       0x0000, 0x70a7, 0x0000, 0x70a8, 0x70b2, 0x70b6, 0x1078, 0x2aba,
-       0x157e, 0x2011, 0x0004, 0x7164, 0xa186, 0x0001, 0x0040, 0x2e41,
-       0xa186, 0x0007, 0x00c0, 0x2e38, 0x701f, 0x0005, 0x0078, 0x2e41,
-       0x701f, 0x0001, 0x7067, 0x0000, 0x70d4, 0xc0dd, 0x70d6, 0x0078,
-       0x2e43, 0x7067, 0x0000, 0x2001, 0x4e0a, 0x2004, 0xa084, 0x00ff,
-       0xa086, 0x0018, 0x0040, 0x2e53, 0x7018, 0x7016, 0xa005, 0x00c0,
-       0x2e53, 0x70a7, 0x0001, 0x067e, 0x1078, 0x4586, 0x20a9, 0x0010,
-       0x2039, 0x0000, 0x1078, 0x40f8, 0xa7b8, 0x0100, 0x00f0, 0x2e5a,
-       0x067f, 0x7000, 0x0079, 0x2e64, 0x2e9e, 0x2e79, 0x2e79, 0x2e6e,
-       0x2e9e, 0x2e9e, 0x2e9e, 0x2e6c, 0x1078, 0x296b, 0x7060, 0xa005,
-       0x0040, 0x2e9e, 0xad06, 0x00c0, 0x2e79, 0x6800, 0x7062, 0x0078,
-       0x2e8b, 0x6820, 0xd084, 0x00c0, 0x2e87, 0x6f14, 0x1078, 0x41fe,
-       0x6008, 0xc0d4, 0x600a, 0x1078, 0x3dd0, 0x0078, 0x2e8b, 0x705c,
-       0x2060, 0x6800, 0x6002, 0xa684, 0x5f00, 0x681e, 0x6818, 0xd0fc,
-       0x0040, 0x2e93, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x6820,
-       0xa084, 0x00ff, 0xc09d, 0x6822, 0x1078, 0x202c, 0xb284, 0x0400,
-       0x0040, 0x2ea6, 0x2021, 0x95d0, 0x0078, 0x2ea8, 0x2021, 0x94c0,
-       0x1078, 0x2efd, 0xb284, 0x0400, 0x0040, 0x2eb2, 0x2021, 0x4e98,
-       0x0078, 0x2eb4, 0x2021, 0x4e58, 0x1078, 0x2efd, 0x20a9, 0x0101,
-       0xb284, 0x0400, 0x0040, 0x2ec0, 0x2021, 0x94d0, 0x0078, 0x2ec2,
-       0x2021, 0x93c0, 0x1078, 0x2efd, 0x8420, 0x00f0, 0x2ec2, 0xb284,
-       0x0300, 0x0040, 0x2ecf, 0x2061, 0x53c0, 0x0078, 0x2ed1, 0x2061,
-       0x73c0, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6110, 0x81ff, 0x0040,
-       0x2eee, 0x6018, 0x017e, 0x007e, 0x2011, 0x4e02, 0x220c, 0xa102,
-       0x2012, 0x007f, 0x017f, 0xa102, 0x0050, 0x2eee, 0x6012, 0x00c0,
-       0x2eee, 0x2011, 0x4e04, 0x2204, 0xc0a5, 0x2012, 0x601b, 0x0000,
-       0xace0, 0x0010, 0x00f0, 0x2ed5, 0x8421, 0x00c0, 0x2ed3, 0x157f,
-       0x7003, 0x0000, 0x704f, 0x0000, 0x007c, 0x047e, 0x2404, 0xa005,
-       0x0040, 0x2f18, 0x2068, 0x6800, 0x007e, 0x6a1a, 0x6817, 0x0000,
+       0x1078, 0x43b0, 0x00c0, 0x2aa0, 0x781b, 0x0047, 0x7003, 0x0004,
+       0x007c, 0x1078, 0x43b0, 0x00c0, 0x2aab, 0x2011, 0x000c, 0x1078,
+       0x2ad2, 0x7003, 0x0004, 0x007c, 0x1078, 0x43b0, 0x00c0, 0x2ab6,
+       0x2011, 0x0006, 0x1078, 0x2ad2, 0x7003, 0x0004, 0x007c, 0x1078,
+       0x43b0, 0x00c0, 0x2ac1, 0x2011, 0x000d, 0x1078, 0x2ad2, 0x7003,
+       0x0004, 0x007c, 0x1078, 0x43b0, 0x00c0, 0x2ad1, 0x2011, 0x0006,
+       0x1078, 0x2ad2, 0x707c, 0x707f, 0x0000, 0x2068, 0x704e, 0x7003,
+       0x0001, 0x007c, 0x7174, 0xc1fc, 0x8107, 0x7882, 0x789b, 0x0010,
+       0xa286, 0x000c, 0x00c0, 0x2ae1, 0x7aaa, 0x2001, 0x0001, 0x0078,
+       0x2af6, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0xa286, 0x000d,
+       0x0040, 0x2aef, 0x7aaa, 0x2001, 0x0002, 0x0078, 0x2af6, 0x78ab,
+       0x0020, 0x7178, 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b, 0x0060,
+       0x78aa, 0x785b, 0x0004, 0x781b, 0x0116, 0x1078, 0x43d3, 0x7083,
+       0x000f, 0x70d4, 0xd0b4, 0x0040, 0x2b12, 0xc0b4, 0x70d6, 0x0c7e,
+       0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
+       0x601a, 0x0c7f, 0x007c, 0x7014, 0xa005, 0x00c0, 0x2b21, 0x70d4,
+       0xd0b4, 0x0040, 0x2b22, 0x70b8, 0xac06, 0x00c0, 0x2b22, 0x1078,
+       0x2b01, 0x007c, 0x017e, 0x71a4, 0xa186, 0x0001, 0x0040, 0x2b54,
+       0x0d7e, 0x027e, 0x2100, 0x2011, 0x0001, 0xa212, 0x70b4, 0x2068,
+       0x6800, 0xac06, 0x0040, 0x2b3b, 0x8211, 0x0040, 0x2b52, 0x1078,
+       0x2b56, 0x0078, 0x2b30, 0x0c7e, 0x2100, 0x2011, 0x0001, 0xa212,
+       0x70b4, 0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef, 0x600a,
+       0x8211, 0x0040, 0x2b4f, 0x1078, 0x2b56, 0x0078, 0x2b42, 0x70a7,
+       0x0001, 0x0c7f, 0x027f, 0x0d7f, 0x017f, 0x007c, 0xade8, 0x0005,
+       0x70ac, 0xad06, 0x00c0, 0x2b5e, 0x70a8, 0x2068, 0x007c, 0x1078,
+       0x43b0, 0x00c0, 0x2a08, 0x707c, 0x2068, 0x7774, 0x1078, 0x424e,
+       0x2c50, 0x1078, 0x4492, 0x789b, 0x0010, 0x6814, 0xa084, 0x001f,
+       0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001, 0x2001, 0x0004, 0x0078,
+       0x2cd9, 0x1078, 0x43b0, 0x00c0, 0x2a08, 0x789b, 0x0010, 0x7060,
+       0x2068, 0x6f14, 0x70d4, 0xd0b4, 0x0040, 0x2b93, 0xc0b4, 0x70d6,
+       0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018,
+       0x8001, 0x601a, 0x0c7f, 0x1078, 0x424e, 0x2c50, 0x1078, 0x4492,
+       0x6824, 0xa005, 0x0040, 0x2ba4, 0xa082, 0x0006, 0x0048, 0x2ba2,
+       0x0078, 0x2ba4, 0x6827, 0x0005, 0x6814, 0xa084, 0x001f, 0xc0bd,
+       0x78aa, 0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003, 0x0078,
+       0x2cd9, 0xc28d, 0x72d6, 0x72c0, 0xa200, 0xa015, 0x7154, 0x8108,
+       0xa12a, 0x0048, 0x2bbc, 0x71c0, 0x2164, 0x6504, 0x85ff, 0x00c0,
+       0x2bd3, 0x7156, 0x8421, 0x00c0, 0x2bb7, 0x70d4, 0xd08c, 0x0040,
+       0x2bcf, 0x70d0, 0xa005, 0x00c0, 0x2bcf, 0x70d3, 0x000a, 0x007c,
+       0x2200, 0x0078, 0x2bc1, 0x70d4, 0xc08c, 0x70d6, 0x70d3, 0x0000,
+       0x6034, 0xa005, 0x00c0, 0x2bd0, 0x6708, 0xa784, 0x073f, 0x0040,
+       0x2c02, 0xd7d4, 0x00c0, 0x2bd0, 0xa784, 0x0021, 0x00c0, 0x2bd0,
+       0xa784, 0x0002, 0x0040, 0x2bf3, 0xa784, 0x0004, 0x0040, 0x2bd0,
+       0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0218, 0x00c0, 0x2bd0, 0xa784,
+       0x0100, 0x0040, 0x2c02, 0x6018, 0xa005, 0x00c0, 0x2bd0, 0xa7bc,
+       0xfeff, 0x670a, 0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684, 0x000e,
+       0x6318, 0x0040, 0x2c13, 0x601c, 0xa302, 0x0048, 0x2c16, 0x0040,
+       0x2c16, 0x0078, 0x2bd0, 0x83ff, 0x00c0, 0x2bd0, 0x2d58, 0x2c50,
+       0x7156, 0xd7bc, 0x00c0, 0x2c1f, 0x7028, 0x6022, 0x603a, 0xc7bc,
+       0x670a, 0x68c0, 0xa065, 0xa04d, 0x6100, 0x2a60, 0x2041, 0x0001,
+       0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0xd1fc, 0x0040, 0x2c33,
+       0xd684, 0x0040, 0x2c35, 0xa39c, 0xffbf, 0xd6a4, 0x0040, 0x2c3a,
+       0xa39d, 0x0020, 0xa684, 0x000e, 0x00c0, 0x2c85, 0xc7a5, 0x670a,
+       0x2c00, 0x68c6, 0x77a4, 0xa786, 0x0001, 0x00c0, 0x2c59, 0x70d4,
+       0xd0b4, 0x00c0, 0x2c59, 0x7000, 0xa082, 0x0002, 0x00c8, 0x2c59,
+       0x7830, 0xd0bc, 0x00c0, 0x2c59, 0x789b, 0x0010, 0x7baa, 0x0078,
+       0x2cd1, 0x8739, 0x77a6, 0x2750, 0x77b0, 0xa7b0, 0x0005, 0x70ac,
+       0xa606, 0x00c0, 0x2c64, 0x76a8, 0x76b2, 0x2c3a, 0x8738, 0x2d3a,
+       0x8738, 0x283a, 0x8738, 0x233a, 0x8738, 0x253a, 0x7830, 0xd0bc,
+       0x0040, 0x2c7c, 0x2091, 0x8000, 0x2091, 0x303d, 0x70d4, 0xa084,
+       0x303d, 0x2091, 0x8000, 0x2090, 0xaad5, 0x0000, 0x0040, 0x2c84,
+       0x8421, 0x2200, 0x00c0, 0x2bb6, 0x007c, 0xd1dc, 0x0040, 0x3e49,
+       0x2029, 0x0020, 0xd69c, 0x00c0, 0x2c92, 0x8528, 0xd68c, 0x00c0,
+       0x2c92, 0x8528, 0x8840, 0x6f14, 0x610c, 0x8108, 0xa18c, 0x00ff,
+       0x70cc, 0xa160, 0x2c64, 0x8cff, 0x0040, 0x2cb1, 0x6014, 0xa706,
+       0x00c0, 0x2c9a, 0x60b8, 0x8001, 0x60ba, 0x00c0, 0x2c95, 0x2a60,
+       0x6008, 0xa085, 0x0100, 0x600a, 0x2200, 0x8421, 0x00c0, 0x2bb6,
+       0x007c, 0x2a60, 0x610e, 0x69be, 0x2c00, 0x68c6, 0x8840, 0x6008,
+       0xc0d5, 0x600a, 0x77a4, 0xa786, 0x0001, 0x00c0, 0x2c59, 0x70d4,
+       0xd0b4, 0x00c0, 0x2c59, 0x7000, 0xa082, 0x0002, 0x00c8, 0x2c59,
+       0x7830, 0xd0bc, 0x00c0, 0x2c59, 0x789b, 0x0010, 0x7baa, 0x7daa,
+       0x79aa, 0x2001, 0x0002, 0x007e, 0x6018, 0x8000, 0x601a, 0x0078,
+       0x2cda, 0x007e, 0x2960, 0x6104, 0x2a60, 0xa184, 0x0018, 0x0040,
+       0x2cf6, 0xa184, 0x0010, 0x0040, 0x2ce9, 0x1078, 0x405e, 0x00c0,
+       0x2d1b, 0xa184, 0x0008, 0x0040, 0x2cf6, 0x69a0, 0xa184, 0x0600,
+       0x00c0, 0x2cf6, 0x1078, 0x3f3e, 0x0078, 0x2d1b, 0x69a0, 0xa184,
+       0x1e00, 0x0040, 0x2d26, 0xa184, 0x0800, 0x0040, 0x2d0f, 0x0c7e,
+       0x2960, 0x6000, 0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010,
+       0x6106, 0x0c7f, 0x1078, 0x405e, 0x00c0, 0x2d1b, 0x69a0, 0xa184,
+       0x0200, 0x0040, 0x2d17, 0x1078, 0x3fa1, 0x0078, 0x2d1b, 0xa184,
+       0x0400, 0x00c0, 0x2cf2, 0x69a0, 0xa184, 0x1000, 0x0040, 0x2d26,
+       0x6914, 0xa18c, 0xff00, 0x810f, 0x1078, 0x27e6, 0x027f, 0xa68c,
+       0x00e0, 0xa684, 0x0060, 0x0040, 0x2d33, 0xa086, 0x0060, 0x00c0,
+       0x2d33, 0xa18d, 0x4000, 0xa18d, 0x0104, 0x69b6, 0x789b, 0x0060,
+       0x2800, 0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, 0x0040, 0x2d4e,
+       0xc0fc, 0x7087, 0x0000, 0xa08a, 0x000d, 0x0050, 0x2d4c, 0xa08a,
+       0x000c, 0x7186, 0x2001, 0x000c, 0x800c, 0x718a, 0x78aa, 0x3518,
+       0x3340, 0x3428, 0x8000, 0x80ac, 0xaf80, 0x002b, 0x20a0, 0x789b,
+       0x0000, 0xad80, 0x000b, 0x2098, 0x53a6, 0x23a8, 0x2898, 0x25a0,
+       0xa286, 0x0020, 0x00c0, 0x2d86, 0x70d4, 0xc0b5, 0x70d6, 0x2c00,
+       0x70ba, 0x2d00, 0x70be, 0x6814, 0xc0fc, 0x8007, 0x7882, 0xa286,
+       0x0002, 0x0040, 0x2dbc, 0x70a4, 0x8000, 0x70a6, 0x74b4, 0xa498,
+       0x0005, 0x70ac, 0xa306, 0x00c0, 0x2d7e, 0x73a8, 0x73b6, 0xa286,
+       0x0010, 0x0040, 0x2a08, 0x0d7f, 0x0c7f, 0x007c, 0x7000, 0xa005,
+       0x00c0, 0x2d64, 0xa286, 0x0002, 0x00c0, 0x2dd6, 0x1078, 0x43b0,
+       0x00c0, 0x2d64, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x2091, 0x8000,
+       0x781b, 0x005b, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898,
+       0x78d2, 0x78da, 0x2091, 0x8001, 0x7808, 0xc08d, 0x780a, 0x127e,
+       0x0d7e, 0x0c7e, 0x70d4, 0xa084, 0x2700, 0x2090, 0x0c7f, 0x0d7f,
+       0x127f, 0x2900, 0x705a, 0x68bc, 0x7042, 0x7003, 0x0002, 0x2d00,
+       0x704e, 0xad80, 0x0009, 0x7046, 0x7830, 0xd0bc, 0x0040, 0x2dc8,
+       0x2091, 0x303d, 0x70d4, 0xa084, 0x303d, 0x2091, 0x8000, 0x2090,
+       0x70a4, 0xa005, 0x00c0, 0x2dcd, 0x007c, 0x8421, 0x0040, 0x2dcc,
+       0x7250, 0x70c0, 0xa200, 0xa015, 0x0078, 0x2bb6, 0xa286, 0x0010,
+       0x00c0, 0x2e07, 0x1078, 0x43b0, 0x00c0, 0x2d64, 0x6814, 0xc0fc,
+       0x8007, 0x7882, 0x781b, 0x005b, 0x68b4, 0x785a, 0x6894, 0x78d6,
+       0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a, 0x70a4,
+       0x8000, 0x70a6, 0x74b4, 0xa490, 0x0005, 0x70ac, 0xa206, 0x00c0,
+       0x2dfa, 0x72a8, 0x72b6, 0x2900, 0x705a, 0x68bc, 0x7042, 0x7003,
+       0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x007c, 0x6bb4,
+       0xa39d, 0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x6b94,
+       0x7bd6, 0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, 0x005b, 0x2900,
+       0x705a, 0x7202, 0x7808, 0xc08d, 0x780a, 0x2300, 0xa605, 0x0040,
+       0x2e32, 0x70d4, 0xa084, 0x2700, 0xa086, 0x2300, 0x00c0, 0x2e2c,
+       0x2009, 0x0000, 0x0078, 0x2e2e, 0x2009, 0x0001, 0xa284, 0x000f,
+       0x1079, 0x2e38, 0xad80, 0x0009, 0x7046, 0x2d00, 0x704e, 0x007c,
+       0x2e40, 0x493f, 0x493f, 0x492c, 0x493f, 0x2e40, 0x2e40, 0x2e40,
+       0x1078, 0x29b2, 0x7808, 0xa084, 0xfffd, 0x780a, 0x1078, 0x29a5,
+       0x0f7e, 0x2079, 0x4f00, 0x78ac, 0x0f7f, 0xd084, 0x0040, 0x2e6a,
+       0x7064, 0xa086, 0x0001, 0x00c0, 0x2e58, 0x7066, 0x0078, 0x2f41,
+       0x7064, 0xa086, 0x0005, 0x00c0, 0x2e68, 0x707c, 0x2068, 0x681b,
+       0x0004, 0x6817, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822,
+       0x7067, 0x0000, 0x70a7, 0x0000, 0x70a8, 0x70b2, 0x70b6, 0x1078,
+       0x2b01, 0x157e, 0x2011, 0x0004, 0x7164, 0xa186, 0x0001, 0x0040,
+       0x2e8a, 0xa186, 0x0007, 0x00c0, 0x2e81, 0x701f, 0x0005, 0x0078,
+       0x2e8a, 0x701f, 0x0001, 0x7067, 0x0000, 0x70d4, 0xc0dd, 0x70d6,
+       0x0078, 0x2e8c, 0x7067, 0x0000, 0x2001, 0x4f0a, 0x2004, 0xa084,
+       0x00ff, 0xa086, 0x0018, 0x0040, 0x2e9c, 0x7018, 0x7016, 0xa005,
+       0x00c0, 0x2e9c, 0x70a7, 0x0001, 0x067e, 0x1078, 0x45d6, 0x20a9,
+       0x0010, 0x2039, 0x0000, 0x1078, 0x4148, 0xa7b8, 0x0100, 0x00f0,
+       0x2ea3, 0x067f, 0x7000, 0x0079, 0x2ead, 0x2ee7, 0x2ec2, 0x2ec2,
+       0x2eb7, 0x2ee7, 0x2ee7, 0x2ee7, 0x2eb5, 0x1078, 0x29b2, 0x7060,
+       0xa005, 0x0040, 0x2ee7, 0xad06, 0x00c0, 0x2ec2, 0x6800, 0x7062,
+       0x0078, 0x2ed4, 0x6820, 0xd084, 0x00c0, 0x2ed0, 0x6f14, 0x1078,
+       0x424e, 0x6008, 0xc0d4, 0x600a, 0x1078, 0x3e19, 0x0078, 0x2ed4,
+       0x705c, 0x2060, 0x6800, 0x6002, 0xa684, 0x5f00, 0x681e, 0x6818,
+       0xd0fc, 0x0040, 0x2edc, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000,
+       0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x1078, 0x2073, 0xb284,
+       0x0400, 0x0040, 0x2eef, 0x2021, 0x96d0, 0x0078, 0x2ef1, 0x2021,
+       0x95c0, 0x1078, 0x2f46, 0xb284, 0x0400, 0x0040, 0x2efb, 0x2021,
+       0x4f98, 0x0078, 0x2efd, 0x2021, 0x4f58, 0x1078, 0x2f46, 0x20a9,
+       0x0101, 0xb284, 0x0400, 0x0040, 0x2f09, 0x2021, 0x95d0, 0x0078,
+       0x2f0b, 0x2021, 0x94c0, 0x1078, 0x2f46, 0x8420, 0x00f0, 0x2f0b,
+       0xb284, 0x0300, 0x0040, 0x2f18, 0x2061, 0x54c0, 0x0078, 0x2f1a,
+       0x2061, 0x74c0, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6110, 0x81ff,
+       0x0040, 0x2f37, 0x6018, 0x017e, 0x007e, 0x2011, 0x4f02, 0x220c,
+       0xa102, 0x2012, 0x007f, 0x017f, 0xa102, 0x0050, 0x2f37, 0x6012,
+       0x00c0, 0x2f37, 0x2011, 0x4f04, 0x2204, 0xc0a5, 0x2012, 0x601b,
+       0x0000, 0xace0, 0x0010, 0x00f0, 0x2f1e, 0x8421, 0x00c0, 0x2f1c,
+       0x157f, 0x7003, 0x0000, 0x704f, 0x0000, 0x007c, 0x047e, 0x2404,
+       0xa005, 0x0040, 0x2f61, 0x2068, 0x6800, 0x007e, 0x6a1a, 0x6817,
+       0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820,
+       0xa084, 0x00ff, 0xc09d, 0x6822, 0x1078, 0x2073, 0x007f, 0x0078,
+       0x2f48, 0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050,
+       0x2f6b, 0x1078, 0x29b2, 0x2300, 0x0079, 0x2f6e, 0x2f71, 0x2ffc,
+       0x3019, 0xa282, 0x0002, 0x0040, 0x2f77, 0x1078, 0x29b2, 0x7064,
+       0x7067, 0x0000, 0x7083, 0x0000, 0x0079, 0x2f7e, 0x2f86, 0x2f86,
+       0x2f88, 0x2fc8, 0x3e55, 0x2f86, 0x2fc8, 0x2f86, 0x1078, 0x29b2,
+       0x7774, 0x1078, 0x4148, 0x7774, 0xa7bc, 0x8f00, 0x1078, 0x424e,
+       0x6018, 0xa005, 0x0040, 0x2fbf, 0xd7fc, 0x00c0, 0x2f9b, 0x2021,
+       0x95c0, 0x0078, 0x2f9d, 0x2021, 0x96d0, 0x2009, 0x0005, 0x2011,
+       0x0010, 0x1078, 0x3034, 0x0040, 0x2fbf, 0x157e, 0x20a9, 0x0101,
+       0xd7fc, 0x00c0, 0x2faf, 0x2021, 0x94c0, 0x0078, 0x2fb1, 0x2021,
+       0x95d0, 0x047e, 0x2009, 0x0005, 0x2011, 0x0010, 0x1078, 0x3034,
+       0x047f, 0x0040, 0x2fbe, 0x8420, 0x00f0, 0x2fb1, 0x157f, 0x8738,
+       0xa784, 0x001f, 0x00c0, 0x2f8e, 0x0078, 0x2a0c, 0x0078, 0x2a0c,
+       0x7774, 0x1078, 0x424e, 0x6018, 0xa005, 0x0040, 0x2ffa, 0xd7fc,
+       0x00c0, 0x2fd6, 0x2021, 0x95c0, 0x0078, 0x2fd8, 0x2021, 0x96d0,
+       0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x3034, 0x0040, 0x2ffa,
+       0x157e, 0x20a9, 0x0101, 0xd7fc, 0x00c0, 0x2fea, 0x2021, 0x94c0,
+       0x0078, 0x2fec, 0x2021, 0x95d0, 0x047e, 0x2009, 0x0005, 0x2011,
+       0x0020, 0x1078, 0x3034, 0x047f, 0x0040, 0x2ff9, 0x8420, 0x00f0,
+       0x2fec, 0x157f, 0x0078, 0x2a0c, 0x2200, 0x0079, 0x2fff, 0x3002,
+       0x3004, 0x3004, 0x1078, 0x29b2, 0x2009, 0x0012, 0x7064, 0xa086,
+       0x0002, 0x0040, 0x300d, 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0040,
+       0x3012, 0x691a, 0x7067, 0x0000, 0x70d4, 0xc0dd, 0x70d6, 0x0078,
+       0x435d, 0x2200, 0x0079, 0x301c, 0x3021, 0x3004, 0x301f, 0x1078,
+       0x29b2, 0x1078, 0x45d6, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3dc7,
+       0x1078, 0x3e36, 0x6008, 0xa084, 0xfbef, 0x600a, 0x1078, 0x3db8,
+       0x0040, 0x3dc7, 0x0078, 0x2a0c, 0x2404, 0xa005, 0x0040, 0x306d,
+       0x2068, 0x2d04, 0x007e, 0x6814, 0xa706, 0x0040, 0x3043, 0x2d20,
+       0x007f, 0x0078, 0x3035, 0x007f, 0x2022, 0x691a, 0x6817, 0x0000,
        0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084,
-       0x00ff, 0xc09d, 0x6822, 0x1078, 0x202c, 0x007f, 0x0078, 0x2eff,
-       0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050, 0x2f22,
-       0x1078, 0x296b, 0x2300, 0x0079, 0x2f25, 0x2f28, 0x2fb3, 0x2fd0,
-       0xa282, 0x0002, 0x0040, 0x2f2e, 0x1078, 0x296b, 0x7064, 0x7067,
-       0x0000, 0x7083, 0x0000, 0x0079, 0x2f35, 0x2f3d, 0x2f3d, 0x2f3f,
-       0x2f7f, 0x3e0c, 0x2f3d, 0x2f7f, 0x2f3d, 0x1078, 0x296b, 0x7774,
-       0x1078, 0x40f8, 0x7774, 0xa7bc, 0x8f00, 0x1078, 0x41fe, 0x6018,
-       0xa005, 0x0040, 0x2f76, 0xd7fc, 0x00c0, 0x2f52, 0x2021, 0x94c0,
-       0x0078, 0x2f54, 0x2021, 0x95d0, 0x2009, 0x0005, 0x2011, 0x0010,
-       0x1078, 0x2feb, 0x0040, 0x2f76, 0x157e, 0x20a9, 0x0101, 0xd7fc,
-       0x00c0, 0x2f66, 0x2021, 0x93c0, 0x0078, 0x2f68, 0x2021, 0x94d0,
-       0x047e, 0x2009, 0x0005, 0x2011, 0x0010, 0x1078, 0x2feb, 0x047f,
-       0x0040, 0x2f75, 0x8420, 0x00f0, 0x2f68, 0x157f, 0x8738, 0xa784,
-       0x001f, 0x00c0, 0x2f45, 0x0078, 0x29c5, 0x0078, 0x29c5, 0x7774,
-       0x1078, 0x41fe, 0x6018, 0xa005, 0x0040, 0x2fb1, 0xd7fc, 0x00c0,
-       0x2f8d, 0x2021, 0x94c0, 0x0078, 0x2f8f, 0x2021, 0x95d0, 0x2009,
-       0x0005, 0x2011, 0x0020, 0x1078, 0x2feb, 0x0040, 0x2fb1, 0x157e,
-       0x20a9, 0x0101, 0xd7fc, 0x00c0, 0x2fa1, 0x2021, 0x93c0, 0x0078,
-       0x2fa3, 0x2021, 0x94d0, 0x047e, 0x2009, 0x0005, 0x2011, 0x0020,
-       0x1078, 0x2feb, 0x047f, 0x0040, 0x2fb0, 0x8420, 0x00f0, 0x2fa3,
-       0x157f, 0x0078, 0x29c5, 0x2200, 0x0079, 0x2fb6, 0x2fb9, 0x2fbb,
-       0x2fbb, 0x1078, 0x296b, 0x2009, 0x0012, 0x7064, 0xa086, 0x0002,
-       0x0040, 0x2fc4, 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0040, 0x2fc9,
-       0x691a, 0x7067, 0x0000, 0x70d4, 0xc0dd, 0x70d6, 0x0078, 0x430d,
-       0x2200, 0x0079, 0x2fd3, 0x2fd8, 0x2fbb, 0x2fd6, 0x1078, 0x296b,
-       0x1078, 0x4586, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3d7e, 0x1078,
-       0x3ded, 0x6008, 0xa084, 0xfbef, 0x600a, 0x1078, 0x3d6f, 0x0040,
-       0x3d7e, 0x0078, 0x29c5, 0x2404, 0xa005, 0x0040, 0x3024, 0x2068,
-       0x2d04, 0x007e, 0x6814, 0xa706, 0x0040, 0x2ffa, 0x2d20, 0x007f,
-       0x0078, 0x2fec, 0x007f, 0x2022, 0x691a, 0x6817, 0x0000, 0x682b,
-       0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084, 0x00ff,
-       0xa205, 0x6822, 0x1078, 0x202c, 0x2021, 0x4e02, 0x241c, 0x8319,
-       0x2322, 0x6010, 0x8001, 0x6012, 0x00c0, 0x301b, 0x2021, 0x4e04,
-       0x2404, 0xc0a5, 0x2022, 0x6008, 0xa084, 0xf9ef, 0x600a, 0x1078,
-       0x2adb, 0x1078, 0x3ded, 0x007c, 0xa085, 0x0001, 0x0078, 0x3023,
-       0x2300, 0x0079, 0x302b, 0x3030, 0x302e, 0x30b0, 0x1078, 0x296b,
-       0x78e4, 0xa005, 0x00d0, 0x3066, 0x3208, 0x007e, 0x2001, 0x4e04,
-       0x2004, 0xd0ec, 0x007f, 0x0040, 0x3041, 0xa18c, 0x0300, 0x0078,
-       0x3043, 0xa18c, 0x0400, 0x0040, 0x3049, 0x0018, 0x29c1, 0x0078,
-       0x304b, 0x0028, 0x29c1, 0x2008, 0xa084, 0x0030, 0x00c0, 0x3052,
-       0x0078, 0x3770, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3050, 0x2100,
-       0xa084, 0x0007, 0x0079, 0x305c, 0x3090, 0x309a, 0x3085, 0x3064,
-       0x4355, 0x4355, 0x3064, 0x30a5, 0x1078, 0x296b, 0x7000, 0xa086,
-       0x0004, 0x00c0, 0x3080, 0x7064, 0xa086, 0x0002, 0x00c0, 0x3076,
-       0x2011, 0x0002, 0x2019, 0x0000, 0x0078, 0x2f1c, 0x7064, 0xa086,
-       0x0006, 0x0040, 0x3070, 0x7064, 0xa086, 0x0004, 0x0040, 0x3070,
-       0x79e4, 0x2001, 0x0003, 0x0078, 0x33fa, 0x6818, 0xd0fc, 0x0040,
-       0x308b, 0x681b, 0x001d, 0x1078, 0x40c8, 0x781b, 0x0064, 0x007c,
-       0x6818, 0xd0fc, 0x0040, 0x3096, 0x681b, 0x001d, 0x1078, 0x40c8,
-       0x0078, 0x4331, 0x6818, 0xd0fc, 0x0040, 0x30a0, 0x681b, 0x001d,
-       0x1078, 0x40c8, 0x781b, 0x00f8, 0x007c, 0x6818, 0xd0fc, 0x0040,
-       0x30ab, 0x681b, 0x001d, 0x1078, 0x40c8, 0x781b, 0x00c8, 0x007c,
-       0xa584, 0x000f, 0x00c0, 0x30cf, 0x1078, 0x295e, 0x7000, 0x0079,
-       0x30b9, 0x29c5, 0x30c1, 0x30c3, 0x3d7e, 0x3d7e, 0x3d7e, 0x30c1,
-       0x30c1, 0x1078, 0x296b, 0x1078, 0x3ded, 0x6008, 0xa084, 0xfbef,
-       0x600a, 0x1078, 0x3d6f, 0x0040, 0x3d7e, 0x0078, 0x29c5, 0x78e4,
-       0xa005, 0x00d0, 0x3066, 0x3208, 0x007e, 0x2001, 0x4e04, 0x2004,
-       0xd0ec, 0x007f, 0x0040, 0x30e0, 0xa18c, 0x0300, 0x0078, 0x30e2,
-       0xa18c, 0x0400, 0x0040, 0x30e8, 0x0018, 0x3066, 0x0078, 0x30ea,
-       0x0028, 0x3066, 0x2008, 0xa084, 0x0030, 0x00c0, 0x30f2, 0x781b,
-       0x005b, 0x007c, 0x78ec, 0xa084, 0x0003, 0x0040, 0x30ef, 0x2100,
-       0xa184, 0x0007, 0x0079, 0x30fc, 0x310b, 0x310f, 0x3106, 0x3104,
-       0x4355, 0x4355, 0x3104, 0x434f, 0x1078, 0x296b, 0x1078, 0x40d0,
-       0x781b, 0x0064, 0x007c, 0x1078, 0x40d0, 0x0078, 0x4331, 0x1078,
-       0x40d0, 0x781b, 0x00f8, 0x007c, 0x1078, 0x40d0, 0x781b, 0x00c8,
-       0x007c, 0x2300, 0x0079, 0x311c, 0x3121, 0x311f, 0x3123, 0x1078,
-       0x296b, 0x0078, 0x395f, 0x681b, 0x0016, 0x78a3, 0x0000, 0x79e4,
-       0xa184, 0x0030, 0x0040, 0x395f, 0x78ec, 0xa084, 0x0003, 0x0040,
-       0x395f, 0xa184, 0x0100, 0x0040, 0x3127, 0xa184, 0x0007, 0x0079,
-       0x3139, 0x3141, 0x310f, 0x3085, 0x430d, 0x4355, 0x4355, 0x430d,
-       0x434f, 0x1078, 0x4319, 0x007c, 0xa282, 0x0005, 0x0050, 0x314a,
-       0x1078, 0x296b, 0x2300, 0x0079, 0x314d, 0x3150, 0x3380, 0x338b,
-       0x2200, 0x0079, 0x3153, 0x316d, 0x315a, 0x316d, 0x3158, 0x3363,
-       0x1078, 0x296b, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa082,
-       0x0020, 0x0048, 0x40b7, 0xa08a, 0x0004, 0x00c8, 0x40b7, 0x0079,
-       0x3169, 0x40b7, 0x40b7, 0x40b7, 0x4061, 0x789b, 0x0018, 0x79a8,
-       0xa184, 0x0080, 0x0040, 0x317e, 0x0078, 0x40b7, 0x7000, 0xa005,
-       0x00c0, 0x3174, 0x2011, 0x0004, 0x0078, 0x3b4a, 0xa184, 0x00ff,
-       0xa08a, 0x0010, 0x00c8, 0x40b7, 0x0079, 0x3186, 0x3198, 0x3196,
-       0x31ad, 0x31b1, 0x3284, 0x40b7, 0x40b7, 0x3286, 0x40b7, 0x40b7,
-       0x335f, 0x335f, 0x40b7, 0x40b7, 0x40b7, 0x3361, 0x1078, 0x296b,
-       0xd6e4, 0x0040, 0x31a3, 0x2001, 0x0300, 0x8000, 0x8000, 0x783a,
-       0x781b, 0x00c3, 0x007c, 0x6818, 0xd0fc, 0x0040, 0x31ab, 0x681b,
-       0x001d, 0x0078, 0x319b, 0x0078, 0x430d, 0x681b, 0x001d, 0x0078,
-       0x40c1, 0x6920, 0x6922, 0xa684, 0x1800, 0x00c0, 0x3216, 0x6820,
-       0xd084, 0x00c0, 0x321c, 0x6818, 0xa086, 0x0008, 0x00c0, 0x31c2,
-       0x681b, 0x0000, 0xd6d4, 0x0040, 0x3281, 0xd6bc, 0x0040, 0x3202,
-       0x7087, 0x0000, 0x6818, 0xa084, 0x003f, 0xa08a, 0x000d, 0x0050,
-       0x3202, 0xa08a, 0x000c, 0x7186, 0x2001, 0x000c, 0x800c, 0x718a,
-       0x789b, 0x0061, 0x78aa, 0x157e, 0x137e, 0x147e, 0x017e, 0x3208,
-       0xa18c, 0x0300, 0x0040, 0x31f4, 0x007e, 0x2001, 0x4e04, 0x2004,
-       0xd0ec, 0x007f, 0x0040, 0x31f0, 0x20a1, 0x012b, 0x0078, 0x31f6,
-       0x20a1, 0x022b, 0x0078, 0x31f6, 0x20a1, 0x012b, 0x017f, 0x789b,
-       0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f,
-       0x137f, 0x157f, 0x6038, 0xa005, 0x00c0, 0x3211, 0x681c, 0xa084,
-       0x000e, 0x0040, 0x40c1, 0x1078, 0x40d7, 0x782b, 0x3008, 0x0078,
-       0x3213, 0x8001, 0x603a, 0x781b, 0x0067, 0x007c, 0xd6e4, 0x0040,
-       0x321c, 0x781b, 0x0079, 0x007c, 0xa684, 0x0060, 0x0040, 0x327e,
-       0xd6dc, 0x0040, 0x327e, 0xd6fc, 0x00c0, 0x3228, 0x0078, 0x323f,
-       0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0, 0x801b, 0x00c8,
-       0x3232, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98,
-       0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0xd6f4,
-       0x0040, 0x3245, 0xc6f4, 0x7e5a, 0x6eb6, 0x7000, 0xa086, 0x0003,
-       0x00c0, 0x3253, 0x007e, 0x1078, 0x4586, 0x1078, 0x48bd, 0x007f,
-       0x781b, 0x0076, 0x007c, 0xa006, 0x1078, 0x49c3, 0x6ab0, 0x69ac,
-       0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040, 0x3262, 0x2200, 0xa422,
-       0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, 0x6ba6, 0x7bd6, 0x7bde,
-       0x2300, 0xa405, 0x00c0, 0x3272, 0xc6f5, 0x7e5a, 0x6eb6, 0x781b,
-       0x0076, 0x007c, 0x781b, 0x0076, 0x2200, 0xa115, 0x00c0, 0x327b,
-       0x1078, 0x48bd, 0x007c, 0x1078, 0x48f5, 0x007c, 0x781b, 0x0079,
-       0x007c, 0x781b, 0x0067, 0x007c, 0x1078, 0x296b, 0x0078, 0x32d2,
-       0x6920, 0xd1c4, 0x0040, 0x329b, 0xc1c4, 0x6922, 0x0c7e, 0x7058,
-       0x2060, 0x6000, 0xc0e4, 0x6002, 0x6004, 0xa084, 0xfff5, 0x6006,
-       0x0c7f, 0x0078, 0x32c6, 0xd1cc, 0x0040, 0x32c6, 0xc1cc, 0x6922,
-       0x0c7e, 0x7058, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x6004, 0xc0a4,
-       0x6006, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x32c6, 0x1078,
-       0x41fa, 0x1078, 0x3ef5, 0x88ff, 0x0040, 0x32c6, 0x789b, 0x0060,
-       0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x32c3,
-       0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7e58, 0xd6d4,
-       0x00c0, 0x32cd, 0x781b, 0x0067, 0x007c, 0x781b, 0x0079, 0x007c,
-       0x0078, 0x40bc, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x00c0,
-       0x32e0, 0x6820, 0xa084, 0x0100, 0x0040, 0x32d0, 0x2009, 0x0008,
-       0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x00c0,
-       0x32fc, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, 0x32f4,
-       0x0048, 0x32f4, 0x0078, 0x32f6, 0x0078, 0x3288, 0x24a8, 0x7aa8,
-       0x00f0, 0x32f6, 0x0078, 0x32e2, 0xa284, 0x00f0, 0xa086, 0x0020,
-       0x00c0, 0x3350, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040, 0x330c,
-       0x0048, 0x330c, 0x0078, 0x334d, 0xa286, 0x0023, 0x0040, 0x32d0,
-       0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1, 0xc0a5,
-       0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x0c7e, 0x7058, 0x2060,
-       0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd1a4, 0x0040, 0x332d, 0x1078,
-       0x41fa, 0x1078, 0x4011, 0x0078, 0x333b, 0x0c7e, 0x7058, 0x2060,
-       0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x32c6, 0x1078,
-       0x41fa, 0x1078, 0x3ef5, 0x88ff, 0x0040, 0x32c6, 0x789b, 0x0060,
-       0x2800, 0x78aa, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x334a, 0x781b,
-       0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7aa8, 0x0078, 0x32e2,
-       0x8318, 0x2300, 0xa102, 0x0040, 0x3359, 0x0048, 0x3359, 0x0078,
-       0x32e2, 0xa284, 0x0080, 0x00c0, 0x40c1, 0x0078, 0x40bc, 0x0078,
-       0x40c1, 0x0078, 0x40b7, 0x7058, 0xa04d, 0x789b, 0x0018, 0x78a8,
-       0xa084, 0x00ff, 0xa08e, 0x0001, 0x0040, 0x3370, 0x1078, 0x296b,
-       0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004,
-       0x00c8, 0x40b7, 0x0079, 0x337c, 0x40b7, 0x3e46, 0x40b7, 0x3fb9,
-       0xa282, 0x0000, 0x00c0, 0x3386, 0x1078, 0x296b, 0x1078, 0x40c8,
-       0x781b, 0x0078, 0x007c, 0xa282, 0x0003, 0x00c0, 0x3391, 0x1078,
-       0x296b, 0xd4fc, 0x00c0, 0x33b1, 0x7064, 0xa005, 0x0040, 0x339a,
-       0x1078, 0x296b, 0x6f14, 0x7776, 0xa7bc, 0x8f00, 0x1078, 0x41fe,
-       0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x001f, 0x00c0,
-       0x339e, 0x1078, 0x40cc, 0x7067, 0x0002, 0x701f, 0x0009, 0x0078,
-       0x33b3, 0x1078, 0x40db, 0x781b, 0x0078, 0x007c, 0xa282, 0x0004,
-       0x0050, 0x33bc, 0x1078, 0x296b, 0x2300, 0x0079, 0x33bf, 0x33c2,
-       0x3582, 0x35c5, 0xa286, 0x0003, 0x0040, 0x33fa, 0x7200, 0x7cd8,
-       0x7ddc, 0x7fd0, 0x71d4, 0xd1bc, 0x00c0, 0x33f2, 0xd1b4, 0x0040,
-       0x33f2, 0x7868, 0xa084, 0x00ff, 0x00c0, 0x33f2, 0xa282, 0x0002,
-       0x00c8, 0x33f2, 0x0d7e, 0x783b, 0x8300, 0x781b, 0x004c, 0x70bc,
-       0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
-       0x78da, 0xc1b4, 0x71d6, 0x7003, 0x0030, 0x0d7f, 0x2001, 0x0000,
-       0x0078, 0x33fe, 0x783b, 0x1300, 0x781b, 0x004a, 0x2001, 0x0000,
-       0x0078, 0x33fe, 0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x704a, 0x68a0,
-       0xd0ec, 0x0040, 0x3406, 0x6008, 0xc08d, 0x600a, 0xa284, 0x000f,
-       0x0079, 0x340a, 0x3562, 0x3417, 0x3414, 0x36c8, 0x3754, 0x29c5,
-       0x3412, 0x3412, 0x1078, 0x296b, 0x6008, 0xc0d4, 0x600a, 0xd6e4,
-       0x0040, 0x341f, 0x7048, 0xa086, 0x0014, 0x00c0, 0x343f, 0x1078,
-       0x4586, 0x2009, 0x0000, 0x6818, 0xd0fc, 0x0040, 0x3428, 0x7048,
-       0xa086, 0x0014, 0x0040, 0x3439, 0x6818, 0xa086, 0x0008, 0x00c0,
-       0x351a, 0x7858, 0xd09c, 0x0040, 0x351a, 0x6820, 0xd0ac, 0x0040,
-       0x351a, 0x681b, 0x0014, 0x2009, 0x0002, 0x0078, 0x347e, 0x7868,
-       0xa08c, 0x00ff, 0x0040, 0x347e, 0xa186, 0x0008, 0x00c0, 0x3455,
-       0x6008, 0xc0a4, 0x600a, 0x1078, 0x3d6f, 0x0040, 0x347e, 0x1078,
-       0x3ded, 0x1078, 0x4586, 0x0078, 0x3466, 0xa186, 0x0028, 0x00c0,
-       0x347e, 0x6018, 0xa005, 0x0040, 0x3448, 0x8001, 0x0040, 0x3448,
-       0x8001, 0x0040, 0x3448, 0x601e, 0x0078, 0x3448, 0x6820, 0xd084,
-       0x0040, 0x29c5, 0xc084, 0x6822, 0x1078, 0x2acc, 0x705c, 0x0c7e,
-       0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004, 0x6802, 0xa005, 0x2d00,
-       0x00c0, 0x347b, 0x6002, 0x6006, 0x0078, 0x29c5, 0x017e, 0x81ff,
-       0x00c0, 0x34c8, 0x7000, 0xa086, 0x0030, 0x0040, 0x34c8, 0x71d4,
-       0xd1bc, 0x00c0, 0x34c8, 0xd1b4, 0x00c0, 0x34af, 0x7060, 0xa005,
-       0x00c0, 0x34c8, 0x70a4, 0xa086, 0x0001, 0x0040, 0x34c8, 0x7003,
-       0x0000, 0x047e, 0x057e, 0x077e, 0x067e, 0x0c7e, 0x0d7e, 0x1078,
-       0x29ee, 0x0d7f, 0x0c7f, 0x067f, 0x077f, 0x057f, 0x047f, 0x71d4,
-       0xd1b4, 0x00c0, 0x34c8, 0x7003, 0x0040, 0x0078, 0x34c8, 0x1078,
-       0x4360, 0x00c0, 0x34c8, 0x781b, 0x005b, 0x0d7e, 0x70bc, 0xa06d,
-       0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da,
-       0xc1b4, 0x71d6, 0x7003, 0x0030, 0x7808, 0xc08d, 0x780a, 0x0d7f,
-       0x1078, 0x35ff, 0x017f, 0x81ff, 0x0040, 0x351a, 0xa684, 0xdf00,
-       0x681e, 0x682b, 0x0000, 0x6f14, 0xa186, 0x0002, 0x00c0, 0x351b,
-       0x6818, 0xa086, 0x0014, 0x00c0, 0x34e4, 0x2008, 0xd6e4, 0x0040,
-       0x34e4, 0x7868, 0xa08c, 0x00ff, 0x1078, 0x2aba, 0x1078, 0x2adb,
-       0x6820, 0xd0dc, 0x00c0, 0x351b, 0x8717, 0xa294, 0x000f, 0x8213,
-       0x8213, 0x8213, 0xb284, 0x0300, 0x0040, 0x34fa, 0xa290, 0x52c0,
-       0x0078, 0x34fc, 0xa290, 0x5340, 0xa290, 0x0000, 0x221c, 0xd3c4,
-       0x00c0, 0x3504, 0x0078, 0x350a, 0x8210, 0x2204, 0xa085, 0x0018,
-       0x2012, 0x8211, 0xd3d4, 0x0040, 0x3515, 0x68a0, 0xd0c4, 0x00c0,
-       0x3515, 0x1078, 0x3679, 0x0078, 0x29c5, 0x6008, 0xc08d, 0x600a,
-       0x0078, 0x351b, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0040, 0x3522,
-       0x7048, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x6410, 0x84ff, 0x0040,
-       0x3537, 0x2009, 0x4e02, 0x2104, 0x8001, 0x200a, 0x8421, 0x6412,
-       0x00c0, 0x3537, 0x2021, 0x4e04, 0x2404, 0xc0a5, 0x2022, 0x6018,
-       0xa005, 0x0040, 0x353f, 0x8001, 0x601a, 0x00c0, 0x3542, 0x6008,
-       0xc0a4, 0x600a, 0x6820, 0xd084, 0x00c0, 0x354e, 0x6800, 0xa005,
-       0x00c0, 0x354b, 0x6002, 0x6006, 0x0078, 0x3552, 0x705c, 0x2060,
-       0x6800, 0x6002, 0x2061, 0x4e00, 0x6887, 0x0103, 0x2d08, 0x206b,
-       0x0000, 0x6068, 0xa005, 0x616a, 0x0040, 0x3561, 0x2d02, 0x0078,
-       0x3562, 0x616e, 0x7200, 0xa286, 0x0030, 0x0040, 0x3572, 0xa286,
-       0x0040, 0x00c0, 0x29c5, 0x7003, 0x0002, 0x704c, 0x2068, 0x68c4,
-       0x2060, 0x007c, 0x7003, 0x0002, 0x70bc, 0xa06d, 0x68bc, 0x7042,
-       0x70b8, 0xa065, 0x68c0, 0x705a, 0x2d00, 0x704e, 0xad80, 0x0009,
-       0x7046, 0x007c, 0xa282, 0x0004, 0x0048, 0x3588, 0x1078, 0x296b,
-       0x2200, 0x0079, 0x358b, 0x358f, 0x35a0, 0x35ad, 0x35a0, 0xa586,
-       0x1300, 0x0040, 0x35a0, 0xa586, 0x8300, 0x00c0, 0x3586, 0x7003,
-       0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084, 0xfbef, 0x600a,
-       0x7000, 0xa086, 0x0005, 0x0040, 0x35aa, 0x1078, 0x40c8, 0x781b,
-       0x0078, 0x007c, 0x781b, 0x0079, 0x007c, 0x7890, 0x8007, 0x8001,
-       0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff,
-       0xa186, 0x0003, 0x0040, 0x35c2, 0xa186, 0x0000, 0x0040, 0x35c2,
-       0x0078, 0x40b7, 0x781b, 0x0079, 0x007c, 0x6820, 0xc095, 0x6822,
-       0x82ff, 0x00c0, 0x35cf, 0x1078, 0x40c8, 0x0078, 0x35d6, 0x8211,
-       0x0040, 0x35d4, 0x1078, 0x296b, 0x1078, 0x40db, 0x781b, 0x0078,
-       0x007c, 0x1078, 0x4383, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x35fc,
-       0x017e, 0x3208, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f,
-       0x0040, 0x35ee, 0xa18c, 0x0300, 0x0078, 0x35f0, 0xa18c, 0x0400,
-       0x017f, 0x0040, 0x35f7, 0x0018, 0x35fc, 0x0078, 0x35f9, 0x0028,
-       0x35fc, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684,
-       0x0060, 0x00c0, 0x3609, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078,
-       0x3678, 0xd6dc, 0x00c0, 0x3621, 0x68b4, 0xd0dc, 0x00c0, 0x3621,
-       0x6998, 0x6a94, 0x692e, 0x6a32, 0x7048, 0xa005, 0x00c0, 0x361e,
-       0x2200, 0xa105, 0x0040, 0x4586, 0x704b, 0x0015, 0x0078, 0x4586,
-       0x007c, 0xd6ac, 0x0040, 0x3647, 0xd6f4, 0x0040, 0x362d, 0x682f,
-       0x0000, 0x6833, 0x0000, 0x0078, 0x4586, 0x68b4, 0xa084, 0x4000,
-       0xa635, 0xd6f4, 0x00c0, 0x3627, 0x7048, 0xa005, 0x00c0, 0x363a,
-       0x704b, 0x0015, 0xd6dc, 0x00c0, 0x3643, 0x68b4, 0xd0dc, 0x0040,
-       0x3643, 0x6ca8, 0x6da4, 0x6c2e, 0x6d32, 0x0078, 0x4586, 0xd6f4,
-       0x0040, 0x3650, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x4586,
-       0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4, 0x00c0, 0x364a, 0x7048,
-       0xa005, 0x00c0, 0x365d, 0x704b, 0x0015, 0x2408, 0x2510, 0x2700,
-       0x80fb, 0x00c8, 0x3664, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291,
-       0x0000, 0x692e, 0x6a32, 0x2100, 0xa205, 0x00c0, 0x3671, 0x0078,
-       0x4586, 0x7000, 0xa086, 0x0006, 0x0040, 0x3678, 0x0078, 0x4586,
-       0x007c, 0x6946, 0x6008, 0xc0cd, 0xd3cc, 0x0040, 0x3680, 0xc08d,
-       0x600a, 0x6818, 0x683a, 0x681b, 0x0006, 0x688f, 0x0000, 0x6893,
-       0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f, 0x0003, 0x6833,
-       0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b, 0x0020, 0x7000,
-       0x0079, 0x369a, 0x29c5, 0x36ac, 0x36a4, 0x36a2, 0x36a2, 0x36a2,
-       0x36a2, 0x36a2, 0x1078, 0x296b, 0x6820, 0xd084, 0x00c0, 0x36ac,
-       0x1078, 0x3dd0, 0x0078, 0x36b2, 0x705c, 0x2c50, 0x2060, 0x6800,
-       0x6002, 0x2a60, 0x3208, 0xa18c, 0x0300, 0x0040, 0x36bb, 0x2021,
-       0x4e58, 0x0078, 0x36bd, 0x2021, 0x4e98, 0x2404, 0xa005, 0x0040,
-       0x36c4, 0x2020, 0x0078, 0x36bd, 0x2d22, 0x206b, 0x0000, 0x007c,
-       0x1078, 0x3dd7, 0x1078, 0x3ded, 0x6008, 0xc0cc, 0x600a, 0x682b,
-       0x0000, 0x789b, 0x000e, 0x6f14, 0x6938, 0x691a, 0x6944, 0x6916,
-       0x3208, 0xa18c, 0x0300, 0x0040, 0x36e1, 0x2009, 0x0000, 0x0078,
-       0x36e3, 0x2009, 0x0001, 0x1078, 0x49f8, 0xd6dc, 0x0040, 0x36eb,
-       0x691c, 0xc1ed, 0x691e, 0x6818, 0xd0fc, 0x0040, 0x36fa, 0x7868,
-       0xa08c, 0x00ff, 0x0040, 0x36f8, 0x681b, 0x001e, 0x0078, 0x36fa,
-       0x681b, 0x0000, 0xb284, 0x0300, 0x00c0, 0x3702, 0x2021, 0x4e98,
-       0x0078, 0x3704, 0x2021, 0x4e58, 0x6800, 0x2022, 0x6a3c, 0x6940,
-       0x6a32, 0x692e, 0x68c0, 0x2060, 0x6000, 0xd0a4, 0x0040, 0x3744,
-       0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x0d7e, 0x0f7e,
-       0x157e, 0x147e, 0x2079, 0x4e00, 0x1078, 0x1dff, 0x147f, 0x157f,
-       0x0f7f, 0x70cc, 0x2010, 0x2009, 0x0101, 0x027e, 0x2204, 0xa06d,
-       0x0040, 0x3734, 0x6814, 0xa706, 0x0040, 0x3731, 0x6800, 0x0078,
-       0x3727, 0x6820, 0xc0d5, 0x6822, 0x027f, 0x8210, 0x8109, 0x00c0,
-       0x3725, 0x0d7f, 0x7067, 0x0003, 0x707f, 0x0000, 0x7776, 0x7083,
-       0x000f, 0x71d4, 0xc1dc, 0x71d6, 0x6818, 0xa086, 0x0002, 0x00c0,
-       0x3750, 0x6817, 0x0000, 0x682b, 0x0000, 0x681c, 0xc0ec, 0x681e,
-       0x1078, 0x202c, 0x0078, 0x29c5, 0x7cd8, 0x7ddc, 0x7fd0, 0x1078,
-       0x35ff, 0x682b, 0x0000, 0x789b, 0x000e, 0x6f14, 0x1078, 0x4387,
-       0xa08c, 0x00ff, 0x6916, 0x6818, 0xd0fc, 0x0040, 0x3769, 0x7048,
-       0x681a, 0xa68c, 0xdf00, 0x691e, 0x7067, 0x0000, 0x0078, 0x29c5,
-       0x7000, 0xa005, 0x00c0, 0x3776, 0x0078, 0x29c5, 0xa006, 0x1078,
-       0x4586, 0x6920, 0xd1ac, 0x00c0, 0x377f, 0x681b, 0x0014, 0xa68c,
-       0xdf00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff, 0x6822,
-       0x7000, 0x0079, 0x378b, 0x29c5, 0x3795, 0x3795, 0x3798, 0x3798,
-       0x3798, 0x3793, 0x3793, 0x1078, 0x296b, 0x6818, 0x0078, 0x33fa,
-       0x6008, 0xc0a4, 0x600a, 0x6817, 0x0000, 0x0078, 0x3d95, 0x2300,
-       0x0079, 0x37a2, 0x37a5, 0x37a7, 0x3817, 0x1078, 0x296b, 0xd6fc,
-       0x00c0, 0x37fe, 0x7000, 0xa00d, 0x0079, 0x37ae, 0x29c5, 0x37b8,
-       0x37b8, 0x37e8, 0x37b8, 0x37fb, 0x37b6, 0x37b6, 0x1078, 0x296b,
-       0xa684, 0x0060, 0x0040, 0x37e8, 0xa086, 0x0060, 0x00c0, 0x37e5,
-       0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a, 0x6eb6, 0x681c, 0xc0ac, 0x681e,
-       0xa186, 0x0002, 0x0040, 0x37d7, 0x1078, 0x4586, 0x69ac, 0x68b0,
-       0xa115, 0x0040, 0x37d7, 0x1078, 0x48f5, 0x0078, 0x37d9, 0x1078,
-       0x48bd, 0x781b, 0x0079, 0x71d4, 0xd1b4, 0x00c0, 0x29c1, 0x70a4,
-       0xa086, 0x0001, 0x00c0, 0x2a0b, 0x007c, 0xd6ec, 0x0040, 0x37c2,
-       0x6818, 0xd0fc, 0x0040, 0x37fb, 0xd6f4, 0x00c0, 0x37f5, 0x681b,
-       0x0015, 0x781b, 0x0079, 0x0078, 0x29c1, 0x681b, 0x0007, 0x682f,
-       0x0000, 0x6833, 0x0000, 0x1078, 0x4319, 0x007c, 0xc6fc, 0x7e5a,
-       0x7adc, 0x79d8, 0x78d0, 0x801b, 0x00c8, 0x3807, 0x8000, 0xa084,
-       0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2,
-       0x6b94, 0x2200, 0xa303, 0x68ae, 0x781b, 0x0079, 0x007c, 0x1078,
-       0x296b, 0x2300, 0x0079, 0x381c, 0x3821, 0x3846, 0x38a6, 0x1078,
-       0x296b, 0x7000, 0x0079, 0x3824, 0x382c, 0x382e, 0x3837, 0x382c,
-       0x382c, 0x382c, 0x382c, 0x382c, 0x1078, 0x296b, 0x69ac, 0x68b0,
-       0xa115, 0x0040, 0x3837, 0x1078, 0x48f5, 0x0078, 0x3839, 0x1078,
-       0x48bd, 0x681c, 0xc0b4, 0x681e, 0x70d4, 0xd0b4, 0x00c0, 0x29c1,
-       0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a0b, 0x007c, 0xd6fc, 0x00c0,
-       0x3896, 0x7000, 0xa00d, 0x0079, 0x384d, 0x29c5, 0x385d, 0x3857,
-       0x388d, 0x385d, 0x3893, 0x3855, 0x3855, 0x1078, 0x296b, 0x6894,
-       0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060, 0x0040,
-       0x388d, 0xa086, 0x0060, 0x00c0, 0x388a, 0xa6b4, 0xbfbf, 0xc6ed,
-       0x7e5a, 0x6eb6, 0xa186, 0x0002, 0x0040, 0x3879, 0x1078, 0x4586,
-       0x69ac, 0x68b0, 0xa115, 0x0040, 0x3879, 0x1078, 0x48f5, 0x0078,
-       0x387b, 0x1078, 0x48bd, 0x781b, 0x0079, 0x681c, 0xc0b4, 0x681e,
-       0x71d4, 0xd1b4, 0x00c0, 0x29c1, 0x70a4, 0xa086, 0x0001, 0x00c0,
-       0x2a0b, 0x007c, 0xd6ec, 0x0040, 0x3867, 0x6818, 0xd0fc, 0x0040,
-       0x3893, 0x681b, 0x0007, 0x781b, 0x00f9, 0x007c, 0xc6fc, 0x7e5a,
-       0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
-       0xa303, 0x68ae, 0x79d2, 0x781b, 0x0079, 0x007c, 0xd6dc, 0x0040,
-       0x38af, 0x782b, 0x3009, 0x781b, 0x0079, 0x0078, 0x29c1, 0x7884,
-       0xc0ac, 0x7886, 0x78e4, 0xa084, 0x0008, 0x00c0, 0x38c2, 0xa484,
-       0x0200, 0x0040, 0x38bc, 0xc6f5, 0xc6dd, 0x7e5a, 0x781b, 0x0079,
-       0x0078, 0x29c1, 0x6820, 0xc095, 0x6822, 0x1078, 0x4292, 0xc6dd,
-       0x1078, 0x40c8, 0x781b, 0x0078, 0x0078, 0x29c1, 0x2300, 0x0079,
-       0x38d1, 0x38d4, 0x38d6, 0x38d8, 0x1078, 0x296b, 0x0078, 0x40c1,
-       0xd6d4, 0x00c0, 0x3913, 0x79e4, 0xd1ac, 0x0040, 0x38e6, 0x78ec,
-       0xa084, 0x0003, 0x0040, 0x38e6, 0x782b, 0x3009, 0x789b, 0x0060,
-       0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4, 0xd1ac, 0x0040,
-       0x38f6, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x390f, 0x2001, 0x4e04,
-       0x2004, 0xd0e4, 0x00c0, 0x390b, 0x6820, 0xd0c4, 0x0040, 0x390b,
-       0x0c7e, 0x7058, 0x2060, 0x6004, 0xc09d, 0x6006, 0x6008, 0xa084,
-       0x00ff, 0x600a, 0x0c7f, 0x2001, 0x0014, 0x0078, 0x33fa, 0xa184,
-       0x0007, 0x0079, 0x3949, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060,
-       0x79a8, 0x81ff, 0x0040, 0x3947, 0x789b, 0x0010, 0x7ba8, 0xa384,
-       0x0001, 0x00c0, 0x393a, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0,
-       0x392d, 0x2009, 0xfff7, 0x0078, 0x3933, 0xa386, 0x0003, 0x00c0,
-       0x393a, 0x2009, 0xffef, 0x0c7e, 0x7058, 0x2060, 0x6004, 0xa104,
-       0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb,
-       0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078,
-       0x430d, 0x3090, 0x309a, 0x3953, 0x3959, 0x3951, 0x3951, 0x430d,
-       0x430d, 0x1078, 0x296b, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078,
-       0x4313, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078, 0x430d, 0x79e4,
-       0xa184, 0x0030, 0x0040, 0x3969, 0x78ec, 0xa084, 0x0003, 0x00c0,
-       0x399d, 0x7000, 0xa086, 0x0004, 0x00c0, 0x3983, 0x7064, 0xa086,
-       0x0002, 0x00c0, 0x3979, 0x2011, 0x0002, 0x2019, 0x0000, 0x0078,
-       0x2f1c, 0x7064, 0xa086, 0x0006, 0x0040, 0x3973, 0x7064, 0xa086,
-       0x0004, 0x0040, 0x3973, 0x7000, 0xa086, 0x0000, 0x0040, 0x29c1,
-       0x6920, 0xa184, 0x0420, 0x0040, 0x3992, 0xc1d4, 0x6922, 0x6818,
-       0x0078, 0x33fa, 0x6818, 0xa08e, 0x0002, 0x0040, 0x399b, 0xc0fd,
-       0x681a, 0x2001, 0x0014, 0x0078, 0x33fa, 0xa184, 0x0007, 0x0079,
-       0x39a1, 0x430d, 0x430d, 0x39a9, 0x430d, 0x4355, 0x4355, 0x430d,
-       0x430d, 0xd6bc, 0x0040, 0x39eb, 0x7184, 0x81ff, 0x0040, 0x39eb,
-       0xa182, 0x000d, 0x00d0, 0x39b8, 0x7087, 0x0000, 0x0078, 0x39bd,
-       0xa182, 0x000c, 0x7086, 0x2009, 0x000c, 0x789b, 0x0061, 0x79aa,
-       0x157e, 0x137e, 0x147e, 0x7088, 0x8114, 0xa210, 0x728a, 0xa080,
-       0x000b, 0xad00, 0x2098, 0xb284, 0x0300, 0x0040, 0x39df, 0x007e,
-       0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x39db, 0x20a1,
-       0x012b, 0x0078, 0x39e1, 0x20a1, 0x022b, 0x0078, 0x39e1, 0x20a1,
-       0x012b, 0x789b, 0x0000, 0x8108, 0x81ac, 0x53a6, 0x147f, 0x137f,
-       0x157f, 0x0078, 0x4313, 0xd6d4, 0x00c0, 0x3a3f, 0x6820, 0xd084,
-       0x0040, 0x4313, 0xa68c, 0x0060, 0xa684, 0x0060, 0x0040, 0x39fd,
-       0xa086, 0x0060, 0x00c0, 0x39fd, 0xc1f5, 0xc194, 0x795a, 0x69b6,
-       0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6818, 0xc0fd,
-       0x681a, 0x78aa, 0x8008, 0x810c, 0x0040, 0x3e06, 0xa18c, 0x00f8,
-       0x00c0, 0x3e06, 0x157e, 0x137e, 0x147e, 0x017e, 0x3208, 0xa18c,
-       0x0300, 0x0040, 0x3a2b, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec,
-       0x007f, 0x0040, 0x3a27, 0x20a1, 0x012b, 0x0078, 0x3a2d, 0x20a1,
-       0x022b, 0x0078, 0x3a2d, 0x20a1, 0x012b, 0x017f, 0x789b, 0x0000,
-       0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f,
-       0x157f, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x0078, 0x4313, 0x6818,
-       0xd0fc, 0x0040, 0x3a45, 0x681b, 0x0008, 0x6820, 0xc0ad, 0x6822,
-       0x1078, 0x40d0, 0x781b, 0x00ea, 0x007c, 0x2300, 0x0079, 0x3a50,
-       0x3a55, 0x3b2d, 0x3a53, 0x1078, 0x296b, 0x7cd8, 0x7ddc, 0x7fd0,
-       0x82ff, 0x00c0, 0x3a7e, 0x7200, 0xa286, 0x0003, 0x0040, 0x33c7,
-       0x71d4, 0xd1bc, 0x00c0, 0x3a81, 0xd1b4, 0x0040, 0x3a81, 0x0d7e,
-       0x783b, 0x8800, 0x781b, 0x004c, 0x70bc, 0xa06d, 0x68b4, 0xc0a5,
-       0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4,
-       0x71d6, 0x7003, 0x0030, 0x0d7f, 0x0078, 0x3a85, 0x7200, 0x0078,
-       0x3a85, 0x783b, 0x1800, 0x781b, 0x004a, 0xa284, 0x000f, 0x0079,
-       0x3a89, 0x3b18, 0x3ac7, 0x3a93, 0x33f6, 0x3a91, 0x3b18, 0x3a91,
-       0x3a91, 0x1078, 0x296b, 0x681c, 0xd0ec, 0x0040, 0x3a9a, 0x6008,
-       0xc08d, 0x600a, 0x6920, 0xc185, 0x6922, 0x6800, 0x6006, 0xa005,
-       0x00c0, 0x3aa3, 0x6002, 0x6008, 0xc0d4, 0x600a, 0x681c, 0xa084,
-       0x000e, 0x00c0, 0x3ab7, 0xb284, 0x0300, 0x0040, 0x3ab3, 0x2009,
-       0x94c0, 0x0078, 0x3abc, 0x2009, 0x95d0, 0x0078, 0x3abc, 0x7030,
-       0x68ba, 0x7140, 0x70cc, 0xa108, 0x2104, 0x6802, 0x2d0a, 0x715e,
-       0xd6dc, 0x00c0, 0x3ac7, 0xc6fc, 0x6eb6, 0x0078, 0x3b18, 0x6eb6,
-       0xa684, 0x0060, 0x00c0, 0x3ad1, 0xa684, 0x7fff, 0x68b6, 0x0078,
-       0x3b18, 0xd6dc, 0x00c0, 0x3adf, 0xa684, 0x7fff, 0x68b6, 0x6894,
-       0x68a6, 0x6898, 0x68aa, 0x1078, 0x4586, 0x0078, 0x3b18, 0xd6ac,
-       0x0040, 0x3aeb, 0xa006, 0x1078, 0x4586, 0x2408, 0x2510, 0x69aa,
-       0x6aa6, 0x0078, 0x3afb, 0x2408, 0x2510, 0x2700, 0x801b, 0x00c8,
-       0x3af2, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x69aa,
-       0x6aa6, 0x1078, 0x4586, 0xd6fc, 0x0040, 0x3b18, 0xa684, 0x7fff,
-       0x68b6, 0x2510, 0x2408, 0xd6ac, 0x00c0, 0x3b10, 0x2700, 0x801b,
-       0x00c8, 0x3b0b, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
+       0x00ff, 0xa205, 0x6822, 0x1078, 0x2073, 0x2021, 0x4f02, 0x241c,
+       0x8319, 0x2322, 0x6010, 0x8001, 0x6012, 0x00c0, 0x3064, 0x2021,
+       0x4f04, 0x2404, 0xc0a5, 0x2022, 0x6008, 0xa084, 0xf9ef, 0x600a,
+       0x1078, 0x2b22, 0x1078, 0x3e36, 0x007c, 0xa085, 0x0001, 0x0078,
+       0x306c, 0x2300, 0x0079, 0x3074, 0x3079, 0x3077, 0x30f9, 0x1078,
+       0x29b2, 0x78e4, 0xa005, 0x00d0, 0x30af, 0x3208, 0x007e, 0x2001,
+       0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x308a, 0xa18c, 0x0300,
+       0x0078, 0x308c, 0xa18c, 0x0400, 0x0040, 0x3092, 0x0018, 0x2a08,
+       0x0078, 0x3094, 0x0028, 0x2a08, 0x2008, 0xa084, 0x0030, 0x00c0,
+       0x309b, 0x0078, 0x37b9, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3099,
+       0x2100, 0xa084, 0x0007, 0x0079, 0x30a5, 0x30d9, 0x30e3, 0x30ce,
+       0x30ad, 0x43a5, 0x43a5, 0x30ad, 0x30ee, 0x1078, 0x29b2, 0x7000,
+       0xa086, 0x0004, 0x00c0, 0x30c9, 0x7064, 0xa086, 0x0002, 0x00c0,
+       0x30bf, 0x2011, 0x0002, 0x2019, 0x0000, 0x0078, 0x2f65, 0x7064,
+       0xa086, 0x0006, 0x0040, 0x30b9, 0x7064, 0xa086, 0x0004, 0x0040,
+       0x30b9, 0x79e4, 0x2001, 0x0003, 0x0078, 0x3443, 0x6818, 0xd0fc,
+       0x0040, 0x30d4, 0x681b, 0x001d, 0x1078, 0x4118, 0x781b, 0x0064,
+       0x007c, 0x6818, 0xd0fc, 0x0040, 0x30df, 0x681b, 0x001d, 0x1078,
+       0x4118, 0x0078, 0x4381, 0x6818, 0xd0fc, 0x0040, 0x30e9, 0x681b,
+       0x001d, 0x1078, 0x4118, 0x781b, 0x00f8, 0x007c, 0x6818, 0xd0fc,
+       0x0040, 0x30f4, 0x681b, 0x001d, 0x1078, 0x4118, 0x781b, 0x00c8,
+       0x007c, 0xa584, 0x000f, 0x00c0, 0x3118, 0x1078, 0x29a5, 0x7000,
+       0x0079, 0x3102, 0x2a0c, 0x310a, 0x310c, 0x3dc7, 0x3dc7, 0x3dc7,
+       0x310a, 0x310a, 0x1078, 0x29b2, 0x1078, 0x3e36, 0x6008, 0xa084,
+       0xfbef, 0x600a, 0x1078, 0x3db8, 0x0040, 0x3dc7, 0x0078, 0x2a0c,
+       0x78e4, 0xa005, 0x00d0, 0x30af, 0x3208, 0x007e, 0x2001, 0x4f04,
+       0x2004, 0xd0ec, 0x007f, 0x0040, 0x3129, 0xa18c, 0x0300, 0x0078,
+       0x312b, 0xa18c, 0x0400, 0x0040, 0x3131, 0x0018, 0x30af, 0x0078,
+       0x3133, 0x0028, 0x30af, 0x2008, 0xa084, 0x0030, 0x00c0, 0x313b,
+       0x781b, 0x005b, 0x007c, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3138,
+       0x2100, 0xa184, 0x0007, 0x0079, 0x3145, 0x3154, 0x3158, 0x314f,
+       0x314d, 0x43a5, 0x43a5, 0x314d, 0x439f, 0x1078, 0x29b2, 0x1078,
+       0x4120, 0x781b, 0x0064, 0x007c, 0x1078, 0x4120, 0x0078, 0x4381,
+       0x1078, 0x4120, 0x781b, 0x00f8, 0x007c, 0x1078, 0x4120, 0x781b,
+       0x00c8, 0x007c, 0x2300, 0x0079, 0x3165, 0x316a, 0x3168, 0x316c,
+       0x1078, 0x29b2, 0x0078, 0x39a8, 0x681b, 0x0016, 0x78a3, 0x0000,
+       0x79e4, 0xa184, 0x0030, 0x0040, 0x39a8, 0x78ec, 0xa084, 0x0003,
+       0x0040, 0x39a8, 0xa184, 0x0100, 0x0040, 0x3170, 0xa184, 0x0007,
+       0x0079, 0x3182, 0x318a, 0x3158, 0x30ce, 0x435d, 0x43a5, 0x43a5,
+       0x435d, 0x439f, 0x1078, 0x4369, 0x007c, 0xa282, 0x0005, 0x0050,
+       0x3193, 0x1078, 0x29b2, 0x2300, 0x0079, 0x3196, 0x3199, 0x33c9,
+       0x33d4, 0x2200, 0x0079, 0x319c, 0x31b6, 0x31a3, 0x31b6, 0x31a1,
+       0x33ac, 0x1078, 0x29b2, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff,
+       0xa082, 0x0020, 0x0048, 0x4107, 0xa08a, 0x0004, 0x00c8, 0x4107,
+       0x0079, 0x31b2, 0x4107, 0x4107, 0x4107, 0x40b1, 0x789b, 0x0018,
+       0x79a8, 0xa184, 0x0080, 0x0040, 0x31c7, 0x0078, 0x4107, 0x7000,
+       0xa005, 0x00c0, 0x31bd, 0x2011, 0x0004, 0x0078, 0x3b93, 0xa184,
+       0x00ff, 0xa08a, 0x0010, 0x00c8, 0x4107, 0x0079, 0x31cf, 0x31e1,
+       0x31df, 0x31f6, 0x31fa, 0x32cd, 0x4107, 0x4107, 0x32cf, 0x4107,
+       0x4107, 0x33a8, 0x33a8, 0x4107, 0x4107, 0x4107, 0x33aa, 0x1078,
+       0x29b2, 0xd6e4, 0x0040, 0x31ec, 0x2001, 0x0300, 0x8000, 0x8000,
+       0x783a, 0x781b, 0x00c3, 0x007c, 0x6818, 0xd0fc, 0x0040, 0x31f4,
+       0x681b, 0x001d, 0x0078, 0x31e4, 0x0078, 0x435d, 0x681b, 0x001d,
+       0x0078, 0x4111, 0x6920, 0x6922, 0xa684, 0x1800, 0x00c0, 0x325f,
+       0x6820, 0xd084, 0x00c0, 0x3265, 0x6818, 0xa086, 0x0008, 0x00c0,
+       0x320b, 0x681b, 0x0000, 0xd6d4, 0x0040, 0x32ca, 0xd6bc, 0x0040,
+       0x324b, 0x7087, 0x0000, 0x6818, 0xa084, 0x003f, 0xa08a, 0x000d,
+       0x0050, 0x324b, 0xa08a, 0x000c, 0x7186, 0x2001, 0x000c, 0x800c,
+       0x718a, 0x789b, 0x0061, 0x78aa, 0x157e, 0x137e, 0x147e, 0x017e,
+       0x3208, 0xa18c, 0x0300, 0x0040, 0x323d, 0x007e, 0x2001, 0x4f04,
+       0x2004, 0xd0ec, 0x007f, 0x0040, 0x3239, 0x20a1, 0x012b, 0x0078,
+       0x323f, 0x20a1, 0x022b, 0x0078, 0x323f, 0x20a1, 0x012b, 0x017f,
+       0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6,
+       0x147f, 0x137f, 0x157f, 0x6038, 0xa005, 0x00c0, 0x325a, 0x681c,
+       0xa084, 0x000e, 0x0040, 0x4111, 0x1078, 0x4127, 0x782b, 0x3008,
+       0x0078, 0x325c, 0x8001, 0x603a, 0x781b, 0x0067, 0x007c, 0xd6e4,
+       0x0040, 0x3265, 0x781b, 0x0079, 0x007c, 0xa684, 0x0060, 0x0040,
+       0x32c7, 0xd6dc, 0x0040, 0x32c7, 0xd6fc, 0x00c0, 0x3271, 0x0078,
+       0x3288, 0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0, 0x801b,
+       0x00c8, 0x327b, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
        0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae,
-       0x7000, 0xa086, 0x0030, 0x00c0, 0x29c5, 0x7003, 0x0002, 0x70bc,
-       0xa06d, 0x68bc, 0x7042, 0x70b8, 0xa065, 0x68c0, 0x705a, 0x2d00,
-       0x704e, 0xad80, 0x0009, 0x7046, 0x007c, 0xa586, 0x8800, 0x00c0,
-       0x3b3a, 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084,
-       0xfbef, 0x600a, 0x0078, 0x40c1, 0x7047, 0x0000, 0xa282, 0x0006,
-       0x0050, 0x3b44, 0x1078, 0x296b, 0x2300, 0x0079, 0x3b47, 0x3b4a,
-       0x3b5c, 0x3b68, 0x2200, 0x0079, 0x3b4d, 0x3b53, 0x40c1, 0x3b55,
-       0x3b53, 0x3ba2, 0x3bf7, 0x1078, 0x296b, 0x7a80, 0xa294, 0x0f00,
-       0x1078, 0x3c81, 0x0078, 0x40b7, 0x1078, 0x3b79, 0x0079, 0x3b60,
-       0x40c1, 0x3b66, 0x3b66, 0x3ba2, 0x3b66, 0x40c1, 0x1078, 0x296b,
-       0x1078, 0x3b79, 0x0079, 0x3b6c, 0x3b74, 0x3b72, 0x3b72, 0x3b74,
-       0x3b72, 0x3b74, 0x1078, 0x296b, 0x1078, 0x40db, 0x781b, 0x0078,
-       0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3b8a, 0x1078, 0x3ded,
-       0x0078, 0x3b84, 0x1078, 0x4586, 0x6008, 0xa084, 0xfbef, 0x600a,
-       0x0078, 0x3b8f, 0x7000, 0xa086, 0x0003, 0x0040, 0x3b82, 0x7003,
-       0x0005, 0xb284, 0x0300, 0x0040, 0x3b99, 0x2001, 0x95e0, 0x0078,
-       0x3b9b, 0x2001, 0x9612, 0x2068, 0x704e, 0xad80, 0x0009, 0x7046,
-       0x2200, 0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3bb4, 0x70d4,
-       0xc0b5, 0x70d6, 0x2c00, 0x70ba, 0x2d00, 0x70be, 0x0078, 0x3bb9,
-       0x1078, 0x4586, 0x0078, 0x3bb9, 0x7000, 0xa086, 0x0003, 0x0040,
-       0x3bb0, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018,
-       0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x94c0, 0xb284, 0x0300,
-       0x00c0, 0x3bcd, 0xc2fd, 0x2069, 0x95d0, 0x2d04, 0x2d08, 0x715e,
-       0xa06d, 0x0040, 0x3bda, 0x6814, 0xa206, 0x0040, 0x3bdc, 0x6800,
-       0x0078, 0x3bce, 0x1078, 0x3c81, 0x6eb4, 0x7e5a, 0x6920, 0xa184,
-       0x0c00, 0x0040, 0x3cab, 0x7064, 0xa086, 0x0006, 0x00c0, 0x3bee,
-       0x7074, 0xa206, 0x00c0, 0x3bee, 0x7066, 0x707e, 0x681b, 0x0005,
-       0xc1ad, 0xc1d4, 0x6922, 0x1078, 0x40d0, 0x0078, 0x3cab, 0x7200,
-       0xa286, 0x0002, 0x00c0, 0x3c09, 0x70d4, 0xc0b5, 0x70d6, 0x2c00,
-       0x70ba, 0x2d00, 0x70be, 0x0078, 0x3c0d, 0x1078, 0x4586, 0x0078,
-       0x3c0d, 0xa286, 0x0003, 0x0040, 0x3c05, 0x7003, 0x0001, 0x7a80,
-       0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215,
-       0xb284, 0x0300, 0x00c0, 0x3c1d, 0xc2fd, 0x79a8, 0x79a8, 0xa18c,
-       0x00ff, 0x2118, 0x70cc, 0xa168, 0x2d04, 0x2d08, 0x715e, 0xa06d,
-       0x0040, 0x3c31, 0x6814, 0xa206, 0x0040, 0x3c5a, 0x6800, 0x0078,
-       0x3c25, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3c3b, 0x2001,
-       0x95e0, 0x0078, 0x3c3d, 0x2001, 0x9612, 0x2068, 0x704e, 0x157e,
-       0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3c42, 0x157f,
-       0xb284, 0x0300, 0x0040, 0x3c4f, 0xc2fc, 0x0078, 0x3c50, 0xc2fd,
-       0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823, 0x0800,
-       0x6827, 0x0003, 0x6eb4, 0x6920, 0xa184, 0x0c00, 0x0040, 0x3cab,
-       0xd0dc, 0x0040, 0x3c76, 0x7064, 0xa086, 0x0004, 0x00c0, 0x3c72,
-       0x7074, 0xa206, 0x00c0, 0x3c72, 0x7078, 0xa306, 0x00c0, 0x3c72,
-       0x7066, 0x707e, 0x1078, 0x40d7, 0x0078, 0x3cab, 0x681b, 0x0005,
-       0xc1ad, 0xc1d4, 0x6922, 0x1078, 0x40d0, 0x707f, 0x0000, 0x0078,
-       0x3cab, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3c8b, 0x2001,
-       0x95e0, 0x0078, 0x3c8d, 0x2001, 0x9612, 0x2068, 0x704e, 0x157e,
-       0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3c92, 0x157f,
-       0xb284, 0x0300, 0x0040, 0x3c9f, 0xc2fc, 0x0078, 0x3ca0, 0xc2fd,
-       0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823, 0x0800,
-       0x6827, 0x0003, 0x007c, 0xc6ec, 0xa6ac, 0x0060, 0x0040, 0x3cfd,
-       0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x00c0, 0x3cd8, 0x7bd2,
-       0x7bda, 0x7cd6, 0x7cde, 0xa586, 0x0060, 0x0040, 0x3d02, 0xd6f4,
-       0x00c0, 0x3cc3, 0xc6ed, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0079,
-       0xd69c, 0x0040, 0x3cd0, 0x2009, 0x0078, 0x2019, 0x0000, 0x2320,
-       0x791a, 0xd6ec, 0x0040, 0x3d0d, 0x1078, 0x48bd, 0x0078, 0x3d0d,
-       0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x0040, 0x3d04,
-       0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0, 0xd6f4, 0x00c0, 0x3ce9,
-       0xc6ed, 0xc6f4, 0x7e5a, 0x2011, 0x0079, 0xd69c, 0x0040, 0x3cf5,
-       0x2011, 0x0078, 0x2019, 0x0000, 0x2320, 0x7a1a, 0xd6ec, 0x0040,
-       0x3d0d, 0x1078, 0x48f5, 0x0078, 0x3d0d, 0x2019, 0x0000, 0x2320,
-       0x0078, 0x3d04, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0079, 0xd69c,
-       0x0040, 0x3d0c, 0x2009, 0x0078, 0x791a, 0x68c0, 0x705a, 0x2d00,
-       0x704e, 0x68c4, 0x2060, 0x71d4, 0x2001, 0x4e01, 0x2004, 0xd0c4,
-       0x00c0, 0x3d62, 0x70d8, 0xa02d, 0x0040, 0x3d3b, 0xd1bc, 0x0040,
-       0x3d55, 0x7a80, 0xa294, 0x0f00, 0x70dc, 0xa206, 0x0040, 0x3d2c,
-       0x78e0, 0xa504, 0x00c0, 0x3d62, 0x70da, 0xc1bc, 0x71d6, 0x0078,
-       0x3d62, 0x2031, 0x0001, 0x852c, 0x0048, 0x3d3a, 0x8633, 0x8210,
-       0x0078, 0x3d33, 0x007c, 0x7de0, 0xa594, 0xff00, 0x0040, 0x3d48,
-       0x2011, 0x0008, 0x852f, 0x1078, 0x3d31, 0x8637, 0x0078, 0x3d4a,
-       0x1078, 0x3d31, 0x8217, 0x7880, 0xa084, 0x0f00, 0xa206, 0x0040,
-       0x3d62, 0x72de, 0x76da, 0x0078, 0x3d62, 0x7a80, 0xa294, 0x0f00,
-       0x70dc, 0xa236, 0x0040, 0x3d52, 0x78e0, 0xa534, 0x0040, 0x3d52,
-       0xc1bd, 0x71d6, 0xd1b4, 0x00c0, 0x29c1, 0x2300, 0xa405, 0x0040,
-       0x29c1, 0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a0b, 0x007c, 0x6020,
-       0xa005, 0x0040, 0x3d7d, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008,
-       0x600a, 0x700f, 0x0100, 0x702c, 0x6026, 0x007c, 0xa006, 0x1078,
-       0x4586, 0x7000, 0xa086, 0x0002, 0x0040, 0x3d8b, 0x7064, 0xa086,
-       0x0005, 0x00c0, 0x3d95, 0x682b, 0x0000, 0x6817, 0x0000, 0x681b,
-       0x0001, 0x6823, 0x0040, 0x681f, 0x0100, 0x7000, 0xa084, 0x000f,
-       0x0079, 0x3d9a, 0x29c5, 0x3daa, 0x3da4, 0x3dcc, 0x3db4, 0x29c5,
-       0x3da2, 0x3da2, 0x1078, 0x296b, 0x1078, 0x3dd7, 0x1078, 0x3dd0,
-       0x0078, 0x3db0, 0x1078, 0x3dd7, 0x705c, 0x2060, 0x6800, 0x6002,
-       0x1078, 0x202c, 0x0078, 0x29c5, 0x7064, 0x7067, 0x0000, 0x7083,
-       0x0000, 0x0079, 0x3dbb, 0x3dc8, 0x3dc8, 0x3dc3, 0x3dc3, 0x3dc3,
-       0x3dc8, 0x3dc3, 0x3dc8, 0x77d4, 0xc7dd, 0x77d6, 0x0079, 0x2f35,
-       0x7067, 0x0000, 0x0078, 0x29c5, 0x681b, 0x0000, 0x0078, 0x36c8,
-       0x6800, 0xa005, 0x00c0, 0x3dd5, 0x6002, 0x6006, 0x007c, 0x6410,
-       0x84ff, 0x0040, 0x3de9, 0x2009, 0x4e02, 0x2104, 0x8001, 0x200a,
-       0x8421, 0x6412, 0x00c0, 0x3de9, 0x2021, 0x4e04, 0x2404, 0xc0a5,
-       0x2022, 0x6008, 0xc0a4, 0x600a, 0x007c, 0x6018, 0xa005, 0x0040,
-       0x3df3, 0x8001, 0x601a, 0x007c, 0x1078, 0x4383, 0x681b, 0x0018,
-       0x0078, 0x3e34, 0x1078, 0x4383, 0x681b, 0x0019, 0x0078, 0x3e34,
-       0x1078, 0x4383, 0x681b, 0x001a, 0x0078, 0x3e34, 0x1078, 0x4383,
-       0x681b, 0x0003, 0x0078, 0x3e34, 0x7774, 0x1078, 0x41fe, 0x7178,
-       0xa18c, 0x00ff, 0x3210, 0xa294, 0x0300, 0x0040, 0x3e1b, 0xa1e8,
-       0x93c0, 0x0078, 0x3e1d, 0xa1e8, 0x94d0, 0x2d04, 0x2d08, 0x2068,
-       0xa005, 0x00c0, 0x3e26, 0x707e, 0x0078, 0x29c5, 0x6814, 0x7274,
-       0xa206, 0x0040, 0x3e2e, 0x6800, 0x0078, 0x3e1e, 0x6800, 0x200a,
-       0x681b, 0x0005, 0x707f, 0x0000, 0x1078, 0x3dd7, 0x6820, 0xd084,
-       0x00c0, 0x3e3c, 0x1078, 0x3dd0, 0x1078, 0x3ded, 0x681f, 0x0000,
-       0x6823, 0x0020, 0x1078, 0x202c, 0x0078, 0x29c5, 0xa282, 0x0003,
-       0x00c0, 0x40b7, 0x7da8, 0xa5ac, 0x00ff, 0x7e5a, 0x7ea8, 0xa6b4,
-       0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1c4, 0x0040, 0x3ea1, 0xc1c4,
-       0x6922, 0xa6b4, 0x00ff, 0x0040, 0x3e8e, 0xa682, 0x000c, 0x0048,
-       0x3e65, 0x0040, 0x3e65, 0x2031, 0x000c, 0x2500, 0xa086, 0x000a,
-       0x0040, 0x3e6c, 0x852b, 0x852b, 0x1078, 0x4190, 0x0040, 0x3e74,
-       0x1078, 0x3f6f, 0x0078, 0x3e97, 0x1078, 0x414b, 0x0c7e, 0x2960,
-       0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3fa5, 0x0c7f, 0x6920,
-       0xc1c5, 0x6922, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x3e8b,
-       0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x0c7e, 0x2960,
-       0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3fa5, 0x0c7f, 0x7e58,
-       0xd6d4, 0x00c0, 0x3e9e, 0x781b, 0x0067, 0x007c, 0x781b, 0x0079,
-       0x007c, 0x0c7e, 0x7058, 0x2060, 0x6100, 0xd1e4, 0x0040, 0x3eea,
-       0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c, 0x0048, 0x3eb4,
-       0x0040, 0x3eb4, 0x2011, 0x000c, 0x2600, 0xa202, 0x00c8, 0x3eb9,
-       0x2230, 0x6208, 0xa294, 0x00ff, 0x2001, 0x4e05, 0x2004, 0xd0e4,
-       0x00c0, 0x3ece, 0x78ec, 0xd0e4, 0x0040, 0x3ece, 0xa282, 0x000a,
-       0x00c8, 0x3ed4, 0x2011, 0x000a, 0x0078, 0x3ed4, 0xa282, 0x000c,
-       0x00c8, 0x3ed4, 0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, 0x3ed9,
-       0x2228, 0x1078, 0x414f, 0x2500, 0xa086, 0x000a, 0x0040, 0x3ee2,
-       0x852b, 0x852b, 0x1078, 0x4190, 0x0040, 0x3eea, 0x1078, 0x3f6f,
-       0x0078, 0x3eee, 0x1078, 0x414b, 0x1078, 0x3fa5, 0x7858, 0xc095,
-       0x785a, 0x0c7f, 0x781b, 0x0078, 0x007c, 0x0c7e, 0x2960, 0x6000,
-       0xd0e4, 0x00c0, 0x3f0b, 0xa084, 0x0040, 0x00c0, 0x3f05, 0x6104,
-       0xa18c, 0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019,
-       0x0000, 0x0078, 0x3f36, 0x68a0, 0xd0cc, 0x00c0, 0x3f05, 0x6208,
-       0xa294, 0x00ff, 0x2001, 0x4e05, 0x2004, 0xd0e4, 0x00c0, 0x3f24,
-       0x78ec, 0xd0e4, 0x0040, 0x3f24, 0xa282, 0x000b, 0x00c8, 0x3f24,
-       0x2011, 0x000a, 0x0078, 0x3f2a, 0xa282, 0x000c, 0x00c8, 0x3f2a,
-       0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c,
-       0x0048, 0x3f36, 0x0040, 0x3f36, 0x2019, 0x000c, 0x78ab, 0x0001,
-       0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005,
-       0x6820, 0xc0c5, 0x6822, 0x70d4, 0xd0b4, 0x0040, 0x3f52, 0xc0b4,
-       0x70d6, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018,
-       0x8001, 0x601a, 0x0c7f, 0x007c, 0x0c7e, 0x2960, 0x6104, 0xa18c,
-       0xfff5, 0x6106, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, 0x3f60,
-       0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa,
-       0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822, 0x0c7f, 0x007c, 0x0c7e,
-       0x7158, 0x2160, 0x2018, 0xa08c, 0x0020, 0x0040, 0x3f78, 0xc0ac,
-       0x2008, 0xa084, 0xfff0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae,
-       0x6612, 0x78a4, 0xa084, 0xfff0, 0xa18c, 0x000f, 0xa105, 0xc0f4,
-       0xa39c, 0x0020, 0x0040, 0x3f8e, 0xa085, 0x4000, 0xc0fc, 0xd0b4,
-       0x00c0, 0x3f93, 0xc0fd, 0x78a6, 0x6016, 0x788a, 0xa6b4, 0x000f,
-       0x8637, 0x8204, 0x8004, 0xa084, 0x00ff, 0xa605, 0x600e, 0x6004,
-       0xa084, 0xfff5, 0x6006, 0x0c7f, 0x007c, 0x0c7e, 0x7058, 0x2060,
-       0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6, 0x6012, 0x7884,
-       0xa084, 0xfff0, 0x7886, 0x600c, 0xa084, 0x00ff, 0x600e, 0x0c7f,
-       0x007c, 0xa282, 0x0002, 0x00c0, 0x40b7, 0x7aa8, 0x6920, 0xc1bd,
-       0x6922, 0xd1cc, 0x0040, 0x3ff4, 0xc1cc, 0x6922, 0xa294, 0x00ff,
-       0xa282, 0x0002, 0x00c8, 0x40b7, 0x1078, 0x4044, 0x1078, 0x3fa5,
-       0xa980, 0x0001, 0x200c, 0x1078, 0x41fa, 0x1078, 0x3ef5, 0x88ff,
-       0x0040, 0x3fea, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695,
-       0x7e5a, 0xd6d4, 0x00c0, 0x3fe7, 0x781b, 0x0064, 0x007c, 0x781b,
-       0x0078, 0x007c, 0x7e58, 0xd6d4, 0x00c0, 0x3ff1, 0x781b, 0x0067,
-       0x007c, 0x781b, 0x0079, 0x007c, 0xa282, 0x0002, 0x00c8, 0x3ffc,
-       0xa284, 0x0001, 0x0040, 0x4005, 0x7158, 0xa188, 0x0000, 0x210c,
-       0xd1ec, 0x00c0, 0x4005, 0x2011, 0x0000, 0x1078, 0x412c, 0x1078,
-       0x4044, 0x1078, 0x3fa5, 0x7858, 0xc095, 0x785a, 0x781b, 0x0078,
-       0x007c, 0x0c7e, 0x027e, 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec,
-       0x00c0, 0x4025, 0xa084, 0x0080, 0x00c0, 0x4023, 0xc1a4, 0x6106,
-       0xa006, 0x0078, 0x4041, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab,
+       0xd6f4, 0x0040, 0x328e, 0xc6f4, 0x7e5a, 0x6eb6, 0x7000, 0xa086,
+       0x0003, 0x00c0, 0x329c, 0x007e, 0x1078, 0x45d6, 0x1078, 0x493f,
+       0x007f, 0x781b, 0x0076, 0x007c, 0xa006, 0x1078, 0x4a44, 0x6ab0,
+       0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040, 0x32ab, 0x2200,
+       0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, 0x6ba6, 0x7bd6,
+       0x7bde, 0x2300, 0xa405, 0x00c0, 0x32bb, 0xc6f5, 0x7e5a, 0x6eb6,
+       0x781b, 0x0076, 0x007c, 0x781b, 0x0076, 0x2200, 0xa115, 0x00c0,
+       0x32c4, 0x1078, 0x493f, 0x007c, 0x1078, 0x4977, 0x007c, 0x781b,
+       0x0079, 0x007c, 0x781b, 0x0067, 0x007c, 0x1078, 0x29b2, 0x0078,
+       0x331b, 0x6920, 0xd1c4, 0x0040, 0x32e4, 0xc1c4, 0x6922, 0x0c7e,
+       0x7058, 0x2060, 0x6000, 0xc0e4, 0x6002, 0x6004, 0xa084, 0xfff5,
+       0x6006, 0x0c7f, 0x0078, 0x330f, 0xd1cc, 0x0040, 0x330f, 0xc1cc,
+       0x6922, 0x0c7e, 0x7058, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x6004,
+       0xc0a4, 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x330f,
+       0x1078, 0x424a, 0x1078, 0x3f3e, 0x88ff, 0x0040, 0x330f, 0x789b,
+       0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0,
+       0x330c, 0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7e58,
+       0xd6d4, 0x00c0, 0x3316, 0x781b, 0x0067, 0x007c, 0x781b, 0x0079,
+       0x007c, 0x0078, 0x410c, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007,
+       0x00c0, 0x3329, 0x6820, 0xa084, 0x0100, 0x0040, 0x3319, 0x2009,
+       0x0008, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001,
+       0x00c0, 0x3345, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040,
+       0x333d, 0x0048, 0x333d, 0x0078, 0x333f, 0x0078, 0x32d1, 0x24a8,
+       0x7aa8, 0x00f0, 0x333f, 0x0078, 0x332b, 0xa284, 0x00f0, 0xa086,
+       0x0020, 0x00c0, 0x3399, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040,
+       0x3355, 0x0048, 0x3355, 0x0078, 0x3396, 0xa286, 0x0023, 0x0040,
+       0x3319, 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1,
+       0xc0a5, 0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x0c7e, 0x7058,
+       0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd1a4, 0x0040, 0x3376,
+       0x1078, 0x424a, 0x1078, 0x405e, 0x0078, 0x3384, 0x0c7e, 0x7058,
+       0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x330f,
+       0x1078, 0x424a, 0x1078, 0x3f3e, 0x88ff, 0x0040, 0x330f, 0x789b,
+       0x0060, 0x2800, 0x78aa, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x3393,
+       0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7aa8, 0x0078,
+       0x332b, 0x8318, 0x2300, 0xa102, 0x0040, 0x33a2, 0x0048, 0x33a2,
+       0x0078, 0x332b, 0xa284, 0x0080, 0x00c0, 0x4111, 0x0078, 0x410c,
+       0x0078, 0x4111, 0x0078, 0x4107, 0x7058, 0xa04d, 0x789b, 0x0018,
+       0x78a8, 0xa084, 0x00ff, 0xa08e, 0x0001, 0x0040, 0x33b9, 0x1078,
+       0x29b2, 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a,
+       0x0004, 0x00c8, 0x4107, 0x0079, 0x33c5, 0x4107, 0x3e8f, 0x4107,
+       0x4006, 0xa282, 0x0000, 0x00c0, 0x33cf, 0x1078, 0x29b2, 0x1078,
+       0x4118, 0x781b, 0x0078, 0x007c, 0xa282, 0x0003, 0x00c0, 0x33da,
+       0x1078, 0x29b2, 0xd4fc, 0x00c0, 0x33fa, 0x7064, 0xa005, 0x0040,
+       0x33e3, 0x1078, 0x29b2, 0x6f14, 0x7776, 0xa7bc, 0x8f00, 0x1078,
+       0x424e, 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x001f,
+       0x00c0, 0x33e7, 0x1078, 0x411c, 0x7067, 0x0002, 0x701f, 0x0009,
+       0x0078, 0x33fc, 0x1078, 0x412b, 0x781b, 0x0078, 0x007c, 0xa282,
+       0x0004, 0x0050, 0x3405, 0x1078, 0x29b2, 0x2300, 0x0079, 0x3408,
+       0x340b, 0x35cb, 0x360e, 0xa286, 0x0003, 0x0040, 0x3443, 0x7200,
+       0x7cd8, 0x7ddc, 0x7fd0, 0x71d4, 0xd1bc, 0x00c0, 0x343b, 0xd1b4,
+       0x0040, 0x343b, 0x7868, 0xa084, 0x00ff, 0x00c0, 0x343b, 0xa282,
+       0x0002, 0x00c8, 0x343b, 0x0d7e, 0x783b, 0x8300, 0x781b, 0x004c,
+       0x70bc, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898,
+       0x78d2, 0x78da, 0xc1b4, 0x71d6, 0x7003, 0x0030, 0x0d7f, 0x2001,
+       0x0000, 0x0078, 0x3447, 0x783b, 0x1300, 0x781b, 0x004a, 0x2001,
+       0x0000, 0x0078, 0x3447, 0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x704a,
+       0x68a0, 0xd0ec, 0x0040, 0x344f, 0x6008, 0xc08d, 0x600a, 0xa284,
+       0x000f, 0x0079, 0x3453, 0x35ab, 0x3460, 0x345d, 0x3711, 0x379d,
+       0x2a0c, 0x345b, 0x345b, 0x1078, 0x29b2, 0x6008, 0xc0d4, 0x600a,
+       0xd6e4, 0x0040, 0x3468, 0x7048, 0xa086, 0x0014, 0x00c0, 0x3488,
+       0x1078, 0x45d6, 0x2009, 0x0000, 0x6818, 0xd0fc, 0x0040, 0x3471,
+       0x7048, 0xa086, 0x0014, 0x0040, 0x3482, 0x6818, 0xa086, 0x0008,
+       0x00c0, 0x3563, 0x7858, 0xd09c, 0x0040, 0x3563, 0x6820, 0xd0ac,
+       0x0040, 0x3563, 0x681b, 0x0014, 0x2009, 0x0002, 0x0078, 0x34c7,
+       0x7868, 0xa08c, 0x00ff, 0x0040, 0x34c7, 0xa186, 0x0008, 0x00c0,
+       0x349e, 0x6008, 0xc0a4, 0x600a, 0x1078, 0x3db8, 0x0040, 0x34c7,
+       0x1078, 0x3e36, 0x1078, 0x45d6, 0x0078, 0x34af, 0xa186, 0x0028,
+       0x00c0, 0x34c7, 0x6018, 0xa005, 0x0040, 0x3491, 0x8001, 0x0040,
+       0x3491, 0x8001, 0x0040, 0x3491, 0x601e, 0x0078, 0x3491, 0x6820,
+       0xd084, 0x0040, 0x2a0c, 0xc084, 0x6822, 0x1078, 0x2b13, 0x705c,
+       0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004, 0x6802, 0xa005,
+       0x2d00, 0x00c0, 0x34c4, 0x6002, 0x6006, 0x0078, 0x2a0c, 0x017e,
+       0x81ff, 0x00c0, 0x3511, 0x7000, 0xa086, 0x0030, 0x0040, 0x3511,
+       0x71d4, 0xd1bc, 0x00c0, 0x3511, 0xd1b4, 0x00c0, 0x34f8, 0x7060,
+       0xa005, 0x00c0, 0x3511, 0x70a4, 0xa086, 0x0001, 0x0040, 0x3511,
+       0x7003, 0x0000, 0x047e, 0x057e, 0x077e, 0x067e, 0x0c7e, 0x0d7e,
+       0x1078, 0x2a35, 0x0d7f, 0x0c7f, 0x067f, 0x077f, 0x057f, 0x047f,
+       0x71d4, 0xd1b4, 0x00c0, 0x3511, 0x7003, 0x0040, 0x0078, 0x3511,
+       0x1078, 0x43b0, 0x00c0, 0x3511, 0x781b, 0x005b, 0x0d7e, 0x70bc,
+       0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
+       0x78da, 0xc1b4, 0x71d6, 0x7003, 0x0030, 0x7808, 0xc08d, 0x780a,
+       0x0d7f, 0x1078, 0x3648, 0x017f, 0x81ff, 0x0040, 0x3563, 0xa684,
+       0xdf00, 0x681e, 0x682b, 0x0000, 0x6f14, 0xa186, 0x0002, 0x00c0,
+       0x3564, 0x6818, 0xa086, 0x0014, 0x00c0, 0x352d, 0x2008, 0xd6e4,
+       0x0040, 0x352d, 0x7868, 0xa08c, 0x00ff, 0x1078, 0x2b01, 0x1078,
+       0x2b22, 0x6820, 0xd0dc, 0x00c0, 0x3564, 0x8717, 0xa294, 0x000f,
+       0x8213, 0x8213, 0x8213, 0xb284, 0x0300, 0x0040, 0x3543, 0xa290,
+       0x53c0, 0x0078, 0x3545, 0xa290, 0x5440, 0xa290, 0x0000, 0x221c,
+       0xd3c4, 0x00c0, 0x354d, 0x0078, 0x3553, 0x8210, 0x2204, 0xa085,
+       0x0018, 0x2012, 0x8211, 0xd3d4, 0x0040, 0x355e, 0x68a0, 0xd0c4,
+       0x00c0, 0x355e, 0x1078, 0x36c2, 0x0078, 0x2a0c, 0x6008, 0xc08d,
+       0x600a, 0x0078, 0x3564, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0040,
+       0x356b, 0x7048, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x6410, 0x84ff,
+       0x0040, 0x3580, 0x2009, 0x4f02, 0x2104, 0x8001, 0x200a, 0x8421,
+       0x6412, 0x00c0, 0x3580, 0x2021, 0x4f04, 0x2404, 0xc0a5, 0x2022,
+       0x6018, 0xa005, 0x0040, 0x3588, 0x8001, 0x601a, 0x00c0, 0x358b,
+       0x6008, 0xc0a4, 0x600a, 0x6820, 0xd084, 0x00c0, 0x3597, 0x6800,
+       0xa005, 0x00c0, 0x3594, 0x6002, 0x6006, 0x0078, 0x359b, 0x705c,
+       0x2060, 0x6800, 0x6002, 0x2061, 0x4f00, 0x6887, 0x0103, 0x2d08,
+       0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0040, 0x35aa, 0x2d02,
+       0x0078, 0x35ab, 0x616e, 0x7200, 0xa286, 0x0030, 0x0040, 0x35bb,
+       0xa286, 0x0040, 0x00c0, 0x2a0c, 0x7003, 0x0002, 0x704c, 0x2068,
+       0x68c4, 0x2060, 0x007c, 0x7003, 0x0002, 0x70bc, 0xa06d, 0x68bc,
+       0x7042, 0x70b8, 0xa065, 0x68c0, 0x705a, 0x2d00, 0x704e, 0xad80,
+       0x0009, 0x7046, 0x007c, 0xa282, 0x0004, 0x0048, 0x35d1, 0x1078,
+       0x29b2, 0x2200, 0x0079, 0x35d4, 0x35d8, 0x35e9, 0x35f6, 0x35e9,
+       0xa586, 0x1300, 0x0040, 0x35e9, 0xa586, 0x8300, 0x00c0, 0x35cf,
+       0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084, 0xfbef,
+       0x600a, 0x7000, 0xa086, 0x0005, 0x0040, 0x35f3, 0x1078, 0x4118,
+       0x781b, 0x0078, 0x007c, 0x781b, 0x0079, 0x007c, 0x7890, 0x8007,
+       0x8001, 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c,
+       0x00ff, 0xa186, 0x0003, 0x0040, 0x360b, 0xa186, 0x0000, 0x0040,
+       0x360b, 0x0078, 0x4107, 0x781b, 0x0079, 0x007c, 0x6820, 0xc095,
+       0x6822, 0x82ff, 0x00c0, 0x3618, 0x1078, 0x4118, 0x0078, 0x361f,
+       0x8211, 0x0040, 0x361d, 0x1078, 0x29b2, 0x1078, 0x412b, 0x781b,
+       0x0078, 0x007c, 0x1078, 0x43d3, 0x7830, 0xa084, 0x00c0, 0x00c0,
+       0x3645, 0x017e, 0x3208, 0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec,
+       0x007f, 0x0040, 0x3637, 0xa18c, 0x0300, 0x0078, 0x3639, 0xa18c,
+       0x0400, 0x017f, 0x0040, 0x3640, 0x0018, 0x3645, 0x0078, 0x3642,
+       0x0028, 0x3645, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c,
+       0xa684, 0x0060, 0x00c0, 0x3652, 0x682f, 0x0000, 0x6833, 0x0000,
+       0x0078, 0x36c1, 0xd6dc, 0x00c0, 0x366a, 0x68b4, 0xd0dc, 0x00c0,
+       0x366a, 0x6998, 0x6a94, 0x692e, 0x6a32, 0x7048, 0xa005, 0x00c0,
+       0x3667, 0x2200, 0xa105, 0x0040, 0x45d6, 0x704b, 0x0015, 0x0078,
+       0x45d6, 0x007c, 0xd6ac, 0x0040, 0x3690, 0xd6f4, 0x0040, 0x3676,
+       0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x45d6, 0x68b4, 0xa084,
+       0x4000, 0xa635, 0xd6f4, 0x00c0, 0x3670, 0x7048, 0xa005, 0x00c0,
+       0x3683, 0x704b, 0x0015, 0xd6dc, 0x00c0, 0x368c, 0x68b4, 0xd0dc,
+       0x0040, 0x368c, 0x6ca8, 0x6da4, 0x6c2e, 0x6d32, 0x0078, 0x45d6,
+       0xd6f4, 0x0040, 0x3699, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078,
+       0x45d6, 0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4, 0x00c0, 0x3693,
+       0x7048, 0xa005, 0x00c0, 0x36a6, 0x704b, 0x0015, 0x2408, 0x2510,
+       0x2700, 0x80fb, 0x00c8, 0x36ad, 0x8000, 0xa084, 0x003f, 0xa108,
+       0xa291, 0x0000, 0x692e, 0x6a32, 0x2100, 0xa205, 0x00c0, 0x36ba,
+       0x0078, 0x45d6, 0x7000, 0xa086, 0x0006, 0x0040, 0x36c1, 0x0078,
+       0x45d6, 0x007c, 0x6946, 0x6008, 0xc0cd, 0xd3cc, 0x0040, 0x36c9,
+       0xc08d, 0x600a, 0x6818, 0x683a, 0x681b, 0x0006, 0x688f, 0x0000,
+       0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f, 0x0003,
+       0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b, 0x0020,
+       0x7000, 0x0079, 0x36e3, 0x2a0c, 0x36f5, 0x36ed, 0x36eb, 0x36eb,
+       0x36eb, 0x36eb, 0x36eb, 0x1078, 0x29b2, 0x6820, 0xd084, 0x00c0,
+       0x36f5, 0x1078, 0x3e19, 0x0078, 0x36fb, 0x705c, 0x2c50, 0x2060,
+       0x6800, 0x6002, 0x2a60, 0x3208, 0xa18c, 0x0300, 0x0040, 0x3704,
+       0x2021, 0x4f58, 0x0078, 0x3706, 0x2021, 0x4f98, 0x2404, 0xa005,
+       0x0040, 0x370d, 0x2020, 0x0078, 0x3706, 0x2d22, 0x206b, 0x0000,
+       0x007c, 0x1078, 0x3e20, 0x1078, 0x3e36, 0x6008, 0xc0cc, 0x600a,
+       0x682b, 0x0000, 0x789b, 0x000e, 0x6f14, 0x6938, 0x691a, 0x6944,
+       0x6916, 0x3208, 0xa18c, 0x0300, 0x0040, 0x372a, 0x2009, 0x0000,
+       0x0078, 0x372c, 0x2009, 0x0001, 0x1078, 0x4a81, 0xd6dc, 0x0040,
+       0x3734, 0x691c, 0xc1ed, 0x691e, 0x6818, 0xd0fc, 0x0040, 0x3743,
+       0x7868, 0xa08c, 0x00ff, 0x0040, 0x3741, 0x681b, 0x001e, 0x0078,
+       0x3743, 0x681b, 0x0000, 0xb284, 0x0300, 0x00c0, 0x374b, 0x2021,
+       0x4f98, 0x0078, 0x374d, 0x2021, 0x4f58, 0x6800, 0x2022, 0x6a3c,
+       0x6940, 0x6a32, 0x692e, 0x68c0, 0x2060, 0x6000, 0xd0a4, 0x0040,
+       0x378d, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x0d7e,
+       0x0f7e, 0x157e, 0x147e, 0x2079, 0x4f00, 0x1078, 0x1e46, 0x147f,
+       0x157f, 0x0f7f, 0x70cc, 0x2010, 0x2009, 0x0101, 0x027e, 0x2204,
+       0xa06d, 0x0040, 0x377d, 0x6814, 0xa706, 0x0040, 0x377a, 0x6800,
+       0x0078, 0x3770, 0x6820, 0xc0d5, 0x6822, 0x027f, 0x8210, 0x8109,
+       0x00c0, 0x376e, 0x0d7f, 0x7067, 0x0003, 0x707f, 0x0000, 0x7776,
+       0x7083, 0x000f, 0x71d4, 0xc1dc, 0x71d6, 0x6818, 0xa086, 0x0002,
+       0x00c0, 0x3799, 0x6817, 0x0000, 0x682b, 0x0000, 0x681c, 0xc0ec,
+       0x681e, 0x1078, 0x2073, 0x0078, 0x2a0c, 0x7cd8, 0x7ddc, 0x7fd0,
+       0x1078, 0x3648, 0x682b, 0x0000, 0x789b, 0x000e, 0x6f14, 0x1078,
+       0x43d7, 0xa08c, 0x00ff, 0x6916, 0x6818, 0xd0fc, 0x0040, 0x37b2,
+       0x7048, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x7067, 0x0000, 0x0078,
+       0x2a0c, 0x7000, 0xa005, 0x00c0, 0x37bf, 0x0078, 0x2a0c, 0xa006,
+       0x1078, 0x45d6, 0x6920, 0xd1ac, 0x00c0, 0x37c8, 0x681b, 0x0014,
+       0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff,
+       0x6822, 0x7000, 0x0079, 0x37d4, 0x2a0c, 0x37de, 0x37de, 0x37e1,
+       0x37e1, 0x37e1, 0x37dc, 0x37dc, 0x1078, 0x29b2, 0x6818, 0x0078,
+       0x3443, 0x6008, 0xc0a4, 0x600a, 0x6817, 0x0000, 0x0078, 0x3dde,
+       0x2300, 0x0079, 0x37eb, 0x37ee, 0x37f0, 0x3860, 0x1078, 0x29b2,
+       0xd6fc, 0x00c0, 0x3847, 0x7000, 0xa00d, 0x0079, 0x37f7, 0x2a0c,
+       0x3801, 0x3801, 0x3831, 0x3801, 0x3844, 0x37ff, 0x37ff, 0x1078,
+       0x29b2, 0xa684, 0x0060, 0x0040, 0x3831, 0xa086, 0x0060, 0x00c0,
+       0x382e, 0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a, 0x6eb6, 0x681c, 0xc0ac,
+       0x681e, 0xa186, 0x0002, 0x0040, 0x3820, 0x1078, 0x45d6, 0x69ac,
+       0x68b0, 0xa115, 0x0040, 0x3820, 0x1078, 0x4977, 0x0078, 0x3822,
+       0x1078, 0x493f, 0x781b, 0x0079, 0x71d4, 0xd1b4, 0x00c0, 0x2a08,
+       0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a52, 0x007c, 0xd6ec, 0x0040,
+       0x380b, 0x6818, 0xd0fc, 0x0040, 0x3844, 0xd6f4, 0x00c0, 0x383e,
+       0x681b, 0x0015, 0x781b, 0x0079, 0x0078, 0x2a08, 0x681b, 0x0007,
+       0x682f, 0x0000, 0x6833, 0x0000, 0x1078, 0x4369, 0x007c, 0xc6fc,
+       0x7e5a, 0x7adc, 0x79d8, 0x78d0, 0x801b, 0x00c8, 0x3850, 0x8000,
+       0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302,
+       0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x781b, 0x0079, 0x007c,
+       0x1078, 0x29b2, 0x2300, 0x0079, 0x3865, 0x386a, 0x388f, 0x38ef,
+       0x1078, 0x29b2, 0x7000, 0x0079, 0x386d, 0x3875, 0x3877, 0x3880,
+       0x3875, 0x3875, 0x3875, 0x3875, 0x3875, 0x1078, 0x29b2, 0x69ac,
+       0x68b0, 0xa115, 0x0040, 0x3880, 0x1078, 0x4977, 0x0078, 0x3882,
+       0x1078, 0x493f, 0x681c, 0xc0b4, 0x681e, 0x70d4, 0xd0b4, 0x00c0,
+       0x2a08, 0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a52, 0x007c, 0xd6fc,
+       0x00c0, 0x38df, 0x7000, 0xa00d, 0x0079, 0x3896, 0x2a0c, 0x38a6,
+       0x38a0, 0x38d6, 0x38a6, 0x38dc, 0x389e, 0x389e, 0x1078, 0x29b2,
+       0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060,
+       0x0040, 0x38d6, 0xa086, 0x0060, 0x00c0, 0x38d3, 0xa6b4, 0xbfbf,
+       0xc6ed, 0x7e5a, 0x6eb6, 0xa186, 0x0002, 0x0040, 0x38c2, 0x1078,
+       0x45d6, 0x69ac, 0x68b0, 0xa115, 0x0040, 0x38c2, 0x1078, 0x4977,
+       0x0078, 0x38c4, 0x1078, 0x493f, 0x781b, 0x0079, 0x681c, 0xc0b4,
+       0x681e, 0x71d4, 0xd1b4, 0x00c0, 0x2a08, 0x70a4, 0xa086, 0x0001,
+       0x00c0, 0x2a52, 0x007c, 0xd6ec, 0x0040, 0x38b0, 0x6818, 0xd0fc,
+       0x0040, 0x38dc, 0x681b, 0x0007, 0x781b, 0x00f9, 0x007c, 0xc6fc,
+       0x7e5a, 0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94,
+       0x2200, 0xa303, 0x68ae, 0x79d2, 0x781b, 0x0079, 0x007c, 0xd6dc,
+       0x0040, 0x38f8, 0x782b, 0x3009, 0x781b, 0x0079, 0x0078, 0x2a08,
+       0x7884, 0xc0ac, 0x7886, 0x78e4, 0xa084, 0x0008, 0x00c0, 0x390b,
+       0xa484, 0x0200, 0x0040, 0x3905, 0xc6f5, 0xc6dd, 0x7e5a, 0x781b,
+       0x0079, 0x0078, 0x2a08, 0x6820, 0xc095, 0x6822, 0x1078, 0x42e2,
+       0xc6dd, 0x1078, 0x4118, 0x781b, 0x0078, 0x0078, 0x2a08, 0x2300,
+       0x0079, 0x391a, 0x391d, 0x391f, 0x3921, 0x1078, 0x29b2, 0x0078,
+       0x4111, 0xd6d4, 0x00c0, 0x395c, 0x79e4, 0xd1ac, 0x0040, 0x392f,
+       0x78ec, 0xa084, 0x0003, 0x0040, 0x392f, 0x782b, 0x3009, 0x789b,
+       0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4, 0xd1ac,
+       0x0040, 0x393f, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x3958, 0x2001,
+       0x4f04, 0x2004, 0xd0e4, 0x00c0, 0x3954, 0x6820, 0xd0c4, 0x0040,
+       0x3954, 0x0c7e, 0x7058, 0x2060, 0x6004, 0xc09d, 0x6006, 0x6008,
+       0xa084, 0x00ff, 0x600a, 0x0c7f, 0x2001, 0x0014, 0x0078, 0x3443,
+       0xa184, 0x0007, 0x0079, 0x3992, 0x7a90, 0xa294, 0x0007, 0x789b,
+       0x0060, 0x79a8, 0x81ff, 0x0040, 0x3990, 0x789b, 0x0010, 0x7ba8,
+       0xa384, 0x0001, 0x00c0, 0x3983, 0x7ba8, 0x7ba8, 0xa386, 0x0001,
+       0x00c0, 0x3976, 0x2009, 0xfff7, 0x0078, 0x397c, 0xa386, 0x0003,
+       0x00c0, 0x3983, 0x2009, 0xffef, 0x0c7e, 0x7058, 0x2060, 0x6004,
+       0xa104, 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684,
+       0xfffb, 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xfcff, 0x6922,
+       0x0078, 0x435d, 0x30d9, 0x30e3, 0x399c, 0x39a2, 0x399a, 0x399a,
+       0x435d, 0x435d, 0x1078, 0x29b2, 0x6920, 0xa18c, 0xfcff, 0x6922,
+       0x0078, 0x4363, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078, 0x435d,
+       0x79e4, 0xa184, 0x0030, 0x0040, 0x39b2, 0x78ec, 0xa084, 0x0003,
+       0x00c0, 0x39e6, 0x7000, 0xa086, 0x0004, 0x00c0, 0x39cc, 0x7064,
+       0xa086, 0x0002, 0x00c0, 0x39c2, 0x2011, 0x0002, 0x2019, 0x0000,
+       0x0078, 0x2f65, 0x7064, 0xa086, 0x0006, 0x0040, 0x39bc, 0x7064,
+       0xa086, 0x0004, 0x0040, 0x39bc, 0x7000, 0xa086, 0x0000, 0x0040,
+       0x2a08, 0x6920, 0xa184, 0x0420, 0x0040, 0x39db, 0xc1d4, 0x6922,
+       0x6818, 0x0078, 0x3443, 0x6818, 0xa08e, 0x0002, 0x0040, 0x39e4,
+       0xc0fd, 0x681a, 0x2001, 0x0014, 0x0078, 0x3443, 0xa184, 0x0007,
+       0x0079, 0x39ea, 0x435d, 0x435d, 0x39f2, 0x435d, 0x43a5, 0x43a5,
+       0x435d, 0x435d, 0xd6bc, 0x0040, 0x3a34, 0x7184, 0x81ff, 0x0040,
+       0x3a34, 0xa182, 0x000d, 0x00d0, 0x3a01, 0x7087, 0x0000, 0x0078,
+       0x3a06, 0xa182, 0x000c, 0x7086, 0x2009, 0x000c, 0x789b, 0x0061,
+       0x79aa, 0x157e, 0x137e, 0x147e, 0x7088, 0x8114, 0xa210, 0x728a,
+       0xa080, 0x000b, 0xad00, 0x2098, 0xb284, 0x0300, 0x0040, 0x3a28,
+       0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x3a24,
+       0x20a1, 0x012b, 0x0078, 0x3a2a, 0x20a1, 0x022b, 0x0078, 0x3a2a,
+       0x20a1, 0x012b, 0x789b, 0x0000, 0x8108, 0x81ac, 0x53a6, 0x147f,
+       0x137f, 0x157f, 0x0078, 0x4363, 0xd6d4, 0x00c0, 0x3a88, 0x6820,
+       0xd084, 0x0040, 0x4363, 0xa68c, 0x0060, 0xa684, 0x0060, 0x0040,
+       0x3a46, 0xa086, 0x0060, 0x00c0, 0x3a46, 0xc1f5, 0xc194, 0x795a,
+       0x69b6, 0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6818,
+       0xc0fd, 0x681a, 0x78aa, 0x8008, 0x810c, 0x0040, 0x3e4f, 0xa18c,
+       0x00f8, 0x00c0, 0x3e4f, 0x157e, 0x137e, 0x147e, 0x017e, 0x3208,
+       0xa18c, 0x0300, 0x0040, 0x3a74, 0x007e, 0x2001, 0x4f04, 0x2004,
+       0xd0ec, 0x007f, 0x0040, 0x3a70, 0x20a1, 0x012b, 0x0078, 0x3a76,
+       0x20a1, 0x022b, 0x0078, 0x3a76, 0x20a1, 0x012b, 0x017f, 0x789b,
+       0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f,
+       0x137f, 0x157f, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x0078, 0x4363,
+       0x6818, 0xd0fc, 0x0040, 0x3a8e, 0x681b, 0x0008, 0x6820, 0xc0ad,
+       0x6822, 0x1078, 0x4120, 0x781b, 0x00ea, 0x007c, 0x2300, 0x0079,
+       0x3a99, 0x3a9e, 0x3b76, 0x3a9c, 0x1078, 0x29b2, 0x7cd8, 0x7ddc,
+       0x7fd0, 0x82ff, 0x00c0, 0x3ac7, 0x7200, 0xa286, 0x0003, 0x0040,
+       0x3410, 0x71d4, 0xd1bc, 0x00c0, 0x3aca, 0xd1b4, 0x0040, 0x3aca,
+       0x0d7e, 0x783b, 0x8800, 0x781b, 0x004c, 0x70bc, 0xa06d, 0x68b4,
+       0xc0a5, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da,
+       0xc1b4, 0x71d6, 0x7003, 0x0030, 0x0d7f, 0x0078, 0x3ace, 0x7200,
+       0x0078, 0x3ace, 0x783b, 0x1800, 0x781b, 0x004a, 0xa284, 0x000f,
+       0x0079, 0x3ad2, 0x3b61, 0x3b10, 0x3adc, 0x343f, 0x3ada, 0x3b61,
+       0x3ada, 0x3ada, 0x1078, 0x29b2, 0x681c, 0xd0ec, 0x0040, 0x3ae3,
+       0x6008, 0xc08d, 0x600a, 0x6920, 0xc185, 0x6922, 0x6800, 0x6006,
+       0xa005, 0x00c0, 0x3aec, 0x6002, 0x6008, 0xc0d4, 0x600a, 0x681c,
+       0xa084, 0x000e, 0x00c0, 0x3b00, 0xb284, 0x0300, 0x0040, 0x3afc,
+       0x2009, 0x95c0, 0x0078, 0x3b05, 0x2009, 0x96d0, 0x0078, 0x3b05,
+       0x7030, 0x68ba, 0x7140, 0x70cc, 0xa108, 0x2104, 0x6802, 0x2d0a,
+       0x715e, 0xd6dc, 0x00c0, 0x3b10, 0xc6fc, 0x6eb6, 0x0078, 0x3b61,
+       0x6eb6, 0xa684, 0x0060, 0x00c0, 0x3b1a, 0xa684, 0x7fff, 0x68b6,
+       0x0078, 0x3b61, 0xd6dc, 0x00c0, 0x3b28, 0xa684, 0x7fff, 0x68b6,
+       0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078, 0x45d6, 0x0078, 0x3b61,
+       0xd6ac, 0x0040, 0x3b34, 0xa006, 0x1078, 0x45d6, 0x2408, 0x2510,
+       0x69aa, 0x6aa6, 0x0078, 0x3b44, 0x2408, 0x2510, 0x2700, 0x801b,
+       0x00c8, 0x3b3b, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
+       0x69aa, 0x6aa6, 0x1078, 0x45d6, 0xd6fc, 0x0040, 0x3b61, 0xa684,
+       0x7fff, 0x68b6, 0x2510, 0x2408, 0xd6ac, 0x00c0, 0x3b59, 0x2700,
+       0x801b, 0x00c8, 0x3b54, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291,
+       0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303,
+       0x68ae, 0x7000, 0xa086, 0x0030, 0x00c0, 0x2a0c, 0x7003, 0x0002,
+       0x70bc, 0xa06d, 0x68bc, 0x7042, 0x70b8, 0xa065, 0x68c0, 0x705a,
+       0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x007c, 0xa586, 0x8800,
+       0x00c0, 0x3b83, 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008,
+       0xa084, 0xfbef, 0x600a, 0x0078, 0x4111, 0x7047, 0x0000, 0xa282,
+       0x0006, 0x0050, 0x3b8d, 0x1078, 0x29b2, 0x2300, 0x0079, 0x3b90,
+       0x3b93, 0x3ba5, 0x3bb1, 0x2200, 0x0079, 0x3b96, 0x3b9c, 0x4111,
+       0x3b9e, 0x3b9c, 0x3beb, 0x3c40, 0x1078, 0x29b2, 0x7a80, 0xa294,
+       0x0f00, 0x1078, 0x3cca, 0x0078, 0x4107, 0x1078, 0x3bc2, 0x0079,
+       0x3ba9, 0x4111, 0x3baf, 0x3baf, 0x3beb, 0x3baf, 0x4111, 0x1078,
+       0x29b2, 0x1078, 0x3bc2, 0x0079, 0x3bb5, 0x3bbd, 0x3bbb, 0x3bbb,
+       0x3bbd, 0x3bbb, 0x3bbd, 0x1078, 0x29b2, 0x1078, 0x412b, 0x781b,
+       0x0078, 0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3bd3, 0x1078,
+       0x3e36, 0x0078, 0x3bcd, 0x1078, 0x45d6, 0x6008, 0xa084, 0xfbef,
+       0x600a, 0x0078, 0x3bd8, 0x7000, 0xa086, 0x0003, 0x0040, 0x3bcb,
+       0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3be2, 0x2001, 0x96e0,
+       0x0078, 0x3be4, 0x2001, 0x9712, 0x2068, 0x704e, 0xad80, 0x0009,
+       0x7046, 0x2200, 0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3bfd,
+       0x70d4, 0xc0b5, 0x70d6, 0x2c00, 0x70ba, 0x2d00, 0x70be, 0x0078,
+       0x3c02, 0x1078, 0x45d6, 0x0078, 0x3c02, 0x7000, 0xa086, 0x0003,
+       0x0040, 0x3bf9, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b,
+       0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x95c0, 0xb284,
+       0x0300, 0x00c0, 0x3c16, 0xc2fd, 0x2069, 0x96d0, 0x2d04, 0x2d08,
+       0x715e, 0xa06d, 0x0040, 0x3c23, 0x6814, 0xa206, 0x0040, 0x3c25,
+       0x6800, 0x0078, 0x3c17, 0x1078, 0x3cca, 0x6eb4, 0x7e5a, 0x6920,
+       0xa184, 0x0c00, 0x0040, 0x3cf4, 0x7064, 0xa086, 0x0006, 0x00c0,
+       0x3c37, 0x7074, 0xa206, 0x00c0, 0x3c37, 0x7066, 0x707e, 0x681b,
+       0x0005, 0xc1ad, 0xc1d4, 0x6922, 0x1078, 0x4120, 0x0078, 0x3cf4,
+       0x7200, 0xa286, 0x0002, 0x00c0, 0x3c52, 0x70d4, 0xc0b5, 0x70d6,
+       0x2c00, 0x70ba, 0x2d00, 0x70be, 0x0078, 0x3c56, 0x1078, 0x45d6,
+       0x0078, 0x3c56, 0xa286, 0x0003, 0x0040, 0x3c4e, 0x7003, 0x0001,
+       0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f,
+       0xa215, 0xb284, 0x0300, 0x00c0, 0x3c66, 0xc2fd, 0x79a8, 0x79a8,
+       0xa18c, 0x00ff, 0x2118, 0x70cc, 0xa168, 0x2d04, 0x2d08, 0x715e,
+       0xa06d, 0x0040, 0x3c7a, 0x6814, 0xa206, 0x0040, 0x3ca3, 0x6800,
+       0x0078, 0x3c6e, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3c84,
+       0x2001, 0x96e0, 0x0078, 0x3c86, 0x2001, 0x9712, 0x2068, 0x704e,
+       0x157e, 0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3c8b,
+       0x157f, 0xb284, 0x0300, 0x0040, 0x3c98, 0xc2fc, 0x0078, 0x3c99,
+       0xc2fd, 0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823,
+       0x0800, 0x6827, 0x0003, 0x6eb4, 0x6920, 0xa184, 0x0c00, 0x0040,
+       0x3cf4, 0xd0dc, 0x0040, 0x3cbf, 0x7064, 0xa086, 0x0004, 0x00c0,
+       0x3cbb, 0x7074, 0xa206, 0x00c0, 0x3cbb, 0x7078, 0xa306, 0x00c0,
+       0x3cbb, 0x7066, 0x707e, 0x1078, 0x4127, 0x0078, 0x3cf4, 0x681b,
+       0x0005, 0xc1ad, 0xc1d4, 0x6922, 0x1078, 0x4120, 0x707f, 0x0000,
+       0x0078, 0x3cf4, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3cd4,
+       0x2001, 0x96e0, 0x0078, 0x3cd6, 0x2001, 0x9712, 0x2068, 0x704e,
+       0x157e, 0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3cdb,
+       0x157f, 0xb284, 0x0300, 0x0040, 0x3ce8, 0xc2fc, 0x0078, 0x3ce9,
+       0xc2fd, 0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823,
+       0x0800, 0x6827, 0x0003, 0x007c, 0xc6ec, 0xa6ac, 0x0060, 0x0040,
+       0x3d46, 0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x00c0, 0x3d21,
+       0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa586, 0x0060, 0x0040, 0x3d4b,
+       0xd6f4, 0x00c0, 0x3d0c, 0xc6ed, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009,
+       0x0079, 0xd69c, 0x0040, 0x3d19, 0x2009, 0x0078, 0x2019, 0x0000,
+       0x2320, 0x791a, 0xd6ec, 0x0040, 0x3d56, 0x1078, 0x493f, 0x0078,
+       0x3d56, 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x0040,
+       0x3d4d, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0, 0xd6f4, 0x00c0,
+       0x3d32, 0xc6ed, 0xc6f4, 0x7e5a, 0x2011, 0x0079, 0xd69c, 0x0040,
+       0x3d3e, 0x2011, 0x0078, 0x2019, 0x0000, 0x2320, 0x7a1a, 0xd6ec,
+       0x0040, 0x3d56, 0x1078, 0x4977, 0x0078, 0x3d56, 0x2019, 0x0000,
+       0x2320, 0x0078, 0x3d4d, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0079,
+       0xd69c, 0x0040, 0x3d55, 0x2009, 0x0078, 0x791a, 0x68c0, 0x705a,
+       0x2d00, 0x704e, 0x68c4, 0x2060, 0x71d4, 0x2001, 0x4f01, 0x2004,
+       0xd0c4, 0x00c0, 0x3dab, 0x70d8, 0xa02d, 0x0040, 0x3d84, 0xd1bc,
+       0x0040, 0x3d9e, 0x7a80, 0xa294, 0x0f00, 0x70dc, 0xa206, 0x0040,
+       0x3d75, 0x78e0, 0xa504, 0x00c0, 0x3dab, 0x70da, 0xc1bc, 0x71d6,
+       0x0078, 0x3dab, 0x2031, 0x0001, 0x852c, 0x0048, 0x3d83, 0x8633,
+       0x8210, 0x0078, 0x3d7c, 0x007c, 0x7de0, 0xa594, 0xff00, 0x0040,
+       0x3d91, 0x2011, 0x0008, 0x852f, 0x1078, 0x3d7a, 0x8637, 0x0078,
+       0x3d93, 0x1078, 0x3d7a, 0x8217, 0x7880, 0xa084, 0x0f00, 0xa206,
+       0x0040, 0x3dab, 0x72de, 0x76da, 0x0078, 0x3dab, 0x7a80, 0xa294,
+       0x0f00, 0x70dc, 0xa236, 0x0040, 0x3d9b, 0x78e0, 0xa534, 0x0040,
+       0x3d9b, 0xc1bd, 0x71d6, 0xd1b4, 0x00c0, 0x2a08, 0x2300, 0xa405,
+       0x0040, 0x2a08, 0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a52, 0x007c,
+       0x6020, 0xa005, 0x0040, 0x3dc6, 0x8001, 0x6022, 0x6008, 0xa085,
+       0x0008, 0x600a, 0x700f, 0x0100, 0x702c, 0x6026, 0x007c, 0xa006,
+       0x1078, 0x45d6, 0x7000, 0xa086, 0x0002, 0x0040, 0x3dd4, 0x7064,
+       0xa086, 0x0005, 0x00c0, 0x3dde, 0x682b, 0x0000, 0x6817, 0x0000,
+       0x681b, 0x0001, 0x6823, 0x0040, 0x681f, 0x0100, 0x7000, 0xa084,
+       0x000f, 0x0079, 0x3de3, 0x2a0c, 0x3df3, 0x3ded, 0x3e15, 0x3dfd,
+       0x2a0c, 0x3deb, 0x3deb, 0x1078, 0x29b2, 0x1078, 0x3e20, 0x1078,
+       0x3e19, 0x0078, 0x3df9, 0x1078, 0x3e20, 0x705c, 0x2060, 0x6800,
+       0x6002, 0x1078, 0x2073, 0x0078, 0x2a0c, 0x7064, 0x7067, 0x0000,
+       0x7083, 0x0000, 0x0079, 0x3e04, 0x3e11, 0x3e11, 0x3e0c, 0x3e0c,
+       0x3e0c, 0x3e11, 0x3e0c, 0x3e11, 0x77d4, 0xc7dd, 0x77d6, 0x0079,
+       0x2f7e, 0x7067, 0x0000, 0x0078, 0x2a0c, 0x681b, 0x0000, 0x0078,
+       0x3711, 0x6800, 0xa005, 0x00c0, 0x3e1e, 0x6002, 0x6006, 0x007c,
+       0x6410, 0x84ff, 0x0040, 0x3e32, 0x2009, 0x4f02, 0x2104, 0x8001,
+       0x200a, 0x8421, 0x6412, 0x00c0, 0x3e32, 0x2021, 0x4f04, 0x2404,
+       0xc0a5, 0x2022, 0x6008, 0xc0a4, 0x600a, 0x007c, 0x6018, 0xa005,
+       0x0040, 0x3e3c, 0x8001, 0x601a, 0x007c, 0x1078, 0x43d3, 0x681b,
+       0x0018, 0x0078, 0x3e7d, 0x1078, 0x43d3, 0x681b, 0x0019, 0x0078,
+       0x3e7d, 0x1078, 0x43d3, 0x681b, 0x001a, 0x0078, 0x3e7d, 0x1078,
+       0x43d3, 0x681b, 0x0003, 0x0078, 0x3e7d, 0x7774, 0x1078, 0x424e,
+       0x7178, 0xa18c, 0x00ff, 0x3210, 0xa294, 0x0300, 0x0040, 0x3e64,
+       0xa1e8, 0x94c0, 0x0078, 0x3e66, 0xa1e8, 0x95d0, 0x2d04, 0x2d08,
+       0x2068, 0xa005, 0x00c0, 0x3e6f, 0x707e, 0x0078, 0x2a0c, 0x6814,
+       0x7274, 0xa206, 0x0040, 0x3e77, 0x6800, 0x0078, 0x3e67, 0x6800,
+       0x200a, 0x681b, 0x0005, 0x707f, 0x0000, 0x1078, 0x3e20, 0x6820,
+       0xd084, 0x00c0, 0x3e85, 0x1078, 0x3e19, 0x1078, 0x3e36, 0x681f,
+       0x0000, 0x6823, 0x0020, 0x1078, 0x2073, 0x0078, 0x2a0c, 0xa282,
+       0x0003, 0x00c0, 0x4107, 0x7da8, 0xa5ac, 0x00ff, 0x7e5a, 0x7ea8,
+       0xa6b4, 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1c4, 0x0040, 0x3eea,
+       0xc1c4, 0x6922, 0xa6b4, 0x00ff, 0x0040, 0x3ed7, 0xa682, 0x000c,
+       0x0048, 0x3eae, 0x0040, 0x3eae, 0x2031, 0x000c, 0x2500, 0xa086,
+       0x000a, 0x0040, 0x3eb5, 0x852b, 0x852b, 0x1078, 0x41e0, 0x0040,
+       0x3ebd, 0x1078, 0x3fbc, 0x0078, 0x3ee0, 0x1078, 0x419b, 0x0c7e,
+       0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3ff2, 0x0c7f,
+       0x6920, 0xc1c5, 0x6922, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0,
+       0x3ed4, 0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x0c7e,
+       0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3ff2, 0x0c7f,
+       0x7e58, 0xd6d4, 0x00c0, 0x3ee7, 0x781b, 0x0067, 0x007c, 0x781b,
+       0x0079, 0x007c, 0x0c7e, 0x7058, 0x2060, 0x6100, 0xd1e4, 0x0040,
+       0x3f33, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c, 0x0048,
+       0x3efd, 0x0040, 0x3efd, 0x2011, 0x000c, 0x2600, 0xa202, 0x00c8,
+       0x3f02, 0x2230, 0x6208, 0xa294, 0x00ff, 0x2001, 0x4f05, 0x2004,
+       0xd0e4, 0x00c0, 0x3f17, 0x78ec, 0xd0e4, 0x0040, 0x3f17, 0xa282,
+       0x000a, 0x00c8, 0x3f1d, 0x2011, 0x000a, 0x0078, 0x3f1d, 0xa282,
+       0x000c, 0x00c8, 0x3f1d, 0x2011, 0x000c, 0x2200, 0xa502, 0x00c8,
+       0x3f22, 0x2228, 0x1078, 0x419f, 0x2500, 0xa086, 0x000a, 0x0040,
+       0x3f2b, 0x852b, 0x852b, 0x1078, 0x41e0, 0x0040, 0x3f33, 0x1078,
+       0x3fbc, 0x0078, 0x3f37, 0x1078, 0x419b, 0x1078, 0x3ff2, 0x7858,
+       0xc095, 0x785a, 0x0c7f, 0x781b, 0x0078, 0x007c, 0x0c7e, 0x2960,
+       0x6000, 0xd0e4, 0x00c0, 0x3f58, 0xd0b4, 0x00c0, 0x3f52, 0x6010,
+       0xa084, 0x000f, 0x00c0, 0x3f52, 0x6104, 0xa18c, 0xfff5, 0x6106,
+       0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, 0x3f83,
+       0x68a0, 0xd0cc, 0x00c0, 0x3f52, 0x6208, 0xa294, 0x00ff, 0x2001,
+       0x4f05, 0x2004, 0xd0e4, 0x00c0, 0x3f71, 0x78ec, 0xd0e4, 0x0040,
+       0x3f71, 0xa282, 0x000b, 0x00c8, 0x3f71, 0x2011, 0x000a, 0x0078,
+       0x3f77, 0xa282, 0x000c, 0x00c8, 0x3f77, 0x2011, 0x000c, 0x6308,
+       0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c, 0x0048, 0x3f83, 0x0040,
+       0x3f83, 0x2019, 0x000c, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
+       0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822,
+       0x70d4, 0xd0b4, 0x0040, 0x3f9f, 0xc0b4, 0x70d6, 0x70b8, 0xa065,
+       0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f,
+       0x007c, 0x0c7e, 0x2960, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x2011,
+       0x0032, 0x2019, 0x0000, 0x0078, 0x3fad, 0x78ab, 0x0001, 0x78ab,
+       0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820,
+       0xc0c5, 0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x7158, 0x2160, 0x2018,
+       0xa08c, 0x0020, 0x0040, 0x3fc5, 0xc0ac, 0x2008, 0xa084, 0xfff0,
+       0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4, 0xa084,
+       0xfff0, 0xa18c, 0x000f, 0xa105, 0xc0f4, 0xa39c, 0x0020, 0x0040,
+       0x3fdb, 0xa085, 0x4000, 0xc0fc, 0xd0b4, 0x00c0, 0x3fe0, 0xc0fd,
+       0x78a6, 0x6016, 0x788a, 0xa6b4, 0x000f, 0x8637, 0x8204, 0x8004,
+       0xa084, 0x00ff, 0xa605, 0x600e, 0x6004, 0xa084, 0xfff5, 0x6006,
+       0x0c7f, 0x007c, 0x0c7e, 0x7058, 0x2060, 0x6018, 0x789a, 0x78a4,
+       0xa084, 0xfff0, 0x78a6, 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886,
+       0x600c, 0xa084, 0x00ff, 0x600e, 0x0c7f, 0x007c, 0xa282, 0x0002,
+       0x00c0, 0x4107, 0x7aa8, 0x6920, 0xc1bd, 0x6922, 0xd1cc, 0x0040,
+       0x4041, 0xc1cc, 0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8,
+       0x4107, 0x1078, 0x4094, 0x1078, 0x3ff2, 0xa980, 0x0001, 0x200c,
+       0x1078, 0x424a, 0x1078, 0x3f3e, 0x88ff, 0x0040, 0x4037, 0x789b,
+       0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0,
+       0x4034, 0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7e58,
+       0xd6d4, 0x00c0, 0x403e, 0x781b, 0x0067, 0x007c, 0x781b, 0x0079,
+       0x007c, 0xa282, 0x0002, 0x00c8, 0x4049, 0xa284, 0x0001, 0x0040,
+       0x4052, 0x7158, 0xa188, 0x0000, 0x210c, 0xd1ec, 0x00c0, 0x4052,
+       0x2011, 0x0000, 0x1078, 0x417c, 0x1078, 0x4094, 0x1078, 0x3ff2,
+       0x7858, 0xc095, 0x785a, 0x781b, 0x0078, 0x007c, 0x0c7e, 0x027e,
+       0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec, 0x00c0, 0x4075, 0xd0bc,
+       0x00c0, 0x4073, 0x6014, 0xd0b4, 0x00c0, 0x4073, 0xc1a4, 0x6106,
+       0xa006, 0x0078, 0x4091, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab,
        0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x70d4, 0xd0b4,
-       0x0040, 0x403d, 0xc0b4, 0x70d6, 0x70b8, 0xa065, 0x6008, 0xa084,
+       0x0040, 0x408d, 0xc0b4, 0x70d6, 0x70b8, 0xa065, 0x6008, 0xa084,
        0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x6820, 0xa085, 0x0200,
        0x6822, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7058, 0x2060, 0x82ff,
-       0x0040, 0x404c, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a,
-       0x78a4, 0xa084, 0xffbf, 0xa205, 0xc0fc, 0xd0b4, 0x00c0, 0x4059,
+       0x0040, 0x409c, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a,
+       0x78a4, 0xa084, 0xffbf, 0xa205, 0xc0fc, 0xd0b4, 0x00c0, 0x40a9,
        0xc0fd, 0x78a6, 0x6016, 0x788a, 0x6004, 0xc0a4, 0x6006, 0x0c7f,
-       0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040, 0x406a, 0x007f,
-       0x0078, 0x406d, 0x007f, 0x0078, 0x40b4, 0xd6ac, 0x0040, 0x40b4,
-       0x7888, 0xa084, 0x0040, 0x0040, 0x40b4, 0x7bb8, 0xa384, 0x003f,
-       0x831b, 0x00c8, 0x407c, 0x8000, 0xa005, 0x0040, 0x4091, 0x831b,
-       0x00c8, 0x4085, 0x8001, 0x0040, 0x40b1, 0xd6f4, 0x0040, 0x4091,
-       0x78b8, 0x801b, 0x00c8, 0x408d, 0x8000, 0xa084, 0x003f, 0x00c0,
-       0x40b1, 0xc6f4, 0x7e5a, 0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108,
-       0x00c8, 0x409c, 0xa291, 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade,
-       0x1078, 0x49c3, 0x781b, 0x0076, 0xb284, 0x0300, 0x0040, 0x40ac,
-       0x2001, 0x0000, 0x0078, 0x40ae, 0x2001, 0x0001, 0x1078, 0x484b,
+       0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040, 0x40ba, 0x007f,
+       0x0078, 0x40bd, 0x007f, 0x0078, 0x4104, 0xd6ac, 0x0040, 0x4104,
+       0x7888, 0xa084, 0x0040, 0x0040, 0x4104, 0x7bb8, 0xa384, 0x003f,
+       0x831b, 0x00c8, 0x40cc, 0x8000, 0xa005, 0x0040, 0x40e1, 0x831b,
+       0x00c8, 0x40d5, 0x8001, 0x0040, 0x4101, 0xd6f4, 0x0040, 0x40e1,
+       0x78b8, 0x801b, 0x00c8, 0x40dd, 0x8000, 0xa084, 0x003f, 0x00c0,
+       0x4101, 0xc6f4, 0x7e5a, 0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108,
+       0x00c8, 0x40ec, 0xa291, 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade,
+       0x1078, 0x4a44, 0x781b, 0x0076, 0xb284, 0x0300, 0x0040, 0x40fc,
+       0x2001, 0x0000, 0x0078, 0x40fe, 0x2001, 0x0001, 0x1078, 0x48ce,
        0x007c, 0x781b, 0x0076, 0x007c, 0x781b, 0x0079, 0x007c, 0x1078,
-       0x40df, 0x781b, 0x0078, 0x007c, 0x1078, 0x40c8, 0x781b, 0x0078,
-       0x007c, 0x6827, 0x0002, 0x1078, 0x40d0, 0x781b, 0x0078, 0x007c,
-       0x2001, 0x0005, 0x0078, 0x40e1, 0x2001, 0x000c, 0x0078, 0x40e1,
-       0x6820, 0xc0d5, 0x6822, 0x2001, 0x0006, 0x0078, 0x40e1, 0x2001,
-       0x000d, 0x0078, 0x40e1, 0x2001, 0x0009, 0x0078, 0x40e1, 0x2001,
+       0x412f, 0x781b, 0x0078, 0x007c, 0x1078, 0x4118, 0x781b, 0x0078,
+       0x007c, 0x6827, 0x0002, 0x1078, 0x4120, 0x781b, 0x0078, 0x007c,
+       0x2001, 0x0005, 0x0078, 0x4131, 0x2001, 0x000c, 0x0078, 0x4131,
+       0x6820, 0xc0d5, 0x6822, 0x2001, 0x0006, 0x0078, 0x4131, 0x2001,
+       0x000d, 0x0078, 0x4131, 0x2001, 0x0009, 0x0078, 0x4131, 0x2001,
        0x0007, 0x789b, 0x007e, 0x78aa, 0xc69d, 0x7e5a, 0x70d4, 0xd0b4,
-       0x0040, 0x40f7, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008,
+       0x0040, 0x4147, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008,
        0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x007c,
        0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0x017e,
-       0xb28c, 0x0300, 0x0040, 0x4108, 0xa0e0, 0x52c0, 0x0078, 0x410a,
-       0xa0e0, 0x5340, 0x017f, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184,
-       0x000f, 0x0040, 0x411a, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004,
+       0xb28c, 0x0300, 0x0040, 0x4158, 0xa0e0, 0x53c0, 0x0078, 0x415a,
+       0xa0e0, 0x5440, 0x017f, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184,
+       0x000f, 0x0040, 0x416a, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004,
        0xc09d, 0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040,
-       0x0040, 0x412a, 0xa184, 0xffbf, 0xc0fd, 0x78a6, 0x6016, 0x6004,
+       0x0040, 0x417a, 0xa184, 0xffbf, 0xc0fd, 0x78a6, 0x6016, 0x6004,
        0xc0a5, 0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001,
        0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab,
-       0x0004, 0x70d4, 0xd0b4, 0x0040, 0x414a, 0xc0b4, 0x70d6, 0x0c7e,
+       0x0004, 0x70d4, 0xd0b4, 0x0040, 0x419a, 0xc0b4, 0x70d6, 0x0c7e,
        0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
        0x601a, 0x0c7f, 0x007c, 0x2031, 0x0000, 0x2029, 0x0032, 0x789b,
        0x0010, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa,
        0x7eaa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x70d4, 0xd0b4, 0x0040,
-       0x416e, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084,
+       0x41be, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084,
        0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x007c, 0x157e,
        0x8007, 0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a,
-       0x79a4, 0xa18c, 0xfff0, 0x2021, 0x41e3, 0x2019, 0x0011, 0x20a9,
+       0x79a4, 0xa18c, 0xfff0, 0x2021, 0x4233, 0x2019, 0x0011, 0x20a9,
        0x000e, 0x2011, 0x0032, 0x2404, 0xa084, 0xfff0, 0xa106, 0x0040,
-       0x418e, 0x8420, 0x2300, 0xa210, 0x00f0, 0x4183, 0x157f, 0x007c,
-       0x157e, 0x2001, 0x4e05, 0x2004, 0xd0e4, 0x00c0, 0x41c1, 0x2021,
-       0x41f1, 0x20a9, 0x0009, 0x2011, 0x0028, 0xa582, 0x0019, 0x0040,
-       0x41d7, 0x0048, 0x41d7, 0x8420, 0x95a9, 0x2011, 0x0032, 0xa582,
-       0x0032, 0x0040, 0x41d7, 0x0048, 0x41d7, 0x8420, 0x95a9, 0x2019,
-       0x000a, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x41d7, 0x0048,
-       0x41d7, 0x8420, 0x2300, 0xa210, 0x00f0, 0x41b3, 0x157f, 0x0078,
-       0x41d5, 0x2021, 0x41e3, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011,
-       0x0032, 0x2200, 0xa502, 0x0040, 0x41d7, 0x0048, 0x41d7, 0x8420,
-       0x2300, 0xa210, 0x00f0, 0x41c9, 0x157f, 0xa006, 0x007c, 0x157f,
-       0xa582, 0x0064, 0x00c8, 0x41e0, 0x7808, 0xa085, 0x0070, 0x780a,
+       0x41de, 0x8420, 0x2300, 0xa210, 0x00f0, 0x41d3, 0x157f, 0x007c,
+       0x157e, 0x2001, 0x4f05, 0x2004, 0xd0e4, 0x00c0, 0x4211, 0x2021,
+       0x4241, 0x20a9, 0x0009, 0x2011, 0x0028, 0xa582, 0x0019, 0x0040,
+       0x4227, 0x0048, 0x4227, 0x8420, 0x95a9, 0x2011, 0x0032, 0xa582,
+       0x0032, 0x0040, 0x4227, 0x0048, 0x4227, 0x8420, 0x95a9, 0x2019,
+       0x000a, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x4227, 0x0048,
+       0x4227, 0x8420, 0x2300, 0xa210, 0x00f0, 0x4203, 0x157f, 0x0078,
+       0x4225, 0x2021, 0x4233, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011,
+       0x0032, 0x2200, 0xa502, 0x0040, 0x4227, 0x0048, 0x4227, 0x8420,
+       0x2300, 0xa210, 0x00f0, 0x4219, 0x157f, 0xa006, 0x007c, 0x157f,
+       0xa582, 0x0064, 0x00c8, 0x4230, 0x7808, 0xa085, 0x0070, 0x780a,
        0x2404, 0xa005, 0x007c, 0x1209, 0x3002, 0x3202, 0x4203, 0x4403,
        0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07,
        0x0e07, 0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06, 0x6c06, 0x7c07,
        0x7e07, 0x0e00, 0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00,
        0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105,
-       0xd7fc, 0x0040, 0x420f, 0xa0e0, 0x73c0, 0x0078, 0x4211, 0xa0e0,
-       0x53c0, 0x007c, 0x0e7e, 0x0f7e, 0xd084, 0x0040, 0x421f, 0x2079,
-       0x0100, 0x2009, 0x4e80, 0x2071, 0x4e80, 0x0078, 0x422f, 0x2009,
-       0x4e40, 0x2071, 0x4e40, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x0040,
-       0x422d, 0x2079, 0x0100, 0x0078, 0x422f, 0x2079, 0x0200, 0x2091,
-       0x8000, 0x2104, 0xa084, 0x000f, 0x0079, 0x4236, 0x4240, 0x4240,
-       0x4240, 0x4240, 0x4240, 0x4240, 0x423e, 0x423e, 0x1078, 0x296b,
-       0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005, 0x0040, 0x428f,
+       0xd7fc, 0x0040, 0x425f, 0xa0e0, 0x74c0, 0x0078, 0x4261, 0xa0e0,
+       0x54c0, 0x007c, 0x0e7e, 0x0f7e, 0xd084, 0x0040, 0x426f, 0x2079,
+       0x0100, 0x2009, 0x4f80, 0x2071, 0x4f80, 0x0078, 0x427f, 0x2009,
+       0x4f40, 0x2071, 0x4f40, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x0040,
+       0x427d, 0x2079, 0x0100, 0x0078, 0x427f, 0x2079, 0x0200, 0x2091,
+       0x8000, 0x2104, 0xa084, 0x000f, 0x0079, 0x4286, 0x4290, 0x4290,
+       0x4290, 0x4290, 0x4290, 0x4290, 0x428e, 0x428e, 0x1078, 0x29b2,
+       0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005, 0x0040, 0x42df,
        0x7858, 0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828, 0xa086,
-       0x1814, 0x00c0, 0x428f, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004,
-       0x00c0, 0x4255, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0,
-       0x425c, 0x7830, 0xd0bc, 0x00c0, 0x428f, 0x007e, 0x2001, 0x4e04,
-       0x2004, 0xd0ec, 0x007f, 0x0040, 0x4271, 0xb284, 0x0300, 0x0078,
-       0x4273, 0xb284, 0x0400, 0x0040, 0x4279, 0x0018, 0x428f, 0x0078,
-       0x427b, 0x0028, 0x428f, 0x79e4, 0xa184, 0x0030, 0x0040, 0x428f,
-       0x78ec, 0xa084, 0x0003, 0x0040, 0x428f, 0x681c, 0xd0ac, 0x00c0,
-       0x428d, 0x1078, 0x4319, 0x0078, 0x428f, 0x781b, 0x00f9, 0x0f7f,
-       0x0e7f, 0x007c, 0x0c7e, 0x2001, 0x4e01, 0x2004, 0xd0ac, 0x00c0,
-       0x430b, 0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
-       0xb28c, 0x0300, 0x0040, 0x42a8, 0xa0e0, 0x52c0, 0x0078, 0x42aa,
-       0xa0e0, 0x5340, 0x6004, 0xa084, 0x000a, 0x00c0, 0x430b, 0x6108,
-       0xa194, 0xff00, 0x0040, 0x430b, 0xa18c, 0x00ff, 0x2001, 0x000a,
-       0xa106, 0x0040, 0x42d6, 0x2001, 0x000c, 0xa106, 0x0040, 0x42da,
-       0x2001, 0x0012, 0xa106, 0x0040, 0x42de, 0x2001, 0x0014, 0xa106,
-       0x0040, 0x42e2, 0x2001, 0x0019, 0xa106, 0x0040, 0x42e6, 0x2001,
-       0x0032, 0xa106, 0x0040, 0x42ea, 0x0078, 0x42ee, 0x2009, 0x000c,
-       0x0078, 0x42f0, 0x2009, 0x0012, 0x0078, 0x42f0, 0x2009, 0x0014,
-       0x0078, 0x42f0, 0x2009, 0x0019, 0x0078, 0x42f0, 0x2009, 0x0020,
-       0x0078, 0x42f0, 0x2009, 0x003f, 0x0078, 0x42f0, 0x2011, 0x0000,
+       0x1814, 0x00c0, 0x42df, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004,
+       0x00c0, 0x42a5, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0,
+       0x42ac, 0x7830, 0xd0bc, 0x00c0, 0x42df, 0x007e, 0x2001, 0x4f04,
+       0x2004, 0xd0ec, 0x007f, 0x0040, 0x42c1, 0xb284, 0x0300, 0x0078,
+       0x42c3, 0xb284, 0x0400, 0x0040, 0x42c9, 0x0018, 0x42df, 0x0078,
+       0x42cb, 0x0028, 0x42df, 0x79e4, 0xa184, 0x0030, 0x0040, 0x42df,
+       0x78ec, 0xa084, 0x0003, 0x0040, 0x42df, 0x681c, 0xd0ac, 0x00c0,
+       0x42dd, 0x1078, 0x4369, 0x0078, 0x42df, 0x781b, 0x00f9, 0x0f7f,
+       0x0e7f, 0x007c, 0x0c7e, 0x2001, 0x4f01, 0x2004, 0xd0ac, 0x00c0,
+       0x435b, 0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
+       0xb28c, 0x0300, 0x0040, 0x42f8, 0xa0e0, 0x53c0, 0x0078, 0x42fa,
+       0xa0e0, 0x5440, 0x6004, 0xa084, 0x000a, 0x00c0, 0x435b, 0x6108,
+       0xa194, 0xff00, 0x0040, 0x435b, 0xa18c, 0x00ff, 0x2001, 0x000a,
+       0xa106, 0x0040, 0x4326, 0x2001, 0x000c, 0xa106, 0x0040, 0x432a,
+       0x2001, 0x0012, 0xa106, 0x0040, 0x432e, 0x2001, 0x0014, 0xa106,
+       0x0040, 0x4332, 0x2001, 0x0019, 0xa106, 0x0040, 0x4336, 0x2001,
+       0x0032, 0xa106, 0x0040, 0x433a, 0x0078, 0x433e, 0x2009, 0x000c,
+       0x0078, 0x4340, 0x2009, 0x0012, 0x0078, 0x4340, 0x2009, 0x0014,
+       0x0078, 0x4340, 0x2009, 0x0019, 0x0078, 0x4340, 0x2009, 0x0020,
+       0x0078, 0x4340, 0x2009, 0x003f, 0x0078, 0x4340, 0x2011, 0x0000,
        0x2100, 0xa205, 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x2061,
-       0x4e00, 0x6004, 0xd0bc, 0x0040, 0x430b, 0x6814, 0xd0fc, 0x00c0,
-       0x4306, 0x60ea, 0x2061, 0x4e40, 0x0078, 0x4309, 0x60ee, 0x2061,
-       0x4e80, 0x601f, 0x800f, 0x0c7f, 0x007c, 0x781b, 0x0079, 0x007c,
+       0x4f00, 0x6004, 0xd0bc, 0x0040, 0x435b, 0x6814, 0xd0fc, 0x00c0,
+       0x4356, 0x60ea, 0x2061, 0x4f40, 0x0078, 0x4359, 0x60ee, 0x2061,
+       0x4f80, 0x601f, 0x800f, 0x0c7f, 0x007c, 0x781b, 0x0079, 0x007c,
        0x781b, 0x0078, 0x007c, 0x781b, 0x0067, 0x007c, 0x781b, 0x0064,
-       0x007c, 0x2009, 0x4e19, 0x210c, 0xa186, 0x0000, 0x0040, 0x432b,
-       0xa186, 0x0001, 0x0040, 0x432e, 0x701f, 0x000b, 0x7067, 0x0001,
+       0x007c, 0x2009, 0x4f19, 0x210c, 0xa186, 0x0000, 0x0040, 0x437b,
+       0xa186, 0x0001, 0x0040, 0x437e, 0x701f, 0x000b, 0x7067, 0x0001,
        0x781b, 0x0047, 0x007c, 0x781b, 0x00f0, 0x007c, 0x701f, 0x000a,
-       0x007c, 0x2009, 0x4e19, 0x210c, 0xa186, 0x0000, 0x0040, 0x4346,
-       0xa186, 0x0001, 0x0040, 0x4343, 0x701f, 0x000b, 0x7067, 0x0001,
+       0x007c, 0x2009, 0x4f19, 0x210c, 0xa186, 0x0000, 0x0040, 0x4396,
+       0xa186, 0x0001, 0x0040, 0x4393, 0x701f, 0x000b, 0x7067, 0x0001,
        0x781b, 0x0047, 0x007c, 0x701f, 0x000a, 0x007c, 0x781b, 0x00ef,
        0x007c, 0x781b, 0x00f9, 0x007c, 0x781b, 0x00f8, 0x007c, 0x781b,
        0x00c9, 0x007c, 0x781b, 0x00c8, 0x007c, 0x6818, 0xd0fc, 0x0040,
-       0x435b, 0x681b, 0x001d, 0x7067, 0x0001, 0x781b, 0x0047, 0x007c,
-       0x7830, 0xa084, 0x00c0, 0x00c0, 0x4382, 0x7808, 0xc08c, 0x780a,
+       0x43ab, 0x681b, 0x001d, 0x7067, 0x0001, 0x781b, 0x0047, 0x007c,
+       0x7830, 0xa084, 0x00c0, 0x00c0, 0x43d2, 0x7808, 0xc08c, 0x780a,
        0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x00c0,
-       0x437f, 0x2001, 0x4e05, 0x2004, 0xd0e4, 0x00c0, 0x437d, 0x7804,
+       0x43cf, 0x2001, 0x4f05, 0x2004, 0xd0e4, 0x00c0, 0x43cd, 0x7804,
        0xa084, 0xff1f, 0xa085, 0x00e0, 0x7806, 0xa006, 0x007c, 0x7808,
        0xc08d, 0x780a, 0x007c, 0x7808, 0xc08d, 0x780a, 0x007c, 0x7830,
-       0xa084, 0x0040, 0x00c0, 0x4387, 0x2001, 0x4e04, 0x2004, 0xd0ec,
-       0x0040, 0x4396, 0xb284, 0x0300, 0x0078, 0x4398, 0xb284, 0x0400,
-       0x0040, 0x439e, 0x0098, 0x43a2, 0x0078, 0x43a0, 0x00a8, 0x43a2,
+       0xa084, 0x0040, 0x00c0, 0x43d7, 0x2001, 0x4f04, 0x2004, 0xd0ec,
+       0x0040, 0x43e6, 0xb284, 0x0300, 0x0078, 0x43e8, 0xb284, 0x0400,
+       0x0040, 0x43ee, 0x0098, 0x43f2, 0x0078, 0x43f0, 0x00a8, 0x43f2,
        0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005,
-       0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x43c5, 0x007e,
-       0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x43bb, 0xb284,
-       0x0300, 0x0078, 0x43bd, 0xb284, 0x0400, 0x0040, 0x43c3, 0x0098,
-       0x43bf, 0x0078, 0x43c5, 0x00a8, 0x43c3, 0x78ac, 0x007e, 0x7808,
+       0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x4415, 0x007e,
+       0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x440b, 0xb284,
+       0x0300, 0x0078, 0x440d, 0xb284, 0x0400, 0x0040, 0x4413, 0x0098,
+       0x440f, 0x0078, 0x4415, 0x00a8, 0x4413, 0x78ac, 0x007e, 0x7808,
        0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0xa784, 0x0001, 0x00c0,
-       0x3770, 0xa784, 0x0070, 0x0040, 0x43dd, 0x0c7e, 0x2d60, 0x2f68,
-       0x1078, 0x28df, 0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040,
-       0x43ea, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3770,
-       0x0078, 0x430d, 0xa784, 0x0004, 0x0040, 0x4419, 0x78b8, 0xa084,
-       0x4001, 0x0040, 0x4419, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
-       0x0040, 0x3770, 0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0,
-       0x4419, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00f9,
-       0x007c, 0x784b, 0x0008, 0x6818, 0xd0fc, 0x0040, 0x4416, 0x681b,
-       0x0015, 0xd6f4, 0x0040, 0x4416, 0x681b, 0x0007, 0x1078, 0x4319,
+       0x37b9, 0xa784, 0x0070, 0x0040, 0x442d, 0x0c7e, 0x2d60, 0x2f68,
+       0x1078, 0x2926, 0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040,
+       0x443a, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x37b9,
+       0x0078, 0x435d, 0xa784, 0x0004, 0x0040, 0x4469, 0x78b8, 0xa084,
+       0x4001, 0x0040, 0x4469, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
+       0x0040, 0x37b9, 0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0,
+       0x4469, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00f9,
+       0x007c, 0x784b, 0x0008, 0x6818, 0xd0fc, 0x0040, 0x4466, 0x681b,
+       0x0015, 0xd6f4, 0x0040, 0x4466, 0x681b, 0x0007, 0x1078, 0x4369,
        0x007c, 0x681b, 0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x682f,
        0x0000, 0x6833, 0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
-       0x0040, 0x3066, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f,
-       0x0040, 0x4436, 0xb284, 0x0300, 0x0078, 0x4438, 0xb284, 0x0400,
-       0x0040, 0x443e, 0x0018, 0x29c1, 0x0078, 0x4440, 0x0028, 0x29c1,
-       0x0078, 0x40bc, 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003,
-       0x8003, 0xd3fc, 0x0040, 0x4450, 0xa080, 0x5340, 0x0078, 0x4452,
-       0xa080, 0x52c0, 0x2060, 0x2048, 0x705a, 0x2a60, 0x007c, 0x0020,
+       0x0040, 0x30af, 0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f,
+       0x0040, 0x4486, 0xb284, 0x0300, 0x0078, 0x4488, 0xb284, 0x0400,
+       0x0040, 0x448e, 0x0018, 0x2a08, 0x0078, 0x4490, 0x0028, 0x2a08,
+       0x0078, 0x410c, 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003,
+       0x8003, 0xd3fc, 0x0040, 0x44a0, 0xa080, 0x5440, 0x0078, 0x44a2,
+       0xa080, 0x53c0, 0x2060, 0x2048, 0x705a, 0x2a60, 0x007c, 0x0020,
        0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
        0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
        0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
@@ -1763,255 +1773,276 @@ static unsigned short risc_code01[] = {
        0x0016, 0x7944, 0x8421, 0xa020, 0xa532, 0x84a1, 0x0016, 0x7944,
        0x8421, 0xa0df, 0x9532, 0x84a1, 0x0016, 0x0000, 0x127e, 0x70d4,
        0xa084, 0x4600, 0x8004, 0x2090, 0x7204, 0x7008, 0xc09c, 0xa205,
-       0x00c0, 0x45a2, 0x720c, 0x82ff, 0x0040, 0x459d, 0x8aff, 0x00c0,
-       0x45a2, 0x7200, 0xd284, 0x00c0, 0x45a2, 0x7003, 0x0008, 0x127f,
+       0x00c0, 0x4602, 0x720c, 0x82ff, 0x0040, 0x45ed, 0x8aff, 0x00c0,
+       0x4602, 0x7200, 0xd284, 0x00c0, 0x4602, 0x7804, 0xd0cc, 0x0040,
+       0x45f3, 0x1078, 0x4acc, 0x7023, 0x0000, 0x7027, 0x0000, 0x7000,
+       0xd084, 0x0040, 0x45fd, 0x7007, 0x0004, 0x7003, 0x0008, 0x127f,
        0x2000, 0x007c, 0x7000, 0xa084, 0x0003, 0x7002, 0xc69c, 0xd084,
-       0x0040, 0x45e5, 0x7108, 0x0005, 0x7008, 0xa106, 0x00c0, 0x45aa,
-       0xa184, 0x0003, 0x0040, 0x4616, 0xa184, 0x01e0, 0x00c0, 0x4616,
-       0xd1f4, 0x00c0, 0x45aa, 0xa184, 0x3000, 0xa086, 0x1000, 0x0040,
-       0x45aa, 0x2011, 0x0180, 0x710c, 0x8211, 0x0040, 0x45cf, 0x7008,
-       0xd0f4, 0x00c0, 0x45aa, 0x700c, 0xa106, 0x0040, 0x45c4, 0x7007,
-       0x0012, 0x7108, 0x0005, 0x7008, 0xa106, 0x00c0, 0x45d1, 0xa184,
-       0x0003, 0x0040, 0x4616, 0xd194, 0x0040, 0x45d1, 0xd1f4, 0x0040,
-       0x4616, 0x7007, 0x0002, 0x0078, 0x45aa, 0x7108, 0xd1fc, 0x0040,
-       0x45f0, 0x1078, 0x4769, 0x8aff, 0x0040, 0x458c, 0x0078, 0x45e5,
-       0x700c, 0xa08c, 0x03ff, 0x0040, 0x461b, 0x7004, 0xd084, 0x0040,
-       0x460d, 0x7014, 0xa005, 0x00c0, 0x4609, 0x7010, 0x7310, 0xa306,
-       0x00c0, 0x45fd, 0x2300, 0xa005, 0x0040, 0x460d, 0xa102, 0x00c8,
-       0x45e5, 0x7007, 0x0010, 0x0078, 0x4616, 0x8aff, 0x0040, 0x461b,
-       0x1078, 0x4970, 0x00c0, 0x4610, 0x0040, 0x45e5, 0x1078, 0x46b4,
-       0x127f, 0x2000, 0x007c, 0x7204, 0x7108, 0xc19c, 0x8103, 0x00c8,
-       0x462a, 0x7007, 0x0002, 0x0078, 0x461b, 0x7003, 0x0008, 0x127f,
-       0x2000, 0x007c, 0xa205, 0x00c0, 0x4616, 0x7003, 0x0008, 0x127f,
-       0x2000, 0x007c, 0x6428, 0x84ff, 0x0040, 0x465e, 0x2c70, 0x7004,
-       0xa0bc, 0x000f, 0xa7b8, 0x466e, 0x273c, 0x87fb, 0x00c0, 0x464c,
-       0x0048, 0x4644, 0x1078, 0x296b, 0x609c, 0xa075, 0x0040, 0x465e,
-       0x0078, 0x4637, 0x2039, 0x4663, 0x2704, 0xae68, 0x6808, 0xa630,
-       0x680c, 0xa529, 0x8421, 0x0040, 0x465e, 0x8738, 0x2704, 0xa005,
-       0x00c0, 0x464d, 0x709c, 0xa075, 0x00c0, 0x4637, 0x007c, 0x0000,
-       0x0005, 0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000,
-       0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x4663,
-       0x4660, 0x0000, 0x0000, 0x8000, 0x0000, 0x4663, 0x0000, 0x466b,
-       0x4668, 0x0000, 0x0000, 0x0000, 0x0000, 0x466b, 0x0000, 0x4666,
-       0x4666, 0x0000, 0x0000, 0x8000, 0x0000, 0x4666, 0x0000, 0x466c,
-       0x466c, 0x0000, 0x0000, 0x0000, 0x0000, 0x466c, 0x2079, 0x4e00,
-       0x2071, 0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0001,
-       0x7810, 0xd0ec, 0x0040, 0x46a2, 0x2009, 0x0001, 0x2071, 0x0020,
-       0x0078, 0x46a6, 0x2009, 0x0002, 0x2071, 0x0050, 0x7007, 0x000a,
-       0x7007, 0x0002, 0x7003, 0x0000, 0x8109, 0x0040, 0x46b3, 0x2071,
-       0x0020, 0x0078, 0x46a6, 0x007c, 0x7004, 0x8004, 0x00c8, 0x473d,
-       0x7108, 0x7008, 0xa106, 0x00c0, 0x46b8, 0xa184, 0x01e0, 0x0040,
-       0x46c5, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7007, 0x0012, 0x2019,
-       0x0000, 0x7108, 0x7008, 0xa106, 0x00c0, 0x46c9, 0xa184, 0x01e0,
-       0x0040, 0x46d6, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7810, 0xd0ec,
-       0x0040, 0x46f0, 0x2001, 0x04fd, 0x2004, 0xa086, 0x0003, 0x00c0,
-       0x46f4, 0xa184, 0x4000, 0x0040, 0x46f8, 0xa382, 0x0003, 0x00c8,
-       0x46f8, 0xa184, 0x0004, 0x0040, 0x46c9, 0x8318, 0x0078, 0x46c9,
-       0x7814, 0xd0ec, 0x00c0, 0x46f8, 0xa184, 0x4000, 0x00c0, 0x46c9,
-       0xa19c, 0x300c, 0xa386, 0x2004, 0x0040, 0x4715, 0xa386, 0x0008,
-       0x0040, 0x4720, 0x7004, 0xd084, 0x00c0, 0x4711, 0x7108, 0x7008,
-       0xa106, 0x00c0, 0x4706, 0xa184, 0x0003, 0x0040, 0x4711, 0x0078,
-       0x47ac, 0xa386, 0x200c, 0x00c0, 0x46c9, 0x7200, 0x8204, 0x0048,
-       0x4720, 0x730c, 0xa384, 0x03ff, 0x0040, 0x4720, 0x1078, 0x296b,
-       0x7108, 0x7008, 0xa106, 0x00c0, 0x4720, 0xa184, 0x01e0, 0x0040,
-       0x472d, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7007, 0x0012, 0x7000,
-       0xd084, 0x00c0, 0x473d, 0x7310, 0x7014, 0xa305, 0x0040, 0x473d,
-       0x710c, 0xa184, 0x03ff, 0x00c0, 0x46b4, 0x7108, 0x7008, 0xa106,
-       0x00c0, 0x473d, 0xa184, 0x01e0, 0x0040, 0x474a, 0x1078, 0x47ac,
-       0x0078, 0x4765, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xd09c,
-       0x00c0, 0x474e, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4752, 0xa184,
-       0x01e0, 0x0040, 0x475f, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7007,
-       0x0012, 0x7108, 0x8103, 0x0048, 0x4752, 0x7003, 0x0008, 0x007c,
-       0x7108, 0xa184, 0x01e0, 0x00c0, 0x47ac, 0x7108, 0xa184, 0x01e0,
-       0x00c0, 0x47ac, 0xa184, 0x0007, 0x0079, 0x4776, 0x4780, 0x4790,
-       0x477e, 0x4790, 0x477e, 0x47ee, 0x477e, 0x47ec, 0x1078, 0x296b,
-       0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff, 0x00c0, 0x478b,
-       0x2049, 0x0000, 0x007c, 0x1078, 0x4970, 0x00c0, 0x478b, 0x007c,
-       0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x7004, 0xd084, 0x00c0,
-       0x47a4, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4799, 0xa184, 0x0003,
-       0x0040, 0x47a4, 0x0078, 0x47ac, 0x8aff, 0x0040, 0x47ab, 0x1078,
-       0x4970, 0x00c0, 0x47a7, 0x007c, 0x7007, 0x0012, 0x7108, 0x00e0,
-       0x47af, 0x2091, 0x6000, 0x00e0, 0x47b3, 0x2091, 0x6000, 0x7007,
-       0x0012, 0x7007, 0x0008, 0x7004, 0xd09c, 0x00c0, 0x47bb, 0x7007,
-       0x0012, 0x7108, 0xd1fc, 0x00c0, 0x47bf, 0x7003, 0x0000, 0x7000,
-       0xa005, 0x00c0, 0x47d3, 0x7004, 0xa005, 0x00c0, 0x47d3, 0x700c,
-       0xa005, 0x0040, 0x47d5, 0x0078, 0x47b7, 0x2049, 0x0000, 0xb284,
-       0x0100, 0x0040, 0x47df, 0x2001, 0x0000, 0x0078, 0x47e1, 0x2001,
-       0x0001, 0x1078, 0x4212, 0x681b, 0x0002, 0x2051, 0x0000, 0x007c,
-       0x1078, 0x296b, 0x1078, 0x296b, 0x1078, 0x4836, 0x7210, 0x7114,
-       0x700c, 0xa09c, 0x03ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000,
-       0x1078, 0x4836, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322,
-       0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x4811, 0x00c8,
-       0x4811, 0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078,
-       0x47f8, 0x2b60, 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008, 0x0040,
-       0x481d, 0xa7ba, 0x4668, 0x0078, 0x481f, 0xa7ba, 0x4660, 0x007f,
-       0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7108, 0x7008,
-       0xa106, 0x00c0, 0x4826, 0xa184, 0x01e0, 0x0040, 0x4831, 0x1078,
-       0x47ac, 0x7007, 0x0012, 0x1078, 0x46b4, 0x007c, 0x8a50, 0x8739,
-       0x2704, 0xa004, 0x00c0, 0x484a, 0x6000, 0xa064, 0x00c0, 0x4841,
-       0x2d60, 0x6004, 0xa084, 0x000f, 0xa080, 0x467e, 0x203c, 0x87fb,
-       0x1040, 0x296b, 0x007c, 0x127e, 0x0d7e, 0x70d4, 0xa084, 0x4600,
-       0x8004, 0x2090, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90,
-       0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804, 0xa084,
-       0x0008, 0x007f, 0x0040, 0x4868, 0xa0b8, 0x4668, 0x0078, 0x486a,
-       0xa0b8, 0x4660, 0xb284, 0x0100, 0x0040, 0x4871, 0x7e20, 0x0078,
-       0x4872, 0x7e24, 0xa6b5, 0x000c, 0x681c, 0xd0b4, 0x0040, 0x4879,
-       0xc685, 0x2400, 0xa305, 0x0040, 0x48a3, 0x2c58, 0x2704, 0x6104,
-       0xac60, 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e, 0xa184,
-       0x0008, 0x0040, 0x4893, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014,
-       0xa081, 0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c,
-       0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x1078,
-       0x499b, 0x0078, 0x48a5, 0x1078, 0x4970, 0x00c0, 0x48a3, 0x127f,
-       0x2000, 0x007c, 0x127e, 0x0d7e, 0x70d4, 0xa084, 0x4600, 0x8004,
-       0x2090, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xd094, 0x00c0, 0x48b4,
-       0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x70d4,
-       0xa084, 0x4600, 0x8004, 0x007e, 0x2090, 0x007f, 0x0d7f, 0x7e20,
-       0xb284, 0x0100, 0x00c0, 0x48cd, 0x7e24, 0xa6b5, 0x000c, 0x681c,
-       0xd0ac, 0x00c0, 0x48d8, 0xc685, 0x7003, 0x0000, 0x7007, 0x0004,
-       0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x466e,
-       0x273c, 0x87fb, 0x00c0, 0x48ee, 0x0048, 0x48e8, 0x1078, 0x296b,
-       0x689c, 0xa065, 0x0040, 0x48f2, 0x0078, 0x48db, 0x1078, 0x4970,
-       0x00c0, 0x48ee, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e,
+       0x0040, 0x465b, 0x7108, 0x0005, 0x7008, 0xa106, 0x00c0, 0x460a,
+       0xa184, 0x0003, 0x0040, 0x468c, 0xa184, 0x01e0, 0x00c0, 0x468c,
+       0xd1f4, 0x00c0, 0x460a, 0xa184, 0x3000, 0xa086, 0x1000, 0x0040,
+       0x460a, 0x2001, 0x4f05, 0x2004, 0xd0e4, 0x0040, 0x4637, 0x2011,
+       0x0180, 0x710c, 0x8211, 0x0040, 0x4645, 0x7008, 0xd0f4, 0x00c0,
+       0x460a, 0x700c, 0xa106, 0x0040, 0x462a, 0x0078, 0x4627, 0x2011,
+       0x0180, 0x710c, 0x8211, 0x0040, 0x4645, 0x7008, 0xd0f4, 0x00c0,
+       0x460a, 0x700c, 0xa106, 0x0040, 0x463a, 0x7007, 0x0012, 0x7108,
+       0x0005, 0x7008, 0xa106, 0x00c0, 0x4647, 0xa184, 0x0003, 0x0040,
+       0x468c, 0xd194, 0x0040, 0x4647, 0xd1f4, 0x0040, 0x468c, 0x7007,
+       0x0002, 0x0078, 0x460a, 0x7108, 0xd1fc, 0x0040, 0x4666, 0x1078,
+       0x47ed, 0x8aff, 0x0040, 0x45dc, 0x0078, 0x465b, 0x700c, 0xa08c,
+       0x03ff, 0x0040, 0x4691, 0x7004, 0xd084, 0x0040, 0x4683, 0x7014,
+       0xa005, 0x00c0, 0x467f, 0x7010, 0x7310, 0xa306, 0x00c0, 0x4673,
+       0x2300, 0xa005, 0x0040, 0x4683, 0xa102, 0x00c8, 0x465b, 0x7007,
+       0x0010, 0x0078, 0x468c, 0x8aff, 0x0040, 0x4691, 0x1078, 0x49f2,
+       0x00c0, 0x4686, 0x0040, 0x465b, 0x1078, 0x4738, 0x127f, 0x2000,
+       0x007c, 0x7204, 0x7108, 0xc19c, 0x8103, 0x00c8, 0x46a0, 0x7007,
+       0x0002, 0x0078, 0x4691, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c,
+       0xa205, 0x00c0, 0x468c, 0x7023, 0x0000, 0x7027, 0x0000, 0x7003,
+       0x0008, 0x007e, 0x2001, 0x4f01, 0x2004, 0xd0cc, 0x0040, 0x46b2,
+       0x1078, 0x4acc, 0x007f, 0x127f, 0x2000, 0x007c, 0x6428, 0x84ff,
+       0x0040, 0x46e2, 0x2c70, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x46f2,
+       0x273c, 0x87fb, 0x00c0, 0x46d0, 0x0048, 0x46c8, 0x1078, 0x29b2,
+       0x609c, 0xa075, 0x0040, 0x46e2, 0x0078, 0x46bb, 0x2039, 0x46e7,
+       0x2704, 0xae68, 0x6808, 0xa630, 0x680c, 0xa529, 0x8421, 0x0040,
+       0x46e2, 0x8738, 0x2704, 0xa005, 0x00c0, 0x46d1, 0x709c, 0xa075,
+       0x00c0, 0x46bb, 0x007c, 0x0000, 0x0005, 0x0009, 0x000d, 0x0011,
+       0x0015, 0x0019, 0x001d, 0x0000, 0x0003, 0x0009, 0x000f, 0x0015,
+       0x001b, 0x0000, 0x0000, 0x46e7, 0x46e4, 0x0000, 0x0000, 0x8000,
+       0x0000, 0x46e7, 0x0000, 0x46ef, 0x46ec, 0x0000, 0x0000, 0x0000,
+       0x0000, 0x46ef, 0x0000, 0x46ea, 0x46ea, 0x0000, 0x0000, 0x8000,
+       0x0000, 0x46ea, 0x0000, 0x46f0, 0x46f0, 0x0000, 0x0000, 0x0000,
+       0x0000, 0x46f0, 0x2079, 0x4f00, 0x2071, 0x0010, 0x7007, 0x000a,
+       0x7007, 0x0002, 0x7003, 0x0001, 0x7810, 0xd0ec, 0x0040, 0x4726,
+       0x2009, 0x0001, 0x2071, 0x0020, 0x0078, 0x472a, 0x2009, 0x0002,
+       0x2071, 0x0050, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000,
+       0x8109, 0x0040, 0x4737, 0x2071, 0x0020, 0x0078, 0x472a, 0x007c,
+       0x7004, 0x8004, 0x00c8, 0x47c1, 0x7108, 0x7008, 0xa106, 0x00c0,
+       0x473c, 0xa184, 0x01e0, 0x0040, 0x4749, 0x1078, 0x4830, 0x0078,
+       0x47e9, 0x7007, 0x0012, 0x2019, 0x0000, 0x7108, 0x7008, 0xa106,
+       0x00c0, 0x474d, 0xa184, 0x01e0, 0x0040, 0x475a, 0x1078, 0x4830,
+       0x0078, 0x47e9, 0x7810, 0xd0ec, 0x0040, 0x4774, 0x2001, 0x04fd,
+       0x2004, 0xa086, 0x0003, 0x00c0, 0x4778, 0xa184, 0x4000, 0x0040,
+       0x477c, 0xa382, 0x0003, 0x00c8, 0x477c, 0xa184, 0x0004, 0x0040,
+       0x474d, 0x8318, 0x0078, 0x474d, 0x7814, 0xd0ec, 0x00c0, 0x477c,
+       0xa184, 0x4000, 0x00c0, 0x474d, 0xa19c, 0x300c, 0xa386, 0x2004,
+       0x0040, 0x4799, 0xa386, 0x0008, 0x0040, 0x47a4, 0x7004, 0xd084,
+       0x00c0, 0x4795, 0x7108, 0x7008, 0xa106, 0x00c0, 0x478a, 0xa184,
+       0x0003, 0x0040, 0x4795, 0x0078, 0x4830, 0xa386, 0x200c, 0x00c0,
+       0x474d, 0x7200, 0x8204, 0x0048, 0x47a4, 0x730c, 0xa384, 0x03ff,
+       0x0040, 0x47a4, 0x1078, 0x29b2, 0x7108, 0x7008, 0xa106, 0x00c0,
+       0x47a4, 0xa184, 0x01e0, 0x0040, 0x47b1, 0x1078, 0x4830, 0x0078,
+       0x47e9, 0x7007, 0x0012, 0x7000, 0xd084, 0x00c0, 0x47c1, 0x7310,
+       0x7014, 0xa305, 0x0040, 0x47c1, 0x710c, 0xa184, 0x03ff, 0x00c0,
+       0x4738, 0x7108, 0x7008, 0xa106, 0x00c0, 0x47c1, 0xa184, 0x01e0,
+       0x0040, 0x47ce, 0x1078, 0x4830, 0x0078, 0x47e9, 0x7007, 0x0012,
+       0x7007, 0x0008, 0x7004, 0xd09c, 0x00c0, 0x47d2, 0x7108, 0x7008,
+       0xa106, 0x00c0, 0x47d6, 0xa184, 0x01e0, 0x0040, 0x47e3, 0x1078,
+       0x4830, 0x0078, 0x47e9, 0x7007, 0x0012, 0x7108, 0x8103, 0x0048,
+       0x47d6, 0x7003, 0x0008, 0x007c, 0x7108, 0xa184, 0x01e0, 0x00c0,
+       0x4830, 0x7108, 0xa184, 0x01e0, 0x00c0, 0x4830, 0xa184, 0x0007,
+       0x0079, 0x47fa, 0x4804, 0x4814, 0x4802, 0x4814, 0x4802, 0x4872,
+       0x4802, 0x4870, 0x1078, 0x29b2, 0x7004, 0xa084, 0x0010, 0xc08d,
+       0x7006, 0x8aff, 0x00c0, 0x480f, 0x2049, 0x0000, 0x007c, 0x1078,
+       0x49f2, 0x00c0, 0x480f, 0x007c, 0x7004, 0xa084, 0x0010, 0xc08d,
+       0x7006, 0x7004, 0xd084, 0x00c0, 0x4828, 0x7108, 0x7008, 0xa106,
+       0x00c0, 0x481d, 0xa184, 0x0003, 0x0040, 0x4828, 0x0078, 0x4830,
+       0x8aff, 0x0040, 0x482f, 0x1078, 0x49f2, 0x00c0, 0x482b, 0x007c,
+       0x7007, 0x0012, 0x7108, 0x00e0, 0x4833, 0x2091, 0x6000, 0x00e0,
+       0x4837, 0x2091, 0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004,
+       0xd09c, 0x00c0, 0x483f, 0x7007, 0x0012, 0x7108, 0xd1fc, 0x00c0,
+       0x4843, 0x7003, 0x0000, 0x7000, 0xa005, 0x00c0, 0x4857, 0x7004,
+       0xa005, 0x00c0, 0x4857, 0x700c, 0xa005, 0x0040, 0x4859, 0x0078,
+       0x483b, 0x2049, 0x0000, 0xb284, 0x0100, 0x0040, 0x4863, 0x2001,
+       0x0000, 0x0078, 0x4865, 0x2001, 0x0001, 0x1078, 0x4262, 0x681b,
+       0x0002, 0x2051, 0x0000, 0x007c, 0x1078, 0x29b2, 0x1078, 0x29b2,
+       0x1078, 0x48b9, 0x7210, 0x7114, 0x700c, 0xa09c, 0x03ff, 0x2800,
+       0xa300, 0xa211, 0xa189, 0x0000, 0x1078, 0x48b9, 0x2704, 0x2c58,
+       0xac60, 0x6308, 0x2200, 0xa322, 0x630c, 0x2100, 0xa31b, 0x2400,
+       0xa305, 0x0040, 0x4895, 0x00c8, 0x4895, 0x8412, 0x8210, 0x830a,
+       0xa189, 0x0000, 0x2b60, 0x0078, 0x487c, 0x2b60, 0x8a07, 0x007e,
+       0x6004, 0xd09c, 0x0040, 0x48a0, 0xa7ba, 0x46ec, 0x0078, 0x48a2,
+       0xa7ba, 0x46e4, 0x007f, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92,
+       0x6b8e, 0x7108, 0x7008, 0xa106, 0x00c0, 0x48a9, 0xa184, 0x01e0,
+       0x0040, 0x48b4, 0x1078, 0x4830, 0x7007, 0x0012, 0x1078, 0x4738,
+       0x007c, 0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x48cd, 0x6000,
+       0xa064, 0x00c0, 0x48c4, 0x2d60, 0x6004, 0xa084, 0x000f, 0xa080,
+       0x4702, 0x203c, 0x87fb, 0x1040, 0x29b2, 0x007c, 0x127e, 0x0d7e,
+       0x70d4, 0xa084, 0x4600, 0x8004, 0x2090, 0x0d7f, 0x6884, 0x2060,
+       0x6888, 0x6b8c, 0x6c90, 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff,
+       0x007e, 0x6804, 0xa084, 0x0008, 0x007f, 0x0040, 0x48eb, 0xa0b8,
+       0x46ec, 0x0078, 0x48ed, 0xa0b8, 0x46e4, 0xb284, 0x0100, 0x0040,
+       0x48f4, 0x7e20, 0x0078, 0x48f5, 0x7e24, 0xa6b5, 0x000c, 0x681c,
+       0xd0b4, 0x0040, 0x48fc, 0xc685, 0x2400, 0xa305, 0x0040, 0x4925,
+       0x2c58, 0x2704, 0x6104, 0xac60, 0x6000, 0xa400, 0x701a, 0x6004,
+       0xa301, 0x701e, 0xd19c, 0x0040, 0x4915, 0x6010, 0xa081, 0x0000,
+       0x7022, 0x6014, 0xa081, 0x0000, 0x7026, 0x6208, 0x2400, 0xa202,
+       0x7012, 0x620c, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001,
+       0x2b60, 0x1078, 0x4a1c, 0x0078, 0x4927, 0x1078, 0x49f2, 0x00c0,
+       0x4925, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x70d4, 0xa084,
+       0x4600, 0x8004, 0x2090, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xd094,
+       0x00c0, 0x4936, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e,
        0x0d7e, 0x70d4, 0xa084, 0x4600, 0x8004, 0x007e, 0x2090, 0x007f,
-       0x7e20, 0xb284, 0x0100, 0x00c0, 0x4906, 0x7e24, 0x0d7f, 0x037f,
-       0x047f, 0xa6b5, 0x000c, 0x681c, 0xd0b4, 0x0040, 0x4914, 0xc685,
-       0x7003, 0x0000, 0x7007, 0x0004, 0x2049, 0x48f5, 0x6828, 0xa055,
-       0x0d7e, 0x0040, 0x496c, 0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f,
-       0xa7b8, 0x466e, 0x273c, 0x87fb, 0x00c0, 0x4931, 0x0048, 0x492a,
-       0x1078, 0x296b, 0x709c, 0xa075, 0x2060, 0x0040, 0x496c, 0x0078,
-       0x491d, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0048,
-       0x494a, 0x8a51, 0x00c0, 0x493e, 0x1078, 0x296b, 0x8738, 0x2704,
-       0xa005, 0x00c0, 0x4932, 0x709c, 0xa075, 0x2060, 0x0040, 0x496c,
-       0x0078, 0x491d, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x6908,
-       0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x00c8, 0x4959, 0x1078,
-       0x296b, 0xb284, 0x0100, 0x0040, 0x4967, 0x2001, 0x4e04, 0x2004,
-       0xd0ec, 0x00c0, 0x4967, 0x2071, 0x0050, 0x0078, 0x4969, 0x2071,
-       0x0020, 0x0d7f, 0x0078, 0x4879, 0x0d7f, 0x127f, 0x2000, 0x007c,
-       0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040, 0x4979, 0xa006,
-       0x007c, 0xa084, 0x0003, 0xa086, 0x0003, 0x00c0, 0x4980, 0x007c,
-       0x2704, 0xac78, 0x7800, 0x701a, 0x7804, 0x701e, 0x7808, 0x7012,
-       0x780c, 0x7016, 0x6004, 0xa084, 0x0008, 0x0040, 0x4993, 0x7810,
-       0x7022, 0x7814, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010, 0xc085,
-       0x7006, 0x2079, 0x4e00, 0x8a51, 0x0040, 0x49bf, 0x8738, 0x2704,
-       0xa005, 0x00c0, 0x49b1, 0x609c, 0xa005, 0x0040, 0x49c0, 0x2060,
-       0x6004, 0xa084, 0x000f, 0xa080, 0x466e, 0x203c, 0x87fb, 0x1040,
-       0x296b, 0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040, 0x49bb,
-       0xa006, 0x0078, 0x49c0, 0xa084, 0x0003, 0xa086, 0x0003, 0x007c,
-       0x2051, 0x0000, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x70d4, 0xa084,
-       0x4600, 0x8004, 0x2090, 0x0d7f, 0x087f, 0x7108, 0xa184, 0x0003,
-       0x00c0, 0x49d8, 0x6828, 0xa005, 0x0040, 0x49e8, 0x0078, 0x45a2,
-       0x7108, 0xd1fc, 0x0040, 0x49e0, 0x1078, 0x4769, 0x0078, 0x49cd,
-       0x7007, 0x0010, 0x7108, 0xd1fc, 0x0040, 0x49e2, 0x1078, 0x4769,
-       0x7008, 0xa086, 0x0008, 0x00c0, 0x49cd, 0x7000, 0xa005, 0x00c0,
-       0x49cd, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c,
-       0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x70d4, 0xa084,
-       0x4600, 0x8004, 0x2090, 0x0d7f, 0x2049, 0x49f8, 0xad80, 0x0011,
-       0x20a0, 0xb284, 0x0100, 0x0040, 0x4a1b, 0x2001, 0x4e04, 0x2004,
-       0xd0ec, 0x0040, 0x4a17, 0x2099, 0x0031, 0x0078, 0x4a1d, 0x2099,
-       0x0032, 0x0078, 0x4a1d, 0x2099, 0x0031, 0x700c, 0xa084, 0x03ff,
-       0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0040,
-       0x4a2c, 0x8000, 0x80ac, 0x53a5, 0x700c, 0xa084, 0x03ff, 0x0040,
-       0x4a38, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4a33,
-       0x0c7f, 0x2049, 0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f,
-       0x127f, 0x2000, 0x007c, 0x2091, 0x8000, 0x2091, 0x6000, 0x78ac,
-       0xa005, 0x00c0, 0x4a5a, 0x7974, 0x70d0, 0xa106, 0x00c0, 0x4a5a,
-       0x781c, 0xa005, 0x0040, 0x4a5a, 0x781f, 0x0000, 0x0068, 0x4a5a,
-       0x2091, 0x4080, 0x7830, 0x8001, 0x7832, 0x00c0, 0x4ae2, 0x7834,
-       0x7832, 0x7810, 0xd0ec, 0x00c0, 0x4adb, 0x2061, 0x73c0, 0x2069,
-       0x4e80, 0xc7fd, 0x68d0, 0xa005, 0x0040, 0x4a74, 0x8001, 0x68d2,
-       0x00c0, 0x4a74, 0x1078, 0x4cb0, 0x6800, 0xa084, 0x000f, 0x0040,
-       0x4a89, 0xa086, 0x0001, 0x0040, 0x4a89, 0x6844, 0xa00d, 0x0040,
-       0x4a89, 0x2104, 0xa005, 0x0040, 0x4a89, 0x8001, 0x200a, 0x0040,
-       0x4c23, 0x6814, 0xa005, 0x0040, 0x4aae, 0x8001, 0x6816, 0x00c0,
-       0x4aae, 0x68a7, 0x0001, 0x0f7e, 0xd7fc, 0x00c0, 0x4aa3, 0x7810,
-       0xd0ec, 0x0040, 0x4a9f, 0x2079, 0x0100, 0x0078, 0x4aa5, 0x2079,
-       0x0200, 0x0078, 0x4aa5, 0x2079, 0x0100, 0x1078, 0x4383, 0x0f7f,
-       0x6864, 0xa005, 0x0040, 0x4aae, 0x1078, 0x2628, 0x6880, 0xa005,
-       0x0040, 0x4abb, 0x8001, 0x6882, 0x00c0, 0x4abb, 0x6867, 0x0000,
-       0x68d4, 0xc0dd, 0x68d6, 0x68d4, 0xd0fc, 0x0040, 0x4ad8, 0xc0fc,
-       0x68d6, 0x20a9, 0x0200, 0x6034, 0xa005, 0x0040, 0x4ad4, 0x8001,
-       0x6036, 0x68d4, 0xc0fd, 0x68d6, 0x00c0, 0x4ad4, 0x6010, 0xa005,
-       0x0040, 0x4ad4, 0x1078, 0x2628, 0xace0, 0x0010, 0x00f0, 0x4ac3,
-       0xd7fc, 0x0040, 0x4ae2, 0x2061, 0x53c0, 0x2069, 0x4e40, 0xc7fc,
-       0x0078, 0x4a6a, 0x1078, 0x4b1e, 0x7838, 0x8001, 0x783a, 0x00c0,
-       0x4b04, 0x783c, 0x783a, 0x2061, 0x53c0, 0x2069, 0x4e40, 0xc7fc,
-       0x680c, 0xa005, 0x0040, 0x4af6, 0x1078, 0x4b88, 0xd7fc, 0x00c0,
-       0x4b04, 0x7810, 0xd0ec, 0x00c0, 0x4b04, 0x2061, 0x73c0, 0x2069,
-       0x4e80, 0xc7fd, 0x0078, 0x4af0, 0x7814, 0xd0e4, 0x00c0, 0x4b08,
-       0x7810, 0xd0cc, 0x0040, 0x4b1b, 0xd0ac, 0x00c0, 0x4b14, 0xd0a4,
-       0x0040, 0x4b1b, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0068, 0x4b1a,
-       0x1078, 0x2395, 0x007c, 0x2091, 0x8001, 0x007c, 0x7840, 0x8001,
-       0x7842, 0x00c0, 0x4b87, 0x7844, 0x7842, 0x2069, 0x4e40, 0xc7fc,
-       0x7810, 0x2079, 0x0200, 0xd0ec, 0x0040, 0x4b30, 0x2079, 0x0100,
-       0x68d8, 0xa005, 0x0040, 0x4b3c, 0x7de0, 0xa504, 0x00c0, 0x4b3c,
-       0x68da, 0x68d4, 0xc0bc, 0x68d6, 0x2079, 0x4e00, 0x6810, 0xa005,
-       0x00c0, 0x4b44, 0x2001, 0x0101, 0x8001, 0x6812, 0xd7fc, 0x0040,
-       0x4b4d, 0xa080, 0x94d0, 0x0078, 0x4b4f, 0xa080, 0x93c0, 0x2040,
-       0x2004, 0xa065, 0x0040, 0x4b79, 0x6024, 0xa005, 0x0040, 0x4b75,
-       0x8001, 0x6026, 0x00c0, 0x4b75, 0x6800, 0xa005, 0x0040, 0x4b68,
-       0x684c, 0xac06, 0x00c0, 0x4b68, 0x1078, 0x4c23, 0x0078, 0x4b79,
-       0x6864, 0xa005, 0x0040, 0x4b70, 0x6027, 0x0001, 0x0078, 0x4b75,
-       0x1078, 0x4bd6, 0x2804, 0x0078, 0x4b51, 0x6000, 0x2c40, 0x0078,
-       0x4b51, 0xd7fc, 0x00c0, 0x4b87, 0x7810, 0xd0ec, 0x00c0, 0x4b87,
-       0x2069, 0x4e80, 0xc7fd, 0x2079, 0x0100, 0x0078, 0x4b30, 0x007c,
-       0x2009, 0x0000, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0040, 0x4bc2,
-       0x6024, 0xa005, 0x0040, 0x4b98, 0x8001, 0x6026, 0x0078, 0x4bc0,
-       0x6008, 0xc09c, 0xd084, 0x00c0, 0x4ba0, 0xd0ac, 0x0040, 0x4bba,
-       0x600a, 0x6004, 0xa005, 0x0040, 0x4bc2, 0x0d7e, 0x0c7e, 0x017e,
-       0x2068, 0x6010, 0x8001, 0x6012, 0x1078, 0x3dd0, 0x2d00, 0x2c68,
-       0x2060, 0x1078, 0x1e5b, 0x1078, 0x201d, 0x017f, 0x0c7f, 0x0d7f,
-       0x0078, 0x4bc2, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0078, 0x4bc2,
-       0xa18d, 0x0100, 0xace0, 0x0010, 0x00f0, 0x4b8c, 0xa184, 0x0001,
-       0x0040, 0x4bd1, 0xa18c, 0xfffe, 0x690e, 0x1078, 0x2628, 0x0078,
-       0x4bd2, 0x690e, 0x007c, 0x00c0, 0x4bd2, 0x786c, 0x2c00, 0x687e,
-       0x6714, 0x6f76, 0x6017, 0x0000, 0x602b, 0x0000, 0x601b, 0x0006,
-       0x60b4, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085,
-       0x0060, 0x6022, 0x6000, 0x2042, 0x1078, 0x1de4, 0x6818, 0xa005,
-       0x0040, 0x4bf4, 0x8001, 0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810,
-       0x7908, 0x8109, 0x790a, 0x8001, 0x00d0, 0x4c00, 0x1078, 0x296b,
-       0x6812, 0x00c0, 0x4c06, 0x7910, 0xc1a5, 0x7912, 0x602f, 0x0000,
-       0x6033, 0x0000, 0x2c68, 0x1078, 0x202c, 0xd7fc, 0x00c0, 0x4c14,
-       0x2069, 0x4e40, 0x0078, 0x4c16, 0x2069, 0x4e80, 0x6910, 0xa184,
-       0x0100, 0x2001, 0x0006, 0x00c0, 0x4c20, 0x697a, 0x2001, 0x0004,
-       0x1078, 0x261c, 0x007c, 0x0d7e, 0x694c, 0x2160, 0xd7fc, 0x00c0,
-       0x4c35, 0x7810, 0xd0ec, 0x0040, 0x4c31, 0x2069, 0x0100, 0x0078,
-       0x4c37, 0x2069, 0x0200, 0x0078, 0x4c37, 0x2069, 0x0100, 0x1078,
-       0x28df, 0x601b, 0x0006, 0x6858, 0xa084, 0x3f00, 0x601e, 0x6020,
-       0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f, 0x0000, 0x6033,
-       0x0000, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, 0x0040,
-       0x4c69, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xd094, 0x0040,
-       0x4c5b, 0x00f0, 0x4c55, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848,
-       0xd084, 0x0040, 0x4c65, 0x00f0, 0x4c5f, 0x20a9, 0x00fa, 0x00f0,
-       0x4c67, 0x681b, 0x0047, 0x0d7f, 0x6867, 0x0007, 0x007c, 0x2079,
-       0x4e00, 0x1078, 0x4ca3, 0x1078, 0x4c89, 0x1078, 0x4c96, 0x2009,
-       0x0002, 0x2069, 0x4e80, 0x680f, 0x0000, 0x6813, 0x0000, 0x6817,
-       0x0000, 0x8109, 0x0040, 0x4c88, 0x2069, 0x4e40, 0x0078, 0x4c7b,
-       0x007c, 0x7810, 0xd0ec, 0x0040, 0x4c91, 0x2019, 0x00cc, 0x0078,
-       0x4c93, 0x2019, 0x007b, 0x7b3a, 0x7b3e, 0x007c, 0x7814, 0xd0e4,
-       0x00c0, 0x4c9e, 0x2019, 0x0040, 0x0078, 0x4ca0, 0x2019, 0x0026,
-       0x7b42, 0x7b46, 0x007c, 0x7814, 0xd0e4, 0x00c0, 0x4cab, 0x2019,
-       0x3f94, 0x0078, 0x4cad, 0x2019, 0x2624, 0x7b32, 0x7b36, 0x007c,
-       0x6a50, 0xa285, 0x0000, 0x0040, 0x4cdc, 0x6954, 0x6bc0, 0xa300,
-       0x0c7e, 0x2164, 0x6304, 0x83ff, 0x00c0, 0x4cc8, 0x8211, 0x0040,
-       0x4ccc, 0x8108, 0xa11a, 0x0048, 0x4cb9, 0x69c0, 0x0078, 0x4cb9,
-       0x68d3, 0x000a, 0x0c7f, 0x007c, 0x6950, 0x6ac0, 0x2264, 0x602b,
-       0x0000, 0x602f, 0x0000, 0x6008, 0xc0b5, 0x600a, 0x8210, 0x8109,
-       0x00c0, 0x4cce, 0x6952, 0x0c7f, 0x007c, 0x00e0, 0x4cdd, 0x2091,
-       0x6000, 0x00e0, 0x4ce1, 0x2091, 0x6000, 0x70ec, 0xd0dc, 0x00c0,
-       0x4cee, 0xd0d4, 0x0040, 0x4d17, 0x0078, 0x4d1a, 0x2008, 0x7810,
-       0xd0ec, 0x0040, 0x4d01, 0xd1c4, 0x00c0, 0x4d39, 0x7814, 0xc0c5,
-       0x7816, 0x7810, 0xc0f5, 0x7812, 0xd0ec, 0x0040, 0x4d35, 0x0078,
-       0x4d31, 0xae8e, 0x0100, 0x0040, 0x4d0e, 0x7814, 0xc0f5, 0xc0c5,
-       0x7816, 0xd0d4, 0x00c0, 0x4d35, 0x0078, 0x4d31, 0x7814, 0xc0fd,
-       0xc0c5, 0x7816, 0xd0d4, 0x00c0, 0x4d35, 0x0078, 0x4d31, 0xd0e4,
-       0x0040, 0x4d37, 0x00e0, 0x4d1a, 0x2091, 0x6000, 0x2009, 0x000c,
-       0x00e0, 0x4d20, 0x2091, 0x6000, 0x8109, 0x00c0, 0x4d20, 0x70e4,
-       0xa084, 0x01ff, 0xa086, 0x01ff, 0x00c0, 0x4d31, 0x70ec, 0x0078,
-       0x4cee, 0x7804, 0xd08c, 0x0040, 0x4d37, 0x681f, 0x000c, 0x70a0,
-       0x70a2, 0x007c, 0x205b
+       0x0d7f, 0x7e20, 0xb284, 0x0100, 0x00c0, 0x494f, 0x7e24, 0xa6b5,
+       0x000c, 0x681c, 0xd0ac, 0x00c0, 0x495a, 0xc685, 0x7003, 0x0000,
+       0x7007, 0x0004, 0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f,
+       0xa7b8, 0x46f2, 0x273c, 0x87fb, 0x00c0, 0x4970, 0x0048, 0x496a,
+       0x1078, 0x29b2, 0x689c, 0xa065, 0x0040, 0x4974, 0x0078, 0x495d,
+       0x1078, 0x49f2, 0x00c0, 0x4970, 0x127f, 0x2000, 0x007c, 0x127e,
+       0x007e, 0x017e, 0x0d7e, 0x70d4, 0xa084, 0x4600, 0x8004, 0x007e,
+       0x2090, 0x007f, 0x7e20, 0xb284, 0x0100, 0x00c0, 0x4988, 0x7e24,
+       0x0d7f, 0x037f, 0x047f, 0xa6b5, 0x000c, 0x681c, 0xd0b4, 0x0040,
+       0x4996, 0xc685, 0x7003, 0x0000, 0x7007, 0x0004, 0x2049, 0x4977,
+       0x6828, 0xa055, 0x0d7e, 0x0040, 0x49ee, 0x2d70, 0x2e60, 0x7004,
+       0xa0bc, 0x000f, 0xa7b8, 0x46f2, 0x273c, 0x87fb, 0x00c0, 0x49b3,
+       0x0048, 0x49ac, 0x1078, 0x29b2, 0x709c, 0xa075, 0x2060, 0x0040,
+       0x49ee, 0x0078, 0x499f, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c,
+       0xa31b, 0x0048, 0x49cc, 0x8a51, 0x00c0, 0x49c0, 0x1078, 0x29b2,
+       0x8738, 0x2704, 0xa005, 0x00c0, 0x49b4, 0x709c, 0xa075, 0x2060,
+       0x0040, 0x49ee, 0x0078, 0x499f, 0x8422, 0x8420, 0x831a, 0xa399,
+       0x0000, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x00c8,
+       0x49db, 0x1078, 0x29b2, 0xb284, 0x0100, 0x0040, 0x49e9, 0x2001,
+       0x4f04, 0x2004, 0xd0ec, 0x00c0, 0x49e9, 0x2071, 0x0050, 0x0078,
+       0x49eb, 0x2071, 0x0020, 0x0d7f, 0x0078, 0x48fc, 0x0d7f, 0x127f,
+       0x2000, 0x007c, 0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040,
+       0x49fb, 0xa006, 0x007c, 0xa084, 0x0003, 0xa086, 0x0003, 0x00c0,
+       0x4a02, 0x007c, 0x2704, 0xac78, 0x7800, 0x701a, 0x7804, 0x701e,
+       0x7808, 0x7012, 0x780c, 0x7016, 0x6004, 0xd09c, 0x0040, 0x4a14,
+       0x7810, 0x7022, 0x7814, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010,
+       0xc085, 0x7006, 0x2079, 0x4f00, 0x8738, 0x8a51, 0x0040, 0x4a40,
+       0x2704, 0xa005, 0x00c0, 0x4a32, 0x609c, 0xa005, 0x0040, 0x4a41,
+       0x2060, 0x6004, 0xa084, 0x000f, 0xa080, 0x46f2, 0x203c, 0x87fb,
+       0x1040, 0x29b2, 0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040,
+       0x4a3c, 0xa006, 0x0078, 0x4a41, 0xa084, 0x0003, 0xa086, 0x0003,
+       0x007c, 0x2051, 0x0000, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x70d4,
+       0xa084, 0x4600, 0x8004, 0x2090, 0x0d7f, 0x087f, 0x7108, 0xa184,
+       0x0003, 0x00c0, 0x4a59, 0x6828, 0xa005, 0x0040, 0x4a69, 0x0078,
+       0x4602, 0x7108, 0xd1fc, 0x0040, 0x4a61, 0x1078, 0x47ed, 0x0078,
+       0x4a4e, 0x7007, 0x0010, 0x7108, 0xd1fc, 0x0040, 0x4a63, 0x1078,
+       0x47ed, 0x7008, 0xa086, 0x0008, 0x00c0, 0x4a4e, 0x7000, 0xa005,
+       0x00c0, 0x4a4e, 0x7003, 0x0000, 0x2049, 0x0000, 0x007e, 0x7804,
+       0xd0cc, 0x0040, 0x4a7d, 0x1078, 0x4acc, 0x007f, 0x127f, 0x2000,
+       0x007c, 0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x70d4,
+       0xa084, 0x4600, 0x8004, 0x2090, 0x0d7f, 0x2049, 0x4a81, 0xad80,
+       0x0011, 0x20a0, 0xb284, 0x0100, 0x0040, 0x4aa4, 0x2001, 0x4f04,
+       0x2004, 0xd0ec, 0x0040, 0x4aa0, 0x2099, 0x0031, 0x0078, 0x4aa6,
+       0x2099, 0x0032, 0x0078, 0x4aa6, 0x2099, 0x0031, 0x700c, 0xa084,
+       0x03ff, 0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001,
+       0x0040, 0x4ab5, 0x8000, 0x80ac, 0x53a5, 0x700c, 0xa084, 0x03ff,
+       0x0040, 0x4ac1, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
+       0x4abc, 0x0c7f, 0x2049, 0x0000, 0x7003, 0x0000, 0x157f, 0x137f,
+       0x147f, 0x127f, 0x2000, 0x007c, 0x6814, 0xd0fc, 0x0040, 0x4b11,
+       0x7000, 0xd084, 0x0040, 0x4b11, 0x7e24, 0xa6b5, 0x0004, 0x7007,
+       0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4ad9, 0x7118, 0x017e,
+       0x711c, 0x017e, 0x7120, 0x017e, 0x7124, 0x017e, 0xa00e, 0x711a,
+       0x701f, 0x3fff, 0x7122, 0x7126, 0x7013, 0x0004, 0x7116, 0x7602,
+       0x7007, 0x0001, 0x2001, 0xffff, 0x2009, 0x0031, 0x200a, 0x200a,
+       0x7108, 0x7008, 0xa106, 0x00c0, 0x4af8, 0xd1fc, 0x0040, 0x4af8,
+       0x027f, 0x7226, 0x027f, 0x7222, 0x027f, 0x721e, 0x027f, 0x721a,
+       0x7007, 0x0002, 0x7008, 0xa086, 0x0008, 0x0040, 0x4b11, 0x0078,
+       0x4830, 0x7007, 0x0004, 0x7003, 0x0000, 0x007c, 0x2091, 0x8000,
+       0x2091, 0x6000, 0x78ac, 0xa005, 0x00c0, 0x4b2d, 0x7974, 0x70d0,
+       0xa106, 0x00c0, 0x4b2d, 0x781c, 0xa005, 0x0040, 0x4b2d, 0x781f,
+       0x0000, 0x0068, 0x4b2d, 0x2091, 0x4080, 0x7830, 0x8001, 0x7832,
+       0x00c0, 0x4bb5, 0x7834, 0x7832, 0x7810, 0xd0ec, 0x00c0, 0x4bae,
+       0x2061, 0x74c0, 0x2069, 0x4f80, 0xc7fd, 0x68d0, 0xa005, 0x0040,
+       0x4b47, 0x8001, 0x68d2, 0x00c0, 0x4b47, 0x1078, 0x4d83, 0x6800,
+       0xa084, 0x000f, 0x0040, 0x4b5c, 0xa086, 0x0001, 0x0040, 0x4b5c,
+       0x6844, 0xa00d, 0x0040, 0x4b5c, 0x2104, 0xa005, 0x0040, 0x4b5c,
+       0x8001, 0x200a, 0x0040, 0x4cf6, 0x6814, 0xa005, 0x0040, 0x4b81,
+       0x8001, 0x6816, 0x00c0, 0x4b81, 0x68a7, 0x0001, 0x0f7e, 0xd7fc,
+       0x00c0, 0x4b76, 0x7810, 0xd0ec, 0x0040, 0x4b72, 0x2079, 0x0100,
+       0x0078, 0x4b78, 0x2079, 0x0200, 0x0078, 0x4b78, 0x2079, 0x0100,
+       0x1078, 0x43d3, 0x0f7f, 0x6864, 0xa005, 0x0040, 0x4b81, 0x1078,
+       0x266f, 0x6880, 0xa005, 0x0040, 0x4b8e, 0x8001, 0x6882, 0x00c0,
+       0x4b8e, 0x6867, 0x0000, 0x68d4, 0xc0dd, 0x68d6, 0x68d4, 0xd0fc,
+       0x0040, 0x4bab, 0xc0fc, 0x68d6, 0x20a9, 0x0200, 0x6034, 0xa005,
+       0x0040, 0x4ba7, 0x8001, 0x6036, 0x68d4, 0xc0fd, 0x68d6, 0x00c0,
+       0x4ba7, 0x6010, 0xa005, 0x0040, 0x4ba7, 0x1078, 0x266f, 0xace0,
+       0x0010, 0x00f0, 0x4b96, 0xd7fc, 0x0040, 0x4bb5, 0x2061, 0x54c0,
+       0x2069, 0x4f40, 0xc7fc, 0x0078, 0x4b3d, 0x1078, 0x4bf1, 0x7838,
+       0x8001, 0x783a, 0x00c0, 0x4bd7, 0x783c, 0x783a, 0x2061, 0x54c0,
+       0x2069, 0x4f40, 0xc7fc, 0x680c, 0xa005, 0x0040, 0x4bc9, 0x1078,
+       0x4c5b, 0xd7fc, 0x00c0, 0x4bd7, 0x7810, 0xd0ec, 0x00c0, 0x4bd7,
+       0x2061, 0x74c0, 0x2069, 0x4f80, 0xc7fd, 0x0078, 0x4bc3, 0x7814,
+       0xd0e4, 0x00c0, 0x4bdb, 0x7810, 0xd0cc, 0x0040, 0x4bee, 0xd0ac,
+       0x00c0, 0x4be7, 0xd0a4, 0x0040, 0x4bee, 0xc0ad, 0x7812, 0x2091,
+       0x8001, 0x0068, 0x4bed, 0x1078, 0x23dc, 0x007c, 0x2091, 0x8001,
+       0x007c, 0x7840, 0x8001, 0x7842, 0x00c0, 0x4c5a, 0x7844, 0x7842,
+       0x2069, 0x4f40, 0xc7fc, 0x7810, 0x2079, 0x0200, 0xd0ec, 0x0040,
+       0x4c03, 0x2079, 0x0100, 0x68d8, 0xa005, 0x0040, 0x4c0f, 0x7de0,
+       0xa504, 0x00c0, 0x4c0f, 0x68da, 0x68d4, 0xc0bc, 0x68d6, 0x2079,
+       0x4f00, 0x6810, 0xa005, 0x00c0, 0x4c17, 0x2001, 0x0101, 0x8001,
+       0x6812, 0xd7fc, 0x0040, 0x4c20, 0xa080, 0x95d0, 0x0078, 0x4c22,
+       0xa080, 0x94c0, 0x2040, 0x2004, 0xa065, 0x0040, 0x4c4c, 0x6024,
+       0xa005, 0x0040, 0x4c48, 0x8001, 0x6026, 0x00c0, 0x4c48, 0x6800,
+       0xa005, 0x0040, 0x4c3b, 0x684c, 0xac06, 0x00c0, 0x4c3b, 0x1078,
+       0x4cf6, 0x0078, 0x4c4c, 0x6864, 0xa005, 0x0040, 0x4c43, 0x6027,
+       0x0001, 0x0078, 0x4c48, 0x1078, 0x4ca9, 0x2804, 0x0078, 0x4c24,
+       0x6000, 0x2c40, 0x0078, 0x4c24, 0xd7fc, 0x00c0, 0x4c5a, 0x7810,
+       0xd0ec, 0x00c0, 0x4c5a, 0x2069, 0x4f80, 0xc7fd, 0x2079, 0x0100,
+       0x0078, 0x4c03, 0x007c, 0x2009, 0x0000, 0x20a9, 0x0200, 0x6008,
+       0xd09c, 0x0040, 0x4c95, 0x6024, 0xa005, 0x0040, 0x4c6b, 0x8001,
+       0x6026, 0x0078, 0x4c93, 0x6008, 0xc09c, 0xd084, 0x00c0, 0x4c73,
+       0xd0ac, 0x0040, 0x4c8d, 0x600a, 0x6004, 0xa005, 0x0040, 0x4c95,
+       0x0d7e, 0x0c7e, 0x017e, 0x2068, 0x6010, 0x8001, 0x6012, 0x1078,
+       0x3e19, 0x2d00, 0x2c68, 0x2060, 0x1078, 0x1ea2, 0x1078, 0x2064,
+       0x017f, 0x0c7f, 0x0d7f, 0x0078, 0x4c95, 0xc0bd, 0x600a, 0xa18d,
+       0x0001, 0x0078, 0x4c95, 0xa18d, 0x0100, 0xace0, 0x0010, 0x00f0,
+       0x4c5f, 0xa184, 0x0001, 0x0040, 0x4ca4, 0xa18c, 0xfffe, 0x690e,
+       0x1078, 0x266f, 0x0078, 0x4ca5, 0x690e, 0x007c, 0x00c0, 0x4ca5,
+       0x786c, 0x2c00, 0x687e, 0x6714, 0x6f76, 0x6017, 0x0000, 0x602b,
+       0x0000, 0x601b, 0x0006, 0x60b4, 0xa084, 0x3f00, 0x601e, 0x6020,
+       0xa084, 0x00ff, 0xa085, 0x0060, 0x6022, 0x6000, 0x2042, 0x1078,
+       0x1e2b, 0x6818, 0xa005, 0x0040, 0x4cc7, 0x8001, 0x681a, 0x6808,
+       0xc0a4, 0x680a, 0x6810, 0x7908, 0x8109, 0x790a, 0x8001, 0x00d0,
+       0x4cd3, 0x1078, 0x29b2, 0x6812, 0x00c0, 0x4cd9, 0x7910, 0xc1a5,
+       0x7912, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x1078, 0x2073,
+       0xd7fc, 0x00c0, 0x4ce7, 0x2069, 0x4f40, 0x0078, 0x4ce9, 0x2069,
+       0x4f80, 0x6910, 0xa184, 0x0100, 0x2001, 0x0006, 0x00c0, 0x4cf3,
+       0x697a, 0x2001, 0x0004, 0x1078, 0x2663, 0x007c, 0x0d7e, 0x694c,
+       0x2160, 0xd7fc, 0x00c0, 0x4d08, 0x7810, 0xd0ec, 0x0040, 0x4d04,
+       0x2069, 0x0100, 0x0078, 0x4d0a, 0x2069, 0x0200, 0x0078, 0x4d0a,
+       0x2069, 0x0100, 0x1078, 0x2926, 0x601b, 0x0006, 0x6858, 0xa084,
+       0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0048, 0x6022,
+       0x602f, 0x0000, 0x6033, 0x0000, 0x6808, 0xa084, 0xfffd, 0x680a,
+       0x6830, 0xd0b4, 0x0040, 0x4d3c, 0x684b, 0x0004, 0x20a9, 0x0014,
+       0x6848, 0xd094, 0x0040, 0x4d2e, 0x00f0, 0x4d28, 0x684b, 0x0009,
+       0x20a9, 0x0014, 0x6848, 0xd084, 0x0040, 0x4d38, 0x00f0, 0x4d32,
+       0x20a9, 0x00fa, 0x00f0, 0x4d3a, 0x681b, 0x0047, 0x0d7f, 0x6867,
+       0x0007, 0x007c, 0x2079, 0x4f00, 0x1078, 0x4d76, 0x1078, 0x4d5c,
+       0x1078, 0x4d69, 0x2009, 0x0002, 0x2069, 0x4f80, 0x680f, 0x0000,
+       0x6813, 0x0000, 0x6817, 0x0000, 0x8109, 0x0040, 0x4d5b, 0x2069,
+       0x4f40, 0x0078, 0x4d4e, 0x007c, 0x7810, 0xd0ec, 0x0040, 0x4d64,
+       0x2019, 0x00cc, 0x0078, 0x4d66, 0x2019, 0x007b, 0x7b3a, 0x7b3e,
+       0x007c, 0x7814, 0xd0e4, 0x00c0, 0x4d71, 0x2019, 0x0040, 0x0078,
+       0x4d73, 0x2019, 0x0026, 0x7b42, 0x7b46, 0x007c, 0x7814, 0xd0e4,
+       0x00c0, 0x4d7e, 0x2019, 0x3f94, 0x0078, 0x4d80, 0x2019, 0x2624,
+       0x7b32, 0x7b36, 0x007c, 0x6a50, 0xa285, 0x0000, 0x0040, 0x4daf,
+       0x6954, 0x6bc0, 0xa300, 0x0c7e, 0x2164, 0x6304, 0x83ff, 0x00c0,
+       0x4d9b, 0x8211, 0x0040, 0x4d9f, 0x8108, 0xa11a, 0x0048, 0x4d8c,
+       0x69c0, 0x0078, 0x4d8c, 0x68d3, 0x000a, 0x0c7f, 0x007c, 0x6950,
+       0x6ac0, 0x2264, 0x602b, 0x0000, 0x602f, 0x0000, 0x6008, 0xc0b5,
+       0x600a, 0x8210, 0x8109, 0x00c0, 0x4da1, 0x6952, 0x0c7f, 0x007c,
+       0x00e0, 0x4db0, 0x2091, 0x6000, 0x00e0, 0x4db4, 0x2091, 0x6000,
+       0x70ec, 0xd0dc, 0x00c0, 0x4dc1, 0xd0d4, 0x0040, 0x4dea, 0x0078,
+       0x4ded, 0x2008, 0x7810, 0xd0ec, 0x0040, 0x4dd4, 0xd1c4, 0x00c0,
+       0x4e0e, 0x7814, 0xc0c5, 0x7816, 0x7810, 0xc0f5, 0x7812, 0xd0ec,
+       0x0040, 0x4e0a, 0x0078, 0x4e06, 0xae8e, 0x0100, 0x0040, 0x4de1,
+       0x7814, 0xc0f5, 0xc0c5, 0x7816, 0xd0d4, 0x00c0, 0x4e0a, 0x0078,
+       0x4e06, 0x7814, 0xc0fd, 0xc0c5, 0x7816, 0xd0d4, 0x00c0, 0x4e0a,
+       0x0078, 0x4e06, 0xd0e4, 0x0040, 0x4e0c, 0x00e0, 0x4ded, 0x2091,
+       0x6000, 0x2009, 0x000c, 0x00e0, 0x4df3, 0x2091, 0x6000, 0x8109,
+       0x00c0, 0x4df3, 0x70e4, 0xa084, 0x01ff, 0xa086, 0x01ff, 0x00c0,
+       0x4e04, 0x70ec, 0x0078, 0x4dc1, 0x1078, 0x4e0f, 0x7804, 0xd08c,
+       0x0040, 0x4e0c, 0x681f, 0x000c, 0x70a0, 0x70a2, 0x007c, 0x7910,
+       0xd1ec, 0x0040, 0x4e19, 0x7814, 0xc0c4, 0xc1f4, 0x7912, 0x0078,
+       0x4e2b, 0xae8e, 0x0100, 0x0040, 0x4e25, 0x7814, 0xc0f4, 0xd0fc,
+       0x00c0, 0x4e2b, 0xc0c4, 0x0078, 0x4e2b, 0x7814, 0xc0fc, 0xd0f4,
+       0x00c0, 0x4e2b, 0xc0c4, 0x7816, 0x007c, 0x14e3
 };
 #ifdef UNIQUE_FW_NAME
-static unsigned short   fw1280ei_length01 = 0x3d3b;
+static unsigned short fw1280ei_length01 = 0x3e2e;
 #else
-static unsigned short   risc_code_length01 = 0x3d3b;
+static unsigned short risc_code_length01 = 0x3e2e;
 #endif
+
index 4ad28081499085c859be8b32eec825217cd5d90b..1a4ce1c39478b02af8cb637a7531f4842d299f4e 100644 (file)
@@ -1098,7 +1098,13 @@ qla1280_error_action(struct scsi_cmnd *cmd, enum action action)
 static int
 qla1280_eh_abort(struct scsi_cmnd * cmd)
 {
-       return qla1280_error_action(cmd, ABORT_COMMAND);
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = qla1280_error_action(cmd, ABORT_COMMAND);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
 }
 
 /**************************************************************************
@@ -1108,7 +1114,13 @@ qla1280_eh_abort(struct scsi_cmnd * cmd)
 static int
 qla1280_eh_device_reset(struct scsi_cmnd *cmd)
 {
-       return qla1280_error_action(cmd, DEVICE_RESET);
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = qla1280_error_action(cmd, DEVICE_RESET);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
 }
 
 /**************************************************************************
@@ -1118,7 +1130,13 @@ qla1280_eh_device_reset(struct scsi_cmnd *cmd)
 static int
 qla1280_eh_bus_reset(struct scsi_cmnd *cmd)
 {
-       return qla1280_error_action(cmd, BUS_RESET);
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = qla1280_error_action(cmd, BUS_RESET);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
 }
 
 /**************************************************************************
@@ -1128,7 +1146,13 @@ qla1280_eh_bus_reset(struct scsi_cmnd *cmd)
 static int
 qla1280_eh_adapter_reset(struct scsi_cmnd *cmd)
 {
-       return qla1280_error_action(cmd, ADAPTER_RESET);
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = qla1280_error_action(cmd, ADAPTER_RESET);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
 }
 
 static int
@@ -4038,11 +4062,10 @@ qla1280_status_entry(struct scsi_qla_host *ha, struct response *pkt,
                        scsi_status, handle);
        }
 
-       /* Target busy */
-       if (scsi_status & SS_BUSY_CONDITION &&
-           scsi_status != SS_RESERVE_CONFLICT) {
-               CMD_RESULT(cmd) =
-                       DID_BUS_BUSY << 16 | (scsi_status & 0xff);
+       /* Target busy or queue full */
+       if ((scsi_status & 0xFF) == SAM_STAT_TASK_SET_FULL ||
+           (scsi_status & 0xFF) == SAM_STAT_BUSY) {
+               CMD_RESULT(cmd) = scsi_status & 0xff;
        } else {
 
                /* Save ISP completion status */
index c4cd4ac414c4f1982ede841a50f54948a478ae65..329d1a1fa5470ded71b02538c2ee4f592295cafd 100644 (file)
@@ -1063,8 +1063,7 @@ qla2x00_print_scsi_cmd(struct scsi_cmnd * cmd)
                return;
 
        printk("  sp flags=0x%x\n", sp->flags);
-       printk("  r_start=0x%lx, u_start=0x%lx, f_start=0x%lx, state=%d\n",
-           sp->r_start, sp->u_start, sp->f_start, sp->state);
+       printk("  state=%d\n", sp->state);
 }
 
 #if defined(QL_DEBUG_ROUTINES)
index 7d47b8d9204716ad22e7c0d2a2263e45884b3c1c..83a32e403e29424cef85ffffe5e15a478038206d 100644 (file)
@@ -252,31 +252,12 @@ typedef struct srb {
        /* Request state */
        uint16_t state;
 
-       /* Timing counts. */
-       unsigned long e_start;          /* Start of extend timeout */
-       unsigned long r_start;          /* Start of request */
-       unsigned long u_start;          /* When sent to RISC */
-       unsigned long f_start;          /* When placed in FO queue*/
-
        /* Single transfer DMA context */
        dma_addr_t dma_handle;
 
        uint32_t request_sense_length;
        uint8_t *request_sense_ptr;
 
-       int ext_history;
-
-       /* Suspend delay */
-       int delay;
-
-       /* Raw completion info for use by failover ? */
-       uint8_t fo_retry_cnt;           /* Retry count this request */
-       uint8_t err_id;                 /* error id */
-#define SRB_ERR_PORT   1               /* Request failed -- "port down" */
-#define SRB_ERR_LOOP   2               /* Request failed -- "loop down" */
-#define SRB_ERR_DEVICE 3               /* Request failed -- "device error" */
-#define SRB_ERR_OTHER  4
-
        /* SRB magic number */
        uint16_t magic;
 #define SRB_MAGIC       0x10CB
@@ -2082,23 +2063,8 @@ typedef struct scsi_qla_host {
        uint32_t        current_outstanding_cmd; 
        srb_t           *status_srb;    /* Status continuation entry. */
 
-       unsigned long   last_irq_cpu;   /* cpu where we got our last irq */
-
        uint16_t           revision;
        uint8_t           ports;
-       u_long            actthreads;
-       u_long            ipreq_cnt;
-       u_long            qthreads;
-
-       uint32_t        total_isr_cnt;          /* Interrupt count */
-       uint32_t        total_isp_aborts;       /* controller err cnt */
-       uint32_t        total_lip_cnt;          /* LIP cnt */
-       uint32_t        total_dev_errs;         /* device error cnt */
-       uint32_t        total_ios;              /* IO cnt */
-       uint64_t        total_bytes;            /* xfr byte cnt */
-       uint32_t        total_mbx_timeout;      /* mailbox timeout cnt */
-       uint32_t        total_loop_resync;      /* loop resyn cnt */
-       uint32_t        dropped_frame_error_cnt;
 
        /* ISP configuration data. */
        uint16_t        loop_id;                /* Host adapter loop id */
@@ -2124,8 +2090,6 @@ typedef struct scsi_qla_host {
 #define P2P_LOOP  3
 
         uint8_t                marker_needed; 
-       uint8_t         sns_retry_cnt;
-       uint8_t         mem_err;
 
        uint8_t         interrupts_on;
 
@@ -2138,16 +2102,11 @@ typedef struct scsi_qla_host {
        uint16_t        nvram_base;
 
        uint16_t        loop_reset_delay;
-       uint16_t        minimum_timeout;
        uint8_t         retry_count;
        uint8_t         login_timeout;
        uint16_t        r_a_tov;
        int             port_down_retry_count;
-       uint8_t         loop_down_timeout;
        uint8_t         mbx_count;
-       uint16_t        max_probe_luns;
-       uint16_t        max_luns;
-       uint16_t        max_targets;
        uint16_t        last_loop_id;
 
         uint32_t       login_retry_count; 
@@ -2181,7 +2140,6 @@ typedef struct scsi_qla_host {
        uint8_t dpc_active;                  /* DPC routine is active */
 
        /* Timeout timers. */
-       uint8_t         queue_restart_timer;   
        uint8_t         loop_down_abort_time;    /* port down timer */
        atomic_t        loop_down_timer;         /* loop down timer */
        uint8_t         link_down_timeout;       /* link down timeout */
@@ -2230,18 +2188,6 @@ typedef struct scsi_qla_host {
 
        mbx_cmd_t       mc;
 
-       uint8_t *cmdline;
-
-       uint32_t failover_type;
-       uint32_t failback_delay;
-       unsigned long   cfg_flags;
-#define        CFG_ACTIVE      0       /* CFG during a failover, event update, or ioctl */
-#define        CFG_FAILOVER    1       /* CFG during path change */
-
-       uint32_t        binding_type;
-#define BIND_BY_PORT_NAME      0
-#define BIND_BY_PORT_ID                1
-
        /* Basic firmware related information. */
        struct qla_board_info   *brd_info;
        uint16_t        fw_major_version;
@@ -2274,12 +2220,6 @@ typedef struct scsi_qla_host {
        uint8_t     nvram_version; 
        uint32_t    isp_abort_cnt;
 
-       /* Adapter I/O statistics for failover */
-       uint64_t        IosRequested;
-       uint64_t        BytesRequested;
-       uint64_t        IosExecuted;
-       uint64_t        BytesExecuted;
-
        /* Needed for BEACON */
        uint16_t        beacon_blink_led;
        uint16_t        beacon_green_on;
index 2efec6c24d60f75aff6fb5721a496eabebcecf2c..164866b199e6acfe2905a792eead245bd1cc3d72 100644 (file)
@@ -53,27 +53,13 @@ extern void qla2x00_reg_remote_port(scsi_qla_host_t *, fc_port_t *);
  */
 extern char qla2x00_version_str[];
 
-extern int num_hosts;
-extern int apiHBAInstance;
-
-extern struct _qla2x00stats qla2x00_stats;
-extern int ql2xretrycount;
 extern int ql2xlogintimeout;
 extern int qlport_down_retry;
-extern int ql2xmaxqdepth;
-extern int displayConfig;
 extern int ql2xplogiabsentdevice;
 extern int ql2xenablezio;
 extern int ql2xintrdelaytimer;
 extern int ql2xloginretrycount;
 
-extern int ConfigRequired;
-
-extern int Bind;
-extern int ql2xsuspendcount;
-#if defined(MODULE)
-extern char *ql2xopts;
-#endif
 extern void qla2x00_sp_compl(scsi_qla_host_t *, srb_t *);
 
 extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *);
index 0387005fcb6df08dc1f4b3c1c9d924eb7cfdfb1e..7629558eba253fcc337b44f537a5a9f1e4bb1305 100644 (file)
@@ -85,9 +85,7 @@ qla2x00_initialize_adapter(scsi_qla_host_t *ha)
        atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME);
        atomic_set(&ha->loop_state, LOOP_DOWN);
        ha->device_flags = 0;
-       ha->sns_retry_cnt = 0;
        ha->dpc_flags = 0;
-       ha->failback_delay = 0;
        ha->flags.management_server_logged_in = 0;
        ha->marker_needed = 0;
        ha->mbx_flags = 0;
@@ -171,8 +169,6 @@ check_fw_ready_again:
 
                                if (wait_time == 0)
                                        rval = QLA_FUNCTION_FAILED;
-                               if (ha->mem_err)
-                                       restart_risc = 1;
                        } else if (ha->device_flags & DFLG_NO_CABLE)
                                /* If no cable, then all is good. */
                                rval = QLA_SUCCESS;
@@ -1410,13 +1406,8 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
        /* Set minimum RATOV to 200 tenths of a second. */
        ha->r_a_tov = 200;
 
-       ha->minimum_timeout =
-           (ha->login_timeout * ha->retry_count) + nv->port_down_retry_count;
        ha->loop_reset_delay = nv->reset_delay;
 
-       /* Will get the value from NVRAM. */
-       ha->loop_down_timeout = LOOP_DOWN_TIMEOUT;
-
        /* Link Down Timeout = 0:
         *
         *      When Port Down timer expires we will start returning
@@ -1429,18 +1420,13 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
         */                                             
        if (nv->link_down_timeout == 0) {
                ha->loop_down_abort_time =
-                   (LOOP_DOWN_TIME - ha->loop_down_timeout);
+                   (LOOP_DOWN_TIME - LOOP_DOWN_TIMEOUT);
        } else {
                ha->link_down_timeout =  nv->link_down_timeout;
                ha->loop_down_abort_time =
                    (LOOP_DOWN_TIME - ha->link_down_timeout);
        } 
 
-       ha->max_luns = MAX_LUNS;
-       ha->max_probe_luns = le16_to_cpu(nv->max_luns_per_target);
-       if (ha->max_probe_luns == 0)
-               ha->max_probe_luns = MIN_LUNS;
-
        /*
         * Need enough time to try and get the port back.
         */
@@ -1457,16 +1443,6 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
        if (ql2xloginretrycount)
                ha->login_retry_count = ql2xloginretrycount;
 
-       ha->binding_type = Bind;
-       if (ha->binding_type != BIND_BY_PORT_NAME &&
-           ha->binding_type != BIND_BY_PORT_ID) {
-               qla_printk(KERN_WARNING, ha,
-                   "Invalid binding type specified (%d), "
-                   "defaulting to BIND_BY_PORT_NAME!!!\n", ha->binding_type);
-
-               ha->binding_type = BIND_BY_PORT_NAME;
-       }
-
        icb->lun_enables = __constant_cpu_to_le16(0);
        icb->command_resource_count = 0;
        icb->immediate_notify_resource_count = 0;
@@ -1578,7 +1554,6 @@ qla2x00_configure_loop(scsi_qla_host_t *ha)
         */
        clear_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags);
        clear_bit(RSCN_UPDATE, &ha->dpc_flags);
-       ha->mem_err = 0 ;
 
        /* Determine what we need to do */
        if (ha->current_topology == ISP_CFG_FL &&
@@ -2707,7 +2682,6 @@ qla2x00_loop_resync(scsi_qla_host_t *ha)
        rval = QLA_SUCCESS;
 
        atomic_set(&ha->loop_state, LOOP_UPDATE);
-       qla2x00_stats.loop_resync++;
        clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags);
        if (ha->flags.online) {
                if (!(rval = qla2x00_fw_ready(ha))) {
@@ -2786,9 +2760,6 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
        if (ha->flags.online) {
                ha->flags.online = 0;
                clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
-               qla2x00_stats.ispAbort++;
-               ha->total_isp_aborts++;  /* used by ioctl */
-               ha->sns_retry_cnt = 0;
 
                qla_printk(KERN_INFO, ha,
                    "Performing ISP error recovery - ha= %p.\n", ha);
@@ -2810,8 +2781,6 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
                        sp = ha->outstanding_cmds[cnt];
                        if (sp) {
                                ha->outstanding_cmds[cnt] = NULL;
-                               if (ha->actthreads)
-                                       ha->actthreads--;
                                sp->flags = 0;
                                sp->cmd->result = DID_RESET << 16;
                                sp->cmd->host_scribble = (unsigned char *)NULL;
index af964bb3d87052c3f61807344f79135339471b9d..ecaf9f83b2d44d4e1efbc88a9624a815266c53a4 100644 (file)
@@ -433,11 +433,8 @@ qla2x00_start_scsi(srb_t *sp)
        } else
                ha->request_ring_ptr++;
 
-       ha->actthreads++;
-       ha->total_ios++;
        sp->flags |= SRB_DMA_VALID;
        sp->state = SRB_ACTIVE_STATE;
-       sp->u_start = jiffies;
 
        /* Set chip new ring index. */
        WRT_REG_WORD(ISP_REQ_Q_IN(ha, reg), ha->req_ring_index);
index 6792cfae56e29cb48a28fcffd4f7a98c03b4fc26..e7a8b74157a53e05c5738ac0d8af3fbe3f3a1b9a 100644 (file)
@@ -91,9 +91,6 @@ qla2100_intr_handler(int irq, void *dev_id, struct pt_regs *regs)
        }
        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
-       ha->last_irq_cpu = _smp_processor_id();
-       ha->total_isr_cnt++;
-
        if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
            (status & MBX_INTERRUPT) && ha->flags.mbox_int) {
                spin_lock_irqsave(&ha->mbx_reg_lock, flags);
@@ -200,9 +197,6 @@ qla2300_intr_handler(int irq, void *dev_id, struct pt_regs *regs)
        }
        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
-       ha->last_irq_cpu = _smp_processor_id();
-       ha->total_isr_cnt++;
-
        if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
            (status & MBX_INTERRUPT) && ha->flags.mbox_int) {
                spin_lock_irqsave(&ha->mbx_reg_lock, flags);
@@ -417,7 +411,6 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint32_t mbx)
                /* Update AEN queue. */
                qla2x00_enqueue_aen(ha, MBA_LIP_OCCURRED, NULL);
 
-               ha->total_lip_cnt++;
                break;
 
        case MBA_LOOP_UP:               /* Loop Up Event */
@@ -485,7 +478,6 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint32_t mbx)
                /* Update AEN queue. */
                qla2x00_enqueue_aen(ha, MBA_LIP_RESET, NULL);
 
-               ha->total_lip_cnt++;
                break;
 
        case MBA_POINT_TO_POINT:        /* Point-to-Point */
@@ -695,14 +687,11 @@ qla2x00_process_completed_request(struct scsi_qla_host *ha, uint32_t index)
                /* Free outstanding command slot. */
                ha->outstanding_cmds[index] = NULL;
 
-               if (ha->actthreads)
-                       ha->actthreads--;
                CMD_COMPL_STATUS(sp->cmd) = 0L;
                CMD_SCSI_STATUS(sp->cmd) = 0L;
 
                /* Save ISP completion status */
                sp->cmd->result = DID_OK << 16;
-               sp->fo_retry_cnt = 0;
                qla2x00_sp_compl(ha, sp);
        } else {
                DEBUG2(printk("scsi(%ld): Invalid ISP SCSI completion handle\n",
@@ -865,9 +854,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha, sts_entry_t *pkt)
                return;
        }
 
-       if (ha->actthreads)
-               ha->actthreads--;
-
        comp_status = le16_to_cpu(pkt->comp_status);
        /* Mask of reserved bits 12-15, before we examine the scsi status */
        scsi_status = le16_to_cpu(pkt->scsi_status) & SS_MASK;
@@ -1026,7 +1012,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha, sts_entry_t *pkt)
                                    cp->request_bufflen));
 
                                cp->result = DID_BUS_BUSY << 16;
-                               ha->dropped_frame_error_cnt++;
                                break;
                        }
 
@@ -1233,8 +1218,7 @@ qla2x00_error_entry(scsi_qla_host_t *ha, sts_entry_t *pkt)
        if (sp) {
                /* Free outstanding command slot. */
                ha->outstanding_cmds[pkt->handle] = NULL;
-               if (ha->actthreads)
-                       ha->actthreads--;
+
                /* Bad payload or header */
                if (pkt->entry_status &
                    (RF_INV_E_ORDER | RF_INV_E_COUNT |
index 15f6acaca30521908b59eb24291c9f54c397d79e..eeaec7c50e6a510c7fc8a9a013a939310f363f39 100644 (file)
@@ -219,10 +219,8 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp)
                ha->flags.mbox_int = 0;
                clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
 
-               if (ha->mailbox_out[0] != MBS_COMMAND_COMPLETE) {
-                       qla2x00_stats.mboxerr++;
+               if (ha->mailbox_out[0] != MBS_COMMAND_COMPLETE)
                        rval = QLA_FUNCTION_FAILED;
-               }
 
                /* Load return mailbox registers. */
                iptr2 = mcp->mb;
@@ -249,8 +247,6 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp)
                qla2x00_dump_regs(ha);
 #endif
 
-               qla2x00_stats.mboxtout++;
-               ha->total_mbx_timeout++;
                rval = QLA_FUNCTION_TIMEOUT;
        }
 
index 579448222d691d77bd656a35fa536d58be3ad417..0b12498b7672b895dd913ec113104b1f5b29165d 100644 (file)
@@ -36,27 +36,12 @@ char qla2x00_version_str[40];
 /*
  * SRB allocation cache
  */
-char srb_cachep_name[16];
-kmem_cache_t *srb_cachep;
-
-/*
- * Stats for all adpaters.
- */
-struct _qla2x00stats qla2x00_stats;
+static kmem_cache_t *srb_cachep;
 
 /*
  * Ioctl related information.
  */
-int num_hosts;
-int apiHBAInstance;
-
-/*
- * Module parameter information and variables
- */
-int ql2xmaxqdepth;
-module_param(ql2xmaxqdepth, int, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(ql2xmaxqdepth,
-               "Maximum queue depth to report for target devices.");
+static int num_hosts;
 
 int ql2xlogintimeout = 20;
 module_param(ql2xlogintimeout, int, S_IRUGO|S_IRUSR);
@@ -69,12 +54,6 @@ MODULE_PARM_DESC(qlport_down_retry,
                "Maximum number of command retries to a port that returns"
                "a PORT-DOWN status.");
 
-int ql2xretrycount = 20;
-module_param(ql2xretrycount, int, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(ql2xretrycount,
-               "Maximum number of mid-layer retries allowed for a command.  "
-               "Default value is 20, ");
-
 int ql2xplogiabsentdevice;
 module_param(ql2xplogiabsentdevice, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(ql2xplogiabsentdevice,
@@ -95,25 +74,6 @@ MODULE_PARM_DESC(ql2xintrdelaytimer,
                "ZIO: Waiting time for Firmware before it generates an "
                "interrupt to the host to notify completion of request.");
 
-int ConfigRequired;
-module_param(ConfigRequired, int, S_IRUGO|S_IRUSR);
-MODULE_PARM_DESC(ConfigRequired,
-               "If 1, then only configured devices passed in through the"
-               "ql2xopts parameter will be presented to the OS");
-
-int Bind = BIND_BY_PORT_NAME;
-module_param(Bind, int, S_IRUGO|S_IRUSR);
-MODULE_PARM_DESC(Bind,
-               "Target persistent binding method: "
-               "0 by Portname (default); 1 by PortID; 2 by Nodename. ");
-
-int ql2xsuspendcount = SUSPEND_COUNT;
-module_param(ql2xsuspendcount, int, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(ql2xsuspendcount,
-               "Number of 6-second suspend iterations to perform while a "
-               "target returns a <NOT READY> status.  Default is 10 "
-               "iterations.");
-
 int ql2xloginretrycount = 0;
 module_param(ql2xloginretrycount, int, S_IRUGO|S_IRUSR);
 MODULE_PARM_DESC(ql2xloginretrycount,
@@ -330,7 +290,6 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
        sp->fcport = fcport;
        sp->cmd = cmd;
        sp->flags = 0;
-       sp->err_id = 0;
 
        CMD_SP(cmd) = (void *)sp;
        cmd->scsi_done = done;
@@ -474,7 +433,6 @@ qla2x00_wait_for_loop_ready(scsi_qla_host_t *ha)
 
        while ((!atomic_read(&ha->loop_down_timer) &&
            atomic_read(&ha->loop_state) == LOOP_DOWN) ||
-           test_bit(CFG_ACTIVE, &ha->cfg_flags) ||
            atomic_read(&ha->loop_state) != LOOP_READY) {
                msleep(1000);
                if (time_after_eq(jiffies, loop_timeout)) {
@@ -507,6 +465,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
        int ret, i;
        unsigned int id, lun;
        unsigned long serial;
+       unsigned long flags;
 
        if (!CMD_SP(cmd))
                return FAILED;
@@ -518,8 +477,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
        serial = cmd->serial_number;
 
        /* Check active list for command command. */
-       spin_unlock_irq(ha->host->host_lock);
-       spin_lock(&ha->hardware_lock);
+       spin_lock_irqsave(&ha->hardware_lock, flags);
        for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) {
                sp = ha->outstanding_cmds[i];
 
@@ -534,7 +492,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
                    sp->state));
                DEBUG3(qla2x00_print_scsi_cmd(cmd);)
 
-               spin_unlock(&ha->hardware_lock);
+               spin_unlock_irqrestore(&ha->hardware_lock, flags);
                if (qla2x00_abort_command(ha, sp)) {
                        DEBUG2(printk("%s(%ld): abort_command "
                            "mbx failed.\n", __func__, ha->host_no));
@@ -543,22 +501,20 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
                            "mbx success.\n", __func__, ha->host_no));
                        ret = SUCCESS;
                }
-               spin_lock(&ha->hardware_lock);
+               spin_lock_irqsave(&ha->hardware_lock, flags);
 
                break;
        }
+       spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
        /* Wait for the command to be returned. */
        if (ret == SUCCESS) {
-               spin_unlock(&ha->hardware_lock);
                if (qla2x00_eh_wait_on_command(ha, cmd) != QLA_SUCCESS) {
                        qla_printk(KERN_ERR, ha, 
                            "scsi(%ld:%d:%d): Abort handler timed out -- %lx "
                            "%x.\n", ha->host_no, id, lun, serial, ret);
                }
-               spin_lock(&ha->hardware_lock);
        }
-       spin_lock_irq(ha->host->host_lock);
 
        qla_printk(KERN_INFO, ha, 
            "scsi(%ld:%d:%d): Abort command issued -- %lx %x.\n", ha->host_no,
@@ -588,6 +544,7 @@ qla2x00_eh_wait_for_pending_target_commands(scsi_qla_host_t *ha, unsigned int t)
        int     status;
        srb_t           *sp;
        struct scsi_cmnd *cmd;
+       unsigned long flags;
 
        status = 0;
 
@@ -596,11 +553,11 @@ qla2x00_eh_wait_for_pending_target_commands(scsi_qla_host_t *ha, unsigned int t)
         * array
         */
        for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) {
-               spin_lock(&ha->hardware_lock);
+               spin_lock_irqsave(&ha->hardware_lock, flags);
                sp = ha->outstanding_cmds[cnt];
                if (sp) {
                        cmd = sp->cmd;
-                       spin_unlock(&ha->hardware_lock);
+                       spin_unlock_irqrestore(&ha->hardware_lock, flags);
                        if (cmd->device->id == t) {
                                if (!qla2x00_eh_wait_on_command(ha, cmd)) {
                                        status = 1;
@@ -608,7 +565,7 @@ qla2x00_eh_wait_for_pending_target_commands(scsi_qla_host_t *ha, unsigned int t)
                                }
                        }
                } else {
-                       spin_unlock(&ha->hardware_lock);
+                       spin_unlock_irqrestore(&ha->hardware_lock, flags);
                }
        }
        return (status);
@@ -657,12 +614,8 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd)
        qla_printk(KERN_INFO, ha,
            "scsi(%ld:%d:%d): DEVICE RESET ISSUED.\n", ha->host_no, id, lun);
 
-       spin_unlock_irq(ha->host->host_lock);
-
-       if (qla2x00_wait_for_hba_online(ha) != QLA_SUCCESS) {
-               spin_lock_irq(ha->host->host_lock);
+       if (qla2x00_wait_for_hba_online(ha) != QLA_SUCCESS)
                goto eh_dev_reset_done;
-       }
 
        if (qla2x00_wait_for_loop_ready(ha) == QLA_SUCCESS) {
                if (qla2x00_device_reset(ha, fcport) == 0)
@@ -713,8 +666,6 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd)
            "scsi(%ld:%d:%d): DEVICE RESET SUCCEEDED.\n", ha->host_no, id, lun);
 
 eh_dev_reset_done:
-       spin_lock_irq(ha->host->host_lock);
-
        return ret;
 }
 
@@ -740,6 +691,7 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *ha)
        int     status;
        srb_t           *sp;
        struct scsi_cmnd *cmd;
+       unsigned long flags;
 
        status = 1;
 
@@ -748,17 +700,17 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *ha)
         * array
         */
        for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) {
-               spin_lock(&ha->hardware_lock);
+               spin_lock_irqsave(&ha->hardware_lock, flags);
                sp = ha->outstanding_cmds[cnt];
                if (sp) {
                        cmd = sp->cmd;
-                       spin_unlock(&ha->hardware_lock);
+                       spin_unlock_irqrestore(&ha->hardware_lock, flags);
                        status = qla2x00_eh_wait_on_command(ha, cmd);
                        if (status == 0)
                                break;
                }
                else {
-                       spin_unlock(&ha->hardware_lock);
+                       spin_unlock_irqrestore(&ha->hardware_lock, flags);
                }
        }
        return (status);
@@ -803,8 +755,6 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd)
        qla_printk(KERN_INFO, ha,
            "scsi(%ld:%d:%d): LOOP RESET ISSUED.\n", ha->host_no, id, lun);
 
-       spin_unlock_irq(ha->host->host_lock);
-
        if (qla2x00_wait_for_hba_online(ha) != QLA_SUCCESS) {
                DEBUG2(printk("%s failed:board disabled\n",__func__));
                goto eh_bus_reset_done;
@@ -826,8 +776,6 @@ eh_bus_reset_done:
        qla_printk(KERN_INFO, ha, "%s: reset %s\n", __func__,
            (ret == FAILED) ? "failed" : "succeded");
 
-       spin_lock_irq(ha->host->host_lock);
-
        return ret;
 }
 
@@ -869,8 +817,6 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd)
        qla_printk(KERN_INFO, ha,
            "scsi(%ld:%d:%d): ADAPTER RESET ISSUED.\n", ha->host_no, id, lun);
 
-       spin_unlock_irq(ha->host->host_lock);
-
        if (qla2x00_wait_for_hba_online(ha) != QLA_SUCCESS)
                goto eh_host_reset_lock;
 
@@ -899,8 +845,6 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd)
                ret = SUCCESS;
 
 eh_host_reset_lock:
-       spin_lock_irq(ha->host->host_lock);
-
        qla_printk(KERN_INFO, ha, "%s: reset %s\n", __func__,
            (ret == FAILED) ? "failed" : "succeded");
 
@@ -1148,7 +1092,7 @@ iospace_error_exit:
  */
 int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
 {
-       int     ret;
+       int     ret = -ENODEV;
        device_reg_t __iomem *reg;
        struct Scsi_Host *host;
        scsi_qla_host_t *ha;
@@ -1159,7 +1103,7 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
        fc_port_t *fcport;
 
        if (pci_enable_device(pdev))
-               return -1;
+               goto probe_out;
 
        host = scsi_host_alloc(&qla2x00_driver_template,
            sizeof(scsi_qla_host_t));
@@ -1181,9 +1125,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
 
        /* Configure PCI I/O space */
        ret = qla2x00_iospace_config(ha);
-       if (ret != 0) {
-               goto probe_alloc_failed;
-       }
+       if (ret)
+               goto probe_failed;
 
        /* Sanitize the information from PCI BIOS. */
        host->irq = pdev->irq;
@@ -1194,34 +1137,24 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
 
        spin_lock_init(&ha->hardware_lock);
 
-       /* 4.23 Initialize /proc/scsi/qla2x00 counters */
-       ha->actthreads = 0;
-       ha->qthreads   = 0;
-       ha->total_isr_cnt = 0;
-       ha->total_isp_aborts = 0;
-       ha->total_lip_cnt = 0;
-       ha->total_dev_errs = 0;
-       ha->total_ios = 0;
-       ha->total_bytes = 0;
-
        ha->prev_topology = 0;
        ha->ports = MAX_BUSES;
 
        if (IS_QLA2100(ha)) {
-               ha->max_targets = MAX_TARGETS_2100;
+               host->max_id = MAX_TARGETS_2100;
                ha->mbx_count = MAILBOX_REGISTER_COUNT_2100;
                ha->request_q_length = REQUEST_ENTRY_CNT_2100;
                ha->response_q_length = RESPONSE_ENTRY_CNT_2100;
                ha->last_loop_id = SNS_LAST_LOOP_ID_2100;
                host->sg_tablesize = 32;
        } else if (IS_QLA2200(ha)) {
-               ha->max_targets = MAX_TARGETS_2200;
+               host->max_id = MAX_TARGETS_2200;
                ha->mbx_count = MAILBOX_REGISTER_COUNT;
                ha->request_q_length = REQUEST_ENTRY_CNT_2200;
                ha->response_q_length = RESPONSE_ENTRY_CNT_2100;
                ha->last_loop_id = SNS_LAST_LOOP_ID_2100;
        } else /*if (IS_QLA2300(ha))*/ {
-               ha->max_targets = MAX_TARGETS_2200;
+               host->max_id = MAX_TARGETS_2200;
                ha->mbx_count = MAILBOX_REGISTER_COUNT;
                ha->request_q_length = REQUEST_ENTRY_CNT_2200;
                ha->response_q_length = RESPONSE_ENTRY_CNT_2300;
@@ -1256,23 +1189,10 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
                qla_printk(KERN_WARNING, ha,
                    "[ERROR] Failed to allocate memory for adapter\n");
 
-               goto probe_alloc_failed;
+               ret = -ENOMEM;
+               goto probe_failed;
        }
 
-       pci_set_drvdata(pdev, ha);
-       host->this_id = 255;
-       host->cmd_per_lun = 3;
-       host->unique_id = ha->instance;
-       host->max_cmd_len = MAX_CMDSZ;
-       host->max_channel = ha->ports - 1;
-       host->max_id = ha->max_targets;
-       host->max_lun = ha->max_luns;
-       host->transportt = qla2xxx_transport_template;
-       if (scsi_add_host(host, &pdev->dev))
-               goto probe_alloc_failed;
-
-       qla2x00_alloc_sysfs_attr(ha);
-
        if (qla2x00_initialize_adapter(ha) &&
            !(ha->device_flags & DFLG_NO_CABLE)) {
 
@@ -1283,11 +1203,10 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
                    "Adapter flags %x.\n",
                    ha->host_no, ha->device_flags));
 
+               ret = -ENODEV;
                goto probe_failed;
        }
 
-       qla2x00_init_host_attr(ha);
-
        /*
         * Startup the kernel thread for this host adapter
         */
@@ -1297,17 +1216,26 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
                qla_printk(KERN_WARNING, ha,
                    "Unable to start DPC thread!\n");
 
+               ret = -ENODEV;
                goto probe_failed;
        }
        wait_for_completion(&ha->dpc_inited);
 
+       host->this_id = 255;
+       host->cmd_per_lun = 3;
+       host->unique_id = ha->instance;
+       host->max_cmd_len = MAX_CMDSZ;
+       host->max_channel = ha->ports - 1;
+       host->max_lun = MAX_LUNS;
+       host->transportt = qla2xxx_transport_template;
+
        if (IS_QLA2100(ha) || IS_QLA2200(ha))
                ret = request_irq(host->irq, qla2100_intr_handler,
                    SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha);
        else
                ret = request_irq(host->irq, qla2300_intr_handler,
                    SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha);
-       if (ret != 0) {
+       if (ret) {
                qla_printk(KERN_WARNING, ha,
                    "Failed to reserve interrupt %d already in use.\n",
                    host->irq);
@@ -1361,9 +1289,18 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
                msleep(10);
        }
 
+       pci_set_drvdata(pdev, ha);
        ha->flags.init_done = 1;
        num_hosts++;
 
+       ret = scsi_add_host(host, &pdev->dev);
+       if (ret)
+               goto probe_failed;
+
+       qla2x00_alloc_sysfs_attr(ha);
+
+       qla2x00_init_host_attr(ha);
+
        qla_printk(KERN_INFO, ha, "\n"
            " QLogic Fibre Channel HBA Driver: %s\n"
            "  QLogic %s - %s\n"
@@ -1382,9 +1319,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
 probe_failed:
        fc_remove_host(ha->host);
 
-       scsi_remove_host(host);
-
-probe_alloc_failed:
        qla2x00_free_device(ha);
 
        scsi_host_put(host);
@@ -1392,7 +1326,8 @@ probe_alloc_failed:
 probe_disable_device:
        pci_disable_device(pdev);
 
-       return -1;
+probe_out:
+       return ret;
 }
 EXPORT_SYMBOL_GPL(qla2x00_probe_one);
 
@@ -2336,8 +2271,7 @@ static int __init
 qla2x00_module_init(void)
 {
        /* Allocate cache for SRBs. */
-       sprintf(srb_cachep_name, "qla2xxx_srbs");
-       srb_cachep = kmem_cache_create(srb_cachep_name, sizeof(srb_t), 0,
+       srb_cachep = kmem_cache_create("qla2xxx_srbs", sizeof(srb_t), 0,
            SLAB_HWCACHE_ALIGN, NULL, NULL);
        if (srb_cachep == NULL) {
                printk(KERN_ERR
@@ -2365,16 +2299,7 @@ qla2x00_module_init(void)
 static void __exit
 qla2x00_module_exit(void)
 {
-       /* Free SRBs cache. */
-       if (srb_cachep != NULL) {
-               if (kmem_cache_destroy(srb_cachep) != 0) {
-                       printk(KERN_ERR
-                           "qla2xxx: Unable to free SRB cache...Memory pools "
-                           "still active?\n");
-               }
-               srb_cachep = NULL;
-       }
-
+       kmem_cache_destroy(srb_cachep);
        fc_release_transport(qla2xxx_transport_template);
 }
 
index a1adb38f69bb7eae5ac34bfe9e80bebc0be42cf2..55e698b651d694364c6f99ed9d109da5ba47ab27 100644 (file)
@@ -191,8 +191,6 @@ static Scsi_Host_Template qlogicfas_driver_template = {
        .queuecommand           = qlogicfas408_queuecommand,
        .eh_abort_handler       = qlogicfas408_abort,
        .eh_bus_reset_handler   = qlogicfas408_bus_reset,
-       .eh_device_reset_handler= qlogicfas408_device_reset,
-       .eh_host_reset_handler  = qlogicfas408_host_reset,
        .bios_param             = qlogicfas408_biosparam,
        .can_queue              = 1,
        .this_id                = -1,
index 5b6ce0a88f085651ef5cb104442dfbee8dbf992b..cb75e0b7baeafe62fcdc304cffc2525a1ca65a03 100644 (file)
@@ -511,27 +511,15 @@ int qlogicfas408_abort(Scsi_Cmnd * cmd)
 int qlogicfas408_bus_reset(Scsi_Cmnd * cmd)
 {
        struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd);
-       priv->qabort = 2;
-       ql_zap(priv);
-       return SUCCESS;
-}
-
-/* 
- *     Reset SCSI host controller
- */
+       unsigned long flags;
 
-int qlogicfas408_host_reset(Scsi_Cmnd * cmd)
-{
-       return FAILED;
-}
+       priv->qabort = 2;
 
-/* 
- *     Reset SCSI device
- */
+       spin_lock_irqsave(cmd->device->host->host_lock, flags);
+       ql_zap(priv);
+       spin_unlock_irqrestore(cmd->device->host->host_lock, flags);
 
-int qlogicfas408_device_reset(Scsi_Cmnd * cmd)
-{
-       return FAILED;
+       return SUCCESS;
 }
 
 /*
@@ -626,8 +614,6 @@ EXPORT_SYMBOL(qlogicfas408_info);
 EXPORT_SYMBOL(qlogicfas408_queuecommand);
 EXPORT_SYMBOL(qlogicfas408_abort);
 EXPORT_SYMBOL(qlogicfas408_bus_reset);
-EXPORT_SYMBOL(qlogicfas408_device_reset);
-EXPORT_SYMBOL(qlogicfas408_host_reset);
 EXPORT_SYMBOL(qlogicfas408_biosparam);
 EXPORT_SYMBOL(qlogicfas408_ihandl);
 EXPORT_SYMBOL(qlogicfas408_get_chip_type);
index f01cbd66c224e8c136f8661339acf463123b0507..4b3df200366042c2b1a76ab9d7f747e53dedbefa 100644 (file)
@@ -109,8 +109,6 @@ int qlogicfas408_biosparam(struct scsi_device * disk,
                        sector_t capacity, int ip[]);
 int qlogicfas408_abort(Scsi_Cmnd * cmd);
 int qlogicfas408_bus_reset(Scsi_Cmnd * cmd);
-int qlogicfas408_host_reset(Scsi_Cmnd * cmd);
-int qlogicfas408_device_reset(Scsi_Cmnd * cmd);
 const char *qlogicfas408_info(struct Scsi_Host *host);
 int qlogicfas408_get_chip_type(int qbase, int int_type);
 void qlogicfas408_setup(int qbase, int id, int int_type);
index 69009f853a4917f54a88aa0c2cf3e6fb0428c8f7..b0403ccd8a25d97aec9e220d175844dd45448076 100644 (file)
@@ -329,6 +329,8 @@ static void nv_host_stop (struct ata_host_set *host_set)
                host->host_desc->disable_hotplug(host_set);
 
        kfree(host);
+
+       ata_host_stop(host_set);
 }
 
 static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
index 19a13e3590f4eca5fab24675ffec12aaa56dd57f..5c1d4411457a4a09ab2b6ad814b9d53fb9ea0b07 100644 (file)
@@ -59,6 +59,7 @@ enum {
 
        board_2037x             = 0,    /* FastTrak S150 TX2plus */
        board_20319             = 1,    /* FastTrak S150 TX4 */
+       board_20619             = 2,    /* FastTrak TX4000 */
 
        PDC_HAS_PATA            = (1 << 1), /* PDC20375 has PATA */
 
@@ -122,6 +123,7 @@ static struct ata_port_operations pdc_ata_ops = {
        .scr_write              = pdc_sata_scr_write,
        .port_start             = pdc_port_start,
        .port_stop              = pdc_port_stop,
+       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_info pdc_port_info[] = {
@@ -146,11 +148,24 @@ static struct ata_port_info pdc_port_info[] = {
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
                .port_ops       = &pdc_ata_ops,
        },
+
+       /* board_20619 */
+       {
+               .sht            = &pdc_ata_sht,
+               .host_flags     = ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST |
+                                 ATA_FLAG_MMIO | ATA_FLAG_SLAVE_POSS,
+               .pio_mask       = 0x1f, /* pio0-4 */
+               .mwdma_mask     = 0x07, /* mwdma0-2 */
+               .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
+               .port_ops       = &pdc_ata_ops,
+       },
 };
 
 static struct pci_device_id pdc_ata_pci_tbl[] = {
        { PCI_VENDOR_ID_PROMISE, 0x3371, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_2037x },
+       { PCI_VENDOR_ID_PROMISE, 0x3571, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_2037x },
        { PCI_VENDOR_ID_PROMISE, 0x3373, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_2037x },
        { PCI_VENDOR_ID_PROMISE, 0x3375, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
@@ -169,6 +184,9 @@ static struct pci_device_id pdc_ata_pci_tbl[] = {
        { PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_20319 },
 
+       { PCI_VENDOR_ID_PROMISE, 0x6629, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_20619 },
+
        { }     /* terminate list */
 };
 
@@ -633,6 +651,15 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
        case board_2037x:
                        probe_ent->n_ports = 2;
                break;
+       case board_20619:
+               probe_ent->n_ports = 4;
+
+               pdc_ata_setup_port(&probe_ent->port[2], base + 0x300);
+               pdc_ata_setup_port(&probe_ent->port[3], base + 0x380);
+
+               probe_ent->port[2].scr_addr = base + 0x600;
+               probe_ent->port[3].scr_addr = base + 0x700;
+                break;
        default:
                BUG();
                break;
@@ -673,7 +700,7 @@ static void __exit pdc_ata_exit(void)
 
 
 MODULE_AUTHOR("Jeff Garzik");
-MODULE_DESCRIPTION("Promise SATA TX2/TX4 low-level driver");
+MODULE_DESCRIPTION("Promise ATA TX2/TX4/TX4000 low-level driver");
 MODULE_LICENSE("GPL");
 MODULE_DEVICE_TABLE(pci, pdc_ata_pci_tbl);
 MODULE_VERSION(DRV_VERSION);
index dfd3621047171dc748ba9a11c82a418f89faaed6..1383e8a28d728b34e936c0b9c7e04ffbf9a5818c 100644 (file)
@@ -536,6 +536,8 @@ static void qs_host_stop(struct ata_host_set *host_set)
 
        writeb(0, mmio_base + QS_HCT_CTRL); /* disable host interrupts */
        writeb(QS_CNFG3_GSRST, mmio_base + QS_HCF_CNFG3); /* global reset */
+
+       ata_host_stop(host_set);
 }
 
 static void qs_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
index f0489dc302a03054d6461ba54c9705f30190a8f4..49ed557a4b661e4cfa9569b0d2af72f4375573d8 100644 (file)
@@ -82,6 +82,7 @@ static struct pci_device_id sil_pci_tbl[] = {
        { 0x1095, 0x3114, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3114 },
        { 0x1002, 0x436e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
        { 0x1002, 0x4379, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
+       { 0x1002, 0x437a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
        { }     /* terminate list */
 };
 
@@ -160,6 +161,7 @@ static struct ata_port_operations sil_ops = {
        .scr_write              = sil_scr_write,
        .port_start             = ata_port_start,
        .port_stop              = ata_port_stop,
+       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_info sil_port_info[] = {
@@ -430,7 +432,13 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                writeb(cls, mmio_base + SIL_FIFO_R0);
                writeb(cls, mmio_base + SIL_FIFO_W0);
                writeb(cls, mmio_base + SIL_FIFO_R1);
-               writeb(cls, mmio_base + SIL_FIFO_W2);
+               writeb(cls, mmio_base + SIL_FIFO_W1);
+               if (ent->driver_data == sil_3114) {
+                       writeb(cls, mmio_base + SIL_FIFO_R2);
+                       writeb(cls, mmio_base + SIL_FIFO_W2);
+                       writeb(cls, mmio_base + SIL_FIFO_R3);
+                       writeb(cls, mmio_base + SIL_FIFO_W3);
+               }
        } else
                printk(KERN_WARNING DRV_NAME "(%s): cache line size not set.  Driver may not function\n",
                        pci_name(pdev));
index 5105ddd08447807df3710492f70c31bf6f0d8767..e418b89c6b9d8cf67c57a1b03431b91a19b585f2 100644 (file)
@@ -114,6 +114,7 @@ static struct ata_port_operations sis_ops = {
        .scr_write              = sis_scr_write,
        .port_start             = ata_port_start,
        .port_stop              = ata_port_stop,
+       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_info sis_port_info = {
index 8d1a5d25c05364e41e7f98198b94335ed30d0046..858e07185dbdf2589042924708baa297a16a3b8d 100644 (file)
@@ -49,7 +49,7 @@
 #endif /* CONFIG_PPC_OF */
 
 #define DRV_NAME       "sata_svw"
-#define DRV_VERSION    "1.05"
+#define DRV_VERSION    "1.06"
 
 /* Taskfile registers offsets */
 #define K2_SATA_TF_CMD_OFFSET          0x00
@@ -313,6 +313,7 @@ static struct ata_port_operations k2_sata_ops = {
        .scr_write              = k2_sata_scr_write,
        .port_start             = ata_port_start,
        .port_stop              = ata_port_stop,
+       .host_stop              = ata_host_stop,
 };
 
 static void k2_sata_setup_port(struct ata_ioports *port, unsigned long base)
@@ -343,6 +344,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
        void *mmio_base;
        int pci_dev_busy = 0;
        int rc;
+       int i;
 
        if (!printed_version++)
                printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
@@ -395,7 +397,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
 
        /* Clear a magic bit in SCR1 according to Darwin, those help
         * some funky seagate drives (though so far, those were already
-        * set by the firmware on the machines I had access to
+        * set by the firmware on the machines I had access to)
         */
        writel(readl(mmio_base + K2_SATA_SICR1_OFFSET) & ~0x00040000,
               mmio_base + K2_SATA_SICR1_OFFSET);
@@ -420,11 +422,11 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
        probe_ent->mwdma_mask = 0x7;
        probe_ent->udma_mask = 0x7f;
 
-       /* We have 4 ports per PCI function */
-       k2_sata_setup_port(&probe_ent->port[0], base + 0 * K2_SATA_PORT_OFFSET);
-       k2_sata_setup_port(&probe_ent->port[1], base + 1 * K2_SATA_PORT_OFFSET);
-       k2_sata_setup_port(&probe_ent->port[2], base + 2 * K2_SATA_PORT_OFFSET);
-       k2_sata_setup_port(&probe_ent->port[3], base + 3 * K2_SATA_PORT_OFFSET);
+       /* different controllers have different number of ports - currently 4 or 8 */
+       /* All ports are on the same function. Multi-function device is no
+        * longer available. This should not be seen in any system. */
+       for (i = 0; i < ent->driver_data; i++)
+               k2_sata_setup_port(&probe_ent->port[i], base + i * K2_SATA_PORT_OFFSET);
 
        pci_set_master(pdev);
 
@@ -444,11 +446,17 @@ err_out:
        return rc;
 }
 
-
+/* 0x240 is device ID for Apple K2 device
+ * 0x241 is device ID for Serverworks Frodo4
+ * 0x242 is device ID for Serverworks Frodo8
+ * 0x24a is device ID for BCM5785 (aka HT1000) HT southbridge integrated SATA
+ * controller
+ * */
 static struct pci_device_id k2_sata_pci_tbl[] = {
-       { 0x1166, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
-       { 0x1166, 0x0241, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
-       { 0x1166, 0x0242, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+       { 0x1166, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
+       { 0x1166, 0x0241, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
+       { 0x1166, 0x0242, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 8 },
+       { 0x1166, 0x024a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
        { }
 };
 
index 70118650c461e9d5d10ff0c3053ae5b49c6755a0..140cea05de3f23cdfa8d204af0d49b9f52f32913 100644 (file)
@@ -245,6 +245,8 @@ static void pdc20621_host_stop(struct ata_host_set *host_set)
 
        iounmap(dimm_mmio);
        kfree(hpriv);
+
+       ata_host_stop(host_set);
 }
 
 static int pdc_port_start(struct ata_port *ap)
index 0bff4f475f262c5c40254aecf85bd6a7137bd04e..a71fb54eebd301e07240310964a323b240db670d 100644 (file)
@@ -113,6 +113,7 @@ static struct ata_port_operations uli_ops = {
 
        .port_start             = ata_port_start,
        .port_stop              = ata_port_stop,
+       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_info uli_port_info = {
index 3a7830667277f35f71a83db5705b8cb2d376bafc..f43183c19a12184ebd6902eadf154bc836a7e249 100644 (file)
@@ -134,6 +134,7 @@ static struct ata_port_operations svia_sata_ops = {
 
        .port_start             = ata_port_start,
        .port_stop              = ata_port_stop,
+       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_info svia_port_info = {
index 2c28f0ad73c204420aa4b419a60341a8b801d7fa..c5e09dc6f3de67b3250250d7f064ff873d679bb6 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
+#include <linux/dma-mapping.h>
 #include "scsi.h"
 #include <scsi/scsi_host.h>
 #include <linux/libata.h>
@@ -230,6 +231,7 @@ static struct ata_port_operations vsc_sata_ops = {
        .scr_write              = vsc_sata_scr_write,
        .port_start             = ata_port_start,
        .port_stop              = ata_port_stop,
+       .host_stop              = ata_host_stop,
 };
 
 static void __devinit vsc_sata_setup_port(struct ata_ioports *port, unsigned long base)
index 184bcaeaf8127620cea60423ac35e7a50eaac5b6..5578ae9a9e45f9f60c99f767e878799f58fda13a 100644 (file)
@@ -638,10 +638,12 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
        }
        spin_unlock_irqrestore(host->host_lock, flags);
        if (rtn) {
-               atomic_inc(&cmd->device->iodone_cnt);
-               scsi_queue_insert(cmd,
-                               (rtn == SCSI_MLQUEUE_DEVICE_BUSY) ?
-                                rtn : SCSI_MLQUEUE_HOST_BUSY);
+               if (scsi_delete_timer(cmd)) {
+                       atomic_inc(&cmd->device->iodone_cnt);
+                       scsi_queue_insert(cmd,
+                                         (rtn == SCSI_MLQUEUE_DEVICE_BUSY) ?
+                                         rtn : SCSI_MLQUEUE_HOST_BUSY);
+               }
                SCSI_LOG_MLQUEUE(3,
                    printk("queuecommand : request rejected\n"));
        }
index 2bf1ee2b47b645b8bcaf74640e139ee5c018e076..ceb4e0c99b37eeac59e1f30a2316ad750f732e95 100644 (file)
@@ -434,8 +434,7 @@ static void scsi_eh_times_out(struct scsi_cmnd *scmd)
        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: scmd:%p\n", __FUNCTION__,
                                          scmd));
 
-       if (scmd->device->host->eh_action)
-               up(scmd->device->host->eh_action);
+       up(scmd->device->host->eh_action);
 }
 
 /**
@@ -457,8 +456,7 @@ static void scsi_eh_done(struct scsi_cmnd *scmd)
                SCSI_LOG_ERROR_RECOVERY(3, printk("%s scmd: %p result: %x\n",
                                           __FUNCTION__, scmd, scmd->result));
 
-               if (scmd->device->host->eh_action)
-                       up(scmd->device->host->eh_action);
+               up(scmd->device->host->eh_action);
        }
 }
 
@@ -528,10 +526,8 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, int timeout)
                 * abort a timed out command or not.  not sure how
                 * we should treat them differently anyways.
                 */
-               spin_lock_irqsave(shost->host_lock, flags);
                if (shost->hostt->eh_abort_handler)
                        shost->hostt->eh_abort_handler(scmd);
-               spin_unlock_irqrestore(shost->host_lock, flags);
                        
                scmd->request->rq_status = RQ_SCSI_DONE;
                scmd->owner = SCSI_OWNER_ERROR_HANDLER;
@@ -737,11 +733,8 @@ static int scsi_eh_get_sense(struct list_head *work_q,
  **/
 static int scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
 {
-       unsigned long flags;
-       int rtn = FAILED;
-
        if (!scmd->device->host->hostt->eh_abort_handler)
-               return rtn;
+               return FAILED;
 
        /*
         * scsi_done was called just after the command timed out and before
@@ -752,11 +745,7 @@ static int scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
 
        scmd->owner = SCSI_OWNER_LOWLEVEL;
 
-       spin_lock_irqsave(scmd->device->host->host_lock, flags);
-       rtn = scmd->device->host->hostt->eh_abort_handler(scmd);
-       spin_unlock_irqrestore(scmd->device->host->host_lock, flags);
-
-       return rtn;
+       return scmd->device->host->hostt->eh_abort_handler(scmd);
 }
 
 /**
@@ -770,6 +759,7 @@ static int scsi_eh_tur(struct scsi_cmnd *scmd)
 {
        static unsigned char tur_command[6] = {TEST_UNIT_READY, 0, 0, 0, 0, 0};
        int retry_cnt = 1, rtn;
+       int saved_result;
 
 retry_tur:
        memcpy(scmd->cmnd, tur_command, sizeof(tur_command));
@@ -780,6 +770,7 @@ retry_tur:
         */
        memset(scmd->sense_buffer, 0, sizeof(scmd->sense_buffer));
 
+       saved_result = scmd->result;
        scmd->request_buffer = NULL;
        scmd->request_bufflen = 0;
        scmd->use_sg = 0;
@@ -794,6 +785,7 @@ retry_tur:
         * the original request, so let's restore the original data. (db)
         */
        scsi_setup_cmd_retry(scmd);
+       scmd->result = saved_result;
 
        /*
         * hey, we are done.  let's look to see what happened.
@@ -865,17 +857,14 @@ static int scsi_eh_abort_cmds(struct list_head *work_q,
  **/
 static int scsi_try_bus_device_reset(struct scsi_cmnd *scmd)
 {
-       unsigned long flags;
-       int rtn = FAILED;
+       int rtn;
 
        if (!scmd->device->host->hostt->eh_device_reset_handler)
-               return rtn;
+               return FAILED;
 
        scmd->owner = SCSI_OWNER_LOWLEVEL;
 
-       spin_lock_irqsave(scmd->device->host->host_lock, flags);
        rtn = scmd->device->host->hostt->eh_device_reset_handler(scmd);
-       spin_unlock_irqrestore(scmd->device->host->host_lock, flags);
 
        if (rtn == SUCCESS) {
                scmd->device->was_reset = 1;
@@ -896,6 +885,7 @@ static int scsi_eh_try_stu(struct scsi_cmnd *scmd)
 {
        static unsigned char stu_command[6] = {START_STOP, 0, 0, 0, 1, 0};
        int rtn;
+       int saved_result;
 
        if (!scmd->device->allow_restart)
                return 1;
@@ -908,6 +898,7 @@ static int scsi_eh_try_stu(struct scsi_cmnd *scmd)
         */
        memset(scmd->sense_buffer, 0, sizeof(scmd->sense_buffer));
 
+       saved_result = scmd->result;
        scmd->request_buffer = NULL;
        scmd->request_bufflen = 0;
        scmd->use_sg = 0;
@@ -922,6 +913,7 @@ static int scsi_eh_try_stu(struct scsi_cmnd *scmd)
         * the original request, so let's restore the original data. (db)
         */
        scsi_setup_cmd_retry(scmd);
+       scmd->result = saved_result;
 
        /*
         * hey, we are done.  let's look to see what happened.
@@ -1061,9 +1053,7 @@ static int scsi_try_bus_reset(struct scsi_cmnd *scmd)
        if (!scmd->device->host->hostt->eh_bus_reset_handler)
                return FAILED;
 
-       spin_lock_irqsave(scmd->device->host->host_lock, flags);
        rtn = scmd->device->host->hostt->eh_bus_reset_handler(scmd);
-       spin_unlock_irqrestore(scmd->device->host->host_lock, flags);
 
        if (rtn == SUCCESS) {
                if (!scmd->device->host->hostt->skip_settle_delay)
@@ -1092,9 +1082,7 @@ static int scsi_try_host_reset(struct scsi_cmnd *scmd)
        if (!scmd->device->host->hostt->eh_host_reset_handler)
                return FAILED;
 
-       spin_lock_irqsave(scmd->device->host->host_lock, flags);
        rtn = scmd->device->host->hostt->eh_host_reset_handler(scmd);
-       spin_unlock_irqrestore(scmd->device->host->host_lock, flags);
 
        if (rtn == SUCCESS) {
                if (!scmd->device->host->hostt->skip_settle_delay)
@@ -1561,6 +1549,11 @@ static void scsi_eh_flush_done_q(struct list_head *done_q)
                                                          scmd));
                                scsi_queue_insert(scmd, SCSI_MLQUEUE_EH_RETRY);
                } else {
+                       /*
+                        * If just we got sense for the device (called
+                        * scsi_eh_get_sense), scmd->result is already
+                        * set, do not set DRIVER_TIMEOUT.
+                        */
                        if (!scmd->result)
                                scmd->result |= (DRIVER_TIMEOUT << 24);
                        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: flush finish"
@@ -1870,7 +1863,6 @@ scsi_reset_provider(struct scsi_device *dev, int flag)
                rtn = FAILED;
        }
 
-       scsi_delete_timer(scmd);
        scsi_next_command(scmd);
        return rtn;
 }
index d18da21c9c57e0ef590369ea815b7b1adba4042b..9f996499fa9d2b44dbdf9431040a47bce15855c5 100644 (file)
@@ -92,10 +92,12 @@ int scsi_insert_special_req(struct scsi_request *sreq, int at_head)
         */
        sreq->sr_request->flags &= ~REQ_DONTPREP;
        blk_insert_request(sreq->sr_device->request_queue, sreq->sr_request,
-                          at_head, sreq, 0);
+                          at_head, sreq);
        return 0;
 }
 
+static void scsi_run_queue(struct request_queue *q);
+
 /*
  * Function:    scsi_queue_insert()
  *
@@ -119,18 +121,14 @@ int scsi_queue_insert(struct scsi_cmnd *cmd, int reason)
 {
        struct Scsi_Host *host = cmd->device->host;
        struct scsi_device *device = cmd->device;
+       struct request_queue *q = device->request_queue;
+       unsigned long flags;
 
        SCSI_LOG_MLQUEUE(1,
                 printk("Inserting command %p into mlqueue\n", cmd));
 
        /*
-        * We are inserting the command into the ml queue.  First, we
-        * cancel the timer, so it doesn't time out.
-        */
-       scsi_delete_timer(cmd);
-
-       /*
-        * Next, set the appropriate busy bit for the device/host.
+        * Set the appropriate busy bit for the device/host.
         *
         * If the host/device isn't busy, assume that something actually
         * completed, and that we should be able to queue a command now.
@@ -160,17 +158,22 @@ int scsi_queue_insert(struct scsi_cmnd *cmd, int reason)
        scsi_device_unbusy(device);
 
        /*
-        * Insert this command at the head of the queue for it's device.
-        * It will go before all other commands that are already in the queue.
+        * Requeue this command.  It will go before all other commands
+        * that are already in the queue.
         *
         * NOTE: there is magic here about the way the queue is plugged if
         * we have no outstanding commands.
         * 
-        * Although this *doesn't* plug the queue, it does call the request
+        * Although we *don't* plug the queue, we call the request
         * function.  The SCSI request function detects the blocked condition
         * and plugs the queue appropriately.
-        */
-       blk_insert_request(device->request_queue, cmd->request, 1, cmd, 1);
+         */
+       spin_lock_irqsave(q->queue_lock, flags);
+       blk_requeue_request(q, cmd->request);
+       spin_unlock_irqrestore(q->queue_lock, flags);
+
+       scsi_run_queue(q);
+
        return 0;
 }
 
@@ -485,8 +488,13 @@ static void scsi_run_queue(struct request_queue *q)
  */
 static void scsi_requeue_command(struct request_queue *q, struct scsi_cmnd *cmd)
 {
+       unsigned long flags;
+
        cmd->request->flags &= ~REQ_DONTPREP;
-       blk_insert_request(q, cmd->request, 1, cmd, 1);
+
+       spin_lock_irqsave(q->queue_lock, flags);
+       blk_requeue_request(q, cmd->request);
+       spin_unlock_irqrestore(q->queue_lock, flags);
 
        scsi_run_queue(q);
 }
@@ -941,10 +949,8 @@ static int scsi_init_io(struct scsi_cmnd *cmd)
         * if sg table allocation fails, requeue request later.
         */
        sgpnt = scsi_alloc_sgtable(cmd, GFP_ATOMIC);
-       if (unlikely(!sgpnt)) {
-               req->flags |= REQ_SPECIAL;
+       if (unlikely(!sgpnt))
                return BLKPREP_DEFER;
-       }
 
        cmd->request_buffer = (char *) sgpnt;
        cmd->request_bufflen = req->nr_sectors << 9;
index cca772624ae701ea8278ce770c10c8617e710c5e..9fa209097e3bb2da7e3de974a3a6fcd02f0651cf 100644 (file)
@@ -293,6 +293,10 @@ static void scsi_target_dev_release(struct device *dev)
 {
        struct device *parent = dev->parent;
        struct scsi_target *starget = to_scsi_target(dev);
+       struct Scsi_Host *shost = dev_to_shost(parent);
+
+       if (shost->hostt->target_destroy)
+               shost->hostt->target_destroy(starget);
        kfree(starget);
        put_device(parent);
 }
@@ -360,9 +364,23 @@ static struct scsi_target *scsi_alloc_target(struct device *parent,
        list_add_tail(&starget->siblings, &shost->__targets);
        spin_unlock_irqrestore(shost->host_lock, flags);
        /* allocate and add */
-       transport_setup_device(&starget->dev);
-       device_add(&starget->dev);
-       transport_add_device(&starget->dev);
+       transport_setup_device(dev);
+       device_add(dev);
+       transport_add_device(dev);
+       if (shost->hostt->target_alloc) {
+               int error = shost->hostt->target_alloc(starget);
+
+               if(error) {
+                       dev_printk(KERN_ERR, dev, "target allocation failed, error %d\n", error);
+                       /* don't want scsi_target_reap to do the final
+                        * put because it will be under the host lock */
+                       get_device(dev);
+                       scsi_target_reap(starget);
+                       put_device(dev);
+                       return NULL;
+               }
+       }
+
        return starget;
 
  found:
@@ -625,6 +643,7 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags)
        case TYPE_MEDIUM_CHANGER:
        case TYPE_ENCLOSURE:
        case TYPE_COMM:
+       case TYPE_RBC:
                sdev->writeable = 1;
                break;
        case TYPE_WORM:
@@ -1197,6 +1216,7 @@ struct scsi_device *__scsi_add_device(struct Scsi_Host *shost, uint channel,
        if (!starget)
                return ERR_PTR(-ENOMEM);
 
+       get_device(&starget->dev);
        down(&shost->scan_mutex);
        res = scsi_probe_and_add_lun(starget, lun, NULL, &sdev, 1, hostdata);
        if (res != SCSI_SCAN_LUN_PRESENT)
index e75ee4671ee3a0a6dcb608a73d6bd2f4007eff09..93b41100a6d8c6055cbbd96fdf88fe08a0f282fc 100644 (file)
@@ -230,7 +230,7 @@ void scsi_sysfs_unregister(void)
  */
 #define sdev_show_function(field, format_string)                               \
 static ssize_t                                                         \
-sdev_show_##field (struct device *dev, char *buf)                              \
+sdev_show_##field (struct device *dev, struct device_attribute *attr, char *buf)                               \
 {                                                                      \
        struct scsi_device *sdev;                                       \
        sdev = to_scsi_device(dev);                                     \
@@ -254,7 +254,7 @@ static DEVICE_ATTR(field, S_IRUGO, sdev_show_##field, NULL);
        sdev_show_function(field, format_string)                                \
                                                                        \
 static ssize_t                                                         \
-sdev_store_##field (struct device *dev, const char *buf, size_t count) \
+sdev_store_##field (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)  \
 {                                                                      \
        struct scsi_device *sdev;                                       \
        sdev = to_scsi_device(dev);                                     \
@@ -274,7 +274,7 @@ static DEVICE_ATTR(field, S_IRUGO | S_IWUSR, sdev_show_##field, sdev_store_##fie
        sdev_show_function(field, "%d\n")                                       \
                                                                        \
 static ssize_t                                                         \
-sdev_store_##field (struct device *dev, const char *buf, size_t count) \
+sdev_store_##field (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)  \
 {                                                                      \
        int ret;                                                        \
        struct scsi_device *sdev;                                       \
@@ -317,7 +317,7 @@ sdev_rd_attr (model, "%.16s\n");
 sdev_rd_attr (rev, "%.4s\n");
 
 static ssize_t
-sdev_show_timeout (struct device *dev, char *buf)
+sdev_show_timeout (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct scsi_device *sdev;
        sdev = to_scsi_device(dev);
@@ -325,7 +325,7 @@ sdev_show_timeout (struct device *dev, char *buf)
 }
 
 static ssize_t
-sdev_store_timeout (struct device *dev, const char *buf, size_t count)
+sdev_store_timeout (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct scsi_device *sdev;
        int timeout;
@@ -337,14 +337,14 @@ sdev_store_timeout (struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(timeout, S_IRUGO | S_IWUSR, sdev_show_timeout, sdev_store_timeout);
 
 static ssize_t
-store_rescan_field (struct device *dev, const char *buf, size_t count) 
+store_rescan_field (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        scsi_rescan_device(dev);
        return count;
 }
 static DEVICE_ATTR(rescan, S_IWUSR, NULL, store_rescan_field);
 
-static ssize_t sdev_store_delete(struct device *dev, const char *buf,
+static ssize_t sdev_store_delete(struct device *dev, struct device_attribute *attr, const char *buf,
                                 size_t count)
 {
        scsi_remove_device(to_scsi_device(dev));
@@ -353,7 +353,7 @@ static ssize_t sdev_store_delete(struct device *dev, const char *buf,
 static DEVICE_ATTR(delete, S_IWUSR, NULL, sdev_store_delete);
 
 static ssize_t
-store_state_field(struct device *dev, const char *buf, size_t count)
+store_state_field(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        int i;
        struct scsi_device *sdev = to_scsi_device(dev);
@@ -376,7 +376,7 @@ store_state_field(struct device *dev, const char *buf, size_t count)
 }
 
 static ssize_t
-show_state_field(struct device *dev, char *buf)
+show_state_field(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct scsi_device *sdev = to_scsi_device(dev);
        const char *name = scsi_device_state_name(sdev->sdev_state);
@@ -390,7 +390,7 @@ show_state_field(struct device *dev, char *buf)
 static DEVICE_ATTR(state, S_IRUGO | S_IWUSR, show_state_field, store_state_field);
 
 static ssize_t
-show_queue_type_field(struct device *dev, char *buf)
+show_queue_type_field(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct scsi_device *sdev = to_scsi_device(dev);
        const char *name = "none";
@@ -406,7 +406,7 @@ show_queue_type_field(struct device *dev, char *buf)
 static DEVICE_ATTR(queue_type, S_IRUGO, show_queue_type_field, NULL);
 
 static ssize_t
-show_iostat_counterbits(struct device *dev, char *buf)
+show_iostat_counterbits(struct device *dev, struct device_attribute *attr, char *buf)
 {
        return snprintf(buf, 20, "%d\n", (int)sizeof(atomic_t) * 8);
 }
@@ -415,7 +415,7 @@ static DEVICE_ATTR(iocounterbits, S_IRUGO, show_iostat_counterbits, NULL);
 
 #define show_sdev_iostat(field)                                                \
 static ssize_t                                                         \
-show_iostat_##field(struct device *dev, char *buf)                     \
+show_iostat_##field(struct device *dev, struct device_attribute *attr, char *buf)                      \
 {                                                                      \
        struct scsi_device *sdev = to_scsi_device(dev);                 \
        unsigned long long count = atomic_read(&sdev->field);           \
@@ -449,7 +449,7 @@ static struct device_attribute *scsi_sysfs_sdev_attrs[] = {
        NULL
 };
 
-static ssize_t sdev_store_queue_depth_rw(struct device *dev, const char *buf,
+static ssize_t sdev_store_queue_depth_rw(struct device *dev, struct device_attribute *attr, const char *buf,
                                         size_t count)
 {
        int depth, retval;
@@ -475,7 +475,7 @@ static struct device_attribute sdev_attr_queue_depth_rw =
        __ATTR(queue_depth, S_IRUGO | S_IWUSR, sdev_show_queue_depth,
               sdev_store_queue_depth_rw);
 
-static ssize_t sdev_store_queue_type_rw(struct device *dev, const char *buf,
+static ssize_t sdev_store_queue_type_rw(struct device *dev, struct device_attribute *attr, const char *buf,
                                        size_t count)
 {
        struct scsi_device *sdev = to_scsi_device(dev);
@@ -669,6 +669,13 @@ void __scsi_remove_target(struct scsi_target *starget)
        scsi_target_reap(starget);
 }
 
+static int __remove_child (struct device * dev, void * data)
+{
+       if (scsi_is_target_device(dev))
+               __scsi_remove_target(to_scsi_target(dev));
+       return 0;
+}
+
 /**
  * scsi_remove_target - try to remove a target and all its devices
  * @dev: generic starget or parent of generic stargets to be removed
@@ -679,7 +686,7 @@ void __scsi_remove_target(struct scsi_target *starget)
  */
 void scsi_remove_target(struct device *dev)
 {
-       struct device *rdev, *idev, *next;
+       struct device *rdev;
 
        if (scsi_is_target_device(dev)) {
                __scsi_remove_target(to_scsi_target(dev));
@@ -687,10 +694,7 @@ void scsi_remove_target(struct device *dev)
        }
 
        rdev = get_device(dev);
-       list_for_each_entry_safe(idev, next, &dev->children, node) {
-               if (scsi_is_target_device(idev))
-                       __scsi_remove_target(to_scsi_target(idev));
-       }
+       device_for_each_child(dev, NULL, __remove_child);
        put_device(rdev);
 }
 EXPORT_SYMBOL(scsi_remove_target);
index 28966d05435cf6506c214ab56b8b92050ab85c81..2918b9600db7af2e2fb0970d518bef6ef32f337b 100644 (file)
@@ -35,7 +35,7 @@
 
 #define SPI_PRINTK(x, l, f, a...)      dev_printk(l, &(x)->dev, f , ##a)
 
-#define SPI_NUM_ATTRS 10       /* increase this if you add attributes */
+#define SPI_NUM_ATTRS 13       /* increase this if you add attributes */
 #define SPI_OTHER_ATTRS 1      /* Increase this if you add "always
                                 * on" attributes */
 #define SPI_HOST_ATTRS 1
@@ -219,8 +219,11 @@ static int spi_setup_transport_attrs(struct device *dev)
        struct scsi_target *starget = to_scsi_target(dev);
 
        spi_period(starget) = -1;       /* illegal value */
+       spi_min_period(starget) = 0;
        spi_offset(starget) = 0;        /* async */
+       spi_max_offset(starget) = 255;
        spi_width(starget) = 0; /* narrow */
+       spi_max_width(starget) = 1;
        spi_iu(starget) = 0;    /* no IU */
        spi_dt(starget) = 0;    /* ST */
        spi_qas(starget) = 0;
@@ -235,6 +238,34 @@ static int spi_setup_transport_attrs(struct device *dev)
        return 0;
 }
 
+#define spi_transport_show_simple(field, format_string)                        \
+                                                                       \
+static ssize_t                                                         \
+show_spi_transport_##field(struct class_device *cdev, char *buf)       \
+{                                                                      \
+       struct scsi_target *starget = transport_class_to_starget(cdev); \
+       struct spi_transport_attrs *tp;                                 \
+                                                                       \
+       tp = (struct spi_transport_attrs *)&starget->starget_data;      \
+       return snprintf(buf, 20, format_string, tp->field);             \
+}
+
+#define spi_transport_store_simple(field, format_string)               \
+                                                                       \
+static ssize_t                                                         \
+store_spi_transport_##field(struct class_device *cdev, const char *buf, \
+                           size_t count)                               \
+{                                                                      \
+       int val;                                                        \
+       struct scsi_target *starget = transport_class_to_starget(cdev); \
+       struct spi_transport_attrs *tp;                                 \
+                                                                       \
+       tp = (struct spi_transport_attrs *)&starget->starget_data;      \
+       val = simple_strtoul(buf, NULL, 0);                             \
+       tp->field = val;                                                \
+       return count;                                                   \
+}
+
 #define spi_transport_show_function(field, format_string)              \
                                                                        \
 static ssize_t                                                         \
@@ -261,6 +292,25 @@ store_spi_transport_##field(struct class_device *cdev, const char *buf, \
        struct spi_internal *i = to_spi_internal(shost->transportt);    \
                                                                        \
        val = simple_strtoul(buf, NULL, 0);                             \
+       i->f->set_##field(starget, val);                        \
+       return count;                                                   \
+}
+
+#define spi_transport_store_max(field, format_string)                  \
+static ssize_t                                                         \
+store_spi_transport_##field(struct class_device *cdev, const char *buf, \
+                           size_t count)                               \
+{                                                                      \
+       int val;                                                        \
+       struct scsi_target *starget = transport_class_to_starget(cdev); \
+       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);    \
+       struct spi_internal *i = to_spi_internal(shost->transportt);    \
+       struct spi_transport_attrs *tp                                  \
+               = (struct spi_transport_attrs *)&starget->starget_data; \
+                                                                       \
+       val = simple_strtoul(buf, NULL, 0);                             \
+       if (val > tp->max_##field)                                      \
+               val = tp->max_##field;                                  \
        i->f->set_##field(starget, val);                                \
        return count;                                                   \
 }
@@ -272,9 +322,24 @@ static CLASS_DEVICE_ATTR(field, S_IRUGO | S_IWUSR,                 \
                         show_spi_transport_##field,                    \
                         store_spi_transport_##field);
 
+#define spi_transport_simple_attr(field, format_string)                        \
+       spi_transport_show_simple(field, format_string)                 \
+       spi_transport_store_simple(field, format_string)                \
+static CLASS_DEVICE_ATTR(field, S_IRUGO | S_IWUSR,                     \
+                        show_spi_transport_##field,                    \
+                        store_spi_transport_##field);
+
+#define spi_transport_max_attr(field, format_string)                   \
+       spi_transport_show_function(field, format_string)               \
+       spi_transport_store_max(field, format_string)                   \
+       spi_transport_simple_attr(max_##field, format_string)           \
+static CLASS_DEVICE_ATTR(field, S_IRUGO | S_IWUSR,                     \
+                        show_spi_transport_##field,                    \
+                        store_spi_transport_##field);
+
 /* The Parallel SCSI Tranport Attributes: */
-spi_transport_rd_attr(offset, "%d\n");
-spi_transport_rd_attr(width, "%d\n");
+spi_transport_max_attr(offset, "%d\n");
+spi_transport_max_attr(width, "%d\n");
 spi_transport_rd_attr(iu, "%d\n");
 spi_transport_rd_attr(dt, "%d\n");
 spi_transport_rd_attr(qas, "%d\n");
@@ -283,43 +348,39 @@ spi_transport_rd_attr(rd_strm, "%d\n");
 spi_transport_rd_attr(rti, "%d\n");
 spi_transport_rd_attr(pcomp_en, "%d\n");
 
+/* we only care about the first child device so we return 1 */
+static int child_iter(struct device *dev, void *data)
+{
+       struct scsi_device *sdev = to_scsi_device(dev);
+
+       spi_dv_device(sdev);
+       return 1;
+}
+
 static ssize_t
 store_spi_revalidate(struct class_device *cdev, const char *buf, size_t count)
 {
        struct scsi_target *starget = transport_class_to_starget(cdev);
 
-       /* FIXME: we're relying on an awful lot of device internals
-        * here.  We really need a function to get the first available
-        * child */
-       struct device *dev = container_of(starget->dev.children.next, struct device, node);
-       struct scsi_device *sdev = to_scsi_device(dev);
-       spi_dv_device(sdev);
+       device_for_each_child(&starget->dev, NULL, child_iter);
        return count;
 }
 static CLASS_DEVICE_ATTR(revalidate, S_IWUSR, NULL, store_spi_revalidate);
 
 /* Translate the period into ns according to the current spec
  * for SDTR/PPR messages */
-static ssize_t show_spi_transport_period(struct class_device *cdev, char *buf)
-
+static ssize_t
+show_spi_transport_period_helper(struct class_device *cdev, char *buf,
+                                int period)
 {
-       struct scsi_target *starget = transport_class_to_starget(cdev);
-       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
-       struct spi_transport_attrs *tp;
        int len, picosec;
-       struct spi_internal *i = to_spi_internal(shost->transportt);
 
-       tp = (struct spi_transport_attrs *)&starget->starget_data;
-
-       if (i->f->get_period)
-               i->f->get_period(starget);
-
-       if (tp->period < 0 || tp->period > 0xff) {
+       if (period < 0 || period > 0xff) {
                picosec = -1;
-       } else if (tp->period <= SPI_STATIC_PPR) {
-               picosec = ppr_to_ps[tp->period];
+       } else if (period <= SPI_STATIC_PPR) {
+               picosec = ppr_to_ps[period];
        } else {
-               picosec = tp->period * 4000;
+               picosec = period * 4000;
        }
 
        if (picosec == -1) {
@@ -334,12 +395,9 @@ static ssize_t show_spi_transport_period(struct class_device *cdev, char *buf)
 }
 
 static ssize_t
-store_spi_transport_period(struct class_device *cdev, const char *buf,
-                           size_t count)
+store_spi_transport_period_helper(struct class_device *cdev, const char *buf,
+                                 size_t count, int *periodp)
 {
-       struct scsi_target *starget = transport_class_to_starget(cdev);
-       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
-       struct spi_internal *i = to_spi_internal(shost->transportt);
        int j, picosec, period = -1;
        char *endp;
 
@@ -368,15 +426,79 @@ store_spi_transport_period(struct class_device *cdev, const char *buf,
        if (period > 0xff)
                period = 0xff;
 
-       i->f->set_period(starget, period);
+       *periodp = period;
 
        return count;
 }
 
+static ssize_t
+show_spi_transport_period(struct class_device *cdev, char *buf)
+{
+       struct scsi_target *starget = transport_class_to_starget(cdev);
+       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+       struct spi_internal *i = to_spi_internal(shost->transportt);
+       struct spi_transport_attrs *tp =
+               (struct spi_transport_attrs *)&starget->starget_data;
+
+       if (i->f->get_period)
+               i->f->get_period(starget);
+
+       return show_spi_transport_period_helper(cdev, buf, tp->period);
+}
+
+static ssize_t
+store_spi_transport_period(struct class_device *cdev, const char *buf,
+                           size_t count)
+{
+       struct scsi_target *starget = transport_class_to_starget(cdev);
+       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+       struct spi_internal *i = to_spi_internal(shost->transportt);
+       struct spi_transport_attrs *tp =
+               (struct spi_transport_attrs *)&starget->starget_data;
+       int period, retval;
+
+       retval = store_spi_transport_period_helper(cdev, buf, count, &period);
+
+       if (period < tp->min_period)
+               period = tp->min_period;
+
+       i->f->set_period(starget, period);
+
+       return retval;
+}
+
 static CLASS_DEVICE_ATTR(period, S_IRUGO | S_IWUSR, 
                         show_spi_transport_period,
                         store_spi_transport_period);
 
+static ssize_t
+show_spi_transport_min_period(struct class_device *cdev, char *buf)
+{
+       struct scsi_target *starget = transport_class_to_starget(cdev);
+       struct spi_transport_attrs *tp =
+               (struct spi_transport_attrs *)&starget->starget_data;
+
+       return show_spi_transport_period_helper(cdev, buf, tp->min_period);
+}
+
+static ssize_t
+store_spi_transport_min_period(struct class_device *cdev, const char *buf,
+                           size_t count)
+{
+       struct scsi_target *starget = transport_class_to_starget(cdev);
+       struct spi_transport_attrs *tp =
+               (struct spi_transport_attrs *)&starget->starget_data;
+
+       return store_spi_transport_period_helper(cdev, buf, count,
+                                                &tp->min_period);
+}
+
+
+static CLASS_DEVICE_ATTR(min_period, S_IRUGO | S_IWUSR, 
+                        show_spi_transport_min_period,
+                        store_spi_transport_min_period);
+
+
 static ssize_t show_spi_host_signalling(struct class_device *cdev, char *buf)
 {
        struct Scsi_Host *shost = transport_class_to_shost(cdev);
@@ -551,6 +673,7 @@ spi_dv_retrain(struct scsi_request *sreq, u8 *buffer, u8 *ptr,
 {
        struct spi_internal *i = to_spi_internal(sreq->sr_host->transportt);
        struct scsi_device *sdev = sreq->sr_device;
+       struct scsi_target *starget = sdev->sdev_target;
        int period = 0, prevperiod = 0; 
        enum spi_compare_returns retval;
 
@@ -564,24 +687,40 @@ spi_dv_retrain(struct scsi_request *sreq, u8 *buffer, u8 *ptr,
                        break;
 
                /* OK, retrain, fallback */
+               if (i->f->get_iu)
+                       i->f->get_iu(starget);
+               if (i->f->get_qas)
+                       i->f->get_qas(starget);
                if (i->f->get_period)
                        i->f->get_period(sdev->sdev_target);
-               newperiod = spi_period(sdev->sdev_target);
-               period = newperiod > period ? newperiod : period;
-               if (period < 0x0d)
-                       period++;
-               else
-                       period += period >> 1;
-
-               if (unlikely(period > 0xff || period == prevperiod)) {
-                       /* Total failure; set to async and return */
-                       SPI_PRINTK(sdev->sdev_target, KERN_ERR, "Domain Validation Failure, dropping back to Asynchronous\n");
-                       DV_SET(offset, 0);
-                       return SPI_COMPARE_FAILURE;
+
+               /* Here's the fallback sequence; first try turning off
+                * IU, then QAS (if we can control them), then finally
+                * fall down the periods */
+               if (i->f->set_iu && spi_iu(starget)) {
+                       SPI_PRINTK(starget, KERN_ERR, "Domain Validation Disabing Information Units\n");
+                       DV_SET(iu, 0);
+               } else if (i->f->set_qas && spi_qas(starget)) {
+                       SPI_PRINTK(starget, KERN_ERR, "Domain Validation Disabing Quick Arbitration and Selection\n");
+                       DV_SET(qas, 0);
+               } else {
+                       newperiod = spi_period(starget);
+                       period = newperiod > period ? newperiod : period;
+                       if (period < 0x0d)
+                               period++;
+                       else
+                               period += period >> 1;
+
+                       if (unlikely(period > 0xff || period == prevperiod)) {
+                               /* Total failure; set to async and return */
+                               SPI_PRINTK(starget, KERN_ERR, "Domain Validation Failure, dropping back to Asynchronous\n");
+                               DV_SET(offset, 0);
+                               return SPI_COMPARE_FAILURE;
+                       }
+                       SPI_PRINTK(starget, KERN_ERR, "Domain Validation detected failure, dropping back\n");
+                       DV_SET(period, period);
+                       prevperiod = period;
                }
-               SPI_PRINTK(sdev->sdev_target, KERN_ERR, "Domain Validation detected failure, dropping back\n");
-               DV_SET(period, period);
-               prevperiod = period;
        }
        return retval;
 }
@@ -642,6 +781,7 @@ spi_dv_device_internal(struct scsi_request *sreq, u8 *buffer)
 {
        struct spi_internal *i = to_spi_internal(sreq->sr_host->transportt);
        struct scsi_device *sdev = sreq->sr_device;
+       struct scsi_target *starget = sdev->sdev_target;
        int len = sdev->inquiry_len;
        /* first set us up for narrow async */
        DV_SET(offset, 0);
@@ -649,21 +789,21 @@ spi_dv_device_internal(struct scsi_request *sreq, u8 *buffer)
        
        if (spi_dv_device_compare_inquiry(sreq, buffer, buffer, DV_LOOPS)
            != SPI_COMPARE_SUCCESS) {
-               SPI_PRINTK(sdev->sdev_target, KERN_ERR, "Domain Validation Initial Inquiry Failed\n");
+               SPI_PRINTK(starget, KERN_ERR, "Domain Validation Initial Inquiry Failed\n");
                /* FIXME: should probably offline the device here? */
                return;
        }
 
        /* test width */
-       if (i->f->set_width && sdev->wdtr) {
-               i->f->set_width(sdev->sdev_target, 1);
+       if (i->f->set_width && spi_max_width(starget) && sdev->wdtr) {
+               i->f->set_width(starget, 1);
 
                if (spi_dv_device_compare_inquiry(sreq, buffer,
                                                   buffer + len,
                                                   DV_LOOPS)
                    != SPI_COMPARE_SUCCESS) {
-                       SPI_PRINTK(sdev->sdev_target, KERN_ERR, "Wide Transfers Fail\n");
-                       i->f->set_width(sdev->sdev_target, 0);
+                       SPI_PRINTK(starget, KERN_ERR, "Wide Transfers Fail\n");
+                       i->f->set_width(starget, 0);
                }
        }
 
@@ -671,7 +811,7 @@ spi_dv_device_internal(struct scsi_request *sreq, u8 *buffer)
                return;
 
        /* device can't handle synchronous */
-       if(!sdev->ppr && !sdev->sdtr)
+       if (!sdev->ppr && !sdev->sdtr)
                return;
 
        /* see if the device has an echo buffer.  If it does we can
@@ -684,18 +824,32 @@ spi_dv_device_internal(struct scsi_request *sreq, u8 *buffer)
  retry:
 
        /* now set up to the maximum */
-       DV_SET(offset, 255);
-       DV_SET(period, 1);
+       DV_SET(offset, spi_max_offset(starget));
+       DV_SET(period, spi_min_period(starget));
+       /* try QAS requests; this should be harmless to set if the
+        * target supports it */
+       DV_SET(qas, 1);
+       /* Also try IU transfers */
+       DV_SET(iu, 1);
+       if (spi_min_period(starget) < 9) {
+               /* This u320 (or u640). Ignore the coupled parameters
+                * like DT and IU, but set the optional ones */
+               DV_SET(rd_strm, 1);
+               DV_SET(wr_flow, 1);
+               DV_SET(rti, 1);
+               if (spi_min_period(starget) == 8)
+                       DV_SET(pcomp_en, 1);
+       }
 
        if (len == 0) {
-               SPI_PRINTK(sdev->sdev_target, KERN_INFO, "Domain Validation skipping write tests\n");
+               SPI_PRINTK(starget, KERN_INFO, "Domain Validation skipping write tests\n");
                spi_dv_retrain(sreq, buffer, buffer + len,
                               spi_dv_device_compare_inquiry);
                return;
        }
 
        if (len > SPI_MAX_ECHO_BUFFER_SIZE) {
-               SPI_PRINTK(sdev->sdev_target, KERN_WARNING, "Echo buffer size %d is too big, trimming to %d\n", len, SPI_MAX_ECHO_BUFFER_SIZE);
+               SPI_PRINTK(starget, KERN_WARNING, "Echo buffer size %d is too big, trimming to %d\n", len, SPI_MAX_ECHO_BUFFER_SIZE);
                len = SPI_MAX_ECHO_BUFFER_SIZE;
        }
 
@@ -892,6 +1046,16 @@ EXPORT_SYMBOL(spi_display_xfer_agreement);
        if (i->f->show_##field)                                         \
                count++
 
+#define SETUP_RELATED_ATTRIBUTE(field, rel_field)                      \
+       i->private_attrs[count] = class_device_attr_##field;            \
+       if (!i->f->set_##rel_field) {                                   \
+               i->private_attrs[count].attr.mode = S_IRUGO;            \
+               i->private_attrs[count].store = NULL;                   \
+       }                                                               \
+       i->attrs[count] = &i->private_attrs[count];                     \
+       if (i->f->show_##rel_field)                                     \
+               count++
+
 #define SETUP_HOST_ATTRIBUTE(field)                                    \
        i->private_host_attrs[count] = class_device_attr_##field;       \
        if (!i->f->set_##field) {                                       \
@@ -975,8 +1139,11 @@ spi_attach_transport(struct spi_function_template *ft)
        i->f = ft;
 
        SETUP_ATTRIBUTE(period);
+       SETUP_RELATED_ATTRIBUTE(min_period, period);
        SETUP_ATTRIBUTE(offset);
+       SETUP_RELATED_ATTRIBUTE(max_offset, offset);
        SETUP_ATTRIBUTE(width);
+       SETUP_RELATED_ATTRIBUTE(max_width, width);
        SETUP_ATTRIBUTE(iu);
        SETUP_ATTRIBUTE(dt);
        SETUP_ATTRIBUTE(qas);
index 19afb25e44d35d594db13ad36f07d29409d7c0e9..bb8235598787da5b174196bd2fa453cb5cb7c6d1 100644 (file)
@@ -1368,17 +1368,26 @@ sd_read_write_protect_flag(struct scsi_disk *sdkp, char *diskname,
  */
 static void
 sd_read_cache_type(struct scsi_disk *sdkp, char *diskname,
-                  struct scsi_request *SRpnt, unsigned char *buffer) {
+                  struct scsi_request *SRpnt, unsigned char *buffer)
+{
        int len = 0, res;
 
-       const int dbd = 0;         /* DBD */
-       const int modepage = 0x08; /* current values, cache page */
+       int dbd;
+       int modepage;
        struct scsi_mode_data data;
        struct scsi_sense_hdr sshdr;
 
        if (sdkp->device->skip_ms_page_8)
                goto defaults;
 
+       if (sdkp->device->type == TYPE_RBC) {
+               modepage = 6;
+               dbd = 8;
+       } else {
+               modepage = 8;
+               dbd = 0;
+       }
+
        /* cautiously ask */
        res = sd_do_mode_sense(SRpnt, dbd, modepage, buffer, 4, &data);
 
@@ -1409,11 +1418,20 @@ sd_read_cache_type(struct scsi_disk *sdkp, char *diskname,
                        "write back, no read (daft)"
                };
                int ct = 0;
-               int offset = data.header_length +
-                       data.block_descriptor_length + 2;
+               int offset = data.header_length + data.block_descriptor_length;
 
-               sdkp->WCE = ((buffer[offset] & 0x04) != 0);
-               sdkp->RCD = ((buffer[offset] & 0x01) != 0);
+               if ((buffer[offset] & 0x3f) != modepage) {
+                       printk(KERN_ERR "%s: got wrong page\n", diskname);
+                       goto defaults;
+               }
+
+               if (modepage == 8) {
+                       sdkp->WCE = ((buffer[offset + 2] & 0x04) != 0);
+                       sdkp->RCD = ((buffer[offset + 2] & 0x01) != 0);
+               } else {
+                       sdkp->WCE = ((buffer[offset + 2] & 0x01) == 0);
+                       sdkp->RCD = 0;
+               }
 
                ct =  sdkp->RCD + 2*sdkp->WCE;
 
@@ -1533,7 +1551,7 @@ static int sd_probe(struct device *dev)
        int error;
 
        error = -ENODEV;
-       if ((sdp->type != TYPE_DISK) && (sdp->type != TYPE_MOD))
+       if (sdp->type != TYPE_DISK && sdp->type != TYPE_MOD && sdp->type != TYPE_RBC)
                goto out;
 
        SCSI_LOG_HLQUEUE(3, printk("sd_attach: scsi device: <%d,%d,%d,%d>\n", 
@@ -1570,7 +1588,7 @@ static int sd_probe(struct device *dev)
        sdkp->openers = 0;
 
        if (!sdp->timeout) {
-               if (sdp->type == TYPE_DISK)
+               if (sdp->type != TYPE_MOD)
                        sdp->timeout = SD_TIMEOUT;
                else
                        sdp->timeout = SD_MOD_TIMEOUT;
index 4c95abb540571dc301ee3c1385f90c0f15b417ee..a0cace9aeb7991aae6abd9d0ab2e408d36b45d95 100644 (file)
@@ -97,6 +97,7 @@
 #include <linux/delay.h>
 #include <linux/blkdev.h>
 #include <linux/stat.h>
+#include <linux/delay.h>
 
 #include <asm/io.h>
 #include <asm/system.h>
@@ -1631,7 +1632,7 @@ static int seagate_st0x_bus_reset(Scsi_Cmnd * SCpnt)
        /* assert  RESET signal on SCSI bus.  */
        WRITE_CONTROL (BASE_CMD | CMD_RST);
 
-       udelay (20 * 1000);
+       mdelay (20);
 
        WRITE_CONTROL (BASE_CMD);
        st0x_aborted = DID_RESET;
@@ -1640,16 +1641,6 @@ static int seagate_st0x_bus_reset(Scsi_Cmnd * SCpnt)
        return SUCCESS;
 }
 
-static int seagate_st0x_host_reset(Scsi_Cmnd *SCpnt)
-{
-       return FAILED;
-}
-
-static int seagate_st0x_device_reset(Scsi_Cmnd *SCpnt)
-{
-       return FAILED;
-}
-
 static int seagate_st0x_release(struct Scsi_Host *shost)
 {
        if (shost->irq)
@@ -1665,8 +1656,6 @@ static Scsi_Host_Template driver_template = {
        .queuecommand           = seagate_st0x_queue_command,
        .eh_abort_handler       = seagate_st0x_abort,
        .eh_bus_reset_handler   = seagate_st0x_bus_reset,
-       .eh_host_reset_handler  = seagate_st0x_host_reset,
-       .eh_device_reset_handler = seagate_st0x_device_reset,
        .can_queue              = 1,
        .this_id                = 7,
        .sg_tablesize           = SG_ALL,
index e49e8ecfb54dce81b040006fb9263627e7168dcd..8889ff1a6b20c861d09ef099d76df854728ac476 100644 (file)
@@ -15,7 +15,5 @@ static int seagate_st0x_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 static int seagate_st0x_abort(Scsi_Cmnd *);
 static const char *seagate_st0x_info(struct Scsi_Host *);
 static int seagate_st0x_bus_reset(Scsi_Cmnd *);
-static int seagate_st0x_device_reset(Scsi_Cmnd *);
-static int seagate_st0x_host_reset(Scsi_Cmnd *);
 
 #endif /* _SEAGATE_H */
index 7936aafc3d05644bad589d0776b4ac9e6fcda00b..51292f269ce52c0fb034d6e77485b532adcb217b 100644 (file)
@@ -1430,7 +1430,7 @@ static struct file_operations sg_fops = {
        .fasync = sg_fasync,
 };
 
-static struct class_simple * sg_sysfs_class;
+static struct class *sg_sysfs_class;
 
 static int sg_sysfs_valid = 0;
 
@@ -1551,13 +1551,13 @@ sg_add(struct class_device *cl_dev)
        if (sg_sysfs_valid) {
                struct class_device * sg_class_member;
 
-               sg_class_member = class_simple_device_add(sg_sysfs_class, 
+               sg_class_member = class_device_create(sg_sysfs_class,
                                MKDEV(SCSI_GENERIC_MAJOR, k), 
                                cl_dev->dev, "%s", 
                                disk->disk_name);
                if (IS_ERR(sg_class_member))
                        printk(KERN_WARNING "sg_add: "
-                               "class_simple_device_add failed\n");
+                               "class_device_create failed\n");
                class_set_devdata(sg_class_member, sdp);
                error = sysfs_create_link(&scsidp->sdev_gendev.kobj, 
                                          &sg_class_member->kobj, "generic");
@@ -1636,7 +1636,7 @@ sg_remove(struct class_device *cl_dev)
 
        if (sdp) {
                sysfs_remove_link(&scsidp->sdev_gendev.kobj, "generic");
-               class_simple_device_remove(MKDEV(SCSI_GENERIC_MAJOR, k));
+               class_device_destroy(sg_sysfs_class, MKDEV(SCSI_GENERIC_MAJOR, k));
                cdev_del(sdp->cdev);
                sdp->cdev = NULL;
                devfs_remove("%s/generic", scsidp->devfs_name);
@@ -1677,7 +1677,7 @@ init_sg(void)
                                    SG_MAX_DEVS, "sg");
        if (rc)
                return rc;
-        sg_sysfs_class = class_simple_create(THIS_MODULE, "scsi_generic");
+        sg_sysfs_class = class_create(THIS_MODULE, "scsi_generic");
         if ( IS_ERR(sg_sysfs_class) ) {
                rc = PTR_ERR(sg_sysfs_class);
                goto err_out;
@@ -1690,7 +1690,7 @@ init_sg(void)
 #endif                         /* CONFIG_SCSI_PROC_FS */
                return 0;
        }
-       class_simple_destroy(sg_sysfs_class);
+       class_destroy(sg_sysfs_class);
 err_out:
        unregister_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), SG_MAX_DEVS);
        return rc;
@@ -1703,7 +1703,7 @@ exit_sg(void)
        sg_proc_cleanup();
 #endif                         /* CONFIG_SCSI_PROC_FS */
        scsi_unregister_interface(&sg_interface);
-       class_simple_destroy(sg_sysfs_class);
+       class_destroy(sg_sysfs_class);
        sg_sysfs_valid = 0;
        unregister_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0),
                                 SG_MAX_DEVS);
@@ -2472,6 +2472,8 @@ sg_remove_request(Sg_fd * sfp, Sg_request * srp)
        if ((!sfp) || (!srp) || (!sfp->headrp))
                return res;
        write_lock_irqsave(&sfp->rq_list_lock, iflags);
+       if (srp->my_cmdp)
+               srp->my_cmdp->upper_private_data = NULL;
        prev_rp = sfp->headrp;
        if (srp == prev_rp) {
                sfp->headrp = prev_rp->nextrp;
index 270f2aa88faad44cefae73d0b959d512e4729a7b..a5ba2c6927520daff832382a2ad82fb0f8bd2914 100644 (file)
@@ -310,7 +310,14 @@ int sgiwd93_release(struct Scsi_Host *instance)
 static int sgiwd93_bus_reset(Scsi_Cmnd *cmd)
 {
        /* FIXME perform bus-specific reset */
+
+       /* FIXME 2: kill this function, and let midlayer fallback
+          to the same result, calling wd33c93_host_reset() */
+
+       spin_lock_irq(cmd->device->host->host_lock);
        wd33c93_host_reset(cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
        return SUCCESS;
 }
 
index 265d1eed64fa9bd51e491bddbb51919fc0149566..0291a8fb654d51993c2313cf2778624eea20d53c 100644 (file)
@@ -17,7 +17,7 @@
    Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
  */
 
-static char *verstr = "20050312";
+static char *verstr = "20050501";
 
 #include <linux/module.h>
 
@@ -29,6 +29,7 @@ static char *verstr = "20050312";
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/mtio.h>
+#include <linux/cdrom.h>
 #include <linux/ioctl.h>
 #include <linux/fcntl.h>
 #include <linux/spinlock.h>
@@ -50,6 +51,7 @@ static char *verstr = "20050312";
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_ioctl.h>
 #include <scsi/scsi_request.h>
+#include <scsi/sg.h>
 
 
 /* The driver prints some debugging information on the console if DEBUG
@@ -82,7 +84,7 @@ static int try_wdio = 1;
 static int st_dev_max;
 static int st_nr_dev;
 
-static struct class_simple *st_sysfs_class;
+static struct class *st_sysfs_class;
 
 MODULE_AUTHOR("Kai Makisara");
 MODULE_DESCRIPTION("SCSI Tape Driver");
@@ -3463,7 +3465,10 @@ static int st_ioctl(struct inode *inode, struct file *file,
                case SCSI_IOCTL_GET_BUS_NUMBER:
                        break;
                default:
-                       if (!capable(CAP_SYS_ADMIN))
+                       if ((cmd_in == SG_IO ||
+                            cmd_in == SCSI_IOCTL_SEND_COMMAND ||
+                            cmd_in == CDROM_SEND_PACKET) &&
+                           !capable(CAP_SYS_RAWIO))
                                i = -EPERM;
                        else
                                i = scsi_cmd_ioctl(file, STp->disk, cmd_in, p);
@@ -3471,10 +3476,12 @@ static int st_ioctl(struct inode *inode, struct file *file,
                                return i;
                        break;
        }
-       if (!capable(CAP_SYS_ADMIN) &&
-           (cmd_in == SCSI_IOCTL_START_UNIT || cmd_in == SCSI_IOCTL_STOP_UNIT))
-               return -EPERM;
-       return scsi_ioctl(STp->device, cmd_in, p);
+       retval = scsi_ioctl(STp->device, cmd_in, p);
+       if (!retval && cmd_in == SCSI_IOCTL_STOP_UNIT) { /* unload */
+               STp->rew_at_close = 0;
+               STp->ready = ST_NO_TAPE;
+       }
+       return retval;
 
  out:
        up(&STp->lock);
@@ -4017,8 +4024,9 @@ out_free_tape:
                        if (STm->cdevs[j]) {
                                if (cdev == STm->cdevs[j])
                                        cdev = NULL;
-                               class_simple_device_remove(MKDEV(SCSI_TAPE_MAJOR,
-                                                                TAPE_MINOR(i, mode, j)));
+                               class_device_destroy(st_sysfs_class,
+                                                    MKDEV(SCSI_TAPE_MAJOR,
+                                                          TAPE_MINOR(i, mode, j)));
                                cdev_del(STm->cdevs[j]);
                        }
                }
@@ -4061,8 +4069,9 @@ static int st_remove(struct device *dev)
                                devfs_remove("%s/mt%s", SDp->devfs_name, st_formats[j]);
                                devfs_remove("%s/mt%sn", SDp->devfs_name, st_formats[j]);
                                for (j=0; j < 2; j++) {
-                                       class_simple_device_remove(MKDEV(SCSI_TAPE_MAJOR,
-                                                                        TAPE_MINOR(i, mode, j)));
+                                       class_device_destroy(st_sysfs_class,
+                                                            MKDEV(SCSI_TAPE_MAJOR,
+                                                                  TAPE_MINOR(i, mode, j)));
                                        cdev_del(tpnt->modes[mode].cdevs[j]);
                                        tpnt->modes[mode].cdevs[j] = NULL;
                                }
@@ -4127,7 +4136,7 @@ static int __init init_st(void)
                "st: Version %s, fixed bufsize %d, s/g segs %d\n",
                verstr, st_fixed_buffer_size, st_max_sg_segs);
 
-       st_sysfs_class = class_simple_create(THIS_MODULE, "scsi_tape");
+       st_sysfs_class = class_create(THIS_MODULE, "scsi_tape");
        if (IS_ERR(st_sysfs_class)) {
                st_sysfs_class = NULL;
                printk(KERN_ERR "Unable create sysfs class for SCSI tapes\n");
@@ -4141,7 +4150,7 @@ static int __init init_st(void)
                        return 0;
                }
                if (st_sysfs_class)
-                       class_simple_destroy(st_sysfs_class);           
+                       class_destroy(st_sysfs_class);
                unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
 
                                         ST_MAX_TAPE_ENTRIES);
@@ -4154,7 +4163,7 @@ static int __init init_st(void)
 static void __exit exit_st(void)
 {
        if (st_sysfs_class)
-               class_simple_destroy(st_sysfs_class);
+               class_destroy(st_sysfs_class);
        st_sysfs_class = NULL;
        do_remove_driverfs_files();
        scsi_unregister_driver(&st_template.gendrv);
@@ -4277,12 +4286,12 @@ static void do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
                snprintf(name, 10, "%s%s%s", rew ? "n" : "",
                         STp->disk->disk_name, st_formats[i]);
                st_class_member =
-                       class_simple_device_add(st_sysfs_class,
-                                               MKDEV(SCSI_TAPE_MAJOR,
-                                                     TAPE_MINOR(dev_num, mode, rew)),
-                                               &STp->device->sdev_gendev, "%s", name);
+                       class_device_create(st_sysfs_class,
+                                           MKDEV(SCSI_TAPE_MAJOR,
+                                                 TAPE_MINOR(dev_num, mode, rew)),
+                                           &STp->device->sdev_gendev, "%s", name);
                if (IS_ERR(st_class_member)) {
-                       printk(KERN_WARNING "st%d: class_simple_device_add failed\n",
+                       printk(KERN_WARNING "st%d: class_device_create failed\n",
                               dev_num);
                        goto out;
                }
index 5d1dc0e8ba21a7922675aa145afc7b4d7293c2b5..09d7639079b4897500e65f4eb1a64147403ebb27 100644 (file)
@@ -23,8 +23,6 @@
 #include <asm/dvma.h>
 #include <asm/irq.h>
 
-extern struct NCR_ESP *espchain;
-
 static void dma_barrier(struct NCR_ESP *esp);
 static int  dma_bytes_sent(struct NCR_ESP *esp, int fifo_count);
 static int  dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd *sp);
index ebfddd40ce67322840d8e115bbe773617126de2a..ef19adc67efff419565306323aa017500438bca4 100644 (file)
@@ -785,26 +785,14 @@ int sym53c416_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
        return 0;
 }
 
-static int sym53c416_abort(Scsi_Cmnd *SCpnt)
-{
-       return FAILED;
-}
-
-static int sym53c416_bus_reset(Scsi_Cmnd *SCpnt)
-{
-       return FAILED;
-}
-
-static int sym53c416_device_reset(Scsi_Cmnd *SCpnt)
-{
-       return FAILED;
-}
-
 static int sym53c416_host_reset(Scsi_Cmnd *SCpnt)
 {
        int base;
        int scsi_id = -1;       
        int i;
+       unsigned long flags;
+
+       spin_lock_irqsave(&sym53c416_lock, flags);
 
        /* printk("sym53c416_reset\n"); */
        base = SCpnt->device->host->io_port;
@@ -816,6 +804,8 @@ static int sym53c416_host_reset(Scsi_Cmnd *SCpnt)
        outb(NOOP | PIO_MODE, base + COMMAND_REG);
        outb(RESET_SCSI_BUS, base + COMMAND_REG);
        sym53c416_init(base, scsi_id);
+
+       spin_unlock_irqrestore(&sym53c416_lock, flags);
        return SUCCESS;
 }
 
@@ -865,10 +855,7 @@ static Scsi_Host_Template driver_template = {
        .detect =               sym53c416_detect,
        .info =                 sym53c416_info, 
        .queuecommand =         sym53c416_queuecommand,
-       .eh_abort_handler =     sym53c416_abort,
        .eh_host_reset_handler =sym53c416_host_reset,
-       .eh_bus_reset_handler = sym53c416_bus_reset,
-       .eh_device_reset_handler =sym53c416_device_reset,
        .release =              sym53c416_release,
        .bios_param =           sym53c416_bios_param,
        .can_queue =            1,
index 3c0e3f8301f1a7060640838ca38213bf030ebf70..fd6b120d38c4224e16c13b09e32d8084ed198fad 100644 (file)
@@ -26,10 +26,7 @@ static int sym53c416_detect(Scsi_Host_Template *);
 static const char *sym53c416_info(struct Scsi_Host *);
 static int sym53c416_release(struct Scsi_Host *);
 static int sym53c416_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
-static int sym53c416_abort(Scsi_Cmnd *);
 static int sym53c416_host_reset(Scsi_Cmnd *);
-static int sym53c416_bus_reset(Scsi_Cmnd *);
-static int sym53c416_device_reset(Scsi_Cmnd *);
 static int sym53c416_bios_param(struct scsi_device *, struct block_device *,
                sector_t, int *);
 static void sym53c416_setup(char *str, int *ints);
index 15bb89195c0947eb3211dde04be9eba00c3937d4..2d9437d7242bbd674ef646b62b76f315b3b116fa 100644 (file)
@@ -40,7 +40,7 @@
 #ifndef SYM_DEFS_H
 #define SYM_DEFS_H
 
-#define SYM_VERSION "2.2.0"
+#define SYM_VERSION "2.2.1"
 #define SYM_DRIVER_NAME        "sym-" SYM_VERSION
 
 /*
index 5b07c6ec3eccbc2845216d1fa1c1dce63039739d..d76766c3ce1643158ecc27a29dc157d0d36c9ea4 100644 (file)
@@ -155,10 +155,11 @@ pci_get_base_address(struct pci_dev *pdev, int index, unsigned long *basep)
        base = tmp;
        if ((tmp & 0x7) == PCI_BASE_ADDRESS_MEM_TYPE_64) {
                pci_read_config_dword(pdev, PCI_BAR_OFFSET(index++), &tmp);
-               if (tmp > 0)
+               if (tmp > 0) {
                        dev_err(&pdev->dev,
                                "BAR %d is 64-bit, disabling\n", index - 1);
-               base = 0;
+                       base = 0;
+               }
        }
 
        if ((base & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) {
@@ -389,13 +390,20 @@ static int sym_scatter_no_sglist(struct sym_hcb *np, struct sym_ccb *cp, struct
 {
        struct sym_tblmove *data = &cp->phys.data[SYM_CONF_MAX_SG-1];
        int segment;
+       unsigned int len = cmd->request_bufflen;
 
-       cp->data_len = cmd->request_bufflen;
-
-       if (cmd->request_bufflen) {
+       if (len) {
                dma_addr_t baddr = map_scsi_single_data(np, cmd);
                if (baddr) {
-                       sym_build_sge(np, data, baddr, cmd->request_bufflen);
+                       if (len & 1) {
+                               struct sym_tcb *tp = &np->target[cp->target];
+                               if (tp->head.wval & EWS) {
+                                       len++;
+                                       cp->odd_byte_adjustment++;
+                               }
+                       }
+                       cp->data_len = len;
+                       sym_build_sge(np, data, baddr, len);
                        segment = 1;
                } else {
                        segment = -2;
@@ -418,6 +426,7 @@ static int sym_scatter(struct sym_hcb *np, struct sym_ccb *cp, struct scsi_cmnd
                segment = sym_scatter_no_sglist(np, cp, cmd);
        else if ((use_sg = map_scsi_sg_data(np, cmd)) > 0) {
                struct scatterlist *scatter = (struct scatterlist *)cmd->buffer;
+               struct sym_tcb *tp = &np->target[cp->target];
                struct sym_tblmove *data;
 
                if (use_sg > SYM_CONF_MAX_SG) {
@@ -431,6 +440,11 @@ static int sym_scatter(struct sym_hcb *np, struct sym_ccb *cp, struct scsi_cmnd
                        dma_addr_t baddr = sg_dma_address(&scatter[segment]);
                        unsigned int len = sg_dma_len(&scatter[segment]);
 
+                       if ((len & 1) && (tp->head.wval & EWS)) {
+                               len++;
+                               cp->odd_byte_adjustment++;
+                       }
+
                        sym_build_sge(np, &data[segment], baddr, len);
                        cp->data_len += len;
                }
@@ -456,10 +470,8 @@ static int sym_queue_command(struct sym_hcb *np, struct scsi_cmnd *cmd)
         *  Minimal checkings, so that we will not 
         *  go outside our tables.
         */
-       if (sdev->id == np->myaddr ||
-           sdev->id >= SYM_CONF_MAX_TARGET ||
-           sdev->lun >= SYM_CONF_MAX_LUN) {
-               sym_xpt_done2(np, cmd, CAM_DEV_NOT_THERE);
+       if (sdev->id == np->myaddr) {
+               sym_xpt_done2(np, cmd, DID_NO_CONNECT);
                return 0;
        }
 
@@ -468,28 +480,6 @@ static int sym_queue_command(struct sym_hcb *np, struct scsi_cmnd *cmd)
         */
        tp = &np->target[sdev->id];
 
-       /*
-        *  Complete the 1st INQUIRY command with error 
-        *  condition if the device is flagged NOSCAN 
-        *  at BOOT in the NVRAM. This may speed up 
-        *  the boot and maintain coherency with BIOS 
-        *  device numbering. Clearing the flag allows 
-        *  user to rescan skipped devices later.
-        *  We also return error for devices not flagged 
-        *  for SCAN LUNS in the NVRAM since some mono-lun 
-        *  devices behave badly when asked for some non 
-        *  zero LUN. Btw, this is an absolute hack.:-)
-        */
-       if (cmd->cmnd[0] == 0x12 || cmd->cmnd[0] == 0x0) {
-               if ((tp->usrflags & SYM_SCAN_BOOT_DISABLED) ||
-                   ((tp->usrflags & SYM_SCAN_LUNS_DISABLED) && 
-                    sdev->lun != 0)) {
-                       tp->usrflags &= ~SYM_SCAN_BOOT_DISABLED;
-                       sym_xpt_done2(np, cmd, CAM_DEV_NOT_THERE);
-                       return 0;
-               }
-       }
-
        /*
         *  Select tagged/untagged.
         */
@@ -511,23 +501,10 @@ static int sym_queue_command(struct sym_hcb *np, struct scsi_cmnd *cmd)
  */
 static inline int sym_setup_cdb(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp)
 {
-       u32     cmd_ba;
-       int     cmd_len;
-
-       /*
-        *  CDB is 16 bytes max.
-        */
-       if (cmd->cmd_len > sizeof(cp->cdb_buf)) {
-               sym_set_cam_status(cp->cmd, CAM_REQ_INVALID);
-               return -1;
-       }
-
        memcpy(cp->cdb_buf, cmd->cmnd, cmd->cmd_len);
-       cmd_ba  = CCB_BA (cp, cdb_buf[0]);
-       cmd_len = cmd->cmd_len;
 
-       cp->phys.cmd.addr       = cpu_to_scr(cmd_ba);
-       cp->phys.cmd.size       = cpu_to_scr(cmd_len);
+       cp->phys.cmd.addr = CCB_BA(cp, cdb_buf[0]);
+       cp->phys.cmd.size = cpu_to_scr(cmd->cmd_len);
 
        return 0;
 }
@@ -554,10 +531,7 @@ int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct s
        if (dir != DMA_NONE) {
                cp->segments = sym_scatter(np, cp, cmd);
                if (cp->segments < 0) {
-                       if (cp->segments == -2)
-                               sym_set_cam_status(cmd, CAM_RESRC_UNAVAIL);
-                       else
-                               sym_set_cam_status(cmd, CAM_REQ_TOO_BIG);
+                       sym_set_cam_status(cmd, DID_ERROR);
                        goto out_abort;
                }
        } else {
@@ -855,7 +829,7 @@ prepare:
        ep->to_do = to_do;
        /* Complete the command with locks held as required by the driver */
        if (to_do == SYM_EH_DO_COMPLETE)
-               sym_xpt_done2(np, cmd, CAM_REQ_ABORTED);
+               sym_xpt_done2(np, cmd, DID_ABORT);
 
        /* Wait for completion with locks released, as required by kernel */
        if (to_do == SYM_EH_DO_WAIT) {
@@ -882,22 +856,46 @@ prepare:
  */
 static int sym53c8xx_eh_abort_handler(struct scsi_cmnd *cmd)
 {
-       return sym_eh_handler(SYM_EH_ABORT, "ABORT", cmd);
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = sym_eh_handler(SYM_EH_ABORT, "ABORT", cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
 }
 
 static int sym53c8xx_eh_device_reset_handler(struct scsi_cmnd *cmd)
 {
-       return sym_eh_handler(SYM_EH_DEVICE_RESET, "DEVICE RESET", cmd);
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = sym_eh_handler(SYM_EH_DEVICE_RESET, "DEVICE RESET", cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
 }
 
 static int sym53c8xx_eh_bus_reset_handler(struct scsi_cmnd *cmd)
 {
-       return sym_eh_handler(SYM_EH_BUS_RESET, "BUS RESET", cmd);
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = sym_eh_handler(SYM_EH_BUS_RESET, "BUS RESET", cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
 }
 
 static int sym53c8xx_eh_host_reset_handler(struct scsi_cmnd *cmd)
 {
-       return sym_eh_handler(SYM_EH_HOST_RESET, "HOST RESET", cmd);
+       int rc;
+
+       spin_lock_irq(cmd->device->host->host_lock);
+       rc = sym_eh_handler(SYM_EH_HOST_RESET, "HOST RESET", cmd);
+       spin_unlock_irq(cmd->device->host->host_lock);
+
+       return rc;
 }
 
 /*
@@ -921,7 +919,7 @@ static void sym_tune_dev_queuing(struct sym_tcb *tp, int lun, u_short reqtags)
        lp->s.reqtags     = reqtags;
 
        if (reqtags != oldtags) {
-               dev_info(&tp->sdev->sdev_target->dev,
+               dev_info(&tp->starget->dev,
                         "tagged command queuing %s, command queue depth %d.\n",
                          lp->s.reqtags ? "enabled" : "disabled",
                          lp->started_limit);
@@ -981,22 +979,34 @@ static int device_queue_depth(struct sym_hcb *np, int target, int lun)
        return DEF_DEPTH;
 }
 
-static int sym53c8xx_slave_alloc(struct scsi_device *device)
+static int sym53c8xx_slave_alloc(struct scsi_device *sdev)
 {
-       struct sym_hcb *np = sym_get_hcb(device->host);
-       struct sym_tcb *tp = &np->target[device->id];
-       if (!tp->sdev)
-               tp->sdev = device;
+       struct sym_hcb *np;
+       struct sym_tcb *tp;
 
-       return 0;
-}
+       if (sdev->id >= SYM_CONF_MAX_TARGET || sdev->lun >= SYM_CONF_MAX_LUN)
+               return -ENXIO;
 
-static void sym53c8xx_slave_destroy(struct scsi_device *device)
-{
-       struct sym_hcb *np = sym_get_hcb(device->host);
-       struct sym_tcb *tp = &np->target[device->id];
-       if (tp->sdev == device)
-               tp->sdev = NULL;
+       np = sym_get_hcb(sdev->host);
+       tp = &np->target[sdev->id];
+
+       /*
+        * Fail the device init if the device is flagged NOSCAN at BOOT in
+        * the NVRAM.  This may speed up boot and maintain coherency with
+        * BIOS device numbering.  Clearing the flag allows the user to
+        * rescan skipped devices later.  We also return an error for
+        * devices not flagged for SCAN LUNS in the NVRAM since some single
+        * lun devices behave badly when asked for a non zero LUN.
+        */
+
+       if ((tp->usrflags & SYM_SCAN_BOOT_DISABLED) ||
+           ((tp->usrflags & SYM_SCAN_LUNS_DISABLED) && sdev->lun != 0)) {
+               tp->usrflags &= ~SYM_SCAN_BOOT_DISABLED;
+               return -ENXIO;
+       }
+
+       tp->starget = sdev->sdev_target;
+       return 0;
 }
 
 /*
@@ -1897,6 +1907,7 @@ static int sym_detach(struct sym_hcb *np, struct pci_dev *pdev)
         */
        printk("%s: resetting chip\n", sym_name(np));
        OUTB(np, nc_istat, SRST);
+       INB(np, nc_mbox1);
        udelay(10);
        OUTB(np, nc_istat, 0);
 
@@ -1915,7 +1926,6 @@ static struct scsi_host_template sym2_template = {
        .queuecommand           = sym53c8xx_queue_command,
        .slave_alloc            = sym53c8xx_slave_alloc,
        .slave_configure        = sym53c8xx_slave_configure,
-       .slave_destroy          = sym53c8xx_slave_destroy,
        .eh_abort_handler       = sym53c8xx_eh_abort_handler,
        .eh_device_reset_handler = sym53c8xx_eh_device_reset_handler,
        .eh_bus_reset_handler   = sym53c8xx_eh_bus_reset_handler,
index e943f167fb5108346f3f9eb7f8398468a3c3a138..d3d52f14d7c01d55b2c663ae8ec8d9672e2e3bdc 100644 (file)
 #define cpu_to_scr(dw) cpu_to_le32(dw)
 #define scr_to_cpu(dw) le32_to_cpu(dw)
 
-/*
- *  Remap some status field values.
- */
-#define CAM_REQ_CMP            DID_OK
-#define CAM_SEL_TIMEOUT                DID_NO_CONNECT
-#define CAM_CMD_TIMEOUT                DID_TIME_OUT
-#define CAM_REQ_ABORTED                DID_ABORT
-#define CAM_UNCOR_PARITY       DID_PARITY
-#define CAM_SCSI_BUS_RESET     DID_RESET       
-#define CAM_REQUEUE_REQ                DID_SOFT_ERROR
-#define        CAM_UNEXP_BUSFREE       DID_ERROR
-#define        CAM_SCSI_BUSY           DID_BUS_BUSY
-
-#define        CAM_DEV_NOT_THERE       DID_NO_CONNECT
-#define        CAM_REQ_INVALID         DID_ERROR
-#define        CAM_REQ_TOO_BIG         DID_ERROR
-
-#define        CAM_RESRC_UNAVAIL       DID_ERROR
-
-/*
- *  Remap data direction values.
- */
-#define CAM_DIR_NONE           DMA_NONE
-#define CAM_DIR_IN             DMA_FROM_DEVICE
-#define CAM_DIR_OUT            DMA_TO_DEVICE
-#define CAM_DIR_UNKNOWN                DMA_BIDIRECTIONAL
-
 /*
  *  These ones are used as return code from 
  *  error recovery handlers under Linux.
index 50a176b3888d4c62336135db89eb1c9ef054bb82..e753ba27dc591a09977a4df0562103229ee13775 100644 (file)
@@ -97,7 +97,7 @@ static void sym_print_msg(struct sym_ccb *cp, char *label, u_char *msg)
 static void sym_print_nego_msg(struct sym_hcb *np, int target, char *label, u_char *msg)
 {
        struct sym_tcb *tp = &np->target[target];
-       dev_info(&tp->sdev->sdev_target->dev, "%s: ", label);
+       dev_info(&tp->starget->dev, "%s: ", label);
 
        sym_show_msg(msg);
        printf(".\n");
@@ -149,8 +149,10 @@ static char *sym_scsi_bus_mode(int mode)
 static void sym_chip_reset (struct sym_hcb *np)
 {
        OUTB(np, nc_istat, SRST);
+       INB(np, nc_mbox1);
        udelay(10);
        OUTB(np, nc_istat, 0);
+       INB(np, nc_mbox1);
        udelay(2000);   /* For BUS MODE to settle */
 }
 
@@ -216,6 +218,7 @@ int sym_reset_scsi_bus(struct sym_hcb *np, int enab_int)
        OUTB(np, nc_stest3, TE);
        OUTB(np, nc_dcntl, (np->rv_dcntl & IRQM));
        OUTB(np, nc_scntl1, CRST);
+       INB(np, nc_mbox1);
        udelay(200);
 
        if (!SYM_SETUP_SCSI_BUS_CHECK)
@@ -280,8 +283,10 @@ static void sym_selectclock(struct sym_hcb *np, u_char scntl3)
                if (!i)
                        printf("%s: the chip cannot lock the frequency\n",
                                sym_name(np));
-       } else
-               udelay((50+10));
+       } else {
+               INB(np, nc_mbox1);
+               udelay(50+10);
+       }
        OUTB(np, nc_stest3, HSC);               /* Halt the scsi clock  */
        OUTB(np, nc_scntl3, scntl3);
        OUTB(np, nc_stest1, (DBLEN|DBLSEL));/* Select clock multiplier  */
@@ -1445,7 +1450,7 @@ static void sym_check_goals(struct sym_hcb *np, struct scsi_target *starget,
 static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgptr)
 {
        struct sym_tcb *tp = &np->target[cp->target];
-       struct scsi_target *starget = tp->sdev->sdev_target;
+       struct scsi_target *starget = tp->starget;
        struct sym_trans *goal = &tp->tgoal;
        int msglen = 0;
        int nego;
@@ -1690,7 +1695,7 @@ static void sym_flush_comp_queue(struct sym_hcb *np, int cam_status)
                if (cam_status)
                        sym_set_cam_status(cmd, cam_status);
 #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
-               if (sym_get_cam_status(cmd) == CAM_REQUEUE_REQ) {
+               if (sym_get_cam_status(cmd) == DID_SOFT_ERROR) {
                        struct sym_tcb *tp = &np->target[cp->target];
                        struct sym_lcb *lp = sym_lp(tp, cp->lun);
                        if (lp) {
@@ -1791,12 +1796,13 @@ void sym_start_up (struct sym_hcb *np, int reason)
        /*
         *  Wakeup all pending jobs.
         */
-       sym_flush_busy_queue(np, CAM_SCSI_BUS_RESET);
+       sym_flush_busy_queue(np, DID_RESET);
 
        /*
         *  Init chip.
         */
        OUTB(np, nc_istat,  0x00);                      /*  Remove Reset, abort */
+       INB(np, nc_mbox1);
        udelay(2000); /* The 895 needs time for the bus mode to settle */
 
        OUTB(np, nc_scntl0, np->rv_scntl0 | 0xc0);
@@ -1905,6 +1911,7 @@ void sym_start_up (struct sym_hcb *np, int reason)
        if (np->features & (FE_ULTRA2|FE_ULTRA3)) {
                OUTONW(np, nc_sien, SBMC);
                if (reason == 0) {
+                       INB(np, nc_mbox1);
                        mdelay(100);
                        INW(np, nc_sist);
                }
@@ -2074,7 +2081,7 @@ static void sym_settrans(struct sym_hcb *np, int target, u_char opts, u_char ofs
 static void sym_setwide(struct sym_hcb *np, int target, u_char wide)
 {
        struct sym_tcb *tp = &np->target[target];
-       struct scsi_target *starget = tp->sdev->sdev_target;
+       struct scsi_target *starget = tp->starget;
 
        if (spi_width(starget) == wide)
                return;
@@ -2102,7 +2109,7 @@ sym_setsync(struct sym_hcb *np, int target,
             u_char ofs, u_char per, u_char div, u_char fak)
 {
        struct sym_tcb *tp = &np->target[target];
-       struct scsi_target *starget = tp->sdev->sdev_target;
+       struct scsi_target *starget = tp->starget;
        u_char wide = (tp->head.wval & EWS) ? BUS_16_BIT : BUS_8_BIT;
 
        sym_settrans(np, target, 0, ofs, per, wide, div, fak);
@@ -2129,7 +2136,7 @@ sym_setpprot(struct sym_hcb *np, int target, u_char opts, u_char ofs,
              u_char per, u_char wide, u_char div, u_char fak)
 {
        struct sym_tcb *tp = &np->target[target];
-       struct scsi_target *starget = tp->sdev->sdev_target;
+       struct scsi_target *starget = tp->starget;
 
        sym_settrans(np, target, opts, ofs, per, wide, div, fak);
 
@@ -2944,7 +2951,7 @@ unknown_int:
  *  Dequeue from the START queue all CCBs that match 
  *  a given target/lun/task condition (-1 means all),
  *  and move them from the BUSY queue to the COMP queue 
- *  with CAM_REQUEUE_REQ status condition.
+ *  with DID_SOFT_ERROR status condition.
  *  This function is used during error handling/recovery.
  *  It is called with SCRIPTS not running.
  */
@@ -2974,7 +2981,7 @@ sym_dequeue_from_squeue(struct sym_hcb *np, int i, int target, int lun, int task
                if ((target == -1 || cp->target == target) &&
                    (lun    == -1 || cp->lun    == lun)    &&
                    (task   == -1 || cp->tag    == task)) {
-                       sym_set_cam_status(cp->cmd, CAM_REQUEUE_REQ);
+                       sym_set_cam_status(cp->cmd, DID_SOFT_ERROR);
                        sym_remque(&cp->link_ccbq);
                        sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
                }
@@ -3093,13 +3100,13 @@ static void sym_sir_bad_scsi_status(struct sym_hcb *np, int num, struct sym_ccb
                /*
                 *  Message table indirect structure.
                 */
-               cp->phys.smsg.addr      = cpu_to_scr(CCB_BA(cp, scsi_smsg2));
+               cp->phys.smsg.addr      = CCB_BA(cp, scsi_smsg2);
                cp->phys.smsg.size      = cpu_to_scr(msglen);
 
                /*
                 *  sense command
                 */
-               cp->phys.cmd.addr       = cpu_to_scr(CCB_BA(cp, sensecmd));
+               cp->phys.cmd.addr       = CCB_BA(cp, sensecmd);
                cp->phys.cmd.size       = cpu_to_scr(6);
 
                /*
@@ -3116,7 +3123,7 @@ static void sym_sir_bad_scsi_status(struct sym_hcb *np, int num, struct sym_ccb
                 *  sense data
                 */
                memset(cp->sns_bbuf, 0, SYM_SNS_BBUF_LEN);
-               cp->phys.sense.addr     = cpu_to_scr(CCB_BA(cp, sns_bbuf));
+               cp->phys.sense.addr     = CCB_BA(cp, sns_bbuf);
                cp->phys.sense.size     = cpu_to_scr(SYM_SNS_BBUF_LEN);
 
                /*
@@ -3198,7 +3205,7 @@ int sym_clear_tasks(struct sym_hcb *np, int cam_status, int target, int lun, int
                sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
 
                /* Preserve the software timeout condition */
-               if (sym_get_cam_status(cmd) != CAM_CMD_TIMEOUT)
+               if (sym_get_cam_status(cmd) != DID_TIME_OUT)
                        sym_set_cam_status(cmd, cam_status);
                ++i;
 #if 0
@@ -3366,7 +3373,7 @@ static void sym_sir_task_recovery(struct sym_hcb *np, int num)
                 *  Make sure at least our IO to abort has been dequeued.
                 */
 #ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING
-               assert(i && sym_get_cam_status(cp->cmd) == CAM_REQUEUE_REQ);
+               assert(i && sym_get_cam_status(cp->cmd) == DID_SOFT_ERROR);
 #else
                sym_remque(&cp->link_ccbq);
                sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
@@ -3375,9 +3382,9 @@ static void sym_sir_task_recovery(struct sym_hcb *np, int num)
                 *  Keep track in cam status of the reason of the abort.
                 */
                if (cp->to_abort == 2)
-                       sym_set_cam_status(cp->cmd, CAM_CMD_TIMEOUT);
+                       sym_set_cam_status(cp->cmd, DID_TIME_OUT);
                else
-                       sym_set_cam_status(cp->cmd, CAM_REQ_ABORTED);
+                       sym_set_cam_status(cp->cmd, DID_ABORT);
 
                /*
                 *  Complete with error everything that we have dequeued.
@@ -3491,7 +3498,7 @@ static void sym_sir_task_recovery(struct sym_hcb *np, int num)
                 *  conditions not due to timeout.
                 */
                if (cp->to_abort == 2)
-                       sym_set_cam_status(cp->cmd, CAM_CMD_TIMEOUT);
+                       sym_set_cam_status(cp->cmd, DID_TIME_OUT);
                cp->to_abort = 0; /* We donnot expect to fail here */
                break;
 
@@ -3502,7 +3509,7 @@ static void sym_sir_task_recovery(struct sym_hcb *np, int num)
        case SIR_ABORT_SENT:
                target = INB(np, nc_sdid) & 0xf;
                tp = &np->target[target];
-               starget = tp->sdev->sdev_target;
+               starget = tp->starget;
                
                /*
                **  If we didn't abort anything, leave here.
@@ -3551,7 +3558,7 @@ static void sym_sir_task_recovery(struct sym_hcb *np, int num)
                 */
                i = (INL(np, nc_scratcha) - np->squeue_ba) / 4;
                sym_dequeue_from_squeue(np, i, target, lun, -1);
-               sym_clear_tasks(np, CAM_REQ_ABORTED, target, lun, task);
+               sym_clear_tasks(np, DID_ABORT, target, lun, task);
                sym_flush_comp_queue(np, 0);
 
                /*
@@ -3566,7 +3573,7 @@ static void sym_sir_task_recovery(struct sym_hcb *np, int num)
         *  Print to the log the message we intend to send.
         */
        if (num == SIR_TARGET_SELECTED) {
-               dev_info(&tp->sdev->sdev_target->dev, "control msgout:");
+               dev_info(&tp->starget->dev, "control msgout:");
                sym_printl_hex(np->abrt_msg, np->abrt_tbl.size);
                np->abrt_tbl.size = cpu_to_scr(np->abrt_tbl.size);
        }
@@ -3877,6 +3884,8 @@ int sym_compute_residual(struct sym_hcb *np, struct sym_ccb *cp)
                resid += (tmp & 0xffffff);
        }
 
+       resid -= cp->odd_byte_adjustment;
+
        /*
         *  Hopefully, the result is not too wrong.
         */
@@ -4758,10 +4767,8 @@ struct sym_ccb *sym_get_ccb (struct sym_hcb *np, struct scsi_cmnd *cmd, u_char t
        }
 
 #endif
-       /*
-        *  Remember all informations needed to free this CCB.
-        */
        cp->to_abort = 0;
+       cp->odd_byte_adjustment = 0;
        cp->tag    = tag;
        cp->order  = tag_order;
        cp->target = tn;
@@ -5104,7 +5111,7 @@ static void sym_alloc_lcb_tags (struct sym_hcb *np, u_char tn, u_char ln)
        lp->itlq_tbl = sym_calloc_dma(SYM_CONF_MAX_TASK*4, "ITLQ_TBL");
        if (!lp->itlq_tbl)
                goto fail;
-       lp->cb_tags = kcalloc(SYM_CONF_MAX_TASK, 1, GFP_KERNEL);
+       lp->cb_tags = kcalloc(SYM_CONF_MAX_TASK, 1, GFP_ATOMIC);
        if (!lp->cb_tags) {
                sym_mfree_dma(lp->itlq_tbl, SYM_CONF_MAX_TASK*4, "ITLQ_TBL");
                lp->itlq_tbl = NULL;
@@ -5243,7 +5250,7 @@ int sym_queue_scsiio(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *
        /*
         *  message
         */
-       cp->phys.smsg.addr      = cpu_to_scr(CCB_BA(cp, scsi_smsg));
+       cp->phys.smsg.addr      = CCB_BA(cp, scsi_smsg);
        cp->phys.smsg.size      = cpu_to_scr(msglen);
 
        /*
@@ -5343,7 +5350,7 @@ int sym_abort_scsiio(struct sym_hcb *np, struct scsi_cmnd *cmd, int timed_out)
 }
 
 /*
- *  Complete execution of a SCSI command with extented 
+ *  Complete execution of a SCSI command with extended 
  *  error, SCSI status error, or having been auto-sensed.
  *
  *  The SCRIPTS processor is not running there, so we 
@@ -5441,7 +5448,7 @@ if (resid)
                /*
                 *  Let's requeue it to device.
                 */
-               sym_set_cam_status(cmd, CAM_REQUEUE_REQ);
+               sym_set_cam_status(cmd, DID_SOFT_ERROR);
                goto finish;
        }
 weirdness:
index a95cbe4b8e39f988f21503654c85ab3ff74b4021..c55c7a57afa08fb8997de135979b8d8f52cd279d 100644 (file)
@@ -444,7 +444,7 @@ struct sym_tcb {
         */
        u_char  usrflags;
        u_short usrtags;
-       struct scsi_device *sdev;
+       struct scsi_target *starget;
 };
 
 /*
@@ -754,10 +754,8 @@ struct sym_ccb {
        int     segments;       /* Number of SG segments        */
 
        u8      order;          /* Tag type (if tagged command) */
+       unsigned char odd_byte_adjustment;      /* odd-sized req on wide bus */
 
-       /*
-        *  Miscellaneous status'.
-        */
        u_char  nego_status;    /* Negotiation status           */
        u_char  xerr_status;    /* Extended error flags         */
        u32     extra_bytes;    /* Extraneous bytes transferred */
@@ -809,7 +807,7 @@ struct sym_ccb {
 #endif
 };
 
-#define CCB_BA(cp,lbl) (cp->ccb_ba + offsetof(struct sym_ccb, lbl))
+#define CCB_BA(cp,lbl) cpu_to_scr(cp->ccb_ba + offsetof(struct sym_ccb, lbl))
 
 #ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
 #define        sym_goalp(cp) ((cp->host_flags & HF_DATA_IN) ? cp->goalp : cp->wgoalp)
@@ -1138,33 +1136,33 @@ static inline void sym_setup_data_pointers(struct sym_hcb *np,
         *  No segments means no data.
         */
        if (!cp->segments)
-               dir = CAM_DIR_NONE;
+               dir = DMA_NONE;
 
        /*
         *  Set the data pointer.
         */
        switch(dir) {
 #ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-       case CAM_DIR_UNKNOWN:
+       case DMA_BIDIRECTIONAL:
 #endif
-       case CAM_DIR_OUT:
+       case DMA_TO_DEVICE:
                goalp = SCRIPTA_BA(np, data_out2) + 8;
                lastp = goalp - 8 - (cp->segments * (2*4));
 #ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
                cp->wgoalp = cpu_to_scr(goalp);
-               if (dir != CAM_DIR_UNKNOWN)
+               if (dir != DMA_BIDIRECTIONAL)
                        break;
                cp->phys.head.wlastp = cpu_to_scr(lastp);
                /* fall through */
 #else
                break;
 #endif
-       case CAM_DIR_IN:
+       case DMA_FROM_DEVICE:
                cp->host_flags |= HF_DATA_IN;
                goalp = SCRIPTA_BA(np, data_in2) + 8;
                lastp = goalp - 8 - (cp->segments * (2*4));
                break;
-       case CAM_DIR_NONE:
+       case DMA_NONE:
        default:
 #ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
                cp->host_flags |= HF_DATA_IN;
@@ -1185,7 +1183,7 @@ static inline void sym_setup_data_pointers(struct sym_hcb *np,
        /*
         *  If direction is unknown, start at data_io.
         */
-       if (dir == CAM_DIR_UNKNOWN)
+       if (dir == DMA_BIDIRECTIONAL)
                cp->phys.head.savep = cpu_to_scr(SCRIPTB_BA(np, data_io));
 #endif
 }
index 1b721e3ec52021b5284885acba58b5a38998e172..cd9140e158cf6622babf7c6e3a065fa016263a40 100644 (file)
@@ -270,6 +270,7 @@ static void S24C16_set_bit(struct sym_device *np, u_char write_bit, u_char *gpre
 
        }
        OUTB(np, nc_gpreg, *gpreg);
+       INB(np, nc_mbox1);
        udelay(5);
 }
 
@@ -547,6 +548,7 @@ static int sym_read_Symbios_nvram(struct sym_device *np, Symbios_nvram *nvram)
 static void T93C46_Clk(struct sym_device *np, u_char *gpreg)
 {
        OUTB(np, nc_gpreg, *gpreg | 0x04);
+       INB(np, nc_mbox1);
        udelay(2);
        OUTB(np, nc_gpreg, *gpreg);
 }
@@ -574,6 +576,7 @@ static void T93C46_Write_Bit(struct sym_device *np, u_char write_bit, u_char *gp
        *gpreg |= 0x10;
                
        OUTB(np, nc_gpreg, *gpreg);
+       INB(np, nc_mbox1);
        udelay(2);
 
        T93C46_Clk(np, gpreg);
@@ -586,6 +589,7 @@ static void T93C46_Stop(struct sym_device *np, u_char *gpreg)
 {
        *gpreg &= 0xef;
        OUTB(np, nc_gpreg, *gpreg);
+       INB(np, nc_mbox1);
        udelay(2);
 
        T93C46_Clk(np, gpreg);
@@ -733,7 +737,8 @@ static int sym_read_parisc_pdc(struct sym_device *np, struct pdc_initiator *pdc)
        return SYM_PARISC_PDC;
 }
 #else
-static int sym_read_parisc_pdc(struct sym_device *np, struct pdc_initiator *x)
+static inline int sym_read_parisc_pdc(struct sym_device *np,
+                                       struct pdc_initiator *x)
 {
        return 0;
 }
index 6dc2897672a127822954853dfb32a792ce7a039f..f4b780e35cb66b8299bcb7bf37951012123ff5e3 100644 (file)
@@ -437,8 +437,6 @@ static Scsi_Host_Template driver_template = {
        .queuecommand   = t128_queue_command,
        .eh_abort_handler = t128_abort,
        .eh_bus_reset_handler    = t128_bus_reset,
-       .eh_host_reset_handler   = t128_host_reset,
-       .eh_device_reset_handler = t128_device_reset,
        .bios_param     = t128_biosparam,
        .can_queue      = CAN_QUEUE,
         .this_id        = 7,
index 161ba53d982ba21cdd7d7b3dd1c4a54b5c13beee..9ad1d68827a70ec10a17ee744d6b30acf663aaa8 100644 (file)
@@ -96,9 +96,7 @@ static int t128_biosparam(struct scsi_device *, struct block_device *,
                          sector_t, int*);
 static int t128_detect(Scsi_Host_Template *);
 static int t128_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
-static int t128_host_reset(Scsi_Cmnd *);
 static int t128_bus_reset(Scsi_Cmnd *);
-static int t128_device_reset(Scsi_Cmnd *);
 
 #ifndef CMD_PER_LUN
 #define CMD_PER_LUN 2
@@ -140,8 +138,6 @@ static int t128_device_reset(Scsi_Cmnd *);
 #define do_NCR5380_intr do_t128_intr
 #define NCR5380_queue_command t128_queue_command
 #define NCR5380_abort t128_abort
-#define NCR5380_host_reset t128_host_reset
-#define NCR5380_device_reset t128_device_reset
 #define NCR5380_bus_reset t128_bus_reset
 #define NCR5380_proc_info t128_proc_info
 
index ee9df02efd5b936fc5e7f3583c3d435730acc6ae..9589c67de5350100afc42f5220fb5799939237c7 100644 (file)
@@ -2120,6 +2120,8 @@ static int DC390_bus_reset (struct scsi_cmnd *cmd)
        struct dc390_acb*    pACB = (struct dc390_acb*) cmd->device->host->hostdata;
        u8   bval;
 
+       spin_lock_irq(cmd->device->host->host_lock);
+
        bval = DC390_read8(CtrlReg1) | DIS_INT_ON_SCSI_RST;
        DC390_write8(CtrlReg1, bval);   /* disable IRQ on bus reset */
 
@@ -2127,7 +2129,7 @@ static int DC390_bus_reset (struct scsi_cmnd *cmd)
        dc390_ResetSCSIBus(pACB);
 
        dc390_ResetDevParam(pACB);
-       udelay(1000);
+       mdelay(1);
        pACB->pScsiHost->last_reset = jiffies + 3*HZ/2 
                + HZ * dc390_eepromBuf[pACB->AdapterIndex][EE_DELAY];
     
@@ -2142,6 +2144,8 @@ static int DC390_bus_reset (struct scsi_cmnd *cmd)
        bval = DC390_read8(CtrlReg1) & ~DIS_INT_ON_SCSI_RST;
        DC390_write8(CtrlReg1, bval);   /* re-enable interrupt */
 
+       spin_unlock_irq(cmd->device->host->host_lock);
+
        return SUCCESS;
 }
 
index dca215411f683ce7b0aafaa68d548b626904e62e..98369ce092836e4490ff9e6450fb1bdaa69a644c 100644 (file)
@@ -446,8 +446,6 @@ static struct scsi_host_template driver_template = {
                 .release                 = u14_34f_release,
                 .queuecommand            = u14_34f_queuecommand,
                 .eh_abort_handler        = u14_34f_eh_abort,
-                .eh_device_reset_handler = NULL,
-                .eh_bus_reset_handler    = NULL,
                 .eh_host_reset_handler   = u14_34f_eh_host_reset,
                 .bios_param              = u14_34f_bios_param,
                 .slave_configure         = u14_34f_slave_configure,
@@ -1419,16 +1417,20 @@ static int u14_34f_eh_host_reset(struct scsi_cmnd *SCarg) {
    printk("%s: reset, enter, target %d.%d:%d, pid %ld.\n",
           BN(j), SCarg->device->channel, SCarg->device->id, SCarg->device->lun, SCarg->pid);
 
+   spin_lock_irq(sh[j]->host_lock);
+
    if (SCarg->host_scribble == NULL)
       printk("%s: reset, pid %ld inactive.\n", BN(j), SCarg->pid);
 
    if (HD(j)->in_reset) {
       printk("%s: reset, exit, already in reset.\n", BN(j));
+      spin_unlock_irq(sh[j]->host_lock);
       return FAILED;
       }
 
    if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
       printk("%s: reset, exit, timeout error.\n", BN(j));
+      spin_unlock_irq(sh[j]->host_lock);
       return FAILED;
       }
 
@@ -1479,6 +1481,7 @@ static int u14_34f_eh_host_reset(struct scsi_cmnd *SCarg) {
 
    if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
       printk("%s: reset, cannot reset, timeout error.\n", BN(j));
+      spin_unlock_irq(sh[j]->host_lock);
       return FAILED;
       }
 
@@ -1540,6 +1543,7 @@ static int u14_34f_eh_host_reset(struct scsi_cmnd *SCarg) {
    if (arg_done) printk("%s: reset, exit, pid %ld done.\n", BN(j), SCarg->pid);
    else          printk("%s: reset, exit.\n", BN(j));
 
+   spin_unlock_irq(sh[j]->host_lock);
    return SUCCESS;
 }
 
index 97f4d9112b48522a416679afaf380d92554943ab..486551bd54baf16b1f7603492d2bedd31e3e497a 100644 (file)
@@ -879,7 +879,7 @@ static int ultrastor_abort(Scsi_Cmnd *SCpnt)
        ogm_addr = (unsigned int)isa_bus_to_virt(inl(port0 + 23));
        icm_status = inb(port0 + 27);
        icm_addr = (unsigned int)isa_bus_to_virt(inl(port0 + 28));
-       spin_lock_irqsave(host->host_lock, flags);
+       spin_unlock_irqrestore(host->host_lock, flags);
       }
 
     /* First check to see if an interrupt is pending.  I suspect the SiS
@@ -954,9 +954,7 @@ static int ultrastor_abort(Scsi_Cmnd *SCpnt)
     SCpnt->result = DID_ABORT << 16;
     
     /* Take the host lock to guard against scsi layer re-entry */
-    spin_lock_irqsave(host->host_lock, flags);
     done(SCpnt);
-    spin_unlock_irqrestore(host->host_lock, flags);
 
     /* Need to set a timeout here in case command never completes.  */
     return SUCCESS;
index bf4a758e2801d4e541a473716b9b39d2662f99d2..fb54a87a80a3037cabdca8691b8d24113db3eaa1 100644 (file)
@@ -1586,9 +1586,16 @@ static int wd7000_host_reset(struct scsi_cmnd *SCpnt)
 {
        Adapter *host = (Adapter *) SCpnt->device->host->hostdata;
 
-       if (wd7000_adapter_reset(host) < 0)
+       spin_unlock_irq(SCpnt->device->host->host_lock);
+
+       if (wd7000_adapter_reset(host) < 0) {
+               spin_unlock_irq(SCpnt->device->host->host_lock);
                return FAILED;
+       }
+
        wd7000_enable_intr(host);
+
+       spin_unlock_irq(SCpnt->device->host->host_lock);
        return SUCCESS;
 }
 
index 33fbda79f3507f83f00ca3b9c8f9167f6500c136..0b10169961ebfe2898efecb192a00c5a47c4b1df 100644 (file)
@@ -126,18 +126,8 @@ static irqreturn_t serial21285_rx_chars(int irq, void *dev_id, struct pt_regs *r
                                flag = TTY_FRAME;
                }
 
-               if ((rxs & port->ignore_status_mask) == 0) {
-                       tty_insert_flip_char(tty, ch, flag);
-               }
-               if ((rxs & RXSTAT_OVERRUN) &&
-                   tty->flip.count < TTY_FLIPBUF_SIZE) {
-                       /*
-                        * Overrun is special, since it's reported
-                        * immediately, and doesn't affect the current
-                        * character.
-                        */
-                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
-               }
+               uart_insert_char(port, rxs, RXSTAT_OVERRUN, ch, flag);
+
                status = *CSR_UARTFLG;
        }
        tty_flip_buffer_push(tty);
index 0d9358608fdfdc8c6d53824dfc9f11a4d1fe38f9..30e8beb71430cb5e6949bae02efa5315259750cb 100644 (file)
@@ -682,8 +682,6 @@ static void autoconfig_16550a(struct uart_8250_port *up)
         * from EXCR1. Switch back to bank 0, change it in MCR. Then
         * switch back to bank 2, read it from EXCR1 again and check
         * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2
-        * On PowerPC we don't want to change baud_base, as we have
-        * a number of different divisors.  -- Tom Rini
         */
        serial_outp(up, UART_LCR, 0);
        status1 = serial_in(up, UART_MCR);
@@ -699,16 +697,25 @@ static void autoconfig_16550a(struct uart_8250_port *up)
                serial_outp(up, UART_MCR, status1);
 
                if ((status2 ^ status1) & UART_MCR_LOOP) {
-#ifndef CONFIG_PPC
+                       unsigned short quot;
+
                        serial_outp(up, UART_LCR, 0xE0);
+
+                       quot = serial_inp(up, UART_DLM) << 8;
+                       quot += serial_inp(up, UART_DLL);
+                       quot <<= 3;
+
                        status1 = serial_in(up, 0x04); /* EXCR1 */
                        status1 &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
                        status1 |= 0x10;  /* 1.625 divisor for baud_base --> 921600 */
                        serial_outp(up, 0x04, status1);
+                       
+                       serial_outp(up, UART_DLL, quot & 0xff);
+                       serial_outp(up, UART_DLM, quot >> 8);
+
                        serial_outp(up, UART_LCR, 0);
-                       up->port.uartclk = 921600*16;
-#endif
 
+                       up->port.uartclk = 921600*16;
                        up->port.type = PORT_NS16550A;
                        up->capabilities |= UART_NATSEMI;
                        return;
@@ -1122,18 +1129,9 @@ receive_chars(struct uart_8250_port *up, int *status, struct pt_regs *regs)
                }
                if (uart_handle_sysrq_char(&up->port, ch, regs))
                        goto ignore_char;
-               if ((lsr & up->port.ignore_status_mask) == 0) {
-                       tty_insert_flip_char(tty, ch, flag);
-               }
-               if ((lsr & UART_LSR_OE) &&
-                   tty->flip.count < TTY_FLIPBUF_SIZE) {
-                       /*
-                        * Overrun is special, since it's reported
-                        * immediately, and doesn't affect the current
-                        * character.
-                        */
-                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
-               }
+
+               uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag);
+
        ignore_char:
                lsr = serial_inp(up, UART_LSR);
        } while ((lsr & UART_LSR_DR) && (max_count-- > 0));
index 6e44b46c9e9dd6fd72ca9a4fdb34d3465a2b445d..25fcef2c42deeb8a1cee6716d12c7e1ec2d19456 100644 (file)
@@ -753,7 +753,7 @@ config SERIAL_MPC52xx_CONSOLE_BAUD
 
 config SERIAL_ICOM
        tristate "IBM Multiport Serial Adapter"
-       depends on PPC_ISERIES || PPC_PSERIES
+       depends on PCI && (PPC_ISERIES || PPC_PSERIES)
        select SERIAL_CORE
        help
          This driver is for a family of multiport serial adapters
@@ -843,4 +843,13 @@ config SERIAL_JSM
           To compile this driver as a module, choose M here: the
           module will be called jsm.
 
+config SERIAL_SGI_IOC4
+       tristate "SGI IOC4 controller serial support"
+       depends on (IA64_GENERIC || IA64_SGI_SN2) && SGI_IOC4
+       select SERIAL_CORE
+       help
+               If you have an SGI Altix with an IOC4 based Base IO card
+               and wish to use the serial ports on this card, say Y.
+               Otherwise, say N.
+
 endmenu
index 81b77d769b846b36612a811ed0289a2065604e99..8f1cdde7dbed7c57bf7daf379d3dfc529c5eb9a2 100644 (file)
@@ -51,4 +51,4 @@ obj-$(CONFIG_ETRAX_SERIAL) += crisv10.o
 obj-$(CONFIG_SERIAL_JSM) += jsm/
 obj-$(CONFIG_SERIAL_TXX9) += serial_txx9.o
 obj-$(CONFIG_SERIAL_VR41XX) += vr41xx_siu.o
-obj-$(CONFIG_BLK_DEV_SGIIOC4) += ioc4_serial.o
+obj-$(CONFIG_SERIAL_SGI_IOC4) += ioc4_serial.o
index f2a5e2933c4709b2b56fc4167e041b0e366e5782..2884b310e54d2d01f50d012d4394343b08b5717a 100644 (file)
@@ -198,18 +198,8 @@ pl010_rx_chars(struct uart_port *port)
                if (uart_handle_sysrq_char(port, ch, regs))
                        goto ignore_char;
 
-               if ((rsr & port->ignore_status_mask) == 0) {
-                       tty_insert_flip_char(tty, ch, flag);
-               }
-               if ((rsr & UART01x_RSR_OE) &&
-                   tty->flip.count < TTY_FLIPBUF_SIZE) {
-                       /*
-                        * Overrun is special, since it's reported
-                        * immediately, and doesn't affect the current
-                        * character
-                        */
-                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
-               }
+               uart_insert_char(port, rsr, UART01x_RSR_OE, ch, flag);
+
        ignore_char:
                status = UART_GET_FR(port);
        }
index d5cbef3fe8b6adb42cf900aaffbec87494c8fdf8..7db88ee18f75fb1f138f71921c05d833aa935a51 100644 (file)
@@ -163,18 +163,8 @@ pl011_rx_chars(struct uart_amba_port *uap)
                if (uart_handle_sysrq_char(&uap->port, ch, regs))
                        goto ignore_char;
 
-               if ((rsr & uap->port.ignore_status_mask) == 0) {
-                       tty_insert_flip_char(tty, ch, flag);
-               }
-               if ((rsr & UART01x_RSR_OE) &&
-                   tty->flip.count < TTY_FLIPBUF_SIZE) {
-                       /*
-                        * Overrun is special, since it's reported
-                        * immediately, and doesn't affect the current
-                        * character
-                        */
-                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
-               }
+               uart_insert_char(&uap->port, rsr, UART01x_RSR_OE, ch, flag);
+
        ignore_char:
                status = readw(uap->port.membase + UART01x_FR);
        }
index 6242f3090a96f76372ad8e35367bbbc790e68cf0..e92522b33c48e9e4e283b8fbd498d4e8b7e45c12 100644 (file)
@@ -143,10 +143,7 @@ static irqreturn_t clps711xuart_int_rx(int irq, void *dev_id, struct pt_regs *re
                 * CHECK: does overrun affect the current character?
                 * ASSUMPTION: it does not.
                 */
-               if ((ch & port->ignore_status_mask & ~RXSTAT_OVERRUN) == 0)
-                       tty_insert_flip_char(tty, ch, flg);
-               if ((ch & ~port->ignore_status_mask & RXSTAT_OVERRUN) == 0)
-                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
+               uart_insert_char(port, ch, UARTDR_OVERR, ch, flg);
 
        ignore_char:
                status = clps_readl(SYSFLG(port));
index b422c3abfba612830df57630e7cbb3c4682279ce..c4c8f4b44f53820a8a4ae3d3431f7c3da984b1ee 100644 (file)
@@ -134,12 +134,21 @@ void scc1_lineif(struct uart_cpm_port *pinfo)
 
 void scc2_lineif(struct uart_cpm_port *pinfo)
 {
+       /*
+        * STx GP3 uses the SCC2 secondary option pin assignment
+        * which this driver doesn't account for in the static
+        * pin assignments. This kind of board specific info
+        * really has to get out of the driver so boards can
+        * be supported in a sane fashion.
+        */
+#ifndef CONFIG_STX_GP3
        volatile iop_cpm2_t *io = &cpm2_immr->im_ioport;
        io->iop_pparb |= 0x008b0000;
        io->iop_pdirb |= 0x00880000;
        io->iop_psorb |= 0x00880000;
        io->iop_pdirb &= ~0x00030000;
        io->iop_psorb &= ~0x00030000;
+#endif
        cpm2_immr->im_cpmux.cmx_scr &= 0xff00ffff;
        cpm2_immr->im_cpmux.cmx_scr |= 0x00090000;
        pinfo->brg = 2;
index ba4e13a22a50951484dd23df491942d7109eb7a9..793c3a7cbe477c868f65d1ddf224cd64b629e889 100644 (file)
@@ -20,7 +20,7 @@
 #include <linux/serial_reg.h>
 #include <linux/module.h>
 #include <linux/pci.h>
-#include <linux/ioc4_common.h>
+#include <linux/ioc4.h>
 #include <linux/serial_core.h>
 
 /*
                                 IOC4_SIO_IR_S3_TX_EXPLICIT)
 
 /* Bitmasks for IOC4_OTHER_IR, IOC4_OTHER_IEC, and IOC4_OTHER_IES  */
-#define IOC4_OTHER_IR_ATA_INT           0x00000001  /* ATAPI intr pass-thru */
-#define IOC4_OTHER_IR_ATA_MEMERR        0x00000002  /* ATAPI DMA PCI error */
-#define IOC4_OTHER_IR_S0_MEMERR         0x00000004  /* Port 0 PCI error */
-#define IOC4_OTHER_IR_S1_MEMERR         0x00000008  /* Port 1 PCI error */
-#define IOC4_OTHER_IR_S2_MEMERR         0x00000010  /* Port 2 PCI error */
-#define IOC4_OTHER_IR_S3_MEMERR         0x00000020  /* Port 3 PCI error */
+#define IOC4_OTHER_IR_ATA_INT          0x00000001  /* ATAPI intr pass-thru */
+#define IOC4_OTHER_IR_ATA_MEMERR       0x00000002  /* ATAPI DMA PCI error */
+#define IOC4_OTHER_IR_S0_MEMERR                0x00000004  /* Port 0 PCI error */
+#define IOC4_OTHER_IR_S1_MEMERR                0x00000008  /* Port 1 PCI error */
+#define IOC4_OTHER_IR_S2_MEMERR                0x00000010  /* Port 2 PCI error */
+#define IOC4_OTHER_IR_S3_MEMERR                0x00000020  /* Port 3 PCI error */
+#define IOC4_OTHER_IR_KBD_INT          0x00000040  /* Keyboard/mouse */
+#define IOC4_OTHER_IR_RESERVED         0x007fff80  /* Reserved */
+#define IOC4_OTHER_IR_RT_INT           0x00800000  /* INT_OUT section output */
+#define IOC4_OTHER_IR_GEN_INT          0xff000000  /* Generic pins */
+
+#define IOC4_OTHER_IR_SER_MEMERR (IOC4_OTHER_IR_S0_MEMERR | IOC4_OTHER_IR_S1_MEMERR | \
+                                 IOC4_OTHER_IR_S2_MEMERR | IOC4_OTHER_IR_S3_MEMERR)
 
 /* Bitmasks for IOC4_SIO_CR */
 #define IOC4_SIO_CR_CMD_PULSE_SHIFT              0  /* byte bus strobe shift */
@@ -274,70 +281,24 @@ struct ioc4_uartregs {
 #define i4u_dlm u2.dlm
 #define i4u_fcr u3.fcr
 
-/* PCI memory space register map addressed using pci_bar0 */
-struct ioc4_memregs {
-       struct ioc4_mem {
-               /* Miscellaneous IOC4  registers */
-               uint32_t pci_err_addr_l;
-               uint32_t pci_err_addr_h;
-               uint32_t sio_ir;
-               uint32_t other_ir;
-
-               /* These registers are read-only for general kernel code.  */
-               uint32_t sio_ies_ro;
-               uint32_t other_ies_ro;
-               uint32_t sio_iec_ro;
-               uint32_t other_iec_ro;
-               uint32_t sio_cr;
-               uint32_t misc_fill1;
-               uint32_t int_out;
-               uint32_t misc_fill2;
-               uint32_t gpcr_s;
-               uint32_t gpcr_c;
-               uint32_t gpdr;
-               uint32_t misc_fill3;
-               uint32_t gppr_0;
-               uint32_t gppr_1;
-               uint32_t gppr_2;
-               uint32_t gppr_3;
-               uint32_t gppr_4;
-               uint32_t gppr_5;
-               uint32_t gppr_6;
-               uint32_t gppr_7;
-       } ioc4_mem;
-
-       char misc_fill4[0x100 - 0x5C - 4];
-
-       /* ATA/ATAP registers */
-       uint32_t ata_notused[9];
-       char ata_fill1[0x140 - 0x120 - 4];
-       uint32_t ata_notused1[8];
-       char ata_fill2[0x200 - 0x15C - 4];
-
-       /* Keyboard and mouse registers */
-       uint32_t km_notused[5];;
-       char km_fill1[0x300 - 0x210 - 4];
-
-       /* Serial port registers used for DMA serial I/O */
-       struct ioc4_serial {
-               uint32_t sbbr01_l;
-               uint32_t sbbr01_h;
-               uint32_t sbbr23_l;
-               uint32_t sbbr23_h;
-
-               struct ioc4_serialregs port_0;
-               struct ioc4_serialregs port_1;
-               struct ioc4_serialregs port_2;
-               struct ioc4_serialregs port_3;
-               struct ioc4_uartregs uart_0;
-               struct ioc4_uartregs uart_1;
-               struct ioc4_uartregs uart_2;
-               struct ioc4_uartregs uart_3;
-       } ioc4_serial;
-};
+/* Serial port registers used for DMA serial I/O */
+struct ioc4_serial {
+       uint32_t sbbr01_l;
+       uint32_t sbbr01_h;
+       uint32_t sbbr23_l;
+       uint32_t sbbr23_h;
+
+       struct ioc4_serialregs port_0;
+       struct ioc4_serialregs port_1;
+       struct ioc4_serialregs port_2;
+       struct ioc4_serialregs port_3;
+       struct ioc4_uartregs uart_0;
+       struct ioc4_uartregs uart_1;
+       struct ioc4_uartregs uart_2;
+       struct ioc4_uartregs uart_3;
+} ioc4_serial;
 
 /* UART clock speed */
-#define IOC4_SER_XIN_CLK        IOC4_SER_XIN_CLK_66
 #define IOC4_SER_XIN_CLK_66     66666667
 #define IOC4_SER_XIN_CLK_33     33333333
 
@@ -412,8 +373,8 @@ enum sio_proto {
                                        | UART_LCR_WLEN7 | UART_LCR_WLEN8)
 #define LCR_MASK_STOP_BITS     (UART_LCR_STOP)
 
-#define PENDING(_p)    (readl(&(_p)->ip_mem->sio_ir) & _p->ip_ienb)
-#define READ_SIO_IR(_p) readl(&(_p)->ip_mem->sio_ir)
+#define PENDING(_p)    (readl(&(_p)->ip_mem->sio_ir.raw) & _p->ip_ienb)
+#define READ_SIO_IR(_p) readl(&(_p)->ip_mem->sio_ir.raw)
 
 /* Default to 4k buffers */
 #ifdef IOC4_1K_BUFFERS
@@ -447,7 +408,7 @@ struct ioc4_control {
  */
 #define MAX_IOC4_INTR_ENTS     (8 * sizeof(uint32_t))
 struct ioc4_soft {
-       struct ioc4_mem __iomem *is_ioc4_mem_addr;
+       struct ioc4_misc_regs __iomem *is_ioc4_misc_addr;
        struct ioc4_serial __iomem *is_ioc4_serial_addr;
 
        /* Each interrupt type has an entry in the array */
@@ -486,7 +447,7 @@ struct ioc4_port {
        struct ioc4_soft *ip_ioc4_soft;
 
        /* pci mem addresses */
-       struct ioc4_mem __iomem *ip_mem;
+       struct ioc4_misc_regs __iomem *ip_mem;
        struct ioc4_serial __iomem *ip_serial;
        struct ioc4_serialregs __iomem *ip_serial_regs;
        struct ioc4_uartregs __iomem *ip_uart_regs;
@@ -553,7 +514,7 @@ struct hooks {
        uint32_t intr_dma_error;
        uint32_t intr_clear;
        uint32_t intr_all;
-       char rs422_select_pin;
+       int rs422_select_pin;
 };
 
 static struct hooks hooks_array[IOC4_NUM_SERIAL_PORTS] = {
@@ -669,7 +630,7 @@ static void handle_intr(void *arg, uint32_t sio_ir);
 static inline void
 write_ireg(struct ioc4_soft *ioc4_soft, uint32_t val, int which, int type)
 {
-       struct ioc4_mem __iomem *mem = ioc4_soft->is_ioc4_mem_addr;
+       struct ioc4_misc_regs __iomem *mem = ioc4_soft->is_ioc4_misc_addr;
        unsigned long flags;
 
        spin_lock_irqsave(&ioc4_soft->is_ir_lock, flags);
@@ -678,11 +639,11 @@ write_ireg(struct ioc4_soft *ioc4_soft, uint32_t val, int which, int type)
        case IOC4_SIO_INTR_TYPE:
                switch (which) {
                case IOC4_W_IES:
-                       writel(val, &mem->sio_ies_ro);
+                       writel(val, &mem->sio_ies.raw);
                        break;
 
                case IOC4_W_IEC:
-                       writel(val, &mem->sio_iec_ro);
+                       writel(val, &mem->sio_iec.raw);
                        break;
                }
                break;
@@ -690,11 +651,11 @@ write_ireg(struct ioc4_soft *ioc4_soft, uint32_t val, int which, int type)
        case IOC4_OTHER_INTR_TYPE:
                switch (which) {
                case IOC4_W_IES:
-                       writel(val, &mem->other_ies_ro);
+                       writel(val, &mem->other_ies.raw);
                        break;
 
                case IOC4_W_IEC:
-                       writel(val, &mem->other_iec_ro);
+                       writel(val, &mem->other_iec.raw);
                        break;
                }
                break;
@@ -747,7 +708,8 @@ static int set_baud(struct ioc4_port *port, int baud)
  */
 static struct ioc4_port *get_ioc4_port(struct uart_port *the_port)
 {
-       struct ioc4_control *control = dev_get_drvdata(the_port->dev);
+       struct ioc4_driver_data *idd = dev_get_drvdata(the_port->dev);
+       struct ioc4_control *control = idd->idd_serial_data;
        int ii;
 
        if (control) {
@@ -782,7 +744,7 @@ static struct ioc4_port *get_ioc4_port(struct uart_port *the_port)
 static inline uint32_t
 pending_intrs(struct ioc4_soft *soft, int type)
 {
-       struct ioc4_mem __iomem *mem = soft->is_ioc4_mem_addr;
+       struct ioc4_misc_regs __iomem *mem = soft->is_ioc4_misc_addr;
        unsigned long flag;
        uint32_t intrs = 0;
 
@@ -793,11 +755,11 @@ pending_intrs(struct ioc4_soft *soft, int type)
 
        switch (type) {
        case IOC4_SIO_INTR_TYPE:
-               intrs = readl(&mem->sio_ir) & readl(&mem->sio_ies_ro);
+               intrs = readl(&mem->sio_ir.raw) & readl(&mem->sio_ies.raw);
                break;
 
        case IOC4_OTHER_INTR_TYPE:
-               intrs = readl(&mem->other_ir) & readl(&mem->other_ies_ro);
+               intrs = readl(&mem->other_ir.raw) & readl(&mem->other_ies.raw);
 
                /* Don't process any ATA interrupte */
                intrs &= ~(IOC4_OTHER_IR_ATA_INT | IOC4_OTHER_IR_ATA_MEMERR);
@@ -826,7 +788,7 @@ static int inline port_init(struct ioc4_port *port)
 
        /* Wait until any pending bus activity for this port has ceased */
        do
-               sio_cr = readl(&port->ip_mem->sio_cr);
+               sio_cr = readl(&port->ip_mem->sio_cr.raw);
        while (!(sio_cr & IOC4_SIO_CR_SIO_DIAG_IDLE));
 
        /* Finish reset sequence */
@@ -899,7 +861,7 @@ static int inline port_init(struct ioc4_port *port)
        write_ireg(port->ip_ioc4_soft, hooks->intr_clear,
                       IOC4_W_IEC, IOC4_SIO_INTR_TYPE);
        port->ip_ienb &= ~hooks->intr_clear;
-       writel(hooks->intr_clear, &port->ip_mem->sio_ir);
+       writel(hooks->intr_clear, &port->ip_mem->sio_ir.raw);
        return 0;
 }
 
@@ -918,23 +880,23 @@ static void handle_dma_error_intr(void *arg, uint32_t other_ir)
        spin_lock_irqsave(&port->ip_lock, flags);
 
        /* ACK the interrupt */
-       writel(hooks->intr_dma_error, &port->ip_mem->other_ir);
+       writel(hooks->intr_dma_error, &port->ip_mem->other_ir.raw);
 
-       if (readl(&port->ip_mem->pci_err_addr_l) & IOC4_PCI_ERR_ADDR_VLD) {
+       if (readl(&port->ip_mem->pci_err_addr_l.raw) & IOC4_PCI_ERR_ADDR_VLD) {
                printk(KERN_ERR
                        "PCI error address is 0x%lx, "
                                "master is serial port %c %s\n",
                     (((uint64_t)readl(&port->ip_mem->pci_err_addr_h)
                                                         << 32)
-                               | readl(&port->ip_mem->pci_err_addr_l))
+                               | readl(&port->ip_mem->pci_err_addr_l.raw))
                                        & IOC4_PCI_ERR_ADDR_ADDR_MSK, '1' +
-                    ((char)(readl(&port->ip_mem-> pci_err_addr_l) &
+                    ((char)(readl(&port->ip_mem->pci_err_addr_l.raw) &
                             IOC4_PCI_ERR_ADDR_MST_NUM_MSK) >> 1),
-                    (readl(&port->ip_mem->pci_err_addr_l)
+                    (readl(&port->ip_mem->pci_err_addr_l.raw)
                                & IOC4_PCI_ERR_ADDR_MST_TYP_MSK)
                                ? "RX" : "TX");
 
-               if (readl(&port->ip_mem->pci_err_addr_l)
+               if (readl(&port->ip_mem->pci_err_addr_l.raw)
                                                & IOC4_PCI_ERR_ADDR_MUL_ERR) {
                        printk(KERN_ERR
                                "Multiple errors occurred\n");
@@ -1018,26 +980,26 @@ static irqreturn_t ioc4_intr(int irq, void *arg, struct pt_regs *regs)
                                "other_ies = 0x%x\n",
                               (intr_type == IOC4_SIO_INTR_TYPE) ? "sio" :
                               "other", this_ir,
-                              readl(&soft->is_ioc4_mem_addr->sio_ir),
-                              readl(&soft->is_ioc4_mem_addr->sio_ies_ro),
-                              readl(&soft->is_ioc4_mem_addr->other_ir),
-                              readl(&soft->is_ioc4_mem_addr->other_ies_ro));
+                              readl(&soft->is_ioc4_misc_addr->sio_ir.raw),
+                              readl(&soft->is_ioc4_misc_addr->sio_ies.raw),
+                              readl(&soft->is_ioc4_misc_addr->other_ir.raw),
+                              readl(&soft->is_ioc4_misc_addr->other_ies.raw));
                }
        }
 #ifdef DEBUG_INTERRUPTS
        {
-               struct ioc4_mem __iomem *mem = soft->is_ioc4_mem_addr;
+               struct ioc4_misc_regs __iomem *mem = soft->is_ioc4_misc_addr;
                spinlock_t *lp = &soft->is_ir_lock;
                unsigned long flag;
 
                spin_lock_irqsave(&soft->is_ir_lock, flag);
-               printk ("%s : %d : mem 0x%p sio_ir 0x%x sio_ies_ro 0x%x "
-                               "other_ir 0x%x other_ies_ro 0x%x mask 0x%x\n",
+               printk ("%s : %d : mem 0x%p sio_ir 0x%x sio_ies 0x%x "
+                               "other_ir 0x%x other_ies 0x%x mask 0x%x\n",
                     __FUNCTION__, __LINE__,
-                    (void *)mem, readl(&mem->sio_ir),
-                    readl(&mem->sio_ies_ro),
-                    readl(&mem->other_ir),
-                    readl(&mem->other_ies_ro),
+                    (void *)mem, readl(&mem->sio_ir.raw),
+                    readl(&mem->sio_ies.raw),
+                    readl(&mem->other_ir.raw),
+                    readl(&mem->other_ies.raw),
                     IOC4_OTHER_IR_ATA_INT | IOC4_OTHER_IR_ATA_MEMERR);
                spin_unlock_irqrestore(&soft->is_ir_lock, flag);
        }
@@ -1049,21 +1011,20 @@ static irqreturn_t ioc4_intr(int irq, void *arg, struct pt_regs *regs)
  * ioc4_attach_local - Device initialization.
  *                     Called at *_attach() time for each
  *                     IOC4 with serial ports in the system.
- * @control: ioc4_control ptr
- * @pdev: PCI handle for this device
- * @soft: soft struct for this device
- * @ioc4: ioc4 mem space
+ * @idd: Master module data for this IOC4
  */
-static int inline ioc4_attach_local(struct pci_dev *pdev,
-                       struct ioc4_control *control,
-                       struct ioc4_soft *soft, void __iomem *ioc4_mem,
-                       void __iomem *ioc4_serial)
+static int inline ioc4_attach_local(struct ioc4_driver_data *idd)
 {
        struct ioc4_port *port;
        struct ioc4_port *ports[IOC4_NUM_SERIAL_PORTS];
        int port_number;
        uint16_t ioc4_revid_min = 62;
        uint16_t ioc4_revid;
+       struct pci_dev *pdev = idd->idd_pdev;
+       struct ioc4_control* control = idd->idd_serial_data;
+       struct ioc4_soft *soft = control->ic_soft;
+       void __iomem *ioc4_misc = idd->idd_misc_regs;
+       void __iomem *ioc4_serial = soft->is_ioc4_serial_addr;
 
        /* IOC4 firmware must be at least rev 62 */
        pci_read_config_word(pdev, PCI_COMMAND_SPECIAL, &ioc4_revid);
@@ -1076,7 +1037,7 @@ static int inline ioc4_attach_local(struct pci_dev *pdev,
                                ioc4_revid, ioc4_revid_min);
                return -EPERM;
        }
-       BUG_ON(ioc4_mem == NULL);
+       BUG_ON(ioc4_misc == NULL);
        BUG_ON(ioc4_serial == NULL);
 
        /* Create port structures for each port */
@@ -1100,10 +1061,18 @@ static int inline ioc4_attach_local(struct pci_dev *pdev,
                port->ip_ioc4_soft = soft;
                port->ip_pdev = pdev;
                port->ip_ienb = 0;
-               port->ip_pci_bus_speed = IOC4_SER_XIN_CLK;
+               /* Use baud rate calculations based on detected PCI
+                * bus speed.  Simply test whether the PCI clock is
+                * running closer to 66MHz or 33MHz.
+                */
+               if (idd->count_period/IOC4_EXTINT_COUNT_DIVISOR < 20) {
+                       port->ip_pci_bus_speed = IOC4_SER_XIN_CLK_66;
+               } else {
+                       port->ip_pci_bus_speed = IOC4_SER_XIN_CLK_33;
+               }
                port->ip_baud = 9600;
                port->ip_control = control;
-               port->ip_mem = ioc4_mem;
+               port->ip_mem = ioc4_misc;
                port->ip_serial = ioc4_serial;
 
                /* point to the right hook */
@@ -1604,14 +1573,12 @@ static int ioc4_set_proto(struct ioc4_port *port, enum sio_proto proto)
        switch (proto) {
        case PROTO_RS232:
                /* Clear the appropriate GIO pin */
-               writel(0, (&port->ip_mem->gppr_0 +
-                                 hooks->rs422_select_pin));
+               writel(0, (&port->ip_mem->gppr[hooks->rs422_select_pin].raw));
                break;
 
        case PROTO_RS422:
                /* Set the appropriate GIO pin */
-               writel(1, (&port->ip_mem->gppr_0 +
-                                 hooks->rs422_select_pin));
+               writel(1, (&port->ip_mem->gppr[hooks->rs422_select_pin].raw));
                break;
 
        default:
@@ -1885,7 +1852,7 @@ static void handle_intr(void *arg, uint32_t sio_ir)
                if (sio_ir & hooks->intr_delta_dcd) {
                        /* ACK the interrupt */
                        writel(hooks->intr_delta_dcd,
-                               &port->ip_mem->sio_ir);
+                               &port->ip_mem->sio_ir.raw);
 
                        shadow = readl(&port->ip_serial_regs->shadow);
 
@@ -1907,7 +1874,7 @@ static void handle_intr(void *arg, uint32_t sio_ir)
                if (sio_ir & hooks->intr_delta_cts) {
                        /* ACK the interrupt */
                        writel(hooks->intr_delta_cts,
-                                       &port->ip_mem->sio_ir);
+                                       &port->ip_mem->sio_ir.raw);
 
                        shadow = readl(&port->ip_serial_regs->shadow);
 
@@ -1928,7 +1895,7 @@ static void handle_intr(void *arg, uint32_t sio_ir)
                if (sio_ir & hooks->intr_rx_timer) {
                        /* ACK the interrupt */
                        writel(hooks->intr_rx_timer,
-                               &port->ip_mem->sio_ir);
+                               &port->ip_mem->sio_ir.raw);
 
                        if ((port->ip_notify & N_DATA_READY)
                                        && (port->ip_port)) {
@@ -1974,7 +1941,7 @@ static void handle_intr(void *arg, uint32_t sio_ir)
 
                        /* ACK the interrupt */
                        writel(hooks->intr_tx_explicit,
-                                       &port->ip_mem->sio_ir);
+                                       &port->ip_mem->sio_ir.raw);
 
                        if (port->ip_notify & N_OUTPUT_LOWAT)
                                ioc4_cb_output_lowat(port);
@@ -2634,7 +2601,8 @@ ioc4_serial_core_attach(struct pci_dev *pdev)
 {
        struct ioc4_port *port;
        struct uart_port *the_port;
-       struct ioc4_control *control = pci_get_drvdata(pdev);
+       struct ioc4_driver_data *idd = pci_get_drvdata(pdev);
+       struct ioc4_control *control = idd->idd_serial_data;
        int ii;
 
        DPRINT_CONFIG(("%s: attach pdev 0x%p - control 0x%p\n",
@@ -2680,55 +2648,29 @@ ioc4_serial_core_attach(struct pci_dev *pdev)
 
 /**
  * ioc4_serial_attach_one - register attach function
- *             called per card found from ioc4_serial_detect as part
- *             of module_init().
- * @pdev: handle for this card
- * @pci_id: pci id for this card
+ *             called per card found from IOC4 master module.
+ * @idd: Master module data for this IOC4
  */
 int
-ioc4_serial_attach_one(struct pci_dev *pdev, const struct pci_device_id *pci_id)
+ioc4_serial_attach_one(struct ioc4_driver_data *idd)
 {
-       struct ioc4_mem __iomem *mem;
-       unsigned long tmp_addr, tmp_addr1;
+       unsigned long tmp_addr1;
        struct ioc4_serial __iomem *serial;
        struct ioc4_soft *soft;
        struct ioc4_control *control;
-       int tmp, ret = 0;
+       int ret = 0;
 
 
-       DPRINT_CONFIG(("%s (0x%p, 0x%p)\n", __FUNCTION__, pdev, pci_id));
-
-       /* Map in the ioc4 memory */
-       tmp_addr = pci_resource_start(pdev, 0);
-       if (!tmp_addr) {
-               printk(KERN_WARNING
-                        "ioc4 (%p) : unable to get PIO mapping for "
-                               "MEM space\n", (void *)pdev);
-               return -ENODEV;
-       }
-       if (!request_region(tmp_addr, sizeof(struct ioc4_mem), "sioc4_mem")) {
-               printk(KERN_ALERT
-                       "ioc4 (%p): unable to get request region for "
-                       "MEM space\n", (void *)pdev);
-               return -ENODEV;
-       }
-       mem = ioremap(tmp_addr, sizeof(struct ioc4_mem));
-       if (!mem) {
-               printk(KERN_WARNING
-                        "ioc4 (%p) : unable to remap ioc4 memory\n",
-                               (void *)pdev);
-               ret = -ENODEV;
-               goto out1;
-       }
+       DPRINT_CONFIG(("%s (0x%p, 0x%p)\n", __FUNCTION__, idd->idd_pdev, idd->idd_pci_id));
 
        /* request serial registers */
-       tmp_addr1 = pci_resource_start(pdev, 0) + IOC4_SERIAL_OFFSET;
+       tmp_addr1 = idd->idd_bar0 + IOC4_SERIAL_OFFSET;
 
        if (!request_region(tmp_addr1, sizeof(struct ioc4_serial),
                                        "sioc4_uart")) {
                printk(KERN_WARNING
                        "ioc4 (%p): unable to get request region for "
-                               "uart space\n", (void *)pdev);
+                               "uart space\n", (void *)idd->idd_pdev);
                ret = -ENODEV;
                goto out1;
        }
@@ -2736,12 +2678,12 @@ ioc4_serial_attach_one(struct pci_dev *pdev, const struct pci_device_id *pci_id)
        if (!serial) {
                printk(KERN_WARNING
                         "ioc4 (%p) : unable to remap ioc4 serial register\n",
-                               (void *)pdev);
+                               (void *)idd->idd_pdev);
                ret = -ENODEV;
                goto out2;
        }
        DPRINT_CONFIG(("%s : mem 0x%p, serial 0x%p\n",
-                               __FUNCTION__, (void *)mem, (void *)serial));
+                               __FUNCTION__, (void *)idd->idd_misc_regs, (void *)serial));
 
        /* Get memory for the new card */
        control = kmalloc(sizeof(struct ioc4_control) * IOC4_NUM_SERIAL_PORTS,
@@ -2754,59 +2696,56 @@ ioc4_serial_attach_one(struct pci_dev *pdev, const struct pci_device_id *pci_id)
                goto out2;
        }
        memset(control, 0, sizeof(struct ioc4_control));
-       pci_set_drvdata(pdev, control);
+       idd->idd_serial_data = control;
 
        /* Allocate the soft structure */
        soft = kmalloc(sizeof(struct ioc4_soft), GFP_KERNEL);
        if (!soft) {
                printk(KERN_WARNING
                       "ioc4 (%p): unable to get memory for the soft struct\n",
-                      (void *)pdev);
+                      (void *)idd->idd_pdev);
                ret = -ENOMEM;
                goto out3;
        }
        memset(soft, 0, sizeof(struct ioc4_soft));
 
        spin_lock_init(&soft->is_ir_lock);
-       soft->is_ioc4_mem_addr = mem;
+       soft->is_ioc4_misc_addr = idd->idd_misc_regs;
        soft->is_ioc4_serial_addr = serial;
 
        /* Init the IOC4 */
-       pci_read_config_dword(pdev, PCI_COMMAND, &tmp);
-       pci_write_config_dword(pdev, PCI_COMMAND,
-                              tmp | PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
-
-       writel(0xf << IOC4_SIO_CR_CMD_PULSE_SHIFT, &mem->sio_cr);
+       writel(0xf << IOC4_SIO_CR_CMD_PULSE_SHIFT,
+              &idd->idd_misc_regs->sio_cr.raw);
 
        /* Enable serial port mode select generic PIO pins as outputs */
        writel(IOC4_GPCR_UART0_MODESEL | IOC4_GPCR_UART1_MODESEL
                | IOC4_GPCR_UART2_MODESEL | IOC4_GPCR_UART3_MODESEL,
-               &mem->gpcr_s);
+               &idd->idd_misc_regs->gpcr_s.raw);
 
-       /* Clear and disable all interrupts */
+       /* Clear and disable all serial interrupts */
        write_ireg(soft, ~0, IOC4_W_IEC, IOC4_SIO_INTR_TYPE);
-       writel(~0, &mem->sio_ir);
-       write_ireg(soft, ~(IOC4_OTHER_IR_ATA_INT | IOC4_OTHER_IR_ATA_MEMERR),
-                       IOC4_W_IEC, IOC4_OTHER_INTR_TYPE);
-       writel(~(IOC4_OTHER_IR_ATA_MEMERR | IOC4_OTHER_IR_ATA_MEMERR),
-                                       &mem->other_ir);
+       writel(~0, &idd->idd_misc_regs->sio_ir.raw);
+       write_ireg(soft, IOC4_OTHER_IR_SER_MEMERR, IOC4_W_IEC,
+                  IOC4_OTHER_INTR_TYPE);
+       writel(IOC4_OTHER_IR_SER_MEMERR, &idd->idd_misc_regs->other_ir.raw);
        control->ic_soft = soft;
-       if (!request_irq(pdev->irq, ioc4_intr, SA_SHIRQ,
+
+       /* Hook up interrupt handler */
+       if (!request_irq(idd->idd_pdev->irq, ioc4_intr, SA_SHIRQ,
                                "sgi-ioc4serial", (void *)soft)) {
-               control->ic_irq = pdev->irq;
+               control->ic_irq = idd->idd_pdev->irq;
        } else {
                printk(KERN_WARNING
                    "%s : request_irq fails for IRQ 0x%x\n ",
-                       __FUNCTION__, pdev->irq);
+                       __FUNCTION__, idd->idd_pdev->irq);
        }
-       if ((ret = ioc4_attach_local(pdev, control, soft,
-                               soft->is_ioc4_mem_addr,
-                               soft->is_ioc4_serial_addr)))
+       ret = ioc4_attach_local(idd);
+       if (ret)
                goto out4;
 
        /* register port with the serial core */
 
-       if ((ret = ioc4_serial_core_attach(pdev)))
+       if ((ret = ioc4_serial_core_attach(idd->idd_pdev)))
                goto out4;
 
        return ret;
@@ -2819,7 +2758,6 @@ out3:
 out2:
        release_region(tmp_addr1, sizeof(struct ioc4_serial));
 out1:
-       release_region(tmp_addr, sizeof(struct ioc4_mem));
 
        return ret;
 }
@@ -2828,11 +2766,10 @@ out1:
 /**
  * ioc4_serial_remove_one - detach function
  *
- * @pdev: handle for this card
+ * @idd: IOC4 master module data for this IOC4
  */
 
-#if 0
-void ioc4_serial_remove_one(struct pci_dev *pdev)
+int ioc4_serial_remove_one(struct ioc4_driver_data *idd)
 {
        int ii;
        struct ioc4_control *control;
@@ -2840,7 +2777,7 @@ void ioc4_serial_remove_one(struct pci_dev *pdev)
        struct ioc4_port *port;
        struct ioc4_soft *soft;
 
-       control = pci_get_drvdata(pdev);
+       control = idd->idd_serial_data;
 
        for (ii = 0; ii < IOC4_NUM_SERIAL_PORTS; ii++) {
                the_port = &control->ic_port[ii].icp_uart_port;
@@ -2867,10 +2804,17 @@ void ioc4_serial_remove_one(struct pci_dev *pdev)
                kfree(soft);
        }
        kfree(control);
-       pci_set_drvdata(pdev, NULL);
-       uart_unregister_driver(&ioc4_uart);
+       idd->idd_serial_data = NULL;
+
+       return 0;
 }
-#endif
+
+static struct ioc4_submodule ioc4_serial_submodule = {
+       .is_name = "IOC4_serial",
+       .is_owner = THIS_MODULE,
+       .is_probe = ioc4_serial_attach_one,
+       .is_remove = ioc4_serial_remove_one,
+};
 
 /**
  * ioc4_serial_init - module init
@@ -2886,12 +2830,20 @@ int ioc4_serial_init(void)
                        __FUNCTION__);
                return ret;
        }
-       return 0;
+
+       /* register with IOC4 main module */
+       return ioc4_register_submodule(&ioc4_serial_submodule);
+}
+
+static void __devexit ioc4_serial_exit(void)
+{
+       ioc4_unregister_submodule(&ioc4_serial_submodule);
+       uart_unregister_driver(&ioc4_uart);
 }
 
+module_init(ioc4_serial_init);
+module_exit(ioc4_serial_exit);
+
 MODULE_AUTHOR("Pat Gefre - Silicon Graphics Inc. (SGI) <pfg@sgi.com>");
 MODULE_DESCRIPTION("Serial PCI driver module for SGI IOC4 Base-IO Card");
 MODULE_LICENSE("GPL");
-
-EXPORT_SYMBOL(ioc4_serial_init);
-EXPORT_SYMBOL(ioc4_serial_attach_one);
index 51d8a49f4477bb6f23048b361e4ad367ecdb9758..9dc151d8fa612bb16554f6d4d15382a5d4eaf7ab 100644 (file)
@@ -161,20 +161,12 @@ receive_chars(struct uart_pxa_port *up, int *status, struct pt_regs *regs)
                        else if (*status & UART_LSR_FE)
                                flag = TTY_FRAME;
                }
+
                if (uart_handle_sysrq_char(&up->port, ch, regs))
                        goto ignore_char;
-               if ((*status & up->port.ignore_status_mask) == 0) {
-                       tty_insert_flip_char(tty, ch, flag);
-               }
-               if ((*status & UART_LSR_OE) &&
-                   tty->flip.count < TTY_FLIPBUF_SIZE) {
-                       /*
-                        * Overrun is special, since it's reported
-                        * immediately, and doesn't affect the current
-                        * character.
-                        */
-                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
-               }
+
+               uart_insert_char(&up->port, *status, UART_LSR_OE, ch, flag);
+
        ignore_char:
                *status = serial_in(up, UART_LSR);
        } while ((*status & UART_LSR_DR) && (max_count-- > 0));
index 435750d40a471001c860ba0b21b0443901534eab..2a9f7ade2c9d58faa134e84d698d9025af5365b1 100644 (file)
@@ -394,20 +394,7 @@ s3c24xx_serial_rx_chars(int irq, void *dev_id, struct pt_regs *regs)
                if (uart_handle_sysrq_char(port, ch, regs))
                        goto ignore_char;
 
-               if ((uerstat & port->ignore_status_mask) == 0) {
-                       tty_insert_flip_char(tty, ch, flag);
-               }
-
-               if ((uerstat & S3C2410_UERSTAT_OVERRUN) &&
-                   tty->flip.count < TTY_FLIPBUF_SIZE) {
-                       /*
-                        * Overrun is special, since it's reported
-                        * immediately, and doesn't affect the current
-                        * character.
-                        */
-
-                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
-               }
+               uart_insert_char(port, uerstat, S3C2410_UERSTAT_OVERRUN, ch, flag);
 
        ignore_char:
                continue;
index 157218bc6c6fba4ddbce2e2294d381903a620eb5..98641c3f5ab9dedb9de0dd1be2eb1806469fb692 100644 (file)
@@ -197,7 +197,7 @@ static void
 sa1100_rx_chars(struct sa1100_port *sport, struct pt_regs *regs)
 {
        struct tty_struct *tty = sport->port.info->tty;
-       unsigned int status, ch, flg, ignored = 0;
+       unsigned int status, ch, flg;
 
        status = UTSR1_TO_SM(UART_GET_UTSR1(sport)) |
                 UTSR0_TO_SM(UART_GET_UTSR0(sport));
@@ -237,10 +237,7 @@ sa1100_rx_chars(struct sa1100_port *sport, struct pt_regs *regs)
                if (uart_handle_sysrq_char(&sport->port, ch, regs))
                        goto ignore_char;
 
-               if ((status & port->ignore_status_mask & ~UTSR1_TO_SM(UTSR1_ROR)) == 0)
-                       tty_insert_flip_char(tty, ch, flg);
-               if (status & ~port->ignore_status_mask & UTSR1_TO_SM(UTSR1_ROR))
-                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
+               uart_insert_char(&sport->port, status, UTSR1_TO_SM(UTSR1_ROR), ch, flg);
 
        ignore_char:
                status = UTSR1_TO_SM(UART_GET_UTSR1(sport)) |
index 6eeb48f6a482a739bd1b24071fc4a01637529db3..0d7b65f93e8de505602dbf26d0dd8734f84e3d23 100644 (file)
@@ -661,10 +661,10 @@ void serial_config(dev_link_t * link)
        /* Is this a multiport card? */
        tuple->DesiredTuple = CISTPL_MANFID;
        if (first_tuple(handle, tuple, parse) == CS_SUCCESS) {
-               info->manfid = le16_to_cpu(buf[0]);
+               info->manfid = parse->manfid.manf;
                for (i = 0; i < MULTI_COUNT; i++)
                        if ((info->manfid == multi_id[i].manfid) &&
-                           (le16_to_cpu(buf[1]) == multi_id[i].prodid))
+                           (parse->manfid.card == multi_id[i].prodid))
                                break;
                if (i < MULTI_COUNT)
                        info->multi = multi_id[i].multi;
index 85cfa08d3bad7955bb79279f73be920e332fb03f..56f269b6bfb12c53fb323c66dcab126010888bee 100644 (file)
@@ -190,18 +190,7 @@ lh7a40xuart_rx_chars (struct uart_port* port)
                if (uart_handle_sysrq_char (port, (unsigned char) data, regs))
                        continue;
 
-               if ((data & port->ignore_status_mask) == 0) {
-                       tty_insert_flip_char(tty, data, flag);
-               }
-               if ((data & RxOverrunError)
-                   && tty->flip.count < TTY_FLIPBUF_SIZE) {
-                       /*
-                        * Overrun is special, since it's reported
-                        * immediately, and doesn't affect the current
-                        * character
-                        */
-                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
-               }
+               uart_insert_char(port, data, RxOverrunError, data, flag);
        }
        tty_flip_buffer_push (tty);
        return;
index 37b2ef297cbec3816b06d2a30ad588a80abbfdd1..3f1051a4a13f8f51cab2efa2783f287e734c8ecb 100644 (file)
@@ -350,18 +350,9 @@ receive_chars(struct uart_txx9_port *up, unsigned int *status, struct pt_regs *r
                }
                if (uart_handle_sysrq_char(&up->port, ch, regs))
                        goto ignore_char;
-               if ((disr & up->port.ignore_status_mask) == 0) {
-                       tty_insert_flip_char(tty, ch, flag);
-               }
-               if ((disr & TXX9_SIDISR_UOER) &&
-                   tty->flip.count < TTY_FLIPBUF_SIZE) {
-                       /*
-                        * Overrun is special, since it's reported
-                        * immediately, and doesn't affect the current
-                        * character.
-                        */
-                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
-               }
+
+               uart_insert_char(&up->port, disr, TXX9_SIDISR_UOER, ch, flag);
+
        ignore_char:
                disr = sio_in(up, TXX9_SIDISR);
        } while (!(disr & TXX9_SIDISR_UVALID) && (max_count-- > 0));
index 39b788d95e39d9eb8f11578552f03933ad0b4e52..10e2990a40d42a2453780c5e045642c28866411e 100644 (file)
@@ -61,6 +61,16 @@ struct uart_sunsab_port {
        unsigned char                   pvr_dtr_bit;    /* Which PVR bit is DTR */
        unsigned char                   pvr_dsr_bit;    /* Which PVR bit is DSR */
        int                             type;           /* SAB82532 version     */
+
+       /* Setting configuration bits while the transmitter is active
+        * can cause garbage characters to get emitted by the chip.
+        * Therefore, we cache such writes here and do the real register
+        * write the next time the transmitter becomes idle.
+        */
+       unsigned int                    cached_ebrg;
+       unsigned char                   cached_mode;
+       unsigned char                   cached_pvr;
+       unsigned char                   cached_dafo;
 };
 
 /*
@@ -236,6 +246,7 @@ receive_chars(struct uart_sunsab_port *up,
 }
 
 static void sunsab_stop_tx(struct uart_port *, unsigned int);
+static void sunsab_tx_idle(struct uart_sunsab_port *);
 
 static void transmit_chars(struct uart_sunsab_port *up,
                           union sab82532_irq_status *stat)
@@ -258,6 +269,7 @@ static void transmit_chars(struct uart_sunsab_port *up,
                return;
 
        set_bit(SAB82532_XPR, &up->irqflags);
+       sunsab_tx_idle(up);
 
        if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) {
                up->interrupt_mask1 |= SAB82532_IMR1_XPR;
@@ -397,21 +409,21 @@ static void sunsab_set_mctrl(struct uart_port *port, unsigned int mctrl)
        struct uart_sunsab_port *up = (struct uart_sunsab_port *) port;
 
        if (mctrl & TIOCM_RTS) {
-               writeb(readb(&up->regs->rw.mode) & ~SAB82532_MODE_FRTS,
-                      &up->regs->rw.mode);
-               writeb(readb(&up->regs->rw.mode) | SAB82532_MODE_RTS,
-                      &up->regs->rw.mode);
+               up->cached_mode &= ~SAB82532_MODE_FRTS;
+               up->cached_mode |= SAB82532_MODE_RTS;
        } else {
-               writeb(readb(&up->regs->rw.mode) | SAB82532_MODE_FRTS,
-                      &up->regs->rw.mode);
-               writeb(readb(&up->regs->rw.mode) | SAB82532_MODE_RTS,
-                      &up->regs->rw.mode);
+               up->cached_mode |= (SAB82532_MODE_FRTS |
+                                   SAB82532_MODE_RTS);
        }
        if (mctrl & TIOCM_DTR) {
-               writeb(readb(&up->regs->rw.pvr) & ~(up->pvr_dtr_bit), &up->regs->rw.pvr);
+               up->cached_pvr &= ~(up->pvr_dtr_bit);
        } else {
-               writeb(readb(&up->regs->rw.pvr) | up->pvr_dtr_bit, &up->regs->rw.pvr);
+               up->cached_pvr |= up->pvr_dtr_bit;
        }
+
+       set_bit(SAB82532_REGS_PENDING, &up->irqflags);
+       if (test_bit(SAB82532_XPR, &up->irqflags))
+               sunsab_tx_idle(up);
 }
 
 /* port->lock is not held.  */
@@ -449,6 +461,25 @@ static void sunsab_stop_tx(struct uart_port *port, unsigned int tty_stop)
        writeb(up->interrupt_mask1, &up->regs->w.imr1);
 }
 
+/* port->lock held by caller.  */
+static void sunsab_tx_idle(struct uart_sunsab_port *up)
+{
+       if (test_bit(SAB82532_REGS_PENDING, &up->irqflags)) {
+               u8 tmp;
+
+               clear_bit(SAB82532_REGS_PENDING, &up->irqflags);
+               writeb(up->cached_mode, &up->regs->rw.mode);
+               writeb(up->cached_pvr, &up->regs->rw.pvr);
+               writeb(up->cached_dafo, &up->regs->w.dafo);
+
+               writeb(up->cached_ebrg & 0xff, &up->regs->w.bgr);
+               tmp = readb(&up->regs->rw.ccr2);
+               tmp &= ~0xc0;
+               tmp |= (up->cached_ebrg >> 2) & 0xc0;
+               writeb(tmp, &up->regs->rw.ccr2);
+       }
+}
+
 /* port->lock held by caller.  */
 static void sunsab_start_tx(struct uart_port *port, unsigned int tty_start)
 {
@@ -517,12 +548,16 @@ static void sunsab_break_ctl(struct uart_port *port, int break_state)
 
        spin_lock_irqsave(&up->port.lock, flags);
 
-       val = readb(&up->regs->rw.dafo);
+       val = up->cached_dafo;
        if (break_state)
                val |= SAB82532_DAFO_XBRK;
        else
                val &= ~SAB82532_DAFO_XBRK;
-       writeb(val, &up->regs->rw.dafo);
+       up->cached_dafo = val;
+
+       set_bit(SAB82532_REGS_PENDING, &up->irqflags);
+       if (test_bit(SAB82532_XPR, &up->irqflags))
+               sunsab_tx_idle(up);
 
        spin_unlock_irqrestore(&up->port.lock, flags);
 }
@@ -566,8 +601,9 @@ static int sunsab_startup(struct uart_port *port)
               SAB82532_CCR2_TOE, &up->regs->w.ccr2);
        writeb(0, &up->regs->w.ccr3);
        writeb(SAB82532_CCR4_MCK4 | SAB82532_CCR4_EBRG, &up->regs->w.ccr4);
-       writeb(SAB82532_MODE_RTS | SAB82532_MODE_FCTS |
-              SAB82532_MODE_RAC, &up->regs->w.mode);
+       up->cached_mode = (SAB82532_MODE_RTS | SAB82532_MODE_FCTS |
+                          SAB82532_MODE_RAC);
+       writeb(up->cached_mode, &up->regs->w.mode);
        writeb(SAB82532_RFC_DPS|SAB82532_RFC_RFTH_32, &up->regs->w.rfc);
        
        tmp = readb(&up->regs->rw.ccr0);
@@ -598,7 +634,6 @@ static void sunsab_shutdown(struct uart_port *port)
 {
        struct uart_sunsab_port *up = (struct uart_sunsab_port *) port;
        unsigned long flags;
-       unsigned char tmp;
 
        spin_lock_irqsave(&up->port.lock, flags);
 
@@ -609,14 +644,13 @@ static void sunsab_shutdown(struct uart_port *port)
        writeb(up->interrupt_mask1, &up->regs->w.imr1);
 
        /* Disable break condition */
-       tmp = readb(&up->regs->rw.dafo);
-       tmp &= ~SAB82532_DAFO_XBRK;
-       writeb(tmp, &up->regs->rw.dafo);
+       up->cached_dafo = readb(&up->regs->rw.dafo);
+       up->cached_dafo &= ~SAB82532_DAFO_XBRK;
+       writeb(up->cached_dafo, &up->regs->rw.dafo);
 
        /* Disable Receiver */  
-       tmp = readb(&up->regs->rw.mode);
-       tmp &= ~SAB82532_MODE_RAC;
-       writeb(tmp, &up->regs->rw.mode);
+       up->cached_mode &= ~SAB82532_MODE_RAC;
+       writeb(up->cached_mode, &up->regs->rw.mode);
 
        /*
         * XXX FIXME
@@ -685,7 +719,6 @@ static void sunsab_convert_to_sab(struct uart_sunsab_port *up, unsigned int cfla
                                  unsigned int iflag, unsigned int baud,
                                  unsigned int quot)
 {
-       unsigned int ebrg;
        unsigned char dafo;
        int bits, n, m;
 
@@ -714,10 +747,11 @@ static void sunsab_convert_to_sab(struct uart_sunsab_port *up, unsigned int cfla
        } else {
                dafo |= SAB82532_DAFO_PAR_EVEN;
        }
+       up->cached_dafo = dafo;
 
        calc_ebrg(baud, &n, &m);
 
-       ebrg = n | (m << 6);
+       up->cached_ebrg = n | (m << 6);
 
        up->tec_timeout = (10 * 1000000) / baud;
        up->cec_timeout = up->tec_timeout >> 2;
@@ -770,16 +804,13 @@ static void sunsab_convert_to_sab(struct uart_sunsab_port *up, unsigned int cfla
        uart_update_timeout(&up->port, cflag,
                            (up->port.uartclk / (16 * quot)));
 
-       /* Now bang the new settings into the chip.  */
-       sunsab_cec_wait(up);
-       sunsab_tec_wait(up);
-       writeb(dafo, &up->regs->w.dafo);
-       writeb(ebrg & 0xff, &up->regs->w.bgr);
-       writeb((readb(&up->regs->rw.ccr2) & ~0xc0) | ((ebrg >> 2) & 0xc0),
-              &up->regs->rw.ccr2);
-
-       writeb(readb(&up->regs->rw.mode) | SAB82532_MODE_RAC, &up->regs->rw.mode);
-
+       /* Now schedule a register update when the chip's
+        * transmitter is idle.
+        */
+       up->cached_mode |= SAB82532_MODE_RAC;
+       set_bit(SAB82532_REGS_PENDING, &up->irqflags);
+       if (test_bit(SAB82532_XPR, &up->irqflags))
+               sunsab_tx_idle(up);
 }
 
 /* port->lock is not held.  */
@@ -1084,11 +1115,13 @@ static void __init sunsab_init_hw(void)
                        up->pvr_dsr_bit = (1 << 3);
                        up->pvr_dtr_bit = (1 << 2);
                }
-               writeb((1 << 1) | (1 << 2) | (1 << 4), &up->regs->w.pvr);
-               writeb(readb(&up->regs->rw.mode) | SAB82532_MODE_FRTS,
-                      &up->regs->rw.mode);
-               writeb(readb(&up->regs->rw.mode) | SAB82532_MODE_RTS,
-                      &up->regs->rw.mode);
+               up->cached_pvr = (1 << 1) | (1 << 2) | (1 << 4);
+               writeb(up->cached_pvr, &up->regs->w.pvr);
+               up->cached_mode = readb(&up->regs->rw.mode);
+               up->cached_mode |= SAB82532_MODE_FRTS;
+               writeb(up->cached_mode, &up->regs->rw.mode);
+               up->cached_mode |= SAB82532_MODE_RTS;
+               writeb(up->cached_mode, &up->regs->rw.mode);
 
                up->tec_timeout = SAB82532_MAX_TEC_TIMEOUT;
                up->cec_timeout = SAB82532_MAX_CEC_TIMEOUT;
index 686086fcbbf5e7acd5cc8151b3f60985f8c6a9c1..b78e1f7b8050c01e25489c8533cacd00d5caac09 100644 (file)
@@ -126,6 +126,7 @@ union sab82532_irq_status {
 /* irqflags bits */
 #define SAB82532_ALLS                  0x00000001
 #define SAB82532_XPR                   0x00000002
+#define SAB82532_REGS_PENDING          0x00000004
 
 /* RFIFO Status Byte */
 #define SAB82532_RSTAT_PE              0x80
index 307886199f2f6f1301d6aa240b1f3263e9ec8a90..1f985327b0d485ec8b4648073ef39a80d25d28f1 100644 (file)
@@ -234,7 +234,7 @@ static inline const char *siu_type_name(struct uart_port *port)
                return "DSIU";
        }
 
-       return "unknown";
+       return NULL;
 }
 
 static unsigned int siu_tx_empty(struct uart_port *port)
@@ -412,10 +412,8 @@ static inline void receive_chars(struct uart_port *port, uint8_t *status,
 
                if (uart_handle_sysrq_char(port, ch, regs))
                        goto ignore_char;
-               if ((lsr & port->ignore_status_mask) == 0)
-                       tty_insert_flip_char(tty, ch, flag);
-               if ((lsr & UART_LSR_OE) && (tty->flip.count < TTY_FLIPBUF_SIZE))
-                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
+
+               uart_insert_char(port, lsr, UART_LSR_OE, ch, flag);
 
        ignore_char:
                lsr = siu_read(port, UART_LSR);
@@ -484,9 +482,6 @@ static irqreturn_t siu_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        struct uart_port *port;
        uint8_t iir, lsr;
 
-       if (dev_id == NULL)
-               return IRQ_NONE;
-
        port = (struct uart_port *)dev_id;
 
        iir = siu_read(port, UART_IIR);
@@ -509,6 +504,9 @@ static int siu_startup(struct uart_port *port)
 {
        int retval;
 
+       if (port->membase == NULL)
+               return -ENODEV;
+
        siu_clear_fifo(port);
 
        (void)siu_read(port, UART_LSR);
@@ -547,9 +545,6 @@ static void siu_shutdown(struct uart_port *port)
        unsigned long flags;
        uint8_t lcr;
 
-       if (port->membase == NULL)
-               return;
-
        siu_write(port, UART_IER, 0);
 
        spin_lock_irqsave(&port->lock, flags);
@@ -804,53 +799,6 @@ static int siu_init_ports(void)
 
 #ifdef CONFIG_SERIAL_VR41XX_CONSOLE
 
-static void early_set_termios(struct uart_port *port, struct termios *new,
-                              struct termios *old)
-{
-       tcflag_t c_cflag;
-       uint8_t lcr;
-       unsigned int baud, quot;
-
-       c_cflag = new->c_cflag;
-       switch (c_cflag & CSIZE) {
-       case CS5:
-               lcr = UART_LCR_WLEN5;
-               break;
-       case CS6:
-               lcr = UART_LCR_WLEN6;
-               break;
-       case CS7:
-               lcr = UART_LCR_WLEN7;
-               break;
-       default:
-               lcr = UART_LCR_WLEN8;
-               break;
-       }
-
-       if (c_cflag & CSTOPB)
-               lcr |= UART_LCR_STOP;
-       if (c_cflag & PARENB)
-               lcr |= UART_LCR_PARITY;
-       if ((c_cflag & PARODD) != PARODD)
-               lcr |= UART_LCR_EPAR;
-       if (c_cflag & CMSPAR)
-               lcr |= UART_LCR_SPAR;
-
-       baud = uart_get_baud_rate(port, new, old, 0, port->uartclk/16);
-       quot = uart_get_divisor(port, baud);
-
-       siu_write(port, UART_LCR, lcr | UART_LCR_DLAB);
-
-       siu_write(port, UART_DLL, (uint8_t)quot);
-       siu_write(port, UART_DLM, (uint8_t)(quot >> 8));
-
-       siu_write(port, UART_LCR, lcr);
-}
-
-static struct uart_ops early_uart_ops = {
-       .set_termios    = early_set_termios,
-};
-
 #define BOTH_EMPTY     (UART_LSR_TEMT | UART_LSR_THRE)
 
 static void wait_for_xmitr(struct uart_port *port)
@@ -917,7 +865,7 @@ static int siu_console_setup(struct console *con, char *options)
        if (port->membase == NULL) {
                if (port->mapbase == 0)
                        return -ENODEV;
-               port->membase = (unsigned char __iomem *)KSEG1ADDR(port->mapbase);
+               port->membase = ioremap(port->mapbase, siu_port_size(port));
        }
 
        vr41xx_select_siu_interface(SIU_INTERFACE_RS232C);
@@ -951,7 +899,7 @@ static int __devinit siu_console_init(void)
 
        for (i = 0; i < num; i++) {
                port = &siu_uart_ports[i];
-               port->ops = &early_uart_ops;
+               port->ops = &siu_uart_ops;
        }
 
        register_console(&siu_console);
@@ -996,8 +944,10 @@ static int siu_probe(struct device *dev)
                port->dev = dev;
 
                retval = uart_add_one_port(&siu_uart_driver, port);
-               if (retval)
+               if (retval < 0) {
+                       port->dev = NULL;
                        break;
+               }
        }
 
        if (i == 0 && retval < 0) {
index 39ab6a12da76f75ca0ea868ab84f7b1fd0761894..dc119ce68e3eafa7a0c6c4e03d244224b3e3c8df 100644 (file)
@@ -15,7 +15,7 @@
 #include <linux/superhyway.h>
 
 #define superhyway_ro_attr(name, fmt, field)                           \
-static ssize_t name##_show(struct device *dev, char *buf)              \
+static ssize_t name##_show(struct device *dev, struct device_attribute *attr, char *buf)               \
 {                                                                      \
        struct superhyway_device *s = to_superhyway_device(dev);        \
        return sprintf(buf, fmt, s->field);                             \
diff --git a/drivers/sn/Kconfig b/drivers/sn/Kconfig
new file mode 100644 (file)
index 0000000..13b8d24
--- /dev/null
@@ -0,0 +1,20 @@
+#
+# Miscellaneous SN-specific devices
+#
+
+menu "SN Devices"
+
+config SGI_IOC4
+       tristate "SGI IOC4 Base IO support"
+       depends on (IA64_GENERIC || IA64_SGI_SN2) && MMTIMER
+       default m
+       ---help---
+       This option enables basic support for the SGI IOC4-based Base IO
+       controller card.  This option does not enable any specific
+       functions on such a card, but provides necessary infrastructure
+       for other drivers to utilize.
+
+       If you have an SGI Altix with an IOC4-based
+       I/O controller say Y.  Otherwise say N.
+
+endmenu
index 631e54958448fe64f641353119c78aa482a7fb02..c2a2841853727d0cf02baa87e0d260ffac1114de 100644 (file)
@@ -3,4 +3,4 @@
 #
 #
 
-obj-$(CONFIG_BLK_DEV_SGIIOC4) += ioc4.o
+obj-$(CONFIG_SGI_IOC4) += ioc4.o
index d9e4ee280e5f73edeed60879fd27348bb64d9ea1..ea75b3d0612b596819fba49a6d17c8e24939e941 100644 (file)
  * Copyright (C) 2005 Silicon Graphics, Inc.  All Rights Reserved.
  */
 
-/*
- * This file contains a shim driver for the IOC4 IDE and serial drivers.
+/* This file contains the master driver module for use by SGI IOC4 subdrivers.
+ *
+ * It allocates any resources shared between multiple subdevices, and
+ * provides accessor functions (where needed) and the like for those
+ * resources.  It also provides a mechanism for the subdevice modules
+ * to support loading and unloading.
+ *
+ * Non-shared resources (e.g. external interrupt A_INT_OUT register page
+ * alias, serial port and UART registers) are handled by the subdevice
+ * modules themselves.
+ *
+ * This is all necessary because IOC4 is not implemented as a multi-function
+ * PCI device, but an amalgamation of disparate registers for several
+ * types of device (ATA, serial, external interrupts).  The normal
+ * resource management in the kernel doesn't have quite the right interfaces
+ * to handle this situation (e.g. multiple modules can't claim the same
+ * PCI ID), thus this IOC4 master module.
  */
 
 #include <linux/errno.h>
 #include <linux/module.h>
 #include <linux/pci.h>
-#include <linux/ioc4_common.h>
-#include <linux/ide.h>
+#include <linux/ioc4.h>
+#include <linux/mmtimer.h>
+#include <linux/rtc.h>
+#include <linux/rwsem.h>
+#include <asm/sn/addrs.h>
+#include <asm/sn/clksupport.h>
+#include <asm/sn/shub_mmr.h>
 
+/***************
+ * Definitions *
+ ***************/
 
-static int __devinit
-ioc4_probe_one(struct pci_dev *pdev, const struct pci_device_id *pci_id)
+/* Tweakable values */
+
+/* PCI bus speed detection/calibration */
+#define IOC4_CALIBRATE_COUNT 63        /* Calibration cycle period */
+#define IOC4_CALIBRATE_CYCLES 256      /* Average over this many cycles */
+#define IOC4_CALIBRATE_DISCARD 2       /* Discard first few cycles */
+#define IOC4_CALIBRATE_LOW_MHZ 25      /* Lower bound on bus speed sanity */
+#define IOC4_CALIBRATE_HIGH_MHZ 75     /* Upper bound on bus speed sanity */
+#define IOC4_CALIBRATE_DEFAULT_MHZ 66  /* Assumed if sanity check fails */
+
+/************************
+ * Submodule management *
+ ************************/
+
+static LIST_HEAD(ioc4_devices);
+static DECLARE_RWSEM(ioc4_devices_rwsem);
+
+static LIST_HEAD(ioc4_submodules);
+static DECLARE_RWSEM(ioc4_submodules_rwsem);
+
+/* Register an IOC4 submodule */
+int
+ioc4_register_submodule(struct ioc4_submodule *is)
+{
+       struct ioc4_driver_data *idd;
+
+       down_write(&ioc4_submodules_rwsem);
+       list_add(&is->is_list, &ioc4_submodules);
+       up_write(&ioc4_submodules_rwsem);
+
+       /* Initialize submodule for each IOC4 */
+       if (!is->is_probe)
+               return 0;
+
+       down_read(&ioc4_devices_rwsem);
+       list_for_each_entry(idd, &ioc4_devices, idd_list) {
+               if (is->is_probe(idd)) {
+                       printk(KERN_WARNING
+                              "%s: IOC4 submodule %s probe failed "
+                              "for pci_dev %s",
+                              __FUNCTION__, module_name(is->is_owner),
+                              pci_name(idd->idd_pdev));
+               }
+       }
+       up_read(&ioc4_devices_rwsem);
+
+       return 0;
+}
+
+/* Unregister an IOC4 submodule */
+void
+ioc4_unregister_submodule(struct ioc4_submodule *is)
+{
+       struct ioc4_driver_data *idd;
+
+       down_write(&ioc4_submodules_rwsem);
+       list_del(&is->is_list);
+       up_write(&ioc4_submodules_rwsem);
+
+       /* Remove submodule for each IOC4 */
+       if (!is->is_remove)
+               return;
+
+       down_read(&ioc4_devices_rwsem);
+       list_for_each_entry(idd, &ioc4_devices, idd_list) {
+               if (is->is_remove(idd)) {
+                       printk(KERN_WARNING
+                              "%s: IOC4 submodule %s remove failed "
+                              "for pci_dev %s.\n",
+                              __FUNCTION__, module_name(is->is_owner),
+                              pci_name(idd->idd_pdev));
+               }
+       }
+       up_read(&ioc4_devices_rwsem);
+}
+
+/*********************
+ * Device management *
+ *********************/
+
+#define IOC4_CALIBRATE_LOW_LIMIT \
+       (1000*IOC4_EXTINT_COUNT_DIVISOR/IOC4_CALIBRATE_LOW_MHZ)
+#define IOC4_CALIBRATE_HIGH_LIMIT \
+       (1000*IOC4_EXTINT_COUNT_DIVISOR/IOC4_CALIBRATE_HIGH_MHZ)
+#define IOC4_CALIBRATE_DEFAULT \
+       (1000*IOC4_EXTINT_COUNT_DIVISOR/IOC4_CALIBRATE_DEFAULT_MHZ)
+
+#define IOC4_CALIBRATE_END \
+       (IOC4_CALIBRATE_CYCLES + IOC4_CALIBRATE_DISCARD)
+
+#define IOC4_INT_OUT_MODE_TOGGLE 0x7   /* Toggle INT_OUT every COUNT+1 ticks */
+
+/* Determines external interrupt output clock period of the PCI bus an
+ * IOC4 is attached to.  This value can be used to determine the PCI
+ * bus speed.
+ *
+ * IOC4 has a design feature that various internal timers are derived from
+ * the PCI bus clock.  This causes IOC4 device drivers to need to take the
+ * bus speed into account when setting various register values (e.g. INT_OUT
+ * register COUNT field, UART divisors, etc).  Since this information is
+ * needed by several subdrivers, it is determined by the main IOC4 driver,
+ * even though the following code utilizes external interrupt registers
+ * to perform the speed calculation.
+ */
+static void
+ioc4_clock_calibrate(struct ioc4_driver_data *idd)
+{
+       extern unsigned long sn_rtc_cycles_per_second;
+       union ioc4_int_out int_out;
+       union ioc4_gpcr gpcr;
+       unsigned int state, last_state = 1;
+       uint64_t start = 0, end, period;
+       unsigned int count = 0;
+
+       /* Enable output */
+       gpcr.raw = 0;
+       gpcr.fields.dir = IOC4_GPCR_DIR_0;
+       gpcr.fields.int_out_en = 1;
+       writel(gpcr.raw, &idd->idd_misc_regs->gpcr_s.raw);
+
+       /* Reset to power-on state */
+       writel(0, &idd->idd_misc_regs->int_out.raw);
+       mmiowb();
+
+       printk(KERN_INFO
+              "%s: Calibrating PCI bus speed "
+              "for pci_dev %s ... ", __FUNCTION__, pci_name(idd->idd_pdev));
+       /* Set up square wave */
+       int_out.raw = 0;
+       int_out.fields.count = IOC4_CALIBRATE_COUNT;
+       int_out.fields.mode = IOC4_INT_OUT_MODE_TOGGLE;
+       int_out.fields.diag = 0;
+       writel(int_out.raw, &idd->idd_misc_regs->int_out.raw);
+       mmiowb();
+
+       /* Check square wave period averaged over some number of cycles */
+       do {
+               int_out.raw = readl(&idd->idd_misc_regs->int_out.raw);
+               state = int_out.fields.int_out;
+               if (!last_state && state) {
+                       count++;
+                       if (count == IOC4_CALIBRATE_END) {
+                               end = rtc_time();
+                               break;
+                       } else if (count == IOC4_CALIBRATE_DISCARD)
+                               start = rtc_time();
+               }
+               last_state = state;
+       } while (1);
+
+       /* Calculation rearranged to preserve intermediate precision.
+        * Logically:
+        * 1. "end - start" gives us number of RTC cycles over all the
+        *    square wave cycles measured.
+        * 2. Divide by number of square wave cycles to get number of
+        *    RTC cycles per square wave cycle.
+        * 3. Divide by 2*(int_out.fields.count+1), which is the formula
+        *    by which the IOC4 generates the square wave, to get the
+        *    number of RTC cycles per IOC4 INT_OUT count.
+        * 4. Divide by sn_rtc_cycles_per_second to get seconds per
+        *    count.
+        * 5. Multiply by 1E9 to get nanoseconds per count.
+        */
+       period = ((end - start) * 1000000000) /
+           (IOC4_CALIBRATE_CYCLES * 2 * (IOC4_CALIBRATE_COUNT + 1)
+            * sn_rtc_cycles_per_second);
+
+       /* Bounds check the result. */
+       if (period > IOC4_CALIBRATE_LOW_LIMIT ||
+           period < IOC4_CALIBRATE_HIGH_LIMIT) {
+               printk("failed. Assuming PCI clock ticks are %d ns.\n",
+                      IOC4_CALIBRATE_DEFAULT / IOC4_EXTINT_COUNT_DIVISOR);
+               period = IOC4_CALIBRATE_DEFAULT;
+       } else {
+               printk("succeeded. PCI clock ticks are %ld ns.\n",
+                      period / IOC4_EXTINT_COUNT_DIVISOR);
+       }
+
+       /* Remember results.  We store the extint clock period rather
+        * than the PCI clock period so that greater precision is
+        * retained.  Divide by IOC4_EXTINT_COUNT_DIVISOR to get
+        * PCI clock period.
+        */
+       idd->count_period = period;
+}
+
+/* Adds a new instance of an IOC4 card */
+static int
+ioc4_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
 {
+       struct ioc4_driver_data *idd;
+       struct ioc4_submodule *is;
+       uint32_t pcmd;
        int ret;
 
+       /* Enable IOC4 and take ownership of it */
        if ((ret = pci_enable_device(pdev))) {
                printk(KERN_WARNING
-                        "%s: Failed to enable device with "
-                               "pci_dev 0x%p... returning\n",
-                               __FUNCTION__, (void *)pdev);
-               return ret;
+                      "%s: Failed to enable IOC4 device for pci_dev %s.\n",
+                      __FUNCTION__, pci_name(pdev));
+               goto out;
        }
        pci_set_master(pdev);
 
-       /* attach each sub-device */
-       ret = ioc4_ide_attach_one(pdev, pci_id);
-       if (ret)
-               return ret;
-       return ioc4_serial_attach_one(pdev, pci_id);
+       /* Set up per-IOC4 data */
+       idd = kmalloc(sizeof(struct ioc4_driver_data), GFP_KERNEL);
+       if (!idd) {
+               printk(KERN_WARNING
+                      "%s: Failed to allocate IOC4 data for pci_dev %s.\n",
+                      __FUNCTION__, pci_name(pdev));
+               ret = -ENODEV;
+               goto out_idd;
+       }
+       idd->idd_pdev = pdev;
+       idd->idd_pci_id = pci_id;
+
+       /* Map IOC4 misc registers.  These are shared between subdevices
+        * so the main IOC4 module manages them.
+        */
+       idd->idd_bar0 = pci_resource_start(idd->idd_pdev, 0);
+       if (!idd->idd_bar0) {
+               printk(KERN_WARNING
+                      "%s: Unable to find IOC4 misc resource "
+                      "for pci_dev %s.\n",
+                      __FUNCTION__, pci_name(idd->idd_pdev));
+               ret = -ENODEV;
+               goto out_pci;
+       }
+       if (!request_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs),
+                           "ioc4_misc")) {
+               printk(KERN_WARNING
+                      "%s: Unable to request IOC4 misc region "
+                      "for pci_dev %s.\n",
+                      __FUNCTION__, pci_name(idd->idd_pdev));
+               ret = -ENODEV;
+               goto out_pci;
+       }
+       idd->idd_misc_regs = ioremap(idd->idd_bar0,
+                                    sizeof(struct ioc4_misc_regs));
+       if (!idd->idd_misc_regs) {
+               printk(KERN_WARNING
+                      "%s: Unable to remap IOC4 misc region "
+                      "for pci_dev %s.\n",
+                      __FUNCTION__, pci_name(idd->idd_pdev));
+               ret = -ENODEV;
+               goto out_misc_region;
+       }
+
+       /* Failsafe portion of per-IOC4 initialization */
+
+       /* Initialize IOC4 */
+       pci_read_config_dword(idd->idd_pdev, PCI_COMMAND, &pcmd);
+       pci_write_config_dword(idd->idd_pdev, PCI_COMMAND,
+                              pcmd | PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
+
+       /* Determine PCI clock */
+       ioc4_clock_calibrate(idd);
+
+       /* Disable/clear all interrupts.  Need to do this here lest
+        * one submodule request the shared IOC4 IRQ, but interrupt
+        * is generated by a different subdevice.
+        */
+       /* Disable */
+       writel(~0, &idd->idd_misc_regs->other_iec.raw);
+       writel(~0, &idd->idd_misc_regs->sio_iec);
+       /* Clear (i.e. acknowledge) */
+       writel(~0, &idd->idd_misc_regs->other_ir.raw);
+       writel(~0, &idd->idd_misc_regs->sio_ir);
+
+       /* Track PCI-device specific data */
+       idd->idd_serial_data = NULL;
+       pci_set_drvdata(idd->idd_pdev, idd);
+       down_write(&ioc4_devices_rwsem);
+       list_add(&idd->idd_list, &ioc4_devices);
+       up_write(&ioc4_devices_rwsem);
+
+       /* Add this IOC4 to all submodules */
+       down_read(&ioc4_submodules_rwsem);
+       list_for_each_entry(is, &ioc4_submodules, is_list) {
+               if (is->is_probe && is->is_probe(idd)) {
+                       printk(KERN_WARNING
+                              "%s: IOC4 submodule 0x%s probe failed "
+                              "for pci_dev %s.\n",
+                              __FUNCTION__, module_name(is->is_owner),
+                              pci_name(idd->idd_pdev));
+               }
+       }
+       up_read(&ioc4_submodules_rwsem);
+
+       return 0;
+
+out_misc_region:
+       release_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs));
+out_pci:
+       kfree(idd);
+out_idd:
+       pci_disable_device(pdev);
+out:
+       return ret;
 }
 
-/* pci device struct */
-static struct pci_device_id ioc4_s_id_table[] = {
+/* Removes a particular instance of an IOC4 card. */
+static void
+ioc4_remove(struct pci_dev *pdev)
+{
+       struct ioc4_submodule *is;
+       struct ioc4_driver_data *idd;
+
+       idd = pci_get_drvdata(pdev);
+
+       /* Remove this IOC4 from all submodules */
+       down_read(&ioc4_submodules_rwsem);
+       list_for_each_entry(is, &ioc4_submodules, is_list) {
+               if (is->is_remove && is->is_remove(idd)) {
+                       printk(KERN_WARNING
+                              "%s: IOC4 submodule 0x%s remove failed "
+                              "for pci_dev %s.\n",
+                              __FUNCTION__, module_name(is->is_owner),
+                              pci_name(idd->idd_pdev));
+               }
+       }
+       up_read(&ioc4_submodules_rwsem);
+
+       /* Release resources */
+       iounmap(idd->idd_misc_regs);
+       if (!idd->idd_bar0) {
+               printk(KERN_WARNING
+                      "%s: Unable to get IOC4 misc mapping for pci_dev %s. "
+                      "Device removal may be incomplete.\n",
+                      __FUNCTION__, pci_name(idd->idd_pdev));
+       }
+       release_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs));
+
+       /* Disable IOC4 and relinquish */
+       pci_disable_device(pdev);
+
+       /* Remove and free driver data */
+       down_write(&ioc4_devices_rwsem);
+       list_del(&idd->idd_list);
+       up_write(&ioc4_devices_rwsem);
+       kfree(idd);
+}
+
+static struct pci_device_id ioc4_id_table[] = {
        {PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC4, PCI_ANY_ID,
         PCI_ANY_ID, 0x0b4000, 0xFFFFFF},
        {0}
 };
-MODULE_DEVICE_TABLE(pci, ioc4_s_id_table);
 
-static struct pci_driver __devinitdata ioc4_s_driver = {
-       .name   = "IOC4",
-       .id_table = ioc4_s_id_table,
-       .probe  = ioc4_probe_one,
+static struct pci_driver __devinitdata ioc4_driver = {
+       .name = "IOC4",
+       .id_table = ioc4_id_table,
+       .probe = ioc4_probe,
+       .remove = ioc4_remove,
 };
 
-static int __devinit ioc4_detect(void)
+MODULE_DEVICE_TABLE(pci, ioc4_id_table);
+
+/*********************
+ * Module management *
+ *********************/
+
+/* Module load */
+static int __devinit
+ioc4_init(void)
 {
-       ioc4_serial_init();
+       return pci_register_driver(&ioc4_driver);
+}
 
-       return pci_register_driver(&ioc4_s_driver);
+/* Module unload */
+static void __devexit
+ioc4_exit(void)
+{
+       pci_unregister_driver(&ioc4_driver);
 }
-module_init(ioc4_detect);
 
-MODULE_AUTHOR("Pat Gefre - Silicon Graphics Inc. (SGI) <pfg@sgi.com>");
-MODULE_DESCRIPTION("PCI driver module for SGI IOC4 Base-IO Card");
+module_init(ioc4_init);
+module_exit(ioc4_exit);
+
+MODULE_AUTHOR("Brent Casavant - Silicon Graphics, Inc. <bcasavan@sgi.com>");
+MODULE_DESCRIPTION("PCI driver master module for SGI IOC4 Base-IO Card");
 MODULE_LICENSE("GPL");
+
+EXPORT_SYMBOL(ioc4_register_submodule);
+EXPORT_SYMBOL(ioc4_unregister_submodule);
index 233f9229badb66c23131de8b8c6b36ef8d24d7b0..2a1697bfd69579c11543931813f10b1dd1ddde0e 100644 (file)
@@ -386,6 +386,8 @@ static void speedtch_poll_status(struct speedtch_instance_data *instance)
                if (instance->u.atm_dev->signal != ATM_PHY_SIG_LOST) {
                        instance->u.atm_dev->signal = ATM_PHY_SIG_LOST;
                        printk(KERN_NOTICE "ADSL line is down\n");
+                       /* It'll never resync again unless we ask it to... */
+                       speedtch_start_synchro(instance);
                }
                break;
 
index ef0b35731ff078789d4129ca32bbfe4e4f542a19..83e815d3cd52e088cae80a38a51fc0213535ab32 100644 (file)
@@ -239,7 +239,7 @@ static char *usb_dump_interface_descriptor(char *start, char *end,
        int setno)
 {
        const struct usb_interface_descriptor *desc = &intfc->altsetting[setno].desc;
-       char *driver_name = "";
+       const char *driver_name = "";
 
        if (start > end)
                return start;
index 38ed2220c9fcc31bee849c2410e45a22f3a8098e..65ca131cc44cc8c8e13e298ea47b1bcf4022353d 100644 (file)
@@ -68,7 +68,7 @@ static struct file_operations usb_fops = {
        .open =         usb_open,
 };
 
-static struct class_simple *usb_class;
+static struct class *usb_class;
 
 int usb_major_init(void)
 {
@@ -80,9 +80,10 @@ int usb_major_init(void)
                goto out;
        }
 
-       usb_class = class_simple_create(THIS_MODULE, "usb");
+       usb_class = class_create(THIS_MODULE, "usb");
        if (IS_ERR(usb_class)) {
-               err("class_simple_create failed for usb devices");
+               error = PTR_ERR(usb_class);
+               err("class_create failed for usb devices");
                unregister_chrdev(USB_MAJOR, "usb");
                goto out;
        }
@@ -95,7 +96,7 @@ out:
 
 void usb_major_cleanup(void)
 {
-       class_simple_destroy(usb_class);
+       class_destroy(usb_class);
        devfs_remove("usb");
        unregister_chrdev(USB_MAJOR, "usb");
 }
@@ -171,7 +172,7 @@ int usb_register_dev(struct usb_interface *intf,
                ++temp;
        else
                temp = name;
-       intf->class_dev = class_simple_device_add(usb_class, MKDEV(USB_MAJOR, minor), &intf->dev, "%s", temp);
+       intf->class_dev = class_device_create(usb_class, MKDEV(USB_MAJOR, minor), &intf->dev, "%s", temp);
        if (IS_ERR(intf->class_dev)) {
                spin_lock (&minor_lock);
                usb_minors[intf->minor] = NULL;
@@ -220,7 +221,7 @@ void usb_deregister_dev(struct usb_interface *intf,
 
        snprintf(name, BUS_ID_SIZE, class_driver->name, intf->minor - minor_base);
        devfs_remove (name);
-       class_simple_device_remove(MKDEV(USB_MAJOR, intf->minor));
+       class_device_destroy(usb_class, MKDEV(USB_MAJOR, intf->minor));
        intf->class_dev = NULL;
        intf->minor = -1;
 }
index 266e9e06a9f50a7d5e33ca2f95137708c93ed24c..d041782e0c8bdb31fd4680b13d5b962ca934a131 100644 (file)
@@ -651,50 +651,45 @@ static int usb_rh_urb_dequeue (struct usb_hcd *hcd, struct urb *urb)
 /*-------------------------------------------------------------------------*/
 
 /* exported only within usbcore */
-struct usb_bus *usb_bus_get (struct usb_bus *bus)
+struct usb_bus *usb_bus_get(struct usb_bus *bus)
 {
-       struct class_device *tmp;
+       if (bus)
+               kref_get(&bus->kref);
+       return bus;
+}
 
-       if (!bus)
-               return NULL;
+static void usb_host_release(struct kref *kref)
+{
+       struct usb_bus *bus = container_of(kref, struct usb_bus, kref);
 
-       tmp = class_device_get(&bus->class_dev);
-       if (tmp)        
-               return to_usb_bus(tmp);
-       else
-               return NULL;
+       if (bus->release)
+               bus->release(bus);
 }
 
 /* exported only within usbcore */
-void usb_bus_put (struct usb_bus *bus)
+void usb_bus_put(struct usb_bus *bus)
 {
        if (bus)
-               class_device_put(&bus->class_dev);
+               kref_put(&bus->kref, usb_host_release);
 }
 
 /*-------------------------------------------------------------------------*/
 
-static void usb_host_release(struct class_device *class_dev)
-{
-       struct usb_bus *bus = to_usb_bus(class_dev);
-
-       if (bus->release)
-               bus->release(bus);
-}
-
-static struct class usb_host_class = {
-       .name           = "usb_host",
-       .release        = &usb_host_release,
-};
+static struct class *usb_host_class;
 
 int usb_host_init(void)
 {
-       return class_register(&usb_host_class);
+       int retval = 0;
+
+       usb_host_class = class_create(THIS_MODULE, "usb_host");
+       if (IS_ERR(usb_host_class))
+               retval = PTR_ERR(usb_host_class);
+       return retval;
 }
 
 void usb_host_cleanup(void)
 {
-       class_unregister(&usb_host_class);
+       class_destroy(usb_host_class);
 }
 
 /**
@@ -719,8 +714,7 @@ static void usb_bus_init (struct usb_bus *bus)
 
        INIT_LIST_HEAD (&bus->bus_list);
 
-       class_device_initialize(&bus->class_dev);
-       bus->class_dev.class = &usb_host_class;
+       kref_init(&bus->kref);
 }
 
 /**
@@ -761,7 +755,6 @@ struct usb_bus *usb_alloc_bus (struct usb_operations *op)
 static int usb_register_bus(struct usb_bus *bus)
 {
        int busnum;
-       int retval;
 
        down (&usb_bus_list_lock);
        busnum = find_next_zero_bit (busmap.busmap, USB_MAXBUS, 1);
@@ -774,15 +767,15 @@ static int usb_register_bus(struct usb_bus *bus)
                return -E2BIG;
        }
 
-       snprintf(bus->class_dev.class_id, BUS_ID_SIZE, "usb%d", busnum);
-       bus->class_dev.dev = bus->controller;
-       retval = class_device_add(&bus->class_dev);
-       if (retval) {
+       bus->class_dev = class_device_create(usb_host_class, MKDEV(0,0), bus->controller, "usb%d", busnum);
+       if (IS_ERR(bus->class_dev)) {
                clear_bit(busnum, busmap.busmap);
                up(&usb_bus_list_lock);
-               return retval;
+               return PTR_ERR(bus->class_dev);
        }
 
+       class_set_devdata(bus->class_dev, bus);
+
        /* Add it to the local list of buses */
        list_add (&bus->bus_list, &usb_bus_list);
        up (&usb_bus_list_lock);
@@ -820,7 +813,7 @@ static void usb_deregister_bus (struct usb_bus *bus)
 
        clear_bit (bus->busnum, busmap.busmap);
 
-       class_device_del(&bus->class_dev);
+       class_device_unregister(bus->class_dev);
 }
 
 /**
index ec9b3bde8ae595e7e61f4e60823505d40c6a0a6a..740cb4c668dfa6295e10ec7aba57854d50bd63ea 100644 (file)
@@ -24,7 +24,7 @@
 
 /* Active configuration fields */
 #define usb_actconfig_show(field, multiplier, format_string)           \
-static ssize_t  show_##field (struct device *dev, char *buf)           \
+static ssize_t  show_##field (struct device *dev, struct device_attribute *attr, char *buf)            \
 {                                                                      \
        struct usb_device *udev;                                        \
        struct usb_host_config *actconfig;                              \
@@ -46,7 +46,7 @@ usb_actconfig_attr (bNumInterfaces, 1, "%2d\n")
 usb_actconfig_attr (bmAttributes, 1, "%2x\n")
 usb_actconfig_attr (bMaxPower, 2, "%3dmA\n")
 
-static ssize_t show_configuration_string(struct device *dev, char *buf)
+static ssize_t show_configuration_string(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct usb_device *udev;
        struct usb_host_config *actconfig;
@@ -69,7 +69,7 @@ static DEVICE_ATTR(configuration, S_IRUGO, show_configuration_string, NULL);
 usb_actconfig_show(bConfigurationValue, 1, "%u\n");
 
 static ssize_t
-set_bConfigurationValue (struct device *dev, const char *buf, size_t count)
+set_bConfigurationValue (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct usb_device       *udev = udev = to_usb_device (dev);
        int                     config, value;
@@ -87,7 +87,7 @@ static DEVICE_ATTR(bConfigurationValue, S_IRUGO | S_IWUSR,
 
 /* String fields */
 #define usb_string_attr(name)                                          \
-static ssize_t  show_##name(struct device *dev, char *buf)             \
+static ssize_t  show_##name(struct device *dev, struct device_attribute *attr, char *buf)              \
 {                                                                      \
        struct usb_device *udev;                                        \
        int len;                                                        \
@@ -107,7 +107,7 @@ usb_string_attr(manufacturer);
 usb_string_attr(serial);
 
 static ssize_t
-show_speed (struct device *dev, char *buf)
+show_speed (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct usb_device *udev;
        char *speed;
@@ -133,7 +133,7 @@ show_speed (struct device *dev, char *buf)
 static DEVICE_ATTR(speed, S_IRUGO, show_speed, NULL);
 
 static ssize_t
-show_devnum (struct device *dev, char *buf)
+show_devnum (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct usb_device *udev;
 
@@ -143,7 +143,7 @@ show_devnum (struct device *dev, char *buf)
 static DEVICE_ATTR(devnum, S_IRUGO, show_devnum, NULL);
 
 static ssize_t
-show_version (struct device *dev, char *buf)
+show_version (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct usb_device *udev;
        u16 bcdUSB;
@@ -155,7 +155,7 @@ show_version (struct device *dev, char *buf)
 static DEVICE_ATTR(version, S_IRUGO, show_version, NULL);
 
 static ssize_t
-show_maxchild (struct device *dev, char *buf)
+show_maxchild (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct usb_device *udev;
 
@@ -167,7 +167,7 @@ static DEVICE_ATTR(maxchild, S_IRUGO, show_maxchild, NULL);
 /* Descriptor fields */
 #define usb_descriptor_attr_le16(field, format_string)                 \
 static ssize_t                                                         \
-show_##field (struct device *dev, char *buf)                           \
+show_##field (struct device *dev, struct device_attribute *attr, char *buf)                            \
 {                                                                      \
        struct usb_device *udev;                                        \
                                                                        \
@@ -183,7 +183,7 @@ usb_descriptor_attr_le16(bcdDevice, "%04x\n")
 
 #define usb_descriptor_attr(field, format_string)                      \
 static ssize_t                                                         \
-show_##field (struct device *dev, char *buf)                           \
+show_##field (struct device *dev, struct device_attribute *attr, char *buf)                            \
 {                                                                      \
        struct usb_device *udev;                                        \
                                                                        \
@@ -254,7 +254,7 @@ void usb_remove_sysfs_dev_files (struct usb_device *udev)
 /* Interface fields */
 #define usb_intf_attr(field, format_string)                            \
 static ssize_t                                                         \
-show_##field (struct device *dev, char *buf)                           \
+show_##field (struct device *dev, struct device_attribute *attr, char *buf)                            \
 {                                                                      \
        struct usb_interface *intf = to_usb_interface (dev);            \
                                                                        \
@@ -269,7 +269,7 @@ usb_intf_attr (bInterfaceClass, "%02x\n")
 usb_intf_attr (bInterfaceSubClass, "%02x\n")
 usb_intf_attr (bInterfaceProtocol, "%02x\n")
 
-static ssize_t show_interface_string(struct device *dev, char *buf)
+static ssize_t show_interface_string(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct usb_interface *intf;
        struct usb_device *udev;
@@ -286,6 +286,37 @@ static ssize_t show_interface_string(struct device *dev, char *buf)
 }
 static DEVICE_ATTR(interface, S_IRUGO, show_interface_string, NULL);
 
+static ssize_t show_modalias(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct usb_interface *intf;
+       struct usb_device *udev;
+       int len;
+
+       intf = to_usb_interface(dev);
+       udev = interface_to_usbdev(intf);
+
+       len = sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic",
+                              le16_to_cpu(udev->descriptor.idVendor),
+                              le16_to_cpu(udev->descriptor.idProduct),
+                              le16_to_cpu(udev->descriptor.bcdDevice),
+                              udev->descriptor.bDeviceClass,
+                              udev->descriptor.bDeviceSubClass,
+                              udev->descriptor.bDeviceProtocol);
+       buf += len;
+
+       if (udev->descriptor.bDeviceClass == 0) {
+               struct usb_host_interface *alt = intf->cur_altsetting;
+
+               return len + sprintf(buf, "%02Xisc%02Xip%02X\n",
+                              alt->desc.bInterfaceClass,
+                              alt->desc.bInterfaceSubClass,
+                              alt->desc.bInterfaceProtocol);
+       } else {
+               return len + sprintf(buf, "*isc*ip*\n");
+       }
+}
+static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL);
+
 static struct attribute *intf_attrs[] = {
        &dev_attr_bInterfaceNumber.attr,
        &dev_attr_bAlternateSetting.attr,
@@ -293,6 +324,7 @@ static struct attribute *intf_attrs[] = {
        &dev_attr_bInterfaceClass.attr,
        &dev_attr_bInterfaceSubClass.attr,
        &dev_attr_bInterfaceProtocol.attr,
+       &dev_attr_modalias.attr,
        NULL,
 };
 static struct attribute_group intf_attr_grp = {
index 25cf7e9eccfaadab58c4eb596494cec910cfbdbb..a3c42203213a7d70d3b9b0d282136cd785d75939 100644 (file)
@@ -293,7 +293,7 @@ int usb_driver_claim_interface(struct usb_driver *driver,
        /* if interface was already added, bind now; else let
         * the future device_add() bind it, bypassing probe()
         */
-       if (!list_empty (&dev->bus_list))
+       if (klist_node_attached(&dev->knode_bus))
                device_bind_driver(dev);
 
        return 0;
@@ -322,9 +322,15 @@ void usb_driver_release_interface(struct usb_driver *driver,
        if (!dev->driver || dev->driver != &driver->driver)
                return;
 
-       /* don't disconnect from disconnect(), or before dev_add() */
-       if (!list_empty (&dev->driver_list) && !list_empty (&dev->bus_list))
+       /* don't release from within disconnect() */
+       if (iface->condition != USB_INTERFACE_BOUND)
+               return;
+
+       /* release only after device_add() */
+       if (klist_node_attached(&dev->knode_bus)) {
+               iface->condition = USB_INTERFACE_UNBINDING;
                device_release_driver(dev);
+       }
 
        dev->driver = NULL;
        usb_set_intfdata(iface, NULL);
@@ -462,6 +468,25 @@ usb_match_id(struct usb_interface *interface, const struct usb_device_id *id)
        return NULL;
 }
 
+
+static int __find_interface(struct device * dev, void * data)
+{
+       struct usb_interface ** ret = (struct usb_interface **)data;
+       struct usb_interface * intf = *ret;
+       int *minor = (int *)data;
+
+       /* can't look at usb devices, only interfaces */
+       if (dev->driver == &usb_generic_driver)
+               return 0;
+
+       intf = to_usb_interface(dev);
+       if (intf->minor != -1 && intf->minor == *minor) {
+               *ret = intf;
+               return 1;
+       }
+       return 0;
+}
+
 /**
  * usb_find_interface - find usb_interface pointer for driver and device
  * @drv: the driver whose current configuration is considered
@@ -473,26 +498,12 @@ usb_match_id(struct usb_interface *interface, const struct usb_device_id *id)
  */
 struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor)
 {
-       struct list_head *entry;
-       struct device *dev;
-       struct usb_interface *intf;
+       struct usb_interface *intf = (struct usb_interface *)(long)minor;
+       int ret;
 
-       list_for_each(entry, &drv->driver.devices) {
-               dev = container_of(entry, struct device, driver_list);
-
-               /* can't look at usb devices, only interfaces */
-               if (dev->driver == &usb_generic_driver)
-                       continue;
-
-               intf = to_usb_interface(dev);
-               if (intf->minor == -1)
-                       continue;
-               if (intf->minor == minor)
-                       return intf;
-       }
+       ret = driver_for_each_device(&drv->driver, NULL, &intf, __find_interface);
 
-       /* no device found that matches */
-       return NULL;    
+       return ret ? intf : NULL;
 }
 
 static int usb_device_match (struct device *dev, struct device_driver *drv)
index 8ef8a9cd9ac4fff558b3874bb298cd7e75c9c1b4..c039d2fbe7ab950ea092e6a853869fc32c760162 100644 (file)
@@ -633,7 +633,7 @@ static const struct usb_gadget_ops dummy_ops = {
 
 /* "function" sysfs attribute */
 static ssize_t
-show_function (struct device *dev, char *buf)
+show_function (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct dummy    *dum = gadget_dev_to_dummy (dev);
 
@@ -1600,7 +1600,7 @@ show_urb (char *buf, size_t size, struct urb *urb)
 }
 
 static ssize_t
-show_urbs (struct device *dev, char *buf)
+show_urbs (struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct usb_hcd          *hcd = dev_get_drvdata (dev);
        struct dummy            *dum = hcd_to_dummy (hcd);
index 4857f0e4ef44948bcc6b9800289af9318884268c..037a7f163822d6c74c4a671d0a904b5e02a577e8 100644 (file)
@@ -3554,14 +3554,14 @@ static void close_all_backing_files(struct fsg_dev *fsg)
 }
 
 
-static ssize_t show_ro(struct device *dev, char *buf)
+static ssize_t show_ro(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lun      *curlun = dev_to_lun(dev);
 
        return sprintf(buf, "%d\n", curlun->ro);
 }
 
-static ssize_t show_file(struct device *dev, char *buf)
+static ssize_t show_file(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct lun      *curlun = dev_to_lun(dev);
        struct fsg_dev  *fsg = (struct fsg_dev *) dev_get_drvdata(dev);
@@ -3589,7 +3589,7 @@ static ssize_t show_file(struct device *dev, char *buf)
 }
 
 
-static ssize_t store_ro(struct device *dev, const char *buf, size_t count)
+static ssize_t store_ro(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        ssize_t         rc = count;
        struct lun      *curlun = dev_to_lun(dev);
@@ -3613,7 +3613,7 @@ static ssize_t store_ro(struct device *dev, const char *buf, size_t count)
        return rc;
 }
 
-static ssize_t store_file(struct device *dev, const char *buf, size_t count)
+static ssize_t store_file(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct lun      *curlun = dev_to_lun(dev);
        struct fsg_dev  *fsg = (struct fsg_dev *) dev_get_drvdata(dev);
index e5457f2026ccd3891c0129a08bc9fe2445d88aea..e47e398daeb5b64f1c1bb286b875c0c71f0484c3 100644 (file)
@@ -1469,7 +1469,7 @@ static const struct usb_gadget_ops net2280_ops = {
 
 /* "function" sysfs attribute */
 static ssize_t
-show_function (struct device *_dev, char *buf)
+show_function (struct device *_dev, struct device_attribute *attr, char *buf)
 {
        struct net2280  *dev = dev_get_drvdata (_dev);
 
@@ -1482,7 +1482,7 @@ show_function (struct device *_dev, char *buf)
 static DEVICE_ATTR (function, S_IRUGO, show_function, NULL);
 
 static ssize_t
-show_registers (struct device *_dev, char *buf)
+show_registers (struct device *_dev, struct device_attribute *attr, char *buf)
 {
        struct net2280          *dev;
        char                    *next;
@@ -1637,7 +1637,7 @@ show_registers (struct device *_dev, char *buf)
 static DEVICE_ATTR (registers, S_IRUGO, show_registers, NULL);
 
 static ssize_t
-show_queues (struct device *_dev, char *buf)
+show_queues (struct device *_dev, struct device_attribute *attr, char *buf)
 {
        struct net2280          *dev;
        char                    *next;
index 6390c5726d81ce50eecfd9c2791064ed564fecae..b8b4524ed7468cda98e8d19a66a39adc84a9578b 100644 (file)
@@ -1429,7 +1429,7 @@ done:
 
 /* "function" sysfs attribute */
 static ssize_t
-show_function (struct device *_dev, char *buf)
+show_function (struct device *_dev, struct device_attribute *attr, char *buf)
 {
        struct pxa2xx_udc       *dev = dev_get_drvdata (_dev);
 
index 3196c3265ff53b1b32a5e0c7607d2f6cd2b7c7fb..19e598c9641f9661b83cefe7c996ef99d44e0fc3 100644 (file)
@@ -124,3 +124,14 @@ config USB_SL811_HCD
          To compile this driver as a module, choose M here: the
          module will be called sl811-hcd.
 
+config USB_SL811_CS
+       tristate "CF/PCMCIA support for SL811HS HCD"
+       depends on USB_SL811_HCD && PCMCIA
+       default N
+       help
+         Wraps a PCMCIA driver around the SL811HS HCD, supporting the RATOC
+         REX-CFU1U CF card (often used with PDAs).  If unsure, say N.
+
+         To compile this driver as a module, choose M here: the
+         module will be called "sl811_cs".
+
index a574ca06cf6b9694a387e9cd3f9b9a659b7df8ee..5dbd3e7a27c709a447dc9515badb98975c16f1be 100644 (file)
@@ -7,4 +7,5 @@ obj-$(CONFIG_USB_EHCI_HCD)      += ehci-hcd.o
 obj-$(CONFIG_USB_OHCI_HCD)     += ohci-hcd.o
 obj-$(CONFIG_USB_UHCI_HCD)     += uhci-hcd.o
 obj-$(CONFIG_USB_SL811_HCD)    += sl811-hcd.o
+obj-$(CONFIG_USB_SL811_CS)     += sl811_cs.o
 obj-$(CONFIG_ETRAX_ARCH_V10)   += hc_crisv10.o
index 9b347d765383ab947b4cee47ffbaf3bfd51078ff..2ff11d53567bcbfd0fdaf48de5dfc545d6d93eab 100644 (file)
@@ -450,7 +450,7 @@ show_async (struct class_device *class_dev, char *buf)
 
        *buf = 0;
 
-       bus = to_usb_bus(class_dev);
+       bus = class_get_devdata(class_dev);
        hcd = bus->hcpriv;
        ehci = hcd_to_ehci (hcd);
        next = buf;
@@ -496,7 +496,7 @@ show_periodic (struct class_device *class_dev, char *buf)
                return 0;
        seen_count = 0;
 
-       bus = to_usb_bus(class_dev);
+       bus = class_get_devdata(class_dev);
        hcd = bus->hcpriv;
        ehci = hcd_to_ehci (hcd);
        next = buf;
@@ -633,7 +633,7 @@ show_registers (struct class_device *class_dev, char *buf)
        static char             fmt [] = "%*s\n";
        static char             label [] = "";
 
-       bus = to_usb_bus(class_dev);
+       bus = class_get_devdata(class_dev);
        hcd = bus->hcpriv;
        ehci = hcd_to_ehci (hcd);
        next = buf;
@@ -735,7 +735,7 @@ static CLASS_DEVICE_ATTR (registers, S_IRUGO, show_registers, NULL);
 
 static inline void create_debug_files (struct ehci_hcd *ehci)
 {
-       struct class_device *cldev = &ehci_to_hcd(ehci)->self.class_dev;
+       struct class_device *cldev = ehci_to_hcd(ehci)->self.class_dev;
 
        class_device_create_file(cldev, &class_device_attr_async);
        class_device_create_file(cldev, &class_device_attr_periodic);
@@ -744,7 +744,7 @@ static inline void create_debug_files (struct ehci_hcd *ehci)
 
 static inline void remove_debug_files (struct ehci_hcd *ehci)
 {
-       struct class_device *cldev = &ehci_to_hcd(ehci)->self.class_dev;
+       struct class_device *cldev = ehci_to_hcd(ehci)->self.class_dev;
 
        class_device_remove_file(cldev, &class_device_attr_async);
        class_device_remove_file(cldev, &class_device_attr_periodic);
index 02fefab3501e78faceb9148da521f4d0142df32a..d7b4f7939ded4d16989478ca58fa3edc573fb728 100644 (file)
@@ -72,6 +72,7 @@ static int ehci_hub_suspend (struct usb_hcd *hcd)
        }
 
        /* turn off now-idle HC */
+       del_timer_sync (&ehci->watchdog);
        ehci_halt (ehci);
        hcd->state = HC_STATE_SUSPENDED;
 
@@ -438,9 +439,12 @@ static int ehci_hub_control (
                        /* force reset to complete */
                        writel (temp & ~PORT_RESET,
                                        &ehci->regs->port_status [wIndex]);
+                       /* REVISIT:  some hardware needs 550+ usec to clear
+                        * this bit; seems too long to spin routinely...
+                        */
                        retval = handshake (
                                        &ehci->regs->port_status [wIndex],
-                                       PORT_RESET, 0, 500);
+                                       PORT_RESET, 0, 750);
                        if (retval != 0) {
                                ehci_err (ehci, "port %d reset error %d\n",
                                        wIndex + 1, retval);
index 62f53a2138082a9f82bfdb31b1667ee7c277c523..c58408c95c3d26666fb86482b03274dd0b2b241b 100644 (file)
@@ -481,7 +481,7 @@ show_async (struct class_device *class_dev, char *buf)
        size_t                  temp;
        unsigned long           flags;
 
-       bus = to_usb_bus(class_dev);
+       bus = class_get_devdata(class_dev);
        hcd = bus->hcpriv;
        ohci = hcd_to_ohci(hcd);
 
@@ -514,7 +514,7 @@ show_periodic (struct class_device *class_dev, char *buf)
                return 0;
        seen_count = 0;
 
-       bus = to_usb_bus(class_dev);
+       bus = class_get_devdata(class_dev);
        hcd = bus->hcpriv;
        ohci = hcd_to_ohci(hcd);
        next = buf;
@@ -611,7 +611,7 @@ show_registers (struct class_device *class_dev, char *buf)
        char                    *next;
        u32                     rdata;
 
-       bus = to_usb_bus(class_dev);
+       bus = class_get_devdata(class_dev);
        hcd = bus->hcpriv;
        ohci = hcd_to_ohci(hcd);
        regs = ohci->regs;
@@ -684,7 +684,7 @@ static CLASS_DEVICE_ATTR (registers, S_IRUGO, show_registers, NULL);
 
 static inline void create_debug_files (struct ohci_hcd *ohci)
 {
-       struct class_device *cldev = &ohci_to_hcd(ohci)->self.class_dev;
+       struct class_device *cldev = ohci_to_hcd(ohci)->self.class_dev;
 
        class_device_create_file(cldev, &class_device_attr_async);
        class_device_create_file(cldev, &class_device_attr_periodic);
@@ -694,7 +694,7 @@ static inline void create_debug_files (struct ohci_hcd *ohci)
 
 static inline void remove_debug_files (struct ohci_hcd *ohci)
 {
-       struct class_device *cldev = &ohci_to_hcd(ohci)->self.class_dev;
+       struct class_device *cldev = ohci_to_hcd(ohci)->self.class_dev;
 
        class_device_remove_file(cldev, &class_device_attr_async);
        class_device_remove_file(cldev, &class_device_attr_periodic);
index a374b7692073596e2679812fa26b807744234ef1..99d43f758ad0e85d524d00cedaf93bed8793ac15 100644 (file)
@@ -2,8 +2,8 @@
  * SL811HS HCD (Host Controller Driver) for USB.
  *
  * Copyright (C) 2004 Psion Teklogix (for NetBook PRO)
- * Copyright (C) 2004 David Brownell
- * 
+ * Copyright (C) 2004-2005 David Brownell
+ *
  * Periodic scheduling is based on Roman's OHCI code
  *     Copyright (C) 1999 Roman Weissgaerber
  *
@@ -15,7 +15,7 @@
  * For documentation, see the SL811HS spec and the "SL811HS Embedded Host"
  * document (providing significant pieces missing from that spec); plus
  * the SL811S spec if you want peripheral side info.
- */ 
+ */
 
 /*
  * Status:  Passed basic stress testing, works with hubs, mice, keyboards,
@@ -67,7 +67,7 @@
 MODULE_DESCRIPTION("SL811HS USB Host Controller Driver");
 MODULE_LICENSE("GPL");
 
-#define DRIVER_VERSION "15 Dec 2004"
+#define DRIVER_VERSION "19 May 2005"
 
 
 #ifndef DEBUG
@@ -121,6 +121,10 @@ static void port_power(struct sl811 *sl811, int is_on)
        /* reset as thoroughly as we can */
        if (sl811->board && sl811->board->reset)
                sl811->board->reset(hcd->self.controller);
+       else {
+               sl811_write(sl811, SL11H_CTLREG1, SL11H_CTL1MASK_SE0);
+               mdelay(20);
+       }
 
        sl811_write(sl811, SL11H_IRQ_ENABLE, 0);
        sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1);
@@ -443,6 +447,7 @@ static void finish_request(
        spin_lock(&urb->lock);
        if (urb->status == -EINPROGRESS)
                urb->status = status;
+       urb->hcpriv = NULL;
        spin_unlock(&urb->lock);
 
        spin_unlock(&sl811->lock);
@@ -472,7 +477,7 @@ static void finish_request(
                if (*prev)
                        *prev = ep->next;
                sl811->load[i] -= ep->load;
-       }       
+       }
        ep->branch = PERIODIC_SIZE;
        sl811->periodic_count--;
        sl811_to_hcd(sl811)->self.bandwidth_allocated
@@ -661,9 +666,9 @@ retry:
 
 #ifdef QUIRK2
        /* this may no longer be necessary ... */
-       if (irqstat == 0 && ret == IRQ_NONE) {
+       if (irqstat == 0) {
                irqstat = checkdone(sl811);
-               if (irqstat /* && irq != ~0 */ )
+               if (irqstat)
                        sl811->stat_lost++;
        }
 #endif
@@ -722,7 +727,8 @@ retry:
                if (sl811->active_a) {
                        sl811_write(sl811, SL811_EP_A(SL11H_HOSTCTLREG), 0);
                        finish_request(sl811, sl811->active_a,
-                               container_of(sl811->active_a->hep->urb_list.next,
+                               container_of(sl811->active_a
+                                               ->hep->urb_list.next,
                                        struct urb, urb_list),
                                NULL, -ESHUTDOWN);
                        sl811->active_a = NULL;
@@ -731,7 +737,8 @@ retry:
                if (sl811->active_b) {
                        sl811_write(sl811, SL811_EP_B(SL11H_HOSTCTLREG), 0);
                        finish_request(sl811, sl811->active_b,
-                               container_of(sl811->active_b->hep->urb_list.next,
+                               container_of(sl811->active_b
+                                               ->hep->urb_list.next,
                                        struct urb, urb_list),
                                NULL, -ESHUTDOWN);
                        sl811->active_b = NULL;
@@ -761,7 +768,7 @@ retry:
                        goto retry;
        }
 
-       if (sl811->periodic_count == 0 && list_empty(&sl811->async)) 
+       if (sl811->periodic_count == 0 && list_empty(&sl811->async))
                sofirq_off(sl811);
        sl811_write(sl811, SL11H_IRQ_ENABLE, sl811->irq_enable);
 
@@ -796,7 +803,7 @@ static int balance(struct sl811 *sl811, u16 period, u16 load)
                        }
                        if (j < PERIODIC_SIZE)
                                continue;
-                       branch = i; 
+                       branch = i;
                }
        }
        return branch;
@@ -890,6 +897,7 @@ static int sl811h_urb_enqueue(
                        break;
                }
 
+               ep->hep = hep;
                hep->hcpriv = ep;
        }
 
@@ -961,15 +969,16 @@ fail:
 static int sl811h_urb_dequeue(struct usb_hcd *hcd, struct urb *urb)
 {
        struct sl811            *sl811 = hcd_to_sl811(hcd);
-       struct usb_host_endpoint *hep = urb->hcpriv;
+       struct usb_host_endpoint *hep;
        unsigned long           flags;
        struct sl811h_ep        *ep;
        int                     retval = 0;
 
+       spin_lock_irqsave(&sl811->lock, flags);
+       hep = urb->hcpriv;
        if (!hep)
-               return -EINVAL;
+               goto fail;
 
-       spin_lock_irqsave(&sl811->lock, flags);
        ep = hep->hcpriv;
        if (ep) {
                /* finish right away if this urb can't be active ...
@@ -1017,6 +1026,7 @@ static int sl811h_urb_dequeue(struct usb_hcd *hcd, struct urb *urb)
                        VDBG("dequeue, urb %p active %s; wait4irq\n", urb,
                                (sl811->active_a == ep) ? "A" : "B");
        } else
+fail:
                retval = -EINVAL;
        spin_unlock_irqrestore(&sl811->lock, flags);
        return retval;
@@ -1576,6 +1586,9 @@ sl811h_start(struct usb_hcd *hcd)
        if (sl811->board && sl811->board->power)
                hub_set_power_budget(udev, sl811->board->power * 2);
 
+       /* enable power and interupts */
+       port_power(sl811, 1);
+
        return 0;
 }
 
@@ -1618,7 +1631,7 @@ static struct hc_driver sl811h_hc_driver = {
 
 /*-------------------------------------------------------------------------*/
 
-static int __init_or_module
+static int __devexit
 sl811h_remove(struct device *dev)
 {
        struct usb_hcd          *hcd = dev_get_drvdata(dev);
@@ -1631,21 +1644,20 @@ sl811h_remove(struct device *dev)
        remove_debug_file(sl811);
        usb_remove_hcd(hcd);
 
-       iounmap(sl811->data_reg);
+       /* some platforms may use IORESOURCE_IO */
        res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-       release_mem_region(res->start, 1);
+       if (res)
+               iounmap(sl811->data_reg);
 
-       iounmap(sl811->addr_reg);
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       release_mem_region(res->start, 1);
+       if (res)
+               iounmap(sl811->addr_reg);
 
        usb_put_hcd(hcd);
        return 0;
 }
 
-#define resource_len(r) (((r)->end - (r)->start) + 1)
-
-static int __init
+static int __devinit
 sl811h_probe(struct device *dev)
 {
        struct usb_hcd          *hcd;
@@ -1656,7 +1668,7 @@ sl811h_probe(struct device *dev)
        void __iomem            *addr_reg;
        void __iomem            *data_reg;
        int                     retval;
-       u8                      tmp;
+       u8                      tmp, ioaddr = 0;
 
        /* basic sanity checks first.  board-specific init logic should
         * have initialized these three resources and probably board
@@ -1664,13 +1676,8 @@ sl811h_probe(struct device *dev)
         * minimal sanity checking.
         */
        pdev = container_of(dev, struct platform_device, dev);
-       if (pdev->num_resources < 3)
-               return -ENODEV;
-
-       addr = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       data = platform_get_resource(pdev, IORESOURCE_MEM, 1);
        irq = platform_get_irq(pdev, 0);
-       if (!addr || !data || irq < 0)
+       if (pdev->num_resources < 3 || irq < 0)
                return -ENODEV;
 
        /* refuse to confuse usbcore */
@@ -1679,24 +1686,31 @@ sl811h_probe(struct device *dev)
                return -EINVAL;
        }
 
-       if (!request_mem_region(addr->start, 1, hcd_name)) {
-               retval = -EBUSY;
-               goto err1;
-       }
-       addr_reg = ioremap(addr->start, resource_len(addr));
-       if (addr_reg == NULL) {
-               retval = -ENOMEM;
-               goto err2;
-       }
+       /* the chip may be wired for either kind of addressing */
+       addr = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       data = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+       retval = -EBUSY;
+       if (!addr || !data) {
+               addr = platform_get_resource(pdev, IORESOURCE_IO, 0);
+               data = platform_get_resource(pdev, IORESOURCE_IO, 1);
+               if (!addr || !data)
+                       return -ENODEV;
+               ioaddr = 1;
+
+               addr_reg = (void __iomem *) addr->start;
+               data_reg = (void __iomem *) data->start;
+       } else {
+               addr_reg = ioremap(addr->start, 1);
+               if (addr_reg == NULL) {
+                       retval = -ENOMEM;
+                       goto err2;
+               }
 
-       if (!request_mem_region(data->start, 1, hcd_name)) {
-               retval = -EBUSY;
-               goto err3;
-       }
-       data_reg = ioremap(data->start, resource_len(addr));
-       if (data_reg == NULL) {
-               retval = -ENOMEM;
-               goto err4;
+               data_reg = ioremap(data->start, 1);
+               if (data_reg == NULL) {
+                       retval = -ENOMEM;
+                       goto err4;
+               }
        }
 
        /* allocate and initialize hcd */
@@ -1737,12 +1751,14 @@ sl811h_probe(struct device *dev)
                goto err6;
        }
 
-       /* sl811s would need a different handler for this irq */
-#ifdef CONFIG_ARM
-       /* Cypress docs say the IRQ is IRQT_HIGH ... */
-       set_irq_type(irq, IRQT_RISING);
-#endif
-       retval = usb_add_hcd(hcd, irq, SA_INTERRUPT);
+       /* The chip's IRQ is level triggered, active high.  A requirement
+        * for platform device setup is to cope with things like signal
+        * inverters (e.g. CF is active low) or working only with edge
+        * triggers (e.g. most ARM CPUs).  Initial driver stress testing
+        * was on a system with single edge triggering, so most sorts of
+        * triggering arrangement should work.
+        */
+       retval = usb_add_hcd(hcd, irq, SA_INTERRUPT | SA_SHIRQ);
        if (retval != 0)
                goto err6;
 
@@ -1752,14 +1768,12 @@ sl811h_probe(struct device *dev)
  err6:
        usb_put_hcd(hcd);
  err5:
-       iounmap(data_reg);
+       if (!ioaddr)
+               iounmap(data_reg);
  err4:
-       release_mem_region(data->start, 1);
- err3:
-       iounmap(addr_reg);
+       if (!ioaddr)
+               iounmap(addr_reg);
  err2:
-       release_mem_region(addr->start, 1);
- err1:
        DBG("init error, %d\n", retval);
        return retval;
 }
@@ -1767,7 +1781,7 @@ sl811h_probe(struct device *dev)
 #ifdef CONFIG_PM
 
 /* for this device there's no useful distinction between the controller
- * and its root hub, except that the root hub only gets direct PM calls 
+ * and its root hub, except that the root hub only gets direct PM calls
  * when CONFIG_USB_SUSPEND is enabled.
  */
 
@@ -1821,20 +1835,22 @@ sl811h_resume(struct device *dev, u32 phase)
 #endif
 
 
-static struct device_driver sl811h_driver = {
+/* this driver is exported so sl811_cs can depend on it */
+struct device_driver sl811h_driver = {
        .name =         (char *) hcd_name,
        .bus =          &platform_bus_type,
 
        .probe =        sl811h_probe,
-       .remove =       sl811h_remove,
+       .remove =       __devexit_p(sl811h_remove),
 
        .suspend =      sl811h_suspend,
        .resume =       sl811h_resume,
 };
+EXPORT_SYMBOL(sl811h_driver);
 
 /*-------------------------------------------------------------------------*/
-static int __init sl811h_init(void) 
+
+static int __init sl811h_init(void)
 {
        if (usb_disabled())
                return -ENODEV;
@@ -1844,8 +1860,8 @@ static int __init sl811h_init(void)
 }
 module_init(sl811h_init);
 
-static void __exit sl811h_cleanup(void) 
-{      
+static void __exit sl811h_cleanup(void)
+{
        driver_unregister(&sl811h_driver);
 }
 module_exit(sl811h_cleanup);
diff --git a/drivers/usb/host/sl811_cs.c b/drivers/usb/host/sl811_cs.c
new file mode 100644 (file)
index 0000000..6e17326
--- /dev/null
@@ -0,0 +1,442 @@
+/*
+ * PCMCIA driver for SL811HS (as found in REX-CFU1U)
+ * Filename: sl811_cs.c
+ * Author:   Yukio Yamamoto
+ *
+ *  Port to sl811-hcd and 2.6.x by
+ *    Botond Botyanszki <boti@rocketmail.com>
+ *    Simon Pickering
+ *
+ *  Last update: 2005-05-12
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/sched.h>
+#include <linux/ptrace.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/timer.h>
+#include <linux/ioport.h>
+
+#include <pcmcia/version.h>
+#include <pcmcia/cs_types.h>
+#include <pcmcia/cs.h>
+#include <pcmcia/cistpl.h>
+#include <pcmcia/cisreg.h>
+#include <pcmcia/ds.h>
+
+#include <linux/usb_sl811.h>
+
+MODULE_AUTHOR("Botond Botyanszki");
+MODULE_DESCRIPTION("REX-CFU1U PCMCIA driver for 2.6");
+MODULE_LICENSE("GPL");
+
+
+/*====================================================================*/
+/* MACROS                                                             */
+/*====================================================================*/
+
+#if defined(DEBUG) || defined(CONFIG_USB_DEBUG) || defined(PCMCIA_DEBUG)
+
+static int pc_debug = 0;
+module_param(pc_debug, int, 0644);
+
+#define DBG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG "sl811_cs: " args)
+
+#else
+#define DBG(n, args...) do{}while(0)
+#endif /* no debugging */
+
+#define INFO(args...) printk(KERN_INFO "sl811_cs: " args)
+
+#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0444)
+
+#define CS_CHECK(fn, ret) \
+       do { \
+               last_fn = (fn); \
+               if ((last_ret = (ret)) != 0) \
+                       goto cs_failed; \
+       } while (0)
+
+/*====================================================================*/
+/* VARIABLES                                                          */
+/*====================================================================*/
+
+static const char driver_name[DEV_NAME_LEN]  = "sl811_cs";
+
+static dev_link_t *dev_list = NULL;
+
+static int irq_list[4] = { -1 };
+static int irq_list_count;
+
+module_param_array(irq_list, int, &irq_list_count, 0444);
+
+INT_MODULE_PARM(irq_mask, 0xdeb8);
+
+typedef struct local_info_t {
+       dev_link_t              link;
+       dev_node_t              node;
+} local_info_t;
+
+/*====================================================================*/
+
+static void release_platform_dev(struct device * dev)
+{
+       DBG(0, "sl811_cs platform_dev release\n");
+       dev->parent = NULL;
+}
+
+static struct sl811_platform_data platform_data = {
+       .potpg          = 100,
+       .power          = 50,           /* == 100mA */
+       // .reset       = ... FIXME:  invoke CF reset on the card
+};
+
+static struct resource resources[] = {
+       [0] = {
+               .flags  = IORESOURCE_IRQ,
+       },
+       [1] = {
+               // .name   = "address",
+               .flags  = IORESOURCE_IO,
+       },
+       [2] = {
+               // .name   = "data",
+               .flags  = IORESOURCE_IO,
+       },
+};
+
+extern struct device_driver sl811h_driver;
+
+static struct platform_device platform_dev = {
+       .id                     = -1,
+       .dev = {
+               .platform_data = &platform_data,
+               .release       = release_platform_dev,
+       },
+       .resource               = resources,
+       .num_resources          = ARRAY_SIZE(resources),
+};
+
+static int sl811_hc_init(struct device *parent, ioaddr_t base_addr, int irq)
+{
+       if (platform_dev.dev.parent)
+               return -EBUSY;
+       platform_dev.dev.parent = parent;
+
+       /* finish seting up the platform device */
+       resources[0].start = irq;
+
+       resources[1].start = base_addr;
+       resources[1].end = base_addr;
+
+       resources[2].start = base_addr + 1;
+       resources[2].end   = base_addr + 1;
+
+       /* The driver core will probe for us.  We know sl811-hcd has been
+        * initialized already because of the link order dependency.
+        */
+       platform_dev.name = sl811h_driver.name;
+       return platform_device_register(&platform_dev);
+}
+
+/*====================================================================*/
+
+static void sl811_cs_detach(dev_link_t *link)
+{
+       dev_link_t **linkp;
+
+       DBG(0, "sl811_cs_detach(0x%p)\n", link);
+
+       /* Locate device structure */
+       for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) {
+               if (*linkp == link)
+                       break;
+       }
+       if (*linkp == NULL)
+               return;
+
+       /* Break the link with Card Services */
+       if (link->handle)
+               pcmcia_deregister_client(link->handle);
+
+       /* Unlink device structure, and free it */
+       *linkp = link->next;
+       /* This points to the parent local_info_t struct */
+       kfree(link->priv);
+}
+
+static void sl811_cs_release(dev_link_t * link)
+{
+
+       DBG(0, "sl811_cs_release(0x%p)\n", link);
+
+       if (link->open) {
+               DBG(1, "sl811_cs: release postponed, '%s' still open\n",
+                   link->dev->dev_name);
+               link->state |= DEV_STALE_CONFIG;
+               return;
+       }
+
+       /* Unlink the device chain */
+       link->dev = NULL;
+
+       platform_device_unregister(&platform_dev);
+       pcmcia_release_configuration(link->handle);
+       if (link->io.NumPorts1)
+               pcmcia_release_io(link->handle, &link->io);
+       if (link->irq.AssignedIRQ)
+               pcmcia_release_irq(link->handle, &link->irq);
+       link->state &= ~DEV_CONFIG;
+
+       if (link->state & DEV_STALE_LINK)
+               sl811_cs_detach(link);
+}
+
+static void sl811_cs_config(dev_link_t *link)
+{
+       client_handle_t         handle = link->handle;
+       struct device           *parent = &handle_to_dev(handle);
+       local_info_t            *dev = link->priv;
+       tuple_t                 tuple;
+       cisparse_t              parse;
+       int                     last_fn, last_ret;
+       u_char                  buf[64];
+       config_info_t           conf;
+       cistpl_cftable_entry_t  dflt = { 0 };
+
+       DBG(0, "sl811_cs_config(0x%p)\n", link);
+
+       tuple.DesiredTuple = CISTPL_CONFIG;
+       tuple.Attributes = 0;
+       tuple.TupleData = buf;
+       tuple.TupleDataMax = sizeof(buf);
+       tuple.TupleOffset = 0;
+       CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
+       CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
+       CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
+       link->conf.ConfigBase = parse.config.base;
+       link->conf.Present = parse.config.rmask[0];
+
+       /* Configure card */
+       link->state |= DEV_CONFIG;
+
+       /* Look up the current Vcc */
+       CS_CHECK(GetConfigurationInfo,
+                       pcmcia_get_configuration_info(handle, &conf));
+       link->conf.Vcc = conf.Vcc;
+
+       tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
+       CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
+       while (1) {
+               cistpl_cftable_entry_t  *cfg = &(parse.cftable_entry);
+
+               if (pcmcia_get_tuple_data(handle, &tuple) != 0
+                               || pcmcia_parse_tuple(handle, &tuple, &parse)
+                                               != 0)
+                       goto next_entry;
+
+               if (cfg->flags & CISTPL_CFTABLE_DEFAULT) {
+                       dflt = *cfg;
+               }
+
+               if (cfg->index == 0)
+                       goto next_entry;
+
+               link->conf.ConfigIndex = cfg->index;
+
+               /* Use power settings for Vcc and Vpp if present */
+               /*  Note that the CIS values need to be rescaled */
+               if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {
+                       if (cfg->vcc.param[CISTPL_POWER_VNOM]/10000
+                                       != conf.Vcc)
+                               goto next_entry;
+               } else if (dflt.vcc.present & (1<<CISTPL_POWER_VNOM)) {
+                       if (dflt.vcc.param[CISTPL_POWER_VNOM]/10000
+                                       != conf.Vcc)
+                               goto next_entry;
+               }
+
+               if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM))
+                       link->conf.Vpp1 = link->conf.Vpp2 =
+                               cfg->vpp1.param[CISTPL_POWER_VNOM]/10000;
+               else if (dflt.vpp1.present & (1<<CISTPL_POWER_VNOM))
+                       link->conf.Vpp1 = link->conf.Vpp2 =
+                               dflt.vpp1.param[CISTPL_POWER_VNOM]/10000;
+
+               /* we need an interrupt */
+               if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1)
+                       link->conf.Attributes |= CONF_ENABLE_IRQ;
+
+               /* IO window settings */
+               link->io.NumPorts1 = link->io.NumPorts2 = 0;
+               if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
+                       cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
+
+                       link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
+                       link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
+                       link->io.BasePort1 = io->win[0].base;
+                       link->io.NumPorts1 = io->win[0].len;
+
+                       if (pcmcia_request_io(link->handle, &link->io) != 0)
+                               goto next_entry;
+               }
+               break;
+
+next_entry:
+               if (link->io.NumPorts1)
+                       pcmcia_release_io(link->handle, &link->io);
+               last_ret = pcmcia_get_next_tuple(handle, &tuple);
+       }
+
+       /* require an IRQ and two registers */
+       if (!link->io.NumPorts1 || link->io.NumPorts1 < 2)
+               goto cs_failed;
+       if (link->conf.Attributes & CONF_ENABLE_IRQ)
+               CS_CHECK(RequestIRQ,
+                       pcmcia_request_irq(link->handle, &link->irq));
+       else
+               goto cs_failed;
+
+       CS_CHECK(RequestConfiguration,
+               pcmcia_request_configuration(link->handle, &link->conf));
+
+       sprintf(dev->node.dev_name, driver_name);
+       dev->node.major = dev->node.minor = 0;
+       link->dev = &dev->node;
+
+       printk(KERN_INFO "%s: index 0x%02x: Vcc %d.%d",
+              dev->node.dev_name, link->conf.ConfigIndex,
+              link->conf.Vcc/10, link->conf.Vcc%10);
+       if (link->conf.Vpp1)
+               printk(", Vpp %d.%d", link->conf.Vpp1/10, link->conf.Vpp1%10);
+       printk(", irq %d", link->irq.AssignedIRQ);
+       printk(", io 0x%04x-0x%04x", link->io.BasePort1,
+              link->io.BasePort1+link->io.NumPorts1-1);
+       printk("\n");
+
+       link->state &= ~DEV_CONFIG_PENDING;
+
+       if (sl811_hc_init(parent, link->io.BasePort1, link->irq.AssignedIRQ)
+                       < 0) {
+cs_failed:
+               printk("sl811_cs_config failed\n");
+               cs_error(link->handle, last_fn, last_ret);
+               sl811_cs_release(link);
+               link->state &= ~DEV_CONFIG_PENDING;
+       }
+}
+
+static int
+sl811_cs_event(event_t event, int priority, event_callback_args_t *args)
+{
+       dev_link_t *link = args->client_data;
+
+       DBG(1, "sl811_cs_event(0x%06x)\n", event);
+
+       switch (event) {
+       case CS_EVENT_CARD_REMOVAL:
+               link->state &= ~DEV_PRESENT;
+               if (link->state & DEV_CONFIG)
+                       sl811_cs_release(link);
+               break;
+
+       case CS_EVENT_CARD_INSERTION:
+               link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
+               sl811_cs_config(link);
+               break;
+
+       case CS_EVENT_PM_SUSPEND:
+               link->state |= DEV_SUSPEND;
+               /* Fall through... */
+       case CS_EVENT_RESET_PHYSICAL:
+               if (link->state & DEV_CONFIG)
+                       pcmcia_release_configuration(link->handle);
+               break;
+
+       case CS_EVENT_PM_RESUME:
+               link->state &= ~DEV_SUSPEND;
+               /* Fall through... */
+       case CS_EVENT_CARD_RESET:
+               if (link->state & DEV_CONFIG)
+                       pcmcia_request_configuration(link->handle, &link->conf);
+               DBG(0, "reset sl811-hcd here?\n");
+               break;
+       }
+       return 0;
+}
+
+static dev_link_t *sl811_cs_attach(void)
+{
+       local_info_t *local;
+       dev_link_t *link;
+       client_reg_t client_reg;
+       int ret, i;
+
+       local = kmalloc(sizeof(local_info_t), GFP_KERNEL);
+       if (!local)
+               return NULL;
+       memset(local, 0, sizeof(local_info_t));
+       link = &local->link;
+       link->priv = local;
+
+       /* Initialize */
+       link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
+       link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID;
+       if (irq_list[0] == -1)
+               link->irq.IRQInfo2 = irq_mask;
+       else
+               for (i = 0; i < irq_list_count; i++)
+                       link->irq.IRQInfo2 |= 1 << irq_list[i];
+       link->irq.Handler = NULL;
+
+       link->conf.Attributes = 0;
+       link->conf.Vcc = 33;
+       link->conf.IntType = INT_MEMORY_AND_IO;
+
+       /* Register with Card Services */
+       link->next = dev_list;
+       dev_list = link;
+       client_reg.dev_info = (dev_info_t *) &driver_name;
+       client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
+       client_reg.EventMask =
+               CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
+               CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
+               CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
+       client_reg.event_handler = &sl811_cs_event;
+       client_reg.Version = 0x0210;
+       client_reg.event_callback_args.client_data = link;
+       ret = pcmcia_register_client(&link->handle, &client_reg);
+       if (ret != CS_SUCCESS) {
+               cs_error(link->handle, RegisterClient, ret);
+               sl811_cs_detach(link);
+               return NULL;
+       }
+
+       return link;
+}
+
+static struct pcmcia_driver sl811_cs_driver = {
+       .owner          = THIS_MODULE,
+       .drv            = {
+               .name   = (char *)driver_name,
+       },
+       .attach         = sl811_cs_attach,
+       .detach         = sl811_cs_detach,
+};
+
+/*====================================================================*/
+
+static int __init init_sl811_cs(void)
+{
+       return pcmcia_register_driver(&sl811_cs_driver);
+}
+module_init(init_sl811_cs);
+
+static void __exit exit_sl811_cs(void)
+{
+       pcmcia_unregister_driver(&sl811_cs_driver);
+}
+module_exit(exit_sl811_cs);
index 94ce2a9ad50f5e9b71b5abdf49f862b3745a0a24..e991f7ed73306359828d8ebd4f74f308555c4abe 100644 (file)
@@ -1025,7 +1025,7 @@ static int aiptek_program_tablet(struct aiptek *aiptek)
 /***********************************************************************
  * support the 'size' file -- display support
  */
-static ssize_t show_tabletSize(struct device *dev, char *buf)
+static ssize_t show_tabletSize(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1048,7 +1048,7 @@ static DEVICE_ATTR(size, S_IRUGO, show_tabletSize, NULL);
 /***********************************************************************
  * support routines for the 'product_id' file
  */
-static ssize_t show_tabletProductId(struct device *dev, char *buf)
+static ssize_t show_tabletProductId(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1064,7 +1064,7 @@ static DEVICE_ATTR(product_id, S_IRUGO, show_tabletProductId, NULL);
 /***********************************************************************
  * support routines for the 'vendor_id' file
  */
-static ssize_t show_tabletVendorId(struct device *dev, char *buf)
+static ssize_t show_tabletVendorId(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1079,7 +1079,7 @@ static DEVICE_ATTR(vendor_id, S_IRUGO, show_tabletVendorId, NULL);
 /***********************************************************************
  * support routines for the 'vendor' file
  */
-static ssize_t show_tabletManufacturer(struct device *dev, char *buf)
+static ssize_t show_tabletManufacturer(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        int retval;
@@ -1096,7 +1096,7 @@ static DEVICE_ATTR(vendor, S_IRUGO, show_tabletManufacturer, NULL);
 /***********************************************************************
  * support routines for the 'product' file
  */
-static ssize_t show_tabletProduct(struct device *dev, char *buf)
+static ssize_t show_tabletProduct(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        int retval;
@@ -1114,7 +1114,7 @@ static DEVICE_ATTR(product, S_IRUGO, show_tabletProduct, NULL);
  * support routines for the 'pointer_mode' file. Note that this file
  * both displays current setting and allows reprogramming.
  */
-static ssize_t show_tabletPointerMode(struct device *dev, char *buf)
+static ssize_t show_tabletPointerMode(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        char *s;
@@ -1143,7 +1143,7 @@ static ssize_t show_tabletPointerMode(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletPointerMode(struct device *dev, const char *buf, size_t count)
+store_tabletPointerMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        if (aiptek == NULL)
@@ -1168,7 +1168,7 @@ static DEVICE_ATTR(pointer_mode,
  * support routines for the 'coordinate_mode' file. Note that this file
  * both displays current setting and allows reprogramming.
  */
-static ssize_t show_tabletCoordinateMode(struct device *dev, char *buf)
+static ssize_t show_tabletCoordinateMode(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        char *s;
@@ -1193,7 +1193,7 @@ static ssize_t show_tabletCoordinateMode(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletCoordinateMode(struct device *dev, const char *buf, size_t count)
+store_tabletCoordinateMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        if (aiptek == NULL)
@@ -1217,7 +1217,7 @@ static DEVICE_ATTR(coordinate_mode,
  * support routines for the 'tool_mode' file. Note that this file
  * both displays current setting and allows reprogramming.
  */
-static ssize_t show_tabletToolMode(struct device *dev, char *buf)
+static ssize_t show_tabletToolMode(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        char *s;
@@ -1262,7 +1262,7 @@ static ssize_t show_tabletToolMode(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletToolMode(struct device *dev, const char *buf, size_t count)
+store_tabletToolMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        if (aiptek == NULL)
@@ -1295,7 +1295,7 @@ static DEVICE_ATTR(tool_mode,
  * support routines for the 'xtilt' file. Note that this file
  * both displays current setting and allows reprogramming.
  */
-static ssize_t show_tabletXtilt(struct device *dev, char *buf)
+static ssize_t show_tabletXtilt(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1311,7 +1311,7 @@ static ssize_t show_tabletXtilt(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletXtilt(struct device *dev, const char *buf, size_t count)
+store_tabletXtilt(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        int x;
@@ -1337,7 +1337,7 @@ static DEVICE_ATTR(xtilt,
  * support routines for the 'ytilt' file. Note that this file
  * both displays current setting and allows reprogramming.
  */
-static ssize_t show_tabletYtilt(struct device *dev, char *buf)
+static ssize_t show_tabletYtilt(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1353,7 +1353,7 @@ static ssize_t show_tabletYtilt(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletYtilt(struct device *dev, const char *buf, size_t count)
+store_tabletYtilt(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        int y;
@@ -1379,7 +1379,7 @@ static DEVICE_ATTR(ytilt,
  * support routines for the 'jitter' file. Note that this file
  * both displays current setting and allows reprogramming.
  */
-static ssize_t show_tabletJitterDelay(struct device *dev, char *buf)
+static ssize_t show_tabletJitterDelay(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1390,7 +1390,7 @@ static ssize_t show_tabletJitterDelay(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletJitterDelay(struct device *dev, const char *buf, size_t count)
+store_tabletJitterDelay(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1409,7 +1409,7 @@ static DEVICE_ATTR(jitter,
  * support routines for the 'delay' file. Note that this file
  * both displays current setting and allows reprogramming.
  */
-static ssize_t show_tabletProgrammableDelay(struct device *dev, char *buf)
+static ssize_t show_tabletProgrammableDelay(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1421,7 +1421,7 @@ static ssize_t show_tabletProgrammableDelay(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletProgrammableDelay(struct device *dev, const char *buf, size_t count)
+store_tabletProgrammableDelay(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1440,7 +1440,7 @@ static DEVICE_ATTR(delay,
  * support routines for the 'input_path' file. Note that this file
  * only displays current setting.
  */
-static ssize_t show_tabletInputDevice(struct device *dev, char *buf)
+static ssize_t show_tabletInputDevice(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1457,7 +1457,7 @@ static DEVICE_ATTR(input_path, S_IRUGO, show_tabletInputDevice, NULL);
  * support routines for the 'event_count' file. Note that this file
  * only displays current setting.
  */
-static ssize_t show_tabletEventsReceived(struct device *dev, char *buf)
+static ssize_t show_tabletEventsReceived(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1473,7 +1473,7 @@ static DEVICE_ATTR(event_count, S_IRUGO, show_tabletEventsReceived, NULL);
  * support routines for the 'diagnostic' file. Note that this file
  * only displays current setting.
  */
-static ssize_t show_tabletDiagnosticMessage(struct device *dev, char *buf)
+static ssize_t show_tabletDiagnosticMessage(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        char *retMsg;
@@ -1515,7 +1515,7 @@ static DEVICE_ATTR(diagnostic, S_IRUGO, show_tabletDiagnosticMessage, NULL);
  * support routines for the 'stylus_upper' file. Note that this file
  * both displays current setting and allows for setting changing.
  */
-static ssize_t show_tabletStylusUpper(struct device *dev, char *buf)
+static ssize_t show_tabletStylusUpper(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        char *s;
@@ -1540,7 +1540,7 @@ static ssize_t show_tabletStylusUpper(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletStylusUpper(struct device *dev, const char *buf, size_t count)
+store_tabletStylusUpper(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1565,7 +1565,7 @@ static DEVICE_ATTR(stylus_upper,
  * support routines for the 'stylus_lower' file. Note that this file
  * both displays current setting and allows for setting changing.
  */
-static ssize_t show_tabletStylusLower(struct device *dev, char *buf)
+static ssize_t show_tabletStylusLower(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        char *s;
@@ -1590,7 +1590,7 @@ static ssize_t show_tabletStylusLower(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletStylusLower(struct device *dev, const char *buf, size_t count)
+store_tabletStylusLower(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1615,7 +1615,7 @@ static DEVICE_ATTR(stylus_lower,
  * support routines for the 'mouse_left' file. Note that this file
  * both displays current setting and allows for setting changing.
  */
-static ssize_t show_tabletMouseLeft(struct device *dev, char *buf)
+static ssize_t show_tabletMouseLeft(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        char *s;
@@ -1644,7 +1644,7 @@ static ssize_t show_tabletMouseLeft(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletMouseLeft(struct device *dev, const char *buf, size_t count)
+store_tabletMouseLeft(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1669,7 +1669,7 @@ static DEVICE_ATTR(mouse_left,
  * support routines for the 'mouse_middle' file. Note that this file
  * both displays current setting and allows for setting changing.
  */
-static ssize_t show_tabletMouseMiddle(struct device *dev, char *buf)
+static ssize_t show_tabletMouseMiddle(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        char *s;
@@ -1698,7 +1698,7 @@ static ssize_t show_tabletMouseMiddle(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletMouseMiddle(struct device *dev, const char *buf, size_t count)
+store_tabletMouseMiddle(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1725,7 +1725,7 @@ static DEVICE_ATTR(mouse_middle,
  * support routines for the 'mouse_right' file. Note that this file
  * both displays current setting and allows for setting changing.
  */
-static ssize_t show_tabletMouseRight(struct device *dev, char *buf)
+static ssize_t show_tabletMouseRight(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
        char *s;
@@ -1754,7 +1754,7 @@ static ssize_t show_tabletMouseRight(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletMouseRight(struct device *dev, const char *buf, size_t count)
+store_tabletMouseRight(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1780,7 +1780,7 @@ static DEVICE_ATTR(mouse_right,
  * support routines for the 'wheel' file. Note that this file
  * both displays current setting and allows for setting changing.
  */
-static ssize_t show_tabletWheel(struct device *dev, char *buf)
+static ssize_t show_tabletWheel(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1796,7 +1796,7 @@ static ssize_t show_tabletWheel(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletWheel(struct device *dev, const char *buf, size_t count)
+store_tabletWheel(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1814,7 +1814,7 @@ static DEVICE_ATTR(wheel,
  * support routines for the 'execute' file. Note that this file
  * both displays current setting and allows for setting changing.
  */
-static ssize_t show_tabletExecute(struct device *dev, char *buf)
+static ssize_t show_tabletExecute(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1829,7 +1829,7 @@ static ssize_t show_tabletExecute(struct device *dev, char *buf)
 }
 
 static ssize_t
-store_tabletExecute(struct device *dev, const char *buf, size_t count)
+store_tabletExecute(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1855,7 +1855,7 @@ static DEVICE_ATTR(execute,
  * support routines for the 'odm_code' file. Note that this file
  * only displays current setting.
  */
-static ssize_t show_tabletODMCode(struct device *dev, char *buf)
+static ssize_t show_tabletODMCode(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1871,7 +1871,7 @@ static DEVICE_ATTR(odm_code, S_IRUGO, show_tabletODMCode, NULL);
  * support routines for the 'model_code' file. Note that this file
  * only displays current setting.
  */
-static ssize_t show_tabletModelCode(struct device *dev, char *buf)
+static ssize_t show_tabletModelCode(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
@@ -1887,7 +1887,7 @@ static DEVICE_ATTR(model_code, S_IRUGO, show_tabletModelCode, NULL);
  * support routines for the 'firmware_code' file. Note that this file
  * only displays current setting.
  */
-static ssize_t show_firmwareCode(struct device *dev, char *buf)
+static ssize_t show_firmwareCode(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct aiptek *aiptek = dev_get_drvdata(dev);
 
index 869ff73690acebf04655691c4edc01a017a6abe4..2d8bd9dcc6edae2b8d1c4ea112f0c5e66cddc149 100644 (file)
@@ -1315,6 +1315,8 @@ void hid_init_reports(struct hid_device *hid)
 #define USB_DEVICE_ID_WACOM_INTUOS2    0x0040
 #define USB_DEVICE_ID_WACOM_VOLITO     0x0060
 #define USB_DEVICE_ID_WACOM_PTU                0x0003
+#define USB_DEVICE_ID_WACOM_INTUOS3    0x00B0
+#define USB_DEVICE_ID_WACOM_CINTIQ     0x003F
 
 #define USB_VENDOR_ID_KBGEAR           0x084e
 #define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001
@@ -1401,6 +1403,7 @@ void hid_init_reports(struct hid_device *hid)
 
 #define USB_VENDOR_ID_DELORME          0x1163
 #define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100
+#define USB_DEVICE_ID_DELORME_EM_LT20  0x0200
 
 #define USB_VENDOR_ID_MCC              0x09db
 #define USB_DEVICE_ID_MCC_PMD1024LS    0x0076
@@ -1412,6 +1415,12 @@ void hid_init_reports(struct hid_device *hid)
 #define USB_VENDOR_ID_BTC              0x046e
 #define USB_DEVICE_ID_BTC_KEYBOARD     0x5303
 
+#define USB_VENDOR_ID_VERNIER          0x08f7
+#define USB_DEVICE_ID_VERNIER_LABPRO   0x0001
+#define USB_DEVICE_ID_VERNIER_GOTEMP   0x0002
+#define USB_DEVICE_ID_VERNIER_SKIP     0x0003
+#define USB_DEVICE_ID_VERNIER_CYCLOPS  0x0004
+
 
 /*
  * Alphabetically sorted blacklist by quirk type.
@@ -1437,6 +1446,7 @@ static struct hid_blacklist {
        { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30, HID_QUIRK_IGNORE },
@@ -1456,6 +1466,10 @@ static struct hid_blacklist {
        { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 300, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 400, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 500, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PENPARTNER, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE + 1, HID_QUIRK_IGNORE },
@@ -1481,6 +1495,10 @@ static struct hid_blacklist {
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 7, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PTU, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 1, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 2, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_CINTIQ, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
 
diff --git a/drivers/usb/media/pwc/ChangeLog b/drivers/usb/media/pwc/ChangeLog
deleted file mode 100644 (file)
index b2eb71a..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-9.0.2
-
-* Adding #ifdef to compile PWC before and after 2.6.5
-
-9.0.1
-
-9.0
-
-
-8.12
-
-* Implement motorized pan/tilt feature for Logitech QuickCam Orbit/Spere.
-
-8.11.1
-
-* Fix for PCVC720/40, would not be able to set videomode
-* Fix for Samsung MPC models, appearantly they are based on a newer chipset
-
-8.11
-
-* 20 dev_hints (per request)
-* Hot unplugging should be better, no more dangling pointers or memory leaks
-* Added reserved Logitech webcam IDs
-* Device now remembers size & fps between close()/open()
-* Removed palette stuff altogether
-
-8.10.1
-
-* Added IDs for PCVC720K/40 and Creative Labs Webcam Pro
-
-8.10
-
-* Fixed ID for QuickCam Notebook pro
-* Added GREALSIZE ioctl() call
-* Fixed bug in case PWCX was not loaded and invalid size was set
-
-8.9
-
-* Merging with kernel 2.5.49
-* Adding IDs for QuickCam Zoom & QuickCam Notebook
-
-8.8
-
-* Fixing 'leds' parameter
-* Adding IDs for Logitech QuickCam Pro 4000
-* Making URB init/cleanup a little nicer
-
-8.7
-
-* Incorporating changes in ioctl() parameter passing
-* Also changes to URB mechanism
-
-8.6
-
-* Added ID's for Visionite VCS UM100 and UC300
-* Removed YUV420-interlaced palette altogether (was confusing)
-* Removed MIRROR stuff as it didn't work anyway
-* Fixed a problem with the 'leds' parameter (wouldn't blink)
-* Added ioctl()s for advanced features: 'extended' whitebalance ioctl()s,
-  CONTOUR, BACKLIGHT, FLICKER, DYNNOISE.
-* VIDIOCGCAP.name now contains real camera model name instead of
-  'Philips xxx webcam'
-* Added PROBE ioctl (see previous point & API doc)
-
-8.5
-
-* Adding IDs for Creative Labs Webcam 5
-* Adding IDs for SOTEC CMS-001 webcam
-* Solving possible hang in VIDIOCSYNC when unplugging the cam 
-* Forgot to return structure in VIDIOCPWCGAWB, oops
-* Time interval for the LEDs are now in milliseconds
-
-8.4
-
-* Fixing power_save option for Vesta range
-* Handling new error codes in ISOC callback
-* Adding dev_hint module parameter, to specify /dev/videoX device nodes
-
-8.3
-
-* Adding Samsung C10 and C30 cameras
-* Removing palette module parameter
-* Fixed typo in ID of QuickCam 3000 Pro
-* Adding LED settings (blinking while in use) for ToUCam cameras.
-* Turns LED off when camera is not in use.
-
-8.2
-
-* Making module more silent when trace = 0 
-* Adding QuickCam 3000 Pro IDs
-* Chrominance control for the Vesta cameras
-* Hopefully fixed problems on machines with BIGMEM and > 1GB of RAM
-* Included Oliver Neukem's lock_kernel() patch
-* Allocates less memory for image buffers
-* Adds ioctl()s for the whitebalancing
-
-8.1
-
-* Adding support for 750
-* Adding V4L GAUDIO/SAUDIO/UNIT ioctl() calls
-
-8.0
-* 'damage control' after inclusion in 2.4.5.
-* Changed wait-queue mechanism in read/mmap/poll according to the book.
-* Included YUV420P palette.
-* Changed interface to decompressor module.
-* Cleaned up pwc structure a bit.
-
-7.0
-
-* Fixed bug in vcvt_420i_yuyv; extra variables on stack were misaligned.
-* There is now a clear error message when an image size is selected that
-  is only supported using the decompressor, and the decompressor isn't
-  loaded.
-* When the decompressor wasn't loaded, selecting large image size
-  would create skewed or double images.
-
-6.3
-
-* Introduced spinlocks for the buffer pointer manipulation; a number of
-  reports seem to suggest the down()/up() semaphores were the cause of
-  lockups, since they are not suitable for interrupt/user locking.
-* Separated decompressor and core code into 2 modules.
-
-6.2
-
-* Non-integral image sizes are now padded with gray or black.
-* Added SHUTTERSPEED ioctl().
-* Fixed buglet in VIDIOCPWCSAGC; the function would always return an error,
-  even though the call succeeded.
-* Added hotplug support for 2.4.*.
-* Memory: the 645/646 uses less memory now.
-
-6.1
-
-* VIDIOCSPICT returns -EINVAL with invalid palettes.
-* Added saturation control.
-* Split decompressors from rest.
-* Fixed bug that would reset the framerate to the default framerate if 
-  the rate field was set to 0 (which is not what I intended, nl. do not 
-  change the framerate!).
-* VIDIOCPWCSCQUAL (setting compression quality) now takes effect immediately.
-* Workaround for a bug in the 730 sensor.
index e0b41ed4407f5fa8767c90d66e00e2bb234b3a9d..2d93a775011a3d390fcf277d46225f273a74a7be 100644 (file)
@@ -1,6 +1,6 @@
 ifneq ($(KERNELRELEASE),)
 
-pwc-objs       := pwc-if.o pwc-misc.o pwc-ctrl.o pwc-uncompress.o pwc-dec1.o pwc-dec23.o pwc-kiara.o pwc-timon.o
+pwc-objs       := pwc-if.o pwc-misc.o pwc-ctrl.o pwc-uncompress.o pwc-timon.o pwc-kiara.o
 
 obj-$(CONFIG_USB_PWC) += pwc.o
 
index 42ec468d52d6c8770a2dd4b6270f34ab455b1d8b..53099190952ce022338b7fad0df8c82c941bcbcd 100644 (file)
@@ -48,8 +48,6 @@
 #include "pwc-uncompress.h"
 #include "pwc-kiara.h"
 #include "pwc-timon.h"
-#include "pwc-dec1.h"
-#include "pwc-dec23.h"
 
 /* Request types: video */
 #define SET_LUM_CTL                    0x01
@@ -246,7 +244,7 @@ static inline int set_video_mode_Nala(struct pwc_device *pdev, int size, int fra
           switch(pdev->type) {
             case 645:
             case 646:
-              pwc_dec1_init(pdev->type, pdev->release, buf, pdev->decompress_data);
+/*            pwc_dec1_init(pdev->type, pdev->release, buf, pdev->decompress_data); */
               break;
 
             case 675:
@@ -256,7 +254,7 @@ static inline int set_video_mode_Nala(struct pwc_device *pdev, int size, int fra
             case 730:
             case 740:
             case 750:
-              pwc_dec23_init(pdev->type, pdev->release, buf, pdev->decompress_data);
+/*            pwc_dec23_init(pdev->type, pdev->release, buf, pdev->decompress_data); */
               break;
           }
        }
@@ -318,8 +316,8 @@ static inline int set_video_mode_Timon(struct pwc_device *pdev, int size, int fr
        if (ret < 0)
                return ret;
 
-       if (pChoose->bandlength > 0 && pdev->vpalette != VIDEO_PALETTE_RAW)
-          pwc_dec23_init(pdev->type, pdev->release, buf, pdev->decompress_data);
+/*     if (pChoose->bandlength > 0 && pdev->vpalette != VIDEO_PALETTE_RAW)
+          pwc_dec23_init(pdev->type, pdev->release, buf, pdev->decompress_data); */
 
        pdev->cmd_len = 13;
        memcpy(pdev->cmd_buf, buf, 13);
@@ -397,8 +395,8 @@ static inline int set_video_mode_Kiara(struct pwc_device *pdev, int size, int fr
        if (ret < 0)
                return ret;
 
-       if (pChoose->bandlength > 0 && pdev->vpalette != VIDEO_PALETTE_RAW)
-         pwc_dec23_init(pdev->type, pdev->release, buf, pdev->decompress_data);
+/*     if (pChoose->bandlength > 0 && pdev->vpalette != VIDEO_PALETTE_RAW)
+         pwc_dec23_init(pdev->type, pdev->release, buf, pdev->decompress_data); */
 
        pdev->cmd_len = 12;
        memcpy(pdev->cmd_buf, buf, 12);
diff --git a/drivers/usb/media/pwc/pwc-dec1.c b/drivers/usb/media/pwc/pwc-dec1.c
deleted file mode 100644 (file)
index 57d03d9..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Linux driver for Philips webcam
-   Decompression for chipset version 1
-   (C) 2004      Luc Saillard (luc@saillard.org)
-
-   NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx
-   driver and thus may have bugs that are not present in the original version.
-   Please send bug reports and support requests to <luc@saillard.org>.
-   The decompression routines have been implemented by reverse-engineering the
-   Nemosoft binary pwcx module. Caveat emptor.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-
-
-
-#include "pwc-dec1.h"
-
-
-void pwc_dec1_init(int type, int release, void *buffer, void *table)
-{
-
-}
-
-void pwc_dec1_exit(void)
-{
-
-
-
-}
-
diff --git a/drivers/usb/media/pwc/pwc-dec1.h b/drivers/usb/media/pwc/pwc-dec1.h
deleted file mode 100644 (file)
index a7ffd9c..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Linux driver for Philips webcam
-   (C) 2004      Luc Saillard (luc@saillard.org)
-
-   NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx
-   driver and thus may have bugs that are not present in the original version.
-   Please send bug reports and support requests to <luc@saillard.org>.
-   The decompression routines have been implemented by reverse-engineering the
-   Nemosoft binary pwcx module. Caveat emptor.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-
-
-
-#ifndef PWC_DEC1_H
-#define PWC_DEC1_H
-
-void pwc_dec1_init(int type, int release, void *buffer, void *private_data);
-void pwc_dec1_exit(void);
-
-#endif
-
-
-
diff --git a/drivers/usb/media/pwc/pwc-dec23.c b/drivers/usb/media/pwc/pwc-dec23.c
deleted file mode 100644 (file)
index 98fa3f7..0000000
+++ /dev/null
@@ -1,623 +0,0 @@
-/* Linux driver for Philips webcam
-   Decompression for chipset version 2 et 3
-   (C) 2004      Luc Saillard (luc@saillard.org)
-
-   NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx
-   driver and thus may have bugs that are not present in the original version.
-   Please send bug reports and support requests to <luc@saillard.org>.
-   The decompression routines have been implemented by reverse-engineering the
-   Nemosoft binary pwcx module. Caveat emptor.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-
-#include "pwc-timon.h"
-#include "pwc-kiara.h"
-#include "pwc-dec23.h"
-#include "pwc-ioctl.h"
-
-#include <linux/string.h>
-
-/****
- *
- *
- *
- */
-
-
-static void fill_table_a000(unsigned int *p)
-{
-  static unsigned int initial_values[12] = {
-     0xFFAD9B00, 0xFFDDEE00, 0x00221200, 0x00526500,
-     0xFFC21E00, 0x003DE200, 0xFF924B80, 0xFFD2A300,
-     0x002D5D00, 0x006DB480, 0xFFED3E00, 0x0012C200
-  };
-  static unsigned int values_derivated[12] = {
-     0x0000A4CA, 0x00004424, 0xFFFFBBDC, 0xFFFF5B36,
-     0x00007BC4, 0xFFFF843C, 0x0000DB69, 0x00005ABA,
-     0xFFFFA546, 0xFFFF2497, 0x00002584, 0xFFFFDA7C
-  };
-  unsigned int temp_values[12];
-  int i,j;
-
-  memcpy(temp_values,initial_values,sizeof(initial_values));
-  for (i=0;i<256;i++)
-   {
-     for (j=0;j<12;j++)
-      {
-       *p++ = temp_values[j];
-       temp_values[j] += values_derivated[j];
-      }
-   }
-}
-
-static void fill_table_d000(unsigned char *p)
-{
-  int bit,byte;
-
-  for (bit=0; bit<8; bit++)
-   {
-     unsigned char bitpower = 1<<bit;
-     unsigned char mask = bitpower-1;
-     for (byte=0; byte<256; byte++)
-      {
-       if (byte & bitpower)
-         *p++ = -(byte & mask);
-       else
-         *p++ = (byte & mask);
-      }
-   }
-}
-
-/*
- *
- * Kiara: 0 <= ver <= 7
- * Timon: 0 <= ver <= 15
- *
- */
-static void fill_table_color(unsigned int version, const unsigned int *romtable, 
-    unsigned char *p0004, 
-    unsigned char *p8004)
-{
-  const unsigned int *table;
-  unsigned char *p0, *p8;
-  int i,j,k;
-  int dl,bit,pw;
-
-  romtable += version*256;
-
-  for (i=0; i<2; i++)
-   {
-     table = romtable + i*128;
-
-     for (dl=0; dl<16; dl++)
-      {
-       p0 = p0004 + (i<<14) + (dl<<10);
-       p8 = p8004 + (i<<12) + (dl<<8);
-
-       for (j=0; j<8; j++ , table++, p0+=128)
-        {
-          for (k=0; k<16; k++)
-           {
-             if (k==0)
-               bit=1;
-             else if (k>=1 && k<3)
-               bit=(table[0]>>15)&7;
-             else if (k>=3 && k<6)
-               bit=(table[0]>>12)&7;
-             else if (k>=6 && k<10)
-               bit=(table[0]>>9)&7;
-             else if (k>=10 && k<13)
-               bit=(table[0]>>6)&7;
-             else if (k>=13 && k<15)
-               bit=(table[0]>>3)&7;
-             else
-               bit=(table[0])&7;
-             if (k == 0)
-               *(unsigned char *)p8++ = 8;
-             else
-               *(unsigned char *)p8++ = j - bit;
-             *(unsigned char *)p8++ = bit;
-
-             pw = 1<<bit;
-             p0[k+0x00] = (1*pw)  + 0x80;
-             p0[k+0x10] = (2*pw)  + 0x80;
-             p0[k+0x20] = (3*pw)  + 0x80;
-             p0[k+0x30] = (4*pw)  + 0x80;
-             p0[k+0x40] = (-pw)   + 0x80;
-             p0[k+0x50] = (2*-pw) + 0x80;
-             p0[k+0x60] = (3*-pw) + 0x80;
-             p0[k+0x70] = (4*-pw) + 0x80;
-           } /* end of for (k=0; k<16; k++, p8++) */
-        } /* end of for (j=0; j<8; j++ , table++) */
-      } /* end of for (dl=0; dl<16; dl++) */
-   } /* end of for (i=0; i<2; i++) */
-}
-
-/*
- * precision = (pdev->xx + pdev->yy)
- *
- */
-static void fill_table_dc00_d800(unsigned int precision, unsigned int *pdc00, unsigned int *pd800)
-{
-  int i;
-  unsigned int offset1, offset2;
-  for(i=0,offset1=0x4000, offset2=0; i<256 ; i++,offset1+=0x7BC4, offset2+=0x7BC4)
-   {
-     unsigned int msb = offset1 >> 15;
-
-     if ( msb > 255)
-      {
-       if (msb)
-         msb=0;
-       else
-         msb=255;
-      }
-
-     *pdc00++ = msb << precision;
-     *pd800++ = offset2;
-   }
-
-}
-
-/*
- * struct {
- *   unsigned char op;     // operation to execute
- *   unsigned char bits;    // bits use to perform operation
- *   unsigned char offset1; // offset to add to access in the table_0004 % 16
- *   unsigned char offset2; // offset to add to access in the table_0004
- * }
- *
- */
-static unsigned int table_ops[] = {
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x10, 0x00,0x06,0x01,0x30,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x01,0x20, 0x01,0x00,0x00,0x00,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x50, 0x00,0x05,0x02,0x00,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x03,0x00, 0x01,0x00,0x00,0x00,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x10, 0x00,0x06,0x02,0x10,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x01,0x60, 0x01,0x00,0x00,0x00,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x50, 0x00,0x05,0x02,0x40,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x03,0x40, 0x01,0x00,0x00,0x00,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x10, 0x00,0x06,0x01,0x70,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x01,0x20, 0x01,0x00,0x00,0x00,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x50, 0x00,0x05,0x02,0x00,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x03,0x00, 0x01,0x00,0x00,0x00,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x10, 0x00,0x06,0x02,0x50,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x01,0x60, 0x01,0x00,0x00,0x00,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x50, 0x00,0x05,0x02,0x40,
-0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x03,0x40, 0x01,0x00,0x00,0x00
-};
-
-/*
- * TODO: multiply by 4 all values
- *
- */
-static unsigned int MulIdx[256] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3,
- 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
- 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4,
- 6, 7, 8, 9, 7,10,11, 8, 8,11,10, 7, 9, 8, 7, 6,
- 4, 5, 5, 4, 4, 5, 5, 4, 4, 5, 5, 4, 4, 5, 5, 4,
- 1, 3, 0, 2, 1, 3, 0, 2, 1, 3, 0, 2, 1, 3, 0, 2,
- 0, 3, 3, 0, 1, 2, 2, 1, 2, 1, 1, 2, 3, 0, 0, 3,
- 0, 1, 2, 3, 3, 2, 1, 0, 3, 2, 1, 0, 0, 1, 2, 3,
- 1, 1, 1, 1, 3, 3, 3, 3, 0, 0, 0, 0, 2, 2, 2, 2,
- 7,10,11, 8, 9, 8, 7, 6, 6, 7, 8, 9, 8,11,10, 7,
- 4, 5, 5, 4, 5, 4, 4, 5, 5, 4, 4, 5, 4, 5, 5, 4,
- 7, 9, 6, 8,10, 8, 7,11,11, 7, 8,10, 8, 6, 9, 7,
- 1, 3, 0, 2, 2, 0, 3, 1, 2, 0, 3, 1, 1, 3, 0, 2,
- 1, 2, 2, 1, 3, 0, 0, 3, 0, 3, 3, 0, 2, 1, 1, 2,
-10, 8, 7,11, 8, 6, 9, 7, 7, 9, 6, 8,11, 7, 8,10
-};
-
-
-
-void pwc_dec23_init(int type, int release, unsigned char *mode, void *data)
-{
-  int flags;
-  struct pwc_dec23_private *pdev = data;
-  release = release;
-
-  switch (type)
-   {
-    case 720:
-    case 730:
-    case 740:
-    case 750:
-      flags = mode[2]&0x18;    /* our: flags = 8, mode[2]==e8 */
-      if (flags==8)
-       pdev->zz = 7;
-      else if (flags==0x10)
-       pdev->zz = 8;
-      else
-       pdev->zz = 6;
-      flags = mode[2]>>5;      /* our: 7 */
-
-      fill_table_color(flags, (unsigned int *)KiaraRomTable, pdev->table_0004, pdev->table_8004);
-      break;
-
-
-    case 675:
-    case 680:
-    case 690:
-      flags = mode[2]&6;
-      if (flags==2)
-       pdev->zz = 7;
-      else if (flags==4)
-       pdev->zz = 8;
-      else
-       pdev->zz = 6;
-      flags = mode[2]>>3;
-
-      fill_table_color(flags, (unsigned int *)TimonRomTable, pdev->table_0004, pdev->table_8004);
-      break;
-
-    default:
-      /* Not supported */
-      return;
-   }
-
-  /* * * * ** */
-  pdev->xx = 8 - pdev->zz;
-  pdev->yy = 15 - pdev->xx;
-  pdev->zzmask = 0xFF>>pdev->xx;
-  //pdev->zzmask = (1U<<pdev->zz)-1;
-
-
-  fill_table_dc00_d800(pdev->xx + pdev->yy, pdev->table_dc00, pdev->table_d800);
-  fill_table_a000(pdev->table_a004);
-  fill_table_d000(pdev->table_d004);
-}
-
-
-/*
- * To manage the stream, we keep in a 32 bits variables,
- * the next bits in the stream. fill_reservoir() add to
- * the reservoir at least wanted nbits.
- *
- *
- */
-#define fill_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted) do { \
-   while (nbits_in_reservoir<nbits_wanted) \
-    { \
-      reservoir |= (*(stream)++) << nbits_in_reservoir; \
-      nbits_in_reservoir+=8; \
-    } \
-}  while(0);
-
-#define get_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted,result) do { \
-   fill_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted); \
-   result = (reservoir) & ((1U<<nbits_wanted)-1); \
-   reservoir >>= nbits_wanted; \
-   nbits_in_reservoir -= nbits_wanted; \
-}  while(0);
-
-
-
-static void DecompressBand23(const struct pwc_dec23_private *pdev,
-                             const unsigned char *rawyuv,
-                            unsigned char *planar_y,
-                            unsigned char *planar_u,
-                            unsigned char *planar_v,
-                            unsigned int image_x,              /* aka number of pixels wanted ??? */
-                            unsigned int pixels_per_line,      /* aka number of pixels per line */
-                            int flags)
-{
-
-
-  unsigned int reservoir, nbits_in_reservoir;
-  int first_4_bits;
-  unsigned int bytes_per_channel;
-  int line_size;       /* size of the line (4Y+U+V) */
-  int passes;
-  const unsigned char *ptable0004, *ptable8004;
-
-  int even_line;
-  unsigned int temp_colors[16];
-  int nblocks;
-
-  const unsigned char *stream;
-  unsigned char *dest_y, *dest_u=NULL, *dest_v=NULL;
-  unsigned int offset_to_plane_u, offset_to_plane_v;
-
-  int i;
-
-
-  reservoir = 0;
-  nbits_in_reservoir = 0;
-  stream = rawyuv+1;   /* The first byte of the stream is skipped */
-  even_line = 1;
-
-  get_nbits(reservoir,nbits_in_reservoir,stream,4,first_4_bits);
-
-  line_size = pixels_per_line*3;
-
-  for (passes=0;passes<2;passes++)
-   {
-     if (passes==0)
-      {
-       bytes_per_channel = pixels_per_line;
-       dest_y = planar_y;
-       nblocks = image_x/4;
-      }
-     else
-      {
-       /* Format planar: All Y, then all U, then all V */
-       bytes_per_channel = pixels_per_line/2;
-       dest_u = planar_u;
-       dest_v = planar_v;
-       dest_y = dest_u;
-       nblocks = image_x/8;
-      }
-
-     offset_to_plane_u = bytes_per_channel*2;
-     offset_to_plane_v = bytes_per_channel*3;
-     /*
-     printf("bytes_per_channel = %d\n",bytes_per_channel);
-     printf("offset_to_plane_u = %d\n",offset_to_plane_u);
-     printf("offset_to_plane_v = %d\n",offset_to_plane_v);
-     */
-
-     while (nblocks-->0)
-      {
-       unsigned int gray_index;
-
-       fill_nbits(reservoir,nbits_in_reservoir,stream,16);
-       gray_index = reservoir & pdev->zzmask;
-       reservoir >>= pdev->zz;
-       nbits_in_reservoir -= pdev->zz;
-
-       fill_nbits(reservoir,nbits_in_reservoir,stream,2);
-
-       if ( (reservoir & 3) == 0)
-        {
-          reservoir>>=2;
-          nbits_in_reservoir-=2;
-          for (i=0;i<16;i++)
-            temp_colors[i] = pdev->table_dc00[gray_index];
-
-        }
-       else
-        {
-          unsigned int channel_v, offset1;
-
-          /* swap bit 0 and 2 of offset_OR */
-          channel_v = ((reservoir & 1) << 2) | (reservoir & 2) | ((reservoir & 4)>>2);
-          reservoir>>=3;
-          nbits_in_reservoir-=3;
-
-          for (i=0;i<16;i++)
-            temp_colors[i] = pdev->table_d800[gray_index];
-
-          ptable0004 = pdev->table_0004 + (passes*16384) + (first_4_bits*1024) + (channel_v*128);
-          ptable8004 = pdev->table_8004 + (passes*4096)  + (first_4_bits*256)  + (channel_v*32);
-
-          offset1 = 0;
-          while(1) 
-           {
-             unsigned int index_in_table_ops, op, rows=0;
-             fill_nbits(reservoir,nbits_in_reservoir,stream,16);
-
-             /* mode is 0,1 or 2 */
-             index_in_table_ops = (reservoir&0x3F);
-             op = table_ops[ index_in_table_ops*4 ];
-             if (op == 2)
-              {
-                reservoir >>= 2;
-                nbits_in_reservoir -= 2;
-                break; /* exit the while(1) */
-              }
-             if (op == 0)
-              {
-                unsigned int shift;
-
-                offset1 = (offset1 + table_ops[index_in_table_ops*4+2]) & 0x0F;
-                shift = table_ops[ index_in_table_ops*4+1 ];
-                reservoir >>= shift;
-                nbits_in_reservoir -= shift;
-                rows = ptable0004[ offset1 + table_ops[index_in_table_ops*4+3] ];
-              }
-             if (op == 1)
-              {
-                 /* 10bits [ xxxx xxxx yyyy 000 ]
-                  * yyy => offset in the table8004
-                  * xxx => offset in the tabled004
-                  */
-                unsigned int mask, shift;
-                unsigned int col1, row1, total_bits;
-
-                offset1 = (offset1 + ((reservoir>>3)&0x0F)+1) & 0x0F;
-
-                col1 = (reservoir>>7) & 0xFF;
-                row1 = ptable8004 [ offset1*2 ];
-
-                /* Bit mask table */
-                mask = pdev->table_d004[ (row1<<8) + col1 ];
-                shift = ptable8004 [ offset1*2 + 1];
-                rows = ((mask << shift) + 0x80) & 0xFF;
-
-                total_bits = row1 + 8;
-                reservoir >>= total_bits;
-                nbits_in_reservoir -= total_bits;
-              }
-              {
-                const unsigned int *table_a004 = pdev->table_a004 + rows*12;
-                unsigned int *poffset = MulIdx + offset1*16;   /* 64/4 (int) */
-                for (i=0;i<16;i++)
-                 {
-                   temp_colors[i] += table_a004[ *poffset ];
-                   poffset++;
-                 }
-              }
-          }
-        }
-#define USE_SIGNED_INT_FOR_COLOR
-#ifdef USE_SIGNED_INT_FOR_COLOR
-#  define CLAMP(x) ((x)>255?255:((x)<0?0:x))
-#else
-#  define CLAMP(x) ((x)>255?255:x)
-#endif
-
-       if (passes == 0)
-        {
-#ifdef USE_SIGNED_INT_FOR_COLOR
-          const int *c = temp_colors;
-#else
-          const unsigned int *c = temp_colors;
-#endif
-          unsigned char *d;
-
-          d = dest_y;
-          for (i=0;i<4;i++,c++)
-            *d++ = CLAMP((*c) >> pdev->yy);
-
-          d = dest_y + bytes_per_channel;
-          for (i=0;i<4;i++,c++)
-            *d++ = CLAMP((*c) >> pdev->yy);
-
-          d = dest_y + offset_to_plane_u;
-          for (i=0;i<4;i++,c++)
-            *d++ = CLAMP((*c) >> pdev->yy);
-
-          d = dest_y + offset_to_plane_v;
-          for (i=0;i<4;i++,c++)
-            *d++ = CLAMP((*c) >> pdev->yy);
-
-          dest_y += 4;
-        }
-       else if (passes == 1)
-        {
-#ifdef USE_SIGNED_INT_FOR_COLOR
-          int *c1 = temp_colors;
-          int *c2 = temp_colors+4;
-#else
-          unsigned int *c1 = temp_colors;
-          unsigned int *c2 = temp_colors+4;
-#endif
-          unsigned char *d;
-
-          d = dest_y;
-          for (i=0;i<4;i++,c1++,c2++)
-           {
-             *d++ = CLAMP((*c1) >> pdev->yy);
-             *d++ = CLAMP((*c2) >> pdev->yy);
-           }
-          c1 = temp_colors+12;
-          //c2 = temp_colors+8;
-          d = dest_y + bytes_per_channel;
-          for (i=0;i<4;i++,c1++,c2++)
-           {
-             *d++ = CLAMP((*c1) >> pdev->yy);
-             *d++ = CLAMP((*c2) >> pdev->yy);
-           }
-
-          if (even_line)       /* Each line, swap u/v */
-           {
-             even_line=0;
-             dest_y = dest_v;
-             dest_u += 8;
-           }
-          else
-           {
-             even_line=1;
-             dest_y = dest_u;
-             dest_v += 8;
-           }
-        }
-
-      } /* end of while (nblocks-->0) */
-
-   } /* end of for (passes=0;passes<2;passes++) */
-
-}
-
-
-/**
- *
- * image: size of the image wanted
- * view : size of the image returned by the camera
- * offset: (x,y) to displayer image in the view
- *
- * src: raw data
- * dst: image output
- * flags: PWCX_FLAG_PLANAR
- * pdev: private buffer
- * bandlength:
- *
- */
-void pwc_dec23_decompress(const struct pwc_coord *image,
-                            const struct pwc_coord *view,
-                           const struct pwc_coord *offset,
-                           const void *src,
-                           void *dst,
-                           int flags,
-                           const void *data,
-                           int bandlength)
-{
-  const struct pwc_dec23_private *pdev = data;
-  unsigned char *pout, *pout_planar_y=NULL, *pout_planar_u=NULL, *pout_planar_v=NULL;
-  int i,n,stride,pixel_size;
-
-
-  if (flags & PWCX_FLAG_BAYER)
-   {
-     pout = dst + (view->x * offset->y) + offset->x;
-     pixel_size = view->x * 4;
-   }
-  else
-   {
-     n = view->x * view->y;
-
-     /* offset in Y plane */
-     stride = view->x * offset->y;
-     pout_planar_y = dst + stride + offset->x;
-
-     /* offsets in U/V planes */
-     stride = (view->x * offset->y)/4 + offset->x/2;
-     pout_planar_u = dst + n +     + stride;
-     pout_planar_v = dst + n + n/4 + stride;
-
-     pixel_size = view->x * 4;
-   }
-
-
-  for (i=0;i<image->y;i+=4)
-   {
-     if (flags & PWCX_FLAG_BAYER)
-      {
-       //TODO:
-       //DecompressBandBayer(pdev,src,pout,image.x,view->x,flags);
-       src += bandlength;
-       pout += pixel_size;
-      }
-     else
-      {
-       DecompressBand23(pdev,src,pout_planar_y,pout_planar_u,pout_planar_v,image->x,view->x,flags);
-       src += bandlength;
-       pout_planar_y += pixel_size;
-       pout_planar_u += view->x;
-       pout_planar_v += view->x;
-      }
-   }
-}
-
-void pwc_dec23_exit(void)
-{
-  /* Do nothing */
-
-}
-
diff --git a/drivers/usb/media/pwc/pwc-dec23.h b/drivers/usb/media/pwc/pwc-dec23.h
deleted file mode 100644 (file)
index 5b2aacd..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Linux driver for Philips webcam
-   (C) 2004      Luc Saillard (luc@saillard.org)
-
-   NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx
-   driver and thus may have bugs that are not present in the original version.
-   Please send bug reports and support requests to <luc@saillard.org>.
-   The decompression routines have been implemented by reverse-engineering the
-   Nemosoft binary pwcx module. Caveat emptor.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-
-#ifndef PWC_DEC23_H
-#define PWC_DEC23_H
-
-struct pwc_dec23_private
-{
-  unsigned char xx,yy,zz,zzmask;
-
-  unsigned char table_0004[2*0x4000];
-  unsigned char table_8004[2*0x1000];
-  unsigned int  table_a004[256*12];
-
-  unsigned char table_d004[8*256];
-  unsigned int  table_d800[256];
-  unsigned int  table_dc00[256];
-};
-
-
-void pwc_dec23_init(int type, int release, unsigned char *buffer, void *private_data);
-void pwc_dec23_exit(void);
-void pwc_dec23_decompress(const struct pwc_coord *image,
-                            const struct pwc_coord *view,
-                           const struct pwc_coord *offset,
-                           const void *src,
-                           void *dst,
-                           int flags,
-                           const void *data,
-                           int bandlength);
-
-
-
-#endif
-
-
-
index cca47f480a8be536199a1db409a1fb5eb99c10d1..b77e65c03659a0bdffda1a758f7ef04beb44201d 100644 (file)
@@ -68,8 +68,6 @@
 #include "pwc-ioctl.h"
 #include "pwc-kiara.h"
 #include "pwc-timon.h"
-#include "pwc-dec23.h"
-#include "pwc-dec1.h"
 #include "pwc-uncompress.h"
 
 /* Function prototypes and driver templates */
@@ -322,6 +320,7 @@ static int pwc_allocate_buffers(struct pwc_device *pdev)
          case 730:
          case 740:
          case 750:
+#if 0    
            Trace(TRACE_MEMORY,"private_data(%zu)\n",sizeof(struct pwc_dec23_private));
            kbuf = kmalloc(sizeof(struct pwc_dec23_private), GFP_KERNEL);       /* Timon & Kiara */
            break;
@@ -330,11 +329,9 @@ static int pwc_allocate_buffers(struct pwc_device *pdev)
            /* TODO & FIXME */
            kbuf = kmalloc(sizeof(struct pwc_dec23_private), GFP_KERNEL);
            break;
+#endif  
+       ;
         }
-       if (kbuf == NULL) {
-          Err("Failed to allocate decompress table.\n");
-          return -ENOMEM;
-       }
        pdev->decompress_data = kbuf;
        
        /* Allocate image buffer; double buffer for mmap() */
@@ -1131,11 +1128,11 @@ static int pwc_video_close(struct inode *inode, struct file *file)
          case 730:
          case 740:
          case 750:
-           pwc_dec23_exit();   /* Timon & Kiara */
+/*         pwc_dec23_exit();   *//* Timon & Kiara */
            break;
          case 645:
          case 646:
-           pwc_dec1_exit();
+/*         pwc_dec1_exit(); */
            break;
         }
 
index 5485800efd833e9bdd0d6b7603e9ae7b64912854..c498c68bace198f7d7469f26dc187337ddd3edb2 100644 (file)
@@ -316,576 +316,3 @@ const struct Kiara_table_entry Kiara_table[PSZ_MAX][6][4] =
    },
 };
 
-
-/*
- * Rom table for kiara chips
- *
- * 32 roms tables (one for each resolution ?)
- *  2 tables per roms (one for each passes) (Y, and U&V)
- * 128 bytes per passes
- */
-
-const unsigned int KiaraRomTable [8][2][16][8] =  
-{
- { /* version 0 */
-  { /* version 0, passes 0 */
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000001,0x00000001},
-   {0x00000000,0x00000000,0x00000009,0x00000009,
-    0x00000009,0x00000009,0x00000009,0x00000009},
-   {0x00000000,0x00000000,0x00000009,0x00000049,
-    0x00000049,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000249,0x0000024a,0x00000049},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000249,0x00000249,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000049,0x00000249,
-    0x00000249,0x0000124a,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000049,0x00000249,
-    0x0000124a,0x00009252,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00009252,0x00009292,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x00009292,0x00009292,0x00009493,0x000124db},
-   {0x00000000,0x00000000,0x00000249,0x0000924a,
-    0x00009492,0x0000a49b,0x0000a49b,0x000124db},
-   {0x00000000,0x00000000,0x00001249,0x00009252,
-    0x0000a493,0x000124db,0x000124db,0x000126dc},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x000124db,0x000126dc,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000124db,0x000136e4,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001b92d,0x0001b925},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b925,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 0, passes 1 */
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000},
-   {0x00000000,0x00000000,0x00000001,0x00000009,
-    0x00000009,0x00000009,0x00000009,0x00000001},
-   {0x00000000,0x00000000,0x00000009,0x00000009,
-    0x00000049,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000249,0x00000249,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000049,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x00001252},
-   {0x00000000,0x00000000,0x00000049,0x00001249,
-    0x0000124a,0x0000124a,0x00001252,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x00009252,0x00009252,0x00009292,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x0000924a,
-    0x00009292,0x00009292,0x00009292,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x00009292,
-    0x00009492,0x00009493,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x0000a493,0x000124db,0x000126dc,0x000126dc},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000126dc,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00009252,0x00009493,
-    0x000126dc,0x000126dc,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000136e4,0x000136e4,0x0001b725,0x0001b724},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 1 */
-  { /* version 1, passes 0 */
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000001},
-   {0x00000000,0x00000000,0x00000009,0x00000009,
-    0x00000009,0x00000009,0x00000009,0x00000009},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000249,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000049,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x00001252},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x0000124a,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x0000124a,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x0000124a,0x00009252,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x00009252,0x00009292,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x00009252,0x00009292,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x0000924a,
-    0x00009252,0x00009493,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x0000924a,
-    0x00009292,0x00009493,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x00009252,
-    0x00009492,0x00009493,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x000124db,0x000124db,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000126dc,0x000126dc,0x000126dc},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 1, passes 1 */
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000},
-   {0x00000000,0x00000000,0x00000049,0x00000009,
-    0x00000049,0x00000009,0x00000001,0x00000000},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000049,0x00000000},
-   {0x00000000,0x00000000,0x00000249,0x00000049,
-    0x00000249,0x00000049,0x0000024a,0x00000001},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x00000001},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x00000001},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x00000009},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x0000124a,0x0000024a,0x00000009},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x0000124a,0x0000024a,0x00000009},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x00009252,0x00001252,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x00009292,0x00001252,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x00009292,0x00001252,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00001252,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009292,0x00009292,0x00001252,0x0000024a},
-   {0x00000000,0x00000000,0x0000924a,0x0000924a,
-    0x00009492,0x00009493,0x00009292,0x00001252},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 2 */
-  { /* version 2, passes 0 */
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x0000124a,0x00001252,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x00009252,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x0000124a,0x00009292,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x00009252,0x00009493,0x00009493,0x0000a49b},
-   {0x00000000,0x00000000,0x00000249,0x0000924a,
-    0x00009292,0x00009493,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009292,0x00009493,0x0000a49b,0x000124db},
-   {0x00000000,0x00000000,0x00001249,0x00009252,
-    0x00009492,0x0000a49b,0x0000a49b,0x000124db},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x000124db,0x000124db,0x000126dc},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x0000a493,0x000124db,0x000126dc,0x000126dc},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x000136e4},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000126dc,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0001249b,0x000126dc,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000136e4,0x000136e4,0x0001b724},
-   {0x00000000,0x00000000,0x00009252,0x000124db,
-    0x000126dc,0x0001b724,0x0001b725,0x0001b925},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 2, passes 1 */
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00000249,
-    0x0000124a,0x0000124a,0x00001252,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x0000124a,0x00009292,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009292,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x0000a49b,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009292,0x00009493,0x0000a49b,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009292,0x00009493,0x0000a49b,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009492,0x0000a49b,0x0000a49b,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00009252,
-    0x00009492,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x0000a49b,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x00009252,0x0000a49b,
-    0x0001249b,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 3 */
-  { /* version 3, passes 0 */
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x0000124a,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009292,0x00009493,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009492,0x0000a49b,0x0000a49b,0x000124db},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x000124db,0x000126dc,0x000126dc},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x000126dc},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000126dc,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000126dc,0x000136e4,0x0001b724},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0001249b,0x000126dc,0x000136e4,0x0001b724},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x0001b724},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000136e4,0x0001b725,0x0001b724},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000136e4,0x0001b725,0x0001b925},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x000136e4,0x0001b92d,0x0001b925},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001b92d,0x0001c92d},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000126dc,0x0001b724,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x000136e4,0x0001b925,0x00025bb6,0x00024b77},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 3, passes 1 */
-   {0x00000000,0x00000000,0x00001249,0x00000249,
-    0x0000124a,0x0000124a,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009292,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009492,0x00009493,0x0000a49b,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00009252,
-    0x00009492,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x0000a49b,0x000126dc,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x0000a49b,0x000126dc,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x0000a49b,0x000126dc,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x000124db,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00009492,0x0000a49b,
-    0x000136e4,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x0001b724,0x0001b724,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 4 */
-  { /* version 4, passes 0 */
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000249,0x00000049,
-    0x00000249,0x00000249,0x0000024a,0x00000049},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x00009252,0x00001252,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009493,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009292,0x00009493,0x00009493,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000124db,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0001249b,0x000126dc,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00009252,0x00009493,
-    0x000124db,0x000136e4,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00009252,0x0000a49b,
-    0x000124db,0x000136e4,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x000136e4,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00009492,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001b725,0x0001b724},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x000136e4,0x0001b925,0x0001b92d,0x0001b925},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 4, passes 1 */
-   {0x00000000,0x00000000,0x00000249,0x00000049,
-    0x00000009,0x00000009,0x00000009,0x00000009},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000049,0x00000049,0x00000009,0x00000009},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x00000249,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x0000124a,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x0000124a,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009252,0x0000124a,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x00009252,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x00009292,0x00009292,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x00009292,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x00009493,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000124db,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000136e4,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009252,0x000124db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 5 */
-  { /* version 5, passes 0 */
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x00000249,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009292,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009492,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x0000a49b,0x000124db,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000126dc,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x000136e4,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x000136e4,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001b725,0x000136e4},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000136e4,0x0001b724,0x0001b92d,0x0001b724},
-   {0x00000000,0x00000000,0x00009492,0x0000a49b,
-    0x000136e4,0x0001b724,0x0001b92d,0x0001b724},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b925,0x0001c96e,0x0001b925},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x0001b724,0x0001b925,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x0001c924,0x0002496d,0x00025bb6,0x00024b77},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 5, passes 1 */
-   {0x00000000,0x00000000,0x00001249,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x0000124a,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009252,0x00009252,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x0000a49b,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x0000a49b,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x0000a49b,0x00009292,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000124db,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000124db,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000126dc,0x000126dc,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000136e4,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009292,0x000124db,
-    0x000136e4,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009492,0x000126db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 6 */
-  { /* version 6, passes 0 */
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x0000a493,0x0000a49b,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000126dc,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x000136e4,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001b725,0x000126dc},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000136e4,0x0001b724,0x0001b92d,0x000136e4},
-   {0x00000000,0x00000000,0x00009492,0x0000a49b,
-    0x000136e4,0x0001b724,0x0001b92d,0x0001b724},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b724,0x0001b92d,0x0001b724},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b925,0x0001b92d,0x0001b925},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x0001b724,0x0001b925,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x0001b724,0x0001c92d,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x0001b724,0x0001c92d,0x00024b76,0x0002496e},
-   {0x00000000,0x00000000,0x00012492,0x000126db,
-    0x0001c924,0x00024b6d,0x0002ddb6,0x00025bbf},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 6, passes 1 */
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x0000124a,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x00009252,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x00009292,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x0000a49b,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000124db,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000126dc,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000126dc,0x000126dc,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000136e4,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009492,0x000126db,
-    0x000136e4,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009492,0x000126db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00009492,0x000126db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001c924,0x0001b724,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 7 */
-  { /* version 7, passes 0 */
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x0000a49b,
-    0x0001249b,0x000126dc,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x000136e4,0x0001b725,0x000124db},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000136e4,0x0001b724,0x0001b725,0x000126dc},
-   {0x00000000,0x00000000,0x00009292,0x000124db,
-    0x000136e4,0x0001b724,0x0001b725,0x000126dc},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b724,0x0001c96e,0x000136e4},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001c92d,0x0001c96e,0x0001b724},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x000136e4,0x0001c92d,0x0001c96e,0x0001b724},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x0001b724,0x0001c92d,0x0001c96e,0x0001b925},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x0001b724,0x0001c92d,0x00024b76,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x0001b924,0x0001c92d,0x00024b76,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x0001b924,0x0001c92d,0x00024b76,0x0002496e},
-   {0x00000000,0x00000000,0x00012492,0x000136db,
-    0x00024924,0x00024b6d,0x0002ddb6,0x00025bbf},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 7, passes 1 */
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x0000124a,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x00009492,0x00009292,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x0000a49b,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000126dc,0x000124db,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000136e4,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000136db,
-    0x0001b724,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000136db,
-    0x0001b724,0x000126dc,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00009292,0x000136db,
-    0x0001b724,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009492,0x000136db,
-    0x0001b724,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00012492,0x0001b6db,
-    0x0001c924,0x0001b724,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- }
-};
-
index f950a4e5ed96d47764fbbd28cc15e74a60786b96..dee967173d6c0856f239e1c3e8f1243919a32c14 100644 (file)
@@ -314,1133 +314,3 @@ const struct Timon_table_entry Timon_table[PSZ_MAX][6][4] =
    },
 };
 
-/*
- * 16 versions:
- *   2 tables  (one for Y, and one for U&V)
- *   16 levels of details per tables
- *   8 blocs
- */
-
-const unsigned int TimonRomTable [16][2][16][8] =  
-{
- { /* version 0 */
-  { /* version 0, passes 0 */
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000001},
-   {0x00000000,0x00000000,0x00000001,0x00000001,
-    0x00000001,0x00000001,0x00000001,0x00000001},
-   {0x00000000,0x00000000,0x00000001,0x00000001,
-    0x00000001,0x00000009,0x00000009,0x00000009},
-   {0x00000000,0x00000000,0x00000009,0x00000001,
-    0x00000009,0x00000009,0x00000009,0x00000009},
-   {0x00000000,0x00000000,0x00000009,0x00000009,
-    0x00000009,0x00000009,0x00000049,0x00000009},
-   {0x00000000,0x00000000,0x00000009,0x00000009,
-    0x00000009,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000009,0x00000009,
-    0x00000049,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000009,0x00000049,
-    0x00000049,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000249,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000249,0x00000249,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000249,0x00000249,0x00001252,0x0000024a},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000249,0x0000124a,0x00001252,0x0000024a},
-   {0x00000000,0x00000000,0x00000049,0x00000249,
-    0x00000249,0x0000124a,0x00001252,0x0000024a},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x0000124a,0x00009252,0x00009292,0x00001252},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 0, passes 1 */
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000},
-   {0x00000000,0x00000000,0x00000001,0x00000001,
-    0x00000001,0x00000001,0x00000000,0x00000000},
-   {0x00000000,0x00000000,0x00000009,0x00000001,
-    0x00000001,0x00000009,0x00000000,0x00000000},
-   {0x00000000,0x00000000,0x00000009,0x00000009,
-    0x00000009,0x00000009,0x00000000,0x00000000},
-   {0x00000000,0x00000000,0x00000009,0x00000009,
-    0x00000009,0x00000009,0x00000001,0x00000000},
-   {0x00000000,0x00000000,0x00000049,0x00000009,
-    0x00000009,0x00000049,0x00000001,0x00000001},
-   {0x00000000,0x00000000,0x00000049,0x00000009,
-    0x00000009,0x00000049,0x00000001,0x00000001},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000009,0x00000001},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000009,0x00000001},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000009,0x00000001},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000009,0x00000009},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000249,0x00000049,0x00000009},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000249,0x00000049,0x00000009},
-   {0x00000000,0x00000000,0x00000249,0x00000049,
-    0x00000249,0x00000249,0x00000049,0x00000009},
-   {0x00000000,0x00000000,0x00001249,0x00000249,
-    0x0000124a,0x0000124a,0x0000024a,0x00000049},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 1 */
-  { /* version 1, passes 0 */
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000001},
-   {0x00000000,0x00000000,0x00000001,0x00000001,
-    0x00000001,0x00000009,0x00000009,0x00000009},
-   {0x00000000,0x00000000,0x00000009,0x00000009,
-    0x00000009,0x00000009,0x00000009,0x00000009},
-   {0x00000000,0x00000000,0x00000009,0x00000009,
-    0x00000009,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000009,0x00000049,
-    0x00000049,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000249,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000249,0x00000249,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000049,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x00001252},
-   {0x00000000,0x00000000,0x00000049,0x00000249,
-    0x00000249,0x0000124a,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00000049,0x00000249,
-    0x0000124a,0x0000124a,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x0000124a,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x0000124a,0x00009252,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x00009252,0x00009252,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x0000924a,
-    0x00009292,0x00009493,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x00009252,
-    0x00009492,0x0000a49b,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 1, passes 1 */
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000},
-   {0x00000000,0x00000000,0x00000009,0x00000009,
-    0x00000009,0x00000001,0x00000001,0x00000000},
-   {0x00000000,0x00000000,0x00000009,0x00000009,
-    0x00000009,0x00000009,0x00000001,0x00000000},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000009,0x00000001,0x00000000},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000001,0x00000001},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000009,0x00000001},
-   {0x00000000,0x00000000,0x00000249,0x00000049,
-    0x00000049,0x00000249,0x00000009,0x00000001},
-   {0x00000000,0x00000000,0x00000249,0x00000049,
-    0x00000249,0x00000249,0x00000009,0x00000009},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x00000249,0x00000049,0x00000009},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x0000124a,0x00000049,0x00000009},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x0000124a,0x00000049,0x00000009},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x0000124a,0x0000024a,0x00000049},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x0000124a,0x0000024a,0x00000049},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x0000124a,0x0000024a,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009252,0x00001252,0x0000024a},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 2 */
-  { /* version 2, passes 0 */
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000001},
-   {0x00000000,0x00000000,0x00000009,0x00000009,
-    0x00000009,0x00000009,0x00000009,0x00000009},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000249,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000049,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x00001252},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x0000124a,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x0000124a,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x0000124a,0x00009252,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x00009252,0x00009292,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x00009252,0x00009292,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x0000924a,
-    0x00009252,0x00009493,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x0000924a,
-    0x00009292,0x00009493,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x00009252,
-    0x00009492,0x00009493,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x000124db,0x000124db,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000126dc,0x000126dc,0x000126dc},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 2, passes 1 */
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000},
-   {0x00000000,0x00000000,0x00000049,0x00000009,
-    0x00000049,0x00000009,0x00000001,0x00000000},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000049,0x00000000},
-   {0x00000000,0x00000000,0x00000249,0x00000049,
-    0x00000249,0x00000049,0x0000024a,0x00000001},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x00000001},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x00000001},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x00000009},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x0000124a,0x0000024a,0x00000009},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x0000124a,0x0000024a,0x00000009},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x00009252,0x00001252,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x00009292,0x00001252,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x00009292,0x00001252,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00001252,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009292,0x00009292,0x00001252,0x0000024a},
-   {0x00000000,0x00000000,0x0000924a,0x0000924a,
-    0x00009492,0x00009493,0x00009292,0x00001252},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 3 */
-  { /* version 3, passes 0 */
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000001},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000049,0x00000249,
-    0x00000249,0x00000249,0x00001252,0x0000024a},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x0000124a,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x00009252,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x0000124a,0x00009292,0x00009292,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x00009252,0x00009292,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x00009292,0x00009493,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x00009252,
-    0x00009292,0x00009493,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00001249,0x00009252,
-    0x00009292,0x0000a49b,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00001249,0x00009252,
-    0x00009492,0x0000a49b,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x0000a49b,0x000124db,0x000124db},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x0000a493,0x0000a49b,0x000124db,0x000124db},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0001249b,0x000126dc,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000136e4,0x0001b725,0x000136e4},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 3, passes 1 */
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000},
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000001,0x00000000},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x00000249,0x00000049,0x00000001},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x0000124a,0x00001252,0x00000001},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x0000124a,0x00001252,0x00000009},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x0000124a,0x00009252,0x00009292,0x00000009},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x00009252,0x00009292,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009252,0x00009292,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009493,0x00009292,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009493,0x00009292,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009493,0x00009493,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009292,0x00009493,0x00009493,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009492,0x00009493,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009252,
-    0x00009492,0x0000a49b,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x00009292,
-    0x0000a493,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 4 */
-  { /* version 4, passes 0 */
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x0000124a,0x00001252,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x00009252,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x0000124a,0x00009292,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x00009252,0x00009493,0x00009493,0x0000a49b},
-   {0x00000000,0x00000000,0x00000249,0x0000924a,
-    0x00009292,0x00009493,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009292,0x00009493,0x0000a49b,0x000124db},
-   {0x00000000,0x00000000,0x00001249,0x00009252,
-    0x00009492,0x0000a49b,0x0000a49b,0x000124db},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x000124db,0x000124db,0x000126dc},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x0000a493,0x000124db,0x000126dc,0x000126dc},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x000136e4},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000126dc,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0001249b,0x000126dc,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000136e4,0x000136e4,0x0001b724},
-   {0x00000000,0x00000000,0x00009252,0x000124db,
-    0x000126dc,0x0001b724,0x0001b725,0x0001b925},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 4, passes 1 */
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00000249,
-    0x0000124a,0x0000124a,0x00001252,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x0000124a,0x00009292,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009292,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x0000a49b,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009292,0x00009493,0x0000a49b,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009292,0x00009493,0x0000a49b,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009492,0x0000a49b,0x0000a49b,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00009252,
-    0x00009492,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x0000a49b,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x00009252,0x0000a49b,
-    0x0001249b,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 5 */
-  { /* version 5, passes 0 */
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x0000124a,0x00001252,0x00009292},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x0000124a,0x00009292,0x00009292,0x00009493},
-   {0x00000000,0x00000000,0x00000249,0x0000924a,
-    0x00009292,0x00009493,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009292,0x00009493,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009492,0x0000a49b,0x0000a49b,0x000124db},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x0000a49b,0x000124db,0x000124db},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x0000a493,0x000124db,0x000124db,0x000126dc},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x000126dc},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000126dc,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0001249b,0x000126dc,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0001249b,0x000126dc,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0001249b,0x000126dc,0x0001b725,0x0001b724},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000126dc,0x0001b725,0x0001b724},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x000136e4,0x0001b92d,0x0001b925},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b724,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 5, passes 1 */
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x00000249,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x0000124a,0x00001252,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009292,0x00009493,0x00009493,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009292,0x00009493,0x00009493,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009292,0x00009493,0x0000a49b,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009492,0x00009493,0x000124db,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x00009493,0x000124db,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x0000a49b,0x000124db,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x0000a49b,0x000124db,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000124db,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000124db,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000124db,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009252,0x000124db,
-    0x000126dc,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 6 */
-  { /* version 6, passes 0 */
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x0000124a,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009292,0x00009493,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009492,0x0000a49b,0x0000a49b,0x000124db},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x000124db,0x000126dc,0x000126dc},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x000126dc},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000126dc,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000126dc,0x000136e4,0x0001b724},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0001249b,0x000126dc,0x000136e4,0x0001b724},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x0001b724},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000136e4,0x0001b725,0x0001b724},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000136e4,0x0001b725,0x0001b925},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x000136e4,0x0001b92d,0x0001b925},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001b92d,0x0001c92d},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000126dc,0x0001b724,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x000136e4,0x0001b925,0x00025bb6,0x00024b77},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 6, passes 1 */
-   {0x00000000,0x00000000,0x00001249,0x00000249,
-    0x0000124a,0x0000124a,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009292,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009492,0x00009493,0x0000a49b,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00009252,
-    0x00009492,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x0000a49b,0x000126dc,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x0000a49b,0x000126dc,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x0000a49b,0x000126dc,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x000124db,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00009492,0x0000a49b,
-    0x000136e4,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x0001b724,0x0001b724,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 7 */
-  { /* version 7, passes 0 */
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009292,0x00009493,0x0000a49b,0x000124db},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x0000a493,0x0000a49b,0x000124db,0x000126dc},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x000136e4},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0001249b,0x000126dc,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00001249,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x0001b724},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x0001b724},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000136e4,0x0001b725,0x0001b724},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x000136e4,0x0001b725,0x0001b925},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001b92d,0x0001b925},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x00009292,0x000124db,
-    0x000126dc,0x0001b724,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b724,0x0001c96e,0x0002496e},
-   {0x00000000,0x00000000,0x00009492,0x000126db,
-    0x000136e4,0x0001b925,0x0001c96e,0x0002496e},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b724,0x0002496d,0x00025bb6,0x00025bbf},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 7, passes 1 */
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009492,0x00009493,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x0000a49b,0x000124db,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000124db,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x000124db,0x000136e4,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x000124db,0x000136e4,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000124db,0x000136e4,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x000136e4,0x000136e4,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x000136e4,0x000136e4,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000136e4,0x000136e4,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x000136e4,0x0001b724,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00012492,0x000126db,
-    0x0001b724,0x0001b925,0x0001b725,0x000136e4},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 8 */
-  { /* version 8, passes 0 */
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009292,0x00009493,0x0000a49b,0x000124db},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x0000a493,0x000124db,0x000126dc,0x000126dc},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x000136e4},
-   {0x00000000,0x00000000,0x00001249,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x0001b724},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x0001b724},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000136e4,0x0001b725,0x0001b724},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x000136e4,0x0001b725,0x0001b925},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001b92d,0x0001c92d},
-   {0x00000000,0x00000000,0x00009252,0x000124db,
-    0x000126dc,0x0001b724,0x0001b92d,0x0001c92d},
-   {0x00000000,0x00000000,0x00009292,0x000124db,
-    0x000126dc,0x0001b925,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b925,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b925,0x00024b76,0x00024b77},
-   {0x00000000,0x00000000,0x00009492,0x000126db,
-    0x000136e4,0x0001b925,0x00024b76,0x00025bbf},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x000136e4,0x0001c92d,0x00024b76,0x00025bbf},
-   {0x00000000,0x00000000,0x00012492,0x000136db,
-    0x0001b724,0x00024b6d,0x0002ddb6,0x0002efff},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 8, passes 1 */
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009493,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x0000a493,0x0000a49b,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x0000a49b,0x000124db,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x000124db,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x000124db,0x000136e4,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x000126dc,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x000136e4,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000126dc,0x000136e4,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000126dc,0x000136e4,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00009292,0x000124db,
-    0x000136e4,0x0001b724,0x0001b725,0x000136e4},
-   {0x00000000,0x00000000,0x00009492,0x000126db,
-    0x000136e4,0x0001b925,0x0001b725,0x0001b724},
-   {0x00000000,0x00000000,0x00009492,0x000126db,
-    0x000136e4,0x0001b925,0x0001b725,0x0001b724},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b724,0x0002496d,0x0001b92d,0x0001b925},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 9 */
-  { /* version 9, passes 0 */
-   {0x00000000,0x00000000,0x00000049,0x00000049,
-    0x00000049,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00000249,0x00000049,
-    0x00000249,0x00000249,0x0000024a,0x00000049},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x0000124a,0x00009252,0x00001252,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009493,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009292,0x00009493,0x00009493,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000124db,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0001249b,0x000126dc,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00009252,0x00009493,
-    0x000124db,0x000136e4,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00009252,0x0000a49b,
-    0x000124db,0x000136e4,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x000136e4,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00009492,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001b725,0x0001b724},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x000136e4,0x0001b925,0x0001b92d,0x0001b925},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 9, passes 1 */
-   {0x00000000,0x00000000,0x00000249,0x00000049,
-    0x00000009,0x00000009,0x00000009,0x00000009},
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000049,0x00000049,0x00000009,0x00000009},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x00000249,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x0000124a,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x0000124a,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009252,0x0000124a,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x00009252,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x00009292,0x00009292,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x00009292,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x00009493,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000124db,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000136e4,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009252,0x000124db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 10 */
-  { /* version 10, passes 0 */
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00000249,0x00001249,
-    0x00009252,0x00009292,0x00009292,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009292,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009492,0x00009493,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x000124db,0x000124db,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000124db,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0001249b,0x000126dc,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000126dc,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00009252,0x0000a49b,
-    0x000124db,0x000136e4,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x000136e4,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x00009492,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001b92d,0x0001b724},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000126dc,0x0001b925,0x0001b92d,0x0001b925},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x000136e4,0x0002496d,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 10, passes 1 */
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000049,0x00000049,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x00000249,0x00000049,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x00009252,0x0000024a,0x00000049},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009493,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00009252,
-    0x00009492,0x00009493,0x00001252,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x00009493,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x00009492,0x00009493,0x00009292,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x00009493,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x0000a49b,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x0000a49b,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000136e4,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000136e4,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009252,0x000126db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 11 */
-  { /* version 11, passes 0 */
-   {0x00000000,0x00000000,0x00000249,0x00000249,
-    0x00000249,0x00000249,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009292,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009492,0x0000a49b,0x0000a49b,0x00009292},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x0000a49b,0x000124db,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000126dc,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x000136e4,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x000136e4,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001b725,0x000136e4},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000136e4,0x0001b724,0x0001b92d,0x0001b724},
-   {0x00000000,0x00000000,0x00009492,0x0000a49b,
-    0x000136e4,0x0001b724,0x0001b92d,0x0001b724},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b925,0x0001c96e,0x0001b925},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x0001b724,0x0001b925,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x0001c924,0x0002496d,0x00025bb6,0x00024b77},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 11, passes 1 */
-   {0x00000000,0x00000000,0x00001249,0x00000249,
-    0x00000249,0x00000249,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x0000124a,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009252,0x00009252,0x0000024a,0x0000024a},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x0000a49b,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x0000a49b,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x0000a49b,0x00009292,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000124db,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000124db,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000126dc,0x000126dc,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000136e4,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009292,0x000124db,
-    0x000136e4,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009492,0x000126db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 12 */
-  { /* version 12, passes 0 */
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x0000a493,0x0000a49b,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x000126dc,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x000136e4,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001b725,0x000126dc},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000136e4,0x0001b724,0x0001b92d,0x000136e4},
-   {0x00000000,0x00000000,0x00009492,0x0000a49b,
-    0x000136e4,0x0001b724,0x0001b92d,0x0001b724},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b724,0x0001b92d,0x0001b724},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b925,0x0001b92d,0x0001b925},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x0001b724,0x0001b925,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x0001b724,0x0001c92d,0x0001c96e,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x0001b724,0x0001c92d,0x00024b76,0x0002496e},
-   {0x00000000,0x00000000,0x00012492,0x000126db,
-    0x0001c924,0x00024b6d,0x0002ddb6,0x00025bbf},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 12, passes 1 */
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x0000124a,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x00001249,0x00009292,
-    0x00009492,0x00009252,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x00009292,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x0000a49b,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000124db,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000124db,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000126dc,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000126dc,0x000126dc,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000136e4,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009492,0x000126db,
-    0x000136e4,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009492,0x000126db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00009492,0x000126db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001c924,0x0001b724,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 13 */
-  { /* version 13, passes 0 */
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x00009252,0x00009292,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x000124db,0x000126dc,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x0000a49b,
-    0x0001249b,0x000126dc,0x000126dc,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x000136e4,0x0001b725,0x000124db},
-   {0x00000000,0x00000000,0x00009292,0x0000a49b,
-    0x000136e4,0x0001b724,0x0001b725,0x000126dc},
-   {0x00000000,0x00000000,0x00009292,0x000124db,
-    0x000136e4,0x0001b724,0x0001b725,0x000126dc},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b724,0x0001c96e,0x000136e4},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001c92d,0x0001c96e,0x0001b724},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x000136e4,0x0001c92d,0x0001c96e,0x0001b724},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x0001b724,0x0001c92d,0x0001c96e,0x0001b925},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x0001b724,0x0001c92d,0x00024b76,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x0001b924,0x0001c92d,0x00024b76,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x0001b924,0x0001c92d,0x00024b76,0x0002496e},
-   {0x00000000,0x00000000,0x00012492,0x000136db,
-    0x00024924,0x00024b6d,0x0002ddb6,0x00025bbf},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 13, passes 1 */
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x0000124a,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x00009492,0x00009292,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x0000a49b,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000126dc,0x000124db,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000136e4,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000136db,
-    0x0001b724,0x000124db,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000136db,
-    0x0001b724,0x000126dc,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00009292,0x000136db,
-    0x0001b724,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x00009492,0x000136db,
-    0x0001b724,0x000126dc,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00012492,0x0001b6db,
-    0x0001c924,0x0001b724,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 14 */
-  { /* version 14, passes 0 */
-   {0x00000000,0x00000000,0x00001249,0x0000924a,
-    0x00009292,0x00009493,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00001249,0x0000a49b,
-    0x0000a493,0x000124db,0x000126dc,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x0000a49b},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000126dc,0x000136e4,0x0001b725,0x000124db},
-   {0x00000000,0x00000000,0x00009292,0x000124db,
-    0x000126dc,0x0001b724,0x0001b92d,0x000126dc},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b724,0x0001b92d,0x000126dc},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001c92d,0x0001c96e,0x000136e4},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x0001b724,0x0001c92d,0x0001c96e,0x0001b724},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x0001b724,0x0001c92d,0x00024b76,0x0001b925},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x0001b724,0x0001c92d,0x00024b76,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x0001b724,0x0001c92d,0x00024b76,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b724,0x0001c92d,0x00024b76,0x0002496e},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b924,0x0002496d,0x00024b76,0x00024b77},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b924,0x00024b6d,0x0002ddb6,0x00025bbf},
-   {0x00000000,0x00000000,0x00012492,0x0001b6db,
-    0x00024924,0x0002db6d,0x00036db6,0x0002efff},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 14, passes 1 */
-   {0x00000000,0x00000000,0x00001249,0x00001249,
-    0x0000124a,0x0000124a,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x00009493,
-    0x0000a493,0x00009292,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x0000a49b,0x00001252,0x00001252},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000136e4,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000136e4,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000136e4,0x000136e4,0x00009493,0x00009292},
-   {0x00000000,0x00000000,0x00009492,0x000136db,
-    0x0001b724,0x000136e4,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x00009492,0x000136db,
-    0x0001b724,0x000136e4,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x00009492,0x000136db,
-    0x0001b724,0x000136e4,0x0000a49b,0x00009493},
-   {0x00000000,0x00000000,0x00009492,0x000136db,
-    0x0001b724,0x000136e4,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b724,0x000136e4,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b724,0x000136e4,0x000124db,0x0000a49b},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b724,0x000136e4,0x000126dc,0x000124db},
-   {0x00000000,0x00000000,0x00012492,0x0001b6db,
-    0x0001c924,0x0001b724,0x000136e4,0x000126dc},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- },
- { /* version 15 */
-  { /* version 15, passes 0 */
-   {0x00000000,0x00000000,0x00001249,0x00009493,
-    0x0000a493,0x0000a49b,0x000124db,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0001249b,0x000126dc,0x000136e4,0x000124db},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x000126dc,0x0001b724,0x0001b725,0x000126dc},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000136e4,0x0001b724,0x0001b92d,0x000126dc},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x000136e4,0x0001b925,0x0001c96e,0x000136e4},
-   {0x00000000,0x00000000,0x00009492,0x000124db,
-    0x0001b724,0x0001c92d,0x0001c96e,0x0001b724},
-   {0x00000000,0x00000000,0x0000a492,0x000124db,
-    0x0001b724,0x0001c92d,0x0001c96e,0x0001b724},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x0001b724,0x0001c92d,0x0001c96e,0x0001b925},
-   {0x00000000,0x00000000,0x0000a492,0x000126db,
-    0x0001b924,0x0001c92d,0x00024b76,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b924,0x0001c92d,0x00024b76,0x0001c92d},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001b924,0x0002496d,0x00024b76,0x0002496e},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001c924,0x0002496d,0x00025bb6,0x00024b77},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001c924,0x00024b6d,0x00025bb6,0x00024b77},
-   {0x00000000,0x00000000,0x00012492,0x000136db,
-    0x0001c924,0x00024b6d,0x0002ddb6,0x00025bbf},
-   {0x00000000,0x00000000,0x00012492,0x0001b6db,
-    0x00024924,0x0002db6d,0x00036db6,0x0002efff},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  },
-  { /* version 15, passes 1 */
-   {0x00000000,0x00000000,0x0000924a,0x0000924a,
-    0x00009292,0x00009292,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x0000a49b,
-    0x0000a493,0x000124db,0x00009292,0x00009292},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000124db,0x0001b724,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000126dc,0x0001b724,0x00009493,0x00009493},
-   {0x00000000,0x00000000,0x0000924a,0x000124db,
-    0x000136e4,0x0001b724,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00009292,0x000136db,
-    0x0001b724,0x0001b724,0x0000a49b,0x0000a49b},
-   {0x00000000,0x00000000,0x00009492,0x000136db,
-    0x0001c924,0x0001b724,0x000124db,0x000124db},
-   {0x00000000,0x00000000,0x00009492,0x000136db,
-    0x0001c924,0x0001b724,0x000124db,0x000124db},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001c924,0x0001b724,0x000126dc,0x000126dc},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001c924,0x0001b925,0x000126dc,0x000126dc},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001c924,0x0001b925,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001c924,0x0001b925,0x000136e4,0x000136e4},
-   {0x00000000,0x00000000,0x0000a492,0x000136db,
-    0x0001c924,0x0001b925,0x0001b725,0x0001b724},
-   {0x00000000,0x00000000,0x00012492,0x000136db,
-    0x0001c924,0x0001b925,0x0001b725,0x0001b724},
-   {0x00000000,0x00000000,0x00012492,0x0001b6db,
-    0x00024924,0x0002496d,0x0001b92d,0x0001b925},
-   {0x00000000,0x00000000,0x00000000,0x00000000,
-    0x00000000,0x00000000,0x00000000,0x00000000}
-  }
- }
-};
index c062e43b3ac56207a18749626ec2d8be45779590..bc3b1635eab0083fb6bff88ce22d0dba44b1f9cb 100644 (file)
@@ -29,8 +29,6 @@
 
 #include "pwc.h"
 #include "pwc-uncompress.h"
-#include "pwc-dec1.h"
-#include "pwc-dec23.h"
 
 int pwc_decompress(struct pwc_device *pdev)
 {
@@ -122,6 +120,7 @@ int pwc_decompress(struct pwc_device *pdev)
 
                switch (pdev->type)
                 {
+#if 0           
                  case 675:
                  case 680:
                  case 690:
@@ -137,6 +136,7 @@ int pwc_decompress(struct pwc_device *pdev)
                  case 645:
                  case 646:
                    /* TODO & FIXME */
+#endif             
                    return -ENXIO; /* No such device or address: missing decompressor */
                    break;
                 }
index 626e2b05f719e96976b34437ae00961b1ae9428a..b33044d56a1eaba415fbe8fc6a21537b14119229 100644 (file)
@@ -85,7 +85,7 @@ static int vendor_command(struct usb_device *dev, unsigned char request,
 #define BRIGHTNESS 0x2c     /* RAM location for brightness value */
 #define BRIGHTNESS_SEM 0x2b /* RAM location for brightness semaphore */
 
-static ssize_t show_brightness(struct device *dev, char *buf)
+static ssize_t show_brightness(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct usb_interface *intf = to_usb_interface(dev);    
        struct usb_cytherm *cytherm = usb_get_intfdata(intf);     
@@ -93,7 +93,7 @@ static ssize_t show_brightness(struct device *dev, char *buf)
        return sprintf(buf, "%i", cytherm->brightness);
 }
 
-static ssize_t set_brightness(struct device *dev, const char *buf, 
+static ssize_t set_brightness(struct device *dev, struct device_attribute *attr, const char *buf,
                              size_t count)
 {
        struct usb_interface *intf = to_usb_interface(dev);
@@ -138,7 +138,7 @@ static DEVICE_ATTR(brightness, S_IRUGO | S_IWUSR | S_IWGRP,
 #define TEMP 0x33 /* RAM location for temperature */
 #define SIGN 0x34 /* RAM location for temperature sign */
 
-static ssize_t show_temp(struct device *dev, char *buf)
+static ssize_t show_temp(struct device *dev, struct device_attribute *attr, char *buf)
 {
 
        struct usb_interface *intf = to_usb_interface(dev);
@@ -174,7 +174,7 @@ static ssize_t show_temp(struct device *dev, char *buf)
 }
 
 
-static ssize_t set_temp(struct device *dev, const char *buf, size_t count)
+static ssize_t set_temp(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        return count;
 }
@@ -184,7 +184,7 @@ static DEVICE_ATTR(temp, S_IRUGO, show_temp, set_temp);
 
 #define BUTTON 0x7a
 
-static ssize_t show_button(struct device *dev, char *buf)
+static ssize_t show_button(struct device *dev, struct device_attribute *attr, char *buf)
 {
 
        struct usb_interface *intf = to_usb_interface(dev);
@@ -215,7 +215,7 @@ static ssize_t show_button(struct device *dev, char *buf)
 }
 
 
-static ssize_t set_button(struct device *dev, const char *buf, size_t count)
+static ssize_t set_button(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        return count;
 }
@@ -223,7 +223,7 @@ static ssize_t set_button(struct device *dev, const char *buf, size_t count)
 static DEVICE_ATTR(button, S_IRUGO, show_button, set_button);
 
 
-static ssize_t show_port0(struct device *dev, char *buf)
+static ssize_t show_port0(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct usb_interface *intf = to_usb_interface(dev);
        struct usb_cytherm *cytherm = usb_get_intfdata(intf);
@@ -249,7 +249,7 @@ static ssize_t show_port0(struct device *dev, char *buf)
 }
 
 
-static ssize_t set_port0(struct device *dev, const char *buf, size_t count)
+static ssize_t set_port0(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct usb_interface *intf = to_usb_interface(dev);
        struct usb_cytherm *cytherm = usb_get_intfdata(intf);
@@ -283,7 +283,7 @@ static ssize_t set_port0(struct device *dev, const char *buf, size_t count)
 
 static DEVICE_ATTR(port0, S_IRUGO | S_IWUSR | S_IWGRP, show_port0, set_port0);
 
-static ssize_t show_port1(struct device *dev, char *buf)
+static ssize_t show_port1(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct usb_interface *intf = to_usb_interface(dev);
        struct usb_cytherm *cytherm = usb_get_intfdata(intf);
@@ -309,7 +309,7 @@ static ssize_t show_port1(struct device *dev, char *buf)
 }
 
 
-static ssize_t set_port1(struct device *dev, const char *buf, size_t count)
+static ssize_t set_port1(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct usb_interface *intf = to_usb_interface(dev);
        struct usb_cytherm *cytherm = usb_get_intfdata(intf);
index ddbf8e992368ef63757d4f450b91e372212fc5a4..067a81486921d1a393170ddf1f64a32033e73bd5 100644 (file)
@@ -173,7 +173,7 @@ exit:
 }
 
 #define set_lcd_line(number)   \
-static ssize_t lcd_line_##number(struct device *dev, const char *buf, size_t count)    \
+static ssize_t lcd_line_##number(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)     \
 {                                                                                      \
        struct usb_interface *intf = to_usb_interface(dev);                             \
        struct phidget_interfacekit *kit = usb_get_intfdata(intf);                      \
@@ -184,7 +184,7 @@ static DEVICE_ATTR(lcd_line_##number, S_IWUGO, NULL, lcd_line_##number);
 set_lcd_line(1);
 set_lcd_line(2);
 
-static ssize_t set_backlight(struct device *dev, const char *buf, size_t count)
+static ssize_t set_backlight(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct usb_interface *intf = to_usb_interface(dev);
        struct phidget_interfacekit *kit = usb_get_intfdata(intf);
@@ -232,7 +232,7 @@ static void remove_lcd_files(struct phidget_interfacekit *kit)
        }
 }
 
-static ssize_t enable_lcd_files(struct device *dev, const char *buf, size_t count)
+static ssize_t enable_lcd_files(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        struct usb_interface *intf = to_usb_interface(dev);
        struct phidget_interfacekit *kit = usb_get_intfdata(intf);
@@ -307,7 +307,7 @@ resubmit:
 }
 
 #define show_set_output(value)         \
-static ssize_t set_output##value(struct device *dev, const char *buf,  \
+static ssize_t set_output##value(struct device *dev, struct device_attribute *attr, const char *buf,   \
                                                        size_t count)   \
 {                                                                      \
        struct usb_interface *intf = to_usb_interface(dev);             \
@@ -324,7 +324,7 @@ static ssize_t set_output##value(struct device *dev, const char *buf,       \
        return retval ? retval : count;                                 \
 }                                                                      \
                                                                        \
-static ssize_t show_output##value(struct device *dev, char *buf)       \
+static ssize_t show_output##value(struct device *dev, struct device_attribute *attr, char *buf)        \
 {                                                                      \
        struct usb_interface *intf = to_usb_interface(dev);             \
        struct phidget_interfacekit *kit = usb_get_intfdata(intf);      \
@@ -343,7 +343,7 @@ show_set_output(7);
 show_set_output(8);    /* should be MAX_INTERFACES - 1 */
 
 #define show_input(value)      \
-static ssize_t show_input##value(struct device *dev, char *buf)        \
+static ssize_t show_input##value(struct device *dev, struct device_attribute *attr, char *buf) \
 {                                                                      \
        struct usb_interface *intf = to_usb_interface(dev);             \
        struct phidget_interfacekit *kit = usb_get_intfdata(intf);      \
@@ -362,7 +362,7 @@ show_input(7);
 show_input(8);         /* should be MAX_INTERFACES - 1 */
 
 #define show_sensor(value)     \
-static ssize_t show_sensor##value(struct device *dev, char *buf)       \
+static ssize_t show_sensor##value(struct device *dev, struct device_attribute *attr, char *buf)        \
 {                                                                      \
        struct usb_interface *intf = to_usb_interface(dev);             \
        struct phidget_interfacekit *kit = usb_get_intfdata(intf);      \
index 4bd291502a3c0eb2c635d1e8f65a7e67c1eb830f..b84eda631ab58488a7efe3fe35f6041b5fe1bec1 100644 (file)
@@ -207,7 +207,7 @@ change_position_v20(struct phidget_servo *servo, int servo_no, int degrees,
 }
 
 #define show_set(value)        \
-static ssize_t set_servo##value (struct device *dev,                   \
+static ssize_t set_servo##value (struct device *dev, struct device_attribute *attr,                    \
                                        const char *buf, size_t count)  \
 {                                                                      \
        int degrees, minutes, retval;                                   \
@@ -233,7 +233,7 @@ static ssize_t set_servo##value (struct device *dev,                        \
        return retval < 0 ? retval : count;                             \
 }                                                                      \
                                                                        \
-static ssize_t show_servo##value (struct device *dev, char *buf)       \
+static ssize_t show_servo##value (struct device *dev, struct device_attribute *attr, char *buf)        \
 {                                                                      \
        struct usb_interface *intf = to_usb_interface (dev);            \
        struct phidget_servo *servo = usb_get_intfdata (intf);          \
index ee329d5e1c5e71bd5e55f7fe7a4c84bfc19c69d2..f6ba4c788dbc09f7b00e9b3059e74eaa11cfebc0 100644 (file)
@@ -81,14 +81,14 @@ static void change_color(struct usb_led *led)
 }
 
 #define show_set(value)        \
-static ssize_t show_##value(struct device *dev, char *buf)             \
+static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf)              \
 {                                                                      \
        struct usb_interface *intf = to_usb_interface(dev);             \
        struct usb_led *led = usb_get_intfdata(intf);                   \
                                                                        \
        return sprintf(buf, "%d\n", led->value);                        \
 }                                                                      \
-static ssize_t set_##value(struct device *dev, const char *buf, size_t count)  \
+static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)   \
 {                                                                      \
        struct usb_interface *intf = to_usb_interface(dev);             \
        struct usb_led *led = usb_get_intfdata(intf);                   \
index db64c908d4a73b31e3dacd67abf85573a4782256..b104430e2c6a696f808a6bae9160f15eb86db085 100644 (file)
@@ -219,17 +219,21 @@ config USB_EPSON2888
          by some sample firmware from Epson.
 
 config USB_ZAURUS
-       boolean "Sharp Zaurus (stock ROMs)"
+       boolean "Sharp Zaurus (stock ROMs) and compatible"
        depends on USB_USBNET
        select CRC32
        default y
        help
          Choose this option to support the usb networking links used by
          Zaurus models like the SL-5000D, SL-5500, SL-5600, A-300, B-500.
-
-         If you install an alternate ROM image, you may no longer need
-         to support this protocol.  Only the "eth-fd" driver really needs
-         this non-conformant variant of CDC Ethernet protocol.
+         This also supports some related device firmware, as used in some
+         PDAs from Olympus and some cell phones from Motorola.
+
+         If you install an alternate ROM image, such as the Linux 2.6 based
+         versions of OpenZaurus, you should no longer need to support this
+         protocol.  Only the "eth-fd" or "net_fd" drivers in these devices
+         really need this non-conformant variant of CDC Ethernet (or in
+         some cases CDC MDLM) protocol, not "g_ether".
 
 config USB_CDCETHER
        boolean "CDC Ethernet support (smart devices such as cable modems)"
index a9a7cf4a38ebd2035cbaf5f1c842f259953583aa..fd6ff4cb2c6273d753d4daaaffebb230ce22b498 100644 (file)
@@ -520,7 +520,7 @@ static void int_callback(struct urb *u, struct pt_regs *regs)
 
        /* we check the link state to report changes */
        if (kaweth->linkstate != (act_state = ( kaweth->intbuffer[STATE_OFFSET] | STATE_MASK) >> STATE_SHIFT)) {
-               if (!act_state)
+               if (act_state)
                        netif_carrier_on(kaweth->net);
                else
                        netif_carrier_off(kaweth->net);
index f6bc6b3b333ca8a8f0f032ddf86d1cf86ed3df19..4cbb408af72749b5f2f432c10bac69ebe4e2e1b7 100644 (file)
@@ -1517,6 +1517,26 @@ static void cdc_unbind (struct usbnet *dev, struct usb_interface *intf)
        }
 }
 
+#endif /* NEED_GENERIC_CDC */
+
+\f
+#ifdef CONFIG_USB_CDCETHER
+#define        HAVE_HARDWARE
+
+/*-------------------------------------------------------------------------
+ *
+ * Communications Device Class, Ethernet Control model
+ *
+ * Takes two interfaces.  The DATA interface is inactive till an altsetting
+ * is selected.  Configuration data includes class descriptors.
+ *
+ * This should interop with whatever the 2.4 "CDCEther.c" driver
+ * (by Brad Hards) talked with.
+ *
+ *-------------------------------------------------------------------------*/
+
+#include <linux/ctype.h>
+
 
 static void dumpspeed (struct usbnet *dev, __le32 *speeds)
 {
@@ -1567,26 +1587,6 @@ static void cdc_status (struct usbnet *dev, struct urb *urb)
        }
 }
 
-#endif /* NEED_GENERIC_CDC */
-
-\f
-#ifdef CONFIG_USB_CDCETHER
-#define        HAVE_HARDWARE
-
-/*-------------------------------------------------------------------------
- *
- * Communications Device Class, Ethernet Control model
- * 
- * Takes two interfaces.  The DATA interface is inactive till an altsetting
- * is selected.  Configuration data includes class descriptors.
- *
- * This should interop with whatever the 2.4 "CDCEther.c" driver
- * (by Brad Hards) talked with.
- *
- *-------------------------------------------------------------------------*/
-
-#include <linux/ctype.h>
-
 static u8 nibble (unsigned char c)
 {
        if (likely (isdigit (c)))
@@ -2765,7 +2765,7 @@ static int blan_mdlm_bind (struct usbnet *dev, struct usb_interface *intf)
                        }
                        /* expect bcdVersion 1.0, ignore */
                        if (memcmp(&desc->bGUID, blan_guid, 16)
-                                   || memcmp(&desc->bGUID, blan_guid, 16) ) {
+                                   && memcmp(&desc->bGUID, safe_guid, 16) ) {
                                /* hey, this one might _really_ be MDLM! */
                                dev_dbg (&intf->dev, "MDLM guid\n");
                                goto bad_desc;
@@ -2797,11 +2797,13 @@ static int blan_mdlm_bind (struct usbnet *dev, struct usb_interface *intf)
                         *  - bPad (ignored, for PADAFTER -- BLAN-only)
                         * bits are:
                         *  - 0x01 -- Zaurus framing (add CRC)
-                        *  - 0x02 -- PADBEFORE
-                        *  - 0x04 -- PADAFTER
+                        *  - 0x02 -- PADBEFORE (CRC includes some padding)
+                        *  - 0x04 -- PADAFTER (some padding after CRC)
                         *  - 0x08 -- "fermat" packet mangling (for hw bugs)
+                        * the PADBEFORE appears not to matter; we interop
+                        * with devices that use it and those that don't.
                         */
-                       if (detail->bDetailData[1] != 0x01) {
+                       if ((detail->bDetailData[1] & ~02) != 0x01) {
                                /* bmDataCapabilites == 0 would be fine too,
                                 * but framing is minidriver-coupled for now.
                                 */
@@ -4070,9 +4072,6 @@ static const struct usb_device_id products [] = {
 }, {
        USB_DEVICE (0x8086, 0x07d3),    // "blob" bootloader
        .driver_info =  (unsigned long) &blob_info,
-}, {
-       USB_DEVICE (0x22b8, 0x600c),    // USBNET Motorola E680
-       .driver_info =  (unsigned long) &linuxdev_info,
 }, {
        // Linux Ethernet/RNDIS gadget on pxa210/25x/26x
        // e.g. Gumstix, current OpenZaurus, ...
index bc798edf0358828f83ab486bde704d52f9ee1fbf..9438909e87a52bbd7c4ef625ce2f678403648341 100644 (file)
@@ -455,6 +455,17 @@ config USB_SERIAL_XIRCOM
          To compile this driver as a module, choose M here: the
          module will be called keyspan_pda.
 
+config USB_SERIAL_OPTION
+       tristate "USB Option PCMCIA serial driver"
+       depends on USB_SERIAL && USB_OHCI_HCD && PCCARD
+       help
+         Say Y here if you want to use an Option card. This is a
+         GSM card, controlled by three serial ports which are connected
+         via an OHCI adapter located on a PC card.
+
+         To compile this driver as a module, choose M here: the
+         module will be called option.
+
 config USB_SERIAL_OMNINET
        tristate "USB ZyXEL omni.net LCD Plus Driver (EXPERIMENTAL)"
        depends on USB_SERIAL && EXPERIMENTAL
index d56ff6d86cce220860ae63ca7bfbab532956847b..6c7cdcc99a9e2da387a12a352947a22e7ef08d6b 100644 (file)
@@ -32,6 +32,7 @@ obj-$(CONFIG_USB_SERIAL_KLSI)                 += kl5kusb105.o
 obj-$(CONFIG_USB_SERIAL_KOBIL_SCT)             += kobil_sct.o
 obj-$(CONFIG_USB_SERIAL_MCT_U232)              += mct_u232.o
 obj-$(CONFIG_USB_SERIAL_OMNINET)               += omninet.o
+obj-$(CONFIG_USB_SERIAL_OPTION)                        += option.o
 obj-$(CONFIG_USB_SERIAL_PL2303)                        += pl2303.o
 obj-$(CONFIG_USB_SERIAL_SAFE)                  += safe_serial.o
 obj-$(CONFIG_USB_SERIAL_TI)                    += ti_usb_3410_5052.o
index 7e9bb63eb466d3e09e608b22b4073448845e6802..4ace9964fc6bd36a22c0a82da2fc432be4eef5f7 100644 (file)
@@ -7,6 +7,14 @@
  *     modify it under the terms of the GNU General Public License version
  *     2 as published by the Free Software Foundation.
  *
+ * Support to set flow control line levels using TIOCMGET and TIOCMSET
+ * thanks to Karl Hiramoto karl@hiramoto.org. RTSCTS hardware flow
+ * control thanks to Munir Nassar nassarmu@real-time.com
+ *
+ * Outstanding Issues:
+ *  Buffers are not flushed when the port is opened.
+ *  Multiple calls to write() may fail with "Resource temporarily unavailable"
+ *
  */
 
 #include <linux/config.h>
@@ -24,7 +32,7 @@
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v0.03"
+#define DRIVER_VERSION "v0.04"
 #define DRIVER_DESC "Silicon Labs CP2101/CP2102 RS232 serial adaptor driver"
 
 /*
@@ -35,6 +43,9 @@ static void cp2101_cleanup(struct usb_serial_port*);
 static void cp2101_close(struct usb_serial_port*, struct file*);
 static void cp2101_get_termios(struct usb_serial_port*);
 static void cp2101_set_termios(struct usb_serial_port*, struct termios*);
+static int cp2101_tiocmget (struct usb_serial_port *, struct file *);
+static int cp2101_tiocmset (struct usb_serial_port *, struct file *,
+               unsigned int, unsigned int);
 static void cp2101_break_ctl(struct usb_serial_port*, int);
 static int cp2101_startup (struct usb_serial *);
 static void cp2101_shutdown(struct usb_serial*);
@@ -43,9 +54,10 @@ static void cp2101_shutdown(struct usb_serial*);
 static int debug;
 
 static struct usb_device_id id_table [] = {
-       {USB_DEVICE(0x10c4, 0xea60) },  /*Silicon labs factory default*/
-       {USB_DEVICE(0x10ab, 0x10c5) },  /*Siemens MC60 Cable*/
-       { } /* Terminating Entry*/
+       { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
+       { USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */
+       { USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */
+       { } /* Terminating Entry */
 };
 
 MODULE_DEVICE_TABLE (usb, id_table);
@@ -70,32 +82,35 @@ static struct usb_serial_device_type cp2101_device = {
        .close                  = cp2101_close,
        .break_ctl              = cp2101_break_ctl,
        .set_termios            = cp2101_set_termios,
+       .tiocmget               = cp2101_tiocmget,
+       .tiocmset               = cp2101_tiocmset,
        .attach                 = cp2101_startup,
        .shutdown               = cp2101_shutdown,
 };
 
-/*Config request types*/
+/* Config request types */
 #define REQTYPE_HOST_TO_DEVICE 0x41
 #define REQTYPE_DEVICE_TO_HOST 0xc1
 
-/*Config SET requests. To GET, add 1 to the request number*/
-#define CP2101_UART            0x00    /*Enable / Disable*/
-#define CP2101_BAUDRATE                0x01    /*(BAUD_RATE_GEN_FREQ / baudrate)*/
-#define CP2101_BITS            0x03    /*0x(0)(data bits)(parity)(stop bits)*/
-#define CP2101_BREAK           0x05    /*On / Off*/
-#define CP2101_DTRRTS          0x07    /*101 / 202  ???*/
-#define CP2101_CONFIG_16       0x13    /*16 bytes of config data ???*/
-#define CP2101_CONFIG_6                0x19    /*6 bytes of config data ???*/
+/* Config SET requests. To GET, add 1 to the request number */
+#define CP2101_UART            0x00    /* Enable / Disable */
+#define CP2101_BAUDRATE                0x01    /* (BAUD_RATE_GEN_FREQ / baudrate) */
+#define CP2101_BITS            0x03    /* 0x(0)(databits)(parity)(stopbits) */
+#define CP2101_BREAK           0x05    /* On / Off */
+#define CP2101_CONTROL         0x07    /* Flow control line states */
+#define CP2101_MODEMCTL                0x13    /* Modem controls */
+#define CP2101_CONFIG_6                0x19    /* 6 bytes of config data ??? */
 
-/*CP2101_UART*/
+/* CP2101_UART */
 #define UART_ENABLE            0x0001
 #define UART_DISABLE           0x0000
 
-/*CP2101_BAUDRATE*/
+/* CP2101_BAUDRATE */
 #define BAUD_RATE_GEN_FREQ     0x384000
 
-/*CP2101_BITS*/
+/* CP2101_BITS */
 #define BITS_DATA_MASK         0X0f00
+#define BITS_DATA_5            0X0500
 #define BITS_DATA_6            0X0600
 #define BITS_DATA_7            0X0700
 #define BITS_DATA_8            0X0800
@@ -112,64 +127,137 @@ static struct usb_serial_device_type cp2101_device = {
 #define BITS_STOP_1            0x0000
 #define BITS_STOP_1_5          0x0001
 #define BITS_STOP_2            0x0002
+
+/* CP2101_BREAK */
 #define BREAK_ON               0x0000
 #define BREAK_OFF              0x0001
 
+/* CP2101_CONTROL */
+#define CONTROL_DTR            0x0001
+#define CONTROL_RTS            0x0002
+#define CONTROL_CTS            0x0010
+#define CONTROL_DSR            0x0020
+#define CONTROL_RING           0x0040
+#define CONTROL_DCD            0x0080
+#define CONTROL_WRITE_DTR      0x0100
+#define CONTROL_WRITE_RTS      0x0200
 
-static int cp2101_get_config(struct usb_serial_port* port, u8 request)
+/*
+ * cp2101_get_config
+ * Reads from the CP2101 configuration registers
+ * 'size' is specified in bytes.
+ * 'data' is a pointer to a pre-allocated array of integers large
+ * enough to hold 'size' bytes (with 4 bytes to each integer)
+ */
+static int cp2101_get_config(struct usb_serial_port* port, u8 request,
+               unsigned int *data, int size)
 {
        struct usb_serial *serial = port->serial;
-       unsigned char buf[4];
-       unsigned int value;
-       int result, i;
+       u32 *buf;
+       int result, i, length;
+
+       /* Number of integers required to contain the array */
+       length = (((size - 1) | 3) + 1)/4;
+
+       buf = kmalloc (length * sizeof(u32), GFP_KERNEL);
+       memset(buf, 0, length * sizeof(u32));
+
+       if (!buf) {
+               dev_err(&port->dev, "%s - out of memory.\n", __FUNCTION__);
+               return -ENOMEM;
+       }
 
-       /*For get requests, the request number must be incremented*/
+       /* For get requests, the request number must be incremented */
        request++;
 
-       /*Issue the request, attempting to read 4 bytes*/
+       /* Issue the request, attempting to read 'size' bytes */
        result = usb_control_msg (serial->dev,usb_rcvctrlpipe (serial->dev, 0),
                                request, REQTYPE_DEVICE_TO_HOST, 0x0000,
-                               0, buf, 4, 300);
+                               0, buf, size, 300);
 
-       if (result < 0) {
-               dev_err(&port->dev, "%s - Unable to send config request, "
-                               "request=0x%x result=%d\n",
-                               __FUNCTION__, request, result);
-               return result;
-       }
+       /* Convert data into an array of integers */
+       for (i=0; i<length; i++)
+               data[i] = le32_to_cpu(buf[i]);
 
-       /*Assemble each byte read into an integer value*/
-       value = 0;
-       for (i=0; i<4 && i<result; i++)
-               value |= (buf[i] << (i * 8));
+       kfree(buf);
 
-       dbg( " %s - request=0x%x result=%d value=0x%x",
-                       __FUNCTION__, request, result, value);
+       if (result != size) {
+               dev_err(&port->dev, "%s - Unable to send config request, "
+                               "request=0x%x size=%d result=%d\n",
+                               __FUNCTION__, request, size, result);
+               return -EPROTO;
+       }
 
-       return value;
+       return 0;
 }
 
-static int cp2101_set_config(struct usb_serial_port* port, u8 request, u16 value)
+/*
+ * cp2101_set_config
+ * Writes to the CP2101 configuration registers
+ * Values less than 16 bits wide are sent directly
+ * 'size' is specified in bytes.
+ */
+static int cp2101_set_config(struct usb_serial_port* port, u8 request,
+               unsigned int *data, int size)
 {
        struct usb_serial *serial = port->serial;
-       int result;
-       result = usb_control_msg (serial->dev, usb_sndctrlpipe(serial->dev, 0),
-                       request, REQTYPE_HOST_TO_DEVICE, value,
-                       0, NULL, 0, 300);
+       u32 *buf;
+       int result, i, length;
 
-       if (result <0) {
-               dev_err(&port->dev, "%s - Unable to send config request, "
-                               "request=0x%x value=0x%x result=%d\n",
-                               __FUNCTION__, request, value, result);
-               return result;
+       /* Number of integers required to contain the array */
+       length = (((size - 1) | 3) + 1)/4;
+
+       buf = kmalloc(length * sizeof(u32), GFP_KERNEL);
+       if (!buf) {
+               dev_err(&port->dev, "%s - out of memory.\n",
+                               __FUNCTION__);
+               return -ENOMEM;
+       }
+
+       /* Array of integers into bytes */
+       for (i = 0; i < length; i++)
+               buf[i] = cpu_to_le32(data[i]);
+
+       if (size > 2) {
+               result = usb_control_msg (serial->dev,
+                               usb_sndctrlpipe(serial->dev, 0),
+                               request, REQTYPE_HOST_TO_DEVICE, 0x0000,
+                               0, buf, size, 300);
+       } else {
+               result = usb_control_msg (serial->dev,
+                               usb_sndctrlpipe(serial->dev, 0),
+                               request, REQTYPE_HOST_TO_DEVICE, data[0],
+                               0, NULL, 0, 300);
        }
 
-       dbg(" %s - request=0x%x value=0x%x result=%d",
-                       __FUNCTION__, request, value, result);
+       kfree(buf);
+
+       if ((size > 2 && result != size) || result < 0) {
+               dev_err(&port->dev, "%s - Unable to send request, "
+                               "request=0x%x size=%d result=%d\n",
+                               __FUNCTION__, request, size, result);
+               return -EPROTO;
+       }
 
+       /* Single data value */
+       result = usb_control_msg (serial->dev,
+                       usb_sndctrlpipe(serial->dev, 0),
+                       request, REQTYPE_HOST_TO_DEVICE, data[0],
+                       0, NULL, 0, 300);
        return 0;
 }
 
+/*
+ * cp2101_set_config_single
+ * Convenience function for calling cp2101_set_config on single data values
+ * without requiring an integer pointer
+ */
+static inline int cp2101_set_config_single(struct usb_serial_port* port,
+               u8 request, unsigned int data)
+{
+       return cp2101_set_config(port, request, &data, 2);
+}
+
 static int cp2101_open (struct usb_serial_port *port, struct file *filp)
 {
        struct usb_serial *serial = port->serial;
@@ -177,7 +265,7 @@ static int cp2101_open (struct usb_serial_port *port, struct file *filp)
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
-       if (cp2101_set_config(port, CP2101_UART, UART_ENABLE)) {
+       if (cp2101_set_config_single(port, CP2101_UART, UART_ENABLE)) {
                dev_err(&port->dev, "%s - Unable to enable UART\n",
                                __FUNCTION__);
                return -EPROTO;
@@ -198,9 +286,12 @@ static int cp2101_open (struct usb_serial_port *port, struct file *filp)
                return result;
        }
 
-       /*Configure the termios structure*/
+       /* Configure the termios structure */
        cp2101_get_termios(port);
 
+       /* Set the DTR and RTS pins low */
+       cp2101_tiocmset(port, NULL, TIOCM_DTR | TIOCM_RTS, 0);
+
        return 0;
 }
 
@@ -228,16 +319,18 @@ static void cp2101_close (struct usb_serial_port *port, struct file * filp)
        usb_kill_urb(port->write_urb);
        usb_kill_urb(port->read_urb);
 
-       cp2101_set_config(port, CP2101_UART, UART_DISABLE);
+       cp2101_set_config_single(port, CP2101_UART, UART_DISABLE);
 }
 
-/* cp2101_get_termios*/
-/* Reads the baud rate, data bits, parity and stop bits from the device*/
-/* Corrects any unsupported values*/
-/* Configures the termios structure to reflect the state of the device*/
+/*
+ * cp2101_get_termios
+ * Reads the baud rate, data bits, parity, stop bits and flow control mode
+ * from the device, corrects any unsupported values, and configures the
+ * termios structure to reflect the state of the device
+ */
 static void cp2101_get_termios (struct usb_serial_port *port)
 {
-       unsigned int cflag;
+       unsigned int cflag, modem_ctl[4];
        int baud;
        int bits;
 
@@ -249,15 +342,16 @@ static void cp2101_get_termios (struct usb_serial_port *port)
        }
        cflag = port->tty->termios->c_cflag;
 
-       baud = cp2101_get_config(port, CP2101_BAUDRATE);
-       /*Convert to baudrate*/
+       cp2101_get_config(port, CP2101_BAUDRATE, &baud, 2);
+       /* Convert to baudrate */
        if (baud)
                baud = BAUD_RATE_GEN_FREQ / baud;
 
        dbg("%s - baud rate = %d", __FUNCTION__, baud);
        cflag &= ~CBAUD;
        switch (baud) {
-               /* The baud rates which are commented out below
+               /*
+                * The baud rates which are commented out below
                 * appear to be supported by the device
                 * but are non-standard
                 */
@@ -284,14 +378,18 @@ static void cp2101_get_termios (struct usb_serial_port *port)
                        dbg("%s - Baud rate is not supported, "
                                        "using 9600 baud", __FUNCTION__);
                        cflag |= B9600;
-                       cp2101_set_config(port, CP2101_BAUDRATE,
+                       cp2101_set_config_single(port, CP2101_BAUDRATE,
                                        (BAUD_RATE_GEN_FREQ/9600));
                        break;
        }
 
-       bits = cp2101_get_config(port, CP2101_BITS);
+       cp2101_get_config(port, CP2101_BITS, &bits, 2);
        cflag &= ~CSIZE;
        switch(bits & BITS_DATA_MASK) {
+               case BITS_DATA_5:
+                       dbg("%s - data bits = 5", __FUNCTION__);
+                       cflag |= CS5;
+                       break;
                case BITS_DATA_6:
                        dbg("%s - data bits = 6", __FUNCTION__);
                        cflag |= CS6;
@@ -310,7 +408,7 @@ static void cp2101_get_termios (struct usb_serial_port *port)
                        cflag |= CS8;
                        bits &= ~BITS_DATA_MASK;
                        bits |= BITS_DATA_8;
-                       cp2101_set_config(port, CP2101_BITS, bits);
+                       cp2101_set_config(port, CP2101_BITS, &bits, 2);
                        break;
                default:
                        dbg("%s - Unknown number of data bits, "
@@ -318,7 +416,7 @@ static void cp2101_get_termios (struct usb_serial_port *port)
                        cflag |= CS8;
                        bits &= ~BITS_DATA_MASK;
                        bits |= BITS_DATA_8;
-                       cp2101_set_config(port, CP2101_BITS, bits);
+                       cp2101_set_config(port, CP2101_BITS, &bits, 2);
                        break;
        }
 
@@ -341,21 +439,21 @@ static void cp2101_get_termios (struct usb_serial_port *port)
                                        "disabling parity)", __FUNCTION__);
                        cflag &= ~PARENB;
                        bits &= ~BITS_PARITY_MASK;
-                       cp2101_set_config(port, CP2101_BITS, bits);
+                       cp2101_set_config(port, CP2101_BITS, &bits, 2);
                        break;
                case BITS_PARITY_SPACE:
                        dbg("%s - parity = SPACE (not supported, "
                                        "disabling parity)", __FUNCTION__);
                        cflag &= ~PARENB;
                        bits &= ~BITS_PARITY_MASK;
-                       cp2101_set_config(port, CP2101_BITS, bits);
+                       cp2101_set_config(port, CP2101_BITS, &bits, 2);
                        break;
                default:
                        dbg("%s - Unknown parity mode, "
                                        "disabling parity", __FUNCTION__);
                        cflag &= ~PARENB;
                        bits &= ~BITS_PARITY_MASK;
-                       cp2101_set_config(port, CP2101_BITS, bits);
+                       cp2101_set_config(port, CP2101_BITS, &bits, 2);
                        break;
        }
 
@@ -366,9 +464,9 @@ static void cp2101_get_termios (struct usb_serial_port *port)
                        break;
                case BITS_STOP_1_5:
                        dbg("%s - stop bits = 1.5 (not supported, "
-                                       "using 1 stop bit", __FUNCTION__);
+                                       "using 1 stop bit)", __FUNCTION__);
                        bits &= ~BITS_STOP_MASK;
-                       cp2101_set_config(port, CP2101_BITS, bits);
+                       cp2101_set_config(port, CP2101_BITS, &bits, 2);
                        break;
                case BITS_STOP_2:
                        dbg("%s - stop bits = 2", __FUNCTION__);
@@ -378,10 +476,19 @@ static void cp2101_get_termios (struct usb_serial_port *port)
                        dbg("%s - Unknown number of stop bits, "
                                        "using 1 stop bit", __FUNCTION__);
                        bits &= ~BITS_STOP_MASK;
-                       cp2101_set_config(port, CP2101_BITS, bits);
+                       cp2101_set_config(port, CP2101_BITS, &bits, 2);
                        break;
        }
 
+       cp2101_get_config(port, CP2101_MODEMCTL, modem_ctl, 16);
+       if (modem_ctl[0] & 0x0008) {
+               dbg("%s - flow control = CRTSCTS", __FUNCTION__);
+               cflag |= CRTSCTS;
+       } else {
+               dbg("%s - flow control = NONE", __FUNCTION__);
+               cflag &= ~CRTSCTS;
+       }
+
        port->tty->termios->c_cflag = cflag;
 }
 
@@ -389,8 +496,8 @@ static void cp2101_set_termios (struct usb_serial_port *port,
                struct termios *old_termios)
 {
        unsigned int cflag, old_cflag=0;
-       int baud=0;
-       int bits;
+       int baud=0, bits;
+       unsigned int modem_ctl[4];
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
@@ -400,7 +507,7 @@ static void cp2101_set_termios (struct usb_serial_port *port,
        }
        cflag = port->tty->termios->c_cflag;
 
-       /* check that they really want us to change something */
+       /* Check that they really want us to change something */
        if (old_termios) {
                if ((cflag == old_termios->c_cflag) &&
                                (RELEVANT_IFLAG(port->tty->termios->c_iflag)
@@ -415,7 +522,8 @@ static void cp2101_set_termios (struct usb_serial_port *port,
        /* If the baud rate is to be updated*/
        if ((cflag & CBAUD) != (old_cflag & CBAUD)) {
                switch (cflag & CBAUD) {
-                       /* The baud rates which are commented out below
+                       /*
+                        * The baud rates which are commented out below
                         * appear to be supported by the device
                         * but are non-standard
                         */
@@ -448,18 +556,22 @@ static void cp2101_set_termios (struct usb_serial_port *port,
                if (baud) {
                        dbg("%s - Setting baud rate to %d baud", __FUNCTION__,
                                        baud);
-                       if (cp2101_set_config(port, CP2101_BAUDRATE,
+                       if (cp2101_set_config_single(port, CP2101_BAUDRATE,
                                                (BAUD_RATE_GEN_FREQ / baud)))
                                dev_err(&port->dev, "Baud rate requested not "
                                                "supported by device\n");
                }
        }
 
-       /*If the number of data bits is to be updated*/
+       /* If the number of data bits is to be updated */
        if ((cflag & CSIZE) != (old_cflag & CSIZE)) {
-               bits = cp2101_get_config(port, CP2101_BITS);
+               cp2101_get_config(port, CP2101_BITS, &bits, 2);
                bits &= ~BITS_DATA_MASK;
                switch (cflag & CSIZE) {
+                       case CS5:
+                               bits |= BITS_DATA_5;
+                               dbg("%s - data bits = 5", __FUNCTION__);
+                               break;
                        case CS6:
                                bits |= BITS_DATA_6;
                                dbg("%s - data bits = 6", __FUNCTION__);
@@ -483,13 +595,13 @@ static void cp2101_set_termios (struct usb_serial_port *port,
                                bits |= BITS_DATA_8;
                                break;
                }
-               if (cp2101_set_config(port, CP2101_BITS, bits))
+               if (cp2101_set_config(port, CP2101_BITS, &bits, 2))
                        dev_err(&port->dev, "Number of data bits requested "
                                        "not supported by device\n");
        }
 
        if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD))) {
-               bits = cp2101_get_config(port, CP2101_BITS);
+               cp2101_get_config(port, CP2101_BITS, &bits, 2);
                bits &= ~BITS_PARITY_MASK;
                if (cflag & PARENB) {
                        if (cflag & PARODD) {
@@ -500,13 +612,13 @@ static void cp2101_set_termios (struct usb_serial_port *port,
                                dbg("%s - parity = EVEN", __FUNCTION__);
                        }
                }
-               if (cp2101_set_config(port, CP2101_BITS, bits))
+               if (cp2101_set_config(port, CP2101_BITS, &bits, 2))
                        dev_err(&port->dev, "Parity mode not supported "
                                        "by device\n");
        }
 
        if ((cflag & CSTOPB) != (old_cflag & CSTOPB)) {
-               bits = cp2101_get_config(port, CP2101_BITS);
+               cp2101_get_config(port, CP2101_BITS, &bits, 2);
                bits &= ~BITS_STOP_MASK;
                if (cflag & CSTOPB) {
                        bits |= BITS_STOP_2;
@@ -515,15 +627,90 @@ static void cp2101_set_termios (struct usb_serial_port *port,
                        bits |= BITS_STOP_1;
                        dbg("%s - stop bits = 1", __FUNCTION__);
                }
-               if (cp2101_set_config(port, CP2101_BITS, bits))
+               if (cp2101_set_config(port, CP2101_BITS, &bits, 2))
                        dev_err(&port->dev, "Number of stop bits requested "
                                        "not supported by device\n");
        }
+
+       if ((cflag & CRTSCTS) != (old_cflag & CRTSCTS)) {
+               cp2101_get_config(port, CP2101_MODEMCTL, modem_ctl, 16);
+               dbg("%s - read modem controls = 0x%.4x 0x%.4x 0x%.4x 0x%.4x",
+                               __FUNCTION__, modem_ctl[0], modem_ctl[1],
+                               modem_ctl[2], modem_ctl[3]);
+
+               if (cflag & CRTSCTS) {
+                       modem_ctl[0] &= ~0x7B;
+                       modem_ctl[0] |= 0x09;
+                       modem_ctl[1] = 0x80;
+                       dbg("%s - flow control = CRTSCTS", __FUNCTION__);
+               } else {
+                       modem_ctl[0] &= ~0x7B;
+                       modem_ctl[0] |= 0x01;
+                       modem_ctl[1] |= 0x40;
+                       dbg("%s - flow control = NONE", __FUNCTION__);
+               }
+
+               dbg("%s - write modem controls = 0x%.4x 0x%.4x 0x%.4x 0x%.4x",
+                               __FUNCTION__, modem_ctl[0], modem_ctl[1],
+                               modem_ctl[2], modem_ctl[3]);
+               cp2101_set_config(port, CP2101_MODEMCTL, modem_ctl, 16);
+       }
+
+}
+
+static int cp2101_tiocmset (struct usb_serial_port *port, struct file *file,
+               unsigned int set, unsigned int clear)
+{
+       int control = 0;
+
+       dbg("%s - port %d", __FUNCTION__, port->number);
+
+       if (set & TIOCM_RTS) {
+               control |= CONTROL_RTS;
+               control |= CONTROL_WRITE_RTS;
+       }
+       if (set & TIOCM_DTR) {
+               control |= CONTROL_DTR;
+               control |= CONTROL_WRITE_DTR;
+       }
+       if (clear & TIOCM_RTS) {
+               control &= ~CONTROL_RTS;
+               control |= CONTROL_WRITE_RTS;
+       }
+       if (clear & TIOCM_DTR) {
+               control &= ~CONTROL_DTR;
+               control |= CONTROL_WRITE_DTR;
+       }
+
+       dbg("%s - control = 0x%.4x", __FUNCTION__, control);
+
+       return cp2101_set_config(port, CP2101_CONTROL, &control, 2);
+
+}
+
+static int cp2101_tiocmget (struct usb_serial_port *port, struct file *file)
+{
+       int control, result;
+
+       dbg("%s - port %d", __FUNCTION__, port->number);
+
+       cp2101_get_config(port, CP2101_CONTROL, &control, 1);
+
+       result = ((control & CONTROL_DTR) ? TIOCM_DTR : 0)
+               |((control & CONTROL_RTS) ? TIOCM_RTS : 0)
+               |((control & CONTROL_CTS) ? TIOCM_CTS : 0)
+               |((control & CONTROL_DSR) ? TIOCM_DSR : 0)
+               |((control & CONTROL_RING)? TIOCM_RI  : 0)
+               |((control & CONTROL_DCD) ? TIOCM_CD  : 0);
+
+       dbg("%s - control = 0x%.2x", __FUNCTION__, control);
+
+       return result;
 }
 
 static void cp2101_break_ctl (struct usb_serial_port *port, int break_state)
 {
-       u16 state;
+       int state;
 
        dbg("%s - port %d", __FUNCTION__, port->number);
        if (break_state == 0)
@@ -532,12 +719,12 @@ static void cp2101_break_ctl (struct usb_serial_port *port, int break_state)
                state = BREAK_ON;
        dbg("%s - turning break %s", __FUNCTION__,
                        state==BREAK_OFF ? "off" : "on");
-       cp2101_set_config(port, CP2101_BREAK, state);
+       cp2101_set_config(port, CP2101_BREAK, &state, 2);
 }
 
 static int cp2101_startup (struct usb_serial *serial)
 {
-       /*CP2101 buffers behave strangely unless device is reset*/
+       /* CP2101 buffers behave strangely unless device is reset */
        usb_reset_device(serial->dev);
        return 0;
 }
@@ -548,7 +735,7 @@ static void cp2101_shutdown (struct usb_serial *serial)
 
        dbg("%s", __FUNCTION__);
 
-       /* stop reads and writes on all ports */
+       /* Stop reads and writes on all ports */
        for (i=0; i < serial->num_ports; ++i) {
                cp2101_cleanup(serial->port[i]);
        }
@@ -560,16 +747,16 @@ static int __init cp2101_init (void)
 
        retval = usb_serial_register(&cp2101_device);
        if (retval)
-               return retval; /*Failed to register*/
+               return retval; /* Failed to register */
 
        retval = usb_register(&cp2101_driver);
        if (retval) {
-               /*Failed to register*/
+               /* Failed to register */
                usb_serial_deregister(&cp2101_device);
                return retval;
        }
 
-       /*Success*/
+       /* Success */
        info(DRIVER_DESC " " DRIVER_VERSION);
        return 0;
 }
index f34a9bb6a219a9b9ad0024e2ed57e0a5063aa0f0..012e63e05806076b06a42dc1d3d592fa45fc0fce 100644 (file)
@@ -89,6 +89,7 @@ static int interval;
 
 static struct usb_device_id id_table_earthmate [] = {
        { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) },
+       { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) },
        { }                                             /* Terminating entry */
 };
 
@@ -99,6 +100,7 @@ static struct usb_device_id id_table_cyphidcomrs232 [] = {
 
 static struct usb_device_id id_table_combined [] = {
        { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) },
+       { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) },
        { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },
        { }                                             /* Terminating entry */
 };
index 1012ee6b19ce6dbbbeeb3c7672e7b2dc8d371558..1fa119efe41a0276c412a9a5ed8f5ff6ce1ecaf8 100644 (file)
@@ -13,6 +13,7 @@
 /* DeLorme Earthmate USB - a GPS device */
 #define        VENDOR_ID_DELORME                0x1163
 #define PRODUCT_ID_EARTHMATEUSB                 0x0100
+#define PRODUCT_ID_EARTHMATEUSB_LT20    0x0200
 
 /* Cypress HID->COM RS232 Adapter */
 #define VENDOR_ID_CYPRESS               0x04b4
index 52394f08a9474b1b90a41814601f4379313d2ec9..d882fa3ad19a7b298677f02e278937a02ded220a 100644 (file)
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v1.4.1"
+#define DRIVER_VERSION "v1.4.2"
 #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>"
 #define DRIVER_DESC "USB FTDI Serial Converters Driver"
 
@@ -364,6 +364,7 @@ static struct usb_device_id id_table_8U232AM [] = {
        { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_3, 0, 0x3ff) },
        { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_4, 0, 0x3ff) },
        { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0, 0x3ff) },
+       { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UM100_PID, 0, 0x3ff) },
        { USB_DEVICE_VER(FTDI_VID, INSIDE_ACCESSO, 0, 0x3ff) },
        { USB_DEVICE_VER(INTREPID_VID, INTREPID_VALUECAN_PID, 0, 0x3ff) },
        { USB_DEVICE_VER(INTREPID_VID, INTREPID_NEOVI_PID, 0, 0x3ff) },
@@ -475,6 +476,7 @@ static struct usb_device_id id_table_FT232BM [] = {
        { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88E_PID, 0x400, 0xffff) },
        { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88F_PID, 0x400, 0xffff) },
        { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0x400, 0xffff) },
+       { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UM100_PID, 0x400, 0xffff) },
        { USB_DEVICE_VER(FTDI_VID, LINX_SDMUSBQSS_PID, 0x400, 0xffff) },
        { USB_DEVICE_VER(FTDI_VID, LINX_MASTERDEVEL2_PID, 0x400, 0xffff) },
        { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_0_PID, 0x400, 0xffff) },
@@ -618,6 +620,7 @@ static struct usb_device_id id_table_combined [] = {
        { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88E_PID, 0x400, 0xffff) },
        { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88F_PID, 0x400, 0xffff) },
        { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) },
        { USB_DEVICE_VER(FTDI_VID, LINX_SDMUSBQSS_PID, 0x400, 0xffff) },
        { USB_DEVICE_VER(FTDI_VID, LINX_MASTERDEVEL2_PID, 0x400, 0xffff) },
        { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_0_PID, 0x400, 0xffff) },
@@ -684,6 +687,8 @@ struct ftdi_private {
        char prev_status, diff_status;        /* Used for TIOCMIWAIT */
        __u8 rx_flags;          /* receive state flags (throttling) */
        spinlock_t rx_lock;     /* spinlock for receive state */
+       struct work_struct rx_work;
+       int rx_processed;
 
        __u16 interface;        /* FT2232C port interface (0 for FT232/245) */
 
@@ -714,7 +719,7 @@ static int  ftdi_write_room         (struct usb_serial_port *port);
 static int  ftdi_chars_in_buffer       (struct usb_serial_port *port);
 static void ftdi_write_bulk_callback   (struct urb *urb, struct pt_regs *regs);
 static void ftdi_read_bulk_callback    (struct urb *urb, struct pt_regs *regs);
-static void ftdi_process_read          (struct usb_serial_port *port);
+static void ftdi_process_read          (void *param);
 static void ftdi_set_termios           (struct usb_serial_port *port, struct termios * old);
 static int  ftdi_tiocmget               (struct usb_serial_port *port, struct file *file);
 static int  ftdi_tiocmset              (struct usb_serial_port *port, struct file * file, unsigned int set, unsigned int clear);
@@ -1213,7 +1218,7 @@ check_and_exit:
  * ***************************************************************************
  */
 
-static ssize_t show_latency_timer(struct device *dev, char *buf)
+static ssize_t show_latency_timer(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct usb_serial_port *port = to_usb_serial_port(dev);
        struct ftdi_private *priv = usb_get_serial_port_data(port);
@@ -1240,7 +1245,7 @@ static ssize_t show_latency_timer(struct device *dev, char *buf)
 }
 
 /* Write a new value of the latency timer, in units of milliseconds. */
-static ssize_t store_latency_timer(struct device *dev, const char *valbuf,
+static ssize_t store_latency_timer(struct device *dev, struct device_attribute *attr, const char *valbuf,
                                   size_t count)
 {
        struct usb_serial_port *port = to_usb_serial_port(dev);
@@ -1271,7 +1276,7 @@ static ssize_t store_latency_timer(struct device *dev, const char *valbuf,
 
 /* Write an event character directly to the FTDI register.  The ASCII
    value is in the low 8 bits, with the enable bit in the 9th bit. */
-static ssize_t store_event_char(struct device *dev, const char *valbuf,
+static ssize_t store_event_char(struct device *dev, struct device_attribute *attr, const char *valbuf,
                                size_t count)
 {
        struct usb_serial_port *port = to_usb_serial_port(dev);
@@ -1384,6 +1389,8 @@ static int ftdi_common_startup (struct usb_serial *serial)
                port->read_urb->transfer_buffer_length = BUFSZ;
        }
 
+       INIT_WORK(&priv->rx_work, ftdi_process_read, port);
+
        /* Free port's existing write urb and transfer buffer. */
        if (port->write_urb) {
                usb_free_urb (port->write_urb);
@@ -1614,6 +1621,7 @@ static int  ftdi_open (struct usb_serial_port *port, struct file *filp)
        spin_unlock_irqrestore(&priv->rx_lock, flags);
 
        /* Start reading from the device */
+       priv->rx_processed = 0;
        usb_fill_bulk_urb(port->read_urb, dev,
                      usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress),
                      port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
@@ -1664,6 +1672,10 @@ static void ftdi_close (struct usb_serial_port *port, struct file *filp)
                        err("Error from RTS LOW urb");
                }
        } /* Note change no line if hupcl is off */
+
+       /* cancel any scheduled reading */
+       cancel_delayed_work(&priv->rx_work);
+       flush_scheduled_work();
        
        /* shutdown our bulk read */
        if (port->read_urb)
@@ -1859,23 +1871,14 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
                return;
        }
 
-       /* If throttled, delay receive processing until unthrottled. */
-       spin_lock(&priv->rx_lock);
-       if (priv->rx_flags & THROTTLED) {
-               dbg("Deferring read urb processing until unthrottled");
-               priv->rx_flags |= ACTUALLY_THROTTLED;
-               spin_unlock(&priv->rx_lock);
-               return;
-       }
-       spin_unlock(&priv->rx_lock);
-
        ftdi_process_read(port);
 
 } /* ftdi_read_bulk_callback */
 
 
-static void ftdi_process_read (struct usb_serial_port *port)
+static void ftdi_process_read (void *param)
 { /* ftdi_process_read */
+       struct usb_serial_port *port = (struct usb_serial_port*)param;
        struct urb *urb;
        struct tty_struct *tty;
        struct ftdi_private *priv;
@@ -1886,6 +1889,7 @@ static void ftdi_process_read (struct usb_serial_port *port)
        int result;
        int need_flip;
        int packet_offset;
+       unsigned long flags;
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
@@ -1912,12 +1916,18 @@ static void ftdi_process_read (struct usb_serial_port *port)
 
        data = urb->transfer_buffer;
 
-        /* The first two bytes of every read packet are status */
-       if (urb->actual_length > 2) {
-               usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
+       if (priv->rx_processed) {
+               dbg("%s - already processed: %d bytes, %d remain", __FUNCTION__,
+                               priv->rx_processed,
+                               urb->actual_length - priv->rx_processed);
        } else {
-                dbg("Status only: %03oo %03oo",data[0],data[1]);
-        }
+               /* The first two bytes of every read packet are status */
+               if (urb->actual_length > 2) {
+                       usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
+               } else {
+                       dbg("Status only: %03oo %03oo",data[0],data[1]);
+               }
+       }
 
 
        /* TO DO -- check for hung up line and handle appropriately: */
@@ -1926,8 +1936,12 @@ static void ftdi_process_read (struct usb_serial_port *port)
        /* if CD is dropped and the line is not CLOCAL then we should hangup */
 
        need_flip = 0;
-       for (packet_offset=0; packet_offset < urb->actual_length; packet_offset += PKTSZ) {
+       for (packet_offset = priv->rx_processed; packet_offset < urb->actual_length; packet_offset += PKTSZ) {
+               int length;
+
                /* Compare new line status to the old one, signal if different */
+               /* N.B. packet may be processed more than once, but differences
+                * are only processed once.  */
                if (priv != NULL) {
                        char new_status = data[packet_offset+0] & FTDI_STATUS_B0_MASK;
                        if (new_status != priv->prev_status) {
@@ -1937,6 +1951,35 @@ static void ftdi_process_read (struct usb_serial_port *port)
                        }
                }
 
+               length = min(PKTSZ, urb->actual_length-packet_offset)-2;
+               if (length < 0) {
+                       err("%s - bad packet length: %d", __FUNCTION__, length+2);
+                       length = 0;
+               }
+
+               /* have to make sure we don't overflow the buffer
+                  with tty_insert_flip_char's */
+               if (tty->flip.count+length > TTY_FLIPBUF_SIZE) {
+                       tty_flip_buffer_push(tty);
+                       need_flip = 0;
+
+                       if (tty->flip.count != 0) {
+                               /* flip didn't work, this happens when ftdi_process_read() is
+                                * called from ftdi_unthrottle, because TTY_DONT_FLIP is set */
+                               dbg("%s - flip buffer push failed", __FUNCTION__);
+                               break;
+                       }
+               }
+               if (priv->rx_flags & THROTTLED) {
+                       dbg("%s - throttled", __FUNCTION__);
+                       break;
+               }
+               if (tty->ldisc.receive_room(tty)-tty->flip.count < length) {
+                       /* break out & wait for throttling/unthrottling to happen */
+                       dbg("%s - receive room low", __FUNCTION__);
+                       break;
+               }
+
                /* Handle errors and break */
                error_flag = TTY_NORMAL;
                /* Although the device uses a bitmask and hence can have multiple */
@@ -1959,13 +2002,8 @@ static void ftdi_process_read (struct usb_serial_port *port)
                        error_flag = TTY_FRAME;
                        dbg("FRAMING error");
                }
-               if (urb->actual_length > packet_offset + 2) {
-                       for (i = 2; (i < PKTSZ) && ((i+packet_offset) < urb->actual_length); ++i) {
-                               /* have to make sure we don't overflow the buffer
-                                 with tty_insert_flip_char's */
-                               if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
-                                       tty_flip_buffer_push(tty);
-                               }
+               if (length > 0) {
+                       for (i = 2; i < length+2; i++) {
                                /* Note that the error flag is duplicated for 
                                   every character received since we don't know
                                   which character it applied to */
@@ -2002,6 +2040,35 @@ static void ftdi_process_read (struct usb_serial_port *port)
                tty_flip_buffer_push(tty);
        }
 
+       if (packet_offset < urb->actual_length) {
+               /* not completely processed - record progress */
+               priv->rx_processed = packet_offset;
+               dbg("%s - incomplete, %d bytes processed, %d remain",
+                               __FUNCTION__, packet_offset,
+                               urb->actual_length - packet_offset);
+               /* check if we were throttled while processing */
+               spin_lock_irqsave(&priv->rx_lock, flags);
+               if (priv->rx_flags & THROTTLED) {
+                       priv->rx_flags |= ACTUALLY_THROTTLED;
+                       spin_unlock_irqrestore(&priv->rx_lock, flags);
+                       dbg("%s - deferring remainder until unthrottled",
+                                       __FUNCTION__);
+                       return;
+               }
+               spin_unlock_irqrestore(&priv->rx_lock, flags);
+               /* if the port is closed stop trying to read */
+               if (port->open_count > 0){
+                       /* delay processing of remainder */
+                       schedule_delayed_work(&priv->rx_work, 1);
+               } else {
+                       dbg("%s - port is closed", __FUNCTION__);
+               }
+               return;
+       }
+
+       /* urb is completely processed */
+       priv->rx_processed = 0;
+
        /* if the port is closed stop trying to read */
        if (port->open_count > 0){
                /* Continue trying to always read  */
@@ -2441,7 +2508,7 @@ static void ftdi_unthrottle (struct usb_serial_port *port)
        spin_unlock_irqrestore(&priv->rx_lock, flags);
 
        if (actually_throttled)
-               ftdi_process_read(port);
+               schedule_work(&priv->rx_work);
 }
 
 static int __init ftdi_init (void)
index a52bb13a9ce4bda03f6ea616e8985735dcafd75f..8866376823a5fd90eca435e80d0062b83e5de5ff 100644 (file)
 
 /* ELV USB Module UO100 (PID sent by Stefan Frings) */
 #define FTDI_ELV_UO100_PID     0xFB58  /* Product Id */
+/* ELV USB Module UM100 (PID sent by Arnim Laeuger) */
+#define FTDI_ELV_UM100_PID     0xFB5A  /* Product Id */
 
 /*
  * Definitions for ID TECH (www.idt-net.com) devices
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
new file mode 100644 (file)
index 0000000..b722175
--- /dev/null
@@ -0,0 +1,729 @@
+/*
+  Option Card (PCMCIA to) USB to Serial Driver
+
+  Copyright (C) 2005  Matthias Urlichs <smurf@smurf.noris.de>
+
+  This driver is free software; you can redistribute it and/or modify
+  it under the terms of Version 2 of the GNU General Public License as
+  published by the Free Software Foundation.
+
+  Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org>
+
+  History:
+
+  2005-05-19  v0.1   Initial version, based on incomplete docs
+                     and analysis of misbehavior of the standard driver
+  2005-05-20  v0.2   Extended the input buffer to avoid losing
+                     random 64-byte chunks of data
+  2005-05-21  v0.3   implemented chars_in_buffer()
+                     turned on low_latency
+                     simplified the code somewhat
+*/
+#define DRIVER_VERSION "v0.3"
+#define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
+#define DRIVER_DESC "Option Card (PC-Card to) USB to Serial Driver"
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/jiffies.h>
+#include <linux/errno.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <linux/module.h>
+#include <linux/usb.h>
+#include "usb-serial.h"
+
+/* Function prototypes */
+static int  option_open (struct usb_serial_port *port, struct file *filp);
+static void option_close (struct usb_serial_port *port, struct file *filp);
+static int  option_startup (struct usb_serial *serial);
+static void option_shutdown (struct usb_serial *serial);
+static void option_rx_throttle (struct usb_serial_port *port);
+static void option_rx_unthrottle (struct usb_serial_port *port);
+static int  option_write_room (struct usb_serial_port *port);
+
+static void option_instat_callback(struct urb *urb, struct pt_regs *regs);
+
+
+static int  option_write (struct usb_serial_port *port,
+                          const unsigned char *buf, int count);
+
+static int  option_chars_in_buffer (struct usb_serial_port *port);
+static int  option_ioctl (struct usb_serial_port *port, struct file *file,
+                          unsigned int cmd, unsigned long arg);
+static void option_set_termios (struct usb_serial_port *port,
+                                struct termios *old);
+static void option_break_ctl (struct usb_serial_port *port, int break_state);
+static int  option_tiocmget (struct usb_serial_port *port, struct file *file);
+static int  option_tiocmset (struct usb_serial_port *port, struct file *file,
+                             unsigned int set, unsigned int clear);
+static int  option_send_setup (struct usb_serial_port *port);
+
+/* Vendor and product IDs */
+#define OPTION_VENDOR_ID               0x0AF0
+
+#define        OPTION_PRODUCT_OLD              0x5000
+#define        OPTION_PRODUCT_WLAN             0x6000
+
+static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_WLAN) },
+       { } /* Terminating entry */
+};
+
+MODULE_DEVICE_TABLE(usb, option_ids);
+
+static struct usb_driver option_driver = {
+       .owner      = THIS_MODULE,
+       .name       = "option",
+       .probe      = usb_serial_probe,
+       .disconnect = usb_serial_disconnect,
+       .id_table   = option_ids,
+};
+
+/* The card has three separate interfaces, wich the serial driver
+ * recognizes separately, thus num_port=1.
+ */
+static struct usb_serial_device_type option_3port_device = {
+       .owner                  = THIS_MODULE,
+       .name                   = "Option 3-port card",
+       .short_name             = "option",
+       .id_table               = option_ids,
+       .num_interrupt_in       = NUM_DONT_CARE,
+       .num_bulk_in            = NUM_DONT_CARE,
+       .num_bulk_out           = NUM_DONT_CARE,
+       .num_ports              = 1, /* 3 */
+       .open                   = option_open,
+       .close                  = option_close,
+       .write                  = option_write,
+       .write_room             = option_write_room,
+       .chars_in_buffer        = option_chars_in_buffer,
+       .throttle               = option_rx_throttle,
+       .unthrottle             = option_rx_unthrottle,
+       .ioctl                  = option_ioctl,
+       .set_termios            = option_set_termios,
+       .break_ctl              = option_break_ctl,
+       .tiocmget               = option_tiocmget,
+       .tiocmset               = option_tiocmset,
+       .attach                 = option_startup,
+       .shutdown               = option_shutdown,
+       .read_int_callback      = option_instat_callback,
+};
+
+static int debug;
+
+/* per port private data */
+
+#define N_IN_URB       4
+#define N_OUT_URB      1
+#define IN_BUFLEN      1024
+#define OUT_BUFLEN     1024
+
+struct option_port_private {
+       /* Input endpoints and buffer for this port */
+       struct urb      *in_urbs[N_IN_URB];
+       char            in_buffer[N_IN_URB][IN_BUFLEN];
+       /* Output endpoints and buffer for this port */
+       struct urb      *out_urbs[N_OUT_URB];
+       char            out_buffer[N_OUT_URB][OUT_BUFLEN];
+
+       /* Settings for the port */
+       int             rts_state;      /* Handshaking pins (outputs) */
+       int             dtr_state;
+       int             cts_state;      /* Handshaking pins (inputs) */
+       int             dsr_state;
+       int             dcd_state;
+       int             ri_state;
+       // int          break_on;
+
+       unsigned long   tx_start_time[N_OUT_URB];
+};
+
+
+/* Functions used by new usb-serial code. */
+static int __init
+option_init (void)
+{
+       int retval;
+       retval = usb_serial_register(&option_3port_device);
+       if (retval)
+               goto failed_3port_device_register;
+       retval = usb_register(&option_driver);
+       if (retval)
+               goto failed_driver_register;
+
+       info(DRIVER_DESC ": " DRIVER_VERSION);
+
+       return 0;
+
+failed_driver_register:
+       usb_serial_deregister (&option_3port_device);
+failed_3port_device_register:
+       return retval;
+}
+
+static void __exit
+option_exit (void)
+{
+       usb_deregister (&option_driver);
+       usb_serial_deregister (&option_3port_device);
+}
+
+module_init(option_init);
+module_exit(option_exit);
+
+static void
+option_rx_throttle (struct usb_serial_port *port)
+{
+       dbg("%s", __FUNCTION__);
+}
+
+
+static void
+option_rx_unthrottle (struct usb_serial_port *port)
+{
+       dbg("%s", __FUNCTION__);
+}
+
+
+static void
+option_break_ctl (struct usb_serial_port *port, int break_state)
+{
+       /* Unfortunately, I don't know how to send a break */
+       dbg("%s", __FUNCTION__);
+}
+
+
+static void
+option_set_termios (struct usb_serial_port *port,
+                                    struct termios *old_termios)
+{
+       dbg("%s", __FUNCTION__);
+
+       option_send_setup(port);
+}
+
+static int
+option_tiocmget(struct usb_serial_port *port, struct file *file)
+{
+       unsigned int                    value;
+       struct option_port_private      *portdata;
+
+       portdata = usb_get_serial_port_data(port);
+
+       value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
+               ((portdata->dtr_state) ? TIOCM_DTR : 0) |
+               ((portdata->cts_state) ? TIOCM_CTS : 0) |
+               ((portdata->dsr_state) ? TIOCM_DSR : 0) |
+               ((portdata->dcd_state) ? TIOCM_CAR : 0) |
+               ((portdata->ri_state) ? TIOCM_RNG : 0);
+
+       return value;
+}
+
+static int
+option_tiocmset (struct usb_serial_port *port, struct file *file,
+                 unsigned int set, unsigned int clear)
+{
+       struct option_port_private      *portdata;
+
+       portdata = usb_get_serial_port_data(port);
+
+       if (set & TIOCM_RTS)
+               portdata->rts_state = 1;
+       if (set & TIOCM_DTR)
+               portdata->dtr_state = 1;
+
+       if (clear & TIOCM_RTS)
+               portdata->rts_state = 0;
+       if (clear & TIOCM_DTR)
+               portdata->dtr_state = 0;
+       return option_send_setup(port);
+}
+
+static int
+option_ioctl (struct usb_serial_port *port, struct file *file,
+              unsigned int cmd, unsigned long arg)
+{
+       return -ENOIOCTLCMD;
+}
+
+/* Write */
+static int
+option_write(struct usb_serial_port *port,
+                        const unsigned char *buf, int count)
+{
+       struct option_port_private      *portdata;
+       int                             i;
+       int                             left, todo;
+       struct urb                      *this_urb = NULL; /* spurious */
+       int                             err;
+
+       portdata = usb_get_serial_port_data(port);
+
+       dbg("%s: write (%d chars)", __FUNCTION__, count);
+
+#if 0
+       spin_lock(&port->lock);
+       if (port->write_urb_busy) {
+               spin_unlock(&port->lock);
+               dbg("%s: already writing", __FUNCTION__);
+               return 0;
+       }
+       port->write_urb_busy = 1;
+       spin_unlock(&port->lock);
+#endif
+
+       i = 0;
+       left = count;
+       while (left>0) {
+               todo = left;
+               if (todo > OUT_BUFLEN)
+                       todo = OUT_BUFLEN;
+
+               for (;i < N_OUT_URB; i++) {
+                       /* Check we have a valid urb/endpoint before we use it... */
+                       this_urb = portdata->out_urbs[i];
+                       if (this_urb->status != -EINPROGRESS)
+                               break;
+                       if (this_urb->transfer_flags & URB_ASYNC_UNLINK)
+                               continue;
+                       if (time_before(jiffies, portdata->tx_start_time[i] + 10 * HZ))
+                               continue;
+                       this_urb->transfer_flags |= URB_ASYNC_UNLINK;
+                       usb_unlink_urb(this_urb);
+               }
+
+               if (i == N_OUT_URB) {
+                       /* no bulk out free! */
+                       dbg("%s: no output urb -- left %d", __FUNCTION__,count-left);
+#if 0
+                       port->write_urb_busy = 0;
+#endif
+                       return count-left;
+               }
+
+               dbg("%s: endpoint %d buf %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe), i);
+
+               memcpy (this_urb->transfer_buffer, buf, todo);
+
+               /* send the data out the bulk port */
+               this_urb->transfer_buffer_length = todo;
+
+               this_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
+               this_urb->dev = port->serial->dev;
+               err = usb_submit_urb(this_urb, GFP_ATOMIC);
+               if (err) {
+                       dbg("usb_submit_urb %p (write bulk) failed (%d,, has %d)", this_urb, err, this_urb->status);
+                       continue;
+               }
+               portdata->tx_start_time[i] = jiffies;
+               buf += todo;
+               left -= todo;
+       }
+
+       count -= left;
+#if 0
+       port->write_urb_busy = 0;
+#endif
+       dbg("%s: wrote (did %d)", __FUNCTION__, count);
+       return count;
+}
+
+static void
+option_indat_callback (struct urb *urb, struct pt_regs *regs)
+{
+       int     i, err;
+       int endpoint;
+       struct usb_serial_port *port;
+       struct tty_struct *tty;
+       unsigned char *data = urb->transfer_buffer;
+
+       dbg("%s: %p", __FUNCTION__, urb);
+
+       endpoint = usb_pipeendpoint(urb->pipe);
+       port = (struct usb_serial_port *) urb->context;
+
+       if (urb->status) {
+               dbg("%s: nonzero status: %d on endpoint %02x.",
+                   __FUNCTION__, urb->status, endpoint);
+       } else {
+               tty = port->tty;
+               if (urb->actual_length) {
+                       for (i = 0; i < urb->actual_length ; ++i) {
+                               if (tty->flip.count >= TTY_FLIPBUF_SIZE)
+                                       tty_flip_buffer_push(tty);
+                               tty_insert_flip_char(tty, data[i], 0);
+                       }
+                       tty_flip_buffer_push(tty);
+               } else {
+                       dbg("%s: empty read urb received", __FUNCTION__);
+               }
+
+               /* Resubmit urb so we continue receiving */
+               if (port->open_count && urb->status != -ESHUTDOWN) {
+                       err = usb_submit_urb(urb, GFP_ATOMIC);
+                       if (err)
+                               printk(KERN_ERR "%s: resubmit read urb failed. (%d)", __FUNCTION__, err);
+               }
+       }
+       return;
+}
+
+static void
+option_outdat_callback (struct urb *urb, struct pt_regs *regs)
+{
+       struct usb_serial_port *port;
+
+       dbg("%s", __FUNCTION__);
+
+       port = (struct usb_serial_port *) urb->context;
+
+       if (port->open_count)
+               schedule_work(&port->work);
+}
+
+static void
+option_instat_callback (struct urb *urb, struct pt_regs *regs)
+{
+       int err;
+       struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
+       struct option_port_private *portdata = usb_get_serial_port_data(port);
+       struct usb_serial *serial = port->serial;
+
+       dbg("%s", __FUNCTION__);
+       dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata);
+
+       if (urb->status == 0) {
+               struct usb_ctrlrequest *req_pkt =
+                               (struct usb_ctrlrequest *)urb->transfer_buffer;
+
+               if (!req_pkt) {
+                       dbg("%s: NULL req_pkt\n", __FUNCTION__);
+                       return;
+               }
+               if ((req_pkt->bRequestType == 0xA1) && (req_pkt->bRequest == 0x20)) {
+                       int old_dcd_state;
+                       unsigned char signals = *((unsigned char *)
+                                       urb->transfer_buffer + sizeof(struct usb_ctrlrequest));
+
+                       dbg("%s: signal x%x", __FUNCTION__, signals);
+
+                       old_dcd_state = portdata->dcd_state;
+                       portdata->cts_state = 1;
+                       portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
+                       portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
+                       portdata->ri_state = ((signals & 0x08) ? 1 : 0);
+
+                       if (port->tty && !C_CLOCAL(port->tty)
+                                       && old_dcd_state && !portdata->dcd_state) {
+                               tty_hangup(port->tty);
+                       }
+               } else
+                       dbg("%s: type %x req %x", __FUNCTION__, req_pkt->bRequestType,req_pkt->bRequest);
+       } else
+               dbg("%s: error %d", __FUNCTION__, urb->status);
+
+       /* Resubmit urb so we continue receiving IRQ data */
+       if (urb->status != -ESHUTDOWN) {
+               urb->dev = serial->dev;
+               err = usb_submit_urb(urb, GFP_ATOMIC);
+               if (err)
+                       dbg("%s: resubmit intr urb failed. (%d)", __FUNCTION__, err);
+       }
+}
+
+
+static int
+option_write_room (struct usb_serial_port *port)
+{
+       struct option_port_private *portdata;
+       int i;
+       int data_len = 0;
+       struct urb *this_urb;
+
+       portdata = usb_get_serial_port_data(port);
+
+       for (i=0; i < N_OUT_URB; i++)
+               this_urb = portdata->out_urbs[i];
+               if (this_urb && this_urb->status != -EINPROGRESS)
+                       data_len += OUT_BUFLEN;
+
+       dbg("%s: %d", __FUNCTION__, data_len);
+       return data_len;
+}
+
+
+static int
+option_chars_in_buffer (struct usb_serial_port *port)
+{
+       struct option_port_private *portdata;
+       int i;
+       int data_len = 0;
+       struct urb *this_urb;
+
+       portdata = usb_get_serial_port_data(port);
+
+       for (i=0; i < N_OUT_URB; i++)
+               this_urb = portdata->out_urbs[i];
+               if (this_urb && this_urb->status == -EINPROGRESS)
+                       data_len += this_urb->transfer_buffer_length;
+
+       dbg("%s: %d", __FUNCTION__, data_len);
+       return data_len;
+}
+
+
+static int
+option_open (struct usb_serial_port *port, struct file *filp)
+{
+       struct option_port_private      *portdata;
+       struct usb_serial               *serial = port->serial;
+       int                             i, err;
+       struct urb                      *urb;
+
+       portdata = usb_get_serial_port_data(port);
+
+       dbg("%s", __FUNCTION__);
+
+       /* Set some sane defaults */
+       portdata->rts_state = 1;
+       portdata->dtr_state = 1;
+
+       /* Reset low level data toggle and start reading from endpoints */
+       for (i = 0; i < N_IN_URB; i++) {
+               urb = portdata->in_urbs[i];
+               if (! urb)
+                       continue;
+               if (urb->dev != serial->dev) {
+                       dbg("%s: dev %p != %p", __FUNCTION__, urb->dev, serial->dev);
+                       continue;
+               }
+
+               /* make sure endpoint data toggle is synchronized with the device */
+
+               usb_clear_halt(urb->dev, urb->pipe);
+
+               err = usb_submit_urb(urb, GFP_KERNEL);
+               if (err) {
+                       dbg("%s: submit urb %d failed (%d) %d", __FUNCTION__, i, err,
+                               urb->transfer_buffer_length);
+               }
+       }
+
+       /* Reset low level data toggle on out endpoints */
+       for (i = 0; i < N_OUT_URB; i++) {
+               urb = portdata->out_urbs[i];
+               if (! urb)
+                       continue;
+               urb->dev = serial->dev;
+               /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), 0); */
+       }
+
+       port->tty->low_latency = 1;
+
+       option_send_setup(port);
+
+       return (0);
+}
+
+static inline void
+stop_urb(struct urb *urb)
+{
+       if (urb && urb->status == -EINPROGRESS) {
+               urb->transfer_flags &= ~URB_ASYNC_UNLINK;
+               usb_kill_urb(urb);
+       }
+}
+
+static void
+option_close(struct usb_serial_port *port, struct file *filp)
+{
+       int                     i;
+       struct usb_serial       *serial = port->serial;
+       struct option_port_private      *portdata;
+
+       dbg("%s", __FUNCTION__);
+       portdata = usb_get_serial_port_data(port);
+
+       portdata->rts_state = 0;
+       portdata->dtr_state = 0;
+
+       if (serial->dev) {
+               option_send_setup(port);
+
+               /* Stop reading/writing urbs */
+               for (i = 0; i < N_IN_URB; i++)
+                       stop_urb(portdata->in_urbs[i]);
+               for (i = 0; i < N_OUT_URB; i++)
+                       stop_urb(portdata->out_urbs[i]);
+       }
+       port->tty = NULL;
+}
+
+
+/* Helper functions used by option_setup_urbs */
+static struct urb *
+option_setup_urb (struct usb_serial *serial, int endpoint,
+                  int dir, void *ctx, char *buf, int len,
+                  void (*callback)(struct urb *, struct pt_regs *regs))
+{
+       struct urb *urb;
+
+       if (endpoint == -1)
+               return NULL;            /* endpoint not needed */
+
+       urb = usb_alloc_urb(0, GFP_KERNEL);             /* No ISO */
+       if (urb == NULL) {
+               dbg("%s: alloc for endpoint %d failed.", __FUNCTION__, endpoint);
+               return NULL;
+       }
+
+               /* Fill URB using supplied data. */
+       usb_fill_bulk_urb(urb, serial->dev,
+                     usb_sndbulkpipe(serial->dev, endpoint) | dir,
+                     buf, len, callback, ctx);
+
+       return urb;
+}
+
+/* Setup urbs */
+static void
+option_setup_urbs(struct usb_serial *serial)
+{
+       int                             j;
+       struct usb_serial_port          *port;
+       struct option_port_private      *portdata;
+
+       dbg("%s", __FUNCTION__);
+
+       port = serial->port[0];
+       portdata = usb_get_serial_port_data(port);
+
+       /* Do indat endpoints first */
+       for (j = 0; j <= N_IN_URB; ++j) {
+               portdata->in_urbs[j] = option_setup_urb (serial,
+                  port->bulk_in_endpointAddress, USB_DIR_IN, port,
+                  portdata->in_buffer[j], IN_BUFLEN, option_indat_callback);
+       }
+
+       /* outdat endpoints */
+       for (j = 0; j <= N_OUT_URB; ++j) {
+               portdata->out_urbs[j] = option_setup_urb (serial,
+                  port->bulk_out_endpointAddress, USB_DIR_OUT, port,
+                  portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback);
+       }
+}
+
+
+static int
+option_send_setup(struct usb_serial_port *port)
+{
+       struct usb_serial *serial = port->serial;
+       struct option_port_private *portdata;
+
+       dbg("%s", __FUNCTION__);
+
+       portdata = usb_get_serial_port_data(port);
+
+       if (port->tty) {
+               int val = 0;
+               if (portdata->dtr_state)
+                       val |= 0x01;
+               if (portdata->rts_state)
+                       val |= 0x02;
+
+               return usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
+                                       0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
+       }
+
+       return 0;
+}
+
+
+static int
+option_startup (struct usb_serial *serial)
+{
+       int                             i, err;
+       struct usb_serial_port          *port;
+       struct option_port_private      *portdata;
+
+       dbg("%s", __FUNCTION__);
+
+       /* Now setup per port private data */
+       for (i = 0; i < serial->num_ports; i++) {
+               port = serial->port[i];
+               portdata = kmalloc(sizeof(struct option_port_private), GFP_KERNEL);
+               if (!portdata) {
+                       dbg("%s: kmalloc for option_port_private (%d) failed!.", __FUNCTION__, i);
+                       return (1);
+               }
+               memset(portdata, 0, sizeof(struct option_port_private));
+
+               usb_set_serial_port_data(port, portdata);
+
+               if (! port->interrupt_in_urb)
+                       continue;
+               err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
+               if (err)
+                       dbg("%s: submit irq_in urb failed %d", __FUNCTION__, err);
+       }
+
+       option_setup_urbs(serial);
+
+       return (0);
+}
+
+static void
+option_shutdown (struct usb_serial *serial)
+{
+       int                             i, j;
+       struct usb_serial_port          *port;
+       struct option_port_private      *portdata;
+
+       dbg("%s", __FUNCTION__);
+
+       /* Stop reading/writing urbs */
+       for (i = 0; i < serial->num_ports; ++i) {
+               port = serial->port[i];
+               portdata = usb_get_serial_port_data(port);
+               for (j = 0; j < N_IN_URB; j++)
+                       stop_urb(portdata->in_urbs[j]);
+               for (j = 0; j < N_OUT_URB; j++)
+                       stop_urb(portdata->out_urbs[j]);
+       }
+
+       /* Now free them */
+       for (i = 0; i < serial->num_ports; ++i) {
+               port = serial->port[i];
+               portdata = usb_get_serial_port_data(port);
+
+               for (j = 0; j < N_IN_URB; j++) {
+                       if (portdata->in_urbs[j]) {
+                               usb_free_urb(portdata->in_urbs[j]);
+                               portdata->in_urbs[j] = NULL;
+                       }
+               }
+               for (j = 0; j < N_OUT_URB; j++) {
+                       if (portdata->out_urbs[j]) {
+                               usb_free_urb(portdata->out_urbs[j]);
+                               portdata->out_urbs[j] = NULL;
+                       }
+               }
+       }
+
+       /* Now free per port private data */
+       for (i = 0; i < serial->num_ports; i++) {
+               port = serial->port[i];
+               kfree(usb_get_serial_port_data(port));
+       }
+}
+
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_DESC);
+MODULE_VERSION(DRIVER_VERSION);
+MODULE_LICENSE("GPL");
+
+module_param(debug, bool, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(debug, "Debug messages");
+
index 4536f63faaeaa299ffd6c719e23660d401f87f0f..5da76dd8fb285681d4f5774b2468dc14794ec910 100644 (file)
@@ -1297,13 +1297,6 @@ static int __init usb_serial_init(void)
                goto exit_bus;
        }
 
-       /* register the generic driver, if we should */
-       result = usb_serial_generic_register(debug);
-       if (result < 0) {
-               err("%s - registering generic driver failed", __FUNCTION__);
-               goto exit_generic;
-       }
-
        usb_serial_tty_driver->owner = THIS_MODULE;
        usb_serial_tty_driver->driver_name = "usbserial";
        usb_serial_tty_driver->devfs_name = "usb/tts/";
@@ -1329,17 +1322,24 @@ static int __init usb_serial_init(void)
                goto exit_tty;
        }
 
+       /* register the generic driver, if we should */
+       result = usb_serial_generic_register(debug);
+       if (result < 0) {
+               err("%s - registering generic driver failed", __FUNCTION__);
+               goto exit_generic;
+       }
+
        info(DRIVER_DESC " " DRIVER_VERSION);
 
        return result;
 
+exit_generic:
+       usb_deregister(&usb_serial_driver);
+
 exit_tty:
        tty_unregister_driver(usb_serial_tty_driver);
 
 exit_reg_driver:
-       usb_serial_generic_deregister();
-
-exit_generic:
        bus_unregister(&usb_serial_bus_type);
 
 exit_bus:
index 22e48a2b0bd186879f0e0ae6f5001560f382f5f1..e43eddc3d44ba7891a11df4b66faca5282f611ca 100644 (file)
@@ -233,13 +233,11 @@ static int command_abort(struct scsi_cmnd *srb)
                set_bit(US_FLIDX_ABORTING, &us->flags);
                usb_stor_stop_transport(us);
        }
-       scsi_unlock(us_to_host(us));
 
        /* Wait for the aborted command to finish */
        wait_for_completion(&us->notify);
 
        /* Reacquire the lock and allow USB transfers to resume */
-       scsi_lock(us_to_host(us));
        clear_bit(US_FLIDX_ABORTING, &us->flags);
        clear_bit(US_FLIDX_TIMED_OUT, &us->flags);
        return SUCCESS;
@@ -255,8 +253,6 @@ static int device_reset(struct scsi_cmnd *srb)
 
        US_DEBUGP("%s called\n", __FUNCTION__);
 
-       scsi_unlock(us_to_host(us));
-
        /* lock the device pointers and do the reset */
        down(&(us->dev_semaphore));
        if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) {
@@ -266,8 +262,6 @@ static int device_reset(struct scsi_cmnd *srb)
                result = us->transport_reset(us);
        up(&(us->dev_semaphore));
 
-       /* lock the host for the return */
-       scsi_lock(us_to_host(us));
        return result;
 }
 
@@ -282,8 +276,6 @@ static int bus_reset(struct scsi_cmnd *srb)
 
        US_DEBUGP("%s called\n", __FUNCTION__);
 
-       scsi_unlock(us_to_host(us));
-
        /* The USB subsystem doesn't handle synchronisation between
         * a device's several drivers. Therefore we reset only devices
         * with just one interface, which we of course own. */
@@ -310,7 +302,6 @@ static int bus_reset(struct scsi_cmnd *srb)
        up(&(us->dev_semaphore));
 
        /* lock the host for the return */
-       scsi_lock(us_to_host(us));
        return result < 0 ? FAILED : SUCCESS;
 }
 
@@ -407,7 +398,7 @@ US_DO_ALL_FLAGS
  ***********************************************************************/
 
 /* Output routine for the sysfs max_sectors file */
-static ssize_t show_max_sectors(struct device *dev, char *buf)
+static ssize_t show_max_sectors(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct scsi_device *sdev = to_scsi_device(dev);
 
@@ -415,7 +406,7 @@ static ssize_t show_max_sectors(struct device *dev, char *buf)
 }
 
 /* Input routine for the sysfs max_sectors file */
-static ssize_t store_max_sectors(struct device *dev, const char *buf,
+static ssize_t store_max_sectors(struct device *dev, struct device_attribute *attr, const char *buf,
                size_t count)
 {
        struct scsi_device *sdev = to_scsi_device(dev);
index d2891f475793678078ce6fffa3326d5bbe6bfaa3..9fcc7bd1fbe427f2f55dd1dd4a774cccc617e93b 100644 (file)
@@ -862,6 +862,15 @@ UNUSUAL_DEV(  0x090a, 0x1001, 0x0100, 0x0100,
                US_SC_DEVICE, US_PR_BULK, NULL,
                US_FL_NEED_OVERRIDE ),
 
+/* Reported by Filippo Bardelli <filibard@libero.it>
+ * The device reports a subclass of RBC, which is wrong.
+ */
+UNUSUAL_DEV(  0x090a, 0x1050, 0x0100, 0x0100,
+               "Trumpion Microelectronics, Inc.",
+               "33520 USB Digital Voice Recorder",
+               US_SC_UFI, US_PR_DEVICE, NULL,
+               0),
+
 /* Trumpion Microelectronics MP3 player (felipe_alfaro@linuxmail.org) */
 UNUSUAL_DEV( 0x090a, 0x1200, 0x0000, 0x9999,
                "Trumpion",
index 6be8fbec0a0e2e1d454bc1513df3eba8fa49d248..04d3120f72368e1186fc64bbe97b082a23394daa 100644 (file)
@@ -322,6 +322,22 @@ config FB_FM2
          This is the frame buffer device driver for the Amiga FrameMaster
          card from BSC (exhibited 1992 but not shipped as a CBM product).
 
+config FB_ARC
+       tristate "Arc Monochrome LCD board support"
+       depends on FB && X86
+       select FB_CFB_FILLRECT
+       select FB_CFB_COPYAREA
+       select FB_CFB_IMAGEBLIT
+       select FB_SOFT_CURSOR
+       help
+         This enables support for the Arc Monochrome LCD board. The board
+         is based on the KS-108 lcd controller and is typically a matrix
+         of 2*n chips. This driver was tested with a 128x64 panel. This
+         driver supports it for use with x86 SBCs through a 16 bit GPIO
+         interface (8 bit data, 8 bit control). If you anticpate using
+         this driver, say Y or M; otherwise say N. You must specify the
+         GPIO IO address to be used for setting control and data.
+
 config FB_ATARI
        bool "Atari native chipset support"
        depends on (FB = y) && ATARI && BROKEN
index bd8dc0ffe723d9070b054af1e74703b053d3da75..b018df4e95c84377c13ffda88e03dde02f26e467 100644 (file)
@@ -21,6 +21,7 @@ obj-$(CONFIG_FB_MACMODES)      += macmodes.o
 # Hardware specific drivers go first
 obj-$(CONFIG_FB_RETINAZ3)         += retz3fb.o
 obj-$(CONFIG_FB_AMIGA)            += amifb.o c2p.o
+obj-$(CONFIG_FB_ARC)              += arcfb.o
 obj-$(CONFIG_FB_CLPS711X)         += clps711xfb.o
 obj-$(CONFIG_FB_CYBER)            += cyberfb.o
 obj-$(CONFIG_FB_CYBER2000)        += cyber2000fb.o
diff --git a/drivers/video/arcfb.c b/drivers/video/arcfb.c
new file mode 100644 (file)
index 0000000..d28457e
--- /dev/null
@@ -0,0 +1,684 @@
+/*
+ * linux/drivers/video/arcfb.c -- FB driver for Arc monochrome LCD board
+ *
+ * Copyright (C) 2005, Jaya Kumar <jayalk@intworks.biz>
+ * http://www.intworks.biz/arclcd
+ *
+ * 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.
+ *
+ * Layout is based on skeletonfb.c by James Simmons and Geert Uytterhoeven.
+ *
+ * This driver was written to be used with the Arc LCD board. Arc uses a
+ * set of KS108 chips that control individual 64x64 LCD matrices. The board
+ * can be paneled in a variety of setups such as 2x1=128x64, 4x4=256x256 and
+ * so on. The interface between the board and the host is TTL based GPIO. The
+ * GPIO requirements are 8 writable data lines and 4+n lines for control. On a
+ * GPIO-less system, the board can be tested by connecting the respective sigs
+ * up to a parallel port connector. The driver requires the IO addresses for
+ * data and control GPIO at load time. It is unable to probe for the
+ * existence of the LCD so it must be told at load time whether it should
+ * be enabled or not.
+ *
+ * Todo:
+ * - testing with 4x4
+ * - testing with interrupt hw
+ *
+ * General notes:
+ * - User must set tuhold. It's in microseconds. According to the 108 spec,
+ *   the hold time is supposed to be at least 1 microsecond.
+ * - User must set num_cols=x num_rows=y, eg: x=2 means 128
+ * - User must set arcfb_enable=1 to enable it
+ * - User must set dio_addr=0xIOADDR cio_addr=0xIOADDR
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/tty.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/fb.h>
+#include <linux/init.h>
+#include <linux/arcfb.h>
+
+#include <asm/uaccess.h>
+
+#define floor8(a) (a&(~0x07))
+#define floorXres(a,xres) (a&(~(xres - 1)))
+#define iceil8(a) (((int)((a+7)/8))*8)
+#define ceil64(a) (a|0x3F)
+#define ceilXres(a,xres) (a|(xres - 1))
+
+/* ks108 chipset specific defines and code */
+
+#define KS_SET_DPY_START_LINE  0xC0
+#define KS_SET_PAGE_NUM        0xB8
+#define KS_SET_X               0x40
+#define KS_CEHI                0x01
+#define KS_CELO                0x00
+#define KS_SEL_CMD             0x08
+#define KS_SEL_DATA            0x00
+#define KS_DPY_ON              0x3F
+#define KS_DPY_OFF             0x3E
+#define KS_INTACK              0x40
+#define KS_CLRINT              0x02
+
+struct arcfb_par {
+       unsigned long dio_addr;
+       unsigned long cio_addr;
+       unsigned long c2io_addr;
+       atomic_t ref_count;
+       unsigned char cslut[9];
+       struct fb_info *info;
+       unsigned int irq;
+       spinlock_t lock;
+};
+
+static struct fb_fix_screeninfo arcfb_fix __initdata = {
+       .id =           "arcfb",
+       .type =         FB_TYPE_PACKED_PIXELS,
+       .visual =       FB_VISUAL_MONO01,
+       .xpanstep =     0,
+       .ypanstep =     1,
+       .ywrapstep =    0,
+       .accel =        FB_ACCEL_NONE,
+};
+
+static struct fb_var_screeninfo arcfb_var __initdata = {
+       .xres           = 128,
+       .yres           = 64,
+       .xres_virtual   = 128,
+       .yres_virtual   = 64,
+       .bits_per_pixel = 1,
+       .nonstd         = 1,
+};
+
+static unsigned long num_cols;
+static unsigned long num_rows;
+static unsigned long dio_addr;
+static unsigned long cio_addr;
+static unsigned long c2io_addr;
+static unsigned long splashval;
+static unsigned long tuhold;
+static unsigned int nosplash;
+static unsigned int arcfb_enable;
+static unsigned int irq;
+
+static DECLARE_WAIT_QUEUE_HEAD(arcfb_waitq);
+
+static void ks108_writeb_ctl(struct arcfb_par *par,
+                               unsigned int chipindex, unsigned char value)
+{
+       unsigned char chipselval = par->cslut[chipindex];
+
+       outb(chipselval|KS_CEHI|KS_SEL_CMD, par->cio_addr);
+       outb(value, par->dio_addr);
+       udelay(tuhold);
+       outb(chipselval|KS_CELO|KS_SEL_CMD, par->cio_addr);
+}
+
+static void ks108_writeb_mainctl(struct arcfb_par *par, unsigned char value)
+{
+
+       outb(value, par->cio_addr);
+       udelay(tuhold);
+}
+
+static unsigned char ks108_readb_ctl2(struct arcfb_par *par)
+{
+       return inb(par->c2io_addr);
+}
+
+static void ks108_writeb_data(struct arcfb_par *par,
+                               unsigned int chipindex, unsigned char value)
+{
+       unsigned char chipselval = par->cslut[chipindex];
+
+       outb(chipselval|KS_CEHI|KS_SEL_DATA, par->cio_addr);
+       outb(value, par->dio_addr);
+       udelay(tuhold);
+       outb(chipselval|KS_CELO|KS_SEL_DATA, par->cio_addr);
+}
+
+static void ks108_set_start_line(struct arcfb_par *par,
+                               unsigned int chipindex, unsigned char y)
+{
+       ks108_writeb_ctl(par, chipindex, KS_SET_DPY_START_LINE|y);
+}
+
+static void ks108_set_yaddr(struct arcfb_par *par,
+                               unsigned int chipindex, unsigned char y)
+{
+       ks108_writeb_ctl(par, chipindex, KS_SET_PAGE_NUM|y);
+}
+
+static void ks108_set_xaddr(struct arcfb_par *par,
+                               unsigned int chipindex, unsigned char x)
+{
+       ks108_writeb_ctl(par, chipindex, KS_SET_X|x);
+}
+
+static void ks108_clear_lcd(struct arcfb_par *par, unsigned int chipindex)
+{
+       int i,j;
+
+       for (i = 0; i <= 8; i++) {
+               ks108_set_yaddr(par, chipindex, i);
+               ks108_set_xaddr(par, chipindex, 0);
+               for (j = 0; j < 64; j++) {
+                       ks108_writeb_data(par, chipindex,
+                               (unsigned char) splashval);
+               }
+       }
+}
+
+/* main arcfb functions */
+
+static int arcfb_open(struct fb_info *info, int user)
+{
+       struct arcfb_par *par = info->par;
+
+       atomic_inc(&par->ref_count);
+       return 0;
+}
+
+static int arcfb_release(struct fb_info *info, int user)
+{
+       struct arcfb_par *par = info->par;
+       int count = atomic_read(&par->ref_count);
+
+       if (!count)
+               return -EINVAL;
+       atomic_dec(&par->ref_count);
+       return 0;
+}
+
+static int arcfb_pan_display(struct fb_var_screeninfo *var,
+                               struct fb_info *info)
+{
+       int i;
+       struct arcfb_par *par = info->par;
+
+       if ((var->vmode & FB_VMODE_YWRAP) && (var->yoffset < 64)
+               && (info->var.yres <= 64)) {
+               for (i = 0; i < num_cols; i++) {
+                       ks108_set_start_line(par, i, var->yoffset);
+               }
+               info->var.yoffset = var->yoffset;
+               return 0;
+       }
+
+       return -EINVAL;
+}
+
+static irqreturn_t arcfb_interrupt(int vec, void *dev_instance,
+               struct pt_regs *regs)
+{
+       struct fb_info *info = dev_instance;
+       unsigned char ctl2status;
+       struct arcfb_par *par = info->par;
+
+       ctl2status = ks108_readb_ctl2(par);
+
+       if (!(ctl2status & KS_INTACK)) /* not arc generated interrupt */
+               return IRQ_NONE;
+
+       ks108_writeb_mainctl(par, KS_CLRINT);
+
+       spin_lock(&par->lock);
+        if (waitqueue_active(&arcfb_waitq)) {
+                wake_up(&arcfb_waitq);
+        }
+       spin_unlock(&par->lock);
+
+       return IRQ_HANDLED;
+}
+
+/*
+ * here we handle a specific page on the lcd. the complexity comes from
+ * the fact that the fb is laidout in 8xX vertical columns. we extract
+ * each write of 8 vertical pixels. then we shift out as we move along
+ * X. That's what rightshift does. bitmask selects the desired input bit.
+ */
+static void arcfb_lcd_update_page(struct arcfb_par *par, unsigned int upper,
+               unsigned int left, unsigned int right, unsigned int distance)
+{
+       unsigned char *src;
+       unsigned int xindex, yindex, chipindex, linesize;
+       int i, count;
+       unsigned char val;
+       unsigned char bitmask, rightshift;
+
+       xindex = left >> 6;
+       yindex = upper >> 6;
+       chipindex = (xindex + (yindex*num_cols));
+
+       ks108_set_yaddr(par, chipindex, upper/8);
+
+       linesize = par->info->var.xres/8;
+       src = par->info->screen_base + (left/8) + (upper * linesize);
+       ks108_set_xaddr(par, chipindex, left);
+
+       bitmask=1;
+       rightshift=0;
+       while (left <= right) {
+               val = 0;
+               for (i = 0; i < 8; i++) {
+                       if ( i > rightshift) {
+                               val |= (*(src + (i*linesize)) & bitmask)
+                                               << (i - rightshift);
+                       } else {
+                               val |= (*(src + (i*linesize)) & bitmask)
+                                                >> (rightshift - i);
+                       }
+               }
+               ks108_writeb_data(par, chipindex, val);
+               left++;
+               count++;
+               if (bitmask == 0x80) {
+                       bitmask = 1;
+                       src++;
+                       rightshift=0;
+               } else {
+                       bitmask <<= 1;
+                       rightshift++;
+               }
+       }
+}
+
+/*
+ * here we handle the entire vertical page of the update. we write across
+ * lcd chips. update_page uses the upper/left values to decide which
+ * chip to select for the right. upper is needed for setting the page
+ * desired for the write.
+ */
+static void arcfb_lcd_update_vert(struct arcfb_par *par, unsigned int top,
+               unsigned int bottom, unsigned int left, unsigned int right)
+{
+       unsigned int distance, upper, lower;
+
+       distance = (bottom - top) + 1;
+       upper = top;
+       lower = top + 7;
+
+       while (distance > 0) {
+               distance -= 8;
+               arcfb_lcd_update_page(par, upper, left, right, 8);
+               upper = lower + 1;
+               lower = upper + 7;
+       }
+}
+
+/*
+ * here we handle horizontal blocks for the update. update_vert will
+ * handle spaning multiple pages. we break out each horizontal
+ * block in to individual blocks no taller than 64 pixels.
+ */
+static void arcfb_lcd_update_horiz(struct arcfb_par *par, unsigned int left,
+                       unsigned int right, unsigned int top, unsigned int h)
+{
+       unsigned int distance, upper, lower;
+
+       distance = h;
+       upper = floor8(top);
+       lower = min(upper + distance - 1, ceil64(upper));
+
+       while (distance > 0) {
+               distance -= ((lower - upper) + 1 );
+               arcfb_lcd_update_vert(par, upper, lower, left, right);
+               upper = lower + 1;
+               lower = min(upper + distance - 1, ceil64(upper));
+       }
+}
+
+/*
+ * here we start the process of spliting out the fb update into
+ * individual blocks of pixels. we end up spliting into 64x64 blocks
+ * and finally down to 64x8 pages.
+ */
+static void arcfb_lcd_update(struct arcfb_par *par, unsigned int dx,
+                       unsigned int dy, unsigned int w, unsigned int h)
+{
+       unsigned int left, right, distance, y;
+
+       /* align the request first */
+       y = floor8(dy);
+       h += dy - y;
+       h = iceil8(h);
+
+       distance = w;
+       left = dx;
+       right = min(left + w - 1, ceil64(left));
+
+       while (distance > 0) {
+               arcfb_lcd_update_horiz(par, left, right, y, h);
+               distance -= ((right - left) + 1);
+               left = right + 1;
+               right = min(left + distance - 1, ceil64(left));
+       }
+}
+
+void arcfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
+{
+       struct arcfb_par *par = info->par;
+
+       cfb_fillrect(info, rect);
+
+       /* update the physical lcd */
+       arcfb_lcd_update(par, rect->dx, rect->dy, rect->width, rect->height);
+}
+
+void arcfb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
+{
+       struct arcfb_par *par = info->par;
+
+       cfb_copyarea(info, area);
+
+       /* update the physical lcd */
+       arcfb_lcd_update(par, area->dx, area->dy, area->width, area->height);
+}
+
+void arcfb_imageblit(struct fb_info *info, const struct fb_image *image)
+{
+       struct arcfb_par *par = info->par;
+
+       cfb_imageblit(info, image);
+
+       /* update the physical lcd */
+       arcfb_lcd_update(par, image->dx, image->dy, image->width,
+                               image->height);
+}
+
+static int arcfb_ioctl(struct inode *inode, struct file *file,
+                         unsigned int cmd, unsigned long arg,
+                         struct fb_info *info)
+{
+       void __user *argp = (void __user *)arg;
+       struct arcfb_par *par = info->par;
+       unsigned long flags;
+
+       switch (cmd) {
+               case FBIO_WAITEVENT:
+               {
+                       DEFINE_WAIT(wait);
+                       /* illegal to wait on arc if no irq will occur */
+                       if (!par->irq)
+                               return -EINVAL;
+
+                       /* wait until the Arc has generated an interrupt
+                        * which will wake us up */
+                       spin_lock_irqsave(&par->lock, flags);
+                       prepare_to_wait(&arcfb_waitq, &wait,
+                                       TASK_INTERRUPTIBLE);
+                       spin_unlock_irqrestore(&par->lock, flags);
+                       schedule();
+                       finish_wait(&arcfb_waitq, &wait);
+               }
+               case FBIO_GETCONTROL2:
+               {
+                       unsigned char ctl2;
+
+                       ctl2 = ks108_readb_ctl2(info->par);
+                       if (copy_to_user(argp, &ctl2, sizeof(ctl2)))
+                               return -EFAULT;
+                       return 0;
+               }
+               default:
+                       return -EINVAL;
+       }
+}
+
+/*
+ * this is the access path from userspace. they can seek and write to
+ * the fb. it's inefficient for them to do anything less than 64*8
+ * writes since we update the lcd in each write() anyway.
+ */
+static ssize_t arcfb_write(struct file *file, const char *buf, size_t count,
+                               loff_t *ppos)
+{
+       /* modded from epson 1355 */
+
+       struct inode *inode;
+       int fbidx;
+       struct fb_info *info;
+       unsigned long p;
+       int err=-EINVAL;
+       unsigned int fbmemlength,x,y,w,h, bitppos, startpos, endpos, bitcount;
+       struct arcfb_par *par;
+       unsigned int xres;
+
+       p = *ppos;
+       inode = file->f_dentry->d_inode;
+       fbidx = iminor(inode);
+       info = registered_fb[fbidx];
+       par = info->par;
+
+       if (!info || !info->screen_base)
+               return -ENODEV;
+
+       xres = info->var.xres;
+       fbmemlength = (xres * info->var.yres)/8;
+
+       if (p > fbmemlength)
+               return -ENOSPC;
+
+       err = 0;
+       if ((count + p) > fbmemlength) {
+               count = fbmemlength - p;
+               err = -ENOSPC;
+       }
+
+       if (count) {
+               char *base_addr;
+
+               base_addr = info->screen_base;
+               count -= copy_from_user(base_addr + p, buf, count);
+               *ppos += count;
+               err = -EFAULT;
+       }
+
+
+       bitppos = p*8;
+       startpos = floorXres(bitppos, xres);
+       endpos = ceilXres((bitppos + (count*8)), xres);
+       bitcount = endpos - startpos;
+
+       x = startpos % xres;
+       y = startpos / xres;
+       w = xres;
+       h = bitcount / xres;
+       arcfb_lcd_update(par, x, y, w, h);
+
+       if (count)
+               return count;
+       return err;
+}
+
+static void arcfb_platform_release(struct device *device)
+{
+}
+
+static struct fb_ops arcfb_ops = {
+       .owner          = THIS_MODULE,
+       .fb_open        = arcfb_open,
+       .fb_write       = arcfb_write,
+       .fb_release     = arcfb_release,
+       .fb_pan_display = arcfb_pan_display,
+       .fb_fillrect    = arcfb_fillrect,
+       .fb_copyarea    = arcfb_copyarea,
+       .fb_imageblit   = arcfb_imageblit,
+       .fb_cursor      = soft_cursor,
+       .fb_ioctl       = arcfb_ioctl,
+};
+
+static int __init arcfb_probe(struct device *device)
+{
+       struct platform_device *dev = to_platform_device(device);
+       struct fb_info *info;
+       int retval = -ENOMEM;
+       int videomemorysize;
+       unsigned char *videomemory;
+       struct arcfb_par *par;
+       int i;
+
+       videomemorysize = (((64*64)*num_cols)*num_rows)/8;
+
+       /* We need a flat backing store for the Arc's
+          less-flat actual paged framebuffer */
+       if (!(videomemory = vmalloc(videomemorysize)))
+               return retval;
+
+       memset(videomemory, 0, videomemorysize);
+
+       info = framebuffer_alloc(sizeof(struct arcfb_par), &dev->dev);
+       if (!info)
+               goto err;
+
+       info->screen_base = (char __iomem *)videomemory;
+       info->fbops = &arcfb_ops;
+
+       info->var = arcfb_var;
+       info->fix = arcfb_fix;
+       par = info->par;
+       par->info = info;
+
+       if (!dio_addr || !cio_addr || !c2io_addr) {
+               printk(KERN_WARNING "no IO addresses supplied\n");
+               goto err1;
+       }
+       par->dio_addr = dio_addr;
+       par->cio_addr = cio_addr;
+       par->c2io_addr = c2io_addr;
+       par->cslut[0] = 0x00;
+       par->cslut[1] = 0x06;
+       info->flags = FBINFO_FLAG_DEFAULT;
+       spin_lock_init(&par->lock);
+       retval = register_framebuffer(info);
+       if (retval < 0)
+               goto err1;
+       dev_set_drvdata(&dev->dev, info);
+       if (irq) {
+               par->irq = irq;
+               if (request_irq(par->irq, &arcfb_interrupt, SA_SHIRQ,
+                               "arcfb", info)) {
+                       printk(KERN_INFO
+                               "arcfb: Failed req IRQ %d\n", par->irq);
+                       goto err1;
+               }
+       }
+       printk(KERN_INFO
+              "fb%d: Arc frame buffer device, using %dK of video memory\n",
+              info->node, videomemorysize >> 10);
+
+       /* this inits the lcd but doesn't clear dirty pixels */
+       for (i = 0; i < num_cols * num_rows; i++) {
+               ks108_writeb_ctl(par, i, KS_DPY_OFF);
+               ks108_set_start_line(par, i, 0);
+               ks108_set_yaddr(par, i, 0);
+               ks108_set_xaddr(par, i, 0);
+               ks108_writeb_ctl(par, i, KS_DPY_ON);
+       }
+
+       /* if we were told to splash the screen, we just clear it */
+       if (!nosplash) {
+               for (i = 0; i < num_cols * num_rows; i++) {
+                       printk(KERN_INFO "fb%d: splashing lcd %d\n",
+                               info->node, i);
+                       ks108_set_start_line(par, i, 0);
+                       ks108_clear_lcd(par, i);
+               }
+       }
+
+       return 0;
+err1:
+       framebuffer_release(info);
+err:
+       vfree(videomemory);
+       return retval;
+}
+
+static int arcfb_remove(struct device *device)
+{
+       struct fb_info *info = dev_get_drvdata(device);
+
+       if (info) {
+               unregister_framebuffer(info);
+               vfree(info->screen_base);
+               framebuffer_release(info);
+       }
+       return 0;
+}
+
+static struct device_driver arcfb_driver = {
+       .name   = "arcfb",
+       .bus    = &platform_bus_type,
+       .probe  = arcfb_probe,
+       .remove = arcfb_remove,
+};
+
+static struct platform_device arcfb_device = {
+       .name   = "arcfb",
+       .id     = 0,
+       .dev    = {
+               .release = arcfb_platform_release,
+       }
+};
+
+static int __init arcfb_init(void)
+{
+       int ret;
+
+       if (!arcfb_enable)
+               return -ENXIO;
+
+       ret = driver_register(&arcfb_driver);
+       if (!ret) {
+               ret = platform_device_register(&arcfb_device);
+               if (ret)
+                       driver_unregister(&arcfb_driver);
+       }
+       return ret;
+
+}
+
+static void __exit arcfb_exit(void)
+{
+       platform_device_unregister(&arcfb_device);
+       driver_unregister(&arcfb_driver);
+}
+
+module_param(num_cols, ulong, 0);
+MODULE_PARM_DESC(num_cols, "Num horiz panels, eg: 2 = 128 bit wide");
+module_param(num_rows, ulong, 0);
+MODULE_PARM_DESC(num_rows, "Num vert panels, eg: 1 = 64 bit high");
+module_param(nosplash, uint, 0);
+MODULE_PARM_DESC(nosplash, "Disable doing the splash screen");
+module_param(arcfb_enable, uint, 0);
+MODULE_PARM_DESC(arcfb_enable, "Enable communication with Arc board");
+module_param(dio_addr, ulong, 0);
+MODULE_PARM_DESC(dio_addr, "IO address for data, eg: 0x480");
+module_param(cio_addr, ulong, 0);
+MODULE_PARM_DESC(cio_addr, "IO address for control, eg: 0x400");
+module_param(c2io_addr, ulong, 0);
+MODULE_PARM_DESC(c2io_addr, "IO address for secondary control, eg: 0x408");
+module_param(splashval, ulong, 0);
+MODULE_PARM_DESC(splashval, "Splash pattern: 0xFF is black, 0x00 is green");
+module_param(tuhold, ulong, 0);
+MODULE_PARM_DESC(tuhold, "Time to hold between strobing data to Arc board");
+module_param(irq, uint, 0);
+MODULE_PARM_DESC(irq, "IRQ for the Arc board");
+
+module_init(arcfb_init);
+module_exit(arcfb_exit);
+
+MODULE_DESCRIPTION("fbdev driver for Arc monochrome LCD board");
+MODULE_AUTHOR("Jaya Kumar");
+MODULE_LICENSE("GPL");
+
index ee25b9e8db60992fd8a6e6d041dc12fb49775a44..47a6b12bc9685af76cb8f844da52b49803f6293a 100644 (file)
@@ -2374,10 +2374,9 @@ static int radeonfb_pci_register (struct pci_dev *pdev,
        } while (   rinfo->fb_base == 0 &&
                  ((rinfo->mapped_vram /=2) >= MIN_MAPPED_VRAM) );
 
-       if (rinfo->fb_base)
-               memset_io(rinfo->fb_base, 0, rinfo->mapped_vram);
-       else {
-               printk (KERN_ERR "radeonfb (%s): cannot map FB\n", pci_name(rinfo->pdev));
+       if (rinfo->fb_base == NULL) {
+               printk (KERN_ERR "radeonfb (%s): cannot map FB\n",
+                       pci_name(rinfo->pdev));
                ret = -EIO;
                goto err_unmap_rom;
        }
index ab98f225fe3ee5246d62dc79bf5228099d81baa6..95e72550d43ff4b373ec3615b57b9399ce574a76 100644 (file)
@@ -423,9 +423,6 @@ chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent)
        pmu_register_sleep_notifier(&chips_sleep_notifier);
 #endif /* CONFIG_PMAC_PBOOK */
 
-       /* Clear the entire framebuffer */
-       memset(p->screen_base, 0, 0x100000);
-
        pci_set_drvdata(dp, p);
        return 0;
 }
index ccf55811d24fd058ecc3a958cf9f8c54ee58621b..e4b91a4b936c9c9125d42eb799973fab6b7aec83 100644 (file)
@@ -153,6 +153,15 @@ config FONT_6x11
          Small console font with Macintosh-style high-half glyphs.  Some Mac
          framebuffer drivers don't support this one at all.
 
+config FONT_7x14
+       bool "console 7x14 font (not supported by all drivers)" if FONTS
+       depends on FRAMEBUFFER_CONSOLE
+       default y if !SPARC32 && !SPARC64 && !FONTS
+       help
+         Console font with characters just a bit smaller than the default.
+         If the standard 8x16 font is a little too big for you, say Y.
+         Otherwise, say N.
+
 config FONT_PEARL_8x8
        bool "Pearl (old m68k) console 8x8 font" if FONTS
        depends on FRAMEBUFFER_CONSOLE
@@ -187,5 +196,13 @@ config FONT_SUN12x22
          big letters (like the letters used in the SPARC PROM). If the
          standard font is unreadable for you, say Y, otherwise say N.
 
+config FONT_10x18
+       bool "console 10x18 font (not supported by all drivers)"
+       depends on FONTS
+       help
+         This is a high resolution console font for machines with very
+         big letters. It fits between the sun 12x22 and the normal 8x16 font.
+         If other fonts are too big or too small for you, say Y, otherwise say N.
+
 endmenu
 
index 33516447f9f2eb4687e82662cc9bb18e93651b2b..b562f6bb9d316d64addc4acc4934e83257bda83f 100644 (file)
@@ -10,6 +10,8 @@ font-objs-$(CONFIG_FONT_SUN12x22)  += font_sun12x22.o
 font-objs-$(CONFIG_FONT_8x8)       += font_8x8.o
 font-objs-$(CONFIG_FONT_8x16)      += font_8x16.o
 font-objs-$(CONFIG_FONT_6x11)      += font_6x11.o
+font-objs-$(CONFIG_FONT_7x14)      += font_7x14.o
+font-objs-$(CONFIG_FONT_10x18)     += font_10x18.o
 font-objs-$(CONFIG_FONT_PEARL_8x8) += font_pearl_8x8.o
 font-objs-$(CONFIG_FONT_ACORN_8x8) += font_acorn_8x8.o
 font-objs-$(CONFIG_FONT_MINI_4x6)  += font_mini_4x6.o
index b28a4b0e395e6ecb62efbf197bc375ae745d25b0..3c731577fed628796423193ca9d99c7be4967671 100644 (file)
@@ -107,13 +107,6 @@ static void bit_putcs(struct vc_data *vc, struct fb_info *info,
                      const unsigned short *s, int count, int yy, int xx,
                      int fg, int bg)
 {
-       void (*move_unaligned)(struct fb_info *info, struct fb_pixmap *buf,
-                              u8 *dst, u32 d_pitch, u8 *src, u32 idx,
-                              u32 height, u32 shift_high, u32 shift_low,
-                              u32 mod);
-       void (*move_aligned)(struct fb_info *info, struct fb_pixmap *buf,
-                            u8 *dst, u32 d_pitch, u8 *src, u32 s_pitch,
-                            u32 height);
        unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
        unsigned int width = (vc->vc_font.width + 7) >> 3;
        unsigned int cellsize = vc->vc_font.height * width;
@@ -141,13 +134,6 @@ static void bit_putcs(struct vc_data *vc, struct fb_info *info,
        image.height = vc->vc_font.height;
        image.depth = 1;
 
-       if (info->pixmap.outbuf && info->pixmap.inbuf) {
-               move_aligned = fb_iomove_buf_aligned;
-               move_unaligned = fb_iomove_buf_unaligned;
-       } else {
-               move_aligned = fb_sysmove_buf_aligned;
-               move_unaligned = fb_sysmove_buf_unaligned;
-       }
        while (count) {
                if (count > maxcnt)
                        cnt = k = maxcnt;
@@ -171,9 +157,9 @@ static void bit_putcs(struct vc_data *vc, struct fb_info *info,
                                        src = buf;
                                }
 
-                               move_unaligned(info, &info->pixmap, dst, pitch,
-                                              src, idx, image.height,
-                                              shift_high, shift_low, mod);
+                               fb_pad_unaligned_buffer(dst, pitch, src, idx,
+                                               image.height, shift_high,
+                                               shift_low, mod);
                                shift_low += mod;
                                dst += (shift_low >= 8) ? width : width - 1;
                                shift_low &= 7;
@@ -189,8 +175,7 @@ static void bit_putcs(struct vc_data *vc, struct fb_info *info,
                                        src = buf;
                                }
 
-                               move_aligned(info, &info->pixmap, dst, pitch,
-                                            src, idx, image.height);
+                               fb_pad_aligned_buffer(dst, pitch, src, idx, image.height);
                                dst += width;
                        }
                }
diff --git a/drivers/video/console/font_10x18.c b/drivers/video/console/font_10x18.c
new file mode 100644 (file)
index 0000000..ff0af96
--- /dev/null
@@ -0,0 +1,5146 @@
+/********************************
+ * adapted from font_sun12x22.c *
+ * by Jurriaan Kalkman 06-2005  *
+ ********************************/
+
+#include <linux/font.h>
+
+#define FONTDATAMAX 9216
+
+static unsigned char fontdata_10x18[FONTDATAMAX] = {
+
+       /* 0 0x00 '^@' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 1 0x01 '^A' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3f, 0x80, /* 0011111110 */
+       0x40, 0x40, /* 0100000001 */
+       0x5b, 0x40, /* 0101101101 */
+       0x40, 0x40, /* 0100000001 */
+       0x44, 0x40, /* 0100010001 */
+       0x44, 0x40, /* 0100010001 */
+       0x51, 0x40, /* 0101000101 */
+       0x4e, 0x40, /* 0100111001 */
+       0x40, 0x40, /* 0100000001 */
+       0x3f, 0x80, /* 0011111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 2 0x02 '^B' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3f, 0x80, /* 0011111110 */
+       0x7f, 0xc0, /* 0111111111 */
+       0x64, 0xc0, /* 0110010011 */
+       0x7f, 0xc0, /* 0111111111 */
+       0x7b, 0xc0, /* 0111101111 */
+       0x7b, 0xc0, /* 0111101111 */
+       0x6e, 0xc0, /* 0110111011 */
+       0x71, 0xc0, /* 0111000111 */
+       0x7f, 0xc0, /* 0111111111 */
+       0x3f, 0x80, /* 0011111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 3 0x03 '^C' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x11, 0x00, /* 0001000100 */
+       0x3b, 0x80, /* 0011101110 */
+       0x7f, 0xc0, /* 0111111111 */
+       0x3f, 0x80, /* 0011111110 */
+       0x3f, 0x80, /* 0011111110 */
+       0x1f, 0x00, /* 0001111100 */
+       0x1f, 0x00, /* 0001111100 */
+       0x0e, 0x00, /* 0000111000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x04, 0x00, /* 0000010000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 4 0x04 '^D' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x04, 0x00, /* 0000010000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x1f, 0x00, /* 0001111100 */
+       0x3f, 0x80, /* 0011111110 */
+       0x1f, 0x00, /* 0001111100 */
+       0x1f, 0x00, /* 0001111100 */
+       0x0e, 0x00, /* 0000111000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x04, 0x00, /* 0000010000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 5 0x05 '^E' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x31, 0x80, /* 0011000110 */
+       0x7b, 0xc0, /* 0111101111 */
+       0x35, 0x80, /* 0011010110 */
+       0x04, 0x00, /* 0000010000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 6 0x06 '^F' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x04, 0x00, /* 0000010000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x1f, 0x00, /* 0001111100 */
+       0x3f, 0x80, /* 0011111110 */
+       0x7f, 0xc0, /* 0111111111 */
+       0x7f, 0xc0, /* 0111111111 */
+       0x35, 0x80, /* 0011010110 */
+       0x04, 0x00, /* 0000010000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 7 0x07 '^G' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 8 0x08 '^H' */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xf3, 0xc0, /* 1111001111 */
+       0xe1, 0xc0, /* 1110000111 */
+       0xe1, 0xc0, /* 1110000111 */
+       0xc0, 0xc0, /* 1100000011 */
+       0xc0, 0xc0, /* 1100000011 */
+       0xe1, 0xc0, /* 1110000111 */
+       0xe1, 0xc0, /* 1110000111 */
+       0xf3, 0xc0, /* 1111001111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+
+       /* 9 0x09 '^I' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x12, 0x00, /* 0001001000 */
+       0x12, 0x00, /* 0001001000 */
+       0x21, 0x00, /* 0010000100 */
+       0x21, 0x00, /* 0010000100 */
+       0x12, 0x00, /* 0001001000 */
+       0x12, 0x00, /* 0001001000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 10 0x0a '^J' */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xf3, 0xc0, /* 1111001111 */
+       0xed, 0xc0, /* 1110110111 */
+       0xed, 0xc0, /* 1110110111 */
+       0xde, 0xc0, /* 1101111011 */
+       0xde, 0xc0, /* 1101111011 */
+       0xed, 0xc0, /* 1110110111 */
+       0xed, 0xc0, /* 1110110111 */
+       0xf3, 0xc0, /* 1111001111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+
+       /* 11 0x0b '^K' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x03, 0xc0, /* 0000001111 */
+       0x06, 0xc0, /* 0000011011 */
+       0x0c, 0xc0, /* 0000110011 */
+       0x3c, 0x00, /* 0011110000 */
+       0x66, 0x00, /* 0110011000 */
+       0xc3, 0x00, /* 1100001100 */
+       0xc3, 0x00, /* 1100001100 */
+       0xc3, 0x00, /* 1100001100 */
+       0x66, 0x00, /* 0110011000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 12 0x0c '^L' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x33, 0x00, /* 0011001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x33, 0x00, /* 0011001100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 13 0x0d '^M' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0f, 0x80, /* 0000111110 */
+       0x08, 0x80, /* 0000100010 */
+       0x0f, 0x80, /* 0000111110 */
+       0x08, 0x00, /* 0000100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x38, 0x00, /* 0011100000 */
+       0x78, 0x00, /* 0111100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 14 0x0e '^N' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0x80, /* 0001111110 */
+       0x10, 0x80, /* 0001000010 */
+       0x1f, 0x80, /* 0001111110 */
+       0x10, 0x80, /* 0001000010 */
+       0x10, 0x80, /* 0001000010 */
+       0x10, 0x80, /* 0001000010 */
+       0x10, 0x80, /* 0001000010 */
+       0x13, 0x80, /* 0001001110 */
+       0x17, 0x80, /* 0001011110 */
+       0x73, 0x00, /* 0111001100 */
+       0xf0, 0x00, /* 1111000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 15 0x0f '^O' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x04, 0x00, /* 0000010000 */
+       0x24, 0x80, /* 0010010010 */
+       0x15, 0x00, /* 0001010100 */
+       0x55, 0x40, /* 0101010101 */
+       0x3f, 0x80, /* 0011111110 */
+       0x0e, 0x00, /* 0000111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x3f, 0x80, /* 0011111110 */
+       0x55, 0x40, /* 0101010101 */
+       0x15, 0x00, /* 0001010100 */
+       0x24, 0x80, /* 0010010010 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 16 0x10 '^P' */
+       0x00, 0x80, /* 0000000010 */
+       0x01, 0x80, /* 0000000110 */
+       0x03, 0x80, /* 0000001110 */
+       0x07, 0x80, /* 0000011110 */
+       0x0f, 0x80, /* 0000111110 */
+       0x1f, 0x80, /* 0001111110 */
+       0x3f, 0x80, /* 0011111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0xff, 0x80, /* 1111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x3f, 0x80, /* 0011111110 */
+       0x1f, 0x80, /* 0001111110 */
+       0x0f, 0x80, /* 0000111110 */
+       0x07, 0x80, /* 0000011110 */
+       0x03, 0x80, /* 0000001110 */
+       0x01, 0x80, /* 0000000110 */
+       0x00, 0x80, /* 0000000010 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 17 0x11 '^Q' */
+       0x40, 0x00, /* 0100000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x70, 0x00, /* 0111000000 */
+       0x78, 0x00, /* 0111100000 */
+       0x7c, 0x00, /* 0111110000 */
+       0x7e, 0x00, /* 0111111000 */
+       0x7f, 0x00, /* 0111111100 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0xc0, /* 0111111111 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x00, /* 0111111100 */
+       0x7e, 0x00, /* 0111111000 */
+       0x7c, 0x00, /* 0111110000 */
+       0x78, 0x00, /* 0111100000 */
+       0x70, 0x00, /* 0111000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x40, 0x00, /* 0100000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 18 0x12 '^R' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x7f, 0x80, /* 0111111110 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x3f, 0x00, /* 0011111100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 19 0x13 '^S' */
+       0x00, 0x00, /* 0000000000 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 20 0x14 '^T' */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0xc0, /* 0001111111 */
+       0x39, 0x80, /* 0011100110 */
+       0x79, 0x80, /* 0111100110 */
+       0x79, 0x80, /* 0111100110 */
+       0x79, 0x80, /* 0111100110 */
+       0x39, 0x80, /* 0011100110 */
+       0x19, 0x80, /* 0001100110 */
+       0x19, 0x80, /* 0001100110 */
+       0x19, 0x80, /* 0001100110 */
+       0x19, 0x80, /* 0001100110 */
+       0x19, 0x80, /* 0001100110 */
+       0x19, 0x80, /* 0001100110 */
+       0x39, 0xc0, /* 0011100111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 21 0x15 '^U' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3e, 0x00, /* 0011111000 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x3e, 0x00, /* 0011111000 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x3e, 0x00, /* 0011111000 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x3e, 0x00, /* 0011111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 22 0x16 '^V' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 23 0x17 '^W' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x7f, 0x80, /* 0111111110 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x3f, 0x00, /* 0011111100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 24 0x18 '^X' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x7f, 0x80, /* 0111111110 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 25 0x19 '^Y' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x3f, 0x00, /* 0011111100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 26 0x1a '^Z' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x04, 0x00, /* 0000010000 */
+       0x06, 0x00, /* 0000011000 */
+       0x07, 0x00, /* 0000011100 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x07, 0x00, /* 0000011100 */
+       0x06, 0x00, /* 0000011000 */
+       0x04, 0x00, /* 0000010000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 27 0x1b '^[' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x08, 0x00, /* 0000100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x38, 0x00, /* 0011100000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x38, 0x00, /* 0011100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 28 0x1c '^\' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 29 0x1d '^]' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x12, 0x00, /* 0001001000 */
+       0x33, 0x00, /* 0011001100 */
+       0x73, 0x80, /* 0111001110 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x73, 0x80, /* 0111001110 */
+       0x33, 0x00, /* 0011001100 */
+       0x12, 0x00, /* 0001001000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 30 0x1e '^^' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x04, 0x00, /* 0000010000 */
+       0x04, 0x00, /* 0000010000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x1f, 0x00, /* 0001111100 */
+       0x3f, 0x80, /* 0011111110 */
+       0x3f, 0x80, /* 0011111110 */
+       0x7f, 0xc0, /* 0111111111 */
+       0x7f, 0xc0, /* 0111111111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 31 0x1f '^_' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0xc0, /* 0111111111 */
+       0x7f, 0xc0, /* 0111111111 */
+       0x3f, 0x80, /* 0011111110 */
+       0x3f, 0x80, /* 0011111110 */
+       0x1f, 0x00, /* 0001111100 */
+       0x1f, 0x00, /* 0001111100 */
+       0x0e, 0x00, /* 0000111000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x04, 0x00, /* 0000010000 */
+       0x04, 0x00, /* 0000010000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 32 0x20 ' ' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 33 0x21 '!' */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 34 0x22 '"' */
+       0x00, 0x00, /* 0000000000 */
+       0x63, 0x00, /* 0110001100 */
+       0xf7, 0x80, /* 1111011110 */
+       0xf7, 0x80, /* 1111011110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x63, 0x00, /* 0110001100 */
+       0x42, 0x00, /* 0100001000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 35 0x23 '#' */
+       0x00, 0x00, /* 0000000000 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 36 0x24 '$' */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x3e, 0x00, /* 0011111000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x6f, 0x80, /* 0110111110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6c, 0x80, /* 0110110010 */
+       0x3c, 0x00, /* 0011110000 */
+       0x0f, 0x00, /* 0000111100 */
+       0x0d, 0x80, /* 0000110110 */
+       0x4d, 0x80, /* 0100110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x7f, 0x00, /* 0111111100 */
+       0x3e, 0x00, /* 0011111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 37 0x25 '%' */
+       0x00, 0x00, /* 0000000000 */
+       0x31, 0x80, /* 0011000110 */
+       0x7b, 0x00, /* 0111101100 */
+       0x7b, 0x00, /* 0111101100 */
+       0x36, 0x00, /* 0011011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x1b, 0x00, /* 0001101100 */
+       0x37, 0x80, /* 0011011110 */
+       0x37, 0x80, /* 0011011110 */
+       0x63, 0x00, /* 0110001100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 38 0x26 '&' */
+       0x00, 0x00, /* 0000000000 */
+       0x07, 0x00, /* 0000011100 */
+       0x0f, 0x80, /* 0000111110 */
+       0x19, 0x80, /* 0001100110 */
+       0x19, 0x80, /* 0001100110 */
+       0x0f, 0x80, /* 0000111110 */
+       0x1e, 0x00, /* 0001111000 */
+       0x3e, 0x00, /* 0011111000 */
+       0x76, 0x00, /* 0111011000 */
+       0x66, 0x40, /* 0110011001 */
+       0x63, 0xc0, /* 0110001111 */
+       0x63, 0x80, /* 0110001110 */
+       0x63, 0x00, /* 0110001100 */
+       0x3f, 0x80, /* 0011111110 */
+       0x1c, 0xc0, /* 0001110011 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 39 0x27 ''' */
+       0x00, 0x00, /* 0000000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x78, 0x00, /* 0111100000 */
+       0x78, 0x00, /* 0111100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x20, 0x00, /* 0010000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 40 0x28 '(' */
+       0x00, 0x00, /* 0000000000 */
+       0x03, 0x00, /* 0000001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x06, 0x00, /* 0000011000 */
+       0x03, 0x00, /* 0000001100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 41 0x29 ')' */
+       0x00, 0x00, /* 0000000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 42 0x2a '*' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x4c, 0x80, /* 0100110010 */
+       0x6d, 0x80, /* 0110110110 */
+       0x3f, 0x00, /* 0011111100 */
+       0x7f, 0x80, /* 0111111110 */
+       0x3f, 0x00, /* 0011111100 */
+       0x6d, 0x80, /* 0110110110 */
+       0x4c, 0x80, /* 0100110010 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 43 0x2b '+' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 44 0x2c ',' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x78, 0x00, /* 0111100000 */
+       0x78, 0x00, /* 0111100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x40, 0x00, /* 0100000000 */
+
+       /* 45 0x2d '-' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 46 0x2e '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 47 0x2f '/' */
+       0x00, 0x00, /* 0000000000 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 48 0x30 '0' */
+       0x00, 0x00, /* 0000000000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x23, 0x00, /* 0010001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x63, 0x80, /* 0110001110 */
+       0x65, 0x80, /* 0110010110 */
+       0x65, 0x80, /* 0110010110 */
+       0x69, 0x80, /* 0110100110 */
+       0x69, 0x80, /* 0110100110 */
+       0x71, 0x80, /* 0111000110 */
+       0x61, 0x00, /* 0110000100 */
+       0x31, 0x00, /* 0011000100 */
+       0x3e, 0x00, /* 0011111000 */
+       0x1c, 0x00, /* 0001110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 49 0x31 '1' */
+       0x00, 0x00, /* 0000000000 */
+       0x04, 0x00, /* 0000010000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x1c, 0x00, /* 0001110000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x6c, 0x00, /* 0110110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 50 0x32 '2' */
+       0x00, 0x00, /* 0000000000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x63, 0x80, /* 0110001110 */
+       0x41, 0x80, /* 0100000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x03, 0x00, /* 0000001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x80, /* 0011000010 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 51 0x33 '3' */
+       0x00, 0x00, /* 0000000000 */
+       0x1c, 0x00, /* 0001110000 */
+       0x3e, 0x00, /* 0011111000 */
+       0x47, 0x00, /* 0100011100 */
+       0x03, 0x00, /* 0000001100 */
+       0x07, 0x00, /* 0000011100 */
+       0x06, 0x00, /* 0000011000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x07, 0x00, /* 0000011100 */
+       0x03, 0x00, /* 0000001100 */
+       0x01, 0x80, /* 0000000110 */
+       0x41, 0x80, /* 0100000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x3f, 0x00, /* 0011111100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 52 0x34 '4' */
+       0x00, 0x00, /* 0000000000 */
+       0x06, 0x00, /* 0000011000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x36, 0x00, /* 0011011000 */
+       0x36, 0x00, /* 0011011000 */
+       0x66, 0x00, /* 0110011000 */
+       0x66, 0x00, /* 0110011000 */
+       0xc6, 0x00, /* 1100011000 */
+       0xc6, 0x00, /* 1100011000 */
+       0xff, 0x80, /* 1111111110 */
+       0xff, 0x80, /* 1111111110 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 53 0x35 '5' */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x1f, 0x00, /* 0001111100 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x7e, 0x00, /* 0111111000 */
+       0x67, 0x00, /* 0110011100 */
+       0x03, 0x80, /* 0000001110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x41, 0x80, /* 0100000110 */
+       0x63, 0x00, /* 0110001100 */
+       0x3e, 0x00, /* 0011111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 54 0x36 '6' */
+       0x00, 0x00, /* 0000000000 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x6e, 0x00, /* 0110111000 */
+       0x7f, 0x00, /* 0111111100 */
+       0x73, 0x80, /* 0111001110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x71, 0x00, /* 0111000100 */
+       0x3e, 0x00, /* 0011111000 */
+       0x1c, 0x00, /* 0001110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 55 0x37 '7' */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0x80, /* 0001111110 */
+       0x3f, 0x80, /* 0011111110 */
+       0x61, 0x80, /* 0110000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 56 0x38 '8' */
+       0x00, 0x00, /* 0000000000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x23, 0x00, /* 0010001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x31, 0x00, /* 0011000100 */
+       0x1a, 0x00, /* 0001101000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x16, 0x00, /* 0001011000 */
+       0x23, 0x00, /* 0010001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x31, 0x00, /* 0011000100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 57 0x39 '9' */
+       0x00, 0x00, /* 0000000000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x17, 0x00, /* 0001011100 */
+       0x23, 0x80, /* 0010001110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x73, 0x80, /* 0111001110 */
+       0x3d, 0x80, /* 0011110110 */
+       0x19, 0x80, /* 0001100110 */
+       0x01, 0x80, /* 0000000110 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 58 0x3a ':' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 59 0x3b ';' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x00, 0x00, /* 0000000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x20, 0x00, /* 0010000000 */
+
+       /* 60 0x3c '<' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x03, 0x00, /* 0000001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x06, 0x00, /* 0000011000 */
+       0x03, 0x00, /* 0000001100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 61 0x3d '=' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 62 0x3e '>' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x06, 0x00, /* 0000011000 */
+       0x03, 0x00, /* 0000001100 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x03, 0x00, /* 0000001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 63 0x3f '?' */
+       0x00, 0x00, /* 0000000000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x3b, 0x80, /* 0011101110 */
+       0x21, 0x80, /* 0010000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x03, 0x00, /* 0000001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 64 0x40 '@' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x31, 0x80, /* 0011000110 */
+       0x65, 0x80, /* 0110010110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6f, 0x80, /* 0110111110 */
+       0x60, 0x00, /* 0110000000 */
+       0x31, 0x80, /* 0011000110 */
+       0x3f, 0x80, /* 0011111110 */
+       0x0f, 0x00, /* 0000111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 65 0x41 'A' */
+       0x00, 0x00, /* 0000000000 */
+       0x04, 0x00, /* 0000010000 */
+       0x04, 0x00, /* 0000010000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x19, 0x80, /* 0001100110 */
+       0x31, 0x80, /* 0011000110 */
+       0x3f, 0x80, /* 0011111110 */
+       0x31, 0x80, /* 0011000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x60, 0xc0, /* 0110000011 */
+       0x60, 0xc0, /* 0110000011 */
+       0xf1, 0xc0, /* 1111000111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 66 0x42 'B' */
+       0x00, 0x00, /* 0000000000 */
+       0xfc, 0x00, /* 1111110000 */
+       0x62, 0x00, /* 0110001000 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x66, 0x00, /* 0110011000 */
+       0x7e, 0x00, /* 0111111000 */
+       0x63, 0x00, /* 0110001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x63, 0x00, /* 0110001100 */
+       0xfe, 0x00, /* 1111111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 67 0x43 'C' */
+       0x00, 0x00, /* 0000000000 */
+       0x0f, 0x00, /* 0000111100 */
+       0x11, 0x80, /* 0001000110 */
+       0x20, 0x80, /* 0010000010 */
+       0x20, 0x00, /* 0010000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x20, 0x00, /* 0010000000 */
+       0x30, 0x80, /* 0011000010 */
+       0x19, 0x00, /* 0001100100 */
+       0x0e, 0x00, /* 0000111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 68 0x44 'D' */
+       0x00, 0x00, /* 0000000000 */
+       0xfc, 0x00, /* 1111110000 */
+       0x67, 0x00, /* 0110011100 */
+       0x63, 0x00, /* 0110001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x00, /* 0110000100 */
+       0x66, 0x00, /* 0110011000 */
+       0xf8, 0x00, /* 1111100000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 69 0x45 'E' */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x30, 0x80, /* 0011000010 */
+       0x30, 0x80, /* 0011000010 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x31, 0x00, /* 0011000100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x31, 0x00, /* 0011000100 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x80, /* 0011000010 */
+       0x30, 0x80, /* 0011000010 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 70 0x46 'F' */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x30, 0x80, /* 0011000010 */
+       0x30, 0x80, /* 0011000010 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x31, 0x00, /* 0011000100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x31, 0x00, /* 0011000100 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x78, 0x00, /* 0111100000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 71 0x47 'G' */
+       0x00, 0x00, /* 0000000000 */
+       0x0f, 0x00, /* 0000111100 */
+       0x11, 0x80, /* 0001000110 */
+       0x20, 0x80, /* 0010000010 */
+       0x20, 0x00, /* 0010000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x67, 0xc0, /* 0110011111 */
+       0x61, 0x80, /* 0110000110 */
+       0x21, 0x80, /* 0010000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x19, 0x80, /* 0001100110 */
+       0x0e, 0x00, /* 0000111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 72 0x48 'H' */
+       0x00, 0x00, /* 0000000000 */
+       0xf3, 0xc0, /* 1111001111 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0xf3, 0xc0, /* 1111001111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 73 0x49 'I' */
+       0x00, 0x00, /* 0000000000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 74 0x4a 'J' */
+       0x00, 0x00, /* 0000000000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x08, 0x00, /* 0000100000 */
+       0x70, 0x00, /* 0111000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 75 0x4b 'K' */
+       0x00, 0x00, /* 0000000000 */
+       0xf1, 0x80, /* 1111000110 */
+       0x63, 0x00, /* 0110001100 */
+       0x66, 0x00, /* 0110011000 */
+       0x6c, 0x00, /* 0110110000 */
+       0x78, 0x00, /* 0111100000 */
+       0x70, 0x00, /* 0111000000 */
+       0x70, 0x00, /* 0111000000 */
+       0x78, 0x00, /* 0111100000 */
+       0x78, 0x00, /* 0111100000 */
+       0x6c, 0x00, /* 0110110000 */
+       0x66, 0x00, /* 0110011000 */
+       0x63, 0x00, /* 0110001100 */
+       0x61, 0x80, /* 0110000110 */
+       0xf0, 0xc0, /* 1111000011 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 76 0x4c 'L' */
+       0x00, 0x00, /* 0000000000 */
+       0x78, 0x00, /* 0111100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x80, /* 0011000010 */
+       0x30, 0x80, /* 0011000010 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 77 0x4d 'M' */
+       0x00, 0x00, /* 0000000000 */
+       0xe0, 0xc0, /* 1110000011 */
+       0x61, 0x80, /* 0110000110 */
+       0x73, 0x80, /* 0111001110 */
+       0x73, 0x80, /* 0111001110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0xf3, 0xc0, /* 1111001111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 78 0x4e 'N' */
+       0x00, 0x00, /* 0000000000 */
+       0xf3, 0xc0, /* 1111001111 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x71, 0x80, /* 0111000110 */
+       0x79, 0x80, /* 0111100110 */
+       0x79, 0x80, /* 0111100110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x67, 0x80, /* 0110011110 */
+       0x67, 0x80, /* 0110011110 */
+       0x63, 0x80, /* 0110001110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0xf3, 0xc0, /* 1111001111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 79 0x4f 'O' */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x17, 0x00, /* 0001011100 */
+       0x23, 0x00, /* 0010001100 */
+       0x21, 0x80, /* 0010000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x21, 0x00, /* 0010000100 */
+       0x31, 0x00, /* 0011000100 */
+       0x1a, 0x00, /* 0001101000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 80 0x50 'P' */
+       0x00, 0x00, /* 0000000000 */
+       0xfe, 0x00, /* 1111111000 */
+       0x63, 0x00, /* 0110001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x63, 0x00, /* 0110001100 */
+       0x7e, 0x00, /* 0111111000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0xf0, 0x00, /* 1111000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 81 0x51 'Q' */
+       0x00, 0x00, /* 0000000000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x13, 0x00, /* 0001001100 */
+       0x23, 0x00, /* 0010001100 */
+       0x21, 0x80, /* 0010000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x3b, 0x00, /* 0011101100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x26, 0x00, /* 0010011000 */
+       0x03, 0x80, /* 0000001110 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 82 0x52 'R' */
+       0x00, 0x00, /* 0000000000 */
+       0xfe, 0x00, /* 1111111000 */
+       0x63, 0x00, /* 0110001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x00, /* 0110000100 */
+       0x7e, 0x00, /* 0111111000 */
+       0x78, 0x00, /* 0111100000 */
+       0x6c, 0x00, /* 0110110000 */
+       0x6e, 0x00, /* 0110111000 */
+       0x67, 0x00, /* 0110011100 */
+       0x63, 0x80, /* 0110001110 */
+       0x61, 0xc0, /* 0110000111 */
+       0xf0, 0xc0, /* 1111000011 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 83 0x53 'S' */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x31, 0x80, /* 0011000110 */
+       0x60, 0x80, /* 0110000010 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x06, 0x00, /* 0000011000 */
+       0x03, 0x00, /* 0000001100 */
+       0x01, 0x80, /* 0000000110 */
+       0x41, 0x80, /* 0100000110 */
+       0x63, 0x00, /* 0110001100 */
+       0x3e, 0x00, /* 0011111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 84 0x54 'T' */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x4c, 0x80, /* 0100110010 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 85 0x55 'U' */
+       0x00, 0x00, /* 0000000000 */
+       0xf3, 0xc0, /* 1111001111 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x73, 0x00, /* 0111001100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 86 0x56 'V' */
+       0x00, 0x00, /* 0000000000 */
+       0xe1, 0xc0, /* 1110000111 */
+       0xc0, 0xc0, /* 1100000011 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x12, 0x00, /* 0001001000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 87 0x57 'W' */
+       0x00, 0x00, /* 0000000000 */
+       0xe1, 0xc0, /* 1110000111 */
+       0xc0, 0xc0, /* 1100000011 */
+       0xc0, 0xc0, /* 1100000011 */
+       0xc0, 0xc0, /* 1100000011 */
+       0xe0, 0xc0, /* 1110000011 */
+       0x61, 0x80, /* 0110000110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x77, 0x00, /* 0111011100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 88 0x58 'X' */
+       0x00, 0x00, /* 0000000000 */
+       0xf7, 0x80, /* 1111011110 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x36, 0x00, /* 0011011000 */
+       0x36, 0x00, /* 0011011000 */
+       0x36, 0x00, /* 0011011000 */
+       0x1c, 0x00, /* 0001110000 */
+       0x1c, 0x00, /* 0001110000 */
+       0x36, 0x00, /* 0011011000 */
+       0x36, 0x00, /* 0011011000 */
+       0x36, 0x00, /* 0011011000 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0xf7, 0x80, /* 1111011110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 89 0x59 'Y' */
+       0x00, 0x00, /* 0000000000 */
+       0xf3, 0xc0, /* 1111001111 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 90 0x5a 'Z' */
+       0x00, 0x00, /* 0000000000 */
+       0x3f, 0x80, /* 0011111110 */
+       0x21, 0x80, /* 0010000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x80, /* 0011000010 */
+       0x3f, 0x80, /* 0011111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 91 0x5b '[' */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x1f, 0x00, /* 0001111100 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x1f, 0x00, /* 0001111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 92 0x5c '\' */
+       0x00, 0x00, /* 0000000000 */
+       0xc0, 0x00, /* 1100000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x00, 0xc0, /* 0000000011 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 93 0x5d ']' */
+       0x00, 0x00, /* 0000000000 */
+       0x3e, 0x00, /* 0011111000 */
+       0x3e, 0x00, /* 0011111000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x3e, 0x00, /* 0011111000 */
+       0x3e, 0x00, /* 0011111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 94 0x5e '^' */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x33, 0x00, /* 0011001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 95 0x5f '_' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 96 0x60 '`' */
+       0x04, 0x00, /* 0000010000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 97 0x61 'a' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x31, 0x80, /* 0011000110 */
+       0x21, 0x80, /* 0010000110 */
+       0x07, 0x80, /* 0000011110 */
+       0x39, 0x80, /* 0011100110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x73, 0x80, /* 0111001110 */
+       0x3d, 0xc0, /* 0011110111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 98 0x62 'b' */
+       0x20, 0x00, /* 0010000000 */
+       0x60, 0x00, /* 0110000000 */
+       0xe0, 0x00, /* 1110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x66, 0x00, /* 0110011000 */
+       0x6f, 0x00, /* 0110111100 */
+       0x73, 0x80, /* 0111001110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x71, 0x80, /* 0111000110 */
+       0x7b, 0x00, /* 0111101100 */
+       0x4e, 0x00, /* 0100111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 99 0x63 'c' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x37, 0x00, /* 0011011100 */
+       0x23, 0x00, /* 0010001100 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x71, 0x00, /* 0111000100 */
+       0x33, 0x00, /* 0011001100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 100 0x64 'd' */
+       0x01, 0x80, /* 0000000110 */
+       0x03, 0x80, /* 0000001110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x0d, 0x80, /* 0000110110 */
+       0x37, 0x80, /* 0011011110 */
+       0x23, 0x80, /* 0010001110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x73, 0x80, /* 0111001110 */
+       0x35, 0x80, /* 0011010110 */
+       0x19, 0xc0, /* 0001100111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 101 0x65 'e' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x33, 0x00, /* 0011001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x19, 0x80, /* 0001100110 */
+       0x0e, 0x00, /* 0000111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 102 0x66 'f' */
+       0x07, 0x00, /* 0000011100 */
+       0x09, 0x80, /* 0000100110 */
+       0x09, 0x80, /* 0000100110 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x7f, 0x00, /* 0111111100 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 103 0x67 'g' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1c, 0x80, /* 0001110010 */
+       0x37, 0x80, /* 0011011110 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x36, 0x00, /* 0011011000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x60, 0x00, /* 0110000000 */
+       0x7f, 0x00, /* 0111111100 */
+       0x3f, 0x80, /* 0011111110 */
+       0x21, 0x80, /* 0010000110 */
+       0x40, 0x80, /* 0100000010 */
+       0x7f, 0x00, /* 0111111100 */
+       0x3e, 0x00, /* 0011111000 */
+
+       /* 104 0x68 'h' */
+       0x10, 0x00, /* 0001000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x70, 0x00, /* 0111000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x37, 0x00, /* 0011011100 */
+       0x3b, 0x80, /* 0011101110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x7b, 0xc0, /* 0111101111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 105 0x69 'i' */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 106 0x6a 'j' */
+       0x00, 0x00, /* 0000000000 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x07, 0x80, /* 0000011110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x41, 0x80, /* 0100000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x71, 0x80, /* 0111000110 */
+       0x3f, 0x00, /* 0011111100 */
+       0x1c, 0x00, /* 0001110000 */
+
+       /* 107 0x6b 'k' */
+       0x60, 0x00, /* 0110000000 */
+       0xe0, 0x00, /* 1110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x63, 0x80, /* 0110001110 */
+       0x66, 0x00, /* 0110011000 */
+       0x6c, 0x00, /* 0110110000 */
+       0x78, 0x00, /* 0111100000 */
+       0x70, 0x00, /* 0111000000 */
+       0x78, 0x00, /* 0111100000 */
+       0x6c, 0x00, /* 0110110000 */
+       0x6e, 0x00, /* 0110111000 */
+       0x67, 0x00, /* 0110011100 */
+       0xf3, 0x80, /* 1111001110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 108 0x6c 'l' */
+       0x3c, 0x00, /* 0011110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 109 0x6d 'm' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xdb, 0x80, /* 1101101110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0xed, 0xc0, /* 1110110111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 110 0x6e 'n' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x6f, 0x00, /* 0110111100 */
+       0x7b, 0x80, /* 0111101110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x7b, 0xc0, /* 0111101111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 111 0x6f 'o' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x66, 0x00, /* 0110011000 */
+       0xc3, 0x00, /* 1100001100 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xe1, 0x80, /* 1110000110 */
+       0x73, 0x00, /* 0111001100 */
+       0x3c, 0x00, /* 0011110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 112 0x70 'p' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xde, 0x00, /* 1101111000 */
+       0x76, 0x00, /* 0111011000 */
+       0x63, 0x00, /* 0110001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x71, 0x80, /* 0111000110 */
+       0x7b, 0x00, /* 0111101100 */
+       0x7e, 0x00, /* 0111111000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0xf0, 0x00, /* 1111000000 */
+
+       /* 113 0x71 'q' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0e, 0xc0, /* 0000111011 */
+       0x1b, 0x80, /* 0001101110 */
+       0x33, 0x80, /* 0011001110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x71, 0x80, /* 0111000110 */
+       0x3b, 0x80, /* 0011101110 */
+       0x1f, 0x80, /* 0001111110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x03, 0xc0, /* 0000001111 */
+
+       /* 114 0x72 'r' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x73, 0x00, /* 0111001100 */
+       0x35, 0x80, /* 0011010110 */
+       0x39, 0x80, /* 0011100110 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x78, 0x00, /* 0111100000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 115 0x73 's' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x63, 0x00, /* 0110001100 */
+       0x61, 0x00, /* 0110000100 */
+       0x70, 0x00, /* 0111000000 */
+       0x38, 0x00, /* 0011100000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x07, 0x00, /* 0000011100 */
+       0x43, 0x00, /* 0100001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x7e, 0x00, /* 0111111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 116 0x74 't' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x08, 0x00, /* 0000100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x1c, 0x80, /* 0001110010 */
+       0x0f, 0x00, /* 0000111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 117 0x75 'u' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xf7, 0x80, /* 1111011110 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x77, 0x00, /* 0111011100 */
+       0x3d, 0x80, /* 0011110110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 118 0x76 'v' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xf1, 0xc0, /* 1111000111 */
+       0x60, 0xc0, /* 0110000011 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x19, 0x80, /* 0001100110 */
+       0x1b, 0x00, /* 0001101100 */
+       0x0f, 0x00, /* 0000111100 */
+       0x0f, 0x00, /* 0000111100 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 119 0x77 'w' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xe3, 0xc0, /* 1110001111 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0x6b, 0x00, /* 0110101100 */
+       0x6b, 0x00, /* 0110101100 */
+       0x7e, 0x00, /* 0111111000 */
+       0x36, 0x00, /* 0011011000 */
+       0x36, 0x00, /* 0011011000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 120 0x78 'x' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xf7, 0x80, /* 1111011110 */
+       0x63, 0x00, /* 0110001100 */
+       0x36, 0x00, /* 0011011000 */
+       0x36, 0x00, /* 0011011000 */
+       0x1c, 0x00, /* 0001110000 */
+       0x1c, 0x00, /* 0001110000 */
+       0x36, 0x00, /* 0011011000 */
+       0x66, 0x00, /* 0110011000 */
+       0x63, 0x00, /* 0110001100 */
+       0xf7, 0x80, /* 1111011110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 121 0x79 'y' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xf3, 0xc0, /* 1111001111 */
+       0x61, 0x80, /* 0110000110 */
+       0x33, 0x00, /* 0011001100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x78, 0x00, /* 0111100000 */
+       0x70, 0x00, /* 0111000000 */
+
+       /* 122 0x7a 'z' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x61, 0x80, /* 0110000110 */
+       0x43, 0x00, /* 0100001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x60, 0x80, /* 0110000010 */
+       0x61, 0x80, /* 0110000110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 123 0x7b '{' */
+       0x07, 0x00, /* 0000011100 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x70, 0x00, /* 0111000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x07, 0x00, /* 0000011100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 124 0x7c '|' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 125 0x7d '}' */
+       0x38, 0x00, /* 0011100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x06, 0x00, /* 0000011000 */
+       0x03, 0x80, /* 0000001110 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x38, 0x00, /* 0011100000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 126 0x7e '~' */
+       0x00, 0x00, /* 0000000000 */
+       0x18, 0x80, /* 0001100010 */
+       0x3d, 0x80, /* 0011110110 */
+       0x6f, 0x00, /* 0110111100 */
+       0x46, 0x00, /* 0100011000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 127 0x7f '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x12, 0x00, /* 0001001000 */
+       0x21, 0x00, /* 0010000100 */
+       0x40, 0x80, /* 0100000010 */
+       0x40, 0x80, /* 0100000010 */
+       0x40, 0x80, /* 0100000010 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 128 0x80 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x21, 0x80, /* 0010000110 */
+       0x40, 0x80, /* 0100000010 */
+       0x40, 0x00, /* 0100000000 */
+       0x40, 0x00, /* 0100000000 */
+       0x40, 0x00, /* 0100000000 */
+       0x40, 0x00, /* 0100000000 */
+       0x40, 0x00, /* 0100000000 */
+       0x40, 0x00, /* 0100000000 */
+       0x60, 0x80, /* 0110000010 */
+       0x31, 0x00, /* 0011000100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x08, 0x00, /* 0000100000 */
+       0x04, 0x00, /* 0000010000 */
+       0x02, 0x00, /* 0000001000 */
+       0x02, 0x00, /* 0000001000 */
+       0x1c, 0x00, /* 0001110000 */
+
+       /* 129 0x81 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7b, 0x80, /* 0111101110 */
+       0x31, 0x00, /* 0011000100 */
+       0x31, 0x00, /* 0011000100 */
+       0x31, 0x00, /* 0011000100 */
+       0x31, 0x00, /* 0011000100 */
+       0x31, 0x00, /* 0011000100 */
+       0x31, 0x00, /* 0011000100 */
+       0x31, 0x00, /* 0011000100 */
+       0x3b, 0x00, /* 0011101100 */
+       0x1c, 0x80, /* 0001110010 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 130 0x82 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x01, 0x00, /* 0000000100 */
+       0x02, 0x00, /* 0000001000 */
+       0x04, 0x00, /* 0000010000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x33, 0x00, /* 0011001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x19, 0x80, /* 0001100110 */
+       0x0e, 0x00, /* 0000111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 131 0x83 '.' */
+       0x04, 0x00, /* 0000010000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x1b, 0x00, /* 0001101100 */
+       0x31, 0x80, /* 0011000110 */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x31, 0x80, /* 0011000110 */
+       0x21, 0x80, /* 0010000110 */
+       0x07, 0x80, /* 0000011110 */
+       0x39, 0x80, /* 0011100110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x73, 0x80, /* 0111001110 */
+       0x3d, 0xc0, /* 0011110111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 132 0x84 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x31, 0x80, /* 0011000110 */
+       0x21, 0x80, /* 0010000110 */
+       0x07, 0x80, /* 0000011110 */
+       0x39, 0x80, /* 0011100110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x73, 0x80, /* 0111001110 */
+       0x3d, 0xc0, /* 0011110111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 133 0x85 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x06, 0x00, /* 0000011000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x31, 0x80, /* 0011000110 */
+       0x21, 0x80, /* 0010000110 */
+       0x07, 0x80, /* 0000011110 */
+       0x39, 0x80, /* 0011100110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x73, 0x80, /* 0111001110 */
+       0x3d, 0xc0, /* 0011110111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 134 0x86 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x1b, 0x00, /* 0001101100 */
+       0x0e, 0x00, /* 0000111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x31, 0x80, /* 0011000110 */
+       0x21, 0x80, /* 0010000110 */
+       0x07, 0x80, /* 0000011110 */
+       0x39, 0x80, /* 0011100110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x73, 0x80, /* 0111001110 */
+       0x3d, 0xc0, /* 0011110111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 135 0x87 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x31, 0x80, /* 0011000110 */
+       0x20, 0x80, /* 0010000010 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x70, 0x80, /* 0111000010 */
+       0x30, 0x80, /* 0011000010 */
+       0x1f, 0x00, /* 0001111100 */
+       0x04, 0x00, /* 0000010000 */
+       0x02, 0x00, /* 0000001000 */
+       0x01, 0x00, /* 0000000100 */
+       0x0e, 0x00, /* 0000111000 */
+
+       /* 136 0x88 '.' */
+       0x04, 0x00, /* 0000010000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x1b, 0x00, /* 0001101100 */
+       0x31, 0x80, /* 0011000110 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x33, 0x00, /* 0011001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x19, 0x80, /* 0001100110 */
+       0x0e, 0x00, /* 0000111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 137 0x89 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x36, 0x00, /* 0011011000 */
+       0x36, 0x00, /* 0011011000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x33, 0x00, /* 0011001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x19, 0x80, /* 0001100110 */
+       0x0e, 0x00, /* 0000111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 138 0x8a '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x33, 0x00, /* 0011001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x19, 0x80, /* 0001100110 */
+       0x0e, 0x00, /* 0000111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 139 0x8b '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x36, 0x00, /* 0011011000 */
+       0x36, 0x00, /* 0011011000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 140 0x8c '.' */
+       0x08, 0x00, /* 0000100000 */
+       0x1c, 0x00, /* 0001110000 */
+       0x36, 0x00, /* 0011011000 */
+       0x63, 0x00, /* 0110001100 */
+       0x00, 0x00, /* 0000000000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 141 0x8d '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 142 0x8e '.' */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x04, 0x00, /* 0000010000 */
+       0x04, 0x00, /* 0000010000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x19, 0x00, /* 0001100100 */
+       0x19, 0x00, /* 0001100100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x31, 0x00, /* 0011000100 */
+       0x31, 0x00, /* 0011000100 */
+       0x60, 0x80, /* 0110000010 */
+       0x60, 0x80, /* 0110000010 */
+       0xf3, 0xc0, /* 1111001111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 143 0x8f '.' */
+       0x04, 0x00, /* 0000010000 */
+       0x0a, 0x00, /* 0000101000 */
+       0x0a, 0x00, /* 0000101000 */
+       0x04, 0x00, /* 0000010000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x19, 0x00, /* 0001100100 */
+       0x19, 0x00, /* 0001100100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x31, 0x00, /* 0011000100 */
+       0x31, 0x00, /* 0011000100 */
+       0x60, 0x80, /* 0110000010 */
+       0x60, 0x80, /* 0110000010 */
+       0xf3, 0xc0, /* 1111001111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 144 0x90 '.' */
+       0x03, 0x00, /* 0000001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x30, 0x80, /* 0011000010 */
+       0x30, 0x80, /* 0011000010 */
+       0x30, 0x00, /* 0011000000 */
+       0x31, 0x00, /* 0011000100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x31, 0x00, /* 0011000100 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x80, /* 0011000010 */
+       0x30, 0x80, /* 0011000010 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 145 0x91 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3b, 0x80, /* 0011101110 */
+       0x6c, 0xc0, /* 0110110011 */
+       0x4c, 0xc0, /* 0100110011 */
+       0x0c, 0xc0, /* 0000110011 */
+       0x3f, 0xc0, /* 0011111111 */
+       0x6c, 0x00, /* 0110110000 */
+       0xcc, 0x00, /* 1100110000 */
+       0xcc, 0x00, /* 1100110000 */
+       0xee, 0xc0, /* 1110111011 */
+       0x7b, 0x80, /* 0111101110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 146 0x92 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x07, 0xc0, /* 0000011111 */
+       0x0e, 0x40, /* 0000111001 */
+       0x0e, 0x40, /* 0000111001 */
+       0x0e, 0x00, /* 0000111000 */
+       0x16, 0x00, /* 0001011000 */
+       0x16, 0x80, /* 0001011010 */
+       0x17, 0x80, /* 0001011110 */
+       0x16, 0x80, /* 0001011010 */
+       0x3e, 0x00, /* 0011111000 */
+       0x26, 0x00, /* 0010011000 */
+       0x26, 0x00, /* 0010011000 */
+       0x46, 0x40, /* 0100011001 */
+       0x46, 0x40, /* 0100011001 */
+       0xef, 0xc0, /* 1110111111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 147 0x93 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x08, 0x00, /* 0000100000 */
+       0x1c, 0x00, /* 0001110000 */
+       0x36, 0x00, /* 0011011000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x66, 0x00, /* 0110011000 */
+       0xc3, 0x00, /* 1100001100 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xe1, 0x80, /* 1110000110 */
+       0x73, 0x00, /* 0111001100 */
+       0x3c, 0x00, /* 0011110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 148 0x94 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x00, 0x00, /* 0000000000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x66, 0x00, /* 0110011000 */
+       0xc3, 0x00, /* 1100001100 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xe1, 0x80, /* 1110000110 */
+       0x73, 0x00, /* 0111001100 */
+       0x3c, 0x00, /* 0011110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 149 0x95 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x06, 0x00, /* 0000011000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x66, 0x00, /* 0110011000 */
+       0xc3, 0x00, /* 1100001100 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xe1, 0x80, /* 1110000110 */
+       0x73, 0x00, /* 0111001100 */
+       0x3c, 0x00, /* 0011110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 150 0x96 '.' */
+       0x08, 0x00, /* 0000100000 */
+       0x1c, 0x00, /* 0001110000 */
+       0x36, 0x00, /* 0011011000 */
+       0x63, 0x00, /* 0110001100 */
+       0x00, 0x00, /* 0000000000 */
+       0xf7, 0x80, /* 1111011110 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x77, 0x00, /* 0111011100 */
+       0x3d, 0x80, /* 0011110110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 151 0x97 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x00, 0x00, /* 0000000000 */
+       0xf7, 0x80, /* 1111011110 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x77, 0x00, /* 0111011100 */
+       0x3d, 0x80, /* 0011110110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 152 0x98 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xf3, 0xc0, /* 1111001111 */
+       0x61, 0x80, /* 0110000110 */
+       0x33, 0x00, /* 0011001100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x78, 0x00, /* 0111100000 */
+       0x70, 0x00, /* 0111000000 */
+
+       /* 153 0x99 '.' */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x0c, 0x00, /* 0000110000 */
+       0x17, 0x00, /* 0001011100 */
+       0x23, 0x00, /* 0010001100 */
+       0x21, 0x80, /* 0010000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x21, 0x00, /* 0010000100 */
+       0x31, 0x00, /* 0011000100 */
+       0x1a, 0x00, /* 0001101000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 154 0x9a '.' */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x00, 0x00, /* 0000000000 */
+       0xf1, 0xc0, /* 1111000111 */
+       0x60, 0x80, /* 0110000010 */
+       0x60, 0x80, /* 0110000010 */
+       0x60, 0x80, /* 0110000010 */
+       0x60, 0x80, /* 0110000010 */
+       0x60, 0x80, /* 0110000010 */
+       0x60, 0x80, /* 0110000010 */
+       0x60, 0x80, /* 0110000010 */
+       0x60, 0x80, /* 0110000010 */
+       0x71, 0x00, /* 0111000100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 155 0x9b '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x1f, 0x80, /* 0001111110 */
+       0x36, 0x80, /* 0011011010 */
+       0x26, 0x00, /* 0010011000 */
+       0x66, 0x00, /* 0110011000 */
+       0x66, 0x00, /* 0110011000 */
+       0x66, 0x00, /* 0110011000 */
+       0x66, 0x00, /* 0110011000 */
+       0x76, 0x00, /* 0111011000 */
+       0x36, 0x80, /* 0011011010 */
+       0x1f, 0x80, /* 0001111110 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 156 0x9c '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x3b, 0x00, /* 0011101100 */
+       0x33, 0x00, /* 0011001100 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x7e, 0x00, /* 0111111000 */
+       0x7e, 0x00, /* 0111111000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x7c, 0x80, /* 0111110010 */
+       0x7f, 0x80, /* 0111111110 */
+       0x43, 0x00, /* 0100001100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 157 0x9d '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x40, 0x80, /* 0100000010 */
+       0x40, 0x80, /* 0100000010 */
+       0x21, 0x00, /* 0010000100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x0c, 0x00, /* 0000110000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 158 0x9e '.' */
+       0x00, 0x00, /* 0000000000 */
+       0xbf, 0x00, /* 1011111100 */
+       0x40, 0x80, /* 0100000010 */
+       0x40, 0x80, /* 0100000010 */
+       0x7f, 0x00, /* 0111111100 */
+       0x40, 0x00, /* 0100000000 */
+       0x48, 0x00, /* 0100100000 */
+       0x48, 0x00, /* 0100100000 */
+       0x5e, 0x00, /* 0101111000 */
+       0x48, 0x00, /* 0100100000 */
+       0x48, 0x00, /* 0100100000 */
+       0x48, 0x00, /* 0100100000 */
+       0x48, 0x80, /* 0100100010 */
+       0x47, 0x00, /* 0100011100 */
+       0xe0, 0x00, /* 1110000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 159 0x9f '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x03, 0x00, /* 0000001100 */
+       0x04, 0x80, /* 0000010010 */
+       0x08, 0x00, /* 0000100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x09, 0x00, /* 0000100100 */
+       0x3e, 0x00, /* 0011111000 */
+       0x48, 0x00, /* 0100100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x08, 0x00, /* 0000100000 */
+       0x90, 0x00, /* 1001000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 160 0xa0 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x03, 0x00, /* 0000001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x31, 0x80, /* 0011000110 */
+       0x21, 0x80, /* 0010000110 */
+       0x07, 0x80, /* 0000011110 */
+       0x39, 0x80, /* 0011100110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x73, 0x80, /* 0111001110 */
+       0x3d, 0xc0, /* 0011110111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 161 0xa1 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x03, 0x00, /* 0000001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 162 0xa2 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x66, 0x00, /* 0110011000 */
+       0xc3, 0x00, /* 1100001100 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xc1, 0x80, /* 1100000110 */
+       0xe1, 0x80, /* 1110000110 */
+       0x73, 0x00, /* 0111001100 */
+       0x3c, 0x00, /* 0011110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 163 0xa3 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x00, 0x00, /* 0000000000 */
+       0xf7, 0x80, /* 1111011110 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x77, 0x00, /* 0111011100 */
+       0x3d, 0x80, /* 0011110110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 164 0xa4 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x38, 0x80, /* 0011100010 */
+       0x7f, 0x80, /* 0111111110 */
+       0x47, 0x00, /* 0100011100 */
+       0x00, 0x00, /* 0000000000 */
+       0x6f, 0x00, /* 0110111100 */
+       0x7b, 0x80, /* 0111101110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x7b, 0xc0, /* 0111101111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 165 0xa5 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x38, 0x80, /* 0011100010 */
+       0x7f, 0x80, /* 0111111110 */
+       0x47, 0x00, /* 0100011100 */
+       0x00, 0x00, /* 0000000000 */
+       0xe3, 0xc0, /* 1110001111 */
+       0x71, 0x80, /* 0111000110 */
+       0x79, 0x80, /* 0111100110 */
+       0x79, 0x80, /* 0111100110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x67, 0x80, /* 0110011110 */
+       0x63, 0x80, /* 0110001110 */
+       0x61, 0x80, /* 0110000110 */
+       0xf0, 0xc0, /* 1111000011 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 166 0xa6 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x3e, 0x00, /* 0011111000 */
+       0x63, 0x00, /* 0110001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x0f, 0x00, /* 0000111100 */
+       0x33, 0x00, /* 0011001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x67, 0x00, /* 0110011100 */
+       0x3b, 0x80, /* 0011101110 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 167 0xa7 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x33, 0x00, /* 0011001100 */
+       0x21, 0x80, /* 0010000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x00, /* 0110000100 */
+       0x33, 0x00, /* 0011001100 */
+       0x1c, 0x00, /* 0001110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 168 0xa8 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x00, 0x00, /* 0000000000 */
+       0x06, 0x00, /* 0000011000 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x80, /* 0110000010 */
+       0x73, 0x80, /* 0111001110 */
+       0x3f, 0x00, /* 0011111100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 169 0xa9 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 170 0xaa '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 171 0xab '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x20, 0x00, /* 0010000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x20, 0x00, /* 0010000000 */
+       0x20, 0x80, /* 0010000010 */
+       0x21, 0x00, /* 0010000100 */
+       0x22, 0x00, /* 0010001000 */
+       0x74, 0x00, /* 0111010000 */
+       0x08, 0x00, /* 0000100000 */
+       0x17, 0x00, /* 0001011100 */
+       0x28, 0x80, /* 0010100010 */
+       0x43, 0x00, /* 0100001100 */
+       0x04, 0x00, /* 0000010000 */
+       0x08, 0x00, /* 0000100000 */
+       0x0f, 0x80, /* 0000111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 172 0xac '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x20, 0x00, /* 0010000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x20, 0x00, /* 0010000000 */
+       0x20, 0x80, /* 0010000010 */
+       0x21, 0x00, /* 0010000100 */
+       0x22, 0x00, /* 0010001000 */
+       0x74, 0x00, /* 0111010000 */
+       0x09, 0x00, /* 0000100100 */
+       0x13, 0x00, /* 0001001100 */
+       0x25, 0x00, /* 0010010100 */
+       0x49, 0x00, /* 0100100100 */
+       0x1f, 0x80, /* 0001111110 */
+       0x01, 0x00, /* 0000000100 */
+       0x01, 0x00, /* 0000000100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 173 0xad '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 174 0xae '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0d, 0x80, /* 0000110110 */
+       0x1b, 0x00, /* 0001101100 */
+       0x36, 0x00, /* 0011011000 */
+       0x6c, 0x00, /* 0110110000 */
+       0xd8, 0x00, /* 1101100000 */
+       0x6c, 0x00, /* 0110110000 */
+       0x36, 0x00, /* 0011011000 */
+       0x1b, 0x00, /* 0001101100 */
+       0x0d, 0x80, /* 0000110110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 175 0xaf '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x6c, 0x00, /* 0110110000 */
+       0x36, 0x00, /* 0011011000 */
+       0x1b, 0x00, /* 0001101100 */
+       0x0d, 0x80, /* 0000110110 */
+       0x06, 0xc0, /* 0000011011 */
+       0x0d, 0x80, /* 0000110110 */
+       0x1b, 0x00, /* 0001101100 */
+       0x36, 0x00, /* 0011011000 */
+       0x6c, 0x00, /* 0110110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 176 0xb0 '.' */
+       0xc3, 0x00, /* 1100001100 */
+       0x41, 0x00, /* 0100000100 */
+       0x18, 0x40, /* 0001100001 */
+       0x10, 0x40, /* 0001000001 */
+       0xc3, 0x00, /* 1100001100 */
+       0x41, 0x00, /* 0100000100 */
+       0x18, 0x40, /* 0001100001 */
+       0x10, 0x40, /* 0001000001 */
+       0xc3, 0x00, /* 1100001100 */
+       0x41, 0x00, /* 0100000100 */
+       0x18, 0x40, /* 0001100001 */
+       0x10, 0x40, /* 0001000001 */
+       0xc3, 0x00, /* 1100001100 */
+       0x41, 0x00, /* 0100000100 */
+       0x18, 0x40, /* 0001100001 */
+       0x10, 0x40, /* 0001000001 */
+       0xc3, 0x00, /* 1100001100 */
+       0x41, 0x00, /* 0100000100 */
+
+       /* 177 0xb1 '.' */
+       0x11, 0x00, /* 0001000100 */
+       0xbb, 0x80, /* 1011101110 */
+       0x11, 0x00, /* 0001000100 */
+       0x44, 0x40, /* 0100010001 */
+       0xee, 0xc0, /* 1110111011 */
+       0x44, 0x40, /* 0100010001 */
+       0x11, 0x00, /* 0001000100 */
+       0xbb, 0x80, /* 1011101110 */
+       0x11, 0x00, /* 0001000100 */
+       0x44, 0x40, /* 0100010001 */
+       0xee, 0xc0, /* 1110111011 */
+       0x44, 0x40, /* 0100010001 */
+       0x11, 0x00, /* 0001000100 */
+       0xbb, 0x80, /* 1011101110 */
+       0x11, 0x00, /* 0001000100 */
+       0x44, 0x40, /* 0100010001 */
+       0xee, 0xc0, /* 1110111011 */
+       0x44, 0x40, /* 0100010001 */
+
+       /* 178 0xb2 '.' */
+       0x3c, 0xc0, /* 0011110011 */
+       0xbe, 0xc0, /* 1011111011 */
+       0xe7, 0x80, /* 1110011110 */
+       0xef, 0x80, /* 1110111110 */
+       0x3c, 0xc0, /* 0011110011 */
+       0xbe, 0xc0, /* 1011111011 */
+       0xe7, 0x80, /* 1110011110 */
+       0xef, 0x80, /* 1110111110 */
+       0x3c, 0xc0, /* 0011110011 */
+       0xbe, 0xc0, /* 1011111011 */
+       0xe7, 0x80, /* 1110011110 */
+       0xef, 0x80, /* 1110111110 */
+       0x3c, 0xc0, /* 0011110011 */
+       0xbe, 0xc0, /* 1011111011 */
+       0xe7, 0x80, /* 1110011110 */
+       0xef, 0x80, /* 1110111110 */
+       0x3c, 0xc0, /* 0011110011 */
+       0xbe, 0xc0, /* 1011111011 */
+
+       /* 179 0xb3 '.' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+
+       /* 180 0xb4 '.' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+
+       /* 181 0xb5 '.' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+
+       /* 182 0xb6 '.' */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0xfb, 0x00, /* 1111101100 */
+       0xfb, 0x00, /* 1111101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+
+       /* 183 0xb7 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0x00, /* 1111111100 */
+       0xff, 0x00, /* 1111111100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+
+       /* 184 0xb8 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xfc, 0x00, /* 1111110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+
+       /* 185 0xb9 '.' */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0xfb, 0x00, /* 1111101100 */
+       0xfb, 0x00, /* 1111101100 */
+       0x03, 0x00, /* 0000001100 */
+       0xfb, 0x00, /* 1111101100 */
+       0xfb, 0x00, /* 1111101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+
+       /* 186 0xba '.' */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+
+       /* 187 0xbb '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0x00, /* 1111111100 */
+       0xff, 0x00, /* 1111111100 */
+       0x03, 0x00, /* 0000001100 */
+       0xfb, 0x00, /* 1111101100 */
+       0xfb, 0x00, /* 1111101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+
+       /* 188 0xbc '.' */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0xfb, 0x00, /* 1111101100 */
+       0xfb, 0x00, /* 1111101100 */
+       0x03, 0x00, /* 0000001100 */
+       0xff, 0x00, /* 1111111100 */
+       0xff, 0x00, /* 1111111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 189 0xbd '.' */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0xff, 0x00, /* 1111111100 */
+       0xff, 0x00, /* 1111111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 190 0xbe '.' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 191 0xbf '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xfc, 0x00, /* 1111110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+
+       /* 192 0xc0 '.' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 193 0xc1 '.' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 194 0xc2 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+
+       /* 195 0xc3 '.' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+
+       /* 196 0xc4 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 197 0xc5 '.' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+
+       /* 198 0xc6 '.' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+
+       /* 199 0xc7 '.' */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0xc0, /* 0001101111 */
+       0x1b, 0xc0, /* 0001101111 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+
+       /* 200 0xc8 '.' */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0xc0, /* 0001101111 */
+       0x1b, 0xc0, /* 0001101111 */
+       0x18, 0x00, /* 0001100000 */
+       0x1f, 0xc0, /* 0001111111 */
+       0x1f, 0xc0, /* 0001111111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 201 0xc9 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0xc0, /* 0001111111 */
+       0x1f, 0xc0, /* 0001111111 */
+       0x18, 0x00, /* 0001100000 */
+       0x1b, 0xc0, /* 0001101111 */
+       0x1b, 0xc0, /* 0001101111 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+
+       /* 202 0xca '.' */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0xfb, 0xc0, /* 1111101111 */
+       0xfb, 0xc0, /* 1111101111 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 203 0xcb '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x00, 0x00, /* 0000000000 */
+       0xfb, 0xc0, /* 1111101111 */
+       0xfb, 0xc0, /* 1111101111 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+
+       /* 204 0xcc '.' */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0xc0, /* 0001101111 */
+       0x1b, 0xc0, /* 0001101111 */
+       0x18, 0x00, /* 0001100000 */
+       0x1b, 0xc0, /* 0001101111 */
+       0x1b, 0xc0, /* 0001101111 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+
+       /* 205 0xcd '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 206 0xce '.' */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0xfb, 0xc0, /* 1111101111 */
+       0xfb, 0xc0, /* 1111101111 */
+       0x00, 0x00, /* 0000000000 */
+       0xfb, 0xc0, /* 1111101111 */
+       0xfb, 0xc0, /* 1111101111 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+
+       /* 207 0xcf '.' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 208 0xd0 '.' */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 209 0xd1 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+
+       /* 210 0xd2 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+
+       /* 211 0xd3 '.' */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1f, 0xc0, /* 0001111111 */
+       0x1f, 0xc0, /* 0001111111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 212 0xd4 '.' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 213 0xd5 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+
+       /* 214 0xd6 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0xc0, /* 0001111111 */
+       0x1f, 0xc0, /* 0001111111 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+
+       /* 215 0xd7 '.' */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+       0x1b, 0x00, /* 0001101100 */
+
+       /* 216 0xd8 '.' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x0c, 0x00, /* 0000110000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+
+       /* 217 0xd9 '.' */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0xfc, 0x00, /* 1111110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 218 0xda '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+
+       /* 219 0xdb '.' */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+
+       /* 220 0xdc '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+
+       /* 221 0xdd '.' */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+       0xf8, 0x00, /* 1111100000 */
+
+       /* 222 0xde '.' */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+       0x07, 0xc0, /* 0000011111 */
+
+       /* 223 0xdf '.' */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0xff, 0xc0, /* 1111111111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 224 0xe0 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1c, 0x80, /* 0001110010 */
+       0x35, 0x80, /* 0011010110 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x63, 0x00, /* 0110001100 */
+       0x37, 0x80, /* 0011011110 */
+       0x1c, 0x80, /* 0001110010 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 225 0xe1 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x33, 0x00, /* 0011001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x63, 0x00, /* 0110001100 */
+       0x6f, 0x00, /* 0110111100 */
+       0x63, 0x00, /* 0110001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x63, 0x00, /* 0110001100 */
+       0x6e, 0x00, /* 0110111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 226 0xe2 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 227 0xe3 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 228 0xe4 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0x80, /* 1111111110 */
+       0x60, 0x00, /* 0110000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x80, /* 0011000010 */
+       0x61, 0x80, /* 0110000110 */
+       0xff, 0x80, /* 1111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 229 0xe5 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1f, 0xc0, /* 0001111111 */
+       0x36, 0x00, /* 0011011000 */
+       0x63, 0x00, /* 0110001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x33, 0x00, /* 0011001100 */
+       0x3e, 0x00, /* 0011111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 230 0xe6 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x73, 0x80, /* 0111001110 */
+       0x6d, 0x80, /* 0110110110 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0xc0, 0x00, /* 1100000000 */
+
+       /* 231 0xe7 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x01, 0x80, /* 0000000110 */
+       0x36, 0x40, /* 0011011001 */
+       0x5e, 0x00, /* 0101111000 */
+       0x8c, 0x00, /* 1000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 232 0xe8 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x33, 0x00, /* 0011001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x33, 0x00, /* 0011001100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 233 0xe9 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x1f, 0x00, /* 0001111100 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x60, 0xc0, /* 0110000011 */
+       0x7f, 0xc0, /* 0111111111 */
+       0x7f, 0xc0, /* 0111111111 */
+       0x60, 0xc0, /* 0110000011 */
+       0x31, 0x80, /* 0011000110 */
+       0x31, 0x80, /* 0011000110 */
+       0x1f, 0x00, /* 0001111100 */
+       0x0e, 0x00, /* 0000111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 234 0xea '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x33, 0x00, /* 0011001100 */
+       0x61, 0x80, /* 0110000110 */
+       0xc0, 0xc0, /* 1100000011 */
+       0xc0, 0xc0, /* 1100000011 */
+       0xc0, 0xc0, /* 1100000011 */
+       0x61, 0x80, /* 0110000110 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0xf3, 0xc0, /* 1111001111 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 235 0xeb '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x07, 0x00, /* 0000011100 */
+       0x1f, 0x80, /* 0001111110 */
+       0x30, 0xc0, /* 0011000011 */
+       0x30, 0x00, /* 0011000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x3e, 0x00, /* 0011111000 */
+       0x66, 0x00, /* 0110011000 */
+       0xc3, 0x00, /* 1100001100 */
+       0xc3, 0x00, /* 1100001100 */
+       0xc3, 0x00, /* 1100001100 */
+       0x66, 0x00, /* 0110011000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 236 0xec '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x33, 0x00, /* 0011001100 */
+       0x6d, 0x80, /* 0110110110 */
+       0xcc, 0xc0, /* 1100110011 */
+       0xcc, 0xc0, /* 1100110011 */
+       0xcc, 0xc0, /* 1100110011 */
+       0xcc, 0xc0, /* 1100110011 */
+       0x6d, 0x80, /* 0110110110 */
+       0x33, 0x00, /* 0011001100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 237 0xed '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x01, 0x80, /* 0000000110 */
+       0x01, 0x80, /* 0000000110 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x37, 0x00, /* 0011011100 */
+       0x6d, 0x80, /* 0110110110 */
+       0xcc, 0xc0, /* 1100110011 */
+       0xcc, 0xc0, /* 1100110011 */
+       0xcc, 0xc0, /* 1100110011 */
+       0xcc, 0xc0, /* 1100110011 */
+       0x6d, 0x80, /* 0110110110 */
+       0x3b, 0x00, /* 0011101100 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x60, 0x00, /* 0110000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 238 0xee '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x03, 0x80, /* 0000001110 */
+       0x0e, 0x00, /* 0000111000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x3f, 0x80, /* 0011111110 */
+       0x3f, 0x80, /* 0011111110 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x18, 0x00, /* 0001100000 */
+       0x18, 0x00, /* 0001100000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x03, 0x80, /* 0000001110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 239 0xef '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x33, 0x00, /* 0011001100 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x61, 0x80, /* 0110000110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 240 0xf0 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 241 0xf1 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 242 0xf2 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xe0, 0x00, /* 1110000000 */
+       0x38, 0x00, /* 0011100000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x03, 0x80, /* 0000001110 */
+       0x0e, 0x00, /* 0000111000 */
+       0x38, 0x00, /* 0011100000 */
+       0xe0, 0x00, /* 1110000000 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0x00, /* 1111111100 */
+       0xff, 0x00, /* 1111111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 243 0xf3 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x03, 0x80, /* 0000001110 */
+       0x0e, 0x00, /* 0000111000 */
+       0x38, 0x00, /* 0011100000 */
+       0xe0, 0x00, /* 1110000000 */
+       0x38, 0x00, /* 0011100000 */
+       0x0e, 0x00, /* 0000111000 */
+       0x03, 0x80, /* 0000001110 */
+       0x00, 0x00, /* 0000000000 */
+       0xff, 0x80, /* 1111111110 */
+       0xff, 0x80, /* 1111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 244 0xf4 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x30, 0x00, /* 0011000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 245 0xf5 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x03, 0x00, /* 0000001100 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 246 0xf6 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 247 0xf7 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x38, 0x00, /* 0011100000 */
+       0x6c, 0x00, /* 0110110000 */
+       0x06, 0xc0, /* 0000011011 */
+       0x03, 0x80, /* 0000001110 */
+       0x38, 0x00, /* 0011100000 */
+       0x6c, 0x00, /* 0110110000 */
+       0x06, 0xc0, /* 0000011011 */
+       0x03, 0x80, /* 0000001110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 248 0xf8 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x33, 0x00, /* 0011001100 */
+       0x33, 0x00, /* 0011001100 */
+       0x1e, 0x00, /* 0001111000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 249 0xf9 '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 250 0xfa '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 251 0xfb '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0f, 0xc0, /* 0000111111 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0xcc, 0x00, /* 1100110000 */
+       0x6c, 0x00, /* 0110110000 */
+       0x3c, 0x00, /* 0011110000 */
+       0x1c, 0x00, /* 0001110000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 252 0xfc '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x27, 0x00, /* 0010011100 */
+       0x7b, 0x00, /* 0111101100 */
+       0x31, 0x00, /* 0011000100 */
+       0x31, 0x00, /* 0011000100 */
+       0x31, 0x00, /* 0011000100 */
+       0x7b, 0x80, /* 0111101110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 253 0xfd '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x1e, 0x00, /* 0001111000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x63, 0x00, /* 0110001100 */
+       0x43, 0x00, /* 0100001100 */
+       0x06, 0x00, /* 0000011000 */
+       0x0c, 0x00, /* 0000110000 */
+       0x18, 0x00, /* 0001100000 */
+       0x30, 0x80, /* 0011000010 */
+       0x7f, 0x80, /* 0111111110 */
+       0x7f, 0x80, /* 0111111110 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 254 0xfe '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x3f, 0x00, /* 0011111100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x3f, 0x00, /* 0011111100 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+       /* 255 0xff '.' */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+       0x00, 0x00, /* 0000000000 */
+
+};
+
+
+struct font_desc font_10x18 = {
+       FONT10x18_IDX,
+       "10x18",
+       10,
+       18,
+       fontdata_10x18,
+#ifdef __sparc__
+       5
+#else
+       -1
+#endif
+};
diff --git a/drivers/video/console/font_7x14.c b/drivers/video/console/font_7x14.c
new file mode 100644 (file)
index 0000000..1fa7fcf
--- /dev/null
@@ -0,0 +1,4118 @@
+/**************************************/
+/* this file adapted from font_8x16.c */
+/* by Jurriaan Kalkman 05-2005        */
+/**************************************/
+
+#include <linux/font.h>
+
+#define FONTDATAMAX 3584
+
+static unsigned char fontdata_7x14[FONTDATAMAX] = {
+
+       /* 0 0x00 '^@' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 1 0x01 '^A' */
+       0x00, /* 0000000 */
+       0x7c, /* 0111110 */
+       0x82, /* 1000001 */
+       0xaa, /* 1010101 */
+       0x82, /* 1000001 */
+       0x82, /* 1000001 */
+       0xba, /* 1011101 */
+       0x92, /* 1001001 */
+       0x82, /* 1000001 */
+       0x7c, /* 0111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 2 0x02 '^B' */
+       0x00, /* 0000000 */
+       0x7c, /* 0111110 */
+       0xfe, /* 1111111 */
+       0xd6, /* 1101011 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xc6, /* 1100011 */
+       0xee, /* 1110111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0x7c, /* 0111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 3 0x03 '^C' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x6c, /* 0110110 */
+       0x7c, /* 0111110 */
+       0xfe, /* 1111111 */
+       0x7c, /* 0111110 */
+       0x38, /* 0011100 */
+       0x18, /* 0001100 */
+       0x10, /* 0001000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 4 0x04 '^D' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x10, /* 0001000 */
+       0x38, /* 0011100 */
+       0x7c, /* 0111110 */
+       0xfe, /* 1111111 */
+       0x7c, /* 0111110 */
+       0x38, /* 0011100 */
+       0x10, /* 0001000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 5 0x05 '^E' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x38, /* 0011100 */
+       0x38, /* 0011100 */
+       0x38, /* 0011100 */
+       0xee, /* 1110111 */
+       0xee, /* 1110111 */
+       0xee, /* 1110111 */
+       0x10, /* 0001000 */
+       0x10, /* 0001000 */
+       0x38, /* 0011100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 6 0x06 '^F' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x10, /* 0001000 */
+       0x38, /* 0011100 */
+       0x7c, /* 0111110 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0x7c, /* 0111110 */
+       0x10, /* 0001000 */
+       0x10, /* 0001000 */
+       0x38, /* 0011100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 7 0x07 '^G' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x3c, /* 0011110 */
+       0x3c, /* 0011110 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 8 0x08 '^H' */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xe6, /* 1110011 */
+       0xc2, /* 1100001 */
+       0xc2, /* 1100001 */
+       0xe6, /* 1110011 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+
+       /* 9 0x09 '^I' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0x44, /* 0100010 */
+       0x6c, /* 0110110 */
+       0x38, /* 0011100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 10 0x0a '^J' */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xc6, /* 1100011 */
+       0x92, /* 1001001 */
+       0xba, /* 1011101 */
+       0x92, /* 1001001 */
+       0xc6, /* 1100011 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+
+       /* 11 0x0b '^K' */
+       0x00, /* 0000000 */
+       0x1e, /* 0001111 */
+       0x0e, /* 0000111 */
+       0x1a, /* 0001101 */
+       0x1a, /* 0001101 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 12 0x0c '^L' */
+       0x00, /* 0000000 */
+       0x3c, /* 0011110 */
+       0x66, /* 0110011 */
+       0x66, /* 0110011 */
+       0x66, /* 0110011 */
+       0x66, /* 0110011 */
+       0x3c, /* 0011110 */
+       0x18, /* 0001100 */
+       0x7e, /* 0111111 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 13 0x0d '^M' */
+       0x00, /* 0000000 */
+       0x3e, /* 0011111 */
+       0x36, /* 0011011 */
+       0x3e, /* 0011111 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x70, /* 0111000 */
+       0xf0, /* 1111000 */
+       0xe0, /* 1110000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 14 0x0e '^N' */
+       0x00, /* 0000000 */
+       0x7e, /* 0111111 */
+       0x66, /* 0110011 */
+       0x7e, /* 0111111 */
+       0x66, /* 0110011 */
+       0x66, /* 0110011 */
+       0x66, /* 0110011 */
+       0x66, /* 0110011 */
+       0x6e, /* 0110111 */
+       0xee, /* 1110111 */
+       0xec, /* 1110110 */
+       0xc0, /* 1100000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 15 0x0f '^O' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x10, /* 0001000 */
+       0x10, /* 0001000 */
+       0xd6, /* 1101011 */
+       0x38, /* 0011100 */
+       0xee, /* 1110111 */
+       0x38, /* 0011100 */
+       0xd6, /* 1101011 */
+       0x10, /* 0001000 */
+       0x10, /* 0001000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 16 0x10 '^P' */
+       0x00, /* 0000000 */
+       0x80, /* 1000000 */
+       0xc0, /* 1100000 */
+       0xe0, /* 1110000 */
+       0xf0, /* 1111000 */
+       0xfc, /* 1111110 */
+       0xf0, /* 1111000 */
+       0xe0, /* 1110000 */
+       0xc0, /* 1100000 */
+       0x80, /* 1000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 17 0x11 '^Q' */
+       0x00, /* 0000000 */
+       0x04, /* 0000010 */
+       0x0c, /* 0000110 */
+       0x1c, /* 0001110 */
+       0x3c, /* 0011110 */
+       0xfc, /* 1111110 */
+       0x3c, /* 0011110 */
+       0x1c, /* 0001110 */
+       0x0c, /* 0000110 */
+       0x04, /* 0000010 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 18 0x12 '^R' */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x3c, /* 0011110 */
+       0x7e, /* 0111111 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x7e, /* 0111111 */
+       0x3c, /* 0011110 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 19 0x13 '^S' */
+       0x00, /* 0000000 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x00, /* 0000000 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 20 0x14 '^T' */
+       0x00, /* 0000000 */
+       0x7e, /* 0111111 */
+       0xd4, /* 1101010 */
+       0xd4, /* 1101010 */
+       0xd4, /* 1101010 */
+       0x74, /* 0111010 */
+       0x14, /* 0001010 */
+       0x14, /* 0001010 */
+       0x14, /* 0001010 */
+       0x14, /* 0001010 */
+       0x16, /* 0001011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 21 0x15 '^U' */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0x60, /* 0110000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0xc6, /* 1100011 */
+       0xc6, /* 1100011 */
+       0x6c, /* 0110110 */
+       0x38, /* 0011100 */
+       0x18, /* 0001100 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 22 0x16 '^V' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0xfc, /* 1111110 */
+       0xfc, /* 1111110 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 23 0x17 '^W' */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x3c, /* 0011110 */
+       0x7e, /* 0111111 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x7e, /* 0111111 */
+       0x3c, /* 0011110 */
+       0x18, /* 0001100 */
+       0x7e, /* 0111111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 24 0x18 '^X' */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x3c, /* 0011110 */
+       0x7e, /* 0111111 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 25 0x19 '^Y' */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x7e, /* 0111111 */
+       0x3c, /* 0011110 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 26 0x1a '^Z' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x18, /* 0001100 */
+       0xfc, /* 1111110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 27 0x1b '^[' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0xfc, /* 1111110 */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 28 0x1c '^\' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 29 0x1d '^]' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x28, /* 0010100 */
+       0x6c, /* 0110110 */
+       0xfe, /* 1111111 */
+       0x6c, /* 0110110 */
+       0x28, /* 0010100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 30 0x1e '^^' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0x78, /* 0111100 */
+       0xfc, /* 1111110 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 31 0x1f '^_' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0xfc, /* 1111110 */
+       0x78, /* 0111100 */
+       0x78, /* 0111100 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 32 0x20 ' ' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 33 0x21 '!' */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x3c, /* 0011110 */
+       0x3c, /* 0011110 */
+       0x3c, /* 0011110 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 34 0x22 '"' */
+       0x00, /* 0000000 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x28, /* 0010100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 35 0x23 '#' */
+       0x00, /* 0000000 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 36 0x24 '$' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xc4, /* 1100010 */
+       0xc0, /* 1100000 */
+       0x78, /* 0111100 */
+       0x0c, /* 0000110 */
+       0x8c, /* 1000110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+
+       /* 37 0x25 '%' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xc0, /* 1100000 */
+       0xc4, /* 1100010 */
+       0x0c, /* 0000110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0xcc, /* 1100110 */
+       0x8c, /* 1000110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 38 0x26 '&' */
+       0x00, /* 0000000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x38, /* 0011100 */
+       0x78, /* 0111100 */
+       0xde, /* 1101111 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xdc, /* 1101110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 39 0x27 ''' */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 40 0x28 '(' */
+       0x00, /* 0000000 */
+       0x0c, /* 0000110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x18, /* 0001100 */
+       0x0c, /* 0000110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 41 0x29 ')' */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x18, /* 0001100 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 42 0x2a '*' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x6c, /* 0110110 */
+       0x38, /* 0011100 */
+       0xfe, /* 1111111 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 43 0x2b '+' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x10, /* 0001000 */
+       0x10, /* 0001000 */
+       0x7c, /* 0111110 */
+       0x10, /* 0001000 */
+       0x10, /* 0001000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 44 0x2c ',' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 45 0x2d '-' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 46 0x2e '.' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 47 0x2f '/' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x04, /* 0000010 */
+       0x0c, /* 0000110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0xc0, /* 1100000 */
+       0x80, /* 1000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 48 0x30 '0' */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xdc, /* 1101110 */
+       0xec, /* 1110110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 49 0x31 '1' */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x38, /* 0011100 */
+       0x78, /* 0111100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x7c, /* 0111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 50 0x32 '2' */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0x0c, /* 0000110 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0xc0, /* 1100000 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 51 0x33 '3' */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x38, /* 0011100 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 52 0x34 '4' */
+       0x00, /* 0000000 */
+       0x0c, /* 0000110 */
+       0x1c, /* 0001110 */
+       0x3c, /* 0011110 */
+       0x6c, /* 0110110 */
+       0xcc, /* 1100110 */
+       0xfe, /* 1111111 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 53 0x35 '5' */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xf8, /* 1111100 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 54 0x36 '6' */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xf8, /* 1111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 55 0x37 '7' */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0xcc, /* 1100110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 56 0x38 '8' */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 57 0x39 '9' */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x7c, /* 0111110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x18, /* 0001100 */
+       0x70, /* 0111000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 58 0x3a ':' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 59 0x3b ';' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 60 0x3c '<' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x04, /* 0000010 */
+       0x0c, /* 0000110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x18, /* 0001100 */
+       0x0c, /* 0000110 */
+       0x04, /* 0000010 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 61 0x3d '=' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x7c, /* 0111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x7c, /* 0111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 62 0x3e '>' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x40, /* 0100000 */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x18, /* 0001100 */
+       0x0c, /* 0000110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0x40, /* 0100000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 63 0x3f '?' */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 64 0x40 '@' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xdc, /* 1101110 */
+       0xdc, /* 1101110 */
+       0xd8, /* 1101100 */
+       0xc0, /* 1100000 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 65 0x41 'A' */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 66 0x42 'B' */
+       0x00, /* 0000000 */
+       0xf8, /* 1111100 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x78, /* 0111100 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0xf8, /* 1111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 67 0x43 'C' */
+       0x00, /* 0000000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0xc4, /* 1100010 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc4, /* 1100010 */
+       0x6c, /* 0110110 */
+       0x38, /* 0011100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 68 0x44 'D' */
+       0x00, /* 0000000 */
+       0xf0, /* 1111000 */
+       0xd8, /* 1101100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xd8, /* 1101100 */
+       0xf0, /* 1111000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 69 0x45 'E' */
+       0x00, /* 0000000 */
+       0x7c, /* 0111110 */
+       0x6c, /* 0110110 */
+       0x64, /* 0110010 */
+       0x68, /* 0110100 */
+       0x78, /* 0111100 */
+       0x68, /* 0110100 */
+       0x60, /* 0110000 */
+       0x64, /* 0110010 */
+       0x6c, /* 0110110 */
+       0x7c, /* 0111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 70 0x46 'F' */
+       0x00, /* 0000000 */
+       0x7c, /* 0111110 */
+       0x64, /* 0110010 */
+       0x60, /* 0110000 */
+       0x68, /* 0110100 */
+       0x78, /* 0111100 */
+       0x68, /* 0110100 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x70, /* 0111000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 71 0x47 'G' */
+       0x00, /* 0000000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0xc4, /* 1100010 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xdc, /* 1101110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x6c, /* 0110110 */
+       0x34, /* 0011010 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 72 0x48 'H' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 73 0x49 'I' */
+       0x00, /* 0000000 */
+       0x3c, /* 0011110 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x3c, /* 0011110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 74 0x4a 'J' */
+       0x00, /* 0000000 */
+       0x1c, /* 0001110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 75 0x4b 'K' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xd8, /* 1101100 */
+       0xf0, /* 1111000 */
+       0xf0, /* 1111000 */
+       0xd8, /* 1101100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 76 0x4c 'L' */
+       0x00, /* 0000000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc4, /* 1100010 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 77 0x4d 'M' */
+       0x00, /* 0000000 */
+       0xc6, /* 1100011 */
+       0xee, /* 1110111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xd6, /* 1101011 */
+       0xc6, /* 1100011 */
+       0xc6, /* 1100011 */
+       0xc6, /* 1100011 */
+       0xc6, /* 1100011 */
+       0xc6, /* 1100011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 78 0x4e 'N' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xec, /* 1110110 */
+       0xec, /* 1110110 */
+       0xfc, /* 1111110 */
+       0xdc, /* 1101110 */
+       0xdc, /* 1101110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 79 0x4f 'O' */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 80 0x50 'P' */
+       0x00, /* 0000000 */
+       0xf8, /* 1111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xf8, /* 1111100 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 81 0x51 'Q' */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xdc, /* 1101110 */
+       0x78, /* 0111100 */
+       0x18, /* 0001100 */
+       0x1c, /* 0001110 */
+       0x00, /* 0000000 */
+
+       /* 82 0x52 'R' */
+       0x00, /* 0000000 */
+       0xf8, /* 1111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xf8, /* 1111100 */
+       0xd8, /* 1101100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 83 0x53 'S' */
+       0x00, /* 0000000 */
+       0x7c, /* 0111110 */
+       0xc4, /* 1100010 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0x60, /* 0110000 */
+       0x38, /* 0011100 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x8c, /* 1000110 */
+       0xf8, /* 1111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 84 0x54 'T' */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0xfc, /* 1111110 */
+       0xb4, /* 1011010 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 85 0x55 'U' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 86 0x56 'V' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x78, /* 0111100 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 87 0x57 'W' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0xfc, /* 1111110 */
+       0x48, /* 0100100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 88 0x58 'X' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x78, /* 0111100 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 89 0x59 'Y' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 90 0x5a 'Z' */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0xcc, /* 1100110 */
+       0x8c, /* 1000110 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0xc4, /* 1100010 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 91 0x5b '[' */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 92 0x5c '\' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x80, /* 1000000 */
+       0xc0, /* 1100000 */
+       0xe0, /* 1110000 */
+       0x70, /* 0111000 */
+       0x38, /* 0011100 */
+       0x1c, /* 0001110 */
+       0x0c, /* 0000110 */
+       0x04, /* 0000010 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 93 0x5d ']' */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 94 0x5e '^' */
+       0x10, /* 0001000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0xc6, /* 1100011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 95 0x5f '_' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfe, /* 1111111 */
+       0x00, /* 0000000 */
+
+       /* 96 0x60 '`' */
+       0x00, /* 0000000 */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 97 0x61 'a' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0x0c, /* 0000110 */
+       0x7c, /* 0111110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 98 0x62 'b' */
+       0x00, /* 0000000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xf0, /* 1111000 */
+       0xd8, /* 1101100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xf8, /* 1111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 99 0x63 'c' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 100 0x64 'd' */
+       0x00, /* 0000000 */
+       0x1c, /* 0001110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x3c, /* 0011110 */
+       0x6c, /* 0110110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 101 0x65 'e' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 102 0x66 'f' */
+       0x00, /* 0000000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0x64, /* 0110010 */
+       0x60, /* 0110000 */
+       0xf0, /* 1111000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0xf0, /* 1111000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 103 0x67 'g' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x76, /* 0111011 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x7c, /* 0111110 */
+       0x0c, /* 0000110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+
+       /* 104 0x68 'h' */
+       0x00, /* 0000000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xd8, /* 1101100 */
+       0xec, /* 1110110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 105 0x69 'i' */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x70, /* 0111000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 106 0x6a 'j' */
+       0x00, /* 0000000 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x00, /* 0000000 */
+       0x1c, /* 0001110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+
+       /* 107 0x6b 'k' */
+       0x00, /* 0000000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xcc, /* 1100110 */
+       0xd8, /* 1101100 */
+       0xf0, /* 1111000 */
+       0xf0, /* 1111000 */
+       0xd8, /* 1101100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 108 0x6c 'l' */
+       0x00, /* 0000000 */
+       0x70, /* 0111000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 109 0x6d 'm' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xec, /* 1110110 */
+       0xfe, /* 1111111 */
+       0xd6, /* 1101011 */
+       0xd6, /* 1101011 */
+       0xd6, /* 1101011 */
+       0xd6, /* 1101011 */
+       0xd6, /* 1101011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 110 0x6e 'n' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xb8, /* 1011100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 111 0x6f 'o' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 112 0x70 'p' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xb8, /* 1011100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xf8, /* 1111100 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+
+       /* 113 0x71 'q' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x74, /* 0111010 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x7c, /* 0111110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+
+       /* 114 0x72 'r' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xb8, /* 1011100 */
+       0xec, /* 1110110 */
+       0xcc, /* 1100110 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 115 0x73 's' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x18, /* 0001100 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 116 0x74 't' */
+       0x00, /* 0000000 */
+       0x10, /* 0001000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xfc, /* 1111110 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x36, /* 0011011 */
+       0x1c, /* 0001110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 117 0x75 'u' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 118 0x76 'v' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 119 0x77 'w' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xc6, /* 1100011 */
+       0xc6, /* 1100011 */
+       0xd6, /* 1101011 */
+       0xd6, /* 1101011 */
+       0xd6, /* 1101011 */
+       0xfe, /* 1111111 */
+       0x6c, /* 0110110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 120 0x78 'x' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 121 0x79 'y' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x7c, /* 0111110 */
+       0x0c, /* 0000110 */
+       0x18, /* 0001100 */
+       0xf0, /* 1111000 */
+
+       /* 122 0x7a 'z' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0xcc, /* 1100110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 123 0x7b '{' */
+       0x00, /* 0000000 */
+       0x1c, /* 0001110 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xe0, /* 1110000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x1c, /* 0001110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 124 0x7c '|' */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 125 0x7d '}' */
+       0x00, /* 0000000 */
+       0x70, /* 0111000 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x0e, /* 0000111 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x70, /* 0111000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 126 0x7e '~' */
+       0x00, /* 0000000 */
+       0xec, /* 1110110 */
+       0xb8, /* 1011100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 127 0x7f '\7f' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x10, /* 0001000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0xc6, /* 1100011 */
+       0xc6, /* 1100011 */
+       0xc6, /* 1100011 */
+       0xfe, /* 1111111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 128 0x80 '\80' */
+       0x00, /* 0000000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0xc4, /* 1100010 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc4, /* 1100010 */
+       0x6c, /* 0110110 */
+       0x38, /* 0011100 */
+       0x18, /* 0001100 */
+       0x70, /* 0111000 */
+       0x00, /* 0000000 */
+
+       /* 129 0x81 '\81' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 130 0x82 '\82' */
+       0x0c, /* 0000110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 131 0x83 '\83' */
+       0x10, /* 0001000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0x0c, /* 0000110 */
+       0x7c, /* 0111110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 132 0x84 '\84' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0x0c, /* 0000110 */
+       0x7c, /* 0111110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 133 0x85 '\85' */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0x0c, /* 0000110 */
+       0x7c, /* 0111110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 134 0x86 '\86' */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0x38, /* 0011100 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0x0c, /* 0000110 */
+       0x7c, /* 0111110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 135 0x87 '\87' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xe0, /* 1110000 */
+
+       /* 136 0x88 '\88' */
+       0x10, /* 0001000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 137 0x89 '\89' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 138 0x8a '\8a' */
+       0xc0, /* 1100000 */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 139 0x8b '\8b' */
+       0x00, /* 0000000 */
+       0x6c, /* 0110110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x38, /* 0011100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x3c, /* 0011110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 140 0x8c '\8c' */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x70, /* 0111000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 141 0x8d '\8d' */
+       0xc0, /* 1100000 */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x70, /* 0111000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 142 0x8e '\8e' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 143 0x8f '\8f' */
+       0x30, /* 0011000 */
+       0x48, /* 0100100 */
+       0x48, /* 0100100 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 144 0x90 '\90' */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0xfc, /* 1111110 */
+       0xcc, /* 1100110 */
+       0xc4, /* 1100010 */
+       0xd0, /* 1101000 */
+       0xf0, /* 1111000 */
+       0xd0, /* 1101000 */
+       0xc4, /* 1100010 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 145 0x91 '\91' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xec, /* 1110110 */
+       0x36, /* 0011011 */
+       0x36, /* 0011011 */
+       0x7e, /* 0111111 */
+       0xd8, /* 1101100 */
+       0xd8, /* 1101100 */
+       0x6e, /* 0110111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 146 0x92 '\92' */
+       0x00, /* 0000000 */
+       0x3e, /* 0011111 */
+       0x6c, /* 0110110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xfe, /* 1111111 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xce, /* 1100111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 147 0x93 '\93' */
+       0x10, /* 0001000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 148 0x94 '\94' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 149 0x95 '\95' */
+       0xc0, /* 1100000 */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 150 0x96 '\96' */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 151 0x97 '\97' */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 152 0x98 '\98' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x7c, /* 0111110 */
+       0x0c, /* 0000110 */
+       0x18, /* 0001100 */
+       0x70, /* 0111000 */
+
+       /* 153 0x99 '\99' */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 154 0x9a '\9a' */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 155 0x9b '\9b' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x7c, /* 0111110 */
+       0xcc, /* 1100110 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xcc, /* 1100110 */
+       0x7c, /* 0111110 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 156 0x9c '\9c' */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0x64, /* 0110010 */
+       0x60, /* 0110000 */
+       0xf0, /* 1111000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0xe6, /* 1110011 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 157 0x9d '\9d' */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x30, /* 0011000 */
+       0xfc, /* 1111110 */
+       0x30, /* 0011000 */
+       0xfc, /* 1111110 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 158 0x9e '\9e' */
+       0xf8, /* 1111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xf8, /* 1111100 */
+       0xc4, /* 1100010 */
+       0xcc, /* 1100110 */
+       0xde, /* 1101111 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xc6, /* 1100011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 159 0x9f '\9f' */
+       0x1c, /* 0001110 */
+       0x36, /* 0011011 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xfc, /* 1111110 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xb0, /* 1011000 */
+       0xe0, /* 1110000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 160 0xa0 ' ' */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0x0c, /* 0000110 */
+       0x7c, /* 0111110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 161 0xa1 '¡' */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0x00, /* 0000000 */
+       0x70, /* 0111000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 162 0xa2 '¢' */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 163 0xa3 '£' */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 164 0xa4 '¤' */
+       0x00, /* 0000000 */
+       0x76, /* 0111011 */
+       0xdc, /* 1101110 */
+       0x00, /* 0000000 */
+       0xb8, /* 1011100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 165 0xa5 '¥' */
+       0x76, /* 0111011 */
+       0xdc, /* 1101110 */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xec, /* 1110110 */
+       0xec, /* 1110110 */
+       0xfc, /* 1111110 */
+       0xdc, /* 1101110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 166 0xa6 '¦' */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xd8, /* 1101100 */
+       0xd8, /* 1101100 */
+       0x7c, /* 0111110 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 167 0xa7 '§' */
+       0x00, /* 0000000 */
+       0x70, /* 0111000 */
+       0xd8, /* 1101100 */
+       0xd8, /* 1101100 */
+       0x70, /* 0111000 */
+       0x00, /* 0000000 */
+       0xf8, /* 1111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 168 0xa8 '¨' */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0xc0, /* 1100000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 169 0xa9 '©' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 170 0xaa 'ª' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 171 0xab '«' */
+       0x60, /* 0110000 */
+       0xe0, /* 1110000 */
+       0x62, /* 0110001 */
+       0x66, /* 0110011 */
+       0x6c, /* 0110110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0xc0, /* 1100000 */
+       0xb8, /* 1011100 */
+       0x4c, /* 0100110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x7c, /* 0111110 */
+
+       /* 172 0xac '¬' */
+       0x60, /* 0110000 */
+       0xe0, /* 1110000 */
+       0x62, /* 0110001 */
+       0x66, /* 0110011 */
+       0x6c, /* 0110110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x6c, /* 0110110 */
+       0xdc, /* 1101110 */
+       0xb4, /* 1011010 */
+       0x7e, /* 0111111 */
+       0x0c, /* 0000110 */
+       0x0c, /* 0000110 */
+       0x00, /* 0000000 */
+
+       /* 173 0xad '­' */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0x78, /* 0111100 */
+       0x78, /* 0111100 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 174 0xae '®' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x36, /* 0011011 */
+       0x6c, /* 0110110 */
+       0xd8, /* 1101100 */
+       0x6c, /* 0110110 */
+       0x36, /* 0011011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 175 0xaf '¯' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xd8, /* 1101100 */
+       0x6c, /* 0110110 */
+       0x36, /* 0011011 */
+       0x6c, /* 0110110 */
+       0xd8, /* 1101100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 176 0xb0 '°' */
+       0x88, /* 1000100 */
+       0x22, /* 0010001 */
+       0x88, /* 1000100 */
+       0x22, /* 0010001 */
+       0x88, /* 1000100 */
+       0x22, /* 0010001 */
+       0x88, /* 1000100 */
+       0x22, /* 0010001 */
+       0x88, /* 1000100 */
+       0x22, /* 0010001 */
+       0x88, /* 1000100 */
+       0x22, /* 0010001 */
+       0x88, /* 1000100 */
+       0x22, /* 0010001 */
+
+       /* 177 0xb1 '±' */
+       0x54, /* 0101010 */
+       0xaa, /* 1010101 */
+       0x54, /* 0101010 */
+       0xaa, /* 1010101 */
+       0x54, /* 0101010 */
+       0xaa, /* 1010101 */
+       0x54, /* 0101010 */
+       0xaa, /* 1010101 */
+       0x54, /* 0101010 */
+       0xaa, /* 1010101 */
+       0x54, /* 0101010 */
+       0xaa, /* 1010101 */
+       0x54, /* 0101010 */
+       0xaa, /* 1010101 */
+
+       /* 178 0xb2 '²' */
+       0xee, /* 1110111 */
+       0xba, /* 1011101 */
+       0xee, /* 1110111 */
+       0xba, /* 1011101 */
+       0xee, /* 1110111 */
+       0xba, /* 1011101 */
+       0xee, /* 1110111 */
+       0xba, /* 1011101 */
+       0xee, /* 1110111 */
+       0xba, /* 1011101 */
+       0xee, /* 1110111 */
+       0xba, /* 1011101 */
+       0xee, /* 1110111 */
+       0xba, /* 1011101 */
+
+       /* 179 0xb3 '³' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 180 0xb4 '´' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xf0, /* 1111000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 181 0xb5 'µ' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xf0, /* 1111000 */
+       0x30, /* 0011000 */
+       0xf0, /* 1111000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 182 0xb6 '¶' */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0xec, /* 1110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+
+       /* 183 0xb7 '·' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+
+       /* 184 0xb8 '¸' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xf0, /* 1111000 */
+       0x30, /* 0011000 */
+       0xf0, /* 1111000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 185 0xb9 '¹' */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0xec, /* 1110110 */
+       0x0c, /* 0000110 */
+       0xec, /* 1110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+
+       /* 186 0xba 'º' */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+
+       /* 187 0xbb '»' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0x0c, /* 0000110 */
+       0xec, /* 1110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+
+       /* 188 0xbc '¼' */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0xec, /* 1110110 */
+       0x0c, /* 0000110 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 189 0xbd '½' */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 190 0xbe '¾' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xf0, /* 1111000 */
+       0x30, /* 0011000 */
+       0xf0, /* 1111000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 191 0xbf '¿' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xf0, /* 1111000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 192 0xc0 'À' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x3e, /* 0011111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 193 0xc1 'Á' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xfe, /* 1111111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 194 0xc2 'Â' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfe, /* 1111111 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 195 0xc3 'Ã' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x3e, /* 0011111 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 196 0xc4 'Ä' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfe, /* 1111111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 197 0xc5 'Å' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xfe, /* 1111111 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 198 0xc6 'Æ' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x3e, /* 0011111 */
+       0x30, /* 0011000 */
+       0x3e, /* 0011111 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 199 0xc7 'Ç' */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6e, /* 0110111 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+
+       /* 200 0xc8 'È' */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6e, /* 0110111 */
+       0x60, /* 0110000 */
+       0x7e, /* 0111111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 201 0xc9 'É' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x7e, /* 0111111 */
+       0x60, /* 0110000 */
+       0x6e, /* 0110111 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+
+       /* 202 0xca 'Ê' */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0xee, /* 1110111 */
+       0x00, /* 0000000 */
+       0xfe, /* 1111111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 203 0xcb 'Ë' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfe, /* 1111111 */
+       0x00, /* 0000000 */
+       0xee, /* 1110111 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+
+       /* 204 0xcc 'Ì' */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6e, /* 0110111 */
+       0x60, /* 0110000 */
+       0x6e, /* 0110111 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+
+       /* 205 0xcd 'Í' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfe, /* 1111111 */
+       0x00, /* 0000000 */
+       0xfe, /* 1111111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 206 0xce 'Î' */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0xee, /* 1110111 */
+       0x00, /* 0000000 */
+       0xee, /* 1110111 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+
+       /* 207 0xcf 'Ï' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xfe, /* 1111111 */
+       0x00, /* 0000000 */
+       0xfe, /* 1111111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 208 0xd0 'Ð' */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0xfe, /* 1111111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 209 0xd1 'Ñ' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfe, /* 1111111 */
+       0x00, /* 0000000 */
+       0xfe, /* 1111111 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 210 0xd2 'Ò' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfe, /* 1111111 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+
+       /* 211 0xd3 'Ó' */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x7e, /* 0111111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 212 0xd4 'Ô' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x3e, /* 0011111 */
+       0x30, /* 0011000 */
+       0x3e, /* 0011111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 213 0xd5 'Õ' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x3e, /* 0011111 */
+       0x30, /* 0011000 */
+       0x3e, /* 0011111 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 214 0xd6 'Ö' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x7e, /* 0111111 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+
+       /* 215 0xd7 '×' */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0xfe, /* 1111111 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+
+       /* 216 0xd8 'Ø' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xfe, /* 1111111 */
+       0x30, /* 0011000 */
+       0xfe, /* 1111111 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 217 0xd9 'Ù' */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xf0, /* 1111000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 218 0xda 'Ú' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x3e, /* 0011111 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 219 0xdb 'Û' */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+
+       /* 220 0xdc 'Ü' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+
+       /* 221 0xdd 'Ý' */
+       0xe0, /* 1110000 */
+       0xe0, /* 1110000 */
+       0xe0, /* 1110000 */
+       0xe0, /* 1110000 */
+       0xe0, /* 1110000 */
+       0xe0, /* 1110000 */
+       0xe0, /* 1110000 */
+       0xe0, /* 1110000 */
+       0xe0, /* 1110000 */
+       0xe0, /* 1110000 */
+       0xe0, /* 1110000 */
+       0xe0, /* 1110000 */
+       0xe0, /* 1110000 */
+       0xe0, /* 1110000 */
+
+       /* 222 0xde 'Þ' */
+       0x1e, /* 0001111 */
+       0x1e, /* 0001111 */
+       0x1e, /* 0001111 */
+       0x1e, /* 0001111 */
+       0x1e, /* 0001111 */
+       0x1e, /* 0001111 */
+       0x1e, /* 0001111 */
+       0x1e, /* 0001111 */
+       0x1e, /* 0001111 */
+       0x1e, /* 0001111 */
+       0x1e, /* 0001111 */
+       0x1e, /* 0001111 */
+       0x1e, /* 0001111 */
+       0x1e, /* 0001111 */
+
+       /* 223 0xdf 'ß' */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 224 0xe0 'à' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x76, /* 0111011 */
+       0xdc, /* 1101110 */
+       0xd8, /* 1101100 */
+       0xd8, /* 1101100 */
+       0xd8, /* 1101100 */
+       0xdc, /* 1101110 */
+       0x76, /* 0111011 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 225 0xe1 'á' */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xd8, /* 1101100 */
+       0xcc, /* 1100110 */
+       0xc6, /* 1100011 */
+       0xc6, /* 1100011 */
+       0xc6, /* 1100011 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 226 0xe2 'â' */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 227 0xe3 'ã' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfe, /* 1111111 */
+       0xfe, /* 1111111 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 228 0xe4 'ä' */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0xcc, /* 1100110 */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 229 0xe5 'å' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x7e, /* 0111111 */
+       0xd8, /* 1101100 */
+       0xd8, /* 1101100 */
+       0xd8, /* 1101100 */
+       0xd8, /* 1101100 */
+       0xd8, /* 1101100 */
+       0x70, /* 0111000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 230 0xe6 'æ' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xf8, /* 1111100 */
+       0xc0, /* 1100000 */
+       0xc0, /* 1100000 */
+       0x80, /* 1000000 */
+
+       /* 231 0xe7 'ç' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x76, /* 0111011 */
+       0xdc, /* 1101110 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 232 0xe8 'è' */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0x30, /* 0011000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x30, /* 0011000 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 233 0xe9 'é' */
+       0x00, /* 0000000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xfc, /* 1111110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x6c, /* 0110110 */
+       0x38, /* 0011100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 234 0xea 'ê' */
+       0x00, /* 0000000 */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0xc6, /* 1100011 */
+       0xc6, /* 1100011 */
+       0xc6, /* 1100011 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0xee, /* 1110111 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 235 0xeb 'ë' */
+       0x00, /* 0000000 */
+       0x3c, /* 0011110 */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x18, /* 0001100 */
+       0x7c, /* 0111110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x78, /* 0111100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 236 0xec 'ì' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x7c, /* 0111110 */
+       0xd6, /* 1101011 */
+       0xd6, /* 1101011 */
+       0xd6, /* 1101011 */
+       0x7c, /* 0111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 237 0xed 'í' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x06, /* 0000011 */
+       0x0c, /* 0000110 */
+       0x7c, /* 0111110 */
+       0xd6, /* 1101011 */
+       0xd6, /* 1101011 */
+       0xe6, /* 1110011 */
+       0x7c, /* 0111110 */
+       0x60, /* 0110000 */
+       0xc0, /* 1100000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 238 0xee 'î' */
+       0x00, /* 0000000 */
+       0x1c, /* 0001110 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x7c, /* 0111110 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x1c, /* 0001110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 239 0xef 'ï' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0xcc, /* 1100110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 240 0xf0 'ð' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 241 0xf1 'ñ' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0xfc, /* 1111110 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 242 0xf2 'ò' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x18, /* 0001100 */
+       0x0c, /* 0000110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 243 0xf3 'ó' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x60, /* 0110000 */
+       0xc0, /* 1100000 */
+       0x60, /* 0110000 */
+       0x30, /* 0011000 */
+       0x18, /* 0001100 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 244 0xf4 'ô' */
+       0x00, /* 0000000 */
+       0x1c, /* 0001110 */
+       0x36, /* 0011011 */
+       0x36, /* 0011011 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+
+       /* 245 0xf5 'õ' */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0xd8, /* 1101100 */
+       0xd8, /* 1101100 */
+       0xd8, /* 1101100 */
+       0x70, /* 0111000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 246 0xf6 'ö' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 247 0xf7 '÷' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x76, /* 0111011 */
+       0xdc, /* 1101110 */
+       0x00, /* 0000000 */
+       0x76, /* 0111011 */
+       0xdc, /* 1101110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 248 0xf8 'ø' */
+       0x38, /* 0011100 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x38, /* 0011100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 249 0xf9 'ù' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 250 0xfa 'ú' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x30, /* 0011000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 251 0xfb 'û' */
+       0x1e, /* 0001111 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0x18, /* 0001100 */
+       0xd8, /* 1101100 */
+       0xd8, /* 1101100 */
+       0xd8, /* 1101100 */
+       0x78, /* 0111100 */
+       0x38, /* 0011100 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 252 0xfc 'ü' */
+       0xd8, /* 1101100 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x6c, /* 0110110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 253 0xfd 'ý' */
+       0x78, /* 0111100 */
+       0xcc, /* 1100110 */
+       0x18, /* 0001100 */
+       0x30, /* 0011000 */
+       0x64, /* 0110010 */
+       0xfc, /* 1111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 254 0xfe 'þ' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x7c, /* 0111110 */
+       0x7c, /* 0111110 */
+       0x7c, /* 0111110 */
+       0x7c, /* 0111110 */
+       0x7c, /* 0111110 */
+       0x7c, /* 0111110 */
+       0x7c, /* 0111110 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+       /* 255 0xff 'ÿ' */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+       0x00, /* 0000000 */
+
+};
+
+
+struct font_desc font_7x14 = {
+       FONT7x14_IDX,
+       "7x14",
+       7,
+       14,
+       fontdata_7x14,
+       0
+};
index 05215d0c3e0951707c46747524d9bcf21e4c509a..c7bd967ea1000ed91ec4f73a73dbec2d0e8c7fbb 100644 (file)
@@ -29,24 +29,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 1 0x01 '^A' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x1f, 0xc0, /* 000111111100 */
+       0x30, 0x60, /* 001100000110 */
+       0x65, 0x30, /* 011001010011 */
+       0x6d, 0xb0, /* 011011011011 */
+       0x60, 0x30, /* 011000000011 */
+       0x62, 0x30, /* 011000100011 */
+       0x62, 0x30, /* 011000100011 */
+       0x60, 0x30, /* 011000000011 */
+       0x6f, 0xb0, /* 011011111011 */
+       0x67, 0x30, /* 011001110011 */
+       0x30, 0x60, /* 001100000110 */
+       0x1f, 0xc0, /* 000111111100 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -54,24 +53,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 2 0x02 '^B' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x1f, 0xc0, /* 000111111100 */
+       0x3f, 0xe0, /* 001111111110 */
+       0x7a, 0xf0, /* 011110101111 */
+       0x72, 0x70, /* 011100100111 */
+       0x7f, 0xf0, /* 011111111111 */
+       0x7d, 0xf0, /* 011111011111 */
+       0x7d, 0xf0, /* 011111011111 */
+       0x7f, 0xf0, /* 011111111111 */
+       0x70, 0x70, /* 011100000111 */
+       0x78, 0xf0, /* 011110001111 */
+       0x3f, 0xe0, /* 001111111110 */
+       0x1f, 0xc0, /* 000111111100 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -79,24 +77,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 3 0x03 '^C' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x19, 0x80, /* 000110011000 */
        0x3f, 0xc0, /* 001111111100 */
+       0x7f, 0xe0, /* 011111111110 */
        0x3f, 0xc0, /* 001111111100 */
        0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x1f, 0x80, /* 000111111000 */
+       0x1f, 0x80, /* 000111111000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x06, 0x00, /* 000001100000 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -104,24 +101,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 4 0x04 '^D' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x02, 0x00, /* 000000100000 */
+       0x07, 0x00, /* 000001110000 */
+       0x0f, 0x80, /* 000011111000 */
+       0x0f, 0x80, /* 000011111000 */
+       0x1f, 0xc0, /* 000111111100 */
+       0x1f, 0xc0, /* 000111111100 */
+       0x3f, 0xe0, /* 001111111110 */
+       0x1f, 0xc0, /* 000111111100 */
+       0x1f, 0xc0, /* 000111111100 */
+       0x0f, 0x80, /* 000011111000 */
+       0x0f, 0x80, /* 000011111000 */
+       0x07, 0x00, /* 000001110000 */
+       0x02, 0x00, /* 000000100000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -129,24 +125,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 5 0x05 '^E' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x02, 0x00, /* 000000100000 */
+       0x07, 0x00, /* 000001110000 */
+       0x07, 0x00, /* 000001110000 */
+       0x02, 0x00, /* 000000100000 */
+       0x18, 0xc0, /* 000110001100 */
+       0x3d, 0xe0, /* 001111011110 */
+       0x3d, 0xe0, /* 001111011110 */
+       0x1a, 0xc0, /* 000110101100 */
+       0x02, 0x00, /* 000000100000 */
+       0x07, 0x00, /* 000001110000 */
+       0x0f, 0x80, /* 000011111000 */
+       0x1f, 0xc0, /* 000111111100 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -154,23 +149,22 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 6 0x06 '^F' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x06, 0x00, /* 000001100000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x1f, 0x80, /* 000111111000 */
+       0x1f, 0x80, /* 000111111000 */
        0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x36, 0xc0, /* 001101101100 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x1f, 0x80, /* 000111111000 */
        0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -179,24 +173,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 7 0x07 '^G' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x06, 0x00, /* 000001100000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x1f, 0x80, /* 000111111000 */
+       0x1f, 0x80, /* 000111111000 */
        0x3f, 0xc0, /* 001111111100 */
        0x3f, 0xc0, /* 001111111100 */
+       0x1f, 0x80, /* 000111111000 */
+       0x1f, 0x80, /* 000111111000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x06, 0x00, /* 000001100000 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -204,49 +197,47 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 8 0x08 '^H' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xf9, 0xf0, /* 111110011111 */
+       0xf0, 0xf0, /* 111100001111 */
+       0xf0, 0xf0, /* 111100001111 */
+       0xe0, 0x70, /* 111000000111 */
+       0xe0, 0x70, /* 111000000111 */
+       0xc0, 0x30, /* 110000000011 */
+       0xc0, 0x30, /* 110000000011 */
+       0xe0, 0x70, /* 111000000111 */
+       0xe0, 0x70, /* 111000000111 */
+       0xf0, 0xf0, /* 111100001111 */
+       0xf0, 0xf0, /* 111100001111 */
+       0xf9, 0xf0, /* 111110011111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
 
        /* 9 0x09 '^I' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x06, 0x00, /* 000001100000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x19, 0x80, /* 000110011000 */
+       0x19, 0x80, /* 000110011000 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0xc0, /* 001100001100 */
+       0x19, 0x80, /* 000110011000 */
+       0x19, 0x80, /* 000110011000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x06, 0x00, /* 000001100000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -254,74 +245,71 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 10 0x0a '^J' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xf9, 0xf0, /* 111110011111 */
+       0xf0, 0xf0, /* 111100001111 */
+       0xf0, 0xf0, /* 111100001111 */
+       0xe6, 0x70, /* 111001100111 */
+       0xe6, 0x70, /* 111001100111 */
+       0xcf, 0x30, /* 110011110011 */
+       0xcf, 0x30, /* 110011110011 */
+       0xe6, 0x70, /* 111001100111 */
+       0xe6, 0x70, /* 111001100111 */
+       0xf0, 0xf0, /* 111100001111 */
+       0xf0, 0xf0, /* 111100001111 */
+       0xf9, 0xf0, /* 111110011111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
 
        /* 11 0x0b '^K' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x0f, 0xe0, /* 000011111110 */
+       0x0f, 0xe0, /* 000011111110 */
+       0x01, 0xe0, /* 000000011110 */
+       0x03, 0x60, /* 000000110110 */
+       0x06, 0x60, /* 000001100110 */
+       0x1e, 0x00, /* 000111100000 */
+       0x33, 0x00, /* 001100110000 */
+       0x33, 0x00, /* 001100110000 */
+       0x61, 0x80, /* 011000011000 */
+       0x61, 0x80, /* 011000011000 */
+       0x33, 0x00, /* 001100110000 */
+       0x33, 0x00, /* 001100110000 */
+       0x1e, 0x00, /* 000111100000 */
+       0x0c, 0x00, /* 000011000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
 
        /* 12 0x0c '^L' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x06, 0x00, /* 000001100000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x19, 0x80, /* 000110011000 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0xc0, /* 001100001100 */
+       0x19, 0x80, /* 000110011000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
        0x3f, 0xc0, /* 001111111100 */
        0x3f, 0xc0, /* 001111111100 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -329,149 +317,143 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 13 0x0d '^M' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x0f, 0xe0, /* 000011111110 */
+       0x0c, 0x60, /* 000011000110 */
+       0x0c, 0x60, /* 000011000110 */
+       0x0f, 0xe0, /* 000011111110 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x3c, 0x00, /* 001111000000 */
+       0x7c, 0x00, /* 011111000000 */
+       0x78, 0x00, /* 011110000000 */
+       0x30, 0x00, /* 001100000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
 
        /* 14 0x0e '^N' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x1f, 0xe0, /* 000111111110 */
+       0x18, 0x60, /* 000110000110 */
+       0x18, 0x60, /* 000110000110 */
+       0x1f, 0xe0, /* 000111111110 */
+       0x18, 0x60, /* 000110000110 */
+       0x18, 0x60, /* 000110000110 */
+       0x18, 0x60, /* 000110000110 */
+       0x18, 0x60, /* 000110000110 */
+       0x18, 0x60, /* 000110000110 */
+       0x18, 0x60, /* 000110000110 */
+       0x19, 0xe0, /* 000110011110 */
+       0x1b, 0xe0, /* 000110111110 */
+       0x1b, 0xc0, /* 000110111100 */
+       0x79, 0x80, /* 011110011000 */
+       0xf8, 0x00, /* 111110000000 */
+       0xf0, 0x00, /* 111100000000 */
+       0x60, 0x00, /* 011000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
 
        /* 15 0x0f '^O' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x18, 0xc0, /* 000110001100 */
+       0x0d, 0x80, /* 000011011000 */
+       0x6d, 0xb0, /* 011011011011 */
+       0x3d, 0xe0, /* 001111011110 */
        0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-
-       /* 16 0x10 '^P' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
+       0x3d, 0xe0, /* 001111011110 */
+       0x6d, 0xb0, /* 011011011011 */
+       0x0d, 0x80, /* 000011011000 */
+       0x18, 0xc0, /* 000110001100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+
+       /* 16 0x10 '^P' */
        0x00, 0x00, /* 000000000000 */
+       0x00, 0x20, /* 000000000010 */
+       0x00, 0x60, /* 000000000110 */
+       0x00, 0xe0, /* 000000001110 */
+       0x01, 0xe0, /* 000000011110 */
+       0x03, 0xe0, /* 000000111110 */
+       0x07, 0xe0, /* 000001111110 */
+       0x0f, 0xe0, /* 000011111110 */
+       0x1f, 0xe0, /* 000111111110 */
+       0x3f, 0xe0, /* 001111111110 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x3f, 0xe0, /* 001111111110 */
+       0x1f, 0xe0, /* 000111111110 */
+       0x0f, 0xe0, /* 000011111110 */
+       0x07, 0xe0, /* 000001111110 */
+       0x03, 0xe0, /* 000000111110 */
+       0x01, 0xe0, /* 000000011110 */
+       0x00, 0xe0, /* 000000001110 */
+       0x00, 0x60, /* 000000000110 */
+       0x00, 0x20, /* 000000000010 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
 
        /* 17 0x11 '^Q' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x40, 0x00, /* 010000000000 */
+       0x60, 0x00, /* 011000000000 */
+       0x70, 0x00, /* 011100000000 */
+       0x78, 0x00, /* 011110000000 */
+       0x7c, 0x00, /* 011111000000 */
+       0x7e, 0x00, /* 011111100000 */
+       0x7f, 0x00, /* 011111110000 */
+       0x7f, 0x80, /* 011111111000 */
+       0x7f, 0xc0, /* 011111111100 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xc0, /* 011111111100 */
+       0x7f, 0x80, /* 011111111000 */
+       0x7f, 0x00, /* 011111110000 */
+       0x7e, 0x00, /* 011111100000 */
+       0x7c, 0x00, /* 011111000000 */
+       0x78, 0x00, /* 011110000000 */
+       0x70, 0x00, /* 011100000000 */
+       0x60, 0x00, /* 011000000000 */
+       0x40, 0x00, /* 010000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
 
        /* 18 0x12 '^R' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x04, 0x00, /* 000001000000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x1f, 0x00, /* 000111110000 */
+       0x3f, 0x80, /* 001111111000 */
+       0x7f, 0xc0, /* 011111111100 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x7f, 0xc0, /* 011111111100 */
+       0x3f, 0x80, /* 001111111000 */
+       0x1f, 0x00, /* 000111110000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x04, 0x00, /* 000001000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -551,99 +533,95 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 22 0x16 '^V' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-
-       /* 23 0x17 '^W' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
 
-       /* 24 0x18 '^X' */
-       /* FIXME */
+       /* 23 0x17 '^W' */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x04, 0x00, /* 000001000000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x1f, 0x00, /* 000111110000 */
+       0x3f, 0x80, /* 001111111000 */
+       0x7f, 0xc0, /* 011111111100 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x7f, 0xc0, /* 011111111100 */
+       0x3f, 0x80, /* 001111111000 */
+       0x1f, 0x00, /* 000111110000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x04, 0x00, /* 000001000000 */
        0x00, 0x00, /* 000000000000 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+
+       /* 24 0x18 '^X' */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-
-       /* 25 0x19 '^Y' */
-       /* FIXME */
+       0x04, 0x00, /* 000001000000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x1f, 0x00, /* 000111110000 */
+       0x3f, 0x80, /* 001111111000 */
+       0x7f, 0xc0, /* 011111111100 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x00, 0x00, /* 000000000000 */
+
+       /* 25 0x19 '^Y' */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x7f, 0xc0, /* 011111111100 */
+       0x3f, 0x80, /* 001111111000 */
+       0x1f, 0x00, /* 000111110000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x04, 0x00, /* 000001000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -651,24 +629,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 26 0x1a '^Z' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x00, 0x00, /* 000000000000 */
+       0x08, 0x00, /* 000010000000 */
+       0x18, 0x00, /* 000110000000 */
+       0x38, 0x00, /* 001110000000 */
+       0x7f, 0xe0, /* 011111111110 */
+       0xff, 0xe0, /* 111111111110 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x38, 0x00, /* 001110000000 */
+       0x18, 0x00, /* 000110000000 */
+       0x08, 0x00, /* 000010000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -676,24 +653,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 27 0x1b '^[' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x00, 0x00, /* 000000000000 */
+       0x01, 0x00, /* 000000010000 */
+       0x01, 0x80, /* 000000011000 */
+       0x01, 0xc0, /* 000000011100 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xf0, /* 011111111111 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x01, 0xc0, /* 000000011100 */
+       0x01, 0x80, /* 000000011000 */
+       0x01, 0x00, /* 000000010000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -701,24 +677,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 28 0x1c '^\' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x3f, 0xe0, /* 001111111110 */
+       0x3f, 0xe0, /* 001111111110 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -726,24 +701,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 29 0x1d '^]' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x00, 0x00, /* 000000000000 */
+       0x09, 0x00, /* 000010010000 */
+       0x19, 0x80, /* 000110011000 */
+       0x39, 0xc0, /* 001110011100 */
+       0x7f, 0xe0, /* 011111111110 */
+       0xff, 0xf0, /* 111111111111 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x39, 0xc0, /* 001110011100 */
+       0x19, 0x80, /* 000110011000 */
+       0x09, 0x00, /* 000010010000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -751,24 +725,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 30 0x1e '^^' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x00, 0x00, /* 000000000000 */
+       0x04, 0x00, /* 000001000000 */
+       0x04, 0x00, /* 000001000000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x1f, 0x00, /* 000111110000 */
+       0x1f, 0x00, /* 000111110000 */
+       0x3f, 0x80, /* 001111111000 */
+       0x3f, 0x80, /* 001111111000 */
+       0x7f, 0xc0, /* 011111111100 */
+       0x7f, 0xc0, /* 011111111100 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -776,24 +749,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 31 0x1f '^_' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x00, 0x00, /* 000000000000 */
+       0x7f, 0xc0, /* 011111111100 */
+       0x7f, 0xc0, /* 011111111100 */
+       0x3f, 0x80, /* 001111111000 */
+       0x3f, 0x80, /* 001111111000 */
+       0x1f, 0x00, /* 000111110000 */
+       0x1f, 0x00, /* 000111110000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x04, 0x00, /* 000001000000 */
+       0x04, 0x00, /* 000001000000 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -3081,29 +3053,28 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 127 0x7f '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0xff, 0xf0, /* 111111111111 */
+       0xff, 0xf0, /* 111111111111 */
+       0x00, 0x00, /* 000000000000 */
 
        /* 128 0x80 '.' */
        0x00, 0x00, /* 000000000000 */
@@ -3826,24 +3797,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 158 0x9e '.' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x7f, 0x80, /* 011111111000 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0x60, /* 001100000110 */
+       0x30, 0x60, /* 001100000110 */
+       0x30, 0x60, /* 001100000110 */
+       0x30, 0xc0, /* 001100001100 */
+       0x37, 0x80, /* 001101111000 */
+       0x30, 0x00, /* 001100000000 */
+       0x33, 0x00, /* 001100110000 */
+       0x37, 0x80, /* 001101111000 */
+       0x33, 0x00, /* 001100110000 */
+       0x33, 0x00, /* 001100110000 */
+       0x33, 0x30, /* 001100110011 */
+       0x31, 0xe0, /* 001100011110 */
+       0x78, 0xc0, /* 011110001100 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -3851,28 +3821,27 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 159 0x9f '.' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x00, 0xc0, /* 000000001100 */
+       0x01, 0xe0, /* 000000011110 */
+       0x03, 0x30, /* 000000110011 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x3f, 0xe0, /* 001111111110 */
+       0x7f, 0xc0, /* 011111111100 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0xcc, 0x00, /* 110011000000 */
+       0x78, 0x00, /* 011110000000 */
+       0x30, 0x00, /* 001100000000 */
        0x00, 0x00, /* 000000000000 */
 
        /* 160 0xa0 '.' */
@@ -4092,24 +4061,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 169 0xa9 '.' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x3f, 0xc0, /* 001111111100 */
        0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5413,24 +5381,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 224 0xe0 '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x00, 0x00, /* 000000000000 */
+       0x0f, 0x60, /* 000011110110 */
+       0x13, 0xe0, /* 000100111110 */
+       0x21, 0xc0, /* 001000011100 */
+       0x60, 0xc0, /* 011000001100 */
+       0x60, 0xc0, /* 011000001100 */
+       0x60, 0xc0, /* 011000001100 */
+       0x60, 0xc0, /* 011000001100 */
+       0x70, 0x80, /* 011100001000 */
+       0x39, 0xc0, /* 001110011100 */
+       0x1f, 0x60, /* 000111110110 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5462,24 +5429,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 226 0xe2 '.' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x3f, 0xe0, /* 001111111110 */
+       0x3f, 0xe0, /* 001111111110 */
+       0x30, 0x60, /* 001100000110 */
+       0x30, 0x60, /* 001100000110 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x00, /* 001100000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5487,49 +5453,47 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 227 0xe3 '.' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x19, 0x80, /* 000110011000 */
+       0x19, 0x80, /* 000110011000 */
+       0x19, 0x80, /* 000110011000 */
+       0x19, 0x80, /* 000110011000 */
+       0x19, 0x80, /* 000110011000 */
+       0x19, 0x80, /* 000110011000 */
+       0x19, 0x80, /* 000110011000 */
+       0x19, 0x80, /* 000110011000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-
-       /* 228 0xe4 '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+
+       /* 228 0xe4 '.' */
        0x00, 0x00, /* 000000000000 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x60, 0x60, /* 011000000110 */
+       0x30, 0x60, /* 001100000110 */
+       0x30, 0x00, /* 001100000000 */
+       0x18, 0x00, /* 000110000000 */
+       0x18, 0x00, /* 000110000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x18, 0x00, /* 000110000000 */
+       0x18, 0x00, /* 000110000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x60, /* 001100000110 */
+       0x60, 0x60, /* 011000000110 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5537,24 +5501,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 229 0xe5 '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x07, 0xe0, /* 000001111110 */
+       0x0f, 0xe0, /* 000011111110 */
+       0x13, 0x80, /* 000100111000 */
+       0x21, 0xc0, /* 001000011100 */
+       0x60, 0xc0, /* 011000001100 */
+       0x60, 0xc0, /* 011000001100 */
+       0x60, 0xc0, /* 011000001100 */
+       0x60, 0xc0, /* 011000001100 */
+       0x70, 0x80, /* 011100001000 */
+       0x39, 0x00, /* 001110010000 */
+       0x1e, 0x00, /* 000111100000 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5586,24 +5549,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 231 0xe7 '.' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x19, 0x80, /* 000110011000 */
        0x3f, 0xc0, /* 001111111100 */
+       0x66, 0x60, /* 011001100110 */
+       0x66, 0x60, /* 011001100110 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5611,24 +5573,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 232 0xe8 '.' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x19, 0x80, /* 000110011000 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0xc0, /* 001100001100 */
+       0x19, 0x80, /* 000110011000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5636,24 +5597,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 233 0xe9 '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x0f, 0x00, /* 000011110000 */
+       0x1f, 0x80, /* 000111111000 */
+       0x30, 0xc0, /* 001100001100 */
+       0x60, 0x60, /* 011000000110 */
+       0x60, 0x60, /* 011000000110 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x60, 0x60, /* 011000000110 */
+       0x60, 0x60, /* 011000000110 */
+       0x30, 0xc0, /* 001100001100 */
+       0x1f, 0x80, /* 000111111000 */
+       0x0f, 0x00, /* 000011110000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5661,24 +5621,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 234 0xea '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x1f, 0x00, /* 000111110000 */
+       0x31, 0x80, /* 001100011000 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0xc0, /* 001100001100 */
+       0x60, 0x60, /* 011000000110 */
+       0x60, 0x60, /* 011000000110 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0xc0, /* 001100001100 */
+       0x19, 0x80, /* 000110011000 */
+       0x19, 0x80, /* 000110011000 */
+       0xd9, 0xb0, /* 110110011011 */
+       0x79, 0xe0, /* 011110011110 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5686,24 +5645,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 235 0xeb '.' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x07, 0x80, /* 000001111000 */
+       0x0c, 0xc0, /* 000011001100 */
+       0x18, 0x60, /* 000110000110 */
+       0x18, 0x00, /* 000110000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x06, 0x00, /* 000001100000 */
+       0x03, 0x00, /* 000000110000 */
+       0x0f, 0x80, /* 000011111000 */
+       0x11, 0xc0, /* 000100011100 */
+       0x20, 0xe0, /* 001000001110 */
+       0x60, 0x60, /* 011000000110 */
+       0x60, 0x60, /* 011000000110 */
+       0x70, 0x40, /* 011100000100 */
+       0x38, 0x80, /* 001110001000 */
+       0x1f, 0x00, /* 000111110000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5711,74 +5669,71 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 236 0xec '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x39, 0xc0, /* 001110011100 */
+       0x6f, 0x60, /* 011011110110 */
+       0x66, 0x60, /* 011001100110 */
+       0xc6, 0x30, /* 110001100011 */
+       0xc6, 0x30, /* 110001100011 */
+       0x66, 0x60, /* 011001100110 */
+       0x6f, 0x60, /* 011011110110 */
+       0x39, 0xc0, /* 001110011100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-
-       /* 237 0xed '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+
+       /* 237 0xed '.' */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x00, 0xc0, /* 000000001100 */
+       0x00, 0xc0, /* 000000001100 */
+       0x01, 0x80, /* 000000011000 */
+       0x01, 0x80, /* 000000011000 */
+       0x3b, 0xc0, /* 001110111100 */
+       0x6f, 0x60, /* 011011110110 */
+       0x66, 0x60, /* 011001100110 */
+       0xc6, 0x30, /* 110001100011 */
+       0xc6, 0x30, /* 110001100011 */
+       0x66, 0x60, /* 011001100110 */
+       0x6f, 0x60, /* 011011110110 */
+       0x3d, 0xc0, /* 001111011100 */
+       0x18, 0x00, /* 000110000000 */
+       0x18, 0x00, /* 000110000000 */
+       0x30, 0x00, /* 001100000000 */
+       0x30, 0x00, /* 001100000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
 
        /* 238 0xee '.' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x01, 0xc0, /* 000000011100 */
+       0x03, 0x00, /* 000000110000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x18, 0x00, /* 000110000000 */
+       0x1f, 0xc0, /* 000111111100 */
+       0x18, 0x00, /* 000110000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x03, 0x00, /* 000000110000 */
+       0x01, 0xc0, /* 000000011100 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5786,24 +5741,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 239 0xef '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x0f, 0x00, /* 000011110000 */
+       0x1f, 0x80, /* 000111111000 */
+       0x39, 0xc0, /* 001110011100 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0xc0, /* 001100001100 */
+       0x30, 0xc0, /* 001100001100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5811,24 +5765,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 240 0xf0 '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5860,24 +5813,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 242 0xf2 '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x60, 0x00, /* 011000000000 */
+       0x38, 0x00, /* 001110000000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x03, 0x80, /* 000000111000 */
+       0x00, 0xe0, /* 000000001110 */
+       0x00, 0xe0, /* 000000001110 */
+       0x03, 0x80, /* 000000111000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x38, 0x00, /* 001110000000 */
+       0x60, 0x00, /* 011000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5885,24 +5837,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 243 0xf3 '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x00, 0x60, /* 000000000110 */
+       0x01, 0xc0, /* 000000011100 */
+       0x07, 0x00, /* 000001110000 */
+       0x1c, 0x00, /* 000111000000 */
+       0x70, 0x00, /* 011100000000 */
+       0x70, 0x00, /* 011100000000 */
+       0x1c, 0x00, /* 000111000000 */
+       0x07, 0x00, /* 000001110000 */
+       0x01, 0xc0, /* 000000011100 */
+       0x00, 0x60, /* 000000000110 */
        0x00, 0x00, /* 000000000000 */
+       0x7f, 0xe0, /* 011111111110 */
+       0x7f, 0xe0, /* 011111111110 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -5910,54 +5861,52 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 244 0xf4 '.' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x03, 0x80, /* 000000111000 */
+       0x07, 0xc0, /* 000001111100 */
+       0x0c, 0x60, /* 000011000110 */
+       0x0c, 0x60, /* 000011000110 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
+       0x0c, 0x00, /* 000011000000 */
 
        /* 245 0xf5 '.' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x1c, 0x00, /* 000111000000 */
+       0x3e, 0x00, /* 001111100000 */
+       0x63, 0x00, /* 011000110000 */
+       0x63, 0x00, /* 011000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
+       0x03, 0x00, /* 000000110000 */
 
        /* 246 0xf6 '.' */
        0x00, 0x00, /* 000000000000 */
@@ -5984,24 +5933,23 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 247 0xf7 '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x38, 0x00, /* 001110000000 */
+       0x6c, 0x00, /* 011011000000 */
+       0x06, 0x30, /* 000001100011 */
+       0x03, 0x60, /* 000000110110 */
+       0x39, 0xc0, /* 001110011100 */
+       0x6c, 0x00, /* 011011000000 */
+       0x06, 0x30, /* 000001100011 */
+       0x03, 0x60, /* 000000110110 */
+       0x01, 0xc0, /* 000000011100 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -6033,44 +5981,31 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
 
        /* 249 0xf9 '.' */
-       /* FIXME */
-       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-
-       /* 250 0xfa '.' */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x1c, 0x00, /* 000111000000 */
+       0x3e, 0x00, /* 001111100000 */
+       0x3e, 0x00, /* 001111100000 */
+       0x3e, 0x00, /* 001111100000 */
+       0x1c, 0x00, /* 000111000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+
+       /* 250 0xfa '.' */
        0x00, 0x00, /* 000000000000 */
-       0x06, 0x00, /* 000001100000 */
-       0x0f, 0x00, /* 000011110000 */
-       0x0f, 0x00, /* 000011110000 */
-       0x06, 0x00, /* 000001100000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
@@ -6080,51 +6015,61 @@ static unsigned char fontdata_sun12x22[FONTDATAMAX] = {
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-
-       /* 251 0xfb '.' */
-       /* FIXME */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+       0x18, 0x00, /* 000110000000 */
+       0x3c, 0x00, /* 001111000000 */
+       0x3c, 0x00, /* 001111000000 */
+       0x18, 0x00, /* 000110000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
+
+       /* 251 0xfb '.' */
        0x00, 0x00, /* 000000000000 */
+       0x07, 0xe0, /* 000001111110 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x06, 0x00, /* 000001100000 */
+       0xc6, 0x00, /* 110001100000 */
+       0x66, 0x00, /* 011001100000 */
+       0x36, 0x00, /* 001101100000 */
+       0x1e, 0x00, /* 000111100000 */
+       0x0e, 0x00, /* 000011100000 */
+       0x06, 0x00, /* 000001100000 */
+       0x02, 0x00, /* 000000100000 */
        0x00, 0x00, /* 000000000000 */
 
        /* 252 0xfc '.' */
-       /* FIXME */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x13, 0x80, /* 000100111000 */
+       0x3d, 0xc0, /* 001111011100 */
+       0x18, 0xc0, /* 000110001100 */
+       0x18, 0xc0, /* 000110001100 */
+       0x18, 0xc0, /* 000110001100 */
+       0x18, 0xc0, /* 000110001100 */
+       0x3d, 0xe0, /* 001111011110 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
+       0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
-       0x3f, 0xc0, /* 001111111100 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
        0x00, 0x00, /* 000000000000 */
index 465d678230ae84adefdd7a8ba1386a61a8258652..e79b297026490531dc39fdd4767f7ca319aa4772 100644 (file)
@@ -36,6 +36,10 @@ static struct font_desc *fonts[] = {
 #undef NO_FONTS
     &font_vga_6x11,
 #endif
+#ifdef CONFIG_FONT_7x14
+#undef NO_FONTS
+    &font_7x14,
+#endif
 #ifdef CONFIG_FONT_SUN8x16
 #undef NO_FONTS
     &font_sun_8x16,
@@ -44,6 +48,10 @@ static struct font_desc *fonts[] = {
 #undef NO_FONTS
     &font_sun_12x22,
 #endif
+#ifdef CONFIG_FONT_10x18
+#undef NO_FONTS
+    &font_10x18,
+#endif
 #ifdef CONFIG_FONT_ACORN_8x8
 #undef NO_FONTS
     &font_acorn_8x8,
index bcf59b28a14f33953bfc4fc10060ec340d479346..d27fa91e58869edf4e834b7d7a5b43ae01f8292c 100644 (file)
@@ -95,6 +95,7 @@ static unsigned long vgacon_uni_pagedir[2];
 /* Description of the hardware situation */
 static unsigned long   vga_vram_base;          /* Base of video memory */
 static unsigned long   vga_vram_end;           /* End of video memory */
+static int             vga_vram_size;          /* Size of video memory */
 static u16             vga_video_port_reg;     /* Video register select port */
 static u16             vga_video_port_val;     /* Video register value port */
 static unsigned int    vga_video_num_columns;  /* Number of text columns */
@@ -288,6 +289,7 @@ static const char __init *vgacon_startup(void)
 
        vga_vram_base = VGA_MAP_MEM(vga_vram_base);
        vga_vram_end = VGA_MAP_MEM(vga_vram_end);
+       vga_vram_size = vga_vram_end - vga_vram_base;
 
        /*
         *      Find out if there is a graphics card present.
@@ -504,9 +506,13 @@ static int vgacon_switch(struct vc_data *c)
         */
        vga_video_num_columns = c->vc_cols;
        vga_video_num_lines = c->vc_rows;
+
+       /* We can only copy out the size of the video buffer here,
+        * otherwise we get into VGA BIOS */
+
        if (!vga_is_gfx)
                scr_memcpyw((u16 *) c->vc_origin, (u16 *) c->vc_screenbuf,
-                           c->vc_screenbuf_size);
+                           c->vc_screenbuf_size > vga_vram_size ? vga_vram_size : c->vc_screenbuf_size);
        return 0;               /* Redrawing not needed */
 }
 
@@ -961,7 +967,6 @@ static int vgacon_scrolldelta(struct vc_data *c, int lines)
        if (!lines)             /* Turn scrollback off */
                c->vc_visible_origin = c->vc_origin;
        else {
-               int vram_size = vga_vram_end - vga_vram_base;
                int margin = c->vc_size_row * 4;
                int ul, we, p, st;
 
@@ -971,7 +976,7 @@ static int vgacon_scrolldelta(struct vc_data *c, int lines)
                        we = vga_rolled_over + c->vc_size_row;
                } else {
                        ul = 0;
-                       we = vram_size;
+                       we = vga_vram_size;
                }
                p = (c->vc_visible_origin - vga_vram_base - ul + we) % we +
                    lines * c->vc_size_row;
@@ -1012,9 +1017,13 @@ static void vgacon_save_screen(struct vc_data *c)
                c->vc_x = ORIG_X;
                c->vc_y = ORIG_Y;
        }
+
+       /* We can't copy in more then the size of the video buffer,
+        * or we'll be copying in VGA BIOS */
+
        if (!vga_is_gfx)
                scr_memcpyw((u16 *) c->vc_screenbuf, (u16 *) c->vc_origin,
-                           c->vc_screenbuf_size);
+                           c->vc_screenbuf_size > vga_vram_size ? vga_vram_size : c->vc_screenbuf_size);
 }
 
 static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
index 7705070191d94077373ead5b2176598780d360a3..2222de6ad8446b8d77ec879cf04ecface133fa83 100644 (file)
@@ -76,70 +76,22 @@ int fb_get_color_depth(struct fb_var_screeninfo *var)
 EXPORT_SYMBOL(fb_get_color_depth);
 
 /*
- * Drawing helpers.
+ * Data padding functions.
  */
-void fb_iomove_buf_aligned(struct fb_info *info, struct fb_pixmap *buf,
-                          u8 *dst, u32 d_pitch, u8 *src, u32 s_pitch,
-                          u32 height)
+void fb_pad_aligned_buffer(u8 *dst, u32 d_pitch, u8 *src, u32 s_pitch, u32 height)
 {
        int i;
 
        for (i = height; i--; ) {
-               buf->outbuf(info, dst, src, s_pitch);
+               memcpy(dst, src, s_pitch);
                src += s_pitch;
                dst += d_pitch;
        }
 }
+EXPORT_SYMBOL(fb_pad_aligned_buffer);
 
-void fb_sysmove_buf_aligned(struct fb_info *info, struct fb_pixmap *buf,
-                           u8 *dst, u32 d_pitch, u8 *src, u32 s_pitch,
-                           u32 height)
-{
-       int i, j;
-
-       for (i = height; i--; ) {
-               for (j = 0; j < s_pitch; j++)
-                       dst[j] = src[j];
-               src += s_pitch;
-               dst += d_pitch;
-       }
-}
-
-void fb_iomove_buf_unaligned(struct fb_info *info, struct fb_pixmap *buf,
-                            u8 *dst, u32 d_pitch, u8 *src, u32 idx,
-                            u32 height, u32 shift_high, u32 shift_low,
-                            u32 mod)
-{
-       u8 mask = (u8) (0xfff << shift_high), tmp;
-       int i, j;
-
-       for (i = height; i--; ) {
-               for (j = 0; j < idx; j++) {
-                       tmp = buf->inbuf(info, dst+j);
-                       tmp &= mask;
-                       tmp |= *src >> shift_low;
-                       buf->outbuf(info, dst+j, &tmp, 1);
-                       tmp = *src << shift_high;
-                       buf->outbuf(info, dst+j+1, &tmp, 1);
-                       src++;
-               }
-               tmp = buf->inbuf(info, dst+idx);
-               tmp &= mask;
-               tmp |= *src >> shift_low;
-               buf->outbuf(info, dst+idx, &tmp, 1);
-               if (shift_high < mod) {
-                       tmp = *src << shift_high;
-                       buf->outbuf(info, dst+idx+1, &tmp, 1);
-               }       
-               src++;
-               dst += d_pitch;
-       }
-}
-
-void fb_sysmove_buf_unaligned(struct fb_info *info, struct fb_pixmap *buf,
-                             u8 *dst, u32 d_pitch, u8 *src, u32 idx,
-                             u32 height, u32 shift_high, u32 shift_low,
-                             u32 mod)
+void fb_pad_unaligned_buffer(u8 *dst, u32 d_pitch, u8 *src, u32 idx, u32 height,
+                               u32 shift_high, u32 shift_low, u32 mod)
 {
        u8 mask = (u8) (0xfff << shift_high), tmp;
        int i, j;
@@ -166,6 +118,7 @@ void fb_sysmove_buf_unaligned(struct fb_info *info, struct fb_pixmap *buf,
                dst += d_pitch;
        }
 }
+EXPORT_SYMBOL(fb_pad_unaligned_buffer);
 
 /*
  * we need to lock this section since fb_cursor
@@ -1040,7 +993,7 @@ static struct file_operations fb_fops = {
 #endif
 };
 
-static struct class_simple *fb_class;
+static struct class *fb_class;
 
 /**
  *     register_framebuffer - registers a frame buffer device
@@ -1066,7 +1019,7 @@ register_framebuffer(struct fb_info *fb_info)
                        break;
        fb_info->node = i;
 
-       fb_info->class_device = class_simple_device_add(fb_class, MKDEV(FB_MAJOR, i),
+       fb_info->class_device = class_device_create(fb_class, MKDEV(FB_MAJOR, i),
                                    fb_info->device, "fb%d", i);
        if (IS_ERR(fb_info->class_device)) {
                /* Not fatal */
@@ -1081,7 +1034,7 @@ register_framebuffer(struct fb_info *fb_info)
                        fb_info->pixmap.size = FBPIXMAPSIZE;
                        fb_info->pixmap.buf_align = 1;
                        fb_info->pixmap.scan_align = 1;
-                       fb_info->pixmap.access_align = 4;
+                       fb_info->pixmap.access_align = 32;
                        fb_info->pixmap.flags = FB_PIXMAP_DEFAULT;
                }
        }       
@@ -1134,7 +1087,7 @@ unregister_framebuffer(struct fb_info *fb_info)
        registered_fb[i]=NULL;
        num_registered_fb--;
        fb_cleanup_class_device(fb_info);
-       class_simple_device_remove(MKDEV(FB_MAJOR, i));
+       class_device_destroy(fb_class, MKDEV(FB_MAJOR, i));
        return 0;
 }
 
@@ -1197,7 +1150,7 @@ fbmem_init(void)
        if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
                printk("unable to get major %d for fb devs\n", FB_MAJOR);
 
-       fb_class = class_simple_create(THIS_MODULE, "graphics");
+       fb_class = class_create(THIS_MODULE, "graphics");
        if (IS_ERR(fb_class)) {
                printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));
                fb_class = NULL;
@@ -1210,7 +1163,7 @@ module_init(fbmem_init);
 static void __exit
 fbmem_exit(void)
 {
-       class_simple_destroy(fb_class);
+       class_destroy(fb_class);
 }
 
 module_exit(fbmem_exit);
@@ -1357,10 +1310,6 @@ EXPORT_SYMBOL(fb_set_var);
 EXPORT_SYMBOL(fb_blank);
 EXPORT_SYMBOL(fb_pan_display);
 EXPORT_SYMBOL(fb_get_buffer_offset);
-EXPORT_SYMBOL(fb_iomove_buf_unaligned);
-EXPORT_SYMBOL(fb_iomove_buf_aligned);
-EXPORT_SYMBOL(fb_sysmove_buf_unaligned);
-EXPORT_SYMBOL(fb_sysmove_buf_aligned);
 EXPORT_SYMBOL(fb_set_suspend);
 EXPORT_SYMBOL(fb_register_client);
 EXPORT_SYMBOL(fb_unregister_client);
index c78a2c5961d3bada42cd7362085fe414f9fcd40e..277d733c6d00a4150436c42b234aec4edc572b15 100644 (file)
@@ -241,7 +241,7 @@ static ssize_t show_virtual(struct class_device *class_device, char *buf)
        struct fb_info *fb_info =
                (struct fb_info *)class_get_devdata(class_device);
        return snprintf(buf, PAGE_SIZE, "%d,%d\n", fb_info->var.xres_virtual,
-                       fb_info->var.xres_virtual);
+                       fb_info->var.yres_virtual);
 }
 
 static ssize_t store_cmap(struct class_device *class_device, const char * buf,
index 2a023282d7a3ccc8479468012753d57f9effcaac..d3c1922cb13a41bd4b2817c34449e0ddac851e5b 100644 (file)
@@ -1045,14 +1045,14 @@ static struct fb_ops gbefb_ops = {
  * sysfs
  */
 
-static ssize_t gbefb_show_memsize(struct device *dev, char *buf)
+static ssize_t gbefb_show_memsize(struct device *dev, struct device_attribute *attr, char *buf)
 {
        return snprintf(buf, PAGE_SIZE, "%d\n", gbe_mem_size);
 }
 
 static DEVICE_ATTR(size, S_IRUGO, gbefb_show_memsize, NULL);
 
-static ssize_t gbefb_show_rev(struct device *device, char *buf)
+static ssize_t gbefb_show_rev(struct device *device, struct device_attribute *attr, char *buf)
 {
        return snprintf(buf, PAGE_SIZE, "%d\n", gbe_revision);
 }
index a9a618f2aa6a25316522c16f8649d13ba52eec34..7513fb9b19cf739cc41afaf888efb0edae722587 100644 (file)
@@ -1885,6 +1885,7 @@ static int __devinit i810fb_init_pci (struct pci_dev *dev,
        memset(info->pixmap.addr, 0, 8*1024);
        info->pixmap.size = 8*1024;
        info->pixmap.buf_align = 8;
+       info->pixmap.access_align = 32;
        info->pixmap.flags = FB_PIXMAP_SYSTEM;
 
        if ((err = i810_allocate_pci_resource(par, entry))) {
index 549e229392604359f46ed629d916b4ea89674226..298bc9cd99e7f59772a8d551307ec3b9d77032d4 100644 (file)
@@ -214,7 +214,7 @@ static struct fb_ops intel_fb_ops = {
 
 /* PCI driver module table */
 static struct pci_driver intelfb_driver = {
-       .name =         "Intel(R) " SUPPORTED_CHIPSETS " Framebuffer Driver",
+       .name =         "intelfb",
        .id_table =     intelfb_pci_table,
        .probe =        intelfb_pci_register,
        .remove =       __devexit_p(intelfb_pci_unregister)
@@ -228,22 +228,25 @@ MODULE_DESCRIPTION(
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_DEVICE_TABLE(pci, intelfb_pci_table);
 
-static int accel        __initdata = 1;
-static int vram         __initdata = 4;
-static int hwcursor     __initdata = 1;
-static int mtrr         __initdata = 1;
-static int fixed        __initdata = 0;
-static int noinit       __initdata = 0;
-static int noregister   __initdata = 0;
-static int probeonly    __initdata = 0;
-static int idonly       __initdata = 0;
-static int bailearly    __initdata = 0;
-static char *mode       __initdata = NULL;
+static int accel        = 1;
+static int vram         = 4;
+static int hwcursor     = 1;
+static int mtrr         = 1;
+static int fixed        = 0;
+static int noinit       = 0;
+static int noregister   = 0;
+static int probeonly    = 0;
+static int idonly       = 0;
+static int bailearly    = 0;
+static int voffset     = 48;
+static char *mode       = NULL;
 
 module_param(accel, bool, S_IRUGO);
 MODULE_PARM_DESC(accel, "Enable console acceleration");
 module_param(vram, int, S_IRUGO);
 MODULE_PARM_DESC(vram, "System RAM to allocate to framebuffer in MiB");
+module_param(voffset, int, S_IRUGO);
+MODULE_PARM_DESC(voffset, "Offset of framebuffer in MiB");
 module_param(hwcursor, bool, S_IRUGO);
 MODULE_PARM_DESC(hwcursor, "Enable HW cursor");
 module_param(mtrr, bool, S_IRUGO);
@@ -503,6 +506,7 @@ intelfb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
        struct agp_bridge_data *bridge;
        int aperture_bar = 0;
        int mmio_bar = 1;
+       int offset;
 
        DBG_MSG("intelfb_pci_register\n");
 
@@ -659,17 +663,21 @@ intelfb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
                return -ENODEV;
        }
 
+       if (MB(voffset) < stolen_size)
+               offset = (stolen_size >> 12);
+       else
+               offset = ROUND_UP_TO_PAGE(MB(voffset))/GTT_PAGE_SIZE;
+
        /* set the mem offsets - set them after the already used pages */
        if (dinfo->accel) {
-               dinfo->ring.offset = (stolen_size >> 12)
-                       + gtt_info.current_memory;
+               dinfo->ring.offset = offset + gtt_info.current_memory;
        }
        if (dinfo->hwcursor) {
-               dinfo->cursor.offset = (stolen_size >> 12) +
+               dinfo->cursor.offset = offset +
                        + gtt_info.current_memory + (dinfo->ring.size >> 12);
        }
        if (dinfo->fbmem_gart) {
-               dinfo->fb.offset = (stolen_size >> 12) +
+               dinfo->fb.offset = offset +
                        + gtt_info.current_memory + (dinfo->ring.size >> 12)
                        + (dinfo->cursor.size >> 12);
        }
@@ -1083,6 +1091,7 @@ intelfb_set_fbinfo(struct intelfb_info *dinfo)
 
        info->pixmap.size = 64*1024;
        info->pixmap.buf_align = 8;
+       info->pixmap.access_align = 32;
        info->pixmap.flags = FB_PIXMAP_SYSTEM;
 
        if (intelfb_init_var(dinfo))
@@ -1293,7 +1302,7 @@ intelfb_set_par(struct fb_info *info)
 
        intelfb_blank(FB_BLANK_POWERDOWN, info);
 
-       if (dinfo->accel)
+       if (ACCEL(dinfo, info))
                intelfbhw_2d_stop(dinfo);
 
        memcpy(hw, &dinfo->save_state, sizeof(*hw));
@@ -1309,7 +1318,7 @@ intelfb_set_par(struct fb_info *info)
 
        update_dinfo(dinfo, &info->var);
 
-       if (dinfo->accel)
+       if (ACCEL(dinfo, info))
                intelfbhw_2d_start(dinfo);
 
        intelfb_pan_display(&info->var, info);
index de5a0f383600832ec8f216764827376b0e2f66d9..2fc71081f7e7077749ff659ec9176d0c7f75f6c1 100644 (file)
@@ -387,3 +387,4 @@ int __init mac_find_mode(struct fb_var_screeninfo *var, struct fb_info *info,
 }
 EXPORT_SYMBOL(mac_find_mode);
 
+MODULE_LICENSE("GPL");
index 47733f58153bd4d8bb856dcc69d98e4e86492a95..b2e6b240786917d9c1cae810a76729d3ff2c0686 100644 (file)
@@ -516,9 +516,9 @@ static struct backlight_controller nvidia_backlight_controller = {
 static void nvidiafb_load_cursor_image(struct nvidia_par *par, u8 * data8,
                                       u16 bg, u16 fg, u32 w, u32 h)
 {
+       u32 *data = (u32 *) data8;
        int i, j, k = 0;
        u32 b, tmp;
-       u32 *data = (u32 *) data8;
 
        w = (w + 1) & ~1;
 
@@ -890,11 +890,11 @@ static int nvidiafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
 {
        struct nvidia_par *par = info->par;
        u8 data[MAX_CURS * MAX_CURS / 8];
-       u16 fg, bg;
        int i, set = cursor->set;
+       u16 fg, bg;
 
        if (cursor->image.width > MAX_CURS || cursor->image.height > MAX_CURS)
-               return soft_cursor(info, cursor);
+               return -ENXIO;
 
        NVShowHideCursor(par, 0);
 
@@ -931,21 +931,18 @@ static int nvidiafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
                if (src) {
                        switch (cursor->rop) {
                        case ROP_XOR:
-                               for (i = 0; i < s_pitch * cursor->image.height;
-                                    i++)
+                               for (i = 0; i < s_pitch * cursor->image.height; i++)
                                        src[i] = dat[i] ^ msk[i];
                                break;
                        case ROP_COPY:
                        default:
-                               for (i = 0; i < s_pitch * cursor->image.height;
-                                    i++)
+                               for (i = 0; i < s_pitch * cursor->image.height; i++)
                                        src[i] = dat[i] & msk[i];
                                break;
                        }
 
-                       fb_sysmove_buf_aligned(info, &info->pixmap, data,
-                                              d_pitch, src, s_pitch,
-                                              cursor->image.height);
+                       fb_pad_aligned_buffer(data, d_pitch, src, s_pitch,
+                                               cursor->image.height);
 
                        bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) |
                            ((info->cmap.green[bg_idx] & 0xf8) << 2) |
@@ -1348,6 +1345,7 @@ static int __devinit nvidia_set_fbinfo(struct fb_info *info)
 
        info->pixmap.scan_align = 4;
        info->pixmap.buf_align = 4;
+       info->pixmap.access_align = 32;
        info->pixmap.size = 8 * 1024;
        info->pixmap.flags = FB_PIXMAP_SYSTEM;
 
index 8e024aad1b5733a30c39019cebe80e46d2a37459..e0dad948467b32cc921f742f5abbefb5d28b4674 100644 (file)
@@ -5,7 +5,7 @@
  *  Based on code written by:
  *           Sven Luther, <luther@dpt-info.u-strasbg.fr>
  *           Alan Hourihane, <alanh@fairlite.demon.co.uk>
- *           Russel King, <rmk@arm.linux.org.uk>
+ *           Russell King, <rmk@arm.linux.org.uk>
  *  Based on linux/drivers/video/skeletonfb.c:
  *     Copyright (C) 1997 Geert Uytterhoeven
  *  Based on linux/driver/video/pm2fb.c:
index b0c886de04043c1ad872377e3739a0f48f3d34a2..6a9e183be41b7f53f0ce74afc18abfa03fcac1cc 100644 (file)
@@ -1582,12 +1582,11 @@ static int rivafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
 {
        struct riva_par *par = (struct riva_par *) info->par;
        u8 data[MAX_CURS * MAX_CURS/8];
-       u16 fg, bg;
        int i, set = cursor->set;
+       u16 fg, bg;
 
-       if (cursor->image.width > MAX_CURS ||
-           cursor->image.height > MAX_CURS)
-               return soft_cursor(info, cursor);
+       if (cursor->image.width > MAX_CURS || cursor->image.height > MAX_CURS)
+               return -ENXIO;
 
        par->riva.ShowHideCursor(&par->riva, 0);
 
@@ -1625,21 +1624,18 @@ static int rivafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
                if (src) {
                        switch (cursor->rop) {
                        case ROP_XOR:
-                               for (i = 0; i < s_pitch * cursor->image.height;
-                                    i++)
+                               for (i = 0; i < s_pitch * cursor->image.height; i++)
                                        src[i] = dat[i] ^ msk[i];
                                break;
                        case ROP_COPY:
                        default:
-                               for (i = 0; i < s_pitch * cursor->image.height;
-                                    i++)
+                               for (i = 0; i < s_pitch * cursor->image.height; i++)
                                        src[i] = dat[i] & msk[i];
                                break;
                        }
 
-                       fb_sysmove_buf_aligned(info, &info->pixmap, data,
-                                              d_pitch, src, s_pitch,
-                                              cursor->image.height);
+                       fb_pad_aligned_buffer(data, d_pitch, src, s_pitch,
+                                               cursor->image.height);
 
                        bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) |
                                ((info->cmap.green[bg_idx] & 0xf8) << 2) |
@@ -1727,6 +1723,7 @@ static int __devinit riva_set_fbinfo(struct fb_info *info)
 
        info->pixmap.size = 8 * 1024;
        info->pixmap.buf_align = 4;
+       info->pixmap.access_align = 32;
        info->pixmap.flags = FB_PIXMAP_SYSTEM;
        info->var.yres_virtual = -1;
        NVTRACE_LEAVE();
index b637c389e4f480945c5c9f8b0775605496bd6d25..789de13f461f689280e2b94c78b50c18387bfe0f 100644 (file)
@@ -493,7 +493,7 @@ s1d13xxxfb_fetch_hw_state(struct fb_info *info)
 }
 
 
-static int __devexit
+static int
 s1d13xxxfb_remove(struct device *dev)
 {
        struct fb_info *info = dev_get_drvdata(dev);
index 03d74e8ee06777f8991591a61bc2812c2843c775..8fadcdae6f426216200ed6659dd3cfbca031e57f 100644 (file)
@@ -1897,7 +1897,7 @@ static int __devinit savage_init_fb_info (struct fb_info *info,
                info->pixmap.size = 8*1024;
                info->pixmap.scan_align = 4;
                info->pixmap.buf_align = 4;
-               info->pixmap.access_align = 4;
+               info->pixmap.access_align = 32;
 
                fb_alloc_cmap (&info->cmap, NR_PALETTE, 0);
                info->flags |= FBINFO_HWACCEL_COPYAREA |
index 13a4511539a15b548e0e065eb37fa2f158d9c715..229c4bc350798c45f103a475f11f80a5e3f16dfe 100644 (file)
@@ -58,17 +58,10 @@ int soft_cursor(struct fb_info *info, struct fb_cursor *cursor)
        } else 
                memcpy(src, image->data, dsize);
        
-       if (info->pixmap.outbuf)
-               fb_iomove_buf_aligned(info, &info->pixmap, dst, d_pitch, src,
-                                 s_pitch, image->height);
-       else
-               fb_sysmove_buf_aligned(info, &info->pixmap, dst, d_pitch, src,
-                                  s_pitch, image->height);
-
+       fb_pad_aligned_buffer(dst, d_pitch, src, s_pitch, image->height);
        image->data = dst;
        info->fbops->fb_imageblit(info, image);
        kfree(src);
-
        return 0;
 }
 
index 3027841f9c2466eb17b4b0bcb779dc11029fdc2d..f3069b01e248efa1eaf86e00fec16ff6047fc048 100644 (file)
@@ -271,7 +271,7 @@ static int __init vesafb_probe(struct device *device)
 
        if (!request_mem_region(vesafb_fix.smem_start, size_total, "vesafb")) {
                printk(KERN_WARNING
-                      "vesafb: abort, cannot reserve video memory at 0x%lx\n",
+                      "vesafb: cannot reserve video memory at 0x%lx\n",
                        vesafb_fix.smem_start);
                /* We cannot make this fatal. Sometimes this comes from magic
                   spaces our resource handlers simply don't know about */
@@ -279,13 +279,13 @@ static int __init vesafb_probe(struct device *device)
 
        info = framebuffer_alloc(sizeof(u32) * 256, &dev->dev);
        if (!info) {
-               release_mem_region(vesafb_fix.smem_start, vesafb_fix.smem_len);
+               release_mem_region(vesafb_fix.smem_start, size_total);
                return -ENOMEM;
        }
        info->pseudo_palette = info->par;
        info->par = NULL;
 
-        info->screen_base = ioremap(vesafb_fix.smem_start, vesafb_fix.smem_len);
+       info->screen_base = ioremap(vesafb_fix.smem_start, vesafb_fix.smem_len);
        if (!info->screen_base) {
                printk(KERN_ERR
                       "vesafb: abort, cannot ioremap video memory 0x%x @ 0x%lx\n",
@@ -386,7 +386,7 @@ static int __init vesafb_probe(struct device *device)
        request_region(0x3c0, 32, "vesafb");
 
        if (mtrr) {
-               int temp_size = size_total;
+               unsigned int temp_size = size_total;
                /* Find the largest power-of-two */
                while (temp_size & (temp_size - 1))
                        temp_size &= (temp_size - 1);
index 58cd2ad84afb2038b0fe5722965deaca555c7d49..adcda697ea60d537accf3c9f9fa5e93f6695b856 100644 (file)
@@ -101,7 +101,7 @@ static void(*w100fb_ssp_send)(u8 adrs, u8 data);
  * Sysfs functions
  */
 
-static ssize_t rotation_show(struct device *dev, char *buf)
+static ssize_t rotation_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct fb_info *info = dev_get_drvdata(dev);
        struct w100fb_par *par=info->par;
@@ -109,7 +109,7 @@ static ssize_t rotation_show(struct device *dev, char *buf)
        return sprintf(buf, "%d\n",par->rotation_flag);
 }
 
-static ssize_t rotation_store(struct device *dev, const char *buf, size_t count)
+static ssize_t rotation_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        unsigned int rotate;
        struct fb_info *info = dev_get_drvdata(dev);
@@ -134,7 +134,7 @@ static ssize_t rotation_store(struct device *dev, const char *buf, size_t count)
 
 static DEVICE_ATTR(rotation, 0644, rotation_show, rotation_store);
 
-static ssize_t w100fb_reg_read(struct device *dev, const char *buf, size_t count)
+static ssize_t w100fb_reg_read(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        unsigned long param;
        unsigned long regs;
@@ -146,7 +146,7 @@ static ssize_t w100fb_reg_read(struct device *dev, const char *buf, size_t count
 
 static DEVICE_ATTR(reg_read, 0200, NULL, w100fb_reg_read);
 
-static ssize_t w100fb_reg_write(struct device *dev, const char *buf, size_t count)
+static ssize_t w100fb_reg_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        unsigned long regs;
        unsigned long param;
@@ -163,7 +163,7 @@ static ssize_t w100fb_reg_write(struct device *dev, const char *buf, size_t coun
 static DEVICE_ATTR(reg_write, 0200, NULL, w100fb_reg_write);
 
 
-static ssize_t fastsysclk_show(struct device *dev, char *buf)
+static ssize_t fastsysclk_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct fb_info *info = dev_get_drvdata(dev);
        struct w100fb_par *par=info->par;
@@ -171,7 +171,7 @@ static ssize_t fastsysclk_show(struct device *dev, char *buf)
        return sprintf(buf, "%d\n",par->fastsysclk_mode);
 }
 
-static ssize_t fastsysclk_store(struct device *dev, const char *buf, size_t count)
+static ssize_t fastsysclk_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
        int param;
        struct fb_info *info = dev_get_drvdata(dev);
index 8d7821899cc10440137299c7254ee4750c416d8d..24a192e3b8b40695bcc957e796408873a76ecfe9 100644 (file)
@@ -88,7 +88,7 @@ static void w1_slave_release(struct device *dev)
        complete(&sl->dev_released);
 }
 
-static ssize_t w1_default_read_name(struct device *dev, char *buf)
+static ssize_t w1_default_read_name(struct device *dev, struct device_attribute *attr, char *buf)
 {
        return sprintf(buf, "No family registered.\n");
 }
@@ -137,7 +137,7 @@ static struct device_attribute w1_slave_attribute_val = {
        .show = &w1_default_read_name,
 };
 
-static ssize_t w1_master_attribute_show_name(struct device *dev, char *buf)
+static ssize_t w1_master_attribute_show_name(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w1_master *md = container_of (dev, struct w1_master, dev);
        ssize_t count;
@@ -152,7 +152,7 @@ static ssize_t w1_master_attribute_show_name(struct device *dev, char *buf)
        return count;
 }
 
-static ssize_t w1_master_attribute_show_pointer(struct device *dev, char *buf)
+static ssize_t w1_master_attribute_show_pointer(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w1_master *md = container_of(dev, struct w1_master, dev);
        ssize_t count;
@@ -166,14 +166,14 @@ static ssize_t w1_master_attribute_show_pointer(struct device *dev, char *buf)
        return count;
 }
 
-static ssize_t w1_master_attribute_show_timeout(struct device *dev, char *buf)
+static ssize_t w1_master_attribute_show_timeout(struct device *dev, struct device_attribute *attr, char *buf)
 {
        ssize_t count;
        count = sprintf(buf, "%d\n", w1_timeout);
        return count;
 }
 
-static ssize_t w1_master_attribute_show_max_slave_count(struct device *dev, char *buf)
+static ssize_t w1_master_attribute_show_max_slave_count(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w1_master *md = container_of(dev, struct w1_master, dev);
        ssize_t count;
@@ -187,7 +187,7 @@ static ssize_t w1_master_attribute_show_max_slave_count(struct device *dev, char
        return count;
 }
 
-static ssize_t w1_master_attribute_show_attempts(struct device *dev, char *buf)
+static ssize_t w1_master_attribute_show_attempts(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w1_master *md = container_of(dev, struct w1_master, dev);
        ssize_t count;
@@ -201,7 +201,7 @@ static ssize_t w1_master_attribute_show_attempts(struct device *dev, char *buf)
        return count;
 }
 
-static ssize_t w1_master_attribute_show_slave_count(struct device *dev, char *buf)
+static ssize_t w1_master_attribute_show_slave_count(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w1_master *md = container_of(dev, struct w1_master, dev);
        ssize_t count;
@@ -215,7 +215,7 @@ static ssize_t w1_master_attribute_show_slave_count(struct device *dev, char *bu
        return count;
 }
 
-static ssize_t w1_master_attribute_show_slaves(struct device *dev, char *buf)
+static ssize_t w1_master_attribute_show_slaves(struct device *dev, struct device_attribute *attr, char *buf)
 
 {
        struct w1_master *md = container_of(dev, struct w1_master, dev);
index 03a2de7a601fe859970985b08932bb22f026c6b8..07fa49412a90005fecbac0ea882284b5ead45ec3 100644 (file)
 
 struct w1_family_ops
 {
-       ssize_t (* rname)(struct device *, char *);
+       ssize_t (* rname)(struct device *, struct device_attribute *, char *);
        ssize_t (* rbin)(struct kobject *, char *, loff_t, size_t);
        
-       ssize_t (* rval)(struct device *, char *);
+       ssize_t (* rval)(struct device *, struct device_attribute *, char *);
        unsigned char rvalname[MAXNAMELEN];
 };
 
index a54e425217a06736cdf873e8a914b434eb30a6ce..674eb75a9bad1d21a70b6d7cee56cf469df989e2 100644 (file)
@@ -36,8 +36,8 @@ MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>");
 MODULE_DESCRIPTION("Driver for 1-wire Dallas network protocol, 64bit memory family.");
 
-static ssize_t w1_smem_read_name(struct device *, char *);
-static ssize_t w1_smem_read_val(struct device *, char *);
+static ssize_t w1_smem_read_name(struct device *, struct device_attribute *attr, char *);
+static ssize_t w1_smem_read_val(struct device *, struct device_attribute *attr, char *);
 static ssize_t w1_smem_read_bin(struct kobject *, char *, loff_t, size_t);
 
 static struct w1_family_ops w1_smem_fops = {
@@ -47,14 +47,14 @@ static struct w1_family_ops w1_smem_fops = {
        .rvalname = "id",
 };
 
-static ssize_t w1_smem_read_name(struct device *dev, char *buf)
+static ssize_t w1_smem_read_name(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w1_slave *sl = container_of(dev, struct w1_slave, dev);
 
        return sprintf(buf, "%s\n", sl->name);
 }
 
-static ssize_t w1_smem_read_val(struct device *dev, char *buf)
+static ssize_t w1_smem_read_val(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w1_slave *sl = container_of(dev, struct w1_slave, dev);
        int i;
index 0b18178905034e788742938718041f9e1333ff13..70310f7a722e49583ec126765648ee18a1de604d 100644 (file)
@@ -42,8 +42,8 @@ static u8 bad_roms[][9] = {
                                {}
                        };
 
-static ssize_t w1_therm_read_name(struct device *, char *);
-static ssize_t w1_therm_read_temp(struct device *, char *);
+static ssize_t w1_therm_read_name(struct device *, struct device_attribute *attr, char *);
+static ssize_t w1_therm_read_temp(struct device *, struct device_attribute *attr, char *);
 static ssize_t w1_therm_read_bin(struct kobject *, char *, loff_t, size_t);
 
 static struct w1_family_ops w1_therm_fops = {
@@ -53,7 +53,7 @@ static struct w1_family_ops w1_therm_fops = {
        .rvalname = "temp1_input",
 };
 
-static ssize_t w1_therm_read_name(struct device *dev, char *buf)
+static ssize_t w1_therm_read_name(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w1_slave *sl = container_of(dev, struct w1_slave, dev);
 
@@ -77,7 +77,7 @@ static inline int w1_convert_temp(u8 rom[9])
        return t;
 }
 
-static ssize_t w1_therm_read_temp(struct device *dev, char *buf)
+static ssize_t w1_therm_read_temp(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct w1_slave *sl = container_of(dev, struct w1_slave, dev);
 
index dad03fc33a44fe34c1b968c5d81918d97298bf2e..04ca8840acf1c4d394c32bb6bcb6013f19a2d45c 100644 (file)
@@ -21,7 +21,7 @@
 /* show configuration fields */
 #define zorro_config_attr(name, field, format_string)                  \
 static ssize_t                                                         \
-show_##name(struct device *dev, char *buf)                             \
+show_##name(struct device *dev, struct device_attribute *attr, char *buf)                              \
 {                                                                      \
        struct zorro_dev *z;                                            \
                                                                        \
@@ -36,7 +36,7 @@ zorro_config_attr(serial, rom.er_SerialNumber, "0x%08x\n");
 zorro_config_attr(slotaddr, slotaddr, "0x%04x\n");
 zorro_config_attr(slotsize, slotsize, "0x%04x\n");
 
-static ssize_t zorro_show_resource(struct device *dev, char *buf)
+static ssize_t zorro_show_resource(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct zorro_dev *z = to_zorro_dev(dev);
 
index 6a4ad4bb7a54e836e039484d684f66e66f23c334..178e27494b7482f0708ab1104db8d845f075fcfb 100644 (file)
@@ -741,56 +741,6 @@ config SYSFS
 
        Designers of embedded systems may wish to say N here to conserve space.
 
-config DEVFS_FS
-       bool "/dev file system support (OBSOLETE)"
-       depends on EXPERIMENTAL
-       help
-         This is support for devfs, a virtual file system (like /proc) which
-         provides the file system interface to device drivers, normally found
-         in /dev. Devfs does not depend on major and minor number
-         allocations. Device drivers register entries in /dev which then
-         appear automatically, which means that the system administrator does
-         not have to create character and block special device files in the
-         /dev directory using the mknod command (or MAKEDEV script) anymore.
-
-         This is work in progress. If you want to use this, you *must* read
-         the material in <file:Documentation/filesystems/devfs/>, especially
-         the file README there.
-
-         Note that devfs no longer manages /dev/pts!  If you are using UNIX98
-         ptys, you will also need to mount the /dev/pts filesystem (devpts).
-
-         Note that devfs has been obsoleted by udev,
-         <http://www.kernel.org/pub/linux/utils/kernel/hotplug/>.
-         It has been stripped down to a bare minimum and is only provided for
-         legacy installations that use its naming scheme which is
-         unfortunately different from the names normal Linux installations
-         use.
-
-         If unsure, say N.
-
-config DEVFS_MOUNT
-       bool "Automatically mount at boot"
-       depends on DEVFS_FS
-       help
-         This option appears if you have CONFIG_DEVFS_FS enabled. Setting
-         this to 'Y' will make the kernel automatically mount devfs onto /dev
-         when the system is booted, before the init thread is started.
-         You can override this with the "devfs=nomount" boot option.
-
-         If unsure, say N.
-
-config DEVFS_DEBUG
-       bool "Debug devfs"
-       depends on DEVFS_FS
-       help
-         If you say Y here, then the /dev file system code will generate
-         debugging messages. See the file
-         <file:Documentation/filesystems/devfs/boot-options> for more
-         details.
-
-         If unsure, say N.
-
 config DEVPTS_FS_XATTR
        bool "/dev/pts Extended Attributes"
        depends on UNIX98_PTYS
index c7b2b8890188599e09f19c255fa9ec1014342e2e..9c09641ce907284242ac477223810a9edfb24ee3 100644 (file)
@@ -185,6 +185,19 @@ int autofs4_wait(struct autofs_sb_info *,struct dentry *, enum autofs_notify);
 int autofs4_wait_release(struct autofs_sb_info *,autofs_wqt_t,int);
 void autofs4_catatonic_mode(struct autofs_sb_info *);
 
+static inline int autofs4_follow_mount(struct vfsmount **mnt, struct dentry **dentry)
+{
+       int res = 0;
+
+       while (d_mountpoint(*dentry)) {
+               int followed = follow_down(mnt, dentry);
+               if (!followed)
+                       break;
+               res = 1;
+       }
+       return res;
+}
+
 static inline int simple_positive(struct dentry *dentry)
 {
        return dentry->d_inode && !d_unhashed(dentry);
index 500425e24fba9178c13db5550a7f9271256249d4..feb6ac427d058b8a1c02b420bbe6ad81ffd581aa 100644 (file)
@@ -56,12 +56,9 @@ static int autofs4_check_mount(struct vfsmount *mnt, struct dentry *dentry)
        mntget(mnt);
        dget(dentry);
 
-       if (!follow_down(&mnt, &dentry))
+       if (!autofs4_follow_mount(&mnt, &dentry))
                goto done;
 
-       while (d_mountpoint(dentry) && follow_down(&mnt, &dentry))
-               ;
-
        /* This is an autofs submount, we can't expire it */
        if (is_autofs4_dentry(dentry))
                goto done;
index 3765c047f157e76f4e1e760460db22e71c3744a0..2a771ec66956f92615de35694dc512f0144aedba 100644 (file)
@@ -205,7 +205,11 @@ static int autofs4_dir_open(struct inode *inode, struct file *file)
                struct vfsmount *fp_mnt = mntget(mnt);
                struct dentry *fp_dentry = dget(dentry);
 
-               while (follow_down(&fp_mnt, &fp_dentry) && d_mountpoint(fp_dentry));
+               if (!autofs4_follow_mount(&fp_mnt, &fp_dentry)) {
+                       dput(fp_dentry);
+                       mntput(fp_mnt);
+                       return -ENOENT;
+               }
 
                fp = dentry_open(fp_dentry, fp_mnt, file->f_flags);
                status = PTR_ERR(fp);
@@ -302,7 +306,14 @@ static int try_to_fill_dentry(struct dentry *dentry,
                
                DPRINTK("expire done status=%d", status);
                
-               return 0;
+               /*
+                * If the directory still exists the mount request must
+                * continue otherwise it can't be followed at the right
+                * time during the walk.
+                */
+               status = d_invalidate(dentry);
+               if (status != -EBUSY)
+                       return 0;
        }
 
        DPRINTK("dentry=%p %.*s ino=%p",
index 5a40d36e5a5101f178a92703b818487925db882d..fa2348dcd6718732c3f8bfb4ad2ecfe52c323aad 100644 (file)
@@ -191,6 +191,13 @@ int autofs4_wait(struct autofs_sb_info *sbi, struct dentry *dentry,
        }
 
        if ( !wq ) {
+               /* Can't wait for an expire if there's no mount */
+               if (notify == NFY_NONE && !d_mountpoint(dentry)) {
+                       kfree(name);
+                       up(&sbi->wq_sem);
+                       return -ENOENT;
+               }
+
                /* Create a new wait queue */
                wq = kmalloc(sizeof(struct autofs_wait_queue),GFP_KERNEL);
                if ( !wq ) {
index 009b8920c1fff5fe796bc08f42d06c1917636c66..dd9baabaf0166afff7a55c5692f48660553b9bfa 100644 (file)
@@ -316,6 +316,7 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs)
        current->mm->brk = ex.a_bss +
                (current->mm->start_brk = N_BSSADDR(ex));
        current->mm->free_area_cache = current->mm->mmap_base;
+       current->mm->cached_hole_size = 0;
 
        set_mm_counter(current->mm, rss, 0);
        current->mm->mmap = NULL;
index ce9423bb2de319d095a3ac5d8e762dcd6d8b3913..7976a238f0a3d60bb4c4a0d1fba0b3ad5183ad08 100644 (file)
@@ -251,7 +251,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec,
        }
 
        /* Populate argv and envp */
-       p = current->mm->arg_start;
+       p = current->mm->arg_end = current->mm->arg_start;
        while (argc-- > 0) {
                size_t len;
                __put_user((elf_addr_t)p, argv++);
@@ -775,6 +775,7 @@ static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
           change some of these later */
        set_mm_counter(current->mm, rss, 0);
        current->mm->free_area_cache = current->mm->mmap_base;
+       current->mm->cached_hole_size = 0;
        retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
                                 executable_stack);
        if (retval < 0) {
@@ -1125,7 +1126,7 @@ static int dump_write(struct file *file, const void *addr, int nr)
        return file->f_op->write(file, addr, nr, &file->f_pos) == nr;
 }
 
-static int dump_seek(struct file *file, off_t off)
+static int dump_seek(struct file *file, loff_t off)
 {
        if (file->f_op->llseek) {
                if (file->f_op->llseek(file, off, 0) != off)
@@ -1301,7 +1302,7 @@ static void fill_prstatus(struct elf_prstatus *prstatus,
 static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
                       struct mm_struct *mm)
 {
-       int i, len;
+       unsigned int i, len;
        
        /* first copy the parameters from user space */
        memset(psinfo, 0, sizeof(struct elf_prpsinfo));
index f0cd67d9d31b96393d4f33680dee26393fc9797c..c8998dc668824df41ef382e65af0b76124d41536 100644 (file)
@@ -520,7 +520,7 @@ static int load_flat_file(struct linux_binprm * bprm,
                DBG_FLT("BINFMT_FLAT: ROM mapping of file (we hope)\n");
 
                down_write(&current->mm->mmap_sem);
-               textpos = do_mmap(bprm->file, 0, text_len, PROT_READ|PROT_EXEC, 0, 0);
+               textpos = do_mmap(bprm->file, 0, text_len, PROT_READ|PROT_EXEC, MAP_SHARED, 0);
                up_write(&current->mm->mmap_sem);
                if (!textpos  || textpos >= (unsigned long) -4096) {
                        if (!textpos)
@@ -532,7 +532,7 @@ static int load_flat_file(struct linux_binprm * bprm,
                down_write(&current->mm->mmap_sem);
                realdatastart = do_mmap(0, 0, data_len + extra +
                                MAX_SHARED_LIBS * sizeof(unsigned long),
-                               PROT_READ|PROT_WRITE|PROT_EXEC, 0, 0);
+                               PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0);
                up_write(&current->mm->mmap_sem);
 
                if (realdatastart == 0 || realdatastart >= (unsigned long)-4096) {
@@ -574,7 +574,7 @@ static int load_flat_file(struct linux_binprm * bprm,
                down_write(&current->mm->mmap_sem);
                textpos = do_mmap(0, 0, text_len + data_len + extra +
                                        MAX_SHARED_LIBS * sizeof(unsigned long),
-                               PROT_READ | PROT_EXEC | PROT_WRITE, 0, 0);
+                               PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0);
                up_write(&current->mm->mmap_sem);
                if (!textpos  || textpos >= (unsigned long) -4096) {
                        if (!textpos)
index 6f88dcc6d002949cd42ca6759b3bbb65521a8e75..0befa724ab98db16d6174b7bc1884137c97a2ea0 100644 (file)
@@ -528,7 +528,7 @@ static void free_more_memory(void)
        for_each_pgdat(pgdat) {
                zones = pgdat->node_zonelists[GFP_NOFS&GFP_ZONEMASK].zones;
                if (*zones)
-                       try_to_free_pages(zones, GFP_NOFS, 0);
+                       try_to_free_pages(zones, GFP_NOFS);
        }
 }
 
@@ -2094,9 +2094,12 @@ int block_read_full_page(struct page *page, get_block_t *get_block)
                        continue;
 
                if (!buffer_mapped(bh)) {
+                       int err = 0;
+
                        fully_mapped = 0;
                        if (iblock < lblock) {
-                               if (get_block(inode, iblock, bh, 0))
+                               err = get_block(inode, iblock, bh, 0);
+                               if (err)
                                        SetPageError(page);
                        }
                        if (!buffer_mapped(bh)) {
@@ -2104,7 +2107,8 @@ int block_read_full_page(struct page *page, get_block_t *get_block)
                                memset(kaddr + i * blocksize, 0, blocksize);
                                flush_dcache_page(page);
                                kunmap_atomic(kaddr, KM_USER0);
-                               set_buffer_uptodate(bh);
+                               if (!err)
+                                       set_buffer_uptodate(bh);
                                continue;
                        }
                        /*
index 95483baab706baa9921eb14757c08da90970fdb5..dab4774ee7bbb6c7d9a92655a4a600d80c0da896 100644 (file)
@@ -6,7 +6,8 @@ kills the cifsd thread (NB: killing the cifs kernel threads is not
 recommended, unmount and rmmod cifs will kill them when they are
 no longer needed).  Fix readdir to ASCII servers (ie older servers
 which do not support Unicode) and also require asterik.
-
+Fix out of memory case in which data could be written one page
+off in the page cache.
 
 Version 1.33
 ------------
index e74df0c73256829895870ec047cff5ee9c23fea5..34b0cf7111f384aff0ea2afc9504b95fd67cd564 100644 (file)
@@ -371,7 +371,7 @@ A partial list of the supported mount options follows:
                on newly created files, directories, and devices (create, 
                mkdir, mknod) which will result in the server setting the
                uid and gid to the default (usually the server uid of the
-               usern who mounted the share).  Letting the server (rather than
+               user who mounted the share).  Letting the server (rather than
                the client) set the uid and gid is the default. This
                parameter has no effect if the CIFS Unix Extensions are not
                negotiated.
@@ -384,7 +384,7 @@ A partial list of the supported mount options follows:
                client (e.g. when the application is doing large sequential
                reads bigger than page size without rereading the same data) 
                this can provide better performance than the default
-               behavior which caches reads (reaadahead) and writes 
+               behavior which caches reads (readahead) and writes 
                (writebehind) through the local Linux client pagecache 
                if oplock (caching token) is granted and held. Note that
                direct allows write operations larger than page size
index d00b3bfe1a5213830c6aec6c39f56d0910be390a..78af5850c558127bde1a5c929e72f90cf7470403 100644 (file)
@@ -96,5 +96,5 @@ extern ssize_t        cifs_getxattr(struct dentry *, const char *, void *, size_t);
 extern ssize_t cifs_listxattr(struct dentry *, char *, size_t);
 extern int cifs_ioctl (struct inode * inode, struct file * filep,
                       unsigned int command, unsigned long arg);
-#define CIFS_VERSION   "1.34"
+#define CIFS_VERSION   "1.35"
 #endif                         /* _CIFSFS_H */
index 0010511083fce44618d4e8c522d588a9a983a668..ea239dea571e1f0a02374079ca0e918bf072cb01 100644 (file)
@@ -228,7 +228,7 @@ extern int CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
                        const struct nls_table *nls_codepage, 
                        int remap_special_chars);
 #endif /* CONFIG_CIFS_EXPERIMENTAL */
-extern int cifs_convertUCSpath(char *target, const __u16 *source, int maxlen,
+extern int cifs_convertUCSpath(char *target, const __le16 *source, int maxlen,
                        const struct nls_table * codepage);
 extern int cifsConvertToUCS(__le16 * target, const char *source, int maxlen,
                        const struct nls_table * cp, int mapChars);
index 741ff0c69f37f44154247020649b4104afff0cda..3c628bf667a5f010ff17c14d2ffc04f499d80c7d 100644 (file)
@@ -567,7 +567,7 @@ DelFileRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifsConvertToUCS((__u16 *) pSMB->fileName, fileName, 
+                   cifsConvertToUCS((__le16 *) pSMB->fileName, fileName, 
                                     PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -665,7 +665,7 @@ MkDirRetry:
                return rc;
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
-               name_len = cifsConvertToUCS((__u16 *) pSMB->DirName, name, 
+               name_len = cifsConvertToUCS((__le16 *) pSMB->DirName, name, 
                                            PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -719,7 +719,7 @@ openRetry:
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                count = 1;      /* account for one byte pad to word boundary */
                name_len =
-                   cifsConvertToUCS((__u16 *) (pSMB->fileName + 1),
+                   cifsConvertToUCS((__le16 *) (pSMB->fileName + 1),
                                     fileName, PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -1141,7 +1141,7 @@ renameRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifsConvertToUCS((__u16 *) pSMB->OldFileName, fromName, 
+                   cifsConvertToUCS((__le16 *) pSMB->OldFileName, fromName, 
                                     PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -1149,7 +1149,7 @@ renameRetry:
        /* protocol requires ASCII signature byte on Unicode string */
                pSMB->OldFileName[name_len + 1] = 0x00;
                name_len2 =
-                   cifsConvertToUCS((__u16 *) &pSMB->OldFileName[name_len + 2],
+                   cifsConvertToUCS((__le16 *) &pSMB->OldFileName[name_len + 2],
                                     toName, PATH_MAX, nls_codepage, remap);
                name_len2 += 1 /* trailing null */  + 1 /* Signature word */ ;
                name_len2 *= 2; /* convert to bytes */
@@ -1236,10 +1236,10 @@ int CIFSSMBRenameOpenFile(const int xid,struct cifsTconInfo *pTcon,
        /* unicode only call */
        if(target_name == NULL) {
                sprintf(dummy_string,"cifs%x",pSMB->hdr.Mid);
-               len_of_str = cifsConvertToUCS((__u16 *)rename_info->target_name,
+               len_of_str = cifsConvertToUCS((__le16 *)rename_info->target_name,
                                        dummy_string, 24, nls_codepage, remap);
        } else {
-               len_of_str = cifsConvertToUCS((__u16 *)rename_info->target_name,
+               len_of_str = cifsConvertToUCS((__le16 *)rename_info->target_name,
                                        target_name, PATH_MAX, nls_codepage, remap);
        }
        rename_info->target_name_len = cpu_to_le32(2 * len_of_str);
@@ -1296,7 +1296,7 @@ copyRetry:
        pSMB->Flags = cpu_to_le16(flags & COPY_TREE);
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
-               name_len = cifsConvertToUCS((__u16 *) pSMB->OldFileName, 
+               name_len = cifsConvertToUCS((__le16 *) pSMB->OldFileName, 
                                            fromName, PATH_MAX, nls_codepage,
                                            remap);
                name_len++;     /* trailing null */
@@ -1304,7 +1304,7 @@ copyRetry:
                pSMB->OldFileName[name_len] = 0x04;     /* pad */
                /* protocol requires ASCII signature byte on Unicode string */
                pSMB->OldFileName[name_len + 1] = 0x00;
-               name_len2 = cifsConvertToUCS((__u16 *)&pSMB->OldFileName[name_len + 2], 
+               name_len2 = cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2], 
                                toName, PATH_MAX, nls_codepage, remap);
                name_len2 += 1 /* trailing null */  + 1 /* Signature word */ ;
                name_len2 *= 2; /* convert to bytes */
@@ -1453,7 +1453,7 @@ createHardLinkRetry:
                return rc;
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
-               name_len = cifsConvertToUCS((__u16 *) pSMB->FileName, toName,
+               name_len = cifsConvertToUCS((__le16 *) pSMB->FileName, toName,
                                            PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -1476,7 +1476,7 @@ createHardLinkRetry:
        data_offset = (char *) (&pSMB->hdr.Protocol) + offset;
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len_target =
-                   cifsConvertToUCS((__u16 *) data_offset, fromName, PATH_MAX,
+                   cifsConvertToUCS((__le16 *) data_offset, fromName, PATH_MAX,
                                     nls_codepage, remap);
                name_len_target++;      /* trailing null */
                name_len_target *= 2;
@@ -1546,14 +1546,14 @@ winCreateHardLinkRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifsConvertToUCS((__u16 *) pSMB->OldFileName, fromName,
+                   cifsConvertToUCS((__le16 *) pSMB->OldFileName, fromName,
                                     PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
                pSMB->OldFileName[name_len] = 0;        /* pad */
                pSMB->OldFileName[name_len + 1] = 0x04; 
                name_len2 =
-                   cifsConvertToUCS((__u16 *)&pSMB->OldFileName[name_len + 2], 
+                   cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2], 
                                     toName, PATH_MAX, nls_codepage, remap);
                name_len2 += 1 /* trailing null */  + 1 /* Signature word */ ;
                name_len2 *= 2; /* convert to bytes */
@@ -1939,7 +1939,7 @@ queryAclRetry:
                                                                                                                                              
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                       cifsConvertToUCS((__u16 *) pSMB->FileName, searchName, 
+                       cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, 
                                         PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -2024,7 +2024,7 @@ setAclRetry:
                return rc;
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                       cifsConvertToUCS((__u16 *) pSMB->FileName, fileName, 
+                       cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, 
                                      PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -2188,7 +2188,7 @@ QPathInfoRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifsConvertToUCS((__u16 *) pSMB->FileName, searchName, 
+                   cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, 
                                     PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -2269,7 +2269,7 @@ UnixQPathInfoRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifsConvertToUCS((__u16 *) pSMB->FileName, searchName,
+                   cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
                                  PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -2350,7 +2350,7 @@ findUniqueRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifsConvertToUCS((wchar_t *) pSMB->FileName, searchName, PATH_MAX
+                   cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, PATH_MAX
                                  /* find define for this maxpathcomponent */
                                  , nls_codepage);
                name_len++;     /* trailing null */
@@ -2435,7 +2435,7 @@ findFirstRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifsConvertToUCS((__u16 *) pSMB->FileName,searchName,
+                   cifsConvertToUCS((__le16 *) pSMB->FileName,searchName,
                                 PATH_MAX, nls_codepage, remap);
                /* We can not add the asterik earlier in case
                it got remapped to 0xF03A as if it were part of the
@@ -2726,7 +2726,7 @@ GetInodeNumberRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                       cifsConvertToUCS((__u16 *) pSMB->FileName, searchName,
+                       cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
                                PATH_MAX,nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -2837,7 +2837,7 @@ getDFSRetry:
        if (ses->capabilities & CAP_UNICODE) {
                pSMB->hdr.Flags2 |= SMBFLG2_UNICODE;
                name_len =
-                   cifsConvertToUCS((__u16 *) pSMB->RequestFileName,
+                   cifsConvertToUCS((__le16 *) pSMB->RequestFileName,
                                     searchName, PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -3369,7 +3369,7 @@ SetEOFRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifsConvertToUCS((__u16 *) pSMB->FileName, fileName,
+                   cifsConvertToUCS((__le16 *) pSMB->FileName, fileName,
                                     PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -3627,7 +3627,7 @@ SetTimesRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifsConvertToUCS((__u16 *) pSMB->FileName, fileName,
+                   cifsConvertToUCS((__le16 *) pSMB->FileName, fileName,
                                     PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -3708,7 +3708,7 @@ SetAttrLgcyRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                       ConvertToUCS((wchar_t *) pSMB->fileName, fileName, 
+                       ConvertToUCS((__le16 *) pSMB->fileName, fileName, 
                                PATH_MAX, nls_codepage);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -3759,7 +3759,7 @@ setPermsRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifsConvertToUCS((__u16 *) pSMB->FileName, fileName, 
+                   cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, 
                                     PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -3904,7 +3904,7 @@ QAllEAsRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifsConvertToUCS((wchar_t *) pSMB->FileName, searchName, 
+                   cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, 
                                     PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -4047,7 +4047,7 @@ QEARetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifsConvertToUCS((__u16 *) pSMB->FileName, searchName, 
+                   cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, 
                                     PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
@@ -4194,7 +4194,7 @@ SetEARetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifsConvertToUCS((__u16 *) pSMB->FileName, fileName, 
+                   cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, 
                                     PATH_MAX, nls_codepage, remap);
                name_len++;     /* trailing null */
                name_len *= 2;
index e3137aa48cdd6a4f4dbc5df53f03deab774f84ee..3f3538d4a1fad105c0a776ef5f6d6e18fef0ff6c 100644 (file)
@@ -392,7 +392,8 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, struct name
                rc = 0;
                d_add(direntry, NULL);
        } else {
-               cERROR(1,("Error 0x%x or on cifs_get_inode_info in lookup",rc));
+               cERROR(1,("Error 0x%x on cifs_get_inode_info in lookup of %s",
+                          rc,full_path));
                /* BB special case check for Access Denied - watch security 
                exposure of returning dir info implicitly via different rc 
                if file exists or not but no access BB */
index dde2d251fc3d6b0d387559bf5c590ede89bcf80a..30ab70ce554716df92739f0b1643ce79053497e7 100644 (file)
@@ -1352,6 +1352,8 @@ static void cifs_copy_cache_pages(struct address_space *mapping,
                                      GFP_KERNEL)) {
                        page_cache_release(page);
                        cFYI(1, ("Add page cache failed"));
+                       data += PAGE_CACHE_SIZE;
+                       bytes_read -= PAGE_CACHE_SIZE;
                        continue;
                }
 
index 670947288262c099a0f32ecffd3e4ca110ad9eb4..8d336a90025584a6fb524001ef71c123b6d881ec 100644 (file)
@@ -82,12 +82,12 @@ int cifs_get_inode_info_unix(struct inode **pinode,
                /* get new inode */
                if (*pinode == NULL) {
                        *pinode = new_inode(sb);
-                       if(*pinode == NULL) 
+                       if (*pinode == NULL) 
                                return -ENOMEM;
                        /* Is an i_ino of zero legal? */
                        /* Are there sanity checks we can use to ensure that
                           the server is really filling in that field? */
-                       if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
+                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
                                (*pinode)->i_ino =
                                        (unsigned long)findData.UniqueId;
                        } /* note ino incremented to unique num in new_inode */
@@ -134,7 +134,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
                inode->i_gid = le64_to_cpu(findData.Gid);
                inode->i_nlink = le64_to_cpu(findData.Nlinks);
 
-               if(is_size_safe_to_change(cifsInfo)) {
+               if (is_size_safe_to_change(cifsInfo)) {
                /* can not safely change the file size here if the
                   client is writing to it due to potential races */
 
@@ -162,7 +162,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
                if (S_ISREG(inode->i_mode)) {
                        cFYI(1, (" File inode "));
                        inode->i_op = &cifs_file_inode_ops;
-                       if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
+                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
                                inode->i_fop = &cifs_file_direct_ops;
                        else
                                inode->i_fop = &cifs_file_ops;
@@ -198,17 +198,17 @@ int cifs_get_inode_info(struct inode **pinode,
        pTcon = cifs_sb->tcon;
        cFYI(1,("Getting info on %s ", search_path));
 
-       if((pfindData == NULL) && (*pinode != NULL)) {
-               if(CIFS_I(*pinode)->clientCanCacheRead) {
+       if ((pfindData == NULL) && (*pinode != NULL)) {
+               if (CIFS_I(*pinode)->clientCanCacheRead) {
                        cFYI(1,("No need to revalidate cached inode sizes"));
                        return rc;
                }
        }
 
        /* if file info not passed in then get it from server */
-       if(pfindData == NULL) {
+       if (pfindData == NULL) {
                buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
-               if(buf == NULL)
+               if (buf == NULL)
                        return -ENOMEM;
                pfindData = (FILE_ALL_INFO *)buf;
                /* could do find first instead but this returns more info */
@@ -268,7 +268,7 @@ int cifs_get_inode_info(struct inode **pinode,
                           IndexNumber field is not guaranteed unique? */
 
 #ifdef CONFIG_CIFS_EXPERIMENTAL                
-                       if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM){
+                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM){
                                int rc1 = 0;
                                __u64 inode_num;
 
@@ -277,7 +277,7 @@ int cifs_get_inode_info(struct inode **pinode,
                                        cifs_sb->local_nls,
                                        cifs_sb->mnt_cifs_flags &
                                                CIFS_MOUNT_MAP_SPECIAL_CHR);
-                               if(rc1) {
+                               if (rc1) {
                                        cFYI(1,("GetSrvInodeNum rc %d", rc1));
                                        /* BB EOPNOSUPP disable SERVER_INUM? */
                                } else /* do we need cast or hash to ino? */
@@ -355,7 +355,7 @@ int cifs_get_inode_info(struct inode **pinode,
                if (S_ISREG(inode->i_mode)) {
                        cFYI(1, (" File inode "));
                        inode->i_op = &cifs_file_inode_ops;
-                       if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
+                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
                                inode->i_fop = &cifs_file_direct_ops;
                        else
                                inode->i_fop = &cifs_file_ops;
@@ -422,7 +422,8 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
                        cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
 
        if (!rc) {
-               direntry->d_inode->i_nlink--;
+               if (direntry->d_inode)
+                       direntry->d_inode->i_nlink--;
        } else if (rc == -ENOENT) {
                d_drop(direntry);
        } else if (rc == -ETXTBSY) {
@@ -440,7 +441,8 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
                                              cifs_sb->mnt_cifs_flags & 
                                                CIFS_MOUNT_MAP_SPECIAL_CHR);
                        CIFSSMBClose(xid, pTcon, netfid);
-                       direntry->d_inode->i_nlink--;
+                       if (direntry->d_inode)
+                               direntry->d_inode->i_nlink--;
                }
        } else if (rc == -EACCES) {
                /* try only if r/o attribute set in local lookup data? */
@@ -494,7 +496,8 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
                                            cifs_sb->mnt_cifs_flags & 
                                                CIFS_MOUNT_MAP_SPECIAL_CHR);
                        if (!rc) {
-                               direntry->d_inode->i_nlink--;
+                               if (direntry->d_inode)
+                                       direntry->d_inode->i_nlink--;
                        } else if (rc == -ETXTBSY) {
                                int oplock = FALSE;
                                __u16 netfid;
@@ -514,17 +517,20 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
                                                cifs_sb->mnt_cifs_flags &
                                                    CIFS_MOUNT_MAP_SPECIAL_CHR);
                                        CIFSSMBClose(xid, pTcon, netfid);
-                                       direntry->d_inode->i_nlink--;
+                                       if (direntry->d_inode)
+                                               direntry->d_inode->i_nlink--;
                                }
                        /* BB if rc = -ETXTBUSY goto the rename logic BB */
                        }
                }
        }
-       cifsInode = CIFS_I(direntry->d_inode);
-       cifsInode->time = 0;    /* will force revalidate to get info when
-                                  needed */
-       direntry->d_inode->i_ctime = inode->i_ctime = inode->i_mtime =
-               current_fs_time(inode->i_sb);
+       if (direntry->d_inode) {
+               cifsInode = CIFS_I(direntry->d_inode);
+               cifsInode->time = 0;    /* will force revalidate to get info
+                                          when needed */
+               direntry->d_inode->i_ctime = current_fs_time(inode->i_sb);
+       }
+       inode->i_ctime = inode->i_mtime = current_fs_time(inode->i_sb);
        cifsInode = CIFS_I(inode);
        cifsInode->time = 0;    /* force revalidate of dir as well */
 
@@ -576,7 +582,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
                if (direntry->d_inode)
                        direntry->d_inode->i_nlink = 2;
                if (cifs_sb->tcon->ses->capabilities & CAP_UNIX)
-                       if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
+                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
                                CIFSSMBUnixSetPerms(xid, pTcon, full_path,
                                                    mode,
                                                    (__u64)current->euid,
index db14b503d89e596dfa2c4102fca9469a7e814ce2..072b4ee8c53e1a28c51002d8a331c497a0b8c05c 100644 (file)
@@ -571,6 +571,7 @@ cifs_convertUCSpath(char *target, const __le16 * source, int maxlen,
                                break;
                        case UNI_LESSTHAN:
                                target[j] = '<';
+                               break;
                        default: 
                                len = cp->uni2char(src_char, &target[j], 
                                                NLS_MAX_CHARSET_SIZE);
index ef001a9313e692c28963cef02ba32640b89ee430..3d1cce3653b81304ce45937fd6b86a283b9fb5b0 100644 (file)
@@ -61,7 +61,7 @@ unsigned long coda_timeout = 30; /* .. secs, then signals will dequeue */
 
 
 struct venus_comm coda_comms[MAX_CODADEVS];
-static struct class_simple *coda_psdev_class;
+static struct class *coda_psdev_class;
 
 /*
  * Device operations
@@ -363,14 +363,14 @@ static int init_coda_psdev(void)
                     CODA_PSDEV_MAJOR);
               return -EIO;
        }
-       coda_psdev_class = class_simple_create(THIS_MODULE, "coda");
+       coda_psdev_class = class_create(THIS_MODULE, "coda");
        if (IS_ERR(coda_psdev_class)) {
                err = PTR_ERR(coda_psdev_class);
                goto out_chrdev;
        }               
        devfs_mk_dir ("coda");
        for (i = 0; i < MAX_CODADEVS; i++) {
-               class_simple_device_add(coda_psdev_class, MKDEV(CODA_PSDEV_MAJOR,i), 
+               class_device_create(coda_psdev_class, MKDEV(CODA_PSDEV_MAJOR,i),
                                NULL, "cfs%d", i);
                err = devfs_mk_cdev(MKDEV(CODA_PSDEV_MAJOR, i),
                                S_IFCHR|S_IRUSR|S_IWUSR, "coda/%d", i);
@@ -382,8 +382,8 @@ static int init_coda_psdev(void)
 
 out_class:
        for (i = 0; i < MAX_CODADEVS; i++) 
-               class_simple_device_remove(MKDEV(CODA_PSDEV_MAJOR, i));
-       class_simple_destroy(coda_psdev_class);
+               class_device_destroy(coda_psdev_class, MKDEV(CODA_PSDEV_MAJOR, i));
+       class_destroy(coda_psdev_class);
 out_chrdev:
        unregister_chrdev(CODA_PSDEV_MAJOR, "coda");
 out:
@@ -425,10 +425,10 @@ static int __init init_coda(void)
        return 0;
 out:
        for (i = 0; i < MAX_CODADEVS; i++) {
-               class_simple_device_remove(MKDEV(CODA_PSDEV_MAJOR, i));
+               class_device_destroy(coda_psdev_class, MKDEV(CODA_PSDEV_MAJOR, i));
                devfs_remove("coda/%d", i);
        }
-       class_simple_destroy(coda_psdev_class);
+       class_destroy(coda_psdev_class);
        devfs_remove("coda");
        unregister_chrdev(CODA_PSDEV_MAJOR, "coda");
        coda_sysctl_clean();
@@ -447,10 +447,10 @@ static void __exit exit_coda(void)
                 printk("coda: failed to unregister filesystem\n");
         }
        for (i = 0; i < MAX_CODADEVS; i++) {
-               class_simple_device_remove(MKDEV(CODA_PSDEV_MAJOR, i));
+               class_device_destroy(coda_psdev_class, MKDEV(CODA_PSDEV_MAJOR, i));
                devfs_remove("coda/%d", i);
        }
-       class_simple_destroy(coda_psdev_class);
+       class_destroy(coda_psdev_class);
        devfs_remove("coda");
        unregister_chrdev(CODA_PSDEV_MAJOR, "coda");
        coda_sysctl_clean();
index 548556ff250609677019712bbc066ef018bea107..efc97d9b78604d040ba12ae9b1e418a6f9818534 100644 (file)
@@ -45,44 +45,15 @@ struct file_operations debugfs_file_operations = {
        .open =         default_open,
 };
 
-#define simple_type(type, format, temptype, strtolfn)                          \
-static ssize_t read_file_##type(struct file *file, char __user *user_buf,      \
-                               size_t count, loff_t *ppos)                     \
-{                                                                              \
-       char buf[32];                                                           \
-       type *val = file->private_data;                                         \
-                                                                               \
-       snprintf(buf, sizeof(buf), format "\n", *val);                          \
-       return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));\
-}                                                                              \
-static ssize_t write_file_##type(struct file *file, const char __user *user_buf,\
-                                size_t count, loff_t *ppos)                    \
-{                                                                              \
-       char *endp;                                                             \
-       char buf[32];                                                           \
-       int buf_size;                                                           \
-       type *val = file->private_data;                                         \
-       temptype tmp;                                                           \
-                                                                               \
-       memset(buf, 0x00, sizeof(buf));                                         \
-       buf_size = min(count, (sizeof(buf)-1));                                 \
-       if (copy_from_user(buf, user_buf, buf_size))                            \
-               return -EFAULT;                                                 \
-                                                                               \
-       tmp = strtolfn(buf, &endp, 0);                                          \
-       if ((endp == buf) || ((type)tmp != tmp))                                \
-               return -EINVAL;                                                 \
-       *val = tmp;                                                             \
-       return count;                                                           \
-}                                                                              \
-static struct file_operations fops_##type = {                                  \
-       .read =         read_file_##type,                                       \
-       .write =        write_file_##type,                                      \
-       .open =         default_open,                                           \
-};
-simple_type(u8, "%c", unsigned long, simple_strtoul);
-simple_type(u16, "%hi", unsigned long, simple_strtoul);
-simple_type(u32, "%i", unsigned long, simple_strtoul);
+static void debugfs_u8_set(void *data, u64 val)
+{
+       *(u8 *)data = val;
+}
+static u64 debugfs_u8_get(void *data)
+{
+       return *(u8 *)data;
+}
+DEFINE_SIMPLE_ATTRIBUTE(fops_u8, debugfs_u8_get, debugfs_u8_set, "%llu\n");
 
 /**
  * debugfs_create_u8 - create a file in the debugfs filesystem that is used to read and write a unsigned 8 bit value.
@@ -116,6 +87,16 @@ struct dentry *debugfs_create_u8(const char *name, mode_t mode,
 }
 EXPORT_SYMBOL_GPL(debugfs_create_u8);
 
+static void debugfs_u16_set(void *data, u64 val)
+{
+       *(u16 *)data = val;
+}
+static u64 debugfs_u16_get(void *data)
+{
+       return *(u16 *)data;
+}
+DEFINE_SIMPLE_ATTRIBUTE(fops_u16, debugfs_u16_get, debugfs_u16_set, "%llu\n");
+
 /**
  * debugfs_create_u16 - create a file in the debugfs filesystem that is used to read and write a unsigned 8 bit value.
  *
@@ -148,6 +129,16 @@ struct dentry *debugfs_create_u16(const char *name, mode_t mode,
 }
 EXPORT_SYMBOL_GPL(debugfs_create_u16);
 
+static void debugfs_u32_set(void *data, u64 val)
+{
+       *(u32 *)data = val;
+}
+static u64 debugfs_u32_get(void *data)
+{
+       return *(u32 *)data;
+}
+DEFINE_SIMPLE_ATTRIBUTE(fops_u32, debugfs_u32_get, debugfs_u32_set, "%llu\n");
+
 /**
  * debugfs_create_u32 - create a file in the debugfs filesystem that is used to read and write a unsigned 8 bit value.
  *
index e56ee24370255e2ab4df9a3933ec03f0d07a2de3..3a4b35a14c0d4504b0b3b8598c9ffa0d50ad6b40 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -649,6 +649,7 @@ static inline int de_thread(struct task_struct *tsk)
        }
        sig->group_exit_task = NULL;
        sig->notify_count = 0;
+       sig->real_timer.data = (unsigned long)current;
        spin_unlock_irq(lock);
 
        /*
@@ -675,10 +676,8 @@ static inline int de_thread(struct task_struct *tsk)
                proc_dentry2 = proc_pid_unhash(leader);
                write_lock_irq(&tasklist_lock);
 
-               if (leader->tgid != current->tgid)
-                       BUG();
-               if (current->pid == current->tgid)
-                       BUG();
+               BUG_ON(leader->tgid != current->tgid);
+               BUG_ON(current->pid == current->tgid);
                /*
                 * An exec() starts a new thread group with the
                 * TGID of the previous thread group. Rehash the
@@ -726,8 +725,7 @@ static inline int de_thread(struct task_struct *tsk)
                proc_pid_flush(proc_dentry1);
                proc_pid_flush(proc_dentry2);
 
-               if (exit_state != EXIT_ZOMBIE)
-                       BUG();
+               BUG_ON(exit_state != EXIT_ZOMBIE);
                release_task(leader);
         }
 
@@ -772,10 +770,8 @@ no_thread_group:
                        kmem_cache_free(sighand_cachep, oldsighand);
        }
 
-       if (!thread_group_empty(current))
-               BUG();
-       if (!thread_group_leader(current))
-               BUG();
+       BUG_ON(!thread_group_empty(current));
+       BUG_ON(!thread_group_leader(current));
        return 0;
 }
        
index 545b440a2d2fac2d2cd193c40938a440be24c953..981ccb233ef5e29949152a6dea0aeb55edc84b8c 100644 (file)
@@ -225,8 +225,16 @@ void __ext3_std_error (struct super_block * sb, const char * function,
                       int errno)
 {
        char nbuf[16];
-       const char *errstr = ext3_decode_error(sb, errno, nbuf);
+       const char *errstr;
+
+       /* Special case: if the error is EROFS, and we're not already
+        * inside a transaction, then there's really no point in logging
+        * an error. */
+       if (errno == -EROFS && journal_current_handle() == NULL &&
+           (sb->s_flags & MS_RDONLY))
+               return;
 
+       errstr = ext3_decode_error(sb, errno, nbuf);
        printk (KERN_CRIT "EXT3-fs error (device %s) in %s: %s\n",
                sb->s_id, function, errstr);
 
index 14a0d339d0369f031a6eeb3905d086b1c31a52ab..4bf43ea87c4639ae8e0ce6f8cbd4592d7d70cccb 100644 (file)
@@ -23,7 +23,6 @@
 #include "kern_util.h"
 #include "kern.h"
 #include "user_util.h"
-#include "2_5compat.h"
 #include "init.h"
 
 struct hostfs_inode_info {
index 2af3338f891bb17d069ec48a0323ecc710cf1ebd..3a9b6d179cbdf492da7924012fd85aa8241a64f1 100644 (file)
@@ -122,6 +122,9 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
 
        start_addr = mm->free_area_cache;
 
+       if (len <= mm->cached_hole_size)
+               start_addr = TASK_UNMAPPED_BASE;
+
 full_search:
        addr = ALIGN(start_addr, HPAGE_SIZE);
 
index 6030956b894b907a91b95d9af667b728a414a4f7..7901ac9f97ab4728150c0ba68e11e48645f51a26 100644 (file)
@@ -193,12 +193,17 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
 
                /* Handle everything else.  Do name translation if there
                   is no Rock Ridge NM field. */
-               if (sbi->s_unhide == 'n') {
-                       /* Do not report hidden or associated files */
-                       if (de->flags[-sbi->s_high_sierra] & 5) {
-                               filp->f_pos += de_len;
-                               continue;
-                       }
+
+               /*
+                * Do not report hidden files if so instructed, or associated
+                * files unless instructed to do so
+                */
+               if ((sbi->s_hide == 'y' &&
+                               (de->flags[-sbi->s_high_sierra] & 1)) ||
+                     (sbi->s_showassoc =='n' &&
+                               (de->flags[-sbi->s_high_sierra] & 4))) {
+                       filp->f_pos += de_len;
+                       continue;
                }
 
                map = 1;
index abd7b12eeca74e074373598707ad7b2704146a87..1652de1b6cb9e0a57bb9d33f6dff568b3f84196d 100644 (file)
 
 #define BEQUIET
 
-#ifdef LEAK_CHECK
-static int check_malloc;
-static int check_bread;
-#endif
-
 static int isofs_hashi(struct dentry *parent, struct qstr *qstr);
 static int isofs_hash(struct dentry *parent, struct qstr *qstr);
 static int isofs_dentry_cmpi(struct dentry *dentry, struct qstr *a, struct qstr *b);
@@ -55,11 +50,6 @@ static void isofs_put_super(struct super_block *sb)
        }
 #endif
 
-#ifdef LEAK_CHECK
-       printk("Outstanding mallocs:%d, outstanding buffers: %d\n",
-              check_malloc, check_bread);
-#endif
-
        kfree(sbi);
        sb->s_fs_info = NULL;
        return;
@@ -73,7 +63,7 @@ static kmem_cache_t *isofs_inode_cachep;
 static struct inode *isofs_alloc_inode(struct super_block *sb)
 {
        struct iso_inode_info *ei;
-       ei = (struct iso_inode_info *)kmem_cache_alloc(isofs_inode_cachep, SLAB_KERNEL);
+       ei = kmem_cache_alloc(isofs_inode_cachep, SLAB_KERNEL);
        if (!ei)
                return NULL;
        return &ei->vfs_inode;
@@ -84,9 +74,9 @@ static void isofs_destroy_inode(struct inode *inode)
        kmem_cache_free(isofs_inode_cachep, ISOFS_I(inode));
 }
 
-static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags)
+static void init_once(void *foo, kmem_cache_t * cachep, unsigned long flags)
 {
-       struct iso_inode_info *ei = (struct iso_inode_info *) foo;
+       struct iso_inode_info *ei = foo;
 
        if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
            SLAB_CTOR_CONSTRUCTOR)
@@ -107,7 +97,8 @@ static int init_inodecache(void)
 static void destroy_inodecache(void)
 {
        if (kmem_cache_destroy(isofs_inode_cachep))
-               printk(KERN_INFO "iso_inode_cache: not all structures were freed\n");
+               printk(KERN_INFO "iso_inode_cache: not all structures were "
+                                       "freed\n");
 }
 
 static int isofs_remount(struct super_block *sb, int *flags, char *data)
@@ -144,7 +135,7 @@ static struct dentry_operations isofs_dentry_ops[] = {
        {
                .d_hash         = isofs_hashi_ms,
                .d_compare      = isofs_dentry_cmpi_ms,
-       }
+       },
 #endif
 };
 
@@ -153,7 +144,8 @@ struct iso9660_options{
        char rock;
        char joliet;
        char cruft;
-       char unhide;
+       char hide;
+       char showassoc;
        char nocompress;
        unsigned char check;
        unsigned int blocksize;
@@ -219,8 +211,8 @@ isofs_hashi_common(struct dentry *dentry, struct qstr *qstr, int ms)
 /*
  * Case insensitive compare of two isofs names.
  */
-static int
-isofs_dentry_cmpi_common(struct dentry *dentry,struct qstr *a,struct qstr *b,int ms)
+static int isofs_dentry_cmpi_common(struct dentry *dentry, struct qstr *a,
+                               struct qstr *b, int ms)
 {
        int alen, blen;
 
@@ -243,8 +235,8 @@ isofs_dentry_cmpi_common(struct dentry *dentry,struct qstr *a,struct qstr *b,int
 /*
  * Case sensitive compare of two isofs names.
  */
-static int
-isofs_dentry_cmp_common(struct dentry *dentry,struct qstr *a,struct qstr *b,int ms)
+static int isofs_dentry_cmp_common(struct dentry *dentry, struct qstr *a,
+                                       struct qstr *b, int ms)
 {
        int alen, blen;
 
@@ -318,13 +310,15 @@ enum {
        Opt_block, Opt_check_r, Opt_check_s, Opt_cruft, Opt_gid, Opt_ignore,
        Opt_iocharset, Opt_map_a, Opt_map_n, Opt_map_o, Opt_mode, Opt_nojoliet,
        Opt_norock, Opt_sb, Opt_session, Opt_uid, Opt_unhide, Opt_utf8, Opt_err,
-       Opt_nocompress,
+       Opt_nocompress, Opt_hide, Opt_showassoc,
 };
 
 static match_table_t tokens = {
        {Opt_norock, "norock"},
        {Opt_nojoliet, "nojoliet"},
        {Opt_unhide, "unhide"},
+       {Opt_hide, "hide"},
+       {Opt_showassoc, "showassoc"},
        {Opt_cruft, "cruft"},
        {Opt_utf8, "utf8"},
        {Opt_iocharset, "iocharset=%s"},
@@ -356,7 +350,7 @@ static match_table_t tokens = {
        {Opt_err, NULL}
 };
 
-static int parse_options(char *options, struct iso9660_options * popt)
+static int parse_options(char *options, struct iso9660_options *popt)
 {
        char *p;
        int option;
@@ -365,7 +359,8 @@ static int parse_options(char *options, struct iso9660_options * popt)
        popt->rock = 'y';
        popt->joliet = 'y';
        popt->cruft = 'n';
-       popt->unhide = 'n';
+       popt->hide = 'n';
+       popt->showassoc = 'n';
        popt->check = 'u';              /* unset */
        popt->nocompress = 0;
        popt->blocksize = 1024;
@@ -398,8 +393,12 @@ static int parse_options(char *options, struct iso9660_options * popt)
                case Opt_nojoliet:
                        popt->joliet = 'n';
                        break;
+               case Opt_hide:
+                       popt->hide = 'y';
+                       break;
                case Opt_unhide:
-                       popt->unhide = 'y';
+               case Opt_showassoc:
+                       popt->showassoc = 'y';
                        break;
                case Opt_cruft:
                        popt->cruft = 'y';
@@ -493,7 +492,7 @@ static int parse_options(char *options, struct iso9660_options * popt)
  */
 #define WE_OBEY_THE_WRITTEN_STANDARDS 1
 
-static unsigned int isofs_get_last_session(struct super_block *sb,s32 session )
+static unsigned int isofs_get_last_session(struct super_block *sb, s32 session)
 {
        struct cdrom_multisession ms_info;
        unsigned int vol_desc_start;
@@ -518,7 +517,8 @@ static unsigned int isofs_get_last_session(struct super_block *sb,s32 session )
                printk(KERN_ERR "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");
+       if (session > 0)
+               printk(KERN_ERR "Invalid session number\n");
 #if 0
        printk("isofs.inode: CDROMMULTISESSION: rc=%d\n",i);
        if (i==0) {
@@ -557,13 +557,13 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
        struct iso9660_options          opt;
        struct isofs_sb_info          * sbi;
 
-       sbi = kmalloc(sizeof(struct isofs_sb_info), GFP_KERNEL);
+       sbi = kmalloc(sizeof(*sbi), GFP_KERNEL);
        if (!sbi)
                return -ENOMEM;
        s->s_fs_info = sbi;
-       memset(sbi, 0, sizeof(struct isofs_sb_info));
+       memset(sbi, 0, sizeof(*sbi));
 
-       if (!parse_options((char *) data, &opt))
+       if (!parse_options((char *)data, &opt))
                goto out_freesbi;
 
        /*
@@ -792,7 +792,8 @@ root_found:
        sbi->s_rock = (opt.rock == 'y' ? 2 : 0);
        sbi->s_rock_offset = -1; /* initial offset, will guess until SP is found*/
        sbi->s_cruft = opt.cruft;
-       sbi->s_unhide = opt.unhide;
+       sbi->s_hide = opt.hide;
+       sbi->s_showassoc = opt.showassoc;
        sbi->s_uid = opt.uid;
        sbi->s_gid = opt.gid;
        sbi->s_utf8 = opt.utf8;
@@ -1002,7 +1003,6 @@ int isofs_get_blocks(struct inode *inode, sector_t iblock_s,
                rv++;
        }
 
-
 abort:
        unlock_kernel();
        return rv;
@@ -1014,7 +1014,7 @@ abort:
 static int isofs_get_block(struct inode *inode, sector_t iblock,
                    struct buffer_head *bh_result, int create)
 {
-       if ( create ) {
+       if (create) {
                printk("isofs_get_block: Kernel tries to allocate a block\n");
                return -EROFS;
        }
@@ -1061,19 +1061,17 @@ static struct address_space_operations isofs_aops = {
 
 static inline void test_and_set_uid(uid_t *p, uid_t value)
 {
-       if(value) {
+       if (value)
                *p = value;
-       }
 }
 
 static inline void test_and_set_gid(gid_t *p, gid_t value)
 {
-        if(value) {
+        if (value)
                 *p = value;
-        }
 }
 
-static int isofs_read_level3_size(struct inode * inode)
+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;
@@ -1136,7 +1134,7 @@ static int isofs_read_level3_size(struct inode * inode)
                                bh = sb_bread(inode->i_sb, block);
                                if (!bh)
                                        goto out_noread;
-                               memcpy((void *) tmpde + slop, bh->b_data, offset);
+                               memcpy((void *)tmpde+slop, bh->b_data, offset);
                        }
                        de = tmpde;
                }
@@ -1150,12 +1148,11 @@ static int isofs_read_level3_size(struct inode * inode)
                more_entries = de->flags[-high_sierra] & 0x80;
 
                i++;
-               if(i > 100)
+               if (i > 100)
                        goto out_toomany;
-       } while(more_entries);
+       } while (more_entries);
 out:
-       if (tmpde)
-               kfree(tmpde);
+       kfree(tmpde);
        if (bh)
                brelse(bh);
        return 0;
@@ -1179,7 +1176,7 @@ out_toomany:
        goto out;
 }
 
-static void isofs_read_inode(struct inode * inode)
+static void isofs_read_inode(struct inode *inode)
 {
        struct super_block *sb = inode->i_sb;
        struct isofs_sb_info *sbi = ISOFS_SB(sb);
@@ -1249,7 +1246,7 @@ static void isofs_read_inode(struct inode * inode)
        ei->i_format_parm[2] = 0;
 
        ei->i_section_size = isonum_733 (de->size);
-       if(de->flags[-high_sierra] & 0x80) {
+       if (de->flags[-high_sierra] & 0x80) {
                if(isofs_read_level3_size(inode)) goto fail;
        } else {
                ei->i_next_section_block = 0;
@@ -1336,16 +1333,16 @@ static void isofs_read_inode(struct inode * inode)
                /* XXX - parse_rock_ridge_inode() had already set i_rdev. */
                init_special_inode(inode, inode->i_mode, inode->i_rdev);
 
- out:
+out:
        if (tmpde)
                kfree(tmpde);
        if (bh)
                brelse(bh);
        return;
 
- out_badread:
+out_badread:
        printk(KERN_WARNING "ISOFS: unable to read i-node block\n");
- fail:
+fail:
        make_bad_inode(inode);
        goto out;
 }
@@ -1394,11 +1391,8 @@ 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);
+       inode = iget5_locked(sb, hashval, &isofs_iget5_test,
+                            &isofs_iget5_set, &data);
 
        if (inode && (inode->i_state & I_NEW)) {
                sb->s_op->read_inode(inode);
@@ -1408,36 +1402,6 @@ struct inode *isofs_iget(struct super_block *sb,
        return inode;
 }
 
-#ifdef LEAK_CHECK
-#undef malloc
-#undef free_s
-#undef sb_bread
-#undef brelse
-
-void * leak_check_malloc(unsigned int size){
-  void * tmp;
-  check_malloc++;
-  tmp = kmalloc(size, GFP_KERNEL);
-  return tmp;
-}
-
-void leak_check_free_s(void * obj, int size){
-  check_malloc--;
-  return kfree(obj);
-}
-
-struct buffer_head * leak_check_bread(struct super_block *sb, int block){
-  check_bread++;
-  return sb_bread(sb, block);
-}
-
-void leak_check_brelse(struct buffer_head * bh){
-  check_bread--;
-  return brelse(bh);
-}
-
-#endif
-
 static struct super_block *isofs_get_sb(struct file_system_type *fs_type,
        int flags, const char *dev_name, void *data)
 {
index 9ce7b51fb6141ea6b82d85687d490c74755591fb..38c75151fc66b60ec49f2b89df7a340c09ee344e 100644 (file)
@@ -47,6 +47,8 @@ struct isofs_sb_info {
        unsigned char s_nosuid;
        unsigned char s_nodev;
        unsigned char s_nocompress;
+       unsigned char s_hide;
+       unsigned char s_showassoc;
 
        mode_t s_mode;
        gid_t s_gid;
index 690edf37173c8c5d864a64a73de1e4a87796e6d6..e37e82b7cbf0127281fb12deca7475810906674a 100644 (file)
@@ -131,14 +131,16 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
                }
 
                /*
-                * Skip hidden or associated files unless unhide is set 
+                * Skip hidden or associated files unless hide or showassoc,
+                * respectively, is set
                 */
                match = 0;
                if (dlen > 0 &&
-                   (!(de->flags[-sbi->s_high_sierra] & 5)
-                    || sbi->s_unhide == 'y'))
-               {
-                       match = (isofs_cmp(dentry,dpnt,dlen) == 0);
+                       (sbi->s_hide =='n' ||
+                               (!(de->flags[-sbi->s_high_sierra] & 1))) &&
+                       (sbi->s_showassoc =='y' ||
+                               (!(de->flags[-sbi->s_high_sierra] & 4)))) {
+                       match = (isofs_cmp(dentry, dpnt, dlen) == 0);
                }
                if (match) {
                        isofs_normalize_block_and_offset(de,
@@ -146,11 +148,11 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
                                                         &offset_saved);
                         *block_rv = block_saved;
                         *offset_rv = offset_saved;
-                       if (bh) brelse(bh);
+                       brelse(bh);
                        return 1;
                }
        }
-       if (bh) brelse(bh);
+       brelse(bh);
        return 0;
 }
 
index 089e79c65585ae5fadb58ce1db43d5ee2bad7126..4326cb47f8fa267667311d2b65b361aa66508858 100644 (file)
 #include "isofs.h"
 #include "rock.h"
 
-/* These functions are designed to read the system areas of a directory record
+/*
+ * These functions are designed to read the system areas of a directory record
  * and extract relevant information.  There are different functions provided
  * depending upon what information we need at the time.  One function fills
  * out an inode structure, a second one extracts a filename, a third one
  * returns a symbolic link name, and a fourth one returns the extent number
- * for the file. */
-
-#define SIG(A,B) ((A) | ((B) << 8)) /* isonum_721() */
-
-
-/* This is a way of ensuring that we have something in the system
-   use fields that is compatible with Rock Ridge */
-#define CHECK_SP(FAIL)                         \
-      if(rr->u.SP.magic[0] != 0xbe) FAIL;      \
-      if(rr->u.SP.magic[1] != 0xef) FAIL;       \
-      ISOFS_SB(inode->i_sb)->s_rock_offset=rr->u.SP.skip;
-/* We define a series of macros because each function must do exactly the
-   same thing in certain places.  We use the macros to ensure that everything
-   is done correctly */
-
-#define CONTINUE_DECLS \
-  int cont_extent = 0, cont_offset = 0, cont_size = 0;   \
-  void *buffer = NULL
-
-#define CHECK_CE                               \
-      {cont_extent = isonum_733(rr->u.CE.extent); \
-      cont_offset = isonum_733(rr->u.CE.offset); \
-      cont_size = isonum_733(rr->u.CE.size);}
-
-#define SETUP_ROCK_RIDGE(DE,CHR,LEN)                           \
-  {LEN= sizeof(struct iso_directory_record) + DE->name_len[0]; \
-  if(LEN & 1) LEN++;                                           \
-  CHR = ((unsigned char *) DE) + LEN;                          \
-  LEN = *((unsigned char *) DE) - LEN;                          \
-  if (LEN<0) LEN=0;                                             \
-  if (ISOFS_SB(inode->i_sb)->s_rock_offset!=-1)                \
-  {                                                             \
-     LEN-=ISOFS_SB(inode->i_sb)->s_rock_offset;                \
-     CHR+=ISOFS_SB(inode->i_sb)->s_rock_offset;                \
-     if (LEN<0) LEN=0;                                          \
-  }                                                             \
-}                                     
-
-#define MAYBE_CONTINUE(LABEL,DEV) \
-  {if (buffer) { kfree(buffer); buffer = NULL; } \
-  if (cont_extent){ \
-    int block, offset, offset1; \
-    struct buffer_head * pbh; \
-    buffer = kmalloc(cont_size,GFP_KERNEL); \
-    if (!buffer) goto out; \
-    block = cont_extent; \
-    offset = cont_offset; \
-    offset1 = 0; \
-    pbh = sb_bread(DEV->i_sb, block); \
-    if(pbh){       \
-      if (offset > pbh->b_size || offset + cont_size > pbh->b_size){   \
-       brelse(pbh); \
-       goto out; \
-      } \
-      memcpy(buffer + offset1, pbh->b_data + offset, cont_size - offset1); \
-      brelse(pbh); \
-      chr = (unsigned char *) buffer; \
-      len = cont_size; \
-      cont_extent = 0; \
-      cont_size = 0; \
-      cont_offset = 0; \
-      goto LABEL; \
-    }    \
-    printk("Unable to read rock-ridge attributes\n");    \
-  }}
-
-/* return length of name field; 0: not found, -1: to be ignored */
-int get_rock_ridge_filename(struct iso_directory_record * de,
-                           char * retname, struct inode * inode)
+ * for the file.
+ */
+
+#define SIG(A,B) ((A) | ((B) << 8))    /* isonum_721() */
+
+struct rock_state {
+       void *buffer;
+       unsigned char *chr;
+       int len;
+       int cont_size;
+       int cont_extent;
+       int cont_offset;
+       struct inode *inode;
+};
+
+/*
+ * This is a way of ensuring that we have something in the system
+ * use fields that is compatible with Rock Ridge.  Return zero on success.
+ */
+
+static int check_sp(struct rock_ridge *rr, struct inode *inode)
 {
-  int len;
-  unsigned char * chr;
-  CONTINUE_DECLS;
-  int retnamlen = 0, truncate=0;
-  if (!ISOFS_SB(inode->i_sb)->s_rock) return 0;
-  *retname = 0;
-
-  SETUP_ROCK_RIDGE(de, chr, len);
- repeat:
-  {
-    struct rock_ridge * rr;
-    int sig;
-    
-    while (len > 2){ /* There may be one byte for padding somewhere */
-      rr = (struct rock_ridge *) chr;
-      if (rr->len < 3) goto out; /* Something got screwed up here */
-      sig = isonum_721(chr);
-      chr += rr->len; 
-      len -= rr->len;
-      if (len < 0) goto out;   /* corrupted isofs */
-
-      switch(sig){
-      case SIG('R','R'):
-       if((rr->u.RR.flags[0] & RR_NM) == 0) goto out;
-       break;
-      case SIG('S','P'):
-       CHECK_SP(goto out);
-       break;
-      case SIG('C','E'):
-       CHECK_CE;
-       break;
-      case SIG('N','M'):
-       if (truncate) break;
-       if (rr->len < 5) break;
-        /*
-        * If the flags are 2 or 4, this indicates '.' or '..'.
-        * We don't want to do anything with this, because it
-        * screws up the code that calls us.  We don't really
-        * care anyways, since we can just use the non-RR
-        * name.
-        */
-       if (rr->u.NM.flags & 6) {
-         break;
+       if (rr->u.SP.magic[0] != 0xbe)
+               return -1;
+       if (rr->u.SP.magic[1] != 0xef)
+               return -1;
+       ISOFS_SB(inode->i_sb)->s_rock_offset = rr->u.SP.skip;
+       return 0;
+}
+
+static void setup_rock_ridge(struct iso_directory_record *de,
+                       struct inode *inode, struct rock_state *rs)
+{
+       rs->len = sizeof(struct iso_directory_record) + de->name_len[0];
+       if (rs->len & 1)
+               (rs->len)++;
+       rs->chr = (unsigned char *)de + rs->len;
+       rs->len = *((unsigned char *)de) - rs->len;
+       if (rs->len < 0)
+               rs->len = 0;
+
+       if (ISOFS_SB(inode->i_sb)->s_rock_offset != -1) {
+               rs->len -= ISOFS_SB(inode->i_sb)->s_rock_offset;
+               rs->chr += ISOFS_SB(inode->i_sb)->s_rock_offset;
+               if (rs->len < 0)
+                       rs->len = 0;
+       }
+}
+
+static void init_rock_state(struct rock_state *rs, struct inode *inode)
+{
+       memset(rs, 0, sizeof(*rs));
+       rs->inode = inode;
+}
+
+/*
+ * Returns 0 if the caller should continue scanning, 1 if the scan must end
+ * and -ve on error.
+ */
+static int rock_continue(struct rock_state *rs)
+{
+       int ret = 1;
+       int blocksize = 1 << rs->inode->i_blkbits;
+       const int min_de_size = offsetof(struct rock_ridge, u);
+
+       kfree(rs->buffer);
+       rs->buffer = NULL;
+
+       if ((unsigned)rs->cont_offset > blocksize - min_de_size ||
+           (unsigned)rs->cont_size > blocksize ||
+           (unsigned)(rs->cont_offset + rs->cont_size) > blocksize) {
+               printk(KERN_NOTICE "rock: corrupted directory entry. "
+                       "extent=%d, offset=%d, size=%d\n",
+                       rs->cont_extent, rs->cont_offset, rs->cont_size);
+               ret = -EIO;
+               goto out;
        }
 
-       if (rr->u.NM.flags & ~1) {
-         printk("Unsupported NM flag settings (%d)\n",rr->u.NM.flags);
-         break;
+       if (rs->cont_extent) {
+               struct buffer_head *bh;
+
+               rs->buffer = kmalloc(rs->cont_size, GFP_KERNEL);
+               if (!rs->buffer) {
+                       ret = -ENOMEM;
+                       goto out;
+               }
+               ret = -EIO;
+               bh = sb_bread(rs->inode->i_sb, rs->cont_extent);
+               if (bh) {
+                       memcpy(rs->buffer, bh->b_data + rs->cont_offset,
+                                       rs->cont_size);
+                       put_bh(bh);
+                       rs->chr = rs->buffer;
+                       rs->len = rs->cont_size;
+                       rs->cont_extent = 0;
+                       rs->cont_size = 0;
+                       rs->cont_offset = 0;
+                       return 0;
+               }
+               printk("Unable to read rock-ridge attributes\n");
+       }
+out:
+       kfree(rs->buffer);
+       rs->buffer = NULL;
+       return ret;
+}
+
+/*
+ * We think there's a record of type `sig' at rs->chr.  Parse the signature
+ * and make sure that there's really room for a record of that type.
+ */
+static int rock_check_overflow(struct rock_state *rs, int sig)
+{
+       int len;
+
+       switch (sig) {
+       case SIG('S', 'P'):
+               len = sizeof(struct SU_SP_s);
+               break;
+       case SIG('C', 'E'):
+               len = sizeof(struct SU_CE_s);
+               break;
+       case SIG('E', 'R'):
+               len = sizeof(struct SU_ER_s);
+               break;
+       case SIG('R', 'R'):
+               len = sizeof(struct RR_RR_s);
+               break;
+       case SIG('P', 'X'):
+               len = sizeof(struct RR_PX_s);
+               break;
+       case SIG('P', 'N'):
+               len = sizeof(struct RR_PN_s);
+               break;
+       case SIG('S', 'L'):
+               len = sizeof(struct RR_SL_s);
+               break;
+       case SIG('N', 'M'):
+               len = sizeof(struct RR_NM_s);
+               break;
+       case SIG('C', 'L'):
+               len = sizeof(struct RR_CL_s);
+               break;
+       case SIG('P', 'L'):
+               len = sizeof(struct RR_PL_s);
+               break;
+       case SIG('T', 'F'):
+               len = sizeof(struct RR_TF_s);
+               break;
+       case SIG('Z', 'F'):
+               len = sizeof(struct RR_ZF_s);
+               break;
+       default:
+               len = 0;
+               break;
        }
-       if((strlen(retname) + rr->len - 5) >= 254) {
-         truncate = 1;
-         break;
+       len += offsetof(struct rock_ridge, u);
+       if (len > rs->len) {
+               printk(KERN_NOTICE "rock: directory entry would overflow "
+                               "storage\n");
+               printk(KERN_NOTICE "rock: sig=0x%02x, size=%d, remaining=%d\n",
+                               sig, len, rs->len);
+               return -EIO;
+       }
+       return 0;
+}
+
+/*
+ * return length of name field; 0: not found, -1: to be ignored
+ */
+int get_rock_ridge_filename(struct iso_directory_record *de,
+                           char *retname, struct inode *inode)
+{
+       struct rock_state rs;
+       struct rock_ridge *rr;
+       int sig;
+       int retnamlen = 0;
+       int truncate = 0;
+       int ret = 0;
+
+       if (!ISOFS_SB(inode->i_sb)->s_rock)
+               return 0;
+       *retname = 0;
+
+       init_rock_state(&rs, inode);
+       setup_rock_ridge(de, inode, &rs);
+repeat:
+
+       while (rs.len > 2) { /* There may be one byte for padding somewhere */
+               rr = (struct rock_ridge *)rs.chr;
+               if (rr->len < 3)
+                       goto out;       /* Something got screwed up here */
+               sig = isonum_721(rs.chr);
+               if (rock_check_overflow(&rs, sig))
+                       goto eio;
+               rs.chr += rr->len;
+               rs.len -= rr->len;
+               if (rs.len < 0)
+                       goto eio;       /* corrupted isofs */
+
+               switch (sig) {
+               case SIG('R', 'R'):
+                       if ((rr->u.RR.flags[0] & RR_NM) == 0)
+                               goto out;
+                       break;
+               case SIG('S', 'P'):
+                       if (check_sp(rr, inode))
+                               goto out;
+                       break;
+               case SIG('C', 'E'):
+                       rs.cont_extent = isonum_733(rr->u.CE.extent);
+                       rs.cont_offset = isonum_733(rr->u.CE.offset);
+                       rs.cont_size = isonum_733(rr->u.CE.size);
+                       break;
+               case SIG('N', 'M'):
+                       if (truncate)
+                               break;
+                       if (rr->len < 5)
+                               break;
+                       /*
+                        * If the flags are 2 or 4, this indicates '.' or '..'.
+                        * We don't want to do anything with this, because it
+                        * screws up the code that calls us.  We don't really
+                        * care anyways, since we can just use the non-RR
+                        * name.
+                        */
+                       if (rr->u.NM.flags & 6)
+                               break;
+
+                       if (rr->u.NM.flags & ~1) {
+                               printk("Unsupported NM flag settings (%d)\n",
+                                       rr->u.NM.flags);
+                               break;
+                       }
+                       if ((strlen(retname) + rr->len - 5) >= 254) {
+                               truncate = 1;
+                               break;
+                       }
+                       strncat(retname, rr->u.NM.name, rr->len - 5);
+                       retnamlen += rr->len - 5;
+                       break;
+               case SIG('R', 'E'):
+                       kfree(rs.buffer);
+                       return -1;
+               default:
+                       break;
+               }
        }
-       strncat(retname, rr->u.NM.name, rr->len - 5);
-       retnamlen += rr->len - 5;
-       break;
-      case SIG('R','E'):
-       if (buffer) kfree(buffer);
-       return -1;
-      default:
-       break;
-      }
-    }
-  }
-  MAYBE_CONTINUE(repeat,inode);
-  if (buffer) kfree(buffer);
-  return retnamlen; /* If 0, this file did not have a NM field */
- out:
-  if(buffer) kfree(buffer);
-  return 0;
+       ret = rock_continue(&rs);
+       if (ret == 0)
+               goto repeat;
+       if (ret == 1)
+               return retnamlen; /* If 0, this file did not have a NM field */
+out:
+       kfree(rs.buffer);
+       return ret;
+eio:
+       ret = -EIO;
+       goto out;
 }
 
 static int
 parse_rock_ridge_inode_internal(struct iso_directory_record *de,
                                struct inode *inode, int regard_xa)
 {
-  int len;
-  unsigned char * chr;
-  int symlink_len = 0;
-  CONTINUE_DECLS;
-
-  if (!ISOFS_SB(inode->i_sb)->s_rock) return 0;
-
-  SETUP_ROCK_RIDGE(de, chr, len);
-  if (regard_xa)
-   {
-     chr+=14;
-     len-=14;
-     if (len<0) len=0;
-   }
-   
- repeat:
-  {
-    int cnt, sig;
-    struct inode * reloc;
-    struct rock_ridge * rr;
-    int rootflag;
-    
-    while (len > 2){ /* There may be one byte for padding somewhere */
-      rr = (struct rock_ridge *) chr;
-      if (rr->len < 3) goto out; /* Something got screwed up here */
-      sig = isonum_721(chr);
-      chr += rr->len; 
-      len -= rr->len;
-      if (len < 0) goto out;   /* corrupted isofs */
-      
-      switch(sig){
+       int symlink_len = 0;
+       int cnt, sig;
+       struct inode *reloc;
+       struct rock_ridge *rr;
+       int rootflag;
+       struct rock_state rs;
+       int ret = 0;
+
+       if (!ISOFS_SB(inode->i_sb)->s_rock)
+               return 0;
+
+       init_rock_state(&rs, inode);
+       setup_rock_ridge(de, inode, &rs);
+       if (regard_xa) {
+               rs.chr += 14;
+               rs.len -= 14;
+               if (rs.len < 0)
+                       rs.len = 0;
+       }
+
+repeat:
+       while (rs.len > 2) { /* There may be one byte for padding somewhere */
+               rr = (struct rock_ridge *)rs.chr;
+               if (rr->len < 3)
+                       goto out;       /* Something got screwed up here */
+               sig = isonum_721(rs.chr);
+               if (rock_check_overflow(&rs, sig))
+                       goto eio;
+               rs.chr += rr->len;
+               rs.len -= rr->len;
+               if (rs.len < 0)
+                       goto eio;       /* corrupted isofs */
+
+               switch (sig) {
 #ifndef CONFIG_ZISOFS          /* No flag for SF or ZF */
-      case SIG('R','R'):
-       if((rr->u.RR.flags[0] & 
-           (RR_PX | RR_TF | RR_SL | RR_CL)) == 0) goto out;
-       break;
+               case SIG('R', 'R'):
+                       if ((rr->u.RR.flags[0] &
+                            (RR_PX | RR_TF | RR_SL | RR_CL)) == 0)
+                               goto out;
+                       break;
 #endif
-      case SIG('S','P'):
-       CHECK_SP(goto out);
-       break;
-      case SIG('C','E'):
-       CHECK_CE;
-       break;
-      case SIG('E','R'):
-       ISOFS_SB(inode->i_sb)->s_rock = 1;
-       printk(KERN_DEBUG "ISO 9660 Extensions: ");
-       { int p;
-         for(p=0;p<rr->u.ER.len_id;p++) printk("%c",rr->u.ER.data[p]);
-       }
-         printk("\n");
-       break;
-      case SIG('P','X'):
-       inode->i_mode  = isonum_733(rr->u.PX.mode);
-       inode->i_nlink = isonum_733(rr->u.PX.n_links);
-       inode->i_uid   = isonum_733(rr->u.PX.uid);
-       inode->i_gid   = isonum_733(rr->u.PX.gid);
-       break;
-      case SIG('P','N'):
-       { int high, low;
-         high = isonum_733(rr->u.PN.dev_high);
-         low = isonum_733(rr->u.PN.dev_low);
-         /*
-          * The Rock Ridge standard specifies that if sizeof(dev_t) <= 4,
-          * then the high field is unused, and the device number is completely
-          * stored in the low field.  Some writers may ignore this subtlety,
-          * and as a result we test to see if the entire device number is
-          * stored in the low field, and use that.
-          */
-         if((low & ~0xff) && high == 0) {
-           inode->i_rdev = MKDEV(low >> 8, low & 0xff);
-         } else {
-           inode->i_rdev = MKDEV(high, low);
-         }
-       }
-       break;
-      case SIG('T','F'):
-       /* Some RRIP writers incorrectly place ctime in the TF_CREATE field.
-          Try to handle this correctly for either case. */
-       cnt = 0; /* Rock ridge never appears on a High Sierra disk */
-       if(rr->u.TF.flags & TF_CREATE) { 
-         inode->i_ctime.tv_sec = iso_date(rr->u.TF.times[cnt++].time, 0);
-         inode->i_ctime.tv_nsec = 0;
-       }
-       if(rr->u.TF.flags & TF_MODIFY) {
-         inode->i_mtime.tv_sec = iso_date(rr->u.TF.times[cnt++].time, 0);
-         inode->i_mtime.tv_nsec = 0;
-       }
-       if(rr->u.TF.flags & TF_ACCESS) {
-         inode->i_atime.tv_sec = iso_date(rr->u.TF.times[cnt++].time, 0);
-         inode->i_atime.tv_nsec = 0;
-       }
-       if(rr->u.TF.flags & TF_ATTRIBUTES) { 
-         inode->i_ctime.tv_sec = iso_date(rr->u.TF.times[cnt++].time, 0);
-         inode->i_ctime.tv_nsec = 0;
-       } 
-       break;
-      case SIG('S','L'):
-       {int slen;
-        struct SL_component * slp;
-        struct SL_component * oldslp;
-        slen = rr->len - 5;
-        slp = &rr->u.SL.link;
-        inode->i_size = symlink_len;
-        while (slen > 1){
-          rootflag = 0;
-          switch(slp->flags &~1){
-          case 0:
-            inode->i_size += slp->len;
-            break;
-          case 2:
-            inode->i_size += 1;
-            break;
-          case 4:
-            inode->i_size += 2;
-            break;
-          case 8:
-            rootflag = 1;
-            inode->i_size += 1;
-            break;
-          default:
-            printk("Symlink component flag not implemented\n");
-          }
-          slen -= slp->len + 2;
-          oldslp = slp;
-          slp = (struct SL_component *) (((char *) slp) + slp->len + 2);
-
-          if(slen < 2) {
-            if(    ((rr->u.SL.flags & 1) != 0) 
-                   && ((oldslp->flags & 1) == 0) ) inode->i_size += 1;
-            break;
-          }
-
-          /*
-           * If this component record isn't continued, then append a '/'.
-           */
-          if (!rootflag && (oldslp->flags & 1) == 0)
-                  inode->i_size += 1;
-        }
-       }
-       symlink_len = inode->i_size;
-       break;
-      case SIG('R','E'):
-       printk(KERN_WARNING "Attempt to read inode for relocated directory\n");
-       goto out;
-      case SIG('C','L'):
-       ISOFS_I(inode)->i_first_extent = isonum_733(rr->u.CL.location);
-       reloc = isofs_iget(inode->i_sb, ISOFS_I(inode)->i_first_extent, 0);
-       if (!reloc)
-               goto out;
-       inode->i_mode = reloc->i_mode;
-       inode->i_nlink = reloc->i_nlink;
-       inode->i_uid = reloc->i_uid;
-       inode->i_gid = reloc->i_gid;
-       inode->i_rdev = reloc->i_rdev;
-       inode->i_size = reloc->i_size;
-       inode->i_blocks = reloc->i_blocks;
-       inode->i_atime = reloc->i_atime;
-       inode->i_ctime = reloc->i_ctime;
-       inode->i_mtime = reloc->i_mtime;
-       iput(reloc);
-       break;
+               case SIG('S', 'P'):
+                       if (check_sp(rr, inode))
+                               goto out;
+                       break;
+               case SIG('C', 'E'):
+                       rs.cont_extent = isonum_733(rr->u.CE.extent);
+                       rs.cont_offset = isonum_733(rr->u.CE.offset);
+                       rs.cont_size = isonum_733(rr->u.CE.size);
+                       break;
+               case SIG('E', 'R'):
+                       ISOFS_SB(inode->i_sb)->s_rock = 1;
+                       printk(KERN_DEBUG "ISO 9660 Extensions: ");
+                       {
+                               int p;
+                               for (p = 0; p < rr->u.ER.len_id; p++)
+                                       printk("%c", rr->u.ER.data[p]);
+                       }
+                       printk("\n");
+                       break;
+               case SIG('P', 'X'):
+                       inode->i_mode = isonum_733(rr->u.PX.mode);
+                       inode->i_nlink = isonum_733(rr->u.PX.n_links);
+                       inode->i_uid = isonum_733(rr->u.PX.uid);
+                       inode->i_gid = isonum_733(rr->u.PX.gid);
+                       break;
+               case SIG('P', 'N'):
+                       {
+                               int high, low;
+                               high = isonum_733(rr->u.PN.dev_high);
+                               low = isonum_733(rr->u.PN.dev_low);
+                               /*
+                                * The Rock Ridge standard specifies that if
+                                * sizeof(dev_t) <= 4, then the high field is
+                                * unused, and the device number is completely
+                                * stored in the low field.  Some writers may
+                                * ignore this subtlety,
+                                * and as a result we test to see if the entire
+                                * device number is
+                                * stored in the low field, and use that.
+                                */
+                               if ((low & ~0xff) && high == 0) {
+                                       inode->i_rdev =
+                                           MKDEV(low >> 8, low & 0xff);
+                               } else {
+                                       inode->i_rdev =
+                                           MKDEV(high, low);
+                               }
+                       }
+                       break;
+               case SIG('T', 'F'):
+                       /*
+                        * Some RRIP writers incorrectly place ctime in the
+                        * TF_CREATE field. Try to handle this correctly for
+                        * either case.
+                        */
+                       /* Rock ridge never appears on a High Sierra disk */
+                       cnt = 0;
+                       if (rr->u.TF.flags & TF_CREATE) {
+                               inode->i_ctime.tv_sec =
+                                   iso_date(rr->u.TF.times[cnt++].time,
+                                            0);
+                               inode->i_ctime.tv_nsec = 0;
+                       }
+                       if (rr->u.TF.flags & TF_MODIFY) {
+                               inode->i_mtime.tv_sec =
+                                   iso_date(rr->u.TF.times[cnt++].time,
+                                            0);
+                               inode->i_mtime.tv_nsec = 0;
+                       }
+                       if (rr->u.TF.flags & TF_ACCESS) {
+                               inode->i_atime.tv_sec =
+                                   iso_date(rr->u.TF.times[cnt++].time,
+                                            0);
+                               inode->i_atime.tv_nsec = 0;
+                       }
+                       if (rr->u.TF.flags & TF_ATTRIBUTES) {
+                               inode->i_ctime.tv_sec =
+                                   iso_date(rr->u.TF.times[cnt++].time,
+                                            0);
+                               inode->i_ctime.tv_nsec = 0;
+                       }
+                       break;
+               case SIG('S', 'L'):
+                       {
+                               int slen;
+                               struct SL_component *slp;
+                               struct SL_component *oldslp;
+                               slen = rr->len - 5;
+                               slp = &rr->u.SL.link;
+                               inode->i_size = symlink_len;
+                               while (slen > 1) {
+                                       rootflag = 0;
+                                       switch (slp->flags & ~1) {
+                                       case 0:
+                                               inode->i_size +=
+                                                   slp->len;
+                                               break;
+                                       case 2:
+                                               inode->i_size += 1;
+                                               break;
+                                       case 4:
+                                               inode->i_size += 2;
+                                               break;
+                                       case 8:
+                                               rootflag = 1;
+                                               inode->i_size += 1;
+                                               break;
+                                       default:
+                                               printk("Symlink component flag "
+                                                       "not implemented\n");
+                                       }
+                                       slen -= slp->len + 2;
+                                       oldslp = slp;
+                                       slp = (struct SL_component *)
+                                               (((char *)slp) + slp->len + 2);
+
+                                       if (slen < 2) {
+                                               if (((rr->u.SL.
+                                                     flags & 1) != 0)
+                                                   &&
+                                                   ((oldslp->
+                                                     flags & 1) == 0))
+                                                       inode->i_size +=
+                                                           1;
+                                               break;
+                                       }
+
+                                       /*
+                                        * If this component record isn't
+                                        * continued, then append a '/'.
+                                        */
+                                       if (!rootflag
+                                           && (oldslp->flags & 1) == 0)
+                                               inode->i_size += 1;
+                               }
+                       }
+                       symlink_len = inode->i_size;
+                       break;
+               case SIG('R', 'E'):
+                       printk(KERN_WARNING "Attempt to read inode for "
+                                       "relocated directory\n");
+                       goto out;
+               case SIG('C', 'L'):
+                       ISOFS_I(inode)->i_first_extent =
+                           isonum_733(rr->u.CL.location);
+                       reloc =
+                           isofs_iget(inode->i_sb,
+                                      ISOFS_I(inode)->i_first_extent,
+                                      0);
+                       if (!reloc)
+                               goto out;
+                       inode->i_mode = reloc->i_mode;
+                       inode->i_nlink = reloc->i_nlink;
+                       inode->i_uid = reloc->i_uid;
+                       inode->i_gid = reloc->i_gid;
+                       inode->i_rdev = reloc->i_rdev;
+                       inode->i_size = reloc->i_size;
+                       inode->i_blocks = reloc->i_blocks;
+                       inode->i_atime = reloc->i_atime;
+                       inode->i_ctime = reloc->i_ctime;
+                       inode->i_mtime = reloc->i_mtime;
+                       iput(reloc);
+                       break;
 #ifdef CONFIG_ZISOFS
-      case SIG('Z','F'):
-             if ( !ISOFS_SB(inode->i_sb)->s_nocompress ) {
-                     int algo;
-                     algo = isonum_721(rr->u.ZF.algorithm);
-                     if ( algo == SIG('p','z') ) {
-                             int block_shift = isonum_711(&rr->u.ZF.parms[1]);
-                             if ( block_shift < PAGE_CACHE_SHIFT || block_shift > 17 ) {
-                                     printk(KERN_WARNING "isofs: Can't handle ZF block size of 2^%d\n", block_shift);
-                             } else {
-                               /* Note: we don't change i_blocks here */
-                                     ISOFS_I(inode)->i_file_format = isofs_file_compressed;
-                               /* Parameters to compression algorithm (header size, block size) */
-                                     ISOFS_I(inode)->i_format_parm[0] = isonum_711(&rr->u.ZF.parms[0]);
-                                     ISOFS_I(inode)->i_format_parm[1] = isonum_711(&rr->u.ZF.parms[1]);
-                                     inode->i_size = isonum_733(rr->u.ZF.real_size);
-                             }
-                     } else {
-                             printk(KERN_WARNING "isofs: Unknown ZF compression algorithm: %c%c\n",
-                                    rr->u.ZF.algorithm[0], rr->u.ZF.algorithm[1]);
-                     }
-             }
-             break;
+               case SIG('Z', 'F'): {
+                       int algo;
+
+                       if (ISOFS_SB(inode->i_sb)->s_nocompress)
+                               break;
+                       algo = isonum_721(rr->u.ZF.algorithm);
+                       if (algo == SIG('p', 'z')) {
+                               int block_shift =
+                                       isonum_711(&rr->u.ZF.parms[1]);
+                               if (block_shift < PAGE_CACHE_SHIFT
+                                               || block_shift > 17) {
+                                       printk(KERN_WARNING "isofs: "
+                                               "Can't handle ZF block "
+                                               "size of 2^%d\n",
+                                               block_shift);
+                               } else {
+                                       /*
+                                        * Note: we don't change
+                                        * i_blocks here
+                                        */
+                                       ISOFS_I(inode)->i_file_format =
+                                               isofs_file_compressed;
+                                       /*
+                                        * Parameters to compression
+                                        * algorithm (header size,
+                                        * block size)
+                                        */
+                                       ISOFS_I(inode)->i_format_parm[0] =
+                                               isonum_711(&rr->u.ZF.parms[0]);
+                                       ISOFS_I(inode)->i_format_parm[1] =
+                                               isonum_711(&rr->u.ZF.parms[1]);
+                                       inode->i_size =
+                                           isonum_733(rr->u.ZF.
+                                                      real_size);
+                               }
+                       } else {
+                               printk(KERN_WARNING
+                                      "isofs: Unknown ZF compression "
+                                               "algorithm: %c%c\n",
+                                      rr->u.ZF.algorithm[0],
+                                      rr->u.ZF.algorithm[1]);
+                       }
+                       break;
+               }
 #endif
-      default:
-       break;
-      }
-    }
-  }
-  MAYBE_CONTINUE(repeat,inode);
- out:
-  if(buffer) kfree(buffer);
-  return 0;
+               default:
+                       break;
+               }
+       }
+       ret = rock_continue(&rs);
+       if (ret == 0)
+               goto repeat;
+       if (ret == 1)
+               ret = 0;
+out:
+       kfree(rs.buffer);
+       return ret;
+eio:
+       ret = -EIO;
+       goto out;
 }
 
 static char *get_symlink_chunk(char *rpnt, struct rock_ridge *rr, char *plimit)
@@ -376,32 +566,32 @@ static char *get_symlink_chunk(char *rpnt, struct rock_ridge *rr, char *plimit)
                        if (slp->len > plimit - rpnt)
                                return NULL;
                        memcpy(rpnt, slp->text, slp->len);
-                       rpnt+=slp->len;
+                       rpnt += slp->len;
                        break;
                case 2:
                        if (rpnt >= plimit)
                                return NULL;
-                       *rpnt++='.';
+                       *rpnt++ = '.';
                        break;
                case 4:
                        if (2 > plimit - rpnt)
                                return NULL;
-                       *rpnt++='.';
-                       *rpnt++='.';
+                       *rpnt++ = '.';
+                       *rpnt++ = '.';
                        break;
                case 8:
                        if (rpnt >= plimit)
                                return NULL;
                        rootflag = 1;
-                       *rpnt++='/';
+                       *rpnt++ = '/';
                        break;
                default:
                        printk("Symlink component flag not implemented (%d)\n",
-                            slp->flags);
+                              slp->flags);
                }
                slen -= slp->len + 2;
                oldslp = slp;
-               slp = (struct SL_component *) ((char *) slp + slp->len + 2);
+               slp = (struct SL_component *)((char *)slp + slp->len + 2);
 
                if (slen < 2) {
                        /*
@@ -412,7 +602,7 @@ static char *get_symlink_chunk(char *rpnt, struct rock_ridge *rr, char *plimit)
                            !(oldslp->flags & 1)) {
                                if (rpnt >= plimit)
                                        return NULL;
-                               *rpnt++='/';
+                               *rpnt++ = '/';
                        }
                        break;
                }
@@ -423,59 +613,61 @@ static char *get_symlink_chunk(char *rpnt, struct rock_ridge *rr, char *plimit)
                if (!rootflag && !(oldslp->flags & 1)) {
                        if (rpnt >= plimit)
                                return NULL;
-                       *rpnt++='/';
+                       *rpnt++ = '/';
                }
        }
        return rpnt;
 }
 
-int parse_rock_ridge_inode(struct iso_directory_record * de,
-                          struct inode * inode)
+int parse_rock_ridge_inode(struct iso_directory_record *de, struct inode *inode)
 {
-   int result=parse_rock_ridge_inode_internal(de,inode,0);
-   /* if rockridge flag was reset and we didn't look for attributes
-    * behind eventual XA attributes, have a look there */
-   if ((ISOFS_SB(inode->i_sb)->s_rock_offset==-1)
-       &&(ISOFS_SB(inode->i_sb)->s_rock==2))
-     {
-       result=parse_rock_ridge_inode_internal(de,inode,14);
-     }
-   return result;
-}
+       int result = parse_rock_ridge_inode_internal(de, inode, 0);
 
-/* readpage() for symlinks: reads symlink contents into the page and either
-   makes it uptodate and returns 0 or returns error (-EIO) */
+       /*
+        * if rockridge flag was reset and we didn't look for attributes
+        * behind eventual XA attributes, have a look there
+        */
+       if ((ISOFS_SB(inode->i_sb)->s_rock_offset == -1)
+           && (ISOFS_SB(inode->i_sb)->s_rock == 2)) {
+               result = parse_rock_ridge_inode_internal(de, inode, 14);
+       }
+       return result;
+}
 
+/*
+ * readpage() for symlinks: reads symlink contents into the page and either
+ * makes it uptodate and returns 0 or returns error (-EIO)
+ */
 static int rock_ridge_symlink_readpage(struct file *file, struct page *page)
 {
        struct inode *inode = page->mapping->host;
-        struct iso_inode_info *ei = ISOFS_I(inode);
+       struct iso_inode_info *ei = ISOFS_I(inode);
        char *link = kmap(page);
        unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
        struct buffer_head *bh;
        char *rpnt = link;
        unsigned char *pnt;
-       struct iso_directory_record *raw_inode;
-       CONTINUE_DECLS;
+       struct iso_directory_record *raw_de;
        unsigned long block, offset;
        int sig;
-       int len;
-       unsigned char *chr;
        struct rock_ridge *rr;
+       struct rock_state rs;
+       int ret;
 
        if (!ISOFS_SB(inode->i_sb)->s_rock)
                goto error;
 
+       init_rock_state(&rs, inode);
        block = ei->i_iget5_block;
        lock_kernel();
        bh = sb_bread(inode->i_sb, block);
        if (!bh)
                goto out_noread;
 
-        offset = ei->i_iget5_offset;
-       pnt = (unsigned char *) bh->b_data + offset;
+       offset = ei->i_iget5_offset;
+       pnt = (unsigned char *)bh->b_data + offset;
 
-       raw_inode = (struct iso_directory_record *) pnt;
+       raw_de = (struct iso_directory_record *)pnt;
 
        /*
         * If we go past the end of the buffer, there is some sort of error.
@@ -483,20 +675,24 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page)
        if (offset + *pnt > bufsize)
                goto out_bad_span;
 
-       /* Now test for possible Rock Ridge extensions which will override
-          some of these numbers in the inode structure. */
+       /*
+        * Now test for possible Rock Ridge extensions which will override
+        * some of these numbers in the inode structure.
+        */
 
-       SETUP_ROCK_RIDGE(raw_inode, chr, len);
+       setup_rock_ridge(raw_de, inode, &rs);
 
-      repeat:
-       while (len > 2) { /* There may be one byte for padding somewhere */
-               rr = (struct rock_ridge *) chr;
+repeat:
+       while (rs.len > 2) { /* There may be one byte for padding somewhere */
+               rr = (struct rock_ridge *)rs.chr;
                if (rr->len < 3)
                        goto out;       /* Something got screwed up here */
-               sig = isonum_721(chr);
-               chr += rr->len;
-               len -= rr->len;
-               if (len < 0)
+               sig = isonum_721(rs.chr);
+               if (rock_check_overflow(&rs, sig))
+                       goto out;
+               rs.chr += rr->len;
+               rs.len -= rr->len;
+               if (rs.len < 0)
                        goto out;       /* corrupted isofs */
 
                switch (sig) {
@@ -505,7 +701,8 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page)
                                goto out;
                        break;
                case SIG('S', 'P'):
-                       CHECK_SP(goto out);
+                       if (check_sp(rr, inode))
+                               goto out;
                        break;
                case SIG('S', 'L'):
                        rpnt = get_symlink_chunk(rpnt, rr,
@@ -515,14 +712,18 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page)
                        break;
                case SIG('C', 'E'):
                        /* This tells is if there is a continuation record */
-                       CHECK_CE;
+                       rs.cont_extent = isonum_733(rr->u.CE.extent);
+                       rs.cont_offset = isonum_733(rr->u.CE.offset);
+                       rs.cont_size = isonum_733(rr->u.CE.size);
                default:
                        break;
                }
        }
-       MAYBE_CONTINUE(repeat, inode);
-       if (buffer)
-               kfree(buffer);
+       ret = rock_continue(&rs);
+       if (ret == 0)
+               goto repeat;
+       if (ret < 0)
+               goto fail;
 
        if (rpnt == link)
                goto fail;
@@ -535,19 +736,18 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page)
        return 0;
 
        /* error exit from macro */
-      out:
-       if (buffer)
-               kfree(buffer);
+out:
+       kfree(rs.buffer);
        goto fail;
-      out_noread:
+out_noread:
        printk("unable to read i-node block");
        goto fail;
-      out_bad_span:
+out_bad_span:
        printk("symlink spans iso9660 blocks\n");
-      fail:
+fail:
        brelse(bh);
        unlock_kernel();
-      error:
+error:
        SetPageError(page);
        kunmap(page);
        unlock_page(page);
@@ -555,5 +755,5 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page)
 }
 
 struct address_space_operations isofs_symlink_aops = {
-       .readpage       = rock_ridge_symlink_readpage
+       .readpage = rock_ridge_symlink_readpage
 };
index deaf5c8e8b4a5693665630bd7b17a2af79766417..ed09e2b086372f0954200e487814e8e12e315542 100644 (file)
@@ -1,85 +1,88 @@
-/* These structs are used by the system-use-sharing protocol, in which the
-   Rock Ridge extensions are embedded.  It is quite possible that other
-   extensions are present on the disk, and this is fine as long as they
-   all use SUSP */
-
-struct SU_SP{
-  unsigned char magic[2];
-  unsigned char skip;
-} __attribute__((packed));
-
-struct SU_CE{
-  char extent[8];
-  char offset[8];
-  char size[8];
+/*
+ * These structs are used by the system-use-sharing protocol, in which the
+ * Rock Ridge extensions are embedded.  It is quite possible that other
+ * extensions are present on the disk, and this is fine as long as they
+ * all use SUSP
+ */
+
+struct SU_SP_s {
+       unsigned char magic[2];
+       unsigned char skip;
+} __attribute__ ((packed));
+
+struct SU_CE_s {
+       char extent[8];
+       char offset[8];
+       char size[8];
 };
 
-struct SU_ER{
-  unsigned char len_id;
-  unsigned char len_des;
-  unsigned char len_src;
-  unsigned char ext_ver;
-  char data[0];
-} __attribute__((packed));
-
-struct RR_RR{
-  char flags[1];
-} __attribute__((packed));
-
-struct RR_PX{
-  char mode[8];
-  char n_links[8];
-  char uid[8];
-  char gid[8];
+struct SU_ER_s {
+       unsigned char len_id;
+       unsigned char len_des;
+       unsigned char len_src;
+       unsigned char ext_ver;
+       char data[0];
+} __attribute__ ((packed));
+
+struct RR_RR_s {
+       char flags[1];
+} __attribute__ ((packed));
+
+struct RR_PX_s {
+       char mode[8];
+       char n_links[8];
+       char uid[8];
+       char gid[8];
 };
 
-struct RR_PN{
-  char dev_high[8];
-  char dev_low[8];
+struct RR_PN_s {
+       char dev_high[8];
+       char dev_low[8];
 };
 
+struct SL_component {
+       unsigned char flags;
+       unsigned char len;
+       char text[0];
+} __attribute__ ((packed));
 
-struct SL_component{
-  unsigned char flags;
-  unsigned char len;
-  char text[0];
-} __attribute__((packed));
+struct RR_SL_s {
+       unsigned char flags;
+       struct SL_component link;
+} __attribute__ ((packed));
 
-struct RR_SL{
-  unsigned char flags;
-  struct SL_component link;
-} __attribute__((packed));
+struct RR_NM_s {
+       unsigned char flags;
+       char name[0];
+} __attribute__ ((packed));
 
-struct RR_NM{
-  unsigned char flags;
-  char name[0];
-} __attribute__((packed));
-
-struct RR_CL{
-  char location[8];
+struct RR_CL_s {
+       char location[8];
 };
 
-struct RR_PL{
-  char location[8];
+struct RR_PL_s {
+       char location[8];
 };
 
-struct stamp{
-  char time[7];
-} __attribute__((packed));
+struct stamp {
+       char time[7];
+} __attribute__ ((packed));
 
-struct RR_TF{
-  char flags;
-  struct stamp times[0];  /* Variable number of these beasts */
-} __attribute__((packed));
+struct RR_TF_s {
+       char flags;
+       struct stamp times[0];  /* Variable number of these beasts */
+} __attribute__ ((packed));
 
 /* Linux-specific extension for transparent decompression */
-struct RR_ZF{
-  char algorithm[2];
-  char parms[2];
-  char real_size[8];
+struct RR_ZF_s {
+       char algorithm[2];
+       char parms[2];
+       char real_size[8];
 };
 
-/* These are the bits and their meanings for flags in the TF structure. */
+/*
+ * These are the bits and their meanings for flags in the TF structure.
+ */
 #define TF_CREATE 1
 #define TF_MODIFY 2
 #define TF_ACCESS 4
@@ -89,31 +92,31 @@ struct RR_ZF{
 #define TF_EFFECTIVE 64
 #define TF_LONG_FORM 128
 
-struct rock_ridge{
-  char signature[2];
-  unsigned char len;
-  unsigned char version;
-  union{
-    struct SU_SP SP;
-    struct SU_CE CE;
-    struct SU_ER ER;
-    struct RR_RR RR;
-    struct RR_PX PX;
-    struct RR_PN PN;
-    struct RR_SL SL;
-    struct RR_NM NM;
-    struct RR_CL CL;
-    struct RR_PL PL;
-    struct RR_TF TF;
-    struct RR_ZF ZF;
-  } u;
+struct rock_ridge {
+       char signature[2];
+       unsigned char len;
+       unsigned char version;
+       union {
+               struct SU_SP_s SP;
+               struct SU_CE_s CE;
+               struct SU_ER_s ER;
+               struct RR_RR_s RR;
+               struct RR_PX_s PX;
+               struct RR_PN_s PN;
+               struct RR_SL_s SL;
+               struct RR_NM_s NM;
+               struct RR_CL_s CL;
+               struct RR_PL_s PL;
+               struct RR_TF_s TF;
+               struct RR_ZF_s ZF;
+       } u;
 };
 
-#define RR_PX 1   /* POSIX attributes */
-#define RR_PN 2   /* POSIX devices */
-#define RR_SL 4   /* Symbolic link */
-#define RR_NM 8   /* Alternate Name */
-#define RR_CL 16  /* Child link */
-#define RR_PL 32  /* Parent link */
-#define RR_RE 64  /* Relocation directory */
-#define RR_TF 128 /* Timestamps */
+#define RR_PX 1                        /* POSIX attributes */
+#define RR_PN 2                        /* POSIX devices */
+#define RR_SL 4                        /* Symbolic link */
+#define RR_NM 8                        /* Alternate Name */
+#define RR_CL 16               /* Child link */
+#define RR_PL 32               /* Parent link */
+#define RR_RE 64               /* Relocation directory */
+#define RR_TF 128              /* Timestamps */
index 98d830401c56c7e50463e85acfe994f76171bb99..5a97e346bd95a247c12f0edcc5b33d1b065d6419 100644 (file)
@@ -188,7 +188,6 @@ static int __cleanup_transaction(journal_t *journal, transaction_t *transaction)
                } else {
                        jbd_unlock_bh_state(bh);
                }
-               jh = next_jh;
        } while (jh != last_jh);
 
        return ret;
@@ -339,8 +338,10 @@ int log_do_checkpoint(journal_t *journal)
                        }
                } while (jh != last_jh && !retry);
 
-               if (batch_count)
+               if (batch_count) {
                        __flush_batch(journal, bhs, &batch_count);
+                       retry = 1;
+               }
 
                /*
                 * If someone cleaned up this transaction while we slept, we're
index 8d2a9ab981d4394f2fc5d4cb13ad64d7e20978be..30a2bf9eeda515e3e6c50692071aa8f45b66468a 100644 (file)
@@ -70,8 +70,7 @@ static struct posix_acl *jfs_get_acl(struct inode *inode, int type)
                if (!IS_ERR(acl))
                        *p_acl = posix_acl_dup(acl);
        }
-       if (value)
-               kfree(value);
+       kfree(value);
        return acl;
 }
 
@@ -112,8 +111,7 @@ static int jfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)
        }
        rc = __jfs_setxattr(inode, ea_name, value, size, 0);
 out:
-       if (value)
-               kfree(value);
+       kfree(value);
 
        if (!rc) {
                if (*p_acl && (*p_acl != JFS_ACL_NOT_CACHED))
index a87b06fa8ff899ac5561269b6a1a801e4082e8c5..c2c19c9ed9a40b45d5ff591e2218251a309a4f97 100644 (file)
@@ -1,6 +1,6 @@
 /*
- *   Copyright (c) International Business Machines Corp., 2000-2002
- *   Portions Copyright (c) Christoph Hellwig, 2001-2002
+ *   Copyright (C) International Business Machines Corp., 2000-2002
+ *   Portions Copyright (C) Christoph Hellwig, 2001-2002
  *
  *   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
 
 #include <linux/fs.h>
 #include "jfs_incore.h"
+#include "jfs_inode.h"
 #include "jfs_dmap.h"
 #include "jfs_txnmgr.h"
 #include "jfs_xattr.h"
 #include "jfs_acl.h"
 #include "jfs_debug.h"
 
-
-extern int jfs_commit_inode(struct inode *, int);
-extern void jfs_truncate(struct inode *);
-
 int jfs_fsync(struct file *file, struct dentry *dentry, int datasync)
 {
        struct inode *inode = dentry->d_inode;
index 24a689179af27e2e8e619022ca6905546aa43bbb..2137138c59b0a4c08839121f0b89c5a55699a9b0 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/pagemap.h>
 #include <linux/quotaops.h>
 #include "jfs_incore.h"
+#include "jfs_inode.h"
 #include "jfs_filsys.h"
 #include "jfs_imap.h"
 #include "jfs_extent.h"
 #include "jfs_debug.h"
 
 
-extern struct inode_operations jfs_dir_inode_operations;
-extern struct inode_operations jfs_file_inode_operations;
-extern struct inode_operations jfs_symlink_inode_operations;
-extern struct file_operations jfs_dir_operations;
-extern struct file_operations jfs_file_operations;
-struct address_space_operations jfs_aops;
-extern int freeZeroLink(struct inode *);
-
 void jfs_read_inode(struct inode *inode)
 {
        if (diRead(inode)) { 
@@ -136,7 +129,7 @@ void jfs_delete_inode(struct inode *inode)
        jfs_info("In jfs_delete_inode, inode = 0x%p", inode);
 
        if (test_cflag(COMMIT_Freewmap, inode))
-               freeZeroLink(inode);
+               jfs_free_zero_link(inode);
 
        diFree(inode);
 
index 91a0a889ebc59fffaceb46344ce5fec77651974c..4caea6b43b92a9171b508a6e243ef7cf497253e7 100644 (file)
@@ -58,8 +58,6 @@ void dump_mem(char *label, void *data, int length)
 
 static struct proc_dir_entry *base;
 #ifdef CONFIG_JFS_DEBUG
-extern read_proc_t jfs_txanchor_read;
-
 static int loglevel_read(char *page, char **start, off_t off,
                         int count, int *eof, void *data)
 {
@@ -97,14 +95,6 @@ static int loglevel_write(struct file *file, const char __user *buffer,
 }
 #endif
 
-
-#ifdef CONFIG_JFS_STATISTICS
-extern read_proc_t jfs_lmstats_read;
-extern read_proc_t jfs_txstats_read;
-extern read_proc_t jfs_xtstat_read;
-extern read_proc_t jfs_mpstat_read;
-#endif
-
 static struct {
        const char      *name;
        read_proc_t     *read_fn;
index a38079ae1e005f0d2c796b91e82f24a01e05fc0b..ddffbbd4d95585940c4101655120b2d0072897a0 100644 (file)
@@ -1,6 +1,6 @@
 /*
- *   Copyright (c) International Business Machines Corp., 2000-2002
- *   Portions Copyright (c) Christoph Hellwig, 2001-2002
+ *   Copyright (C) International Business Machines Corp., 2000-2002
+ *   Portions Copyright (C) Christoph Hellwig, 2001-2002
  *
  *   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
@@ -31,7 +31,9 @@
  * CONFIG_JFS_DEBUG or CONFIG_JFS_STATISTICS is defined
  */
 #if defined(CONFIG_PROC_FS) && (defined(CONFIG_JFS_DEBUG) || defined(CONFIG_JFS_STATISTICS))
-       #define PROC_FS_JFS
+#define PROC_FS_JFS
+extern void jfs_proc_init(void);
+extern void jfs_proc_clean(void);
 #endif
 
 /*
@@ -65,8 +67,8 @@
 
 extern int jfsloglevel;
 
-/* dump memory contents */
 extern void dump_mem(char *label, void *data, int length);
+extern int jfs_txanchor_read(char *, char **, off_t, int, int *, void *);
 
 /* information message: e.g., configuration, major event */
 #define jfs_info(fmt, arg...) do {                     \
@@ -110,6 +112,11 @@ extern void dump_mem(char *label, void *data, int length);
  *     ----------
  */
 #ifdef CONFIG_JFS_STATISTICS
+extern int jfs_lmstats_read(char *, char **, off_t, int, int *, void *);
+extern int jfs_txstats_read(char *, char **, off_t, int, int *, void *);
+extern int jfs_mpstat_read(char *, char **, off_t, int, int *, void *);
+extern int jfs_xtstat_read(char *, char **, off_t, int, int *, void *);
+
 #define        INCREMENT(x)            ((x)++)
 #define        DECREMENT(x)            ((x)--)
 #define        HIGHWATERMARK(x,y)      ((x) = max((x), (y)))
index 69007fd546efc01ffa08a5855cbc818f0a8ac202..cced2fed9d0f9e9096fc102c8811f9795239d28e 100644 (file)
@@ -272,7 +272,6 @@ int dbMount(struct inode *ipbmap)
 int dbUnmount(struct inode *ipbmap, int mounterror)
 {
        struct bmap *bmp = JFS_SBI(ipbmap->i_sb)->bmap;
-       int i;
 
        if (!(mounterror || isReadOnly(ipbmap)))
                dbSync(ipbmap);
@@ -282,14 +281,6 @@ int dbUnmount(struct inode *ipbmap, int mounterror)
         */
        truncate_inode_pages(ipbmap->i_mapping, 0);
 
-       /*
-        * Sanity Check
-        */
-       for (i = 0; i < bmp->db_numag; i++)
-               if (atomic_read(&bmp->db_active[i]))
-                       printk(KERN_ERR "dbUnmount: db_active[%d] = %d\n",
-                              i, atomic_read(&bmp->db_active[i]));
-
        /* free the memory for the in-memory bmap. */
        kfree(bmp);
 
index ac41f72d6d502fd22bcba1181a84b1c90a9d4584..8676aee3ae4896c36c71485f1fb800a83e589fee 100644 (file)
@@ -2931,6 +2931,9 @@ static void add_missing_indices(struct inode *inode, s64 bn)
        ASSERT(p->header.flag & BT_LEAF);
 
        tlck = txLock(tid, inode, mp, tlckDTREE | tlckENTRY);
+       if (BT_IS_ROOT(mp))
+               tlck->type |= tlckBTROOT;
+
        dtlck = (struct dt_lock *) &tlck->lock;
 
        stbl = DT_GETSTBL(p);
index 1953acb792663da3886de6a9e606312882f77c21..4879603daa1c76756d1ded3cd6ccec62683f3ed7 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/fs.h>
 #include <linux/quotaops.h>
 #include "jfs_incore.h"
+#include "jfs_inode.h"
 #include "jfs_superblock.h"
 #include "jfs_dmap.h"
 #include "jfs_extent.h"
@@ -33,12 +34,6 @@ static int extBrealloc(struct inode *, s64, s64, s64 *, s64 *);
 #endif
 static s64 extRoundDown(s64 nb);
 
-/*
- * external references
- */
-extern int jfs_commit_inode(struct inode *, int);
-
-
 #define DPD(a)          (printk("(a): %d\n",(a)))
 #define DPC(a)          (printk("(a): %c\n",(a)))
 #define DPL1(a)                                        \
index 7acff2ce3c80f44fee086bef667ae86c12eac463..971af2977eff8460ac76b91615be17c5a653a5be 100644 (file)
@@ -47,6 +47,7 @@
 #include <linux/quotaops.h>
 
 #include "jfs_incore.h"
+#include "jfs_inode.h"
 #include "jfs_filsys.h"
 #include "jfs_dinode.h"
 #include "jfs_dmap.h"
 #define AG_LOCK(imap,agno)             down(&imap->im_aglock[agno])
 #define AG_UNLOCK(imap,agno)           up(&imap->im_aglock[agno])
 
-/*
- * external references
- */
-extern struct address_space_operations jfs_aops;
-
 /*
  * forward references
  */
index 84f2459b2191d63d0ae5fbb182b392773de58152..2af5efbfd06fa7dd97905c2df0aeeddca1076218 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/fs.h>
 #include <linux/quotaops.h>
 #include "jfs_incore.h"
+#include "jfs_inode.h"
 #include "jfs_filsys.h"
 #include "jfs_imap.h"
 #include "jfs_dinode.h"
index 3df91fbfe7812ec6ed1943c39c46714d1533ddff..b54bac576cb3b9811d17e6c3d4053e69a14c4e9d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *   Copyright (c) International Business Machines Corp., 2000-2001
+ *   Copyright (C) International Business Machines Corp., 2000-2001
  *
  *   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
 #define _H_JFS_INODE
 
 extern struct inode *ialloc(struct inode *, umode_t);
+extern int jfs_fsync(struct file *, struct dentry *, int);
+extern void jfs_read_inode(struct inode *);
+extern int jfs_commit_inode(struct inode *, int);
+extern int jfs_write_inode(struct inode*, int);
+extern void jfs_delete_inode(struct inode *);
+extern void jfs_dirty_inode(struct inode *);
+extern void jfs_truncate(struct inode *);
+extern void jfs_truncate_nolock(struct inode *, loff_t);
+extern void jfs_free_zero_link(struct inode *);
+extern struct dentry *jfs_get_parent(struct dentry *dentry);
 
+extern struct address_space_operations jfs_aops;
+extern struct inode_operations jfs_dir_inode_operations;
+extern struct file_operations jfs_dir_operations;
+extern struct inode_operations jfs_file_inode_operations;
+extern struct file_operations jfs_file_operations;
+extern struct inode_operations jfs_symlink_inode_operations;
+extern struct dentry_operations jfs_ci_dentry_operations;
 #endif                         /* _H_JFS_INODE */
index dfa1200daa61c22f6b96bdff1130d88090a25006..7c8387ed4192be68cd090956e430cf12eb5ac936 100644 (file)
@@ -71,6 +71,7 @@
 #include "jfs_incore.h"
 #include "jfs_filsys.h"
 #include "jfs_metapage.h"
+#include "jfs_superblock.h"
 #include "jfs_txnmgr.h"
 #include "jfs_debug.h"
 
@@ -166,14 +167,6 @@ static LIST_HEAD(jfs_external_logs);
 static struct jfs_log *dummy_log = NULL;
 static DECLARE_MUTEX(jfs_log_sem);
 
-/*
- * external references
- */
-extern void txLazyUnlock(struct tblock * tblk);
-extern int jfs_stop_threads;
-extern struct completion jfsIOwait;
-extern int jfs_tlocks_low;
-
 /*
  * forward references
  */
@@ -1624,6 +1617,8 @@ void jfs_flush_journal(struct jfs_log *log, int wait)
                }
        }
        assert(list_empty(&log->cqueue));
+
+#ifdef CONFIG_JFS_DEBUG
        if (!list_empty(&log->synclist)) {
                struct logsyncblk *lp;
 
@@ -1638,9 +1633,8 @@ void jfs_flush_journal(struct jfs_log *log, int wait)
                                dump_mem("orphan tblock", lp,
                                         sizeof(struct tblock));
                }
-//             current->state = TASK_INTERRUPTIBLE;
-//             schedule();
        }
+#endif
        //assert(list_empty(&log->synclist));
        clear_bit(log_FLUSH, &log->flag);
 }
index 51291fbc420c6c1b73cecd20edeeb526ea0fd4d1..747114cd38b878c3e57f90070fa0207e36207dd5 100644 (file)
@@ -507,6 +507,8 @@ extern int lmLogClose(struct super_block *sb);
 extern int lmLogShutdown(struct jfs_log * log);
 extern int lmLogInit(struct jfs_log * log);
 extern int lmLogFormat(struct jfs_log *log, s64 logAddress, int logSize);
+extern int lmGroupCommit(struct jfs_log *, struct tblock *);
+extern int jfsIOWait(void *);
 extern void jfs_flush_journal(struct jfs_log * log, int wait);
 extern void jfs_syncpt(struct jfs_log *log);
 
index 41bf078dce05992e40db30af7cd5e86fd249bc5d..6c5485d16c3916d6fa764e814345c9e21f4fe0a3 100644 (file)
@@ -198,7 +198,7 @@ static void init_once(void *foo, kmem_cache_t *cachep, unsigned long flags)
        }
 }
 
-static inline struct metapage *alloc_metapage(int gfp_mask)
+static inline struct metapage *alloc_metapage(unsigned int gfp_mask)
 {
        return mempool_alloc(metapage_mempool, gfp_mask);
 }
@@ -726,12 +726,12 @@ void force_metapage(struct metapage *mp)
        page_cache_release(page);
 }
 
-extern void hold_metapage(struct metapage *mp)
+void hold_metapage(struct metapage *mp)
 {
        lock_page(mp->page);
 }
 
-extern void put_metapage(struct metapage *mp)
+void put_metapage(struct metapage *mp)
 {
        if (mp->count || mp->nohomeok) {
                /* Someone else will release this */
index 991e9fb84c75517cc6f73247081740dd97da76ec..f0b7d3282b07397f49d61d65448d1778caf4173b 100644 (file)
@@ -1,6 +1,6 @@
 /*
- *   Copyright (c) International Business Machines Corp., 2000-2002
- *   Portions Copyright (c) Christoph Hellwig, 2001-2002
+ *   Copyright (C) International Business Machines Corp., 2000-2002
+ *   Portions Copyright (C) Christoph Hellwig, 2001-2002
  *
  *   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
@@ -58,6 +58,8 @@ struct metapage {
 #define mark_metapage_dirty(mp) set_bit(META_dirty, &(mp)->flag)
 
 /* function prototypes */
+extern int metapage_init(void);
+extern void metapage_exit(void);
 extern struct metapage *__get_metapage(struct inode *inode,
                                  unsigned long lblock, unsigned int size,
                                  int absolute, unsigned long new);
index ab0566f70cfaa36e116379567d42a38c3a0a78f2..fcf781bf31cbf9e399043953fb6857d2c27b93aa 100644 (file)
@@ -109,5 +109,16 @@ struct jfs_superblock {
 extern int readSuper(struct super_block *, struct buffer_head **);
 extern int updateSuper(struct super_block *, uint);
 extern void jfs_error(struct super_block *, const char *, ...);
+extern int jfs_mount(struct super_block *);
+extern int jfs_mount_rw(struct super_block *, int);
+extern int jfs_umount(struct super_block *);
+extern int jfs_umount_rw(struct super_block *);
+
+extern int jfs_stop_threads;
+extern struct completion jfsIOwait;
+extern wait_queue_head_t jfs_IO_thread_wait;
+extern wait_queue_head_t jfs_commit_thread_wait;
+extern wait_queue_head_t jfs_sync_thread_wait;
+extern int jfs_extendfs(struct super_block *, s64, int);
 
 #endif /*_H_JFS_SUPERBLOCK */
index e93d01aa12c46da06501af64375918b2879e7805..8cbaaff1d5fa05628f18b0e8213e0ce66dfe3839 100644 (file)
@@ -42,7 +42,6 @@
  * hold on to mp+lock thru update of maps
  */
 
-
 #include <linux/fs.h>
 #include <linux/vmalloc.h>
 #include <linux/smp_lock.h>
@@ -51,6 +50,7 @@
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include "jfs_incore.h"
+#include "jfs_inode.h"
 #include "jfs_filsys.h"
 #include "jfs_metapage.h"
 #include "jfs_dinode.h"
@@ -109,7 +109,6 @@ static int TxLockHWM;               /* High water mark for number of txLocks used */
 static int TxLockVHWM;         /* Very High water mark */
 struct tlock *TxLock;           /* transaction lock table */
 
-
 /*
  *      transaction management lock
  */
@@ -149,7 +148,6 @@ static inline void TXN_SLEEP_DROP_LOCK(wait_queue_head_t * event)
 
 #define TXN_WAKEUP(event) wake_up_all(event)
 
-
 /*
  *      statistics
  */
@@ -161,16 +159,6 @@ static struct {
        int waitlock;           /* 4: # of tlock wait */
 } stattx;
 
-
-/*
- * external references
- */
-extern int lmGroupCommit(struct jfs_log *, struct tblock *);
-extern int jfs_commit_inode(struct inode *, int);
-extern int jfs_stop_threads;
-
-extern struct completion jfsIOwait;
-
 /*
  * forward references
  */
@@ -358,7 +346,6 @@ void txExit(void)
        TxBlock = NULL;
 }
 
-
 /*
  * NAME:        txBegin()
  *
@@ -460,7 +447,6 @@ tid_t txBegin(struct super_block *sb, int flag)
        return t;
 }
 
-
 /*
  * NAME:        txBeginAnon()
  *
@@ -503,7 +489,6 @@ void txBeginAnon(struct super_block *sb)
        TXN_UNLOCK();
 }
 
-
 /*
  *      txEnd()
  *
@@ -592,7 +577,6 @@ wakeup:
        TXN_WAKEUP(&TxAnchor.freewait);
 }
 
-
 /*
  *      txLock()
  *
@@ -868,7 +852,6 @@ struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp,
        return NULL;
 }
 
-
 /*
  * NAME:        txRelease()
  *
@@ -908,7 +891,6 @@ static void txRelease(struct tblock * tblk)
        TXN_UNLOCK();
 }
 
-
 /*
  * NAME:        txUnlock()
  *
@@ -996,7 +978,6 @@ static void txUnlock(struct tblock * tblk)
        }
 }
 
-
 /*
  *      txMaplock()
  *
@@ -1069,7 +1050,6 @@ struct tlock *txMaplock(tid_t tid, struct inode *ip, int type)
        return tlck;
 }
 
-
 /*
  *      txLinelock()
  *
@@ -1103,8 +1083,6 @@ struct linelock *txLinelock(struct linelock * tlock)
        return linelock;
 }
 
-
-
 /*
  *              transaction commit management
  *              -----------------------------
@@ -1373,7 +1351,6 @@ int txCommit(tid_t tid,           /* transaction identifier */
        return rc;
 }
 
-
 /*
  * NAME:        txLog()
  *
@@ -1437,7 +1414,6 @@ static int txLog(struct jfs_log * log, struct tblock * tblk, struct commit * cd)
        return rc;
 }
 
-
 /*
  *      diLog()
  *
@@ -1465,7 +1441,6 @@ static int diLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
        if (tlck->type & tlckENTRY) {
                /* log after-image for logredo(): */
                lrd->type = cpu_to_le16(LOG_REDOPAGE);
-//              *pxd = mp->cm_pxd;
                PXDaddress(pxd, mp->index);
                PXDlength(pxd,
                          mp->logical_size >> tblk->sb->s_blocksize_bits);
@@ -1552,7 +1527,6 @@ static int diLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
        return rc;
 }
 
-
 /*
  *      dataLog()
  *
@@ -1599,7 +1573,6 @@ static int dataLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
        return 0;
 }
 
-
 /*
  *      dtLog()
  *
@@ -1639,7 +1612,6 @@ static void dtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
                        lrd->log.redopage.type |= cpu_to_le16(LOG_EXTEND);
                else
                        lrd->log.redopage.type |= cpu_to_le16(LOG_NEW);
-//              *pxd = mp->cm_pxd;
                PXDaddress(pxd, mp->index);
                PXDlength(pxd,
                          mp->logical_size >> tblk->sb->s_blocksize_bits);
@@ -1704,7 +1676,6 @@ static void dtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
        return;
 }
 
-
 /*
  *      xtLog()
  *
@@ -1760,7 +1731,6 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
                 * applying the after-image to the meta-data page.
                 */
                lrd->type = cpu_to_le16(LOG_REDOPAGE);
-//              *page_pxd = mp->cm_pxd;
                PXDaddress(page_pxd, mp->index);
                PXDlength(page_pxd,
                          mp->logical_size >> tblk->sb->s_blocksize_bits);
@@ -2093,7 +2063,6 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
        return;
 }
 
-
 /*
  *      mapLog()
  *
@@ -2180,7 +2149,6 @@ void mapLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
        }
 }
 
-
 /*
  *      txEA()
  *
@@ -2233,7 +2201,6 @@ void txEA(tid_t tid, struct inode *ip, dxd_t * oldea, dxd_t * newea)
        }
 }
 
-
 /*
  *      txForce()
  *
@@ -2300,7 +2267,6 @@ void txForce(struct tblock * tblk)
        }
 }
 
-
 /*
  *      txUpdateMap()
  *
@@ -2437,7 +2403,6 @@ static void txUpdateMap(struct tblock * tblk)
        }
 }
 
-
 /*
  *      txAllocPMap()
  *
@@ -2509,7 +2474,6 @@ static void txAllocPMap(struct inode *ip, struct maplock * maplock,
        }
 }
 
-
 /*
  *      txFreeMap()
  *
@@ -2611,7 +2575,6 @@ void txFreeMap(struct inode *ip,
        }
 }
 
-
 /*
  *      txFreelock()
  *
@@ -2652,7 +2615,6 @@ void txFreelock(struct inode *ip)
        TXN_UNLOCK();
 }
 
-
 /*
  *      txAbort()
  *
index b71b82c2df04e26be97562bd987ffe5aa9dcc819..59ad0f6b723186a6f4a1cb6d0eda5e038bebf936 100644 (file)
@@ -285,34 +285,26 @@ struct commit {
 /*
  * external declarations
  */
-extern struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage *mp,
-                           int flag);
-
-extern struct tlock *txMaplock(tid_t tid, struct inode *ip, int flag);
-
-extern int txCommit(tid_t tid, int nip, struct inode **iplist, int flag);
-
-extern tid_t txBegin(struct super_block *sb, int flag);
-
-extern void txBeginAnon(struct super_block *sb);
-
-extern void txEnd(tid_t tid);
-
-extern void txAbort(tid_t tid, int dirty);
-
-extern struct linelock *txLinelock(struct linelock * tlock);
-
-extern void txFreeMap(struct inode *ip, struct maplock * maplock,
-                     struct tblock * tblk, int maptype);
-
-extern void txEA(tid_t tid, struct inode *ip, dxd_t * oldea, dxd_t * newea);
-
-extern void txFreelock(struct inode *ip);
-
-extern int lmLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
-                struct tlock * tlck);
-
-extern void txQuiesce(struct super_block *sb);
-
-extern void txResume(struct super_block *sb);
+extern int jfs_tlocks_low;
+
+extern int txInit(void);
+extern void txExit(void);
+extern struct tlock *txLock(tid_t, struct inode *, struct metapage *, int);
+extern struct tlock *txMaplock(tid_t, struct inode *, int);
+extern int txCommit(tid_t, int, struct inode **, int);
+extern tid_t txBegin(struct super_block *, int);
+extern void txBeginAnon(struct super_block *);
+extern void txEnd(tid_t);
+extern void txAbort(tid_t, int);
+extern struct linelock *txLinelock(struct linelock *);
+extern void txFreeMap(struct inode *, struct maplock *, struct tblock *, int);
+extern void txEA(tid_t, struct inode *, dxd_t *, dxd_t *);
+extern void txFreelock(struct inode *);
+extern int lmLog(struct jfs_log *, struct tblock *, struct lrd *,
+                struct tlock *);
+extern void txQuiesce(struct super_block *);
+extern void txResume(struct super_block *);
+extern void txLazyUnlock(struct tblock *);
+extern int jfs_lazycommit(void *);
+extern int jfs_sync(void *);
 #endif                         /* _H_JFS_TXNMGR */
index 8413a368f4493ae7085f635d34834b928ef189f8..1cae14e741eb53b768d9ec2ca80d7f1b904cbad1 100644 (file)
 #include "jfs_acl.h"
 #include "jfs_debug.h"
 
-extern struct inode_operations jfs_file_inode_operations;
-extern struct inode_operations jfs_symlink_inode_operations;
-extern struct file_operations jfs_file_operations;
-extern struct address_space_operations jfs_aops;
-
-extern int jfs_fsync(struct file *, struct dentry *, int);
-extern void jfs_truncate_nolock(struct inode *, loff_t);
-extern int jfs_init_acl(struct inode *, struct inode *);
-
 /*
  * forward references
  */
-struct inode_operations jfs_dir_inode_operations;
-struct file_operations jfs_dir_operations;
 struct dentry_operations jfs_ci_dentry_operations;
 
 static s64 commitZeroLink(tid_t, struct inode *);
@@ -655,7 +644,7 @@ static s64 commitZeroLink(tid_t tid, struct inode *ip)
 
 
 /*
- * NAME:       freeZeroLink()
+ * NAME:       jfs_free_zero_link()
  *
  * FUNCTION:    for non-directory, called by iClose(),
  *             free resources of a file from cache and WORKING map 
@@ -663,15 +652,12 @@ static s64 commitZeroLink(tid_t tid, struct inode *ip)
  *             while associated with a pager object,
  *
  * PARAMETER:  ip      - pointer to inode of file.
- *
- * RETURN:     0 -ok
  */
-int freeZeroLink(struct inode *ip)
+void jfs_free_zero_link(struct inode *ip)
 {
-       int rc = 0;
        int type;
 
-       jfs_info("freeZeroLink: ip = 0x%p", ip);
+       jfs_info("jfs_free_zero_link: ip = 0x%p", ip);
 
        /* return if not reg or symbolic link or if size is
         * already ok.
@@ -684,10 +670,10 @@ int freeZeroLink(struct inode *ip)
        case S_IFLNK:
                /* if its contained in inode nothing to do */
                if (ip->i_size < IDATASIZE)
-                       return 0;
+                       return;
                break;
        default:
-               return 0;
+               return;
        }
 
        /*
@@ -737,9 +723,7 @@ int freeZeroLink(struct inode *ip)
         * free xtree/data blocks from working block map;
         */
        if (ip->i_size)
-               rc = xtTruncate(0, ip, 0, COMMIT_WMAP);
-
-       return rc;
+               xtTruncate(0, ip, 0, COMMIT_WMAP);
 }
 
 /*
index 5e774ed7fb647d7b5ded82f414f5b0056e8a1dcf..810a3653d8b3a4f26ffb66d4c4a883733445c5eb 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "jfs_incore.h"
 #include "jfs_filsys.h"
+#include "jfs_inode.h"
 #include "jfs_metapage.h"
 #include "jfs_superblock.h"
 #include "jfs_dmap.h"
@@ -62,37 +63,6 @@ module_param(jfsloglevel, int, 0644);
 MODULE_PARM_DESC(jfsloglevel, "Specify JFS loglevel (0, 1 or 2)");
 #endif
 
-/*
- * External declarations
- */
-extern int jfs_mount(struct super_block *);
-extern int jfs_mount_rw(struct super_block *, int);
-extern int jfs_umount(struct super_block *);
-extern int jfs_umount_rw(struct super_block *);
-
-extern int jfsIOWait(void *);
-extern int jfs_lazycommit(void *);
-extern int jfs_sync(void *);
-
-extern void jfs_read_inode(struct inode *inode);
-extern void jfs_dirty_inode(struct inode *inode);
-extern void jfs_delete_inode(struct inode *inode);
-extern int jfs_write_inode(struct inode *inode, int wait);
-
-extern struct dentry *jfs_get_parent(struct dentry *dentry);
-extern int jfs_extendfs(struct super_block *, s64, int);
-
-extern struct dentry_operations jfs_ci_dentry_operations;
-
-#ifdef PROC_FS_JFS             /* see jfs_debug.h */
-extern void jfs_proc_init(void);
-extern void jfs_proc_clean(void);
-#endif
-
-extern wait_queue_head_t jfs_IO_thread_wait;
-extern wait_queue_head_t jfs_commit_thread_wait;
-extern wait_queue_head_t jfs_sync_thread_wait;
-
 static void jfs_handle_error(struct super_block *sb)
 {
        struct jfs_sb_info *sbi = JFS_SBI(sb);
@@ -593,11 +563,6 @@ static struct file_system_type jfs_fs_type = {
        .fs_flags       = FS_REQUIRES_DEV,
 };
 
-extern int metapage_init(void);
-extern int txInit(void);
-extern void txExit(void);
-extern void metapage_exit(void);
-
 static void init_once(void *foo, kmem_cache_t * cachep, unsigned long flags)
 {
        struct jfs_inode_info *jfs_ip = (struct jfs_inode_info *) foo;
index ef4c07ee92b2a4461324ca4754dfa7389ebfa894..287d8d6c3cfd6fd8fd147b1c67ffa4c946ab2e69 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *   Copyright (c) Christoph Hellwig, 2001-2002
+ *   Copyright (C) Christoph Hellwig, 2001-2002
  *
  *   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
@@ -19,6 +19,7 @@
 #include <linux/fs.h>
 #include <linux/namei.h>
 #include "jfs_incore.h"
+#include "jfs_inode.h"
 #include "jfs_xattr.h"
 
 static int jfs_follow_link(struct dentry *dentry, struct nameidata *nd)
index 7a9ffd5d03dc66f025f6224f7de246263d54f695..6016373701a3662e649217aa0b0b23d02a2f993c 100644 (file)
@@ -946,8 +946,7 @@ int __jfs_setxattr(struct inode *inode, const char *name, const void *value,
       out:
        up_write(&JFS_IP(inode)->xattr_sem);
 
-       if (os2name)
-               kfree(os2name);
+       kfree(os2name);
 
        return rc;
 }
@@ -1042,8 +1041,7 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data,
       out:
        up_read(&JFS_IP(inode)->xattr_sem);
 
-       if (os2name)
-               kfree(os2name);
+       kfree(os2name);
 
        return size;
 }
index f90b29595927e206c6fa4cee6e6ae796c509ce28..5025563e7379675b7df2834427aabb0800f4b740 100644 (file)
@@ -519,6 +519,102 @@ int simple_transaction_release(struct inode *inode, struct file *file)
        return 0;
 }
 
+/* Simple attribute files */
+
+struct simple_attr {
+       u64 (*get)(void *);
+       void (*set)(void *, u64);
+       char get_buf[24];       /* enough to store a u64 and "\n\0" */
+       char set_buf[24];
+       void *data;
+       const char *fmt;        /* format for read operation */
+       struct semaphore sem;   /* protects access to these buffers */
+};
+
+/* simple_attr_open is called by an actual attribute open file operation
+ * to set the attribute specific access operations. */
+int simple_attr_open(struct inode *inode, struct file *file,
+                    u64 (*get)(void *), void (*set)(void *, u64),
+                    const char *fmt)
+{
+       struct simple_attr *attr;
+
+       attr = kmalloc(sizeof(*attr), GFP_KERNEL);
+       if (!attr)
+               return -ENOMEM;
+
+       attr->get = get;
+       attr->set = set;
+       attr->data = inode->u.generic_ip;
+       attr->fmt = fmt;
+       init_MUTEX(&attr->sem);
+
+       file->private_data = attr;
+
+       return nonseekable_open(inode, file);
+}
+
+int simple_attr_close(struct inode *inode, struct file *file)
+{
+       kfree(file->private_data);
+       return 0;
+}
+
+/* read from the buffer that is filled with the get function */
+ssize_t simple_attr_read(struct file *file, char __user *buf,
+                        size_t len, loff_t *ppos)
+{
+       struct simple_attr *attr;
+       size_t size;
+       ssize_t ret;
+
+       attr = file->private_data;
+
+       if (!attr->get)
+               return -EACCES;
+
+       down(&attr->sem);
+       if (*ppos) /* continued read */
+               size = strlen(attr->get_buf);
+       else      /* first read */
+               size = scnprintf(attr->get_buf, sizeof(attr->get_buf),
+                                attr->fmt,
+                                (unsigned long long)attr->get(attr->data));
+
+       ret = simple_read_from_buffer(buf, len, ppos, attr->get_buf, size);
+       up(&attr->sem);
+       return ret;
+}
+
+/* interpret the buffer as a number to call the set function with */
+ssize_t simple_attr_write(struct file *file, const char __user *buf,
+                         size_t len, loff_t *ppos)
+{
+       struct simple_attr *attr;
+       u64 val;
+       size_t size;
+       ssize_t ret;
+
+       attr = file->private_data;
+
+       if (!attr->set)
+               return -EACCES;
+
+       down(&attr->sem);
+       ret = -EFAULT;
+       size = min(sizeof(attr->set_buf) - 1, len);
+       if (copy_from_user(attr->set_buf, buf, size))
+               goto out;
+
+       ret = len; /* claim we got the whole input */
+       attr->set_buf[size] = '\0';
+       val = simple_strtol(attr->set_buf, NULL, 0);
+       attr->set(attr->data, val);
+out:
+       up(&attr->sem);
+       return ret;
+}
+
 EXPORT_SYMBOL(dcache_dir_close);
 EXPORT_SYMBOL(dcache_dir_lseek);
 EXPORT_SYMBOL(dcache_dir_open);
@@ -547,3 +643,7 @@ EXPORT_SYMBOL(simple_read_from_buffer);
 EXPORT_SYMBOL(simple_transaction_get);
 EXPORT_SYMBOL(simple_transaction_read);
 EXPORT_SYMBOL(simple_transaction_release);
+EXPORT_SYMBOL_GPL(simple_attr_open);
+EXPORT_SYMBOL_GPL(simple_attr_close);
+EXPORT_SYMBOL_GPL(simple_attr_read);
+EXPORT_SYMBOL_GPL(simple_attr_write);
index b92c0e64aefa313d74456db2d4c718ad08182dc3..bb9aebe93862d8c03a94990d4b28fc4832e93a1f 100644 (file)
@@ -79,8 +79,11 @@ static int mpage_end_io_write(struct bio *bio, unsigned int bytes_done, int err)
                if (--bvec >= bio->bi_io_vec)
                        prefetchw(&bvec->bv_page->flags);
 
-               if (!uptodate)
+               if (!uptodate){
                        SetPageError(page);
+                       if (page->mapping)
+                               set_bit(AS_EIO, &page->mapping->flags);
+               }
                end_page_writeback(page);
        } while (bvec >= bio->bi_io_vec);
        bio_put(bio);
index defe6781e003c208fc0a4b6e92bcf1dc2a0465de..a7f7f44119b3dda8e18a3de1e23990eb4f3ffb05 100644 (file)
@@ -493,12 +493,21 @@ fail:
        return PTR_ERR(link);
 }
 
-static inline int __do_follow_link(struct dentry *dentry, struct nameidata *nd)
+struct path {
+       struct vfsmount *mnt;
+       struct dentry *dentry;
+};
+
+static inline int __do_follow_link(struct path *path, struct nameidata *nd)
 {
        int error;
+       struct dentry *dentry = path->dentry;
 
-       touch_atime(nd->mnt, dentry);
+       touch_atime(path->mnt, dentry);
        nd_set_link(nd, NULL);
+
+       if (path->mnt == nd->mnt)
+               mntget(path->mnt);
        error = dentry->d_inode->i_op->follow_link(dentry, nd);
        if (!error) {
                char *s = nd_get_link(nd);
@@ -507,6 +516,8 @@ static inline int __do_follow_link(struct dentry *dentry, struct nameidata *nd)
                if (dentry->d_inode->i_op->put_link)
                        dentry->d_inode->i_op->put_link(dentry, nd);
        }
+       dput(dentry);
+       mntput(path->mnt);
 
        return error;
 }
@@ -518,7 +529,7 @@ static inline int __do_follow_link(struct dentry *dentry, struct nameidata *nd)
  * Without that kind of total limit, nasty chains of consecutive
  * symlinks can cause almost arbitrarily long lookups. 
  */
-static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd)
+static inline int do_follow_link(struct path *path, struct nameidata *nd)
 {
        int err = -ELOOP;
        if (current->link_count >= MAX_NESTED_LINKS)
@@ -527,17 +538,20 @@ static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd)
                goto loop;
        BUG_ON(nd->depth >= MAX_NESTED_LINKS);
        cond_resched();
-       err = security_inode_follow_link(dentry, nd);
+       err = security_inode_follow_link(path->dentry, nd);
        if (err)
                goto loop;
        current->link_count++;
        current->total_link_count++;
        nd->depth++;
-       err = __do_follow_link(dentry, nd);
+       err = __do_follow_link(path, nd);
        current->link_count--;
        nd->depth--;
        return err;
 loop:
+       dput(path->dentry);
+       if (path->mnt != nd->mnt)
+               mntput(path->mnt);
        path_release(nd);
        return err;
 }
@@ -565,87 +579,91 @@ int follow_up(struct vfsmount **mnt, struct dentry **dentry)
 /* no need for dcache_lock, as serialization is taken care in
  * namespace.c
  */
-static int follow_mount(struct vfsmount **mnt, struct dentry **dentry)
+static int __follow_mount(struct path *path)
 {
        int res = 0;
+       while (d_mountpoint(path->dentry)) {
+               struct vfsmount *mounted = lookup_mnt(path->mnt, path->dentry);
+               if (!mounted)
+                       break;
+               dput(path->dentry);
+               if (res)
+                       mntput(path->mnt);
+               path->mnt = mounted;
+               path->dentry = dget(mounted->mnt_root);
+               res = 1;
+       }
+       return res;
+}
+
+static void follow_mount(struct vfsmount **mnt, struct dentry **dentry)
+{
        while (d_mountpoint(*dentry)) {
                struct vfsmount *mounted = lookup_mnt(*mnt, *dentry);
                if (!mounted)
                        break;
+               dput(*dentry);
                mntput(*mnt);
                *mnt = mounted;
-               dput(*dentry);
                *dentry = dget(mounted->mnt_root);
-               res = 1;
        }
-       return res;
 }
 
 /* no need for dcache_lock, as serialization is taken care in
  * namespace.c
  */
-static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry)
+int follow_down(struct vfsmount **mnt, struct dentry **dentry)
 {
        struct vfsmount *mounted;
 
        mounted = lookup_mnt(*mnt, *dentry);
        if (mounted) {
+               dput(*dentry);
                mntput(*mnt);
                *mnt = mounted;
-               dput(*dentry);
                *dentry = dget(mounted->mnt_root);
                return 1;
        }
        return 0;
 }
 
-int follow_down(struct vfsmount **mnt, struct dentry **dentry)
-{
-       return __follow_down(mnt,dentry);
-}
-static inline void follow_dotdot(struct vfsmount **mnt, struct dentry **dentry)
+static inline void follow_dotdot(struct nameidata *nd)
 {
        while(1) {
                struct vfsmount *parent;
-               struct dentry *old = *dentry;
+               struct dentry *old = nd->dentry;
 
                 read_lock(&current->fs->lock);
-               if (*dentry == current->fs->root &&
-                   *mnt == current->fs->rootmnt) {
+               if (nd->dentry == current->fs->root &&
+                   nd->mnt == current->fs->rootmnt) {
                         read_unlock(&current->fs->lock);
                        break;
                }
                 read_unlock(&current->fs->lock);
                spin_lock(&dcache_lock);
-               if (*dentry != (*mnt)->mnt_root) {
-                       *dentry = dget((*dentry)->d_parent);
+               if (nd->dentry != nd->mnt->mnt_root) {
+                       nd->dentry = dget(nd->dentry->d_parent);
                        spin_unlock(&dcache_lock);
                        dput(old);
                        break;
                }
                spin_unlock(&dcache_lock);
                spin_lock(&vfsmount_lock);
-               parent = (*mnt)->mnt_parent;
-               if (parent == *mnt) {
+               parent = nd->mnt->mnt_parent;
+               if (parent == nd->mnt) {
                        spin_unlock(&vfsmount_lock);
                        break;
                }
                mntget(parent);
-               *dentry = dget((*mnt)->mnt_mountpoint);
+               nd->dentry = dget(nd->mnt->mnt_mountpoint);
                spin_unlock(&vfsmount_lock);
                dput(old);
-               mntput(*mnt);
-               *mnt = parent;
+               mntput(nd->mnt);
+               nd->mnt = parent;
        }
-       follow_mount(mnt, dentry);
+       follow_mount(&nd->mnt, &nd->dentry);
 }
 
-struct path {
-       struct vfsmount *mnt;
-       struct dentry *dentry;
-};
-
 /*
  *  It's more convoluted than I'd like it to be, but... it's still fairly
  *  small and for now I'd prefer to have fast path as straight as possible.
@@ -664,6 +682,7 @@ static int do_lookup(struct nameidata *nd, struct qstr *name,
 done:
        path->mnt = mnt;
        path->dentry = dentry;
+       __follow_mount(path);
        return 0;
 
 need_lookup:
@@ -751,7 +770,7 @@ static fastcall int __link_path_walk(const char * name, struct nameidata *nd)
                        case 2: 
                                if (this.name[1] != '.')
                                        break;
-                               follow_dotdot(&nd->mnt, &nd->dentry);
+                               follow_dotdot(nd);
                                inode = nd->dentry->d_inode;
                                /* fallthrough */
                        case 1:
@@ -771,8 +790,6 @@ static fastcall int __link_path_walk(const char * name, struct nameidata *nd)
                err = do_lookup(nd, &this, &next);
                if (err)
                        break;
-               /* Check mountpoints.. */
-               follow_mount(&next.mnt, &next.dentry);
 
                err = -ENOENT;
                inode = next.dentry->d_inode;
@@ -783,10 +800,7 @@ static fastcall int __link_path_walk(const char * name, struct nameidata *nd)
                        goto out_dput;
 
                if (inode->i_op->follow_link) {
-                       mntget(next.mnt);
-                       err = do_follow_link(next.dentry, nd);
-                       dput(next.dentry);
-                       mntput(next.mnt);
+                       err = do_follow_link(&next, nd);
                        if (err)
                                goto return_err;
                        err = -ENOENT;
@@ -798,6 +812,8 @@ static fastcall int __link_path_walk(const char * name, struct nameidata *nd)
                                break;
                } else {
                        dput(nd->dentry);
+                       if (nd->mnt != next.mnt)
+                               mntput(nd->mnt);
                        nd->mnt = next.mnt;
                        nd->dentry = next.dentry;
                }
@@ -819,7 +835,7 @@ last_component:
                        case 2: 
                                if (this.name[1] != '.')
                                        break;
-                               follow_dotdot(&nd->mnt, &nd->dentry);
+                               follow_dotdot(nd);
                                inode = nd->dentry->d_inode;
                                /* fallthrough */
                        case 1:
@@ -833,19 +849,17 @@ last_component:
                err = do_lookup(nd, &this, &next);
                if (err)
                        break;
-               follow_mount(&next.mnt, &next.dentry);
                inode = next.dentry->d_inode;
                if ((lookup_flags & LOOKUP_FOLLOW)
                    && inode && inode->i_op && inode->i_op->follow_link) {
-                       mntget(next.mnt);
-                       err = do_follow_link(next.dentry, nd);
-                       dput(next.dentry);
-                       mntput(next.mnt);
+                       err = do_follow_link(&next, nd);
                        if (err)
                                goto return_err;
                        inode = nd->dentry->d_inode;
                } else {
                        dput(nd->dentry);
+                       if (nd->mnt != next.mnt)
+                               mntput(nd->mnt);
                        nd->mnt = next.mnt;
                        nd->dentry = next.dentry;
                }
@@ -885,6 +899,8 @@ return_base:
                return 0;
 out_dput:
                dput(next.dentry);
+               if (nd->mnt != next.mnt)
+                       mntput(next.mnt);
                break;
        }
        path_release(nd);
@@ -1398,7 +1414,7 @@ int may_open(struct nameidata *nd, int acc_mode, int flag)
 int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
 {
        int acc_mode, error = 0;
-       struct dentry *dentry;
+       struct path path;
        struct dentry *dir;
        int count = 0;
 
@@ -1442,23 +1458,24 @@ int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
        dir = nd->dentry;
        nd->flags &= ~LOOKUP_PARENT;
        down(&dir->d_inode->i_sem);
-       dentry = __lookup_hash(&nd->last, nd->dentry, nd);
+       path.dentry = __lookup_hash(&nd->last, nd->dentry, nd);
+       path.mnt = nd->mnt;
 
 do_last:
-       error = PTR_ERR(dentry);
-       if (IS_ERR(dentry)) {
+       error = PTR_ERR(path.dentry);
+       if (IS_ERR(path.dentry)) {
                up(&dir->d_inode->i_sem);
                goto exit;
        }
 
        /* Negative dentry, just create the file */
-       if (!dentry->d_inode) {
+       if (!path.dentry->d_inode) {
                if (!IS_POSIXACL(dir->d_inode))
                        mode &= ~current->fs->umask;
-               error = vfs_create(dir->d_inode, dentry, mode, nd);
+               error = vfs_create(dir->d_inode, path.dentry, mode, nd);
                up(&dir->d_inode->i_sem);
                dput(nd->dentry);
-               nd->dentry = dentry;
+               nd->dentry = path.dentry;
                if (error)
                        goto exit;
                /* Don't check for write permission, don't truncate */
@@ -1476,22 +1493,24 @@ do_last:
        if (flag & O_EXCL)
                goto exit_dput;
 
-       if (d_mountpoint(dentry)) {
+       if (__follow_mount(&path)) {
                error = -ELOOP;
                if (flag & O_NOFOLLOW)
                        goto exit_dput;
-               while (__follow_down(&nd->mnt,&dentry) && d_mountpoint(dentry));
        }
        error = -ENOENT;
-       if (!dentry->d_inode)
+       if (!path.dentry->d_inode)
                goto exit_dput;
-       if (dentry->d_inode->i_op && dentry->d_inode->i_op->follow_link)
+       if (path.dentry->d_inode->i_op && path.dentry->d_inode->i_op->follow_link)
                goto do_link;
 
        dput(nd->dentry);
-       nd->dentry = dentry;
+       nd->dentry = path.dentry;
+       if (nd->mnt != path.mnt)
+               mntput(nd->mnt);
+       nd->mnt = path.mnt;
        error = -EISDIR;
-       if (dentry->d_inode && S_ISDIR(dentry->d_inode->i_mode))
+       if (path.dentry->d_inode && S_ISDIR(path.dentry->d_inode->i_mode))
                goto exit;
 ok:
        error = may_open(nd, acc_mode, flag);
@@ -1500,7 +1519,9 @@ ok:
        return 0;
 
 exit_dput:
-       dput(dentry);
+       dput(path.dentry);
+       if (nd->mnt != path.mnt)
+               mntput(path.mnt);
 exit:
        path_release(nd);
        return error;
@@ -1520,18 +1541,15 @@ do_link:
         * are done. Procfs-like symlinks just set LAST_BIND.
         */
        nd->flags |= LOOKUP_PARENT;
-       error = security_inode_follow_link(dentry, nd);
+       error = security_inode_follow_link(path.dentry, nd);
        if (error)
                goto exit_dput;
-       error = __do_follow_link(dentry, nd);
-       dput(dentry);
+       error = __do_follow_link(&path, nd);
        if (error)
                return error;
        nd->flags &= ~LOOKUP_PARENT;
-       if (nd->last_type == LAST_BIND) {
-               dentry = nd->dentry;
+       if (nd->last_type == LAST_BIND)
                goto ok;
-       }
        error = -EISDIR;
        if (nd->last_type != LAST_NORM)
                goto exit;
@@ -1546,7 +1564,8 @@ do_link:
        }
        dir = nd->dentry;
        down(&dir->d_inode->i_sem);
-       dentry = __lookup_hash(&nd->last, nd->dentry, nd);
+       path.dentry = __lookup_hash(&nd->last, nd->dentry, nd);
+       path.mnt = nd->mnt;
        putname(nd->last.name);
        goto do_last;
 }
@@ -1580,6 +1599,7 @@ enoent:
 fail:
        return dentry;
 }
+EXPORT_SYMBOL_GPL(lookup_create);
 
 int vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
 {
index 73f96acd5d378b1b8e8aafd091b11c211f367afb..ff6155f5e8d9e3e30bbc5fa7422d67119426b1e0 100644 (file)
@@ -528,19 +528,39 @@ static inline void nfs_renew_times(struct dentry * dentry)
        dentry->d_time = jiffies;
 }
 
+/*
+ * Return the intent data that applies to this particular path component
+ *
+ * Note that the current set of intents only apply to the very last
+ * component of the path.
+ * We check for this using LOOKUP_CONTINUE and LOOKUP_PARENT.
+ */
+static inline unsigned int nfs_lookup_check_intent(struct nameidata *nd, unsigned int mask)
+{
+       if (nd->flags & (LOOKUP_CONTINUE|LOOKUP_PARENT))
+               return 0;
+       return nd->flags & mask;
+}
+
+/*
+ * Inode and filehandle revalidation for lookups.
+ *
+ * We force revalidation in the cases where the VFS sets LOOKUP_REVAL,
+ * or if the intent information indicates that we're about to open this
+ * particular file and the "nocto" mount flag is not set.
+ *
+ */
 static inline
 int nfs_lookup_verify_inode(struct inode *inode, struct nameidata *nd)
 {
        struct nfs_server *server = NFS_SERVER(inode);
 
        if (nd != NULL) {
-               int ndflags = nd->flags;
                /* VFS wants an on-the-wire revalidation */
-               if (ndflags & LOOKUP_REVAL)
+               if (nd->flags & LOOKUP_REVAL)
                        goto out_force;
                /* This is an open(2) */
-               if ((ndflags & LOOKUP_OPEN) &&
-                               !(ndflags & LOOKUP_CONTINUE) &&
+               if (nfs_lookup_check_intent(nd, LOOKUP_OPEN) != 0 &&
                                !(server->flags & NFS_MOUNT_NOCTO))
                        goto out_force;
        }
@@ -560,12 +580,8 @@ static inline
 int nfs_neg_need_reval(struct inode *dir, struct dentry *dentry,
                       struct nameidata *nd)
 {
-       int ndflags = 0;
-
-       if (nd)
-               ndflags = nd->flags;
        /* Don't revalidate a negative dentry if we're creating a new file */
-       if ((ndflags & LOOKUP_CREATE) && !(ndflags & LOOKUP_CONTINUE))
+       if (nd != NULL && nfs_lookup_check_intent(nd, LOOKUP_CREATE) != 0)
                return 0;
        return !nfs_check_verifier(dir, dentry);
 }
@@ -700,12 +716,16 @@ struct dentry_operations nfs_dentry_operations = {
        .d_iput         = nfs_dentry_iput,
 };
 
+/*
+ * Use intent information to check whether or not we're going to do
+ * an O_EXCL create using this path component.
+ */
 static inline
 int nfs_is_exclusive_create(struct inode *dir, struct nameidata *nd)
 {
        if (NFS_PROTO(dir)->version == 2)
                return 0;
-       if (!nd || (nd->flags & LOOKUP_CONTINUE) || !(nd->flags & LOOKUP_CREATE))
+       if (nd == NULL || nfs_lookup_check_intent(nd, LOOKUP_CREATE) == 0)
                return 0;
        return (nd->intent.open.flags & O_EXCL) != 0;
 }
@@ -772,12 +792,13 @@ struct dentry_operations nfs4_dentry_operations = {
        .d_iput         = nfs_dentry_iput,
 };
 
+/*
+ * Use intent information to determine whether we need to substitute
+ * the NFSv4-style stateful OPEN for the LOOKUP call
+ */
 static int is_atomic_open(struct inode *dir, struct nameidata *nd)
 {
-       if (!nd)
-               return 0;
-       /* Check that we are indeed trying to open this file */
-       if ((nd->flags & LOOKUP_CONTINUE) || !(nd->flags & LOOKUP_OPEN))
+       if (nd == NULL || nfs_lookup_check_intent(nd, LOOKUP_OPEN) == 0)
                return 0;
        /* NFS does not (yet) have a stateful open for directories */
        if (nd->flags & LOOKUP_DIRECTORY)
index f06eee6dcff57e3d4d4d7f88fe71545fd5b2c6e6..55c907592490a7fa6357c2bc17018b378c25433f 100644 (file)
@@ -37,6 +37,7 @@
 
 static int nfs_file_open(struct inode *, struct file *);
 static int nfs_file_release(struct inode *, struct file *);
+static loff_t nfs_file_llseek(struct file *file, loff_t offset, int origin);
 static int  nfs_file_mmap(struct file *, struct vm_area_struct *);
 static ssize_t nfs_file_sendfile(struct file *, loff_t *, size_t, read_actor_t, void *);
 static ssize_t nfs_file_read(struct kiocb *, char __user *, size_t, loff_t);
@@ -48,7 +49,7 @@ static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl);
 static int nfs_flock(struct file *filp, int cmd, struct file_lock *fl);
 
 struct file_operations nfs_file_operations = {
-       .llseek         = remote_llseek,
+       .llseek         = nfs_file_llseek,
        .read           = do_sync_read,
        .write          = do_sync_write,
        .aio_read               = nfs_file_read,
@@ -114,6 +115,45 @@ nfs_file_release(struct inode *inode, struct file *filp)
        return NFS_PROTO(inode)->file_release(inode, filp);
 }
 
+/**
+ * nfs_revalidate_size - Revalidate the file size
+ * @inode - pointer to inode struct
+ * @file - pointer to struct file
+ *
+ * Revalidates the file length. This is basically a wrapper around
+ * nfs_revalidate_inode() that takes into account the fact that we may
+ * have cached writes (in which case we don't care about the server's
+ * idea of what the file length is), or O_DIRECT (in which case we
+ * shouldn't trust the cache).
+ */
+static int nfs_revalidate_file_size(struct inode *inode, struct file *filp)
+{
+       struct nfs_server *server = NFS_SERVER(inode);
+       struct nfs_inode *nfsi = NFS_I(inode);
+
+       if (server->flags & NFS_MOUNT_NOAC)
+               goto force_reval;
+       if (filp->f_flags & O_DIRECT)
+               goto force_reval;
+       if (nfsi->npages != 0)
+               return 0;
+       return nfs_revalidate_inode(server, inode);
+force_reval:
+       return __nfs_revalidate_inode(server, inode);
+}
+
+static loff_t nfs_file_llseek(struct file *filp, loff_t offset, int origin)
+{
+       /* origin == SEEK_END => we must revalidate the cached file length */
+       if (origin == 2) {
+               struct inode *inode = filp->f_mapping->host;
+               int retval = nfs_revalidate_file_size(inode, filp);
+               if (retval < 0)
+                       return (loff_t)retval;
+       }
+       return remote_llseek(filp, offset, origin);
+}
+
 /*
  * Flush all dirty pages, and check for write errors.
  *
index a7041038ad56108ef45f195bedf109dbbb7ddb24..25d2d9c6e329c6b0eb04524cd80d2538cb3f4118 100644 (file)
@@ -50,13 +50,23 @@ void get_vmalloc_info(struct vmalloc_info *vmi)
                read_lock(&vmlist_lock);
 
                for (vma = vmlist; vma; vma = vma->next) {
+                       unsigned long addr = (unsigned long) vma->addr;
+
+                       /*
+                        * Some archs keep another range for modules in vmlist
+                        */
+                       if (addr < VMALLOC_START)
+                               continue;
+                       if (addr >= VMALLOC_END)
+                               break;
+
                        vmi->used += vma->size;
 
-                       free_area_size = (unsigned long) vma->addr - prev_end;
+                       free_area_size = addr - prev_end;
                        if (vmi->largest_chunk < free_area_size)
                                vmi->largest_chunk = free_area_size;
 
-                       prev_end = vma->size + (unsigned long) vma->addr;
+                       prev_end = vma->size + addr;
                }
 
                if (VMALLOC_END - prev_end > vmi->largest_chunk)
index 67423c696c0a205afda4734b8bcaf8836fb2ce21..6fd57f1541972cfb182e325d39df30c02850690a 100644 (file)
 #include <asm/uaccess.h>
 
 #ifndef HAVE_ARCH_DEVTREE_FIXUPS
-static inline void set_node_proc_entry(struct device_node *np, struct proc_dir_entry *de)
-{
-}
-
-static void inline set_node_name_link(struct device_node *np, struct proc_dir_entry *de)
-{
-}
-
-static void inline set_node_addr_link(struct device_node *np, struct proc_dir_entry *de)
+static inline void set_node_proc_entry(struct device_node *np,
+                                      struct proc_dir_entry *de)
 {
 }
 #endif
@@ -58,89 +51,67 @@ static int property_read_proc(char *page, char **start, off_t off,
 /*
  * Process a node, adding entries for its children and its properties.
  */
-void proc_device_tree_add_node(struct device_node *np, struct proc_dir_entry *de)
+void proc_device_tree_add_node(struct device_node *np,
+                              struct proc_dir_entry *de)
 {
        struct property *pp;
        struct proc_dir_entry *ent;
-       struct device_node *child, *sib;
-       const char *p, *at;
-       int l;
-       struct proc_dir_entry *list, **lastp, *al;
+       struct device_node *child;
+       struct proc_dir_entry *list = NULL, **lastp;
+       const char *p;
 
        set_node_proc_entry(np, de);
        lastp = &list;
-       for (pp = np->properties; pp != 0; pp = pp->next) {
-               /*
-                * Unfortunately proc_register puts each new entry
-                * at the beginning of the list.  So we rearrange them.
-                */
-               ent = create_proc_read_entry(pp->name, strncmp(pp->name, "security-", 9) ?
-                                            S_IRUGO : S_IRUSR, de, property_read_proc, pp);
-               if (ent == 0)
-                       break;
-               if (!strncmp(pp->name, "security-", 9))
-                    ent->size = 0; /* don't leak number of password chars */
-               else
-                    ent->size = pp->length;
-               *lastp = ent;
-               lastp = &ent->next;
-       }
-       child = NULL;
-       while ((child = of_get_next_child(np, child))) {
+       for (child = NULL; (child = of_get_next_child(np, child));) {
                p = strrchr(child->full_name, '/');
                if (!p)
                        p = child->full_name;
                else
                        ++p;
-               /* chop off '@0' if the name ends with that */
-               l = strlen(p);
-               if (l > 2 && p[l-2] == '@' && p[l-1] == '0')
-                       l -= 2;
                ent = proc_mkdir(p, de);
                if (ent == 0)
                        break;
                *lastp = ent;
+               ent->next = NULL;
                lastp = &ent->next;
                proc_device_tree_add_node(child, ent);
-
-               /*
-                * If we left the address part on the name, consider
-                * adding symlinks from the name and address parts.
-                */
-               if (p[l] != 0 || (at = strchr(p, '@')) == 0)
-                       continue;
-
+       }
+       of_node_put(child);
+       for (pp = np->properties; pp != 0; pp = pp->next) {
                /*
-                * If this is the first node with a given name property,
-                * add a symlink with the name property as its name.
+                * Yet another Apple device-tree bogosity: on some machines,
+                * they have properties & nodes with the same name. Those
+                * properties are quite unimportant for us though, thus we
+                * simply "skip" them here, but we do have to check.
                 */
-               sib = NULL;
-               while ((sib = of_get_next_child(np, sib)) && sib != child)
-                       if (sib->name && strcmp(sib->name, child->name) == 0)
-                               break;
-               if (sib == child && strncmp(p, child->name, l) != 0) {
-                       al = proc_symlink(child->name, de, ent->name);
-                       if (al == 0) {
-                               of_node_put(sib);
+               for (ent = list; ent != NULL; ent = ent->next)
+                       if (!strcmp(ent->name, pp->name))
                                break;
-                       }
-                       set_node_name_link(child, al);
-                       *lastp = al;
-                       lastp = &al->next;
+               if (ent != NULL) {
+                       printk(KERN_WARNING "device-tree: property \"%s\" name"
+                              " conflicts with node in %s\n", pp->name,
+                              np->full_name);
+                       continue;
                }
-               of_node_put(sib);
+
                /*
-                * Add another directory with the @address part as its name.
+                * Unfortunately proc_register puts each new entry
+                * at the beginning of the list.  So we rearrange them.
                 */
-               al = proc_symlink(at, de, ent->name);
-               if (al == 0)
+               ent = create_proc_read_entry(pp->name,
+                                            strncmp(pp->name, "security-", 9)
+                                            ? S_IRUGO : S_IRUSR, de,
+                                            property_read_proc, pp);
+               if (ent == 0)
                        break;
-               set_node_addr_link(child, al);
-               *lastp = al;
-               lastp = &al->next;
+               if (!strncmp(pp->name, "security-", 9))
+                    ent->size = 0; /* don't leak number of password chars */
+               else
+                    ent->size = pp->length;
+               ent->next = NULL;
+               *lastp = ent;
+               lastp = &ent->next;
        }
-       of_node_put(child);
-       *lastp = NULL;
        de->subdir = list;
 }
 
index a60a3b3d8a7b1c31870dee3d947fe119a5787a5d..63a9fbf1ac51be4f8bf06d772c70d2c6083cd833 100644 (file)
@@ -219,6 +219,19 @@ static struct file_operations fragmentation_file_operations = {
        .release        = seq_release,
 };
 
+extern struct seq_operations zoneinfo_op;
+static int zoneinfo_open(struct inode *inode, struct file *file)
+{
+       return seq_open(file, &zoneinfo_op);
+}
+
+static struct file_operations proc_zoneinfo_file_operations = {
+       .open           = zoneinfo_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = seq_release,
+};
+
 static int version_read_proc(char *page, char **start, off_t off,
                                 int count, int *eof, void *data)
 {
@@ -589,6 +602,7 @@ void __init proc_misc_init(void)
        create_seq_entry("slabinfo",S_IWUSR|S_IRUGO,&proc_slabinfo_operations);
        create_seq_entry("buddyinfo",S_IRUGO, &fragmentation_file_operations);
        create_seq_entry("vmstat",S_IRUGO, &proc_vmstat_file_operations);
+       create_seq_entry("zoneinfo",S_IRUGO, &proc_zoneinfo_file_operations);
        create_seq_entry("diskstats", 0, &proc_diskstats_operations);
 #ifdef CONFIG_MODULES
        create_seq_entry("modules", 0, &proc_modules_operations);
index da23ba75f3d51006fe6b9486916e8dcd5e23497f..c47f8fd31a2d069e650b17866ab816b3a273b046 100644 (file)
@@ -230,7 +230,6 @@ const struct reiserfs_key  MAX_KEY = {
        __constant_cpu_to_le32(0xffffffff)},}
 };
 
-const struct in_core_key  MAX_IN_CORE_KEY = {~0U, ~0U, ~0ULL>>4, 15};
 
 /* Get delimiting key of the buffer by looking for it in the buffers in the path, starting from the bottom
    of the path, and going upwards.  We must check the path's validity at each step.  If the key is not in
index 31e75125f48bf355b2ad6866a1fcb67ca5965634..b35b87744983f413adab54e11b469c7a90a8e4ac 100644 (file)
@@ -164,7 +164,9 @@ static int finish_unfinished (struct super_block * s)
  
     /* compose key to look for "save" links */
     max_cpu_key.version = KEY_FORMAT_3_5;
-    max_cpu_key.on_disk_key = MAX_IN_CORE_KEY;
+    max_cpu_key.on_disk_key.k_dir_id = ~0U;
+    max_cpu_key.on_disk_key.k_objectid = ~0U;
+    set_cpu_key_k_offset (&max_cpu_key, ~0U);
     max_cpu_key.key_length = 3;
 
 #ifdef CONFIG_QUOTA
index 3a1b8ca04ba601b37ffa5dadb8f9695272952e39..573bcc81bb82ae25caa4de0d0b779d562c87535b 100644 (file)
@@ -835,6 +835,7 @@ do_kern_mount(const char *fstype, int flags, const char *name, void *data)
        mnt->mnt_parent = mnt;
        mnt->mnt_namespace = current->namespace;
        up_write(&sb->s_umount);
+       free_secdata(secdata);
        put_filesystem(type);
        return mnt;
 out_sb:
index d4aaa88d02144b4f6618d8f79dbd76aea6efe16a..78899eeab9742c8e35b8c8a68a43054c0fd9c5a9 100644 (file)
@@ -25,7 +25,7 @@ fill_read(struct dentry *dentry, char *buffer, loff_t off, size_t count)
        struct kobject * kobj = to_kobj(dentry->d_parent);
 
        if (!attr->read)
-               return -EINVAL;
+               return -EIO;
 
        return attr->read(kobj, buffer, off, count);
 }
@@ -71,7 +71,7 @@ flush_write(struct dentry *dentry, char *buffer, loff_t offset, size_t count)
        struct kobject *kobj = to_kobj(dentry->d_parent);
 
        if (!attr->write)
-               return -EINVAL;
+               return -EIO;
 
        return attr->write(kobj, buffer, offset, count);
 }
index fe198210bc2d53081c018ac064e433715010daba..37d7a6875d86908556726b070782b13ba87eb5ae 100644 (file)
@@ -101,18 +101,19 @@ static int create_dir(struct kobject * k, struct dentry * p,
        down(&p->d_inode->i_sem);
        *d = sysfs_get_dentry(p,n);
        if (!IS_ERR(*d)) {
-               error = sysfs_create(*d, mode, init_dir);
+               error = sysfs_make_dirent(p->d_fsdata, *d, k, mode, SYSFS_DIR);
                if (!error) {
-                       error = sysfs_make_dirent(p->d_fsdata, *d, k, mode,
-                                               SYSFS_DIR);
+                       error = sysfs_create(*d, mode, init_dir);
                        if (!error) {
                                p->d_inode->i_nlink++;
                                (*d)->d_op = &sysfs_dentry_ops;
                                d_rehash(*d);
                        }
                }
-               if (error && (error != -EEXIST))
+               if (error && (error != -EEXIST)) {
+                       sysfs_put((*d)->d_fsdata);
                        d_drop(*d);
+               }
                dput(*d);
        } else
                error = PTR_ERR(*d);
@@ -171,17 +172,19 @@ static int sysfs_attach_attr(struct sysfs_dirent * sd, struct dentry * dentry)
                 init = init_file;
         }
 
+       dentry->d_fsdata = sysfs_get(sd);
+       sd->s_dentry = dentry;
        error = sysfs_create(dentry, (attr->mode & S_IALLUGO) | S_IFREG, init);
-       if (error)
+       if (error) {
+               sysfs_put(sd);
                return error;
+       }
 
         if (bin_attr) {
                dentry->d_inode->i_size = bin_attr->size;
                dentry->d_inode->i_fop = &bin_fops;
        }
        dentry->d_op = &sysfs_dentry_ops;
-       dentry->d_fsdata = sysfs_get(sd);
-       sd->s_dentry = dentry;
        d_rehash(dentry);
 
        return 0;
@@ -191,13 +194,15 @@ static int sysfs_attach_link(struct sysfs_dirent * sd, struct dentry * dentry)
 {
        int err = 0;
 
+       dentry->d_fsdata = sysfs_get(sd);
+       sd->s_dentry = dentry;
        err = sysfs_create(dentry, S_IFLNK|S_IRWXUGO, init_symlink);
        if (!err) {
                dentry->d_op = &sysfs_dentry_ops;
-               dentry->d_fsdata = sysfs_get(sd);
-               sd->s_dentry = dentry;
                d_rehash(dentry);
-       }
+       } else
+               sysfs_put(sd);
+
        return err;
 }
 
@@ -228,6 +233,7 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
 
 struct inode_operations sysfs_dir_inode_operations = {
        .lookup         = sysfs_lookup,
+       .setattr        = sysfs_setattr,
 };
 
 static void remove_dir(struct dentry * d)
index 364208071e1747d155b3eb6521d364c30b53bcd5..849aac115460812ff419898c45346b353da9bb5c 100644 (file)
@@ -23,7 +23,7 @@ subsys_attr_show(struct kobject * kobj, struct attribute * attr, char * page)
 {
        struct subsystem * s = to_subsys(kobj);
        struct subsys_attribute * sattr = to_sattr(attr);
-       ssize_t ret = 0;
+       ssize_t ret = -EIO;
 
        if (sattr->show)
                ret = sattr->show(s,page);
@@ -36,7 +36,7 @@ subsys_attr_store(struct kobject * kobj, struct attribute * attr,
 {
        struct subsystem * s = to_subsys(kobj);
        struct subsys_attribute * sattr = to_sattr(attr);
-       ssize_t ret = 0;
+       ssize_t ret = -EIO;
 
        if (sattr->store)
                ret = sattr->store(s,page,count);
@@ -182,7 +182,7 @@ fill_write_buffer(struct sysfs_buffer * buffer, const char __user * buf, size_t
                return -ENOMEM;
 
        if (count >= PAGE_SIZE)
-               count = PAGE_SIZE - 1;
+               count = PAGE_SIZE;
        error = copy_from_user(buffer->page,buf,count);
        buffer->needs_read_fill = 1;
        return error ? -EFAULT : count;
index aff7b2dfa8eed3a4c4c76b81cfffd26f04344706..565cac1d42006d50713544bc400a2bded2a2680a 100644 (file)
@@ -26,18 +26,107 @@ static struct backing_dev_info sysfs_backing_dev_info = {
        .capabilities   = BDI_CAP_NO_ACCT_DIRTY | BDI_CAP_NO_WRITEBACK,
 };
 
-struct inode * sysfs_new_inode(mode_t mode)
+static struct inode_operations sysfs_inode_operations ={
+       .setattr        = sysfs_setattr,
+};
+
+int sysfs_setattr(struct dentry * dentry, struct iattr * iattr)
+{
+       struct inode * inode = dentry->d_inode;
+       struct sysfs_dirent * sd = dentry->d_fsdata;
+       struct iattr * sd_iattr;
+       unsigned int ia_valid = iattr->ia_valid;
+       int error;
+
+       if (!sd)
+               return -EINVAL;
+
+       sd_iattr = sd->s_iattr;
+
+       error = inode_change_ok(inode, iattr);
+       if (error)
+               return error;
+
+       error = inode_setattr(inode, iattr);
+       if (error)
+               return error;
+
+       if (!sd_iattr) {
+               /* setting attributes for the first time, allocate now */
+               sd_iattr = kmalloc(sizeof(struct iattr), GFP_KERNEL);
+               if (!sd_iattr)
+                       return -ENOMEM;
+               /* assign default attributes */
+               memset(sd_iattr, 0, sizeof(struct iattr));
+               sd_iattr->ia_mode = sd->s_mode;
+               sd_iattr->ia_uid = 0;
+               sd_iattr->ia_gid = 0;
+               sd_iattr->ia_atime = sd_iattr->ia_mtime = sd_iattr->ia_ctime = CURRENT_TIME;
+               sd->s_iattr = sd_iattr;
+       }
+
+       /* attributes were changed atleast once in past */
+
+       if (ia_valid & ATTR_UID)
+               sd_iattr->ia_uid = iattr->ia_uid;
+       if (ia_valid & ATTR_GID)
+               sd_iattr->ia_gid = iattr->ia_gid;
+       if (ia_valid & ATTR_ATIME)
+               sd_iattr->ia_atime = timespec_trunc(iattr->ia_atime,
+                                               inode->i_sb->s_time_gran);
+       if (ia_valid & ATTR_MTIME)
+               sd_iattr->ia_mtime = timespec_trunc(iattr->ia_mtime,
+                                               inode->i_sb->s_time_gran);
+       if (ia_valid & ATTR_CTIME)
+               sd_iattr->ia_ctime = timespec_trunc(iattr->ia_ctime,
+                                               inode->i_sb->s_time_gran);
+       if (ia_valid & ATTR_MODE) {
+               umode_t mode = iattr->ia_mode;
+
+               if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
+                       mode &= ~S_ISGID;
+               sd_iattr->ia_mode = mode;
+       }
+
+       return error;
+}
+
+static inline void set_default_inode_attr(struct inode * inode, mode_t mode)
+{
+       inode->i_mode = mode;
+       inode->i_uid = 0;
+       inode->i_gid = 0;
+       inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
+}
+
+static inline void set_inode_attr(struct inode * inode, struct iattr * iattr)
+{
+       inode->i_mode = iattr->ia_mode;
+       inode->i_uid = iattr->ia_uid;
+       inode->i_gid = iattr->ia_gid;
+       inode->i_atime = iattr->ia_atime;
+       inode->i_mtime = iattr->ia_mtime;
+       inode->i_ctime = iattr->ia_ctime;
+}
+
+struct inode * sysfs_new_inode(mode_t mode, struct sysfs_dirent * sd)
 {
        struct inode * inode = new_inode(sysfs_sb);
        if (inode) {
-               inode->i_mode = mode;
-               inode->i_uid = 0;
-               inode->i_gid = 0;
                inode->i_blksize = PAGE_CACHE_SIZE;
                inode->i_blocks = 0;
-               inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
                inode->i_mapping->a_ops = &sysfs_aops;
                inode->i_mapping->backing_dev_info = &sysfs_backing_dev_info;
+               inode->i_op = &sysfs_inode_operations;
+
+               if (sd->s_iattr) {
+                       /* sysfs_dirent has non-default attributes
+                        * get them for the new inode from persistent copy
+                        * in sysfs_dirent
+                        */
+                       set_inode_attr(inode, sd->s_iattr);
+               } else
+                       set_default_inode_attr(inode, mode);
        }
        return inode;
 }
@@ -48,7 +137,8 @@ int sysfs_create(struct dentry * dentry, int mode, int (*init)(struct inode *))
        struct inode * inode = NULL;
        if (dentry) {
                if (!dentry->d_inode) {
-                       if ((inode = sysfs_new_inode(mode))) {
+                       struct sysfs_dirent * sd = dentry->d_fsdata;
+                       if ((inode = sysfs_new_inode(mode, sd))) {
                                if (dentry->d_parent && dentry->d_parent->d_inode) {
                                        struct inode *p_inode = dentry->d_parent->d_inode;
                                        p_inode->i_mtime = p_inode->i_ctime = CURRENT_TIME;
index 5c805bb1a4b75db6ef4b6cdb0f0482aab0116655..f1117e885bd6e95c7402c50c6d9b52a6b69f0b43 100644 (file)
@@ -28,6 +28,7 @@ static struct sysfs_dirent sysfs_root = {
        .s_children     = LIST_HEAD_INIT(sysfs_root.s_children),
        .s_element      = NULL,
        .s_type         = SYSFS_ROOT,
+       .s_iattr        = NULL,
 };
 
 static int sysfs_fill_super(struct super_block *sb, void *data, int silent)
@@ -42,7 +43,8 @@ static int sysfs_fill_super(struct super_block *sb, void *data, int silent)
        sb->s_time_gran = 1;
        sysfs_sb = sb;
 
-       inode = sysfs_new_inode(S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO);
+       inode = sysfs_new_inode(S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO,
+                                &sysfs_root);
        if (inode) {
                inode->i_op = &sysfs_dir_inode_operations;
                inode->i_fop = &sysfs_dir_operations;
index dfdf70174354097df7f0924d3ff871dec48fb1c2..fae57c83a722f4e782a2651e7dc0b74a66dfee76 100644 (file)
@@ -43,7 +43,7 @@ static void fill_object_path(struct kobject * kobj, char * buffer, int length)
        }
 }
 
-static int sysfs_add_link(struct dentry * parent, char * name, struct kobject * target)
+static int sysfs_add_link(struct dentry * parent, const char * name, struct kobject * target)
 {
        struct sysfs_dirent * parent_sd = parent->d_fsdata;
        struct sysfs_symlink * sl;
@@ -79,7 +79,7 @@ exit1:
  *     @target:        object we're pointing to.
  *     @name:          name of the symlink.
  */
-int sysfs_create_link(struct kobject * kobj, struct kobject * target, char * name)
+int sysfs_create_link(struct kobject * kobj, struct kobject * target, const char * name)
 {
        struct dentry * dentry = kobj->dentry;
        int error = 0;
@@ -99,13 +99,13 @@ int sysfs_create_link(struct kobject * kobj, struct kobject * target, char * nam
  *     @name:  name of the symlink to remove.
  */
 
-void sysfs_remove_link(struct kobject * kobj, char * name)
+void sysfs_remove_link(struct kobject * kobj, const char * name)
 {
        sysfs_hash_and_remove(kobj->dentry,name);
 }
 
 static int sysfs_get_target_path(struct kobject * kobj, struct kobject * target,
-                                  char *path)
+                                char *path)
 {
        char * s;
        int depth, size;
index a8a24a0c0b3bd44b910e2e6fe52daa0a23e4855b..29da6f5f07c840629653fcf2deda898ae6a09c5c 100644 (file)
@@ -2,7 +2,7 @@
 extern struct vfsmount * sysfs_mount;
 extern kmem_cache_t *sysfs_dir_cachep;
 
-extern struct inode * sysfs_new_inode(mode_t mode);
+extern struct inode * sysfs_new_inode(mode_t mode, struct sysfs_dirent *);
 extern int sysfs_create(struct dentry *, int mode, int (*init)(struct inode *));
 
 extern int sysfs_make_dirent(struct sysfs_dirent *, struct dentry *, void *,
@@ -17,6 +17,7 @@ extern void sysfs_remove_subdir(struct dentry *);
 
 extern const unsigned char * sysfs_get_name(struct sysfs_dirent *sd);
 extern void sysfs_drop_dentry(struct sysfs_dirent *sd, struct dentry *parent);
+extern int sysfs_setattr(struct dentry *dentry, struct iattr *iattr);
 
 extern struct rw_semaphore sysfs_rename_sem;
 extern struct super_block * sysfs_sb;
@@ -75,6 +76,7 @@ static inline void release_sysfs_dirent(struct sysfs_dirent * sd)
                kobject_put(sl->target_kobj);
                kfree(sl);
        }
+       kfree(sd->s_iattr);
        kmem_cache_free(sysfs_dir_cachep, sd);
 }
 
index 457a8fe285751d73bd3f052b21532b1538c988dd..85d8dbe843f1f12eee67836c1e94d006f52858f6 100644 (file)
@@ -46,7 +46,7 @@
 #endif
 
 /* How many days come before each month (0-12).  */
-const unsigned short int __mon_yday[2][13] =
+static const unsigned short int __mon_yday[2][13] =
 {
        /* Normal years.  */
        { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
index 9278e9aba9ba7c3bf5946c7efdd3abfedf166798..93ce257cd1495cbffdb8cebfda51cd6d9c6431c6 100644 (file)
@@ -886,7 +886,6 @@ xfs_page_state_convert(
                SetPageUptodate(page);
 
        if (startio) {
-               WARN_ON(page_dirty);
                xfs_submit_page(page, wbc, bh_arr, cnt, 0, !page_dirty);
        }
 
index 997963e5362234809dbd14b6a4a52eb1628a75d5..c60e69431e11d746abc9b41d3c525c0ac65116d7 100644 (file)
  * File wide globals
  */
 
-STATIC kmem_cache_t *pagebuf_cache;
+STATIC kmem_cache_t *pagebuf_zone;
 STATIC kmem_shaker_t pagebuf_shake;
-STATIC int pagebuf_daemon_wakeup(int, unsigned int);
+STATIC int xfsbufd_wakeup(int, unsigned int);
 STATIC void pagebuf_delwri_queue(xfs_buf_t *, int);
-STATIC struct workqueue_struct *pagebuf_logio_workqueue;
-STATIC struct workqueue_struct *pagebuf_dataio_workqueue;
+
+STATIC struct workqueue_struct *xfslogd_workqueue;
+STATIC struct workqueue_struct *xfsdatad_workqueue;
 
 /*
  * Pagebuf debugging
@@ -123,9 +124,9 @@ ktrace_t *pagebuf_trace_buf;
 
 
 #define pagebuf_allocate(flags) \
-       kmem_zone_alloc(pagebuf_cache, pb_to_km(flags))
+       kmem_zone_alloc(pagebuf_zone, pb_to_km(flags))
 #define pagebuf_deallocate(pb) \
-       kmem_zone_free(pagebuf_cache, (pb));
+       kmem_zone_free(pagebuf_zone, (pb));
 
 /*
  * Page Region interfaces.
@@ -425,7 +426,7 @@ _pagebuf_lookup_pages(
                                        __FUNCTION__, gfp_mask);
 
                        XFS_STATS_INC(pb_page_retries);
-                       pagebuf_daemon_wakeup(0, gfp_mask);
+                       xfsbufd_wakeup(0, gfp_mask);
                        blk_congestion_wait(WRITE, HZ/50);
                        goto retry;
                }
@@ -1136,8 +1137,8 @@ pagebuf_iodone(
        if ((pb->pb_iodone) || (pb->pb_flags & PBF_ASYNC)) {
                if (schedule) {
                        INIT_WORK(&pb->pb_iodone_work, pagebuf_iodone_work, pb);
-                       queue_work(dataio ? pagebuf_dataio_workqueue :
-                               pagebuf_logio_workqueue, &pb->pb_iodone_work);
+                       queue_work(dataio ? xfsdatad_workqueue :
+                               xfslogd_workqueue, &pb->pb_iodone_work);
                } else {
                        pagebuf_iodone_work(pb);
                }
@@ -1562,16 +1563,6 @@ xfs_free_buftarg(
        kmem_free(btp, sizeof(*btp));
 }
 
-void
-xfs_incore_relse(
-       xfs_buftarg_t           *btp,
-       int                     delwri_only,
-       int                     wait)
-{
-       invalidate_bdev(btp->pbr_bdev, 1);
-       truncate_inode_pages(btp->pbr_mapping, 0LL);
-}
-
 STATIC int
 xfs_setsize_buftarg_flags(
        xfs_buftarg_t           *btp,
@@ -1742,27 +1733,27 @@ pagebuf_runall_queues(
 }
 
 /* Defines for pagebuf daemon */
-STATIC DECLARE_COMPLETION(pagebuf_daemon_done);
-STATIC struct task_struct *pagebuf_daemon_task;
-STATIC int pagebuf_daemon_active;
-STATIC int force_flush;
-STATIC int force_sleep;
+STATIC DECLARE_COMPLETION(xfsbufd_done);
+STATIC struct task_struct *xfsbufd_task;
+STATIC int xfsbufd_active;
+STATIC int xfsbufd_force_flush;
+STATIC int xfsbufd_force_sleep;
 
 STATIC int
-pagebuf_daemon_wakeup(
+xfsbufd_wakeup(
        int                     priority,
        unsigned int            mask)
 {
-       if (force_sleep)
+       if (xfsbufd_force_sleep)
                return 0;
-       force_flush = 1;
+       xfsbufd_force_flush = 1;
        barrier();
-       wake_up_process(pagebuf_daemon_task);
+       wake_up_process(xfsbufd_task);
        return 0;
 }
 
 STATIC int
-pagebuf_daemon(
+xfsbufd(
        void                    *data)
 {
        struct list_head        tmp;
@@ -1774,17 +1765,17 @@ pagebuf_daemon(
        daemonize("xfsbufd");
        current->flags |= PF_MEMALLOC;
 
-       pagebuf_daemon_task = current;
-       pagebuf_daemon_active = 1;
+       xfsbufd_task = current;
+       xfsbufd_active = 1;
        barrier();
 
        INIT_LIST_HEAD(&tmp);
        do {
                if (unlikely(current->flags & PF_FREEZE)) {
-                       force_sleep = 1;
+                       xfsbufd_force_sleep = 1;
                        refrigerator(PF_FREEZE);
                } else {
-                       force_sleep = 0;
+                       xfsbufd_force_sleep = 0;
                }
 
                set_current_state(TASK_INTERRUPTIBLE);
@@ -1797,7 +1788,7 @@ pagebuf_daemon(
                        ASSERT(pb->pb_flags & PBF_DELWRI);
 
                        if (!pagebuf_ispin(pb) && !pagebuf_cond_lock(pb)) {
-                               if (!force_flush &&
+                               if (!xfsbufd_force_flush &&
                                    time_before(jiffies,
                                                pb->pb_queuetime + age)) {
                                        pagebuf_unlock(pb);
@@ -1824,10 +1815,10 @@ pagebuf_daemon(
                if (as_list_len > 0)
                        purge_addresses();
 
-               force_flush = 0;
-       } while (pagebuf_daemon_active);
+               xfsbufd_force_flush = 0;
+       } while (xfsbufd_active);
 
-       complete_and_exit(&pagebuf_daemon_done, 0);
+       complete_and_exit(&xfsbufd_done, 0);
 }
 
 /*
@@ -1844,8 +1835,8 @@ xfs_flush_buftarg(
        xfs_buf_t               *pb, *n;
        int                     pincount = 0;
 
-       pagebuf_runall_queues(pagebuf_dataio_workqueue);
-       pagebuf_runall_queues(pagebuf_logio_workqueue);
+       pagebuf_runall_queues(xfsdatad_workqueue);
+       pagebuf_runall_queues(xfslogd_workqueue);
 
        INIT_LIST_HEAD(&tmp);
        spin_lock(&pbd_delwrite_lock);
@@ -1898,43 +1889,43 @@ xfs_flush_buftarg(
 }
 
 STATIC int
-pagebuf_daemon_start(void)
+xfs_buf_daemons_start(void)
 {
-       int             rval;
+       int             error = -ENOMEM;
 
-       pagebuf_logio_workqueue = create_workqueue("xfslogd");
-       if (!pagebuf_logio_workqueue)
-               return -ENOMEM;
+       xfslogd_workqueue = create_workqueue("xfslogd");
+       if (!xfslogd_workqueue)
+               goto out;
 
-       pagebuf_dataio_workqueue = create_workqueue("xfsdatad");
-       if (!pagebuf_dataio_workqueue) {
-               destroy_workqueue(pagebuf_logio_workqueue);
-               return -ENOMEM;
-       }
+       xfsdatad_workqueue = create_workqueue("xfsdatad");
+       if (!xfsdatad_workqueue)
+               goto out_destroy_xfslogd_workqueue;
 
-       rval = kernel_thread(pagebuf_daemon, NULL, CLONE_FS|CLONE_FILES);
-       if (rval < 0) {
-               destroy_workqueue(pagebuf_logio_workqueue);
-               destroy_workqueue(pagebuf_dataio_workqueue);
-       }
+       error = kernel_thread(xfsbufd, NULL, CLONE_FS|CLONE_FILES);
+       if (error < 0)
+               goto out_destroy_xfsdatad_workqueue;
+       return 0;
 
-       return rval;
+ out_destroy_xfsdatad_workqueue:
+       destroy_workqueue(xfsdatad_workqueue);
+ out_destroy_xfslogd_workqueue:
+       destroy_workqueue(xfslogd_workqueue);
+ out:
+       return error;
 }
 
 /*
- * pagebuf_daemon_stop
- *
  * Note: do not mark as __exit, it is called from pagebuf_terminate.
  */
 STATIC void
-pagebuf_daemon_stop(void)
+xfs_buf_daemons_stop(void)
 {
-       pagebuf_daemon_active = 0;
+       xfsbufd_active = 0;
        barrier();
-       wait_for_completion(&pagebuf_daemon_done);
+       wait_for_completion(&xfsbufd_done);
 
-       destroy_workqueue(pagebuf_logio_workqueue);
-       destroy_workqueue(pagebuf_dataio_workqueue);
+       destroy_workqueue(xfslogd_workqueue);
+       destroy_workqueue(xfsdatad_workqueue);
 }
 
 /*
@@ -1944,27 +1935,37 @@ pagebuf_daemon_stop(void)
 int __init
 pagebuf_init(void)
 {
-       pagebuf_cache = kmem_cache_create("xfs_buf_t", sizeof(xfs_buf_t), 0,
-                       SLAB_HWCACHE_ALIGN, NULL, NULL);
-       if (pagebuf_cache == NULL) {
-               printk("XFS: couldn't init xfs_buf_t cache\n");
-               pagebuf_terminate();
-               return -ENOMEM;
-       }
+       int             error = -ENOMEM;
+
+       pagebuf_zone = kmem_zone_init(sizeof(xfs_buf_t), "xfs_buf");
+       if (!pagebuf_zone)
+               goto out;
 
 #ifdef PAGEBUF_TRACE
        pagebuf_trace_buf = ktrace_alloc(PAGEBUF_TRACE_SIZE, KM_SLEEP);
 #endif
 
-       pagebuf_daemon_start();
+       error = xfs_buf_daemons_start();
+       if (error)
+               goto out_free_buf_zone;
 
-       pagebuf_shake = kmem_shake_register(pagebuf_daemon_wakeup);
-       if (pagebuf_shake == NULL) {
-               pagebuf_terminate();
-               return -ENOMEM;
+       pagebuf_shake = kmem_shake_register(xfsbufd_wakeup);
+       if (!pagebuf_shake) {
+               error = -ENOMEM;
+               goto out_stop_daemons;
        }
 
        return 0;
+
+ out_stop_daemons:
+       xfs_buf_daemons_stop();
+ out_free_buf_zone:
+#ifdef PAGEBUF_TRACE
+       ktrace_free(pagebuf_trace_buf);
+#endif
+       kmem_zone_destroy(pagebuf_zone);
+ out:
+       return error;
 }
 
 
@@ -1976,12 +1977,12 @@ pagebuf_init(void)
 void
 pagebuf_terminate(void)
 {
-       pagebuf_daemon_stop();
+       xfs_buf_daemons_stop();
 
 #ifdef PAGEBUF_TRACE
        ktrace_free(pagebuf_trace_buf);
 #endif
 
-       kmem_zone_destroy(pagebuf_cache);
+       kmem_zone_destroy(pagebuf_zone);
        kmem_shake_deregister(pagebuf_shake);
 }
index 74deed8e6d9056d3b4faf01bd668c884c0a3f31e..3f8f69a66aeaba714b75a03a50c63b0fc6b59097 100644 (file)
@@ -576,7 +576,6 @@ extern xfs_buftarg_t *xfs_alloc_buftarg(struct block_device *, int);
 extern void xfs_free_buftarg(xfs_buftarg_t *, int);
 extern void xfs_wait_buftarg(xfs_buftarg_t *);
 extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int);
-extern void xfs_incore_relse(xfs_buftarg_t *, int, int);
 extern int xfs_flush_buftarg(xfs_buftarg_t *, int);
 
 #define xfs_getsize_buftarg(buftarg) \
index d0d412afd2617e7d1799bfa86d313833194e3c9b..f1ce4323f56e905c499e3889734d878d82c7b566 100644 (file)
@@ -57,7 +57,9 @@
 #include <linux/smp_lock.h>
 
 static struct vm_operations_struct linvfs_file_vm_ops;
-
+#ifdef CONFIG_XFS_DMAPI
+static struct vm_operations_struct linvfs_dmapi_file_vm_ops;
+#endif
 
 STATIC inline ssize_t
 __linvfs_read(
@@ -388,6 +390,14 @@ done:
        return -error;
 }
 
+#ifdef CONFIG_XFS_DMAPI
+STATIC void
+linvfs_mmap_close(
+       struct vm_area_struct   *vma)
+{
+       xfs_dm_mm_put(vma);
+}
+#endif /* CONFIG_XFS_DMAPI */
 
 STATIC int
 linvfs_file_mmap(
@@ -399,16 +409,19 @@ linvfs_file_mmap(
        vattr_t         va = { .va_mask = XFS_AT_UPDATIME };
        int             error;
 
+       vma->vm_ops = &linvfs_file_vm_ops;
+
        if (vp->v_vfsp->vfs_flag & VFS_DMI) {
                xfs_mount_t     *mp = XFS_VFSTOM(vp->v_vfsp);
 
                error = -XFS_SEND_MMAP(mp, vma, 0);
                if (error)
                        return error;
+#ifdef CONFIG_XFS_DMAPI
+               vma->vm_ops = &linvfs_dmapi_file_vm_ops;
+#endif
        }
 
-       vma->vm_ops = &linvfs_file_vm_ops;
-
        VOP_SETATTR(vp, &va, XFS_AT_UPDATIME, NULL, error);
        if (!error)
                vn_revalidate(vp);      /* update Linux inode flags */
@@ -565,7 +578,7 @@ struct file_operations linvfs_file_operations = {
        .sendfile       = linvfs_sendfile,
        .unlocked_ioctl = linvfs_ioctl,
 #ifdef CONFIG_COMPAT
-       .compat_ioctl   = xfs_compat_ioctl,
+       .compat_ioctl   = linvfs_compat_ioctl,
 #endif
        .mmap           = linvfs_file_mmap,
        .open           = linvfs_open,
@@ -587,7 +600,7 @@ struct file_operations linvfs_invis_file_operations = {
        .sendfile       = linvfs_sendfile,
        .unlocked_ioctl = linvfs_ioctl_invis,
 #ifdef CONFIG_COMPAT
-       .compat_ioctl   = xfs_compat_invis_ioctl,
+       .compat_ioctl   = linvfs_compat_invis_ioctl,
 #endif
        .mmap           = linvfs_file_mmap,
        .open           = linvfs_open,
@@ -600,13 +613,24 @@ struct file_operations linvfs_dir_operations = {
        .read           = generic_read_dir,
        .readdir        = linvfs_readdir,
        .unlocked_ioctl = linvfs_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = linvfs_compat_ioctl,
+#endif
        .fsync          = linvfs_fsync,
 };
 
 static struct vm_operations_struct linvfs_file_vm_ops = {
        .nopage         = filemap_nopage,
        .populate       = filemap_populate,
+};
+
+#ifdef CONFIG_XFS_DMAPI
+static struct vm_operations_struct linvfs_dmapi_file_vm_ops = {
+       .close          = linvfs_mmap_close,
+       .nopage         = filemap_nopage,
+       .populate       = filemap_populate,
 #ifdef HAVE_VMOP_MPROTECT
        .mprotect       = linvfs_mprotect,
 #endif
 };
+#endif /* CONFIG_XFS_DMAPI */
index 69809eef8a54b0999489ff3ef250c996596a32dc..05a447e51cc023c4d19f2aa4dd275d4b59d87db6 100644 (file)
@@ -1174,7 +1174,8 @@ xfs_ioc_xattr(
 
        switch (cmd) {
        case XFS_IOC_FSGETXATTR: {
-               va.va_mask = XFS_AT_XFLAGS|XFS_AT_EXTSIZE|XFS_AT_NEXTENTS;
+               va.va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE | \
+                            XFS_AT_NEXTENTS | XFS_AT_PROJID;
                VOP_GETATTR(vp, &va, 0, NULL, error);
                if (error)
                        return -error;
@@ -1182,6 +1183,7 @@ xfs_ioc_xattr(
                fa.fsx_xflags   = va.va_xflags;
                fa.fsx_extsize  = va.va_extsize;
                fa.fsx_nextents = va.va_nextents;
+               fa.fsx_projid   = va.va_projid;
 
                if (copy_to_user(arg, &fa, sizeof(fa)))
                        return -XFS_ERROR(EFAULT);
@@ -1196,9 +1198,10 @@ xfs_ioc_xattr(
                if (filp->f_flags & (O_NDELAY|O_NONBLOCK))
                        attr_flags |= ATTR_NONBLOCK;
 
-               va.va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE;
+               va.va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE | XFS_AT_PROJID;
                va.va_xflags  = fa.fsx_xflags;
                va.va_extsize = fa.fsx_extsize;
+               va.va_projid  = fa.fsx_projid;
 
                VOP_SETATTR(vp, &va, attr_flags, NULL, error);
                if (!error)
@@ -1207,7 +1210,8 @@ xfs_ioc_xattr(
        }
 
        case XFS_IOC_FSGETXATTRA: {
-               va.va_mask = XFS_AT_XFLAGS|XFS_AT_EXTSIZE|XFS_AT_ANEXTENTS;
+               va.va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE | \
+                            XFS_AT_ANEXTENTS | XFS_AT_PROJID;
                VOP_GETATTR(vp, &va, 0, NULL, error);
                if (error)
                        return -error;
@@ -1215,6 +1219,7 @@ xfs_ioc_xattr(
                fa.fsx_xflags   = va.va_xflags;
                fa.fsx_extsize  = va.va_extsize;
                fa.fsx_nextents = va.va_anextents;
+               fa.fsx_projid   = va.va_projid;
 
                if (copy_to_user(arg, &fa, sizeof(fa)))
                        return -XFS_ERROR(EFAULT);
index 7a12c83184f57a35093b301e84a0ae61233db38c..0f8f1384eb36a88a20e0e89e34f884436b8063b2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 2004-2005 Silicon Graphics, Inc.  All Rights Reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -58,8 +58,9 @@ typedef struct xfs_fsop_bulkreq32 {
        __s32           ocount;         /* output count pointer         */
 } xfs_fsop_bulkreq32_t;
 
-static unsigned long
-xfs_ioctl32_bulkstat(unsigned long arg)
+STATIC unsigned long
+xfs_ioctl32_bulkstat(
+       unsigned long           arg)
 {
        xfs_fsop_bulkreq32_t    __user *p32 = (void __user *)arg;
        xfs_fsop_bulkreq_t      __user *p = compat_alloc_user_space(sizeof(*p));
@@ -78,11 +79,11 @@ xfs_ioctl32_bulkstat(unsigned long arg)
 }
 #endif
 
-static long
-__xfs_compat_ioctl(int mode, struct file *f, unsigned cmd, unsigned long arg)
+STATIC long
+__linvfs_compat_ioctl(int mode, struct file *f, unsigned cmd, unsigned long arg)
 {
        int             error;
-       struct inode *inode = f->f_dentry->d_inode;
+       struct          inode *inode = f->f_dentry->d_inode;
        vnode_t         *vp = LINVFS_GET_VP(inode);
 
        switch (cmd) {
@@ -152,12 +153,20 @@ __xfs_compat_ioctl(int mode, struct file *f, unsigned cmd, unsigned long arg)
        return error;
 }
 
-long xfs_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg)
+long
+linvfs_compat_ioctl(
+       struct file             *f,
+       unsigned                cmd,
+       unsigned long           arg)
 {
-       return __xfs_compat_ioctl(0, f, cmd, arg);
+       return __linvfs_compat_ioctl(0, f, cmd, arg);
 }
 
-long xfs_compat_invis_ioctl(struct file *f, unsigned cmd, unsigned long arg)
+long
+linvfs_compat_invis_ioctl(
+       struct file             *f,
+       unsigned                cmd,
+       unsigned long           arg)
 {
-       return __xfs_compat_ioctl(IO_INVIS, f, cmd, arg);
+       return __linvfs_compat_ioctl(IO_INVIS, f, cmd, arg);
 }
index 779f69a4811656a0f34b85a01192573ff0f8d4ed..c874793a1dc9567a6f5237bc4126bdfbbe36f1fd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 2004-2005 Silicon Graphics, Inc.  All Rights Reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -30,5 +30,5 @@
  * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
  */
 
-long xfs_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg);
-long xfs_compat_invis_ioctl(struct file *f, unsigned cmd, unsigned long arg);
+long linvfs_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg);
+long linvfs_compat_invis_ioctl(struct file *f, unsigned cmd, unsigned long arg);
index 71bb41019a12c16c9bf2ee4e879842e9d21f7320..42dc5e4662ed9f950506ba25fd7d1ead729251dc 100644 (file)
@@ -145,10 +145,10 @@ static inline void set_buffer_unwritten_io(struct buffer_head *bh)
 #define xfs_inherit_nosymlinks xfs_params.inherit_nosym.val
 #define xfs_rotorstep          xfs_params.rotorstep.val
 
-#ifndef __smp_processor_id
-#define __smp_processor_id()   smp_processor_id()
+#ifndef raw_smp_processor_id
+#define raw_smp_processor_id() smp_processor_id()
 #endif
-#define current_cpu()          __smp_processor_id()
+#define current_cpu()          raw_smp_processor_id()
 #define current_pid()          (current->pid)
 #define current_fsuid(cred)    (current->fsuid)
 #define current_fsgid(cred)    (current->fsgid)
@@ -230,8 +230,10 @@ static inline void set_buffer_unwritten_io(struct buffer_head *bh)
  * field (see the QCMD macro in quota.h).  These macros help keep the
  * code portable - they are not visible from the syscall interface.
  */
-#define Q_XSETGQLIM    XQM_CMD(0x8)    /* set groups disk limits */
-#define Q_XGETGQUOTA   XQM_CMD(0x9)    /* get groups disk limits */
+#define Q_XSETGQLIM    XQM_CMD(8)      /* set groups disk limits */
+#define Q_XGETGQUOTA   XQM_CMD(9)      /* get groups disk limits */
+#define Q_XSETPQLIM    XQM_CMD(10)     /* set projects disk limits */
+#define Q_XGETPQUOTA   XQM_CMD(11)     /* get projects disk limits */
 
 /* IRIX uses a dynamic sizing algorithm (ndquot = 200 + numprocs*2) */
 /* we may well need to fine-tune this if it ever becomes an issue.  */
index aa9daaea6c34b2d98697b899e73ee10e4222e1bb..acab58c48043bd77c471c724090fbfe0156b120b 100644 (file)
@@ -209,30 +209,6 @@ unlock:
        return (-status);
 }
 
-/*
- * xfs_inval_cached_pages
- * 
- * This routine is responsible for keeping direct I/O and buffered I/O
- * somewhat coherent.  From here we make sure that we're at least
- * temporarily holding the inode I/O lock exclusively and then call
- * the page cache to flush and invalidate any cached pages.  If there
- * are no cached pages this routine will be very quick.
- */
-void
-xfs_inval_cached_pages(
-       vnode_t         *vp,
-       xfs_iocore_t    *io,
-       xfs_off_t       offset,
-       int             write,
-       int             relock)
-{
-       if (VN_CACHED(vp)) {
-               xfs_inval_cached_trace(io, offset, -1, ctooff(offtoct(offset)), -1);
-               VOP_FLUSHINVAL_PAGES(vp, ctooff(offtoct(offset)), -1, FI_REMAPF_LOCKED);
-       }
-
-}
-
 ssize_t                        /* bytes read, or (-)  error */
 xfs_read(
        bhv_desc_t              *bdp,
@@ -304,10 +280,11 @@ xfs_read(
        if (DM_EVENT_ENABLED(vp->v_vfsp, ip, DM_EVENT_READ) &&
            !(ioflags & IO_INVIS)) {
                vrwlock_t locktype = VRWLOCK_READ;
+               int dmflags = FILP_DELAY_FLAG(file) | DM_SEM_FLAG_RD(ioflags);
 
                ret = -XFS_SEND_DATA(mp, DM_EVENT_READ,
                                        BHV_TO_VNODE(bdp), *offset, size,
-                                       FILP_DELAY_FLAG(file), &locktype);
+                                       dmflags, &locktype);
                if (ret) {
                        xfs_iunlock(ip, XFS_IOLOCK_SHARED);
                        goto unlock_isem;
@@ -867,11 +844,15 @@ retry:
            !(ioflags & IO_INVIS)) {
 
                xfs_rwunlock(bdp, locktype);
+               if (need_isem)
+                       up(&inode->i_sem);
                error = XFS_SEND_NAMESP(xip->i_mount, DM_EVENT_NOSPACE, vp,
                                DM_RIGHT_NULL, vp, DM_RIGHT_NULL, NULL, NULL,
                                0, 0, 0); /* Delay flag intentionally  unused */
                if (error)
-                       goto out_unlock_isem;
+                       goto out_nounlocks;
+               if (need_isem)
+                       down(&inode->i_sem);
                xfs_rwlock(bdp, locktype);
                pos = xip->i_d.di_size;
                ret = 0;
@@ -986,6 +967,7 @@ retry:
  out_unlock_isem:
        if (need_isem)
                up(&inode->i_sem);
+ out_nounlocks:
        return -error;
 }
 
index d723e35254a0b977b169e2bf65b6de34e27599b5..f197a720e394db5b1bca538a3f826882cc3b7f46 100644 (file)
@@ -94,8 +94,6 @@ extern int xfs_bdstrat_cb(struct xfs_buf *);
 
 extern int xfs_zero_eof(struct vnode *, struct xfs_iocore *, xfs_off_t,
                                xfs_fsize_t, xfs_fsize_t);
-extern void xfs_inval_cached_pages(struct vnode        *, struct xfs_iocore *,
-                               xfs_off_t, int, int);
 extern ssize_t xfs_read(struct bhv_desc *, struct kiocb *,
                                const struct iovec *, unsigned int,
                                loff_t *, int, struct cred *);
index 53dc658cafa638976c4398f240aa035663fb7d67..5fe9af38aa2063ac56c23ef7faa39a539b4161d1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2004 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 2000-2005 Silicon Graphics, Inc.  All Rights Reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -66,7 +66,6 @@
 #include "xfs_buf_item.h"
 #include "xfs_utils.h"
 #include "xfs_version.h"
-#include "xfs_ioctl32.h"
 
 #include <linux/namei.h>
 #include <linux/init.h>
@@ -591,8 +590,10 @@ linvfs_sync_super(
        int             error;
        int             flags = SYNC_FSDATA;
 
-       if (wait)
-               flags |= SYNC_WAIT;
+       if (unlikely(sb->s_frozen == SB_FREEZE_WRITE))
+               flags = SYNC_QUIESCE;
+       else
+               flags = SYNC_FSDATA | (wait ? SYNC_WAIT : 0);
 
        VFS_SYNC(vfsp, flags, NULL, error);
        sb->s_dirt = 0;
@@ -702,7 +703,8 @@ linvfs_getxquota(
        struct vfs              *vfsp = LINVFS_GET_VFS(sb);
        int                     error, getmode;
 
-       getmode = (type == GRPQUOTA) ? Q_XGETGQUOTA : Q_XGETQUOTA;
+       getmode = (type == USRQUOTA) ? Q_XGETQUOTA :
+                ((type == GRPQUOTA) ? Q_XGETGQUOTA : Q_XGETPQUOTA);
        VFS_QUOTACTL(vfsp, getmode, id, (caddr_t)fdq, error);
        return -error;
 }
@@ -717,7 +719,8 @@ linvfs_setxquota(
        struct vfs              *vfsp = LINVFS_GET_VFS(sb);
        int                     error, setmode;
 
-       setmode = (type == GRPQUOTA) ? Q_XSETGQLIM : Q_XSETQLIM;
+       setmode = (type == USRQUOTA) ? Q_XSETQLIM :
+                ((type == GRPQUOTA) ? Q_XSETGQLIM : Q_XSETPQLIM);
        VFS_QUOTACTL(vfsp, setmode, id, (caddr_t)fdq, error);
        return -error;
 }
index 76493991578ffe30f039094f640f0578a50ac23d..7ee1f714e9babfcefe02864f9a785fcb4ab52973 100644 (file)
@@ -107,6 +107,7 @@ typedef enum {
 #define SYNC_FSDATA            0x0020  /* flush fs data (e.g. superblocks) */
 #define SYNC_REFCACHE          0x0040  /* prune some of the nfs ref cache */
 #define SYNC_REMOUNT           0x0080  /* remount readonly, no dummy LRs */
+#define SYNC_QUIESCE           0x0100  /* quiesce fileystem for a snapshot */
 
 typedef int    (*vfs_mount_t)(bhv_desc_t *,
                                struct xfs_mount_args *, struct cred *);
index a832d165f24ff6d7e84fded59529439f1a16cfb0..250cad54e8920e4226f3fab93c05b4b3afb44a0d 100644 (file)
@@ -411,13 +411,13 @@ vn_remove(
 /*  0 */               (void *)(__psint_t)(vk),                \
 /*  1 */               (void *)(s),                            \
 /*  2 */               (void *)(__psint_t) line,               \
-/*  3 */               (void *)(vn_count(vp)), \
+/*  3 */               (void *)(__psint_t)(vn_count(vp)),      \
 /*  4 */               (void *)(ra),                           \
 /*  5 */               (void *)(__psunsigned_t)(vp)->v_flag,   \
 /*  6 */               (void *)(__psint_t)current_cpu(),       \
 /*  7 */               (void *)(__psint_t)current_pid(),       \
 /*  8 */               (void *)__return_address,               \
-/*  9 */               0, 0, 0, 0, 0, 0, 0)
+/*  9 */               NULL, NULL, NULL, NULL, NULL, NULL, NULL)
 
 /*
  * Vnode tracing code.
index 00466c3194acc29f194adba50c1eb0e7b2ebebc0..a6e57c647be4f3ae7a9ada8f6508e13967f94c17 100644 (file)
@@ -426,7 +426,7 @@ typedef struct vattr {
        u_long          va_extsize;     /* file extent size */
        u_long          va_nextents;    /* number of extents in file */
        u_long          va_anextents;   /* number of attr extents in file */
-       int             va_projid;      /* project id */
+       prid_t          va_projid;      /* project id */
 } vattr_t;
 
 /*
index 740d20d331874cee3bec1c0d2257f08629747acb..46ce1e3ce1d6c04c90b93ec46d86d2e4f64651fc 100644 (file)
@@ -101,7 +101,7 @@ int xfs_dqerror_mod = 33;
  * is the d_id field. The idea is to fill in the entire q_core
  * when we read in the on disk dquot.
  */
-xfs_dquot_t *
+STATIC xfs_dquot_t *
 xfs_qm_dqinit(
        xfs_mount_t  *mp,
        xfs_dqid_t   id,
@@ -286,7 +286,9 @@ xfs_qm_adjust_dqlimits(
  * We also return 0 as the values of the timers in Q_GETQUOTA calls, when
  * enforcement's off.
  * In contrast, warnings are a little different in that they don't
- * 'automatically' get started when limits get exceeded.
+ * 'automatically' get started when limits get exceeded.  They do
+ * get reset to zero, however, when we find the count to be under
+ * the soft limit (they are only ever set non-zero via userspace).
  */
 void
 xfs_qm_adjust_dqtimers(
@@ -315,6 +317,8 @@ xfs_qm_adjust_dqtimers(
                                INT_GET(d->d_blk_hardlimit, ARCH_CONVERT)))) {
                        INT_SET(d->d_btimer, ARCH_CONVERT,
                                get_seconds() + XFS_QI_BTIMELIMIT(mp));
+               } else {
+                       d->d_bwarns = 0;
                }
        } else {
                if ((!d->d_blk_softlimit ||
@@ -336,6 +340,8 @@ xfs_qm_adjust_dqtimers(
                                INT_GET(d->d_ino_hardlimit, ARCH_CONVERT)))) {
                        INT_SET(d->d_itimer, ARCH_CONVERT,
                                get_seconds() + XFS_QI_ITIMELIMIT(mp));
+               } else {
+                       d->d_iwarns = 0;
                }
        } else {
                if ((!d->d_ino_softlimit ||
@@ -357,6 +363,8 @@ xfs_qm_adjust_dqtimers(
                                INT_GET(d->d_rtb_hardlimit, ARCH_CONVERT)))) {
                        INT_SET(d->d_rtbtimer, ARCH_CONVERT,
                                get_seconds() + XFS_QI_RTBTIMELIMIT(mp));
+               } else {
+                       d->d_rtbwarns = 0;
                }
        } else {
                if ((!d->d_rtb_softlimit ||
@@ -370,68 +378,6 @@ xfs_qm_adjust_dqtimers(
        }
 }
 
-/*
- * Increment or reset warnings of a given dquot.
- */
-int
-xfs_qm_dqwarn(
-       xfs_disk_dquot_t        *d,
-       uint                    flags)
-{
-       int     warned;
-
-       /*
-        * root's limits are not real limits.
-        */
-       if (!d->d_id)
-               return (0);
-
-       warned = 0;
-       if (INT_GET(d->d_blk_softlimit, ARCH_CONVERT) &&
-           (INT_GET(d->d_bcount, ARCH_CONVERT) >=
-            INT_GET(d->d_blk_softlimit, ARCH_CONVERT))) {
-               if (flags & XFS_QMOPT_DOWARN) {
-                       INT_MOD(d->d_bwarns, ARCH_CONVERT, +1);
-                       warned++;
-               }
-       } else {
-               if (!d->d_blk_softlimit ||
-                   (INT_GET(d->d_bcount, ARCH_CONVERT) <
-                    INT_GET(d->d_blk_softlimit, ARCH_CONVERT))) {
-                       d->d_bwarns = 0;
-               }
-       }
-
-       if (INT_GET(d->d_ino_softlimit, ARCH_CONVERT) > 0 &&
-           (INT_GET(d->d_icount, ARCH_CONVERT) >=
-            INT_GET(d->d_ino_softlimit, ARCH_CONVERT))) {
-               if (flags & XFS_QMOPT_DOWARN) {
-                       INT_MOD(d->d_iwarns, ARCH_CONVERT, +1);
-                       warned++;
-               }
-       } else {
-               if (!d->d_ino_softlimit ||
-                   (INT_GET(d->d_icount, ARCH_CONVERT) <
-                    INT_GET(d->d_ino_softlimit, ARCH_CONVERT))) {
-                       d->d_iwarns = 0;
-               }
-       }
-#ifdef QUOTADEBUG
-       if (INT_GET(d->d_iwarns, ARCH_CONVERT))
-               cmn_err(CE_DEBUG,
-                       "--------@@Inode warnings running : %Lu >= %Lu",
-                       INT_GET(d->d_icount, ARCH_CONVERT),
-                       INT_GET(d->d_ino_softlimit, ARCH_CONVERT));
-       if (INT_GET(d->d_bwarns, ARCH_CONVERT))
-               cmn_err(CE_DEBUG,
-                       "--------@@Blks warnings running : %Lu >= %Lu",
-                       INT_GET(d->d_bcount, ARCH_CONVERT),
-                       INT_GET(d->d_blk_softlimit, ARCH_CONVERT));
-#endif
-       return (warned);
-}
-
-
 /*
  * initialize a buffer full of dquots and log the whole thing
  */
@@ -461,9 +407,9 @@ xfs_qm_init_dquot_blk(
        for (i = 0; i < XFS_QM_DQPERBLK(mp); i++, d++, curid++)
                xfs_qm_dqinit_core(curid, type, d);
        xfs_trans_dquot_buf(tp, bp,
-                           type & XFS_DQ_USER ?
-                           XFS_BLI_UDQUOT_BUF :
-                           XFS_BLI_GDQUOT_BUF);
+                           (type & XFS_DQ_USER ? XFS_BLI_UDQUOT_BUF :
+                           ((type & XFS_DQ_PROJ) ? XFS_BLI_PDQUOT_BUF :
+                            XFS_BLI_GDQUOT_BUF)));
        xfs_trans_log_buf(tp, bp, 0, BBTOB(XFS_QI_DQCHUNKLEN(mp)) - 1);
 }
 
@@ -544,8 +490,7 @@ xfs_qm_dqalloc(
         * the entire thing.
         */
        xfs_qm_init_dquot_blk(tp, mp, INT_GET(dqp->q_core.d_id, ARCH_CONVERT),
-                             dqp->dq_flags & (XFS_DQ_USER|XFS_DQ_GROUP),
-                             bp);
+                             dqp->dq_flags & XFS_DQ_ALLTYPES, bp);
 
        if ((error = xfs_bmap_finish(&tp, &flist, firstblock, &committed))) {
                goto error1;
@@ -675,8 +620,7 @@ xfs_qm_dqtobp(
        /*
         * A simple sanity check in case we got a corrupted dquot...
         */
-       if (xfs_qm_dqcheck(ddq, id,
-                          dqp->dq_flags & (XFS_DQ_USER|XFS_DQ_GROUP),
+       if (xfs_qm_dqcheck(ddq, id, dqp->dq_flags & XFS_DQ_ALLTYPES,
                           flags & (XFS_QMOPT_DQREPAIR|XFS_QMOPT_DOWARN),
                           "dqtobp")) {
                if (!(flags & XFS_QMOPT_DQREPAIR)) {
@@ -953,8 +897,8 @@ int
 xfs_qm_dqget(
        xfs_mount_t     *mp,
        xfs_inode_t     *ip,      /* locked inode (optional) */
-       xfs_dqid_t      id,       /* gid or uid, depending on type */
-       uint            type,     /* UDQUOT or GDQUOT */
+       xfs_dqid_t      id,       /* uid/projid/gid depending on type */
+       uint            type,     /* XFS_DQ_USER/XFS_DQ_PROJ/XFS_DQ_GROUP */
        uint            flags,    /* DQALLOC, DQSUSER, DQREPAIR, DOWARN */
        xfs_dquot_t     **O_dqpp) /* OUT : locked incore dquot */
 {
@@ -965,6 +909,7 @@ xfs_qm_dqget(
 
        ASSERT(XFS_IS_QUOTA_RUNNING(mp));
        if ((! XFS_IS_UQUOTA_ON(mp) && type == XFS_DQ_USER) ||
+           (! XFS_IS_PQUOTA_ON(mp) && type == XFS_DQ_PROJ) ||
            (! XFS_IS_GQUOTA_ON(mp) && type == XFS_DQ_GROUP)) {
                return (ESRCH);
        }
@@ -983,7 +928,9 @@ xfs_qm_dqget(
  again:
 
 #ifdef DEBUG
-       ASSERT(type == XFS_DQ_USER || type == XFS_DQ_GROUP);
+       ASSERT(type == XFS_DQ_USER ||
+              type == XFS_DQ_PROJ ||
+              type == XFS_DQ_GROUP);
        if (ip) {
                ASSERT(XFS_ISLOCKED_INODE_EXCL(ip));
                if (type == XFS_DQ_USER)
@@ -1306,8 +1253,8 @@ xfs_qm_dqflush(
                return (error);
        }
 
-       if (xfs_qm_dqcheck(&dqp->q_core, INT_GET(ddqp->d_id, ARCH_CONVERT), 0, XFS_QMOPT_DOWARN,
-                          "dqflush (incore copy)")) {
+       if (xfs_qm_dqcheck(&dqp->q_core, INT_GET(ddqp->d_id, ARCH_CONVERT),
+                          0, XFS_QMOPT_DOWARN, "dqflush (incore copy)")) {
                xfs_force_shutdown(dqp->q_mount, XFS_CORRUPT_INCORE);
                return XFS_ERROR(EIO);
        }
@@ -1459,7 +1406,8 @@ xfs_dqlock2(
 {
        if (d1 && d2) {
                ASSERT(d1 != d2);
-               if (INT_GET(d1->q_core.d_id, ARCH_CONVERT) > INT_GET(d2->q_core.d_id, ARCH_CONVERT)) {
+               if (INT_GET(d1->q_core.d_id, ARCH_CONVERT) >
+                   INT_GET(d2->q_core.d_id, ARCH_CONVERT)) {
                        xfs_dqlock(d2);
                        xfs_dqlock(d1);
                } else {
@@ -1582,8 +1530,7 @@ xfs_qm_dqprint(xfs_dquot_t *dqp)
        cmn_err(CE_DEBUG, "-----------KERNEL DQUOT----------------");
        cmn_err(CE_DEBUG, "---- dquotID =  %d",
                (int)INT_GET(dqp->q_core.d_id, ARCH_CONVERT));
-       cmn_err(CE_DEBUG, "---- type    =  %s",
-               XFS_QM_ISUDQ(dqp) ? "USR" : "GRP");
+       cmn_err(CE_DEBUG, "---- type    =  %s", DQFLAGTO_TYPESTR(dqp));
        cmn_err(CE_DEBUG, "---- fs      =  0x%p", dqp->q_mount);
        cmn_err(CE_DEBUG, "---- blkno   =  0x%x", (int) dqp->q_blkno);
        cmn_err(CE_DEBUG, "---- boffset =  0x%x", (int) dqp->q_bufoffset);
index 0c3fe3175baa4a125c83dfaa3a3e3b6fc3de9d50..39175103c8e0ca5ec2c81a859d5dc846aa6dab0e 100644 (file)
@@ -114,25 +114,18 @@ typedef struct xfs_dquot {
 #define XFS_DQHOLD(dqp)                ((dqp)->q_nrefs++)
 
 /*
- * Quota Accounting flags
+ * Quota Accounting/Enforcement flags
  */
-#define XFS_ALL_QUOTA_ACCT     (XFS_UQUOTA_ACCT | XFS_GQUOTA_ACCT)
-#define XFS_ALL_QUOTA_ENFD     (XFS_UQUOTA_ENFD | XFS_GQUOTA_ENFD)
-#define XFS_ALL_QUOTA_CHKD     (XFS_UQUOTA_CHKD | XFS_GQUOTA_CHKD)
-#define XFS_ALL_QUOTA_ACTV     (XFS_UQUOTA_ACTIVE | XFS_GQUOTA_ACTIVE)
-#define XFS_ALL_QUOTA_ACCT_ENFD (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\
-                                XFS_GQUOTA_ACCT|XFS_GQUOTA_ENFD)
+#define XFS_ALL_QUOTA_ACCT     \
+               (XFS_UQUOTA_ACCT | XFS_GQUOTA_ACCT | XFS_PQUOTA_ACCT)
+#define XFS_ALL_QUOTA_ENFD     (XFS_UQUOTA_ENFD | XFS_OQUOTA_ENFD)
+#define XFS_ALL_QUOTA_CHKD     (XFS_UQUOTA_CHKD | XFS_OQUOTA_CHKD)
 
-#define XFS_IS_QUOTA_RUNNING(mp)  ((mp)->m_qflags & XFS_ALL_QUOTA_ACCT)
-#define XFS_IS_UQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_UQUOTA_ACCT)
-#define XFS_IS_GQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_GQUOTA_ACCT)
-
-/*
- * Quota Limit Enforcement flags
- */
+#define XFS_IS_QUOTA_RUNNING(mp)       ((mp)->m_qflags & XFS_ALL_QUOTA_ACCT)
 #define XFS_IS_QUOTA_ENFORCED(mp)      ((mp)->m_qflags & XFS_ALL_QUOTA_ENFD)
-#define XFS_IS_UQUOTA_ENFORCED(mp)     ((mp)->m_qflags & XFS_UQUOTA_ENFD)
-#define XFS_IS_GQUOTA_ENFORCED(mp)     ((mp)->m_qflags & XFS_GQUOTA_ENFD)
+#define XFS_IS_UQUOTA_RUNNING(mp)      ((mp)->m_qflags & XFS_UQUOTA_ACCT)
+#define XFS_IS_PQUOTA_RUNNING(mp)      ((mp)->m_qflags & XFS_PQUOTA_ACCT)
+#define XFS_IS_GQUOTA_RUNNING(mp)      ((mp)->m_qflags & XFS_GQUOTA_ACCT)
 
 #ifdef DEBUG
 static inline int
@@ -167,6 +160,8 @@ XFS_DQ_IS_LOCKED(xfs_dquot_t *dqp)
 #define XFS_DQ_IS_ON_FREELIST(dqp)  ((dqp)->dq_flnext != (dqp))
 #define XFS_DQ_IS_DIRTY(dqp)   ((dqp)->dq_flags & XFS_DQ_DIRTY)
 #define XFS_QM_ISUDQ(dqp)      ((dqp)->dq_flags & XFS_DQ_USER)
+#define XFS_QM_ISPDQ(dqp)      ((dqp)->dq_flags & XFS_DQ_PROJ)
+#define XFS_QM_ISGDQ(dqp)      ((dqp)->dq_flags & XFS_DQ_GROUP)
 #define XFS_DQ_TO_QINF(dqp)    ((dqp)->q_mount->m_quotainfo)
 #define XFS_DQ_TO_QIP(dqp)     (XFS_QM_ISUDQ(dqp) ? \
                                 XFS_DQ_TO_QINF(dqp)->qi_uquotaip : \
@@ -174,7 +169,7 @@ XFS_DQ_IS_LOCKED(xfs_dquot_t *dqp)
 
 #define XFS_IS_THIS_QUOTA_OFF(d) (! (XFS_QM_ISUDQ(d) ? \
                                     (XFS_IS_UQUOTA_ON((d)->q_mount)) : \
-                                    (XFS_IS_GQUOTA_ON((d)->q_mount))))
+                                    (XFS_IS_OQUOTA_ON((d)->q_mount))))
 
 #ifdef XFS_DQUOT_TRACE
 /*
@@ -211,7 +206,6 @@ extern void         xfs_qm_adjust_dqtimers(xfs_mount_t *,
                                        xfs_disk_dquot_t *);
 extern void            xfs_qm_adjust_dqlimits(xfs_mount_t *,
                                        xfs_disk_dquot_t *);
-extern int             xfs_qm_dqwarn(xfs_disk_dquot_t *, uint);
 extern int             xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *,
                                        xfs_dqid_t, uint, uint, xfs_dquot_t **);
 extern void            xfs_qm_dqput(xfs_dquot_t *);
index a5425ee6e7bd534b0444456dedbfb79f550065f4..f5271b7b1e84196c2d1202cc4c630747b9f54183 100644 (file)
@@ -428,7 +428,7 @@ xfs_qm_dquot_logitem_committing(
 /*
  * This is the ops vector for dquots
  */
-struct xfs_item_ops xfs_dquot_item_ops = {
+STATIC struct xfs_item_ops xfs_dquot_item_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_qm_dquot_logitem_format,
@@ -646,7 +646,7 @@ xfs_qm_qoffend_logitem_committing(xfs_qoff_logitem_t *qip, xfs_lsn_t commit_lsn)
        return;
 }
 
-struct xfs_item_ops xfs_qm_qoffend_logitem_ops = {
+STATIC struct xfs_item_ops xfs_qm_qoffend_logitem_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_qm_qoff_logitem_format,
@@ -669,7 +669,7 @@ struct xfs_item_ops xfs_qm_qoffend_logitem_ops = {
 /*
  * This is the ops vector shared by all quotaoff-start log items.
  */
-struct xfs_item_ops xfs_qm_qoff_logitem_ops = {
+STATIC struct xfs_item_ops xfs_qm_qoff_logitem_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_qm_qoff_logitem_format,
index 89f2cd656ebfd3969bd0a40af131d3d9c24f8c16..f665ca8f9e960c93c65d0cc31c244fded5f3e73a 100644 (file)
@@ -81,12 +81,18 @@ struct xfs_qm       *xfs_Gqm;
 
 kmem_zone_t    *qm_dqzone;
 kmem_zone_t    *qm_dqtrxzone;
-kmem_shaker_t  xfs_qm_shaker;
+STATIC kmem_shaker_t   xfs_qm_shaker;
 
 STATIC void    xfs_qm_list_init(xfs_dqlist_t *, char *, int);
 STATIC void    xfs_qm_list_destroy(xfs_dqlist_t *);
 
+STATIC void    xfs_qm_freelist_init(xfs_frlist_t *);
+STATIC void    xfs_qm_freelist_destroy(xfs_frlist_t *);
+STATIC int     xfs_qm_mplist_nowait(xfs_mount_t *);
+STATIC int     xfs_qm_dqhashlock_nowait(xfs_dquot_t *);
+
 STATIC int     xfs_qm_init_quotainos(xfs_mount_t *);
+STATIC int     xfs_qm_init_quotainfo(xfs_mount_t *);
 STATIC int     xfs_qm_shake(int, unsigned int);
 
 #ifdef DEBUG
@@ -184,7 +190,7 @@ xfs_Gqm_init(void)
 /*
  * Destroy the global quota manager when its reference count goes to zero.
  */
-void
+STATIC void
 xfs_qm_destroy(
        struct xfs_qm   *xqm)
 {
@@ -304,9 +310,9 @@ xfs_qm_mount_quotainit(
        uint            flags)
 {
        /*
-        * User or group quotas has to be on.
+        * User, projects or group quotas has to be on.
         */
-       ASSERT(flags & (XFSMNT_UQUOTA | XFSMNT_GQUOTA));
+       ASSERT(flags & (XFSMNT_UQUOTA | XFSMNT_PQUOTA | XFSMNT_GQUOTA));
 
        /*
         * Initialize the flags in the mount structure. From this point
@@ -324,7 +330,11 @@ xfs_qm_mount_quotainit(
        if (flags & XFSMNT_GQUOTA) {
                mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE);
                if (flags & XFSMNT_GQUOTAENF)
-                       mp->m_qflags |= XFS_GQUOTA_ENFD;
+                       mp->m_qflags |= XFS_OQUOTA_ENFD;
+       } else if (flags & XFSMNT_PQUOTA) {
+               mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE);
+               if (flags & XFSMNT_PQUOTAENF)
+                       mp->m_qflags |= XFS_OQUOTA_ENFD;
        }
 }
 
@@ -357,11 +367,11 @@ xfs_qm_mount_quotas(
 
        /*
         * If a file system had quotas running earlier, but decided to
-        * mount without -o quota/uquota/gquota options, revoke the
+        * mount without -o uquota/pquota/gquota options, revoke the
         * quotachecked license, and bail out.
         */
        if (! XFS_IS_QUOTA_ON(mp) &&
-           (mp->m_sb.sb_qflags & (XFS_UQUOTA_ACCT|XFS_GQUOTA_ACCT))) {
+           (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT)) {
                mp->m_qflags = 0;
                goto write_changes;
        }
@@ -509,7 +519,7 @@ out:
  * Flush all dquots of the given file system to disk. The dquots are
  * _not_ purged from memory here, just their data written to disk.
  */
-int
+STATIC int
 xfs_qm_dqflush_all(
        xfs_mount_t     *mp,
        int             flags)
@@ -613,7 +623,7 @@ xfs_qm_detach_gdquots(
 STATIC int
 xfs_qm_dqpurge_int(
        xfs_mount_t     *mp,
-       uint            flags) /* QUOTAOFF/UMOUNTING/UQUOTA/GQUOTA */
+       uint            flags) /* QUOTAOFF/UMOUNTING/UQUOTA/PQUOTA/GQUOTA */
 {
        xfs_dquot_t     *dqp;
        uint            dqtype;
@@ -625,6 +635,7 @@ xfs_qm_dqpurge_int(
                return (0);
 
        dqtype = (flags & XFS_QMOPT_UQUOTA) ? XFS_DQ_USER : 0;
+       dqtype |= (flags & XFS_QMOPT_PQUOTA) ? XFS_DQ_PROJ : 0;
        dqtype |= (flags & XFS_QMOPT_GQUOTA) ? XFS_DQ_GROUP : 0;
 
        xfs_qm_mplist_lock(mp);
@@ -734,11 +745,11 @@ xfs_qm_dqattach_one(
 
        /*
         * udqhint is the i_udquot field in inode, and is non-NULL only
-        * when the type arg is XFS_DQ_GROUP. Its purpose is to save a
+        * when the type arg is group/project. Its purpose is to save a
         * lookup by dqid (xfs_qm_dqget) by caching a group dquot inside
         * the user dquot.
         */
-       ASSERT(!udqhint || type == XFS_DQ_GROUP);
+       ASSERT(!udqhint || type == XFS_DQ_GROUP || type == XFS_DQ_PROJ);
        if (udqhint && !dolock)
                xfs_dqlock(udqhint);
 
@@ -897,8 +908,8 @@ xfs_qm_dqattach_grouphint(
 
 
 /*
- * Given a locked inode, attach dquot(s) to it, taking UQUOTAON / GQUOTAON
- * in to account.
+ * Given a locked inode, attach dquot(s) to it, taking U/G/P-QUOTAON
+ * into account.
  * If XFS_QMOPT_DQALLOC, the dquot(s) will be allocated if needed.
  * If XFS_QMOPT_DQLOCK, the dquot(s) will be returned locked. This option pretty
  * much made this code a complete mess, but it has been pretty useful.
@@ -937,8 +948,13 @@ xfs_qm_dqattach(
                nquotas++;
        }
        ASSERT(XFS_ISLOCKED_INODE_EXCL(ip));
-       if (XFS_IS_GQUOTA_ON(mp)) {
-               error = xfs_qm_dqattach_one(ip, ip->i_d.di_gid, XFS_DQ_GROUP,
+       if (XFS_IS_OQUOTA_ON(mp)) {
+               error = XFS_IS_GQUOTA_ON(mp) ?
+                       xfs_qm_dqattach_one(ip, ip->i_d.di_gid, XFS_DQ_GROUP,
+                                               flags & XFS_QMOPT_DQALLOC,
+                                               flags & XFS_QMOPT_DQLOCK,
+                                               ip->i_udquot, &ip->i_gdquot) :
+                       xfs_qm_dqattach_one(ip, ip->i_d.di_projid, XFS_DQ_PROJ,
                                                flags & XFS_QMOPT_DQALLOC,
                                                flags & XFS_QMOPT_DQLOCK,
                                                ip->i_udquot, &ip->i_gdquot);
@@ -989,7 +1005,7 @@ xfs_qm_dqattach(
                }
                if (XFS_IS_UQUOTA_ON(mp))
                        ASSERT(ip->i_udquot);
-               if (XFS_IS_GQUOTA_ON(mp))
+               if (XFS_IS_OQUOTA_ON(mp))
                        ASSERT(ip->i_gdquot);
        }
 #endif
@@ -1018,13 +1034,13 @@ xfs_qm_dqdetach(
 
        ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_uquotino);
        ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_gquotino);
-       if (ip->i_udquot)
-               xfs_dqtrace_entry_ino(ip->i_udquot, "DQDETTACH", ip);
        if (ip->i_udquot) {
+               xfs_dqtrace_entry_ino(ip->i_udquot, "DQDETTACH", ip);
                xfs_qm_dqrele(ip->i_udquot);
                ip->i_udquot = NULL;
        }
        if (ip->i_gdquot) {
+               xfs_dqtrace_entry_ino(ip->i_gdquot, "DQDETTACH", ip);
                xfs_qm_dqrele(ip->i_gdquot);
                ip->i_gdquot = NULL;
        }
@@ -1149,7 +1165,7 @@ xfs_qm_sync(
  * This initializes all the quota information that's kept in the
  * mount structure
  */
-int
+STATIC int
 xfs_qm_init_quotainfo(
        xfs_mount_t     *mp)
 {
@@ -1202,8 +1218,9 @@ xfs_qm_init_quotainfo(
         * and group quotas, at least not at this point.
         */
        error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)0,
-                            (XFS_IS_UQUOTA_RUNNING(mp)) ?
-                            XFS_DQ_USER : XFS_DQ_GROUP,
+                            XFS_IS_UQUOTA_RUNNING(mp) ? XFS_DQ_USER : 
+                            (XFS_IS_GQUOTA_RUNNING(mp) ? XFS_DQ_GROUP :
+                               XFS_DQ_PROJ),
                             XFS_QMOPT_DQSUSER|XFS_QMOPT_DOWARN,
                             &dqp);
        if (! error) {
@@ -1234,6 +1251,10 @@ xfs_qm_init_quotainfo(
                                INT_GET(ddqp->d_iwarns, ARCH_CONVERT) ?
                                INT_GET(ddqp->d_iwarns, ARCH_CONVERT) :
                                XFS_QM_IWARNLIMIT;
+               qinf->qi_rtbwarnlimit =
+                               INT_GET(ddqp->d_rtbwarns, ARCH_CONVERT) ?
+                               INT_GET(ddqp->d_rtbwarns, ARCH_CONVERT) :
+                               XFS_QM_RTBWARNLIMIT;
                qinf->qi_bhardlimit =
                                INT_GET(ddqp->d_blk_hardlimit, ARCH_CONVERT);
                qinf->qi_bsoftlimit =
@@ -1259,6 +1280,7 @@ xfs_qm_init_quotainfo(
                qinf->qi_rtbtimelimit = XFS_QM_RTBTIMELIMIT;
                qinf->qi_bwarnlimit = XFS_QM_BWARNLIMIT;
                qinf->qi_iwarnlimit = XFS_QM_IWARNLIMIT;
+               qinf->qi_rtbwarnlimit = XFS_QM_RTBWARNLIMIT;
        }
 
        return (0);
@@ -1366,13 +1388,20 @@ xfs_qm_dqget_noattach(
                ASSERT(udqp);
        }
 
-       if (XFS_IS_GQUOTA_ON(mp)) {
+       if (XFS_IS_OQUOTA_ON(mp)) {
                ASSERT(ip->i_gdquot == NULL);
                if (udqp)
                        xfs_dqunlock(udqp);
-               if ((error = xfs_qm_dqget(mp, ip, ip->i_d.di_gid, XFS_DQ_GROUP,
-                                        XFS_QMOPT_DQALLOC|XFS_QMOPT_DOWARN,
-                                        &gdqp))) {
+               error = XFS_IS_GQUOTA_ON(mp) ?
+                               xfs_qm_dqget(mp, ip,
+                                            ip->i_d.di_gid, XFS_DQ_GROUP,
+                                            XFS_QMOPT_DQALLOC|XFS_QMOPT_DOWARN,
+                                            &gdqp) :
+                               xfs_qm_dqget(mp, ip,
+                                            ip->i_d.di_projid, XFS_DQ_PROJ,
+                                            XFS_QMOPT_DQALLOC|XFS_QMOPT_DOWARN,
+                                            &gdqp);
+               if (error) {
                        if (udqp)
                                xfs_qm_dqrele(udqp);
                        ASSERT(error != ESRCH);
@@ -1521,8 +1550,10 @@ xfs_qm_reset_dqcounts(
                INT_SET(ddq->d_rtbcount, ARCH_CONVERT, 0ULL);
                INT_SET(ddq->d_btimer, ARCH_CONVERT, (time_t)0);
                INT_SET(ddq->d_itimer, ARCH_CONVERT, (time_t)0);
+               INT_SET(ddq->d_rtbtimer, ARCH_CONVERT, (time_t)0);
                INT_SET(ddq->d_bwarns, ARCH_CONVERT, 0UL);
                INT_SET(ddq->d_iwarns, ARCH_CONVERT, 0UL);
+               INT_SET(ddq->d_rtbwarns, ARCH_CONVERT, 0UL);
                ddq = (xfs_disk_dquot_t *) ((xfs_dqblk_t *)ddq + 1);
        }
 
@@ -1541,11 +1572,14 @@ xfs_qm_dqiter_bufs(
        int             error;
        int             notcommitted;
        int             incr;
+       int             type;
 
        ASSERT(blkcnt > 0);
        notcommitted = 0;
        incr = (blkcnt > XFS_QM_MAX_DQCLUSTER_LOGSZ) ?
                XFS_QM_MAX_DQCLUSTER_LOGSZ : blkcnt;
+       type = flags & XFS_QMOPT_UQUOTA ? XFS_DQ_USER :
+               (flags & XFS_QMOPT_PQUOTA ? XFS_DQ_PROJ : XFS_DQ_GROUP);
        error = 0;
 
        /*
@@ -1564,9 +1598,7 @@ xfs_qm_dqiter_bufs(
                if (error)
                        break;
 
-               (void) xfs_qm_reset_dqcounts(mp, bp, firstid,
-                                            flags & XFS_QMOPT_UQUOTA ?
-                                            XFS_DQ_USER : XFS_DQ_GROUP);
+               (void) xfs_qm_reset_dqcounts(mp, bp, firstid, type);
                xfs_bdwrite(mp, bp);
                /*
                 * goto the next block.
@@ -1578,7 +1610,7 @@ xfs_qm_dqiter_bufs(
 }
 
 /*
- * Iterate over all allocated USR/GRP dquots in the system, calling a
+ * Iterate over all allocated USR/GRP/PRJ dquots in the system, calling a
  * caller supplied function for every chunk of dquots that we find.
  */
 STATIC int
@@ -1849,7 +1881,7 @@ xfs_qm_dqusage_adjust(
                xfs_qm_quotacheck_dqadjust(udqp, nblks, rtblks);
                xfs_qm_dqput(udqp);
        }
-       if (XFS_IS_GQUOTA_ON(mp)) {
+       if (XFS_IS_OQUOTA_ON(mp)) {
                ASSERT(gdqp);
                xfs_qm_quotacheck_dqadjust(gdqp, nblks, rtblks);
                xfs_qm_dqput(gdqp);
@@ -1898,7 +1930,7 @@ xfs_qm_quotacheck(
        cmn_err(CE_NOTE, "XFS quotacheck %s: Please wait.", mp->m_fsname);
 
        /*
-        * First we go thru all the dquots on disk, USR and GRP, and reset
+        * First we go thru all the dquots on disk, USR and GRP/PRJ, and reset
         * their counters to zero. We need a clean slate.
         * We don't log our changes till later.
         */
@@ -1909,9 +1941,10 @@ xfs_qm_quotacheck(
        }
 
        if ((gip = XFS_QI_GQIP(mp))) {
-               if ((error = xfs_qm_dqiterate(mp, gip, XFS_QMOPT_GQUOTA)))
+               if ((error = xfs_qm_dqiterate(mp, gip, XFS_IS_GQUOTA_ON(mp) ?
+                                       XFS_QMOPT_GQUOTA : XFS_QMOPT_PQUOTA)))
                        goto error_return;
-               flags |= XFS_GQUOTA_CHKD;
+               flags |= XFS_OQUOTA_CHKD;
        }
 
        do {
@@ -1938,7 +1971,7 @@ xfs_qm_quotacheck(
        if (error) {
                xfs_qm_dqpurge_all(mp,
                                   XFS_QMOPT_UQUOTA|XFS_QMOPT_GQUOTA|
-                                  XFS_QMOPT_QUOTAOFF);
+                                  XFS_QMOPT_PQUOTA|XFS_QMOPT_QUOTAOFF);
                goto error_return;
        }
        /*
@@ -1961,7 +1994,7 @@ xfs_qm_quotacheck(
         * quotachecked status, since we won't be doing accounting for
         * that type anymore.
         */
-       mp->m_qflags &= ~(XFS_GQUOTA_CHKD | XFS_UQUOTA_CHKD);
+       mp->m_qflags &= ~(XFS_OQUOTA_CHKD | XFS_UQUOTA_CHKD);
        mp->m_qflags |= flags;
 
        XQM_LIST_PRINT(&(XFS_QI_MPL_LIST(mp)), MPL_NEXT, "++++ Mp list +++");
@@ -2013,7 +2046,7 @@ xfs_qm_init_quotainos(
                                             0, 0, &uip, 0)))
                                return XFS_ERROR(error);
                }
-               if (XFS_IS_GQUOTA_ON(mp) &&
+               if (XFS_IS_OQUOTA_ON(mp) &&
                    mp->m_sb.sb_gquotino != NULLFSINO) {
                        ASSERT(mp->m_sb.sb_gquotino > 0);
                        if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino,
@@ -2043,10 +2076,12 @@ xfs_qm_init_quotainos(
 
                flags &= ~XFS_QMOPT_SBVERSION;
        }
-       if (XFS_IS_GQUOTA_ON(mp) && gip == NULL) {
-               if ((error = xfs_qm_qino_alloc(mp, &gip,
-                                             sbflags | XFS_SB_GQUOTINO,
-                                             flags | XFS_QMOPT_GQUOTA))) {
+       if (XFS_IS_OQUOTA_ON(mp) && gip == NULL) {
+               flags |= (XFS_IS_GQUOTA_ON(mp) ?
+                               XFS_QMOPT_GQUOTA : XFS_QMOPT_PQUOTA);
+               error = xfs_qm_qino_alloc(mp, &gip,
+                                         sbflags | XFS_SB_GQUOTINO, flags);
+               if (error) {
                        if (uip)
                                VN_RELE(XFS_ITOV(uip));
 
@@ -2452,6 +2487,7 @@ xfs_qm_vop_dqalloc(
        xfs_inode_t     *ip,
        uid_t           uid,
        gid_t           gid,
+       prid_t          prid,
        uint            flags,
        xfs_dquot_t     **O_udqpp,
        xfs_dquot_t     **O_gdqpp)
@@ -2483,8 +2519,7 @@ xfs_qm_vop_dqalloc(
        }
 
        uq = gq = NULL;
-       if ((flags & XFS_QMOPT_UQUOTA) &&
-           XFS_IS_UQUOTA_ON(mp)) {
+       if ((flags & XFS_QMOPT_UQUOTA) && XFS_IS_UQUOTA_ON(mp)) {
                if (ip->i_d.di_uid != uid) {
                        /*
                         * What we need is the dquot that has this uid, and
@@ -2522,8 +2557,7 @@ xfs_qm_vop_dqalloc(
                        xfs_dqunlock(uq);
                }
        }
-       if ((flags & XFS_QMOPT_GQUOTA) &&
-           XFS_IS_GQUOTA_ON(mp)) {
+       if ((flags & XFS_QMOPT_GQUOTA) && XFS_IS_GQUOTA_ON(mp)) {
                if (ip->i_d.di_gid != gid) {
                        xfs_iunlock(ip, lockflags);
                        if ((error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)gid,
@@ -2546,6 +2580,29 @@ xfs_qm_vop_dqalloc(
                        XFS_DQHOLD(gq);
                        xfs_dqunlock(gq);
                }
+       } else if ((flags & XFS_QMOPT_PQUOTA) && XFS_IS_PQUOTA_ON(mp)) {
+               if (ip->i_d.di_projid != prid) {
+                       xfs_iunlock(ip, lockflags);
+                       if ((error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)prid,
+                                                XFS_DQ_PROJ,
+                                                XFS_QMOPT_DQALLOC |
+                                                XFS_QMOPT_DOWARN,
+                                                &gq))) {
+                               if (uq)
+                                       xfs_qm_dqrele(uq);
+                               ASSERT(error != ENOENT);
+                               return (error);
+                       }
+                       xfs_dqunlock(gq);
+                       lockflags = XFS_ILOCK_SHARED;
+                       xfs_ilock(ip, lockflags);
+               } else {
+                       ASSERT(ip->i_gdquot);
+                       gq = ip->i_gdquot;
+                       xfs_dqlock(gq);
+                       XFS_DQHOLD(gq);
+                       xfs_dqunlock(gq);
+               }
        }
        if (uq)
                xfs_dqtrace_entry_ino(uq, "DQALLOC", ip);
@@ -2574,6 +2631,9 @@ xfs_qm_vop_chown(
        xfs_dquot_t     *newdq)
 {
        xfs_dquot_t     *prevdq;
+       uint            bfield = XFS_IS_REALTIME_INODE(ip) ?
+                                XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
+
        ASSERT(XFS_ISLOCKED_INODE_EXCL(ip));
        ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
 
@@ -2582,20 +2642,12 @@ xfs_qm_vop_chown(
        ASSERT(prevdq);
        ASSERT(prevdq != newdq);
 
-       xfs_trans_mod_dquot(tp, prevdq,
-                           XFS_TRANS_DQ_BCOUNT,
-                           -(ip->i_d.di_nblocks));
-       xfs_trans_mod_dquot(tp, prevdq,
-                           XFS_TRANS_DQ_ICOUNT,
-                           -1);
+       xfs_trans_mod_dquot(tp, prevdq, bfield, -(ip->i_d.di_nblocks));
+       xfs_trans_mod_dquot(tp, prevdq, XFS_TRANS_DQ_ICOUNT, -1);
 
        /* the sparkling new dquot */
-       xfs_trans_mod_dquot(tp, newdq,
-                           XFS_TRANS_DQ_BCOUNT,
-                           ip->i_d.di_nblocks);
-       xfs_trans_mod_dquot(tp, newdq,
-                           XFS_TRANS_DQ_ICOUNT,
-                           1);
+       xfs_trans_mod_dquot(tp, newdq, bfield, ip->i_d.di_nblocks);
+       xfs_trans_mod_dquot(tp, newdq, XFS_TRANS_DQ_ICOUNT, 1);
 
        /*
         * Take an extra reference, because the inode
@@ -2611,7 +2663,7 @@ xfs_qm_vop_chown(
 }
 
 /*
- * Quota reservations for setattr(AT_UID|AT_GID).
+ * Quota reservations for setattr(AT_UID|AT_GID|AT_PROJID).
  */
 int
 xfs_qm_vop_chown_reserve(
@@ -2623,7 +2675,7 @@ xfs_qm_vop_chown_reserve(
 {
        int             error;
        xfs_mount_t     *mp;
-       uint            delblks;
+       uint            delblks, blkflags;
        xfs_dquot_t     *unresudq, *unresgdq, *delblksudq, *delblksgdq;
 
        ASSERT(XFS_ISLOCKED_INODE(ip));
@@ -2632,6 +2684,8 @@ xfs_qm_vop_chown_reserve(
 
        delblks = ip->i_delayed_blks;
        delblksudq = delblksgdq = unresudq = unresgdq = NULL;
+       blkflags = XFS_IS_REALTIME_INODE(ip) ?
+                       XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS;
 
        if (XFS_IS_UQUOTA_ON(mp) && udqp &&
            ip->i_d.di_uid != (uid_t)INT_GET(udqp->q_core.d_id, ARCH_CONVERT)) {
@@ -2646,18 +2700,22 @@ xfs_qm_vop_chown_reserve(
                        unresudq = ip->i_udquot;
                }
        }
-       if (XFS_IS_GQUOTA_ON(ip->i_mount) && gdqp &&
-           ip->i_d.di_gid != INT_GET(gdqp->q_core.d_id, ARCH_CONVERT)) {
-               delblksgdq = gdqp;
-               if (delblks) {
-                       ASSERT(ip->i_gdquot);
-                       unresgdq = ip->i_gdquot;
+       if (XFS_IS_OQUOTA_ON(ip->i_mount) && gdqp) {
+               if ((XFS_IS_GQUOTA_ON(ip->i_mount) && ip->i_d.di_gid !=
+                               INT_GET(gdqp->q_core.d_id, ARCH_CONVERT)) ||
+                   (XFS_IS_PQUOTA_ON(ip->i_mount) && ip->i_d.di_projid !=
+                               INT_GET(gdqp->q_core.d_id, ARCH_CONVERT))) {
+                       delblksgdq = gdqp;
+                       if (delblks) {
+                               ASSERT(ip->i_gdquot);
+                               unresgdq = ip->i_gdquot;
+                       }
                }
        }
 
        if ((error = xfs_trans_reserve_quota_bydquots(tp, ip->i_mount,
                                delblksudq, delblksgdq, ip->i_d.di_nblocks, 1,
-                               flags | XFS_QMOPT_RES_REGBLKS)))
+                               flags | blkflags)))
                return (error);
 
        /*
@@ -2674,11 +2732,11 @@ xfs_qm_vop_chown_reserve(
                ASSERT(unresudq || unresgdq);
                if ((error = xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount,
                                delblksudq, delblksgdq, (xfs_qcnt_t)delblks, 0,
-                               flags | XFS_QMOPT_RES_REGBLKS)))
+                               flags | blkflags)))
                        return (error);
                xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount,
                                unresudq, unresgdq, -((xfs_qcnt_t)delblks), 0,
-                               XFS_QMOPT_RES_REGBLKS);
+                               blkflags);
        }
 
        return (0);
@@ -2751,7 +2809,7 @@ xfs_qm_vop_dqattach_and_dqmod_newinode(
 }
 
 /* ------------- list stuff -----------------*/
-void
+STATIC void
 xfs_qm_freelist_init(xfs_frlist_t *ql)
 {
        ql->qh_next = ql->qh_prev = (xfs_dquot_t *) ql;
@@ -2760,7 +2818,7 @@ xfs_qm_freelist_init(xfs_frlist_t *ql)
        ql->qh_nelems = 0;
 }
 
-void
+STATIC void
 xfs_qm_freelist_destroy(xfs_frlist_t *ql)
 {
        xfs_dquot_t     *dqp, *nextdqp;
@@ -2786,7 +2844,7 @@ xfs_qm_freelist_destroy(xfs_frlist_t *ql)
        ASSERT(ql->qh_nelems == 0);
 }
 
-void
+STATIC void
 xfs_qm_freelist_insert(xfs_frlist_t *ql, xfs_dquot_t *dq)
 {
        dq->dq_flnext = ql->qh_next;
@@ -2816,7 +2874,7 @@ xfs_qm_freelist_append(xfs_frlist_t *ql, xfs_dquot_t *dq)
        xfs_qm_freelist_insert((xfs_frlist_t *)ql->qh_prev, dq);
 }
 
-int
+STATIC int
 xfs_qm_dqhashlock_nowait(
        xfs_dquot_t *dqp)
 {
@@ -2836,7 +2894,7 @@ xfs_qm_freelist_lock_nowait(
        return (locked);
 }
 
-int
+STATIC int
 xfs_qm_mplist_nowait(
        xfs_mount_t     *mp)
 {
index dcf1a7a831d8ab1a62ffeb2b23689b10f23fbe72..b03eecf3b6cb19c4dba39596ce440178ebd858fd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2004 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 2000-2005 Silicon Graphics, Inc.  All Rights Reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -133,8 +133,9 @@ typedef struct xfs_quotainfo {
        time_t           qi_btimelimit;  /* limit for blks timer */
        time_t           qi_itimelimit;  /* limit for inodes timer */
        time_t           qi_rtbtimelimit;/* limit for rt blks timer */
-       xfs_qwarncnt_t   qi_bwarnlimit;  /* limit for num warnings */
-       xfs_qwarncnt_t   qi_iwarnlimit;  /* limit for num warnings */
+       xfs_qwarncnt_t   qi_bwarnlimit;  /* limit for blks warnings */
+       xfs_qwarncnt_t   qi_iwarnlimit;  /* limit for inodes warnings */
+       xfs_qwarncnt_t   qi_rtbwarnlimit;/* limit for rt blks warnings */
        mutex_t          qi_quotaofflock;/* to serialize quotaoff */
        xfs_filblks_t    qi_dqchunklen;  /* # BBs in a chunk of dqs */
        uint             qi_dqperchunk;  /* # ondisk dqs in above chunk */
@@ -176,6 +177,7 @@ typedef struct xfs_dquot_acct {
 
 #define XFS_QM_BWARNLIMIT      5
 #define XFS_QM_IWARNLIMIT      5
+#define XFS_QM_RTBWARNLIMIT    5
 
 #define XFS_QM_LOCK(xqm)       (mutex_lock(&xqm##_lock, PINOD))
 #define XFS_QM_UNLOCK(xqm)     (mutex_unlock(&xqm##_lock))
@@ -184,7 +186,6 @@ typedef struct xfs_dquot_acct {
 
 extern void            xfs_mount_reset_sbqflags(xfs_mount_t *);
 
-extern int             xfs_qm_init_quotainfo(xfs_mount_t *);
 extern void            xfs_qm_destroy_quotainfo(xfs_mount_t *);
 extern int             xfs_qm_mount_quotas(xfs_mount_t *, int);
 extern void            xfs_qm_mount_quotainit(xfs_mount_t *, uint);
@@ -203,7 +204,7 @@ extern void         xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint);
 
 /* vop stuff */
 extern int             xfs_qm_vop_dqalloc(xfs_mount_t *, xfs_inode_t *,
-                                       uid_t, gid_t, uint,
+                                       uid_t, gid_t, prid_t, uint,
                                        xfs_dquot_t **, xfs_dquot_t **);
 extern void            xfs_qm_vop_dqattach_and_dqmod_newinode(
                                        xfs_trans_t *, xfs_inode_t *,
@@ -215,14 +216,9 @@ extern int         xfs_qm_vop_chown_reserve(xfs_trans_t *, xfs_inode_t *,
                                        xfs_dquot_t *, xfs_dquot_t *, uint);
 
 /* list stuff */
-extern void            xfs_qm_freelist_init(xfs_frlist_t *);
-extern void            xfs_qm_freelist_destroy(xfs_frlist_t *);
-extern void            xfs_qm_freelist_insert(xfs_frlist_t *, xfs_dquot_t *);
 extern void            xfs_qm_freelist_append(xfs_frlist_t *, xfs_dquot_t *);
 extern void            xfs_qm_freelist_unlink(xfs_dquot_t *);
 extern int             xfs_qm_freelist_lock_nowait(xfs_qm_t *);
-extern int             xfs_qm_mplist_nowait(xfs_mount_t *);
-extern int             xfs_qm_dqhashlock_nowait(xfs_dquot_t *);
 
 /* system call interface */
 extern int             xfs_qm_quotactl(bhv_desc_t *, int, int, xfs_caddr_t);
index be67d9c265f8ffc762f83f0081177f3e73bd1a3b..dc3c37a1e1585702eeb814da992b216b57f4c96d 100644 (file)
 #define MNTOPT_NOQUOTA "noquota"       /* no quotas */
 #define MNTOPT_USRQUOTA        "usrquota"      /* user quota enabled */
 #define MNTOPT_GRPQUOTA        "grpquota"      /* group quota enabled */
+#define MNTOPT_PRJQUOTA        "prjquota"      /* project quota enabled */
 #define MNTOPT_UQUOTA  "uquota"        /* user quota (IRIX variant) */
 #define MNTOPT_GQUOTA  "gquota"        /* group quota (IRIX variant) */
+#define MNTOPT_PQUOTA  "pquota"        /* project quota (IRIX variant) */
 #define MNTOPT_UQUOTANOENF "uqnoenforce"/* user quota limit enforcement */
 #define MNTOPT_GQUOTANOENF "gqnoenforce"/* group quota limit enforcement */
+#define MNTOPT_PQUOTANOENF "pqnoenforce"/* project quota limit enforcement */
 #define MNTOPT_QUOTANOENF  "qnoenforce"        /* same as uqnoenforce */
 
 STATIC int
@@ -109,6 +112,14 @@ xfs_qm_parseargs(
                        args->flags |= XFSMNT_UQUOTA;
                        args->flags &= ~XFSMNT_UQUOTAENF;
                        referenced = 1;
+               } else if (!strcmp(this_char, MNTOPT_PQUOTA) ||
+                          !strcmp(this_char, MNTOPT_PRJQUOTA)) {
+                       args->flags |= XFSMNT_PQUOTA | XFSMNT_PQUOTAENF;
+                       referenced = 1;
+               } else if (!strcmp(this_char, MNTOPT_PQUOTANOENF)) {
+                       args->flags |= XFSMNT_PQUOTA;
+                       args->flags &= ~XFSMNT_PQUOTAENF;
+                       referenced = 1;
                } else if (!strcmp(this_char, MNTOPT_GQUOTA) ||
                           !strcmp(this_char, MNTOPT_GRPQUOTA)) {
                        args->flags |= XFSMNT_GQUOTA | XFSMNT_GQUOTAENF;
@@ -127,6 +138,12 @@ xfs_qm_parseargs(
                        *this_char++ = ',';
        }
 
+       if ((args->flags & XFSMNT_GQUOTA) && (args->flags & XFSMNT_PQUOTA)) {
+               cmn_err(CE_WARN,
+                       "XFS: cannot mount with both project and group quota");
+               return XFS_ERROR(EINVAL);
+       }
+
        PVFS_PARSEARGS(BHV_NEXT(bhv), options, args, update, error);
        if (!error && !referenced)
                bhv_remove_vfsops(bhvtovfs(bhv), VFS_POSITION_QM);
@@ -148,13 +165,19 @@ xfs_qm_showargs(
                        seq_puts(m, "," MNTOPT_UQUOTANOENF);
        }
 
+       if (mp->m_qflags & XFS_PQUOTA_ACCT) {
+               (mp->m_qflags & XFS_OQUOTA_ENFD) ?
+                       seq_puts(m, "," MNTOPT_PRJQUOTA) :
+                       seq_puts(m, "," MNTOPT_PQUOTANOENF);
+       }
+
        if (mp->m_qflags & XFS_GQUOTA_ACCT) {
-               (mp->m_qflags & XFS_GQUOTA_ENFD) ?
+               (mp->m_qflags & XFS_OQUOTA_ENFD) ?
                        seq_puts(m, "," MNTOPT_GRPQUOTA) :
                        seq_puts(m, "," MNTOPT_GQUOTANOENF);
        }
 
-       if (!(mp->m_qflags & (XFS_UQUOTA_ACCT|XFS_GQUOTA_ACCT)))
+       if (!(mp->m_qflags & XFS_ALL_QUOTA_ACCT))
                seq_puts(m, "," MNTOPT_NOQUOTA);
 
        PVFS_SHOWARGS(BHV_NEXT(bhv), m, error);
@@ -171,7 +194,7 @@ xfs_qm_mount(
        struct xfs_mount        *mp = XFS_VFSTOM(vfsp);
        int                     error;
 
-       if (args->flags & (XFSMNT_UQUOTA | XFSMNT_GQUOTA))
+       if (args->flags & (XFSMNT_UQUOTA | XFSMNT_GQUOTA | XFSMNT_PQUOTA))
                xfs_qm_mount_quotainit(mp, args->flags);
        PVFS_MOUNT(BHV_NEXT(bhv), args, cr, error);
        return error;
@@ -255,16 +278,17 @@ xfs_qm_newmount(
        uint            *quotaflags)
 {
        uint            quotaondisk;
-       uint            uquotaondisk = 0, gquotaondisk = 0;
+       uint            uquotaondisk = 0, gquotaondisk = 0, pquotaondisk = 0;
 
        *quotaflags = 0;
        *needquotamount = B_FALSE;
 
        quotaondisk = XFS_SB_VERSION_HASQUOTA(&mp->m_sb) &&
-               mp->m_sb.sb_qflags & (XFS_UQUOTA_ACCT|XFS_GQUOTA_ACCT);
+                               (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT);
 
        if (quotaondisk) {
                uquotaondisk = mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT;
+               pquotaondisk = mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT;
                gquotaondisk = mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT;
        }
 
@@ -277,13 +301,16 @@ xfs_qm_newmount(
 
        if (((uquotaondisk && !XFS_IS_UQUOTA_ON(mp)) ||
            (!uquotaondisk &&  XFS_IS_UQUOTA_ON(mp)) ||
+            (pquotaondisk && !XFS_IS_PQUOTA_ON(mp)) ||
+           (!pquotaondisk &&  XFS_IS_PQUOTA_ON(mp)) ||
             (gquotaondisk && !XFS_IS_GQUOTA_ON(mp)) ||
-           (!gquotaondisk &&  XFS_IS_GQUOTA_ON(mp)))  &&
+           (!gquotaondisk &&  XFS_IS_OQUOTA_ON(mp)))  &&
            xfs_dev_is_read_only(mp, "changing quota state")) {
                cmn_err(CE_WARN,
-                       "XFS: please mount with%s%s%s.",
+                       "XFS: please mount with%s%s%s%s.",
                        (!quotaondisk ? "out quota" : ""),
                        (uquotaondisk ? " usrquota" : ""),
+                       (pquotaondisk ? " prjquota" : ""),
                        (gquotaondisk ? " grpquota" : ""));
                return XFS_ERROR(EPERM);
        }
@@ -359,7 +386,7 @@ xfs_qm_dqrele_null(
 }
 
 
-struct xfs_qmops xfs_qmcore_xfs = {
+STATIC struct xfs_qmops xfs_qmcore_xfs = {
        .xfs_qminit             = xfs_qm_newmount,
        .xfs_qmdone             = xfs_qm_unmount_quotadestroy,
        .xfs_qmmount            = xfs_qm_endmount,
index 229f5b5a2d25e9ffec948fa050c3decb478efe64..68e98962dbefe0db3f303204c97c53b82b6da975 100644 (file)
@@ -118,40 +118,41 @@ xfs_qm_quotactl(
         * The following commands are valid even when quotaoff.
         */
        switch (cmd) {
+       case Q_XQUOTARM:
                /*
-                * truncate quota files. quota must be off.
+                * Truncate quota files. quota must be off.
                 */
-             case Q_XQUOTARM:
                if (XFS_IS_QUOTA_ON(mp) || addr == NULL)
                        return XFS_ERROR(EINVAL);
                if (vfsp->vfs_flag & VFS_RDONLY)
                        return XFS_ERROR(EROFS);
                return (xfs_qm_scall_trunc_qfiles(mp,
                               xfs_qm_import_qtype_flags(*(uint *)addr)));
+
+       case Q_XGETQSTAT:
                /*
                 * Get quota status information.
                 */
-             case Q_XGETQSTAT:
                return (xfs_qm_scall_getqstat(mp, (fs_quota_stat_t *)addr));
 
+       case Q_XQUOTAON:
                /*
-                * QUOTAON for root f/s and quota enforcement on others..
-                * Quota accounting for non-root f/s's must be turned on
-                * at mount time.
+                * QUOTAON - enabling quota enforcement.
+                * Quota accounting must be turned on at mount time.
                 */
-             case Q_XQUOTAON:
                if (addr == NULL)
                        return XFS_ERROR(EINVAL);
                if (vfsp->vfs_flag & VFS_RDONLY)
                        return XFS_ERROR(EROFS);
                return (xfs_qm_scall_quotaon(mp,
                                          xfs_qm_import_flags(*(uint *)addr)));
-             case Q_XQUOTAOFF:
+
+       case Q_XQUOTAOFF:
                if (vfsp->vfs_flag & VFS_RDONLY)
                        return XFS_ERROR(EROFS);
                break;
 
-             default:
+       default:
                break;
        }
 
@@ -159,7 +160,7 @@ xfs_qm_quotactl(
                return XFS_ERROR(ESRCH);
 
        switch (cmd) {
-             case Q_XQUOTAOFF:
+       case Q_XQUOTAOFF:
                if (vfsp->vfs_flag & VFS_RDONLY)
                        return XFS_ERROR(EROFS);
                error = xfs_qm_scall_quotaoff(mp,
@@ -167,42 +168,39 @@ xfs_qm_quotactl(
                                            B_FALSE);
                break;
 
-               /*
-                * Defaults to XFS_GETUQUOTA.
-                */
-             case Q_XGETQUOTA:
+       case Q_XGETQUOTA:
                error = xfs_qm_scall_getquota(mp, (xfs_dqid_t)id, XFS_DQ_USER,
                                        (fs_disk_quota_t *)addr);
                break;
-               /*
-                * Set limits, both hard and soft. Defaults to Q_SETUQLIM.
-                */
-             case Q_XSETQLIM:
+       case Q_XGETGQUOTA:
+               error = xfs_qm_scall_getquota(mp, (xfs_dqid_t)id, XFS_DQ_GROUP,
+                                       (fs_disk_quota_t *)addr);
+               break;
+       case Q_XGETPQUOTA:
+               error = xfs_qm_scall_getquota(mp, (xfs_dqid_t)id, XFS_DQ_PROJ,
+                                       (fs_disk_quota_t *)addr);
+               break;
+
+       case Q_XSETQLIM:
                if (vfsp->vfs_flag & VFS_RDONLY)
                        return XFS_ERROR(EROFS);
                error = xfs_qm_scall_setqlim(mp, (xfs_dqid_t)id, XFS_DQ_USER,
                                             (fs_disk_quota_t *)addr);
                break;
-
-              case Q_XSETGQLIM:
+       case Q_XSETGQLIM:
                if (vfsp->vfs_flag & VFS_RDONLY)
                        return XFS_ERROR(EROFS);
                error = xfs_qm_scall_setqlim(mp, (xfs_dqid_t)id, XFS_DQ_GROUP,
                                             (fs_disk_quota_t *)addr);
                break;
-
-
-             case Q_XGETGQUOTA:
-               error = xfs_qm_scall_getquota(mp, (xfs_dqid_t)id, XFS_DQ_GROUP,
-                                       (fs_disk_quota_t *)addr);
+       case Q_XSETPQLIM:
+               if (vfsp->vfs_flag & VFS_RDONLY)
+                       return XFS_ERROR(EROFS);
+               error = xfs_qm_scall_setqlim(mp, (xfs_dqid_t)id, XFS_DQ_PROJ,
+                                            (fs_disk_quota_t *)addr);
                break;
 
-               /*
-                * Quotas are entirely undefined after quotaoff in XFS quotas.
-                * For instance, there's no way to set limits when quotaoff.
-                */
-
-             default:
+       default:
                error = XFS_ERROR(EINVAL);
                break;
        }
@@ -286,8 +284,12 @@ xfs_qm_scall_quotaoff(
        }
        if (flags & XFS_GQUOTA_ACCT) {
                dqtype |= XFS_QMOPT_GQUOTA;
-               flags |= (XFS_GQUOTA_CHKD | XFS_GQUOTA_ENFD);
+               flags |= (XFS_OQUOTA_CHKD | XFS_OQUOTA_ENFD);
                inactivate_flags |= XFS_GQUOTA_ACTIVE;
+       } else if (flags & XFS_PQUOTA_ACCT) {
+               dqtype |= XFS_QMOPT_PQUOTA;
+               flags |= (XFS_OQUOTA_CHKD | XFS_OQUOTA_ENFD);
+               inactivate_flags |= XFS_PQUOTA_ACTIVE;
        }
 
        /*
@@ -364,7 +366,8 @@ xfs_qm_scall_quotaoff(
        /*
         * If quotas is completely disabled, close shop.
         */
-       if ((flags & XFS_MOUNT_QUOTA_ALL) == XFS_MOUNT_QUOTA_ALL) {
+       if (((flags & XFS_MOUNT_QUOTA_ALL) == XFS_MOUNT_QUOTA_SET1) ||
+           ((flags & XFS_MOUNT_QUOTA_ALL) == XFS_MOUNT_QUOTA_SET2)) {
                mutex_unlock(&(XFS_QI_QOFFLOCK(mp)));
                xfs_qm_destroy_quotainfo(mp);
                return (0);
@@ -378,7 +381,7 @@ xfs_qm_scall_quotaoff(
                XFS_PURGE_INODE(XFS_QI_UQIP(mp));
                XFS_QI_UQIP(mp) = NULL;
        }
-       if ((dqtype & XFS_QMOPT_GQUOTA) && XFS_QI_GQIP(mp)) {
+       if ((dqtype & (XFS_QMOPT_GQUOTA|XFS_QMOPT_PQUOTA)) && XFS_QI_GQIP(mp)) {
                XFS_PURGE_INODE(XFS_QI_GQIP(mp));
                XFS_QI_GQIP(mp) = NULL;
        }
@@ -411,7 +414,8 @@ xfs_qm_scall_trunc_qfiles(
                }
        }
 
-       if ((flags & XFS_DQ_GROUP) && mp->m_sb.sb_gquotino != NULLFSINO) {
+       if ((flags & (XFS_DQ_GROUP|XFS_DQ_PROJ)) &&
+           mp->m_sb.sb_gquotino != NULLFSINO) {
                error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 0, 0, &qip, 0);
                if (! error) {
                        (void) xfs_truncate_file(mp, qip);
@@ -434,7 +438,7 @@ xfs_qm_scall_quotaon(
        uint            flags)
 {
        int             error;
-       unsigned long s;
+       unsigned long   s;
        uint            qf;
        uint            accflags;
        __int64_t       sbflags;
@@ -468,9 +472,13 @@ xfs_qm_scall_quotaon(
            (mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT) == 0 &&
            (flags & XFS_UQUOTA_ENFD))
            ||
+           ((flags & XFS_PQUOTA_ACCT) == 0 &&
+           (mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) == 0 &&
+           (flags & XFS_OQUOTA_ENFD))
+           ||
            ((flags & XFS_GQUOTA_ACCT) == 0 &&
            (mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) == 0 &&
-           (flags & XFS_GQUOTA_ENFD))) {
+           (flags & XFS_OQUOTA_ENFD))) {
                qdprintk("Can't enforce without acct, flags=%x sbflags=%x\n",
                        flags, mp->m_sb.sb_qflags);
                return XFS_ERROR(EINVAL);
@@ -504,6 +512,10 @@ xfs_qm_scall_quotaon(
         */
        if  (((mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT) !=
             (mp->m_qflags & XFS_UQUOTA_ACCT)) ||
+            ((mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) !=
+            (mp->m_qflags & XFS_PQUOTA_ACCT)) ||
+            ((mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) !=
+            (mp->m_qflags & XFS_GQUOTA_ACCT)) ||
            (flags & XFS_ALL_QUOTA_ENFD) == 0)
                return (0);
 
@@ -521,7 +533,6 @@ xfs_qm_scall_quotaon(
 }
 
 
-
 /*
  * Return quota status information, such as uquota-off, enforcements, etc.
  */
@@ -606,7 +617,8 @@ xfs_qm_scall_setqlim(
        if (!capable(CAP_SYS_ADMIN))
                return XFS_ERROR(EPERM);
 
-       if ((newlim->d_fieldmask & (FS_DQ_LIMIT_MASK|FS_DQ_TIMER_MASK)) == 0)
+       if ((newlim->d_fieldmask &
+           (FS_DQ_LIMIT_MASK|FS_DQ_TIMER_MASK|FS_DQ_WARNS_MASK)) == 0)
                return (0);
 
        tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SETQLIM);
@@ -691,12 +703,23 @@ xfs_qm_scall_setqlim(
                qdprintk("ihard %Ld < isoft %Ld\n", hard, soft);
        }
 
+       /*
+        * Update warnings counter(s) if requested
+        */
+       if (newlim->d_fieldmask & FS_DQ_BWARNS)
+               INT_SET(ddq->d_bwarns, ARCH_CONVERT, newlim->d_bwarns);
+       if (newlim->d_fieldmask & FS_DQ_IWARNS)
+               INT_SET(ddq->d_iwarns, ARCH_CONVERT, newlim->d_iwarns);
+       if (newlim->d_fieldmask & FS_DQ_RTBWARNS)
+               INT_SET(ddq->d_rtbwarns, ARCH_CONVERT, newlim->d_rtbwarns);
+
        if (id == 0) {
                /*
                 * Timelimits for the super user set the relative time
                 * the other users can be over quota for this file system.
                 * If it is zero a default is used.  Ditto for the default
-                * soft and hard limit values (already done, above).
+                * soft and hard limit values (already done, above), and
+                * for warnings.
                 */
                if (newlim->d_fieldmask & FS_DQ_BTIMER) {
                        mp->m_quotainfo->qi_btimelimit = newlim->d_btimer;
@@ -710,7 +733,13 @@ xfs_qm_scall_setqlim(
                        mp->m_quotainfo->qi_rtbtimelimit = newlim->d_rtbtimer;
                        INT_SET(ddq->d_rtbtimer, ARCH_CONVERT, newlim->d_rtbtimer);
                }
-       } else /* if (XFS_IS_QUOTA_ENFORCED(mp)) */ {
+               if (newlim->d_fieldmask & FS_DQ_BWARNS)
+                       mp->m_quotainfo->qi_bwarnlimit = newlim->d_bwarns;
+               if (newlim->d_fieldmask & FS_DQ_IWARNS)
+                       mp->m_quotainfo->qi_iwarnlimit = newlim->d_iwarns;
+               if (newlim->d_fieldmask & FS_DQ_RTBWARNS)
+                       mp->m_quotainfo->qi_rtbwarnlimit = newlim->d_rtbwarns;
+       } else {
                /*
                 * If the user is now over quota, start the timelimit.
                 * The user will not be 'warned'.
@@ -776,9 +805,9 @@ xfs_qm_log_quotaoff_end(
        xfs_qoff_logitem_t      *startqoff,
        uint                    flags)
 {
-       xfs_trans_t            *tp;
+       xfs_trans_t             *tp;
        int                     error;
-       xfs_qoff_logitem_t     *qoffi;
+       xfs_qoff_logitem_t      *qoffi;
 
        tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF_END);
 
@@ -928,18 +957,26 @@ xfs_qm_export_dquot(
 
 STATIC uint
 xfs_qm_import_qtype_flags(
-       uint uflags)
+       uint            uflags)
 {
+       uint            oflags = 0;
+
        /*
-        * Can't be both at the same time.
+        * Can't be more than one, or none.
         */
        if (((uflags & (XFS_GROUP_QUOTA | XFS_USER_QUOTA)) ==
-            (XFS_GROUP_QUOTA | XFS_USER_QUOTA)) ||
-           ((uflags & (XFS_GROUP_QUOTA | XFS_USER_QUOTA)) == 0))
+                       (XFS_GROUP_QUOTA | XFS_USER_QUOTA)) ||
+           ((uflags & (XFS_GROUP_QUOTA | XFS_PROJ_QUOTA)) ==
+                       (XFS_GROUP_QUOTA | XFS_PROJ_QUOTA)) ||
+           ((uflags & (XFS_USER_QUOTA | XFS_PROJ_QUOTA)) ==
+                       (XFS_USER_QUOTA | XFS_PROJ_QUOTA)) ||
+           ((uflags & (XFS_GROUP_QUOTA|XFS_USER_QUOTA|XFS_PROJ_QUOTA)) == 0))
                return (0);
 
-       return (uflags & XFS_USER_QUOTA) ?
-               XFS_DQ_USER : XFS_DQ_GROUP;
+       oflags |= (uflags & XFS_USER_QUOTA) ? XFS_DQ_USER : 0;
+       oflags |= (uflags & XFS_PROJ_QUOTA) ? XFS_DQ_PROJ : 0;
+       oflags |= (uflags & XFS_GROUP_QUOTA) ? XFS_DQ_GROUP: 0;
+       return oflags;
 }
 
 STATIC uint
@@ -947,14 +984,19 @@ xfs_qm_export_qtype_flags(
        uint flags)
 {
        /*
-        * Can't be both at the same time.
+        * Can't be more than one, or none.
         */
-       ASSERT((flags & (XFS_GROUP_QUOTA | XFS_USER_QUOTA)) !=
-               (XFS_GROUP_QUOTA | XFS_USER_QUOTA));
-       ASSERT((flags & (XFS_GROUP_QUOTA | XFS_USER_QUOTA)) != 0);
+       ASSERT((flags & (XFS_PROJ_QUOTA | XFS_USER_QUOTA)) !=
+               (XFS_PROJ_QUOTA | XFS_USER_QUOTA));
+       ASSERT((flags & (XFS_PROJ_QUOTA | XFS_GROUP_QUOTA)) !=
+               (XFS_PROJ_QUOTA | XFS_GROUP_QUOTA));
+       ASSERT((flags & (XFS_USER_QUOTA | XFS_GROUP_QUOTA)) !=
+               (XFS_USER_QUOTA | XFS_GROUP_QUOTA));
+       ASSERT((flags & (XFS_PROJ_QUOTA|XFS_USER_QUOTA|XFS_GROUP_QUOTA)) != 0);
 
        return (flags & XFS_DQ_USER) ?
-               XFS_USER_QUOTA : XFS_GROUP_QUOTA;
+               XFS_USER_QUOTA : (flags & XFS_DQ_PROJ) ?
+                       XFS_PROJ_QUOTA : XFS_GROUP_QUOTA;
 }
 
 STATIC uint
@@ -965,12 +1007,14 @@ xfs_qm_import_flags(
 
        if (uflags & XFS_QUOTA_UDQ_ACCT)
                flags |= XFS_UQUOTA_ACCT;
+       if (uflags & XFS_QUOTA_PDQ_ACCT)
+               flags |= XFS_PQUOTA_ACCT;
        if (uflags & XFS_QUOTA_GDQ_ACCT)
                flags |= XFS_GQUOTA_ACCT;
        if (uflags & XFS_QUOTA_UDQ_ENFD)
                flags |= XFS_UQUOTA_ENFD;
-       if (uflags & XFS_QUOTA_GDQ_ENFD)
-               flags |= XFS_GQUOTA_ENFD;
+       if (uflags & (XFS_QUOTA_PDQ_ENFD|XFS_QUOTA_GDQ_ENFD))
+               flags |= XFS_OQUOTA_ENFD;
        return (flags);
 }
 
@@ -984,12 +1028,16 @@ xfs_qm_export_flags(
        uflags = 0;
        if (flags & XFS_UQUOTA_ACCT)
                uflags |= XFS_QUOTA_UDQ_ACCT;
+       if (flags & XFS_PQUOTA_ACCT)
+               uflags |= XFS_QUOTA_PDQ_ACCT;
        if (flags & XFS_GQUOTA_ACCT)
                uflags |= XFS_QUOTA_GDQ_ACCT;
        if (flags & XFS_UQUOTA_ENFD)
                uflags |= XFS_QUOTA_UDQ_ENFD;
-       if (flags & XFS_GQUOTA_ENFD)
-               uflags |= XFS_QUOTA_GDQ_ENFD;
+       if (flags & (XFS_OQUOTA_ENFD)) {
+               uflags |= (flags & XFS_GQUOTA_ACCT) ?
+                       XFS_QUOTA_GDQ_ENFD : XFS_QUOTA_PDQ_ENFD;
+       }
        return (uflags);
 }
 
@@ -1070,7 +1118,7 @@ again:
                        xfs_qm_dqrele(ip->i_udquot);
                        ip->i_udquot = NULL;
                }
-               if ((flags & XFS_GQUOTA_ACCT) && ip->i_gdquot) {
+               if (flags & (XFS_PQUOTA_ACCT|XFS_GQUOTA_ACCT) && ip->i_gdquot) {
                        xfs_qm_dqrele(ip->i_gdquot);
                        ip->i_gdquot = NULL;
                }
@@ -1160,7 +1208,6 @@ xfs_qm_dqtest_print(
 {
        cmn_err(CE_DEBUG, "-----------DQTEST DQUOT----------------");
        cmn_err(CE_DEBUG, "---- dquot ID = %d", d->d_id);
-       cmn_err(CE_DEBUG, "---- type     = %s", XFS_QM_ISUDQ(d)? "USR" : "GRP");
        cmn_err(CE_DEBUG, "---- fs       = 0x%p", d->q_mount);
        cmn_err(CE_DEBUG, "---- bcount   = %Lu (0x%x)",
                d->d_bcount, (int)d->d_bcount);
@@ -1231,7 +1278,7 @@ xfs_dqtest_cmp2(
 #ifdef QUOTADEBUG
        if (!err) {
                cmn_err(CE_DEBUG, "%d [%s] [0x%p] qchecked",
-                       d->d_id, XFS_QM_ISUDQ(d) ? "USR" : "GRP", d->q_mount);
+                       d->d_id, DQFLAGTO_TYPESTR(d), d->q_mount);
        }
 #endif
        return (err);
@@ -1287,6 +1334,7 @@ STATIC void
 xfs_qm_internalqcheck_get_dquots(
        xfs_mount_t     *mp,
        xfs_dqid_t      uid,
+       xfs_dqid_t      projid,
        xfs_dqid_t      gid,
        xfs_dqtest_t    **ud,
        xfs_dqtest_t    **gd)
@@ -1295,6 +1343,8 @@ xfs_qm_internalqcheck_get_dquots(
                xfs_qm_internalqcheck_dqget(mp, uid, XFS_DQ_USER, ud);
        if (XFS_IS_GQUOTA_ON(mp))
                xfs_qm_internalqcheck_dqget(mp, gid, XFS_DQ_GROUP, gd);
+       else if (XFS_IS_PQUOTA_ON(mp))
+               xfs_qm_internalqcheck_dqget(mp, projid, XFS_DQ_PROJ, gd);
 }
 
 
@@ -1362,13 +1412,14 @@ xfs_qm_internalqcheck_adjust(
        }
        xfs_qm_internalqcheck_get_dquots(mp,
                                        (xfs_dqid_t) ip->i_d.di_uid,
+                                       (xfs_dqid_t) ip->i_d.di_projid,
                                        (xfs_dqid_t) ip->i_d.di_gid,
                                        &ud, &gd);
        if (XFS_IS_UQUOTA_ON(mp)) {
                ASSERT(ud);
                xfs_qm_internalqcheck_dqadjust(ip, ud);
        }
-       if (XFS_IS_GQUOTA_ON(mp)) {
+       if (XFS_IS_OQUOTA_ON(mp)) {
                ASSERT(gd);
                xfs_qm_internalqcheck_dqadjust(ip, gd);
        }
index 414b6004af2160ce5a16c8f86b5f50d7c17a87f2..bf413e70ec073ea3434e3ad25f284a4302549f30 100644 (file)
@@ -56,6 +56,7 @@
 #define XFS_QI_RTBTIMELIMIT(mp) ((mp)->m_quotainfo->qi_rtbtimelimit)
 #define XFS_QI_ITIMELIMIT(mp)  ((mp)->m_quotainfo->qi_itimelimit)
 #define XFS_QI_BWARNLIMIT(mp)  ((mp)->m_quotainfo->qi_bwarnlimit)
+#define XFS_QI_RTBWARNLIMIT(mp)        ((mp)->m_quotainfo->qi_rtbwarnlimit)
 #define XFS_QI_IWARNLIMIT(mp)  ((mp)->m_quotainfo->qi_iwarnlimit)
 #define XFS_QI_QOFFLOCK(mp)    ((mp)->m_quotainfo->qi_quotaofflock)
 
@@ -102,7 +103,8 @@ static inline int XQMISLCKD(struct xfs_dqhash *h)
                                     (xfs_Gqm->qm_grp_dqhtable + \
                                      XFS_DQ_HASHVAL(mp, id)))
 #define XFS_IS_DQTYPE_ON(mp, type)   (type == XFS_DQ_USER ? \
-                                     XFS_IS_UQUOTA_ON(mp):XFS_IS_GQUOTA_ON(mp))
+                                       XFS_IS_UQUOTA_ON(mp) : \
+                                       XFS_IS_OQUOTA_ON(mp))
 #define XFS_IS_DQUOT_UNINITIALIZED(dqp) ( \
        !dqp->q_core.d_blk_hardlimit && \
        !dqp->q_core.d_blk_softlimit && \
@@ -177,16 +179,11 @@ for ((dqp) = (qlist)->qh_next; (dqp) != (xfs_dquot_t *)(qlist); \
        (!((dqp)->q_core.d_id))
 
 #define XFS_PURGE_INODE(ip)            \
-       {                               \
-         vmap_t dqvmap;                \
-         vnode_t *dqvp;                \
-         dqvp = XFS_ITOV(ip);          \
-         VMAP(dqvp, dqvmap);           \
-         VN_RELE(dqvp);                \
-       }
+       IRELE(ip);
 
 #define DQFLAGTO_TYPESTR(d)    (((d)->dq_flags & XFS_DQ_USER) ? "USR" : \
-                                (((d)->dq_flags & XFS_DQ_GROUP) ? "GRP" : "???"))
+                                (((d)->dq_flags & XFS_DQ_GROUP) ? "GRP" : \
+                                (((d)->dq_flags & XFS_DQ_PROJ) ? "PRJ":"???")))
 #define DQFLAGTO_DIRTYSTR(d)   (XFS_DQ_IS_DIRTY(d) ? "DIRTY" : "NOTDIRTY")
 
 #endif /* __XFS_QUOTA_PRIV_H__ */
index 149b2a1fd949beed7a82f63786f825db677bba83..3b99daf8a640f3dd3a6691558fbf70ba5fa0a462 100644 (file)
@@ -187,7 +187,7 @@ xfs_trans_dup_dqinfo(
 /*
  * Wrap around mod_dquot to account for both user and group quotas.
  */
-void
+STATIC void
 xfs_trans_mod_dquot_byino(
        xfs_trans_t     *tp,
        xfs_inode_t     *ip,
@@ -207,12 +207,10 @@ xfs_trans_mod_dquot_byino(
        if (tp->t_dqinfo == NULL)
                xfs_trans_alloc_dqinfo(tp);
 
-       if (XFS_IS_UQUOTA_ON(mp) && ip->i_udquot) {
+       if (XFS_IS_UQUOTA_ON(mp) && ip->i_udquot)
                (void) xfs_trans_mod_dquot(tp, ip->i_udquot, field, delta);
-       }
-       if (XFS_IS_GQUOTA_ON(mp) && ip->i_gdquot) {
+       if (XFS_IS_OQUOTA_ON(mp) && ip->i_gdquot)
                (void) xfs_trans_mod_dquot(tp, ip->i_gdquot, field, delta);
-       }
 }
 
 STATIC xfs_dqtrx_t *
@@ -368,7 +366,7 @@ xfs_trans_dqlockedjoin(
  * Unreserve just the reservations done by this transaction.
  * dquot is still left locked at exit.
  */
-void
+STATIC void
 xfs_trans_apply_dquot_deltas(
        xfs_trans_t             *tp)
 {
@@ -499,7 +497,7 @@ xfs_trans_apply_dquot_deltas(
                         * Adjust the RT reservation.
                         */
                        if (qtrx->qt_rtblk_res != 0) {
-                               if (qtrx->qt_blk_res != qtrx->qt_blk_res_used) {
+                               if (qtrx->qt_rtblk_res != qtrx->qt_rtblk_res_used) {
                                        if (qtrx->qt_rtblk_res >
                                            qtrx->qt_rtblk_res_used)
                                               dqp->q_res_rtbcount -= (xfs_qcnt_t)
@@ -532,12 +530,6 @@ xfs_trans_apply_dquot_deltas(
                                            (xfs_qcnt_t)qtrx->qt_icount_delta;
                        }
 
-
-#ifdef QUOTADEBUG
-                       if (qtrx->qt_rtblk_res != 0)
-                               cmn_err(CE_DEBUG, "RT res %d for 0x%p\n",
-                                       (int) qtrx->qt_rtblk_res, dqp);
-#endif
                        ASSERT(dqp->q_res_bcount >=
                                INT_GET(dqp->q_core.d_bcount, ARCH_CONVERT));
                        ASSERT(dqp->q_res_icount >=
@@ -638,7 +630,10 @@ xfs_trans_dqresv(
        int             error;
        xfs_qcnt_t      hardlimit;
        xfs_qcnt_t      softlimit;
-       time_t          btimer;
+       time_t          timer;
+       xfs_qwarncnt_t  warns;
+       xfs_qwarncnt_t  warnlimit;
+       xfs_qcnt_t      count;
        xfs_qcnt_t      *resbcountp;
        xfs_quotainfo_t *q = mp->m_quotainfo;
 
@@ -653,7 +648,9 @@ xfs_trans_dqresv(
                softlimit = INT_GET(dqp->q_core.d_blk_softlimit, ARCH_CONVERT);
                if (!softlimit)
                        softlimit = q->qi_bsoftlimit;
-               btimer = INT_GET(dqp->q_core.d_btimer, ARCH_CONVERT);
+               timer = INT_GET(dqp->q_core.d_btimer, ARCH_CONVERT);
+               warns = INT_GET(dqp->q_core.d_bwarns, ARCH_CONVERT);
+               warnlimit = XFS_QI_BWARNLIMIT(dqp->q_mount);
                resbcountp = &dqp->q_res_bcount;
        } else {
                ASSERT(flags & XFS_TRANS_DQ_RES_RTBLKS);
@@ -663,7 +660,9 @@ xfs_trans_dqresv(
                softlimit = INT_GET(dqp->q_core.d_rtb_softlimit, ARCH_CONVERT);
                if (!softlimit)
                        softlimit = q->qi_rtbsoftlimit;
-               btimer = INT_GET(dqp->q_core.d_rtbtimer, ARCH_CONVERT);
+               timer = INT_GET(dqp->q_core.d_rtbtimer, ARCH_CONVERT);
+               warns = INT_GET(dqp->q_core.d_rtbwarns, ARCH_CONVERT);
+               warnlimit = XFS_QI_RTBWARNLIMIT(dqp->q_mount);
                resbcountp = &dqp->q_res_rtbcount;
        }
        error = 0;
@@ -693,37 +692,36 @@ xfs_trans_dqresv(
                                 * If timer or warnings has expired,
                                 * return EDQUOT
                                 */
-                               if ((btimer != 0 && get_seconds() > btimer) ||
-                                   (dqp->q_core.d_bwarns &&
-                                    INT_GET(dqp->q_core.d_bwarns, ARCH_CONVERT) >=
-                                    XFS_QI_BWARNLIMIT(dqp->q_mount))) {
+                               if ((timer != 0 && get_seconds() > timer) ||
+                                   (warns != 0 && warns >= warnlimit)) {
                                        error = EDQUOT;
                                        goto error_return;
                                }
                        }
                }
                if (ninos > 0) {
-                       hardlimit = INT_GET(dqp->q_core.d_ino_hardlimit, ARCH_CONVERT);
+                       count = INT_GET(dqp->q_core.d_icount, ARCH_CONVERT);
+                       timer = INT_GET(dqp->q_core.d_itimer, ARCH_CONVERT);
+                       warns = INT_GET(dqp->q_core.d_iwarns, ARCH_CONVERT);
+                       warnlimit = XFS_QI_IWARNLIMIT(dqp->q_mount);
+                       hardlimit = INT_GET(dqp->q_core.d_ino_hardlimit,
+                                               ARCH_CONVERT);
                        if (!hardlimit)
                                hardlimit = q->qi_ihardlimit;
-                       softlimit = INT_GET(dqp->q_core.d_ino_softlimit, ARCH_CONVERT);
+                       softlimit = INT_GET(dqp->q_core.d_ino_softlimit,
+                                               ARCH_CONVERT);
                        if (!softlimit)
                                softlimit = q->qi_isoftlimit;
-                       if (hardlimit > 0ULL &&
-                           INT_GET(dqp->q_core.d_icount, ARCH_CONVERT) >= hardlimit) {
+                       if (hardlimit > 0ULL && count >= hardlimit) {
                                error = EDQUOT;
                                goto error_return;
-                       } else if (softlimit > 0ULL &&
-                                  INT_GET(dqp->q_core.d_icount, ARCH_CONVERT) >= softlimit) {
+                       } else if (softlimit > 0ULL && count >= softlimit) {
                                /*
                                 * If timer or warnings has expired,
                                 * return EDQUOT
                                 */
-                               if ((dqp->q_core.d_itimer &&
-                                    get_seconds() > INT_GET(dqp->q_core.d_itimer, ARCH_CONVERT)) ||
-                                   (dqp->q_core.d_iwarns &&
-                                    INT_GET(dqp->q_core.d_iwarns, ARCH_CONVERT) >=
-                                    XFS_QI_IWARNLIMIT(dqp->q_mount))) {
+                               if ((timer != 0 && get_seconds() > timer) ||
+                                    (warns != 0 && warns >= warnlimit)) {
                                        error = EDQUOT;
                                        goto error_return;
                                }
index 7d6e1f37df10d88c621be9363f6c865d81decd02..4ed7b6928cd78c4e6a02f0e4930116174295f4f2 100644 (file)
@@ -36,7 +36,6 @@
 #include <linux/sched.h>
 #include <linux/kernel.h>
 
-int                    doass = 1;
 static char            message[256];   /* keep it off the stack */
 static DEFINE_SPINLOCK(xfs_err_lock);
 
index 40b0f4c54d9e5fe2409c39e1da5ebf66a355042b..c5b9365a7e2ac2dd2eb3a8b6f243f8da2aea5a94 100644 (file)
@@ -50,16 +50,11 @@ extern void cmn_err(int, char *, ...);
 #endif
 
 #ifdef DEBUG
-# ifdef lint
-#  define ASSERT(EX)   ((void)0) /* avoid "constant in conditional" babble */
-# else
-#  define ASSERT(EX) ((!doass||(EX))?((void)0):assfail(#EX, __FILE__, __LINE__))
-# endif        /* lint */
+# define ASSERT(EX)    ((EX) ? ((void)0) : assfail(#EX, __FILE__, __LINE__))
 #else
 # define ASSERT(x)     ((void)0)
 #endif
 
-extern int doass;              /* dynamically turn off asserts */
 extern void assfail(char *, char *, int);
 #ifdef DEBUG
 extern unsigned long random(void);
index 36603db10fe97babbff94b0b367c413c621b9fe8..dcfe1970362016637854091e53715f6f2f30f569 100644 (file)
@@ -59,7 +59,7 @@
 #define        XFSA_FIXUP_BNO_OK       1
 #define        XFSA_FIXUP_CNT_OK       2
 
-int
+STATIC int
 xfs_alloc_search_busy(xfs_trans_t *tp,
                    xfs_agnumber_t agno,
                    xfs_agblock_t bno,
@@ -2562,7 +2562,7 @@ xfs_alloc_clear_busy(xfs_trans_t *tp,
 /*
  * returns non-zero if any of (agno,bno):len is in a busy list
  */
-int
+STATIC int
 xfs_alloc_search_busy(xfs_trans_t *tp,
                    xfs_agnumber_t agno,
                    xfs_agblock_t bno,
index ee8b5904ec7ccd7e7fb0a15ec3470cd1336e2c45..a41ad3a5e5540af909dcc446357da97b5111baef 100644 (file)
  * Provide the external interfaces to manage attribute lists.
  */
 
+#define ATTR_SYSCOUNT  2
+STATIC struct attrnames posix_acl_access;
+STATIC struct attrnames posix_acl_default;
+STATIC struct attrnames *attr_system_names[ATTR_SYSCOUNT];
+
 /*========================================================================
  * Function prototypes for the kernel.
  *========================================================================*/
@@ -83,6 +88,7 @@ STATIC int xfs_attr_shortform_addname(xfs_da_args_t *args);
 /*
  * Internal routines when attribute list is one block.
  */
+STATIC int xfs_attr_leaf_get(xfs_da_args_t *args);
 STATIC int xfs_attr_leaf_addname(xfs_da_args_t *args);
 STATIC int xfs_attr_leaf_removename(xfs_da_args_t *args);
 STATIC int xfs_attr_leaf_list(xfs_attr_list_context_t *context);
@@ -90,6 +96,7 @@ STATIC int xfs_attr_leaf_list(xfs_attr_list_context_t *context);
 /*
  * Internal routines when attribute list is more than one block.
  */
+STATIC int xfs_attr_node_get(xfs_da_args_t *args);
 STATIC int xfs_attr_node_addname(xfs_da_args_t *args);
 STATIC int xfs_attr_node_removename(xfs_da_args_t *args);
 STATIC int xfs_attr_node_list(xfs_attr_list_context_t *context);
@@ -1102,7 +1109,7 @@ xfs_attr_leaf_removename(xfs_da_args_t *args)
  * This leaf block cannot have a "remote" value, we only call this routine
  * if bmap_one_block() says there is only one block (ie: no remote blks).
  */
-int
+STATIC int
 xfs_attr_leaf_get(xfs_da_args_t *args)
 {
        xfs_dabuf_t *bp;
@@ -1707,7 +1714,7 @@ xfs_attr_refillstate(xfs_da_state_t *state)
  * block, ie: both true Btree attr lists and for single-leaf-blocks with
  * "remote" values taking up more blocks.
  */
-int
+STATIC int
 xfs_attr_node_get(xfs_da_args_t *args)
 {
        xfs_da_state_t *state;
@@ -2398,7 +2405,7 @@ posix_acl_default_exists(
        return xfs_acl_vhasacl_default(vp);
 }
 
-struct attrnames posix_acl_access = {
+STATIC struct attrnames posix_acl_access = {
        .attr_name      = "posix_acl_access",
        .attr_namelen   = sizeof("posix_acl_access") - 1,
        .attr_get       = posix_acl_access_get,
@@ -2407,7 +2414,7 @@ struct attrnames posix_acl_access = {
        .attr_exists    = posix_acl_access_exists,
 };
 
-struct attrnames posix_acl_default = {
+STATIC struct attrnames posix_acl_default = {
        .attr_name      = "posix_acl_default",
        .attr_namelen   = sizeof("posix_acl_default") - 1,
        .attr_get       = posix_acl_default_get,
@@ -2416,7 +2423,7 @@ struct attrnames posix_acl_default = {
        .attr_exists    = posix_acl_default_exists,
 };
 
-struct attrnames *attr_system_names[] =
+STATIC struct attrnames *attr_system_names[] =
        { &posix_acl_access, &posix_acl_default };
 
 
index 67cd0f5ac1a759e39507acb281f8867143963d59..45ab1c542baf9892de67055867ddf6b1842f8a25 100644 (file)
@@ -76,11 +76,6 @@ extern struct attrnames attr_system;
 extern struct attrnames attr_trusted;
 extern struct attrnames *attr_namespaces[ATTR_NAMECOUNT];
 
-#define ATTR_SYSCOUNT  2
-extern struct attrnames posix_acl_access;
-extern struct attrnames posix_acl_default;
-extern struct attrnames *attr_system_names[ATTR_SYSCOUNT];
-
 extern attrnames_t *attr_lookup_namespace(char *, attrnames_t **, int);
 extern int attr_generic_list(struct vnode *, void *, size_t, int, ssize_t *);
 
@@ -184,8 +179,6 @@ int xfs_attr_list(bhv_desc_t *, char *, int, int,
                         struct attrlist_cursor_kern *, struct cred *);
 int xfs_attr_inactive(struct xfs_inode *dp);
 
-int xfs_attr_node_get(struct xfs_da_args *);
-int xfs_attr_leaf_get(struct xfs_da_args *);
 int xfs_attr_shortform_getvalue(struct xfs_da_args *);
 int xfs_attr_fetch(struct xfs_inode *, char *, int,
                        char *, int *, int, struct cred *);
index b11256e58bf4f23911c4b6f787a46ade1c93fe93..1cdd574c63a9de334ab9359eeb87652378118c9a 100644 (file)
@@ -79,6 +79,8 @@
 /*
  * Routines used for growing the Btree.
  */
+STATIC int xfs_attr_leaf_create(xfs_da_args_t *args, xfs_dablk_t which_block,
+                                   xfs_dabuf_t **bpp);
 STATIC int xfs_attr_leaf_add_work(xfs_dabuf_t *leaf_buffer, xfs_da_args_t *args,
                                              int freemap_index);
 STATIC void xfs_attr_leaf_compact(xfs_trans_t *trans, xfs_dabuf_t *leaf_buffer);
@@ -91,6 +93,16 @@ STATIC int xfs_attr_leaf_figure_balance(xfs_da_state_t *state,
                                           int *number_entries_in_blk1,
                                           int *number_usedbytes_in_blk1);
 
+/*
+ * Routines used for shrinking the Btree.
+ */
+STATIC int xfs_attr_node_inactive(xfs_trans_t **trans, xfs_inode_t *dp,
+                                 xfs_dabuf_t *bp, int level);
+STATIC int xfs_attr_leaf_inactive(xfs_trans_t **trans, xfs_inode_t *dp,
+                                 xfs_dabuf_t *bp);
+STATIC int xfs_attr_leaf_freextent(xfs_trans_t **trans, xfs_inode_t *dp,
+                                  xfs_dablk_t blkno, int blkcnt);
+
 /*
  * Utility routines.
  */
@@ -99,6 +111,10 @@ STATIC void xfs_attr_leaf_moveents(xfs_attr_leafblock_t *src_leaf,
                                         xfs_attr_leafblock_t *dst_leaf,
                                         int dst_start, int move_count,
                                         xfs_mount_t *mp);
+STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index);
+STATIC int xfs_attr_put_listent(xfs_attr_list_context_t *context,
+                            attrnames_t *, char *name, int namelen,
+                            int valuelen);
 
 
 /*========================================================================
@@ -774,7 +790,7 @@ out:
  * Create the initial contents of a leaf attribute list
  * or a leaf in a node attribute list.
  */
-int
+STATIC int
 xfs_attr_leaf_create(xfs_da_args_t *args, xfs_dablk_t blkno, xfs_dabuf_t **bpp)
 {
        xfs_attr_leafblock_t *leaf;
@@ -2209,7 +2225,7 @@ xfs_attr_leaf_lasthash(xfs_dabuf_t *bp, int *count)
  * Calculate the number of bytes used to store the indicated attribute
  * (whether local or remote only calculate bytes in this block).
  */
-int
+STATIC int
 xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index)
 {
        xfs_attr_leaf_name_local_t *name_loc;
@@ -2380,7 +2396,7 @@ xfs_attr_leaf_list_int(xfs_dabuf_t *bp, xfs_attr_list_context_t *context)
  * we may be reading them directly out of a user buffer.
  */
 /*ARGSUSED*/
-int
+STATIC int
 xfs_attr_put_listent(xfs_attr_list_context_t *context,
                     attrnames_t *namesp, char *name, int namelen, int valuelen)
 {
@@ -2740,7 +2756,7 @@ xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp)
  * Recurse (gasp!) through the attribute nodes until we find leaves.
  * We're doing a depth-first traversal in order to invalidate everything.
  */
-int
+STATIC int
 xfs_attr_node_inactive(xfs_trans_t **trans, xfs_inode_t *dp, xfs_dabuf_t *bp,
                                   int level)
 {
@@ -2849,7 +2865,7 @@ xfs_attr_node_inactive(xfs_trans_t **trans, xfs_inode_t *dp, xfs_dabuf_t *bp,
  * Note that we must release the lock on the buffer so that we are not
  * caught holding something that the logging code wants to flush to disk.
  */
-int
+STATIC int
 xfs_attr_leaf_inactive(xfs_trans_t **trans, xfs_inode_t *dp, xfs_dabuf_t *bp)
 {
        xfs_attr_leafblock_t *leaf;
@@ -2934,7 +2950,7 @@ xfs_attr_leaf_inactive(xfs_trans_t **trans, xfs_inode_t *dp, xfs_dabuf_t *bp)
  * Look at all the extents for this logical region,
  * invalidate any buffers that are incore/in transactions.
  */
-int
+STATIC int
 xfs_attr_leaf_freextent(xfs_trans_t **trans, xfs_inode_t *dp,
                                    xfs_dablk_t blkno, int blkcnt)
 {
index b1480e0b3349227d9b032d5ed625576a0d28bf32..0a4cfad6df91baf68b7f1d38308703a59ae500d1 100644 (file)
@@ -261,8 +261,6 @@ int xfs_attr_leaf_flipflags(xfs_da_args_t *args);
 /*
  * Routines used for growing the Btree.
  */
-int    xfs_attr_leaf_create(struct xfs_da_args *args, xfs_dablk_t which_block,
-                                   struct xfs_dabuf **bpp);
 int    xfs_attr_leaf_split(struct xfs_da_state *state,
                                   struct xfs_da_state_blk *oldblk,
                                   struct xfs_da_state_blk *newblk);
@@ -284,12 +282,6 @@ void       xfs_attr_leaf_unbalance(struct xfs_da_state *state,
                                       struct xfs_da_state_blk *drop_blk,
                                       struct xfs_da_state_blk *save_blk);
 int    xfs_attr_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp);
-int    xfs_attr_node_inactive(struct xfs_trans **trans, struct xfs_inode *dp,
-                                     struct xfs_dabuf *bp, int level);
-int    xfs_attr_leaf_inactive(struct xfs_trans **trans, struct xfs_inode *dp,
-                                     struct xfs_dabuf *bp);
-int    xfs_attr_leaf_freextent(struct xfs_trans **trans, struct xfs_inode *dp,
-                                      xfs_dablk_t blkno, int blkcnt);
 
 /*
  * Utility routines.
@@ -299,10 +291,6 @@ int        xfs_attr_leaf_order(struct xfs_dabuf *leaf1_bp,
                                   struct xfs_dabuf *leaf2_bp);
 int    xfs_attr_leaf_newentsize(struct xfs_da_args *args, int blocksize,
                                        int *local);
-int    xfs_attr_leaf_entsize(struct xfs_attr_leafblock *leaf, int index);
-int    xfs_attr_put_listent(struct xfs_attr_list_context *context,
-                            struct attrnames *, char *name, int namelen,
-                            int valuelen);
 int    xfs_attr_rolltrans(struct xfs_trans **transp, struct xfs_inode *dp);
 
 #endif /* __XFS_ATTR_LEAF_H__ */
index a20a6c3dc13e751cd7ac7ef9c24c537704d75d9f..76c9ad3875ef8aeb6574475676fca2cf257cf329 100644 (file)
@@ -45,7 +45,7 @@
 /*
  * Index of high bit number in byte, -1 for none set, 0..7 otherwise.
  */
-const char xfs_highbit[256] = {
+STATIC const char xfs_highbit[256] = {
        -1, 0, 1, 1, 2, 2, 2, 2,                        /* 00 .. 07 */
        3, 3, 3, 3, 3, 3, 3, 3,                 /* 08 .. 0f */
        4, 4, 4, 4, 4, 4, 4, 4,                 /* 10 .. 17 */
index de316241866305c988f186730948f0fe2753e5b7..6f5d283888aa2b9ab243d93f8df1fe25c4e8cc34 100644 (file)
@@ -301,6 +301,19 @@ xfs_bmap_search_extents(
        xfs_bmbt_irec_t *gotp,          /* out: extent entry found */
        xfs_bmbt_irec_t *prevp);        /* out: previous extent entry found */
 
+/*
+ * Check the last inode extent to determine whether this allocation will result
+ * in blocks being allocated at the end of the file. When we allocate new data
+ * blocks at the end of the file which do not start at the previous data block,
+ * we will try to align the new blocks at stripe unit boundaries.
+ */
+STATIC int                             /* error */
+xfs_bmap_isaeof(
+       xfs_inode_t     *ip,            /* incore inode pointer */
+       xfs_fileoff_t   off,            /* file offset in fsblocks */
+       int             whichfork,      /* data or attribute fork */
+       char            *aeof);         /* return value */
+
 #ifdef XFS_BMAP_TRACE
 /*
  * Add a bmap trace buffer entry.  Base routine for the others.
@@ -4532,18 +4545,17 @@ xfs_bmapi(
        xfs_extlen_t    alen;           /* allocated extent length */
        xfs_fileoff_t   aoff;           /* allocated file offset */
        xfs_bmalloca_t  bma;            /* args for xfs_bmap_alloc */
-       char            contig;         /* allocation must be one extent */
        xfs_btree_cur_t *cur;           /* bmap btree cursor */
-       char            delay;          /* this request is for delayed alloc */
        xfs_fileoff_t   end;            /* end of mapped file region */
        int             eof;            /* we've hit the end of extent list */
+       char            contig;         /* allocation must be one extent */
+       char            delay;          /* this request is for delayed alloc */
+       char            exact;          /* don't do all of wasdelayed extent */
        xfs_bmbt_rec_t  *ep;            /* extent list entry pointer */
        int             error;          /* error return */
-       char            exact;          /* don't do all of wasdelayed extent */
        xfs_bmbt_irec_t got;            /* current extent list record */
        xfs_ifork_t     *ifp;           /* inode fork pointer */
        xfs_extlen_t    indlen;         /* indirect blocks length */
-       char            inhole;         /* current location is hole in file */
        xfs_extnum_t    lastx;          /* last useful extent number */
        int             logflags;       /* flags for transaction logging */
        xfs_extlen_t    minleft;        /* min blocks left after allocation */
@@ -4554,13 +4566,15 @@ xfs_bmapi(
        xfs_extnum_t    nextents;       /* number of extents in file */
        xfs_fileoff_t   obno;           /* old block number (offset) */
        xfs_bmbt_irec_t prev;           /* previous extent list record */
-       char            stateless;      /* ignore state flag set */
        int             tmp_logflags;   /* temp flags holder */
+       int             whichfork;      /* data or attr fork */
+       char            inhole;         /* current location is hole in file */
+       char            stateless;      /* ignore state flag set */
        char            trim;           /* output trimmed to match range */
        char            userdata;       /* allocating non-metadata */
        char            wasdelay;       /* old extent was delayed */
-       int             whichfork;      /* data or attr fork */
        char            wr;             /* this is a write request */
+       char            rt;             /* this is a realtime file */
        char            rsvd;           /* OK to allocate reserved blocks */
 #ifdef DEBUG
        xfs_fileoff_t   orig_bno;       /* original block number value */
@@ -4590,6 +4604,7 @@ xfs_bmapi(
        }
        if (XFS_FORCED_SHUTDOWN(mp))
                return XFS_ERROR(EIO);
+       rt = XFS_IS_REALTIME_INODE(ip);
        ifp = XFS_IFORK_PTR(ip, whichfork);
        ASSERT(ifp->if_ext_max ==
               XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t));
@@ -4694,9 +4709,16 @@ xfs_bmapi(
                        }
                        minlen = contig ? alen : 1;
                        if (delay) {
-                               indlen = (xfs_extlen_t)
-                                       xfs_bmap_worst_indlen(ip, alen);
-                               ASSERT(indlen > 0);
+                               xfs_extlen_t    extsz = 0;
+
+                               /* Figure out the extent size, adjust alen */
+                               if (rt) {
+                                       if (!(extsz = ip->i_d.di_extsize))
+                                               extsz = mp->m_sb.sb_rextsize;
+                                       alen = roundup(alen, extsz);
+                                       extsz = alen / mp->m_sb.sb_rextsize;
+                               }
+
                                /*
                                 * Make a transaction-less quota reservation for
                                 * delayed allocation blocks. This number gets
@@ -4704,8 +4726,10 @@ xfs_bmapi(
                                 * We return EDQUOT if we haven't allocated
                                 * blks already inside this loop;
                                 */
-                               if (XFS_TRANS_RESERVE_BLKQUOTA(
-                                               mp, NULL, ip, (long)alen)) {
+                               if (XFS_TRANS_RESERVE_QUOTA_NBLKS(
+                                               mp, NULL, ip, (long)alen, 0,
+                                               rt ? XFS_QMOPT_RES_RTBLKS :
+                                                    XFS_QMOPT_RES_REGBLKS)) {
                                        if (n == 0) {
                                                *nmap = 0;
                                                ASSERT(cur == NULL);
@@ -4718,40 +4742,34 @@ xfs_bmapi(
                                 * Split changing sb for alen and indlen since
                                 * they could be coming from different places.
                                 */
-                               if (ip->i_d.di_flags & XFS_DIFLAG_REALTIME) {
-                                       xfs_extlen_t    extsz;
-                                       xfs_extlen_t    ralen;
-                                       if (!(extsz = ip->i_d.di_extsize))
-                                               extsz = mp->m_sb.sb_rextsize;
-                                       ralen = roundup(alen, extsz);
-                                       ralen = ralen / mp->m_sb.sb_rextsize;
-                                       if (xfs_mod_incore_sb(mp,
-                                               XFS_SBS_FREXTENTS,
-                                               -(ralen), rsvd)) {
-                                               if (XFS_IS_QUOTA_ON(ip->i_mount))
-                                                       XFS_TRANS_UNRESERVE_BLKQUOTA(
-                                                               mp, NULL, ip,
-                                                               (long)alen);
-                                               break;
-                                       }
-                               } else {
-                                       if (xfs_mod_incore_sb(mp,
-                                                             XFS_SBS_FDBLOCKS,
-                                                             -(alen), rsvd)) {
-                                               if (XFS_IS_QUOTA_ON(ip->i_mount))
-                                                       XFS_TRANS_UNRESERVE_BLKQUOTA(
-                                                               mp, NULL, ip,
-                                                               (long)alen);
-                                               break;
-                                       }
-                               }
+                               indlen = (xfs_extlen_t)
+                                       xfs_bmap_worst_indlen(ip, alen);
+                               ASSERT(indlen > 0);
 
-                               if (xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS,
-                                               -(indlen), rsvd)) {
-                                       XFS_TRANS_UNRESERVE_BLKQUOTA(
-                                               mp, NULL, ip, (long)alen);
+                               if (rt)
+                                       error = xfs_mod_incore_sb(mp,
+                                                       XFS_SBS_FREXTENTS,
+                                                       -(extsz), rsvd);
+                               else
+                                       error = xfs_mod_incore_sb(mp,
+                                                       XFS_SBS_FDBLOCKS,
+                                                       -(alen), rsvd);
+                               if (!error)
+                                       error = xfs_mod_incore_sb(mp,
+                                                       XFS_SBS_FDBLOCKS,
+                                                       -(indlen), rsvd);
+
+                               if (error) {
+                                       if (XFS_IS_QUOTA_ON(ip->i_mount))
+                                               /* unreserve the blocks now */
+                                               XFS_TRANS_UNRESERVE_QUOTA_NBLKS(
+                                                       mp, NULL, ip,
+                                                       (long)alen, 0, rt ?
+                                                       XFS_QMOPT_RES_RTBLKS :
+                                                       XFS_QMOPT_RES_REGBLKS);
                                        break;
                                }
+
                                ip->i_delayed_blks += alen;
                                abno = NULLSTARTBLOCK(indlen);
                        } else {
@@ -5376,13 +5394,24 @@ xfs_bunmapi(
                }
                if (wasdel) {
                        ASSERT(STARTBLOCKVAL(del.br_startblock) > 0);
-                       xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS,
-                               (int)del.br_blockcount, rsvd);
-                       /* Unreserve our quota space */
-                       XFS_TRANS_RESERVE_QUOTA_NBLKS(
-                               mp, NULL, ip, -((long)del.br_blockcount), 0,
-                               isrt ?  XFS_QMOPT_RES_RTBLKS :
+                       /* Update realtim/data freespace, unreserve quota */
+                       if (isrt) {
+                               xfs_filblks_t rtexts;
+
+                               rtexts = XFS_FSB_TO_B(mp, del.br_blockcount);
+                               do_div(rtexts, mp->m_sb.sb_rextsize);
+                               xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS,
+                                               (int)rtexts, rsvd);
+                               XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, NULL, ip,
+                                       -((long)del.br_blockcount), 0,
+                                       XFS_QMOPT_RES_RTBLKS);
+                       } else {
+                               xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS,
+                                               (int)del.br_blockcount, rsvd);
+                               XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, NULL, ip,
+                                       -((long)del.br_blockcount), 0,
                                        XFS_QMOPT_RES_REGBLKS);
+                       }
                        ip->i_delayed_blks -= del.br_blockcount;
                        if (cur)
                                cur->bc_private.b.flags |=
@@ -5714,7 +5743,7 @@ unlock_and_return:
  * blocks at the end of the file which do not start at the previous data block,
  * we will try to align the new blocks at stripe unit boundaries.
  */
-int                                    /* error */
+STATIC int                             /* error */
 xfs_bmap_isaeof(
        xfs_inode_t     *ip,            /* incore inode pointer */
        xfs_fileoff_t   off,            /* file offset in fsblocks */
index f1bc22fb26aec4abb63a7df717c22f40f7a3114a..e6d22ec9b2e4c90867035840fff72abd8d2084d2 100644 (file)
@@ -331,19 +331,6 @@ xfs_getbmap(
        void                    __user *ap,     /* pointer to user's array */
        int                     iflags);        /* interface flags */
 
-/*
- * Check the last inode extent to determine whether this allocation will result
- * in blocks being allocated at the end of the file. When we allocate new data
- * blocks at the end of the file which do not start at the previous data block,
- * we will try to align the new blocks at stripe unit boundaries.
- */
-int
-xfs_bmap_isaeof(
-       struct xfs_inode        *ip,
-       xfs_fileoff_t           off,
-       int                     whichfork,
-       char                    *aeof);
-
 /*
  * Check if the endoff is outside the last extent. If so the caller will grow
  * the allocation to a stripe unit boundary
index 163305a79fcc583cac98d43ce8c21ba1bc0a3fd9..09c413576ba81b838254837c3f708ca24797e88c 100644 (file)
@@ -2331,20 +2331,6 @@ xfs_bmbt_lookup_ge(
        return xfs_bmbt_lookup(cur, XFS_LOOKUP_GE, stat);
 }
 
-int                                    /* error */
-xfs_bmbt_lookup_le(
-       xfs_btree_cur_t *cur,
-       xfs_fileoff_t   off,
-       xfs_fsblock_t   bno,
-       xfs_filblks_t   len,
-       int             *stat)          /* success/failure */
-{
-       cur->bc_rec.b.br_startoff = off;
-       cur->bc_rec.b.br_startblock = bno;
-       cur->bc_rec.b.br_blockcount = len;
-       return xfs_bmbt_lookup(cur, XFS_LOOKUP_LE, stat);
-}
-
 /*
  * Give the bmap btree a new root block.  Copy the old broot contents
  * down into a real block and make the broot point to it.
index 843ff12b4bf22307d6f5db24b64051c3efaef7b1..0a40cf126c285cfb940b5915f898722fc6ca1ea3 100644 (file)
@@ -580,14 +580,6 @@ xfs_bmbt_lookup_ge(
        xfs_filblks_t,
        int *);
 
-int
-xfs_bmbt_lookup_le(
-       struct xfs_btree_cur *,
-       xfs_fileoff_t,
-       xfs_fsblock_t,
-       xfs_filblks_t,
-       int *);
-
 /*
  * Give the bmap btree a new root block.  Copy the old broot contents
  * down into a real block and make the broot point to it.
index 9dd22dd95487d82343d40265f1874adfa2c03fc5..0cc63d657a14ed2937df63826b3445aac41ef600 100644 (file)
@@ -89,6 +89,16 @@ xfs_btree_maxrecs(
  * Internal routines.
  */
 
+/*
+ * Retrieve the block pointer from the cursor at the given level.
+ * This may be a bmap btree root or from a buffer.
+ */
+STATIC xfs_btree_block_t *                     /* generic btree block pointer */
+xfs_btree_get_block(
+       xfs_btree_cur_t         *cur,   /* btree cursor */
+       int                     level,  /* level in btree */
+       struct xfs_buf          **bpp); /* buffer containing the block */
+
 /*
  * Checking routine: return maxrecs for the block.
  */
@@ -497,7 +507,7 @@ xfs_btree_firstrec(
  * Retrieve the block pointer from the cursor at the given level.
  * This may be a bmap btree root or from a buffer.
  */
-xfs_btree_block_t *                    /* generic btree block pointer */
+STATIC xfs_btree_block_t *             /* generic btree block pointer */
 xfs_btree_get_block(
        xfs_btree_cur_t         *cur,   /* btree cursor */
        int                     level,  /* level in btree */
index 93872bba41f50e1f69a2b4f0eb6c9611d5797005..09b4e1532a351da8e00a1c372b01380ff82687a5 100644 (file)
@@ -324,16 +324,6 @@ xfs_btree_firstrec(
        xfs_btree_cur_t         *cur,   /* btree cursor */
        int                     level); /* level to change */
 
-/*
- * Retrieve the block pointer from the cursor at the given level.
- * This may be a bmap btree root or from a buffer.
- */
-xfs_btree_block_t *                    /* generic btree block pointer */
-xfs_btree_get_block(
-       xfs_btree_cur_t         *cur,   /* btree cursor */
-       int                     level,  /* level in btree */
-       struct xfs_buf          **bpp); /* buffer containing the block */
-
 /*
  * Get a buffer for the block, return it with no data read.
  * Long-form addressing.
index 9ab0039f07df214462b07eedfbc6f403cb5f64c7..30b8285ad4769de7f6ee5b5007ae80dee9519b29 100644 (file)
@@ -172,7 +172,7 @@ STATIC void xfs_buf_do_callbacks(xfs_buf_t *bp, xfs_log_item_t *lip);
  *
  * If the XFS_BLI_STALE flag has been set, then log nothing.
  */
-uint
+STATIC uint
 xfs_buf_item_size(
        xfs_buf_log_item_t      *bip)
 {
@@ -240,7 +240,7 @@ xfs_buf_item_size(
  * format structure, and the rest point to contiguous chunks
  * within the buffer.
  */
-void
+STATIC void
 xfs_buf_item_format(
        xfs_buf_log_item_t      *bip,
        xfs_log_iovec_t         *log_vector)
@@ -365,7 +365,7 @@ xfs_buf_item_format(
  * item in memory so it cannot be written out.  Simply call bpin()
  * on the buffer to do this.
  */
-void
+STATIC void
 xfs_buf_item_pin(
        xfs_buf_log_item_t      *bip)
 {
@@ -391,7 +391,7 @@ xfs_buf_item_pin(
  * If the XFS_BLI_STALE flag is set and we are the last reference,
  * then free up the buf log item and unlock the buffer.
  */
-void
+STATIC void
 xfs_buf_item_unpin(
        xfs_buf_log_item_t      *bip,
        int                     stale)
@@ -446,7 +446,7 @@ xfs_buf_item_unpin(
  * so we need to free the item's descriptor (that points to the item)
  * in the transaction.
  */
-void
+STATIC void
 xfs_buf_item_unpin_remove(
        xfs_buf_log_item_t      *bip,
        xfs_trans_t             *tp)
@@ -493,7 +493,7 @@ xfs_buf_item_unpin_remove(
  * the lock right away, return 0.  If we can get the lock, pull the
  * buffer from the free list, mark it busy, and return 1.
  */
-uint
+STATIC uint
 xfs_buf_item_trylock(
        xfs_buf_log_item_t      *bip)
 {
@@ -537,7 +537,7 @@ xfs_buf_item_trylock(
  * This is for support of xfs_trans_bhold(). Make sure the
  * XFS_BLI_HOLD field is cleared if we don't free the item.
  */
-void
+STATIC void
 xfs_buf_item_unlock(
        xfs_buf_log_item_t      *bip)
 {
@@ -635,7 +635,7 @@ xfs_buf_item_unlock(
  * by returning the original lsn of that transaction here rather than
  * the current one.
  */
-xfs_lsn_t
+STATIC xfs_lsn_t
 xfs_buf_item_committed(
        xfs_buf_log_item_t      *bip,
        xfs_lsn_t               lsn)
@@ -654,7 +654,7 @@ xfs_buf_item_committed(
  * and have aborted this transaction, we'll trap this buffer when it tries to
  * get written out.
  */
-void
+STATIC void
 xfs_buf_item_abort(
        xfs_buf_log_item_t      *bip)
 {
@@ -674,7 +674,7 @@ xfs_buf_item_abort(
  * B_DELWRI set, then get it going out to disk with a call to bawrite().
  * If not, then just release the buffer.
  */
-void
+STATIC void
 xfs_buf_item_push(
        xfs_buf_log_item_t      *bip)
 {
@@ -693,7 +693,7 @@ xfs_buf_item_push(
 }
 
 /* ARGSUSED */
-void
+STATIC void
 xfs_buf_item_committing(xfs_buf_log_item_t *bip, xfs_lsn_t commit_lsn)
 {
 }
@@ -701,7 +701,7 @@ xfs_buf_item_committing(xfs_buf_log_item_t *bip, xfs_lsn_t commit_lsn)
 /*
  * This is the ops vector shared by all buf log items.
  */
-struct xfs_item_ops xfs_buf_item_ops = {
+STATIC struct xfs_item_ops xfs_buf_item_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_buf_item_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_buf_item_format,
index 5f1b0c9308f672f37bb101b32011a4c6a1cfd2b0..01aed5f2d579718e52bbba0f3a2f580167e9f4e7 100644 (file)
@@ -80,7 +80,7 @@ typedef struct xfs_buf_log_format_t {
  * user or group dquots and may require special recovery handling.
  */
 #define        XFS_BLI_UDQUOT_BUF      0x4
-/* #define XFS_BLI_PDQUOT_BUF  0x8 */
+#define XFS_BLI_PDQUOT_BUF     0x8
 #define        XFS_BLI_GDQUOT_BUF      0x10
 
 #define        XFS_BLI_CHUNK           128
index d7fe2886676440fb0c7328141e6a8e23791c6080..8b792ddf2164d05111ab6075cc40c596ce4bd46c 100644 (file)
@@ -113,7 +113,10 @@ STATIC void xfs_da_node_unbalance(xfs_da_state_t *state,
 STATIC uint    xfs_da_node_lasthash(xfs_dabuf_t *bp, int *count);
 STATIC int     xfs_da_node_order(xfs_dabuf_t *node1_bp, xfs_dabuf_t *node2_bp);
 STATIC xfs_dabuf_t *xfs_da_buf_make(int nbuf, xfs_buf_t **bps, inst_t *ra);
-
+STATIC int     xfs_da_blk_unlink(xfs_da_state_t *state,
+                                 xfs_da_state_blk_t *drop_blk,
+                                 xfs_da_state_blk_t *save_blk);
+STATIC void    xfs_da_state_kill_altpath(xfs_da_state_t *state);
 
 /*========================================================================
  * Routines used for growing the Btree.
@@ -1424,7 +1427,7 @@ xfs_da_node_lasthash(xfs_dabuf_t *bp, int *count)
 /*
  * Unlink a block from a doubly linked list of blocks.
  */
-int                                                    /* error */
+STATIC int                                             /* error */
 xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk,
                                 xfs_da_state_blk_t *save_blk)
 {
@@ -2381,7 +2384,7 @@ xfs_da_state_alloc(void)
 /*
  * Kill the altpath contents of a da-state structure.
  */
-void
+STATIC void
 xfs_da_state_kill_altpath(xfs_da_state_t *state)
 {
        int     i;
index 9fc699d9699575f8fc2ad69cb095b4ca3d5a6565..3a9b9e809c602481ecd48264a4bcf4fe880e83be 100644 (file)
@@ -296,8 +296,6 @@ int xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path,
 /*
  * Utility routines.
  */
-int    xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk,
-                                        xfs_da_state_blk_t *save_blk);
 int    xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk,
                                       xfs_da_state_blk_t *new_blk);
 
@@ -320,7 +318,6 @@ uint xfs_da_hashname(uchar_t *name_string, int name_length);
 uint xfs_da_log2_roundup(uint i);
 xfs_da_state_t *xfs_da_state_alloc(void);
 void xfs_da_state_free(xfs_da_state_t *state);
-void xfs_da_state_kill_altpath(xfs_da_state_t *state);
 
 void xfs_da_buf_done(xfs_dabuf_t *dabuf);
 void xfs_da_log_buf(struct xfs_trans *tp, xfs_dabuf_t *dabuf, uint first,
index 63abdc2ac7f4ba0da434c45e32f08a8e6be5209a..681be5c93af500f63fc2cd4e744682023b6c7497 100644 (file)
@@ -180,9 +180,10 @@ xfs_swapext(
                goto error0;
        }
 
-       if (VN_CACHED(tvp) != 0)
-               xfs_inval_cached_pages(XFS_ITOV(tip), &(tip->i_iocore),
-                                               (xfs_off_t)0, 0, 0);
+       if (VN_CACHED(tvp) != 0) {
+               xfs_inval_cached_trace(&tip->i_iocore, 0, -1, 0, -1);
+               VOP_FLUSHINVAL_PAGES(tvp, 0, -1, FI_REMAPF_LOCKED);
+       }
 
        /* Verify O_DIRECT for ftmp */
        if (VN_CACHED(tvp) != 0) {
index db9887a107deaab10addcc4e2cc96476ec1e4a03..a0aa0e44ff9d6dfe3afa918c944ff6d27ec53577 100644 (file)
@@ -304,7 +304,7 @@ xfs_dir2_data_freeinsert(
 /*
  * Remove a bestfree entry from the table.
  */
-void
+STATIC void
 xfs_dir2_data_freeremove(
        xfs_dir2_data_t         *d,             /* data block pointer */
        xfs_dir2_data_free_t    *dfp,           /* bestfree entry pointer */
index 3f02294ccff0a574935a06ae10d167a4b5b6ec84..476cac920bf5037d5222f3423bba44367468dd91 100644 (file)
@@ -192,10 +192,6 @@ extern xfs_dir2_data_free_t *
        xfs_dir2_data_freeinsert(xfs_dir2_data_t *d,
                                 xfs_dir2_data_unused_t *dup, int *loghead);
 
-extern void
-       xfs_dir2_data_freeremove(xfs_dir2_data_t *d,
-                                xfs_dir2_data_free_t *dfp, int *loghead);
-
 extern void
        xfs_dir2_data_freescan(struct xfs_mount *mp, xfs_dir2_data_t *d,
                               int *loghead, char *aendp);
index 262d1e86df30f01d8c46995f05ad1eb4fd212639..056f5283904b981184b968e75944112ee109d20c 100644 (file)
@@ -77,6 +77,10 @@ static void xfs_dir2_leaf_check(xfs_inode_t *dp, xfs_dabuf_t *bp);
 #endif
 static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, xfs_dabuf_t **lbpp,
                                    int *indexp, xfs_dabuf_t **dbpp);
+static void xfs_dir2_leaf_log_bests(struct xfs_trans *tp, struct xfs_dabuf *bp,
+                                   int first, int last);
+static void xfs_dir2_leaf_log_tail(struct xfs_trans *tp, struct xfs_dabuf *bp);
+
 
 /*
  * Convert a block form directory to a leaf form directory.
@@ -1214,7 +1218,7 @@ xfs_dir2_leaf_init(
 /*
  * Log the bests entries indicated from a leaf1 block.
  */
-void
+static void
 xfs_dir2_leaf_log_bests(
        xfs_trans_t             *tp,            /* transaction pointer */
        xfs_dabuf_t             *bp,            /* leaf buffer */
@@ -1278,7 +1282,7 @@ xfs_dir2_leaf_log_header(
 /*
  * Log the tail of the leaf1 block.
  */
-void
+STATIC void
 xfs_dir2_leaf_log_tail(
        xfs_trans_t             *tp,            /* transaction pointer */
        xfs_dabuf_t             *bp)            /* leaf buffer */
index 7f20eee56a52a158194250074a12754a254d147b..3303cd6f4c0045362b4b1e87fa27918a2baf470d 100644 (file)
@@ -329,16 +329,9 @@ extern void
        xfs_dir2_leaf_log_ents(struct xfs_trans *tp, struct xfs_dabuf *bp,
                               int first, int last);
 
-extern void
-       xfs_dir2_leaf_log_bests(struct xfs_trans *tp, struct xfs_dabuf *bp,
-                               int first, int last);
-
 extern void
        xfs_dir2_leaf_log_header(struct xfs_trans *tp, struct xfs_dabuf *bp);
 
-extern void
-       xfs_dir2_leaf_log_tail(struct xfs_trans *tp, struct xfs_dabuf *bp);
-
 extern int
        xfs_dir2_leaf_lookup(struct xfs_da_args *args);
 
index 617018d6bbdc0c47f0b64ff1d8ead575785adb88..c2ea6171fb0e3dff5e9afa32c0674a4782df0476 100644 (file)
@@ -91,6 +91,10 @@ STATIC int xfs_dir_leaf_figure_balance(xfs_da_state_t *state,
                                          int *number_entries_in_blk1,
                                          int *number_namebytes_in_blk1);
 
+STATIC int xfs_dir_leaf_create(struct xfs_da_args *args,
+                               xfs_dablk_t which_block,
+                               struct xfs_dabuf **bpp);
+
 /*
  * Utility routines.
  */
@@ -781,7 +785,7 @@ xfs_dir_leaf_to_node(xfs_da_args_t *args)
  * Create the initial contents of a leaf directory
  * or a leaf in a node directory.
  */
-int
+STATIC int
 xfs_dir_leaf_create(xfs_da_args_t *args, xfs_dablk_t blkno, xfs_dabuf_t **bpp)
 {
        xfs_dir_leafblock_t *leaf;
index 00d68d33cc7a39e825ec0b313aea05134844ebc1..dd423ce1bc8d082a177effddde9f35b341932996 100644 (file)
@@ -202,8 +202,6 @@ int xfs_dir_leaf_to_shortform(struct xfs_da_args *args);
 /*
  * Routines used for growing the Btree.
  */
-int    xfs_dir_leaf_create(struct xfs_da_args *args, xfs_dablk_t which_block,
-                                  struct xfs_dabuf **bpp);
 int    xfs_dir_leaf_split(struct xfs_da_state *state,
                                  struct xfs_da_state_blk *oldblk,
                                  struct xfs_da_state_blk *newblk);
index 55ae3e67d2450b3dd4188f968e56ec24046bd928..55c17adaaa37d64e3c7b22be419bbd6398a9c428 100644 (file)
@@ -166,27 +166,32 @@ typedef enum {
 #define DM_FLAGS_NDELAY                0x001   /* return EAGAIN after dm_pending() */
 #define DM_FLAGS_UNWANTED      0x002   /* event not in fsys dm_eventset_t */
 #define DM_FLAGS_ISEM          0x004   /* thread holds i_sem */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21)
-/* i_alloc_sem was added in 2.4.22-pre1 */
 #define DM_FLAGS_IALLOCSEM_RD  0x010   /* thread holds i_alloc_sem rd */
 #define DM_FLAGS_IALLOCSEM_WR  0x020   /* thread holds i_alloc_sem wr */
-#endif
-#endif
 
 /*
  *     Based on IO_ISDIRECT, decide which i_ flag is set.
  */
-#ifdef DM_FLAGS_IALLOCSEM_RD
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
+#define DM_SEM_FLAG_RD(ioflags) (((ioflags) & IO_ISDIRECT) ? \
+                             DM_FLAGS_ISEM : 0)
+#define DM_SEM_FLAG_WR (DM_FLAGS_IALLOCSEM_WR | DM_FLAGS_ISEM)
+#endif
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) && \
+    (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,22))
 #define DM_SEM_FLAG_RD(ioflags) (((ioflags) & IO_ISDIRECT) ? \
                              DM_FLAGS_IALLOCSEM_RD : DM_FLAGS_ISEM)
 #define DM_SEM_FLAG_WR (DM_FLAGS_IALLOCSEM_WR | DM_FLAGS_ISEM)
-#else
+#endif
+
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,21)
 #define DM_SEM_FLAG_RD(ioflags) (((ioflags) & IO_ISDIRECT) ? \
                              0 : DM_FLAGS_ISEM)
 #define DM_SEM_FLAG_WR (DM_FLAGS_ISEM)
 #endif
 
+
 /*
  *     Macros to turn caller specified delay/block flags into
  *     dm_send_xxxx_event flag DM_FLAGS_NDELAY.
index bbe1dea11c0879d463ae0591cf94e6b65c890acb..dcd3fdd5c1f7817697090617136c7622ebc67419 100644 (file)
@@ -280,7 +280,7 @@ xfs_error_report(
        }
 }
 
-void
+STATIC void
 xfs_hex_dump(void *p, int length)
 {
        __uint8_t *uip = (__uint8_t*)p;
index 6bc0535c0a65bf345149f90ea61de527b75ca603..52ee2b90b5edc370f602a2390e21266e18284bc3 100644 (file)
@@ -73,9 +73,6 @@ xfs_corruption_error(
        int             linenum,
        inst_t          *ra);
 
-extern void
-xfs_hex_dump(void *p, int length);
-
 #define        XFS_ERROR_REPORT(e, lvl, mp)    \
        xfs_error_report(e, lvl, mp, __FILE__, __LINE__, __return_address)
 #define        XFS_CORRUPTION_ERROR(e, lvl, mp, mem)   \
index 5eafd5b6321183cea0bfba7acbce1be7000b5200..db7cbd1bc8573e81d5f05699032b7731573a5bf2 100644 (file)
@@ -59,6 +59,18 @@ STATIC void  xfs_efi_item_abort(xfs_efi_log_item_t *);
 STATIC void    xfs_efd_item_abort(xfs_efd_log_item_t *);
 
 
+void
+xfs_efi_item_free(xfs_efi_log_item_t *efip)
+{
+       int nexts = efip->efi_format.efi_nextents;
+
+       if (nexts > XFS_EFI_MAX_FAST_EXTENTS) {
+               kmem_free(efip, sizeof(xfs_efi_log_item_t) +
+                               (nexts - 1) * sizeof(xfs_extent_t));
+       } else {
+               kmem_zone_free(xfs_efi_zone, efip);
+       }
+}
 
 /*
  * This returns the number of iovecs needed to log the given efi item.
@@ -120,8 +132,6 @@ xfs_efi_item_pin(xfs_efi_log_item_t *efip)
 STATIC void
 xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale)
 {
-       int             nexts;
-       int             size;
        xfs_mount_t     *mp;
        SPLDECL(s);
 
@@ -132,21 +142,11 @@ xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale)
                 * xfs_trans_delete_ail() drops the AIL lock.
                 */
                xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s);
-
-               nexts = efip->efi_format.efi_nextents;
-               if (nexts > XFS_EFI_MAX_FAST_EXTENTS) {
-                       size = sizeof(xfs_efi_log_item_t);
-                       size += (nexts - 1) * sizeof(xfs_extent_t);
-                       kmem_free(efip, size);
-               } else {
-                       kmem_zone_free(xfs_efi_zone, efip);
-               }
+               xfs_efi_item_free(efip);
        } else {
                efip->efi_flags |= XFS_EFI_COMMITTED;
                AIL_UNLOCK(mp, s);
        }
-
-       return;
 }
 
 /*
@@ -159,8 +159,6 @@ xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale)
 STATIC void
 xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp)
 {
-       int             nexts;
-       int             size;
        xfs_mount_t     *mp;
        xfs_log_item_desc_t     *lidp;
        SPLDECL(s);
@@ -178,23 +176,11 @@ xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp)
                 * xfs_trans_delete_ail() drops the AIL lock.
                 */
                xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s);
-               /*
-                * now free the item itself
-                */
-               nexts = efip->efi_format.efi_nextents;
-               if (nexts > XFS_EFI_MAX_FAST_EXTENTS) {
-                       size = sizeof(xfs_efi_log_item_t);
-                       size += (nexts - 1) * sizeof(xfs_extent_t);
-                       kmem_free(efip, size);
-               } else {
-                       kmem_zone_free(xfs_efi_zone, efip);
-               }
+               xfs_efi_item_free(efip);
        } else {
                efip->efi_flags |= XFS_EFI_COMMITTED;
                AIL_UNLOCK(mp, s);
        }
-
-       return;
 }
 
 /*
@@ -245,18 +231,7 @@ xfs_efi_item_committed(xfs_efi_log_item_t *efip, xfs_lsn_t lsn)
 STATIC void
 xfs_efi_item_abort(xfs_efi_log_item_t *efip)
 {
-       int     nexts;
-       int     size;
-
-       nexts = efip->efi_format.efi_nextents;
-       if (nexts > XFS_EFI_MAX_FAST_EXTENTS) {
-               size = sizeof(xfs_efi_log_item_t);
-               size += (nexts - 1) * sizeof(xfs_extent_t);
-               kmem_free(efip, size);
-       } else {
-               kmem_zone_free(xfs_efi_zone, efip);
-       }
-       return;
+       xfs_efi_item_free(efip);
 }
 
 /*
@@ -288,7 +263,7 @@ xfs_efi_item_committing(xfs_efi_log_item_t *efip, xfs_lsn_t lsn)
 /*
  * This is the ops vector shared by all efi log items.
  */
-struct xfs_item_ops xfs_efi_item_ops = {
+STATIC struct xfs_item_ops xfs_efi_item_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_efi_item_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_efi_item_format,
@@ -355,8 +330,6 @@ xfs_efi_release(xfs_efi_log_item_t  *efip,
 {
        xfs_mount_t     *mp;
        int             extents_left;
-       uint            size;
-       int             nexts;
        SPLDECL(s);
 
        mp = efip->efi_item.li_mountp;
@@ -372,20 +345,10 @@ xfs_efi_release(xfs_efi_log_item_t        *efip,
                 * xfs_trans_delete_ail() drops the AIL lock.
                 */
                xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s);
+               xfs_efi_item_free(efip);
        } else {
                AIL_UNLOCK(mp, s);
        }
-
-       if (extents_left == 0) {
-               nexts = efip->efi_format.efi_nextents;
-               if (nexts > XFS_EFI_MAX_FAST_EXTENTS) {
-                       size = sizeof(xfs_efi_log_item_t);
-                       size += (nexts - 1) * sizeof(xfs_extent_t);
-                       kmem_free(efip, size);
-               } else {
-                       kmem_zone_free(xfs_efi_zone, efip);
-               }
-       }
 }
 
 /*
@@ -398,8 +361,6 @@ STATIC void
 xfs_efi_cancel(
        xfs_efi_log_item_t      *efip)
 {
-       int             nexts;
-       int             size;
        xfs_mount_t     *mp;
        SPLDECL(s);
 
@@ -410,26 +371,25 @@ xfs_efi_cancel(
                 * xfs_trans_delete_ail() drops the AIL lock.
                 */
                xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s);
-
-               nexts = efip->efi_format.efi_nextents;
-               if (nexts > XFS_EFI_MAX_FAST_EXTENTS) {
-                       size = sizeof(xfs_efi_log_item_t);
-                       size += (nexts - 1) * sizeof(xfs_extent_t);
-                       kmem_free(efip, size);
-               } else {
-                       kmem_zone_free(xfs_efi_zone, efip);
-               }
+               xfs_efi_item_free(efip);
        } else {
                efip->efi_flags |= XFS_EFI_CANCELED;
                AIL_UNLOCK(mp, s);
        }
-
-       return;
 }
 
+STATIC void
+xfs_efd_item_free(xfs_efd_log_item_t *efdp)
+{
+       int nexts = efdp->efd_format.efd_nextents;
 
-
-
+       if (nexts > XFS_EFD_MAX_FAST_EXTENTS) {
+               kmem_free(efdp, sizeof(xfs_efd_log_item_t) +
+                               (nexts - 1) * sizeof(xfs_extent_t));
+       } else {
+               kmem_zone_free(xfs_efd_zone, efdp);
+       }
+}
 
 /*
  * This returns the number of iovecs needed to log the given efd item.
@@ -533,9 +493,6 @@ xfs_efd_item_unlock(xfs_efd_log_item_t *efdp)
 STATIC xfs_lsn_t
 xfs_efd_item_committed(xfs_efd_log_item_t *efdp, xfs_lsn_t lsn)
 {
-       uint    size;
-       int     nexts;
-
        /*
         * If we got a log I/O error, it's always the case that the LR with the
         * EFI got unpinned and freed before the EFD got aborted.
@@ -543,15 +500,7 @@ xfs_efd_item_committed(xfs_efd_log_item_t *efdp, xfs_lsn_t lsn)
        if ((efdp->efd_item.li_flags & XFS_LI_ABORTED) == 0)
                xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents);
 
-       nexts = efdp->efd_format.efd_nextents;
-       if (nexts > XFS_EFD_MAX_FAST_EXTENTS) {
-               size = sizeof(xfs_efd_log_item_t);
-               size += (nexts - 1) * sizeof(xfs_extent_t);
-               kmem_free(efdp, size);
-       } else {
-               kmem_zone_free(xfs_efd_zone, efdp);
-       }
-
+       xfs_efd_item_free(efdp);
        return (xfs_lsn_t)-1;
 }
 
@@ -565,9 +514,6 @@ xfs_efd_item_committed(xfs_efd_log_item_t *efdp, xfs_lsn_t lsn)
 STATIC void
 xfs_efd_item_abort(xfs_efd_log_item_t *efdp)
 {
-       int     nexts;
-       int     size;
-
        /*
         * If we got a log I/O error, it's always the case that the LR with the
         * EFI got unpinned and freed before the EFD got aborted. So don't
@@ -576,15 +522,7 @@ xfs_efd_item_abort(xfs_efd_log_item_t *efdp)
        if ((efdp->efd_item.li_flags & XFS_LI_ABORTED) == 0)
                xfs_efi_cancel(efdp->efd_efip);
 
-       nexts = efdp->efd_format.efd_nextents;
-       if (nexts > XFS_EFD_MAX_FAST_EXTENTS) {
-               size = sizeof(xfs_efd_log_item_t);
-               size += (nexts - 1) * sizeof(xfs_extent_t);
-               kmem_free(efdp, size);
-       } else {
-               kmem_zone_free(xfs_efd_zone, efdp);
-       }
-       return;
+       xfs_efd_item_free(efdp);
 }
 
 /*
@@ -615,7 +553,7 @@ xfs_efd_item_committing(xfs_efd_log_item_t *efip, xfs_lsn_t lsn)
 /*
  * This is the ops vector shared by all efd log items.
  */
-struct xfs_item_ops xfs_efd_item_ops = {
+STATIC struct xfs_item_ops xfs_efd_item_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_efd_item_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_efd_item_format,
index 7122d6101d15803644220269f172ba4817118f2e..d433bac9f59d81f59de6f6593e7ab8a96d2c3149 100644 (file)
@@ -118,6 +118,8 @@ xfs_efi_log_item_t  *xfs_efi_init(struct xfs_mount *, uint);
 xfs_efd_log_item_t     *xfs_efd_init(struct xfs_mount *, xfs_efi_log_item_t *,
                                      uint);
 
+void                   xfs_efi_item_free(xfs_efi_log_item_t *);
+
 #endif /* __KERNEL__ */
 
 #endif /* __XFS_EXTFREE_ITEM_H__ */
index 6ee8443bf9d33da239e8b389f0dd64108d429324..095af0a5cff3bc50a4420d81e65ef8ed2b7ae710 100644 (file)
@@ -60,7 +60,8 @@ struct fsxattr {
        __u32           fsx_xflags;     /* xflags field value (get/set) */
        __u32           fsx_extsize;    /* extsize field value (get/set)*/
        __u32           fsx_nextents;   /* nextents field value (get)   */
-       unsigned char   fsx_pad[16];
+       __u32           fsx_projid;     /* project identifier (get/set) */
+       unsigned char   fsx_pad[12];
 };
 #endif
 
index 21213057c27f9ff655100f986cd7ad49d930b619..ca535d613190fca9ac1a15df62713223d4a69825 100644 (file)
@@ -559,32 +559,6 @@ xfs_reserve_blocks(
        return(0);
 }
 
-void
-xfs_fs_log_dummy(xfs_mount_t *mp)
-{
-       xfs_trans_t *tp;
-       xfs_inode_t *ip;
-
-
-       tp = _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1);
-       atomic_inc(&mp->m_active_trans);
-       if (xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), 0, 0, 0)) {
-               xfs_trans_cancel(tp, 0);
-               return;
-       }
-
-       ip = mp->m_rootip;
-       xfs_ilock(ip, XFS_ILOCK_EXCL);
-
-       xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
-       xfs_trans_ihold(tp, ip);
-       xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
-       xfs_trans_set_sync(tp);
-       xfs_trans_commit(tp, 0, NULL);
-
-       xfs_iunlock(ip, XFS_ILOCK_EXCL);
-}
-
 int
 xfs_fs_goingdown(
        xfs_mount_t     *mp,
index 803c4d17a057b3e313707289fdc3a00b81b5d38b..44be188674a6a0e405b40559deec84d2aa4dd75c 100644 (file)
@@ -100,9 +100,13 @@ xfs_inofree_t xfs_inobt_mask(int i);
 #endif
 #if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_INOBT_IS_FREE)
 int xfs_inobt_is_free(xfs_inobt_rec_t *rp, int i);
-#define        XFS_INOBT_IS_FREE(rp,i) xfs_inobt_is_free(rp,i)
+#define        XFS_INOBT_IS_FREE(rp,i)         xfs_inobt_is_free(rp,i)
+#define        XFS_INOBT_IS_FREE_DISK(rp,i)    xfs_inobt_is_free_disk(rp,i)
 #else
-#define        XFS_INOBT_IS_FREE(rp,i) (((rp)->ir_free & XFS_INOBT_MASK(i)) != 0)
+#define        XFS_INOBT_IS_FREE(rp,i) \
+       (((rp)->ir_free & XFS_INOBT_MASK(i)) != 0)
+#define XFS_INOBT_IS_FREE_DISK(rp,i) \
+       ((INT_GET((rp)->ir_free, ARCH_CONVERT) & XFS_INOBT_MASK(i)) != 0)
 #endif
 #if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_INOBT_SET_FREE)
 void xfs_inobt_set_free(xfs_inobt_rec_t *rp, int i);
index bc8c8c7f9039d507978d727a25c446b661af4d56..34bdf5909687b30d0619e3e9f6d42feee4de4098 100644 (file)
@@ -145,51 +145,6 @@ xfs_inobp_check(
 }
 #endif
 
-/*
- * called from bwrite on xfs inode buffers
- */
-void
-xfs_inobp_bwcheck(xfs_buf_t *bp)
-{
-       xfs_mount_t     *mp;
-       int             i;
-       int             j;
-       xfs_dinode_t    *dip;
-
-       ASSERT(XFS_BUF_FSPRIVATE3(bp, void *) != NULL);
-
-       mp = XFS_BUF_FSPRIVATE3(bp, xfs_mount_t *);
-
-
-       j = mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog;
-
-       for (i = 0; i < j; i++)  {
-               dip = (xfs_dinode_t *) xfs_buf_offset(bp,
-                                               i * mp->m_sb.sb_inodesize);
-               if (INT_GET(dip->di_core.di_magic, ARCH_CONVERT) != XFS_DINODE_MAGIC) {
-                       cmn_err(CE_WARN,
-"Bad magic # 0x%x in XFS inode buffer 0x%Lx, starting blockno %Ld, offset 0x%x",
-                               INT_GET(dip->di_core.di_magic, ARCH_CONVERT),
-                               (__uint64_t)(__psunsigned_t) bp,
-                               (__int64_t) XFS_BUF_ADDR(bp),
-                               xfs_buf_offset(bp, i * mp->m_sb.sb_inodesize));
-                       xfs_fs_cmn_err(CE_WARN, mp,
-                               "corrupt, unmount and run xfs_repair");
-               }
-               if (!dip->di_next_unlinked)  {
-                       cmn_err(CE_WARN,
-"Bad next_unlinked field (0) in XFS inode buffer 0x%p, starting blockno %Ld, offset 0x%x",
-                               (__uint64_t)(__psunsigned_t) bp,
-                               (__int64_t) XFS_BUF_ADDR(bp),
-                               xfs_buf_offset(bp, i * mp->m_sb.sb_inodesize));
-                       xfs_fs_cmn_err(CE_WARN, mp,
-                               "corrupt, unmount and run xfs_repair");
-               }
-       }
-
-       return;
-}
-
 /*
  * This routine is called to map an inode number within a file
  * system to the buffer containing the on-disk version of the
@@ -203,7 +158,7 @@ xfs_inobp_bwcheck(xfs_buf_t *bp)
  * Use xfs_imap() to determine the size and location of the
  * buffer to read from disk.
  */
-int
+STATIC int
 xfs_inotobp(
        xfs_mount_t     *mp,
        xfs_trans_t     *tp,
@@ -1247,26 +1202,32 @@ xfs_ialloc(
        case S_IFREG:
        case S_IFDIR:
                if (unlikely(pip->i_d.di_flags & XFS_DIFLAG_ANY)) {
-                       if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT) {
-                               if ((mode & S_IFMT) == S_IFDIR) {
-                                       ip->i_d.di_flags |= XFS_DIFLAG_RTINHERIT;
-                               } else {
-                                       ip->i_d.di_flags |= XFS_DIFLAG_REALTIME;
+                       uint    di_flags = 0;
+
+                       if ((mode & S_IFMT) == S_IFDIR) {
+                               if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT)
+                                       di_flags |= XFS_DIFLAG_RTINHERIT;
+                       } else {
+                               if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT) {
+                                       di_flags |= XFS_DIFLAG_REALTIME;
                                        ip->i_iocore.io_flags |= XFS_IOCORE_RT;
                                }
                        }
                        if ((pip->i_d.di_flags & XFS_DIFLAG_NOATIME) &&
                            xfs_inherit_noatime)
-                               ip->i_d.di_flags |= XFS_DIFLAG_NOATIME;
+                               di_flags |= XFS_DIFLAG_NOATIME;
                        if ((pip->i_d.di_flags & XFS_DIFLAG_NODUMP) &&
                            xfs_inherit_nodump)
-                               ip->i_d.di_flags |= XFS_DIFLAG_NODUMP;
+                               di_flags |= XFS_DIFLAG_NODUMP;
                        if ((pip->i_d.di_flags & XFS_DIFLAG_SYNC) &&
                            xfs_inherit_sync)
-                               ip->i_d.di_flags |= XFS_DIFLAG_SYNC;
+                               di_flags |= XFS_DIFLAG_SYNC;
                        if ((pip->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) &&
                            xfs_inherit_nosymlinks)
-                               ip->i_d.di_flags |= XFS_DIFLAG_NOSYMLINKS;
+                               di_flags |= XFS_DIFLAG_NOSYMLINKS;
+                       if (pip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
+                               di_flags |= XFS_DIFLAG_PROJINHERIT;
+                       ip->i_d.di_flags |= di_flags;
                }
                /* FALLTHROUGH */
        case S_IFLNK:
@@ -2156,7 +2117,7 @@ static __inline__ int xfs_inode_clean(xfs_inode_t *ip)
                (ip->i_update_core == 0));
 }
 
-void
+STATIC void
 xfs_ifree_cluster(
        xfs_inode_t     *free_ip,
        xfs_trans_t     *tp,
@@ -2875,7 +2836,7 @@ xfs_iunpin(
  * be subsequently pinned once someone is waiting for it to be
  * unpinned.
  */
-void
+STATIC void
 xfs_iunpin_wait(
        xfs_inode_t     *ip)
 {
@@ -3601,107 +3562,43 @@ corrupt_out:
 
 
 /*
- * Flush all inactive inodes in mp.  Return true if no user references
- * were found, false otherwise.
+ * Flush all inactive inodes in mp.
  */
-int
+void
 xfs_iflush_all(
-       xfs_mount_t     *mp,
-       int             flag)
+       xfs_mount_t     *mp)
 {
-       int             busy;
-       int             done;
-       int             purged;
        xfs_inode_t     *ip;
-       vmap_t          vmap;
        vnode_t         *vp;
 
-       busy = done = 0;
-       while (!done) {
-               purged = 0;
-               XFS_MOUNT_ILOCK(mp);
-               ip = mp->m_inodes;
-               if (ip == NULL) {
-                       break;
-               }
-               do {
-                       /* Make sure we skip markers inserted by sync */
-                       if (ip->i_mount == NULL) {
-                               ip = ip->i_mnext;
-                               continue;
-                       }
-
-                       /*
-                        * It's up to our caller to purge the root
-                        * and quota vnodes later.
-                        */
-                       vp = XFS_ITOV_NULL(ip);
-
-                       if (!vp) {
-                               XFS_MOUNT_IUNLOCK(mp);
-                               xfs_finish_reclaim(ip, 0, XFS_IFLUSH_ASYNC);
-                               purged = 1;
-                               break;
-                       }
+ again:
+       XFS_MOUNT_ILOCK(mp);
+       ip = mp->m_inodes;
+       if (ip == NULL)
+               goto out;
 
-                       if (vn_count(vp) != 0) {
-                               if (vn_count(vp) == 1 &&
-                                   (ip == mp->m_rootip ||
-                                    (mp->m_quotainfo &&
-                                     (ip->i_ino == mp->m_sb.sb_uquotino ||
-                                      ip->i_ino == mp->m_sb.sb_gquotino)))) {
+       do {
+               /* Make sure we skip markers inserted by sync */
+               if (ip->i_mount == NULL) {
+                       ip = ip->i_mnext;
+                       continue;
+               }
 
-                                       ip = ip->i_mnext;
-                                       continue;
-                               }
-                               if (!(flag & XFS_FLUSH_ALL)) {
-                                       busy = 1;
-                                       done = 1;
-                                       break;
-                               }
-                               /*
-                                * Ignore busy inodes but continue flushing
-                                * others.
-                                */
-                               ip = ip->i_mnext;
-                               continue;
-                       }
-                       /*
-                        * Sample vp mapping while holding mp locked on MP
-                        * systems, so we don't purge a reclaimed or
-                        * nonexistent vnode.  We break from the loop
-                        * since we know that we modify
-                        * it by pulling ourselves from it in xfs_reclaim()
-                        * called via vn_purge() below.  Set ip to the next
-                        * entry in the list anyway so we'll know below
-                        * whether we reached the end or not.
-                        */
-                       VMAP(vp, vmap);
+               vp = XFS_ITOV_NULL(ip);
+               if (!vp) {
                        XFS_MOUNT_IUNLOCK(mp);
+                       xfs_finish_reclaim(ip, 0, XFS_IFLUSH_ASYNC);
+                       goto again;
+               }
 
-                       vn_purge(vp, &vmap);
+               ASSERT(vn_count(vp) == 0);
 
-                       purged = 1;
-                       break;
-               } while (ip != mp->m_inodes);
-               /*
-                * We need to distinguish between when we exit the loop
-                * after a purge and when we simply hit the end of the
-                * list.  We can't use the (ip == mp->m_inodes) test,
-                * because when we purge an inode at the start of the list
-                * the next inode on the list becomes mp->m_inodes.  That
-                * would cause such a test to bail out early.  The purged
-                * variable tells us how we got out of the loop.
-                */
-               if (!purged) {
-                       done = 1;
-               }
-       }
+               ip = ip->i_mnext;
+       } while (ip != mp->m_inodes);
+ out:
        XFS_MOUNT_IUNLOCK(mp);
-       return !busy;
 }
 
-
 /*
  * xfs_iaccess: check accessibility of inode for mode.
  */
index 37e1c316f3b6bd520c37d4bea1a86aeaf0375a6e..54d9e54c7c9572f5bb79ebe4434990a5abc6025b 100644 (file)
@@ -411,11 +411,6 @@ void xfs_ifork_next_set(xfs_inode_t *ip, int w, int n);
 #define        XFS_IFLUSH_ASYNC                4
 #define        XFS_IFLUSH_DELWRI               5
 
-/*
- * Flags for xfs_iflush_all.
- */
-#define        XFS_FLUSH_ALL           0x1
-
 /*
  * Flags for xfs_itruncate_start().
  */
@@ -487,8 +482,6 @@ int         xfs_finish_reclaim_all(struct xfs_mount *, int);
 /*
  * xfs_inode.c prototypes.
  */
-int            xfs_inotobp(struct xfs_mount *, struct xfs_trans *, xfs_ino_t,
-                           xfs_dinode_t **, struct xfs_buf **, int *);
 int            xfs_itobp(struct xfs_mount *, struct xfs_trans *,
                          xfs_inode_t *, xfs_dinode_t **, struct xfs_buf **,
                          xfs_daddr_t);
@@ -522,7 +515,7 @@ void                xfs_ipin(xfs_inode_t *);
 void           xfs_iunpin(xfs_inode_t *);
 int            xfs_iextents_copy(xfs_inode_t *, xfs_bmbt_rec_t *, int);
 int            xfs_iflush(xfs_inode_t *, uint);
-int            xfs_iflush_all(struct xfs_mount *, int);
+void           xfs_iflush_all(struct xfs_mount *);
 int            xfs_iaccess(xfs_inode_t *, mode_t, cred_t *);
 uint           xfs_iroundup(uint);
 void           xfs_ichgtime(xfs_inode_t *, int);
index 768cb1816b8eace41f94f6ffcf9f4c2d8a7e4113..0eed30f5cb19de82e45518bb1f2b08c963f9d7d3 100644 (file)
@@ -910,7 +910,7 @@ xfs_inode_item_committing(
 /*
  * This is the ops vector shared by all buf log items.
  */
-struct xfs_item_ops xfs_inode_item_ops = {
+STATIC struct xfs_item_ops xfs_inode_item_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_inode_item_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_inode_item_format,
index 991f8a61f7c4fa4d91b187e0ee5507e9fc3db3c0..2edd6769e5d328d18da1d854d69595ff3cb5a996 100644 (file)
@@ -278,7 +278,9 @@ phase2:
        switch (flags & (BMAPI_WRITE|BMAPI_ALLOCATE|BMAPI_UNWRITTEN)) {
        case BMAPI_WRITE:
                /* If we found an extent, return it */
-               if (nimaps && (imap.br_startblock != HOLESTARTBLOCK)) {
+               if (nimaps &&
+                   (imap.br_startblock != HOLESTARTBLOCK) && 
+                   (imap.br_startblock != DELAYSTARTBLOCK)) {
                        xfs_iomap_map_trace(XFS_IOMAP_WRITE_MAP, io,
                                        offset, count, iomapp, &imap, flags);
                        break;
@@ -383,15 +385,15 @@ xfs_iomap_write_direct(
        int             nimaps, maps;
        int             error;
        int             bmapi_flag;
+       int             quota_flag;
        int             rt;
        xfs_trans_t     *tp;
        xfs_bmbt_irec_t imap[XFS_WRITE_IMAPS], *imapp;
        xfs_bmap_free_t free_list;
        int             aeof;
-       xfs_filblks_t   datablocks;
+       xfs_filblks_t   datablocks, qblocks, resblks;
        int             committed;
        int             numrtextents;
-       uint            resblks;
 
        /*
         * Make sure that the dquots are there. This doesn't hold
@@ -417,7 +419,6 @@ xfs_iomap_write_direct(
                xfs_fileoff_t   map_last_fsb;
 
                map_last_fsb = ret_imap->br_blockcount + ret_imap->br_startoff;
-
                if (map_last_fsb < last_fsb) {
                        last_fsb = map_last_fsb;
                        count_fsb = last_fsb - offset_fsb;
@@ -426,56 +427,47 @@ xfs_iomap_write_direct(
        }
 
        /*
-        * determine if reserving space on
-        * the data or realtime partition.
+        * Determine if reserving space on the data or realtime partition.
         */
        if ((rt = XFS_IS_REALTIME_INODE(ip))) {
-               int     sbrtextsize, iprtextsize;
+               xfs_extlen_t    extsz;
 
-               sbrtextsize = mp->m_sb.sb_rextsize;
-               iprtextsize =
-                       ip->i_d.di_extsize ? ip->i_d.di_extsize : sbrtextsize;
-               numrtextents = (count_fsb + iprtextsize - 1);
-               do_div(numrtextents, sbrtextsize);
+               if (!(extsz = ip->i_d.di_extsize))
+                       extsz = mp->m_sb.sb_rextsize;
+               numrtextents = qblocks = (count_fsb + extsz - 1);
+               do_div(numrtextents, mp->m_sb.sb_rextsize);
+               quota_flag = XFS_QMOPT_RES_RTBLKS;
                datablocks = 0;
        } else {
-               datablocks = count_fsb;
+               datablocks = qblocks = count_fsb;
+               quota_flag = XFS_QMOPT_RES_REGBLKS;
                numrtextents = 0;
        }
 
        /*
-        * allocate and setup the transaction
+        * Allocate and setup the transaction
         */
        xfs_iunlock(ip, XFS_ILOCK_EXCL);
        tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT);
-
        resblks = XFS_DIOSTRAT_SPACE_RES(mp, datablocks);
-
        error = xfs_trans_reserve(tp, resblks,
                        XFS_WRITE_LOG_RES(mp), numrtextents,
                        XFS_TRANS_PERM_LOG_RES,
                        XFS_WRITE_LOG_COUNT);
 
        /*
-        * check for running out of space
+        * Check for running out of space, note: need lock to return
         */
        if (error)
-               /*
-                * Free the transaction structure.
-                */
                xfs_trans_cancel(tp, 0);
-
        xfs_ilock(ip, XFS_ILOCK_EXCL);
-
        if (error)
-               goto error_out; /* Don't return in above if .. trans ..,
-                                       need lock to return */
+               goto error_out;
 
-       if (XFS_TRANS_RESERVE_BLKQUOTA(mp, tp, ip, resblks)) {
+       if (XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, qblocks, 0, quota_flag)) {
                error = (EDQUOT);
                goto error1;
        }
-       nimaps = 1;
 
        bmapi_flag = XFS_BMAPI_WRITE;
        xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
@@ -485,31 +477,29 @@ xfs_iomap_write_direct(
                bmapi_flag |= XFS_BMAPI_PREALLOC;
 
        /*
-        * issue the bmapi() call to allocate the blocks
+        * Issue the bmapi() call to allocate the blocks
         */
        XFS_BMAP_INIT(&free_list, &firstfsb);
+       nimaps = 1;
        imapp = &imap[0];
        error = xfs_bmapi(tp, ip, offset_fsb, count_fsb,
                bmapi_flag, &firstfsb, 0, imapp, &nimaps, &free_list);
-       if (error) {
+       if (error)
                goto error0;
-       }
 
        /*
-        * complete the transaction
+        * Complete the transaction
         */
-
        error = xfs_bmap_finish(&tp, &free_list, firstfsb, &committed);
-       if (error) {
+       if (error)
                goto error0;
-       }
-
        error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES, NULL);
-       if (error) {
+       if (error)
                goto error_out;
-       }
 
-       /* copy any maps to caller's array and return any error. */
+       /*
+        * Copy any maps to caller's array and return any error.
+        */
        if (nimaps == 0) {
                error = (ENOSPC);
                goto error_out;
@@ -528,10 +518,11 @@ xfs_iomap_write_direct(
         }
        return 0;
 
- error0:       /* Cancel bmap, unlock inode, and cancel trans */
+error0:        /* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */
        xfs_bmap_cancel(&free_list);
+       XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, qblocks, 0, quota_flag);
 
- error1:       /* Just cancel transaction */
+error1:        /* Just cancel transaction */
        xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
        *nmaps = 0;     /* nothing set-up here */
 
index 092d5fb096b13e8c5fa9c65bfe02693a3870592c..1cd2ac1638778b3e69c67acd6a47280cdc52cd3a 100644 (file)
@@ -134,7 +134,7 @@ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog,
 #define xlog_verify_tail_lsn(a,b,c)
 #endif
 
-int            xlog_iclogs_empty(xlog_t *log);
+STATIC int     xlog_iclogs_empty(xlog_t *log);
 
 #ifdef DEBUG
 int xlog_do_error = 0;
@@ -1857,7 +1857,7 @@ xlog_write(xfs_mount_t *  mp,
  *
  * State Change: DIRTY -> ACTIVE
  */
-void
+STATIC void
 xlog_state_clean_log(xlog_t *log)
 {
        xlog_in_core_t  *iclog;
@@ -3542,7 +3542,7 @@ xfs_log_force_umount(
        return (retval);
 }
 
-int
+STATIC int
 xlog_iclogs_empty(xlog_t *log)
 {
        xlog_in_core_t  *iclog;
index c31e3ce3be6602cd8f96fcb7419af04d9912b445..1a1d452f15f97b023f8ce0d33c9e74aad32f4ad6 100644 (file)
@@ -535,7 +535,6 @@ typedef struct log {
 
 /* common routines */
 extern xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp);
-extern int      xlog_find_head(xlog_t *log, xfs_daddr_t *head_blk);
 extern int      xlog_find_tail(xlog_t  *log,
                                xfs_daddr_t *head_blk,
                                xfs_daddr_t *tail_blk,
@@ -548,7 +547,6 @@ extern void  xlog_recover_process_iunlinks(xlog_t *log);
 extern struct xfs_buf *xlog_get_bp(xlog_t *, int);
 extern void     xlog_put_bp(struct xfs_buf *);
 extern int      xlog_bread(xlog_t *, xfs_daddr_t, int, struct xfs_buf *);
-extern xfs_caddr_t xlog_align(xlog_t *, xfs_daddr_t, int, struct xfs_buf *);
 
 /* iclog tracing */
 #define XLOG_TRACE_GRAB_FLUSH  1
index 9824b5bf0ec03ea6af15803978106adeedc5a1d9..0aac28ddb81c6bc00d6b37ee341fa4db5258d119 100644 (file)
@@ -148,7 +148,7 @@ xlog_bread(
  * The buffer is kept locked across the write and is returned locked.
  * This can only be used for synchronous log writes.
  */
-int
+STATIC int
 xlog_bwrite(
        xlog_t          *log,
        xfs_daddr_t     blk_no,
@@ -179,7 +179,7 @@ xlog_bwrite(
        return error;
 }
 
-xfs_caddr_t
+STATIC xfs_caddr_t
 xlog_align(
        xlog_t          *log,
        xfs_daddr_t     blk_no,
@@ -528,7 +528,7 @@ out:
  *
  * Return: zero if normal, non-zero if error.
  */
-int
+STATIC int
 xlog_find_head(
        xlog_t          *log,
        xfs_daddr_t     *return_head_blk)
@@ -1964,7 +1964,8 @@ xlog_recover_do_reg_buffer(
                 * probably a good thing to do for other buf types also.
                 */
                error = 0;
-               if (buf_f->blf_flags & (XFS_BLI_UDQUOT_BUF|XFS_BLI_GDQUOT_BUF)) {
+               if (buf_f->blf_flags &
+                  (XFS_BLI_UDQUOT_BUF|XFS_BLI_PDQUOT_BUF|XFS_BLI_GDQUOT_BUF)) {
                        error = xfs_qm_dqcheck((xfs_disk_dquot_t *)
                                               item->ri_buf[i].i_addr,
                                               -1, 0, XFS_QMOPT_DOWARN,
@@ -2030,6 +2031,7 @@ xfs_qm_dqcheck(
        }
 
        if (INT_GET(ddq->d_flags, ARCH_CONVERT) != XFS_DQ_USER &&
+           INT_GET(ddq->d_flags, ARCH_CONVERT) != XFS_DQ_PROJ &&
            INT_GET(ddq->d_flags, ARCH_CONVERT) != XFS_DQ_GROUP) {
                if (flags & XFS_QMOPT_DOWARN)
                        cmn_err(CE_ALERT,
@@ -2135,6 +2137,8 @@ xlog_recover_do_dquot_buffer(
        type = 0;
        if (buf_f->blf_flags & XFS_BLI_UDQUOT_BUF)
                type |= XFS_DQ_USER;
+       if (buf_f->blf_flags & XFS_BLI_PDQUOT_BUF)
+               type |= XFS_DQ_PROJ;
        if (buf_f->blf_flags & XFS_BLI_GDQUOT_BUF)
                type |= XFS_DQ_GROUP;
        /*
@@ -2247,7 +2251,8 @@ xlog_recover_do_buffer_trans(
        error = 0;
        if (flags & XFS_BLI_INODE_BUF) {
                error = xlog_recover_do_inode_buffer(mp, item, bp, buf_f);
-       } else if (flags & (XFS_BLI_UDQUOT_BUF | XFS_BLI_GDQUOT_BUF)) {
+       } else if (flags &
+                 (XFS_BLI_UDQUOT_BUF|XFS_BLI_PDQUOT_BUF|XFS_BLI_GDQUOT_BUF)) {
                xlog_recover_do_dquot_buffer(mp, log, item, bp, buf_f);
        } else {
                xlog_recover_do_reg_buffer(mp, item, bp, buf_f);
@@ -2619,7 +2624,7 @@ xlog_recover_do_dquot_trans(
         * This type of quotas was turned off, so ignore this record.
         */
        type = INT_GET(recddq->d_flags, ARCH_CONVERT) &
-                       (XFS_DQ_USER | XFS_DQ_GROUP);
+                       (XFS_DQ_USER | XFS_DQ_PROJ | XFS_DQ_GROUP);
        ASSERT(type);
        if (log->l_quotaoffs_flag & type)
                return (0);
@@ -2742,7 +2747,6 @@ xlog_recover_do_efd_trans(
        xfs_efi_log_item_t      *efip = NULL;
        xfs_log_item_t          *lip;
        int                     gen;
-       int                     nexts;
        __uint64_t              efi_id;
        SPLDECL(s);
 
@@ -2777,22 +2781,15 @@ xlog_recover_do_efd_trans(
                }
                lip = xfs_trans_next_ail(mp, lip, &gen, NULL);
        }
-       if (lip == NULL) {
-               AIL_UNLOCK(mp, s);
-       }
 
        /*
         * If we found it, then free it up.  If it wasn't there, it
         * must have been overwritten in the log.  Oh well.
         */
        if (lip != NULL) {
-               nexts = efip->efi_format.efi_nextents;
-               if (nexts > XFS_EFI_MAX_FAST_EXTENTS) {
-                       kmem_free(lip, sizeof(xfs_efi_log_item_t) +
-                                 ((nexts - 1) * sizeof(xfs_extent_t)));
-               } else {
-                       kmem_zone_free(xfs_efi_zone, efip);
-               }
+               xfs_efi_item_free(efip);
+       } else {
+               AIL_UNLOCK(mp, s);
        }
 }
 
index ce4f46c6b3aba1d36ae898dc42f1a0ba15c64139..698c2cd6285802ac13435856a23261d9fca3ae3d 100644 (file)
@@ -1658,6 +1658,11 @@ xfs_inobt_is_free(xfs_inobt_rec_t *rp, int i)
 {
        return XFS_INOBT_IS_FREE(rp, i);
 }
+int
+xfs_inobt_is_free_disk(xfs_inobt_rec_t *rp, int i)
+{
+       return XFS_INOBT_IS_FREE_DISK(rp, i);
+}
 #endif
 
 #if XFS_WANT_FUNCS_C || (XFS_WANT_SPACE_C && XFSSO_XFS_INOBT_IS_LAST_REC)
index 2ec967d93e5ae5eb2aaf1ac06441294ee357382a..82e1646e6243765e121231680f5514470e4bd0a1 100644 (file)
@@ -64,6 +64,7 @@
 STATIC void    xfs_mount_log_sbunit(xfs_mount_t *, __int64_t);
 STATIC int     xfs_uuid_mount(xfs_mount_t *);
 STATIC void    xfs_uuid_unmount(xfs_mount_t *mp);
+STATIC void    xfs_unmountfs_wait(xfs_mount_t *);
 
 static struct {
     short offset;
@@ -555,7 +556,7 @@ xfs_readsb(xfs_mount_t *mp)
  * fields from the superblock associated with the given
  * mount structure
  */
-void
+STATIC void
 xfs_mount_common(xfs_mount_t *mp, xfs_sb_t *sbp)
 {
        int     i;
@@ -1081,7 +1082,7 @@ xfs_unmountfs(xfs_mount_t *mp, struct cred *cr)
        int64_t         fsid;
 #endif
 
-       xfs_iflush_all(mp, XFS_FLUSH_ALL);
+       xfs_iflush_all(mp);
 
        XFS_QM_DQPURGEALL(mp,
                XFS_QMOPT_UQUOTA | XFS_QMOPT_GQUOTA | XFS_QMOPT_UMOUNTING);
@@ -1111,15 +1112,6 @@ xfs_unmountfs(xfs_mount_t *mp, struct cred *cr)
         */
        ASSERT(mp->m_inodes == NULL);
 
-       /*
-        * We may have bufs that are in the process of getting written still.
-        * We must wait for the I/O completion of those. The sync flag here
-        * does a two pass iteration thru the bufcache.
-        */
-       if (XFS_FORCED_SHUTDOWN(mp)) {
-               xfs_incore_relse(mp->m_ddev_targp, 0, 1); /* synchronous */
-       }
-
        xfs_unmountfs_close(mp, cr);
        if ((mp->m_flags & XFS_MOUNT_NOUUID) == 0)
                xfs_uuid_unmount(mp);
@@ -1146,7 +1138,7 @@ xfs_unmountfs_close(xfs_mount_t *mp, struct cred *cr)
        xfs_free_buftarg(mp->m_ddev_targp, 0);
 }
 
-void
+STATIC void
 xfs_unmountfs_wait(xfs_mount_t *mp)
 {
        if (mp->m_logdev_targp != mp->m_ddev_targp)
index 30dd08fb9f577bb1943e54d83ba9d3625a45303f..5affba38a57753510952570e6dd0f71969ea350a 100644 (file)
@@ -141,7 +141,7 @@ typedef int (*xfs_dqattach_t)(struct xfs_inode *, uint);
 typedef void   (*xfs_dqdetach_t)(struct xfs_inode *);
 typedef int    (*xfs_dqpurgeall_t)(struct xfs_mount *, uint);
 typedef int    (*xfs_dqvopalloc_t)(struct xfs_mount *,
-                       struct xfs_inode *, uid_t, gid_t, uint,
+                       struct xfs_inode *, uid_t, gid_t, prid_t, uint,
                        struct xfs_dquot **, struct xfs_dquot **);
 typedef void   (*xfs_dqvopcreate_t)(struct xfs_trans *, struct xfs_inode *,
                        struct xfs_dquot *, struct xfs_dquot *);
@@ -185,8 +185,8 @@ typedef struct xfs_qmops {
        (*(mp)->m_qm_ops.xfs_dqdetach)(ip)
 #define XFS_QM_DQPURGEALL(mp, fl) \
        (*(mp)->m_qm_ops.xfs_dqpurgeall)(mp, fl)
-#define XFS_QM_DQVOPALLOC(mp, ip, uid, gid, fl, dq1, dq2) \
-       (*(mp)->m_qm_ops.xfs_dqvopalloc)(mp, ip, uid, gid, fl, dq1, dq2)
+#define XFS_QM_DQVOPALLOC(mp, ip, uid, gid, prid, fl, dq1, dq2) \
+       (*(mp)->m_qm_ops.xfs_dqvopalloc)(mp, ip, uid, gid, prid, fl, dq1, dq2)
 #define XFS_QM_DQVOPCREATE(mp, tp, ip, dq1, dq2) \
        (*(mp)->m_qm_ops.xfs_dqvopcreate)(tp, ip, dq1, dq2)
 #define XFS_QM_DQVOPRENAME(mp, ip) \
@@ -544,7 +544,6 @@ extern void xfs_mount_free(xfs_mount_t *mp, int remove_bhv);
 extern int     xfs_mountfs(struct vfs *, xfs_mount_t *mp, int);
 
 extern int     xfs_unmountfs(xfs_mount_t *, struct cred *);
-extern void    xfs_unmountfs_wait(xfs_mount_t *);
 extern void    xfs_unmountfs_close(xfs_mount_t *, struct cred *);
 extern int     xfs_unmountfs_writesb(xfs_mount_t *);
 extern int     xfs_unmount_flush(xfs_mount_t *, int);
index 703ec4efcb411574ca3c39a42f52907922922557..7134576ae7faed4f64e1dbb0661bc634a0dbd611 100644 (file)
@@ -96,7 +96,7 @@ typedef struct xfs_dqblk {
  * flags for q_flags field in the dquot.
  */
 #define XFS_DQ_USER            0x0001          /* a user quota */
-/* #define XFS_DQ_PROJ         0x0002          -- project quota (IRIX) */
+#define XFS_DQ_PROJ            0x0002          /* project quota */
 #define XFS_DQ_GROUP           0x0004          /* a group quota */
 #define XFS_DQ_FLOCKED         0x0008          /* flush lock taken */
 #define XFS_DQ_DIRTY           0x0010          /* dquot is dirty */
@@ -104,6 +104,8 @@ typedef struct xfs_dqblk {
 #define XFS_DQ_INACTIVE                0x0040          /* dq off mplist & hashlist */
 #define XFS_DQ_MARKER          0x0080          /* sentinel */
 
+#define XFS_DQ_ALLTYPES                (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP)
+
 /*
  * In the worst case, when both user and group quotas are on,
  * we can have a max of three dquots changing in a single transaction.
@@ -124,7 +126,7 @@ typedef struct xfs_dqblk {
 typedef struct xfs_dq_logformat {
        __uint16_t              qlf_type;      /* dquot log item type */
        __uint16_t              qlf_size;      /* size of this item */
-       xfs_dqid_t              qlf_id;        /* usr/grp id number : 32 bits */
+       xfs_dqid_t              qlf_id;        /* usr/grp/proj id : 32 bits */
        __int64_t               qlf_blkno;     /* blkno of dquot buffer */
        __int32_t               qlf_len;       /* len of dquot buffer */
        __uint32_t              qlf_boffset;   /* off of dquot in buffer */
@@ -152,9 +154,9 @@ typedef struct xfs_qoff_logformat {
 #define XFS_UQUOTA_ACCT        0x0001  /* user quota accounting ON */
 #define XFS_UQUOTA_ENFD        0x0002  /* user quota limits enforced */
 #define XFS_UQUOTA_CHKD        0x0004  /* quotacheck run on usr quotas */
-#define XFS_PQUOTA_ACCT        0x0008  /* (IRIX) project quota accounting ON */
-#define XFS_GQUOTA_ENFD        0x0010  /* group quota limits enforced */
-#define XFS_GQUOTA_CHKD        0x0020  /* quotacheck run on grp quotas */
+#define XFS_PQUOTA_ACCT        0x0008  /* project quota accounting ON */
+#define XFS_OQUOTA_ENFD        0x0010  /* other (grp/prj) quota limits enforced */
+#define XFS_OQUOTA_CHKD        0x0020  /* quotacheck run on other (grp/prj) quotas */
 #define XFS_GQUOTA_ACCT        0x0040  /* group quota accounting ON */
 
 /*
@@ -162,17 +164,22 @@ typedef struct xfs_qoff_logformat {
  * are in the process of getting turned off. These flags are in m_qflags but
  * never in sb_qflags.
  */
-#define XFS_UQUOTA_ACTIVE      0x0080  /* uquotas are being turned off */
-#define XFS_GQUOTA_ACTIVE      0x0100  /* gquotas are being turned off */
+#define XFS_UQUOTA_ACTIVE      0x0100  /* uquotas are being turned off */
+#define XFS_PQUOTA_ACTIVE      0x0200  /* pquotas are being turned off */
+#define XFS_GQUOTA_ACTIVE      0x0400  /* gquotas are being turned off */
 
 /*
  * Checking XFS_IS_*QUOTA_ON() while holding any inode lock guarantees
  * quota will be not be switched off as long as that inode lock is held.
  */
 #define XFS_IS_QUOTA_ON(mp)    ((mp)->m_qflags & (XFS_UQUOTA_ACTIVE | \
-                                                  XFS_GQUOTA_ACTIVE))
+                                                  XFS_GQUOTA_ACTIVE | \
+                                                  XFS_PQUOTA_ACTIVE))
+#define XFS_IS_OQUOTA_ON(mp)   ((mp)->m_qflags & (XFS_GQUOTA_ACTIVE | \
+                                                  XFS_PQUOTA_ACTIVE))
 #define XFS_IS_UQUOTA_ON(mp)   ((mp)->m_qflags & XFS_UQUOTA_ACTIVE)
 #define XFS_IS_GQUOTA_ON(mp)   ((mp)->m_qflags & XFS_GQUOTA_ACTIVE)
+#define XFS_IS_PQUOTA_ON(mp)   ((mp)->m_qflags & XFS_PQUOTA_ACTIVE)
 
 /*
  * Flags to tell various functions what to do. Not all of these are meaningful
@@ -182,7 +189,7 @@ typedef struct xfs_qoff_logformat {
 #define XFS_QMOPT_DQLOCK       0x0000001 /* dqlock */
 #define XFS_QMOPT_DQALLOC      0x0000002 /* alloc dquot ondisk if needed */
 #define XFS_QMOPT_UQUOTA       0x0000004 /* user dquot requested */
-#define XFS_QMOPT_GQUOTA       0x0000008 /* group dquot requested */
+#define XFS_QMOPT_PQUOTA       0x0000008 /* project dquot requested */
 #define XFS_QMOPT_FORCE_RES    0x0000010 /* ignore quota limits */
 #define XFS_QMOPT_DQSUSER      0x0000020 /* don't cache super users dquot */
 #define XFS_QMOPT_SBVERSION    0x0000040 /* change superblock version num */
@@ -192,6 +199,7 @@ typedef struct xfs_qoff_logformat {
 #define XFS_QMOPT_DOWARN        0x0000400 /* increase warning cnt if necessary */
 #define XFS_QMOPT_ILOCKED      0x0000800 /* inode is already locked (excl) */
 #define XFS_QMOPT_DQREPAIR     0x0001000 /* repair dquot, if damaged. */
+#define XFS_QMOPT_GQUOTA       0x0002000 /* group dquot requested */
 
 /*
  * flags to xfs_trans_mod_dquot to indicate which field needs to be
@@ -231,7 +239,8 @@ typedef struct xfs_qoff_logformat {
 #define XFS_TRANS_DQ_DELRTBCOUNT XFS_QMOPT_DELRTBCOUNT
 
 
-#define XFS_QMOPT_QUOTALL      (XFS_QMOPT_UQUOTA|XFS_QMOPT_GQUOTA)
+#define XFS_QMOPT_QUOTALL      \
+               (XFS_QMOPT_UQUOTA | XFS_QMOPT_PQUOTA | XFS_QMOPT_GQUOTA)
 #define XFS_QMOPT_RESBLK_MASK  (XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_RES_RTBLKS)
 
 #ifdef __KERNEL__
@@ -246,21 +255,33 @@ typedef struct xfs_qoff_logformat {
  */
 #define XFS_NOT_DQATTACHED(mp, ip) ((XFS_IS_UQUOTA_ON(mp) &&\
                                     (ip)->i_udquot == NULL) || \
-                                   (XFS_IS_GQUOTA_ON(mp) && \
+                                   (XFS_IS_OQUOTA_ON(mp) && \
                                     (ip)->i_gdquot == NULL))
 
-#define XFS_QM_NEED_QUOTACHECK(mp) ((XFS_IS_UQUOTA_ON(mp) && \
-                                    (mp->m_sb.sb_qflags & \
-                                     XFS_UQUOTA_CHKD) == 0) || \
-                                   (XFS_IS_GQUOTA_ON(mp) && \
-                                    (mp->m_sb.sb_qflags & \
-                                     XFS_GQUOTA_CHKD) == 0))
+#define XFS_QM_NEED_QUOTACHECK(mp) \
+       ((XFS_IS_UQUOTA_ON(mp) && \
+               (mp->m_sb.sb_qflags & XFS_UQUOTA_CHKD) == 0) || \
+        (XFS_IS_GQUOTA_ON(mp) && \
+               ((mp->m_sb.sb_qflags & XFS_OQUOTA_CHKD) == 0 || \
+                (mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT))) || \
+        (XFS_IS_PQUOTA_ON(mp) && \
+               ((mp->m_sb.sb_qflags & XFS_OQUOTA_CHKD) == 0 || \
+                (mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT))))
+
+#define XFS_MOUNT_QUOTA_SET1   (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\
+                                XFS_UQUOTA_CHKD|XFS_PQUOTA_ACCT|\
+                                XFS_OQUOTA_ENFD|XFS_OQUOTA_CHKD)
+
+#define XFS_MOUNT_QUOTA_SET2   (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\
+                                XFS_UQUOTA_CHKD|XFS_GQUOTA_ACCT|\
+                                XFS_OQUOTA_ENFD|XFS_OQUOTA_CHKD)
 
 #define XFS_MOUNT_QUOTA_ALL    (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\
-                                XFS_UQUOTA_CHKD|XFS_GQUOTA_ACCT|\
-                                XFS_GQUOTA_ENFD|XFS_GQUOTA_CHKD)
+                                XFS_UQUOTA_CHKD|XFS_PQUOTA_ACCT|\
+                                XFS_OQUOTA_ENFD|XFS_OQUOTA_CHKD|\
+                                XFS_GQUOTA_ACCT)
 #define XFS_MOUNT_QUOTA_MASK   (XFS_MOUNT_QUOTA_ALL | XFS_UQUOTA_ACTIVE | \
-                                XFS_GQUOTA_ACTIVE)
+                                XFS_GQUOTA_ACTIVE | XFS_PQUOTA_ACTIVE)
 
 
 /*
@@ -331,15 +352,8 @@ typedef struct xfs_dqtrxops {
 #define XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp) \
        XFS_DQTRXOP_VOID(mp, tp, qo_unreserve_and_mod_dquots)
 
-#define XFS_TRANS_RESERVE_BLKQUOTA(mp, tp, ip, nblks) \
-       XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, 0, \
-                               XFS_QMOPT_RES_REGBLKS)
-#define XFS_TRANS_RESERVE_BLKQUOTA_FORCE(mp, tp, ip, nblks) \
-       XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, 0, \
-                               XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES)
-#define XFS_TRANS_UNRESERVE_BLKQUOTA(mp, tp, ip, nblks) \
-       XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, -(nblks), 0, \
-                               XFS_QMOPT_RES_REGBLKS)
+#define XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, ninos, flags) \
+       XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, -(nblks), -(ninos), flags)
 #define XFS_TRANS_RESERVE_QUOTA(mp, tp, ud, gd, nb, ni, f) \
        XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, nb, ni, \
                                f | XFS_QMOPT_RES_REGBLKS)
index cb13f9a1d45ba43aa20bd016a92b564370ed89ad..23b48ac1cb7e5fb9ff73e1f041f8cbf37d9ef38b 100644 (file)
@@ -234,9 +234,6 @@ xfs_lock_for_rename(
        return 0;
 }
 
-
-int rename_which_error_return = 0;
-
 /*
  * xfs_rename
  */
@@ -316,7 +313,6 @@ xfs_rename(
                        &num_inodes);
 
        if (error) {
-               rename_which_error_return = __LINE__;
                /*
                 * We have nothing locked, no inode references, and
                 * no transaction, so just get out.
@@ -332,7 +328,6 @@ xfs_rename(
                 */
                if (target_ip == NULL && (src_dp != target_dp) &&
                    target_dp->i_d.di_nlink >= XFS_MAXLINK) {
-                       rename_which_error_return = __LINE__;
                        error = XFS_ERROR(EMLINK);
                        xfs_rename_unlock4(inodes, XFS_ILOCK_SHARED);
                        goto rele_return;
@@ -359,7 +354,6 @@ xfs_rename(
                                XFS_TRANS_PERM_LOG_RES, XFS_RENAME_LOG_COUNT);
        }
        if (error) {
-               rename_which_error_return = __LINE__;
                xfs_trans_cancel(tp, 0);
                goto rele_return;
        }
@@ -369,7 +363,6 @@ xfs_rename(
         */
        if ((error = XFS_QM_DQVOPRENAME(mp, inodes))) {
                xfs_trans_cancel(tp, cancel_flags);
-               rename_which_error_return = __LINE__;
                goto rele_return;
        }
 
@@ -413,7 +406,6 @@ xfs_rename(
                if (spaceres == 0 &&
                    (error = XFS_DIR_CANENTER(mp, tp, target_dp, target_name,
                                target_namelen))) {
-                       rename_which_error_return = __LINE__;
                        goto error_return;
                }
                /*
@@ -425,11 +417,9 @@ xfs_rename(
                                           target_namelen, src_ip->i_ino,
                                           &first_block, &free_list, spaceres);
                if (error == ENOSPC) {
-                       rename_which_error_return = __LINE__;
                        goto error_return;
                }
                if (error) {
-                       rename_which_error_return = __LINE__;
                        goto abort_return;
                }
                xfs_ichgtime(target_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
@@ -437,7 +427,6 @@ xfs_rename(
                if (new_parent && src_is_directory) {
                        error = xfs_bumplink(tp, target_dp);
                        if (error) {
-                               rename_which_error_return = __LINE__;
                                goto abort_return;
                        }
                }
@@ -455,7 +444,6 @@ xfs_rename(
                        if (!(XFS_DIR_ISEMPTY(target_ip->i_mount, target_ip)) ||
                            (target_ip->i_d.di_nlink > 2)) {
                                error = XFS_ERROR(EEXIST);
-                               rename_which_error_return = __LINE__;
                                goto error_return;
                        }
                }
@@ -473,7 +461,6 @@ xfs_rename(
                        target_namelen, src_ip->i_ino, &first_block,
                        &free_list, spaceres);
                if (error) {
-                       rename_which_error_return = __LINE__;
                        goto abort_return;
                }
                xfs_ichgtime(target_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
@@ -484,7 +471,6 @@ xfs_rename(
                 */
                error = xfs_droplink(tp, target_ip);
                if (error) {
-                       rename_which_error_return = __LINE__;
                        goto abort_return;
                }
                target_ip_dropped = 1;
@@ -495,7 +481,6 @@ xfs_rename(
                         */
                        error = xfs_droplink(tp, target_ip);
                        if (error) {
-                               rename_which_error_return = __LINE__;
                                goto abort_return;
                        }
                }
@@ -519,7 +504,6 @@ xfs_rename(
                                        &free_list, spaceres);
                ASSERT(error != EEXIST);
                if (error) {
-                       rename_which_error_return = __LINE__;
                        goto abort_return;
                }
                xfs_ichgtime(src_ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
@@ -550,7 +534,6 @@ xfs_rename(
                 */
                error = xfs_droplink(tp, src_dp);
                if (error) {
-                       rename_which_error_return = __LINE__;
                        goto abort_return;
                }
        }
@@ -558,7 +541,6 @@ xfs_rename(
        error = XFS_DIR_REMOVENAME(mp, tp, src_dp, src_name, src_namelen,
                        src_ip->i_ino, &first_block, &free_list, spaceres);
        if (error) {
-               rename_which_error_return = __LINE__;
                goto abort_return;
        }
        xfs_ichgtime(src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
index 3db0e22007759c076b0ed561270203af3dedd026..06dfca531f79880fc146845b6863d8dc28b6e1d4 100644 (file)
@@ -331,25 +331,6 @@ undo_blocks:
 }
 
 
-/*
- * This is called to set the a callback to be called when the given
- * transaction is committed to disk.  The transaction pointer and the
- * argument pointer will be passed to the callback routine.
- *
- * Only one callback can be associated with any single transaction.
- */
-void
-xfs_trans_callback(
-       xfs_trans_t             *tp,
-       xfs_trans_callback_t    callback,
-       void                    *arg)
-{
-       ASSERT(tp->t_callback == NULL);
-       tp->t_callback = callback;
-       tp->t_callarg = arg;
-}
-
-
 /*
  * Record the indicated change to the given field for application
  * to the file system's superblock when the transaction commits.
@@ -551,7 +532,7 @@ xfs_trans_apply_sb_deltas(
  *
  * This is done efficiently with a single call to xfs_mod_incore_sb_batch().
  */
-void
+STATIC void
 xfs_trans_unreserve_and_mod_sb(
        xfs_trans_t     *tp)
 {
index bd37ccb85e76d30f98d2d61e6c7b79b47a4d9f26..ec541d66fa2a47309a8ec76523435d3756edf71e 100644 (file)
@@ -987,8 +987,6 @@ xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint);
 xfs_trans_t    *xfs_trans_dup(xfs_trans_t *);
 int            xfs_trans_reserve(xfs_trans_t *, uint, uint, uint,
                                  uint, uint);
-void           xfs_trans_callback(xfs_trans_t *,
-                                  void (*)(xfs_trans_t *, void *), void *);
 void           xfs_trans_mod_sb(xfs_trans_t *, uint, long);
 struct xfs_buf *xfs_trans_get_buf(xfs_trans_t *, struct xfs_buftarg *, xfs_daddr_t,
                                   int, uint);
@@ -1010,7 +1008,6 @@ int               xfs_trans_iget(struct xfs_mount *, xfs_trans_t *,
                               xfs_ino_t , uint, uint, struct xfs_inode **);
 void           xfs_trans_ijoin(xfs_trans_t *, struct xfs_inode *, uint);
 void           xfs_trans_ihold(xfs_trans_t *, struct xfs_inode *);
-void           xfs_trans_ihold_release(xfs_trans_t *, struct xfs_inode *);
 void           xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint);
 void           xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint);
 struct xfs_efi_log_item        *xfs_trans_get_efi(xfs_trans_t *, uint);
index a9682b9510c1dd1f0e2ab1c41746a2f734479eea..144da7a85466c2e85fbffe66ff1f15e08c0873ec 100644 (file)
@@ -976,6 +976,7 @@ xfs_trans_dquot_buf(
        ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp);
        ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL);
        ASSERT(type == XFS_BLI_UDQUOT_BUF ||
+              type == XFS_BLI_PDQUOT_BUF ||
               type == XFS_BLI_GDQUOT_BUF);
 
        bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *);
index e2c3706f453de78c9b9063a87733f7d3f87d8618..7e7631ca49793b6ad8b2cad24d3a0e9ab530f442 100644 (file)
@@ -253,24 +253,6 @@ xfs_trans_ihold(
        ip->i_itemp->ili_flags |= XFS_ILI_HOLD;
 }
 
-/*
- * Cancel the previous inode hold request made on this inode
- * for this transaction.
- */
-/*ARGSUSED*/
-void
-xfs_trans_ihold_release(
-       xfs_trans_t     *tp,
-       xfs_inode_t     *ip)
-{
-       ASSERT(ip->i_transp == tp);
-       ASSERT(ip->i_itemp != NULL);
-       ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE));
-       ASSERT(ip->i_itemp->ili_flags & XFS_ILI_HOLD);
-
-       ip->i_itemp->ili_flags &= ~XFS_ILI_HOLD;
-}
-
 
 /*
  * This is called to mark the fields indicated in fieldmask as needing
index e4bf711e48ff80f3b1fc9241b12c9bffc94dc348..16f5371ce102ef7da305673e882e751bb7a29273 100644 (file)
@@ -55,7 +55,7 @@ typedef signed long long int  __int64_t;
 typedef unsigned long long int __uint64_t;
 
 typedef enum { B_FALSE,B_TRUE }        boolean_t;
-typedef __int64_t              prid_t;         /* project ID */
+typedef __uint32_t             prid_t;         /* project ID */
 typedef __uint32_t             inst_t;         /* an instruction */
 
 typedef __s64                  xfs_off_t;      /* <file offset> type */
index d1f8146a06ea16d39c09b3997e819800a5189d05..11351f08d438e9b5a3302e32a5c181585c90e8c5 100644 (file)
@@ -428,7 +428,7 @@ xfs_truncate_file(
                if (ip->i_ino != mp->m_sb.sb_uquotino)
                        ASSERT(ip->i_udquot);
        }
-       if (XFS_IS_GQUOTA_ON(mp)) {
+       if (XFS_IS_OQUOTA_ON(mp)) {
                if (ip->i_ino != mp->m_sb.sb_gquotino)
                        ASSERT(ip->i_gdquot);
        }
index b53736650100d3f62644e00ed0de2e1dba685d51..42bcc0215203b16f19e71c844a395a2b3398fb72 100644 (file)
@@ -367,16 +367,6 @@ xfs_finish_flags(
                return XFS_ERROR(EROFS);
        }
 
-       /*
-        * disallow mount attempts with (IRIX) project quota enabled
-        */
-       if (XFS_SB_VERSION_HASQUOTA(&mp->m_sb) &&
-           (mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT)) {
-               cmn_err(CE_WARN,
-       "XFS: cannot mount a filesystem with IRIX project quota enabled");
-               return XFS_ERROR(ENOSYS);
-       }
-
        /*
         * check for shared mount.
         */
@@ -622,7 +612,34 @@ out:
        return XFS_ERROR(error);
 }
 
-#define REMOUNT_READONLY_FLAGS (SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT)
+STATIC int
+xfs_quiesce_fs(
+       xfs_mount_t             *mp)
+{
+       int                     count = 0, pincount;
+               
+       xfs_refcache_purge_mp(mp);
+       xfs_flush_buftarg(mp->m_ddev_targp, 0);
+       xfs_finish_reclaim_all(mp, 0);
+
+       /* This loop must run at least twice.
+        * The first instance of the loop will flush
+        * most meta data but that will generate more
+        * meta data (typically directory updates).
+        * Which then must be flushed and logged before
+        * we can write the unmount record.
+        */ 
+       do {
+               xfs_syncsub(mp, SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT, 0, NULL);
+               pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1);
+               if (!pincount) {
+                       delay(50);
+                       count++;
+               }
+       } while (count < 2);
+
+       return 0;
+}
 
 STATIC int
 xfs_mntupdate(
@@ -632,8 +649,7 @@ xfs_mntupdate(
 {
        struct vfs      *vfsp = bhvtovfs(bdp);
        xfs_mount_t     *mp = XFS_BHVTOM(bdp);
-       int             pincount, error;
-       int             count = 0;
+       int             error;
 
        if (args->flags & XFSMNT_NOATIME)
                mp->m_flags |= XFS_MOUNT_NOATIME;
@@ -645,25 +661,7 @@ xfs_mntupdate(
        }
 
        if (*flags & MS_RDONLY) {
-               xfs_refcache_purge_mp(mp);
-               xfs_flush_buftarg(mp->m_ddev_targp, 0);
-               xfs_finish_reclaim_all(mp, 0);
-
-               /* This loop must run at least twice.
-                * The first instance of the loop will flush
-                * most meta data but that will generate more
-                * meta data (typically directory updates).
-                * Which then must be flushed and logged before
-                * we can write the unmount record.
-                */ 
-               do {
-                       VFS_SYNC(vfsp, REMOUNT_READONLY_FLAGS, NULL, error);
-                       pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1);
-                       if (!pincount) {
-                               delay(50);
-                               count++;
-                       }
-               } while (count < 2);
+               xfs_quiesce_fs(mp);
 
                /* Ok now write out an unmount record */
                xfs_log_unmount_write(mp);
@@ -879,10 +877,12 @@ xfs_sync(
        int             flags,
        cred_t          *credp)
 {
-       xfs_mount_t     *mp;
+       xfs_mount_t     *mp = XFS_BHVTOM(bdp);
 
-       mp = XFS_BHVTOM(bdp);
-       return (xfs_syncsub(mp, flags, 0, NULL));
+       if (unlikely(flags == SYNC_QUIESCE))
+               return xfs_quiesce_fs(mp);
+       else
+               return xfs_syncsub(mp, flags, 0, NULL);
 }
 
 /*
@@ -1681,7 +1681,7 @@ suffix_strtoul(const char *cp, char **endp, unsigned int base)
        return simple_strtoul(cp, endp, base) << shift_left_factor;
 }
 
-int
+STATIC int
 xfs_parseargs(
        struct bhv_desc         *bhv,
        char                    *options,
@@ -1867,7 +1867,7 @@ printk("XFS: irixsgid is now a sysctl(2) variable, option is deprecated.\n");
        return 0;
 }
 
-int
+STATIC int
 xfs_showargs(
        struct bhv_desc         *bhv,
        struct seq_file         *m)
index 25a526629b125163c772815025fec6be0d283657..1377c868f3f4929aec4106f187b01c03f480c433 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2004 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 2000-2005 Silicon Graphics, Inc.  All Rights Reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -351,21 +351,28 @@ xfs_setattr(
         * If the IDs do change before we take the ilock, we're covered
         * because the i_*dquot fields will get updated anyway.
         */
-       if (XFS_IS_QUOTA_ON(mp) && (mask & (XFS_AT_UID|XFS_AT_GID))) {
+       if (XFS_IS_QUOTA_ON(mp) &&
+           (mask & (XFS_AT_UID|XFS_AT_GID|XFS_AT_PROJID))) {
                uint    qflags = 0;
 
-               if (mask & XFS_AT_UID) {
+               if ((mask & XFS_AT_UID) && XFS_IS_UQUOTA_ON(mp)) {
                        uid = vap->va_uid;
                        qflags |= XFS_QMOPT_UQUOTA;
                } else {
                        uid = ip->i_d.di_uid;
                }
-               if (mask & XFS_AT_GID) {
+               if ((mask & XFS_AT_GID) && XFS_IS_GQUOTA_ON(mp)) {
                        gid = vap->va_gid;
                        qflags |= XFS_QMOPT_GQUOTA;
                }  else {
                        gid = ip->i_d.di_gid;
                }
+               if ((mask & XFS_AT_PROJID) && XFS_IS_PQUOTA_ON(mp)) {
+                       projid = vap->va_projid;
+                       qflags |= XFS_QMOPT_PQUOTA;
+               }  else {
+                       projid = ip->i_d.di_projid;
+               }
                /*
                 * We take a reference when we initialize udqp and gdqp,
                 * so it is important that we never blindly double trip on
@@ -373,7 +380,8 @@ xfs_setattr(
                 */
                ASSERT(udqp == NULL);
                ASSERT(gdqp == NULL);
-               code = XFS_QM_DQVOPALLOC(mp, ip, uid,gid, qflags, &udqp, &gdqp);
+               code = XFS_QM_DQVOPALLOC(mp, ip, uid, gid, projid, qflags,
+                                        &udqp, &gdqp);
                if (code)
                        return (code);
        }
@@ -499,8 +507,6 @@ xfs_setattr(
                 * that the group ID supplied to the chown() function
                 * shall be equal to either the group ID or one of the
                 * supplementary group IDs of the calling process.
-                *
-                * XXX: How does restricted_chown affect projid?
                 */
                if (restricted_chown &&
                    (iuid != uid || (igid != gid &&
@@ -510,10 +516,11 @@ xfs_setattr(
                        goto error_return;
                }
                /*
-                * Do a quota reservation only if uid or gid is actually
+                * Do a quota reservation only if uid/projid/gid is actually
                 * going to change.
                 */
                if ((XFS_IS_UQUOTA_ON(mp) && iuid != uid) ||
+                   (XFS_IS_PQUOTA_ON(mp) && iprojid != projid) ||
                    (XFS_IS_GQUOTA_ON(mp) && igid != gid)) {
                        ASSERT(tp);
                        code = XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, udqp, gdqp,
@@ -774,6 +781,7 @@ xfs_setattr(
                }
                if (igid != gid) {
                        if (XFS_IS_GQUOTA_ON(mp)) {
+                               ASSERT(!XFS_IS_PQUOTA_ON(mp));
                                ASSERT(mask & XFS_AT_GID);
                                ASSERT(gdqp);
                                olddquot2 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
@@ -782,6 +790,13 @@ xfs_setattr(
                        ip->i_d.di_gid = gid;
                }
                if (iprojid != projid) {
+                       if (XFS_IS_PQUOTA_ON(mp)) {
+                               ASSERT(!XFS_IS_GQUOTA_ON(mp));
+                               ASSERT(mask & XFS_AT_PROJID);
+                               ASSERT(gdqp);
+                               olddquot2 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
+                                                       &ip->i_gdquot, gdqp);
+                       }
                        ip->i_d.di_projid = projid;
                        /*
                         * We may have to rev the inode as well as
@@ -843,6 +858,8 @@ xfs_setattr(
                                di_flags |= XFS_DIFLAG_NOATIME;
                        if (vap->va_xflags & XFS_XFLAG_NODUMP)
                                di_flags |= XFS_DIFLAG_NODUMP;
+                       if (vap->va_xflags & XFS_XFLAG_PROJINHERIT)
+                               di_flags |= XFS_DIFLAG_PROJINHERIT;
                        if ((ip->i_d.di_mode & S_IFMT) == S_IFDIR) {
                                if (vap->va_xflags & XFS_XFLAG_RTINHERIT)
                                        di_flags |= XFS_DIFLAG_RTINHERIT;
@@ -1898,7 +1915,9 @@ xfs_create(
        /* Return through std_return after this point. */
 
        udqp = gdqp = NULL;
-       if (vap->va_mask & XFS_AT_PROJID)
+       if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
+               prid = dp->i_d.di_projid;
+       else if (vap->va_mask & XFS_AT_PROJID)
                prid = (xfs_prid_t)vap->va_projid;
        else
                prid = (xfs_prid_t)dfltprid;
@@ -1907,7 +1926,7 @@ xfs_create(
         * Make sure that we have allocated dquot(s) on disk.
         */
        error = XFS_QM_DQVOPALLOC(mp, dp,
-                       current_fsuid(credp), current_fsgid(credp),
+                       current_fsuid(credp), current_fsgid(credp), prid,
                        XFS_QMOPT_QUOTALL|XFS_QMOPT_INHERIT, &udqp, &gdqp);
        if (error)
                goto std_return;
@@ -2604,17 +2623,7 @@ xfs_link(
        if (src_vp->v_type == VDIR)
                return XFS_ERROR(EPERM);
 
-       /*
-        * For now, manually find the XFS behavior descriptor for
-        * the source vnode.  If it doesn't exist then something
-        * is wrong and we should just return an error.
-        * Eventually we need to figure out how link is going to
-        * work in the face of stacked vnodes.
-        */
        src_bdp = vn_bhv_lookup_unlocked(VN_BHV_HEAD(src_vp), &xfs_vnodeops);
-       if (src_bdp == NULL) {
-               return XFS_ERROR(EXDEV);
-       }
        sip = XFS_BHVTOI(src_bdp);
        tdp = XFS_BHVTOI(target_dir_bdp);
        mp = tdp->i_mount;
@@ -2681,6 +2690,17 @@ xfs_link(
                goto error_return;
        }
 
+       /*
+        * If we are using project inheritance, we only allow hard link
+        * creation in our tree when the project IDs are the same; else
+        * the tree quota mechanism could be circumvented.
+        */
+       if (unlikely((tdp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
+                    (tdp->i_d.di_projid != sip->i_d.di_projid))) {
+               error = XFS_ERROR(EPERM);
+               goto error_return;
+       }
+
        if (resblks == 0 &&
            (error = XFS_DIR_CANENTER(mp, tp, tdp, target_name,
                        target_namelen)))
@@ -2803,7 +2823,9 @@ xfs_mkdir(
 
        mp = dp->i_mount;
        udqp = gdqp = NULL;
-       if (vap->va_mask & XFS_AT_PROJID)
+       if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
+               prid = dp->i_d.di_projid;
+       else if (vap->va_mask & XFS_AT_PROJID)
                prid = (xfs_prid_t)vap->va_projid;
        else
                prid = (xfs_prid_t)dfltprid;
@@ -2812,7 +2834,7 @@ xfs_mkdir(
         * Make sure that we have allocated dquot(s) on disk.
         */
        error = XFS_QM_DQVOPALLOC(mp, dp,
-                       current_fsuid(credp), current_fsgid(credp),
+                       current_fsuid(credp), current_fsgid(credp), prid,
                        XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp);
        if (error)
                goto std_return;
@@ -3357,7 +3379,9 @@ xfs_symlink(
        /* Return through std_return after this point. */
 
        udqp = gdqp = NULL;
-       if (vap->va_mask & XFS_AT_PROJID)
+       if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
+               prid = dp->i_d.di_projid;
+       else if (vap->va_mask & XFS_AT_PROJID)
                prid = (xfs_prid_t)vap->va_projid;
        else
                prid = (xfs_prid_t)dfltprid;
@@ -3366,7 +3390,7 @@ xfs_symlink(
         * Make sure that we have allocated dquot(s) on disk.
         */
        error = XFS_QM_DQVOPALLOC(mp, dp,
-                       current_fsuid(credp), current_fsgid(credp),
+                       current_fsuid(credp), current_fsgid(credp), prid,
                        XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp);
        if (error)
                goto std_return;
@@ -4028,7 +4052,7 @@ xfs_finish_reclaim_all(xfs_mount_t *mp, int noblock)
  *      errno on error
  *
  */
-int
+STATIC int
 xfs_alloc_file_space(
        xfs_inode_t             *ip,
        xfs_off_t               offset,
@@ -4151,9 +4175,8 @@ retry:
                        break;
                }
                xfs_ilock(ip, XFS_ILOCK_EXCL);
-               error = XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp,
-                               ip->i_udquot, ip->i_gdquot, resblks, 0, rt ?
-                               XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS);
+               error = XFS_TRANS_RESERVE_QUOTA(mp, tp,
+                               ip->i_udquot, ip->i_gdquot, resblks, 0, 0);
                if (error)
                        goto error1;
 
@@ -4305,6 +4328,7 @@ xfs_free_file_space(
        xfs_off_t               len,
        int                     attr_flags)
 {
+       vnode_t                 *vp;
        int                     committed;
        int                     done;
        xfs_off_t               end_dmi_offset;
@@ -4325,9 +4349,11 @@ xfs_free_file_space(
        xfs_trans_t             *tp;
        int                     need_iolock = 1;
 
-       vn_trace_entry(XFS_ITOV(ip), __FUNCTION__, (inst_t *)__return_address);
+       vp = XFS_ITOV(ip);
        mp = ip->i_mount;
 
+       vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
+
        if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
                return error;
 
@@ -4344,7 +4370,7 @@ xfs_free_file_space(
            DM_EVENT_ENABLED(XFS_MTOVFS(mp), ip, DM_EVENT_WRITE)) {
                if (end_dmi_offset > ip->i_d.di_size)
                        end_dmi_offset = ip->i_d.di_size;
-               error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, XFS_ITOV(ip),
+               error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, vp,
                                offset, end_dmi_offset - offset,
                                AT_DELAY_FLAG(attr_flags), NULL);
                if (error)
@@ -4363,7 +4389,14 @@ xfs_free_file_space(
        ioffset = offset & ~(rounding - 1);
        if (ilen & (rounding - 1))
                ilen = (ilen + rounding) & ~(rounding - 1);
-       xfs_inval_cached_pages(XFS_ITOV(ip), &(ip->i_iocore), ioffset, 0, 0);
+
+       if (VN_CACHED(vp) != 0) {
+               xfs_inval_cached_trace(&ip->i_iocore, ioffset, -1,
+                               ctooff(offtoct(ioffset)), -1);
+               VOP_FLUSHINVAL_PAGES(vp, ctooff(offtoct(ioffset)),
+                               -1, FI_REMAPF_LOCKED);
+       }
+
        /*
         * Need to zero the stuff we're not freeing, on disk.
         * If its a realtime file & can't use unwritten extents then we
index c99dbbb5bcb5ae32f02d8c3f4af9d3c4d2638f77..ef855a3bc0f54eed5048af5cf636d4c365bf29e7 100644 (file)
 #define flush_agp_mappings() 
 #define flush_agp_cache() mb()
 
+/* Convert a physical address to an address suitable for the GART. */
+#define phys_to_gart(x) (x)
+#define gart_to_phys(x) (x)
+
+/* GATT allocation. Returns/accepts GATT kernel virtual address. */
+#define alloc_gatt_pages(order)                \
+       ((char *)__get_free_pages(GFP_KERNEL, (order)))
+#define free_gatt_pages(table, order)  \
+       free_pages((unsigned long)(table), (order))
+
 #endif
index cbc173ae45aa2a711fee8cf9c913aac5c91c2e84..9950706abdf8289f0d2815dd45102aa787016038 100644 (file)
@@ -43,7 +43,7 @@ extern struct cpuinfo_alpha cpu_data[NR_CPUS];
 #define PROC_CHANGE_PENALTY     20
 
 #define hard_smp_processor_id()        __hard_smp_processor_id()
-#define smp_processor_id()     (current_thread_info()->cpu)
+#define raw_smp_processor_id() (current_thread_info()->cpu)
 
 extern cpumask_t cpu_present_mask;
 extern cpumask_t cpu_online_map;
diff --git a/include/asm-arm/arch-aaec2000/aaec2000.h b/include/asm-arm/arch-aaec2000/aaec2000.h
new file mode 100644 (file)
index 0000000..0e9b7e1
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ *  linux/include/asm-arm/arch-aaec2000/aaec2000.h
+ *
+ *  AAEC-2000 registers definition
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_AAEC2000_H
+#define __ASM_ARCH_AAEC2000_H
+
+#ifndef __ASM_ARCH_HARDWARE_H
+#error You must include hardware.h not this file
+#endif /* __ASM_ARCH_HARDWARE_H */
+
+/* Interrupt controller */
+#define IRQ_BASE       __REG(0x80000500)
+#define IRQ_INTSR      __REG(0x80000500)       /* Int Status Register */
+#define IRQ_INTRSR     __REG(0x80000504)       /* Int Raw (unmasked) Status */
+#define IRQ_INTENS     __REG(0x80000508)       /* Int Enable Set */
+#define IRQ_INTENC     __REG(0x8000050c)       /* Int Enable Clear */
+
+/* UART 1 */
+#define UART1_BASE     __REG(0x80000600)
+#define UART1_DR       __REG(0x80000600) /* Data/FIFO Register */
+#define UART1_LCR      __REG(0x80000604) /* Link Control Register */
+#define UART1_BRCR     __REG(0x80000608) /* Baud Rate Control Register */
+#define UART1_CR       __REG(0x8000060c) /* Control Register */
+#define UART1_SR       __REG(0x80000610) /* Status Register */
+#define UART1_INT      __REG(0x80000614) /* Interrupt Status Register */
+#define UART1_INTM     __REG(0x80000618) /* Interrupt Mask Register */
+#define UART1_INTRES   __REG(0x8000061c) /* Int Result (masked status) Register */
+
+/* UART 2 */
+#define UART2_BASE     __REG(0x80000700)
+#define UART2_DR       __REG(0x80000700) /* Data/FIFO Register */
+#define UART2_LCR      __REG(0x80000704) /* Link Control Register */
+#define UART2_BRCR     __REG(0x80000708) /* Baud Rate Control Register */
+#define UART2_CR       __REG(0x8000070c) /* Control Register */
+#define UART2_SR       __REG(0x80000710) /* Status Register */
+#define UART2_INT      __REG(0x80000714) /* Interrupt Status Register */
+#define UART2_INTM     __REG(0x80000718) /* Interrupt Mask Register */
+#define UART2_INTRES   __REG(0x8000071c) /* Int Result (masked status) Register */
+
+/* UART 3 */
+#define UART3_BASE     __REG(0x80000800)
+#define UART3_DR       __REG(0x80000800) /* Data/FIFO Register */
+#define UART3_LCR      __REG(0x80000804) /* Link Control Register */
+#define UART3_BRCR     __REG(0x80000808) /* Baud Rate Control Register */
+#define UART3_CR       __REG(0x8000080c) /* Control Register */
+#define UART3_SR       __REG(0x80000810) /* Status Register */
+#define UART3_INT      __REG(0x80000814) /* Interrupt Status Register */
+#define UART3_INTM     __REG(0x80000818) /* Interrupt Mask Register */
+#define UART3_INTRES   __REG(0x8000081c) /* Int Result (masked status) Register */
+
+/* These are used in some places */
+#define _UART1_BASE __PREG(UART1_BASE)
+#define _UART2_BASE __PREG(UART2_BASE)
+#define _UART3_BASE __PREG(UART3_BASE)
+
+/* UART Registers Offsets */
+#define UART_DR                0x00
+#define UART_LCR       0x04
+#define UART_BRCR      0x08
+#define UART_CR                0x0c
+#define UART_SR                0x10
+#define UART_INT       0x14
+#define UART_INTM      0x18
+#define UART_INTRES    0x1c
+
+/* UART_LCR Bitmask */
+#define UART_LCR_BRK   (1 << 0) /* Send Break */
+#define UART_LCR_PEN   (1 << 1) /* Parity Enable */
+#define UART_LCR_EP    (1 << 2) /* Even/Odd Parity */
+#define UART_LCR_S2    (1 << 3) /* One/Two Stop bits */
+#define UART_LCR_FIFO  (1 << 4) /* FIFO Enable */
+#define UART_LCR_WL5   (0 << 5) /* Word Length - 5 bits */
+#define UART_LCR_WL6   (1 << 5) /* Word Length - 6 bits */
+#define UART_LCR_WL7   (1 << 6) /* Word Length - 7 bits */
+#define UART_LCR_WL8   (1 << 7) /* Word Length - 8 bits */
+
+/* UART_CR Bitmask */
+#define UART_CR_EN     (1 << 0) /* UART Enable */
+#define UART_CR_SIR    (1 << 1) /* IrDA SIR Enable */
+#define UART_CR_SIRLP  (1 << 2) /* Low Power IrDA Enable */
+#define UART_CR_RXP    (1 << 3) /* Receive Pin Polarity */
+#define UART_CR_TXP    (1 << 4) /* Transmit Pin Polarity */
+#define UART_CR_MXP    (1 << 5) /* Modem Pin Polarity */
+#define UART_CR_LOOP   (1 << 6) /* Loopback Mode */
+
+/* UART_SR Bitmask */
+#define UART_SR_CTS    (1 << 0) /* Clear To Send Status */
+#define UART_SR_DSR    (1 << 1) /* Data Set Ready Status */
+#define UART_SR_DCD    (1 << 2) /* Data Carrier Detect Status */
+#define UART_SR_TxBSY  (1 << 3) /* Transmitter Busy Status */
+#define UART_SR_RxFE   (1 << 4) /* Receive FIFO Empty Status */
+#define UART_SR_TxFF   (1 << 5) /* Transmit FIFO Full Status */
+#define UART_SR_RxFF   (1 << 6) /* Receive FIFO Full Status */
+#define UART_SR_TxFE   (1 << 7) /* Transmit FIFO Empty Status */
+
+/* UART_INT Bitmask */
+#define UART_INT_RIS   (1 << 0) /* Rx Interrupt */
+#define UART_INT_TIS   (1 << 1) /* Tx Interrupt */
+#define UART_INT_MIS   (1 << 2) /* Modem Interrupt */
+#define UART_INT_RTIS  (1 << 3) /* Receive Timeout Interrupt */
+
+/* Timer 1 */
+#define TIMER1_BASE    __REG(0x80000c00)
+#define TIMER1_LOAD    __REG(0x80000c00)       /* Timer 1 Load Register */
+#define TIMER1_VAL     __REG(0x80000c04)       /* Timer 1 Value Register */
+#define TIMER1_CTRL    __REG(0x80000c08)       /* Timer 1 Control Register */
+#define TIMER1_CLEAR   __REG(0x80000c0c)       /* Timer 1 Clear Register */
+
+/* Timer 2 */
+#define TIMER2_BASE    __REG(0x80000d00)
+#define TIMER2_LOAD    __REG(0x80000d00)       /* Timer 2 Load Register */
+#define TIMER2_VAL     __REG(0x80000d04)       /* Timer 2 Value Register */
+#define TIMER2_CTRL    __REG(0x80000d08)       /* Timer 2 Control Register */
+#define TIMER2_CLEAR   __REG(0x80000d0c)       /* Timer 2 Clear Register */
+
+/* Timer 3 */
+#define TIMER3_BASE    __REG(0x80000e00)
+#define TIMER3_LOAD    __REG(0x80000e00)       /* Timer 3 Load Register */
+#define TIMER3_VAL     __REG(0x80000e04)       /* Timer 3 Value Register */
+#define TIMER3_CTRL    __REG(0x80000e08)       /* Timer 3 Control Register */
+#define TIMER3_CLEAR   __REG(0x80000e0c)       /* Timer 3 Clear Register */
+
+/* Timer Control register bits */
+#define TIMER_CTRL_ENABLE      (1 << 7) /* Enable (Start° Timer */
+#define TIMER_CTRL_PERIODIC    (1 << 6) /* Periodic Running Mode */
+#define TIMER_CTRL_FREE_RUNNING (0 << 6) /* Normal Running Mode */
+#define TIMER_CTRL_CLKSEL_508K (1 << 3) /* 508KHz Clock select (Timer 1, 2) */
+#define TIMER_CTRL_CLKSEL_2K   (0 << 3) /* 2KHz Clock Select (Timer 1, 2)*/
+
+/* Power and State Control */
+#define POWER_BASE     __REG(0x80000400)
+#define POWER_PWRSR    __REG(0x80000400) /* Power Status Register */
+#define POWER_PWRCNT   __REG(0x80000404) /* Power/Clock control */
+#define POWER_HALT     __REG(0x80000408) /* Power Idle Mode */
+#define POWER_STDBY    __REG(0x8000040c) /* Power Standby Mode */
+#define POWER_BLEOI    __REG(0x80000410) /* Battery Low End of Interrupt */
+#define POWER_MCEOI    __REG(0x80000414) /* Media Changed EoI */
+#define POWER_TEOI     __REG(0x80000418) /* Tick EoI */
+#define POWER_STFCLR   __REG(0x8000041c) /* NbFlg, RSTFlg, PFFlg, CLDFlg Clear */
+#define POWER_CLKSET   __REG(0x80000420) /* Clock Speed Control */
+
+#endif /* __ARM_ARCH_AAEC2000_H */
diff --git a/include/asm-arm/arch-aaec2000/debug-macro.S b/include/asm-arm/arch-aaec2000/debug-macro.S
new file mode 100644 (file)
index 0000000..e4f1fa5
--- /dev/null
@@ -0,0 +1,36 @@
+/*  linux/include/asm-arm/arch-aaec2000/debug-macro.S
+ *
+ *  Debugging macro include header
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+               .macro  addruart,rx
+               mrc     p15, 0, \rx, c1, c0
+               tst     \rx, #1                 @ MMU enabled?
+               moveq   \rx, #0x80000000                @ physical
+               movne   \rx, #io_p2v(0x80000000)        @ virtual
+               orr     \rx, \rx, #0x00000800
+               .endm
+
+               .macro  senduart,rd,rx
+               str     \rd, [\rx, #0]
+               .endm
+
+               .macro  busyuart,rd,rx
+1002:          ldr     \rd, [\rx, #0x10]
+               tst     \rd, #(1 << 7)
+               beq     1002b
+               .endm
+
+               .macro  waituart,rd,rx
+#if 0
+1001:          ldr     \rd, [\rx, #0x10]
+               tst     \rd, #(1 << 5)
+               beq     1001b
+#endif
+               .endm
diff --git a/include/asm-arm/arch-aaec2000/dma.h b/include/asm-arm/arch-aaec2000/dma.h
new file mode 100644 (file)
index 0000000..28c890b
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ *  linux/include/asm-arm/arch-aaec2000/dma.h
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_DMA_H
+#define __ASM_ARCH_DMA_H
+
+#define MAX_DMA_ADDRESS         0xffffffff
+#define MAX_DMA_CHANNELS        0
+
+#endif
diff --git a/include/asm-arm/arch-aaec2000/entry-macro.S b/include/asm-arm/arch-aaec2000/entry-macro.S
new file mode 100644 (file)
index 0000000..df31313
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ *  linux/include/asm-arm/arch-aaec2000/entry-macro.S
+ *
+ *  Low-level IRQ helper for aaec-2000 based platforms
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ */
+
+               .macro  disable_fiq
+               .endm
+
+               .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
+               mov     r4, #0xf8000000
+               add     r4, r4, #0x00000500
+               mov     \base, r4
+               ldr     \irqstat, [\base, #0]
+               cmp     \irqstat, #0
+               bne     1001f
+               ldr     \irqnr, =NR_IRQS+1
+               b       1003f
+1001:          mov     \irqnr, #0
+1002:          ands    \tmp, \irqstat, #1
+               mov     \irqstat, \irqstat, LSR #1
+               add     \irqnr, \irqnr, #1
+               beq     1002b
+               sub     \irqnr, \irqnr, #1
+1003:
+               .endm
diff --git a/include/asm-arm/arch-aaec2000/hardware.h b/include/asm-arm/arch-aaec2000/hardware.h
new file mode 100644 (file)
index 0000000..4c37219
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ *  linux/include/asm-arm/arch-aaec2000/hardware.h
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_HARDWARE_H
+#define __ASM_ARCH_HARDWARE_H
+
+#include <linux/config.h>
+
+/* The kernel is loaded at physical address 0xf8000000.
+ * We map the IO space a bit after
+ */
+#define PIO_APB_BASE   0x80000000
+#define VIO_APB_BASE   0xf8000000
+#define IO_APB_LENGTH  0x2000
+#define PIO_AHB_BASE   0x80002000
+#define VIO_AHB_BASE   0xf8002000
+#define IO_AHB_LENGTH  0x2000
+
+#define VIO_BASE    VIO_APB_BASE
+#define PIO_BASE    PIO_APB_BASE
+
+#define io_p2v(x) ( (x) - PIO_BASE + VIO_BASE )
+#define io_v2p(x) ( (x) + PIO_BASE - VIO_BASE )
+
+#ifndef __ASSEMBLY__
+
+#include <asm/types.h>
+
+/* FIXME: Is it needed to optimize this a la pxa ?? */
+#define __REG(x)    (*((volatile u32 *)io_p2v(x)))
+#define __PREG(x)   (io_v2p((u32)&(x)))
+
+#else /* __ASSEMBLY__ */
+
+#define __REG(x)    io_p2v(x)
+#define __PREG(x)   io_v2p(x)
+
+#endif
+
+#include "aaec2000.h"
+
+#endif /* __ASM_ARCH_HARDWARE_H */
diff --git a/include/asm-arm/arch-aaec2000/io.h b/include/asm-arm/arch-aaec2000/io.h
new file mode 100644 (file)
index 0000000..c58a8d1
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ *  linux/include/asm-arm/arch-aaec2000/io.h
+ *
+ *  Copied from asm/arch/sa1100/io.h
+ */
+#ifndef __ASM_ARM_ARCH_IO_H
+#define __ASM_ARM_ARCH_IO_H
+
+#define IO_SPACE_LIMIT 0xffffffff
+
+/*
+ * We don't actually have real ISA nor PCI buses, but there is so many
+ * drivers out there that might just work if we fake them...
+ */
+#define __io(a)                        ((void __iomem *)(a))
+#define __mem_pci(a)           (a)
+#define __mem_isa(a)           (a)
+
+#endif
diff --git a/include/asm-arm/arch-aaec2000/irqs.h b/include/asm-arm/arch-aaec2000/irqs.h
new file mode 100644 (file)
index 0000000..de25222
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ *  linux/include/asm-arm/arch-aaec2000/irqs.h
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_IRQS_H
+#define __ASM_ARCH_IRQS_H
+
+
+#define INT_GPIOF0_FIQ 0  /* External GPIO Port F O Fast Interrupt Input */
+#define INT_BL_FIQ     1  /* Battery Low Fast Interrupt */
+#define INT_WE_FIQ     2  /* Watchdog Expired Fast Interrupt */
+#define INT_MV_FIQ     3  /* Media Changed Interrupt */
+#define INT_SC         4  /* Sound Codec Interrupt */
+#define INT_GPIO1      5  /* GPIO Port F Configurable Int 1 */
+#define INT_GPIO2      6  /* GPIO Port F Configurable Int 2 */
+#define INT_GPIO3      7  /* GPIO Port F Configurable Int 3 */
+#define INT_TMR1_OFL   8  /* Timer 1 Overflow Interrupt */
+#define INT_TMR2_OFL   9  /* Timer 2 Overflow Interrupt */
+#define INT_RTC_CM     10 /* RTC Compare Match Interrupt */
+#define INT_TICK       11 /* 64Hz Tick Interrupt */
+#define INT_UART1      12 /* UART1 Interrupt */
+#define INT_UART2      13 /* UART2 & Modem State Changed Interrupt */
+#define INT_LCD                14 /* LCD Interrupt */
+#define INT_SSI                15 /* SSI End of Transfer Interrupt */
+#define INT_UART3      16 /* UART3 Interrupt */
+#define INT_SCI                17 /* SCI Interrupt */
+#define INT_AAC                18 /* Advanced Audio Codec Interrupt */
+#define INT_MMC                19 /* MMC Interrupt */
+#define INT_USB                20 /* USB Interrupt */
+#define INT_DMA                21 /* DMA Interrupt */
+#define INT_TMR3_UOFL  22 /* Timer 3 Underflow Interrupt */
+#define INT_GPIO4      23 /* GPIO Port F Configurable Int 4 */
+#define INT_GPIO5      24 /* GPIO Port F Configurable Int 4 */
+#define INT_GPIO6      25 /* GPIO Port F Configurable Int 4 */
+#define INT_GPIO7      26 /* GPIO Port F Configurable Int 4 */
+#define INT_BMI                27 /* BMI Interrupt */
+
+#define NR_IRQS                (INT_BMI + 1)
+
+#endif /* __ASM_ARCH_IRQS_H */
diff --git a/include/asm-arm/arch-aaec2000/memory.h b/include/asm-arm/arch-aaec2000/memory.h
new file mode 100644 (file)
index 0000000..681b6a6
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ *  linux/include/asm-arm/arch-aaec2000/memory.h
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_MEMORY_H
+#define __ASM_ARCH_MEMORY_H
+
+#include <linux/config.h>
+
+#define PHYS_OFFSET    (0xf0000000UL)
+
+#define __virt_to_bus(x)       __virt_to_phys(x)
+#define __bus_to_virt(x)       __phys_to_virt(x)
+
+#ifdef CONFIG_DISCONTIGMEM
+
+/*
+ * The nodes are the followings:
+ *
+ *   node 0: 0xf000.0000 - 0xf3ff.ffff
+ *   node 1: 0xf400.0000 - 0xf7ff.ffff
+ *   node 2: 0xf800.0000 - 0xfbff.ffff
+ *   node 3: 0xfc00.0000 - 0xffff.ffff
+ */
+
+/*
+ * Given a kernel address, find the home node of the underlying memory.
+ */
+#define KVADDR_TO_NID(addr) \
+       (((unsigned long)(addr) - PAGE_OFFSET) >> NODE_MAX_MEM_SHIFT)
+
+/*
+ * Given a page frame number, convert it to a node id.
+ */
+#define PFN_TO_NID(pfn) \
+       (((pfn) - PHYS_PFN_OFFSET) >> (NODE_MAX_MEM_SHIFT - PAGE_SHIFT))
+
+/*
+ * Given a kaddr, ADDR_TO_MAPBASE finds the owning node of the memory
+ * and return the mem_map of that node.
+ */
+#define ADDR_TO_MAPBASE(kaddr)  NODE_MEM_MAP(KVADDR_TO_NID(kaddr))
+
+/*
+ * Given a page frame number, find the owning node of the memory
+ * and return the mem_map of that node.
+ */
+#define PFN_TO_MAPBASE(pfn)     NODE_MEM_MAP(PFN_TO_NID(pfn))
+
+/*
+ *  Given a kaddr, LOCAL_MEM_MAP finds the owning node of the memory
+ *  and returns the index corresponding to the appropriate page in the
+ *  node's mem_map.
+ */
+#define LOCAL_MAP_NR(addr) \
+        (((unsigned long)(addr) & (NODE_MAX_MEM_SIZE - 1)) >> PAGE_SHIFT)
+
+#define NODE_MAX_MEM_SHIFT     26
+#define NODE_MAX_MEM_SIZE      (1 << NODE_MAX_MEM_SHIFT)
+
+#else
+
+#define PFN_TO_NID(addr)       (0)
+
+#endif /* CONFIG_DISCONTIGMEM */
+
+#endif /* __ASM_ARCH_MEMORY_H */
diff --git a/include/asm-arm/arch-aaec2000/param.h b/include/asm-arm/arch-aaec2000/param.h
new file mode 100644 (file)
index 0000000..139936c
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ *  linux/include/asm-arm/arch-aaec2000/param.h
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_PARAM_H
+#define __ASM_ARCH_PARAM_H
+
+#endif /* __ASM_ARCH_PARAM_H */
+
diff --git a/include/asm-arm/arch-aaec2000/system.h b/include/asm-arm/arch-aaec2000/system.h
new file mode 100644 (file)
index 0000000..08de97b
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ *  linux/include/asm-arm/arch-aaed2000/system.h
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_SYSTEM_H
+#define __ASM_ARCH_SYSTEM_H
+
+static inline void arch_idle(void)
+{
+       cpu_do_idle();
+}
+
+static inline void arch_reset(char mode)
+{
+       cpu_reset(0);
+}
+
+#endif /* __ASM_ARCH_SYSTEM_H */
diff --git a/include/asm-arm/arch-aaec2000/timex.h b/include/asm-arm/arch-aaec2000/timex.h
new file mode 100644 (file)
index 0000000..f5708b3
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ *  linux/include/asm-arm/arch-aaec2000/timex.h
+ *
+ *  AAEC-2000 Architecture timex specification
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_TIMEX_H
+#define __ASM_ARCH_TIMEX_H
+
+#define CLOCK_TICK_RATE                508000
+
+#endif /* __ASM_ARCH_TIMEX_H */
diff --git a/include/asm-arm/arch-aaec2000/uncompress.h b/include/asm-arm/arch-aaec2000/uncompress.h
new file mode 100644 (file)
index 0000000..fff0c94
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ *  linux/include/asm-arm/arch-aaec2000/uncompress.h
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_UNCOMPRESS_H
+#define __ASM_ARCH_UNCOMPRESS_H
+
+#include "hardware.h"
+
+#define UART(x)         (*(volatile unsigned long *)(serial_port + (x)))
+
+static void putstr( const char *s )
+{
+       unsigned long serial_port;
+        do {
+               serial_port = _UART3_BASE;
+               if (UART(UART_CR) & UART_CR_EN) break;
+               serial_port = _UART1_BASE;
+               if (UART(UART_CR) & UART_CR_EN) break;
+               serial_port = _UART2_BASE;
+               if (UART(UART_CR) & UART_CR_EN) break;
+               return;
+       } while (0);
+
+       for (; *s; s++) {
+               /* wait for space in the UART's transmitter */
+               while ((UART(UART_SR) & UART_SR_TxFF));
+               /* send the character out. */
+               UART(UART_DR) = *s;
+               /* if a LF, also do CR... */
+               if (*s == 10) {
+                       while ((UART(UART_SR) & UART_SR_TxFF));
+                       UART(UART_DR) = 13;
+               }
+       }
+}
+
+#define arch_decomp_setup()
+#define arch_decomp_wdog()
+
+#endif /* __ASM_ARCH_UNCOMPRESS_H */
diff --git a/include/asm-arm/arch-aaec2000/vmalloc.h b/include/asm-arm/arch-aaec2000/vmalloc.h
new file mode 100644 (file)
index 0000000..ecb991e
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ *  linux/include/asm-arm/arch-aaec2000/vmalloc.h
+ *
+ *  Copyright (c) 2005 Nicolas Bellido Y Ortega
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_VMALLOC_H
+#define __ASM_ARCH_VMALLOC_H
+
+#define VMALLOC_END            (PAGE_OFFSET + 0x10000000)
+
+#endif /* __ASM_ARCH_VMALLOC_H */
index f32c203952cf766617f2b1464513661db48c629d..93b840e8fa603d32d5b9e6fcfbbb33e7fa0e0b37 100644 (file)
 #define PD31_PF_TMR2OUT      ( GPIO_PORTD | GPIO_PF | 31 )
 #define PD31_BIN_SPI2_TXD    ( GPIO_PORTD | GPIO_BIN | 31 )
 
+/*
+ * PWM controller
+ */
+#define PWMC   __REG(IMX_PWM_BASE + 0x00)      /* PWM Control Register         */
+#define PWMS   __REG(IMX_PWM_BASE + 0x04)      /* PWM Sample Register          */
+#define PWMP   __REG(IMX_PWM_BASE + 0x08)      /* PWM Period Register          */
+#define PWMCNT __REG(IMX_PWM_BASE + 0x0C)      /* PWM Counter Register         */
+
+#define PWMC_HCTR              (0x01<<18)              /* Halfword FIFO Data Swapping  */
+#define PWMC_BCTR              (0x01<<17)              /* Byte FIFO Data Swapping      */
+#define PWMC_SWR               (0x01<<16)              /* Software Reset               */
+#define PWMC_CLKSRC            (0x01<<15)              /* Clock Source                 */
+#define PWMC_PRESCALER(x)      (((x-1) & 0x7F) << 8)   /* PRESCALER                    */
+#define PWMC_IRQ               (0x01<< 7)              /* Interrupt Request            */
+#define PWMC_IRQEN             (0x01<< 6)              /* Interrupt Request Enable     */
+#define PWMC_FIFOAV            (0x01<< 5)              /* FIFO Available               */
+#define PWMC_EN                        (0x01<< 4)              /* Enables/Disables the PWM     */
+#define PWMC_REPEAT(x)         (((x) & 0x03) << 2)     /* Sample Repeats               */
+#define PWMC_CLKSEL(x)         (((x) & 0x03) << 0)     /* Clock Selection              */
+
+#define PWMS_SAMPLE(x)         ((x) & 0xFFFF)          /* Contains a two-sample word   */
+#define PWMP_PERIOD(x)         ((x) & 0xFFFF)          /* Represents the PWM's period  */
+#define PWMC_COUNTER(x)                ((x) & 0xFFFF)          /* Represents the current count value   */
+
 /*
  *  DMA Controller
  */
index bd364f5a99bcc221f8e55bcb8f582737f977accc..96ad3d2a66d1ead1ce639fb47569e642ebbb6050 100644 (file)
 #define INTEGRATOR_DBG_SWITCH           (INTEGRATOR_DBG_BASE + INTEGRATOR_DBG_SWITCH_OFFSET)
 
 
+#if defined(CONFIG_ARCH_INTEGRATOR_AP)
 #define INTEGRATOR_GPIO_BASE            0x1B000000      /*  GPIO */
+#elif defined(CONFIG_ARCH_INTEGRATOR_CP)
+#define INTEGRATOR_GPIO_BASE            0xC9000000      /*  GPIO */
+#endif
 
 /* ------------------------------------------------------------------------
  *  KMI keyboard/mouse definitions
diff --git a/include/asm-arm/arch-integrator/smp.h b/include/asm-arm/arch-integrator/smp.h
new file mode 100644 (file)
index 0000000..0ec7093
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef ASMARM_ARCH_SMP_H
+#define ASMARM_ARCH_SMP_H
+
+#include <linux/config.h>
+
+#include <asm/arch/hardware.h>
+#include <asm/io.h>
+
+#define hard_smp_processor_id()                                \
+       ({                                              \
+               unsigned int cpunum;                    \
+               __asm__("mrc p15, 0, %0, c0, c0, 5"     \
+                       : "=r" (cpunum));               \
+               cpunum &= 0x0F;                         \
+       })
+
+extern void secondary_scan_irqs(void);
+
+#endif
index a8e3c2daefd61528485d42b7f4b5b38d68345ce8..083462668e184a8953ef49ed8eb9753c38d35d24 100644 (file)
@@ -75,8 +75,8 @@ static inline void insw(u32 ptr, void *buf, int length)
         * Is this cycle meant for the CS8900?
         */
        if ((machine_is_ixdp2401() || machine_is_ixdp2801()) && 
-               ((port >= IXDP2X01_CS8900_VIRT_BASE) && 
-                (port <= IXDP2X01_CS8900_VIRT_END))) {
+               (((u32)port >= (u32)IXDP2X01_CS8900_VIRT_BASE) &&
+                ((u32)port <= (u32)IXDP2X01_CS8900_VIRT_END))) {
                u8 *buf8 = (u8*)buf;
                register u32 tmp32;
 
@@ -100,8 +100,8 @@ static inline void outsw(u32 ptr, void *buf, int length)
         * Is this cycle meant for the CS8900?
         */
        if ((machine_is_ixdp2401() || machine_is_ixdp2801()) && 
-               ((port >= IXDP2X01_CS8900_VIRT_BASE) && 
-                (port <= IXDP2X01_CS8900_VIRT_END))) {
+               (((u32)port >= (u32)IXDP2X01_CS8900_VIRT_BASE) &&
+                ((u32)port <= (u32)IXDP2X01_CS8900_VIRT_END))) {
                register u32 tmp32;
                u8 *buf8 = (u8*)buf;
                do {
@@ -124,8 +124,8 @@ static inline u16 inw(u32 ptr)
         * Is this cycle meant for the CS8900?
         */
        if ((machine_is_ixdp2401() || machine_is_ixdp2801()) && 
-               ((port >= IXDP2X01_CS8900_VIRT_BASE) && 
-                (port <= IXDP2X01_CS8900_VIRT_END))) {
+               (((u32)port >= (u32)IXDP2X01_CS8900_VIRT_BASE) &&
+                ((u32)port <= (u32)IXDP2X01_CS8900_VIRT_END))) {
                return (u16)(*port);  
        }
 
@@ -137,8 +137,8 @@ static inline void outw(u16 value, u32 ptr)
        register volatile u32 *port = (volatile u32 *)ptr;
 
        if ((machine_is_ixdp2401() || machine_is_ixdp2801()) && 
-               ((port >= IXDP2X01_CS8900_VIRT_BASE) && 
-                (port <= IXDP2X01_CS8900_VIRT_END))) {
+               (((u32)port >= (u32)IXDP2X01_CS8900_VIRT_BASE) &&
+                ((u32)port <= (u32)IXDP2X01_CS8900_VIRT_END))) {
                *port = value;  
                return;
        }
index 6c56708d0ff0c98a4e484330a447c30b6ad76524..a1d9e181b10f1c1d579cf4b3fa4d30db1a39b9a5 100644 (file)
 #define IXP2000_MIN_REV_MASK           0x0000000F
 #define IXP2000_PROD_ID_MASK           0xFFFFFFFF
 
+#define IXP2000_PRODUCT_ID             GLOBAL_REG(0x00)
 #define IXP2000_MISC_CONTROL           GLOBAL_REG(0x04)
 #define IXP2000_MSF_CLK_CNTRL                  GLOBAL_REG(0x08)
 #define IXP2000_RESET0                 GLOBAL_REG(0x0c)
index 39741d3c9a34b199023762377c57f575b0b7e1f7..b5e54a9e9fa76992f06da1e944ead0bd951d95a0 100644 (file)
 #define GPIO111_MMCDAT3                111     /* MMC DAT3 (PXA27x) */
 #define GPIO111_MMCCS1         111     /* MMC Chip Select 1 (PXA27x) */
 #define GPIO112_MMCCMD         112     /* MMC CMD (PXA27x) */
+#define GPIO113_I2S_SYSCLK     113     /* I2S System Clock (PXA27x) */
 #define GPIO113_AC97_RESET_N   113     /* AC97 NRESET on (PXA27x) */
 
 /* GPIO alternate function mode & direction */
 #define GPIO111_MMCDAT3_MD     (111 | GPIO_ALT_FN_1_OUT)
 #define GPIO110_MMCCS1_MD      (111 | GPIO_ALT_FN_1_OUT)
 #define GPIO112_MMCCMD_MD      (112 | GPIO_ALT_FN_1_OUT)
+#define GPIO113_I2S_SYSCLK_MD  (113 | GPIO_ALT_FN_1_OUT)
 #define GPIO113_AC97_RESET_N_MD        (113 | GPIO_ALT_FN_2_OUT)
 #define GPIO117_I2CSCL_MD      (117 | GPIO_ALT_FN_1_OUT)
 #define GPIO118_I2CSDA_MD      (118 | GPIO_ALT_FN_1_IN)
index c443ac83469862d688ceb66df0f620429431fbec..7cff235e667aeea2ef79c9d002bebc85b2d95abb 100644 (file)
@@ -1,16 +1,17 @@
 /* linux/include/asm-arm/arch-s3c2410/regs-nand.h
  *
- * Copyright (c) 2004 Simtec Electronics <linux@simtec.co.uk>
+ * Copyright (c) 2004,2005 Simtec Electronics <linux@simtec.co.uk>
  *                   http://www.simtec.co.uk/products/SWLINUX/
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  *
- * S3C2410 clock register definitions
+ * S3C2410 NAND register definitions
  *
  *  Changelog:
  *    18-Aug-2004    BJD     Copied file from 2.4 and updated
+ *    01-May-2005    BJD     Added definitions for s3c2440 controller
 */
 
 #ifndef __ASM_ARM_REGS_NAND
 #define S3C2410_NFSTAT  S3C2410_NFREG(0x10)
 #define S3C2410_NFECC   S3C2410_NFREG(0x14)
 
+#define S3C2440_NFCONT   S3C2410_NFREG(0x04)
+#define S3C2440_NFCMD    S3C2410_NFREG(0x08)
+#define S3C2440_NFADDR   S3C2410_NFREG(0x0C)
+#define S3C2440_NFDATA   S3C2410_NFREG(0x10)
+#define S3C2440_NFECCD0  S3C2410_NFREG(0x14)
+#define S3C2440_NFECCD1  S3C2410_NFREG(0x18)
+#define S3C2440_NFECCD   S3C2410_NFREG(0x1C)
+#define S3C2440_NFSTAT   S3C2410_NFREG(0x20)
+#define S3C2440_NFESTAT0 S3C2410_NFREG(0x24)
+#define S3C2440_NFESTAT1 S3C2410_NFREG(0x28)
+#define S3C2440_NFMECC0  S3C2410_NFREG(0x2C)
+#define S3C2440_NFMECC1  S3C2410_NFREG(0x30)
+#define S3C2440_NFSECC   S3C2410_NFREG(0x34)
+#define S3C2440_NFSBLK   S3C2410_NFREG(0x38)
+#define S3C2440_NFEBLK   S3C2410_NFREG(0x3C)
+
 #define S3C2410_NFCONF_EN          (1<<15)
 #define S3C2410_NFCONF_512BYTE     (1<<14)
 #define S3C2410_NFCONF_4STEP       (1<<13)
 
 #define S3C2410_NFSTAT_BUSY        (1<<0)
 
-/* think ECC can only be 8bit read? */
+#define S3C2440_NFCONF_BUSWIDTH_8      (0<<0)
+#define S3C2440_NFCONF_BUSWIDTH_16     (1<<0)
+#define S3C2440_NFCONF_ADVFLASH                (1<<3)
+#define S3C2440_NFCONF_TACLS(x)                ((x)<<12)
+#define S3C2440_NFCONF_TWRPH0(x)       ((x)<<8)
+#define S3C2440_NFCONF_TWRPH1(x)       ((x)<<4)
+
+#define S3C2440_NFCONT_LOCKTIGHT       (1<<13)
+#define S3C2440_NFCONT_SOFTLOCK                (1<<12)
+#define S3C2440_NFCONT_ILLEGALACC_EN   (1<<10)
+#define S3C2440_NFCONT_RNBINT_EN       (1<<9)
+#define S3C2440_NFCONT_RN_FALLING      (1<<8)
+#define S3C2440_NFCONT_SPARE_ECCLOCK   (1<<6)
+#define S3C2440_NFCONT_MAIN_ECCLOCK    (1<<5)
+#define S3C2440_NFCONT_INITECC         (1<<4)
+#define S3C2440_NFCONT_nFCE            (1<<1)
+#define S3C2440_NFCONT_ENABLE          (1<<0)
+
+#define S3C2440_NFSTAT_READY           (1<<0)
+#define S3C2440_NFSTAT_nCE             (1<<1)
+#define S3C2440_NFSTAT_RnB_CHANGE      (1<<2)
+#define S3C2440_NFSTAT_ILLEGAL_ACCESS  (1<<3)
 
 #endif /* __ASM_ARM_REGS_NAND */
 
index d5fb4a251e7f783507982b96795dad09ebde33d8..41c1bee342ad0ba04c5a4644a2e2c291c79ff78d 100644 (file)
 #include <asm/sizes.h>
 #include <asm/arch/platform.h>
 
-// FIXME = PCI settings need to be fixed!!!!!
-
 /*
- * Similar to above, but for PCI addresses (memory, IO, Config and the
- * V3 chip itself).  WARNING: this has to mirror definitions in platform.h
+ * PCI space virtual addresses
  */
-#define PCI_MEMORY_VADDR       0xe8000000
-#define PCI_CONFIG_VADDR       0xec000000
-#define PCI_V3_VADDR           0xed000000
-#define PCI_IO_VADDR           0xee000000
+#define VERSATILE_PCI_VIRT_BASE                0xe8000000
+#define VERSATILE_PCI_CFG_VIRT_BASE    0xe9000000
+
+#if 0
+#define VERSATILE_PCI_VIRT_MEM_BASE0   0xf4000000
+#define VERSATILE_PCI_VIRT_MEM_BASE1   0xf5000000
+#define VERSATILE_PCI_VIRT_MEM_BASE2   0xf6000000
+
+#define PCIO_BASE                      VERSATILE_PCI_VIRT_MEM_BASE0
+#define PCIMEM_BASE                    VERSATILE_PCI_VIRT_MEM_BASE1
+#endif
+
+/* CIK guesswork */
+#define PCIBIOS_MIN_IO                 0x44000000
+#define PCIBIOS_MIN_MEM                        0x50000000
 
-#define PCIO_BASE              PCI_IO_VADDR
-#define PCIMEM_BASE            PCI_MEMORY_VADDR
+#define pcibios_assign_all_busses()     1
 
 /* macro to get at IO space when running virtually */
 #define IO_ADDRESS(x)          (((x) & 0x0fffffff) + (((x) >> 4) & 0x0f000000) + 0xf0000000)
index dbb7158788fc99758c35914a59a7868fb01222c6..9f895bf61494308a2c2add721009c3699125781d 100644 (file)
@@ -20,7 +20,7 @@
 #ifndef __ASM_ARM_ARCH_IO_H
 #define __ASM_ARM_ARCH_IO_H
 
-#define IO_SPACE_LIMIT 0xffff
+#define IO_SPACE_LIMIT 0xffffffff
 
 #define __io(a)                        ((void __iomem *)(a))
 #define __mem_pci(a)           (a)
index 2598d1f08548a1258e33a06e354886866fc1ef4a..cbdd9fb963320166473a3f2da845410d57cc6c56 100644 (file)
@@ -76,7 +76,7 @@
 #define VERSATILE_SYS_NVFLAGSSET_OFFSET       0x38
 #define VERSATILE_SYS_NVFLAGSCLR_OFFSET       0x3C
 #define VERSATILE_SYS_RESETCTL_OFFSET         0x40
-#define VERSATILE_SYS_PICCTL_OFFSET           0x44
+#define VERSATILE_SYS_PCICTL_OFFSET           0x44
 #define VERSATILE_SYS_MCI_OFFSET              0x48
 #define VERSATILE_SYS_FLASH_OFFSET            0x4C
 #define VERSATILE_SYS_CLCD_OFFSET             0x50
 #define VERSATILE_SYS_NVFLAGSSET              (VERSATILE_SYS_BASE + VERSATILE_SYS_NVFLAGSSET_OFFSET)
 #define VERSATILE_SYS_NVFLAGSCLR              (VERSATILE_SYS_BASE + VERSATILE_SYS_NVFLAGSCLR_OFFSET)
 #define VERSATILE_SYS_RESETCTL                (VERSATILE_SYS_BASE + VERSATILE_SYS_RESETCTL_OFFSET)
-#define VERSATILE_SYS_PICCTL                  (VERSATILE_SYS_BASE + VERSATILE_SYS_PICCTL_OFFSET)
+#define VERSATILE_SYS_PCICTL                  (VERSATILE_SYS_BASE + VERSATILE_SYS_PCICTL_OFFSET)
 #define VERSATILE_SYS_MCI                     (VERSATILE_SYS_BASE + VERSATILE_SYS_MCI_OFFSET)
 #define VERSATILE_SYS_FLASH                   (VERSATILE_SYS_BASE + VERSATILE_SYS_FLASH_OFFSET)
 #define VERSATILE_SYS_CLCD                    (VERSATILE_SYS_BASE + VERSATILE_SYS_CLCD_OFFSET)
 #define VERSATILE_SSMC_BASE            0x20000000      /* SSMC */
 #define VERSATILE_IB2_BASE             0x24000000      /* IB2 module */
 #define VERSATILE_MBX_BASE             0x40000000      /* MBX */
+
+/* PCI space */
 #define VERSATILE_PCI_BASE             0x41000000      /* PCI Interface */
+#define VERSATILE_PCI_CFG_BASE        0x42000000
+#define VERSATILE_PCI_MEM_BASE0        0x44000000
+#define VERSATILE_PCI_MEM_BASE1        0x50000000
+#define VERSATILE_PCI_MEM_BASE2        0x60000000
+/* Sizes of above maps */
+#define VERSATILE_PCI_BASE_SIZE               0x01000000
+#define VERSATILE_PCI_CFG_BASE_SIZE    0x02000000
+#define VERSATILE_PCI_MEM_BASE0_SIZE   0x0c000000      /* 32Mb */
+#define VERSATILE_PCI_MEM_BASE1_SIZE   0x10000000      /* 256Mb */
+#define VERSATILE_PCI_MEM_BASE2_SIZE   0x10000000      /* 256Mb */
+
 #define VERSATILE_SDRAM67_BASE         0x70000000      /* SDRAM banks 6 and 7 */
 #define VERSATILE_LT_BASE              0x80000000      /* Logic Tile expansion */
 
 /*
  * IB2 Versatile/AB expansion board definitions
  */
-#define VERSATILE_IB2_CAMERA_BANK      0x24000000
-#define VERSATILE_IB2_KBD_DATAREG      0x25000000
-#define VERSATILE_IB2_IER              0x26000000      /* for VICINTSOURCE27 */
-#define VERSATILE_IB2_CTRL             0x27000000
-#define VERSATILE_IB2_STAT             0x27000004
+#define VERSATILE_IB2_CAMERA_BANK      VERSATILE_IB2_BASE
+#define VERSATILE_IB2_KBD_DATAREG      (VERSATILE_IB2_BASE + 0x01000000)
+
+/* VICINTSOURCE27 */
+#define VERSATILE_IB2_INT_BASE         (VERSATILE_IB2_BASE + 0x02000000)
+#define VERSATILE_IB2_IER              (VERSATILE_IB2_INT_BASE + 0)
+#define VERSATILE_IB2_ISR              (VERSATILE_IB2_INT_BASE + 4)
+
+#define VERSATILE_IB2_CTL_BASE         (VERSATILE_IB2_BASE + 0x03000000)
+#define VERSATILE_IB2_CTRL             (VERSATILE_IB2_CTL_BASE + 0)
+#define VERSATILE_IB2_STAT             (VERSATILE_IB2_CTL_BASE + 4)
 #endif
 
 #endif
index 09ffeed507c2098a980b1f7eb65e5369d0598907..035cdcff43d233e8566e5ed0ce3e6b04514be4d9 100644 (file)
@@ -16,6 +16,9 @@
 
 #include <asm/mman.h>
 #include <asm/glue.h>
+#include <asm/shmparam.h>
+
+#define CACHE_COLOUR(vaddr)    ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT)
 
 /*
  *     Cache Model
index cbceacbe5afadae6e8ee0b5ce8b7e993e56a9eaf..a1696ba238d3aad1c891f194ac93d8c0b73c1362 100644 (file)
@@ -38,9 +38,9 @@ typedef struct user_fp elf_fpregset_t;
  */
 #define ELF_CLASS      ELFCLASS32
 #ifdef __ARMEB__
-#define ELF_DATA       ELFDATA2MSB;
+#define ELF_DATA       ELFDATA2MSB
 #else
-#define ELF_DATA       ELFDATA2LSB;
+#define ELF_DATA       ELFDATA2LSB
 #endif
 #define ELF_ARCH       EM_ARM
 
index 658ffa384fdab980edae60e9a48df8bfd8979b96..08a46302d26556053e4cdbce8bcc60a164a51011 100644 (file)
@@ -272,6 +272,33 @@ extern void __iounmap(void __iomem *addr);
 #define iounmap(cookie)                        __arch_iounmap(cookie)
 #endif
 
+/*
+ * io{read,write}{8,16,32} macros
+ */
+#define ioread8(p)     ({ unsigned int __v = __raw_readb(p); __v; })
+#define ioread16(p)    ({ unsigned int __v = le16_to_cpu(__raw_readw(p)); __v; })
+#define ioread32(p)    ({ unsigned int __v = le32_to_cpu(__raw_readl(p)); __v; })
+
+#define iowrite8(v,p)  __raw_writeb(v, p)
+#define iowrite16(v,p) __raw_writew(cpu_to_le16(v), p)
+#define iowrite32(v,p) __raw_writel(cpu_to_le32(v), p)
+
+#define ioread8_rep(p,d,c)     __raw_readsb(p,d,c)
+#define ioread16_rep(p,d,c)    __raw_readsw(p,d,c)
+#define ioread32_rep(p,d,c)    __raw_readsl(p,d,c)
+
+#define iowrite8_rep(p,s,c)    __raw_writesb(p,s,c)
+#define iowrite16_rep(p,s,c)   __raw_writesw(p,s,c)
+#define iowrite32_rep(p,s,c)   __raw_writesl(p,s,c)
+
+extern void __iomem *ioport_map(unsigned long port, unsigned int nr);
+extern void ioport_unmap(void __iomem *addr);
+
+struct pci_dev;
+
+extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen);
+extern void pci_iounmap(struct pci_dev *dev, void __iomem *addr);
+
 /*
  * can the hardware map this into one segment or not, given no other
  * constraints.
index 4ca3a8e9348f53becec9d7969d8c73d0f64a3d3a..019c45d7573053a9af19088f2df4af8cb4c5e95a 100644 (file)
@@ -114,19 +114,8 @@ extern void __cpu_copy_user_page(void *to, const void *from,
                                 unsigned long user);
 #endif
 
-#define clear_user_page(addr,vaddr,pg)                 \
-       do {                                            \
-               preempt_disable();                      \
-               __cpu_clear_user_page(addr, vaddr);     \
-               preempt_enable();                       \
-       } while (0)
-
-#define copy_user_page(to,from,vaddr,pg)               \
-       do {                                            \
-               preempt_disable();                      \
-               __cpu_copy_user_page(to, from, vaddr);  \
-               preempt_enable();                       \
-       } while (0)
+#define clear_user_page(addr,vaddr,pg)  __cpu_clear_user_page(addr, vaddr)
+#define copy_user_page(to,from,vaddr,pg) __cpu_copy_user_page(to, from, vaddr)
 
 #define clear_page(page)       memzero((void *)(page), PAGE_SIZE)
 extern void copy_page(void *to, const void *from);
@@ -171,6 +160,9 @@ typedef unsigned long pgprot_t;
 
 #endif /* STRICT_MM_TYPECHECKS */
 
+/* the upper-most page table pointer */
+extern pmd_t *top_pmd;
+
 /* Pure 2^n version of get_order */
 static inline int get_order(unsigned long size)
 {
index f21fd8f6bcdd04fc721bd6f4b0648d5778b77073..6c6c60adbbaa0552aabe8433625a2153b45e5d0e 100644 (file)
@@ -21,7 +21,7 @@
 # error "<asm-arm/smp.h> included in non-SMP build"
 #endif
 
-#define smp_processor_id()     (current_thread_info()->cpu)
+#define raw_smp_processor_id() (current_thread_info()->cpu)
 
 extern cpumask_t cpu_present_mask;
 #define cpu_possible_map cpu_present_mask
@@ -55,4 +55,18 @@ extern void smp_cross_call(cpumask_t callmap);
  */
 extern int boot_secondary(unsigned int cpu, struct task_struct *);
 
+/*
+ * Perform platform specific initialisation of the specified CPU.
+ */
+extern void platform_secondary_init(unsigned int cpu);
+
+/*
+ * Initial data for bringing up a secondary CPU.
+ */
+struct secondary_data {
+       unsigned long pgdir;
+       void *stack;
+};
+extern struct secondary_data secondary_data;
+
 #endif /* ifndef __ASM_ARM_SMP_H */
index b13a8da4847b0240be605a000fb83e9ad9b0b882..39dd7008013c839a102bc49f53ba4ba5691ab864 100644 (file)
@@ -104,6 +104,7 @@ extern void show_pte(struct mm_struct *mm, unsigned long addr);
 extern void __show_regs(struct pt_regs *);
 
 extern int cpu_architecture(void);
+extern void cpu_init(void);
 
 #define set_cr(x)                                      \
        __asm__ __volatile__(                           \
@@ -307,7 +308,7 @@ do {                                                                        \
 ({                                     \
        unsigned long flags;            \
        local_save_flags(flags);        \
-       flags & PSR_I_BIT;              \
+       (int)(flags & PSR_I_BIT);       \
 })
 
 #ifdef CONFIG_SMP
index 8b149474db2488092635c23eeb8498a1701ef399..5a47fdb3015da78a8f851acfb5e3fb2777350f69 100644 (file)
@@ -36,7 +36,7 @@ typedef struct { void *null; } elf_fpregset_t;
  * These are used to set parameters in the core dumps.
  */
 #define ELF_CLASS      ELFCLASS32
-#define ELF_DATA       ELFDATA2LSB;
+#define ELF_DATA       ELFDATA2LSB
 #define ELF_ARCH       EM_ARM
 
 #define USE_ELF_CORE_DUMP
index dedb29280303c719177637ca150cf75b79096c5c..37ad25355591f57bdbc3fb3dbc3795c2a452b818 100644 (file)
@@ -166,9 +166,6 @@ typedef struct sigaltstack {
 #include <asm/sigcontext.h>
 
 #define sigmask(sig)   (1UL << ((sig) - 1))
-//FIXME!!!
-//#define HAVE_ARCH_GET_SIGNAL_TO_DELIVER
-
 #endif
 
 
index 1f4ec7b702706ed643c799e034c128595b3527a7..f40593565173939c5755adda6bee419d90a24635 100644 (file)
@@ -125,6 +125,9 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addres
 
 #ifndef __HAVE_ARCH_PAGE_TEST_AND_CLEAR_DIRTY
 #define page_test_and_clear_dirty(page) (0)
+#define pte_maybe_dirty(pte)           pte_dirty(pte)
+#else
+#define pte_maybe_dirty(pte)           (1)
 #endif
 
 #ifndef __HAVE_ARCH_PAGE_TEST_AND_CLEAR_YOUNG
index 82431edeb2a108a83df9a44a768b2d3f33471385..1ec8a3427120876f6ef7d998b72798a37c0cc53a 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _ASM_KMAP_TYPES_H
-#define _ASM_KMAP_TYPES_H
+#ifndef _ASM_H8300_KMAP_TYPES_H
+#define _ASM_H8300_KMAP_TYPES_H
 
 enum km_type {
        KM_BOUNCE_READ,
@@ -13,6 +13,8 @@ enum km_type {
        KM_PTE1,
        KM_IRQ0,
        KM_IRQ1,
+       KM_SOFTIRQ0,
+       KM_SOFTIRQ1,
        KM_TYPE_NR
 };
 
index abe08856c84fdc86e58a495c37c42cb4d9eb5227..63f727a59850bfa64f3723d30d2dc7a324553ed6 100644 (file)
@@ -4,6 +4,7 @@
 #define PROT_READ      0x1             /* page can be read */
 #define PROT_WRITE     0x2             /* page can be written */
 #define PROT_EXEC      0x4             /* page can be executed */
+#define PROT_SEM       0x8             /* page may be used for atomic ops */
 #define PROT_NONE      0x0             /* page can not be accessed */
 #define PROT_GROWSDOWN 0x01000000      /* mprotect flag: extend change to start of growsdown vma */
 #define PROT_GROWSUP   0x02000000      /* mprotect flag: extend change to end of growsup vma */
@@ -19,6 +20,8 @@
 #define MAP_EXECUTABLE 0x1000          /* mark it as an executable */
 #define MAP_LOCKED     0x2000          /* pages are locked */
 #define MAP_NORESERVE  0x4000          /* don't check for reservations */
+#define MAP_POPULATE   0x8000          /* populate (prefault) pagetables */
+#define MAP_NONBLOCK   0x10000         /* do not block on IO */
 
 #define MS_ASYNC       1               /* sync memory asynchronously */
 #define MS_INVALIDATE  2               /* invalidate the caches */
index a917ff50354f363b69b909099cfbdcca1fed20ab..b82f5f3ab887b4307fa2e248c2122bdfe8d32bfc 100644 (file)
@@ -21,4 +21,14 @@ int unmap_page_from_agp(struct page *page);
    worth it. Would need a page for it. */
 #define flush_agp_cache() asm volatile("wbinvd":::"memory")
 
+/* Convert a physical address to an address suitable for the GART. */
+#define phys_to_gart(x) (x)
+#define gart_to_phys(x) (x)
+
+/* GATT allocation. Returns/accepts GATT kernel virtual address. */
+#define alloc_gatt_pages(order)                \
+       ((char *)__get_free_pages(GFP_KERNEL, (order)))
+#define free_gatt_pages(table, order)  \
+       free_pages((unsigned long)(table), (order))
+
 #endif
index af3d8571c5c7c06a38967b1559d4a40ca07993e7..f4a6ebac02472ce335530ac44a0e922a2c16224a 100644 (file)
@@ -5,9 +5,7 @@
 #define FASTCALL(x)    x __attribute__((regparm(3)))
 #define fastcall       __attribute__((regparm(3)))
 
-#ifdef CONFIG_REGPARM
-# define prevent_tail_call(ret) __asm__ ("" : "=r" (ret) : "0" (ret))
-#endif
+#define prevent_tail_call(ret) __asm__ ("" : "=r" (ret) : "0" (ret))
 
 #ifdef CONFIG_X86_ALIGNMENT_16
 #define __ALIGN .align 16,0x90
index 1b46fd3f2ae3156447ee7b74b5b2d827bafc9882..c6044488e9e6085a971c7a59640a56adefe22d7b 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef __ASM_MACH_IPI_H
 #define __ASM_MACH_IPI_H
 
-inline void send_IPI_mask_sequence(cpumask_t, int vector);
+void send_IPI_mask_sequence(cpumask_t, int vector);
 
 static inline void send_IPI_mask(cpumask_t mask, int vector)
 {
index ed13969fa2d6da7f91c5678da441f645d45c579d..41400d342d442c5d47f2abdf738b91d42bd2d80f 100644 (file)
@@ -68,6 +68,7 @@ typedef struct { unsigned long pgprot; } pgprot_t;
 #define HPAGE_MASK     (~(HPAGE_SIZE - 1))
 #define HUGETLB_PAGE_ORDER     (HPAGE_SHIFT - PAGE_SHIFT)
 #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
+#define ARCH_HAS_HUGETLB_CLEAN_STALE_PGTABLE
 #endif
 
 #define pgd_val(x)     ((x).pgd)
index 8d60c2b4b0035f888ab943a8e3eb1ae170e30587..e9efe148fdf7f9bfec5bf1ce109a77ca982b89dc 100644 (file)
@@ -236,6 +236,7 @@ static inline pte_t pte_mkexec(pte_t pte)   { (pte).pte_low |= _PAGE_USER; return
 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; }
+static inline pte_t pte_mkhuge(pte_t pte)      { (pte).pte_low |= _PAGE_PRESENT | _PAGE_PSE; return pte; }
 
 #ifdef CONFIG_X86_PAE
 # include <asm/pgtable-3level.h>
@@ -275,7 +276,6 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
  */
 
 #define mk_pte(page, pgprot)   pfn_pte(page_to_pfn(page), (pgprot))
-#define mk_pte_huge(entry) ((entry).pte_low |= _PAGE_PRESENT | _PAGE_PSE)
 
 static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
 {
index e03a206dfa36fbde0d15ac5a65f8eea1e7fa7503..55ef31f66bbec2c7771a7571658dad9451dd4823 100644 (file)
@@ -51,7 +51,7 @@ extern u8 x86_cpu_to_apicid[];
  * from the initial startup. We map APIC_BASE very early in page_setup(),
  * so this is correct in the x86 case.
  */
-#define __smp_processor_id() (current_thread_info()->cpu)
+#define raw_smp_processor_id() (current_thread_info()->cpu)
 
 extern cpumask_t cpu_callout_map;
 extern cpumask_t cpu_callin_map;
index 40c54f69780e66ccd417f736816736a56851dce4..c347098498397e67c1bf66453806ef3f7c811037 100644 (file)
@@ -53,6 +53,7 @@ extern struct init_timer_opts timer_cyclone_init;
 
 extern unsigned long calibrate_tsc(void);
 extern void init_cpu_khz(void);
+extern int recalibrate_cpu_khz(void);
 #ifdef CONFIG_HPET_TIMER
 extern struct init_timer_opts timer_hpet_init;
 extern unsigned long calibrate_tsc_hpet(unsigned long *tsc_hpet_quotient_ptr);
index 61bcc1b1e3f4327fe8f24d6afb6c671ba86f349a..176413fb9ae3b9922031e3ddf57197cbf4430fd1 100644 (file)
 #define __NR_io_submit         248
 #define __NR_io_cancel         249
 #define __NR_fadvise64         250
-
+#define __NR_set_zone_reclaim  251
 #define __NR_exit_group                252
 #define __NR_lookup_dcookie    253
 #define __NR_epoll_create      254
index d1316f1e6ee18f464926ba1de462f4cb6f7a2e4d..4e517f0e6afa34e81e9aecdeee51bf0eaec2b967 100644 (file)
 #define flush_agp_mappings()           /* nothing */
 #define flush_agp_cache()              mb()
 
+/* Convert a physical address to an address suitable for the GART. */
+#define phys_to_gart(x) (x)
+#define gart_to_phys(x) (x)
+
+/* GATT allocation. Returns/accepts GATT kernel virtual address. */
+#define alloc_gatt_pages(order)                \
+       ((char *)__get_free_pages(GFP_KERNEL, (order)))
+#define free_gatt_pages(table, order)  \
+       free_pages((unsigned long)(table), (order))
+
 #endif /* _ASM_IA64_AGP_H */
diff --git a/include/asm-ia64/ioctl32.h b/include/asm-ia64/ioctl32.h
deleted file mode 100644 (file)
index d0d227f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <linux/ioctl32.h>
index 9491dacc89cfe0d21fec7adbb471b30d6f4bcde1..83ca4043fc1158076965dfaeae8e782da7f92292 100644 (file)
 #include <asm/page.h>
 #include <asm/meminit.h>
 
+static inline int pfn_to_nid(unsigned long pfn)
+{
+#ifdef CONFIG_NUMA
+       extern int paddr_to_nid(unsigned long);
+       int nid = paddr_to_nid(pfn << PAGE_SHIFT);
+       if (nid < 0)
+               return 0;
+       else
+               return nid;
+#else
+       return 0;
+#endif
+}
+
 #ifdef CONFIG_DISCONTIGMEM
 
 #ifdef CONFIG_IA64_DIG /* DIG systems are small */
index ed5416c5b1ac6c63ec66aa173508178da7d3ece7..7f3333dd00e44b3ed4e8296728c509e23f4a3922 100644 (file)
@@ -177,6 +177,10 @@ typedef union {
 
 extern long perfmonctl(int fd, int cmd, void *arg, int narg);
 
+typedef struct {
+       void (*handler)(int irq, void *arg, struct pt_regs *regs);
+} pfm_intr_handler_desc_t;
+
 extern void pfm_save_regs (struct task_struct *);
 extern void pfm_load_regs (struct task_struct *);
 
@@ -187,6 +191,10 @@ extern void pfm_syst_wide_update_task(struct task_struct *, unsigned long info,
 extern void pfm_inherit(struct task_struct *task, struct pt_regs *regs);
 extern void pfm_init_percpu(void);
 extern void pfm_handle_work(void);
+extern int  pfm_install_alt_pmu_interrupt(pfm_intr_handler_desc_t *h);
+extern int  pfm_remove_alt_pmu_interrupt(pfm_intr_handler_desc_t *h);
+
+
 
 /*
  * Reset PMD register flags
index ea121a002309176cd50055c6fcd497be1d1b2d94..48586e08f432b5cc2793d0d4952869497e11d7bf 100644 (file)
@@ -8,7 +8,7 @@
  * This hopefully works with any (fixed) IA-64 page-size, as defined
  * in <asm/page.h>.
  *
- * Copyright (C) 1998-2004 Hewlett-Packard Co
+ * Copyright (C) 1998-2005 Hewlett-Packard Co
  *     David Mosberger-Tang <davidm@hpl.hp.com>
  */
 
@@ -283,6 +283,7 @@ ia64_phys_addr_valid (unsigned long addr)
 #define pte_mkyoung(pte)       (__pte(pte_val(pte) | _PAGE_A))
 #define pte_mkclean(pte)       (__pte(pte_val(pte) & ~_PAGE_D))
 #define pte_mkdirty(pte)       (__pte(pte_val(pte) | _PAGE_D))
+#define pte_mkhuge(pte)                (__pte(pte_val(pte) | _PAGE_P))
 
 /*
  * Macro to a page protection value as "uncacheable".  Note that "protection" is really a
@@ -551,7 +552,11 @@ do {                                                                                       \
 
 /* These tell get_user_pages() that the first gate page is accessible from user-level.  */
 #define FIXADDR_USER_START     GATE_ADDR
-#define FIXADDR_USER_END       (GATE_ADDR + 2*PERCPU_PAGE_SIZE)
+#ifdef HAVE_BUGGY_SEGREL
+# define FIXADDR_USER_END      (GATE_ADDR + 2*PAGE_SIZE)
+#else
+# define FIXADDR_USER_END      (GATE_ADDR + 2*PERCPU_PAGE_SIZE)
+#endif
 
 #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
 #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
index 9e1ba8b7fb68ada212e21dd89ce3606948ddc274..91bbd1f2246140121bbaec497101790c6dc278cf 100644 (file)
@@ -403,7 +403,10 @@ extern void ia64_setreg_unknown_kr (void);
  * task_struct at this point.
  */
 
-/* Return TRUE if task T owns the fph partition of the CPU we're running on. */
+/*
+ * Return TRUE if task T owns the fph partition of the CPU we're running on.
+ * Must be called from code that has preemption disabled.
+ */
 #define ia64_is_local_fpu_owner(t)                                                             \
 ({                                                                                             \
        struct task_struct *__ia64_islfo_task = (t);                                            \
@@ -411,7 +414,10 @@ extern void ia64_setreg_unknown_kr (void);
         && __ia64_islfo_task == (struct task_struct *) ia64_get_kr(IA64_KR_FPU_OWNER));        \
 })
 
-/* Mark task T as owning the fph partition of the CPU we're running on. */
+/*
+ * Mark task T as owning the fph partition of the CPU we're running on.
+ * Must be called from code that has preemption disabled.
+ */
 #define ia64_set_local_fpu_owner(t) do {                                               \
        struct task_struct *__ia64_slfo_task = (t);                                     \
        __ia64_slfo_task->thread.last_fph_cpu = smp_processor_id();                     \
index 3ba1a061e4aed516b6eef4452af84b1c5f444db6..a3914352c995e83222080a9d7151a9567256196c 100644 (file)
@@ -46,7 +46,7 @@ ia64_get_lid (void)
 #define SMP_IRQ_REDIRECTION    (1 << 0)
 #define SMP_IPI_REDIRECTION    (1 << 1)
 
-#define smp_processor_id()     (current_thread_info()->cpu)
+#define raw_smp_processor_id() (current_thread_info()->cpu)
 
 extern struct smp_boot_data {
        int cpu_count;
diff --git a/include/asm-ia64/sn/mspec.h b/include/asm-ia64/sn/mspec.h
new file mode 100644 (file)
index 0000000..dbe13c6
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (c) 2001-2004 Silicon Graphics, Inc.  All rights reserved.
+ */
+
+#ifndef _ASM_IA64_SN_MSPEC_H
+#define _ASM_IA64_SN_MSPEC_H
+
+#define FETCHOP_VAR_SIZE 64 /* 64 byte per fetchop variable */
+
+#define FETCHOP_LOAD           0
+#define FETCHOP_INCREMENT      8
+#define FETCHOP_DECREMENT      16
+#define FETCHOP_CLEAR          24
+
+#define FETCHOP_STORE          0
+#define FETCHOP_AND            24
+#define FETCHOP_OR             32
+
+#define FETCHOP_CLEAR_CACHE    56
+
+#define FETCHOP_LOAD_OP(addr, op) ( \
+         *(volatile long *)((char*) (addr) + (op)))
+
+#define FETCHOP_STORE_OP(addr, op, x) ( \
+         *(volatile long *)((char*) (addr) + (op)) = (long) (x))
+
+#ifdef __KERNEL__
+
+/*
+ * Each Atomic Memory Operation (AMO formerly known as fetchop)
+ * variable is 64 bytes long.  The first 8 bytes are used.  The
+ * remaining 56 bytes are unaddressable due to the operation taking
+ * that portion of the address.
+ *
+ * NOTE: The AMO_t _MUST_ be placed in either the first or second half
+ * of the cache line.  The cache line _MUST NOT_ be used for anything
+ * other than additional AMO_t entries.  This is because there are two
+ * addresses which reference the same physical cache line.  One will
+ * be a cached entry with the memory type bits all set.  This address
+ * may be loaded into processor cache.  The AMO_t will be referenced
+ * uncached via the memory special memory type.  If any portion of the
+ * cached cache-line is modified, when that line is flushed, it will
+ * overwrite the uncached value in physical memory and lead to
+ * inconsistency.
+ */
+typedef struct {
+        u64 variable;
+        u64 unused[7];
+} AMO_t;
+
+
+#endif /* __KERNEL__ */
+
+#endif /* _ASM_IA64_SN_MSPEC_H */
index 56d74ca76b5d0b9f4fc809c4f05c6152655b1311..eb0395ad0d6a68c1a93e98d86ac045c76928ce51 100644 (file)
 #define SAL_IROUTER_INTR_XMIT  SAL_CONSOLE_INTR_XMIT
 #define SAL_IROUTER_INTR_RECV  SAL_CONSOLE_INTR_RECV
 
+/*
+ * Error Handling Features
+ */
+#define SAL_ERR_FEAT_MCA_SLV_TO_OS_INIT_SLV    0x1
+#define SAL_ERR_FEAT_LOG_SBES                  0x2
+#define SAL_ERR_FEAT_MFR_OVERRIDE              0x4
+#define SAL_ERR_FEAT_SBE_THRESHOLD             0xffff0000
 
 /*
  * SAL Error Codes
@@ -341,6 +348,25 @@ ia64_sn_plat_cpei_handler(void)
        return ret_stuff.status;
 }
 
+/*
+ * Set Error Handling Features
+ */
+static inline u64
+ia64_sn_plat_set_error_handling_features(void)
+{
+       struct ia64_sal_retval ret_stuff;
+
+       ret_stuff.status = 0;
+       ret_stuff.v0 = 0;
+       ret_stuff.v1 = 0;
+       ret_stuff.v2 = 0;
+       SAL_CALL_REENTRANT(ret_stuff, SN_SAL_SET_ERROR_HANDLING_FEATURES,
+               (SAL_ERR_FEAT_MCA_SLV_TO_OS_INIT_SLV | SAL_ERR_FEAT_LOG_SBES),
+               0, 0, 0, 0, 0, 0);
+
+       return ret_stuff.status;
+}
+
 /*
  * Checks for console input.
  */
@@ -472,7 +498,7 @@ static inline u64
 ia64_sn_pod_mode(void)
 {
        struct ia64_sal_retval isrv;
-       SAL_CALL(isrv, SN_SAL_POD_MODE, 0, 0, 0, 0, 0, 0, 0);
+       SAL_CALL_REENTRANT(isrv, SN_SAL_POD_MODE, 0, 0, 0, 0, 0, 0, 0);
        if (isrv.status)
                return 0;
        return isrv.v0;
diff --git a/include/asm-ia64/uncached.h b/include/asm-ia64/uncached.h
new file mode 100644 (file)
index 0000000..b82d923
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * Copyright (C) 2001-2005 Silicon Graphics, Inc.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * Prototypes for the uncached page allocator
+ */
+
+extern unsigned long uncached_alloc_page(int nid);
+extern void uncached_free_page(unsigned long);
index 33e26c557c5c6b59206ae2237d31d1c37fe37260..f7f43ec2483a604640e965a7feb39df031fe65e5 100644 (file)
 #define __NR_add_key                   1271
 #define __NR_request_key               1272
 #define __NR_keyctl                    1273
+#define __NR_set_zone_reclaim          1276
 
 #ifdef __KERNEL__
 
index 417a51bd552de78b0c4a26c0239626f250daff68..6cd978cefb2850be383e462f77a05c23ff7adc33 100644 (file)
@@ -1,38 +1 @@
-#ifndef _ASM_M32R_DIV64
-#define _ASM_M32R_DIV64
-
-/* $Id$ */
-
-/* unsigned long long division.
- * Input:
- *  unsigned long long  n
- *  unsigned long  base
- * Output:
- *  n = n / base;
- *  return value = n % base;
- */
-#define do_div(n, base)                                                \
-({                                                             \
-       unsigned long _res, _high, _mid, _low;                  \
-                                                               \
-       _low = (n) & 0xffffffffUL;                              \
-       _high = (n) >> 32;                                      \
-       if (_high) {                                            \
-               _mid = (_high % (unsigned long)(base)) << 16;   \
-               _high = _high / (unsigned long)(base);          \
-               _mid += _low >> 16;                             \
-               _low &= 0x0000ffffUL;                           \
-               _low += (_mid % (unsigned long)(base)) << 16;   \
-               _mid = _mid / (unsigned long)(base);            \
-               _res = _low % (unsigned long)(base);            \
-               _low = _low / (unsigned long)(base);            \
-               n = _low + ((long long)_mid << 16) +            \
-                       ((long long)_high << 32);               \
-       } else {                                                \
-               _res = _low % (unsigned long)(base);            \
-               n = (_low / (unsigned long)(base));             \
-       }                                                       \
-       _res;                                                   \
-})
-
-#endif  /* _ASM_M32R_DIV64 */
+#include <asm-generic/div64.h>
index be64f24e37eed06a59dac18c459bf6d2db071e6e..194393bd8beb8f07eee63a375211c34350efc603 100644 (file)
@@ -35,7 +35,7 @@
 static __inline__ int ide_default_irq(unsigned long base)
 {
        switch (base) {
-#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_MAPPI2)
+#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_MAPPI2) || defined(CONFIG_PLAT_MAPPI3)
                case 0x1f0: return PLD_IRQ_CFIREQ;
                default:
                        return 0;
index b56034026bf80025e31122c6a017f6f15dc94a7d..cb98101f4f6e02177ba546df4850fd5471d33920 100644 (file)
 #define M32R_ICU_CR5_PORTL    (0x210+M32R_ICU_OFFSET)  /* INT4 */
 #define M32R_ICU_CR6_PORTL    (0x214+M32R_ICU_OFFSET)  /* INT5 */
 #define M32R_ICU_CR7_PORTL    (0x218+M32R_ICU_OFFSET)  /* INT6 */
+#define M32R_ICU_CR8_PORTL    (0x219+M32R_ICU_OFFSET)  /* INT7 */
 #define M32R_ICU_CR16_PORTL   (0x23C+M32R_ICU_OFFSET)  /* MFT0 */
 #define M32R_ICU_CR17_PORTL   (0x240+M32R_ICU_OFFSET)  /* MFT1 */
 #define M32R_ICU_CR18_PORTL   (0x244+M32R_ICU_OFFSET)  /* MFT2 */
diff --git a/include/asm-m32r/m32102peri.h b/include/asm-m32r/m32102peri.h
deleted file mode 100644 (file)
index 3c12955..0000000
+++ /dev/null
@@ -1,468 +0,0 @@
-/* $Id$
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 2000,2001 by Hiroyuki Kondo
- */
-
-#ifndef __ASSEMBLY__
-
-typedef        void    V;
-typedef        char    B;
-typedef        short   S;
-typedef        int             W;
-typedef        long    L;
-typedef        float   F;
-typedef        double  D;
-typedef        unsigned char   UB;
-typedef        unsigned short  US;
-typedef        unsigned int    UW;
-typedef        unsigned long   UL;
-typedef        const unsigned int      CUW;
-
-/*********************************
-
-M32102 ICU
-
-*********************************/
-#define                ICUISTS         (UW *)0xa0EFF004
-#define                ICUIREQ0        (UW *)0xa0EFF008
-#define                ICUIREQ1        (UW *)0xa0EFF00C
-
-#define                ICUSBICR        (UW *)0xa0EFF018
-#define                ICUIMASK        (UW *)0xa0EFF01C
-
-#define                ICUCR1          (UW *)0xa0EFF200        /* INT0 */
-#define                ICUCR2          (UW *)0xa0EFF204        /* INT1 */
-#define                ICUCR3          (UW *)0xa0EFF208        /* INT2 */
-#define                ICUCR4          (UW *)0xa0EFF20C        /* INT3 */
-#define                ICUCR5          (UW *)0xa0EFF210        /* INT4 */
-#define                ICUCR6          (UW *)0xa0EFF214        /* INT5 */
-#define                ICUCR7          (UW *)0xa0EFF218        /* INT6 */
-
-#define                ICUCR16         (UW *)0xa0EFF23C        /* MFT0 */
-#define                ICUCR17         (UW *)0xa0EFF240        /* MFT1 */
-#define                ICUCR18         (UW *)0xa0EFF244        /* MFT2 */
-#define                ICUCR19         (UW *)0xa0EFF248        /* MFT3 */
-#define                ICUCR20         (UW *)0xa0EFF24C        /* MFT4 */
-#define                ICUCR21         (UW *)0xa0EFF250        /* MFT5 */
-
-#define                ICUCR32         (UW *)0xa0EFF27C        /* DMA0 */
-#define                ICUCR33         (UW *)0xa0EFF280        /* DMA1 */
-
-#define                ICUCR48         (UW *)0xa0EFF2BC        /* SIO0R */
-#define                ICUCR49         (UW *)0xa0EFF2C0        /* SIO0S */
-#define                ICUCR50         (UW *)0xa0EFF2C4        /* SIO1R */
-#define                ICUCR51         (UW *)0xa0EFF2C8        /* SIO1S */
-#define                ICUCR52         (UW *)0xa0EFF2CC        /* SIO2R */
-#define                ICUCR53         (UW *)0xa0EFF2D0        /* SIO2S */
-#define                ICUCR54         (UW *)0xa0EFF2D4        /* SIO3R */
-#define                ICUCR55         (UW *)0xa0EFF2D8        /* SIO3S */
-#define                ICUCR56         (UW *)0xa0EFF2DC        /* SIO4R */
-#define                ICUCR57         (UW *)0xa0EFF2E0        /* SIO4S */
-
-/*********************************
-
-M32102 MFT
-
-*********************************/
-#define                MFTCR           (US *)0xa0EFC002
-#define                MFTRPR          (UB *)0xa0EFC006
-
-#define                MFT0MOD         (US *)0xa0EFC102
-#define                MFT0BOS         (US *)0xa0EFC106
-#define                MFT0CUT         (US *)0xa0EFC10A
-#define                MFT0RLD         (US *)0xa0EFC10E
-#define                MFT0CRLD        (US *)0xa0EFC112
-
-#define                MFT1MOD         (US *)0xa0EFC202
-#define                MFT1BOS         (US *)0xa0EFC206
-#define                MFT1CUT         (US *)0xa0EFC20A
-#define                MFT1RLD         (US *)0xa0EFC20E
-#define                MFT1CRLD        (US *)0xa0EFC212
-
-#define                MFT2MOD         (US *)0xa0EFC302
-#define                MFT2BOS         (US *)0xa0EFC306
-#define                MFT2CUT         (US *)0xa0EFC30A
-#define                MFT2RLD         (US *)0xa0EFC30E
-#define                MFT2CRLD        (US *)0xa0EFC312
-
-#define                MFT3MOD         (US *)0xa0EFC402
-#define                MFT3CUT         (US *)0xa0EFC40A
-#define                MFT3RLD         (US *)0xa0EFC40E
-#define                MFT3CRLD        (US *)0xa0EFC412
-
-#define                MFT4MOD         (US *)0xa0EFC502
-#define                MFT4CUT         (US *)0xa0EFC50A
-#define                MFT4RLD         (US *)0xa0EFC50E
-#define                MFT4CRLD        (US *)0xa0EFC512
-
-#define                MFT5MOD         (US *)0xa0EFC602
-#define                MFT5CUT         (US *)0xa0EFC60A
-#define                MFT5RLD         (US *)0xa0EFC60E
-#define                MFT5CRLD        (US *)0xa0EFC612
-
-/*********************************
-
-M32102 SIO
-
-*********************************/
-
-#define SIO0CR     (volatile int *)0xa0efd000
-#define SIO0MOD0   (volatile int *)0xa0efd004
-#define SIO0MOD1   (volatile int *)0xa0efd008
-#define SIO0STS    (volatile int *)0xa0efd00c
-#define SIO0IMASK  (volatile int *)0xa0efd010
-#define SIO0BAUR   (volatile int *)0xa0efd014
-#define SIO0RBAUR  (volatile int *)0xa0efd018
-#define SIO0TXB    (volatile int *)0xa0efd01c
-#define SIO0RXB    (volatile int *)0xa0efd020
-
-#define SIO1CR     (volatile int *)0xa0efd100
-#define SIO1MOD0   (volatile int *)0xa0efd104
-#define SIO1MOD1   (volatile int *)0xa0efd108
-#define SIO1STS    (volatile int *)0xa0efd10c
-#define SIO1IMASK  (volatile int *)0xa0efd110
-#define SIO1BAUR   (volatile int *)0xa0efd114
-#define SIO1RBAUR  (volatile int *)0xa0efd118
-#define SIO1TXB    (volatile int *)0xa0efd11c
-#define SIO1RXB    (volatile int *)0xa0efd120
-/*********************************
-
-M32102 PORT
-
-*********************************/
-#define                PIEN            (UB *)0xa0EF1003        /* input enable */
-
-#define                P0DATA          (UB *)0xa0EF1020        /* data */
-#define                P1DATA          (UB *)0xa0EF1021
-#define                P2DATA          (UB *)0xa0EF1022
-#define                P3DATA          (UB *)0xa0EF1023
-#define                P4DATA          (UB *)0xa0EF1024
-#define                P5DATA          (UB *)0xa0EF1025
-#define                P6DATA          (UB *)0xa0EF1026
-#define                P7DATA          (UB *)0xa0EF1027
-
-#define                P0DIR           (UB *)0xa0EF1040        /* direction */
-#define                P1DIR           (UB *)0xa0EF1041
-#define                P2DIR           (UB *)0xa0EF1042
-#define                P3DIR           (UB *)0xa0EF1043
-#define                P4DIR           (UB *)0xa0EF1044
-#define                P5DIR           (UB *)0xa0EF1045
-#define                P6DIR           (UB *)0xa0EF1046
-#define                P7DIR           (UB *)0xa0EF1047
-
-#define                P0MOD           (US *)0xa0EF1060        /* mode control */
-#define                P1MOD           (US *)0xa0EF1062
-#define                P2MOD           (US *)0xa0EF1064
-#define                P3MOD           (US *)0xa0EF1066
-#define                P4MOD           (US *)0xa0EF1068
-#define                P5MOD           (US *)0xa0EF106A
-#define                P6MOD           (US *)0xa0EF106C
-#define                P7MOD           (US *)0xa0EF106E
-
-#define                P0ODCR          (UB *)0xa0EF1080        /* open-drain control */
-#define                P1ODCR          (UB *)0xa0EF1081
-#define                P2ODCR          (UB *)0xa0EF1082
-#define                P3ODCR          (UB *)0xa0EF1083
-#define                P4ODCR          (UB *)0xa0EF1084
-#define                P5ODCR          (UB *)0xa0EF1085
-#define                P6ODCR          (UB *)0xa0EF1086
-#define                P7ODCR          (UB *)0xa0EF1087
-
-/*********************************
-
-M32102 Cache
-
-********************************/
-
-#define                MCCR    (US *)0xFFFFFFFE
-
-
-#else  /* __ASSEMBLY__ */
-
-;;
-;; PIO     0x80ef1000
-;;
-
-#define PIEN          0xa0ef1000
-
-#define P0DATA        0xa0ef1020
-#define P1DATA        0xa0ef1021
-#define P2DATA        0xa0ef1022
-#define P3DATA        0xa0ef1023
-#define P4DATA        0xa0ef1024
-#define P5DATA        0xa0ef1025
-#define P6DATA        0xa0ef1026
-#define P7DATA        0xa0ef1027
-
-#define P0DIR         0xa0ef1040
-#define P1DIR         0xa0ef1041
-#define P2DIR         0xa0ef1042
-#define P3DIR         0xa0ef1043
-#define P4DIR         0xa0ef1044
-#define P5DIR         0xa0ef1045
-#define P6DIR         0xa0ef1046
-#define P7DIR         0xa0ef1047
-
-#define P0MOD         0xa0ef1060
-#define P1MOD         0xa0ef1062
-#define P2MOD         0xa0ef1064
-#define P3MOD         0xa0ef1066
-#define P4MOD         0xa0ef1068
-#define P5MOD         0xa0ef106a
-#define P6MOD         0xa0ef106c
-#define P7MOD         0xa0ef106e
-;
-#define P0ODCR        0xa0ef1080
-#define P1ODCR        0xa0ef1081
-#define P2ODCR        0xa0ef1082
-#define P3ODCR        0xa0ef1083
-#define P4ODCR        0xa0ef1084
-#define P5ODCR        0xa0ef1085
-#define P6ODCR        0xa0ef1086
-#define P7ODCR        0xa0ef1087
-
-;;
-;; WDT     0xa0ef2000
-;;
-
-#define WDTCR         0xa0ef2000
-
-
-;;
-;; CLK     0xa0ef4000
-;;
-
-#define CPUCLKCR      0xa0ef4000
-#define CLKMOD        0xa0ef4004
-#define PLLCR         0xa0ef4008
-
-
-;;
-;; BSEL    0xa0ef5000
-;;
-
-#define BSEL0CR       0xa0ef5000
-#define BSEL1CR       0xa0ef5004
-#define BSEL2CR       0xa0ef5008
-#define BSEL3CR       0xa0ef500c
-#define BSEL4CR       0xa0ef5010
-#define BSEL5CR       0xa0ef5014
-
-
-;;
-;; SDRAMC  0xa0ef6000
-;;
-
-#define SDRF0         0xa0ef6000
-#define SDRF1         0xa0ef6004
-#define SDIR0         0xa0ef6008
-#define SDIR1         0xa0ef600c
-#define SDBR          0xa0ef6010
-
-;; CH0
-#define SD0ADR        0xa0ef6020
-#define SD0SZ         0xa0ef6022
-#define SD0ER         0xa0ef6024
-#define SD0TR         0xa0ef6028
-#define SD0MOD        0xa0ef602c
-
-;; CH1
-#define SD1ADR        0xa0ef6040
-#define SD1SZ         0xa0ef6042
-#define SD1ER         0xa0ef6044
-#define SD1TR         0xa0ef6048
-#define SD1MOD        0xa0ef604c
-
-
-;;
-;; DMAC    0xa0ef8000
-;;
-
-#define DMAEN         0xa0ef8000
-#define DMAISTS       0xa0ef8004
-#define DMAEDET       0xa0ef8008
-#define DMAASTS       0xa0ef800c
-
-;; CH0
-#define DMA0CR0       0xa0ef8100
-#define DMA0CR1       0xa0ef8104
-#define DMA0CSA       0xa0ef8108
-#define DMA0RSA       0xa0ef810c
-#define DMA0CDA       0xa0ef8110
-#define DMA0RDA       0xa0ef8114
-#define DMA0CBCUT     0xa0ef8118
-#define DMA0RBCUT     0xa0ef811c
-
-;; CH1
-#define DMA1CR0       0xa0ef8200
-#define DMA1CR1       0xa0ef8204
-#define DMA1CSA       0xa0ef8208
-#define DMA1RSA       0xa0ef820c
-#define DMA1CDA       0xa0ef8210
-#define DMA1RDA       0xa0ef8214
-#define DMA1CBCUT     0xa0ef8218
-#define DMA1RBCUT     0xa0ef821c
-
-
-;;
-;; MFT     0xa0efc000
-;;
-
-#define MFTCR        0xa0efc000
-#define MFTRPR       0xa0efc004
-
-;; CH0
-#define MFT0MOD      0xa0efc100
-#define MFT0BOS      0xa0efc104
-#define MFT0CUT      0xa0efc108
-#define MFT0RLD      0xa0efc10c
-#define MFT0CMPRLD   0xa0efc110
-
-;; CH1
-#define MFT1MOD      0xa0efc200
-#define MFT1BOS      0xa0efc204
-#define MFT1CUT      0xa0efc208
-#define MFT1RLD      0xa0efc20c
-#define MFT1CMPRLD   0xa0efc210
-
-;; CH2
-#define MFT2MOD      0xa0efc300
-#define MFT2BOS      0xa0efc304
-#define MFT2CUT      0xa0efc308
-#define MFT2RLD      0xa0efc30c
-#define MFT2CMPRLD   0xa0efc310
-
-;; CH3
-#define MFT3MOD      0xa0efc400
-#define MFT3BOS      0xa0efc404
-#define MFT3CUT      0xa0efc408
-#define MFT3RLD      0xa0efc40c
-#define MFT3CMPRLD   0xa0efc410
-
-;; CH4
-#define MFT4MOD      0xa0efc500
-#define MFT4BOS      0xa0efc504
-#define MFT4CUT      0xa0efc508
-#define MFT4RLD      0xa0efc50c
-#define MFT4CMPRLD   0xa0efc510
-
-;; CH5
-#define MFT5MOD      0xa0efc600
-#define MFT5BOS      0xa0efc604
-#define MFT5CUT      0xa0efc608
-#define MFT5RLD      0xa0efc60c
-#define MFT5CMPRLD   0xa0efc610
-
-
-;;
-;; SIO     0xa0efd000
-;;
-
-;; CH0
-#define SIO0CR        0xa0efd000
-#define SIO0MOD0      0xa0efd004
-#define SIO0MOD1      0xa0efd008
-#define SIO0STS       0xa0efd00c
-#define SIO0IMASK     0xa0efd010
-#define SIO0BAUR      0xa0efd014
-#define SIO0RBAUR     0xa0efd018
-#define SIO0TXB       0xa0efd01c
-#define SIO0RXB       0xa0efd020
-
-;; CH1
-#define SIO1CR        0xa0efd100
-#define SIO1MOD0      0xa0efd104
-#define SIO1MOD1      0xa0efd108
-#define SIO1STS       0xa0efd10c
-#define SIO1IMASK     0xa0efd110
-#define SIO1BAUR      0xa0efd114
-#define SIO1RBAUR     0xa0efd118
-#define SIO1TXB       0xa0efd11c
-#define SIO1RXB       0xa0efd120
-
-;; CH2
-#define SIO2CR        0xa0efd200
-#define SIO2MOD0      0xa0efd204
-#define SIO2MOD1      0xa0efd208
-#define SIO2STS       0xa0efd20c
-#define SIO2IMASK     0xa0efd210
-#define SIO2BAUR      0xa0efd214
-#define SIO2RBAUR     0xa0efd218
-#define SIO2TXB       0xa0efd21c
-#define SIO2RXB       0xa0efd220
-
-;; CH3
-#define SIO3CR        0xa0efd300
-#define SIO3MOD0      0xa0efd304
-#define SIO3MOD1      0xa0efd308
-#define SIO3STS       0xa0efd30c
-#define SIO3IMASK     0xa0efd310
-#define SIO3BAUR      0xa0efd314
-#define SIO3RBAUR     0xa0efd318
-#define SIO3TXB       0xa0efd31c
-#define SIO3RXB       0xa0efd320
-
-;; CH4
-#define SIO4CR        0xa0efd400
-#define SIO4MOD0      0xa0efd404
-#define SIO4MOD1      0xa0efd408
-#define SIO4STS       0xa0efd40c
-#define SIO4IMASK     0xa0efd410
-#define SIO4BAUR      0xa0efd414
-#define SIO4RBAUR     0xa0efd418
-#define SIO4TXB       0xa0efd41c
-#define SIO4RXB       0xa0efd420
-
-
-;;
-;; ICU     0xa0eff000
-;;
-
-#define ICUISTS       0xa0eff004
-#define ICUIREQ0      0xa0eff008
-#define ICUIREQ1      0xa0eff00c
-
-#define ICUSBICR      0xa0eff018
-#define ICUIMASK      0xa0eff01c
-
-#define ICUCR1        0xa0eff200
-#define ICUCR2        0xa0eff204
-#define ICUCR3        0xa0eff208
-#define ICUCR4        0xa0eff20c
-#define ICUCR5        0xa0eff210
-#define ICUCR6        0xa0eff214
-#define ICUCR7        0xa0eff218
-
-#define ICUCR16       0xa0eff23c
-#define ICUCR17       0xa0eff240
-#define ICUCR18       0xa0eff244
-#define ICUCR19       0xa0eff248
-#define ICUCR20       0xa0eff24c
-#define ICUCR21       0xa0eff250
-
-#define ICUCR32       0xa0eff27c
-#define ICUCR33       0xa0eff280
-
-#define ICUCR48       0xa0eff2bc
-#define ICUCR49       0xa0eff2c0
-#define ICUCR50       0xa0eff2c4
-#define ICUCR51       0xa0eff2c8
-#define ICUCR52       0xa0eff2cc
-#define ICUCR53       0xa0eff2d0
-#define ICUCR54       0xa0eff2d4
-#define ICUCR55       0xa0eff2d8
-#define ICUCR56       0xa0eff2dc
-#define ICUCR57       0xa0eff2e0
-
-;;
-;; CACHE
-;;
-
-#define MCCR             0xfffffffc
-
-
-#endif  /* __ASSEMBLY__ */
index f116649bbef375d82b8c54e4f5c741220b31e8d1..ec142be008621338bc1ddf4ae0132e927c78e105 100644 (file)
@@ -16,7 +16,6 @@
        || defined(CONFIG_CHIP_M32700) || defined(CONFIG_CHIP_M32102) \
         || defined(CONFIG_CHIP_OPSP)
 #include <asm/m32102.h>
-#include <asm/m32102peri.h>
 #endif
 
 /* Platform type */
 #include <asm/mappi2/mappi2_pld.h>
 #endif /* CONFIG_PLAT_MAPPI2 */
 
+#if defined(CONFIG_PLAT_MAPPI3)
+#include <asm/mappi3/mappi3_pld.h>
+#endif /* CONFIG_PLAT_MAPPI3 */
+
 #if defined(CONFIG_PLAT_USRV)
 #include <asm/m32700ut/m32700ut_pld.h>
 #endif
diff --git a/include/asm-m32r/mappi3/mappi3_pld.h b/include/asm-m32r/mappi3/mappi3_pld.h
new file mode 100644 (file)
index 0000000..3f1551f
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * include/asm/mappi3/mappi3_pld.h
+ *
+ * Definitions for Extended IO Logic on MAPPI3 board.
+ *  based on m32700ut_pld.h
+ *
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License.  See the file "COPYING" in the main directory of
+ * this archive for more details.
+ *
+ */
+
+#ifndef _MAPPI3_PLD_H
+#define _MAPPI3_PLD_H
+
+#ifndef __ASSEMBLY__
+/* FIXME:
+ * Some C functions use non-cache address, so can't define non-cache address.
+ */
+#define PLD_BASE               (0x1c000000 /* + NONCACHE_OFFSET */)
+#define __reg8                 (volatile unsigned char *)
+#define __reg16                        (volatile unsigned short *)
+#define __reg32                        (volatile unsigned int *)
+#else
+#define PLD_BASE               (0x1c000000 + NONCACHE_OFFSET)
+#define __reg8
+#define __reg16
+#define __reg32
+#endif /* __ASSEMBLY__ */
+
+/* CFC */
+#define        PLD_CFRSTCR             __reg16(PLD_BASE + 0x0000)
+#define PLD_CFSTS              __reg16(PLD_BASE + 0x0002)
+#define PLD_CFIMASK            __reg16(PLD_BASE + 0x0004)
+#define PLD_CFBUFCR            __reg16(PLD_BASE + 0x0006)
+#define PLD_CFCR0              __reg16(PLD_BASE + 0x000a)
+#define PLD_CFCR1              __reg16(PLD_BASE + 0x000c)
+
+/* MMC */
+#define PLD_MMCCR              __reg16(PLD_BASE + 0x4000)
+#define PLD_MMCMOD             __reg16(PLD_BASE + 0x4002)
+#define PLD_MMCSTS             __reg16(PLD_BASE + 0x4006)
+#define PLD_MMCBAUR            __reg16(PLD_BASE + 0x400a)
+#define PLD_MMCCMDBCUT         __reg16(PLD_BASE + 0x400c)
+#define PLD_MMCCDTBCUT         __reg16(PLD_BASE + 0x400e)
+#define PLD_MMCDET             __reg16(PLD_BASE + 0x4010)
+#define PLD_MMCWP              __reg16(PLD_BASE + 0x4012)
+#define PLD_MMCWDATA           __reg16(PLD_BASE + 0x5000)
+#define PLD_MMCRDATA           __reg16(PLD_BASE + 0x6000)
+#define PLD_MMCCMDDATA         __reg16(PLD_BASE + 0x7000)
+#define PLD_MMCRSPDATA         __reg16(PLD_BASE + 0x7006)
+
+/* Power Control of MMC and CF */
+#define PLD_CPCR               __reg16(PLD_BASE + 0x14000)
+
+
+/*==== ICU ====*/
+#define  M32R_IRQ_PC104        (5)   /* INT4(PC/104) */
+#define  M32R_IRQ_I2C          (28)  /* I2C-BUS     */
+#define  PLD_IRQ_CFIREQ       (6)  /* INT5 CFC Card Interrupt */
+#define  PLD_IRQ_CFC_INSERT   (7)  /* INT6 CFC Card Insert */
+#define  PLD_IRQ_CFC_EJECT    (8)  /* INT7 CFC Card Eject */
+#define  PLD_IRQ_MMCCARD      (43)  /* MMC Card Insert */
+#define  PLD_IRQ_MMCIRQ       (44)  /* MMC Transfer Done */
+
+
+#if 0
+/* LED Control
+ *
+ * 1: DIP swich side
+ * 2: Reset switch side
+ */
+#define PLD_IOLEDCR            __reg16(PLD_BASE + 0x14002)
+#define PLD_IOLED_1_ON         0x001
+#define PLD_IOLED_1_OFF                0x000
+#define PLD_IOLED_2_ON         0x002
+#define PLD_IOLED_2_OFF                0x000
+
+/* DIP Switch
+ *  0: Write-protect of Flash Memory (0:protected, 1:non-protected)
+ *  1: -
+ *  2: -
+ *  3: -
+ */
+#define PLD_IOSWSTS            __reg16(PLD_BASE + 0x14004)
+#define        PLD_IOSWSTS_IOSW2       0x0200
+#define        PLD_IOSWSTS_IOSW1       0x0100
+#define        PLD_IOSWSTS_IOWP0       0x0001
+
+#endif
+
+/* CRC */
+#define PLD_CRC7DATA           __reg16(PLD_BASE + 0x18000)
+#define PLD_CRC7INDATA         __reg16(PLD_BASE + 0x18002)
+#define PLD_CRC16DATA          __reg16(PLD_BASE + 0x18004)
+#define PLD_CRC16INDATA                __reg16(PLD_BASE + 0x18006)
+#define PLD_CRC16ADATA         __reg16(PLD_BASE + 0x18008)
+#define PLD_CRC16AINDATA       __reg16(PLD_BASE + 0x1800a)
+
+
+#if 0
+/* RTC */
+#define PLD_RTCCR              __reg16(PLD_BASE + 0x1c000)
+#define PLD_RTCBAUR            __reg16(PLD_BASE + 0x1c002)
+#define PLD_RTCWRDATA          __reg16(PLD_BASE + 0x1c004)
+#define PLD_RTCRDDATA          __reg16(PLD_BASE + 0x1c006)
+#define PLD_RTCRSTODT          __reg16(PLD_BASE + 0x1c008)
+
+/* SIO0 */
+#define PLD_ESIO0CR            __reg16(PLD_BASE + 0x20000)
+#define        PLD_ESIO0CR_TXEN        0x0001
+#define        PLD_ESIO0CR_RXEN        0x0002
+#define PLD_ESIO0MOD0          __reg16(PLD_BASE + 0x20002)
+#define        PLD_ESIO0MOD0_CTSS      0x0040
+#define        PLD_ESIO0MOD0_RTSS      0x0080
+#define PLD_ESIO0MOD1          __reg16(PLD_BASE + 0x20004)
+#define        PLD_ESIO0MOD1_LMFS      0x0010
+#define PLD_ESIO0STS           __reg16(PLD_BASE + 0x20006)
+#define        PLD_ESIO0STS_TEMP       0x0001
+#define        PLD_ESIO0STS_TXCP       0x0002
+#define        PLD_ESIO0STS_RXCP       0x0004
+#define        PLD_ESIO0STS_TXSC       0x0100
+#define        PLD_ESIO0STS_RXSC       0x0200
+#define PLD_ESIO0STS_TXREADY   (PLD_ESIO0STS_TXCP | PLD_ESIO0STS_TEMP)
+#define PLD_ESIO0INTCR         __reg16(PLD_BASE + 0x20008)
+#define        PLD_ESIO0INTCR_TXIEN    0x0002
+#define        PLD_ESIO0INTCR_RXCEN    0x0004
+#define PLD_ESIO0BAUR          __reg16(PLD_BASE + 0x2000a)
+#define PLD_ESIO0TXB           __reg16(PLD_BASE + 0x2000c)
+#define PLD_ESIO0RXB           __reg16(PLD_BASE + 0x2000e)
+
+/* SIM Card */
+#define PLD_SCCR               __reg16(PLD_BASE + 0x38000)
+#define PLD_SCMOD              __reg16(PLD_BASE + 0x38004)
+#define PLD_SCSTS              __reg16(PLD_BASE + 0x38006)
+#define PLD_SCINTCR            __reg16(PLD_BASE + 0x38008)
+#define PLD_SCBAUR             __reg16(PLD_BASE + 0x3800a)
+#define PLD_SCTXB              __reg16(PLD_BASE + 0x3800c)
+#define PLD_SCRXB              __reg16(PLD_BASE + 0x3800e)
+
+#endif
+
+#endif /* _MAPPI3_PLD.H */
index 8cd4d0da4be19ec366dccef697a3dc6bc5f15c16..b9a20cdad65f4a7c4208e6407b1bc2fdd7218f0d 100644 (file)
@@ -66,7 +66,7 @@ extern volatile int cpu_2_physid[NR_CPUS];
 #define physid_to_cpu(physid)  physid_2_cpu[physid]
 #define cpu_to_physid(cpu_id)  cpu_2_physid[cpu_id]
 
-#define smp_processor_id()     (current_thread_info()->cpu)
+#define raw_smp_processor_id() (current_thread_info()->cpu)
 
 extern cpumask_t cpu_callout_map;
 #define cpu_possible_map cpu_callout_map
index 8ba370ecfd4cc26b9138da3bf2fce8ca759fa4fa..5618f1e12f404d6d6d93671a471c69ef46619530 100644 (file)
@@ -21,7 +21,7 @@
 #include <linux/cpumask.h>
 #include <asm/atomic.h>
 
-#define smp_processor_id()     (current_thread_info()->cpu)
+#define raw_smp_processor_id() (current_thread_info()->cpu)
 
 /* Map from cpu id to sequential logical cpu number.  This will only
    not be idempotent when cpus failed to come on-line.  */
diff --git a/include/asm-mips/vr41xx/giu.h b/include/asm-mips/vr41xx/giu.h
new file mode 100644 (file)
index 0000000..8590885
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ *  Include file for NEC VR4100 series General-purpose I/O Unit.
+ *
+ *  Copyright (C) 2005  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#ifndef __NEC_VR41XX_GIU_H
+#define __NEC_VR41XX_GIU_H
+
+typedef enum {
+       IRQ_TRIGGER_LEVEL,
+       IRQ_TRIGGER_EDGE,
+       IRQ_TRIGGER_EDGE_FALLING,
+       IRQ_TRIGGER_EDGE_RISING,
+} irq_trigger_t;
+
+typedef enum {
+       IRQ_SIGNAL_THROUGH,
+       IRQ_SIGNAL_HOLD,
+} irq_signal_t;
+
+extern void vr41xx_set_irq_trigger(unsigned int pin, irq_trigger_t trigger, irq_signal_t signal);
+
+typedef enum {
+       IRQ_LEVEL_LOW,
+       IRQ_LEVEL_HIGH,
+} irq_level_t;
+
+extern void vr41xx_set_irq_level(unsigned int pin, irq_level_t level);
+
+typedef enum {
+       GPIO_DATA_LOW,
+       GPIO_DATA_HIGH,
+       GPIO_DATA_INVAL,
+} gpio_data_t;
+
+extern gpio_data_t vr41xx_gpio_get_pin(unsigned int pin);
+extern int vr41xx_gpio_set_pin(unsigned int pin, gpio_data_t data);
+
+typedef enum {
+       GPIO_INPUT,
+       GPIO_OUTPUT,
+       GPIO_OUTPUT_DISABLE,
+} gpio_direction_t;
+
+extern int vr41xx_gpio_set_direction(unsigned int pin, gpio_direction_t dir);
+
+typedef enum {
+       GPIO_PULL_DOWN,
+       GPIO_PULL_UP,
+       GPIO_PULL_DISABLE,
+} gpio_pull_t;
+
+extern int vr41xx_gpio_pullupdown(unsigned int pin, gpio_pull_t pull);
+
+#endif /* __NEC_VR41XX_GIU_H */
index ad0d1ea144f01eb2214296f87c4fc405eebb2bd4..7d41e44463f954ee6edcbf93a88efe8d33684d7d 100644 (file)
@@ -126,7 +126,6 @@ extern void vr41xx_mask_clock(vr41xx_clock_t clock);
 #define GIU_IRQ_BASE           40
 #define GIU_IRQ(x)             (GIU_IRQ_BASE + (x))    /* IRQ 40-71 */
 #define GIU_IRQ_LAST           GIU_IRQ(31)
-#define GIU_IRQ_TO_PIN(x)      ((x) - GIU_IRQ_BASE)    /* Pin 0-31 */
 
 extern int vr41xx_set_intassign(unsigned int irq, unsigned char intassign);
 extern int vr41xx_cascade_irq(unsigned int irq, int (*get_irq_number)(int irq));
@@ -197,38 +196,4 @@ extern void vr41xx_disable_csiint(uint16_t mask);
 extern void vr41xx_enable_bcuint(void);
 extern void vr41xx_disable_bcuint(void);
 
-/*
- * General-Purpose I/O Unit
- */
-enum {
-       TRIGGER_LEVEL,
-       TRIGGER_EDGE,
-       TRIGGER_EDGE_FALLING,
-       TRIGGER_EDGE_RISING
-};
-
-enum {
-       SIGNAL_THROUGH,
-       SIGNAL_HOLD
-};
-
-extern void vr41xx_set_irq_trigger(int pin, int trigger, int hold);
-
-enum {
-       LEVEL_LOW,
-       LEVEL_HIGH
-};
-
-extern void vr41xx_set_irq_level(int pin, int level);
-
-enum {
-       PIO_INPUT,
-       PIO_OUTPUT
-};
-
-enum {
-       DATA_LOW,
-       DATA_HIGH
-};
-
 #endif /* __NEC_VR41XX_H */
index fde77ac35463b1610c7c085d57b3ca9bd55f0fc6..9413f67a540bb24ae2b2d2866a48c3fc8dc1a37a 100644 (file)
@@ -51,7 +51,7 @@ extern void smp_send_reschedule(int cpu);
 
 extern unsigned long cpu_present_mask;
 
-#define smp_processor_id()     (current_thread_info()->cpu)
+#define raw_smp_processor_id() (current_thread_info()->cpu)
 
 #endif /* CONFIG_SMP */
 
index be27cfa8c5b0a3ccc5e5d91c240f65966f324e2a..ca9e423307f4c881f177260b83b390cebb61a1ff 100644 (file)
 #define flush_agp_mappings()
 #define flush_agp_cache() mb()
 
+/* Convert a physical address to an address suitable for the GART. */
+#define phys_to_gart(x) (x)
+#define gart_to_phys(x) (x)
+
+/* GATT allocation. Returns/accepts GATT kernel virtual address. */
+#define alloc_gatt_pages(order)                \
+       ((char *)__get_free_pages(GFP_KERNEL, (order)))
+#define free_gatt_pages(table, order)  \
+       free_pages((unsigned long)(table), (order))
+
 #endif
index 42fd1068cf2a4100f468f439f69c2da3c0fe5b38..c5883dbed63f8bbf84d8d1eeb11d6f77a93a62ac 100644 (file)
@@ -1039,6 +1039,52 @@ typedef struct im_idma {
 #define CMXSCR_TS4CS_CLK7  0x00000006   /* SCC4 Tx Clock Source is CLK7 */
 #define CMXSCR_TS4CS_CLK8  0x00000007   /* SCC4 Tx Clock Source is CLK8 */
 
+/*-----------------------------------------------------------------------
+ * SIUMCR - SIU Module Configuration Register                           4-31
+ */
+#define SIUMCR_BBD     0x80000000      /* Bus Busy Disable             */
+#define SIUMCR_ESE     0x40000000      /* External Snoop Enable        */
+#define SIUMCR_PBSE    0x20000000      /* Parity Byte Select Enable    */
+#define SIUMCR_CDIS    0x10000000      /* Core Disable                 */
+#define SIUMCR_DPPC00  0x00000000      /* Data Parity Pins Configuration*/
+#define SIUMCR_DPPC01  0x04000000      /* - " -                        */
+#define SIUMCR_DPPC10  0x08000000      /* - " -                        */
+#define SIUMCR_DPPC11  0x0c000000      /* - " -                        */
+#define SIUMCR_L2CPC00 0x00000000      /* L2 Cache Pins Configuration  */
+#define SIUMCR_L2CPC01 0x01000000      /* - " -                        */
+#define SIUMCR_L2CPC10 0x02000000      /* - " -                        */
+#define SIUMCR_L2CPC11 0x03000000      /* - " -                        */
+#define SIUMCR_LBPC00  0x00000000      /* Local Bus Pins Configuration */
+#define SIUMCR_LBPC01  0x00400000      /* - " -                        */
+#define SIUMCR_LBPC10  0x00800000      /* - " -                        */
+#define SIUMCR_LBPC11  0x00c00000      /* - " -                        */
+#define SIUMCR_APPC00  0x00000000      /* Address Parity Pins Configuration*/
+#define SIUMCR_APPC01  0x00100000      /* - " -                        */
+#define SIUMCR_APPC10  0x00200000      /* - " -                        */
+#define SIUMCR_APPC11  0x00300000      /* - " -                        */
+#define SIUMCR_CS10PC00        0x00000000      /* CS10 Pin Configuration       */
+#define SIUMCR_CS10PC01        0x00040000      /* - " -                        */
+#define SIUMCR_CS10PC10        0x00080000      /* - " -                        */
+#define SIUMCR_CS10PC11        0x000c0000      /* - " -                        */
+#define SIUMCR_BCTLC00 0x00000000      /* Buffer Control Configuration */
+#define SIUMCR_BCTLC01 0x00010000      /* - " -                        */
+#define SIUMCR_BCTLC10 0x00020000      /* - " -                        */
+#define SIUMCR_BCTLC11 0x00030000      /* - " -                        */
+#define SIUMCR_MMR00   0x00000000      /* Mask Masters Requests        */
+#define SIUMCR_MMR01   0x00004000      /* - " -                        */
+#define SIUMCR_MMR10   0x00008000      /* - " -                        */
+#define SIUMCR_MMR11   0x0000c000      /* - " -                        */
+#define SIUMCR_LPBSE   0x00002000      /* LocalBus Parity Byte Select Enable*/
+
+/*-----------------------------------------------------------------------
+ * SCCR - System Clock Control Register                                         9-8
+*/
+#define SCCR_PCI_MODE  0x00000100      /* PCI Mode     */
+#define SCCR_PCI_MODCK 0x00000080      /* Value of PCI_MODCK pin       */
+#define SCCR_PCIDF_MSK 0x00000078      /* PCI division factor  */
+#define SCCR_PCIDF_SHIFT 3
+
+
 #endif /* __CPM2__ */
 #endif /* __KERNEL__ */
 
index 06b86be61ed13e32851b60a66ebefd39386a5166..a9b33324f56299dfb49704ec5789e2cfd29df686 100644 (file)
@@ -176,7 +176,7 @@ static __inline__ int irq_canonicalize(int irq)
 */
 #include <asm/mpc85xx.h>
 
-/* The MPC8560 openpic has  32 internal interrupts and 12 external
+/* The MPC8548 openpic has 48 internal interrupts and 12 external
  * interrupts.
  *
  * We are "flattening" the interrupt vectors of the cascaded CPM
@@ -184,7 +184,7 @@ static __inline__ int irq_canonicalize(int irq)
  * single integer.
  */
 #define NR_CPM_INTS    64
-#define NR_EPIC_INTS   44
+#define NR_EPIC_INTS   60
 #ifndef NR_8259_INTS
 #define NR_8259_INTS   0
 #endif
@@ -223,9 +223,15 @@ static __inline__ int irq_canonicalize(int irq)
 #define MPC85xx_IRQ_RIO_RX     (12 + MPC85xx_OPENPIC_IRQ_OFFSET)
 #define MPC85xx_IRQ_TSEC1_TX   (13 + MPC85xx_OPENPIC_IRQ_OFFSET)
 #define MPC85xx_IRQ_TSEC1_RX   (14 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_TSEC3_TX   (15 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_TSEC3_RX   (16 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_TSEC3_ERROR        (17 + MPC85xx_OPENPIC_IRQ_OFFSET)
 #define MPC85xx_IRQ_TSEC1_ERROR        (18 + MPC85xx_OPENPIC_IRQ_OFFSET)
 #define MPC85xx_IRQ_TSEC2_TX   (19 + MPC85xx_OPENPIC_IRQ_OFFSET)
 #define MPC85xx_IRQ_TSEC2_RX   (20 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_TSEC4_TX   (21 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_TSEC4_RX   (22 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_TSEC4_ERROR        (23 + MPC85xx_OPENPIC_IRQ_OFFSET)
 #define MPC85xx_IRQ_TSEC2_ERROR        (24 + MPC85xx_OPENPIC_IRQ_OFFSET)
 #define MPC85xx_IRQ_FEC                (25 + MPC85xx_OPENPIC_IRQ_OFFSET)
 #define MPC85xx_IRQ_DUART      (26 + MPC85xx_OPENPIC_IRQ_OFFSET)
@@ -235,18 +241,18 @@ static __inline__ int irq_canonicalize(int irq)
 #define MPC85xx_IRQ_CPM                (30 + MPC85xx_OPENPIC_IRQ_OFFSET)
 
 /* The 12 external interrupt lines */
-#define MPC85xx_IRQ_EXT0        (32 + MPC85xx_OPENPIC_IRQ_OFFSET)
-#define MPC85xx_IRQ_EXT1        (33 + MPC85xx_OPENPIC_IRQ_OFFSET)
-#define MPC85xx_IRQ_EXT2        (34 + MPC85xx_OPENPIC_IRQ_OFFSET)
-#define MPC85xx_IRQ_EXT3        (35 + MPC85xx_OPENPIC_IRQ_OFFSET)
-#define MPC85xx_IRQ_EXT4        (36 + MPC85xx_OPENPIC_IRQ_OFFSET)
-#define MPC85xx_IRQ_EXT5        (37 + MPC85xx_OPENPIC_IRQ_OFFSET)
-#define MPC85xx_IRQ_EXT6        (38 + MPC85xx_OPENPIC_IRQ_OFFSET)
-#define MPC85xx_IRQ_EXT7        (39 + MPC85xx_OPENPIC_IRQ_OFFSET)
-#define MPC85xx_IRQ_EXT8        (40 + MPC85xx_OPENPIC_IRQ_OFFSET)
-#define MPC85xx_IRQ_EXT9        (41 + MPC85xx_OPENPIC_IRQ_OFFSET)
-#define MPC85xx_IRQ_EXT10       (42 + MPC85xx_OPENPIC_IRQ_OFFSET)
-#define MPC85xx_IRQ_EXT11       (43 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_EXT0        (48 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_EXT1        (49 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_EXT2        (50 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_EXT3        (51 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_EXT4        (52 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_EXT5        (53 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_EXT6        (54 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_EXT7        (55 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_EXT8        (56 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_EXT9        (57 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_EXT10       (58 + MPC85xx_OPENPIC_IRQ_OFFSET)
+#define MPC85xx_IRQ_EXT11       (59 + MPC85xx_OPENPIC_IRQ_OFFSET)
 
 /* CPM related interrupts */
 #define        SIU_INT_ERROR           ((uint)0x00+CPM_IRQ_OFFSET)
index 163a6b91d5b2ffe0c49f9d9814a65a5bc23d0cd0..bf9e05dd54b5243d256f12c5e5df70f6b5a6c128 100644 (file)
@@ -19,6 +19,7 @@
  * Define the vendor/device ID for the MPC8265.
  */
 #define        PCI_DEVICE_ID_MPC8265   ((0x18C0 << 16) | PCI_VENDOR_ID_MOTOROLA)
+#define        PCI_DEVICE_ID_MPC8272   ((0x18C1 << 16) | PCI_VENDOR_ID_MOTOROLA)
 
 #define M8265_PCIBR0   0x101ac
 #define M8265_PCIBR1   0x101b0
index d8e7e2d6128e70f5f170f58188da06966485af50..f5196a4efbe0ff43e4e16c54780b126808887efe 100644 (file)
@@ -159,6 +159,12 @@ extern unsigned long                       ioremap_base;
 #define        MPC10X_MAPA_EUMB_BASE           (ioremap_base - MPC10X_EUMB_SIZE)
 #define        MPC10X_MAPB_EUMB_BASE           MPC10X_MAPA_EUMB_BASE
 
+enum ppc_sys_devices {
+       MPC10X_IIC1,
+       MPC10X_DMA0,
+       MPC10X_DMA1,
+       MPC10X_DUART,
+};
 
 int mpc10x_bridge_init(struct pci_controller *hose,
                       uint current_map,
index d820894e59916a4c491b8bdd0312830acec228a9..89eb8a2ac6934552eeaf74d5ed222690ed504732 100644 (file)
@@ -41,7 +41,7 @@
 #endif
 
 #ifdef CONFIG_PCI_8260
-#include <syslib/m8260_pci.h>
+#include <syslib/m82xx_pci.h>
 #endif
 
 /* Make sure the memory translation stuff is there if PCI not used.
index 22713e331585a7e9c0360ca4691674221a817261..516984ee14b58782f98fb6168e7cea4c3c44e00f 100644 (file)
@@ -25,7 +25,7 @@
 #ifdef CONFIG_MPC8540_ADS
 #include <platforms/85xx/mpc8540_ads.h>
 #endif
-#ifdef CONFIG_MPC8555_CDS
+#if defined(CONFIG_MPC8555_CDS) || defined(CONFIG_MPC8548_CDS)
 #include <platforms/85xx/mpc8555_cds.h>
 #endif
 #ifdef CONFIG_MPC8560_ADS
@@ -74,7 +74,7 @@ extern unsigned char __res[];
 #define MPC85xx_GUTS_OFFSET    (0xe0000)
 #define MPC85xx_GUTS_SIZE      (0x01000)
 #define MPC85xx_IIC1_OFFSET    (0x03000)
-#define MPC85xx_IIC1_SIZE      (0x01000)
+#define MPC85xx_IIC1_SIZE      (0x00100)
 #define MPC85xx_OPENPIC_OFFSET (0x40000)
 #define MPC85xx_OPENPIC_SIZE   (0x40000)
 #define MPC85xx_PCI1_OFFSET    (0x08000)
@@ -127,8 +127,64 @@ enum ppc_sys_devices {
        MPC85xx_CPM_MCC2,
        MPC85xx_CPM_SMC1,
        MPC85xx_CPM_SMC2,
+       MPC85xx_eTSEC1,
+       MPC85xx_eTSEC2,
+       MPC85xx_eTSEC3,
+       MPC85xx_eTSEC4,
+       MPC85xx_IIC2,
 };
 
+/* Internal interrupts are all Level Sensitive, and Positive Polarity */
+#define MPC85XX_INTERNAL_IRQ_SENSES \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  0 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  1 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  2 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  3 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  4 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  5 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  6 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  7 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  8 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal  9 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 10 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 11 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 12 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 13 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 14 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 15 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 16 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 17 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 18 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 19 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 20 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 21 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 22 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 23 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 24 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 25 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 26 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 27 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 28 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 29 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 30 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 31 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 32 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 33 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 34 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 35 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 36 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 37 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 38 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 39 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 40 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 41 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 42 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 43 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 44 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 45 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Internal 46 */       \
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE)       /* Internal 47 */
+
 #endif /* CONFIG_85xx */
 #endif /* __ASM_MPC85xx_H__ */
 #endif /* __KERNEL__ */
index b98db3cdae83c3505c51fa386ed526a3f8e3b1de..c726f18451906536ea29f337251d633035b2f98e 100644 (file)
@@ -189,7 +189,7 @@ extern void ocp_for_each_device(void(*callback)(struct ocp_device *, void *arg),
 /* Sysfs support */
 #define OCP_SYSFS_ADDTL(type, format, name, field)                     \
 static ssize_t                                                         \
-show_##name##_##field(struct device *dev, char *buf)                   \
+show_##name##_##field(struct device *dev, struct device_attribute *attr, char *buf)                    \
 {                                                                      \
        struct ocp_device *odev = to_ocp_dev(dev);                      \
        type *add = odev->def->additions;                               \
index a38606d15549ac326babf08d583972a4be973d07..4d4b20c9de78fbf31097ea3cb5e098b352cf73f7 100644 (file)
@@ -267,8 +267,6 @@ extern unsigned long ioremap_bot, ioremap_base;
 #define _PMD_PRESENT_MASK (PAGE_MASK)
 #define _PMD_BAD       (~PAGE_MASK)
 
-#define NUM_TLBCAMS    (16)
-
 #elif defined(CONFIG_8xx)
 /* Definitions for 8xx embedded chips. */
 #define _PAGE_PRESENT  0x0001  /* Page is valid */
index 24b991c427694d425225c2cacde01b5bc469ed0a..8ea6245662312f644aef30cf26c204e99e4512a2 100644 (file)
@@ -27,6 +27,8 @@
 #include <asm/mpc85xx.h>
 #elif defined(CONFIG_PPC_MPC52xx)
 #include <asm/mpc52xx.h>
+#elif defined(CONFIG_MPC10X_BRIDGE)
+#include <asm/mpc10x.h>
 #else
 #error "need definition of ppc_sys_devices"
 #endif
diff --git a/include/asm-ppc/seccomp.h b/include/asm-ppc/seccomp.h
new file mode 100644 (file)
index 0000000..666c4da
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef _ASM_SECCOMP_H
+
+#include <linux/unistd.h>
+
+#define __NR_seccomp_read __NR_read
+#define __NR_seccomp_write __NR_write
+#define __NR_seccomp_exit __NR_exit
+#define __NR_seccomp_sigreturn __NR_rt_sigreturn
+
+#endif /* _ASM_SECCOMP_H */
index f82dcccdee1e974c770b9dfe8c7aeb20ce144872..b7a417e0a9217c758384d4227975b7580a33902b 100644 (file)
@@ -2,7 +2,7 @@
 #define _ASM_PPC_SIGCONTEXT_H
 
 #include <asm/ptrace.h>
-
+#include <linux/compiler.h>
 
 struct sigcontext {
        unsigned long   _unused[4];
index ebfb614f55f650707ec092e05a15187d6d0855b4..17530c232c7690c6a47a0b87a0e50ea4e23b8788 100644 (file)
@@ -44,7 +44,7 @@ extern void smp_message_recv(int, struct pt_regs *);
 #define NO_PROC_ID             0xFF            /* No processor magic marker */
 #define PROC_CHANGE_PENALTY    20
 
-#define smp_processor_id() (current_thread_info()->cpu)
+#define raw_smp_processor_id() (current_thread_info()->cpu)
 
 extern int __cpu_up(unsigned int cpu);
 
index f7f01524e8a8936424b0602ec1754b71f8411d0c..e3b5284a6f91c0be27f766d4aaf0fe2671c8d2f1 100644 (file)
@@ -77,12 +77,19 @@ 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_SYSCALL_AUDIT       6       /* syscall auditing active */
+#define TIF_SECCOMP             7      /* secure computing */
+
 /* as above, but as bit values */
 #define _TIF_SYSCALL_TRACE     (1<<TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME     (1<<TIF_NOTIFY_RESUME)
 #define _TIF_SIGPENDING                (1<<TIF_SIGPENDING)
 #define _TIF_NEED_RESCHED      (1<<TIF_NEED_RESCHED)
 #define _TIF_POLLING_NRFLAG    (1<<TIF_POLLING_NRFLAG)
+#define _TIF_SYSCALL_AUDIT      (1<<TIF_SYSCALL_AUDIT)
+#define _TIF_SECCOMP            (1<<TIF_SECCOMP)
+
+#define _TIF_SYSCALL_T_OR_A     (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP)
 
 /*
  * Non racy (local) flags bit numbers
index be27cfa8c5b0a3ccc5e5d91c240f65966f324e2a..ca9e423307f4c881f177260b83b390cebb61a1ff 100644 (file)
 #define flush_agp_mappings()
 #define flush_agp_cache() mb()
 
+/* Convert a physical address to an address suitable for the GART. */
+#define phys_to_gart(x) (x)
+#define gart_to_phys(x) (x)
+
+/* GATT allocation. Returns/accepts GATT kernel virtual address. */
+#define alloc_gatt_pages(order)                \
+       ((char *)__get_free_pages(GFP_KERNEL, (order)))
+#define free_gatt_pages(table, order)  \
+       free_pages((unsigned long)(table), (order))
+
 #endif
index d693b8026bc342052b70dced032ffc2aec944627..dfd1f69059baaeb63cbd90db3798ffd816f199b0 100644 (file)
@@ -27,6 +27,8 @@
 /* Doesn't really apply... */
 #define MAX_DMA_ADDRESS  (~0UL)
 
+#if !defined(CONFIG_PPC_ISERIES) || defined(CONFIG_PCI)
+
 #define dma_outb       outb
 #define dma_inb                inb
 
@@ -323,4 +325,5 @@ extern int isa_dma_bridge_buggy;
 #else                                                         
 #define isa_dma_bridge_buggy   (0)
 #endif
+#endif /* !defined(CONFIG_PPC_ISERIES) || defined(CONFIG_PCI) */
 #endif /* _ASM_DMA_H */
index 6c42d61bedd13447e219150362a0dbc7e058734a..085eedb956fe02f7a0f34c1cbea0895e476b00ee 100644 (file)
@@ -221,9 +221,7 @@ do {                                                                \
                set_thread_flag(TIF_ABI_PENDING);               \
        else                                                    \
                clear_thread_flag(TIF_ABI_PENDING);             \
-       if (ibcs2)                                              \
-               set_personality(PER_SVR4);                      \
-       else if (current->personality != PER_LINUX32)           \
+       if (personality(current->personality) != PER_LINUX32)   \
                set_personality(PER_LINUX);                     \
 } while (0)
 
index d9a2e74e2399979081790ee5268ced56fa932d74..c3f19475c0d946e8a323826a7759f5f2bf9804da 100644 (file)
@@ -1,84 +1,36 @@
 /*
  * HvCall.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
-
-//===========================================================================
-//
-//     This file contains the "hypervisor call" interface which is used to
-//     drive the hypervisor from the OS.
-//
-//===========================================================================
+/*
+ * This file contains the "hypervisor call" interface which is used to
+ * drive the hypervisor from the OS.
+ */
 #ifndef _HVCALL_H
 #define _HVCALL_H
 
-//-------------------------------------------------------------------
-// Standard Includes
-//-------------------------------------------------------------------
 #include <asm/iSeries/HvCallSc.h>
 #include <asm/iSeries/HvTypes.h>
 #include <asm/paca.h>
 
-/*
-enum HvCall_ReturnCode
-{
-       HvCall_Good             = 0,
-       HvCall_Partial          = 1,
-       HvCall_NotOwned         = 2,
-       HvCall_NotFreed         = 3,
-       HvCall_UnspecifiedError = 4
-};
-
-enum HvCall_TypeOfSIT
-{
-       HvCall_ReduceOnly       = 0,
-       HvCall_Unconditional    = 1
-};
-
-enum HvCall_TypeOfYield
-{
-       HvCall_YieldTimed       = 0,    // Yield until specified time
-       HvCall_YieldToActive    = 1,    // Yield until all active procs have run
-       HvCall_YieldToProc      = 2     // Yield until the specified processor has run
-};
-
-enum HvCall_InterruptMasks
-{
-       HvCall_MaskIPI          = 0x00000001,
-       HvCall_MaskLpEvent      = 0x00000002,
-       HvCall_MaskLpProd       = 0x00000004,
-       HvCall_MaskTimeout      = 0x00000008
-};
-
-enum HvCall_VaryOffChunkRc
-{
-       HvCall_VaryOffSucceeded         = 0,
-       HvCall_VaryOffWithdrawn         = 1,
-       HvCall_ChunkInLoadArea          = 2,
-       HvCall_ChunkInHPT               = 3,
-       HvCall_ChunkNotAccessible       = 4,
-       HvCall_ChunkInUse               = 5
-};
-*/
-
 /* Type of yield for HvCallBaseYieldProcessor */
-#define HvCall_YieldTimed      0       // Yield until specified time (tb)
-#define HvCall_YieldToActive   1       // Yield until all active procs have run
-#define HvCall_YieldToProc     2       // Yield until the specified processor has run
+#define HvCall_YieldTimed      0       /* Yield until specified time (tb) */
+#define HvCall_YieldToActive   1       /* Yield until all active procs have run */
+#define HvCall_YieldToProc     2       /* Yield until the specified processor has run */
 
 /* interrupt masks for setEnabledInterrupts */
 #define HvCall_MaskIPI         0x00000001
@@ -86,7 +38,7 @@ enum HvCall_VaryOffChunkRc
 #define HvCall_MaskLpProd      0x00000004
 #define HvCall_MaskTimeout     0x00000008
 
-/* Log buffer formats                       */
+/* Log buffer formats */
 #define HvCall_LogBuffer_ASCII          0
 #define HvCall_LogBuffer_EBCDIC         1
 
@@ -95,7 +47,7 @@ enum HvCall_VaryOffChunkRc
 #define HvCallBaseGetHwPatch                           HvCallBase +  2
 #define HvCallBaseReIplSpAttn                          HvCallBase +  3
 #define HvCallBaseSetASR                               HvCallBase +  4
-#define HvCallBaseSetASRAndRfi                         HvCallBase +  5 
+#define HvCallBaseSetASRAndRfi                         HvCallBase +  5
 #define HvCallBaseSetIMR                               HvCallBase +  6
 #define HvCallBaseSendIPI                              HvCallBase +  7
 #define HvCallBaseTerminateMachine                     HvCallBase +  8
@@ -115,91 +67,47 @@ enum HvCall_VaryOffChunkRc
 #define HvCallBaseGetLogBufferCodePage                 HvCallBase + 22
 #define HvCallBaseGetLogBufferFormat                   HvCallBase + 23
 #define HvCallBaseGetLogBufferLength                   HvCallBase + 24
-#define HvCallBaseReadLogBuffer                        HvCallBase + 25
+#define HvCallBaseReadLogBuffer                                HvCallBase + 25
 #define HvCallBaseSetLogBufferFormatAndCodePage                HvCallBase + 26
-#define HvCallBaseWriteLogBuffer                               HvCallBase + 27
+#define HvCallBaseWriteLogBuffer                       HvCallBase + 27
 #define HvCallBaseRouter28                             HvCallBase + 28
 #define HvCallBaseRouter29                             HvCallBase + 29
 #define HvCallBaseRouter30                             HvCallBase + 30
-#define HvCallBaseSetDebugBus                          HvCallBase + 31
+#define HvCallBaseSetDebugBus                          HvCallBase + 31
 
-#define HvCallCcSetDABR                                HvCallCc + 7
+#define HvCallCcSetDABR                                        HvCallCc + 7
 
-//=====================================================================================
-static inline void             HvCall_setVirtualDecr(void)
+static inline void HvCall_setVirtualDecr(void)
 {
-       /* Ignore any error return codes - most likely means that the target value for the
-        * LP has been increased and this vary off would bring us below the new target. */
+       /*
+        * Ignore any error return codes - most likely means that the
+        * target value for the LP has been increased and this vary off
+        * would bring us below the new target.
+        */
        HvCall0(HvCallBaseSetVirtualDecr);
 }
-//=====================================================================
-static inline void             HvCall_yieldProcessor(unsigned typeOfYield, u64 yieldParm)
-{
-       HvCall2( HvCallBaseYieldProcessor, typeOfYield, yieldParm );
-}
-//=====================================================================
-static inline void             HvCall_setEnabledInterrupts(u64 enabledInterrupts)
-{
-       HvCall1(HvCallBaseSetEnabledInterrupts,enabledInterrupts);
-}
-
-//=====================================================================
-static inline void             HvCall_clearLogBuffer(HvLpIndex lpindex)
-{
-       HvCall1(HvCallBaseClearLogBuffer,lpindex);
-}
-
-//=====================================================================
-static inline u32              HvCall_getLogBufferCodePage(HvLpIndex lpindex)
-{
-       u32 retVal = HvCall1(HvCallBaseGetLogBufferCodePage,lpindex);
-       return retVal;
-}
-
-//=====================================================================
-static inline int              HvCall_getLogBufferFormat(HvLpIndex lpindex)
-{
-       int retVal = HvCall1(HvCallBaseGetLogBufferFormat,lpindex);
-       return retVal;
-}
-
-//=====================================================================
-static inline u32              HvCall_getLogBufferLength(HvLpIndex lpindex)
-{
-       u32 retVal = HvCall1(HvCallBaseGetLogBufferLength,lpindex);
-       return retVal;
-}
 
-//=====================================================================
-static inline void             HvCall_setLogBufferFormatAndCodepage(int format, u32 codePage)
+static inline void HvCall_yieldProcessor(unsigned typeOfYield, u64 yieldParm)
 {
-       HvCall2(HvCallBaseSetLogBufferFormatAndCodePage,format, codePage);
+       HvCall2(HvCallBaseYieldProcessor, typeOfYield, yieldParm);
 }
 
-//=====================================================================
-int HvCall_readLogBuffer(HvLpIndex lpindex, void *buffer, u64 bufLen);
-void HvCall_writeLogBuffer(const void *buffer, u64 bufLen);
-
-//=====================================================================
-static inline void             HvCall_sendIPI(struct paca_struct * targetPaca)
+static inline void HvCall_setEnabledInterrupts(u64 enabledInterrupts)
 {
-       HvCall1( HvCallBaseSendIPI, targetPaca->paca_index );
+       HvCall1(HvCallBaseSetEnabledInterrupts, enabledInterrupts);
 }
 
-//=====================================================================
-static inline void             HvCall_terminateMachineSrc(void)
+static inline void HvCall_setLogBufferFormatAndCodepage(int format,
+               u32 codePage)
 {
-       HvCall0( HvCallBaseTerminateMachineSrc );
+       HvCall2(HvCallBaseSetLogBufferFormatAndCodePage, format, codePage);
 }
 
-static inline void HvCall_setDABR(unsigned long val)
-{
-       HvCall1(HvCallCcSetDABR, val);
-}
+extern void HvCall_writeLogBuffer(const void *buffer, u64 bufLen);
 
-static inline void HvCall_setDebugBus(unsigned long val)
+static inline void HvCall_sendIPI(struct paca_struct *targetPaca)
 {
-       HvCall1(HvCallBaseSetDebugBus, val);
+       HvCall1(HvCallBaseSendIPI, targetPaca->paca_index);
 }
 
 #endif /* _HVCALL_H */
diff --git a/include/asm-ppc64/iSeries/HvCallCfg.h b/include/asm-ppc64/iSeries/HvCallCfg.h
deleted file mode 100644 (file)
index 9f40f16..0000000
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * HvCallCfg.h
- * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
- */
-
-//=====================================================================================
-//
-//     This file contains the "hypervisor call" interface which is used to
-//     drive the hypervisor from the OS.
-//
-//=====================================================================================
-#ifndef _HVCALLCFG_H
-#define _HVCALLCFG_H
-
-//-------------------------------------------------------------------
-// Standard Includes
-//-------------------------------------------------------------------
-#include <asm/iSeries/HvCallSc.h>
-#include <asm/iSeries/HvTypes.h>
-
-//-------------------------------------------------------------------------------------
-// Constants
-//-------------------------------------------------------------------------------------
-
-enum HvCallCfg_ReqQual
-{
-       HvCallCfg_Cur   = 0,
-       HvCallCfg_Init  = 1,
-       HvCallCfg_Max   = 2,
-       HvCallCfg_Min   = 3
-};
-
-#define HvCallCfgGetLps                                        HvCallCfg +  0
-#define HvCallCfgGetActiveLpMap                                HvCallCfg +  1
-#define HvCallCfgGetLpVrmIndex                         HvCallCfg +  2
-#define HvCallCfgGetLpMinSupportedPlicVrmIndex         HvCallCfg +  3
-#define HvCallCfgGetLpMinCompatablePlicVrmIndex                HvCallCfg +  4
-#define HvCallCfgGetLpVrmName                          HvCallCfg +  5 
-#define HvCallCfgGetSystemPhysicalProcessors           HvCallCfg +  6
-#define HvCallCfgGetPhysicalProcessors                 HvCallCfg +  7
-#define HvCallCfgGetSystemMsChunks                     HvCallCfg +  8
-#define HvCallCfgGetMsChunks                           HvCallCfg +  9
-#define HvCallCfgGetInteractivePercentage              HvCallCfg + 10
-#define HvCallCfgIsBusDedicated                                HvCallCfg + 11
-#define HvCallCfgGetBusOwner                           HvCallCfg + 12
-#define HvCallCfgGetBusAllocation                      HvCallCfg + 13
-#define HvCallCfgGetBusUnitOwner                       HvCallCfg + 14
-#define HvCallCfgGetBusUnitAllocation                  HvCallCfg + 15
-#define HvCallCfgGetVirtualBusPool                     HvCallCfg + 16
-#define HvCallCfgGetBusUnitInterruptProc               HvCallCfg + 17
-#define HvCallCfgGetConfiguredBusUnitsForIntProc       HvCallCfg + 18
-#define HvCallCfgGetRioSanBusPool                      HvCallCfg + 19
-#define HvCallCfgGetSharedPoolIndex                    HvCallCfg + 20
-#define HvCallCfgGetSharedProcUnits                    HvCallCfg + 21
-#define HvCallCfgGetNumProcsInSharedPool               HvCallCfg + 22
-#define HvCallCfgRouter23                              HvCallCfg + 23
-#define HvCallCfgRouter24                              HvCallCfg + 24
-#define HvCallCfgRouter25                              HvCallCfg + 25
-#define HvCallCfgRouter26                              HvCallCfg + 26
-#define HvCallCfgRouter27                              HvCallCfg + 27
-#define HvCallCfgGetMinRuntimeMsChunks                 HvCallCfg + 28
-#define HvCallCfgSetMinRuntimeMsChunks                 HvCallCfg + 29
-#define HvCallCfgGetVirtualLanIndexMap                 HvCallCfg + 30
-#define HvCallCfgGetLpExecutionMode                    HvCallCfg + 31
-#define HvCallCfgGetHostingLpIndex                     HvCallCfg + 32
-
-//====================================================================
-static inline HvLpIndex        HvCallCfg_getLps(void)
-{
-       HvLpIndex retVal = HvCall0(HvCallCfgGetLps);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-}
-//====================================================================
-static inline int              HvCallCfg_isBusDedicated(u64 busIndex)
-{
-       int retVal = HvCall1(HvCallCfgIsBusDedicated,busIndex);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-}
-//====================================================================
-static inline HvLpIndex        HvCallCfg_getBusOwner(u64 busIndex)
-{
-       HvLpIndex retVal = HvCall1(HvCallCfgGetBusOwner,busIndex);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-}
-//====================================================================
-static inline HvLpIndexMap     HvCallCfg_getBusAllocation(u64 busIndex)
-{
-       HvLpIndexMap retVal = HvCall1(HvCallCfgGetBusAllocation,busIndex);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-}
-//====================================================================
-static inline HvLpIndexMap     HvCallCfg_getActiveLpMap(void)
-{
-       HvLpIndexMap retVal = HvCall0(HvCallCfgGetActiveLpMap);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-}
-//====================================================================
-static inline HvLpVirtualLanIndexMap   HvCallCfg_getVirtualLanIndexMap(HvLpIndex lp)
-{
-       // This is a new function in V5R1 so calls to this on older 
-       // hypervisors will return -1
-       u64 retVal = HvCall1(HvCallCfgGetVirtualLanIndexMap, lp);
-       if(retVal == -1)
-               retVal = 0;
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-}
-//===================================================================
-static inline u64              HvCallCfg_getSystemMsChunks(void)
-{
-       u64 retVal = HvCall0(HvCallCfgGetSystemMsChunks);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-}
-//===================================================================
-static inline u64              HvCallCfg_getMsChunks(HvLpIndex lp,enum HvCallCfg_ReqQual qual)
-{
-       u64 retVal = HvCall2(HvCallCfgGetMsChunks,lp,qual);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-}
-//===================================================================
-static inline u64              HvCallCfg_getMinRuntimeMsChunks(HvLpIndex lp)
-{
-       // NOTE: This function was added in v5r1 so older hypervisors will return a -1 value
-       u64 retVal = HvCall1(HvCallCfgGetMinRuntimeMsChunks,lp);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-}
-//===================================================================
-static inline u64              HvCallCfg_setMinRuntimeMsChunks(u64 chunks)
-{
-       u64 retVal = HvCall1(HvCallCfgSetMinRuntimeMsChunks,chunks);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-}
-//===================================================================
-static inline u64              HvCallCfg_getSystemPhysicalProcessors(void)
-{
-       u64 retVal = HvCall0(HvCallCfgGetSystemPhysicalProcessors);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-}
-//===================================================================
-static inline u64              HvCallCfg_getPhysicalProcessors(HvLpIndex lp,enum HvCallCfg_ReqQual qual)
-{
-       u64 retVal = HvCall2(HvCallCfgGetPhysicalProcessors,lp,qual);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-}
-//===================================================================
-static inline u64              HvCallCfg_getConfiguredBusUnitsForInterruptProc(HvLpIndex lp,
-                                                                               u16 hvLogicalProcIndex)
-{
-       u64 retVal = HvCall2(HvCallCfgGetConfiguredBusUnitsForIntProc,lp,hvLogicalProcIndex);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-
-}
-//==================================================================
-static inline HvLpSharedPoolIndex      HvCallCfg_getSharedPoolIndex(HvLpIndex lp)
-{
-       HvLpSharedPoolIndex retVal =
-               HvCall1(HvCallCfgGetSharedPoolIndex,lp);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-
-}
-//==================================================================
-static inline u64      HvCallCfg_getSharedProcUnits(HvLpIndex lp,enum HvCallCfg_ReqQual qual)
-{
-       u64 retVal = HvCall2(HvCallCfgGetSharedProcUnits,lp,qual);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-
-}
-//==================================================================
-static inline u64      HvCallCfg_getNumProcsInSharedPool(HvLpSharedPoolIndex sPI)
-{
-       u16 retVal = HvCall1(HvCallCfgGetNumProcsInSharedPool,sPI);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-
-}
-//==================================================================
-static inline HvLpIndex        HvCallCfg_getHostingLpIndex(HvLpIndex lp)
-{
-       u64 retVal = HvCall1(HvCallCfgGetHostingLpIndex,lp);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
-
-}
-
-#endif /* _HVCALLCFG_H */
index 191ddce0c2c6528316587d2ffbc5929365c6b066..5d9a327d012202647aff029aa5cdccca86ec1fe4 100644 (file)
@@ -1,32 +1,28 @@
 /*
  * HvCallEvent.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
-
 /*
- *     This file contains the "hypervisor call" interface which is used to
- *     drive the hypervisor from the OS.
+ * This file contains the "hypervisor call" interface which is used to
+ * drive the hypervisor from the OS.
  */
 #ifndef _HVCALLEVENT_H
 #define _HVCALLEVENT_H
 
-/*
- * Standard Includes
- */
 #include <asm/iSeries/HvCallSc.h>
 #include <asm/iSeries/HvTypes.h>
 #include <asm/abs_addr.h>
@@ -71,7 +67,7 @@ typedef u64 HvLpDma_Rc;
 #define HvCallEventCloseLpEventPath                    HvCallEvent +  2
 #define HvCallEventDmaBufList                          HvCallEvent +  3
 #define HvCallEventDmaSingle                           HvCallEvent +  4
-#define HvCallEventDmaToSp                             HvCallEvent +  5 
+#define HvCallEventDmaToSp                             HvCallEvent +  5
 #define HvCallEventGetOverflowLpEvents                 HvCallEvent +  6
 #define HvCallEventGetSourceLpInstanceId               HvCallEvent +  7
 #define HvCallEventGetTargetLpInstanceId               HvCallEvent +  8
@@ -85,14 +81,12 @@ typedef u64 HvLpDma_Rc;
 
 static inline void HvCallEvent_getOverflowLpEvents(u8 queueIndex)
 {
-       HvCall1(HvCallEventGetOverflowLpEvents,queueIndex);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
+       HvCall1(HvCallEventGetOverflowLpEvents, queueIndex);
 }
 
 static inline void HvCallEvent_setInterLpQueueIndex(u8 queueIndex)
 {
-       HvCall1(HvCallEventSetInterLpQueueIndex,queueIndex);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
+       HvCall1(HvCallEventSetInterLpQueueIndex, queueIndex);
 }
 
 static inline void HvCallEvent_setLpEventStack(u8 queueIndex,
@@ -103,7 +97,6 @@ static inline void HvCallEvent_setLpEventStack(u8 queueIndex,
        abs_addr = virt_to_abs(eventStackAddr);
        HvCall3(HvCallEventSetLpEventStack, queueIndex, abs_addr,
                        eventStackSize);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
 }
 
 static inline void HvCallEvent_setLpEventQueueInterruptProc(u8 queueIndex,
@@ -111,22 +104,18 @@ static inline void HvCallEvent_setLpEventQueueInterruptProc(u8 queueIndex,
 {
        HvCall2(HvCallEventSetLpEventQueueInterruptProc, queueIndex,
                        lpLogicalProcIndex);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
 }
 
 static inline HvLpEvent_Rc HvCallEvent_signalLpEvent(struct HvLpEvent *event)
 {
        u64 abs_addr;
-       HvLpEvent_Rc retVal;
 
 #ifdef DEBUG_SENDEVENT
        printk("HvCallEvent_signalLpEvent: *event = %016lx\n ",
                        (unsigned long)event);
 #endif
        abs_addr = virt_to_abs(event);
-       retVal = (HvLpEvent_Rc)HvCall1(HvCallEventSignalLpEvent, abs_addr);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
+       return HvCall1(HvCallEventSignalLpEvent, abs_addr);
 }
 
 static inline HvLpEvent_Rc HvCallEvent_signalLpEventFast(HvLpIndex targetLp,
@@ -136,9 +125,7 @@ static inline HvLpEvent_Rc HvCallEvent_signalLpEventFast(HvLpIndex targetLp,
                u64 eventData1, u64 eventData2, u64 eventData3,
                u64 eventData4, u64 eventData5)
 {
-       HvLpEvent_Rc retVal;
-
-       // Pack the misc bits into a single Dword to pass to PLIC
+       /* Pack the misc bits into a single Dword to pass to PLIC */
        union {
                struct HvCallEvent_PackedParms  parms;
                u64             dword;
@@ -152,67 +139,49 @@ static inline HvLpEvent_Rc HvCallEvent_signalLpEventFast(HvLpIndex targetLp,
        packed.parms.xSourceInstId      = sourceInstanceId;
        packed.parms.xTargetInstId      = targetInstanceId;
 
-       retVal = (HvLpEvent_Rc)HvCall7(HvCallEventSignalLpEventParms,
-                       packed.dword, correlationToken, eventData1,eventData2,
-                       eventData3,eventData4, eventData5);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
+       return HvCall7(HvCallEventSignalLpEventParms, packed.dword,
+                       correlationToken, eventData1, eventData2,
+                       eventData3, eventData4, eventData5);
 }
 
 static inline HvLpEvent_Rc HvCallEvent_ackLpEvent(struct HvLpEvent *event)
 {
        u64 abs_addr;
-       HvLpEvent_Rc retVal;
 
        abs_addr = virt_to_abs(event);
-       retVal = (HvLpEvent_Rc)HvCall1(HvCallEventAckLpEvent, abs_addr);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
+       return HvCall1(HvCallEventAckLpEvent, abs_addr);
 }
 
 static inline HvLpEvent_Rc HvCallEvent_cancelLpEvent(struct HvLpEvent *event)
 {
        u64 abs_addr;
-       HvLpEvent_Rc retVal;
 
        abs_addr = virt_to_abs(event);
-       retVal = (HvLpEvent_Rc)HvCall1(HvCallEventCancelLpEvent, abs_addr);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
+       return HvCall1(HvCallEventCancelLpEvent, abs_addr);
 }
 
 static inline HvLpInstanceId HvCallEvent_getSourceLpInstanceId(
                HvLpIndex targetLp, HvLpEvent_Type type)
 {
-       HvLpInstanceId retVal;  
-
-       retVal = HvCall2(HvCallEventGetSourceLpInstanceId, targetLp, type);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
+       return HvCall2(HvCallEventGetSourceLpInstanceId, targetLp, type);
 }
 
 static inline HvLpInstanceId HvCallEvent_getTargetLpInstanceId(
                HvLpIndex targetLp, HvLpEvent_Type type)
 {
-       HvLpInstanceId retVal;  
-
-       retVal = HvCall2(HvCallEventGetTargetLpInstanceId, targetLp, type);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
+       return HvCall2(HvCallEventGetTargetLpInstanceId, targetLp, type);
 }
 
 static inline void HvCallEvent_openLpEventPath(HvLpIndex targetLp,
                HvLpEvent_Type type)
 {
        HvCall2(HvCallEventOpenLpEventPath, targetLp, type);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
 }
 
 static inline void HvCallEvent_closeLpEventPath(HvLpIndex targetLp,
                HvLpEvent_Type type)
 {
        HvCall2(HvCallEventCloseLpEventPath, targetLp, type);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
 }
 
 static inline HvLpDma_Rc HvCallEvent_dmaBufList(HvLpEvent_Type type,
@@ -224,8 +193,7 @@ static inline HvLpDma_Rc HvCallEvent_dmaBufList(HvLpEvent_Type type,
                /* Do these need to be converted to absolute addresses? */
                u64 localBufList, u64 remoteBufList, u32 transferLength)
 {
-       HvLpDma_Rc retVal;
-       // Pack the misc bits into a single Dword to pass to PLIC
+       /* Pack the misc bits into a single Dword to pass to PLIC */
        union {
                struct HvCallEvent_PackedDmaParms       parms;
                u64             dword;
@@ -241,11 +209,8 @@ static inline HvLpDma_Rc HvCallEvent_dmaBufList(HvLpEvent_Type type,
        packed.parms.xLocalInstId       = localInstanceId;
        packed.parms.xRemoteInstId      = remoteInstanceId;
 
-       retVal = (HvLpDma_Rc)HvCall4(HvCallEventDmaBufList,
-                       packed.dword, localBufList, remoteBufList,
-                       transferLength);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
+       return HvCall4(HvCallEventDmaBufList, packed.dword, localBufList,
+                       remoteBufList, transferLength);
 }
 
 static inline HvLpDma_Rc HvCallEvent_dmaSingle(HvLpEvent_Type type,
@@ -256,8 +221,7 @@ static inline HvLpDma_Rc HvCallEvent_dmaSingle(HvLpEvent_Type type,
                HvLpDma_AddressType remoteAddressType,
                u64 localAddrOrTce, u64 remoteAddrOrTce, u32 transferLength)
 {
-       HvLpDma_Rc retVal;
-       // Pack the misc bits into a single Dword to pass to PLIC
+       /* Pack the misc bits into a single Dword to pass to PLIC */
        union {
                struct HvCallEvent_PackedDmaParms       parms;
                u64             dword;
@@ -273,25 +237,17 @@ static inline HvLpDma_Rc HvCallEvent_dmaSingle(HvLpEvent_Type type,
        packed.parms.xLocalInstId       = localInstanceId;
        packed.parms.xRemoteInstId      = remoteInstanceId;
 
-       retVal = (HvLpDma_Rc)HvCall4(HvCallEventDmaSingle,
-                       packed.dword, localAddrOrTce, remoteAddrOrTce,
-                       transferLength);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
+       return (HvLpDma_Rc)HvCall4(HvCallEventDmaSingle, packed.dword,
+                       localAddrOrTce, remoteAddrOrTce, transferLength);
 }
 
-static inline HvLpDma_Rc HvCallEvent_dmaToSp(voidlocal, u32 remote,
+static inline HvLpDma_Rc HvCallEvent_dmaToSp(void *local, u32 remote,
                u32 length, HvLpDma_Direction dir)
 {
        u64 abs_addr;
-       HvLpDma_Rc retVal;
 
        abs_addr = virt_to_abs(local);
-       retVal = (HvLpDma_Rc)HvCall4(HvCallEventDmaToSp, abs_addr, remote,
-                       length, dir);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
+       return HvCall4(HvCallEventDmaToSp, abs_addr, remote, length, dir);
 }
 
-
 #endif /* _HVCALLEVENT_H */
index da769873d18b030920c785ac531cc48b730b1cdc..66f38222ff755baf9374947a161cefca067c3dbb 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * HvCallHpt.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 #ifndef _HVCALLHPT_H
 #define _HVCALLHPT_H
 
-//============================================================================
-//
-//     This file contains the "hypervisor call" interface which is used to
-//     drive the hypervisor from the OS.
-//
-//============================================================================
+/*
+ * This file contains the "hypervisor call" interface which is used to
+ * drive the hypervisor from the OS.
+ */
 
 #include <asm/iSeries/HvCallSc.h>
 #include <asm/iSeries/HvTypes.h>
 #include <asm/mmu.h>
 
-//-----------------------------------------------------------------------------
-// Constants
-//-----------------------------------------------------------------------------
-
 #define HvCallHptGetHptAddress         HvCallHpt +  0
 #define HvCallHptGetHptPages           HvCallHpt +  1
 #define HvCallHptSetPp                 HvCallHpt +  5
 #define HvCallHptInvalidateSetSwBitsGet HvCallHpt + 18
 
 
-//============================================================================
-static inline u64              HvCallHpt_getHptAddress(void)
+static inline u64 HvCallHpt_getHptAddress(void)
 {
-       u64 retval = HvCall0(HvCallHptGetHptAddress);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retval;
+       return HvCall0(HvCallHptGetHptAddress);
 }
-//============================================================================
-static inline u64              HvCallHpt_getHptPages(void)
-{      
-       u64 retval = HvCall0(HvCallHptGetHptPages);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retval;
+
+static inline u64 HvCallHpt_getHptPages(void)
+{
+       return HvCall0(HvCallHptGetHptPages);
 }
-//=============================================================================
-static inline void             HvCallHpt_setPp(u32 hpteIndex, u8 value)
+
+static inline void HvCallHpt_setPp(u32 hpteIndex, u8 value)
 {
-       HvCall2( HvCallHptSetPp, hpteIndex, value );
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
+       HvCall2(HvCallHptSetPp, hpteIndex, value);
 }
-//=============================================================================
-static inline void             HvCallHpt_setSwBits(u32 hpteIndex, u8 bitson, u8 bitsoff )
+
+static inline void HvCallHpt_setSwBits(u32 hpteIndex, u8 bitson, u8 bitsoff)
 {
-       HvCall3( HvCallHptSetSwBits, hpteIndex, bitson, bitsoff );
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
+       HvCall3(HvCallHptSetSwBits, hpteIndex, bitson, bitsoff);
 }
-//=============================================================================
-static inline void             HvCallHpt_invalidateNoSyncICache(u32 hpteIndex)
-                                               
+
+static inline void HvCallHpt_invalidateNoSyncICache(u32 hpteIndex)
 {
-       HvCall1( HvCallHptInvalidateNoSyncICache, hpteIndex );
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
+       HvCall1(HvCallHptInvalidateNoSyncICache, hpteIndex);
 }
-//=============================================================================
-static inline u64              HvCallHpt_invalidateSetSwBitsGet(u32 hpteIndex, u8 bitson, u8 bitsoff )
-                                               
+
+static inline u64 HvCallHpt_invalidateSetSwBitsGet(u32 hpteIndex, u8 bitson,
+               u8 bitsoff)
 {
        u64 compressedStatus;
-       compressedStatus = HvCall4( HvCallHptInvalidateSetSwBitsGet, hpteIndex, bitson, bitsoff, 1 );
-       HvCall1( HvCallHptInvalidateNoSyncICache, hpteIndex );
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
+
+       compressedStatus = HvCall4(HvCallHptInvalidateSetSwBitsGet,
+                       hpteIndex, bitson, bitsoff, 1);
+       HvCall1(HvCallHptInvalidateNoSyncICache, hpteIndex);
        return compressedStatus;
 }
-//=============================================================================
-static inline u64              HvCallHpt_findValid( HPTE *hpte, u64 vpn )
+
+static inline u64 HvCallHpt_findValid(HPTE *hpte, u64 vpn)
 {
-       u64 retIndex = HvCall3Ret16( HvCallHptFindValid, hpte, vpn, 0, 0 );
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retIndex;
+       return HvCall3Ret16(HvCallHptFindValid, hpte, vpn, 0, 0);
 }
-//=============================================================================
-static inline u64              HvCallHpt_findNextValid( HPTE *hpte, u32 hpteIndex, u8 bitson, u8 bitsoff )
+
+static inline u64 HvCallHpt_findNextValid(HPTE *hpte, u32 hpteIndex,
+               u8 bitson, u8 bitsoff)
 {
-       u64 retIndex = HvCall3Ret16( HvCallHptFindNextValid, hpte, hpteIndex, bitson, bitsoff );
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retIndex;
+       return HvCall3Ret16(HvCallHptFindNextValid, hpte, hpteIndex,
+                       bitson, bitsoff);
 }
-//=============================================================================
-static inline void             HvCallHpt_get( HPTE *hpte, u32 hpteIndex )
+
+static inline void HvCallHpt_get(HPTE *hpte, u32 hpteIndex)
 {
-       HvCall2Ret16( HvCallHptGet, hpte, hpteIndex, 0 );
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
+       HvCall2Ret16(HvCallHptGet, hpte, hpteIndex, 0);
 }
-//============================================================================
-static inline void             HvCallHpt_addValidate( u32 hpteIndex,
-                                                      u32 hBit,
-                                                      HPTE *hpte )
-                                               
+
+static inline void HvCallHpt_addValidate(u32 hpteIndex, u32 hBit, HPTE *hpte)
 {
-       HvCall4( HvCallHptAddValidate, hpteIndex,
-                hBit, (*((u64 *)hpte)), (*(((u64 *)hpte)+1)) );
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
+       HvCall4(HvCallHptAddValidate, hpteIndex, hBit, (*((u64 *)hpte)),
+                       (*(((u64 *)hpte)+1)));
 }
 
-
-//=============================================================================
-
 #endif /* _HVCALLHPT_H */
index 6887b619288eeb3fa062afc85cc2d365daae13d0..c8d675c40f5efcde0e41a95684ac79a630b328e2 100644 (file)
@@ -1,26 +1,26 @@
-/************************************************************************/
-/* Provides the Hypervisor PCI calls for iSeries Linux Parition.        */
-/* Copyright (C) 2001  <Wayne G Holm> <IBM Corporation>                 */
-/*                                                                      */
-/* This program is free software; you can redistribute it and/or modify */
-/* it under the terms of the GNU General Public License as published by */
-/* the Free Software Foundation; either version 2 of the License, or    */
-/* (at your option) any later version.                                  */
-/*                                                                      */
-/* This program is distributed in the hope that it will be useful,      */ 
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of       */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        */
-/* GNU General Public License for more details.                         */
-/*                                                                      */
-/* You should have received a copy of the GNU General Public License    */ 
-/* along with this program; if not, write to the:                       */
-/* Free Software Foundation, Inc.,                                      */ 
-/* 59 Temple Place, Suite 330,                                          */ 
-/* Boston, MA  02111-1307  USA                                          */
-/************************************************************************/
-/* Change Activity:                                                     */
-/*   Created, Jan 9, 2001                                               */
-/************************************************************************/
+/*
+ * Provides the Hypervisor PCI calls for iSeries Linux Parition.
+ * Copyright (C) 2001  <Wayne G Holm> <IBM Corporation>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the:
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330,
+ * Boston, MA  02111-1307  USA
+ *
+ * Change Activity:
+ *   Created, Jan 9, 2001
+ */
 
 #ifndef _HVCALLPCI_H
 #define _HVCALLPCI_H
@@ -34,8 +34,8 @@
  */
 struct HvCallPci_DsaAddr {
        u16             busNumber;              /* PHB index? */
-       u8              subBusNumber;           /* PCI bus number? */
-       u8              deviceId;               /* device and function? */
+       u8              subBusNumber;           /* PCI bus number? */
+       u8              deviceId;               /* device and function? */
        u8              barNumber;
        u8              reserved[3];
 };
@@ -52,34 +52,37 @@ struct HvCallPci_LoadReturn {
 
 enum HvCallPci_DeviceType {
        HvCallPci_NodeDevice    = 1,
-       HvCallPci_SpDevice      = 2,    
-       HvCallPci_IopDevice     = 3,    
-       HvCallPci_BridgeDevice  = 4,    
-       HvCallPci_MultiFunctionDevice = 5,      
-       HvCallPci_IoaDevice     = 6     
+       HvCallPci_SpDevice      = 2,
+       HvCallPci_IopDevice     = 3,
+       HvCallPci_BridgeDevice  = 4,
+       HvCallPci_MultiFunctionDevice = 5,
+       HvCallPci_IoaDevice     = 6
 };
 
 
 struct HvCallPci_DeviceInfo {
-       u32     deviceType;             // See DeviceType enum for values
+       u32     deviceType;             /* See DeviceType enum for values */
 };
-    
+
 struct HvCallPci_BusUnitInfo {
-       u32     sizeReturned;           // length of data returned
-       u32     deviceType;             // see DeviceType enum for values
+       u32     sizeReturned;           /* length of data returned */
+       u32     deviceType;             /* see DeviceType enum for values */
 };
 
 struct HvCallPci_BridgeInfo {
-       struct HvCallPci_BusUnitInfo busUnitInfo;  // Generic bus unit info
-       u8              subBusNumber;           // Bus number of secondary bus
-       u8              maxAgents;              // Max idsels on secondary bus
-        u8              maxSubBusNumber;        // Max Sub Bus
-       u8              logicalSlotNumber;      // Logical Slot Number for IOA 
+       struct HvCallPci_BusUnitInfo busUnitInfo;  /* Generic bus unit info */
+       u8              subBusNumber;   /* Bus number of secondary bus */
+       u8              maxAgents;      /* Max idsels on secondary bus */
+        u8              maxSubBusNumber; /* Max Sub Bus */
+       u8              logicalSlotNumber; /* Logical Slot Number for IOA */
 };
-    
 
-//  Maximum BusUnitInfo buffer size.  Provided for clients so they can allocate
-//  a buffer big enough for any type of bus unit.  Increase as needed.
+
+/*
+ * Maximum BusUnitInfo buffer size.  Provided for clients so
+ * they can allocate a buffer big enough for any type of bus
+ * unit.  Increase as needed.
+ */
 enum {HvCallPci_MaxBusUnitInfoSize = 128};
 
 struct HvCallPci_BarParms {
@@ -89,12 +92,12 @@ struct HvCallPci_BarParms {
        u64             protectStart;
        u64             protectEnd;
        u64             relocationOffset;
-       u64             pciAddress;             
+       u64             pciAddress;
        u64             reserved[3];
-};                                     
+};
 
 enum HvCallPci_VpdType {
-       HvCallPci_BusVpd                = 1,
+       HvCallPci_BusVpd        = 1,
        HvCallPci_BusAdapterVpd = 2
 };
 
@@ -123,15 +126,13 @@ enum HvCallPci_VpdType {
 #define HvCallPciUnmaskInterrupts      HvCallPci + 49
 #define HvCallPciGetBusUnitInfo                HvCallPci + 50
 
-//============================================================================
 static inline u64 HvCallPci_configLoad8(u16 busNumber, u8 subBusNumber,
-                                       u8 deviceId, u32 offset,
-                                       u8 *value)
+               u8 deviceId, u32 offset, u8 *value)
 {
        struct HvCallPci_DsaAddr dsa;
        struct HvCallPci_LoadReturn retVal;
 
-       *((u64*)&dsa) = 0;                              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumber;
        dsa.subBusNumber = subBusNumber;
@@ -139,21 +140,18 @@ static inline u64 HvCallPci_configLoad8(u16 busNumber, u8 subBusNumber,
 
        HvCall3Ret16(HvCallPciConfigLoad8, &retVal, *(u64 *)&dsa, offset, 0);
 
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
        *value = retVal.value;
 
        return retVal.rc;
 }
-//============================================================================
+
 static inline u64 HvCallPci_configLoad16(u16 busNumber, u8 subBusNumber,
-                                        u8 deviceId, u32 offset,
-                                        u16 *value)
+               u8 deviceId, u32 offset, u16 *value)
 {
        struct HvCallPci_DsaAddr dsa;
        struct HvCallPci_LoadReturn retVal;
 
-       *((u64*)&dsa) = 0;                              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumber;
        dsa.subBusNumber = subBusNumber;
@@ -161,21 +159,18 @@ static inline u64 HvCallPci_configLoad16(u16 busNumber, u8 subBusNumber,
 
        HvCall3Ret16(HvCallPciConfigLoad16, &retVal, *(u64 *)&dsa, offset, 0);
 
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
        *value = retVal.value;
 
        return retVal.rc;
 }
-//============================================================================
-static inline u64      HvCallPci_configLoad32(u16 busNumber, u8 subBusNumber,
-                                             u8 deviceId, u32 offset,
-                                             u32 *value)
+
+static inline u64 HvCallPci_configLoad32(u16 busNumber, u8 subBusNumber,
+               u8 deviceId, u32 offset, u32 *value)
 {
        struct HvCallPci_DsaAddr dsa;
        struct HvCallPci_LoadReturn retVal;
 
-       *((u64*)&dsa) = 0;                              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumber;
        dsa.subBusNumber = subBusNumber;
@@ -183,84 +178,61 @@ static inline u64 HvCallPci_configLoad32(u16 busNumber, u8 subBusNumber,
 
        HvCall3Ret16(HvCallPciConfigLoad32, &retVal, *(u64 *)&dsa, offset, 0);
 
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
        *value = retVal.value;
 
        return retVal.rc;
 }
-//============================================================================
-static inline u64      HvCallPci_configStore8(u16 busNumber, u8 subBusNumber,
-                                             u8 deviceId, u32 offset,
-                                             u8  value)
+
+static inline u64 HvCallPci_configStore8(u16 busNumber, u8 subBusNumber,
+               u8 deviceId, u32 offset, u8 value)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
-       *((u64*)&dsa) = 0;                              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumber;
        dsa.subBusNumber = subBusNumber;
        dsa.deviceId = deviceId;
 
-       retVal = HvCall4(HvCallPciConfigStore8, *(u64 *)&dsa, offset, value, 0);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall4(HvCallPciConfigStore8, *(u64 *)&dsa, offset, value, 0);
 }
-//============================================================================
-static inline u64      HvCallPci_configStore16(u16 busNumber, u8 subBusNumber,
-                                             u8 deviceId, u32 offset,
-                                             u16  value)
+
+static inline u64 HvCallPci_configStore16(u16 busNumber, u8 subBusNumber,
+               u8 deviceId, u32 offset, u16 value)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
-       *((u64*)&dsa) = 0;                              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumber;
        dsa.subBusNumber = subBusNumber;
        dsa.deviceId = deviceId;
 
-       retVal = HvCall4(HvCallPciConfigStore16, *(u64 *)&dsa, offset, value, 0);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall4(HvCallPciConfigStore16, *(u64 *)&dsa, offset, value, 0);
 }
-//============================================================================
-static inline u64      HvCallPci_configStore32(u16 busNumber, u8 subBusNumber,
-                                             u8 deviceId, u32 offset,
-                                             u32  value)
+
+static inline u64 HvCallPci_configStore32(u16 busNumber, u8 subBusNumber,
+               u8 deviceId, u32 offset, u32 value)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
-       *((u64*)&dsa) = 0;                              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumber;
        dsa.subBusNumber = subBusNumber;
        dsa.deviceId = deviceId;
 
-       retVal = HvCall4(HvCallPciConfigStore32, *(u64 *)&dsa, offset, value, 0);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall4(HvCallPciConfigStore32, *(u64 *)&dsa, offset, value, 0);
 }
-//============================================================================
-static inline u64      HvCallPci_barLoad8(u16  busNumberParm,
-                                          u8           subBusParm,
-                                          u8           deviceIdParm,
-                                          u8           barNumberParm,
-                                          u64          offsetParm,
-                                          u8*          valueParm)
+
+static inline u64 HvCallPci_barLoad8(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
+               u8 *valueParm)
 {
        struct HvCallPci_DsaAddr dsa;
        struct HvCallPci_LoadReturn retVal;
 
-       *((u64*)&dsa) = 0;                              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumberParm;
        dsa.subBusNumber = subBusParm;
@@ -269,24 +241,19 @@ static inline u64 HvCallPci_barLoad8(u16  busNumberParm,
 
        HvCall3Ret16(HvCallPciBarLoad8, &retVal, *(u64 *)&dsa, offsetParm, 0);
 
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
        *valueParm = retVal.value;
 
        return retVal.rc;
 }
-//============================================================================
-static inline u64      HvCallPci_barLoad16(u16 busNumberParm,
-                                          u8           subBusParm,
-                                          u8           deviceIdParm,
-                                          u8           barNumberParm,
-                                          u64          offsetParm,
-                                          u16*         valueParm)
+
+static inline u64 HvCallPci_barLoad16(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
+               u16 *valueParm)
 {
        struct HvCallPci_DsaAddr dsa;
        struct HvCallPci_LoadReturn retVal;
 
-       *((u64*)&dsa) = 0;                              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumberParm;
        dsa.subBusNumber = subBusParm;
@@ -295,24 +262,19 @@ static inline u64 HvCallPci_barLoad16(u16 busNumberParm,
 
        HvCall3Ret16(HvCallPciBarLoad16, &retVal, *(u64 *)&dsa, offsetParm, 0);
 
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
        *valueParm = retVal.value;
 
        return retVal.rc;
 }
-//============================================================================
-static inline u64      HvCallPci_barLoad32(u16 busNumberParm,
-                                          u8           subBusParm,
-                                          u8           deviceIdParm,
-                                          u8           barNumberParm,
-                                          u64          offsetParm,
-                                          u32*         valueParm)
+
+static inline u64 HvCallPci_barLoad32(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
+               u32 *valueParm)
 {
        struct HvCallPci_DsaAddr dsa;
        struct HvCallPci_LoadReturn retVal;
 
-       *((u64*)&dsa) = 0;                              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumberParm;
        dsa.subBusNumber = subBusParm;
@@ -321,24 +283,19 @@ static inline u64 HvCallPci_barLoad32(u16 busNumberParm,
 
        HvCall3Ret16(HvCallPciBarLoad32, &retVal, *(u64 *)&dsa, offsetParm, 0);
 
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
        *valueParm = retVal.value;
 
        return retVal.rc;
 }
-//============================================================================
-static inline u64      HvCallPci_barLoad64(u16 busNumberParm,
-                                          u8           subBusParm,
-                                          u8           deviceIdParm,
-                                          u8           barNumberParm,
-                                          u64          offsetParm,
-                                          u64*         valueParm)
+
+static inline u64 HvCallPci_barLoad64(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
+               u64 *valueParm)
 {
        struct HvCallPci_DsaAddr dsa;
        struct HvCallPci_LoadReturn retVal;
 
-       *((u64*)&dsa) = 0;                              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumberParm;
        dsa.subBusNumber = subBusParm;
@@ -347,112 +304,81 @@ static inline u64        HvCallPci_barLoad64(u16 busNumberParm,
 
        HvCall3Ret16(HvCallPciBarLoad64, &retVal, *(u64 *)&dsa, offsetParm, 0);
 
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
        *valueParm = retVal.value;
 
        return retVal.rc;
 }
-//============================================================================
-static inline u64      HvCallPci_barStore8(u16 busNumberParm,
-                                           u8          subBusParm,
-                                           u8          deviceIdParm,
-                                           u8          barNumberParm,
-                                           u64         offsetParm,
-                                           u8          valueParm)
+
+static inline u64 HvCallPci_barStore8(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
+               u8 valueParm)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
        *((u64*)&dsa) = 0;
-                               
+
        dsa.busNumber = busNumberParm;
        dsa.subBusNumber = subBusParm;
        dsa.deviceId = deviceIdParm;
        dsa.barNumber = barNumberParm;
 
-       retVal = HvCall4(HvCallPciBarStore8, *(u64 *)&dsa, offsetParm, valueParm, 0);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall4(HvCallPciBarStore8, *(u64 *)&dsa, offsetParm,
+                       valueParm, 0);
 }
-//============================================================================
-static inline u64      HvCallPci_barStore16(u16        busNumberParm,
-                                            u8         subBusParm,
-                                            u8         deviceIdParm,
-                                            u8         barNumberParm,
-                                            u64        offsetParm,
-                                            u16        valueParm)
+
+static inline u64 HvCallPci_barStore16(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
+               u16 valueParm)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
        *((u64*)&dsa) = 0;
-                               
+
        dsa.busNumber = busNumberParm;
        dsa.subBusNumber = subBusParm;
        dsa.deviceId = deviceIdParm;
        dsa.barNumber = barNumberParm;
 
-       retVal = HvCall4(HvCallPciBarStore16, *(u64 *)&dsa, offsetParm, valueParm, 0);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall4(HvCallPciBarStore16, *(u64 *)&dsa, offsetParm,
+                       valueParm, 0);
 }
-//============================================================================
-static inline u64      HvCallPci_barStore32(u16        busNumberParm,
-                                            u8         subBusParm,
-                                            u8         deviceIdParm,
-                                            u8         barNumberParm,
-                                            u64        offsetParm,
-                                            u32        valueParm)
+
+static inline u64 HvCallPci_barStore32(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
+               u32 valueParm)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
        *((u64*)&dsa) = 0;
-                               
+
        dsa.busNumber = busNumberParm;
        dsa.subBusNumber = subBusParm;
        dsa.deviceId = deviceIdParm;
        dsa.barNumber = barNumberParm;
 
-       retVal = HvCall4(HvCallPciBarStore32, *(u64 *)&dsa, offsetParm, valueParm, 0);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall4(HvCallPciBarStore32, *(u64 *)&dsa, offsetParm,
+                       valueParm, 0);
 }
-//============================================================================
-static inline u64      HvCallPci_barStore64(u16        busNumberParm,
-                                            u8         subBusParm,
-                                            u8         deviceIdParm,
-                                            u8         barNumberParm,
-                                            u64        offsetParm,
-                                            u64        valueParm)
+
+static inline u64 HvCallPci_barStore64(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
+               u64 valueParm)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
        *((u64*)&dsa) = 0;
-                               
+
        dsa.busNumber = busNumberParm;
        dsa.subBusNumber = subBusParm;
        dsa.deviceId = deviceIdParm;
        dsa.barNumber = barNumberParm;
 
-       retVal = HvCall4(HvCallPciBarStore64, *(u64 *)&dsa, offsetParm, valueParm, 0);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall4(HvCallPciBarStore64, *(u64 *)&dsa, offsetParm,
+                       valueParm, 0);
 }
-//============================================================================
-static inline u64      HvCallPci_eoi(u16       busNumberParm,
-                                     u8        subBusParm,  
-                                     u8        deviceIdParm)
+
+static inline u64 HvCallPci_eoi(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm)
 {
        struct HvCallPci_DsaAddr dsa;
        struct HvCallPci_LoadReturn retVal;
@@ -465,20 +391,13 @@ static inline u64 HvCallPci_eoi(u16       busNumberParm,
 
        HvCall1Ret16(HvCallPciEoi, &retVal, *(u64*)&dsa);
 
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
        return retVal.rc;
 }
-//============================================================================
-static inline u64      HvCallPci_getBarParms(u16       busNumberParm,
-                                             u8        subBusParm,  
-                                             u8        deviceIdParm,
-                                             u8        barNumberParm,
-                                             u64       parms,
-                                             u32       sizeofParms)
+
+static inline u64 HvCallPci_getBarParms(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u8 barNumberParm, u64 parms, u32 sizeofParms)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
        *((u64*)&dsa) = 0;
 
@@ -487,62 +406,41 @@ static inline u64 HvCallPci_getBarParms(u16       busNumberParm,
        dsa.deviceId = deviceIdParm;
        dsa.barNumber = barNumberParm;
 
-       retVal = HvCall3(HvCallPciGetBarParms, *(u64*)&dsa, parms, sizeofParms);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall3(HvCallPciGetBarParms, *(u64*)&dsa, parms, sizeofParms);
 }
-//============================================================================
-static inline u64      HvCallPci_maskFisr(u16  busNumberParm,
-                                          u8   subBusParm,  
-                                          u8   deviceIdParm,
-                                          u64  fisrMask)
+
+static inline u64 HvCallPci_maskFisr(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u64 fisrMask)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
-       *((u64*)&dsa) = 0;              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumberParm;
        dsa.subBusNumber = subBusParm;
        dsa.deviceId = deviceIdParm;
 
-       retVal = HvCall2(HvCallPciMaskFisr, *(u64*)&dsa, fisrMask);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall2(HvCallPciMaskFisr, *(u64*)&dsa, fisrMask);
 }
-//============================================================================
-static inline u64      HvCallPci_unmaskFisr(u16        busNumberParm,
-                                            u8         subBusParm,  
-                                            u8         deviceIdParm,
-                                            u64        fisrMask)
+
+static inline u64 HvCallPci_unmaskFisr(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u64 fisrMask)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
-       *((u64*)&dsa) = 0;              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumberParm;
        dsa.subBusNumber = subBusParm;
        dsa.deviceId = deviceIdParm;
 
-       retVal = HvCall2(HvCallPciUnmaskFisr, *(u64*)&dsa, fisrMask);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall2(HvCallPciUnmaskFisr, *(u64*)&dsa, fisrMask);
 }
-//============================================================================
-static inline u64      HvCallPci_setSlotReset(u16              busNumberParm,
-                                              u8               subBusParm,
-                                              u8               deviceIdParm,
-                                              u64              onNotOff)
+
+static inline u64 HvCallPci_setSlotReset(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u64 onNotOff)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
        *((u64*)&dsa) = 0;
 
@@ -550,21 +448,13 @@ static inline u64 HvCallPci_setSlotReset(u16              busNumberParm,
        dsa.subBusNumber = subBusParm;
        dsa.deviceId = deviceIdParm;
 
-       retVal = HvCall2(HvCallPciSetSlotReset, *(u64*)&dsa, onNotOff);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall2(HvCallPciSetSlotReset, *(u64*)&dsa, onNotOff);
 }
-//============================================================================
-static inline u64      HvCallPci_getDeviceInfo(u16     busNumberParm,
-                                               u8      subBusParm,  
-                                               u8      deviceNumberParm,
-                                               u64     parms,
-                                               u32     sizeofParms)
+
+static inline u64 HvCallPci_getDeviceInfo(u16 busNumberParm, u8 subBusParm,
+               u8 deviceNumberParm, u64 parms, u32 sizeofParms)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
        *((u64*)&dsa) = 0;
 
@@ -572,102 +462,72 @@ static inline u64        HvCallPci_getDeviceInfo(u16     busNumberParm,
        dsa.subBusNumber = subBusParm;
        dsa.deviceId = deviceNumberParm << 4;
 
-       retVal = HvCall3(HvCallPciGetDeviceInfo, *(u64*)&dsa, parms, sizeofParms);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall3(HvCallPciGetDeviceInfo, *(u64*)&dsa, parms, sizeofParms);
 }
-//============================================================================
-static inline u64      HvCallPci_maskInterrupts(u16    busNumberParm,
-                                                u8     subBusParm,  
-                                                u8     deviceIdParm,
-                                                u64    interruptMask)
+
+static inline u64 HvCallPci_maskInterrupts(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u64 interruptMask)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
-       *((u64*)&dsa) = 0;              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumberParm;
        dsa.subBusNumber = subBusParm;
        dsa.deviceId = deviceIdParm;
 
-       retVal = HvCall2(HvCallPciMaskInterrupts, *(u64*)&dsa, interruptMask);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall2(HvCallPciMaskInterrupts, *(u64*)&dsa, interruptMask);
 }
-//============================================================================
-static inline u64      HvCallPci_unmaskInterrupts(u16  busNumberParm,
-                                                u8             subBusParm,  
-                                                u8             deviceIdParm,
-                                                u64            interruptMask)
+
+static inline u64 HvCallPci_unmaskInterrupts(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u64 interruptMask)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
-       *((u64*)&dsa) = 0;              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumberParm;
        dsa.subBusNumber = subBusParm;
        dsa.deviceId = deviceIdParm;
 
-       retVal = HvCall2(HvCallPciUnmaskInterrupts, *(u64*)&dsa, interruptMask);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall2(HvCallPciUnmaskInterrupts, *(u64*)&dsa, interruptMask);
 }
-//============================================================================
 
-static inline u64      HvCallPci_getBusUnitInfo(u16            busNumberParm,
-                                                u8             subBusParm,  
-                                                u8             deviceIdParm,
-                                                u64            parms,
-                                                u32            sizeofParms)
+static inline u64 HvCallPci_getBusUnitInfo(u16 busNumberParm, u8 subBusParm,
+               u8 deviceIdParm, u64 parms, u32 sizeofParms)
 {
        struct HvCallPci_DsaAddr dsa;
-       u64 retVal;
 
-       *((u64*)&dsa) = 0;              
+       *((u64*)&dsa) = 0;
 
        dsa.busNumber = busNumberParm;
        dsa.subBusNumber = subBusParm;
        dsa.deviceId = deviceIdParm;
 
-       retVal = HvCall3(HvCallPciGetBusUnitInfo, *(u64*)&dsa, parms, sizeofParms);
-
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-
-       return retVal;
+       return HvCall3(HvCallPciGetBusUnitInfo, *(u64*)&dsa, parms,
+                       sizeofParms);
 }
-//============================================================================
 
-static inline int HvCallPci_getBusVpd(u16 busNumParm, u64 destParm, u16 sizeParm)
+static inline int HvCallPci_getBusVpd(u16 busNumParm, u64 destParm,
+               u16 sizeParm)
 {
-       int xRetSize;
-       u64 xRc = HvCall4(HvCallPciGetCardVpd, busNumParm, destParm, sizeParm, HvCallPci_BusVpd);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
+       u64 xRc = HvCall4(HvCallPciGetCardVpd, busNumParm, destParm,
+                       sizeParm, HvCallPci_BusVpd);
        if (xRc == -1)
-               xRetSize = -1;
+               return -1;
        else
-               xRetSize = xRc & 0xFFFF;
-       return xRetSize;
+               return xRc & 0xFFFF;
 }
-//============================================================================
 
-static inline int HvCallPci_getBusAdapterVpd(u16 busNumParm, u64 destParm, u16 sizeParm)
+static inline int HvCallPci_getBusAdapterVpd(u16 busNumParm, u64 destParm,
+               u16 sizeParm)
 {
-       int xRetSize;
-       u64 xRc = HvCall4(HvCallPciGetCardVpd, busNumParm, destParm, sizeParm, HvCallPci_BusAdapterVpd);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
+       u64 xRc = HvCall4(HvCallPciGetCardVpd, busNumParm, destParm,
+                       sizeParm, HvCallPci_BusAdapterVpd);
        if (xRc == -1)
-               xRetSize = -1;
+               return -1;
        else
-               xRetSize = xRc & 0xFFFF;
-       return xRetSize;
+               return xRc & 0xFFFF;
 }
-//============================================================================
+
 #endif /* _HVCALLPCI_H */
index eea258447642dce41907f13957749ab6f4b0102a..a62cef3822f9be9f0224ad5f983a4c10ccbd38e8 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * HvCallSc.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
@@ -19,7 +19,7 @@
 #ifndef _HVCALLSC_H
 #define _HVCALLSC_H
 
-#include <asm/iSeries/HvTypes.h>
+#include <linux/types.h>
 
 #define HvCallBase             0x8000000000000000ul
 #define HvCallCc               0x8001000000000000ul
 #define HvCallSm               0x8007000000000000ul
 #define HvCallXm               0x8009000000000000ul
 
-u64 HvCall0( u64 );
-u64 HvCall1( u64, u64 );
-u64 HvCall2( u64, u64, u64 );
-u64 HvCall3( u64, u64, u64, u64 );
-u64 HvCall4( u64, u64, u64, u64, u64 );
-u64 HvCall5( u64, u64, u64, u64, u64, u64 );
-u64 HvCall6( u64, u64, u64, u64, u64, u64, u64 );
-u64 HvCall7( u64, u64, u64, u64, u64, u64, u64, u64 );
+extern u64 HvCall0(u64);
+extern u64 HvCall1(u64, u64);
+extern u64 HvCall2(u64, u64, u64);
+extern u64 HvCall3(u64, u64, u64, u64);
+extern u64 HvCall4(u64, u64, u64, u64, u64);
+extern u64 HvCall5(u64, u64, u64, u64, u64, u64);
+extern u64 HvCall6(u64, u64, u64, u64, u64, u64, u64);
+extern u64 HvCall7(u64, u64, u64, u64, u64, u64, u64, u64);
 
-u64 HvCall0Ret16( u64, void * );
-u64 HvCall1Ret16( u64, void *, u64 );
-u64 HvCall2Ret16( u64, void *, u64, u64 );
-u64 HvCall3Ret16( u64, void *, u64, u64, u64 );
-u64 HvCall4Ret16( u64, void *, u64, u64, u64, u64 );
-u64 HvCall5Ret16( u64, void *, u64, u64, u64, u64, u64 );
-u64 HvCall6Ret16( u64, void *, u64, u64, u64, u64, u64, u64 );
-u64 HvCall7Ret16( u64, void *, u64, u64 ,u64 ,u64 ,u64 ,u64 ,u64 );
+extern u64 HvCall0Ret16(u64, void *);
+extern u64 HvCall1Ret16(u64, void *, u64);
+extern u64 HvCall2Ret16(u64, void *, u64, u64);
+extern u64 HvCall3Ret16(u64, void *, u64, u64, u64);
+extern u64 HvCall4Ret16(u64, void *, u64, u64, u64, u64);
+extern u64 HvCall5Ret16(u64, void *, u64, u64, u64, u64, u64);
+extern u64 HvCall6Ret16(u64, void *, u64, u64, u64, u64, u64, u64);
+extern u64 HvCall7Ret16(u64, void *, u64, u64 ,u64 ,u64 ,u64 ,u64 ,u64);
 
 #endif /* _HVCALLSC_H */
index 9050c94a529d8196b4719b0f6466629eda5a5779..8a3dbb071a4397962948c8ac0778a370c4d99b6f 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * HvCallSm.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 #ifndef _HVCALLSM_H
 #define _HVCALLSM_H
 
-//============================================================================
-//
-//     This file contains the "hypervisor call" interface which is used to
-//     drive the hypervisor from the OS.
-//
-//============================================================================
+/*
+ * This file contains the "hypervisor call" interface which is used to
+ * drive the hypervisor from the OS.
+ */
 
-//-------------------------------------------------------------------
-// Standard Includes
-//-------------------------------------------------------------------
 #include <asm/iSeries/HvCallSc.h>
 #include <asm/iSeries/HvTypes.h>
 
-//-----------------------------------------------------------------------------
-// Constants
-//-----------------------------------------------------------------------------
-
 #define HvCallSmGet64BitsOfAccessMap   HvCallSm  + 11
 
-
-//============================================================================
-static inline u64              HvCallSm_get64BitsOfAccessMap(
-                                       HvLpIndex lpIndex, u64 indexIntoBitMap )
+static inline u64 HvCallSm_get64BitsOfAccessMap(HvLpIndex lpIndex,
+               u64 indexIntoBitMap)
 {
-       u64 retval = HvCall2(HvCallSmGet64BitsOfAccessMap, lpIndex,
-                            indexIntoBitMap );
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retval;
+       return HvCall2(HvCallSmGet64BitsOfAccessMap, lpIndex, indexIntoBitMap);
 }
-//============================================================================
+
 #endif /* _HVCALLSM_H */
index bfb898f4db8d0e3b91a8da5c7a96950a88ca6609..8b9ba608daafe7cf28578c50f073a9eec1f82540 100644 (file)
@@ -1,30 +1,13 @@
-//============================================================================
-//                                                      Header File Id
-// Name______________: HvCallXm.H
-//
-// Description_______:
-//
-//     This file contains the "hypervisor call" interface which is used to
-//     drive the hypervisor from SLIC.
-//
-//============================================================================
+/*
+ * This file contains the "hypervisor call" interface which is used to
+ * drive the hypervisor from SLIC.
+ */
 #ifndef _HVCALLXM_H
 #define _HVCALLXM_H
 
-//-------------------------------------------------------------------
-// Forward declarations 
-//-------------------------------------------------------------------
-
-//-------------------------------------------------------------------
-// Standard Includes
-//-------------------------------------------------------------------
 #include <asm/iSeries/HvCallSc.h>
 #include <asm/iSeries/HvTypes.h>
 
-//-----------------------------------------------------------------------------
-// Constants
-//-----------------------------------------------------------------------------
-
 #define HvCallXmGetTceTableParms       HvCallXm +  0
 #define HvCallXmTestBus                        HvCallXm +  1
 #define HvCallXmConnectBusUnit         HvCallXm +  2
 #define HvCallXmSetTce                 HvCallXm + 11
 #define HvCallXmSetTces                        HvCallXm + 13
 
+/*
+ * Structure passed to HvCallXm_getTceTableParms
+ */
+struct iommu_table_cb {
+       unsigned long   itc_busno;      /* Bus number for this tce table */
+       unsigned long   itc_start;      /* Will be NULL for secondary */
+       unsigned long   itc_totalsize;  /* Size (in pages) of whole table */
+       unsigned long   itc_offset;     /* Index into real tce table of the
+                                          start of our section */
+       unsigned long   itc_size;       /* Size (in pages) of our section */
+       unsigned long   itc_index;      /* Index of this tce table */
+       unsigned short  itc_maxtables;  /* Max num of tables for partition */
+       unsigned char   itc_virtbus;    /* Flag to indicate virtual bus */
+       unsigned char   itc_slotno;     /* IOA Tce Slot Index */
+       unsigned char   itc_rsvd[4];
+};
 
-
-//============================================================================
-static inline void             HvCallXm_getTceTableParms(u64 cb)
+static inline void HvCallXm_getTceTableParms(u64 cb)
 {
        HvCall1(HvCallXmGetTceTableParms, cb);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
 }
-//============================================================================
-static inline u64              HvCallXm_setTce(u64 tceTableToken, u64 tceOffset, u64 tce)
-{      
-       u64 retval = HvCall3(HvCallXmSetTce, tceTableToken, tceOffset, tce );
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retval;
-}
-//============================================================================
-static inline u64              HvCallXm_setTces(u64 tceTableToken, u64 tceOffset, u64 numTces, u64 tce1, u64 tce2, u64 tce3, u64 tce4)
-{      
-       u64 retval = HvCall7(HvCallXmSetTces, tceTableToken, tceOffset, numTces,
-                            tce1, tce2, tce3, tce4 );
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retval;
+
+static inline u64 HvCallXm_setTce(u64 tceTableToken, u64 tceOffset, u64 tce)
+{
+       return HvCall3(HvCallXmSetTce, tceTableToken, tceOffset, tce);
 }
-//=============================================================================
-static inline u64      HvCallXm_testBus(u16 busNumber)
+
+static inline u64 HvCallXm_setTces(u64 tceTableToken, u64 tceOffset,
+               u64 numTces, u64 tce1, u64 tce2, u64 tce3, u64 tce4)
 {
-       u64 retVal = HvCall1(HvCallXmTestBus, busNumber);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
+       return HvCall7(HvCallXmSetTces, tceTableToken, tceOffset, numTces,
+                            tce1, tce2, tce3, tce4);
 }
-//=====================================================================================
-static inline u64      HvCallXm_testBusUnit(u16 busNumber, u8 subBusNumber, u8 deviceId)
+
+static inline u64 HvCallXm_testBus(u16 busNumber)
 {
-       u64 busUnitNumber = (subBusNumber << 8) | deviceId;
-       u64 retVal = HvCall2(HvCallXmTestBusUnit, busNumber, busUnitNumber);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
+       return HvCall1(HvCallXmTestBus, busNumber);
 }
-//=====================================================================================
-static inline u64      HvCallXm_connectBusUnit(u16 busNumber, u8 subBusNumber, u8 deviceId,
-                                               u64 interruptToken)
+
+static inline u64 HvCallXm_testBusUnit(u16 busNumber, u8 subBusNumber,
+               u8 deviceId)
 {
-       u64 busUnitNumber = (subBusNumber << 8) | deviceId;
-       u64 queueIndex = 0; // HvLpConfig::mapDsaToQueueIndex(HvLpDSA(busNumber, xBoard, xCard));  
+       return HvCall2(HvCallXmTestBusUnit, busNumber,
+                       (subBusNumber << 8) | deviceId);
+}
 
-       u64 retVal = HvCall5(HvCallXmConnectBusUnit, busNumber, busUnitNumber,
-                            interruptToken, 0, queueIndex);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
+static inline u64 HvCallXm_connectBusUnit(u16 busNumber, u8 subBusNumber,
+               u8 deviceId, u64 interruptToken)
+{
+       return HvCall5(HvCallXmConnectBusUnit, busNumber,
+                       (subBusNumber << 8) | deviceId, interruptToken, 0,
+                       0 /* HvLpConfig::mapDsaToQueueIndex(HvLpDSA(busNumber, xBoard, xCard)) */);
 }
-//=====================================================================================
-static inline u64      HvCallXm_loadTod(void)
+
+static inline u64 HvCallXm_loadTod(void)
 {
-       u64 retVal = HvCall0(HvCallXmLoadTod);
-       // getPaca()->adjustHmtForNoOfSpinLocksHeld();
-       return retVal;
+       return HvCall0(HvCallXmLoadTod);
 }
-//=====================================================================================
 
 #endif /* _HVCALLXM_H */
index bdbd70f42c9dfbce3781404def899e743cc15ec1..f1cf1e70ca3c2de386eb9ce870fca368065aad52 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * HvLpConfig.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 #ifndef _HVLPCONFIG_H
 #define _HVLPCONFIG_H
 
-//===========================================================================
-//
-//      This file contains the interface to the LPAR configuration data
-//  to determine which resources should be allocated to each partition.
-//
-//===========================================================================
+/*
+ * This file contains the interface to the LPAR configuration data
+ * to determine which resources should be allocated to each partition.
+ */
 
-#include <asm/iSeries/HvCallCfg.h>
+#include <asm/iSeries/HvCallSc.h>
 #include <asm/iSeries/HvTypes.h>
 #include <asm/iSeries/ItLpNaca.h>
-#include <asm/iSeries/LparData.h>
 
-//-------------------------------------------------------------------
-// Constants
-//-------------------------------------------------------------------
+enum {
+       HvCallCfg_Cur   = 0,
+       HvCallCfg_Init  = 1,
+       HvCallCfg_Max   = 2,
+       HvCallCfg_Min   = 3
+};
+
+#define HvCallCfgGetSystemPhysicalProcessors           HvCallCfg +  6
+#define HvCallCfgGetPhysicalProcessors                 HvCallCfg +  7
+#define HvCallCfgGetMsChunks                           HvCallCfg +  9
+#define HvCallCfgGetSharedPoolIndex                    HvCallCfg + 20
+#define HvCallCfgGetSharedProcUnits                    HvCallCfg + 21
+#define HvCallCfgGetNumProcsInSharedPool               HvCallCfg + 22
+#define HvCallCfgGetVirtualLanIndexMap                 HvCallCfg + 30
+#define HvCallCfgGetHostingLpIndex                     HvCallCfg + 32
 
 extern HvLpIndex HvLpConfig_getLpIndex_outline(void);
 
-//===================================================================
 static inline HvLpIndex        HvLpConfig_getLpIndex(void)
 {
        return itLpNaca.xLpIndex;
 }
-//===================================================================
+
 static inline HvLpIndex        HvLpConfig_getPrimaryLpIndex(void)
 {
        return itLpNaca.xPrimaryLpIndex;
 }
-//=================================================================
-static inline HvLpIndex        HvLpConfig_getLps(void)
-{
-       return HvCallCfg_getLps();
-}
-//=================================================================
-static inline HvLpIndexMap     HvLpConfig_getActiveLpMap(void)
-{
-       return HvCallCfg_getActiveLpMap();
-}
-//=================================================================
-static inline u64              HvLpConfig_getSystemMsMegs(void)
-{
-       return HvCallCfg_getSystemMsChunks() / HVCHUNKSPERMEG;
-}
-//=================================================================
-static inline u64              HvLpConfig_getSystemMsChunks(void)
-{
-       return HvCallCfg_getSystemMsChunks();
-}
-//=================================================================
-static inline u64              HvLpConfig_getSystemMsPages(void)
-{
-       return HvCallCfg_getSystemMsChunks() * HVPAGESPERCHUNK;
-}
-//================================================================
-static inline u64              HvLpConfig_getMsMegs(void)
-{
-       return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Cur) / HVCHUNKSPERMEG;
-}
-//================================================================
-static inline u64              HvLpConfig_getMsChunks(void)
-{
-       return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Cur);
-}
-//================================================================
-static inline u64              HvLpConfig_getMsPages(void)
-{
-       return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Cur) * HVPAGESPERCHUNK;
-}
-//================================================================
-static inline u64              HvLpConfig_getMinMsMegs(void)
-{
-       return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Min) / HVCHUNKSPERMEG;
-}
-//================================================================
-static inline u64              HvLpConfig_getMinMsChunks(void)
-{
-       return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Min);
-}
-//================================================================
-static inline u64              HvLpConfig_getMinMsPages(void)
-{
-       return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Min) * HVPAGESPERCHUNK;
-}
-//================================================================
-static inline u64              HvLpConfig_getMinRuntimeMsMegs(void)
-{
-       return HvCallCfg_getMinRuntimeMsChunks(HvLpConfig_getLpIndex()) / HVCHUNKSPERMEG;
-}
-//===============================================================
-static inline u64              HvLpConfig_getMinRuntimeMsChunks(void)
-{
-       return HvCallCfg_getMinRuntimeMsChunks(HvLpConfig_getLpIndex());
-}
-//===============================================================
-static inline u64              HvLpConfig_getMinRuntimeMsPages(void)
-{
-       return HvCallCfg_getMinRuntimeMsChunks(HvLpConfig_getLpIndex()) * HVPAGESPERCHUNK;
-}
-//===============================================================
-static inline u64              HvLpConfig_getMaxMsMegs(void)
-{
-       return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Max) / HVCHUNKSPERMEG;
-}
-//===============================================================
-static inline u64              HvLpConfig_getMaxMsChunks(void)
-{
-       return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Max);
-}
-//===============================================================
-static inline u64              HvLpConfig_getMaxMsPages(void)
-{
-       return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Max) * HVPAGESPERCHUNK;
-}
-//===============================================================
-static inline u64              HvLpConfig_getInitMsMegs(void)
-{
-       return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Init) / HVCHUNKSPERMEG;
-}
-//===============================================================
-static inline u64              HvLpConfig_getInitMsChunks(void)
-{
-       return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Init);
-}
-//===============================================================
-static inline u64              HvLpConfig_getInitMsPages(void)
-{    return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Init) * HVPAGESPERCHUNK;
-}
-//===============================================================
-static inline u64              HvLpConfig_getSystemPhysicalProcessors(void)
-{
-       return HvCallCfg_getSystemPhysicalProcessors();
-}
-//===============================================================
-static inline u64              HvLpConfig_getSystemLogicalProcessors(void)
-{
-       return HvCallCfg_getSystemPhysicalProcessors() * (/*getPaca()->getSecondaryThreadCount() +*/ 1);
-}
-//===============================================================
-static inline u64              HvLpConfig_getNumProcsInSharedPool(HvLpSharedPoolIndex sPI)
-{
-       return HvCallCfg_getNumProcsInSharedPool(sPI);
-}
-//===============================================================
-static inline u64              HvLpConfig_getPhysicalProcessors(void)
-{
-       return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Cur);
-}
-//===============================================================
-static inline u64              HvLpConfig_getLogicalProcessors(void)
-{
-       return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Cur) * (/*getPaca()->getSecondaryThreadCount() +*/ 1);
-}
-//===============================================================
-static inline HvLpSharedPoolIndex      HvLpConfig_getSharedPoolIndex(void)
-{
-       return HvCallCfg_getSharedPoolIndex(HvLpConfig_getLpIndex());
-}
-//===============================================================
-static inline u64              HvLpConfig_getSharedProcUnits(void)
-{
-       return HvCallCfg_getSharedProcUnits(HvLpConfig_getLpIndex(),HvCallCfg_Cur);
-}
-//===============================================================
-static inline u64              HvLpConfig_getMinSharedProcUnits(void)
-{
-       return HvCallCfg_getSharedProcUnits(HvLpConfig_getLpIndex(),HvCallCfg_Min);
-}
-//===============================================================
-static inline u64              HvLpConfig_getMaxSharedProcUnits(void)
-{
-       return HvCallCfg_getSharedProcUnits(HvLpConfig_getLpIndex(),HvCallCfg_Max);
-}
-//===============================================================
-static inline u64              HvLpConfig_getMinPhysicalProcessors(void)
-{
-       return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Min);
-}
-//===============================================================
-static inline u64              HvLpConfig_getMinLogicalProcessors(void)
-{
-       return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Min) * (/*getPaca()->getSecondaryThreadCount() +*/ 1);
-}
-//===============================================================
-static inline u64              HvLpConfig_getMaxPhysicalProcessors(void)
-{
-       return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Max);
-}
-//===============================================================
-static inline u64              HvLpConfig_getMaxLogicalProcessors(void)
-{
-       return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Max) * (/*getPaca()->getSecondaryThreadCount() +*/ 1);
-}
-//===============================================================
-static inline u64              HvLpConfig_getInitPhysicalProcessors(void)
+
+static inline u64 HvLpConfig_getMsChunks(void)
 {
-       return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Init);
+       return HvCall2(HvCallCfgGetMsChunks, HvLpConfig_getLpIndex(),
+                       HvCallCfg_Cur);
 }
-//===============================================================
-static inline u64              HvLpConfig_getInitLogicalProcessors(void)
+
+static inline u64 HvLpConfig_getSystemPhysicalProcessors(void)
 {
-       return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Init) * (/*getPaca()->getSecondaryThreadCount() +*/ 1);
+       return HvCall0(HvCallCfgGetSystemPhysicalProcessors);
 }
-//================================================================
-static inline HvLpVirtualLanIndexMap   HvLpConfig_getVirtualLanIndexMap(void)
+
+static inline u64 HvLpConfig_getNumProcsInSharedPool(HvLpSharedPoolIndex sPI)
 {
-       return HvCallCfg_getVirtualLanIndexMap(HvLpConfig_getLpIndex_outline());
+       return (u16)HvCall1(HvCallCfgGetNumProcsInSharedPool, sPI);
 }
-//===============================================================
-static inline HvLpVirtualLanIndexMap   HvLpConfig_getVirtualLanIndexMapForLp(HvLpIndex lp)
+
+static inline u64 HvLpConfig_getPhysicalProcessors(void)
 {
-       return HvCallCfg_getVirtualLanIndexMap(lp);
+       return HvCall2(HvCallCfgGetPhysicalProcessors, HvLpConfig_getLpIndex(),
+                       HvCallCfg_Cur);
 }
-//================================================================
-static inline HvLpIndex        HvLpConfig_getBusOwner(HvBusNumber busNumber)
+
+static inline HvLpSharedPoolIndex HvLpConfig_getSharedPoolIndex(void)
 {
-       return HvCallCfg_getBusOwner(busNumber);
+       return HvCall1(HvCallCfgGetSharedPoolIndex, HvLpConfig_getLpIndex());
 }
-//===============================================================
-static inline int              HvLpConfig_isBusDedicated(HvBusNumber busNumber)
+
+static inline u64 HvLpConfig_getSharedProcUnits(void)
 {
-       return HvCallCfg_isBusDedicated(busNumber);
+       return HvCall2(HvCallCfgGetSharedProcUnits, HvLpConfig_getLpIndex(),
+                       HvCallCfg_Cur);
 }
-//================================================================
-static inline HvLpIndexMap     HvLpConfig_getBusAllocation(HvBusNumber busNumber)
+
+static inline u64 HvLpConfig_getMaxSharedProcUnits(void)
 {
-       return HvCallCfg_getBusAllocation(busNumber);
+       return HvCall2(HvCallCfgGetSharedProcUnits, HvLpConfig_getLpIndex(),
+                       HvCallCfg_Max);
 }
-//================================================================
-// returns the absolute real address of the load area
-static inline u64              HvLpConfig_getLoadAddress(void)
+
+static inline u64 HvLpConfig_getMaxPhysicalProcessors(void)
 {
-       return itLpNaca.xLoadAreaAddr & 0x7fffffffffffffff;
+       return HvCall2(HvCallCfgGetPhysicalProcessors, HvLpConfig_getLpIndex(),
+                       HvCallCfg_Max);
 }
-//================================================================
-static inline u64              HvLpConfig_getLoadPages(void)
-{
-       return itLpNaca.xLoadAreaChunks * HVPAGESPERCHUNK;
+
+static inline HvLpVirtualLanIndexMap HvLpConfig_getVirtualLanIndexMapForLp(
+               HvLpIndex lp)
+{
+       /*
+        * This is a new function in V5R1 so calls to this on older
+        * hypervisors will return -1
+        */
+       u64 retVal = HvCall1(HvCallCfgGetVirtualLanIndexMap, lp);
+       if (retVal == -1)
+               retVal = 0;
+       return retVal;
 }
-//================================================================
-static inline int              HvLpConfig_isBusOwnedByThisLp(HvBusNumber busNumber)
+
+static inline HvLpVirtualLanIndexMap HvLpConfig_getVirtualLanIndexMap(void)
 {
-       HvLpIndex busOwner = HvLpConfig_getBusOwner(busNumber);
-       return (busOwner == HvLpConfig_getLpIndex());
+       return HvLpConfig_getVirtualLanIndexMapForLp(
+                       HvLpConfig_getLpIndex_outline());
 }
-//================================================================
-static inline int         HvLpConfig_doLpsCommunicateOnVirtualLan(HvLpIndex lp1, HvLpIndex lp2)
+
+static inline int HvLpConfig_doLpsCommunicateOnVirtualLan(HvLpIndex lp1,
+               HvLpIndex lp2)
 {
-       HvLpVirtualLanIndexMap virtualLanIndexMap1 = HvCallCfg_getVirtualLanIndexMap( lp1 );
-       HvLpVirtualLanIndexMap virtualLanIndexMap2 = HvCallCfg_getVirtualLanIndexMap( lp2 );
+       HvLpVirtualLanIndexMap virtualLanIndexMap1 =
+               HvLpConfig_getVirtualLanIndexMapForLp(lp1);
+       HvLpVirtualLanIndexMap virtualLanIndexMap2 =
+               HvLpConfig_getVirtualLanIndexMapForLp(lp2);
        return ((virtualLanIndexMap1 & virtualLanIndexMap2) != 0);
 }
-//================================================================
-static inline HvLpIndex                HvLpConfig_getHostingLpIndex(HvLpIndex lp)
+
+static inline HvLpIndex HvLpConfig_getHostingLpIndex(HvLpIndex lp)
 {
-       return HvCallCfg_getHostingLpIndex(lp);
+       return HvCall1(HvCallCfgGetHostingLpIndex, lp);
 }
-//================================================================
 
 #endif /* _HVLPCONFIG_H */
index 30936e433064a31c31d59db7f6f7eb3316510daa..865000de79b6fa3b4f56f39236297cc26dae6e44 100644 (file)
@@ -1,27 +1,24 @@
 /*
  * HvLpEvent.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-//======================================================================
-//
-//     This file contains the class for HV events in the system.
-//
-//=====================================================================
+/* This file contains the class for HV events in the system. */
+
 #ifndef _HVLPEVENT_H
 #define _HVLPEVENT_H
 
 #include <asm/iSeries/HvTypes.h>
 #include <asm/iSeries/HvCallEvent.h>
 
-//=====================================================================
-//
-// HvLpEvent is the structure for Lp Event messages passed between
-// partitions through PLIC. 
-//
-//=====================================================================
-
-struct HvEventFlags
-{
-       u8      xValid:1;               // Indicates a valid request    x00-x00
-       u8      xRsvd1:4;               // Reserved                     ...
-       u8      xAckType:1;             // Immediate or deferred        ...
-       u8      xAckInd:1;              // Indicates if ACK required    ...
-       u8      xFunction:1;            // Interrupt or Acknowledge     ...
+/*
+ * HvLpEvent is the structure for Lp Event messages passed between
+ * partitions through PLIC.
+ */
+
+struct HvEventFlags {
+       u8      xValid:1;       /* Indicates a valid request    x00-x00 */
+       u8      xRsvd1:4;       /* Reserved                     ... */
+       u8      xAckType:1;     /* Immediate or deferred        ... */
+       u8      xAckInd:1;      /* Indicates if ACK required    ... */
+       u8      xFunction:1;    /* Interrupt or Acknowledge     ... */
 };
 
 
-struct HvLpEvent
-{
-       struct HvEventFlags xFlags;     // Event flags                  x00-x00
-       u8      xType;                  // Type of message              x01-x01
-       u16     xSubtype;               // Subtype for event            x02-x03
-       u8      xSourceLp;              // Source LP                    x04-x04
-       u8      xTargetLp;              // Target LP                    x05-x05
-       u8      xSizeMinus1;            // Size of Derived class - 1    x06-x06
-       u8      xRc;                    // RC for Ack flows             x07-x07
-       u16     xSourceInstanceId;      // Source sides instance id     x08-x09
-       u16     xTargetInstanceId;      // Target sides instance id     x0A-x0B
+struct HvLpEvent {
+       struct HvEventFlags xFlags;     /* Event flags                x00-x00 */
+       u8      xType;                  /* Type of message            x01-x01 */
+       u16     xSubtype;               /* Subtype for event          x02-x03 */
+       u8      xSourceLp;              /* Source LP                  x04-x04 */
+       u8      xTargetLp;              /* Target LP                  x05-x05 */
+       u8      xSizeMinus1;            /* Size of Derived class - 1  x06-x06 */
+       u8      xRc;                    /* RC for Ack flows           x07-x07 */
+       u16     xSourceInstanceId;      /* Source sides instance id   x08-x09 */
+       u16     xTargetInstanceId;      /* Target sides instance id   x0A-x0B */
        union {
-               u32     xSubtypeData;   // Data usable by the subtype   x0C-x0F
-               u16     xSubtypeDataShort[2];   // Data as 2 shorts
-               u8      xSubtypeDataChar[4];    // Data as 4 chars
+               u32     xSubtypeData;   /* Data usable by the subtype x0C-x0F */
+               u16     xSubtypeDataShort[2];   /* Data as 2 shorts */
+               u8      xSubtypeDataChar[4];    /* Data as 4 chars */
        } x;
 
-       u64     xCorrelationToken;      // Unique value for source/type x10-x17
+       u64     xCorrelationToken;      /* Unique value for source/type x10-x17 */
 };
 
-// Lp Event handler function
 typedef void (*LpEventHandler)(struct HvLpEvent *, struct pt_regs *);
 
-// Register a handler for an event type
-//  returns 0 on success
-extern int HvLpEvent_registerHandler( HvLpEvent_Type eventType, LpEventHandler hdlr);
-
-// Unregister a handler for an event type
-//  This call will sleep until the handler being removed is guaranteed to
-//  be no longer executing on any CPU. Do not call with locks held.
-//
-//  returns 0 on success
-//  Unregister will fail if there are any paths open for the type
-extern int HvLpEvent_unregisterHandler( HvLpEvent_Type eventType );
+/* Register a handler for an event type - returns 0 on success */
+extern int HvLpEvent_registerHandler(HvLpEvent_Type eventType,
+               LpEventHandler hdlr);
 
-// Open an Lp Event Path for an event type
-//  returns 0 on success
-//  openPath will fail if there is no handler registered for the event type.
-//  The lpIndex specified is the partition index for the target partition
-//  (for VirtualIo, VirtualLan and SessionMgr) other types specify zero) 
-extern int HvLpEvent_openPath( HvLpEvent_Type eventType, HvLpIndex lpIndex );
+/*
+ * Unregister a handler for an event type
+ *
+ * This call will sleep until the handler being removed is guaranteed to
+ * be no longer executing on any CPU. Do not call with locks held.
+ *
+ *  returns 0 on success
+ *  Unregister will fail if there are any paths open for the type
+ */
+extern int HvLpEvent_unregisterHandler(HvLpEvent_Type eventType);
 
+/*
+ * Open an Lp Event Path for an event type
+ * returns 0 on success
+ * openPath will fail if there is no handler registered for the event type.
+ * The lpIndex specified is the partition index for the target partition
+ * (for VirtualIo, VirtualLan and SessionMgr) other types specify zero)
+ */
+extern int HvLpEvent_openPath(HvLpEvent_Type eventType, HvLpIndex lpIndex);
 
-// Close an Lp Event Path for a type and partition
-//  returns 0 on sucess
-extern int HvLpEvent_closePath( HvLpEvent_Type eventType, HvLpIndex lpIndex );
+/*
+ * Close an Lp Event Path for a type and partition
+ * returns 0 on sucess
+ */
+extern int HvLpEvent_closePath(HvLpEvent_Type eventType, HvLpIndex lpIndex);
 
 #define HvLpEvent_Type_Hypervisor 0
 #define HvLpEvent_Type_MachineFac 1
@@ -141,4 +139,4 @@ extern int HvLpEvent_closePath( HvLpEvent_Type eventType, HvLpIndex lpIndex );
 #define HvLpDma_Rc_InvalidAddress 4
 #define HvLpDma_Rc_InvalidLength 5
 
-#endif // _HVLPEVENT_H
+#endif /* _HVLPEVENT_H */
index 183e5e738c26e405abcdf4d596c800bfe2dedc54..01a1f13ea4a0511959f9f4eeb5f97aa7f5b15f4a 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * HvReleaseData.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 #ifndef _HVRELEASEDATA_H
 #define _HVRELEASEDATA_H
 
-//=============================================================================
-//
-//   This control block contains the critical information about the 
-//   release so that it can be changed in the future (ie, the virtual 
-//   address of the OS's NACA).
-//
+/*
+ * This control block contains the critical information about the
+ * release so that it can be changed in the future (ie, the virtual
+ * address of the OS's NACA).
+ */
 #include <asm/types.h>
 #include <asm/naca.h>
 
-//=============================================================================
-//
-//     When we IPL a secondary partition, we will check if if the 
-//     secondary xMinPlicVrmIndex > the primary xVrmIndex.  
-//     If it is then this tells PLIC that this secondary is not 
-//     supported running on this "old" of a level of PLIC.
-//
-//     Likewise, we will compare the primary xMinSlicVrmIndex to 
-//     the secondary xVrmIndex. 
-//     If the primary xMinSlicVrmDelta > secondary xVrmDelta then we 
-//     know that this PLIC does not support running an OS "that old".
-//
-//=============================================================================
+/*
+ * When we IPL a secondary partition, we will check if if the
+ * secondary xMinPlicVrmIndex > the primary xVrmIndex.
+ * If it is then this tells PLIC that this secondary is not
+ * supported running on this "old" of a level of PLIC.
+ *
+ * Likewise, we will compare the primary xMinSlicVrmIndex to
+ * the secondary xVrmIndex.
+ * If the primary xMinSlicVrmDelta > secondary xVrmDelta then we
+ * know that this PLIC does not support running an OS "that old".
+ */
 
-struct HvReleaseData
-{
-       u32     xDesc;                  // Descriptor   "HvRD" ebcdic   x00-x03
-       u16     xSize;                  // Size of this control block   x04-x05
-       u16     xVpdAreasPtrOffset;     // Offset in NACA of ItVpdAreas x06-x07
-       struct  naca_struct * xSlicNacaAddr; // Virt addr of SLIC NACA  x08-x0F
-       u32     xMsNucDataOffset;       // Offset of Linux Mapping Data x10-x13
-       u32     xRsvd1;                 // Reserved                     x14-x17
-       u16     xTagsMode:1;            // 0 == tags active, 1 == tags inactive
-       u16     xAddressSize:1;         // 0 == 64-bit, 1 == 32-bit
-       u16     xNoSharedProcs:1;       // 0 == shared procs, 1 == no shared
-       u16     xNoHMT:1;               // 0 == allow HMT, 1 == no HMT
-       u16     xRsvd2:12;              // Reserved                     x18-x19
-       u16     xVrmIndex;              // VRM Index of OS image        x1A-x1B
-       u16     xMinSupportedPlicVrmIndex;// Min PLIC level  (soft)     x1C-x1D
-       u16     xMinCompatablePlicVrmIndex;// Min PLIC levelP (hard)    x1E-x1F
-       char    xVrmName[12];           // Displayable name             x20-x2B
-       char    xRsvd3[20];             // Reserved                     x2C-x3F
+struct HvReleaseData {
+       u32     xDesc;          /* Descriptor "HvRD" ebcdic     x00-x03 */
+       u16     xSize;          /* Size of this control block   x04-x05 */
+       u16     xVpdAreasPtrOffset; /* Offset in NACA of ItVpdAreas x06-x07 */
+       struct  naca_struct     *xSlicNacaAddr; /* Virt addr of SLIC NACA x08-x0F */
+       u32     xMsNucDataOffset; /* Offset of Linux Mapping Data x10-x13 */
+       u32     xRsvd1;         /* Reserved                     x14-x17 */
+       u16     xTagsMode:1;    /* 0 == tags active, 1 == tags inactive */
+       u16     xAddressSize:1; /* 0 == 64-bit, 1 == 32-bit */
+       u16     xNoSharedProcs:1; /* 0 == shared procs, 1 == no shared */
+       u16     xNoHMT:1;       /* 0 == allow HMT, 1 == no HMT */
+       u16     xRsvd2:12;      /* Reserved                     x18-x19 */
+       u16     xVrmIndex;      /* VRM Index of OS image        x1A-x1B */
+       u16     xMinSupportedPlicVrmIndex; /* Min PLIC level  (soft) x1C-x1D */
+       u16     xMinCompatablePlicVrmIndex; /* Min PLIC levelP (hard) x1E-x1F */
+       char    xVrmName[12];   /* Displayable name             x20-x2B */
+       char    xRsvd3[20];     /* Reserved                     x2C-x3F */
 };
 
+extern struct HvReleaseData    hvReleaseData;
+
 #endif /* _HVRELEASEDATA_H */
index 3ec49c1aec328c5e846fe9f3f2acaa82096a2152..b1ef2b4cb3e3de084f67e2c6d5a440a82a448b2d 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * HvTypes.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 #ifndef _HVTYPES_H
 #define _HVTYPES_H
 
-//===========================================================================
-//                                                             Header File Id
-// Name______________:  HvTypes.H
-//
-// Description_______:
-//
-//     General typedefs for the hypervisor.
-//
-// Declared Class(es):
-//
-//===========================================================================
+/*
+ * General typedefs for the hypervisor.
+ */
 
 #include <asm/types.h>
 
-//-------------------------------------------------------------------
-// Typedefs
-//-------------------------------------------------------------------
 typedef u8     HvLpIndex;
 typedef u16    HvLpInstanceId;
-typedef u64     HvLpTOD;
-typedef u64     HvLpSystemSerialNum;
-typedef u8      HvLpDeviceSerialNum[12];
-typedef u16     HvLpSanHwSet;
-typedef u16     HvLpBus;
-typedef u16     HvLpBoard;
-typedef u16     HvLpCard;
-typedef u8      HvLpDeviceType[4];
-typedef u8      HvLpDeviceModel[3];
-typedef u64     HvIoToken;
-typedef u8      HvLpName[8];
+typedef u64    HvLpTOD;
+typedef u64    HvLpSystemSerialNum;
+typedef u8     HvLpDeviceSerialNum[12];
+typedef u16    HvLpSanHwSet;
+typedef u16    HvLpBus;
+typedef u16    HvLpBoard;
+typedef u16    HvLpCard;
+typedef u8     HvLpDeviceType[4];
+typedef u8     HvLpDeviceModel[3];
+typedef u64    HvIoToken;
+typedef u8     HvLpName[8];
 typedef u32    HvIoId;
 typedef u64    HvRealMemoryIndex;
-typedef u32     HvLpIndexMap;          // Must hold HvMaxArchitectedLps bits!!!
+typedef u32    HvLpIndexMap;   /* Must hold HVMAXARCHITECTEDLPS bits!!! */
 typedef u16    HvLpVrmIndex;
 typedef u32    HvXmGenerationId;
-typedef u8     HvLpBusPool;                    
-typedef u8     HvLpSharedPoolIndex;            
+typedef u8     HvLpBusPool;
+typedef u8     HvLpSharedPoolIndex;
 typedef u16    HvLpSharedProcUnitsX100;
 typedef u8     HvLpVirtualLanIndex;
-typedef u16    HvLpVirtualLanIndexMap; // Must hold HvMaxArchitectedVirtualLans bits!!!
-typedef u16    HvBusNumber;            // Hypervisor Bus Number
-typedef u8     HvSubBusNumber;         // Hypervisor SubBus Number
-typedef u8     HvAgentId;              // Hypervisor DevFn
+typedef u16    HvLpVirtualLanIndexMap; /* Must hold HVMAXARCHITECTEDVIRTUALLANS bits!!! */
+typedef u16    HvBusNumber;    /* Hypervisor Bus Number */
+typedef u8     HvSubBusNumber; /* Hypervisor SubBus Number */
+typedef u8     HvAgentId;      /* Hypervisor DevFn */
+
 
+#define HVMAXARCHITECTEDLPS            32
+#define HVMAXARCHITECTEDVIRTUALLANS    16
+#define HVMAXARCHITECTEDVIRTUALDISKS   32
+#define HVMAXARCHITECTEDVIRTUALCDROMS  8
+#define HVMAXARCHITECTEDVIRTUALTAPES   8
+#define HVCHUNKSIZE                    (256 * 1024)
+#define HVPAGESIZE                     (4 * 1024)
+#define HVLPMINMEGSPRIMARY             256
+#define HVLPMINMEGSSECONDARY           64
+#define HVCHUNKSPERMEG                 4
+#define HVPAGESPERMEG                  256
+#define HVPAGESPERCHUNK                        64
 
-#define HVMAXARCHITECTEDLPS 32
-#define HVMAXARCHITECTEDVIRTUALLANS 16
-#define HVMAXARCHITECTEDVIRTUALDISKS 32
-#define HVMAXARCHITECTEDVIRTUALCDROMS 8
-#define HVMAXARCHITECTEDVIRTUALTAPES 8
-#define HVCHUNKSIZE 256 * 1024
-#define HVPAGESIZE 4 * 1024
-#define HVLPMINMEGSPRIMARY 256
-#define HVLPMINMEGSSECONDARY 64
-#define HVCHUNKSPERMEG 4
-#define HVPAGESPERMEG 256
-#define HVPAGESPERCHUNK 64
-#define HvMaxArchitectedLps            ((HvLpIndex)HVMAXARCHITECTEDLPS)
-#define HvMaxArchitectedVirtualLans    ((HvLpVirtualLanIndex)16)
 #define HvLpIndexInvalid               ((HvLpIndex)0xff)
 
-//--------------------------------------------------------------------
-// Enums for the sub-components under PLIC
-// Used in HvCall  and HvPrimaryCall
-//--------------------------------------------------------------------
-enum   HvCallCompIds
-{
+/*
+ * Enums for the sub-components under PLIC
+ * Used in HvCall  and HvPrimaryCall
+ */
+enum {
        HvCallCompId = 0,
        HvCallCpuCtlsCompId = 1,
        HvCallCfgCompId = 2,
@@ -97,18 +83,18 @@ enum   HvCallCompIds
        HvCallSmCompId = 7,
        HvCallSpdCompId = 8,
        HvCallXmCompId = 9,
-       HvCallRioCompId = 10, 
+       HvCallRioCompId = 10,
        HvCallRsvd3CompId = 11,
        HvCallRsvd2CompId = 12,
        HvCallRsvd1CompId = 13,
        HvCallMaxCompId = 14,
-       HvPrimaryCallCompId = 0,    
+       HvPrimaryCallCompId = 0,
        HvPrimaryCallCfgCompId = 1,
-       HvPrimaryCallPciCompId = 2,    
+       HvPrimaryCallPciCompId = 2,
        HvPrimaryCallSmCompId = 3,
        HvPrimaryCallSpdCompId = 4,
        HvPrimaryCallXmCompId = 5,
-       HvPrimaryCallRioCompId = 6, 
+       HvPrimaryCallRioCompId = 6,
        HvPrimaryCallRsvd7CompId = 7,
        HvPrimaryCallRsvd6CompId = 8,
        HvPrimaryCallRsvd5CompId = 9,
@@ -116,7 +102,7 @@ enum   HvCallCompIds
        HvPrimaryCallRsvd3CompId = 11,
        HvPrimaryCallRsvd2CompId = 12,
        HvPrimaryCallRsvd1CompId = 13,
-       HvPrimaryCallMaxCompId = HvCallMaxCompId     
+       HvPrimaryCallMaxCompId = HvCallMaxCompId
 };
 
 struct HvLpBufferList {
index ff00e865f620553b81efcc83e618fbca2bb7c31f..45ed3ea67d060facbad6575a9327df80a3cfac1d 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * IoHriMainStore.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
@@ -21,7 +21,7 @@
 #define _IOHRIMAINSTORE_H
 
 /* Main Store Vpd for Condor,iStar,sStar */
-struct IoHriMainStoreSegment4 {    
+struct IoHriMainStoreSegment4 {
        u8      msArea0Exists:1;
        u8      msArea1Exists:1;
        u8      msArea2Exists:1;
@@ -51,7 +51,7 @@ struct IoHriMainStoreSegment4 {
        u8      msArea1HasRiserVpd:1;
        u8      msArea2HasRiserVpd:1;
        u8      msArea3HasRiserVpd:1;
-       u8      reserved5:4;    
+       u8      reserved5:4;
        u8      reserved6;
        u16     reserved7;
 
@@ -82,8 +82,8 @@ struct IoHriMainStoreVpdFruData {
 };
 
 struct IoHriMainStoreAdrRangeBlock {
-       void *  blockStart      __attribute((packed));
-       void *  blockEnd        __attribute((packed));
+       void    *blockStart      __attribute((packed));
+       void    *blockEnd        __attribute((packed));
        u32     blockProcChipId __attribute((packed));
 };
 
@@ -102,7 +102,7 @@ struct IoHriMainStoreArea4 {
        u32     procNodeId                      __attribute((packed));
 
        u32     numAdrRangeBlocks               __attribute((packed));
-       struct IoHriMainStoreAdrRangeBlock xAdrRangeBlock[MaxAreaAdrRangeBlocks] __attribute((packed));
+       struct IoHriMainStoreAdrRangeBlock xAdrRangeBlock[MaxAreaAdrRangeBlocks]        __attribute((packed));
 
        struct IoHriMainStoreChipInfo1  chipInfo0       __attribute((packed));
        struct IoHriMainStoreChipInfo1  chipInfo1       __attribute((packed));
@@ -113,17 +113,17 @@ struct IoHriMainStoreArea4 {
        struct IoHriMainStoreChipInfo1  chipInfo6       __attribute((packed));
        struct IoHriMainStoreChipInfo1  chipInfo7       __attribute((packed));
 
-       void *   msRamAreaArray                 __attribute((packed));
+       void    *msRamAreaArray                 __attribute((packed));
        u32     msRamAreaArrayNumEntries        __attribute((packed));
        u32     msRamAreaArrayEntrySize         __attribute((packed));
 
        u32     numaDimmExists                  __attribute((packed));
        u32     numaDimmFunctional              __attribute((packed));
-       void *  numaDimmArray                   __attribute((packed));
+       void    *numaDimmArray                  __attribute((packed));
        u32     numaDimmArrayNumEntries         __attribute((packed));
        u32     numaDimmArrayEntrySize          __attribute((packed));
 
-       struct IoHriMainStoreVpdIdData  idData  __attribute((packed));
+       struct IoHriMainStoreVpdIdData idData   __attribute((packed));
 
        u64     powerData                       __attribute((packed));
        u64     cardAssemblyPartNum             __attribute((packed));
@@ -143,7 +143,7 @@ struct IoHriMainStoreArea4 {
 };
 
 
-struct IoHriMainStoreSegment5 {    
+struct IoHriMainStoreSegment5 {
        u16     reserved1;
        u8      reserved2;
        u8      msVpdFormat;
@@ -151,17 +151,16 @@ struct IoHriMainStoreSegment5 {
        u32     totalMainStore;
        u64     maxConfiguredMsAdr;
 
-       struct IoHriMainStoreArea4*     msAreaArray;
+       struct IoHriMainStoreArea4      *msAreaArray;
        u32     msAreaArrayNumEntries;
        u32     msAreaArrayEntrySize;
 
-       u32     msAreaExists;    
+       u32     msAreaExists;
        u32     msAreaFunctional;
 
        u64     reserved3;
 };
 
+extern u64     xMsVpd[];
 
-
-#endif // _IOHRIMAINSTORE_H
-
+#endif /* _IOHRIMAINSTORE_H */
index 96543388865343697c60228a1256e60cdfd56619..73b73d80b8b11fb980108ae757fc5771a645f1fd 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * IoHriProcessorVpd.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 #ifndef _IOHRIPROCESSORVPD_H
 #define _IOHRIPROCESSORVPD_H
 
-//===================================================================
-//
-//     This struct maps Processor Vpd that is DMAd to SLIC by CSP 
-//
-
 #include <asm/types.h>
 
-struct IoHriProcessorVpd
-{
-
+/*
+ * This struct maps Processor Vpd that is DMAd to SLIC by CSP
+ */
+struct IoHriProcessorVpd {
        u8      xFormat;                // VPD format indicator         x00-x00
        u8      xProcStatus:8;          // Processor State              x01-x01
        u8      xSecondaryThreadCount;  // Secondary thread cnt         x02-x02
@@ -40,12 +36,12 @@ struct IoHriProcessorVpd
        u16     xRsvd2;                 // Reserved                     x06-x07
        u32     xHwNodeId;              // Hardware node id             x08-x0B
        u32     xHwProcId;              // Hardware processor id        x0C-x0F
-       
+
        u32     xTypeNum;               // Card Type/CCIN number        x10-x13
        u32     xModelNum;              // Model/Feature number         x14-x17
        u64     xSerialNum;             // Serial number                x18-x1F
-       char xPartNum[12];              // Book Part or FPU number      x20-x2B
-       char xMfgID[4];                 // Manufacturing ID             x2C-x2F
+       char    xPartNum[12];           // Book Part or FPU number      x20-x2B
+       char    xMfgID[4];              // Manufacturing ID             x2C-x2F
 
        u32     xProcFreq;              // Processor Frequency          x30-x33
        u32     xTimeBaseFreq;          // Time Base Frequency          x34-x37
@@ -71,7 +67,7 @@ struct IoHriProcessorVpd
        u32     xDataL3CacheSizeKB;     // L3 data cache size in KB     x80-x83
        u32     xDataL3CacheLineSize;   // L3 data cache block size     x84-x87
        u64     xRsvd6;                 // Reserved                     x88-x8F
-   
+
        u64     xFruLabel;              // Card Location Label          x90-x97
        u8      xSlotsOnCard;           // Slots on card (0=no slots)   x98-x98
        u8      xPartLocFlag;           // Location flag (0-pluggable 1-imbedded) x99-x99
@@ -79,10 +75,12 @@ struct IoHriProcessorVpd
        u8      xSmartCardPortNo;       // Smart card port number       x9C-x9C
        u8      xRsvd7;                 // Reserved                     x9D-x9D
        u16     xFrameIdAndRackUnit;    // Frame ID and rack unit adr   x9E-x9F
-    
+
        u8      xRsvd8[24];             // Reserved                     xA0-xB7
 
-       char xProcSrc[72];              // CSP format SRC               xB8-xFF
+       char    xProcSrc[72];           // CSP format SRC               xB8-xFF
 };
 
+extern struct IoHriProcessorVpd        xIoHriProcessorVpd[];
+
 #endif /* _IOHRIPROCESSORVPD_H */
index dee6b1273031168cace691849adafe3cf9c80df4..4c546a8802b4cfc55237851f54f253617e6acbed 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * ItExtVpdPanel.h
  * Copyright (C) 2002  Dave Boutcher IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 #define _ITEXTVPDPANEL_H
 
 /*
- *
- *     This struct maps the panel information 
+ *     This struct maps the panel information
  *
  * Warning:
  *     This data must match the architecture for the panel information
- *
  */
 
-
-/*-------------------------------------------------------------------
- * Standard Includes
- *------------------------------------------------------------------- 
-*/
 #include <asm/types.h>
 
-struct ItExtVpdPanel
-{
-  // Definition of the Extended Vpd On Panel Data Area
-  char                      systemSerial[8];
-  char                      mfgID[4];
-  char                      reserved1[24];
-  char                      machineType[4];
-  char                      systemID[6];
-  char                      somUniqueCnt[4];
-  char                      serialNumberCount;
-  char                      reserved2[7];
-  u16                       bbu3;
-  u16                       bbu2;
-  u16                       bbu1;
-  char                      xLocationLabel[8];
-  u8                        xRsvd1[6];
-  u16                       xFrameId;
-  u8                        xRsvd2[48];
+struct ItExtVpdPanel {
+       /* Definition of the Extended Vpd On Panel Data Area */
+       char    systemSerial[8];
+       char    mfgID[4];
+       char    reserved1[24];
+       char    machineType[4];
+       char    systemID[6];
+       char    somUniqueCnt[4];
+       char    serialNumberCount;
+       char    reserved2[7];
+       u16     bbu3;
+       u16     bbu2;
+       u16     bbu1;
+       char    xLocationLabel[8];
+       u8      xRsvd1[6];
+       u16     xFrameId;
+       u8      xRsvd2[48];
 };
 
-#endif /* _ITEXTVPDPANEL_H  */
+extern struct ItExtVpdPanel    xItExtVpdPanel;
+
+#endif /* _ITEXTVPDPANEL_H */
index 4d8b430ab12d9fec6fff8f5b482d1c0ebc9dd216..ae3417dc599e571da52621fceac99e904fc4b616 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * ItIplParmsReal.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 #ifndef _ITIPLPARMSREAL_H
 #define _ITIPLPARMSREAL_H
 
-//==============================================================================
-//
-//     This struct maps the IPL Parameters DMA'd from the SP.                  
-//
-// Warning:
-//     This data must map in exactly 64 bytes and match the architecture for
-//     the IPL parms
-//
-//=============================================================================
-
+/*
+ *     This struct maps the IPL Parameters DMA'd from the SP.
+ *
+ * Warning:
+ *     This data must map in exactly 64 bytes and match the architecture for
+ *     the IPL parms
+ */
 
-//-------------------------------------------------------------------
-// Standard Includes
-//-------------------------------------------------------------------
 #include <asm/types.h>
 
-struct ItIplParmsReal
-{
-       u8      xFormat;                // Defines format of IplParms           x00-x00
-       u8      xRsvd01:6;              // Reserved                             x01-x01
-       u8      xAlternateSearch:1;     // Alternate search indicator           ...
-       u8      xUaSupplied:1;          // UA Supplied on programmed IPL        ...
-       u8      xLsUaFormat;            // Format byte for UA                   x02-x02
-       u8      xRsvd02;                // Reserved                             x03-x03
-       u32     xLsUa;                  // LS UA                                x04-x07
-       u32     xUnusedLsLid;           // First OS LID to load                 x08-x0B
-       u16     xLsBusNumber;           // LS Bus Number                        x0C-x0D
-       u8      xLsCardAdr;             // LS Card Address                      x0E-x0E
-       u8      xLsBoardAdr;            // LS Board Address                     x0F-x0F
-       u32     xRsvd03;                // Reserved                             x10-x13
-       u8      xSpcnPresent:1;         // SPCN present                         x14-x14
-       u8      xCpmPresent:1;          // CPM present                          ...
-       u8      xRsvd04:6;              // Reserved                             ...
-       u8      xRsvd05:4;              // Reserved                             x15-x15
-       u8      xKeyLock:4;             // Keylock setting                      ...
-       u8      xRsvd06:6;              // Reserved                             x16-x16
-       u8      xIplMode:2;             // Ipl mode (A|B|C|D)                   ...
-       u8      xHwIplType;             // Fast v slow v slow EC HW IPL         x17-x17
-       u16     xCpmEnabledIpl:1;       // CPM in effect when IPL initiated     x18-x19
-       u16     xPowerOnResetIpl:1;     // Indicate POR condition               ...
-       u16     xMainStorePreserved:1;  // Main Storage is preserved            ...
-       u16     xRsvd07:13;             // Reserved                             ...
-       u16     xIplSource:16;          // Ipl source                           x1A-x1B
-       u8      xIplReason:8;           // Reason for this IPL                  x1C-x1C
-       u8      xRsvd08;                // Reserved                             x1D-x1D
-       u16     xRsvd09;                // Reserved                             x1E-x1F
-       u16     xSysBoxType;            // System Box Type                      x20-x21
-       u16     xSysProcType;           // System Processor Type                x22-x23
-       u32     xRsvd10;                // Reserved                             x24-x27
-       u64     xRsvd11;                // Reserved                             x28-x2F
-       u64     xRsvd12;                // Reserved                             x30-x37
-       u64     xRsvd13;                // Reserved                             x38-x3F
+struct ItIplParmsReal {
+       u8      xFormat;                // Defines format of IplParms   x00-x00
+       u8      xRsvd01:6;              // Reserved                     x01-x01
+       u8      xAlternateSearch:1;     // Alternate search indicator   ...
+       u8      xUaSupplied:1;          // UA Supplied on programmed IPL...
+       u8      xLsUaFormat;            // Format byte for UA           x02-x02
+       u8      xRsvd02;                // Reserved                     x03-x03
+       u32     xLsUa;                  // LS UA                        x04-x07
+       u32     xUnusedLsLid;           // First OS LID to load         x08-x0B
+       u16     xLsBusNumber;           // LS Bus Number                x0C-x0D
+       u8      xLsCardAdr;             // LS Card Address              x0E-x0E
+       u8      xLsBoardAdr;            // LS Board Address             x0F-x0F
+       u32     xRsvd03;                // Reserved                     x10-x13
+       u8      xSpcnPresent:1;         // SPCN present                 x14-x14
+       u8      xCpmPresent:1;          // CPM present                  ...
+       u8      xRsvd04:6;              // Reserved                     ...
+       u8      xRsvd05:4;              // Reserved                     x15-x15
+       u8      xKeyLock:4;             // Keylock setting              ...
+       u8      xRsvd06:6;              // Reserved                     x16-x16
+       u8      xIplMode:2;             // Ipl mode (A|B|C|D)           ...
+       u8      xHwIplType;             // Fast v slow v slow EC HW IPL x17-x17
+       u16     xCpmEnabledIpl:1;       // CPM in effect when IPL initiatedx18-x19
+       u16     xPowerOnResetIpl:1;     // Indicate POR condition       ...
+       u16     xMainStorePreserved:1;  // Main Storage is preserved    ...
+       u16     xRsvd07:13;             // Reserved                     ...
+       u16     xIplSource:16;          // Ipl source                   x1A-x1B
+       u8      xIplReason:8;           // Reason for this IPL          x1C-x1C
+       u8      xRsvd08;                // Reserved                     x1D-x1D
+       u16     xRsvd09;                // Reserved                     x1E-x1F
+       u16     xSysBoxType;            // System Box Type              x20-x21
+       u16     xSysProcType;           // System Processor Type        x22-x23
+       u32     xRsvd10;                // Reserved                     x24-x27
+       u64     xRsvd11;                // Reserved                     x28-x2F
+       u64     xRsvd12;                // Reserved                     x30-x37
+       u64     xRsvd13;                // Reserved                     x38-x3F
 };
 
+extern struct ItIplParmsReal   xItIplParmsReal;
+
 #endif /* _ITIPLPARMSREAL_H */
index 5baffddfae1beaec66954fa41ee4163f3e777f78..225d0176779da8203aa464e55098715fd566b817 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * ItLpNaca.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 #ifndef _ITLPNACA_H
 #define _ITLPNACA_H
 
-//=============================================================================
-//
-//     This control block contains the data that is shared between the
-//     hypervisor (PLIC) and the OS.
-//
-//=============================================================================
+#include <linux/types.h>
 
-struct ItLpNaca
-{
-//=============================================================================
+/*
+ *     This control block contains the data that is shared between the
+ *     hypervisor (PLIC) and the OS.
+ */
+
+struct ItLpNaca {
 // CACHE_LINE_1 0x0000 - 0x007F Contains read-only data
-//=============================================================================
        u32     xDesc;                  // Eye catcher                  x00-x03
        u16     xSize;                  // Size of this class           x04-x05
        u16     xIntHdlrOffset;         // Offset to IntHdlr array      x06-x07
@@ -59,30 +56,25 @@ struct ItLpNaca
        u64     xLoadAreaAddr;          // ER address of load area      x28-x2F
        u32     xLoadAreaChunks;        // Chunks for the load area     x30-x33
        u32     xPaseSysCallCRMask;     // Mask used to test CR before  x34-x37
-       // doing an ASR switch on PASE
-       // system call.
-       u64     xSlicSegmentTablePtr;   // Pointer to Slic seg table.   x38-x3f
-       u8      xRsvd1_4[64];           //                              x40-x7F 
-   
-//=============================================================================
+                                       // doing an ASR switch on PASE
+                                       // system call.
+       u64     xSlicSegmentTablePtr;   // Pointer to Slic seg table.   x38-x3f
+       u8      xRsvd1_4[64];           //                              x40-x7F
+
 // CACHE_LINE_2 0x0080 - 0x00FF Contains local read-write data
-//=============================================================================
        u8      xRsvd2_0[128];          // Reserved                     x00-x7F
 
-//=============================================================================
 // CACHE_LINE_3-6 0x0100 - 0x02FF Contains LP Queue indicators
-// NB: Padding required to keep xInterrruptHdlr at x300 which is required 
+// NB: Padding required to keep xInterrruptHdlr at x300 which is required
 // for v4r4 PLIC.
-//=============================================================================
        u8      xOldLpQueue[128];       // LP Queue needed for v4r4     100-17F
        u8      xRsvd3_0[384];          // Reserved                     180-2FF
-//=============================================================================
+
 // CACHE_LINE_7-8 0x0300 - 0x03FF Contains the address of the OS interrupt
 //  handlers
-//=============================================================================
        u64     xInterruptHdlr[32];     // Interrupt handlers           300-x3FF
 };
 
-//=============================================================================
+extern struct ItLpNaca         itLpNaca;
 
 #endif /* _ITLPNACA_H */
index 4f4dde2a638d50364b8c2192e17bbc5d8ab92378..393299e04d7fcf713915815d74fcba66888f09f0 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * ItLpQueue.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 #ifndef _ITLPQUEUE_H
 #define _ITLPQUEUE_H
 
-//=============================================================================
-//
-//     This control block defines the simple LP queue structure that is 
-//     shared between the hypervisor (PLIC) and the OS in order to send 
-//     events to an LP.  
-//    
+/*
+ *     This control block defines the simple LP queue structure that is
+ *     shared between the hypervisor (PLIC) and the OS in order to send
+ *     events to an LP.
+ */
 
 #include <asm/types.h>
 #include <asm/ptrace.h>
 
 struct HvLpEvent;
 
-#define ITMaxLpQueues 8
+#define ITMaxLpQueues  8
 
 #define NotUsed                0       // Queue will not be used by PLIC
 #define DedicatedIo    1       // Queue dedicated to IO processor specified
 #define DedicatedLp    2       // Queue dedicated to LP specified
 #define Shared         3       // Queue shared for both IO and LP
 
-#define LpEventStackSize 4096
-#define LpEventMaxSize   256
-#define LpEventAlign    64
+#define LpEventStackSize       4096
+#define LpEventMaxSize         256
+#define LpEventAlign           64
 
-struct ItLpQueue
-{
-//
-//  The xSlicCurEventPtr is the pointer to the next event stack entry that will
-//  become valid.  The OS must peek at this entry to determine if it is valid.
-//  PLIC will set the valid indicator as the very last store into that entry.
-//
-//  When the OS has completed processing of the event then it will mark the event
-//  as invalid so that PLIC knows it can store into that event location again.
-//
-// If the event stack fills and there are overflow events, then PLIC will set 
-// the xPlicOverflowIntPending flag in which case the OS will have to fetch the 
-// additional LP events once they have drained the event stack.
-//
-// The first 16-bytes are known by both the OS and PLIC.  The remainder of the
-// cache line is for use by the OS.
-//
-//=============================================================================
+struct ItLpQueue {
+/*
+ * The xSlicCurEventPtr is the pointer to the next event stack entry
+ * that will become valid.  The OS must peek at this entry to determine
+ * if it is valid.  PLIC will set the valid indicator as the very last
+ * store into that entry.
+ *
+ * When the OS has completed processing of the event then it will mark
+ * the event as invalid so that PLIC knows it can store into that event
+ * location again.
+ *
+ * If the event stack fills and there are overflow events, then PLIC
+ * will set the xPlicOverflowIntPending flag in which case the OS will
+ * have to fetch the additional LP events once they have drained the
+ * event stack.
+ *
+ * The first 16-bytes are known by both the OS and PLIC.  The remainder
+ * of the cache line is for use by the OS.
+ */
        u8      xPlicOverflowIntPending;// 0x00 Overflow events are pending
        u8      xPlicStatus;            // 0x01 DedicatedIo or DedicatedLp or NotUsed
        u16     xSlicLogicalProcIndex;  // 0x02 Logical Proc Index for correlation
        u8      xPlicRsvd[12];          // 0x04
-       char*   xSlicCurEventPtr;       // 0x10
-       char*   xSlicLastValidEventPtr; // 0x18
-       char*   xSlicEventStackPtr;     // 0x20
+       char    *xSlicCurEventPtr;      // 0x10
+       char    *xSlicLastValidEventPtr; // 0x18
+       char    *xSlicEventStackPtr;    // 0x20
        u8      xIndex;                 // 0x28 unique sequential index.
        u8      xSlicRsvd[3];           // 0x29-2b
        u32     xInUseWord;             // 0x2C
@@ -76,17 +76,9 @@ struct ItLpQueue
 
 extern struct ItLpQueue xItLpQueue;
 
-extern struct HvLpEvent * ItLpQueue_getNextLpEvent( struct ItLpQueue * );
-extern int ItLpQueue_isLpIntPending( struct ItLpQueue * ); 
-extern unsigned ItLpQueue_process( struct ItLpQueue *, struct pt_regs * );
-extern void ItLpQueue_clearValid( struct HvLpEvent * );
-
-static __inline__ void process_iSeries_events( void )
-{
-       __asm__ __volatile__ (
-       "       li      0,0x5555        \n\
-               sc"
-       : : : "r0", "r3" );     
-}
+extern struct HvLpEvent *ItLpQueue_getNextLpEvent(struct ItLpQueue *);
+extern int ItLpQueue_isLpIntPending(struct ItLpQueue *);
+extern unsigned ItLpQueue_process(struct ItLpQueue *, struct pt_regs *);
+extern void ItLpQueue_clearValid(struct HvLpEvent *);
 
 #endif /* _ITLPQUEUE_H */
index dafc4c8137883158c51bc8b3478a03dd942fdbc3..1b3087e76205371e4d7e23e7b4bf4c18216b5234 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * ItLpRegSave.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 #ifndef _ITLPREGSAVE_H
 #define _ITLPREGSAVE_H
 
-//=====================================================================================
-//
-//     This control block contains the data that is shared between PLIC
-//     and the OS
-//    
-//
+/*
+ * This control block contains the data that is shared between PLIC
+ * and the OS
+ */
 
-struct ItLpRegSave
-{
+struct ItLpRegSave {
        u32     xDesc;          // Eye catcher  "LpRS" ebcdic   000-003
        u16     xSize;          // Size of this class           004-005
        u8      xInUse;         // Area is live                 006-007
-       u8      xRsvd1[9];      // Reserved                     007-00F
+       u8      xRsvd1[9];      // Reserved                     007-00F
 
-       u8      xFixedRegSave[352]; // Fixed Register Save Area 010-16F 
+       u8      xFixedRegSave[352]; // Fixed Register Save Area 010-16F
        u32     xCTRL;          // Control Register             170-173
-       u32     xDEC;           // Decrementer                  174-177    
+       u32     xDEC;           // Decrementer                  174-177
        u32     xFPSCR;         // FP Status and Control Reg    178-17B
        u32     xPVR;           // Processor Version Number     17C-17F
-    
+
        u64     xMMCR0;         // Monitor Mode Control Reg 0   180-187
        u32     xPMC1;          // Perf Monitor Counter 1       188-18B
        u32     xPMC2;          // Perf Monitor Counter 2       18C-18F
        u32     xPMC3;          // Perf Monitor Counter 3       190-193
        u32     xPMC4;          // Perf Monitor Counter 4       194-197
        u32     xPIR;           // Processor ID Reg             198-19B
-    
+
        u32     xMMCR1;         // Monitor Mode Control Reg 1   19C-19F
        u32     xMMCRA;         // Monitor Mode Control Reg A   1A0-1A3
        u32     xPMC5;          // Perf Monitor Counter 5       1A4-1A7
@@ -57,17 +54,17 @@ struct ItLpRegSave
        u32     xRsvd;          // Reserved                     1BC-1BF
 
        u64     xACCR;          // Address Compare Control Reg  1C0-1C7
-       u64     xIMR;           // Instruction Match Register   1C8-1CF    
-       u64     xSDR1;          // Storage Description Reg 1    1D0-1D7    
+       u64     xIMR;           // Instruction Match Register   1C8-1CF
+       u64     xSDR1;          // Storage Description Reg 1    1D0-1D7
        u64     xSPRG0;         // Special Purpose Reg General0 1D8-1DF
        u64     xSPRG1;         // Special Purpose Reg General1 1E0-1E7
        u64     xSPRG2;         // Special Purpose Reg General2 1E8-1EF
        u64     xSPRG3;         // Special Purpose Reg General3 1F0-1F7
        u64     xTB;            // Time Base Register           1F8-1FF
-   
+
        u64     xFPR[32];       // Floating Point Registers     200-2FF
 
-       u64     xMSR;           // Machine State Register       300-307
+       u64     xMSR;           // Machine State Register       300-307
        u64     xNIA;           // Next Instruction Address     308-30F
 
        u64     xDABR;          // Data Address Breakpoint Reg  310-317
@@ -76,8 +73,8 @@ struct ItLpRegSave
        u64     xHID0;          // HW Implementation Dependent0 320-327
 
        u64     xHID4;          // HW Implementation Dependent4 328-32F
-       u64     xSCOMd;         // SCON Data Reg (SPRG4)        330-337
-       u64     xSCOMc;         // SCON Command Reg (SPRG5)     338-33F
+       u64     xSCOMd;         // SCON Data Reg (SPRG4)        330-337
+       u64     xSCOMc;         // SCON Command Reg (SPRG5)     338-33F
        u64     xSDAR;          // Sample Data Address Register 340-347
        u64     xSIAR;          // Sample Inst Address Register 348-34F
 
index f1b56f9e11e2ea0225df05184bb4c8d45b523126..5535f8271c9f0bc139876014f6577b21ee53a793 100644 (file)
@@ -1,29 +1,27 @@
 /*
  * ItSpCommArea.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-
 #ifndef _ITSPCOMMAREA_H
 #define _ITSPCOMMAREA_H
 
 
-struct SpCommArea
-{
+struct SpCommArea {
        u32     xDesc;                  // Descriptor (only in new formats)     000-003
        u8      xFormat;                // Format (only in new formats)         004-004
        u8      xRsvd1[11];             // Reserved                             005-00F
index d120439f30a5e8b882b4cbeb39eae1a9b5fcbf6f..71b3ad24f95a6e4b0f0469ffc443140310446e2e 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * ItVpdAreas.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 #ifndef _ITVPDAREAS_H
 #define _ITVPDAREAS_H
 
-//=====================================================================================
-//
-//      This file defines the address and length of all of the VPD area passed to
-//     the OS from PLIC (most of which start from the SP).
-//
+/*
+ * This file defines the address and length of all of the VPD area passed to
+ * the OS from PLIC (most of which start from the SP).
+ */
 
 #include <asm/types.h>
 
-// VPD Entry index is carved in stone - cannot be changed (easily).
-#define ItVpdCecVpd                               0
-#define ItVpdDynamicSpace                         1
-#define ItVpdExtVpd                               2
-#define ItVpdExtVpdOnPanel                        3
-#define ItVpdFirstPaca                            4
-#define ItVpdIoVpd                                5
-#define ItVpdIplParms                             6
-#define ItVpdMsVpd                                7
-#define ItVpdPanelVpd                             8
-#define ItVpdLpNaca                               9
-#define ItVpdBackplaneAndMaybeClockCardVpd        10 
-#define ItVpdRecoveryLogBuffer                   11
-#define ItVpdSpCommArea                                  12
-#define ItVpdSpLogBuffer                         13
-#define ItVpdSpLogBufferSave                     14
-#define ItVpdSpCardVpd                           15
-#define ItVpdFirstProcVpd                        16    
-#define ItVpdApModelVpd                                  17
-#define ItVpdClockCardVpd                        18
-#define ItVpdBusExtCardVpd                       19
-#define ItVpdProcCapacityVpd                     20
-#define ItVpdInteractiveCapacityVpd              21
-#define ItVpdFirstSlotLabel                      22
-#define ItVpdFirstLpQueue                        23
-#define ItVpdFirstL3CacheVpd                     24    
-#define ItVpdFirstProcFruVpd                     25
-
-#define ItVpdMaxEntries                                  26
+/* VPD Entry index is carved in stone - cannot be changed (easily). */
+#define ItVpdCecVpd                            0
+#define ItVpdDynamicSpace                      1
+#define ItVpdExtVpd                            2
+#define ItVpdExtVpdOnPanel                     3
+#define ItVpdFirstPaca                         4
+#define ItVpdIoVpd                             5
+#define ItVpdIplParms                          6
+#define ItVpdMsVpd                             7
+#define ItVpdPanelVpd                          8
+#define ItVpdLpNaca                            9
+#define ItVpdBackplaneAndMaybeClockCardVpd     10
+#define ItVpdRecoveryLogBuffer                 11
+#define ItVpdSpCommArea                                12
+#define ItVpdSpLogBuffer                       13
+#define ItVpdSpLogBufferSave                   14
+#define ItVpdSpCardVpd                         15
+#define ItVpdFirstProcVpd                      16
+#define ItVpdApModelVpd                                17
+#define ItVpdClockCardVpd                      18
+#define ItVpdBusExtCardVpd                     19
+#define ItVpdProcCapacityVpd                   20
+#define ItVpdInteractiveCapacityVpd            21
+#define ItVpdFirstSlotLabel                    22
+#define ItVpdFirstLpQueue                      23
+#define ItVpdFirstL3CacheVpd                   24
+#define ItVpdFirstProcFruVpd                   25
 
+#define ItVpdMaxEntries                                26
 
-#define ItDmaMaxEntries                                  10
+#define ItDmaMaxEntries                                10
 
-#define ItVpdAreasMaxSlotLabels                 192 
+#define ItVpdAreasMaxSlotLabels                        192
 
 
-struct SlicVpdAdrs {
-       u32     pad1;
-       void *  vpdAddr;
+struct ItVpdAreas {
+       u32     xSlicDesc;              // Descriptor                   000-003
+       u16     xSlicSize;              // Size of this control block   004-005
+       u16     xPlicAdjustVpdLens:1;   // Flag to indicate new interface006-007
+       u16     xRsvd1:15;              // Reserved bits                ...
+       u16     xSlicVpdEntries;        // Number of VPD entries        008-009
+       u16     xSlicDmaEntries;        // Number of DMA entries        00A-00B
+       u16     xSlicMaxLogicalProcs;   // Maximum logical processors   00C-00D
+       u16     xSlicMaxPhysicalProcs;  // Maximum physical processors  00E-00F
+       u16     xSlicDmaToksOffset;     // Offset into this of array    010-011
+       u16     xSlicVpdAdrsOffset;     // Offset into this of array    012-013
+       u16     xSlicDmaLensOffset;     // Offset into this of array    014-015
+       u16     xSlicVpdLensOffset;     // Offset into this of array    016-017
+       u16     xSlicMaxSlotLabels;     // Maximum number of slot labels018-019
+       u16     xSlicMaxLpQueues;       // Maximum number of LP Queues  01A-01B
+       u8      xRsvd2[4];              // Reserved                     01C-01F
+       u64     xRsvd3[12];             // Reserved                     020-07F
+       u32     xPlicDmaLens[ItDmaMaxEntries];// Array of DMA lengths   080-0A7
+       u32     xPlicDmaToks[ItDmaMaxEntries];// Array of DMA tokens    0A8-0CF
+       u32     xSlicVpdLens[ItVpdMaxEntries];// Array of VPD lengths   0D0-12F
+       void    *xSlicVpdAdrs[ItVpdMaxEntries];// Array of VPD buffers  130-1EF
 };
 
-
-struct ItVpdAreas
-{
-       u32     xSlicDesc;              // Descriptor                           000-003
-       u16     xSlicSize;              // Size of this control block           004-005
-       u16     xPlicAdjustVpdLens:1;   // Flag to indicate new interface       006-007
-       u16     xRsvd1:15;              // Reserved bits                        ...
-       u16     xSlicVpdEntries;        // Number of VPD entries                008-009
-       u16     xSlicDmaEntries;        // Number of DMA entries                00A-00B
-       u16     xSlicMaxLogicalProcs;   // Maximum logical processors           00C-00D
-       u16     xSlicMaxPhysicalProcs;  // Maximum physical processors          00E-00F
-       u16     xSlicDmaToksOffset;     // Offset into this of array            010-011
-       u16     xSlicVpdAdrsOffset;     // Offset into this of array            012-013
-       u16     xSlicDmaLensOffset;     // Offset into this of array            014-015
-       u16     xSlicVpdLensOffset;     // Offset into this of array            016-017
-       u16     xSlicMaxSlotLabels;     // Maximum number of slot labels        018-019
-       u16     xSlicMaxLpQueues;       // Maximum number of LP Queues          01A-01B
-       u8      xRsvd2[4];              // Reserved                             01C-01F
-       u64     xRsvd3[12];             // Reserved                             020-07F
-       u32     xPlicDmaLens[ItDmaMaxEntries];// Array of DMA lengths           080-0A7
-       u32     xPlicDmaToks[ItDmaMaxEntries];// Array of DMA tokens            0A8-0CF
-       u32     xSlicVpdLens[ItVpdMaxEntries];// Array of VPD lengths           0D0-12F
-       void * xSlicVpdAdrs[ItVpdMaxEntries];// Array of VPD buffers    130-1EF
-};
+extern struct ItVpdAreas       itVpdAreas;
 
 #endif /* _ITVPDAREAS_H */
diff --git a/include/asm-ppc64/iSeries/LparData.h b/include/asm-ppc64/iSeries/LparData.h
deleted file mode 100644 (file)
index e54f3b6..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * LparData.h
- * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
- */
-
-#ifndef _LPARDATA_H
-#define _LPARDATA_H
-
-#include <asm/types.h>
-#include <asm/page.h>
-#include <asm/abs_addr.h>
-
-#include <asm/iSeries/ItLpNaca.h>
-#include <asm/iSeries/ItLpRegSave.h>
-#include <asm/iSeries/HvReleaseData.h>
-#include <asm/iSeries/LparMap.h>
-#include <asm/iSeries/ItVpdAreas.h>
-#include <asm/iSeries/ItIplParmsReal.h>
-#include <asm/iSeries/ItExtVpdPanel.h>
-#include <asm/iSeries/ItLpQueue.h>
-#include <asm/iSeries/IoHriProcessorVpd.h>
-
-extern struct LparMap  xLparMap;
-extern struct HvReleaseData hvReleaseData;
-extern struct ItLpNaca itLpNaca;
-extern struct ItIplParmsReal xItIplParmsReal;
-extern struct ItExtVpdPanel xItExtVpdPanel;
-extern struct IoHriProcessorVpd xIoHriProcessorVpd[];
-extern struct ItLpQueue xItLpQueue;
-extern struct ItVpdAreas itVpdAreas;
-extern u64    xMsVpd[];
-extern struct msChunks msChunks;
-
-
-#endif /* _LPARDATA_H */
index 075205bb0f4ae7f49266e0327b6ab7db07757a0d..038e5df7e9f85fb3cf03e2fdb04ed63829f634e9 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * LparMap.h
  * Copyright (C) 2001  Mike Corrigan IBM Corporation
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 
 #include <asm/types.h>
 
-/* The iSeries hypervisor will set up mapping for one or more 
+/*
+ * The iSeries hypervisor will set up mapping for one or more
  * ESID/VSID pairs (in SLB/segment registers) and will set up
  * mappings of one or more ranges of pages to VAs.
  * We will have the hypervisor set up the ESID->VSID mapping
  * for the four kernel segments (C-F).  With shared processors,
  * the hypervisor will clear all segment registers and reload
- * these four whenever the processor is switched from one 
+ * these four whenever the processor is switched from one
  * partition to another.
  */
 
  * need to be located within the load area (if the total partition size
  * is 64 MB), but cannot be mapped.  Typically, this should specify
  * to map half (32 MB) of the load area.
- * 
- * The hypervisor will set up page table entries for the number of 
+ *
+ * The hypervisor will set up page table entries for the number of
  * pages specified.
  *
  * In 32-bit mode, the hypervisor will load all four of the
- * segment registers (identified by the low-order four bits of the 
+ * segment registers (identified by the low-order four bits of the
  * Esid field.  In 64-bit mode, the hypervisor will load one SLB
  * entry to map the Esid to the Vsid.
 */
 
-// Hypervisor initially maps 32MB of the load area 
-#define HvPagesToMap 8192
+/* Hypervisor initially maps 32MB of the load area */
+#define HvPagesToMap   8192
 
-struct LparMap
-{
-       u64       xNumberEsids;         // Number of ESID/VSID pairs (1)
-       u64       xNumberRanges;        // Number of VA ranges to map (1)
-       u64       xSegmentTableOffs;    // Page number within load area of seg table (0)
-       u64       xRsvd[5];             // Reserved (0)
-       u64       xKernelEsid;          // Esid used to map kernel load (0x0C00000000)  
-       u64       xKernelVsid;          // Vsid used to map kernel load (0x0C00000000)
-       u64       xPages;               // Number of pages to be mapped (8192)
-       u64       xOffset;              // Offset from start of load area (0)
-       u64       xVPN;                 // Virtual Page Number (0x000C000000000000)
+struct LparMap {
+       u64     xNumberEsids;   // Number of ESID/VSID pairs (1)
+       u64     xNumberRanges;  // Number of VA ranges to map (1)
+       u64     xSegmentTableOffs; // Page number within load area of seg table (0)
+       u64     xRsvd[5];
+       u64     xKernelEsid;    // Esid used to map kernel load (0x0C00000000)
+       u64     xKernelVsid;    // Vsid used to map kernel load (0x0C00000000)
+       u64     xPages;         // Number of pages to be mapped (8192)
+       u64     xOffset;        // Offset from start of load area (0)
+       u64     xVPN;           // Virtual Page Number (0x000C000000000000)
 };
 
+extern struct LparMap          xLparMap;
+
 #endif /* _LPARMAP_H */
diff --git a/include/asm-ppc64/iSeries/XmPciLpEvent.h b/include/asm-ppc64/iSeries/XmPciLpEvent.h
deleted file mode 100644 (file)
index a3d27f1..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-
-#ifndef        __XMPCILPEVENT_H__
-#define        __XMPCILPEVENT_H__
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int XmPciLpEvent_init(void);
-void ppc_irq_dispatch_handler(struct pt_regs *regs, int irq);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __XMPCILPEVENT_H__ */
index f52b7599b372be60c2d1eb83224aea2014d0ff8c..9f79413342b3f7d096b40724d67fc06b2a53e0c0 100644 (file)
@@ -5,32 +5,33 @@
 
 #ifdef CONFIG_PPC_ISERIES
 #include <linux/types.h>
-/************************************************************************/
-/* File iSeries_io.h created by Allan Trautman on Thu Dec 28 2000.      */
-/************************************************************************/
-/* Remaps the io.h for the iSeries Io                                   */
-/* Copyright (C) 20yy  Allan H Trautman, IBM Corporation                */
-/*                                                                      */
-/* This program is free software; you can redistribute it and/or modify */
-/* it under the terms of the GNU General Public License as published by */
-/* the Free Software Foundation; either version 2 of the License, or    */
-/* (at your option) any later version.                                  */
-/*                                                                      */
-/* This program is distributed in the hope that it will be useful,      */ 
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of       */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        */
-/* GNU General Public License for more details.                         */
-/*                                                                      */
-/* You should have received a copy of the GNU General Public License    */ 
-/* along with this program; if not, write to the:                       */
-/* Free Software Foundation, Inc.,                                      */ 
-/* 59 Temple Place, Suite 330,                                          */ 
-/* Boston, MA  02111-1307  USA                                          */
-/************************************************************************/
-/* Change Activity:                                                     */
-/*   Created December 28, 2000                                          */
-/* End Change Activity                                                  */
-/************************************************************************/
+/*
+ * File iSeries_io.h created by Allan Trautman on Thu Dec 28 2000.
+ *
+ * Remaps the io.h for the iSeries Io
+ * Copyright (C) 2000  Allan H Trautman, IBM Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the:
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330,
+ * Boston, MA  02111-1307  USA
+ *
+ * Change Activity:
+ *   Created December 28, 2000
+ * End Change Activity
+ */
+
 extern u8   iSeries_Read_Byte(const volatile void __iomem * IoAddress);
 extern u16  iSeries_Read_Word(const volatile void __iomem * IoAddress);
 extern u32  iSeries_Read_Long(const volatile void __iomem * IoAddress);
@@ -39,8 +40,10 @@ extern void iSeries_Write_Word(u16 IoData, volatile void __iomem * IoAddress);
 extern void iSeries_Write_Long(u32 IoData, volatile void __iomem * IoAddress);
 
 extern void iSeries_memset_io(volatile void __iomem *dest, char x, size_t n);
-extern void iSeries_memcpy_toio(volatile void __iomem *dest, void *source, size_t n);
-extern void iSeries_memcpy_fromio(void *dest, const volatile void __iomem *source, size_t n);
+extern void iSeries_memcpy_toio(volatile void __iomem *dest, void *source,
+               size_t n);
+extern void iSeries_memcpy_fromio(void *dest,
+               const volatile void __iomem *source, size_t n);
 
 #endif /* CONFIG_PPC_ISERIES */
 #endif /* _ISERIES_IO_H */
index ff8ddede038c6a4574d1a200e0ea84ec474b8a5f..6c9767ac1302a84c38ae8dd84679dbfb0923c233 100644 (file)
@@ -1,19 +1,8 @@
 #ifndef        __ISERIES_IRQ_H__
 #define        __ISERIES_IRQ_H__
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void iSeries_init_IRQ(void);
-int  iSeries_allocate_IRQ(HvBusNumber, HvSubBusNumber, HvAgentId);
-int  iSeries_assign_IRQ(int, HvBusNumber, HvSubBusNumber, HvAgentId);
-void iSeries_activate_IRQs(void);
-
-int XmPciLpEvent_init(void);
-
-#ifdef __cplusplus
-}
-#endif
+extern void iSeries_init_IRQ(void);
+extern int  iSeries_allocate_IRQ(HvBusNumber, HvSubBusNumber, HvAgentId);
+extern void iSeries_activate_IRQs(void);
 
 #endif /* __ISERIES_IRQ_H__ */
index 5769cff4c00c865af1a98b64426f53748f48fbaa..575f611f8b3391b04ec461adf70c65dbe207e812 100644 (file)
 #ifndef _ISERIES_64_PCI_H
 #define _ISERIES_64_PCI_H
 
-/************************************************************************/
-/* File iSeries_pci.h created by Allan Trautman on Tue Feb 20, 2001.    */
-/************************************************************************/
-/* Define some useful macros for the iSeries pci routines.              */
-/* Copyright (C) 2001  Allan H Trautman, IBM Corporation                */
-/*                                                                      */
-/* This program is free software; you can redistribute it and/or modify */
-/* it under the terms of the GNU General Public License as published by */
-/* the Free Software Foundation; either version 2 of the License, or    */
-/* (at your option) any later version.                                  */
-/*                                                                      */
-/* This program is distributed in the hope that it will be useful,      */ 
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of       */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        */
-/* GNU General Public License for more details.                         */
-/*                                                                      */
-/* You should have received a copy of the GNU General Public License    */ 
-/* along with this program; if not, write to the:                       */
-/* Free Software Foundation, Inc.,                                      */ 
-/* 59 Temple Place, Suite 330,                                          */ 
-/* Boston, MA  02111-1307  USA                                          */
-/************************************************************************/
-/* Change Activity:                                                     */
-/*   Created Feb 20, 2001                                               */
-/*   Added device reset, March 22, 2001                                 */
-/*   Ported to ppc64, May 25, 2001                                      */
-/* End Change Activity                                                  */
-/************************************************************************/
+/*
+ * File iSeries_pci.h created by Allan Trautman on Tue Feb 20, 2001.
+ *
+ * Define some useful macros for the iSeries pci routines.
+ * Copyright (C) 2001  Allan H Trautman, IBM Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the:
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330,
+ * Boston, MA  02111-1307  USA
+ *
+ * Change Activity:
+ *   Created Feb 20, 2001
+ *   Added device reset, March 22, 2001
+ *   Ported to ppc64, May 25, 2001
+ * End Change Activity
+ */
 
 #include <asm/iSeries/HvCallPci.h>
 #include <asm/abs_addr.h>
 
-struct pci_dev;                                /* For Forward Reference        */
+struct pci_dev;                                /* For Forward Reference */
 struct iSeries_Device_Node;
 
-/************************************************************************/
-/* Gets iSeries Bus, SubBus, DevFn using iSeries_Device_Node structure */
-/************************************************************************/
+/*
+ * Gets iSeries Bus, SubBus, DevFn using iSeries_Device_Node structure
+ */
 
 #define ISERIES_BUS(DevPtr)    DevPtr->DsaAddr.Dsa.busNumber
 #define ISERIES_SUBBUS(DevPtr) DevPtr->DsaAddr.Dsa.subBusNumber
 #define ISERIES_DEVICE(DevPtr) DevPtr->DsaAddr.Dsa.deviceId
 #define ISERIES_DSA(DevPtr)    DevPtr->DsaAddr.DsaAddr
-#define ISERIES_DEVFUN(DevPtr) DevPtr->DevFn
-#define ISERIES_DEVNODE(PciDev) ((struct iSeries_Device_Node*)PciDev->sysdata)
+#define ISERIES_DEVNODE(PciDev)        ((struct iSeries_Device_Node *)PciDev->sysdata)
 
 #define EADsMaxAgents 7
 
-/************************************************************************/
-/* Decodes Linux DevFn to iSeries DevFn, bridge device, or function.    */
-/* For Linux, see PCI_SLOT and PCI_FUNC in include/linux/pci.h          */
-/************************************************************************/
-
-#define ISERIES_PCI_AGENTID(idsel,func)        ((idsel & 0x0F) << 4) | (func  & 0x07)
-#define ISERIES_ENCODE_DEVICE(agentid) ((0x10) | ((agentid&0x20)>>2) | (agentid&07))
-
-#define ISERIES_GET_DEVICE_FROM_SUBBUS(subbus)   ((subbus >> 5) & 0x7)
-#define ISERIES_GET_FUNCTION_FROM_SUBBUS(subbus) ((subbus >> 2) & 0x7)
-
 /*
- * N.B. the ISERIES_DECODE_* macros are not used anywhere, and I think
- * the 0x71 (at least) must be wrong - 0x78 maybe?  -- paulus.
+ * Decodes Linux DevFn to iSeries DevFn, bridge device, or function.
+ * For Linux, see PCI_SLOT and PCI_FUNC in include/linux/pci.h
  */
-#define ISERIES_DECODE_DEVFN(linuxdevfn)  (((linuxdevfn & 0x71) << 1) | (linuxdevfn & 0x07))
-#define ISERIES_DECODE_DEVICE(linuxdevfn) (((linuxdevfn & 0x38) >> 3) |(((linuxdevfn & 0x40) >> 2) + 0x10))
-#define ISERIES_DECODE_FUNCTION(linuxdevfn) (linuxdevfn & 0x07)
 
-/************************************************************************/
-/* Converts Virtual Address to Real Address for Hypervisor calls        */
-/************************************************************************/
+#define ISERIES_PCI_AGENTID(idsel, func)       \
+       (((idsel & 0x0F) << 4) | (func & 0x07))
+#define ISERIES_ENCODE_DEVICE(agentid)         \
+       ((0x10) | ((agentid & 0x20) >> 2) | (agentid & 0x07))
 
-#define ISERIES_HV_ADDR(virtaddr)  (0x8000000000000000 | virt_to_abs(virtaddr))
+#define ISERIES_GET_DEVICE_FROM_SUBBUS(subbus)         ((subbus >> 5) & 0x7)
+#define ISERIES_GET_FUNCTION_FROM_SUBBUS(subbus)       ((subbus >> 2) & 0x7)
 
-/************************************************************************/
-/* iSeries Device Information                                           */
-/************************************************************************/
+/*
+ * Converts Virtual Address to Real Address for Hypervisor calls
+ */
+#define ISERIES_HV_ADDR(virtaddr)      \
+       (0x8000000000000000 | virt_to_abs(virtaddr))
 
+/*
+ * iSeries Device Information
+ */
 struct iSeries_Device_Node {
        struct list_head Device_List;
-       struct pci_dev* PciDev;         /* Pointer to pci_dev structure*/
-        union HvDsaMap DsaAddr;        /* Direct Select Address       */
-                                        /* busNumber,subBusNumber,     */ 
-                                       /* deviceId, barNumber         */
-       HvAgentId       AgentId;        /* Hypervisor DevFn            */
-       int             DevFn;          /* Linux devfn                 */
-       int             BarOffset;
-       int             Irq;            /* Assigned IRQ                */
-       int             ReturnCode;     /* Return Code Holder          */
-       int             IoRetry;        /* Current Retry Count         */
-       int             Flags;          /* Possible flags(disable/bist)*/
-       u16             Vendor;         /* Vendor ID                   */
-       u8              LogicalSlot;    /* Hv Slot Index for Tces      */
-       struct iommu_table* iommu_table;/* Device TCE Table            */ 
-       u8              PhbId;          /* Phb Card is on.             */
-       u16             Board;          /* Board Number                */
-       u8              FrameId;        /* iSeries spcn Frame Id       */
-       char            CardLocation[4];/* Char format of planar vpd   */
-       char            Location[20];   /* Frame  1, Card C10          */
+       struct pci_dev  *PciDev;
+       union HvDsaMap  DsaAddr;        /* Direct Select Address */
+                                       /* busNumber, subBusNumber, */
+                                       /* deviceId, barNumber */
+       int             DevFn;          /* Linux devfn */
+       int             Irq;            /* Assigned IRQ */
+       int             Flags;          /* Possible flags(disable/bist)*/
+       u8              LogicalSlot;    /* Hv Slot Index for Tces */
+       struct iommu_table *iommu_table;/* Device TCE Table */
 };
 
-/************************************************************************/
-/* Functions                                                            */
-/************************************************************************/
-
-extern int           iSeries_Device_Information(struct pci_dev*,char*, int);
-extern void          iSeries_Get_Location_Code(struct iSeries_Device_Node*);
-extern int           iSeries_Device_ToggleReset(struct pci_dev* PciDev, int AssertTime, int DelayTime);
+extern void    iSeries_Device_Information(struct pci_dev*, int);
 
 #endif /* _ISERIES_64_PCI_H */
diff --git a/include/asm-ppc64/iSeries/iSeries_proc.h b/include/asm-ppc64/iSeries/iSeries_proc.h
deleted file mode 100644 (file)
index adb6dc1..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * iSeries_proc.h
- * Copyright (C) 2001  Kyle A. Lucke IBM Corporation
- * 
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
- */
-#ifndef _ISERIES_PROC_H
-#define _ISERIES_PROC_H
-
-extern void iSeries_proc_early_init(void);
-
-#endif /* _iSeries_PROC_H */
index 2e59a8e15a0b57848a61299684380c1951cea40a..7e6a0d936999c86cb5d9c835a08ba77e1ae6f687 100644 (file)
@@ -9,17 +9,16 @@
  * all partitions in the iSeries.  It also provides miscellaneous low-level
  * machine facility type operations.
  *
- * 
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
@@ -52,6 +51,7 @@ extern void mf_clear_src(void);
 extern void mf_init(void);
 
 extern int mf_get_rtc(struct rtc_time *tm);
+extern int mf_get_boot_rtc(struct rtc_time *tm);
 extern int mf_set_rtc(struct rtc_time *tm);
 
 #endif /* _ASM_PPC64_ISERIES_MF_H */
index 3e5766a849d68ee48b1a3f6a58b01c8d4a2c6ddb..6c05e6257f53a386f99fbe2b744cb50b64468efc 100644 (file)
@@ -8,32 +8,32 @@
  *           Colin Devilbiss <devilbis@us.ibm.com>
  *
  * (C) Copyright 2000 IBM Corporation
- * 
+ *
  * This header file is used by the iSeries virtual I/O device
  * drivers.  It defines the interfaces to the common functions
  * (implemented in drivers/char/viopath.h) as well as defining
- * common functions and structures.  Currently (at the time I 
+ * common functions and structures.  Currently (at the time I
  * wrote this comment) the iSeries virtual I/O device drivers
- * that use this are 
- *   drivers/block/viodasd.c 
+ * that use this are
+ *   drivers/block/viodasd.c
  *   drivers/char/viocons.c
  *   drivers/char/viotape.c
  *   drivers/cdrom/viocd.c
  *
  * The iSeries virtual ethernet support (veth.c) uses a whole
  * different set of functions.
- * 
+ *
  * 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) anyu later version.
  *
  * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of 
+ * 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.  
+ * General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
+ * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  *
 #include <asm/iSeries/HvTypes.h>
 #include <asm/iSeries/HvLpEvent.h>
 
-/* iSeries virtual I/O events use the subtype field in
+/*
+ * iSeries virtual I/O events use the subtype field in
  * HvLpEvent to figure out what kind of vio event is coming
  * in.  We use a table to route these, and this defines
  * the maximum number of distinct subtypes
  */
 #define VIO_MAX_SUBTYPES 8
 
-/* Each subtype can register a handler to process their events.
+/*
+ * Each subtype can register a handler to process their events.
  * The handler must have this interface.
  */
 typedef void (vio_event_handler_t) (struct HvLpEvent * event);
 
-int viopath_open(HvLpIndex remoteLp, int subtype, int numReq);
-int viopath_close(HvLpIndex remoteLp, int subtype, int numReq);
-int vio_setHandler(int subtype, vio_event_handler_t * beh);
-int vio_clearHandler(int subtype);
-int viopath_isactive(HvLpIndex lp);
-HvLpInstanceId viopath_sourceinst(HvLpIndex lp);
-HvLpInstanceId viopath_targetinst(HvLpIndex lp);
-void vio_set_hostlp(void);
-void *vio_get_event_buffer(int subtype);
-void vio_free_event_buffer(int subtype, void *buffer);
+extern int viopath_open(HvLpIndex remoteLp, int subtype, int numReq);
+extern int viopath_close(HvLpIndex remoteLp, int subtype, int numReq);
+extern int vio_setHandler(int subtype, vio_event_handler_t * beh);
+extern int vio_clearHandler(int subtype);
+extern int viopath_isactive(HvLpIndex lp);
+extern HvLpInstanceId viopath_sourceinst(HvLpIndex lp);
+extern HvLpInstanceId viopath_targetinst(HvLpIndex lp);
+extern void vio_set_hostlp(void);
+extern void *vio_get_event_buffer(int subtype);
+extern void vio_free_event_buffer(int subtype, void *buffer);
 
 extern HvLpIndex viopath_hostLp;
 extern HvLpIndex viopath_ourLp;
 
-#define VIOCHAR_MAX_DATA 200
+#define VIOCHAR_MAX_DATA       200
 
-#define VIOMAJOR_SUBTYPE_MASK 0xff00
-#define VIOMINOR_SUBTYPE_MASK 0x00ff
-#define VIOMAJOR_SUBTYPE_SHIFT 8
+#define VIOMAJOR_SUBTYPE_MASK  0xff00
+#define VIOMINOR_SUBTYPE_MASK  0x00ff
+#define VIOMAJOR_SUBTYPE_SHIFT 8
 
-#define VIOVERSION            0x0101
+#define VIOVERSION             0x0101
 
 /*
  * This is the general structure for VIO errors; each module should have
@@ -89,8 +91,8 @@ struct vio_error_entry {
        int errno;
        const char *msg;
 };
-const struct vio_error_entry *vio_lookup_rc(const struct vio_error_entry
-                                           *local_table, u16 rc);
+extern const struct vio_error_entry *vio_lookup_rc(
+               const struct vio_error_entry *local_table, u16 rc);
 
 enum viosubtypes {
        viomajorsubtype_monitor = 0x0100,
@@ -102,7 +104,6 @@ enum viosubtypes {
        viomajorsubtype_scsi = 0x0700
 };
 
-
 enum vioconfigsubtype {
        vioconfigget = 0x0001,
 };
index 3a45e918bf16606a34e0cf1791af858610d2b6d4..e46ff68a6e4184923547153af0853d91bef2264e 100644 (file)
@@ -4,9 +4,9 @@
 /*
  * Define the address range of the imalloc VM area.
  */
-#define PHBS_IO_BASE     IOREGIONBASE
-#define IMALLOC_BASE      (IOREGIONBASE + 0x80000000ul)        /* Reserve 2 gigs for PHBs */
-#define IMALLOC_END       (IOREGIONBASE + EADDR_MASK)
+#define PHBS_IO_BASE     VMALLOC_END
+#define IMALLOC_BASE      (PHBS_IO_BASE + 0x80000000ul)        /* Reserve 2 gigs for PHBs */
+#define IMALLOC_END       (VMALLOC_START + EADDR_MASK)
 
 
 /* imalloc region types */
@@ -18,7 +18,9 @@
 
 extern struct vm_struct * im_get_free_area(unsigned long size);
 extern struct vm_struct * im_get_area(unsigned long v_addr, unsigned long size,
-                       int region_type);
-unsigned long im_free(void *addr);
+                                     int region_type);
+extern void im_free(void *addr);
+
+extern unsigned long ioremap_bot;
 
 #endif /* _PPC64_IMALLOC_H */
index bd53ca4dcfa269d7c7ae997bdd36e06b32a31731..729de5cc21d984206b33bf8e142cc9cb8a27668b 100644 (file)
@@ -82,24 +82,6 @@ struct iommu_table {
        unsigned long *it_map;       /* A simple allocation bitmap for now */
 };
 
-#ifdef CONFIG_PPC_ISERIES
-struct iommu_table_cb {
-       unsigned long   itc_busno;      /* Bus number for this tce table */
-       unsigned long   itc_start;      /* Will be NULL for secondary */
-       unsigned long   itc_totalsize;  /* Size (in pages) of whole table */
-       unsigned long   itc_offset;     /* Index into real tce table of the
-                                          start of our section */
-       unsigned long   itc_size;       /* Size (in pages) of our section */
-       unsigned long   itc_index;      /* Index of this tce table */
-       unsigned short  itc_maxtables;  /* Max num of tables for partition */
-       unsigned char   itc_virtbus;    /* Flag to indicate virtual bus */
-       unsigned char   itc_slotno;     /* IOA Tce Slot Index */
-       unsigned char   itc_rsvd[4];
-};
-
-extern struct iommu_table vio_tce_table;      /* Tce table for virtual bus */
-#endif /* CONFIG_PPC_ISERIES */
-
 struct scatterlist;
 
 #ifdef CONFIG_PPC_MULTIPLATFORM
@@ -122,9 +104,6 @@ extern void iommu_devnode_init_pSeries(struct device_node *dn);
 
 #ifdef CONFIG_PPC_ISERIES
 
-/* Walks all buses and creates iommu tables */
-extern void iommu_setup_iSeries(void);
-
 /* Initializes tables for bio buses */
 extern void __init iommu_vio_init(void);
 
@@ -158,8 +137,12 @@ extern void iommu_init_early_pSeries(void);
 extern void iommu_init_early_iSeries(void);
 extern void iommu_init_early_u3(void);
 
+#ifdef CONFIG_PCI
 extern void pci_iommu_init(void);
 extern void pci_direct_iommu_init(void);
+#else
+static inline void pci_iommu_init(void) { }
+#endif
 
 extern void alloc_u3_dart_table(void);
 
index 1a0223b5f3b8e5c3bc24ffd8c1deeeb3c4c0fffa..ae76cae1483fad886c002fe33aec8166b2c1a5a7 100644 (file)
 #include       <asm/types.h>
 #include       <asm/lppaca.h>
 #include       <asm/iSeries/ItLpRegSave.h>
+#include       <asm/iSeries/ItLpQueue.h>
 #include       <asm/mmu.h>
 
 register struct paca_struct *local_paca asm("r13");
 #define get_paca()     local_paca
 
 struct task_struct;
-struct ItLpQueue;
 
 /*
  * Defines the layout of the paca.
index bcd21789d3b7816e2e53e85dac6515b347c101cd..257d87eb7c34b48066def0c4d172d1df3529b6cb 100644 (file)
@@ -202,9 +202,7 @@ extern u64 ppc64_pft_size;          /* Log 2 of page table size */
 #define PAGE_OFFSET     ASM_CONST(0xC000000000000000)
 #define KERNELBASE      PAGE_OFFSET
 #define VMALLOCBASE     ASM_CONST(0xD000000000000000)
-#define IOREGIONBASE    ASM_CONST(0xE000000000000000)
 
-#define IO_REGION_ID       (IOREGIONBASE >> REGION_SHIFT)
 #define VMALLOC_REGION_ID  (VMALLOCBASE >> REGION_SHIFT)
 #define KERNEL_REGION_ID   (KERNELBASE >> REGION_SHIFT)
 #define USER_REGION_ID     (0UL)
index 264c4f7993be3557a6b5932bf8dcf943b7c8fd8e..46cf61c2ff69a3b920231122402b1405ca0d4fca 100644 (file)
@@ -53,7 +53,8 @@
  * Define the address range of the vmalloc VM area.
  */
 #define VMALLOC_START (0xD000000000000000ul)
-#define VMALLOC_END   (VMALLOC_START + EADDR_MASK)
+#define VMALLOC_SIZE  (0x10000000000UL)
+#define VMALLOC_END   (VMALLOC_START + VMALLOC_SIZE)
 
 /*
  * Bits in a linux-style PTE.  These match the bits in the
@@ -239,9 +240,6 @@ static inline pte_t pfn_pte(unsigned long pfn, pgprot_t pgprot)
 /* This now only contains the vmalloc pages */
 #define pgd_offset_k(address) pgd_offset(&init_mm, address)
 
-/* to find an entry in the ioremap page-table-directory */
-#define pgd_offset_i(address) (ioremap_pgd + pgd_index(address))
-
 /*
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
@@ -459,15 +457,12 @@ extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long addr,
 #define __HAVE_ARCH_PTE_SAME
 #define pte_same(A,B)  (((pte_val(A) ^ pte_val(B)) & ~_PAGE_HPTEFLAGS) == 0)
 
-extern unsigned long ioremap_bot, ioremap_base;
-
 #define pmd_ERROR(e) \
        printk("%s:%d: bad pmd %08x.\n", __FILE__, __LINE__, pmd_val(e))
 #define pgd_ERROR(e) \
        printk("%s:%d: bad pgd %08x.\n", __FILE__, __LINE__, pgd_val(e))
 
 extern pgd_t swapper_pg_dir[];
-extern pgd_t ioremap_dir[];
 
 extern void paging_init(void);
 
index 0035efe2db2ba7591fce0f6be861e6f23b7ecfd6..3084099086a820f2d25d13456e86bf258f4ed388 100644 (file)
 
 /* Special Purpose Registers (SPRNs)*/
 
-#define        SPRN_CDBCR      0x3D7   /* Cache Debug Control Register */
 #define        SPRN_CTR        0x009   /* Count Register */
 #define        SPRN_DABR       0x3F5   /* Data Address Breakpoint Register */
-#define        SPRN_DAC1       0x3F6   /* Data Address Compare 1 */
-#define        SPRN_DAC2       0x3F7   /* Data Address Compare 2 */
+#define   DABR_TRANSLATION     (1UL << 2)
 #define        SPRN_DAR        0x013   /* Data Address Register */
-#define        SPRN_DBCR       0x3F2   /* Debug Control Regsiter */
-#define          DBCR_EDM      0x80000000
-#define          DBCR_IDM      0x40000000
-#define          DBCR_RST(x)   (((x) & 0x3) << 28)
-#define            DBCR_RST_NONE               0
-#define            DBCR_RST_CORE               1
-#define            DBCR_RST_CHIP               2
-#define            DBCR_RST_SYSTEM             3
-#define          DBCR_IC       0x08000000      /* Instruction Completion Debug Evnt */
-#define          DBCR_BT       0x04000000      /* Branch Taken Debug Event */
-#define          DBCR_EDE      0x02000000      /* Exception Debug Event */
-#define          DBCR_TDE      0x01000000      /* TRAP Debug Event */
-#define          DBCR_FER      0x00F80000      /* First Events Remaining Mask */
-#define          DBCR_FT       0x00040000      /* Freeze Timers on Debug Event */
-#define          DBCR_IA1      0x00020000      /* Instr. Addr. Compare 1 Enable */
-#define          DBCR_IA2      0x00010000      /* Instr. Addr. Compare 2 Enable */
-#define          DBCR_D1R      0x00008000      /* Data Addr. Compare 1 Read Enable */
-#define          DBCR_D1W      0x00004000      /* Data Addr. Compare 1 Write Enable */
-#define          DBCR_D1S(x)   (((x) & 0x3) << 12)     /* Data Adrr. Compare 1 Size */
-#define            DAC_BYTE    0
-#define            DAC_HALF    1
-#define            DAC_WORD    2
-#define            DAC_QUAD    3
-#define          DBCR_D2R      0x00000800      /* Data Addr. Compare 2 Read Enable */
-#define          DBCR_D2W      0x00000400      /* Data Addr. Compare 2 Write Enable */
-#define          DBCR_D2S(x)   (((x) & 0x3) << 8)      /* Data Addr. Compare 2 Size */
-#define          DBCR_SBT      0x00000040      /* Second Branch Taken Debug Event */
-#define          DBCR_SED      0x00000020      /* Second Exception Debug Event */
-#define          DBCR_STD      0x00000010      /* Second Trap Debug Event */
-#define          DBCR_SIA      0x00000008      /* Second IAC Enable */
-#define          DBCR_SDA      0x00000004      /* Second DAC Enable */
-#define          DBCR_JOI      0x00000002      /* JTAG Serial Outbound Int. Enable */
-#define          DBCR_JII      0x00000001      /* JTAG Serial Inbound Int. Enable */
-#define        SPRN_DBCR0      0x3F2   /* Debug Control Register 0 */
-#define        SPRN_DBCR1      0x3BD   /* Debug Control Register 1 */
-#define        SPRN_DBSR       0x3F0   /* Debug Status Register */
-#define        SPRN_DCCR       0x3FA   /* Data Cache Cacheability Register */
-#define          DCCR_NOCACHE          0       /* Noncacheable */
-#define          DCCR_CACHE            1       /* Cacheable */
-#define        SPRN_DCMP       0x3D1   /* Data TLB Compare Register */
-#define        SPRN_DCWR       0x3BA   /* Data Cache Write-thru Register */
-#define          DCWR_COPY             0       /* Copy-back */
-#define          DCWR_WRITE            1       /* Write-through */
-#define        SPRN_DEAR       0x3D5   /* Data Error Address Register */
 #define        SPRN_DEC        0x016   /* Decrement Register */
-#define        SPRN_DMISS      0x3D0   /* Data TLB Miss Register */
 #define        SPRN_DSISR      0x012   /* Data Storage Interrupt Status Register */
 #define   DSISR_NOHPTE         0x40000000      /* no translation found */
 #define   DSISR_PROTFAULT      0x08000000      /* protection fault */
 #define   DSISR_ISSTORE                0x02000000      /* access was a store */
 #define   DSISR_DABRMATCH      0x00400000      /* hit data breakpoint */
 #define   DSISR_NOSEGMENT      0x00200000      /* STAB/SLB miss */
-#define        SPRN_EAR        0x11A   /* External Address Register */
-#define        SPRN_ESR        0x3D4   /* Exception Syndrome Register */
-#define          ESR_IMCP      0x80000000      /* Instr. Machine Check - Protection */
-#define          ESR_IMCN      0x40000000      /* Instr. Machine Check - Non-config */
-#define          ESR_IMCB      0x20000000      /* Instr. Machine Check - Bus error */
-#define          ESR_IMCT      0x10000000      /* Instr. Machine Check - Timeout */
-#define          ESR_PIL       0x08000000      /* Program Exception - Illegal */
-#define          ESR_PPR       0x04000000      /* Program Exception - Priveleged */
-#define          ESR_PTR       0x02000000      /* Program Exception - Trap */
-#define          ESR_DST       0x00800000      /* Storage Exception - Data miss */
-#define          ESR_DIZ       0x00400000      /* Storage Exception - Zone fault */
-#define        SPRN_EVPR       0x3D6   /* Exception Vector Prefix Register */
-#define        SPRN_HASH1      0x3D2   /* Primary Hash Address Register */
-#define        SPRN_HASH2      0x3D3   /* Secondary Hash Address Resgister */
 #define        SPRN_HID0       0x3F0   /* Hardware Implementation Register 0 */
-#define          HID0_EMCP     (1<<31)         /* Enable Machine Check pin */
-#define          HID0_EBA      (1<<29)         /* Enable Bus Address Parity */
-#define          HID0_EBD      (1<<28)         /* Enable Bus Data Parity */
-#define          HID0_SBCLK    (1<<27)
-#define          HID0_EICE     (1<<26)
-#define          HID0_ECLK     (1<<25)
-#define          HID0_PAR      (1<<24)
-#define          HID0_DOZE     (1<<23)
-#define          HID0_NAP      (1<<22)
-#define          HID0_SLEEP    (1<<21)
-#define          HID0_DPM      (1<<20)
-#define          HID0_ICE      (1<<15)         /* Instruction Cache Enable */
-#define          HID0_DCE      (1<<14)         /* Data Cache Enable */
-#define          HID0_ILOCK    (1<<13)         /* Instruction Cache Lock */
-#define          HID0_DLOCK    (1<<12)         /* Data Cache Lock */
-#define          HID0_ICFI     (1<<11)         /* Instr. Cache Flash Invalidate */
-#define          HID0_DCI      (1<<10)         /* Data Cache Invalidate */
-#define   HID0_SPD     (1<<9)          /* Speculative disable */
-#define   HID0_SGE     (1<<7)          /* Store Gathering Enable */
-#define          HID0_SIED     (1<<7)          /* Serial Instr. Execution [Disable] */
-#define   HID0_BTIC    (1<<5)          /* Branch Target Instruction Cache Enable */
-#define   HID0_ABE     (1<<3)          /* Address Broadcast Enable */
-#define          HID0_BHTE     (1<<2)          /* Branch History Table Enable */
-#define          HID0_BTCD     (1<<1)          /* Branch target cache disable */
 #define        SPRN_MSRDORM    0x3F1   /* Hardware Implementation Register 1 */
 #define SPRN_HID1      0x3F1   /* Hardware Implementation Register 1 */
 #define        SPRN_IABR       0x3F2   /* Instruction Address Breakpoint Register */
 #define SPRN_HID5      0x3F6   /* 970 HID5 */
 #define        SPRN_TSC        0x3FD   /* Thread switch control */
 #define        SPRN_TST        0x3FC   /* Thread switch timeout */
-#define        SPRN_IAC1       0x3F4   /* Instruction Address Compare 1 */
-#define        SPRN_IAC2       0x3F5   /* Instruction Address Compare 2 */
-#define        SPRN_ICCR       0x3FB   /* Instruction Cache Cacheability Register */
-#define          ICCR_NOCACHE          0       /* Noncacheable */
-#define          ICCR_CACHE            1       /* Cacheable */
-#define        SPRN_ICDBDR     0x3D3   /* Instruction Cache Debug Data Register */
-#define        SPRN_ICMP       0x3D5   /* Instruction TLB Compare Register */
-#define        SPRN_ICTC       0x3FB   /* Instruction Cache Throttling Control Reg */
-#define        SPRN_IMISS      0x3D4   /* Instruction TLB Miss Register */
-#define        SPRN_IMMR       0x27E   /* Internal Memory Map Register */
 #define        SPRN_L2CR       0x3F9   /* Level 2 Cache Control Regsiter */
 #define        SPRN_LR         0x008   /* Link Register */
-#define        SPRN_PBL1       0x3FC   /* Protection Bound Lower 1 */
-#define        SPRN_PBL2       0x3FE   /* Protection Bound Lower 2 */
-#define        SPRN_PBU1       0x3FD   /* Protection Bound Upper 1 */
-#define        SPRN_PBU2       0x3FF   /* Protection Bound Upper 2 */
-#define        SPRN_PID        0x3B1   /* Process ID */
 #define        SPRN_PIR        0x3FF   /* Processor Identification Register */
 #define        SPRN_PIT        0x3DB   /* Programmable Interval Timer */
 #define        SPRN_PURR       0x135   /* Processor Utilization of Resources Register */
 #define        SPRN_RPA        0x3D6   /* Required Physical Address Register */
 #define        SPRN_SDA        0x3BF   /* Sampled Data Address Register */
 #define        SPRN_SDR1       0x019   /* MMU Hash Base Register */
-#define        SPRN_SGR        0x3B9   /* Storage Guarded Register */
-#define          SGR_NORMAL            0
-#define          SGR_GUARDED           1
 #define        SPRN_SIA        0x3BB   /* Sampled Instruction Address Register */
 #define        SPRN_SPRG0      0x110   /* Special Purpose Register General 0 */
 #define        SPRN_SPRG1      0x111   /* Special Purpose Register General 1 */
 #define        SPRN_TBWL       0x11C   /* Time Base Lower Register (super, W/O) */
 #define        SPRN_TBWU       0x11D   /* Time Base Write Upper Register (super, W/O) */
 #define SPRN_HIOR      0x137   /* 970 Hypervisor interrupt offset */
-#define        SPRN_TCR        0x3DA   /* Timer Control Register */
-#define          TCR_WP(x)             (((x)&0x3)<<30) /* WDT Period */
-#define            WP_2_17             0               /* 2^17 clocks */
-#define            WP_2_21             1               /* 2^21 clocks */
-#define            WP_2_25             2               /* 2^25 clocks */
-#define            WP_2_29             3               /* 2^29 clocks */
-#define          TCR_WRC(x)            (((x)&0x3)<<28) /* WDT Reset Control */
-#define            WRC_NONE            0               /* No reset will occur */
-#define            WRC_CORE            1               /* Core reset will occur */
-#define            WRC_CHIP            2               /* Chip reset will occur */
-#define            WRC_SYSTEM          3               /* System reset will occur */
-#define          TCR_WIE               0x08000000      /* WDT Interrupt Enable */
-#define          TCR_PIE               0x04000000      /* PIT Interrupt Enable */
-#define          TCR_FP(x)             (((x)&0x3)<<24) /* FIT Period */
-#define            FP_2_9              0               /* 2^9 clocks */
-#define            FP_2_13             1               /* 2^13 clocks */
-#define            FP_2_17             2               /* 2^17 clocks */
-#define            FP_2_21             3               /* 2^21 clocks */
-#define          TCR_FIE               0x00800000      /* FIT Interrupt Enable */
-#define          TCR_ARE               0x00400000      /* Auto Reload Enable */
-#define        SPRN_THRM1      0x3FC   /* Thermal Management Register 1 */
-#define          THRM1_TIN             (1<<0)
-#define          THRM1_TIV             (1<<1)
-#define          THRM1_THRES           (0x7f<<2)
-#define          THRM1_TID             (1<<29)
-#define          THRM1_TIE             (1<<30)
-#define          THRM1_V               (1<<31)
-#define        SPRN_THRM2      0x3FD   /* Thermal Management Register 2 */
-#define        SPRN_THRM3      0x3FE   /* Thermal Management Register 3 */
-#define          THRM3_E               (1<<31)
-#define        SPRN_TSR        0x3D8   /* Timer Status Register */
-#define          TSR_ENW               0x80000000      /* Enable Next Watchdog */
-#define          TSR_WIS               0x40000000      /* WDT Interrupt Status */
-#define          TSR_WRS(x)            (((x)&0x3)<<28) /* WDT Reset Status */
-#define            WRS_NONE            0               /* No WDT reset occurred */
-#define            WRS_CORE            1               /* WDT forced core reset */
-#define            WRS_CHIP            2               /* WDT forced chip reset */
-#define            WRS_SYSTEM          3               /* WDT forced system reset */
-#define          TSR_PIS               0x08000000      /* PIT Interrupt Status */
-#define          TSR_FIS               0x04000000      /* FIT Interrupt Status */
 #define        SPRN_USIA       0x3AB   /* User Sampled Instruction Address Register */
 #define        SPRN_XER        0x001   /* Fixed Point Exception Register */
-#define        SPRN_ZPR        0x3B0   /* Zone Protection Register */
 #define SPRN_VRSAVE     0x100   /* Vector save */
+#define SPRN_CTRLF     0x088
+#define SPRN_CTRLT     0x098
+#define   CTRL_RUNLATCH        0x1
 
 /* Performance monitor SPRs */
 #define SPRN_SIAR      780
 #define        CTR     SPRN_CTR        /* Counter Register */
 #define        DAR     SPRN_DAR        /* Data Address Register */
 #define        DABR    SPRN_DABR       /* Data Address Breakpoint Register */
-#define        DCMP    SPRN_DCMP       /* Data TLB Compare Register */
 #define        DEC     SPRN_DEC        /* Decrement Register */
-#define        DMISS   SPRN_DMISS      /* Data TLB Miss Register */
 #define        DSISR   SPRN_DSISR      /* Data Storage Interrupt Status Register */
-#define        EAR     SPRN_EAR        /* External Address Register */
-#define        HASH1   SPRN_HASH1      /* Primary Hash Address Register */
-#define        HASH2   SPRN_HASH2      /* Secondary Hash Address Register */
 #define        HID0    SPRN_HID0       /* Hardware Implementation Register 0 */
 #define        MSRDORM SPRN_MSRDORM    /* MSR Dormant Register */
 #define        NIADORM SPRN_NIADORM    /* NIA Dormant Register */
 #define        TSC     SPRN_TSC        /* Thread switch control */
 #define        TST     SPRN_TST        /* Thread switch timeout */
 #define        IABR    SPRN_IABR       /* Instruction Address Breakpoint Register */
-#define        ICMP    SPRN_ICMP       /* Instruction TLB Compare Register */
-#define        IMISS   SPRN_IMISS      /* Instruction TLB Miss Register */
-#define        IMMR    SPRN_IMMR       /* PPC 860/821 Internal Memory Map Register */
 #define        L2CR    SPRN_L2CR       /* PPC 750 L2 control register */
 #define        __LR    SPRN_LR
 #define        PVR     SPRN_PVR        /* Processor Version */
 #define        PIR     SPRN_PIR        /* Processor ID */
 #define        PURR    SPRN_PURR       /* Processor Utilization of Resource Register */
-//#define      RPA     SPRN_RPA        /* Required Physical Address Register */
 #define        SDR1    SPRN_SDR1       /* MMU hash base register */
 #define        SPR0    SPRN_SPRG0      /* Supervisor Private Registers */
 #define        SPR1    SPRN_SPRG1
 #define        TBRU    SPRN_TBRU       /* Time Base Read Upper Register */
 #define        TBWL    SPRN_TBWL       /* Time Base Write Lower Register */
 #define        TBWU    SPRN_TBWU       /* Time Base Write Upper Register */
-#define ICTC   1019
-#define        THRM1   SPRN_THRM1      /* Thermal Management Register 1 */
-#define        THRM2   SPRN_THRM2      /* Thermal Management Register 2 */
-#define        THRM3   SPRN_THRM3      /* Thermal Management Register 3 */
 #define        XER     SPRN_XER
 
 /* Processor Version Register (PVR) field extraction */
 #define XGLUE(a,b) a##b
 #define GLUE(a,b) XGLUE(a,b)
 
-/* iSeries CTRL register (for runlatch) */
-
-#define CTRLT          0x098
-#define CTRLF          0x088
-#define RUNLATCH       0x0001
-
 #ifdef __ASSEMBLY__
 
 #define _GLOBAL(name) \
@@ -589,16 +429,6 @@ struct thread_struct {
        .fpexc_mode = MSR_FE0|MSR_FE1, \
 }
 
-/*
- * Note: the vm_start and vm_end fields here should *not*
- * be in kernel space.  (Could vm_end == vm_start perhaps?)
- */
-#define IOREMAP_MMAP { &ioremap_mm, 0, 0x1000, NULL, \
-                   PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, \
-                   1, NULL, NULL }
-
-extern struct mm_struct ioremap_mm;
-
 /*
  * Return saved PC of a blocked thread. For now, this is the "user" PC
  */
@@ -656,6 +486,24 @@ static inline void prefetchw(const void *x)
 
 #define HAVE_ARCH_PICK_MMAP_LAYOUT
 
+static inline void ppc64_runlatch_on(void)
+{
+       unsigned long ctrl;
+
+       ctrl = mfspr(SPRN_CTRLF);
+       ctrl |= CTRL_RUNLATCH;
+       mtspr(SPRN_CTRLT, ctrl);
+}
+
+static inline void ppc64_runlatch_off(void)
+{
+       unsigned long ctrl;
+
+       ctrl = mfspr(SPRN_CTRLF);
+       ctrl &= ~CTRL_RUNLATCH;
+       mtspr(SPRN_CTRLT, ctrl);
+}
+
 #endif /* __KERNEL__ */
 
 #endif /* __ASSEMBLY__ */
index 2440a2c90ae9a889e1fc81b4c34b61b171fb6c7d..04b1a84f7ca390c5f6c3ad6f5ea9bb22f44f2d40 100644 (file)
@@ -147,9 +147,7 @@ struct device_node {
        struct  device_node *sibling;
        struct  device_node *next;      /* next device of same type */
        struct  device_node *allnext;   /* next in list of all nodes */
-       struct  proc_dir_entry *pde;       /* this node's proc directory */
-       struct  proc_dir_entry *name_link; /* name symlink */
-       struct  proc_dir_entry *addr_link; /* addr symlink */
+       struct  proc_dir_entry *pde;    /* this node's proc directory */
        struct  kref kref;
        unsigned long _flags;
 };
@@ -174,15 +172,6 @@ static inline void set_node_proc_entry(struct device_node *dn, struct proc_dir_e
        dn->pde = de;
 }
 
-static void inline set_node_name_link(struct device_node *dn, struct proc_dir_entry *de)
-{
-       dn->name_link = de;
-}
-
-static void inline set_node_addr_link(struct device_node *dn, struct proc_dir_entry *de)
-{
-       dn->addr_link = de;
-}
 
 /* OBSOLETE: Old stlye node lookup */
 extern struct device_node *find_devices(const char *name);
index c8646fa999c2ff61217ff01b2cb702784a5ed1df..8115ecb8feee24abd99a25b3659fb58d98315ce0 100644 (file)
@@ -45,7 +45,7 @@ void generic_cpu_die(unsigned int cpu);
 void generic_mach_cpu_die(void);
 #endif
 
-#define __smp_processor_id() (get_paca()->paca_index)
+#define raw_smp_processor_id() (get_paca()->paca_index)
 #define hard_smp_processor_id() (get_paca()->hw_cpu_id)
 
 extern cpumask_t cpu_sibling_map[NR_CPUS];
index 037b5e06083c0c58ca8f2c624c7edd3b6c12df3a..48b7900e90ec2db801de1a22fe50c2b4ff429c33 100644 (file)
@@ -96,7 +96,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_32BIT              5       /* 32 bit binary */
-#define TIF_RUN_LIGHT          6       /* iSeries run light */
+/* #define SPARE               6 */
 #define TIF_ABI_PENDING                7       /* 32/64 bit switch needed */
 #define TIF_SYSCALL_AUDIT      8       /* syscall auditing active */
 #define TIF_SINGLESTEP         9       /* singlestepping active */
@@ -110,7 +110,7 @@ static inline struct thread_info *current_thread_info(void)
 #define _TIF_NEED_RESCHED      (1<<TIF_NEED_RESCHED)
 #define _TIF_POLLING_NRFLAG    (1<<TIF_POLLING_NRFLAG)
 #define _TIF_32BIT             (1<<TIF_32BIT)
-#define _TIF_RUN_LIGHT         (1<<TIF_RUN_LIGHT)
+/* #define _SPARE              (1<<SPARE) */
 #define _TIF_ABI_PENDING       (1<<TIF_ABI_PENDING)
 #define _TIF_SYSCALL_AUDIT     (1<<TIF_SYSCALL_AUDIT)
 #define _TIF_SINGLESTEP                (1<<TIF_SINGLESTEP)
index 9473786387a349123cafb4cd43221bf884ccd089..dd50e57a928f2a6fa37e29b5cca503075221971c 100644 (file)
@@ -47,7 +47,7 @@ extern int smp_call_function_on(void (*func) (void *info), void *info,
  
 #define PROC_CHANGE_PENALTY    20              /* Schedule penalty */
 
-#define smp_processor_id() (S390_lowcore.cpu_data.cpu_nr)
+#define raw_smp_processor_id() (S390_lowcore.cpu_data.cpu_nr)
 
 extern int smp_get_cpu(cpumask_t cpu_map);
 extern void smp_put_cpu(int cpu);
index c64f8c181df39b6f8d3890be531645efab24026d..1dc74baf03c4c16027d1811bfd32bf4be00c21b9 100644 (file)
@@ -10,7 +10,7 @@
 #define _S390_USER_H
 
 #include <asm/page.h>
-#include <linux/ptrace.h>
+#include <asm/ptrace.h>
 /* Core file format: The core file is written in such a way that gdb
    can understand it and provide useful information to the user (under
    linux we use the 'trad-core' bfd).  There are quite a number of
index 4c6d129e7d91e0dbe52657c575b689d5a9fa96a5..180467be8e7bb84c7f4f41397697bfc503b2ef98 100644 (file)
@@ -31,6 +31,7 @@
 #define HPAGE_SIZE             (1UL << HPAGE_SHIFT)
 #define HPAGE_MASK             (~(HPAGE_SIZE-1))
 #define HUGETLB_PAGE_ORDER     (HPAGE_SHIFT-PAGE_SHIFT)
+#define ARCH_HAS_SETCLEAR_HUGE_PTE
 #endif
 
 #ifdef __KERNEL__
index cd847a47a9aa1a681d8f44cf250d9e12f8341ea3..ecb909572d3fc955efba94c6bb1035f28e203ab0 100644 (file)
@@ -196,6 +196,7 @@ static inline pte_t pte_mkexec(pte_t pte)   { set_pte(&pte, __pte(pte_val(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_mkwrite(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) | _PAGE_RW)); return pte; }
+static inline pte_t pte_mkhuge(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) | _PAGE_SZHUGE)); return pte; }
 
 /*
  * Macro and implementation to make a page protection as uncachable.
index 38b54469d7d1a1557715f2196f703094a6c93cb1..f19a8b3b69a6a24af8519ab3828469ed510eb5d3 100644 (file)
@@ -25,7 +25,7 @@ extern cpumask_t cpu_possible_map;
 
 #define cpu_online(cpu)                cpu_isset(cpu, cpu_online_map)
 
-#define smp_processor_id()     (current_thread_info()->cpu)
+#define raw_smp_processor_id() (current_thread_info()->cpu)
 
 /* I've no idea what the real meaning of this is */
 #define PROC_CHANGE_PENALTY    20
index d82f883d8e6d3b68fe571b724103a528eb7f4fbc..4bbbd9f3c37e91ad5524133b182d8d3ff3cf5197 100644 (file)
@@ -27,7 +27,7 @@ struct thread_info {
 
 #endif
 
-#define PREEMPT_ACTIVE         0x4000000
+#define PREEMPT_ACTIVE         0x10000000
 
 /*
  * macros/functions for gaining access to the thread information structure
index e1f7f5a41210f7421f64e2a1a31f92d7aa950f64..d6167f1c0e99ef10f86877259441bfb7c5e4e908 100644 (file)
@@ -41,6 +41,7 @@
 #define HPAGE_SIZE             (1UL << HPAGE_SHIFT)
 #define HPAGE_MASK             (~(HPAGE_SIZE-1))
 #define HUGETLB_PAGE_ORDER     (HPAGE_SHIFT-PAGE_SHIFT)
+#define ARCH_HAS_SETCLEAR_HUGE_PTE
 #endif
 
 #ifdef __KERNEL__
index 525e1523ef5f229b49d61e413e0aa2561e4a7383..78ac6be2d9ef0ebe6de29d7e4f8a5a7be3e91e34 100644 (file)
@@ -430,6 +430,8 @@ extern inline pte_t pte_mkwrite(pte_t pte)  { set_pte(&pte, __pte(pte_val(pte) |
 extern inline pte_t pte_mkexec(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) | _PAGE_EXECUTE)); return pte; }
 extern inline pte_t pte_mkdirty(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) | _PAGE_DIRTY)); return pte; }
 extern inline pte_t pte_mkyoung(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) | _PAGE_ACCESSED)); return pte; }
+extern inline pte_t pte_mkhuge(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) | _PAGE_SZHUGE)); return pte; }
+
 
 /*
  * Conversion functions: convert a page and protection to a page entry.
index e65f394da472a7c4adfcf6a79f7da692a2d42cbb..8a32d6bd0b793b947deab7c6f311b3e6c49d5106 100644 (file)
@@ -73,7 +73,7 @@ static inline struct thread_info *current_thread_info(void)
 
 #define THREAD_SIZE  8192
 
-#define PREEMPT_ACTIVE         0x4000000
+#define PREEMPT_ACTIVE         0x10000000
 
 /* thread information flags */
 #define TIF_SYSCALL_TRACE      0       /* syscall trace active */
index f986c0d0922a1c87215fb48456a41132245616a0..4f96d8333a12ad362a70b3c86d95937564cd43c5 100644 (file)
@@ -148,7 +148,7 @@ extern __inline__ int hard_smp_processor_id(void)
 }
 #endif
 
-#define smp_processor_id()     (current_thread_info()->cpu)
+#define raw_smp_processor_id()         (current_thread_info()->cpu)
 
 #define prof_multiplier(__cpu)         cpu_data(__cpu).multiplier
 #define prof_counter(__cpu)            cpu_data(__cpu).counter
index f461144067eea33924e44f9223002ef7e723200e..0a780e84a12b749fd6f1e4381407f34affcb895b 100644 (file)
  * No one can read/write anything from userland in the kernel space by setting
  * large size and address near to PAGE_OFFSET - a fault will break his intentions.
  */
-#define __user_ok(addr,size) ((addr) < STACK_TOP)
+#define __user_ok(addr, size) ({ (void)(size); (addr) < STACK_TOP; })
 #define __kernel_ok (segment_eq(get_fs(), KERNEL_DS))
 #define __access_ok(addr,size) (__user_ok((addr) & get_fs().seg,(size)))
-#define access_ok(type,addr,size) __access_ok((unsigned long)(addr),(size))
+#define access_ok(type, addr, size)                                    \
+       ({ (void)(type); __access_ok((unsigned long)(addr), size); })
 
 /* this function will go away soon - use access_ok() instead */
 static inline int __deprecated verify_area(int type, const void __user * addr, unsigned long size)
index ba05bdf9a211db17909d773b559738167ea826b5..58f8cb6ae767d536769a8a43ab46564a5665b96b 100644 (file)
@@ -8,4 +8,14 @@
 #define flush_agp_mappings() 
 #define flush_agp_cache() mb()
 
+/* Convert a physical address to an address suitable for the GART. */
+#define phys_to_gart(x) (x)
+#define gart_to_phys(x) (x)
+
+/* GATT allocation. Returns/accepts GATT kernel virtual address. */
+#define alloc_gatt_pages(order)                \
+       ((char *)__get_free_pages(GFP_KERNEL, (order)))
+#define free_gatt_pages(table, order)  \
+       free_pages((unsigned long)(table), (order))
+
 #endif
index 5fd16e42a0455b00de9434ea020314de8973df55..0de7a3da79cd7e94b462be4076793d13244a3f95 100644 (file)
@@ -16,4 +16,6 @@
 #define IOPTE_CACHE   0x0000000000000010UL /* Cached (in UPA E-cache)         */
 #define IOPTE_WRITE   0x0000000000000002UL /* Writeable                       */
 
+#define IOMMU_NUM_CTXS 4096
+
 #endif /* !(_SPARC_IOMMU_H) */
index 219ea043a14a842268ca8656faa4c9d2a11fb2b1..b87dbbd64bc9ca723e3077521cb5cd87af63906e 100644 (file)
@@ -95,6 +95,8 @@ typedef unsigned long pgprot_t;
 #define HPAGE_SIZE             (_AC(1,UL) << HPAGE_SHIFT)
 #define HPAGE_MASK             (~(HPAGE_SIZE - 1UL))
 #define HUGETLB_PAGE_ORDER     (HPAGE_SHIFT - PAGE_SHIFT)
+#define ARCH_HAS_SETCLEAR_HUGE_PTE
+#define ARCH_HAS_HUGETLB_PREFAULT_HOOK
 #endif
 
 #define TASK_UNMAPPED_BASE     (test_thread_flag(TIF_32BIT) ? \
index 92999631c81966a7a310d6b718955b83fd378fbe..4c15610a2bac188a8f408396d207bd0ff570ab6a 100644 (file)
@@ -15,6 +15,7 @@
 #include <asm/io.h>
 #include <asm/page.h>
 #include <asm/oplib.h>
+#include <asm/iommu.h>
 
 /* The abstraction used here is that there are PCI controllers,
  * each with one (Sabre) or two (PSYCHO/SCHIZO) PCI bus modules
@@ -40,9 +41,6 @@ struct pci_iommu {
         */
        spinlock_t      lock;
 
-       /* Context allocator. */
-       unsigned int    iommu_cur_ctx;
-
        /* IOMMU page table, a linear array of ioptes. */
        iopte_t         *page_table;            /* The page table itself. */
        int             page_table_sz_bits;     /* log2 of ow many pages does it map? */
@@ -87,6 +85,10 @@ struct pci_iommu {
                u16     flush;
        } alloc_info[PBM_NCLUSTERS];
 
+       /* CTX allocation. */
+       unsigned long ctx_lowest_free;
+       unsigned long ctx_bitmap[IOMMU_NUM_CTXS / (sizeof(unsigned long) * 8)];
+
        /* Here a PCI controller driver describes the areas of
         * PCI memory space where DMA to/from physical memory
         * are addressed.  Drivers interrogate the PCI layer
index ae2cd5b09a7cc523e96640d805eb97e299da8907..1ae00c5087f10d6eb3a0c2ea8c6ade9ff304774b 100644 (file)
@@ -286,6 +286,7 @@ static inline pte_t pte_modify(pte_t orig_pte, pgprot_t new_prot)
 #define pte_mkyoung(pte)       (__pte(pte_val(pte) | _PAGE_ACCESSED | _PAGE_R))
 #define pte_mkwrite(pte)       (__pte(pte_val(pte) | _PAGE_WRITE))
 #define pte_mkdirty(pte)       (__pte(pte_val(pte) | _PAGE_MODIFIED | _PAGE_W))
+#define pte_mkhuge(pte)                (__pte(pte_val(pte) | _PAGE_SZHUGE))
 
 /* to find an entry in a page-table-directory. */
 #define pgd_index(address)     (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1))
index bc1445b904efdb80a1991c895ae52ba4d067bc9b..d0bee2413560147a62b4f7f1af7ea7f781e0b847 100644 (file)
@@ -192,6 +192,40 @@ extern unsigned long get_wchan(struct task_struct *task);
 
 #define cpu_relax()    barrier()
 
+/* Prefetch support.  This is tuned for UltraSPARC-III and later.
+ * UltraSPARC-I will treat these as nops, and UltraSPARC-II has
+ * a shallower prefetch queue than later chips.
+ */
+#define ARCH_HAS_PREFETCH
+#define ARCH_HAS_PREFETCHW
+#define ARCH_HAS_SPINLOCK_PREFETCH
+
+static inline void prefetch(const void *x)
+{
+       /* We do not use the read prefetch mnemonic because that
+        * prefetches into the prefetch-cache which only is accessible
+        * by floating point operations in UltraSPARC-III and later.
+        * By contrast, "#one_write" prefetches into the L2 cache
+        * in shared state.
+        */
+       __asm__ __volatile__("prefetch [%0], #one_write"
+                            : /* no outputs */
+                            : "r" (x));
+}
+
+static inline void prefetchw(const void *x)
+{
+       /* The most optimal prefetch to use for writes is
+        * "#n_writes".  This brings the cacheline into the
+        * L2 cache in "owned" state.
+        */
+       __asm__ __volatile__("prefetch [%0], #n_writes"
+                            : /* no outputs */
+                            : "r" (x));
+}
+
+#define spin_lock_prefetch(x)  prefetchw(x)
+
 #endif /* !(__ASSEMBLY__) */
 
 #endif /* !(__ASM_SPARC64_PROCESSOR_H) */
index 5e3e06d908feb9b19f33b0b18816d1da8e823710..110a2de891239407ff048772b920fa531119a7eb 100644 (file)
@@ -64,7 +64,7 @@ static __inline__ int hard_smp_processor_id(void)
        }
 }
 
-#define smp_processor_id() (current_thread_info()->cpu)
+#define raw_smp_processor_id() (current_thread_info()->cpu)
 
 #endif /* !(__ASSEMBLY__) */
 
index ad78ce64d69ee8f04f35e03301826b74c42b5298..9d7613eea8129a58dbbcca8dbaef05f2228f6d66 100644 (file)
@@ -48,6 +48,9 @@ enum ultra_tlb_layout {
 
 extern enum ultra_tlb_layout tlb_type;
 
+extern int cheetah_pcache_forced_on;
+extern void cheetah_enable_pcache(void);
+
 #define sparc64_highest_locked_tlbent()        \
        (tlb_type == spitfire ? \
         SPITFIRE_HIGHEST_LOCKED_TLBENT : \
diff --git a/include/asm-um/arch-signal-i386.h b/include/asm-um/arch-signal-i386.h
deleted file mode 100644 (file)
index e69de29..0000000
index b72e23519e0057d01ded86eb85864a7da2952783..9bab712dc5c0f50917249a47ecffcf59a356d329 100644 (file)
@@ -5,7 +5,7 @@
 #ifndef __UM_ELF_I386_H
 #define __UM_ELF_I386_H
 
-#include "user.h"
+#include <asm/user.h>
 
 #define R_386_NONE     0
 #define R_386_32       1
index 19309d001aa0371e7b2d936b0c512d053e5357dd..8a8246d039363f0bd60c43584050de3e620caa1f 100644 (file)
@@ -8,6 +8,27 @@
 
 #include <asm/user.h>
 
+/* x86-64 relocation types, taken from asm-x86_64/elf.h */
+#define R_X86_64_NONE          0       /* No reloc */
+#define R_X86_64_64            1       /* Direct 64 bit  */
+#define R_X86_64_PC32          2       /* PC relative 32 bit signed */
+#define R_X86_64_GOT32         3       /* 32 bit GOT entry */
+#define R_X86_64_PLT32         4       /* 32 bit PLT address */
+#define R_X86_64_COPY          5       /* Copy symbol at runtime */
+#define R_X86_64_GLOB_DAT      6       /* Create GOT entry */
+#define R_X86_64_JUMP_SLOT     7       /* Create PLT entry */
+#define R_X86_64_RELATIVE      8       /* Adjust by program base */
+#define R_X86_64_GOTPCREL      9       /* 32 bit signed pc relative
+                                          offset to GOT */
+#define R_X86_64_32            10      /* Direct 32 bit zero extended */
+#define R_X86_64_32S           11      /* Direct 32 bit sign extended */
+#define R_X86_64_16            12      /* Direct 16 bit zero extended */
+#define R_X86_64_PC16          13      /* 16 bit sign extended pc relative */
+#define R_X86_64_8             14      /* Direct 8 bit sign extended  */
+#define R_X86_64_PC8           15      /* 8 bit sign extended pc relative */
+
+#define R_X86_64_NUM           16
+
 typedef unsigned long elf_greg_t;
 
 #define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))
@@ -44,7 +65,8 @@ typedef struct { } elf_fpregset_t;
 } while (0)
 
 #ifdef TIF_IA32 /* XXX */
-        clear_thread_flag(TIF_IA32); \
+#error XXX, indeed
+        clear_thread_flag(TIF_IA32);
 #endif
 
 #define USE_ELF_CORE_DUMP
diff --git a/include/asm-um/elf.h b/include/asm-um/elf.h
deleted file mode 100644 (file)
index e69de29..0000000
index 504ea8e486b0532d5d70c387cf262d3c92d8a148..5afee8a8cdf39ea0ec3135feab5b45c269daccdd 100644 (file)
@@ -98,7 +98,13 @@ extern unsigned long uml_physmem;
 
 extern unsigned long to_phys(void *virt);
 extern void *to_virt(unsigned long phys);
-#define __pa(virt) to_phys((void *) virt)
+
+/* Cast to unsigned long before casting to void * to avoid a warning from
+ * mmap_kmem about cutting a long long down to a void *.  Not sure that
+ * casting is the right thing, but 32-bit UML can't have 64-bit virtual
+ * addresses
+ */
+#define __pa(virt) to_phys((void *) (unsigned long) virt)
 #define __va(phys) to_virt((unsigned long) phys)
 
 #define page_to_pfn(page) ((page) - mem_map)
index 510e513c7f889c932b98cafacb9843c69c5e176f..a88040920311e7e7333d65e3610fe574b8ce4259 100644 (file)
@@ -114,17 +114,9 @@ extern unsigned long end_iomem;
 extern unsigned long pg0[1024];
 
 /*
- * BAD_PAGETABLE is used when we need a bogus page-table, while
- * BAD_PAGE is used for a bogus page.
- *
  * ZERO_PAGE is a global shared page that is always zero: used
  * for zero-mapped memory areas etc..
  */
-extern pte_t __bad_page(void);
-extern pte_t * __bad_pagetable(void);
-
-#define BAD_PAGETABLE __bad_pagetable()
-#define BAD_PAGE __bad_page()
 
 #define ZERO_PAGE(vaddr) virt_to_page(empty_zero_page)
 
index 4412d5d9c26ba7376a738ba419f2b544b88486fe..d879eba2b52c7d74e646a3213911304f877279c5 100644 (file)
@@ -8,7 +8,8 @@
 #include "asm/current.h"
 #include "linux/cpumask.h"
 
-#define smp_processor_id() (current_thread->cpu)
+#define raw_smp_processor_id() (current_thread->cpu)
+
 #define cpu_logical_map(n) (n)
 #define cpu_number_map(n) (n)
 #define PROC_CHANGE_PENALTY    15 /* Pick a number, any number */
index a10ea155907efbf3d455f21eec33b95bfa9239ad..1feaaf148ef12670314f17e8e5072ecec9469363 100644 (file)
@@ -41,18 +41,17 @@ struct thread_info {
 #define init_thread_info       (init_thread_union.thread_info)
 #define init_stack             (init_thread_union.stack)
 
+#define THREAD_SIZE ((1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE)
 /* how to get the thread information struct from C */
 static inline struct thread_info *current_thread_info(void)
 {
        struct thread_info *ti;
-       unsigned long mask = PAGE_SIZE *
-               (1 << CONFIG_KERNEL_STACK_ORDER) - 1;
-        ti = (struct thread_info *) (((unsigned long) &ti) & ~mask);
+       unsigned long mask = THREAD_SIZE - 1;
+       ti = (struct thread_info *) (((unsigned long) &ti) & ~mask);
        return ti;
 }
 
 /* thread information allocation */
-#define THREAD_SIZE ((1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE)
 #define alloc_thread_info(tsk) \
        ((struct thread_info *) kmalloc(THREAD_SIZE, GFP_KERNEL))
 #define free_thread_info(ti) kfree(ti)
@@ -62,7 +61,7 @@ static inline struct thread_info *current_thread_info(void)
 
 #endif
 
-#define PREEMPT_ACTIVE         0x4000000
+#define PREEMPT_ACTIVE         0x10000000
 
 #define TIF_SYSCALL_TRACE      0       /* syscall trace active */
 #define TIF_SIGPENDING         1       /* signal pending */
index 5952914f4121008f1ff78d86e248d938cd1a4c3d..7255cde065384d9508507c88ac522fedfc9d36b2 100644 (file)
@@ -21,7 +21,7 @@ struct exec
 
 #ifdef __KERNEL__
 #include <linux/thread_info.h>
-#define STACK_TOP (test_thread_flag(TIF_IA32) ? IA32_PAGE_OFFSET : TASK_SIZE)
+#define STACK_TOP TASK_SIZE
 #endif
 
 #endif /* __A_OUT_GNU_H__ */
index 0bb9019d58aae5283f79df1ae1b957dca6409a53..06c52ee9c06b3b398b79e30a213f134d457e18e2 100644 (file)
@@ -19,4 +19,14 @@ int unmap_page_from_agp(struct page *page);
    worth it. Would need a page for it. */
 #define flush_agp_cache() asm volatile("wbinvd":::"memory")
 
+/* Convert a physical address to an address suitable for the GART. */
+#define phys_to_gart(x) (x)
+#define gart_to_phys(x) (x)
+
+/* GATT allocation. Returns/accepts GATT kernel virtual address. */
+#define alloc_gatt_pages(order)                \
+       ((char *)__get_free_pages(GFP_KERNEL, (order)))
+#define free_gatt_pages(table, order)  \
+       free_pages((unsigned long)(table), (order))
+
 #endif
index 3d7627ffe67d8d0ca5c76d23f1cdcd810ef58b3f..bfebdb6906547182cb1c328d208518a300f1eabf 100644 (file)
 
 #define APIC_BASE (fix_to_virt(FIX_APIC_BASE))
 
-#define MAX_IO_APICS 32
+#define MAX_IO_APICS 128
 
 /*
  * All x86-64 systems are xAPIC compatible.
index bdbf66eab6eebb310193f7368361460ee731552b..3d2a666a5dd536f95239f2637c1ee87c4bb48376 100644 (file)
@@ -21,6 +21,8 @@ struct bug_frame {
        asm volatile("ud2 ; .quad %c1 ; .short %c0" :: \
                     "i"(__LINE__), "i" (__stringify(__FILE__)))
 void out_of_line_bug(void);
+#else
+static inline void out_of_line_bug(void) { }
 #endif
 
 #include <asm-generic/bug.h>
index 7efc932e8f0b360ac8bce66e5099f1b55987b043..32573749004c7cbd2ea95ac37e78006d11ca9649 100644 (file)
@@ -202,7 +202,6 @@ extern int skip_ioapic_setup;
 #define io_apic_assign_pci_irqs (mp_irq_entries && !skip_ioapic_setup && io_apic_irqs)
 
 #ifdef CONFIG_ACPI_BOOT
-extern int io_apic_get_unique_id (int ioapic, int apic_id);
 extern int io_apic_get_version (int ioapic);
 extern int io_apic_get_redir_entries (int ioapic);
 extern int io_apic_set_pci_routing (int ioapic, int pin, int irq, int, int);
diff --git a/include/asm-x86_64/ioctl32.h b/include/asm-x86_64/ioctl32.h
deleted file mode 100644 (file)
index d0d227f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <linux/ioctl32.h>
index 21d56b086b9d4951f426a52f2587c5c7c35d9c7a..d3abfc6a8fd50f7f5b3d9e1c992c7b9530263126 100644 (file)
@@ -53,5 +53,7 @@ extern void die_nmi(char *str, struct pt_regs *regs);
 
 extern int panic_on_timeout;
 extern int unknown_nmi_panic;
+
+extern int check_nmi_watchdog(void);
  
 #endif /* ASM_NMI_H */
index f43048035a03394ce6330e58e0c4333c01170604..9ce338c3a71eb8fa5a2db09b5ce9b7c109f0654e 100644 (file)
@@ -28,6 +28,7 @@
 #define HPAGE_SIZE     ((1UL) << HPAGE_SHIFT)
 #define HPAGE_MASK     (~(HPAGE_SIZE - 1))
 #define HUGETLB_PAGE_ORDER     (HPAGE_SHIFT - PAGE_SHIFT)
+#define ARCH_HAS_HUGETLB_CLEAN_STALE_PGTABLE
 
 #ifdef __KERNEL__
 #ifndef __ASSEMBLY__
index db2a0efbf5738b8294153713e862183512acdfc1..4eec176c3c39476ab64ed2fc433610823ab5c7fd 100644 (file)
@@ -253,6 +253,7 @@ 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_RW; }
 static inline int pte_file(pte_t pte)          { return pte_val(pte) & _PAGE_FILE; }
 
+#define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT)
 extern inline pte_t pte_rdprotect(pte_t pte)   { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; }
 extern inline pte_t pte_exprotect(pte_t pte)   { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; }
 extern inline pte_t pte_mkclean(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_DIRTY)); return pte; }
@@ -263,6 +264,7 @@ extern inline pte_t pte_mkexec(pte_t pte)   { set_pte(&pte, __pte(pte_val(pte) | _
 extern inline pte_t pte_mkdirty(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) | _PAGE_DIRTY)); return pte; }
 extern inline pte_t pte_mkyoung(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) | _PAGE_ACCESSED)); return pte; }
 extern inline pte_t pte_mkwrite(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) | _PAGE_RW)); return pte; }
+extern inline pte_t pte_mkhuge(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) | __LARGE_PTE)); return pte; }
 
 struct vm_area_struct;
 
@@ -290,7 +292,6 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
  */
 #define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | _PAGE_PCD | _PAGE_PWT))
 
-#define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT) 
 static inline int pmd_large(pmd_t pte) { 
        return (pmd_val(pte) & __LARGE_PTE) == __LARGE_PTE; 
 }      
index f0581c35628e8fa2abf8385c514824c015c4a652..8b55f139968fc3bd730502eb800182ea95ef139d 100644 (file)
@@ -62,7 +62,6 @@ struct cpuinfo_x86 {
        int     x86_tlbsize;    /* number of 4K pages in DTLB/ITLB combined(in pages)*/
         __u8    x86_virt_bits, x86_phys_bits;
        __u8    x86_num_cores;
-       __u8    x86_apicid;
         __u32   x86_power;     
        __u32   extended_cpuid_level;   /* Max extended CPUID function supported */
        unsigned long loops_per_jiffy;
@@ -159,18 +158,19 @@ static inline void clear_in_cr4 (unsigned long mask)
 
 
 /*
- * User space process size. 47bits.
+ * User space process size. 47bits minus one guard page.
  */
-#define TASK_SIZE      (0x800000000000UL)
+#define TASK_SIZE64    (0x800000000000UL - 4096)
 
 /* This decides where the kernel will search for a free chunk of vm
  * space during mmap's.
  */
 #define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? 0xc0000000 : 0xFFFFe000)
-#define TASK_UNMAPPED_32 PAGE_ALIGN(IA32_PAGE_OFFSET/3)
-#define TASK_UNMAPPED_64 PAGE_ALIGN(TASK_SIZE/3) 
-#define TASK_UNMAPPED_BASE     \
-       (test_thread_flag(TIF_IA32) ? TASK_UNMAPPED_32 : TASK_UNMAPPED_64)  
+
+#define TASK_SIZE              (test_thread_flag(TIF_IA32) ? IA32_PAGE_OFFSET : TASK_SIZE64)
+#define TASK_SIZE_OF(child)    ((test_tsk_thread_flag(child, TIF_IA32)) ? IA32_PAGE_OFFSET : TASK_SIZE64)
+
+#define TASK_UNMAPPED_BASE     PAGE_ALIGN(TASK_SIZE/3)
 
 /*
  * Size of io_bitmap.
index d0f8f8b4c3944011da8a295517bf30a58d5eb93a..f2f073642d6295fdeaa97ce94f7c9fee4510f797 100644 (file)
@@ -30,6 +30,11 @@ extern void ia32_syscall(void);
 extern void iommu_hole_init(void);
 
 extern void time_init_gtod(void);
+extern int pmtimer_mark_offset(void);
+extern unsigned int do_gettimeoffset_pm(void);
+extern u32 pmtmr_ioport;
+extern unsigned long long monotonic_base;
+extern int sysctl_vsyscall;
 
 extern void do_softirq_thunk(void);
 
index 96844fecbde8cd1336555a8006aa0bd0e7eb5cbd..a7425aa5a3b72d369ef676c5f1fda8c5dec049b3 100644 (file)
@@ -68,7 +68,7 @@ static inline int num_booting_cpus(void)
        return cpus_weight(cpu_callout_map);
 }
 
-#define __smp_processor_id() read_pda(cpunumber)
+#define raw_smp_processor_id() read_pda(cpunumber)
 
 extern __inline int hard_smp_processor_id(void)
 {
index b0c8d43399064c7c68a5741f017c1ca643173b96..2872da23fc7ea5990feb03c110278e012aea7d15 100644 (file)
@@ -25,6 +25,7 @@ enum vsyscall_num {
 
 #define VXTIME_TSC     1
 #define VXTIME_HPET    2
+#define VXTIME_PMTMR   3
 
 struct vxtime_data {
        long hpet_address;      /* HPET base address */
@@ -54,6 +55,8 @@ extern struct timezone sys_tz;
 extern int sysctl_vsyscall;
 extern seqlock_t xtime_lock;
 
+extern int sysctl_vsyscall;
+
 #define ARCH_HAVE_XTIME_LOCK 1
 
 #endif /* __KERNEL__ */
index aefe6d051ace16fbcf13fe2c0d86e6fda90729e8..b123cc08773d30fccf89c1d0a0aa4e79fcaa2512 100644 (file)
 #ifndef _LINUX_ACPI_H
 #define _LINUX_ACPI_H
 
+#include <linux/config.h>
+
+#ifdef CONFIG_ACPI
+
 #ifndef _LINUX
 #define _LINUX
 #endif
@@ -533,4 +537,5 @@ static inline int acpi_get_pxm(acpi_handle handle)
 
 extern int pnpacpi_disabled;
 
-#endif /*_LINUX_ACPI_H*/
+#endif /* CONFIG_ACPI */
+#endif /*_LINUX_ACPI_H*/
diff --git a/include/linux/arcfb.h b/include/linux/arcfb.h
new file mode 100644 (file)
index 0000000..721e765
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef __LINUX_ARCFB_H__
+#define __LINUX_ARCFB_H__
+
+#define FBIO_WAITEVENT         _IO('F', 0x88)
+#define FBIO_GETCONTROL2       _IOR('F', 0x89, size_t)
+
+#endif
+
index d8981402cd5b986bb3a094790781da768b7fd278..6962e26fc6dfa5a6fa046c7a5dea8a6daf76815e 100644 (file)
@@ -226,6 +226,7 @@ struct ata_taskfile {
 };
 
 #define ata_id_is_ata(id)      (((id)[0] & (1 << 15)) == 0)
+#define ata_id_is_sata(id)     ((id)[93] == 0)
 #define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6))
 #define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5))
 #define ata_id_has_flush(id) ((id)[83] & (1 << 12))
index 31d3fc25ccbd0efd1a4d45b5c2716db8999cd814..09a1451c1159575c2ca94b6c247eb9e0b0a187e0 100644 (file)
@@ -20,7 +20,7 @@
 #define SIOCATALKDIFADDR       (SIOCPROTOPRIVATE + 0)
 
 struct atalk_addr {
-       __u16   s_net;
+       __be16  s_net;
        __u8    s_node;
 };
 
@@ -33,8 +33,8 @@ struct sockaddr_at {
 
 struct atalk_netrange {
        __u8    nr_phase;
-       __u16   nr_firstnet;
-       __u16   nr_lastnet;
+       __be16  nr_firstnet;
+       __be16  nr_lastnet;
 };
 
 #ifdef __KERNEL__
@@ -70,8 +70,8 @@ struct atalk_iface {
 struct atalk_sock {
        /* struct sock has to be the first member of atalk_sock */
        struct sock     sk;
-       unsigned short  dest_net;
-       unsigned short  src_net;
+       __be16          dest_net;
+       __be16          src_net;
        unsigned char   dest_node;
        unsigned char   src_node;
        unsigned char   dest_port;
@@ -95,9 +95,9 @@ struct ddpehdr {
                deh_hops:4,
                deh_len:10;
 #endif
-       __u16   deh_sum;
-       __u16   deh_dnet;
-       __u16   deh_snet;
+       __be16  deh_sum;
+       __be16  deh_dnet;
+       __be16  deh_snet;
        __u8    deh_dnode;
        __u8    deh_snode;
        __u8    deh_dport;
@@ -142,24 +142,24 @@ struct ddpshdr {
 
 /* AppleTalk AARP headers */
 struct elapaarp {
-       __u16   hw_type;
+       __be16  hw_type;
 #define AARP_HW_TYPE_ETHERNET          1
 #define AARP_HW_TYPE_TOKENRING         2
-       __u16   pa_type;
+       __be16  pa_type;
        __u8    hw_len;
        __u8    pa_len;
 #define AARP_PA_ALEN                   4
-       __u16   function;
+       __be16  function;
 #define AARP_REQUEST                   1
 #define AARP_REPLY                     2
 #define AARP_PROBE                     3
        __u8    hw_src[ETH_ALEN]        __attribute__ ((packed));
        __u8    pa_src_zero             __attribute__ ((packed));
-       __u16   pa_src_net              __attribute__ ((packed));
+       __be16  pa_src_net              __attribute__ ((packed));
        __u8    pa_src_node             __attribute__ ((packed));
        __u8    hw_dst[ETH_ALEN]        __attribute__ ((packed));
        __u8    pa_dst_zero             __attribute__ ((packed));
-       __u16   pa_dst_net              __attribute__ ((packed));
+       __be16  pa_dst_net              __attribute__ ((packed));
        __u8    pa_dst_node             __attribute__ ((packed));       
 };
 
index 19f04b04979878ffcfa2706a9acb98421537226d..bf2ad3ba72eb643cbcee7336012c868d5b806765 100644 (file)
 #include <linux/sched.h>
 #include <linux/elf.h>
 
-/* Request and reply types */
-#define AUDIT_GET      1000    /* Get status */
-#define AUDIT_SET      1001    /* Set status (enable/disable/auditd) */
-#define AUDIT_LIST     1002    /* List filtering rules */
-#define AUDIT_ADD      1003    /* Add filtering rule */
-#define AUDIT_DEL      1004    /* Delete filtering rule */
-#define AUDIT_USER     1005    /* Send a message from user-space */
-#define AUDIT_LOGIN    1006     /* Define the login id and informaiton */
-#define AUDIT_KERNEL   2000    /* Asynchronous audit record. NOT A REQUEST. */
+/* The netlink messages for the audit system is divided into blocks:
+ * 1000 - 1099 are for commanding the audit system
+ * 1100 - 1199 user space trusted application messages
+ * 1200 - 1299 messages internal to the audit daemon
+ * 1300 - 1399 audit event messages
+ * 1400 - 1499 SE Linux use
+ * 1500 - 1999 future use
+ * 2000 is for otherwise unclassified kernel audit messages
+ *
+ * Messages from 1000-1199 are bi-directional. 1200-1299 are exclusively user
+ * space. Anything over that is kernel --> user space communication.
+ */
+#define AUDIT_GET              1000    /* Get status */
+#define AUDIT_SET              1001    /* Set status (enable/disable/auditd) */
+#define AUDIT_LIST             1002    /* List syscall filtering rules */
+#define AUDIT_ADD              1003    /* Add syscall filtering rule */
+#define AUDIT_DEL              1004    /* Delete syscall filtering rule */
+#define AUDIT_USER             1005    /* Message from userspace -- deprecated */
+#define AUDIT_LOGIN            1006    /* Define the login id and information */
+#define AUDIT_WATCH_INS                1007    /* Insert file/dir watch entry */
+#define AUDIT_WATCH_REM                1008    /* Remove file/dir watch entry */
+#define AUDIT_WATCH_LIST       1009    /* List all file/dir watches */
+#define AUDIT_SIGNAL_INFO      1010    /* Get info about sender of signal to auditd */
+
+#define AUDIT_FIRST_USER_MSG   1100    /* Userspace messages uninteresting to kernel */
+#define AUDIT_LAST_USER_MSG    1199
+#define AUDIT_DAEMON_START      1200    /* Daemon startup record */
+#define AUDIT_DAEMON_END        1201    /* Daemon normal stop record */
+#define AUDIT_DAEMON_ABORT      1202    /* Daemon error stop record */
+#define AUDIT_DAEMON_CONFIG     1203    /* Daemon config change */
+
+#define AUDIT_SYSCALL          1300    /* Syscall event */
+#define AUDIT_FS_WATCH         1301    /* Filesystem watch event */
+#define AUDIT_PATH             1302    /* Filename path information */
+#define AUDIT_IPC              1303    /* IPC record */
+#define AUDIT_SOCKETCALL       1304    /* sys_socketcall arguments */
+#define AUDIT_CONFIG_CHANGE    1305    /* Audit system configuration change */
+#define AUDIT_SOCKADDR         1306    /* sockaddr copied as syscall arg */
+#define AUDIT_CWD              1307    /* Current working directory */
+
+#define AUDIT_AVC              1400    /* SE Linux avc denial or grant */
+#define AUDIT_SELINUX_ERR      1401    /* Internal SE Linux Errors */
+#define AUDIT_AVC_PATH         1402    /* dentry, vfsmount pair from avc */
+
+#define AUDIT_KERNEL           2000    /* Asynchronous audit record. NOT A REQUEST. */
 
 /* Rule flags */
 #define AUDIT_PER_TASK 0x01    /* Apply rule at task creation (not syscall) */
 #define AUDIT_ARCH_V850                (EM_V850|__AUDIT_ARCH_LE)
 #define AUDIT_ARCH_X86_64      (EM_X86_64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
 
-#ifndef __KERNEL__
-struct audit_message {
-       struct nlmsghdr nlh;
-       char            data[1200];
-};
-#endif
-
 struct audit_status {
        __u32           mask;           /* Bit mask for valid entries */
-       __u32           enabled;        /* 1 = enabled, 0 = disbaled */
+       __u32           enabled;        /* 1 = enabled, 0 = disabled */
        __u32           failure;        /* Failure-to-log action */
        __u32           pid;            /* pid of auditd process */
        __u32           rate_limit;     /* messages rate limit (per second) */
@@ -161,6 +191,11 @@ struct audit_rule {                /* for AUDIT_LIST, AUDIT_ADD, and AUDIT_DEL */
 
 #ifdef __KERNEL__
 
+struct audit_sig_info {
+       uid_t           uid;
+       pid_t           pid;
+};
+
 struct audit_buffer;
 struct audit_context;
 struct inode;
@@ -185,11 +220,16 @@ extern void audit_inode(const char *name, const struct inode *inode);
                                /* Private API (for audit.c only) */
 extern int  audit_receive_filter(int type, int pid, int uid, int seq,
                                 void *data, uid_t loginuid);
-extern void audit_get_stamp(struct audit_context *ctx,
-                           struct timespec *t, unsigned int *serial);
+extern unsigned int audit_serial(void);
+extern void auditsc_get_stamp(struct audit_context *ctx,
+                             struct timespec *t, unsigned int *serial);
 extern int  audit_set_loginuid(struct task_struct *task, uid_t loginuid);
 extern uid_t audit_get_loginuid(struct audit_context *ctx);
 extern int audit_ipc_perms(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode);
+extern int audit_socketcall(int nargs, unsigned long *args);
+extern int audit_sockaddr(int len, void *addr);
+extern int audit_avc_path(struct dentry *dentry, struct vfsmount *mnt);
+extern void audit_signal_info(int sig, struct task_struct *t);
 #else
 #define audit_alloc(t) ({ 0; })
 #define audit_free(t) do { ; } while (0)
@@ -198,18 +238,24 @@ extern int audit_ipc_perms(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mo
 #define audit_getname(n) do { ; } while (0)
 #define audit_putname(n) do { ; } while (0)
 #define audit_inode(n,i) do { ; } while (0)
+#define audit_receive_filter(t,p,u,s,d,l) ({ -EOPNOTSUPP; })
+#define auditsc_get_stamp(c,t,s) do { BUG(); } while (0)
 #define audit_get_loginuid(c) ({ -1; })
 #define audit_ipc_perms(q,u,g,m) ({ 0; })
+#define audit_socketcall(n,a) ({ 0; })
+#define audit_sockaddr(len, addr) ({ 0; })
+#define audit_avc_path(dentry, mnt) ({ 0; })
+#define audit_signal_info(s,t) do { ; } while (0)
 #endif
 
 #ifdef CONFIG_AUDIT
 /* These are defined in audit.c */
                                /* Public API */
-extern void                audit_log(struct audit_context *ctx,
+extern void                audit_log(struct audit_context *ctx, int type,
                                      const char *fmt, ...)
-                           __attribute__((format(printf,2,3)));
+                           __attribute__((format(printf,3,4)));
 
-extern struct audit_buffer *audit_log_start(struct audit_context *ctx);
+extern struct audit_buffer *audit_log_start(struct audit_context *ctx,int type);
 extern void                audit_log_format(struct audit_buffer *ab,
                                             const char *fmt, ...)
                            __attribute__((format(printf,2,3)));
@@ -229,8 +275,8 @@ extern void             audit_send_reply(int pid, int seq, int type,
                                             void *payload, int size);
 extern void                audit_log_lost(const char *message);
 #else
-#define audit_log(t,f,...) do { ; } while (0)
-#define audit_log_start(t) ({ NULL; })
+#define audit_log(c,t,f,...) do { ; } while (0)
+#define audit_log_start(c,t) ({ NULL; })
 #define audit_log_vformat(b,f,a) do { ; } while (0)
 #define audit_log_format(b,f,...) do { ; } while (0)
 #define audit_log_end(b) do { ; } while (0)
index a1657fb99516ba445d3f35d9328348db0b2b4deb..9343c89d843c2437edcc749868506a6807915223 100644 (file)
@@ -23,7 +23,7 @@
 #define AUTOFS_MIN_PROTO_VERSION       3
 #define AUTOFS_MAX_PROTO_VERSION       4
 
-#define AUTOFS_PROTO_SUBVERSION                6
+#define AUTOFS_PROTO_SUBVERSION                7
 
 /* Mask for expire behaviour */
 #define AUTOFS_EXP_IMMEDIATE           1
index ef1afc178c0a2df9569daf3312e33911a0e89bf2..4a99b76c5a338d027cfbb48b0a27e4a0dfe5fe4d 100644 (file)
@@ -544,7 +544,7 @@ extern void blk_end_sync_rq(struct request *rq);
 extern void blk_attempt_remerge(request_queue_t *, struct request *);
 extern void __blk_attempt_remerge(request_queue_t *, struct request *);
 extern struct request *blk_get_request(request_queue_t *, int, int);
-extern void blk_insert_request(request_queue_t *, struct request *, int, void *, int);
+extern void blk_insert_request(request_queue_t *, struct request *, int, void *);
 extern void blk_requeue_request(request_queue_t *, struct request *);
 extern void blk_plug_device(request_queue_t *);
 extern int blk_remove_plug(request_queue_t *);
diff --git a/include/linux/chio.h b/include/linux/chio.h
new file mode 100644 (file)
index 0000000..63035ae
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * ioctl interface for the scsi media changer driver
+ */
+
+/* changer element types */
+#define CHET_MT   0    /* media transport element (robot) */
+#define CHET_ST   1    /* storage element (media slots) */
+#define CHET_IE   2    /* import/export element */
+#define CHET_DT   3    /* data transfer element (tape/cdrom/whatever) */
+#define CHET_V1   4    /* vendor specific #1 */
+#define CHET_V2   5    /* vendor specific #2 */
+#define CHET_V3   6    /* vendor specific #3 */
+#define CHET_V4   7    /* vendor specific #4 */
+
+
+/*
+ * CHIOGPARAMS
+ *    query changer properties
+ *
+ * CHIOVGPARAMS
+ *    query vendor-specific element types
+ *
+ *    accessing elements works by specifing type and unit of the element.
+ *    for eample, storage elements are addressed with type = CHET_ST and
+ *    unit = 0 .. cp_nslots-1
+ *
+ */
+struct changer_params {
+       int cp_curpicker;  /* current transport element */
+       int cp_npickers;   /* number of transport elements      (CHET_MT) */
+       int cp_nslots;     /* number of storage elements        (CHET_ST) */
+       int cp_nportals;   /* number of import/export elements  (CHET_IE) */
+       int cp_ndrives;    /* number of data transfer elements  (CHET_DT) */
+};
+struct changer_vendor_params {
+       int  cvp_n1;       /* number of vendor specific elems   (CHET_V1) */
+       char cvp_label1[16];
+       int  cvp_n2;       /* number of vendor specific elems   (CHET_V2) */
+       char cvp_label2[16];
+       int  cvp_n3;       /* number of vendor specific elems   (CHET_V3) */
+       char cvp_label3[16];
+       int  cvp_n4;       /* number of vendor specific elems   (CHET_V4) */
+       char cvp_label4[16];
+       int  reserved[8];
+};
+
+
+/*
+ * CHIOMOVE
+ *    move a medium from one element to another
+ */
+struct changer_move {
+       int cm_fromtype;        /* type/unit of source element */
+       int cm_fromunit;        
+       int cm_totype;  /* type/unit of destination element */
+       int cm_tounit;
+       int cm_flags;
+};
+#define CM_INVERT   1   /* flag: rotate media (for double-sided like MOD) */
+
+
+/*
+ * CHIOEXCHANGE
+ *    move one medium from element #1 to element #2,
+ *    and another one from element #2 to element #3.
+ *    element #1 and #3 are allowed to be identical.
+ */
+struct changer_exchange {
+       int ce_srctype;     /* type/unit of element #1 */
+       int ce_srcunit;
+       int ce_fdsttype;    /* type/unit of element #2 */
+       int ce_fdstunit;
+       int ce_sdsttype;    /* type/unit of element #3 */
+       int ce_sdstunit;
+       int ce_flags;
+};
+#define CE_INVERT1   1
+#define CE_INVERT2   2
+
+
+/*
+ * CHIOPOSITION
+ *    move the transport element (robot arm) to a specific element.
+ */
+struct changer_position {
+       int cp_type;
+       int cp_unit;
+       int cp_flags;
+};
+#define CP_INVERT   1
+
+
+/*
+ * CHIOGSTATUS
+ *    get element status for all elements of a specific type
+ */
+struct changer_element_status {
+       int             ces_type;
+       unsigned char   *ces_data;
+};
+#define CESTATUS_FULL     0x01 /* full */
+#define CESTATUS_IMPEXP   0x02 /* media was imported (inserted by sysop) */
+#define CESTATUS_EXCEPT   0x04 /* error condition */
+#define CESTATUS_ACCESS   0x08 /* access allowed */
+#define CESTATUS_EXENAB   0x10 /* element can export media */
+#define CESTATUS_INENAB   0x20 /* element can import media */
+
+
+/*
+ * CHIOGELEM
+ *    get more detailed status informtion for a single element
+ */
+struct changer_get_element {
+       int     cge_type;        /* type/unit */
+       int     cge_unit;
+       int     cge_status;      /* status */
+       int     cge_errno;       /* errno */
+       int     cge_srctype;     /* source element of the last move/exchange */
+       int     cge_srcunit;
+       int     cge_id;          /* scsi id  (for data transfer elements) */
+       int     cge_lun;         /* scsi lun (for data transfer elements) */
+       char    cge_pvoltag[36]; /* primary volume tag */
+       char    cge_avoltag[36]; /* alternate volume tag */
+       int     cge_flags;
+};
+/* flags */
+#define CGE_ERRNO     0x01       /* errno available       */
+#define CGE_INVERT    0x02       /* media inverted        */
+#define CGE_SRC       0x04       /* media src available   */
+#define CGE_IDLUN     0x08       /* ID+LUN available      */
+#define CGE_PVOLTAG   0x10       /* primary volume tag available */
+#define CGE_AVOLTAG   0x20       /* alternate volume tag available */
+
+
+/*
+ * CHIOSVOLTAG
+ *    set volume tag
+ */
+struct changer_set_voltag {
+       int     csv_type;        /* type/unit */
+       int     csv_unit;
+       char    csv_voltag[36];  /* volume tag */
+       int     csv_flags;
+};
+#define CSV_PVOLTAG   0x01       /* primary volume tag */
+#define CSV_AVOLTAG   0x02       /* alternate volume tag */
+#define CSV_CLEARTAG  0x04       /* clear volume tag */
+
+/* ioctls */
+#define CHIOMOVE       _IOW('c', 1,struct changer_move)
+#define CHIOEXCHANGE   _IOW('c', 2,struct changer_exchange)
+#define CHIOPOSITION   _IOW('c', 3,struct changer_position)
+#define CHIOGPICKER    _IOR('c', 4,int)                        /* not impl. */
+#define CHIOSPICKER    _IOW('c', 5,int)                        /* not impl. */
+#define CHIOGPARAMS    _IOR('c', 6,struct changer_params)
+#define CHIOGSTATUS    _IOW('c', 8,struct changer_element_status)
+#define CHIOGELEM      _IOW('c',16,struct changer_get_element)
+#define CHIOINITELEM   _IO('c',17)
+#define CHIOSVOLTAG    _IOW('c',18,struct changer_set_voltag)
+#define CHIOGVPARAMS   _IOR('c',19,struct changer_vendor_params)
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * Local variables:
+ * c-basic-offset: 8
+ * End:
+ */
index f21af067d015f4cad91e9db214931b2215cd41c2..927daa86c9b366e52b41ff388303879896e6c6a4 100644 (file)
@@ -49,7 +49,7 @@ int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list);
 /* Frequency values here are CPU kHz so that hardware which doesn't run 
  * with some frequencies can complain without having to guess what per 
  * cent / per mille means. 
- * Maximum transition latency is in microseconds - if it's unknown,
+ * Maximum transition latency is in nanoseconds - if it's unknown,
  * CPUFREQ_ETERNAL shall be used.
  */
 
index cf470459fa691985be0b4c79fb86a7c2945f534a..7b781a72b2931ce05ed4fb49a6c83fe38c4d7f40 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/config.h>
 #include <linux/ioport.h>
 #include <linux/kobject.h>
+#include <linux/klist.h>
 #include <linux/list.h>
 #include <linux/types.h>
 #include <linux/module.h>
@@ -44,14 +45,15 @@ struct device;
 struct device_driver;
 struct class;
 struct class_device;
-struct class_simple;
 
 struct bus_type {
-       char                    * name;
+       const char              * name;
 
        struct subsystem        subsys;
        struct kset             drivers;
        struct kset             devices;
+       struct klist            klist_devices;
+       struct klist            klist_drivers;
 
        struct bus_attribute    * bus_attrs;
        struct device_attribute * dev_attrs;
@@ -98,17 +100,18 @@ extern int bus_create_file(struct bus_type *, struct bus_attribute *);
 extern void bus_remove_file(struct bus_type *, struct bus_attribute *);
 
 struct device_driver {
-       char                    * name;
+       const char              * name;
        struct bus_type         * bus;
 
        struct completion       unloaded;
        struct kobject          kobj;
-       struct list_head        devices;
+       struct klist            klist_devices;
+       struct klist_node       knode_bus;
 
-       struct module           * owner;
+       struct module           * owner;
 
        int     (*probe)        (struct device * dev);
-       int     (*remove)       (struct device * dev);
+       int     (*remove)       (struct device * dev);
        void    (*shutdown)     (struct device * dev);
        int     (*suspend)      (struct device * dev, pm_message_t state, u32 level);
        int     (*resume)       (struct device * dev, u32 level);
@@ -137,12 +140,16 @@ struct driver_attribute driver_attr_##_name = __ATTR(_name,_mode,_show,_store)
 extern int driver_create_file(struct device_driver *, struct driver_attribute *);
 extern void driver_remove_file(struct device_driver *, struct driver_attribute *);
 
+extern int driver_for_each_device(struct device_driver * drv, struct device * start,
+                                 void * data, int (*fn)(struct device *, void *));
+
 
 /*
  * device classes
  */
 struct class {
-       char                    * name;
+       const char              * name;
+       struct module           * owner;
 
        struct subsystem        subsys;
        struct list_head        children;
@@ -185,6 +192,7 @@ struct class_device {
        struct kobject          kobj;
        struct class            * class;        /* required */
        dev_t                   devt;           /* dev_t, creates the sysfs "dev" */
+       struct class_device_attribute *devt_attr;
        struct device           * dev;          /* not necessary, but nice to have */
        void                    * class_data;   /* class-specific data */
 
@@ -245,26 +253,28 @@ struct class_interface {
 extern int class_interface_register(struct class_interface *);
 extern void class_interface_unregister(struct class_interface *);
 
-/* interface for class simple stuff */
-extern struct class_simple *class_simple_create(struct module *owner, char *name);
-extern void class_simple_destroy(struct class_simple *cs);
-extern struct class_device *class_simple_device_add(struct class_simple *cs, dev_t dev, struct device *device, const char *fmt, ...)
-       __attribute__((format(printf,4,5)));
-extern int class_simple_set_hotplug(struct class_simple *, 
-       int (*hotplug)(struct class_device *dev, char **envp, int num_envp, char *buffer, int buffer_size));
-extern void class_simple_device_remove(dev_t dev);
+extern struct class *class_create(struct module *owner, char *name);
+extern void class_destroy(struct class *cls);
+extern struct class_device *class_device_create(struct class *cls, dev_t devt,
+                                               struct device *device, char *fmt, ...)
+                                       __attribute__((format(printf,4,5)));
+extern void class_device_destroy(struct class *cls, dev_t devt);
 
 
 struct device {
-       struct list_head node;          /* node in sibling list */
-       struct list_head bus_list;      /* node in bus's list */
-       struct list_head driver_list;
-       struct list_head children;
+       struct klist            klist_children;
+       struct klist_node       knode_parent;           /* node in sibling list */
+       struct klist_node       knode_driver;
+       struct klist_node       knode_bus;
        struct device   * parent;
 
        struct kobject kobj;
        char    bus_id[BUS_ID_SIZE];    /* position on parent bus */
 
+       struct semaphore        sem;    /* semaphore to synchronize calls to
+                                        * its driver.
+                                        */
+
        struct bus_type * bus;          /* type of bus device is on */
        struct device_driver *driver;   /* which driver has allocated this
                                           device */
@@ -273,9 +283,6 @@ struct device {
                                           BIOS data relevant to device) */
        struct dev_pm_info      power;
 
-       u32             detach_state;   /* State to enter when device is
-                                          detached from its driver. */
-
        u64             *dma_mask;      /* dma mask (if dma'able device) */
        u64             coherent_dma_mask;/* Like dma_mask, but for
                                             alloc_coherent mappings as
@@ -291,12 +298,6 @@ struct device {
        void    (*release)(struct device * dev);
 };
 
-static inline struct device *
-list_to_dev(struct list_head *node)
-{
-       return list_entry(node, struct device, node);
-}
-
 static inline void *
 dev_get_drvdata (struct device *dev)
 {
@@ -324,7 +325,6 @@ extern int device_for_each_child(struct device *, void *,
  * Manual binding of a device to driver. See drivers/base/bus.c
  * for information on use.
  */
-extern int  driver_probe_device(struct device_driver * drv, struct device * dev);
 extern void device_bind_driver(struct device * dev);
 extern void device_release_driver(struct device * dev);
 extern int  device_attach(struct device * dev);
@@ -335,8 +335,10 @@ extern void driver_attach(struct device_driver * drv);
 
 struct device_attribute {
        struct attribute        attr;
-       ssize_t (*show)(struct device * dev, char * buf);
-       ssize_t (*store)(struct device * dev, const char * buf, size_t count);
+       ssize_t (*show)(struct device *dev, struct device_attribute *attr,
+                       char *buf);
+       ssize_t (*store)(struct device *dev, struct device_attribute *attr,
+                        const char *buf, size_t count);
 };
 
 #define DEVICE_ATTR(_name,_mode,_show,_store) \
@@ -363,13 +365,12 @@ extern int (*platform_notify_remove)(struct device * dev);
  */
 extern struct device * get_device(struct device * dev);
 extern void put_device(struct device * dev);
-extern struct device *device_find(const char *name, struct bus_type *bus);
 
 
 /* drivers/base/platform.c */
 
 struct platform_device {
-       char            * name;
+       const char      * name;
        u32             id;
        struct device   dev;
        u32             num_resources;
diff --git a/include/linux/dm9000.h b/include/linux/dm9000.h
new file mode 100644 (file)
index 0000000..0008e2a
--- /dev/null
@@ -0,0 +1,36 @@
+/* include/linux/dm9000.h
+ *
+ * Copyright (c) 2004 Simtec Electronics
+ *   Ben Dooks <ben@simtec.co.uk>
+ *
+ * Header file for dm9000 platform data
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+*/
+
+#ifndef __DM9000_PLATFORM_DATA
+#define __DM9000_PLATFORM_DATA __FILE__
+
+/* IO control flags */
+
+#define DM9000_PLATF_8BITONLY  (0x0001)
+#define DM9000_PLATF_16BITONLY (0x0002)
+#define DM9000_PLATF_32BITONLY (0x0004)
+
+/* platfrom data for platfrom device structure's platfrom_data field */
+
+struct dm9000_plat_data {
+       unsigned int    flags;
+
+       /* allow replacement IO routines */
+
+       void    (*inblk)(void __iomem *reg, void *data, int len);
+       void    (*outblk)(void __iomem *reg, void *data, int len);
+       void    (*dumpblk)(void __iomem *reg, int len);
+};
+
+#endif /* __DM9000_PLATFORM_DATA */
+
index 806c305332c1c5c05102d9fc5d4537b49be5f4e7..2d80cc761a15948179fefc0abe5a686b9abc2b81 100644 (file)
@@ -14,7 +14,12 @@ enum dma_data_direction {
 };
 
 #define DMA_64BIT_MASK 0xffffffffffffffffULL
+#define DMA_40BIT_MASK 0x000000ffffffffffULL
+#define DMA_39BIT_MASK 0x0000007fffffffffULL
 #define DMA_32BIT_MASK 0x00000000ffffffffULL
+#define DMA_31BIT_MASK 0x000000007fffffffULL
+#define DMA_30BIT_MASK 0x000000003fffffffULL
+#define DMA_29BIT_MASK 0x000000001fffffffULL
 
 #include <asm/dma-mapping.h>
 
index 17c55df13615a9bda172e80c6f4711c11f3183e8..ff71d2af5da33ac711da7f64957d8d93bad4f91f 100644 (file)
@@ -13,6 +13,8 @@
  * This should be a per-architecture thing, to allow different
  * error and pointer decisions.
  */
+#define IS_ERR_VALUE(x) unlikely((x) > (unsigned long)-1000L)
+
 static inline void *ERR_PTR(long error)
 {
        return (void *) error;
@@ -25,7 +27,7 @@ static inline long PTR_ERR(const void *ptr)
 
 static inline long IS_ERR(const void *ptr)
 {
-       return unlikely((unsigned long)ptr > (unsigned long)-1000L);
+       return IS_ERR_VALUE((unsigned long)ptr);
 }
 
 #endif /* _LINUX_ERR_H */
index 220748b7abeaced05974bf152070fa8c9da045b2..a1478258d00243c93fec79a8e66b07739caeea92 100644 (file)
@@ -55,19 +55,33 @@ static inline int is_zero_ether_addr(const u8 *addr)
        return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]);
 }
 
+/**
+ * is_multicast_ether_addr - Determine if the given Ethernet address is a
+ * multicast address.
+ *
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Return true if the address is a multicast address.
+ */
+static inline int is_multicast_ether_addr(const u8 *addr)
+{
+       return addr[0] & 0x01;
+}
+
 /**
  * is_valid_ether_addr - Determine if the given Ethernet address is valid
  * @addr: Pointer to a six-byte array containing the Ethernet address
  *
  * Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not
- * a multicast address, and is not FF:FF:FF:FF:FF:FF.  The multicast
- * and FF:FF:... tests are combined into the single test "!(addr[0]&1)".
+ * a multicast address, and is not FF:FF:FF:FF:FF:FF.
  *
  * Return true if the address is valid.
  */
 static inline int is_valid_ether_addr(const u8 *addr)
 {
-       return !(addr[0]&1) && !is_zero_ether_addr(addr);
+       /* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to
+        * explicitly check for it here. */
+       return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr);
 }
 
 /**
@@ -83,6 +97,6 @@ static inline void random_ether_addr(u8 *addr)
        addr [0] &= 0xfe;       /* clear multicast bit */
        addr [0] |= 0x02;       /* set local assignment bit (IEEE802) */
 }
-#endif
+#endif /* __KERNEL__ */
 
 #endif /* _LINUX_ETHERDEVICE_H */
index c85b210490ea33a1cf5910fb309911266f44adb3..a0ab26aab450db653ab44d45296bc2809b42b13a 100644 (file)
@@ -256,6 +256,7 @@ struct net_device;
 u32 ethtool_op_get_link(struct net_device *dev);
 u32 ethtool_op_get_tx_csum(struct net_device *dev);
 int ethtool_op_set_tx_csum(struct net_device *dev, u32 data);
+int ethtool_op_set_tx_hw_csum(struct net_device *dev, u32 data);
 u32 ethtool_op_get_sg(struct net_device *dev);
 int ethtool_op_set_sg(struct net_device *dev, u32 data);
 u32 ethtool_op_get_tso(struct net_device *dev);
index b468bf49654782d1d7cc6e6f12dc79d04fd34325..bc24beeed971d7a803af06bd74eb3c6ef2e300fe 100644 (file)
@@ -524,11 +524,11 @@ struct fb_pixmap {
        u32 offset;             /* current offset to buffer             */
        u32 buf_align;          /* byte alignment of each bitmap        */
        u32 scan_align;         /* alignment per scanline               */
-       u32 access_align;       /* alignment per read/write             */
+       u32 access_align;       /* alignment per read/write (bits)      */
        u32 flags;              /* see FB_PIXMAP_*                      */
        /* access methods */
-       void (*outbuf)(struct fb_info *info, u8 *addr, u8 *src, unsigned int size);
-       u8   (*inbuf) (struct fb_info *info, u8 *addr);
+       void (*writeio)(struct fb_info *info, void __iomem *dst, void *src, unsigned int size);
+       void (*readio) (struct fb_info *info, void *dst, void __iomem *src, unsigned int size);
 };
 
 
@@ -816,18 +816,9 @@ extern int unregister_framebuffer(struct fb_info *fb_info);
 extern int fb_prepare_logo(struct fb_info *fb_info);
 extern int fb_show_logo(struct fb_info *fb_info);
 extern char* fb_get_buffer_offset(struct fb_info *info, struct fb_pixmap *buf, u32 size);
-extern void fb_iomove_buf_unaligned(struct fb_info *info, struct fb_pixmap *buf,
-                               u8 *dst, u32 d_pitch, u8 *src, u32 idx,
+extern void fb_pad_unaligned_buffer(u8 *dst, u32 d_pitch, u8 *src, u32 idx,
                                u32 height, u32 shift_high, u32 shift_low, u32 mod);
-extern void fb_iomove_buf_aligned(struct fb_info *info, struct fb_pixmap *buf,
-                               u8 *dst, u32 d_pitch, u8 *src, u32 s_pitch,
-                               u32 height);
-extern void fb_sysmove_buf_unaligned(struct fb_info *info, struct fb_pixmap *buf,
-                               u8 *dst, u32 d_pitch, u8 *src, u32 idx,
-                               u32 height, u32 shift_high, u32 shift_low, u32 mod);
-extern void fb_sysmove_buf_aligned(struct fb_info *info, struct fb_pixmap *buf,
-                               u8 *dst, u32 d_pitch, u8 *src, u32 s_pitch,
-                               u32 height);
+extern void fb_pad_aligned_buffer(u8 *dst, u32 d_pitch, u8 *src, u32 s_pitch, u32 height);
 extern void fb_set_suspend(struct fb_info *info, int state);
 extern int fb_get_color_depth(struct fb_var_screeninfo *var);
 extern int fb_get_options(char *name, char **option);
index fc2d690c9d5f42ff15fe356ad138c48e2af5cb2c..8fc80a7d78ac2e131ce8b7dea5095499a4aa94e5 100644 (file)
@@ -25,19 +25,23 @@ struct font_desc {
 #define VGA8x16_IDX    1
 #define PEARL8x8_IDX   2
 #define VGA6x11_IDX    3
-#define SUN8x16_IDX    4
-#define SUN12x22_IDX   5
-#define ACORN8x8_IDX   6
-#define        MINI4x6_IDX     7
+#define FONT7x14_IDX   4
+#define        FONT10x18_IDX   5
+#define SUN8x16_IDX    6
+#define SUN12x22_IDX   7
+#define ACORN8x8_IDX   8
+#define        MINI4x6_IDX     9
 
 extern struct font_desc        font_vga_8x8,
-                               font_vga_8x16,
-                               font_pearl_8x8,
-                               font_vga_6x11,
-                               font_sun_8x16,
-                               font_sun_12x22,
-                               font_acorn_8x8,
-                               font_mini_4x6;
+                       font_vga_8x16,
+                       font_pearl_8x8,
+                       font_vga_6x11,
+                       font_7x14,
+                       font_10x18,
+                       font_sun_8x16,
+                       font_sun_12x22,
+                       font_acorn_8x8,
+                       font_mini_4x6;
 
 /* Find a font with a specific name */
 
index 0180102dace1ef28edcd1de1199cfe65f3ba8499..9b8b696d4f150a52b72dfb1addc673168ebd421b 100644 (file)
@@ -1657,6 +1657,52 @@ static inline void simple_transaction_set(struct file *file, size_t n)
        ar->size = n;
 }
 
+/*
+ * simple attribute files
+ *
+ * These attributes behave similar to those in sysfs:
+ *
+ * Writing to an attribute immediately sets a value, an open file can be
+ * written to multiple times.
+ *
+ * Reading from an attribute creates a buffer from the value that might get
+ * read with multiple read calls. When the attribute has been read
+ * completely, no further read calls are possible until the file is opened
+ * again.
+ *
+ * All attributes contain a text representation of a numeric value
+ * that are accessed with the get() and set() functions.
+ */
+#define DEFINE_SIMPLE_ATTRIBUTE(__fops, __get, __set, __fmt)           \
+static int __fops ## _open(struct inode *inode, struct file *file)     \
+{                                                                      \
+       __simple_attr_check_format(__fmt, 0ull);                        \
+       return simple_attr_open(inode, file, __get, __set, __fmt);      \
+}                                                                      \
+static struct file_operations __fops = {                               \
+       .owner   = THIS_MODULE,                                         \
+       .open    = __fops ## _open,                                     \
+       .release = simple_attr_close,                                   \
+       .read    = simple_attr_read,                                    \
+       .write   = simple_attr_write,                                   \
+};
+
+static inline void __attribute__((format(printf, 1, 2)))
+__simple_attr_check_format(const char *fmt, ...)
+{
+       /* don't do anything, just let the compiler check the arguments; */
+}
+
+int simple_attr_open(struct inode *inode, struct file *file,
+                    u64 (*get)(void *), void (*set)(void *, u64),
+                    const char *fmt);
+int simple_attr_close(struct inode *inode, struct file *file);
+ssize_t simple_attr_read(struct file *file, char __user *buf,
+                        size_t len, loff_t *ppos);
+ssize_t simple_attr_write(struct file *file, const char __user *buf,
+                         size_t len, loff_t *ppos);
+
+
 #ifdef CONFIG_SECURITY
 static inline char *alloc_secdata(void)
 {
index faaff4c645598cef953bbe1f94379cfd22c517ab..70f54af87b9f116f1ffda706c0293f6a7f6a3e24 100644 (file)
@@ -51,6 +51,7 @@ struct gianfar_platform_data {
 
        /* board specific information */
        u32 board_flags;
+       u32 phy_flags;
        u32 phyid;
        u32 interruptPHY;
        u8 mac_addr[6];
@@ -61,9 +62,14 @@ struct gianfar_platform_data {
 #define FSL_GIANFAR_DEV_HAS_COALESCE           0x00000002
 #define FSL_GIANFAR_DEV_HAS_RMON               0x00000004
 #define FSL_GIANFAR_DEV_HAS_MULTI_INTR         0x00000008
+#define FSL_GIANFAR_DEV_HAS_CSUM               0x00000010
+#define FSL_GIANFAR_DEV_HAS_VLAN               0x00000020
+#define FSL_GIANFAR_DEV_HAS_EXTENDED_HASH      0x00000040
+#define FSL_GIANFAR_DEV_HAS_PADDING            0x00000080
 
 /* Flags in gianfar_platform_data */
-#define FSL_GIANFAR_BRD_HAS_PHY_INTR   0x00000001      /* if not set use a timer */
+#define FSL_GIANFAR_BRD_HAS_PHY_INTR   0x00000001 /* set or use a timer */
+#define FSL_GIANFAR_BRD_IS_REDUCED     0x00000002 /* Set if RGMII, RMII */
 
 struct fsl_i2c_platform_data {
        /* device specific information */
index b1272f822cfa15cd0b1acca21267c9a73174ee37..cd623eccdbea61c8e8b8eba1f931645b95c01115 100644 (file)
@@ -67,6 +67,8 @@ int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mo
 void gameport_close(struct gameport *gameport);
 void gameport_rescan(struct gameport *gameport);
 
+#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
+
 void __gameport_register_port(struct gameport *gameport, struct module *owner);
 static inline void gameport_register_port(struct gameport *gameport)
 {
@@ -75,6 +77,29 @@ static inline void gameport_register_port(struct gameport *gameport)
 
 void gameport_unregister_port(struct gameport *gameport);
 
+void gameport_set_phys(struct gameport *gameport, const char *fmt, ...)
+       __attribute__ ((format (printf, 2, 3)));
+
+#else
+
+static inline void gameport_register_port(struct gameport *gameport)
+{
+       return;
+}
+
+static inline void gameport_unregister_port(struct gameport *gameport)
+{
+       return;
+}
+
+static inline void gameport_set_phys(struct gameport *gameport,
+                                    const char *fmt, ...)
+{
+       return;
+}
+
+#endif
+
 static inline struct gameport *gameport_allocate_port(void)
 {
        struct gameport *gameport = kcalloc(1, sizeof(struct gameport), GFP_KERNEL);
@@ -92,9 +117,6 @@ static inline void gameport_set_name(struct gameport *gameport, const char *name
        strlcpy(gameport->name, name, sizeof(gameport->name));
 }
 
-void gameport_set_phys(struct gameport *gameport, const char *fmt, ...)
-       __attribute__ ((format (printf, 2, 3)));
-
 /*
  * Use the following fucntions to manipulate gameport's per-port
  * driver-specific data.
diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h
new file mode 100644 (file)
index 0000000..7fd0576
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Basic general purpose allocator for managing special purpose memory
+ * not managed by the regular kmalloc/kfree interface.
+ * Uses for this includes on-device special memory, uncached memory
+ * etc.
+ *
+ * This code is based on the buddy allocator found in the sym53c8xx_2
+ * driver, adapted for general purpose use.
+ *
+ * This source code is licensed under the GNU General Public License,
+ * Version 2.  See the file COPYING for more details.
+ */
+
+#include <linux/spinlock.h>
+
+#define ALLOC_MIN_SHIFT                5 /* 32 bytes minimum */
+/*
+ *  Link between free memory chunks of a given size.
+ */
+struct gen_pool_link {
+       struct gen_pool_link *next;
+};
+
+/*
+ *  Memory pool descriptor.
+ */
+struct gen_pool {
+       spinlock_t lock;
+       unsigned long (*get_new_chunk)(struct gen_pool *);
+       struct gen_pool *next;
+       struct gen_pool_link *h;
+       unsigned long private;
+       int max_chunk_shift;
+};
+
+unsigned long gen_pool_alloc(struct gen_pool *poolp, int size);
+void gen_pool_free(struct gen_pool *mp, unsigned long ptr, int size);
+struct gen_pool *gen_pool_create(int nr_chunks, int max_chunk_shift,
+                                unsigned long (*fp)(struct gen_pool *),
+                                unsigned long data);
index af7407e8cfc53a476cd6d58561358cc8ed3a3b67..8d6bf608b19942c91fd6939bbb1685c765174fd5 100644 (file)
@@ -39,6 +39,7 @@ struct vm_area_struct;
 #define __GFP_COMP     0x4000u /* Add compound page metadata */
 #define __GFP_ZERO     0x8000u /* Return zeroed page on success */
 #define __GFP_NOMEMALLOC 0x10000u /* Don't use emergency reserves */
+#define __GFP_NORECLAIM  0x20000u /* No realy zone reclaim during allocation */
 
 #define __GFP_BITS_SHIFT 20    /* Room for 20 __GFP_FOO bits */
 #define __GFP_BITS_MASK ((1 << __GFP_BITS_SHIFT) - 1)
@@ -47,7 +48,7 @@ struct vm_area_struct;
 #define GFP_LEVEL_MASK (__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_FS| \
                        __GFP_COLD|__GFP_NOWARN|__GFP_REPEAT| \
                        __GFP_NOFAIL|__GFP_NORETRY|__GFP_NO_GROW|__GFP_COMP| \
-                       __GFP_NOMEMALLOC)
+                       __GFP_NOMEMALLOC|__GFP_NORECLAIM)
 
 #define GFP_ATOMIC     (__GFP_HIGH)
 #define GFP_NOIO       (__GFP_WAIT)
@@ -132,5 +133,10 @@ extern void FASTCALL(free_cold_page(struct page *page));
 #define free_page(addr) free_pages((addr),0)
 
 void page_alloc_init(void);
+#ifdef CONFIG_NUMA
+void drain_remote_pages(void);
+#else
+static inline void drain_remote_pages(void) { };
+#endif
 
 #endif /* __LINUX_GFP_H */
index ebc712e910669ea863b65c684560e1f0d756244f..8336dba18971bb85ce5075977d457e1ff4551c0f 100644 (file)
 #define __IRQ_MASK(x)  ((1UL << (x))-1)
 
 #define PREEMPT_MASK   (__IRQ_MASK(PREEMPT_BITS) << PREEMPT_SHIFT)
-#define HARDIRQ_MASK   (__IRQ_MASK(HARDIRQ_BITS) << HARDIRQ_SHIFT)
 #define SOFTIRQ_MASK   (__IRQ_MASK(SOFTIRQ_BITS) << SOFTIRQ_SHIFT)
+#define HARDIRQ_MASK   (__IRQ_MASK(HARDIRQ_BITS) << HARDIRQ_SHIFT)
 
 #define PREEMPT_OFFSET (1UL << PREEMPT_SHIFT)
 #define SOFTIRQ_OFFSET (1UL << SOFTIRQ_SHIFT)
 #define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT)
 
+#if PREEMPT_ACTIVE < (1 << (HARDIRQ_SHIFT + HARDIRQ_BITS))
+#error PREEMPT_ACTIVE is too low!
+#endif
+
 #define hardirq_count()        (preempt_count() & HARDIRQ_MASK)
 #define softirq_count()        (preempt_count() & SOFTIRQ_MASK)
 #define irq_count()    (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK))
index 503194e62fe166cec472e5612f6110926f4f1f06..ed2927ef1ff7e5436a5257e38243066edfb8d5ef 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Generic HDLC support routines for Linux
  *
- * Copyright (C) 1999-2003 Krzysztof Halasa <khc@pm.waw.pl>
+ * Copyright (C) 1999-2005 Krzysztof Halasa <khc@pm.waw.pl>
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License
@@ -41,6 +41,7 @@
 #define LMI_NONE               1 /* No LMI, all PVCs are static */
 #define LMI_ANSI               2 /* ANSI Annex D */
 #define LMI_CCITT              3 /* ITU-T Annex A */
+#define LMI_CISCO              4 /* The "original" LMI, aka Gang of Four */
 
 #define HDLC_MAX_MTU 1500      /* Ethernet 1500 bytes */
 #define HDLC_MAX_MRU (HDLC_MAX_MTU + 10 + 14 + 4) /* for ETH+VLAN over FR */
@@ -89,6 +90,7 @@ typedef struct pvc_device_struct {
                unsigned int deleted: 1;
                unsigned int fecn: 1;
                unsigned int becn: 1;
+               unsigned int bandwidth; /* Cisco LMI reporting only */
        }state;
 }pvc_device;
 
index 6af1ae4a821196a54981887cecc2fe32c0e18241..f529d144281521552491058d1b5ed66d47bc8d71 100644 (file)
@@ -4,6 +4,7 @@
 #ifdef CONFIG_HUGETLB_PAGE
 
 #include <linux/mempolicy.h>
+#include <asm/tlbflush.h>
 
 struct ctl_table;
 
@@ -22,12 +23,6 @@ int hugetlb_report_meminfo(char *);
 int hugetlb_report_node_meminfo(int, char *);
 int is_hugepage_mem_enough(size_t);
 unsigned long hugetlb_total_pages(void);
-struct page *follow_huge_addr(struct mm_struct *mm, unsigned long address,
-                             int write);
-struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
-                               pmd_t *pmd, int write);
-int is_aligned_hugepage_range(unsigned long addr, unsigned long len);
-int pmd_huge(pmd_t pmd);
 struct page *alloc_huge_page(void);
 void free_huge_page(struct page *);
 
@@ -35,6 +30,17 @@ extern unsigned long max_huge_pages;
 extern const unsigned long hugetlb_zero, hugetlb_infinity;
 extern int sysctl_hugetlb_shm_group;
 
+/* arch callbacks */
+
+pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr);
+pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr);
+struct page *follow_huge_addr(struct mm_struct *mm, unsigned long address,
+                             int write);
+struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
+                               pmd_t *pmd, int write);
+int is_aligned_hugepage_range(unsigned long addr, unsigned long len);
+int pmd_huge(pmd_t pmd);
+
 #ifndef ARCH_HAS_HUGEPAGE_ONLY_RANGE
 #define is_hugepage_only_range(mm, addr, len)  0
 #define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) \
@@ -48,6 +54,28 @@ extern int sysctl_hugetlb_shm_group;
 int prepare_hugepage_range(unsigned long addr, unsigned long len);
 #endif
 
+#ifndef ARCH_HAS_SETCLEAR_HUGE_PTE
+#define set_huge_pte_at(mm, addr, ptep, pte)   set_pte_at(mm, addr, ptep, pte)
+#define huge_ptep_get_and_clear(mm, addr, ptep) ptep_get_and_clear(mm, addr, ptep)
+#else
+void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
+                    pte_t *ptep, pte_t pte);
+pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
+                             pte_t *ptep);
+#endif
+
+#ifndef ARCH_HAS_HUGETLB_PREFAULT_HOOK
+#define hugetlb_prefault_arch_hook(mm)         do { } while (0)
+#else
+void hugetlb_prefault_arch_hook(struct mm_struct *mm);
+#endif
+
+#ifndef ARCH_HAS_HUGETLB_CLEAN_STALE_PGTABLE
+#define hugetlb_clean_stale_pgtable(pte)       BUG()
+#else
+void hugetlb_clean_stale_pgtable(pte_t *pte);
+#endif
+
 #else /* !CONFIG_HUGETLB_PAGE */
 
 static inline int is_vm_hugetlb_page(struct vm_area_struct *vma)
diff --git a/include/linux/i2c-sysfs.h b/include/linux/i2c-sysfs.h
new file mode 100644 (file)
index 0000000..d7bf6ce
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ *  i2c-sysfs.h - i2c chip driver sysfs defines
+ *
+ *  Copyright (C) 2005 Yani Ioannou <yani.ioannou@gmail.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifndef _LINUX_I2C_SYSFS_H
+#define _LINUX_I2C_SYSFS_H
+
+struct sensor_device_attribute{
+       struct device_attribute dev_attr;
+       int index;
+};
+#define to_sensor_dev_attr(_dev_attr) \
+       container_of(_dev_attr, struct sensor_device_attribute, dev_attr)
+
+#define SENSOR_DEVICE_ATTR(_name,_mode,_show,_store,_index)    \
+struct sensor_device_attribute sensor_dev_attr_##_name = {     \
+       .dev_attr =     __ATTR(_name,_mode,_show,_store),       \
+       .index =        _index,                                 \
+}
+
+#endif /* _LINUX_I2C_SYSFS_H */
index 9cfc0999becba75c452cda6fe3deeb03ac4b502b..336d6e509f59df38c9588f8597f72232e8837693 100644 (file)
@@ -664,7 +664,6 @@ typedef struct ide_drive_s {
 
        struct request          *rq;    /* current request */
        struct ide_drive_s      *next;  /* circular list of hwgroup drives */
-       struct ide_driver_s     *driver;/* (ide_driver_t *) */
        void            *driver_data;   /* extra driver data */
        struct hd_driveid       *id;    /* drive model identification info */
        struct proc_dir_entry *proc;    /* /proc/ide/ directory entry */
@@ -758,6 +757,8 @@ typedef struct ide_drive_s {
        struct semaphore gendev_rel_sem;        /* to deal with device release() */
 } ide_drive_t;
 
+#define to_ide_device(dev)container_of(dev, ide_drive_t, gendev)
+
 #define IDE_CHIPSET_PCI_MASK   \
     ((1<<ide_pci)|(1<<ide_cmd646)|(1<<ide_ali14xx))
 #define IDE_CHIPSET_IS_PCI(c)  ((IDE_CHIPSET_PCI_MASK >> (c)) & 1)
@@ -1086,28 +1087,20 @@ enum {
  */
 typedef struct ide_driver_s {
        struct module                   *owner;
-       const char                      *name;
        const char                      *version;
        u8                              media;
-       unsigned busy                   : 1;
        unsigned supports_dsc_overlap   : 1;
-       int             (*cleanup)(ide_drive_t *);
        ide_startstop_t (*do_request)(ide_drive_t *, struct request *, sector_t);
        int             (*end_request)(ide_drive_t *, int, int);
        ide_startstop_t (*error)(ide_drive_t *, struct request *rq, u8, u8);
        ide_startstop_t (*abort)(ide_drive_t *, struct request *rq);
        int             (*ioctl)(ide_drive_t *, struct inode *, struct file *, unsigned int, unsigned long);
        ide_proc_entry_t        *proc;
-       int             (*attach)(ide_drive_t *);
        void            (*ata_prebuilder)(ide_drive_t *);
        void            (*atapi_prebuilder)(ide_drive_t *);
        struct device_driver    gen_driver;
-       struct list_head drives;
-       struct list_head drivers;
 } ide_driver_t;
 
-#define DRIVER(drive)          ((drive)->driver)
-
 int generic_ide_ioctl(ide_drive_t *, struct file *, struct block_device *, unsigned, unsigned long);
 
 /*
@@ -1328,8 +1321,6 @@ extern void ide_init_subdrivers(void);
 
 void ide_init_disk(struct gendisk *, ide_drive_t *);
 
-extern int ata_attach(ide_drive_t *);
-
 extern int ideprobe_init(void);
 
 extern void ide_scan_pcibus(int scan_direction) __init;
@@ -1342,11 +1333,8 @@ extern void default_hwif_iops(ide_hwif_t *);
 extern void default_hwif_mmiops(ide_hwif_t *);
 extern void default_hwif_transport(ide_hwif_t *);
 
-int ide_register_driver(ide_driver_t *driver);
-void ide_unregister_driver(ide_driver_t *driver);
-int ide_register_subdriver(ide_drive_t *, ide_driver_t *);
-int ide_unregister_subdriver (ide_drive_t *drive);
-int ide_replace_subdriver(ide_drive_t *drive, const char *driver);
+void ide_register_subdriver(ide_drive_t *, ide_driver_t *);
+void ide_unregister_subdriver(ide_drive_t *, ide_driver_t *);
 
 #define ON_BOARD               1
 #define NEVER_BOARD            0
index d73a9d62f208a7a2ad3fb9fd01c2800c4dade0da..ce627d9092efbc7c97d1de649996d771183386f3 100644 (file)
@@ -33,7 +33,7 @@
 #define        IFF_LOOPBACK    0x8             /* is a loopback net            */
 #define        IFF_POINTOPOINT 0x10            /* interface is has p-p link    */
 #define        IFF_NOTRAILERS  0x20            /* avoid use of trailers        */
-#define        IFF_RUNNING     0x40            /* resources allocated          */
+#define        IFF_RUNNING     0x40            /* interface running and carrier ok */
 #define        IFF_NOARP       0x80            /* no ARP protocol              */
 #define        IFF_PROMISC     0x100           /* receive all packets          */
 #define        IFF_ALLMULTI    0x200           /* receive all multicast packets*/
index 0485b256d043adbb3c823f9a0369021643695820..004e6f09a6e2daf89387bb2d1794cdd377c0ec1d 100644 (file)
@@ -23,7 +23,7 @@ struct shaper
        __u32 shapeclock;
        unsigned long recovery; /* Time we can next clock a packet out on
                                   an empty queue */
-        unsigned long locked;
+       struct semaphore sem;
         struct net_device_stats stats;
        struct net_device *dev;
        int  (*hard_start_xmit) (struct sk_buff *skb,
@@ -38,7 +38,6 @@ struct shaper
        int (*hard_header_cache)(struct neighbour *neigh, struct hh_cache *hh);
        void (*header_cache_update)(struct hh_cache *hh, struct net_device *dev, unsigned char *  haddr);
        struct net_device_stats* (*get_stats)(struct net_device *dev);
-       wait_queue_head_t  wait_queue;
        struct timer_list timer;
 };
 
index 4fd451f81ccb6e814311120774e399e1af16fb67..3fba9e2f5427d633a9260854112647e9294b07a3 100644 (file)
@@ -9,7 +9,7 @@
  *
  * Author:     Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  *             Donald Becker, <becker@super.org>
- *    Peter De Schrijver, <stud11@cc4.kuleuven.ac.be>
+ *             Peter De Schrijver, <stud11@cc4.kuleuven.ac.be>
  *
  *             This program is free software; you can redistribute it and/or
  *             modify it under the terms of the GNU General Public License
 #ifndef _LINUX_IF_TR_H
 #define _LINUX_IF_TR_H
 
+#include <asm/byteorder.h>     /* For __be16 */
 
 /* IEEE 802.5 Token-Ring magic constants.  The frame sizes omit the preamble
    and FCS/CRC (frame check sequence). */
-#define TR_ALEN        6               /* Octets in one ethernet addr   */
-#define TR_HLEN   (sizeof(struct trh_hdr)+sizeof(struct trllc))
-#define AC                     0x10
-#define LLC_FRAME 0x40
-#if 0
-#define ETH_HLEN       14              /* Total octets in header.       */
-#define ETH_ZLEN       60              /* Min. octets in frame sans FCS */
-#define ETH_DATA_LEN   1500            /* Max. octets in payload        */
-#define ETH_FRAME_LEN  1514            /* Max. octets in frame sans FCS */
-#endif
-
+#define TR_ALEN                6               /* Octets in one token-ring addr */
+#define TR_HLEN        (sizeof(struct trh_hdr)+sizeof(struct trllc))
+#define AC             0x10
+#define LLC_FRAME      0x40
 
 /* LLC and SNAP constants */
-#define EXTENDED_SAP 0xAA
-#define UI_CMD       0x03
+#define EXTENDED_SAP   0xAA
+#define UI_CMD         0x03
 
 /* This is an Token-Ring frame header. */
 struct trh_hdr {
@@ -44,8 +38,8 @@ struct trh_hdr {
        __u8  fc;                       /* frame control field */
        __u8  daddr[TR_ALEN];           /* destination address */
        __u8  saddr[TR_ALEN];           /* source address */
-       __u16 rcf;                      /* route control field */
-       __u16 rseg[8];                  /* routing registers */
+       __be16 rcf;                     /* route control field */
+       __be16 rseg[8];                 /* routing registers */
 };
 
 #ifdef __KERNEL__
@@ -63,7 +57,7 @@ struct trllc {
        __u8  ssap;                     /* source SAP */
        __u8  llc;                      /* LLC control field */
        __u8  protid[3];                /* protocol id */
-       __u16 ethertype;                /* ether type field */
+       __be16 ethertype;               /* ether type field */
 };
 
 /* Token-Ring statistics collection data. */
@@ -96,14 +90,13 @@ struct tr_statistics {
 };
 
 /* source routing stuff */
-
-#define TR_RII 0x80
-#define TR_RCF_DIR_BIT 0x80
-#define TR_RCF_LEN_MASK 0x1f00
-#define TR_RCF_BROADCAST 0x8000         /* all-routes broadcast */
-#define TR_RCF_LIMITED_BROADCAST 0xC000 /* single-route broadcast */
-#define TR_RCF_FRAME2K 0x20
-#define TR_RCF_BROADCAST_MASK 0xC000
-#define TR_MAXRIFLEN 18
+#define TR_RII                         0x80
+#define TR_RCF_DIR_BIT                 0x80
+#define TR_RCF_LEN_MASK        0x1f00
+#define TR_RCF_BROADCAST       0x8000  /* all-routes broadcast */
+#define TR_RCF_LIMITED_BROADCAST 0xC000        /* single-route broadcast */
+#define TR_RCF_FRAME2K                 0x20
+#define TR_RCF_BROADCAST_MASK  0xC000
+#define TR_MAXRIFLEN           18
 
 #endif /* _LINUX_IF_TR_H */
index 6fafb27877a7d5adbac3b0419f82a37eed1fc9c7..7e1e15f934f340851c503c789e701724d81bcb0c 100644 (file)
@@ -29,6 +29,7 @@ struct ipv4_devconf
        int     no_xfrm;
        int     no_policy;
        int     force_igmp_version;
+       int     promote_secondaries;
        void    *sysctl;
 };
 
@@ -71,6 +72,7 @@ struct in_device
 #define IN_DEV_SEC_REDIRECTS(in_dev)   (ipv4_devconf.secure_redirects || (in_dev)->cnf.secure_redirects)
 #define IN_DEV_IDTAG(in_dev)           ((in_dev)->cnf.tag)
 #define IN_DEV_MEDIUM_ID(in_dev)       ((in_dev)->cnf.medium_id)
+#define IN_DEV_PROMOTE_SECONDARIES(in_dev)     (ipv4_devconf.promote_secondaries || (in_dev)->cnf.promote_secondaries)
 
 #define IN_DEV_RX_REDIRECTS(in_dev) \
        ((IN_DEV_FORWARD(in_dev) && \
index 72731d7d189ee2be0f223e77d75799e18d5eb26c..9d9598ed760de2a7a4f2081f62dc41b11a6e81c8 100644 (file)
@@ -1015,7 +1015,7 @@ static inline void input_set_abs_params(struct input_dev *dev, int axis, int min
        dev->absbit[LONG(axis)] |= BIT(axis);
 }
 
-extern struct class_simple *input_class;
+extern struct class *input_class;
 
 #endif
 #endif
diff --git a/include/linux/ioc4.h b/include/linux/ioc4.h
new file mode 100644 (file)
index 0000000..3dd18b7
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (c) 2005 Silicon Graphics, Inc.  All Rights Reserved.
+ */
+
+#ifndef _LINUX_IOC4_H
+#define _LINUX_IOC4_H
+
+#include <linux/interrupt.h>
+
+/***************
+ * Definitions *
+ ***************/
+
+/* Miscellaneous values inherent to hardware */
+
+#define IOC4_EXTINT_COUNT_DIVISOR 520  /* PCI clocks per COUNT tick */
+
+/***********************************
+ * Structures needed by subdrivers *
+ ***********************************/
+
+/* This structure fully describes the IOC4 miscellaneous registers which
+ * appear at bar[0]+0x00000 through bar[0]+0x0005c.  The corresponding
+ * PCI resource is managed by the main IOC4 driver because it contains
+ * registers of interest to many different IOC4 subdrivers.
+ */
+struct ioc4_misc_regs {
+       /* Miscellaneous IOC4 registers */
+       union ioc4_pci_err_addr_l {
+               uint32_t raw;
+               struct {
+                       uint32_t valid:1;       /* Address captured */
+                       uint32_t master_id:4;   /* Unit causing error
+                                                * 0/1: Serial port 0 TX/RX
+                                                * 2/3: Serial port 1 TX/RX
+                                                * 4/5: Serial port 2 TX/RX
+                                                * 6/7: Serial port 3 TX/RX
+                                                * 8: ATA/ATAPI
+                                                * 9-15: Undefined
+                                                */
+                       uint32_t mul_err:1;     /* Multiple errors occurred */
+                       uint32_t addr:26;       /* Bits 31-6 of error addr */
+               } fields;
+       } pci_err_addr_l;
+       uint32_t pci_err_addr_h;        /* Bits 63-32 of error addr */
+       union ioc4_sio_int {
+               uint32_t raw;
+               struct {
+                       uint8_t tx_mt:1;        /* TX ring buffer empty */
+                       uint8_t rx_full:1;      /* RX ring buffer full */
+                       uint8_t rx_high:1;      /* RX high-water exceeded */
+                       uint8_t rx_timer:1;     /* RX timer has triggered */
+                       uint8_t delta_dcd:1;    /* DELTA_DCD seen */
+                       uint8_t delta_cts:1;    /* DELTA_CTS seen */
+                       uint8_t intr_pass:1;    /* Interrupt pass-through */
+                       uint8_t tx_explicit:1;  /* TX, MCW, or delay complete */
+               } fields[4];
+       } sio_ir;               /* Serial interrupt state */
+       union ioc4_other_int {
+               uint32_t raw;
+               struct {
+                       uint32_t ata_int:1;     /* ATA port passthru */
+                       uint32_t ata_memerr:1;  /* ATA halted by mem error */
+                       uint32_t memerr:4;      /* Serial halted by mem err */
+                       uint32_t kbd_int:1;     /* kbd/mouse intr asserted */
+                       uint32_t reserved:16;   /* zero */
+                       uint32_t rt_int:1;      /* INT_OUT section latch */
+                       uint32_t gen_int:8;     /* Intr. from generic pins */
+               } fields;
+       } other_ir;             /* Other interrupt state */
+       union ioc4_sio_int sio_ies;     /* Serial interrupt enable set */
+       union ioc4_other_int other_ies; /* Other interrupt enable set */
+       union ioc4_sio_int sio_iec;     /* Serial interrupt enable clear */
+       union ioc4_other_int other_iec; /* Other interrupt enable clear */
+       union ioc4_sio_cr {
+               uint32_t raw;
+               struct {
+                       uint32_t cmd_pulse:4;   /* Bytebus strobe width */
+                       uint32_t arb_diag:3;    /* PCI bus requester */
+                       uint32_t sio_diag_idle:1;       /* Active ser req? */
+                       uint32_t ata_diag_idle:1;       /* Active ATA req? */
+                       uint32_t ata_diag_active:1;     /* ATA req is winner */
+                       uint32_t reserved:22;   /* zero */
+               } fields;
+       } sio_cr;
+       uint32_t unused1;
+       union ioc4_int_out {
+               uint32_t raw;
+               struct {
+                       uint32_t count:16;      /* Period control */
+                       uint32_t mode:3;        /* Output signal shape */
+                       uint32_t reserved:11;   /* zero */
+                       uint32_t diag:1;        /* Timebase control */
+                       uint32_t int_out:1;     /* Current value */
+               } fields;
+       } int_out;              /* External interrupt output control */
+       uint32_t unused2;
+       union ioc4_gpcr {
+               uint32_t raw;
+               struct {
+                       uint32_t dir:8; /* Pin direction */
+                       uint32_t edge:8;        /* Edge/level mode */
+                       uint32_t reserved1:4;   /* zero */
+                       uint32_t int_out_en:1;  /* INT_OUT enable */
+                       uint32_t reserved2:11;  /* zero */
+               } fields;
+       } gpcr_s;               /* Generic PIO control set */
+       union ioc4_gpcr gpcr_c; /* Generic PIO control clear */
+       union ioc4_gpdr {
+               uint32_t raw;
+               struct {
+                       uint32_t gen_pin:8;     /* State of pins */
+                       uint32_t reserved:24;
+               } fields;
+       } gpdr;                 /* Generic PIO data */
+       uint32_t unused3;
+       union ioc4_gppr {
+               uint32_t raw;
+               struct {
+                       uint32_t gen_pin:1;     /* Single pin state */
+                       uint32_t reserved:31;
+               } fields;
+       } gppr[8];              /* Generic PIO pins */
+};
+
+/* Masks for GPCR DIR pins */
+#define IOC4_GPCR_DIR_0 0x01   /* External interrupt output */
+#define IOC4_GPCR_DIR_1 0x02   /* External interrupt input */
+#define IOC4_GPCR_DIR_2 0x04
+#define IOC4_GPCR_DIR_3 0x08   /* Keyboard/mouse presence */
+#define IOC4_GPCR_DIR_4 0x10   /* Ser. port 0 xcvr select (0=232, 1=422) */
+#define IOC4_GPCR_DIR_5 0x20   /* Ser. port 1 xcvr select (0=232, 1=422) */
+#define IOC4_GPCR_DIR_6 0x40   /* Ser. port 2 xcvr select (0=232, 1=422) */
+#define IOC4_GPCR_DIR_7 0x80   /* Ser. port 3 xcvr select (0=232, 1=422) */
+
+/* Masks for GPCR EDGE pins */
+#define IOC4_GPCR_EDGE_0 0x01
+#define IOC4_GPCR_EDGE_1 0x02  /* External interrupt input */
+#define IOC4_GPCR_EDGE_2 0x04
+#define IOC4_GPCR_EDGE_3 0x08
+#define IOC4_GPCR_EDGE_4 0x10
+#define IOC4_GPCR_EDGE_5 0x20
+#define IOC4_GPCR_EDGE_6 0x40
+#define IOC4_GPCR_EDGE_7 0x80
+
+/* One of these per IOC4 */
+struct ioc4_driver_data {
+       struct list_head idd_list;
+       unsigned long idd_bar0;
+       struct pci_dev *idd_pdev;
+       const struct pci_device_id *idd_pci_id;
+       struct __iomem ioc4_misc_regs *idd_misc_regs;
+       unsigned long count_period;
+       void *idd_serial_data;
+};
+
+/* One per submodule */
+struct ioc4_submodule {
+       struct list_head is_list;
+       char *is_name;
+       struct module *is_owner;
+       int (*is_probe) (struct ioc4_driver_data *);
+       int (*is_remove) (struct ioc4_driver_data *);
+};
+
+#define IOC4_NUM_CARDS         8       /* max cards per partition */
+
+/**********************************
+ * Functions needed by submodules *
+ **********************************/
+
+extern int ioc4_register_submodule(struct ioc4_submodule *);
+extern void ioc4_unregister_submodule(struct ioc4_submodule *);
+
+#endif                         /* _LINUX_IOC4_H */
diff --git a/include/linux/ioc4_common.h b/include/linux/ioc4_common.h
deleted file mode 100644 (file)
index b03bcc4..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (c) 2005 Silicon Graphics, Inc.  All Rights Reserved.
- */
-
-#ifndef _LINUX_IOC4_COMMON_H
-#define _LINUX_IOC4_COMMON_H
-
-/* prototypes */
-
-int ioc4_serial_init(void);
-
-int ioc4_serial_attach_one(struct pci_dev *pdev, const struct
-                               pci_device_id *pci_id);
-int ioc4_ide_attach_one(struct pci_dev *pdev, const struct
-                               pci_device_id *pci_id);
-
-#endif /* _LINUX_IOC4_COMMON_H */
index 8438c68591f99cbcb1959b0ea99b47710dfbcdfa..31e7cedd9f844b3e6d28dffe271da3b724e0f644 100644 (file)
@@ -81,6 +81,7 @@
 #ifdef __KERNEL__
 #include <linux/config.h>
 #include <linux/types.h>
+#include <net/request_sock.h>
 #include <net/sock.h>
 #include <linux/igmp.h>
 #include <net/flow.h>
@@ -107,6 +108,26 @@ struct ip_options {
 
 #define optlength(opt) (sizeof(struct ip_options) + opt->optlen)
 
+struct inet_request_sock {
+       struct request_sock     req;
+       u32                     loc_addr;
+       u32                     rmt_addr;
+       u16                     rmt_port;
+       u16                     snd_wscale : 4, 
+                               rcv_wscale : 4, 
+                               tstamp_ok  : 1,
+                               sack_ok    : 1,
+                               wscale_ok  : 1,
+                               ecn_ok     : 1,
+                               acked      : 1;
+       struct ip_options       *opt;
+};
+
+static inline struct inet_request_sock *inet_rsk(const struct request_sock *sk)
+{
+       return (struct inet_request_sock *)sk;
+}
+
 struct ipv6_pinfo;
 
 struct inet_sock {
index ab0d0efbf240122b6aab244a11d692f716a75bfd..6fcd6a0ade24860807917b746abc5179c6338f6a 100644 (file)
@@ -193,6 +193,19 @@ struct inet6_skb_parm {
 
 #define IP6CB(skb)     ((struct inet6_skb_parm*)((skb)->cb))
 
+struct tcp6_request_sock {
+       struct tcp_request_sock req;
+       struct in6_addr         loc_addr;
+       struct in6_addr         rmt_addr;
+       struct sk_buff          *pktopts;
+       int                     iif;
+};
+
+static inline struct tcp6_request_sock *tcp6_rsk(const struct request_sock *sk)
+{
+       return (struct tcp6_request_sock *)sk;
+}
+
 /**
  * struct ipv6_pinfo - ipv6 private area
  *
index c3ff4d1016675fb8d8309b03e090f603bd1ee69e..7fc1022be9ee13254dbfd7a2f6bf67e9c20cb1f6 100644 (file)
@@ -47,6 +47,10 @@ struct hw_interrupt_type {
        void (*ack)(unsigned int irq);
        void (*end)(unsigned int irq);
        void (*set_affinity)(unsigned int irq, cpumask_t dest);
+       /* Currently used only by UML, might disappear one day.*/
+#ifdef CONFIG_IRQ_RELEASE_METHOD
+       void (*release)(unsigned int irq, void *dev_id);
+#endif
 };
 
 typedef struct hw_interrupt_type  hw_irq_controller;
diff --git a/include/linux/klist.h b/include/linux/klist.h
new file mode 100644 (file)
index 0000000..eebf5e5
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ *     klist.h - Some generic list helpers, extending struct list_head a bit.
+ *
+ *     Implementations are found in lib/klist.c
+ *
+ *
+ *     Copyright (C) 2005 Patrick Mochel
+ *
+ *     This file is rleased under the GPL v2.
+ */
+
+#include <linux/spinlock.h>
+#include <linux/completion.h>
+#include <linux/kref.h>
+#include <linux/list.h>
+
+
+struct klist {
+       spinlock_t              k_lock;
+       struct list_head        k_list;
+};
+
+
+extern void klist_init(struct klist * k);
+
+
+struct klist_node {
+       struct klist            * n_klist;
+       struct list_head        n_node;
+       struct kref             n_ref;
+       struct completion       n_removed;
+};
+
+extern void klist_add_tail(struct klist * k, struct klist_node * n);
+extern void klist_add_head(struct klist * k, struct klist_node * n);
+
+extern void klist_del(struct klist_node * n);
+extern void klist_remove(struct klist_node * n);
+
+extern int klist_node_attached(struct klist_node * n);
+
+
+struct klist_iter {
+       struct klist            * i_klist;
+       struct list_head        * i_head;
+       struct klist_node       * i_cur;
+};
+
+
+extern void klist_iter_init(struct klist * k, struct klist_iter * i);
+extern void klist_iter_init_node(struct klist * k, struct klist_iter * i, 
+                                struct klist_node * n);
+extern void klist_iter_exit(struct klist_iter * i);
+extern struct klist_node * klist_next(struct klist_iter * i);
+
index 765d660d3bea458977cc0e3110e4850210913d40..3b22304f12fd9f542f9a09f10e7bcde9531a9fd7 100644 (file)
@@ -33,7 +33,7 @@
 extern u64 hotplug_seqnum;
 
 struct kobject {
-       char                    * k_name;
+       const char              * k_name;
        char                    name[KOBJ_NAME_LEN];
        struct kref             kref;
        struct list_head        entry;
@@ -46,7 +46,7 @@ struct kobject {
 extern int kobject_set_name(struct kobject *, const char *, ...)
        __attribute__((format(printf,2,3)));
 
-static inline char * kobject_name(struct kobject * kobj)
+static inline const char * kobject_name(const struct kobject * kobj)
 {
        return kobj->k_name;
 }
@@ -57,7 +57,7 @@ extern void kobject_cleanup(struct kobject *);
 extern int kobject_add(struct kobject *);
 extern void kobject_del(struct kobject *);
 
-extern int kobject_rename(struct kobject *, char *new_name);
+extern int kobject_rename(struct kobject *, const char *new_name);
 
 extern int kobject_register(struct kobject *);
 extern void kobject_unregister(struct kobject *);
@@ -94,7 +94,7 @@ struct kobj_type {
  */
 struct kset_hotplug_ops {
        int (*filter)(struct kset *kset, struct kobject *kobj);
-       char *(*name)(struct kset *kset, struct kobject *kobj);
+       const char *(*name)(struct kset *kset, struct kobject *kobj);
        int (*hotplug)(struct kset *kset, struct kobject *kobj, char **envp,
                        int num_envp, char *buffer, int buffer_size);
 };
index bd0df84cfd877a05271597a1ac96a01d83de9ee9..973090be7fc4e863ac27e9b5844550f25b58afd1 100644 (file)
@@ -416,6 +416,7 @@ extern u8 ata_chk_err(struct ata_port *ap);
 extern void ata_exec_command(struct ata_port *ap, struct ata_taskfile *tf);
 extern int ata_port_start (struct ata_port *ap);
 extern void ata_port_stop (struct ata_port *ap);
+extern void ata_host_stop (struct ata_host_set *host_set);
 extern irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs);
 extern void ata_qc_prep(struct ata_queued_cmd *qc);
 extern int ata_qc_issue_prot(struct ata_queued_cmd *qc);
@@ -426,6 +427,7 @@ extern void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
 extern unsigned int ata_dev_classify(struct ata_taskfile *tf);
 extern void ata_dev_id_string(u16 *id, unsigned char *s,
                              unsigned int ofs, unsigned int len);
+extern void ata_dev_config(struct ata_port *ap, unsigned int i);
 extern void ata_bmdma_setup (struct ata_queued_cmd *qc);
 extern void ata_bmdma_start (struct ata_queued_cmd *qc);
 extern void ata_bmdma_stop(struct ata_port *ap);
@@ -472,12 +474,34 @@ static inline u8 ata_chk_status(struct ata_port *ap)
        return ap->ops->check_status(ap);
 }
 
+
+/**
+ *     ata_pause - Flush writes and pause 400 nanoseconds.
+ *     @ap: Port to wait for.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ */
+
 static inline void ata_pause(struct ata_port *ap)
 {
        ata_altstatus(ap);
        ndelay(400);
 }
 
+
+/**
+ *     ata_busy_wait - Wait for a port status register
+ *     @ap: Port to wait for.
+ *
+ *     Waits up to max*10 microseconds for the selected bits in the port's
+ *     status register to be cleared.
+ *     Returns final value of status register.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ */
+
 static inline u8 ata_busy_wait(struct ata_port *ap, unsigned int bits,
                               unsigned int max)
 {
@@ -492,6 +516,18 @@ static inline u8 ata_busy_wait(struct ata_port *ap, unsigned int bits,
        return status;
 }
 
+
+/**
+ *     ata_wait_idle - Wait for a port to be idle.
+ *     @ap: Port to wait for.
+ *
+ *     Waits up to 10ms for port's BUSY and DRQ signals to clear.
+ *     Returns final value of status register.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ */
+
 static inline u8 ata_wait_idle(struct ata_port *ap)
 {
        u8 status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
@@ -530,6 +566,18 @@ static inline void ata_tf_init(struct ata_port *ap, struct ata_taskfile *tf, uns
                tf->device = ATA_DEVICE_OBS | ATA_DEV1;
 }
 
+
+/**
+ *     ata_irq_on - Enable interrupts on a port.
+ *     @ap: Port on which interrupts are enabled.
+ *
+ *     Enable interrupts on a legacy IDE device using MMIO or PIO,
+ *     wait for idle, clear any pending interrupts.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ */
+
 static inline u8 ata_irq_on(struct ata_port *ap)
 {
        struct ata_ioports *ioaddr = &ap->ioaddr;
@@ -549,6 +597,18 @@ static inline u8 ata_irq_on(struct ata_port *ap)
        return tmp;
 }
 
+
+/**
+ *     ata_irq_ack - Acknowledge a device interrupt.
+ *     @ap: Port on which interrupts are enabled.
+ *
+ *     Wait up to 10 ms for legacy IDE device to become idle (BUSY
+ *     or BUSY+DRQ clear).  Obtain dma status and port status from
+ *     device.  Clear the interrupt.  Return port status.
+ *
+ *     LOCKING:
+ */
+
 static inline u8 ata_irq_ack(struct ata_port *ap, unsigned int chk_drq)
 {
        unsigned int bits = chk_drq ? ATA_BUSY | ATA_DRQ : ATA_BUSY;
@@ -590,6 +650,13 @@ static inline void scr_write(struct ata_port *ap, unsigned int reg, u32 val)
        ap->ops->scr_write(ap, reg, val);
 }
 
+static inline void scr_write_flush(struct ata_port *ap, unsigned int reg, 
+                                  u32 val)
+{
+       ap->ops->scr_write(ap, reg, val);
+       (void) ap->ops->scr_read(ap, reg);
+}
+
 static inline unsigned int sata_dev_present(struct ata_port *ap)
 {
        return ((scr_read(ap, SCR_STATUS) & 0xf) == 0x3) ? 1 : 0;
index 4b62c42b842c2d1d19ff1002a247488d95b1cf6e..e36a46702d9411085773744b46e6afc45728618f 100644 (file)
 #define I2O_MAJOR              80      /* 80->87 */
 
 #define SHMIQ_MAJOR            85   /* Linux/mips, SGI /dev/shmiq */
+#define SCSI_CHANGER_MAJOR      86
 
 #define IDE6_MAJOR             88
 #define IDE7_MAJOR             89
index 20971fe78a8d31bdbf456348ccbe71d925b6fd6f..374b615ea9ea95ec130aeb10dfffc31f0f29a6f1 100644 (file)
 #define ADVERTISE_SLCT          0x001f  /* Selector bits               */
 #define ADVERTISE_CSMA          0x0001  /* Only selector supported     */
 #define ADVERTISE_10HALF        0x0020  /* Try for 10mbps half-duplex  */
+#define ADVERTISE_1000XFULL     0x0020  /* Try for 1000BASE-X full-duplex */
 #define ADVERTISE_10FULL        0x0040  /* Try for 10mbps full-duplex  */
+#define ADVERTISE_1000XHALF     0x0040  /* Try for 1000BASE-X half-duplex */
 #define ADVERTISE_100HALF       0x0080  /* Try for 100mbps half-duplex */
+#define ADVERTISE_1000XPAUSE    0x0080  /* Try for 1000BASE-X pause    */
 #define ADVERTISE_100FULL       0x0100  /* Try for 100mbps full-duplex */
+#define ADVERTISE_1000XPSE_ASYM 0x0100  /* Try for 1000BASE-X asym pause */
 #define ADVERTISE_100BASE4      0x0200  /* Try for 100mbps 4k packets  */
 #define ADVERTISE_PAUSE_CAP     0x0400  /* Try for pause               */
 #define ADVERTISE_PAUSE_ASYM    0x0800  /* Try for asymetric pause     */
 /* Link partner ability register. */
 #define LPA_SLCT                0x001f  /* Same as advertise selector  */
 #define LPA_10HALF              0x0020  /* Can do 10mbps half-duplex   */
+#define LPA_1000XFULL           0x0020  /* Can do 1000BASE-X full-duplex */
 #define LPA_10FULL              0x0040  /* Can do 10mbps full-duplex   */
+#define LPA_1000XHALF           0x0040  /* Can do 1000BASE-X half-duplex */
 #define LPA_100HALF             0x0080  /* Can do 100mbps half-duplex  */
+#define LPA_1000XPAUSE          0x0080  /* Can do 1000BASE-X pause     */
 #define LPA_100FULL             0x0100  /* Can do 100mbps full-duplex  */
+#define LPA_1000XPAUSE_ASYM     0x0100  /* Can do 1000BASE-X pause asym*/
 #define LPA_100BASE4            0x0200  /* Can do 100mbps 4k packets   */
 #define LPA_PAUSE_CAP           0x0400  /* Can pause                   */
 #define LPA_PAUSE_ASYM          0x0800  /* Can pause asymetrically     */
index 17518fe0b311aa0ed08122bc459970d6a21ea139..1813b162b0a8a009531be6aed515be1c4cfa7480 100644 (file)
@@ -691,6 +691,12 @@ extern void show_mem(void);
 extern void si_meminfo(struct sysinfo * val);
 extern void si_meminfo_node(struct sysinfo *val, int nid);
 
+#ifdef CONFIG_NUMA
+extern void setup_per_cpu_pageset(void);
+#else
+static inline void setup_per_cpu_pageset(void) {}
+#endif
+
 /* prio_tree.c */
 void vma_prio_tree_add(struct vm_area_struct *, struct vm_area_struct *old);
 void vma_prio_tree_insert(struct vm_area_struct *, struct prio_tree_root *);
index 7b904c5102f6b96bd9d5cfa3fd956c8334bc5c59..896342817b97bab2a7b20bb247115317224583fe 100644 (file)
@@ -195,6 +195,33 @@ struct _mmc_csd {
 #define MMC_VDD_35_36  0x00800000      /* VDD voltage 3.5 ~ 3.6 */
 #define MMC_CARD_BUSY  0x80000000      /* Card Power up status bit */
 
+/*
+ * Card Command Classes (CCC)
+ */
+#define CCC_BASIC              (1<<0)  /* (0) Basic protocol functions */
+                                       /* (CMD0,1,2,3,4,7,9,10,12,13,15) */
+#define CCC_STREAM_READ                (1<<1)  /* (1) Stream read commands */
+                                       /* (CMD11) */
+#define CCC_BLOCK_READ         (1<<2)  /* (2) Block read commands */
+                                       /* (CMD16,17,18) */
+#define CCC_STREAM_WRITE       (1<<3)  /* (3) Stream write commands */
+                                       /* (CMD20) */
+#define CCC_BLOCK_WRITE                (1<<4)  /* (4) Block write commands */
+                                       /* (CMD16,24,25,26,27) */
+#define CCC_ERASE              (1<<5)  /* (5) Ability to erase blocks */
+                                       /* (CMD32,33,34,35,36,37,38,39) */
+#define CCC_WRITE_PROT         (1<<6)  /* (6) Able to write protect blocks */
+                                       /* (CMD28,29,30) */
+#define CCC_LOCK_CARD          (1<<7)  /* (7) Able to lock down card */
+                                       /* (CMD16,CMD42) */
+#define CCC_APP_SPEC           (1<<8)  /* (8) Application specific */
+                                       /* (CMD55,56,57,ACMD*) */
+#define CCC_IO_MODE            (1<<9)  /* (9) I/O mode */
+                                       /* (CMD5,39,40,52,53) */
+#define CCC_SWITCH             (1<<10) /* (10) High speed switch */
+                                       /* (CMD6,34,35,36,37,50) */
+                                       /* (11) Reserved */
+                                       /* (CMD?) */
 
 /*
  * CSD field definitions
index e530c6c092f1610535f50f24f689bc45e1bbf7ac..4733d35d8223bf847bc6b31ff7e705da8adb45ce 100644 (file)
@@ -63,6 +63,12 @@ struct per_cpu_pageset {
 #endif
 } ____cacheline_aligned_in_smp;
 
+#ifdef CONFIG_NUMA
+#define zone_pcp(__z, __cpu) ((__z)->pageset[(__cpu)])
+#else
+#define zone_pcp(__z, __cpu) (&(__z)->pageset[(__cpu)])
+#endif
+
 #define ZONE_DMA               0
 #define ZONE_NORMAL            1
 #define ZONE_HIGHMEM           2
@@ -122,8 +128,11 @@ struct zone {
         */
        unsigned long           lowmem_reserve[MAX_NR_ZONES];
 
+#ifdef CONFIG_NUMA
+       struct per_cpu_pageset  *pageset[NR_CPUS];
+#else
        struct per_cpu_pageset  pageset[NR_CPUS];
-
+#endif
        /*
         * free areas of different sizes
         */
@@ -144,6 +153,14 @@ struct zone {
        unsigned long           pages_scanned;     /* since last reclaim */
        int                     all_unreclaimable; /* All pages pinned */
 
+       /*
+        * Does the allocator try to reclaim pages from the zone as soon
+        * as it fails a watermark_ok() in __alloc_pages?
+        */
+       int                     reclaim_pages;
+       /* A count of how many reclaimers are scanning this zone */
+       atomic_t                reclaim_in_progress;
+
        /*
         * prev_priority holds the scanning priority for this zone.  It is
         * defined as the scanning priority at which we achieved our reclaim
@@ -381,7 +398,7 @@ int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int, struct file *,
 
 #include <linux/topology.h>
 /* Returns the number of the current Node. */
-#define numa_node_id()         (cpu_to_node(_smp_processor_id()))
+#define numa_node_id()         (cpu_to_node(raw_smp_processor_id()))
 
 #ifndef CONFIG_DISCONTIGMEM
 
index 6d997ff3f10387a622d493a1c89adbe6cb9337e5..20cb226b22685fcd55428104c84b64ba14c4443c 100644 (file)
@@ -101,7 +101,6 @@ enum sock_type {
  *  @sk: internal networking protocol agnostic socket representation
  *  @wait: wait queue for several uses
  *  @type: socket type (%SOCK_STREAM, etc)
- *  @passcred: credentials (used only in Unix Sockets (aka PF_LOCAL))
  */
 struct socket {
        socket_state            state;
index ac11d73be4ce87d163f3bf0aedf0438e30f89f1c..ba5d1236aa170c75a92c1137e34b3c0fb242f93b 100644 (file)
@@ -204,7 +204,7 @@ struct hh_cache
        /* cached hardware header; allow for machine alignment needs.        */
 #define HH_DATA_MOD    16
 #define HH_DATA_OFF(__len) \
-       (HH_DATA_MOD - ((__len) & (HH_DATA_MOD - 1)))
+       (HH_DATA_MOD - (((__len - 1) & (HH_DATA_MOD - 1)) + 1))
 #define HH_DATA_ALIGN(__len) \
        (((__len)+(HH_DATA_MOD-1))&~(HH_DATA_MOD - 1))
        unsigned long   hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)];
@@ -401,7 +401,7 @@ struct net_device
        } reg_state;
 
        /* Net device features */
-       int                     features;
+       unsigned long           features;
 #define NETIF_F_SG             1       /* Scatter/gather IO. */
 #define NETIF_F_IP_CSUM                2       /* Can checksum only TCP/UDP over IPv4. */
 #define NETIF_F_NO_CSUM                4       /* Does not require checksum. F.e. loopack. */
@@ -503,7 +503,7 @@ static inline void *netdev_priv(struct net_device *dev)
 #define SET_NETDEV_DEV(net, pdev)      ((net)->class_dev.dev = (pdev))
 
 struct packet_type {
-       unsigned short          type;   /* This is really htons(ether_type).    */
+       __be16                  type;   /* This is really htons(ether_type).    */
        struct net_device               *dev;   /* NULL is wildcarded here              */
        int                     (*func) (struct sk_buff *, struct net_device *,
                                         struct packet_type *);
@@ -913,6 +913,7 @@ extern void         dev_mc_discard(struct net_device *dev);
 extern void            dev_set_promiscuity(struct net_device *dev, int inc);
 extern void            dev_set_allmulti(struct net_device *dev, int inc);
 extern void            netdev_state_change(struct net_device *dev);
+extern void            netdev_features_change(struct net_device *dev);
 /* Load a device via the kmod */
 extern void            dev_load(const char *name);
 extern void            dev_mcast_init(void);
index 9e5750079e09abc0956bc0617e16d282840ea07d..3ebc36afae1a4746be0994d709b0f4e4f6f96ba7 100644 (file)
@@ -75,12 +75,6 @@ enum nf_ip_hook_priorities {
 #define SO_ORIGINAL_DST 80
 
 #ifdef __KERNEL__
-#ifdef CONFIG_NETFILTER_DEBUG
-void nf_debug_ip_local_deliver(struct sk_buff *skb);
-void nf_debug_ip_loopback_xmit(struct sk_buff *newskb);
-void nf_debug_ip_finish_output2(struct sk_buff *skb);
-#endif /*CONFIG_NETFILTER_DEBUG*/
-
 extern int ip_route_me_harder(struct sk_buff **pskb);
 
 /* Call this before modifying an existing IP packet: ensures it is
index d84be02cb4fc09eace23a9576a8c0c72ccd32419..694aec9b478469dafd09d061bd48d4280d0f9f75 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef _IP_CONNTRACK_CORE_H
 #define _IP_CONNTRACK_CORE_H
 #include <linux/netfilter.h>
-#include <linux/netfilter_ipv4/lockhelp.h>
 
 /* This header is used to share core functionality between the
    standalone connection tracking module, and the compatibility layer's use
@@ -47,6 +46,6 @@ static inline int ip_conntrack_confirm(struct sk_buff **pskb)
 
 extern struct list_head *ip_conntrack_hash;
 extern struct list_head ip_conntrack_expect_list;
-DECLARE_RWLOCK_EXTERN(ip_conntrack_lock);
+extern rwlock_t ip_conntrack_lock;
 #endif /* _IP_CONNTRACK_CORE_H */
 
index 2b72b86176f0dbf62b455a2689abb5d0d011677a..e201ec6e990550004d03cb60c10ad07b96892882 100644 (file)
@@ -50,10 +50,9 @@ struct ip_nat_multi_range_compat
 
 #ifdef __KERNEL__
 #include <linux/list.h>
-#include <linux/netfilter_ipv4/lockhelp.h>
 
 /* Protects NAT hash tables, and NAT-private part of conntracks. */
-DECLARE_RWLOCK_EXTERN(ip_nat_lock);
+extern rwlock_t ip_nat_lock;
 
 /* The structure embedded in the conntrack structure. */
 struct ip_nat_info
index f2ae7c5e57bb72bccfc46d3202e53b99a55aff19..360429f4873755e758018a6915a591aaa6338e84 100644 (file)
@@ -2,7 +2,6 @@
 #define _LISTHELP_H
 #include <linux/config.h>
 #include <linux/list.h>
-#include <linux/netfilter_ipv4/lockhelp.h>
 
 /* Header to do more comprehensive job than linux/list.h; assume list
    is first entry in structure. */
diff --git a/include/linux/netfilter_ipv4/lockhelp.h b/include/linux/netfilter_ipv4/lockhelp.h
deleted file mode 100644 (file)
index a328863..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-#ifndef _LOCKHELP_H
-#define _LOCKHELP_H
-#include <linux/config.h>
-
-#include <linux/spinlock.h>
-#include <asm/atomic.h>
-#include <linux/interrupt.h>
-#include <linux/smp.h>
-
-/* Header to do help in lock debugging. */
-
-#ifdef CONFIG_NETFILTER_DEBUG
-struct spinlock_debug
-{
-       spinlock_t l;
-       atomic_t locked_by;
-};
-
-struct rwlock_debug
-{
-       rwlock_t l;
-       long read_locked_map;
-       long write_locked_map;
-};
-
-#define DECLARE_LOCK(l)                                                \
-struct spinlock_debug l = { SPIN_LOCK_UNLOCKED, ATOMIC_INIT(-1) }
-#define DECLARE_LOCK_EXTERN(l)                         \
-extern struct spinlock_debug l
-#define DECLARE_RWLOCK(l)                              \
-struct rwlock_debug l = { RW_LOCK_UNLOCKED, 0, 0 }
-#define DECLARE_RWLOCK_EXTERN(l)               \
-extern struct rwlock_debug l
-
-#define MUST_BE_LOCKED(l)                                              \
-do { if (atomic_read(&(l)->locked_by) != smp_processor_id())           \
-       printk("ASSERT %s:%u %s unlocked\n", __FILE__, __LINE__, #l);   \
-} while(0)
-
-#define MUST_BE_UNLOCKED(l)                                            \
-do { if (atomic_read(&(l)->locked_by) == smp_processor_id())           \
-       printk("ASSERT %s:%u %s locked\n", __FILE__, __LINE__, #l);     \
-} while(0)
-
-/* Write locked OK as well. */
-#define MUST_BE_READ_LOCKED(l)                                             \
-do { if (!((l)->read_locked_map & (1UL << smp_processor_id()))             \
-        && !((l)->write_locked_map & (1UL << smp_processor_id())))         \
-       printk("ASSERT %s:%u %s not readlocked\n", __FILE__, __LINE__, #l); \
-} while(0)
-
-#define MUST_BE_WRITE_LOCKED(l)                                                     \
-do { if (!((l)->write_locked_map & (1UL << smp_processor_id())))            \
-       printk("ASSERT %s:%u %s not writelocked\n", __FILE__, __LINE__, #l); \
-} while(0)
-
-#define MUST_BE_READ_WRITE_UNLOCKED(l)                                   \
-do { if ((l)->read_locked_map & (1UL << smp_processor_id()))             \
-       printk("ASSERT %s:%u %s readlocked\n", __FILE__, __LINE__, #l);   \
- else if ((l)->write_locked_map & (1UL << smp_processor_id()))           \
-        printk("ASSERT %s:%u %s writelocked\n", __FILE__, __LINE__, #l); \
-} while(0)
-
-#define LOCK_BH(lk)                                            \
-do {                                                           \
-       MUST_BE_UNLOCKED(lk);                                   \
-       spin_lock_bh(&(lk)->l);                                 \
-       atomic_set(&(lk)->locked_by, smp_processor_id());       \
-} while(0)
-
-#define UNLOCK_BH(lk)                          \
-do {                                           \
-       MUST_BE_LOCKED(lk);                     \
-       atomic_set(&(lk)->locked_by, -1);       \
-       spin_unlock_bh(&(lk)->l);               \
-} while(0)
-
-#define READ_LOCK(lk)                                          \
-do {                                                           \
-       MUST_BE_READ_WRITE_UNLOCKED(lk);                        \
-       read_lock_bh(&(lk)->l);                                 \
-       set_bit(smp_processor_id(), &(lk)->read_locked_map);    \
-} while(0)
-
-#define WRITE_LOCK(lk)                                                   \
-do {                                                                     \
-       MUST_BE_READ_WRITE_UNLOCKED(lk);                                  \
-       write_lock_bh(&(lk)->l);                                          \
-       set_bit(smp_processor_id(), &(lk)->write_locked_map);             \
-} while(0)
-
-#define READ_UNLOCK(lk)                                                        \
-do {                                                                   \
-       if (!((lk)->read_locked_map & (1UL << smp_processor_id())))     \
-               printk("ASSERT: %s:%u %s not readlocked\n",             \
-                      __FILE__, __LINE__, #lk);                        \
-       clear_bit(smp_processor_id(), &(lk)->read_locked_map);          \
-       read_unlock_bh(&(lk)->l);                                       \
-} while(0)
-
-#define WRITE_UNLOCK(lk)                                       \
-do {                                                           \
-       MUST_BE_WRITE_LOCKED(lk);                               \
-       clear_bit(smp_processor_id(), &(lk)->write_locked_map); \
-       write_unlock_bh(&(lk)->l);                              \
-} while(0)
-
-#else
-#define DECLARE_LOCK(l) spinlock_t l = SPIN_LOCK_UNLOCKED
-#define DECLARE_LOCK_EXTERN(l) extern spinlock_t l
-#define DECLARE_RWLOCK(l) rwlock_t l = RW_LOCK_UNLOCKED
-#define DECLARE_RWLOCK_EXTERN(l) extern rwlock_t l
-
-#define MUST_BE_LOCKED(l)
-#define MUST_BE_UNLOCKED(l)
-#define MUST_BE_READ_LOCKED(l)
-#define MUST_BE_WRITE_LOCKED(l)
-#define MUST_BE_READ_WRITE_UNLOCKED(l)
-
-#define LOCK_BH(l) spin_lock_bh(l)
-#define UNLOCK_BH(l) spin_unlock_bh(l)
-
-#define READ_LOCK(l) read_lock_bh(l)
-#define WRITE_LOCK(l) write_lock_bh(l)
-#define READ_UNLOCK(l) read_unlock_bh(l)
-#define WRITE_UNLOCK(l) write_unlock_bh(l)
-#endif /*CONFIG_NETFILTER_DEBUG*/
-
-#endif /* _LOCKHELP_H */
index b2738ac8bc999f30c0840f318c5da73d95214fed..3029cad63a013b5301c9f026b9771e156f229816 100644 (file)
@@ -14,6 +14,7 @@
 #define NETLINK_SELINUX                7       /* SELinux event notifications */
 #define NETLINK_ARPD           8
 #define NETLINK_AUDIT          9       /* auditing */
+#define NETLINK_FIB_LOOKUP     10      
 #define NETLINK_ROUTE6         11      /* af_inet6 route comm channel */
 #define NETLINK_IP6_FW         13
 #define NETLINK_DNRTMSG                14      /* DECnet routing messages */
@@ -146,7 +147,7 @@ struct netlink_callback
        int             (*dump)(struct sk_buff * skb, struct netlink_callback *cb);
        int             (*done)(struct netlink_callback *cb);
        int             family;
-       long            args[4];
+       long            args[5];
 };
 
 struct netlink_notify
@@ -156,7 +157,7 @@ struct netlink_notify
 };
 
 static __inline__ struct nlmsghdr *
-__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len)
+__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)
 {
        struct nlmsghdr *nlh;
        int size = NLMSG_LENGTH(len);
@@ -164,15 +165,31 @@ __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len)
        nlh = (struct nlmsghdr*)skb_put(skb, NLMSG_ALIGN(size));
        nlh->nlmsg_type = type;
        nlh->nlmsg_len = size;
-       nlh->nlmsg_flags = 0;
+       nlh->nlmsg_flags = flags;
        nlh->nlmsg_pid = pid;
        nlh->nlmsg_seq = seq;
        return nlh;
 }
 
+#define NLMSG_NEW(skb, pid, seq, type, len, flags) \
+({     if (skb_tailroom(skb) < (int)NLMSG_SPACE(len)) \
+               goto nlmsg_failure; \
+       __nlmsg_put(skb, pid, seq, type, len, flags); })
+
 #define NLMSG_PUT(skb, pid, seq, type, len) \
-({ if (skb_tailroom(skb) < (int)NLMSG_SPACE(len)) goto nlmsg_failure; \
-   __nlmsg_put(skb, pid, seq, type, len); })
+       NLMSG_NEW(skb, pid, seq, type, len, 0)
+
+#define NLMSG_NEW_ANSWER(skb, cb, type, len, flags) \
+       NLMSG_NEW(skb, NETLINK_CB((cb)->skb).pid, \
+                 (cb)->nlh->nlmsg_seq, type, len, flags)
+
+#define NLMSG_END(skb, nlh) \
+({     (nlh)->nlmsg_len = (skb)->tail - (unsigned char *) (nlh); \
+       (skb)->len; })
+
+#define NLMSG_CANCEL(skb, nlh) \
+({     skb_trim(skb, (unsigned char *) (nlh) - (skb)->data); \
+       -1; })
 
 extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
                              struct nlmsghdr *nlh,
index 6e0a697e594eadad3f4e5fe3eb656c22df3e921d..254dc3de650b81e5cce4821f8101dad72005f996 100644 (file)
@@ -27,6 +27,7 @@ struct node {
 };
 
 extern int register_node(struct node *, int, struct node *);
+extern void unregister_node(struct node *node);
 
 #define to_node(sys_device) container_of(sys_device, struct node, sysdev)
 
index 9303a003e9ab85147dcafc82c6d74fc27d468bf5..5937dd6053c398d594889a02c4894924f577ba16 100644 (file)
@@ -56,6 +56,7 @@ extern int notifier_call_chain(struct notifier_block **n, unsigned long val, voi
 #define NETDEV_CHANGEADDR      0x0008
 #define NETDEV_GOING_DOWN      0x0009
 #define NETDEV_CHANGENAME      0x000A
+#define NETDEV_FEAT_CHANGE     0x000B
 
 #define SYS_DOWN       0x0001  /* Notify of system down */
 #define SYS_RESTART    SYS_DOWN
index 39ab8c6b5652edefe8a85559692dac1395c7b8fe..f5a6695d4d21335dddf2aa0da868c31fad454270 100644 (file)
 #define PG_active               6
 #define PG_slab                         7      /* slab debug (Suparna wants this) */
 
-#define PG_highmem              8
-#define PG_checked              9      /* kill me in 2.5.<early>. */
-#define PG_arch_1              10
-#define PG_reserved            11
-
-#define PG_private             12      /* Has something at ->private */
-#define PG_writeback           13      /* Page is under writeback */
-#define PG_nosave              14      /* Used for system suspend/resume */
-#define PG_compound            15      /* Part of a compound page */
-
-#define PG_swapcache           16      /* Swap page: swp_entry_t in private */
-#define PG_mappedtodisk                17      /* Has blocks allocated on-disk */
-#define PG_reclaim             18      /* To be reclaimed asap */
-#define PG_nosave_free         19      /* Free, should not be written */
-#define PG_uncached            20      /* Page has been mapped as uncached */
+#define PG_checked              8      /* kill me in 2.5.<early>. */
+#define PG_arch_1               9
+#define PG_reserved            10
+#define PG_private             11      /* Has something at ->private */
+
+#define PG_writeback           12      /* Page is under writeback */
+#define PG_nosave              13      /* Used for system suspend/resume */
+#define PG_compound            14      /* Part of a compound page */
+#define PG_swapcache           15      /* Swap page: swp_entry_t in private */
+
+#define PG_mappedtodisk                16      /* Has blocks allocated on-disk */
+#define PG_reclaim             17      /* To be reclaimed asap */
+#define PG_nosave_free         18      /* Free, should not be written */
+#define PG_uncached            19      /* Page has been mapped as uncached */
 
 /*
  * Global page accounting.  One instance per CPU.  Only unsigned longs are
@@ -136,8 +135,8 @@ struct page_state {
 
 extern void get_page_state(struct page_state *ret);
 extern void get_full_page_state(struct page_state *ret);
-extern unsigned long __read_page_state(unsigned offset);
-extern void __mod_page_state(unsigned offset, unsigned long delta);
+extern unsigned long __read_page_state(unsigned long offset);
+extern void __mod_page_state(unsigned long offset, unsigned long delta);
 
 #define read_page_state(member) \
        __read_page_state(offsetof(struct page_state, member))
@@ -215,7 +214,7 @@ extern void __mod_page_state(unsigned offset, unsigned long delta);
 #define TestSetPageSlab(page)  test_and_set_bit(PG_slab, &(page)->flags)
 
 #ifdef CONFIG_HIGHMEM
-#define PageHighMem(page)      test_bit(PG_highmem, &(page)->flags)
+#define PageHighMem(page)      is_highmem(page_zone(page))
 #else
 #define PageHighMem(page)      0 /* needed to optimize away at compile time */
 #endif
index 0422031161baa8531f8d189f50fa0e52491bd955..d9a25647a29523b789ebd6346e62f1f7981cb232 100644 (file)
@@ -52,12 +52,12 @@ void release_pages(struct page **pages, int nr, int cold);
 
 static inline struct page *page_cache_alloc(struct address_space *x)
 {
-       return alloc_pages(mapping_gfp_mask(x), 0);
+       return alloc_pages(mapping_gfp_mask(x)|__GFP_NORECLAIM, 0);
 }
 
 static inline struct page *page_cache_alloc_cold(struct address_space *x)
 {
-       return alloc_pages(mapping_gfp_mask(x)|__GFP_COLD, 0);
+       return alloc_pages(mapping_gfp_mask(x)|__GFP_COLD|__GFP_NORECLAIM, 0);
 }
 
 typedef int filler_t(void *, struct page *);
index ae27792b5aa46da3be95877e66296a5f0bc32761..63e89e47b8e98b118bd7f8f088ea2f54c2ec37a9 100644 (file)
 #define PCI_DEVICE_ID_CT_65550         0x00e0
 #define PCI_DEVICE_ID_CT_65554         0x00e4
 #define PCI_DEVICE_ID_CT_65555         0x00e5
+#define PCI_DEVICE_ID_CT_69000         0x00c0
 
 #define PCI_VENDOR_ID_MIRO             0x1031
 #define PCI_DEVICE_ID_MIRO_36050       0x5601
 #define PCI_DEVICE_ID_APPLE_KL_USB_P   0x0026
 #define PCI_DEVICE_ID_APPLE_UNI_N_AGP_P        0x0027
 #define PCI_DEVICE_ID_APPLE_UNI_N_AGP15        0x002d
+#define PCI_DEVICE_ID_APPLE_UNI_N_PCI15        0x002e
 #define PCI_DEVICE_ID_APPLE_UNI_N_FW2  0x0030
 #define PCI_DEVICE_ID_APPLE_UNI_N_GMAC2        0x0032
 #define PCI_DEVIEC_ID_APPLE_UNI_N_ATA  0x0033
 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL    0x0258
 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL    0x0259
 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL    0x025B
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE  0x0265
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA 0x0266
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2        0x0267
+#define PCI_DEVICE_ID_NVIDIA_NVENET_12         0x0268
+#define PCI_DEVICE_ID_NVIDIA_NVENET_13         0x0269
+#define PCI_DEVICE_ID_NVIDIA_MCP51_AUDIO       0x026B
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800  0x0280
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800_8X    0x0281
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800SE     0x0282
 
 #define PCI_VENDOR_ID_BROADCOM         0x14e4
 #define PCI_DEVICE_ID_TIGON3_5752      0x1600
+#define PCI_DEVICE_ID_TIGON3_5752M     0x1601
 #define PCI_DEVICE_ID_TIGON3_5700      0x1644
 #define PCI_DEVICE_ID_TIGON3_5701      0x1645
 #define PCI_DEVICE_ID_TIGON3_5702      0x1646
 #define PCI_DEVICE_ID_TIGON3_5703      0x1647
 #define PCI_DEVICE_ID_TIGON3_5704      0x1648
 #define PCI_DEVICE_ID_TIGON3_5704S_2   0x1649
+#define PCI_DEVICE_ID_NX2_5706         0x164a
 #define PCI_DEVICE_ID_TIGON3_5702FE    0x164d
 #define PCI_DEVICE_ID_TIGON3_5705      0x1653
 #define PCI_DEVICE_ID_TIGON3_5705_2    0x1654
 #define PCI_DEVICE_ID_TIGON3_5702X     0x16a6
 #define PCI_DEVICE_ID_TIGON3_5703X     0x16a7
 #define PCI_DEVICE_ID_TIGON3_5704S     0x16a8
+#define PCI_DEVICE_ID_NX2_5706S                0x16aa
 #define PCI_DEVICE_ID_TIGON3_5702A3    0x16c6
 #define PCI_DEVICE_ID_TIGON3_5703A3    0x16c7
 #define PCI_DEVICE_ID_TIGON3_5781      0x16dd
 #define PCI_DEVICE_ID_INTEL_82915G_IG  0x2582
 #define PCI_DEVICE_ID_INTEL_82915GM_HB 0x2590
 #define PCI_DEVICE_ID_INTEL_82915GM_IG 0x2592
+#define PCI_DEVICE_ID_INTEL_82945G_HB  0x2770
+#define PCI_DEVICE_ID_INTEL_82945G_IG  0x2772
 #define PCI_DEVICE_ID_INTEL_ICH6_0     0x2640
 #define PCI_DEVICE_ID_INTEL_ICH6_1     0x2641
 #define PCI_DEVICE_ID_INTEL_ICH6_2     0x2642
index e6b5192202453edfc6fd7d1fac27d2d2fb5c2ef2..724066778affe84f50bbdf8d6a08a245e26132f4 100644 (file)
@@ -245,6 +245,7 @@ struct sadb_x_nat_t_port {
 
 /* Security Association flags */
 #define SADB_SAFLAGS_PFS       1
+#define SADB_SAFLAGS_NOPMTUDISC        0x20000000
 #define SADB_SAFLAGS_DECAP_DSCP        0x40000000
 #define SADB_SAFLAGS_NOECN     0x80000000
 
index 73d84c071cb1d17018a0b490e003f48d3b7e3d8a..1d9da36eb9db2f76488f1cdb86acf320809172f1 100644 (file)
@@ -427,6 +427,7 @@ enum
        TCA_NETEM_UNSPEC,
        TCA_NETEM_CORR,
        TCA_NETEM_DELAY_DIST,
+       TCA_NETEM_REORDER,
        __TCA_NETEM_MAX,
 };
 
@@ -437,7 +438,7 @@ struct tc_netem_qopt
        __u32   latency;        /* added delay (us) */
        __u32   limit;          /* fifo limit (packets) */
        __u32   loss;           /* random packet loss (0=none ~0=100%) */
-       __u32   gap;            /* re-ordering gap (0 for delay all) */
+       __u32   gap;            /* re-ordering gap (0 for none) */
        __u32   duplicate;      /* random packet dup  (0=none ~0=100%) */
        __u32   jitter;         /* random jitter in latency (us) */
 };
@@ -449,6 +450,12 @@ struct tc_netem_corr
        __u32   dup_corr;       /* duplicate correlation  */
 };
 
+struct tc_netem_reorder
+{
+       __u32   probability;
+       __u32   correlation;
+};
+
 #define NETEM_DIST_SCALE       8192
 
 #endif
diff --git a/include/linux/raid/bitmap.h b/include/linux/raid/bitmap.h
new file mode 100644 (file)
index 0000000..e24b74b
--- /dev/null
@@ -0,0 +1,273 @@
+/*
+ * bitmap.h: Copyright (C) Peter T. Breuer (ptb@ot.uc3m.es) 2003
+ *
+ * additions: Copyright (C) 2003-2004, Paul Clements, SteelEye Technology, Inc.
+ */
+#ifndef BITMAP_H
+#define BITMAP_H 1
+
+#define BITMAP_MAJOR 3
+#define BITMAP_MINOR 38
+
+/*
+ * in-memory bitmap:
+ *
+ * Use 16 bit block counters to track pending writes to each "chunk".
+ * The 2 high order bits are special-purpose, the first is a flag indicating
+ * whether a resync is needed.  The second is a flag indicating whether a
+ * resync is active.
+ * This means that the counter is actually 14 bits:
+ *
+ * +--------+--------+------------------------------------------------+
+ * | resync | resync |               counter                          |
+ * | needed | active |                                                |
+ * |  (0-1) |  (0-1) |              (0-16383)                         |
+ * +--------+--------+------------------------------------------------+
+ *
+ * The "resync needed" bit is set when:
+ *    a '1' bit is read from storage at startup.
+ *    a write request fails on some drives
+ *    a resync is aborted on a chunk with 'resync active' set
+ * It is cleared (and resync-active set) when a resync starts across all drives
+ * of the chunk.
+ *
+ *
+ * The "resync active" bit is set when:
+ *    a resync is started on all drives, and resync_needed is set.
+ *       resync_needed will be cleared (as long as resync_active wasn't already set).
+ * It is cleared when a resync completes.
+ *
+ * The counter counts pending write requests, plus the on-disk bit.
+ * When the counter is '1' and the resync bits are clear, the on-disk
+ * bit can be cleared aswell, thus setting the counter to 0.
+ * When we set a bit, or in the counter (to start a write), if the fields is
+ * 0, we first set the disk bit and set the counter to 1.
+ *
+ * If the counter is 0, the on-disk bit is clear and the stipe is clean
+ * Anything that dirties the stipe pushes the counter to 2 (at least)
+ * and sets the on-disk bit (lazily).
+ * If a periodic sweep find the counter at 2, it is decremented to 1.
+ * If the sweep find the counter at 1, the on-disk bit is cleared and the
+ * counter goes to zero.
+ *
+ * Also, we'll hijack the "map" pointer itself and use it as two 16 bit block
+ * counters as a fallback when "page" memory cannot be allocated:
+ *
+ * Normal case (page memory allocated):
+ *
+ *     page pointer (32-bit)
+ *
+ *     [ ] ------+
+ *               |
+ *               +-------> [   ][   ]..[   ] (4096 byte page == 2048 counters)
+ *                          c1   c2    c2048
+ *
+ * Hijacked case (page memory allocation failed):
+ *
+ *     hijacked page pointer (32-bit)
+ *
+ *     [                 ][              ] (no page memory allocated)
+ *      counter #1 (16-bit) counter #2 (16-bit)
+ *
+ */
+
+#ifdef __KERNEL__
+
+#define PAGE_BITS (PAGE_SIZE << 3)
+#define PAGE_BIT_SHIFT (PAGE_SHIFT + 3)
+
+typedef __u16 bitmap_counter_t;
+#define COUNTER_BITS 16
+#define COUNTER_BIT_SHIFT 4
+#define COUNTER_BYTE_RATIO (COUNTER_BITS / 8)
+#define COUNTER_BYTE_SHIFT (COUNTER_BIT_SHIFT - 3)
+
+#define NEEDED_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 1)))
+#define RESYNC_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 2)))
+#define COUNTER_MAX ((bitmap_counter_t) RESYNC_MASK - 1)
+#define NEEDED(x) (((bitmap_counter_t) x) & NEEDED_MASK)
+#define RESYNC(x) (((bitmap_counter_t) x) & RESYNC_MASK)
+#define COUNTER(x) (((bitmap_counter_t) x) & COUNTER_MAX)
+
+/* how many counters per page? */
+#define PAGE_COUNTER_RATIO (PAGE_BITS / COUNTER_BITS)
+/* same, except a shift value for more efficient bitops */
+#define PAGE_COUNTER_SHIFT (PAGE_BIT_SHIFT - COUNTER_BIT_SHIFT)
+/* same, except a mask value for more efficient bitops */
+#define PAGE_COUNTER_MASK  (PAGE_COUNTER_RATIO - 1)
+
+#define BITMAP_BLOCK_SIZE 512
+#define BITMAP_BLOCK_SHIFT 9
+
+/* how many blocks per chunk? (this is variable) */
+#define CHUNK_BLOCK_RATIO(bitmap) ((bitmap)->chunksize >> BITMAP_BLOCK_SHIFT)
+#define CHUNK_BLOCK_SHIFT(bitmap) ((bitmap)->chunkshift - BITMAP_BLOCK_SHIFT)
+#define CHUNK_BLOCK_MASK(bitmap) (CHUNK_BLOCK_RATIO(bitmap) - 1)
+
+/* when hijacked, the counters and bits represent even larger "chunks" */
+/* there will be 1024 chunks represented by each counter in the page pointers */
+#define PAGEPTR_BLOCK_RATIO(bitmap) \
+                       (CHUNK_BLOCK_RATIO(bitmap) << PAGE_COUNTER_SHIFT >> 1)
+#define PAGEPTR_BLOCK_SHIFT(bitmap) \
+                       (CHUNK_BLOCK_SHIFT(bitmap) + PAGE_COUNTER_SHIFT - 1)
+#define PAGEPTR_BLOCK_MASK(bitmap) (PAGEPTR_BLOCK_RATIO(bitmap) - 1)
+
+/*
+ * on-disk bitmap:
+ *
+ * Use one bit per "chunk" (block set). We do the disk I/O on the bitmap
+ * file a page at a time. There's a superblock at the start of the file.
+ */
+
+/* map chunks (bits) to file pages - offset by the size of the superblock */
+#define CHUNK_BIT_OFFSET(chunk) ((chunk) + (sizeof(bitmap_super_t) << 3))
+
+#endif
+
+/*
+ * bitmap structures:
+ */
+
+#define BITMAP_MAGIC 0x6d746962
+
+/* use these for bitmap->flags and bitmap->sb->state bit-fields */
+enum bitmap_state {
+       BITMAP_ACTIVE = 0x001, /* the bitmap is in use */
+       BITMAP_STALE  = 0x002  /* the bitmap file is out of date or had -EIO */
+};
+
+/* the superblock at the front of the bitmap file -- little endian */
+typedef struct bitmap_super_s {
+       __u32 magic;        /*  0  BITMAP_MAGIC */
+       __u32 version;      /*  4  the bitmap major for now, could change... */
+       __u8  uuid[16];     /*  8  128 bit uuid - must match md device uuid */
+       __u64 events;       /* 24  event counter for the bitmap (1)*/
+       __u64 events_cleared;/*32  event counter when last bit cleared (2) */
+       __u64 sync_size;    /* 40  the size of the md device's sync range(3) */
+       __u32 state;        /* 48  bitmap state information */
+       __u32 chunksize;    /* 52  the bitmap chunk size in bytes */
+       __u32 daemon_sleep; /* 56  seconds between disk flushes */
+
+       __u8  pad[256 - 60]; /* set to zero */
+} bitmap_super_t;
+
+/* notes:
+ * (1) This event counter is updated before the eventcounter in the md superblock
+ *    When a bitmap is loaded, it is only accepted if this event counter is equal
+ *    to, or one greater than, the event counter in the superblock.
+ * (2) This event counter is updated when the other one is *if*and*only*if* the
+ *    array is not degraded.  As bits are not cleared when the array is degraded,
+ *    this represents the last time that any bits were cleared.
+ *    If a device is being added that has an event count with this value or
+ *    higher, it is accepted as conforming to the bitmap.
+ * (3)This is the number of sectors represented by the bitmap, and is the range that
+ *    resync happens across.  For raid1 and raid5/6 it is the size of individual
+ *    devices.  For raid10 it is the size of the array.
+ */
+
+#ifdef __KERNEL__
+
+/* the in-memory bitmap is represented by bitmap_pages */
+struct bitmap_page {
+       /*
+        * map points to the actual memory page
+        */
+       char *map;
+       /*
+        * in emergencies (when map cannot be alloced), hijack the map
+        * pointer and use it as two counters itself
+        */
+       unsigned int hijacked:1;
+       /*
+        * count of dirty bits on the page
+        */
+       unsigned int  count:31;
+};
+
+/* keep track of bitmap file pages that have pending writes on them */
+struct page_list {
+       struct list_head list;
+       struct page *page;
+};
+
+/* the main bitmap structure - one per mddev */
+struct bitmap {
+       struct bitmap_page *bp;
+       unsigned long pages; /* total number of pages in the bitmap */
+       unsigned long missing_pages; /* number of pages not yet allocated */
+
+       mddev_t *mddev; /* the md device that the bitmap is for */
+
+       int counter_bits; /* how many bits per block counter */
+
+       /* bitmap chunksize -- how much data does each bit represent? */
+       unsigned long chunksize;
+       unsigned long chunkshift; /* chunksize = 2^chunkshift (for bitops) */
+       unsigned long chunks; /* total number of data chunks for the array */
+
+       /* We hold a count on the chunk currently being synced, and drop
+        * it when the last block is started.  If the resync is aborted
+        * midway, we need to be able to drop that count, so we remember
+        * the counted chunk..
+        */
+       unsigned long syncchunk;
+
+       __u64   events_cleared;
+
+       /* bitmap spinlock */
+       spinlock_t lock;
+
+       long offset; /* offset from superblock if file is NULL */
+       struct file *file; /* backing disk file */
+       struct page *sb_page; /* cached copy of the bitmap file superblock */
+       struct page **filemap; /* list of cache pages for the file */
+       unsigned long *filemap_attr; /* attributes associated w/ filemap pages */
+       unsigned long file_pages; /* number of pages in the file */
+
+       unsigned long flags;
+
+       /*
+        * the bitmap daemon - periodically wakes up and sweeps the bitmap
+        * file, cleaning up bits and flushing out pages to disk as necessary
+        */
+       unsigned long daemon_lastrun; /* jiffies of last run */
+       unsigned long daemon_sleep; /* how many seconds between updates? */
+
+       /*
+        * bitmap_writeback_daemon waits for file-pages that have been written,
+        * as there is no way to get a call-back when a page write completes.
+        */
+       mdk_thread_t *writeback_daemon;
+       spinlock_t write_lock;
+       wait_queue_head_t write_wait;
+       struct list_head complete_pages;
+       mempool_t *write_pool;
+};
+
+/* the bitmap API */
+
+/* these are used only by md/bitmap */
+int  bitmap_create(mddev_t *mddev);
+void bitmap_destroy(mddev_t *mddev);
+int  bitmap_active(struct bitmap *bitmap);
+
+char *file_path(struct file *file, char *buf, int count);
+void bitmap_print_sb(struct bitmap *bitmap);
+int bitmap_update_sb(struct bitmap *bitmap);
+
+int  bitmap_setallbits(struct bitmap *bitmap);
+void bitmap_write_all(struct bitmap *bitmap);
+
+/* these are exported */
+int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sectors);
+void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long sectors,
+                    int success);
+int bitmap_start_sync(struct bitmap *bitmap, sector_t offset, int *blocks);
+void bitmap_end_sync(struct bitmap *bitmap, sector_t offset, int *blocks, int aborted);
+void bitmap_close_sync(struct bitmap *bitmap);
+
+int bitmap_unplug(struct bitmap *bitmap);
+int bitmap_daemon_work(struct bitmap *bitmap);
+#endif
+
+#endif
index a6a67d102bfa67e1a49c4d875889f40bf2a167bf..ffa316ce4dc834aa3ab4a4e8967e95a47c0b5c49 100644 (file)
  */
 #define MD_MAJOR_VERSION                0
 #define MD_MINOR_VERSION                90
-#define MD_PATCHLEVEL_VERSION           1
+/*
+ * MD_PATCHLEVEL_VERSION indicates kernel functionality.
+ * >=1 means different superblock formats are selectable using SET_ARRAY_INFO
+ *     and major_version/minor_version accordingly
+ * >=2 means that Internal bitmaps are supported by setting MD_SB_BITMAP_PRESENT
+ *     in the super status byte
+ */
+#define MD_PATCHLEVEL_VERSION           2
 
 extern int register_md_personality (int p_num, mdk_personality_t *p);
 extern int unregister_md_personality (int p_num);
@@ -69,7 +76,7 @@ extern mdk_thread_t * md_register_thread (void (*run) (mddev_t *mddev),
 extern void md_unregister_thread (mdk_thread_t *thread);
 extern void md_wakeup_thread(mdk_thread_t *thread);
 extern void md_check_recovery(mddev_t *mddev);
-extern void md_write_start(mddev_t *mddev);
+extern void md_write_start(mddev_t *mddev, struct bio *bi);
 extern void md_write_end(mddev_t *mddev);
 extern void md_handle_safemode(mddev_t *mddev);
 extern void md_done_sync(mddev_t *mddev, int blocks, int ok);
@@ -78,6 +85,12 @@ extern void md_unplug_mddev(mddev_t *mddev);
 
 extern void md_print_devices (void);
 
+extern void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev,
+                          sector_t sector, int size, struct page *page);
+extern int sync_page_io(struct block_device *bdev, sector_t sector, int size,
+                       struct page *page, int rw);
+
+
 #define MD_BUG(x...) { printk("md: bug in file %s, line %d\n", __FILE__, __LINE__); md_print_devices(); }
 
 #endif 
index c9a0d4013be7c0273a17424b0820cdd16e945fc8..8c14ba565a45b95093b0a65e113bda2898f1d358 100644 (file)
@@ -15,6 +15,9 @@
 #ifndef _MD_K_H
 #define _MD_K_H
 
+/* and dm-bio-list.h is not under include/linux because.... ??? */
+#include "../../../drivers/md/dm-bio-list.h"
+
 #define MD_RESERVED       0UL
 #define LINEAR            1UL
 #define RAID0             2UL
@@ -180,6 +183,10 @@ struct mdk_rdev_s
 
        int desc_nr;                    /* descriptor index in the superblock */
        int raid_disk;                  /* role of device in array */
+       int saved_raid_disk;            /* role that device used to have in the
+                                        * array and could again if we did a partial
+                                        * resync from the bitmap
+                                        */
 
        atomic_t        nr_pending;     /* number of pending requests.
                                         * only maintained for arrays that
@@ -252,6 +259,11 @@ struct mddev_s
        atomic_t                        recovery_active; /* blocks scheduled, but not written */
        wait_queue_head_t               recovery_wait;
        sector_t                        recovery_cp;
+
+       spinlock_t                      write_lock;
+       wait_queue_head_t               sb_wait;        /* for waiting on superblock updates */
+       atomic_t                        pending_writes; /* number of active superblock writes */
+
        unsigned int                    safemode;       /* if set, update "clean" superblock
                                                         * when no writes pending.
                                                         */ 
@@ -260,6 +272,13 @@ struct mddev_s
        atomic_t                        writes_pending; 
        request_queue_t                 *queue; /* for plugging ... */
 
+       struct bitmap                   *bitmap; /* the bitmap for the device */
+       struct file                     *bitmap_file; /* the bitmap file */
+       long                            bitmap_offset; /* offset from superblock of
+                                                       * start of bitmap. May be
+                                                       * negative, but not '0'
+                                                       */
+
        struct list_head                all_mddevs;
 };
 
@@ -291,7 +310,7 @@ struct mdk_personality_s
        int (*hot_add_disk) (mddev_t *mddev, mdk_rdev_t *rdev);
        int (*hot_remove_disk) (mddev_t *mddev, int number);
        int (*spare_active) (mddev_t *mddev);
-       int (*sync_request)(mddev_t *mddev, sector_t sector_nr, int go_faster);
+       sector_t (*sync_request)(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster);
        int (*resize) (mddev_t *mddev, sector_t sectors);
        int (*reshape) (mddev_t *mddev, int raid_disks);
        int (*reconfig) (mddev_t *mddev, int layout, int chunk_size);
@@ -334,6 +353,7 @@ typedef struct mdk_thread_s {
        unsigned long           flags;
        struct completion       *event;
        struct task_struct      *tsk;
+       unsigned long           timeout;
        const char              *name;
 } mdk_thread_t;
 
index 8ba95d67329f0b6189d80795ee807f62e8ae17b7..dc65cd4354942d4efd7b31bd9eba4bba7c8bf405 100644 (file)
@@ -96,6 +96,7 @@ typedef struct mdp_device_descriptor_s {
 #define MD_SB_CLEAN            0
 #define MD_SB_ERRORS           1
 
+#define        MD_SB_BITMAP_PRESENT    8 /* bitmap may be present nearby */
 typedef struct mdp_superblock_s {
        /*
         * Constant generic information
@@ -184,7 +185,7 @@ struct mdp_superblock_1 {
        /* constant array information - 128 bytes */
        __u32   magic;          /* MD_SB_MAGIC: 0xa92b4efc - little endian */
        __u32   major_version;  /* 1 */
-       __u32   feature_map;    /* 0 for now */
+       __u32   feature_map;    /* bit 0 set if 'bitmap_offset' is meaningful */
        __u32   pad0;           /* always set to 0 when writing */
 
        __u8    set_uuid[16];   /* user-space generated. */
@@ -197,7 +198,11 @@ struct mdp_superblock_1 {
 
        __u32   chunksize;      /* in 512byte sectors */
        __u32   raid_disks;
-       __u8    pad1[128-96];   /* set to 0 when written */
+       __u32   bitmap_offset;  /* sectors after start of superblock that bitmap starts
+                                * NOTE: signed, so bitmap can be before superblock
+                                * only meaningful of feature_map[0] is set.
+                                */
+       __u8    pad1[128-100];  /* set to 0 when written */
 
        /* constant this-device information - 64 bytes */
        __u64   data_offset;    /* sector start of data, often 0 */
index a2df5c2a42af93e373e3238d97aed33c0319c724..81da20ccec4dadeab0dd13da2ac94b7e7f48243e 100644 (file)
@@ -23,6 +23,7 @@
 #define GET_DISK_INFO          _IOR (MD_MAJOR, 0x12, mdu_disk_info_t)
 #define PRINT_RAID_DEBUG       _IO (MD_MAJOR, 0x13)
 #define RAID_AUTORUN           _IO (MD_MAJOR, 0x14)
+#define GET_BITMAP_FILE                _IOR (MD_MAJOR, 0x15, mdu_bitmap_file_t)
 
 /* configuration */
 #define CLEAR_ARRAY            _IO (MD_MAJOR, 0x20)
@@ -36,6 +37,7 @@
 #define HOT_ADD_DISK           _IO (MD_MAJOR, 0x28)
 #define SET_DISK_FAULTY                _IO (MD_MAJOR, 0x29)
 #define HOT_GENERATE_ERROR     _IO (MD_MAJOR, 0x2a)
+#define SET_BITMAP_FILE                _IOW (MD_MAJOR, 0x2b, int)
 
 /* usage */
 #define RUN_ARRAY              _IOW (MD_MAJOR, 0x30, mdu_param_t)
@@ -106,6 +108,11 @@ typedef struct mdu_start_info_s {
 
 } mdu_start_info_t;
 
+typedef struct mdu_bitmap_file_s
+{
+       char pathname[4096];
+} mdu_bitmap_file_t;
+
 typedef struct mdu_param_s
 {
        int                     personality;    /* 1,2,3,4 */
index abbfdd9afe1ec615e288fccced1f5a41b0dafbed..9d93cf12e8901d7cb34f8013d290eb4e8e4d1f1f 100644 (file)
@@ -36,12 +36,21 @@ struct r1_private_data_s {
        spinlock_t              device_lock;
 
        struct list_head        retry_list;
+       /* queue pending writes and submit them on unplug */
+       struct bio_list         pending_bio_list;
+       /* queue of writes that have been unplugged */
+       struct bio_list         flushing_bio_list;
+
        /* for use when syncing mirrors: */
 
        spinlock_t              resync_lock;
-       int nr_pending;
-       int barrier;
+       int                     nr_pending;
+       int                     barrier;
        sector_t                next_resync;
+       int                     fullsync;  /* set to 1 if a full sync is needed,
+                                           * (fresh device added).
+                                           * Cleared when a sync completes.
+                                           */
 
        wait_queue_head_t       wait_idle;
        wait_queue_head_t       wait_resume;
@@ -85,14 +94,17 @@ struct r1bio_s {
        int                     read_disk;
 
        struct list_head        retry_list;
+       struct bitmap_update    *bitmap_update;
        /*
         * if the IO is in WRITE direction, then multiple bios are used.
         * We choose the number when they are allocated.
         */
        struct bio              *bios[0];
+       /* DO NOT PUT ANY NEW FIELDS HERE - bios array is contiguously alloced*/
 };
 
 /* bits for r1bio.state */
 #define        R1BIO_Uptodate  0
 #define        R1BIO_IsSync    1
+#define        R1BIO_Degraded  2
 #endif
index 91ac97c207771c49530d579f16ca7abb3028914f..e68dbf0bf5791f1e0a4e08098fdbf2e9995195e1 100644 (file)
@@ -89,6 +89,13 @@ enum {
        RTM_GETANYCAST  = 62,
 #define RTM_GETANYCAST RTM_GETANYCAST
 
+       RTM_NEWNEIGHTBL = 64,
+#define RTM_NEWNEIGHTBL        RTM_NEWNEIGHTBL
+       RTM_GETNEIGHTBL = 66,
+#define RTM_GETNEIGHTBL        RTM_GETNEIGHTBL
+       RTM_SETNEIGHTBL,
+#define RTM_SETNEIGHTBL        RTM_SETNEIGHTBL
+
        __RTM_MAX,
 #define RTM_MAX                (((__RTM_MAX + 3) & ~3) - 1)
 };
@@ -493,6 +500,106 @@ struct nda_cacheinfo
        __u32           ndm_refcnt;
 };
 
+
+/*****************************************************************
+ *             Neighbour tables specific messages.
+ *
+ * To retrieve the neighbour tables send RTM_GETNEIGHTBL with the
+ * NLM_F_DUMP flag set. Every neighbour table configuration is
+ * spread over multiple messages to avoid running into message
+ * size limits on systems with many interfaces. The first message
+ * in the sequence transports all not device specific data such as
+ * statistics, configuration, and the default parameter set.
+ * This message is followed by 0..n messages carrying device
+ * specific parameter sets.
+ * Although the ordering should be sufficient, NDTA_NAME can be
+ * used to identify sequences. The initial message can be identified
+ * by checking for NDTA_CONFIG. The device specific messages do
+ * not contain this TLV but have NDTPA_IFINDEX set to the
+ * corresponding interface index.
+ *
+ * To change neighbour table attributes, send RTM_SETNEIGHTBL
+ * with NDTA_NAME set. Changeable attribute include NDTA_THRESH[1-3],
+ * NDTA_GC_INTERVAL, and all TLVs in NDTA_PARMS unless marked
+ * otherwise. Device specific parameter sets can be changed by
+ * setting NDTPA_IFINDEX to the interface index of the corresponding
+ * device.
+ ****/
+
+struct ndt_stats
+{
+       __u64           ndts_allocs;
+       __u64           ndts_destroys;
+       __u64           ndts_hash_grows;
+       __u64           ndts_res_failed;
+       __u64           ndts_lookups;
+       __u64           ndts_hits;
+       __u64           ndts_rcv_probes_mcast;
+       __u64           ndts_rcv_probes_ucast;
+       __u64           ndts_periodic_gc_runs;
+       __u64           ndts_forced_gc_runs;
+};
+
+enum {
+       NDTPA_UNSPEC,
+       NDTPA_IFINDEX,                  /* u32, unchangeable */
+       NDTPA_REFCNT,                   /* u32, read-only */
+       NDTPA_REACHABLE_TIME,           /* u64, read-only, msecs */
+       NDTPA_BASE_REACHABLE_TIME,      /* u64, msecs */
+       NDTPA_RETRANS_TIME,             /* u64, msecs */
+       NDTPA_GC_STALETIME,             /* u64, msecs */
+       NDTPA_DELAY_PROBE_TIME,         /* u64, msecs */
+       NDTPA_QUEUE_LEN,                /* u32 */
+       NDTPA_APP_PROBES,               /* u32 */
+       NDTPA_UCAST_PROBES,             /* u32 */
+       NDTPA_MCAST_PROBES,             /* u32 */
+       NDTPA_ANYCAST_DELAY,            /* u64, msecs */
+       NDTPA_PROXY_DELAY,              /* u64, msecs */
+       NDTPA_PROXY_QLEN,               /* u32 */
+       NDTPA_LOCKTIME,                 /* u64, msecs */
+       __NDTPA_MAX
+};
+#define NDTPA_MAX (__NDTPA_MAX - 1)
+
+struct ndtmsg
+{
+       __u8            ndtm_family;
+       __u8            ndtm_pad1;
+       __u16           ndtm_pad2;
+};
+
+struct ndt_config
+{
+       __u16           ndtc_key_len;
+       __u16           ndtc_entry_size;
+       __u32           ndtc_entries;
+       __u32           ndtc_last_flush;        /* delta to now in msecs */
+       __u32           ndtc_last_rand;         /* delta to now in msecs */
+       __u32           ndtc_hash_rnd;
+       __u32           ndtc_hash_mask;
+       __u32           ndtc_hash_chain_gc;
+       __u32           ndtc_proxy_qlen;
+};
+
+enum {
+       NDTA_UNSPEC,
+       NDTA_NAME,                      /* char *, unchangeable */
+       NDTA_THRESH1,                   /* u32 */
+       NDTA_THRESH2,                   /* u32 */
+       NDTA_THRESH3,                   /* u32 */
+       NDTA_CONFIG,                    /* struct ndt_config, read-only */
+       NDTA_PARMS,                     /* nested TLV NDTPA_* */
+       NDTA_STATS,                     /* struct ndt_stats, read-only */
+       NDTA_GC_INTERVAL,               /* u64, msecs */
+       __NDTA_MAX
+};
+#define NDTA_MAX (__NDTA_MAX - 1)
+
+#define NDTA_RTA(r) ((struct rtattr*)(((char*)(r)) + \
+                    NLMSG_ALIGN(sizeof(struct ndtmsg))))
+#define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg))
+
+
 /****
  *             General form of address family dependent message.
  ****/
@@ -789,6 +896,75 @@ extern void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const voi
 ({     if (unlikely(skb_tailroom(skb) < (int)(attrlen))) \
                goto rtattr_failure; \
        memcpy(skb_put(skb, RTA_ALIGN(attrlen)), data, attrlen); })
+
+#define RTA_PUT_U8(skb, attrtype, value) \
+({     u8 _tmp = (value); \
+       RTA_PUT(skb, attrtype, sizeof(u8), &_tmp); })
+
+#define RTA_PUT_U16(skb, attrtype, value) \
+({     u16 _tmp = (value); \
+       RTA_PUT(skb, attrtype, sizeof(u16), &_tmp); })
+
+#define RTA_PUT_U32(skb, attrtype, value) \
+({     u32 _tmp = (value); \
+       RTA_PUT(skb, attrtype, sizeof(u32), &_tmp); })
+
+#define RTA_PUT_U64(skb, attrtype, value) \
+({     u64 _tmp = (value); \
+       RTA_PUT(skb, attrtype, sizeof(u64), &_tmp); })
+
+#define RTA_PUT_SECS(skb, attrtype, value) \
+       RTA_PUT_U64(skb, attrtype, (value) / HZ)
+
+#define RTA_PUT_MSECS(skb, attrtype, value) \
+       RTA_PUT_U64(skb, attrtype, jiffies_to_msecs(value))
+
+#define RTA_PUT_STRING(skb, attrtype, value) \
+       RTA_PUT(skb, attrtype, strlen(value) + 1, value)
+
+#define RTA_PUT_FLAG(skb, attrtype) \
+       RTA_PUT(skb, attrtype, 0, NULL);
+
+#define RTA_NEST(skb, type) \
+({     struct rtattr *__start = (struct rtattr *) (skb)->tail; \
+       RTA_PUT(skb, type, 0, NULL); \
+       __start;  })
+
+#define RTA_NEST_END(skb, start) \
+({     (start)->rta_len = ((skb)->tail - (unsigned char *) (start)); \
+       (skb)->len; })
+
+#define RTA_NEST_CANCEL(skb, start) \
+({     if (start) \
+               skb_trim(skb, (unsigned char *) (start) - (skb)->data); \
+       -1; })
+
+#define RTA_GET_U8(rta) \
+({     if (!rta || RTA_PAYLOAD(rta) < sizeof(u8)) \
+               goto rtattr_failure; \
+       *(u8 *) RTA_DATA(rta); })
+
+#define RTA_GET_U16(rta) \
+({     if (!rta || RTA_PAYLOAD(rta) < sizeof(u16)) \
+               goto rtattr_failure; \
+       *(u16 *) RTA_DATA(rta); })
+
+#define RTA_GET_U32(rta) \
+({     if (!rta || RTA_PAYLOAD(rta) < sizeof(u32)) \
+               goto rtattr_failure; \
+       *(u32 *) RTA_DATA(rta); })
+
+#define RTA_GET_U64(rta) \
+({     u64 _tmp; \
+       if (!rta || RTA_PAYLOAD(rta) < sizeof(u64)) \
+               goto rtattr_failure; \
+       memcpy(&_tmp, RTA_DATA(rta), sizeof(_tmp)); \
+       _tmp; })
+
+#define RTA_GET_FLAG(rta) (!!(rta))
+
+#define RTA_GET_SECS(rta) ((unsigned long) RTA_GET_U64(rta) * HZ)
+#define RTA_GET_MSECS(rta) (msecs_to_jiffies((unsigned long) RTA_GET_U64(rta)))
                
 static inline struct rtattr *
 __rta_reserve(struct sk_buff *skb, int attrtype, int attrlen)
index 4dbb109022f3646ff39b7f64464bebb0200071fc..b58afd97a180274bad8b8904b018aac1c08621ef 100644 (file)
@@ -201,8 +201,8 @@ extern unsigned long
 arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr,
                          unsigned long len, unsigned long pgoff,
                          unsigned long flags);
-extern void arch_unmap_area(struct vm_area_struct *area);
-extern void arch_unmap_area_topdown(struct vm_area_struct *area);
+extern void arch_unmap_area(struct mm_struct *, unsigned long);
+extern void arch_unmap_area_topdown(struct mm_struct *, unsigned long);
 
 #define set_mm_counter(mm, member, value) (mm)->_##member = (value)
 #define get_mm_counter(mm, member) ((mm)->_##member)
@@ -218,9 +218,10 @@ struct mm_struct {
        unsigned long (*get_unmapped_area) (struct file *filp,
                                unsigned long addr, unsigned long len,
                                unsigned long pgoff, unsigned long flags);
-       void (*unmap_area) (struct vm_area_struct *area);
-       unsigned long mmap_base;                /* base of mmap area */
-       unsigned long free_area_cache;          /* first hole */
+       void (*unmap_area) (struct mm_struct *mm, unsigned long addr);
+        unsigned long mmap_base;               /* base of mmap area */
+        unsigned long cached_hole_size;         /* if non-zero, the largest hole below free_area_cache */
+       unsigned long free_area_cache;          /* first hole of size cached_hole_size or larger */
        pgd_t * pgd;
        atomic_t mm_users;                      /* How many users with user space? */
        atomic_t mm_count;                      /* How many references to "struct mm_struct" (users count as 1) */
index c3fb5984f250a19e5f45ff23551fc7d148e9790e..d6025af7efac39154d65c90f447b54f79a43ac37 100644 (file)
@@ -479,6 +479,25 @@ uart_handle_cts_change(struct uart_port *port, unsigned int status)
        }
 }
 
+#include <linux/tty_flip.h>
+
+static inline void
+uart_insert_char(struct uart_port *port, unsigned int status,
+                unsigned int overrun, unsigned int ch, unsigned int flag)
+{
+       struct tty_struct *tty = port->info->tty;
+
+       if ((status & port->ignore_status_mask & ~overrun) == 0)
+               tty_insert_flip_char(tty, ch, flag);
+
+       /*
+        * Overrun is special.  Since it's reported immediately,
+        * it doesn't affect the current character.
+        */
+       if (status & ~port->ignore_status_mask & overrun)
+               tty_insert_flip_char(tty, 0, TTY_OVERRUN);
+}
+
 /*
  *     UART_ENABLE_MS - determine if port should enable modem status irqs
  */
index 0a98f5ec5caed28fdfcaa91c183e7ef181534833..7be18b5e2fb41a9ec1794028a0364324360a6828 100644 (file)
@@ -231,10 +231,8 @@ extern int __group_send_sig_info(int, struct siginfo *, struct task_struct *);
 extern long do_sigpending(void __user *, unsigned long);
 extern int sigprocmask(int, sigset_t *, sigset_t *);
 
-#ifndef HAVE_ARCH_GET_SIGNAL_TO_DELIVER
 struct pt_regs;
 extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie);
-#endif
 
 #endif /* __KERNEL__ */
 
index cc04f5cd2286953a16a66dbfd89fe96211b0026c..d7c839a21842ca03f360a0e16320bab6c8253f76 100644 (file)
@@ -193,7 +193,6 @@ struct skb_shared_info {
  *     @nfcache: Cache info
  *     @nfct: Associated connection, if any
  *     @nfctinfo: Relationship of this skb to the connection
- *     @nf_debug: Netfilter debugging
  *     @nf_bridge: Saved data about a bridged frame - see br_netfilter.c
  *      @private: Data which is private to the HIPPI implementation
  *     @tc_index: Traffic control index
@@ -264,9 +263,6 @@ struct sk_buff {
        __u32                   nfcache;
        __u32                   nfctinfo;
        struct nf_conntrack     *nfct;
-#ifdef CONFIG_NETFILTER_DEBUG
-        unsigned int           nf_debug;
-#endif
 #ifdef CONFIG_BRIDGE_NETFILTER
        struct nf_bridge_info   *nf_bridge;
 #endif
@@ -1219,15 +1215,6 @@ static inline void nf_reset(struct sk_buff *skb)
 {
        nf_conntrack_put(skb->nfct);
        skb->nfct = NULL;
-#ifdef CONFIG_NETFILTER_DEBUG
-       skb->nf_debug = 0;
-#endif
-}
-static inline void nf_reset_debug(struct sk_buff *skb)
-{
-#ifdef CONFIG_NETFILTER_DEBUG
-       skb->nf_debug = 0;
-#endif
 }
 
 #ifdef CONFIG_BRIDGE_NETFILTER
index 7d66385ae7506b6d2f2a8155ec8a3200be119f63..76cf7e60216c07b7c602e233c6315f6e3d93f09a 100644 (file)
@@ -64,6 +64,7 @@ extern int kmem_cache_shrink(kmem_cache_t *);
 extern void *kmem_cache_alloc(kmem_cache_t *, unsigned int __nocast);
 extern void kmem_cache_free(kmem_cache_t *, void *);
 extern unsigned int kmem_cache_size(kmem_cache_t *);
+extern const char *kmem_cache_name(kmem_cache_t *);
 extern kmem_cache_t *kmem_find_general_cachep(size_t size, int gfpflags);
 
 /* Size description struct for general caches. */
index dcf1db3b35d338ba459d5b53015671a767892edd..9dfa3ee769ae2c02846a19a8f4a7b727a78baf33 100644 (file)
@@ -92,10 +92,7 @@ void smp_prepare_boot_cpu(void);
 /*
  *     These macros fold the SMP functionality into a single CPU system
  */
-
-#if !defined(__smp_processor_id) || !defined(CONFIG_PREEMPT)
-# define smp_processor_id()                    0
-#endif
+#define raw_smp_processor_id()                 0
 #define hard_smp_processor_id()                        0
 #define smp_call_function(func,info,retry,wait)        ({ 0; })
 #define on_each_cpu(func,info,retry,wait)      ({ func(info); 0; })
@@ -106,30 +103,25 @@ static inline void smp_send_reschedule(int cpu) { }
 #endif /* !SMP */
 
 /*
- * DEBUG_PREEMPT support: check whether smp_processor_id() is being
- * used in a preemption-safe way.
+ * smp_processor_id(): get the current CPU ID.
  *
- * An architecture has to enable this debugging code explicitly.
- * It can do so by renaming the smp_processor_id() macro to
- * __smp_processor_id().  This should only be done after some minimal
- * testing, because usually there are a number of false positives
- * that an architecture will trigger.
+ * if DEBUG_PREEMPT is enabled the we check whether it is
+ * used in a preemption-safe way. (smp_processor_id() is safe
+ * if it's used in a preemption-off critical section, or in
+ * a thread that is bound to the current CPU.)
  *
- * To fix a false positive (i.e. smp_processor_id() use that the
- * debugging code reports but which use for some reason is legal),
- * change the smp_processor_id() reference to _smp_processor_id(),
- * which is the nondebug variant.  NOTE: don't use this to hack around
- * real bugs.
+ * NOTE: raw_smp_processor_id() is for internal use only
+ * (smp_processor_id() is the preferred variant), but in rare
+ * instances it might also be used to turn off false positives
+ * (i.e. smp_processor_id() use that the debugging code reports but
+ * which use for some reason is legal). Don't use this to hack around
+ * the warning message, as your code might not work under PREEMPT.
  */
-#ifdef __smp_processor_id
-# if defined(CONFIG_PREEMPT) && defined(CONFIG_DEBUG_PREEMPT)
-   extern unsigned int smp_processor_id(void);
-# else
-#  define smp_processor_id() __smp_processor_id()
-# endif
-# define _smp_processor_id() __smp_processor_id()
+#ifdef CONFIG_DEBUG_PREEMPT
+  extern unsigned int debug_smp_processor_id(void);
+# define smp_processor_id() debug_smp_processor_id()
 #else
-# define _smp_processor_id() smp_processor_id()
+# define smp_processor_id() raw_smp_processor_id()
 #endif
 
 #define get_cpu()              ({ preempt_disable(); smp_processor_id(); })
index e895f3eaf53ab1196ee0473ba258586998ec2d4c..d6ba068719b61bf4a035e4d6e297694b65941442 100644 (file)
@@ -248,7 +248,7 @@ typedef struct {
 
 #define _spin_trylock_bh(lock) ({preempt_disable(); local_bh_disable(); \
                                _raw_spin_trylock(lock) ? \
-                               1 : ({preempt_enable(); local_bh_enable(); 0;});})
+                               1 : ({preempt_enable_no_resched(); local_bh_enable(); 0;});})
 
 #define _spin_lock(lock)       \
 do { \
@@ -383,7 +383,7 @@ do { \
 #define _spin_unlock_bh(lock) \
 do { \
        _raw_spin_unlock(lock); \
-       preempt_enable(); \
+       preempt_enable_no_resched(); \
        local_bh_enable(); \
        __release(lock); \
 } while (0)
@@ -391,7 +391,7 @@ do { \
 #define _write_unlock_bh(lock) \
 do { \
        _raw_write_unlock(lock); \
-       preempt_enable(); \
+       preempt_enable_no_resched(); \
        local_bh_enable(); \
        __release(lock); \
 } while (0)
@@ -423,8 +423,8 @@ do { \
 #define _read_unlock_bh(lock)  \
 do { \
        _raw_read_unlock(lock); \
+       preempt_enable_no_resched();    \
        local_bh_enable();      \
-       preempt_enable();       \
        __release(lock); \
 } while (0)
 
index 3bbc41be9bd0cb097c6c4c75b581e5cae5e02bb2..2343f999e6e11e287fa20532608d81796c3b58db 100644 (file)
@@ -172,7 +172,8 @@ extern int rotate_reclaimable_page(struct page *page);
 extern void swap_setup(void);
 
 /* linux/mm/vmscan.c */
-extern int try_to_free_pages(struct zone **, unsigned int, unsigned int);
+extern int try_to_free_pages(struct zone **, unsigned int);
+extern int zone_reclaim(struct zone *, unsigned int, unsigned int);
 extern int shrink_all_memory(int);
 extern int vm_swappiness;
 
index 772998147e3ef989988c184520f6dacba9fb601d..a17745c80a91a6ce19fdeeb007aa1f529ce440df 100644 (file)
@@ -346,6 +346,7 @@ enum
        NET_TCP_MODERATE_RCVBUF=106,
        NET_TCP_TSO_WIN_DIVISOR=107,
        NET_TCP_BIC_BETA=108,
+       NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR=109,
 };
 
 enum {
@@ -399,6 +400,7 @@ enum
        NET_IPV4_CONF_FORCE_IGMP_VERSION=17,
        NET_IPV4_CONF_ARP_ANNOUNCE=18,
        NET_IPV4_CONF_ARP_IGNORE=19,
+       NET_IPV4_CONF_PROMOTE_SECONDARIES=20,
        __NET_IPV4_CONF_MAX
 };
 
index 38b58b30814a304ddcd803ea10595fb35880a41c..392da5a6dacb79530c7dc9c0445b6b7d0f0350bb 100644 (file)
@@ -16,13 +16,13 @@ struct kobject;
 struct module;
 
 struct attribute {
-       char                    * name;
+       const char              * name;
        struct module           * owner;
        mode_t                  mode;
 };
 
 struct attribute_group {
-       char                    * name;
+       const char              * name;
        struct attribute        ** attrs;
 };
 
@@ -73,6 +73,7 @@ struct sysfs_dirent {
        int                     s_type;
        umode_t                 s_mode;
        struct dentry           * s_dentry;
+       struct iattr            * s_iattr;
 };
 
 #define SYSFS_ROOT             0x0001
@@ -105,11 +106,11 @@ sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode);
 extern void
 sysfs_remove_file(struct kobject *, const struct attribute *);
 
-extern int 
-sysfs_create_link(struct kobject * kobj, struct kobject * target, char * name);
+extern int
+sysfs_create_link(struct kobject * kobj, struct kobject * target, const char * name);
 
 extern void
-sysfs_remove_link(struct kobject *, char * name);
+sysfs_remove_link(struct kobject *, const char * name);
 
 int sysfs_create_bin_file(struct kobject * kobj, struct bin_attribute * attr);
 int sysfs_remove_bin_file(struct kobject * kobj, struct bin_attribute * attr);
@@ -153,12 +154,12 @@ static inline void sysfs_remove_file(struct kobject * k, const struct attribute
        ;
 }
 
-static inline int sysfs_create_link(struct kobject * k, struct kobject * t, char * n)
+static inline int sysfs_create_link(struct kobject * k, struct kobject * t, const char * n)
 {
        return 0;
 }
 
-static inline void sysfs_remove_link(struct kobject * k, char * name)
+static inline void sysfs_remove_link(struct kobject * k, const char * name)
 {
        ;
 }
index aa6b48bb4dcd0c1fbeec59278d84eb3e15244da0..a6b2cc530af5e1be70ed02d2cf05240c2894c297 100644 (file)
@@ -56,6 +56,36 @@ enum
        TCF_META_ID_TCCLASSID,
        TCF_META_ID_RTCLASSID,
        TCF_META_ID_RTIIF,
+       TCF_META_ID_SK_FAMILY,
+       TCF_META_ID_SK_STATE,
+       TCF_META_ID_SK_REUSE,
+       TCF_META_ID_SK_BOUND_IF,
+       TCF_META_ID_SK_REFCNT,
+       TCF_META_ID_SK_SHUTDOWN,
+       TCF_META_ID_SK_PROTO,
+       TCF_META_ID_SK_TYPE,
+       TCF_META_ID_SK_RCVBUF,
+       TCF_META_ID_SK_RMEM_ALLOC,
+       TCF_META_ID_SK_WMEM_ALLOC,
+       TCF_META_ID_SK_OMEM_ALLOC,
+       TCF_META_ID_SK_WMEM_QUEUED,
+       TCF_META_ID_SK_RCV_QLEN,
+       TCF_META_ID_SK_SND_QLEN,
+       TCF_META_ID_SK_ERR_QLEN,
+       TCF_META_ID_SK_FORWARD_ALLOCS,
+       TCF_META_ID_SK_SNDBUF,
+       TCF_META_ID_SK_ALLOCS,
+       TCF_META_ID_SK_ROUTE_CAPS,
+       TCF_META_ID_SK_HASHENT,
+       TCF_META_ID_SK_LINGERTIME,
+       TCF_META_ID_SK_ACK_BACKLOG,
+       TCF_META_ID_SK_MAX_ACK_BACKLOG,
+       TCF_META_ID_SK_PRIO,
+       TCF_META_ID_SK_RCVLOWAT,
+       TCF_META_ID_SK_RCVTIMEO,
+       TCF_META_ID_SK_SNDTIMEO,
+       TCF_META_ID_SK_SENDMSG_OFF,
+       TCF_META_ID_SK_WRITE_PENDING,
        __TCF_META_ID_MAX
 };
 #define TCF_META_ID_MAX (__TCF_META_ID_MAX - 1)
index 14a55e3e3a502a77d7ea90b860c415494f541234..97a7c9e03df5d9d5d2f60d4d88e64f26a49158a4 100644 (file)
@@ -230,6 +230,17 @@ struct tcp_options_received {
        __u16   mss_clamp;      /* Maximal mss, negotiated at connection setup */
 };
 
+struct tcp_request_sock {
+       struct inet_request_sock req;
+       __u32                    rcv_isn;
+       __u32                    snt_isn;
+};
+
+static inline struct tcp_request_sock *tcp_rsk(const struct request_sock *req)
+{
+       return (struct tcp_request_sock *)req;
+}
+
 struct tcp_sock {
        /* inet_sock has to be the first member of tcp_sock */
        struct inet_sock        inet;
@@ -368,22 +379,7 @@ struct tcp_sock {
 
        __u32   total_retrans;  /* Total retransmits for entire connection */
 
-       /* The syn_wait_lock is necessary only to avoid proc interface having
-        * to grab the main lock sock while browsing the listening hash
-        * (otherwise it's deadlock prone).
-        * This lock is acquired in read mode only from listening_get_next()
-        * and it's acquired in write mode _only_ from code that is actively
-        * changing the syn_wait_queue. All readers that are holding
-        * the master sock lock don't need to grab this lock in read mode
-        * too as the syn_wait_queue writes are always protected from
-        * the main sock lock.
-        */
-       rwlock_t                syn_wait_lock;
-       struct tcp_listen_opt   *listen_opt;
-
-       /* FIFO of established children */
-       struct open_request     *accept_queue;
-       struct open_request     *accept_queue_tail;
+       struct request_sock_queue accept_queue; /* FIFO of established children */
 
        unsigned int            keepalive_time;   /* time before keep alive takes place */
        unsigned int            keepalive_intvl;  /* time interval between keep alive probes */
index 41d1a644c9d43aa8206cf2b6e708c4a8173b7fd2..3d508bf0840270a136a371b8d175bbc861b14e14 100644 (file)
@@ -287,15 +287,14 @@ struct usb_bus {
 
        struct dentry *usbfs_dentry;    /* usbfs dentry entry for the bus */
 
-       struct class_device class_dev;  /* class device for this bus */
+       struct class_device *class_dev; /* class device for this bus */
+       struct kref kref;               /* handles reference counting this bus */
        void (*release)(struct usb_bus *bus);   /* function to destroy this bus's memory */
 #if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE)
        struct mon_bus *mon_bus;        /* non-null when associated */
        int monitored;                  /* non-zero when monitored */
 #endif
 };
-#define        to_usb_bus(d) container_of(d, struct usb_bus, class_dev)
-
 
 /* -------------------------------------------------------------------------- */
 
@@ -796,6 +795,10 @@ typedef void (*usb_complete_t)(struct urb *, struct pt_regs *);
  * of the iso_frame_desc array, and the number of errors is reported in
  * error_count.  Completion callbacks for ISO transfers will normally
  * (re)submit URBs to ensure a constant transfer rate.
+ *
+ * Note that even fields marked "public" should not be touched by the driver
+ * when the urb is owned by the hcd, that is, since the call to
+ * usb_submit_urb() till the entry into the completion routine.
  */
 struct urb
 {
@@ -803,12 +806,12 @@ struct urb
        struct kref kref;               /* reference count of the URB */
        spinlock_t lock;                /* lock for the URB */
        void *hcpriv;                   /* private data for host controller */
-       struct list_head urb_list;      /* list pointer to all active urbs */
        int bandwidth;                  /* bandwidth for INT/ISO request */
        atomic_t use_count;             /* concurrent submissions counter */
        u8 reject;                      /* submissions will fail */
 
        /* public, documented fields in the urb that can be used by drivers */
+       struct list_head urb_list;      /* list head for use by the urb owner */
        struct usb_device *dev;         /* (in) pointer to associated device */
        unsigned int pipe;              /* (in) pipe information */
        int status;                     /* (return) non-ISO status */
index 3a358c895188f6506e2eddf4fb1487bc2d3da4c5..6409d9cf59659d8377d140e205a4a6099e8b4277 100644 (file)
@@ -41,6 +41,7 @@ extern struct vm_struct *get_vm_area(unsigned long size, unsigned long flags);
 extern struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags,
                                        unsigned long start, unsigned long end);
 extern struct vm_struct *remove_vm_area(void *addr);
+extern struct vm_struct *__remove_vm_area(void *addr);
 extern int map_vm_area(struct vm_struct *area, pgprot_t prot,
                        struct page ***pages);
 extern void unmap_vm_area(struct vm_struct *area);
index 17c874a8eb3f15b839898de9368297c189c8dc21..c9486c3efb4a1ac25bf79531cc369a00c487c474 100644 (file)
@@ -386,9 +386,7 @@ int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *key);
        wait_queue_t name = {                                           \
                .task           = current,                              \
                .func           = autoremove_wake_function,             \
-               .task_list      = {     .next = &(name).task_list,      \
-                                       .prev = &(name).task_list,      \
-                               },                                      \
+               .task_list      = LIST_HEAD_INIT((name).task_list),     \
        }
 
 #define DEFINE_WAIT_BIT(name, word, bit)                               \
index 2f51f2b6562e5a552d46bd4835197c80cd6d239a..ae485f9c916edb224e4cc2c869ab6347bb7f7bfe 100644 (file)
@@ -1,10 +1,10 @@
 /*
  * This file define a set of standard wireless extensions
  *
- * Version :   17      21.6.04
+ * Version :   18      12.3.05
  *
  * Authors :   Jean Tourrilhes - HPL - <jt@hpl.hp.com>
- * Copyright (c) 1997-2004 Jean Tourrilhes, All Rights Reserved.
+ * Copyright (c) 1997-2005 Jean Tourrilhes, All Rights Reserved.
  */
 
 #ifndef _LINUX_WIRELESS_H
@@ -82,7 +82,7 @@
  * (there is some stuff that will be added in the future...)
  * I just plan to increment with each new version.
  */
-#define WIRELESS_EXT   17
+#define WIRELESS_EXT   18
 
 /*
  * Changes :
  *     - Document (struct iw_quality *)->updated, add new flags (INVALID)
  *     - Wireless Event capability in struct iw_range
  *     - Add support for relative TxPower (yick !)
+ *
+ * V17 to V18 (From Jouni Malinen <jkmaline@cc.hut.fi>)
+ * ----------
+ *     - Add support for WPA/WPA2
+ *     - Add extended encoding configuration (SIOCSIWENCODEEXT and
+ *       SIOCGIWENCODEEXT)
+ *     - Add SIOCSIWGENIE/SIOCGIWGENIE
+ *     - Add SIOCSIWMLME
+ *     - Add SIOCSIWPMKSA
+ *     - Add struct iw_range bit field for supported encoding capabilities
+ *     - Add optional scan request parameters for SIOCSIWSCAN
+ *     - Add SIOCSIWAUTH/SIOCGIWAUTH for setting authentication and WPA
+ *       related parameters (extensible up to 4096 parameter values)
+ *     - Add wireless events: IWEVGENIE, IWEVMICHAELMICFAILURE,
+ *       IWEVASSOCREQIE, IWEVASSOCRESPIE, IWEVPMKIDCAND
  */
 
 /**************************** CONSTANTS ****************************/
 #define SIOCSIWPOWER   0x8B2C          /* set Power Management settings */
 #define SIOCGIWPOWER   0x8B2D          /* get Power Management settings */
 
+/* WPA : Generic IEEE 802.11 informatiom element (e.g., for WPA/RSN/WMM).
+ * This ioctl uses struct iw_point and data buffer that includes IE id and len
+ * fields. More than one IE may be included in the request. Setting the generic
+ * IE to empty buffer (len=0) removes the generic IE from the driver. Drivers
+ * are allowed to generate their own WPA/RSN IEs, but in these cases, drivers
+ * are required to report the used IE as a wireless event, e.g., when
+ * associating with an AP. */
+#define SIOCSIWGENIE   0x8B30          /* set generic IE */
+#define SIOCGIWGENIE   0x8B31          /* get generic IE */
+
+/* WPA : IEEE 802.11 MLME requests */
+#define SIOCSIWMLME    0x8B16          /* request MLME operation; uses
+                                        * struct iw_mlme */
+/* WPA : Authentication mode parameters */
+#define SIOCSIWAUTH    0x8B32          /* set authentication mode params */
+#define SIOCGIWAUTH    0x8B33          /* get authentication mode params */
+
+/* WPA : Extended version of encoding configuration */
+#define SIOCSIWENCODEEXT 0x8B34                /* set encoding token & mode */
+#define SIOCGIWENCODEEXT 0x8B35                /* get encoding token & mode */
+
+/* WPA2 : PMKSA cache management */
+#define SIOCSIWPMKSA   0x8B36          /* PMKSA cache operation */
+
 /* -------------------- DEV PRIVATE IOCTL LIST -------------------- */
 
 /* These 32 ioctl are wireless device private, for 16 commands.
 #define IWEVCUSTOM     0x8C02          /* Driver specific ascii string */
 #define IWEVREGISTERED 0x8C03          /* Discovered a new node (AP mode) */
 #define IWEVEXPIRED    0x8C04          /* Expired a node (AP mode) */
+#define IWEVGENIE      0x8C05          /* Generic IE (WPA, RSN, WMM, ..)
+                                        * (scan results); This includes id and
+                                        * length fields. One IWEVGENIE may
+                                        * contain more than one IE. Scan
+                                        * results may contain one or more
+                                        * IWEVGENIE events. */
+#define IWEVMICHAELMICFAILURE 0x8C06   /* Michael MIC failure
+                                        * (struct iw_michaelmicfailure)
+                                        */
+#define IWEVASSOCREQIE 0x8C07          /* IEs used in (Re)Association Request.
+                                        * The data includes id and length
+                                        * fields and may contain more than one
+                                        * IE. This event is required in
+                                        * Managed mode if the driver
+                                        * generates its own WPA/RSN IE. This
+                                        * should be sent just before
+                                        * IWEVREGISTERED event for the
+                                        * association. */
+#define IWEVASSOCRESPIE        0x8C08          /* IEs used in (Re)Association
+                                        * Response. The data includes id and
+                                        * length fields and may contain more
+                                        * than one IE. This may be sent
+                                        * between IWEVASSOCREQIE and
+                                        * IWEVREGISTERED events for the
+                                        * association. */
+#define IWEVPMKIDCAND  0x8C09          /* PMKID candidate for RSN
+                                        * pre-authentication
+                                        * (struct iw_pmkid_cand) */
 
 #define IWEVFIRST      0x8C00
 
 #define IW_SCAN_THIS_MODE      0x0020  /* Scan only this Mode */
 #define IW_SCAN_ALL_RATE       0x0040  /* Scan all Bit-Rates */
 #define IW_SCAN_THIS_RATE      0x0080  /* Scan only this Bit-Rate */
+/* struct iw_scan_req scan_type */
+#define IW_SCAN_TYPE_ACTIVE 0
+#define IW_SCAN_TYPE_PASSIVE 1
 /* Maximum size of returned data */
 #define IW_SCAN_MAX_DATA       4096    /* In bytes */
 
 /* Max number of char in custom event - use multiple of them if needed */
 #define IW_CUSTOM_MAX          256     /* In bytes */
 
+/* Generic information element */
+#define IW_GENERIC_IE_MAX      1024
+
+/* MLME requests (SIOCSIWMLME / struct iw_mlme) */
+#define IW_MLME_DEAUTH         0
+#define IW_MLME_DISASSOC       1
+
+/* SIOCSIWAUTH/SIOCGIWAUTH struct iw_param flags */
+#define IW_AUTH_INDEX          0x0FFF
+#define IW_AUTH_FLAGS          0xF000
+/* SIOCSIWAUTH/SIOCGIWAUTH parameters (0 .. 4095)
+ * (IW_AUTH_INDEX mask in struct iw_param flags; this is the index of the
+ * parameter that is being set/get to; value will be read/written to
+ * struct iw_param value field) */
+#define IW_AUTH_WPA_VERSION            0
+#define IW_AUTH_CIPHER_PAIRWISE                1
+#define IW_AUTH_CIPHER_GROUP           2
+#define IW_AUTH_KEY_MGMT               3
+#define IW_AUTH_TKIP_COUNTERMEASURES   4
+#define IW_AUTH_DROP_UNENCRYPTED       5
+#define IW_AUTH_80211_AUTH_ALG         6
+#define IW_AUTH_WPA_ENABLED            7
+#define IW_AUTH_RX_UNENCRYPTED_EAPOL   8
+#define IW_AUTH_ROAMING_CONTROL                9
+#define IW_AUTH_PRIVACY_INVOKED                10
+
+/* IW_AUTH_WPA_VERSION values (bit field) */
+#define IW_AUTH_WPA_VERSION_DISABLED   0x00000001
+#define IW_AUTH_WPA_VERSION_WPA                0x00000002
+#define IW_AUTH_WPA_VERSION_WPA2       0x00000004
+
+/* IW_AUTH_PAIRWISE_CIPHER and IW_AUTH_GROUP_CIPHER values (bit field) */
+#define IW_AUTH_CIPHER_NONE    0x00000001
+#define IW_AUTH_CIPHER_WEP40   0x00000002
+#define IW_AUTH_CIPHER_TKIP    0x00000004
+#define IW_AUTH_CIPHER_CCMP    0x00000008
+#define IW_AUTH_CIPHER_WEP104  0x00000010
+
+/* IW_AUTH_KEY_MGMT values (bit field) */
+#define IW_AUTH_KEY_MGMT_802_1X        1
+#define IW_AUTH_KEY_MGMT_PSK   2
+
+/* IW_AUTH_80211_AUTH_ALG values (bit field) */
+#define IW_AUTH_ALG_OPEN_SYSTEM        0x00000001
+#define IW_AUTH_ALG_SHARED_KEY 0x00000002
+#define IW_AUTH_ALG_LEAP       0x00000004
+
+/* IW_AUTH_ROAMING_CONTROL values */
+#define IW_AUTH_ROAMING_ENABLE 0       /* driver/firmware based roaming */
+#define IW_AUTH_ROAMING_DISABLE        1       /* user space program used for roaming
+                                        * control */
+
+/* SIOCSIWENCODEEXT definitions */
+#define IW_ENCODE_SEQ_MAX_SIZE 8
+/* struct iw_encode_ext ->alg */
+#define IW_ENCODE_ALG_NONE     0
+#define IW_ENCODE_ALG_WEP      1
+#define IW_ENCODE_ALG_TKIP     2
+#define IW_ENCODE_ALG_CCMP     3
+/* struct iw_encode_ext ->ext_flags */
+#define IW_ENCODE_EXT_TX_SEQ_VALID     0x00000001
+#define IW_ENCODE_EXT_RX_SEQ_VALID     0x00000002
+#define IW_ENCODE_EXT_GROUP_KEY                0x00000004
+#define IW_ENCODE_EXT_SET_TX_KEY       0x00000008
+
+/* IWEVMICHAELMICFAILURE : struct iw_michaelmicfailure ->flags */
+#define IW_MICFAILURE_KEY_ID   0x00000003 /* Key ID 0..3 */
+#define IW_MICFAILURE_GROUP    0x00000004
+#define IW_MICFAILURE_PAIRWISE 0x00000008
+#define IW_MICFAILURE_STAKEY   0x00000010
+#define IW_MICFAILURE_COUNT    0x00000060 /* 1 or 2 (0 = count not supported)
+                                           */
+
+/* Bit field values for enc_capa in struct iw_range */
+#define IW_ENC_CAPA_WPA                0x00000001
+#define IW_ENC_CAPA_WPA2       0x00000002
+#define IW_ENC_CAPA_CIPHER_TKIP        0x00000004
+#define IW_ENC_CAPA_CIPHER_CCMP        0x00000008
+
 /* Event capability macros - in (struct iw_range *)->event_capa
  * Because we have more than 32 possible events, we use an array of
  * 32 bit bitmasks. Note : 32 bits = 0x20 = 2^5. */
@@ -546,6 +695,132 @@ struct    iw_thrspy
        struct iw_quality       high;           /* High threshold */
 };
 
+/*
+ *     Optional data for scan request
+ *
+ *     Note: these optional parameters are controlling parameters for the
+ *     scanning behavior, these do not apply to getting scan results
+ *     (SIOCGIWSCAN). Drivers are expected to keep a local BSS table and
+ *     provide a merged results with all BSSes even if the previous scan
+ *     request limited scanning to a subset, e.g., by specifying an SSID.
+ *     Especially, scan results are required to include an entry for the
+ *     current BSS if the driver is in Managed mode and associated with an AP.
+ */
+struct iw_scan_req
+{
+       __u8            scan_type; /* IW_SCAN_TYPE_{ACTIVE,PASSIVE} */
+       __u8            essid_len;
+       __u8            num_channels; /* num entries in channel_list;
+                                      * 0 = scan all allowed channels */
+       __u8            flags; /* reserved as padding; use zero, this may
+                               * be used in the future for adding flags
+                               * to request different scan behavior */
+       struct sockaddr bssid; /* ff:ff:ff:ff:ff:ff for broadcast BSSID or
+                               * individual address of a specific BSS */
+
+       /*
+        * Use this ESSID if IW_SCAN_THIS_ESSID flag is used instead of using
+        * the current ESSID. This allows scan requests for specific ESSID
+        * without having to change the current ESSID and potentially breaking
+        * the current association.
+        */
+       __u8            essid[IW_ESSID_MAX_SIZE];
+
+       /*
+        * Optional parameters for changing the default scanning behavior.
+        * These are based on the MLME-SCAN.request from IEEE Std 802.11.
+        * TU is 1.024 ms. If these are set to 0, driver is expected to use
+        * reasonable default values. min_channel_time defines the time that
+        * will be used to wait for the first reply on each channel. If no
+        * replies are received, next channel will be scanned after this. If
+        * replies are received, total time waited on the channel is defined by
+        * max_channel_time.
+        */
+       __u32           min_channel_time; /* in TU */
+       __u32           max_channel_time; /* in TU */
+
+       struct iw_freq  channel_list[IW_MAX_FREQUENCIES];
+};
+
+/* ------------------------- WPA SUPPORT ------------------------- */
+
+/*
+ *     Extended data structure for get/set encoding (this is used with
+ *     SIOCSIWENCODEEXT/SIOCGIWENCODEEXT. struct iw_point and IW_ENCODE_*
+ *     flags are used in the same way as with SIOCSIWENCODE/SIOCGIWENCODE and
+ *     only the data contents changes (key data -> this structure, including
+ *     key data).
+ *
+ *     If the new key is the first group key, it will be set as the default
+ *     TX key. Otherwise, default TX key index is only changed if
+ *     IW_ENCODE_EXT_SET_TX_KEY flag is set.
+ *
+ *     Key will be changed with SIOCSIWENCODEEXT in all cases except for
+ *     special "change TX key index" operation which is indicated by setting
+ *     key_len = 0 and ext_flags |= IW_ENCODE_EXT_SET_TX_KEY.
+ *
+ *     tx_seq/rx_seq are only used when respective
+ *     IW_ENCODE_EXT_{TX,RX}_SEQ_VALID flag is set in ext_flags. Normal
+ *     TKIP/CCMP operation is to set RX seq with SIOCSIWENCODEEXT and start
+ *     TX seq from zero whenever key is changed. SIOCGIWENCODEEXT is normally
+ *     used only by an Authenticator (AP or an IBSS station) to get the
+ *     current TX sequence number. Using TX_SEQ_VALID for SIOCSIWENCODEEXT and
+ *     RX_SEQ_VALID for SIOCGIWENCODEEXT are optional, but can be useful for
+ *     debugging/testing.
+ */
+struct iw_encode_ext
+{
+       __u32           ext_flags; /* IW_ENCODE_EXT_* */
+       __u8            tx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */
+       __u8            rx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */
+       struct sockaddr addr; /* ff:ff:ff:ff:ff:ff for broadcast/multicast
+                              * (group) keys or unicast address for
+                              * individual keys */
+       __u16           alg; /* IW_ENCODE_ALG_* */
+       __u16           key_len;
+       __u8            key[0];
+};
+
+/* SIOCSIWMLME data */
+struct iw_mlme
+{
+       __u16           cmd; /* IW_MLME_* */
+       __u16           reason_code;
+       struct sockaddr addr;
+};
+
+/* SIOCSIWPMKSA data */
+#define IW_PMKSA_ADD           1
+#define IW_PMKSA_REMOVE                2
+#define IW_PMKSA_FLUSH         3
+
+#define IW_PMKID_LEN   16
+
+struct iw_pmksa
+{
+       __u32           cmd; /* IW_PMKSA_* */
+       struct sockaddr bssid;
+       __u8            pmkid[IW_PMKID_LEN];
+};
+
+/* IWEVMICHAELMICFAILURE data */
+struct iw_michaelmicfailure
+{
+       __u32           flags;
+       struct sockaddr src_addr;
+       __u8            tsc[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */
+};
+
+/* IWEVPMKIDCAND data */
+#define IW_PMKID_CAND_PREAUTH  0x00000001 /* RNS pre-authentication enabled */
+struct iw_pmkid_cand
+{
+       __u32           flags; /* IW_PMKID_CAND_* */
+       __u32           index; /* the smaller the index, the higher the
+                               * priority */
+       struct sockaddr bssid;
+};
+
 /* ------------------------ WIRELESS STATS ------------------------ */
 /*
  * Wireless statistics (used for /proc/net/wireless)
@@ -725,6 +1000,8 @@ struct     iw_range
        struct iw_freq  freq[IW_MAX_FREQUENCIES];       /* list */
        /* Note : this frequency list doesn't need to fit channel numbers,
         * because each entry contain its channel index */
+
+       __u32           enc_capa; /* IW_ENC_CAPA_* bit field */
 };
 
 /*
index fd2ef742a9fd1e1c62d873a5cec2a9b78362c5da..f0d423300d84aead0467e222d4d3d3961627abef 100644 (file)
@@ -174,6 +174,8 @@ enum xfrm_attr_type_t {
        XFRMA_ALG_COMP,         /* struct xfrm_algo */
        XFRMA_ENCAP,            /* struct xfrm_algo + struct xfrm_encap_tmpl */
        XFRMA_TMPL,             /* 1 or more struct xfrm_user_tmpl */
+       XFRMA_SA,
+       XFRMA_POLICY,
        __XFRMA_MAX
 
 #define XFRMA_MAX (__XFRMA_MAX - 1)
@@ -194,6 +196,7 @@ struct xfrm_usersa_info {
        __u8                            flags;
 #define XFRM_STATE_NOECN       1
 #define XFRM_STATE_DECAP_DSCP  2
+#define XFRM_STATE_NOPMTUDISC  4
 };
 
 struct xfrm_usersa_id {
@@ -257,5 +260,7 @@ struct xfrm_usersa_flush {
 
 #define XFRMGRP_ACQUIRE                1
 #define XFRMGRP_EXPIRE         2
+#define XFRMGRP_SA             4
+#define XFRMGRP_POLICY         8
 
 #endif /* _LINUX_XFRM_H */
index 94bd33619aa5af542b747c7a0829917e824b42e0..ad0a07a3a89502e08c580029e96959576c81c821 100644 (file)
@@ -16,7 +16,7 @@ struct videobuf_dvb {
        int                        nfeeds;
 
        /* videobuf_dvb_(un)register manges this */
-       struct dvb_adapter         *adapter;
+       struct dvb_adapter         adapter;
        struct dvb_demux           demux;
        struct dmxdev              dmxdev;
        struct dmx_frontend        fe_hw;
index 95b120781c14696b40e9f9528e414289e9051ac5..c9daa7e52300da04d17defe8ec49ab79ea743166 100644 (file)
@@ -2,8 +2,8 @@
  * include/net/act_generic.h
  *
 */
-#ifndef ACT_GENERIC_H
-#define ACT_GENERIC_H
+#ifndef _NET_ACT_GENERIC_H
+#define _NET_ACT_GENERIC_H
 static inline int tcf_defact_release(struct tcf_defact *p, int bind)
 {
        int ret = 0;
index 9e6368a5454760fa9bc1c56fc691b110474094b3..828a3a93dda10e07ce851476894296f5b7e4a68f 100644 (file)
@@ -220,7 +220,7 @@ static __inline__ void ax25_cb_put(ax25_cb *ax25)
        }
 }
 
-static inline unsigned short ax25_type_trans(struct sk_buff *skb, struct net_device *dev)
+static inline __be16 ax25_type_trans(struct sk_buff *skb, struct net_device *dev)
 {
        skb->dev      = dev;
        skb->pkt_type = PACKET_HOST;
index 3f63992eb71292da8a08f6ed44dc3f72a743b245..32360bbe143faebcefe80eb9ae7a43d19585680c 100644 (file)
@@ -163,6 +163,7 @@ DECLARE_SNMP_STAT(struct linux_mib, net_statistics);
 
 extern int sysctl_local_port_range[2];
 extern int sysctl_ip_default_ttl;
+extern int sysctl_ip_nonlocal_bind;
 
 #ifdef CONFIG_INET
 /* The function in 2.2 was invalid, producing wrong result for
index 31990451819454f6dc8e2f6db16572dc36428f01..a66e9de16a6cbe40535254983ebb650b8433e599 100644 (file)
@@ -167,14 +167,17 @@ extern int                        fib6_walk_continue(struct fib6_walker_t *w);
 extern int                     fib6_add(struct fib6_node *root,
                                         struct rt6_info *rt,
                                         struct nlmsghdr *nlh,
-                                        void *rtattr);
+                                        void *rtattr,
+                                        struct netlink_skb_parms *req);
 
 extern int                     fib6_del(struct rt6_info *rt,
                                         struct nlmsghdr *nlh,
-                                        void *rtattr);
+                                        void *rtattr,
+                                        struct netlink_skb_parms *req);
 
 extern void                    inet6_rt_notify(int event, struct rt6_info *rt,
-                                               struct nlmsghdr *nlh);
+                                               struct nlmsghdr *nlh,
+                                               struct netlink_skb_parms *req);
 
 extern void                    fib6_run_gc(unsigned long dummy);
 
index d5d1dd10cdb8da7e40b8a65f9b8fc16c87b1814a..f920706d526b4397288240e9e11bf6bcaa07db54 100644 (file)
@@ -41,13 +41,16 @@ extern int                  ipv6_route_ioctl(unsigned int cmd, void __user *arg);
 
 extern int                     ip6_route_add(struct in6_rtmsg *rtmsg,
                                              struct nlmsghdr *,
-                                             void *rtattr);
+                                             void *rtattr,
+                                             struct netlink_skb_parms *req);
 extern int                     ip6_ins_rt(struct rt6_info *,
                                           struct nlmsghdr *,
-                                          void *rtattr);
+                                          void *rtattr,
+                                          struct netlink_skb_parms *req);
 extern int                     ip6_del_rt(struct rt6_info *,
                                           struct nlmsghdr *,
-                                          void *rtattr);
+                                          void *rtattr,
+                                          struct netlink_skb_parms *req);
 
 extern int                     ip6_rt_addr_add(struct in6_addr *addr,
                                                struct net_device *dev,
index e5a5f6b62f8800a537e67540b08c56f1c7e0b656..a4208a336ac09e58061af807e28a417f9ad1dd69 100644 (file)
@@ -109,6 +109,20 @@ struct fib_result {
 #endif
 };
 
+struct fib_result_nl {
+       u32             fl_addr;   /* To be looked up*/ 
+       u32             fl_fwmark; 
+       unsigned char   fl_tos;
+       unsigned char   fl_scope;
+       unsigned char   tb_id_in;
+
+       unsigned char   tb_id;      /* Results */
+       unsigned char   prefixlen;
+       unsigned char   nh_sel;
+       unsigned char   type;
+       unsigned char   scope;
+       int             err;      
+};
 
 #ifdef CONFIG_IP_ROUTE_MULTIPATH
 
index 4f33bbc21e7fdb4148c1ae93c4e9b145ecefd0d7..89809891e5ab2e8e9430ccac31255d22ee364231 100644 (file)
@@ -65,11 +65,10 @@ struct neighbour;
 
 struct neigh_parms
 {
+       struct net_device *dev;
        struct neigh_parms *next;
        int     (*neigh_setup)(struct neighbour *);
        struct neigh_table *tbl;
-       int     entries;
-       void    *priv;
 
        void    *sysctl_table;
 
@@ -192,7 +191,6 @@ struct neigh_table
        atomic_t                entries;
        rwlock_t                lock;
        unsigned long           last_rand;
-       struct neigh_parms      *parms_list;
        kmem_cache_t            *kmem_cachep;
        struct neigh_statistics *stats;
        struct neighbour        **hash_buckets;
@@ -252,6 +250,9 @@ extern int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg);
 extern int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg);
 extern void neigh_app_ns(struct neighbour *n);
 
+extern int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb);
+extern int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg);
+
 extern void neigh_for_each(struct neigh_table *tbl, void (*cb)(struct neighbour *, void *), void *cookie);
 extern void __neigh_for_each_release(struct neigh_table *tbl, int (*cb)(struct neighbour *));
 extern void pneigh_for_each(struct neigh_table *tbl, void (*cb)(struct pneigh_entry *));
diff --git a/include/net/request_sock.h b/include/net/request_sock.h
new file mode 100644 (file)
index 0000000..72fd6f5
--- /dev/null
@@ -0,0 +1,255 @@
+/*
+ * NET         Generic infrastructure for Network protocols.
+ *
+ *             Definitions for request_sock 
+ *
+ * Authors:    Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+ *
+ *             From code originally in include/net/tcp.h
+ *
+ *             This program is free software; you can redistribute it and/or
+ *             modify it under the terms of the GNU General Public License
+ *             as published by the Free Software Foundation; either version
+ *             2 of the License, or (at your option) any later version.
+ */
+#ifndef _REQUEST_SOCK_H
+#define _REQUEST_SOCK_H
+
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/types.h>
+
+#include <net/sock.h>
+
+struct request_sock;
+struct sk_buff;
+struct dst_entry;
+struct proto;
+
+struct request_sock_ops {
+       int             family;
+       kmem_cache_t    *slab;
+       int             obj_size;
+       int             (*rtx_syn_ack)(struct sock *sk,
+                                      struct request_sock *req,
+                                      struct dst_entry *dst);
+       void            (*send_ack)(struct sk_buff *skb,
+                                   struct request_sock *req);
+       void            (*send_reset)(struct sk_buff *skb);
+       void            (*destructor)(struct request_sock *req);
+};
+
+/* struct request_sock - mini sock to represent a connection request
+ */
+struct request_sock {
+       struct request_sock             *dl_next; /* Must be first member! */
+       u16                             mss;
+       u8                              retrans;
+       u8                              __pad;
+       /* The following two fields can be easily recomputed I think -AK */
+       u32                             window_clamp; /* window clamp at creation time */
+       u32                             rcv_wnd;          /* rcv_wnd offered first time */
+       u32                             ts_recent;
+       unsigned long                   expires;
+       struct request_sock_ops         *rsk_ops;
+       struct sock                     *sk;
+};
+
+static inline struct request_sock *reqsk_alloc(struct request_sock_ops *ops)
+{
+       struct request_sock *req = kmem_cache_alloc(ops->slab, SLAB_ATOMIC);
+
+       if (req != NULL)
+               req->rsk_ops = ops;
+
+       return req;
+}
+
+static inline void __reqsk_free(struct request_sock *req)
+{
+       kmem_cache_free(req->rsk_ops->slab, req);
+}
+
+static inline void reqsk_free(struct request_sock *req)
+{
+       req->rsk_ops->destructor(req);
+       __reqsk_free(req);
+}
+
+extern int sysctl_max_syn_backlog;
+
+/** struct listen_sock - listen state
+ *
+ * @max_qlen_log - log_2 of maximal queued SYNs/REQUESTs
+ */
+struct listen_sock {
+       u8                      max_qlen_log;
+       /* 3 bytes hole, try to use */
+       int                     qlen;
+       int                     qlen_young;
+       int                     clock_hand;
+       u32                     hash_rnd;
+       struct request_sock     *syn_table[0];
+};
+
+/** struct request_sock_queue - queue of request_socks
+ *
+ * @rskq_accept_head - FIFO head of established children
+ * @rskq_accept_tail - FIFO tail of established children
+ * @syn_wait_lock - serializer
+ *
+ * %syn_wait_lock is necessary only to avoid proc interface having to grab the main
+ * lock sock while browsing the listening hash (otherwise it's deadlock prone).
+ *
+ * This lock is acquired in read mode only from listening_get_next() seq_file
+ * op and it's acquired in write mode _only_ from code that is actively
+ * changing rskq_accept_head. All readers that are holding the master sock lock
+ * don't need to grab this lock in read mode too as rskq_accept_head. writes
+ * are always protected from the main sock lock.
+ */
+struct request_sock_queue {
+       struct request_sock     *rskq_accept_head;
+       struct request_sock     *rskq_accept_tail;
+       rwlock_t                syn_wait_lock;
+       struct listen_sock      *listen_opt;
+};
+
+extern int reqsk_queue_alloc(struct request_sock_queue *queue,
+                            const int nr_table_entries);
+
+static inline struct listen_sock *reqsk_queue_yank_listen_sk(struct request_sock_queue *queue)
+{
+       struct listen_sock *lopt;
+
+       write_lock_bh(&queue->syn_wait_lock);
+       lopt = queue->listen_opt;
+       queue->listen_opt = NULL;
+       write_unlock_bh(&queue->syn_wait_lock);
+
+       return lopt;
+}
+
+static inline void reqsk_queue_destroy(struct request_sock_queue *queue)
+{
+       kfree(reqsk_queue_yank_listen_sk(queue));
+}
+
+static inline struct request_sock *
+       reqsk_queue_yank_acceptq(struct request_sock_queue *queue)
+{
+       struct request_sock *req = queue->rskq_accept_head;
+
+       queue->rskq_accept_head = queue->rskq_accept_head = NULL;
+       return req;
+}
+
+static inline int reqsk_queue_empty(struct request_sock_queue *queue)
+{
+       return queue->rskq_accept_head == NULL;
+}
+
+static inline void reqsk_queue_unlink(struct request_sock_queue *queue,
+                                     struct request_sock *req,
+                                     struct request_sock **prev_req)
+{
+       write_lock(&queue->syn_wait_lock);
+       *prev_req = req->dl_next;
+       write_unlock(&queue->syn_wait_lock);
+}
+
+static inline void reqsk_queue_add(struct request_sock_queue *queue,
+                                  struct request_sock *req,
+                                  struct sock *parent,
+                                  struct sock *child)
+{
+       req->sk = child;
+       sk_acceptq_added(parent);
+
+       if (queue->rskq_accept_head == NULL)
+               queue->rskq_accept_head = req;
+       else
+               queue->rskq_accept_tail->dl_next = req;
+
+       queue->rskq_accept_tail = req;
+       req->dl_next = NULL;
+}
+
+static inline struct request_sock *reqsk_queue_remove(struct request_sock_queue *queue)
+{
+       struct request_sock *req = queue->rskq_accept_head;
+
+       BUG_TRAP(req != NULL);
+
+       queue->rskq_accept_head = req->dl_next;
+       if (queue->rskq_accept_head == NULL)
+               queue->rskq_accept_tail = NULL;
+
+       return req;
+}
+
+static inline struct sock *reqsk_queue_get_child(struct request_sock_queue *queue,
+                                                struct sock *parent)
+{
+       struct request_sock *req = reqsk_queue_remove(queue);
+       struct sock *child = req->sk;
+
+       BUG_TRAP(child != NULL);
+
+       sk_acceptq_removed(parent);
+       __reqsk_free(req);
+       return child;
+}
+
+static inline int reqsk_queue_removed(struct request_sock_queue *queue,
+                                     struct request_sock *req)
+{
+       struct listen_sock *lopt = queue->listen_opt;
+
+       if (req->retrans == 0)
+               --lopt->qlen_young;
+
+       return --lopt->qlen;
+}
+
+static inline int reqsk_queue_added(struct request_sock_queue *queue)
+{
+       struct listen_sock *lopt = queue->listen_opt;
+       const int prev_qlen = lopt->qlen;
+
+       lopt->qlen_young++;
+       lopt->qlen++;
+       return prev_qlen;
+}
+
+static inline int reqsk_queue_len(struct request_sock_queue *queue)
+{
+       return queue->listen_opt != NULL ? queue->listen_opt->qlen : 0;
+}
+
+static inline int reqsk_queue_len_young(struct request_sock_queue *queue)
+{
+       return queue->listen_opt->qlen_young;
+}
+
+static inline int reqsk_queue_is_full(struct request_sock_queue *queue)
+{
+       return queue->listen_opt->qlen >> queue->listen_opt->max_qlen_log;
+}
+
+static inline void reqsk_queue_hash_req(struct request_sock_queue *queue,
+                                       u32 hash, struct request_sock *req,
+                                       unsigned timeout)
+{
+       struct listen_sock *lopt = queue->listen_opt;
+
+       req->expires = jiffies + timeout;
+       req->retrans = 0;
+       req->sk = NULL;
+       req->dl_next = lopt->syn_table[hash];
+
+       write_lock(&queue->syn_wait_lock);
+       lopt->syn_table[hash] = req;
+       write_unlock(&queue->syn_wait_lock);
+}
+
+#endif /* _REQUEST_SOCK_H */
index efe92b239ef16442b839c5c7499623213f4df444..c3cd069a9aca5f17c0c09b6b6a0f2f7a53be6fa9 100644 (file)
@@ -107,7 +107,7 @@ struct rt_cache_stat
 
 extern struct rt_cache_stat *rt_cache_stat;
 #define RT_CACHE_STAT_INC(field)                                         \
-               (per_cpu_ptr(rt_cache_stat, _smp_processor_id())->field++)
+               (per_cpu_ptr(rt_cache_stat, raw_smp_processor_id())->field++)
 
 extern struct ip_rt_acct *ip_rt_acct;
 
@@ -181,9 +181,6 @@ static inline int ip_route_newports(struct rtable **rp, u16 sport, u16 dport,
                memcpy(&fl, &(*rp)->fl, sizeof(fl));
                fl.fl_ip_sport = sport;
                fl.fl_ip_dport = dport;
-#if defined(CONFIG_IP_ROUTE_MULTIPATH_CACHED)
-               fl.flags |= FLOWI_FLAG_MULTIPATHOLDROUTE;
-#endif
                ip_rt_put(*rp);
                *rp = NULL;
                return ip_route_output_flow(rp, &fl, sk, 0);
index c57504b3b51819522dc9f868aa9a208d61dd3892..7b97405e2dbf8054ede8f52d44274804d58b1d87 100644 (file)
@@ -172,4 +172,126 @@ tcf_destroy(struct tcf_proto *tp)
        kfree(tp);
 }
 
+static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch,
+                                      struct sk_buff_head *list)
+{
+       __skb_queue_tail(list, skb);
+       sch->qstats.backlog += skb->len;
+       sch->bstats.bytes += skb->len;
+       sch->bstats.packets++;
+
+       return NET_XMIT_SUCCESS;
+}
+
+static inline int qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch)
+{
+       return __qdisc_enqueue_tail(skb, sch, &sch->q);
+}
+
+static inline struct sk_buff *__qdisc_dequeue_head(struct Qdisc *sch,
+                                                  struct sk_buff_head *list)
+{
+       struct sk_buff *skb = __skb_dequeue(list);
+
+       if (likely(skb != NULL))
+               sch->qstats.backlog -= skb->len;
+
+       return skb;
+}
+
+static inline struct sk_buff *qdisc_dequeue_head(struct Qdisc *sch)
+{
+       return __qdisc_dequeue_head(sch, &sch->q);
+}
+
+static inline struct sk_buff *__qdisc_dequeue_tail(struct Qdisc *sch,
+                                                  struct sk_buff_head *list)
+{
+       struct sk_buff *skb = __skb_dequeue_tail(list);
+
+       if (likely(skb != NULL))
+               sch->qstats.backlog -= skb->len;
+
+       return skb;
+}
+
+static inline struct sk_buff *qdisc_dequeue_tail(struct Qdisc *sch)
+{
+       return __qdisc_dequeue_tail(sch, &sch->q);
+}
+
+static inline int __qdisc_requeue(struct sk_buff *skb, struct Qdisc *sch,
+                                 struct sk_buff_head *list)
+{
+       __skb_queue_head(list, skb);
+       sch->qstats.backlog += skb->len;
+       sch->qstats.requeues++;
+
+       return NET_XMIT_SUCCESS;
+}
+
+static inline int qdisc_requeue(struct sk_buff *skb, struct Qdisc *sch)
+{
+       return __qdisc_requeue(skb, sch, &sch->q);
+}
+
+static inline void __qdisc_reset_queue(struct Qdisc *sch,
+                                      struct sk_buff_head *list)
+{
+       /*
+        * We do not know the backlog in bytes of this list, it
+        * is up to the caller to correct it
+        */
+       skb_queue_purge(list);
+}
+
+static inline void qdisc_reset_queue(struct Qdisc *sch)
+{
+       __qdisc_reset_queue(sch, &sch->q);
+       sch->qstats.backlog = 0;
+}
+
+static inline unsigned int __qdisc_queue_drop(struct Qdisc *sch,
+                                             struct sk_buff_head *list)
+{
+       struct sk_buff *skb = __qdisc_dequeue_tail(sch, list);
+
+       if (likely(skb != NULL)) {
+               unsigned int len = skb->len;
+               kfree_skb(skb);
+               return len;
+       }
+
+       return 0;
+}
+
+static inline unsigned int qdisc_queue_drop(struct Qdisc *sch)
+{
+       return __qdisc_queue_drop(sch, &sch->q);
+}
+
+static inline int qdisc_drop(struct sk_buff *skb, struct Qdisc *sch)
+{
+       kfree_skb(skb);
+       sch->qstats.drops++;
+
+       return NET_XMIT_DROP;
+}
+
+static inline int qdisc_reshape_fail(struct sk_buff *skb, struct Qdisc *sch)
+{
+       sch->qstats.drops++;
+
+#ifdef CONFIG_NET_CLS_POLICE
+       if (sch->reshape_fail == NULL || sch->reshape_fail(skb, sch))
+               goto drop;
+
+       return NET_XMIT_SUCCESS;
+
+drop:
+#endif
+       kfree_skb(skb);
+       return NET_XMIT_DROP;
+}
+
 #endif
index ebc5282e6d584dc9dc0551c44b4387e7b1e3eb9a..dc107ffad483f0c1863f77a5a415050435c1dd8d 100644 (file)
@@ -65,9 +65,11 @@ typedef enum {
        SCTP_CMD_TIMER_START,   /* Start a timer.  */
        SCTP_CMD_TIMER_RESTART, /* Restart a timer. */
        SCTP_CMD_TIMER_STOP,    /* Stop a timer. */
-       SCTP_CMD_COUNTER_RESET, /* Reset a counter. */
-       SCTP_CMD_COUNTER_INC,   /* Increment a counter. */
+       SCTP_CMD_INIT_CHOOSE_TRANSPORT, /* Choose transport for an INIT. */
+       SCTP_CMD_INIT_COUNTER_RESET, /* Reset init counter. */
+       SCTP_CMD_INIT_COUNTER_INC,   /* Increment init counter. */
        SCTP_CMD_INIT_RESTART,  /* High level, do init timer work. */
+       SCTP_CMD_COOKIEECHO_RESTART,  /* High level, do cookie-echo timer work. */
        SCTP_CMD_INIT_FAILED,   /* High level, do init failure work. */
        SCTP_CMD_REPORT_DUP,    /* Report a duplicate TSN.  */
        SCTP_CMD_STRIKE,        /* Mark a strike against a transport.  */
@@ -118,7 +120,6 @@ typedef union {
        int error;
        sctp_state_t state;
        sctp_event_timeout_t to;
-       sctp_counter_t counter;
        void *ptr;
        struct sctp_chunk *chunk;
        struct sctp_association *asoc;
@@ -165,7 +166,6 @@ SCTP_ARG_CONSTRUCTOR(U16,   __u16, u16)
 SCTP_ARG_CONSTRUCTOR(U8,       __u8, u8)
 SCTP_ARG_CONSTRUCTOR(ERROR,     int, error)
 SCTP_ARG_CONSTRUCTOR(STATE,    sctp_state_t, state)
-SCTP_ARG_CONSTRUCTOR(COUNTER,  sctp_counter_t, counter)
 SCTP_ARG_CONSTRUCTOR(TO,       sctp_event_timeout_t, to)
 SCTP_ARG_CONSTRUCTOR(PTR,      void *, ptr)
 SCTP_ARG_CONSTRUCTOR(CHUNK,    struct sctp_chunk *, chunk)
index 2b76c0f4babc7c747b8fbedf7bbb6447e0bea841..4868c7f7749dab76a2abbffdf81ca28e2d0609b8 100644 (file)
@@ -263,13 +263,6 @@ enum { SCTP_MIN_PMTU = 576 };
 enum { SCTP_MAX_DUP_TSNS = 16 };
 enum { SCTP_MAX_GABS = 16 };
 
-typedef enum {
-       SCTP_COUNTER_INIT_ERROR,
-} sctp_counter_t;
-
-/* How many counters does an association need? */
-#define SCTP_NUMBER_COUNTERS   5
-
 /* Here we define the default timers.  */
 
 /* cookie timer def = ? seconds */
index 960abfa48d6819215c30091112a25642c72ab872..ef2738159ab344e4291411980dae856d7c02c619 100644 (file)
@@ -223,6 +223,22 @@ DECLARE_SNMP_STAT(struct sctp_mib, sctp_statistics);
 extern int sctp_debug_flag;
 #define SCTP_DEBUG_PRINTK(whatever...) \
        ((void) (sctp_debug_flag && printk(KERN_DEBUG whatever)))
+#define SCTP_DEBUG_PRINTK_IPADDR(lead, trail, leadparm, saddr, otherparms...) \
+       if (sctp_debug_flag) { \
+               if (saddr->sa.sa_family == AF_INET6) { \
+                       printk(KERN_DEBUG \
+                              lead "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x" trail, \
+                              leadparm, \
+                              NIP6(saddr->v6.sin6_addr), \
+                              otherparms); \
+               } else { \
+                       printk(KERN_DEBUG \
+                              lead "%u.%u.%u.%u" trail, \
+                              leadparm, \
+                              NIPQUAD(saddr->v4.sin_addr.s_addr), \
+                              otherparms); \
+               } \
+       }
 #define SCTP_ENABLE_DEBUG { sctp_debug_flag = 1; }
 #define SCTP_DISABLE_DEBUG { sctp_debug_flag = 0; }
 
@@ -236,6 +252,7 @@ extern int sctp_debug_flag;
 #else  /* SCTP_DEBUG */
 
 #define SCTP_DEBUG_PRINTK(whatever...)
+#define SCTP_DEBUG_PRINTK_IPADDR(whatever...)
 #define SCTP_ENABLE_DEBUG
 #define SCTP_DISABLE_DEBUG
 #define SCTP_ASSERT(expr, str, func)
index f4fcee104707ae7961605b632aba1bf620c25603..a53e08a45e32fb8e3c271f30d5792b1a7e567cf1 100644 (file)
@@ -116,7 +116,8 @@ sctp_state_fn_t sctp_sf_eat_data_fast_4_4;
 sctp_state_fn_t sctp_sf_eat_sack_6_2;
 sctp_state_fn_t sctp_sf_tabort_8_4_8;
 sctp_state_fn_t sctp_sf_operr_notify;
-sctp_state_fn_t sctp_sf_t1_timer_expire;
+sctp_state_fn_t sctp_sf_t1_init_timer_expire;
+sctp_state_fn_t sctp_sf_t1_cookie_timer_expire;
 sctp_state_fn_t sctp_sf_t2_timer_expire;
 sctp_state_fn_t sctp_sf_t4_timer_expire;
 sctp_state_fn_t sctp_sf_t5_timer_expire;
@@ -258,7 +259,10 @@ struct sctp_chunk *sctp_make_fwdtsn(const struct sctp_association *asoc,
 void sctp_chunk_assign_tsn(struct sctp_chunk *);
 void sctp_chunk_assign_ssn(struct sctp_chunk *);
 
-void sctp_stop_t1_and_abort(sctp_cmd_seq_t *commands, __u16 error);
+sctp_disposition_t  sctp_stop_t1_and_abort(sctp_cmd_seq_t *commands,
+                                          __u16 error,
+                                          const struct sctp_association *asoc,
+                                          struct sctp_transport *transport);
 
 /* Prototypes for statetable processing. */
 
index 6c24d9cd3d66c2849dbcfe544c0739232bb4e690..dfad4d3c581c483c149321df4346b6e52532cacb 100644 (file)
@@ -867,10 +867,13 @@ struct sctp_transport {
         */
        unsigned long last_time_ecne_reduced;
 
-       /* active      : The current active state of this destination,
-        *             :  i.e. DOWN, UP, etc.
+       /* The number of times INIT has been sent on this transport. */
+       int init_sent_count;
+
+       /* state       : The current state of this destination,
+        *             : i.e. SCTP_ACTIVE, SCTP_INACTIVE, SCTP_UNKOWN.
         */
-       int active;
+       int state;
 
        /* hb_allowed  : The current heartbeat state of this destination,
         *             :  i.e. ALLOW-HB, NO-HEARTBEAT, etc.
@@ -1222,9 +1225,6 @@ struct sctp_endpoint {
 
        /* sendbuf acct. policy.        */
        __u32 sndbuf_policy;
-
-       /* Name for debugging output... */
-       char *debug_name;
 };
 
 /* Recover the outter endpoint structure. */
@@ -1314,11 +1314,23 @@ struct sctp_association {
                 *             : association. Normally this information is
                 *             : hashed or keyed for quick lookup and access
                 *             : of the TCB.
+                *             : The list is also initialized with the list
+                *             : of addresses passed with the sctp_connectx()
+                *             : call.
                 *
                 * It is a list of SCTP_transport's.
                 */
                struct list_head transport_addr_list;
 
+               /* transport_count
+                *
+                * Peer        : A count of the number of peer addresses
+                * Transport   : in the Peer Transport Address List.
+                * Address     :
+                * Count       :
+                */
+               __u16 transport_count;
+
                /* port
                 *   The transport layer port number.
                 */
@@ -1486,6 +1498,9 @@ struct sctp_association {
        /* Transport to which SHUTDOWN chunk was last sent.  */
        struct sctp_transport *shutdown_last_sent_to;
 
+       /* Transport to which INIT chunk was last sent.  */
+       struct sctp_transport *init_last_sent_to;
+
        /* Next TSN    : The next TSN number to be assigned to a new
         *             : DATA chunk.  This is sent in the INIT or INIT
         *             : ACK chunk to the peer and incremented each
@@ -1549,8 +1564,11 @@ struct sctp_association {
        /* The message size at which SCTP fragmentation will occur. */
        __u32 frag_point;
 
-       /* Currently only one counter is used to count INIT errors. */
-       int counters[SCTP_NUMBER_COUNTERS];
+       /* Counter used to count INIT errors. */
+       int init_err_counter;
+
+       /* Count the number of INIT cycles (for doubling timeout). */
+       int init_cycle;
 
        /* Default send parameters. */
        __u16 default_stream;
@@ -1708,6 +1726,8 @@ void sctp_association_free(struct sctp_association *);
 void sctp_association_put(struct sctp_association *);
 void sctp_association_hold(struct sctp_association *);
 
+struct sctp_transport *sctp_assoc_choose_init_transport(
+       struct sctp_association *);
 struct sctp_transport *sctp_assoc_choose_shutdown_transport(
        struct sctp_association *);
 void sctp_assoc_update_retran_path(struct sctp_association *);
@@ -1717,9 +1737,12 @@ int sctp_assoc_lookup_laddr(struct sctp_association *asoc,
                            const union sctp_addr *laddr);
 struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *,
                                     const union sctp_addr *address,
-                                    const int gfp);
+                                    const int gfp,
+                                    const int peer_state);
 void sctp_assoc_del_peer(struct sctp_association *asoc,
                         const union sctp_addr *addr);
+void sctp_assoc_rm_peer(struct sctp_association *asoc,
+                        struct sctp_transport *peer);
 void sctp_assoc_control_transport(struct sctp_association *,
                                  struct sctp_transport *,
                                  sctp_transport_cmd_t, sctp_sn_error_t);
index 2758e8ce4f25c30b2c7b7e84c7e27b5485198462..f6328aeddcce064a9eebd2c570ede0a2b5b1d33e 100644 (file)
@@ -111,6 +111,8 @@ enum sctp_optname {
 #define SCTP_GET_LOCAL_ADDRS_NUM       SCTP_GET_LOCAL_ADDRS_NUM
        SCTP_GET_LOCAL_ADDRS,   /* Get all local addresss. */
 #define SCTP_GET_LOCAL_ADDRS   SCTP_GET_LOCAL_ADDRS
+       SCTP_SOCKOPT_CONNECTX, /* CONNECTX requests. */
+#define SCTP_SOCKOPT_CONNECTX  SCTP_SOCKOPT_CONNECTX
 };
 
 /*
@@ -527,6 +529,7 @@ struct sctp_paddrinfo {
 enum sctp_spinfo_state {
        SCTP_INACTIVE,
        SCTP_ACTIVE,
+       SCTP_UNKNOWN = 0xffff  /* Value used for transport state unknown */
 };
 
 /*
index a15ab256276ed971b4d66c55b093dd3e4818c1bb..a36bed8ea21003b70d6edfcf561fb7ff2b1afc71 100644 (file)
@@ -128,18 +128,18 @@ struct linux_mib {
 #define SNMP_STAT_USRPTR(name) (name[1])
 
 #define SNMP_INC_STATS_BH(mib, field)  \
-       (per_cpu_ptr(mib[0], _smp_processor_id())->mibs[field]++)
+       (per_cpu_ptr(mib[0], raw_smp_processor_id())->mibs[field]++)
 #define SNMP_INC_STATS_OFFSET_BH(mib, field, offset)   \
-       (per_cpu_ptr(mib[0], _smp_processor_id())->mibs[field + (offset)]++)
+       (per_cpu_ptr(mib[0], raw_smp_processor_id())->mibs[field + (offset)]++)
 #define SNMP_INC_STATS_USER(mib, field) \
-       (per_cpu_ptr(mib[1], _smp_processor_id())->mibs[field]++)
+       (per_cpu_ptr(mib[1], raw_smp_processor_id())->mibs[field]++)
 #define SNMP_INC_STATS(mib, field)     \
-       (per_cpu_ptr(mib[!in_softirq()], _smp_processor_id())->mibs[field]++)
+       (per_cpu_ptr(mib[!in_softirq()], raw_smp_processor_id())->mibs[field]++)
 #define SNMP_DEC_STATS(mib, field)     \
-       (per_cpu_ptr(mib[!in_softirq()], _smp_processor_id())->mibs[field]--)
+       (per_cpu_ptr(mib[!in_softirq()], raw_smp_processor_id())->mibs[field]--)
 #define SNMP_ADD_STATS_BH(mib, field, addend)  \
-       (per_cpu_ptr(mib[0], _smp_processor_id())->mibs[field] += addend)
+       (per_cpu_ptr(mib[0], raw_smp_processor_id())->mibs[field] += addend)
 #define SNMP_ADD_STATS_USER(mib, field, addend)        \
-       (per_cpu_ptr(mib[1], _smp_processor_id())->mibs[field] += addend)
+       (per_cpu_ptr(mib[1], raw_smp_processor_id())->mibs[field] += addend)
 
 #endif
index a9ef3a6a13f3374a68b4c0817777531781227141..e593af5b1ecce5db772ae22a17521be6833dd699 100644 (file)
@@ -484,6 +484,8 @@ extern void sk_stream_kill_queues(struct sock *sk);
 
 extern int sk_wait_data(struct sock *sk, long *timeo);
 
+struct request_sock_ops;
+
 /* Networking protocol blocks we attach to sockets.
  * socket layer -> transport layer interface
  * transport -> network interface is defined by struct inet_proto
@@ -547,6 +549,8 @@ struct proto {
        kmem_cache_t            *slab;
        unsigned int            obj_size;
 
+       struct request_sock_ops *rsk_prot;
+
        struct module           *owner;
 
        char                    name[32];
index e71f8ba3e101e580bd41c163a76ad20e6109fb1a..f730935b824ad6ca8e233705d253e322e291eb9e 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/cache.h>
 #include <linux/percpu.h>
 #include <net/checksum.h>
+#include <net/request_sock.h>
 #include <net/sock.h>
 #include <net/snmp.h>
 #include <net/ip.h>
@@ -563,7 +564,6 @@ static __inline__ int tcp_sk_listen_hashfn(struct sock *sk)
 #define TCP_NAGLE_PUSH         4       /* Cork is overriden for already queued data */
 
 /* sysctl variables for tcp */
-extern int sysctl_max_syn_backlog;
 extern int sysctl_tcp_timestamps;
 extern int sysctl_tcp_window_scaling;
 extern int sysctl_tcp_sack;
@@ -613,74 +613,6 @@ extern atomic_t tcp_memory_allocated;
 extern atomic_t tcp_sockets_allocated;
 extern int tcp_memory_pressure;
 
-struct open_request;
-
-struct or_calltable {
-       int  family;
-       int  (*rtx_syn_ack)     (struct sock *sk, struct open_request *req, struct dst_entry*);
-       void (*send_ack)        (struct sk_buff *skb, struct open_request *req);
-       void (*destructor)      (struct open_request *req);
-       void (*send_reset)      (struct sk_buff *skb);
-};
-
-struct tcp_v4_open_req {
-       __u32                   loc_addr;
-       __u32                   rmt_addr;
-       struct ip_options       *opt;
-};
-
-#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
-struct tcp_v6_open_req {
-       struct in6_addr         loc_addr;
-       struct in6_addr         rmt_addr;
-       struct sk_buff          *pktopts;
-       int                     iif;
-};
-#endif
-
-/* this structure is too big */
-struct open_request {
-       struct open_request     *dl_next; /* Must be first member! */
-       __u32                   rcv_isn;
-       __u32                   snt_isn;
-       __u16                   rmt_port;
-       __u16                   mss;
-       __u8                    retrans;
-       __u8                    __pad;
-       __u16   snd_wscale : 4, 
-               rcv_wscale : 4, 
-               tstamp_ok : 1,
-               sack_ok : 1,
-               wscale_ok : 1,
-               ecn_ok : 1,
-               acked : 1;
-       /* The following two fields can be easily recomputed I think -AK */
-       __u32                   window_clamp;   /* window clamp at creation time */
-       __u32                   rcv_wnd;        /* rcv_wnd offered first time */
-       __u32                   ts_recent;
-       unsigned long           expires;
-       struct or_calltable     *class;
-       struct sock             *sk;
-       union {
-               struct tcp_v4_open_req v4_req;
-#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
-               struct tcp_v6_open_req v6_req;
-#endif
-       } af;
-};
-
-/* SLAB cache for open requests. */
-extern kmem_cache_t *tcp_openreq_cachep;
-
-#define tcp_openreq_alloc()            kmem_cache_alloc(tcp_openreq_cachep, SLAB_ATOMIC)
-#define tcp_openreq_fastfree(req)      kmem_cache_free(tcp_openreq_cachep, req)
-
-static inline void tcp_openreq_free(struct open_request *req)
-{
-       req->class->destructor(req);
-       tcp_openreq_fastfree(req);
-}
-
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 #define TCP_INET_FAMILY(fam) ((fam) == AF_INET)
 #else
@@ -708,7 +640,7 @@ struct tcp_func {
 
        struct sock *           (*syn_recv_sock)        (struct sock *sk,
                                                         struct sk_buff *skb,
-                                                        struct open_request *req,
+                                                        struct request_sock *req,
                                                         struct dst_entry *dst);
     
        int                     (*remember_stamp)       (struct sock *sk);
@@ -852,8 +784,8 @@ extern enum tcp_tw_status   tcp_timewait_state_process(struct tcp_tw_bucket *tw,
                                                           unsigned len);
 
 extern struct sock *           tcp_check_req(struct sock *sk,struct sk_buff *skb,
-                                             struct open_request *req,
-                                             struct open_request **prev);
+                                             struct request_sock *req,
+                                             struct request_sock **prev);
 extern int                     tcp_child_process(struct sock *parent,
                                                  struct sock *child,
                                                  struct sk_buff *skb);
@@ -903,12 +835,12 @@ extern int                        tcp_v4_conn_request(struct sock *sk,
                                                    struct sk_buff *skb);
 
 extern struct sock *           tcp_create_openreq_child(struct sock *sk,
-                                                        struct open_request *req,
+                                                        struct request_sock *req,
                                                         struct sk_buff *skb);
 
 extern struct sock *           tcp_v4_syn_recv_sock(struct sock *sk,
                                                     struct sk_buff *skb,
-                                                    struct open_request *req,
+                                                    struct request_sock *req,
                                                        struct dst_entry *dst);
 
 extern int                     tcp_v4_do_rcv(struct sock *sk,
@@ -922,7 +854,7 @@ extern int                  tcp_connect(struct sock *sk);
 
 extern struct sk_buff *                tcp_make_synack(struct sock *sk,
                                                struct dst_entry *dst,
-                                               struct open_request *req);
+                                               struct request_sock *req);
 
 extern int                     tcp_disconnect(struct sock *sk, int flags);
 
@@ -1750,99 +1682,71 @@ static inline int tcp_full_space(const struct sock *sk)
        return tcp_win_from_space(sk->sk_rcvbuf); 
 }
 
-static inline void tcp_acceptq_queue(struct sock *sk, struct open_request *req,
+static inline void tcp_acceptq_queue(struct sock *sk, struct request_sock *req,
                                         struct sock *child)
 {
-       struct tcp_sock *tp = tcp_sk(sk);
-
-       req->sk = child;
-       sk_acceptq_added(sk);
-
-       if (!tp->accept_queue_tail) {
-               tp->accept_queue = req;
-       } else {
-               tp->accept_queue_tail->dl_next = req;
-       }
-       tp->accept_queue_tail = req;
-       req->dl_next = NULL;
+       reqsk_queue_add(&tcp_sk(sk)->accept_queue, req, sk, child);
 }
 
-struct tcp_listen_opt
-{
-       u8                      max_qlen_log;   /* log_2 of maximal queued SYNs */
-       int                     qlen;
-       int                     qlen_young;
-       int                     clock_hand;
-       u32                     hash_rnd;
-       struct open_request     *syn_table[TCP_SYNQ_HSIZE];
-};
-
 static inline void
-tcp_synq_removed(struct sock *sk, struct open_request *req)
+tcp_synq_removed(struct sock *sk, struct request_sock *req)
 {
-       struct tcp_listen_opt *lopt = tcp_sk(sk)->listen_opt;
-
-       if (--lopt->qlen == 0)
+       if (reqsk_queue_removed(&tcp_sk(sk)->accept_queue, req) == 0)
                tcp_delete_keepalive_timer(sk);
-       if (req->retrans == 0)
-               lopt->qlen_young--;
 }
 
 static inline void tcp_synq_added(struct sock *sk)
 {
-       struct tcp_listen_opt *lopt = tcp_sk(sk)->listen_opt;
-
-       if (lopt->qlen++ == 0)
+       if (reqsk_queue_added(&tcp_sk(sk)->accept_queue) == 0)
                tcp_reset_keepalive_timer(sk, TCP_TIMEOUT_INIT);
-       lopt->qlen_young++;
 }
 
 static inline int tcp_synq_len(struct sock *sk)
 {
-       return tcp_sk(sk)->listen_opt->qlen;
+       return reqsk_queue_len(&tcp_sk(sk)->accept_queue);
 }
 
 static inline int tcp_synq_young(struct sock *sk)
 {
-       return tcp_sk(sk)->listen_opt->qlen_young;
+       return reqsk_queue_len_young(&tcp_sk(sk)->accept_queue);
 }
 
 static inline int tcp_synq_is_full(struct sock *sk)
 {
-       return tcp_synq_len(sk) >> tcp_sk(sk)->listen_opt->max_qlen_log;
+       return reqsk_queue_is_full(&tcp_sk(sk)->accept_queue);
 }
 
-static inline void tcp_synq_unlink(struct tcp_sock *tp, struct open_request *req,
-                                      struct open_request **prev)
+static inline void tcp_synq_unlink(struct tcp_sock *tp, struct request_sock *req,
+                                  struct request_sock **prev)
 {
-       write_lock(&tp->syn_wait_lock);
-       *prev = req->dl_next;
-       write_unlock(&tp->syn_wait_lock);
+       reqsk_queue_unlink(&tp->accept_queue, req, prev);
 }
 
-static inline void tcp_synq_drop(struct sock *sk, struct open_request *req,
-                                    struct open_request **prev)
+static inline void tcp_synq_drop(struct sock *sk, struct request_sock *req,
+                                    struct request_sock **prev)
 {
        tcp_synq_unlink(tcp_sk(sk), req, prev);
        tcp_synq_removed(sk, req);
-       tcp_openreq_free(req);
+       reqsk_free(req);
 }
 
-static __inline__ void tcp_openreq_init(struct open_request *req,
+static __inline__ void tcp_openreq_init(struct request_sock *req,
                                        struct tcp_options_received *rx_opt,
                                        struct sk_buff *skb)
 {
+       struct inet_request_sock *ireq = inet_rsk(req);
+
        req->rcv_wnd = 0;               /* So that tcp_send_synack() knows! */
-       req->rcv_isn = TCP_SKB_CB(skb)->seq;
+       tcp_rsk(req)->rcv_isn = TCP_SKB_CB(skb)->seq;
        req->mss = rx_opt->mss_clamp;
        req->ts_recent = rx_opt->saw_tstamp ? rx_opt->rcv_tsval : 0;
-       req->tstamp_ok = rx_opt->tstamp_ok;
-       req->sack_ok = rx_opt->sack_ok;
-       req->snd_wscale = rx_opt->snd_wscale;
-       req->wscale_ok = rx_opt->wscale_ok;
-       req->acked = 0;
-       req->ecn_ok = 0;
-       req->rmt_port = skb->h.th->source;
+       ireq->tstamp_ok = rx_opt->tstamp_ok;
+       ireq->sack_ok = rx_opt->sack_ok;
+       ireq->snd_wscale = rx_opt->snd_wscale;
+       ireq->wscale_ok = rx_opt->wscale_ok;
+       ireq->acked = 0;
+       ireq->ecn_ok = 0;
+       ireq->rmt_port = skb->h.th->source;
 }
 
 extern void tcp_enter_memory_pressure(void);
index dc1456389a9727f54425ab18f875fd3c7d51b2da..64980ee8c92a9ee77d6c57b1806f7acd290883cf 100644 (file)
@@ -2,6 +2,7 @@
 #define _NET_TCP_ECN_H_ 1
 
 #include <net/inet_ecn.h>
+#include <net/request_sock.h>
 
 #define TCP_HP_BITS (~(TCP_RESERVED_BITS|TCP_FLAG_PSH))
 
@@ -38,9 +39,9 @@ static inline void TCP_ECN_send_syn(struct sock *sk, struct tcp_sock *tp,
 }
 
 static __inline__ void
-TCP_ECN_make_synack(struct open_request *req, struct tcphdr *th)
+TCP_ECN_make_synack(struct request_sock *req, struct tcphdr *th)
 {
-       if (req->ecn_ok)
+       if (inet_rsk(req)->ecn_ok)
                th->ece = 1;
 }
 
@@ -111,16 +112,16 @@ static inline int TCP_ECN_rcv_ecn_echo(struct tcp_sock *tp, struct tcphdr *th)
 }
 
 static inline void TCP_ECN_openreq_child(struct tcp_sock *tp,
-                                        struct open_request *req)
+                                        struct request_sock *req)
 {
-       tp->ecn_flags = req->ecn_ok ? TCP_ECN_OK : 0;
+       tp->ecn_flags = inet_rsk(req)->ecn_ok ? TCP_ECN_OK : 0;
 }
 
 static __inline__ void
-TCP_ECN_create_request(struct open_request *req, struct tcphdr *th)
+TCP_ECN_create_request(struct request_sock *req, struct tcphdr *th)
 {
        if (sysctl_tcp_ecn && th->ece && th->cwr)
-               req->ecn_ok = 1;
+               inet_rsk(req)->ecn_ok = 1;
 }
 
 #endif
index e142a256d5dc394a8d52e50a3a4bd78b0a2b5c48..029522a4cedab6c3f5ef61f56ce61cb5fe4714e4 100644 (file)
@@ -158,6 +158,20 @@ enum {
        XFRM_STATE_DEAD
 };
 
+/* callback structure passed from either netlink or pfkey */
+struct km_event
+{
+       union {
+               u32 hard;
+               u32 proto;
+               u32 byid;
+       } data;
+
+       u32     seq;
+       u32     pid;
+       u32     event;
+};
+
 struct xfrm_type;
 struct xfrm_dst;
 struct xfrm_policy_afinfo {
@@ -179,6 +193,8 @@ struct xfrm_policy_afinfo {
 
 extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo);
 extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo);
+extern void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c);
+extern void km_state_notify(struct xfrm_state *x, struct km_event *c);
 
 #define XFRM_ACQ_EXPIRES       30
 
@@ -188,6 +204,7 @@ struct xfrm_state_afinfo {
        rwlock_t                lock;
        struct list_head        *state_bydst;
        struct list_head        *state_byspi;
+       int                     (*init_flags)(struct xfrm_state *x);
        void                    (*init_tempsel)(struct xfrm_state *x, struct flowi *fl,
                                                struct xfrm_tmpl *tmpl,
                                                xfrm_address_t *daddr, xfrm_address_t *saddr);
@@ -209,7 +226,7 @@ struct xfrm_type
        struct module           *owner;
        __u8                    proto;
 
-       int                     (*init_state)(struct xfrm_state *x, void *args);
+       int                     (*init_state)(struct xfrm_state *x);
        void                    (*destructor)(struct xfrm_state *);
        int                     (*input)(struct xfrm_state *, struct xfrm_decap_state *, struct sk_buff *skb);
        int                     (*post_input)(struct xfrm_state *, struct xfrm_decap_state *, struct sk_buff *skb);
@@ -290,11 +307,11 @@ struct xfrm_mgr
 {
        struct list_head        list;
        char                    *id;
-       int                     (*notify)(struct xfrm_state *x, int event);
+       int                     (*notify)(struct xfrm_state *x, struct km_event *c);
        int                     (*acquire)(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *xp, int dir);
        struct xfrm_policy      *(*compile_policy)(u16 family, int opt, u8 *data, int len, int *dir);
        int                     (*new_mapping)(struct xfrm_state *x, xfrm_address_t *ipaddr, u16 sport);
-       int                     (*notify_policy)(struct xfrm_policy *x, int dir, int event);
+       int                     (*notify_policy)(struct xfrm_policy *x, int dir, struct km_event *c);
 };
 
 extern int xfrm_register_km(struct xfrm_mgr *km);
@@ -515,6 +532,8 @@ struct xfrm_dst
        struct dst_entry *route;
        u32 route_mtu_cached;
        u32 child_mtu_cached;
+       u32 route_cookie;
+       u32 path_cookie;
 };
 
 static inline void xfrm_dst_destroy(struct xfrm_dst *xdst)
@@ -654,7 +673,7 @@ static inline int xfrm_sk_clone_policy(struct sock *sk)
        return 0;
 }
 
-extern void xfrm_policy_delete(struct xfrm_policy *pol, int dir);
+extern int xfrm_policy_delete(struct xfrm_policy *pol, int dir);
 
 static inline void xfrm_sk_free_policy(struct sock *sk)
 {
@@ -815,12 +834,13 @@ extern int xfrm_state_add(struct xfrm_state *x);
 extern int xfrm_state_update(struct xfrm_state *x);
 extern struct xfrm_state *xfrm_state_lookup(xfrm_address_t *daddr, u32 spi, u8 proto, unsigned short family);
 extern struct xfrm_state *xfrm_find_acq_byseq(u32 seq);
-extern void xfrm_state_delete(struct xfrm_state *x);
+extern int xfrm_state_delete(struct xfrm_state *x);
 extern void xfrm_state_flush(u8 proto);
 extern int xfrm_replay_check(struct xfrm_state *x, u32 seq);
 extern void xfrm_replay_advance(struct xfrm_state *x, u32 seq);
 extern int xfrm_state_check(struct xfrm_state *x, struct sk_buff *skb);
 extern int xfrm_state_mtu(struct xfrm_state *x, int mtu);
+extern int xfrm_init_state(struct xfrm_state *x);
 extern int xfrm4_rcv(struct sk_buff *skb);
 extern int xfrm4_output(struct sk_buff *skb);
 extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler);
index 659ecf48fb4ac3777001cd71f887a5fbe569a6ec..1fb233741513f726579ec49514e93f53f9a68885 100644 (file)
@@ -41,6 +41,7 @@ extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
 #define FORMAT_UNIT           0x04
 #define READ_BLOCK_LIMITS     0x05
 #define REASSIGN_BLOCKS       0x07
+#define INITIALIZE_ELEMENT_STATUS 0x07
 #define READ_6                0x08
 #define WRITE_6               0x0a
 #define SEEK_6                0x0b
@@ -65,6 +66,7 @@ extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
 #define READ_10               0x28
 #define WRITE_10              0x2a
 #define SEEK_10               0x2b
+#define POSITION_TO_ELEMENT   0x2b
 #define WRITE_VERIFY          0x2e
 #define VERIFY                0x2f
 #define SEARCH_HIGH           0x30
@@ -97,6 +99,7 @@ extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
 #define PERSISTENT_RESERVE_OUT 0x5f
 #define REPORT_LUNS           0xa0
 #define MOVE_MEDIUM           0xa5
+#define EXCHANGE_MEDIUM       0xa6
 #define READ_12               0xa8
 #define WRITE_12              0xaa
 #define WRITE_VERIFY_12       0xae
@@ -210,6 +213,7 @@ static inline int scsi_status_is_good(int status)
 #define TYPE_COMM           0x09    /* Communications device */
 #define TYPE_ENCLOSURE      0x0d    /* Enclosure Services Device */
 #define TYPE_RAID           0x0c
+#define TYPE_RBC           0x0e
 #define TYPE_NO_LUN         0x7f
 
 /*
index c018020d9160891b511e03bdff1db93796bf9928..63c91dd85ca15c0e889e2478d78adc1c9d9641a4 100644 (file)
@@ -154,7 +154,9 @@ struct scsi_target {
        unsigned int            id; /* target id ... replace
                                     * scsi_device.id eventually */
        unsigned long           create:1; /* signal that it needs to be added */
-       unsigned long           starget_data[0];
+       void                    *hostdata; /* available to low-level driver */
+       unsigned long           starget_data[0]; /* for the transport */
+       /* starget_data must be the last element!!!! */
 } __attribute__((aligned(sizeof(unsigned long))));
 
 #define to_scsi_target(d)      container_of(d, struct scsi_target, dev)
index 1cee1e100943dafe00c14d5329b73659062a4d1a..db9914adeac94b510b5f51a9cde33331f5f93d4d 100644 (file)
@@ -10,6 +10,7 @@ struct block_device;
 struct module;
 struct scsi_cmnd;
 struct scsi_device;
+struct scsi_target;
 struct Scsi_Host;
 struct scsi_host_cmd_pool;
 struct scsi_transport_template;
@@ -227,6 +228,30 @@ struct scsi_host_template {
         */
        void (* slave_destroy)(struct scsi_device *);
 
+       /*
+        * Before the mid layer attempts to scan for a new device attached
+        * to a target where no target currently exists, it will call this
+        * entry in your driver.  Should your driver need to allocate any
+        * structs or perform any other init items in order to send commands
+        * to a currently unused target, then this is where you can perform
+        * those allocations.
+        *
+        * Return values: 0 on success, non-0 on failure
+        *
+        * Status: OPTIONAL
+        */
+       int (* target_alloc)(struct scsi_target *);
+
+       /*
+        * Immediately prior to deallocating the target structure, and
+        * after all activity to attached scsi devices has ceased, the
+        * midlayer calls this point so that the driver may deallocate
+        * and terminate any references to the target.
+        *
+        * Status: OPTIONAL
+        */
+       void (* target_destroy)(struct scsi_target *);
+
        /*
         * fill in this function to allow the queue depth of this host
         * to be changeable (on a per device basis).  returns either
index 2dcee7a84752c7089fd9ddfa701efd45589f467b..a4f1837a33b150b925e471e1c2938d35a6c4eded 100644 (file)
@@ -21,6 +21,7 @@
 #define SCSI_TRANSPORT_H
 
 #include <linux/transport_class.h>
+#include <scsi/scsi_host.h>
 
 struct scsi_transport_template {
        /* the attribute containers */
@@ -32,8 +33,11 @@ struct scsi_transport_template {
         * space of this size will be left at the end of the
         * scsi_* structure */
        int     device_size;
+       int     device_private_offset;
        int     target_size;
+       int     target_private_offset;
        int     host_size;
+       /* no private offset for the host; there's an alternative mechanism */
 
        /*
         * True if the transport wants to use a host-based work-queue
@@ -45,4 +49,38 @@ struct scsi_transport_template {
        dev_to_shost((tc)->dev)
 
 
+/* Private area maintenance. The driver requested allocations come
+ * directly after the transport class allocations (if any).  The idea
+ * is that you *must* call these only once.  The code assumes that the
+ * initial values are the ones the transport specific code requires */
+static inline void
+scsi_transport_reserve_target(struct scsi_transport_template * t, int space)
+{
+       BUG_ON(t->target_private_offset != 0);
+       t->target_private_offset = ALIGN(t->target_size, sizeof(void *));
+       t->target_size = t->target_private_offset + space;
+}
+static inline void
+scsi_transport_reserve_device(struct scsi_transport_template * t, int space)
+{
+       BUG_ON(t->device_private_offset != 0);
+       t->device_private_offset = ALIGN(t->device_size, sizeof(void *));
+       t->device_size = t->device_private_offset + space;
+}
+static inline void *
+scsi_transport_target_data(struct scsi_target *starget)
+{
+       struct Scsi_Host *shost = dev_to_shost(&starget->dev);
+       return (u8 *)starget->starget_data
+               + shost->transportt->target_private_offset;
+
+}
+static inline void *
+scsi_transport_device_data(struct scsi_device *sdev)
+{
+       struct Scsi_Host *shost = sdev->host;
+       return (u8 *)sdev->sdev_data
+               + shost->transportt->device_private_offset;
+}
+
 #endif /* SCSI_TRANSPORT_H */
index 6dcf497bf46dc485e4b61800ff7d4429b3506919..a30d6cd4c0e8d805c49a18a2a68f34a8f37fe8ba 100644 (file)
@@ -27,8 +27,11 @@ struct scsi_transport_template;
 
 struct spi_transport_attrs {
        int period;             /* value in the PPR/SDTR command */
+       int min_period;
        int offset;
+       int max_offset;
        unsigned int width:1;   /* 0 - narrow, 1 - wide */
+       unsigned int max_width:1;
        unsigned int iu:1;      /* Information Units enabled */
        unsigned int dt:1;      /* DT clocking enabled */
        unsigned int qas:1;     /* Quick Arbitration and Selection enabled */
@@ -63,8 +66,11 @@ struct spi_host_attrs {
 
 /* accessor functions */
 #define spi_period(x)  (((struct spi_transport_attrs *)&(x)->starget_data)->period)
+#define spi_min_period(x) (((struct spi_transport_attrs *)&(x)->starget_data)->min_period)
 #define spi_offset(x)  (((struct spi_transport_attrs *)&(x)->starget_data)->offset)
+#define spi_max_offset(x) (((struct spi_transport_attrs *)&(x)->starget_data)->max_offset)
 #define spi_width(x)   (((struct spi_transport_attrs *)&(x)->starget_data)->width)
+#define spi_max_width(x) (((struct spi_transport_attrs *)&(x)->starget_data)->max_width)
 #define spi_iu(x)      (((struct spi_transport_attrs *)&(x)->starget_data)->iu)
 #define spi_dt(x)      (((struct spi_transport_attrs *)&(x)->starget_data)->dt)
 #define spi_qas(x)     (((struct spi_transport_attrs *)&(x)->starget_data)->qas)
index d920baed109a4c0bfb91d85e436626ccac886fbb..b1091d7542cea080abe6367bb2b4f3fc14ea680f 100644 (file)
@@ -164,6 +164,7 @@ config SYSCTL
 
 config AUDIT
        bool "Auditing support"
+       depends on NET
        default y if SECURITY_SELINUX
        help
          Enable auditing infrastructure that can be used with another
@@ -173,7 +174,7 @@ config AUDIT
 
 config AUDITSYSCALL
        bool "Enable system-call auditing support"
-       depends on AUDIT && (X86 || PPC64 || ARCH_S390 || IA64 || UML)
+       depends on AUDIT && (X86 || PPC || PPC64 || ARCH_S390 || IA64 || UML)
        default y if SECURITY_SELINUX
        help
          Enable low-overhead system-call auditing infrastructure that
@@ -442,7 +443,7 @@ config OBSOLETE_MODPARM
 
 config MODVERSIONS
        bool "Module versioning support (EXPERIMENTAL)"
-       depends on MODULES && EXPERIMENTAL && !UML
+       depends on MODULES && EXPERIMENTAL
        help
          Usually, you have to use modules compiled with your kernel.
          Saying Y here makes it sometimes possible to use modules
index 40bf367ffdf19f32e6c4a14a05ea366c3a0213a6..d324801729ba713938481fd4f3a8199fdc2eb6e9 100644 (file)
@@ -490,6 +490,7 @@ asmlinkage void __init start_kernel(void)
        vfs_caches_init_early();
        mem_init();
        kmem_cache_init();
+       setup_per_cpu_pageset();
        numa_policy_init();
        if (late_time_init)
                late_time_init();
index 9c4f1af0c794674404810d7caff0131218cbc950..ef35166fdc29b459e0beb24505df6766972b261b 100644 (file)
@@ -46,6 +46,8 @@
 #include <asm/types.h>
 #include <linux/mm.h>
 #include <linux/module.h>
+#include <linux/err.h>
+#include <linux/kthread.h>
 
 #include <linux/audit.h>
 
@@ -68,7 +70,7 @@ static int    audit_failure = AUDIT_FAIL_PRINTK;
 
 /* If audit records are to be written to the netlink socket, audit_pid
  * contains the (non-zero) pid. */
-static int     audit_pid;
+int            audit_pid;
 
 /* If audit_limit is non-zero, limit the rate of sending audit records
  * to that number per second.  This prevents DoS attacks, but results in
@@ -77,7 +79,10 @@ static int   audit_rate_limit;
 
 /* Number of outstanding audit_buffers allowed. */
 static int     audit_backlog_limit = 64;
-static atomic_t        audit_backlog       = ATOMIC_INIT(0);
+
+/* The identity of the user shutting down the audit system. */
+uid_t          audit_sig_uid = -1;
+pid_t          audit_sig_pid = -1;
 
 /* Records can be lost in several ways:
    0) [suppressed in audit_alloc]
@@ -91,19 +96,17 @@ static atomic_t    audit_lost = ATOMIC_INIT(0);
 /* The netlink socket. */
 static struct sock *audit_sock;
 
-/* There are two lists of audit buffers.  The txlist contains audit
- * buffers that cannot be sent immediately to the netlink device because
- * we are in an irq context (these are sent later in a tasklet).
- *
- * The second list is a list of pre-allocated audit buffers (if more
+/* The audit_freelist is a list of pre-allocated audit buffers (if more
  * than AUDIT_MAXFREE are in use, the audit buffer is freed instead of
  * being placed on the freelist). */
-static DEFINE_SPINLOCK(audit_txlist_lock);
 static DEFINE_SPINLOCK(audit_freelist_lock);
 static int        audit_freelist_count = 0;
-static LIST_HEAD(audit_txlist);
 static LIST_HEAD(audit_freelist);
 
+static struct sk_buff_head audit_skb_queue;
+static struct task_struct *kauditd_task;
+static DECLARE_WAIT_QUEUE_HEAD(kauditd_wait);
+
 /* There are three lists of rules -- one to search at task creation
  * time, one to search at syscall entry time, and another to search at
  * syscall exit time. */
@@ -112,7 +115,7 @@ static LIST_HEAD(audit_entlist);
 static LIST_HEAD(audit_extlist);
 
 /* The netlink socket is only to be read by 1 CPU, which lets us assume
- * that list additions and deletions never happen simultaneiously in
+ * that list additions and deletions never happen simultaneously in
  * auditsc.c */
 static DECLARE_MUTEX(audit_netlink_sem);
 
@@ -132,21 +135,14 @@ static DECLARE_MUTEX(audit_netlink_sem);
  * use simultaneously. */
 struct audit_buffer {
        struct list_head     list;
-       struct sk_buff_head  sklist;    /* formatted skbs ready to send */
+       struct sk_buff       *skb;      /* formatted skb ready to send */
        struct audit_context *ctx;      /* NULL or associated context */
-       int                  len;       /* used area of tmp */
-       char                 tmp[AUDIT_BUFSIZ];
-
-                               /* Pointer to header and contents */
-       struct nlmsghdr      *nlh;
-       int                  total;
-       int                  type;
-       int                  pid;
 };
 
-void audit_set_type(struct audit_buffer *ab, int type)
+static void audit_set_pid(struct audit_buffer *ab, pid_t pid)
 {
-       ab->type = type;
+       struct nlmsghdr *nlh = (struct nlmsghdr *)ab->skb->data;
+       nlh->nlmsg_pid = pid;
 }
 
 struct audit_entry {
@@ -154,9 +150,6 @@ struct audit_entry {
        struct audit_rule rule;
 };
 
-static void audit_log_end_irq(struct audit_buffer *ab);
-static void audit_log_end_fast(struct audit_buffer *ab);
-
 static void audit_panic(const char *message)
 {
        switch (audit_failure)
@@ -227,10 +220,8 @@ void audit_log_lost(const char *message)
 
        if (print) {
                printk(KERN_WARNING
-                      "audit: audit_lost=%d audit_backlog=%d"
-                      " audit_rate_limit=%d audit_backlog_limit=%d\n",
+                      "audit: audit_lost=%d audit_rate_limit=%d audit_backlog_limit=%d\n",
                       atomic_read(&audit_lost),
-                      atomic_read(&audit_backlog),
                       audit_rate_limit,
                       audit_backlog_limit);
                audit_panic(message);
@@ -242,7 +233,8 @@ static int audit_set_rate_limit(int limit, uid_t loginuid)
 {
        int old          = audit_rate_limit;
        audit_rate_limit = limit;
-       audit_log(NULL, "audit_rate_limit=%d old=%d by auid %u",
+       audit_log(NULL, AUDIT_CONFIG_CHANGE, 
+                       "audit_rate_limit=%d old=%d by auid=%u",
                        audit_rate_limit, old, loginuid);
        return old;
 }
@@ -251,7 +243,8 @@ static int audit_set_backlog_limit(int limit, uid_t loginuid)
 {
        int old          = audit_backlog_limit;
        audit_backlog_limit = limit;
-       audit_log(NULL, "audit_backlog_limit=%d old=%d by auid %u",
+       audit_log(NULL, AUDIT_CONFIG_CHANGE,
+                       "audit_backlog_limit=%d old=%d by auid=%u",
                        audit_backlog_limit, old, loginuid);
        return old;
 }
@@ -262,8 +255,9 @@ static int audit_set_enabled(int state, uid_t loginuid)
        if (state != 0 && state != 1)
                return -EINVAL;
        audit_enabled = state;
-       audit_log(NULL, "audit_enabled=%d old=%d by auid %u",
-                 audit_enabled, old, loginuid);
+       audit_log(NULL, AUDIT_CONFIG_CHANGE,
+                       "audit_enabled=%d old=%d by auid=%u",
+                       audit_enabled, old, loginuid);
        return old;
 }
 
@@ -275,12 +269,44 @@ static int audit_set_failure(int state, uid_t loginuid)
            && state != AUDIT_FAIL_PANIC)
                return -EINVAL;
        audit_failure = state;
-       audit_log(NULL, "audit_failure=%d old=%d by auid %u",
-                 audit_failure, old, loginuid);
+       audit_log(NULL, AUDIT_CONFIG_CHANGE,
+                       "audit_failure=%d old=%d by auid=%u",
+                       audit_failure, old, loginuid);
        return old;
 }
 
-#ifdef CONFIG_NET
+int kauditd_thread(void *dummy)
+{
+       struct sk_buff *skb;
+
+       while (1) {
+               skb = skb_dequeue(&audit_skb_queue);
+               if (skb) {
+                       if (audit_pid) {
+                               int err = netlink_unicast(audit_sock, skb, audit_pid, 0);
+                               if (err < 0) {
+                                       BUG_ON(err != -ECONNREFUSED); /* Shoudn't happen */
+                                       printk(KERN_ERR "audit: *NO* daemon at audit_pid=%d\n", audit_pid);
+                                       audit_pid = 0;
+                               }
+                       } else {
+                               printk(KERN_ERR "%s\n", skb->data + NLMSG_SPACE(0));
+                               kfree_skb(skb);
+                       }
+               } else {
+                       DECLARE_WAITQUEUE(wait, current);
+                       set_current_state(TASK_INTERRUPTIBLE);
+                       add_wait_queue(&kauditd_wait, &wait);
+
+                       if (!skb_queue_len(&audit_skb_queue))
+                               schedule();
+
+                       __set_current_state(TASK_RUNNING);
+                       remove_wait_queue(&kauditd_wait, &wait);
+               }
+       }
+}
+
 void audit_send_reply(int pid, int seq, int type, int done, int multi,
                      void *payload, int size)
 {
@@ -293,13 +319,16 @@ void audit_send_reply(int pid, int seq, int type, int done, int multi,
 
        skb = alloc_skb(len, GFP_KERNEL);
        if (!skb)
-               goto nlmsg_failure;
+               return;
 
-       nlh              = NLMSG_PUT(skb, pid, seq, t, len - sizeof(*nlh));
+       nlh              = NLMSG_PUT(skb, pid, seq, t, size);
        nlh->nlmsg_flags = flags;
        data             = NLMSG_DATA(nlh);
        memcpy(data, payload, size);
-       netlink_unicast(audit_sock, skb, pid, MSG_DONTWAIT);
+
+       /* Ignore failure. It'll only happen if the sender goes away,
+          because our timeout is set to infinite. */
+       netlink_unicast(audit_sock, skb, pid, 0);
        return;
 
 nlmsg_failure:                 /* Used by NLMSG_PUT */
@@ -321,10 +350,12 @@ static int audit_netlink_ok(kernel_cap_t eff_cap, u16 msg_type)
        case AUDIT_SET:
        case AUDIT_ADD:
        case AUDIT_DEL:
+       case AUDIT_SIGNAL_INFO:
                if (!cap_raised(eff_cap, CAP_AUDIT_CONTROL))
                        err = -EPERM;
                break;
        case AUDIT_USER:
+       case AUDIT_FIRST_USER_MSG...AUDIT_LAST_USER_MSG:
                if (!cap_raised(eff_cap, CAP_AUDIT_WRITE))
                        err = -EPERM;
                break;
@@ -344,11 +375,21 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
        struct audit_buffer     *ab;
        u16                     msg_type = nlh->nlmsg_type;
        uid_t                   loginuid; /* loginuid of sender */
+       struct audit_sig_info   sig_data;
 
        err = audit_netlink_ok(NETLINK_CB(skb).eff_cap, msg_type);
        if (err)
                return err;
 
+       /* As soon as there's any sign of userspace auditd, start kauditd to talk to it */
+       if (!kauditd_task)
+               kauditd_task = kthread_run(kauditd_thread, NULL, "kauditd");
+       if (IS_ERR(kauditd_task)) {
+               err = PTR_ERR(kauditd_task);
+               kauditd_task = NULL;
+               return err;
+       }
+
        pid  = NETLINK_CREDS(skb)->pid;
        uid  = NETLINK_CREDS(skb)->uid;
        loginuid = NETLINK_CB(skb).loginuid;
@@ -363,7 +404,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
                status_set.rate_limit    = audit_rate_limit;
                status_set.backlog_limit = audit_backlog_limit;
                status_set.lost          = atomic_read(&audit_lost);
-               status_set.backlog       = atomic_read(&audit_backlog);
+               status_set.backlog       = skb_queue_len(&audit_skb_queue);
                audit_send_reply(NETLINK_CB(skb).pid, seq, AUDIT_GET, 0, 0,
                                 &status_set, sizeof(status_set));
                break;
@@ -382,7 +423,8 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
                if (status_get->mask & AUDIT_STATUS_PID) {
                        int old   = audit_pid;
                        audit_pid = status_get->pid;
-                       audit_log(NULL, "audit_pid=%d old=%d by auid %u",
+                       audit_log(NULL, AUDIT_CONFIG_CHANGE,
+                               "audit_pid=%d old=%d by auid=%u",
                                  audit_pid, old, loginuid);
                }
                if (status_get->mask & AUDIT_STATUS_RATE_LIMIT)
@@ -392,18 +434,15 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
                                                        loginuid);
                break;
        case AUDIT_USER:
-               ab = audit_log_start(NULL);
+       case AUDIT_FIRST_USER_MSG...AUDIT_LAST_USER_MSG:
+               ab = audit_log_start(NULL, msg_type);
                if (!ab)
                        break;  /* audit_panic has been called */
                audit_log_format(ab,
-                                "user pid=%d uid=%d length=%d loginuid=%u"
+                                "user pid=%d uid=%u auid=%u"
                                 " msg='%.1024s'",
-                                pid, uid,
-                                (int)(nlh->nlmsg_len
-                                      - ((char *)data - (char *)nlh)),
-                                loginuid, (char *)data);
-               ab->type = AUDIT_USER;
-               ab->pid  = pid;
+                                pid, uid, loginuid, (char *)data);
+               audit_set_pid(ab, pid);
                audit_log_end(ab);
                break;
        case AUDIT_ADD:
@@ -412,12 +451,14 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
                        return -EINVAL;
                /* fallthrough */
        case AUDIT_LIST:
-#ifdef CONFIG_AUDITSYSCALL
                err = audit_receive_filter(nlh->nlmsg_type, NETLINK_CB(skb).pid,
                                           uid, seq, data, loginuid);
-#else
-               err = -EOPNOTSUPP;
-#endif
+               break;
+       case AUDIT_SIGNAL_INFO:
+               sig_data.uid = audit_sig_uid;
+               sig_data.pid = audit_sig_pid;
+               audit_send_reply(NETLINK_CB(skb).pid, seq, AUDIT_SIGNAL_INFO, 
+                               0, 0, &sig_data, sizeof(sig_data));
                break;
        default:
                err = -EINVAL;
@@ -467,87 +508,6 @@ static void audit_receive(struct sock *sk, int length)
        up(&audit_netlink_sem);
 }
 
-/* Move data from tmp buffer into an skb.  This is an extra copy, and
- * that is unfortunate.  However, the copy will only occur when a record
- * is being written to user space, which is already a high-overhead
- * operation.  (Elimination of the copy is possible, for example, by
- * writing directly into a pre-allocated skb, at the cost of wasting
- * memory. */
-static void audit_log_move(struct audit_buffer *ab)
-{
-       struct sk_buff  *skb;
-       char            *start;
-       int             extra = ab->nlh ? 0 : NLMSG_SPACE(0);
-
-       /* possible resubmission */
-       if (ab->len == 0)
-               return;
-
-       skb = skb_peek_tail(&ab->sklist);
-       if (!skb || skb_tailroom(skb) <= ab->len + extra) {
-               skb = alloc_skb(2 * ab->len + extra, GFP_ATOMIC);
-               if (!skb) {
-                       ab->len = 0; /* Lose information in ab->tmp */
-                       audit_log_lost("out of memory in audit_log_move");
-                       return;
-               }
-               __skb_queue_tail(&ab->sklist, skb);
-               if (!ab->nlh)
-                       ab->nlh = (struct nlmsghdr *)skb_put(skb,
-                                                            NLMSG_SPACE(0));
-       }
-       start = skb_put(skb, ab->len);
-       memcpy(start, ab->tmp, ab->len);
-       ab->len = 0;
-}
-
-/* Iterate over the skbuff in the audit_buffer, sending their contents
- * to user space. */
-static inline int audit_log_drain(struct audit_buffer *ab)
-{
-       struct sk_buff *skb;
-
-       while ((skb = skb_dequeue(&ab->sklist))) {
-               int retval = 0;
-
-               if (audit_pid) {
-                       if (ab->nlh) {
-                               ab->nlh->nlmsg_len   = ab->total;
-                               ab->nlh->nlmsg_type  = ab->type;
-                               ab->nlh->nlmsg_flags = 0;
-                               ab->nlh->nlmsg_seq   = 0;
-                               ab->nlh->nlmsg_pid   = ab->pid;
-                       }
-                       skb_get(skb); /* because netlink_* frees */
-                       retval = netlink_unicast(audit_sock, skb, audit_pid,
-                                                MSG_DONTWAIT);
-               }
-               if (retval == -EAGAIN &&
-                   (atomic_read(&audit_backlog)) < audit_backlog_limit) {
-                       skb_queue_head(&ab->sklist, skb);
-                       audit_log_end_irq(ab);
-                       return 1;
-               }
-               if (retval < 0) {
-                       if (retval == -ECONNREFUSED) {
-                               printk(KERN_ERR
-                                      "audit: *NO* daemon at audit_pid=%d\n",
-                                      audit_pid);
-                               audit_pid = 0;
-                       } else
-                               audit_log_lost("netlink socket too busy");
-               }
-               if (!audit_pid) { /* No daemon */
-                       int offset = ab->nlh ? NLMSG_SPACE(0) : 0;
-                       int len    = skb->len - offset;
-                       skb->data[offset + len] = '\0';
-                       printk(KERN_ERR "%s\n", skb->data + offset);
-               }
-               kfree_skb(skb);
-               ab->nlh = NULL;
-       }
-       return 0;
-}
 
 /* Initialize audit support at boot time. */
 static int __init audit_init(void)
@@ -558,40 +518,13 @@ static int __init audit_init(void)
        if (!audit_sock)
                audit_panic("cannot initialize netlink socket");
 
+       audit_sock->sk_sndtimeo = MAX_SCHEDULE_TIMEOUT;
+       skb_queue_head_init(&audit_skb_queue);
        audit_initialized = 1;
        audit_enabled = audit_default;
-       audit_log(NULL, "initialized");
-       return 0;
-}
-
-#else
-/* Without CONFIG_NET, we have no skbuffs.  For now, print what we have
- * in the buffer. */
-static void audit_log_move(struct audit_buffer *ab)
-{
-       printk(KERN_ERR "%*.*s\n", ab->len, ab->len, ab->tmp);
-       ab->len = 0;
-}
-
-static inline int audit_log_drain(struct audit_buffer *ab)
-{
-       return 0;
-}
-
-/* Initialize audit support at boot time. */
-int __init audit_init(void)
-{
-       printk(KERN_INFO "audit: initializing WITHOUT netlink support\n");
-       audit_sock = NULL;
-       audit_pid  = 0;
-
-       audit_initialized = 1;
-       audit_enabled = audit_default;
-       audit_log(NULL, "initialized");
+       audit_log(NULL, AUDIT_KERNEL, "initialized");
        return 0;
 }
-#endif
-
 __initcall(audit_init);
 
 /* Process kernel command-line parameter at boot time.  audit=0 or audit=1. */
@@ -608,6 +541,102 @@ static int __init audit_enable(char *str)
 
 __setup("audit=", audit_enable);
 
+static void audit_buffer_free(struct audit_buffer *ab)
+{
+       unsigned long flags;
+
+       if (!ab)
+               return;
+
+       if (ab->skb)
+               kfree_skb(ab->skb);
+
+       spin_lock_irqsave(&audit_freelist_lock, flags);
+       if (++audit_freelist_count > AUDIT_MAXFREE)
+               kfree(ab);
+       else
+               list_add(&ab->list, &audit_freelist);
+       spin_unlock_irqrestore(&audit_freelist_lock, flags);
+}
+
+static struct audit_buffer * audit_buffer_alloc(struct audit_context *ctx,
+                                               int gfp_mask, int type)
+{
+       unsigned long flags;
+       struct audit_buffer *ab = NULL;
+       struct nlmsghdr *nlh;
+
+       spin_lock_irqsave(&audit_freelist_lock, flags);
+       if (!list_empty(&audit_freelist)) {
+               ab = list_entry(audit_freelist.next,
+                               struct audit_buffer, list);
+               list_del(&ab->list);
+               --audit_freelist_count;
+       }
+       spin_unlock_irqrestore(&audit_freelist_lock, flags);
+
+       if (!ab) {
+               ab = kmalloc(sizeof(*ab), gfp_mask);
+               if (!ab)
+                       goto err;
+       }
+
+       ab->skb = alloc_skb(AUDIT_BUFSIZ, gfp_mask);
+       if (!ab->skb)
+               goto err;
+
+       ab->ctx = ctx;
+       nlh = (struct nlmsghdr *)skb_put(ab->skb, NLMSG_SPACE(0));
+       nlh->nlmsg_type = type;
+       nlh->nlmsg_flags = 0;
+       nlh->nlmsg_pid = 0;
+       nlh->nlmsg_seq = 0;
+       return ab;
+err:
+       audit_buffer_free(ab);
+       return NULL;
+}
+
+/* Compute a serial number for the audit record.  Audit records are
+ * written to user-space as soon as they are generated, so a complete
+ * audit record may be written in several pieces.  The timestamp of the
+ * record and this serial number are used by the user-space tools to
+ * determine which pieces belong to the same audit record.  The
+ * (timestamp,serial) tuple is unique for each syscall and is live from
+ * syscall entry to syscall exit.
+ *
+ * Atomic values are only guaranteed to be 24-bit, so we count down.
+ *
+ * NOTE: Another possibility is to store the formatted records off the
+ * audit context (for those records that have a context), and emit them
+ * all at syscall exit.  However, this could delay the reporting of
+ * significant errors until syscall exit (or never, if the system
+ * halts). */
+unsigned int audit_serial(void)
+{
+       static atomic_t serial = ATOMIC_INIT(0xffffff);
+       unsigned int a, b;
+
+       do {
+               a = atomic_read(&serial);
+               if (atomic_dec_and_test(&serial))
+                       atomic_set(&serial, 0xffffff);
+               b = atomic_read(&serial);
+       } while (b != a - 1);
+
+       return 0xffffff - b;
+}
+
+static inline void audit_get_stamp(struct audit_context *ctx, 
+                                  struct timespec *t, unsigned int *serial)
+{
+       if (ctx)
+               auditsc_get_stamp(ctx, t, serial);
+       else {
+               *t = CURRENT_TIME;
+               *serial = audit_serial();
+       }
+}
 
 /* Obtain an audit buffer.  This routine does locking to obtain the
  * audit buffer, but then no locking is required for calls to
@@ -615,10 +644,9 @@ __setup("audit=", audit_enable);
  * syscall, then the syscall is marked as auditable and an audit record
  * will be written at syscall exit.  If there is no associated task, tsk
  * should be NULL. */
-struct audit_buffer *audit_log_start(struct audit_context *ctx)
+struct audit_buffer *audit_log_start(struct audit_context *ctx, int type)
 {
        struct audit_buffer     *ab     = NULL;
-       unsigned long           flags;
        struct timespec         t;
        unsigned int            serial;
 
@@ -626,57 +654,48 @@ struct audit_buffer *audit_log_start(struct audit_context *ctx)
                return NULL;
 
        if (audit_backlog_limit
-           && atomic_read(&audit_backlog) > audit_backlog_limit) {
+           && skb_queue_len(&audit_skb_queue) > audit_backlog_limit) {
                if (audit_rate_check())
                        printk(KERN_WARNING
                               "audit: audit_backlog=%d > "
                               "audit_backlog_limit=%d\n",
-                              atomic_read(&audit_backlog),
+                              skb_queue_len(&audit_skb_queue),
                               audit_backlog_limit);
                audit_log_lost("backlog limit exceeded");
                return NULL;
        }
 
-       spin_lock_irqsave(&audit_freelist_lock, flags);
-       if (!list_empty(&audit_freelist)) {
-               ab = list_entry(audit_freelist.next,
-                               struct audit_buffer, list);
-               list_del(&ab->list);
-               --audit_freelist_count;
-       }
-       spin_unlock_irqrestore(&audit_freelist_lock, flags);
-
-       if (!ab)
-               ab = kmalloc(sizeof(*ab), GFP_ATOMIC);
+       ab = audit_buffer_alloc(ctx, GFP_ATOMIC, type);
        if (!ab) {
                audit_log_lost("out of memory in audit_log_start");
                return NULL;
        }
 
-       atomic_inc(&audit_backlog);
-       skb_queue_head_init(&ab->sklist);
-
-       ab->ctx   = ctx;
-       ab->len   = 0;
-       ab->nlh   = NULL;
-       ab->total = 0;
-       ab->type  = AUDIT_KERNEL;
-       ab->pid   = 0;
+       audit_get_stamp(ab->ctx, &t, &serial);
 
-#ifdef CONFIG_AUDITSYSCALL
-       if (ab->ctx)
-               audit_get_stamp(ab->ctx, &t, &serial);
-       else
-#endif
-       {
-               t = CURRENT_TIME;
-               serial = 0;
-       }
        audit_log_format(ab, "audit(%lu.%03lu:%u): ",
                         t.tv_sec, t.tv_nsec/1000000, serial);
        return ab;
 }
 
+/**
+ * audit_expand - expand skb in the audit buffer
+ * @ab: audit_buffer
+ *
+ * Returns 0 (no space) on failed expansion, or available space if
+ * successful.
+ */
+static inline int audit_expand(struct audit_buffer *ab, int extra)
+{
+       struct sk_buff *skb = ab->skb;
+       int ret = pskb_expand_head(skb, skb_headroom(skb), extra,
+                                  GFP_ATOMIC);
+       if (ret < 0) {
+               audit_log_lost("out of memory in audit_expand");
+               return 0;
+       }
+       return skb_tailroom(skb);
+}
 
 /* Format an audit message into the audit buffer.  If there isn't enough
  * room in the audit buffer, more room will be allocated and vsnprint
@@ -686,26 +705,35 @@ static void audit_log_vformat(struct audit_buffer *ab, const char *fmt,
                              va_list args)
 {
        int len, avail;
+       struct sk_buff *skb;
+       va_list args2;
 
        if (!ab)
                return;
 
-       avail = sizeof(ab->tmp) - ab->len;
-       if (avail <= 0) {
-               audit_log_move(ab);
-               avail = sizeof(ab->tmp) - ab->len;
+       BUG_ON(!ab->skb);
+       skb = ab->skb;
+       avail = skb_tailroom(skb);
+       if (avail == 0) {
+               avail = audit_expand(ab, AUDIT_BUFSIZ);
+               if (!avail)
+                       goto out;
        }
-       len   = vsnprintf(ab->tmp + ab->len, avail, fmt, args);
+       va_copy(args2, args);
+       len = vsnprintf(skb->tail, avail, fmt, args);
        if (len >= avail) {
                /* The printk buffer is 1024 bytes long, so if we get
                 * here and AUDIT_BUFSIZ is at least 1024, then we can
                 * log everything that printk could have logged. */
-               audit_log_move(ab);
-               avail = sizeof(ab->tmp) - ab->len;
-               len   = vsnprintf(ab->tmp + ab->len, avail, fmt, args);
+               avail = audit_expand(ab, max_t(unsigned, AUDIT_BUFSIZ, 1+len-avail));
+               if (!avail)
+                       goto out;
+               len = vsnprintf(skb->tail, avail, fmt, args2);
        }
-       ab->len   += (len < avail) ? len : avail;
-       ab->total += (len < avail) ? len : avail;
+       if (len > 0)
+               skb_put(skb, len);
+out:
+       return;
 }
 
 /* Format a message into the audit buffer.  All the work is done in
@@ -721,20 +749,47 @@ void audit_log_format(struct audit_buffer *ab, const char *fmt, ...)
        va_end(args);
 }
 
-void audit_log_hex(struct audit_buffer *ab, const unsigned char *buf, size_t len)
+/* This function will take the passed buf and convert it into a string of
+ * ascii hex digits. The new string is placed onto the skb. */
+void audit_log_hex(struct audit_buffer *ab, const unsigned char *buf, 
+               size_t len)
 {
-       int i;
+       int i, avail, new_len;
+       unsigned char *ptr;
+       struct sk_buff *skb;
+       static const unsigned char *hex = "0123456789ABCDEF";
+
+       BUG_ON(!ab->skb);
+       skb = ab->skb;
+       avail = skb_tailroom(skb);
+       new_len = len<<1;
+       if (new_len >= avail) {
+               /* Round the buffer request up to the next multiple */
+               new_len = AUDIT_BUFSIZ*(((new_len-avail)/AUDIT_BUFSIZ) + 1);
+               avail = audit_expand(ab, new_len);
+               if (!avail)
+                       return;
+       }
 
-       for (i=0; i<len; i++)
-               audit_log_format(ab, "%02x", buf[i]);
+       ptr = skb->tail;
+       for (i=0; i<len; i++) {
+               *ptr++ = hex[(buf[i] & 0xF0)>>4]; /* Upper nibble */
+               *ptr++ = hex[buf[i] & 0x0F];      /* Lower nibble */
+       }
+       *ptr = 0;
+       skb_put(skb, len << 1); /* new string is twice the old string */
 }
 
+/* This code will escape a string that is passed to it if the string
+ * contains a control character, unprintable character, double quote mark, 
+ * or a space. Unescaped strings will start and end with a double quote mark.
+ * Strings that are escaped are printed in hex (2 digits per char). */
 void audit_log_untrustedstring(struct audit_buffer *ab, const char *string)
 {
        const unsigned char *p = string;
 
        while (*p) {
-               if (*p == '"' || *p == ' ' || *p < 0x20 || *p > 0x7f) {
+               if (*p == '"' || *p < 0x21 || *p > 0x7f) {
                        audit_log_hex(ab, string, strlen(string));
                        return;
                }
@@ -743,117 +798,63 @@ void audit_log_untrustedstring(struct audit_buffer *ab, const char *string)
        audit_log_format(ab, "\"%s\"", string);
 }
 
-
-/* This is a helper-function to print the d_path without using a static
- * buffer or allocating another buffer in addition to the one in
- * audit_buffer. */
+/* This is a helper-function to print the escaped d_path */
 void audit_log_d_path(struct audit_buffer *ab, const char *prefix,
                      struct dentry *dentry, struct vfsmount *vfsmnt)
 {
-       char *p;
-       int  len, avail;
+       char *p, *path;
 
-       if (prefix) audit_log_format(ab, " %s", prefix);
-
-       if (ab->len > 128)
-               audit_log_move(ab);
-       avail = sizeof(ab->tmp) - ab->len;
-       p = d_path(dentry, vfsmnt, ab->tmp + ab->len, avail);
-       if (IS_ERR(p)) {
-               /* FIXME: can we save some information here? */
-               audit_log_format(ab, "<toolong>");
-       } else {
-                               /* path isn't at start of buffer */
-               len        = (ab->tmp + sizeof(ab->tmp) - 1) - p;
-               memmove(ab->tmp + ab->len, p, len);
-               ab->len   += len;
-               ab->total += len;
-       }
-}
-
-/* Remove queued messages from the audit_txlist and send them to userspace. */
-static void audit_tasklet_handler(unsigned long arg)
-{
-       LIST_HEAD(list);
-       struct audit_buffer *ab;
-       unsigned long       flags;
+       if (prefix)
+               audit_log_format(ab, " %s", prefix);
 
-       spin_lock_irqsave(&audit_txlist_lock, flags);
-       list_splice_init(&audit_txlist, &list);
-       spin_unlock_irqrestore(&audit_txlist_lock, flags);
-
-       while (!list_empty(&list)) {
-               ab = list_entry(list.next, struct audit_buffer, list);
-               list_del(&ab->list);
-               audit_log_end_fast(ab);
+       /* We will allow 11 spaces for ' (deleted)' to be appended */
+       path = kmalloc(PATH_MAX+11, GFP_KERNEL);
+       if (!path) {
+               audit_log_format(ab, "<no memory>");
+               return;
        }
+       p = d_path(dentry, vfsmnt, path, PATH_MAX+11);
+       if (IS_ERR(p)) { /* Should never happen since we send PATH_MAX */
+               /* FIXME: can we save some information here? */
+               audit_log_format(ab, "<too long>");
+       } else 
+               audit_log_untrustedstring(ab, p);
+       kfree(path);
 }
 
-static DECLARE_TASKLET(audit_tasklet, audit_tasklet_handler, 0);
-
 /* The netlink_* functions cannot be called inside an irq context, so
  * the audit buffer is places on a queue and a tasklet is scheduled to
  * remove them from the queue outside the irq context.  May be called in
  * any context. */
-static void audit_log_end_irq(struct audit_buffer *ab)
-{
-       unsigned long flags;
-
-       if (!ab)
-               return;
-       spin_lock_irqsave(&audit_txlist_lock, flags);
-       list_add_tail(&ab->list, &audit_txlist);
-       spin_unlock_irqrestore(&audit_txlist_lock, flags);
-
-       tasklet_schedule(&audit_tasklet);
-}
-
-/* Send the message in the audit buffer directly to user space.  May not
- * be called in an irq context. */
-static void audit_log_end_fast(struct audit_buffer *ab)
+void audit_log_end(struct audit_buffer *ab)
 {
-       unsigned long flags;
-
-       BUG_ON(in_irq());
        if (!ab)
                return;
        if (!audit_rate_check()) {
                audit_log_lost("rate limit exceeded");
        } else {
-               audit_log_move(ab);
-               if (audit_log_drain(ab))
-                       return;
+               if (audit_pid) {
+                       struct nlmsghdr *nlh = (struct nlmsghdr *)ab->skb->data;
+                       nlh->nlmsg_len = ab->skb->len - NLMSG_SPACE(0);
+                       skb_queue_tail(&audit_skb_queue, ab->skb);
+                       ab->skb = NULL;
+                       wake_up_interruptible(&kauditd_wait);
+               } else {
+                       printk("%s\n", ab->skb->data + NLMSG_SPACE(0));
+               }
        }
-
-       atomic_dec(&audit_backlog);
-       spin_lock_irqsave(&audit_freelist_lock, flags);
-       if (++audit_freelist_count > AUDIT_MAXFREE)
-               kfree(ab);
-       else
-               list_add(&ab->list, &audit_freelist);
-       spin_unlock_irqrestore(&audit_freelist_lock, flags);
-}
-
-/* Send or queue the message in the audit buffer, depending on the
- * current context.  (A convenience function that may be called in any
- * context.) */
-void audit_log_end(struct audit_buffer *ab)
-{
-       if (in_irq())
-               audit_log_end_irq(ab);
-       else
-               audit_log_end_fast(ab);
+       audit_buffer_free(ab);
 }
 
 /* Log an audit record.  This is a convenience function that calls
  * audit_log_start, audit_log_vformat, and audit_log_end.  It may be
  * called in any context. */
-void audit_log(struct audit_context *ctx, const char *fmt, ...)
+void audit_log(struct audit_context *ctx, int type, const char *fmt, ...)
 {
        struct audit_buffer *ab;
        va_list args;
 
-       ab = audit_log_start(ctx);
+       ab = audit_log_start(ctx, type);
        if (ab) {
                va_start(args, fmt);
                audit_log_vformat(ab, fmt, args);
index 37b3ac94bc47492d026ae697cc92b1d4ddd70bd5..e75f84e1a1a00d697718f603655810d8a51e7548 100644 (file)
@@ -34,7 +34,8 @@
 #include <asm/types.h>
 #include <linux/mm.h>
 #include <linux/module.h>
-
+#include <linux/mount.h>
+#include <linux/socket.h>
 #include <linux/audit.h>
 #include <linux/personality.h>
 #include <linux/time.h>
@@ -112,6 +113,23 @@ struct audit_aux_data_ipcctl {
        mode_t                  mode;
 };
 
+struct audit_aux_data_socketcall {
+       struct audit_aux_data   d;
+       int                     nargs;
+       unsigned long           args[0];
+};
+
+struct audit_aux_data_sockaddr {
+       struct audit_aux_data   d;
+       int                     len;
+       char                    a[0];
+};
+
+struct audit_aux_data_path {
+       struct audit_aux_data   d;
+       struct dentry           *dentry;
+       struct vfsmount         *mnt;
+};
 
 /* The per-task audit context. */
 struct audit_context {
@@ -127,6 +145,8 @@ struct audit_context {
        int                 auditable;  /* 1 if record should be written */
        int                 name_count;
        struct audit_names  names[AUDIT_NAMES];
+       struct dentry *     pwd;
+       struct vfsmount *   pwdmnt;
        struct audit_context *previous; /* For nested syscalls */
        struct audit_aux_data *aux;
 
@@ -157,6 +177,8 @@ struct audit_entry {
        struct audit_rule rule;
 };
 
+extern int audit_pid;
+
 /* Check to see if two rules are identical.  It is called from
  * audit_del_rule during AUDIT_DEL. */
 static int audit_compare_rule(struct audit_rule *a, struct audit_rule *b)
@@ -226,7 +248,6 @@ static inline int audit_del_rule(struct audit_rule *rule,
        return -EFAULT;         /* No matching rule */
 }
 
-#ifdef CONFIG_NET
 /* Copy rule from user-space to kernel-space.  Called during
  * AUDIT_ADD. */
 static int audit_copy_rule(struct audit_rule *d, struct audit_rule *s)
@@ -287,7 +308,8 @@ int audit_receive_filter(int type, int pid, int uid, int seq, void *data,
                        err = audit_add_rule(entry, &audit_entlist);
                if (!err && (flags & AUDIT_AT_EXIT))
                        err = audit_add_rule(entry, &audit_extlist);
-               audit_log(NULL, "auid %u added an audit rule\n", loginuid);
+               audit_log(NULL, AUDIT_CONFIG_CHANGE, 
+                               "auid=%u added an audit rule\n", loginuid);
                break;
        case AUDIT_DEL:
                flags =((struct audit_rule *)data)->flags;
@@ -297,7 +319,8 @@ int audit_receive_filter(int type, int pid, int uid, int seq, void *data,
                        err = audit_del_rule(data, &audit_entlist);
                if (!err && (flags & AUDIT_AT_EXIT))
                        err = audit_del_rule(data, &audit_extlist);
-               audit_log(NULL, "auid %u removed an audit rule\n", loginuid);
+               audit_log(NULL, AUDIT_CONFIG_CHANGE,
+                               "auid=%u removed an audit rule\n", loginuid);
                break;
        default:
                return -EINVAL;
@@ -305,7 +328,6 @@ int audit_receive_filter(int type, int pid, int uid, int seq, void *data,
 
        return err;
 }
-#endif
 
 /* Compare a task_struct with an audit_rule.  Return 1 on match, 0
  * otherwise. */
@@ -444,7 +466,7 @@ static enum audit_state audit_filter_task(struct task_struct *tsk)
 
 /* At syscall entry and exit time, this filter is called if the
  * audit_state is not low enough that auditing cannot take place, but is
- * also not high enough that we already know we have to write and audit
+ * also not high enough that we already know we have to write an audit
  * record (i.e., the state is AUDIT_SETUP_CONTEXT or  AUDIT_BUILD_CONTEXT).
  */
 static enum audit_state audit_filter_syscall(struct task_struct *tsk,
@@ -532,6 +554,12 @@ static inline void audit_free_names(struct audit_context *context)
                if (context->names[i].name)
                        __putname(context->names[i].name);
        context->name_count = 0;
+       if (context->pwd)
+               dput(context->pwd);
+       if (context->pwdmnt)
+               mntput(context->pwdmnt);
+       context->pwd = NULL;
+       context->pwdmnt = NULL;
 }
 
 static inline void audit_free_aux(struct audit_context *context)
@@ -539,6 +567,11 @@ static inline void audit_free_aux(struct audit_context *context)
        struct audit_aux_data *aux;
 
        while ((aux = context->aux)) {
+               if (aux->type == AUDIT_AVC_PATH) {
+                       struct audit_aux_data_path *axi = (void *)aux;
+                       dput(axi->dentry);
+                       mntput(axi->mnt);
+               }
                context->aux = aux->next;
                kfree(aux);
        }
@@ -625,7 +658,8 @@ static void audit_log_task_info(struct audit_buffer *ab)
        struct vm_area_struct *vma;
 
        get_task_comm(name, current);
-       audit_log_format(ab, " comm=%s", name);
+       audit_log_format(ab, " comm=");
+       audit_log_untrustedstring(ab, name);
 
        if (!mm)
                return;
@@ -649,23 +683,24 @@ static void audit_log_exit(struct audit_context *context)
 {
        int i;
        struct audit_buffer *ab;
+       struct audit_aux_data *aux;
 
-       ab = audit_log_start(context);
+       ab = audit_log_start(context, AUDIT_SYSCALL);
        if (!ab)
                return;         /* audit_panic has been called */
-       audit_log_format(ab, "syscall=%d", context->major);
+       audit_log_format(ab, "arch=%x syscall=%d",
+                        context->arch, context->major);
        if (context->personality != PER_LINUX)
                audit_log_format(ab, " per=%lx", context->personality);
-       audit_log_format(ab, " arch=%x", context->arch);
        if (context->return_valid)
                audit_log_format(ab, " success=%s exit=%ld", 
                                 (context->return_valid==AUDITSC_SUCCESS)?"yes":"no",
                                 context->return_code);
        audit_log_format(ab,
                  " a0=%lx a1=%lx a2=%lx a3=%lx items=%d"
-                 " pid=%d loginuid=%d uid=%d gid=%d"
-                 " euid=%d suid=%d fsuid=%d"
-                 " egid=%d sgid=%d fsgid=%d",
+                 " pid=%d auid=%u uid=%u gid=%u"
+                 " euid=%u suid=%u fsuid=%u"
+                 " egid=%u sgid=%u fsgid=%u",
                  context->argv[0],
                  context->argv[1],
                  context->argv[2],
@@ -679,33 +714,57 @@ static void audit_log_exit(struct audit_context *context)
                  context->egid, context->sgid, context->fsgid);
        audit_log_task_info(ab);
        audit_log_end(ab);
-       while (context->aux) {
-               struct audit_aux_data *aux;
 
-               ab = audit_log_start(context);
+       for (aux = context->aux; aux; aux = aux->next) {
+
+               ab = audit_log_start(context, aux->type);
                if (!ab)
                        continue; /* audit_panic has been called */
 
-               aux = context->aux;
-               context->aux = aux->next;
-
-               audit_log_format(ab, "auxitem=%d", aux->type);
                switch (aux->type) {
-               case AUDIT_AUX_IPCPERM: {
+               case AUDIT_IPC: {
                        struct audit_aux_data_ipcctl *axi = (void *)aux;
                        audit_log_format(ab, 
-                                        " qbytes=%lx uid=%d gid=%d mode=%x",
+                                        " qbytes=%lx iuid=%u igid=%u mode=%x",
                                         axi->qbytes, axi->uid, axi->gid, axi->mode);
-                       }
+                       break; }
+
+               case AUDIT_SOCKETCALL: {
+                       int i;
+                       struct audit_aux_data_socketcall *axs = (void *)aux;
+                       audit_log_format(ab, "nargs=%d", axs->nargs);
+                       for (i=0; i<axs->nargs; i++)
+                               audit_log_format(ab, " a%d=%lx", i, axs->args[i]);
+                       break; }
+
+               case AUDIT_SOCKADDR: {
+                       struct audit_aux_data_sockaddr *axs = (void *)aux;
+
+                       audit_log_format(ab, "saddr=");
+                       audit_log_hex(ab, axs->a, axs->len);
+                       break; }
+
+               case AUDIT_AVC_PATH: {
+                       struct audit_aux_data_path *axi = (void *)aux;
+                       audit_log_d_path(ab, "path=", axi->dentry, axi->mnt);
+                       break; }
+
                }
                audit_log_end(ab);
-               kfree(aux);
        }
 
+       if (context->pwd && context->pwdmnt) {
+               ab = audit_log_start(context, AUDIT_CWD);
+               if (ab) {
+                       audit_log_d_path(ab, "cwd=", context->pwd, context->pwdmnt);
+                       audit_log_end(ab);
+               }
+       }
        for (i = 0; i < context->name_count; i++) {
-               ab = audit_log_start(context);
+               ab = audit_log_start(context, AUDIT_PATH);
                if (!ab)
                        continue; /* audit_panic has been called */
+
                audit_log_format(ab, "item=%d", i);
                if (context->names[i].name) {
                        audit_log_format(ab, " name=");
@@ -713,7 +772,7 @@ static void audit_log_exit(struct audit_context *context)
                }
                if (context->names[i].ino != (unsigned long)-1)
                        audit_log_format(ab, " inode=%lu dev=%02x:%02x mode=%#o"
-                                            " uid=%d gid=%d rdev=%02x:%02x",
+                                            " ouid=%u ogid=%u rdev=%02x:%02x",
                                         context->names[i].ino,
                                         MAJOR(context->names[i].dev),
                                         MINOR(context->names[i].dev),
@@ -741,42 +800,12 @@ void audit_free(struct task_struct *tsk)
 
        /* Check for system calls that do not go through the exit
         * function (e.g., exit_group), then free context block. */
-       if (context->in_syscall && context->auditable)
+       if (context->in_syscall && context->auditable && context->pid != audit_pid)
                audit_log_exit(context);
 
        audit_free_context(context);
 }
 
-/* Compute a serial number for the audit record.  Audit records are
- * written to user-space as soon as they are generated, so a complete
- * audit record may be written in several pieces.  The timestamp of the
- * record and this serial number are used by the user-space daemon to
- * determine which pieces belong to the same audit record.  The
- * (timestamp,serial) tuple is unique for each syscall and is live from
- * syscall entry to syscall exit.
- *
- * Atomic values are only guaranteed to be 24-bit, so we count down.
- *
- * NOTE: Another possibility is to store the formatted records off the
- * audit context (for those records that have a context), and emit them
- * all at syscall exit.  However, this could delay the reporting of
- * significant errors until syscall exit (or never, if the system
- * halts). */
-static inline unsigned int audit_serial(void)
-{
-       static atomic_t serial = ATOMIC_INIT(0xffffff);
-       unsigned int a, b;
-
-       do {
-               a = atomic_read(&serial);
-               if (atomic_dec_and_test(&serial))
-                       atomic_set(&serial, 0xffffff);
-               b = atomic_read(&serial);
-       } while (b != a - 1);
-
-       return 0xffffff - b;
-}
-
 /* Fill in audit context at syscall entry.  This only happens if the
  * audit context was created when the task was created and the state or
  * filters demand the audit context be built.  If the state from the
@@ -876,7 +905,7 @@ void audit_syscall_exit(struct task_struct *tsk, int valid, long return_code)
        if (likely(!context))
                return;
 
-       if (context->in_syscall && context->auditable)
+       if (context->in_syscall && context->auditable && context->pid != audit_pid)
                audit_log_exit(context);
 
        context->in_syscall = 0;
@@ -916,6 +945,13 @@ void audit_getname(const char *name)
        context->names[context->name_count].name = name;
        context->names[context->name_count].ino  = (unsigned long)-1;
        ++context->name_count;
+       if (!context->pwd) {
+               read_lock(&current->fs->lock);
+               context->pwd = dget(current->fs->pwd);
+               context->pwdmnt = mntget(current->fs->pwdmnt);
+               read_unlock(&current->fs->lock);
+       }
+               
 }
 
 /* Intercept a putname request.  Called from
@@ -994,34 +1030,26 @@ void audit_inode(const char *name, const struct inode *inode)
        context->names[idx].rdev = inode->i_rdev;
 }
 
-void audit_get_stamp(struct audit_context *ctx,
-                    struct timespec *t, unsigned int *serial)
+void auditsc_get_stamp(struct audit_context *ctx,
+                      struct timespec *t, unsigned int *serial)
 {
-       if (ctx) {
-               t->tv_sec  = ctx->ctime.tv_sec;
-               t->tv_nsec = ctx->ctime.tv_nsec;
-               *serial    = ctx->serial;
-               ctx->auditable = 1;
-       } else {
-               *t      = CURRENT_TIME;
-               *serial = 0;
-       }
+       t->tv_sec  = ctx->ctime.tv_sec;
+       t->tv_nsec = ctx->ctime.tv_nsec;
+       *serial    = ctx->serial;
+       ctx->auditable = 1;
 }
 
-extern int audit_set_type(struct audit_buffer *ab, int type);
-
 int audit_set_loginuid(struct task_struct *task, uid_t loginuid)
 {
        if (task->audit_context) {
                struct audit_buffer *ab;
 
-               ab = audit_log_start(NULL);
+               ab = audit_log_start(NULL, AUDIT_LOGIN);
                if (ab) {
                        audit_log_format(ab, "login pid=%d uid=%u "
-                               "old loginuid=%u new loginuid=%u",
+                               "old auid=%u new auid=%u",
                                task->pid, task->uid, 
                                task->audit_context->loginuid, loginuid);
-                       audit_set_type(ab, AUDIT_LOGIN);
                        audit_log_end(ab);
                }
                task->audit_context->loginuid = loginuid;
@@ -1051,8 +1079,89 @@ int audit_ipc_perms(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode)
        ax->gid = gid;
        ax->mode = mode;
 
-       ax->d.type = AUDIT_AUX_IPCPERM;
+       ax->d.type = AUDIT_IPC;
+       ax->d.next = context->aux;
+       context->aux = (void *)ax;
+       return 0;
+}
+
+int audit_socketcall(int nargs, unsigned long *args)
+{
+       struct audit_aux_data_socketcall *ax;
+       struct audit_context *context = current->audit_context;
+
+       if (likely(!context))
+               return 0;
+
+       ax = kmalloc(sizeof(*ax) + nargs * sizeof(unsigned long), GFP_KERNEL);
+       if (!ax)
+               return -ENOMEM;
+
+       ax->nargs = nargs;
+       memcpy(ax->args, args, nargs * sizeof(unsigned long));
+
+       ax->d.type = AUDIT_SOCKETCALL;
+       ax->d.next = context->aux;
+       context->aux = (void *)ax;
+       return 0;
+}
+
+int audit_sockaddr(int len, void *a)
+{
+       struct audit_aux_data_sockaddr *ax;
+       struct audit_context *context = current->audit_context;
+
+       if (likely(!context))
+               return 0;
+
+       ax = kmalloc(sizeof(*ax) + len, GFP_KERNEL);
+       if (!ax)
+               return -ENOMEM;
+
+       ax->len = len;
+       memcpy(ax->a, a, len);
+
+       ax->d.type = AUDIT_SOCKADDR;
        ax->d.next = context->aux;
        context->aux = (void *)ax;
        return 0;
 }
+
+int audit_avc_path(struct dentry *dentry, struct vfsmount *mnt)
+{
+       struct audit_aux_data_path *ax;
+       struct audit_context *context = current->audit_context;
+
+       if (likely(!context))
+               return 0;
+
+       ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
+       if (!ax)
+               return -ENOMEM;
+
+       ax->dentry = dget(dentry);
+       ax->mnt = mntget(mnt);
+
+       ax->d.type = AUDIT_AVC_PATH;
+       ax->d.next = context->aux;
+       context->aux = (void *)ax;
+       return 0;
+}
+
+void audit_signal_info(int sig, struct task_struct *t)
+{
+       extern pid_t audit_sig_pid;
+       extern uid_t audit_sig_uid;
+
+       if (unlikely(audit_pid && t->pid == audit_pid)) {
+               if (sig == SIGTERM || sig == SIGHUP) {
+                       struct audit_context *ctx = current->audit_context;
+                       audit_sig_pid = current->pid;
+                       if (ctx)
+                               audit_sig_uid = ctx->loginuid;
+                       else
+                               audit_sig_uid = current->uid;
+               }
+       }
+}
+
index 961d74044deb0b08f8ce237e4f86c700da5e768a..00e8f2575512c6159c9a2ad76718f96f308042f5 100644 (file)
@@ -166,9 +166,8 @@ static struct super_block *cpuset_sb = NULL;
  * The hooks from fork and exit, cpuset_fork() and cpuset_exit(), don't
  * (usually) grab cpuset_sem.  These are the two most performance
  * critical pieces of code here.  The exception occurs on exit(),
- * if the last task using a cpuset exits, and the cpuset was marked
- * notify_on_release.  In that case, the cpuset_sem is taken, the
- * path to the released cpuset calculated, and a usermode call made
+ * when a task in a notify_on_release cpuset exits.  Then cpuset_sem
+ * is taken, and if the cpuset count is zero, a usermode call made
  * to /sbin/cpuset_release_agent with the name of the cpuset (path
  * relative to the root of cpuset file system) as the argument.
  *
@@ -1404,6 +1403,18 @@ void cpuset_fork(struct task_struct *tsk)
  *
  * Description: Detach cpuset from @tsk and release it.
  *
+ * Note that cpusets marked notify_on_release force every task
+ * in them to take the global cpuset_sem semaphore when exiting.
+ * This could impact scaling on very large systems.  Be reluctant
+ * to use notify_on_release cpusets where very high task exit
+ * scaling is required on large systems.
+ *
+ * Don't even think about derefencing 'cs' after the cpuset use
+ * count goes to zero, except inside a critical section guarded
+ * by the cpuset_sem semaphore.  If you don't hold cpuset_sem,
+ * then a zero cpuset use count is a license to any other task to
+ * nuke the cpuset immediately.
+ *
  **/
 
 void cpuset_exit(struct task_struct *tsk)
@@ -1415,10 +1426,13 @@ void cpuset_exit(struct task_struct *tsk)
        tsk->cpuset = NULL;
        task_unlock(tsk);
 
-       if (atomic_dec_and_test(&cs->count)) {
+       if (notify_on_release(cs)) {
                down(&cpuset_sem);
-               check_for_release(cs);
+               if (atomic_dec_and_test(&cs->count))
+                       check_for_release(cs);
                up(&cpuset_sem);
+       } else {
+               atomic_dec(&cs->count);
        }
 }
 
index edaa50b5bbfaecc36f1e492e28d9b80ef55b5dae..2ef2ad54020177cd355174b8d4a52656edebd6d2 100644 (file)
@@ -811,10 +811,8 @@ fastcall NORET_TYPE void do_exit(long code)
        acct_update_integrals(tsk);
        update_mem_hiwater(tsk);
        group_dead = atomic_dec_and_test(&tsk->signal->live);
-       if (group_dead) {
-               del_timer_sync(&tsk->signal->real_timer);
+       if (group_dead)
                acct_process(code);
-       }
        exit_mm(tsk);
 
        exit_sem(tsk);
index f42a17f88699bb4c1a07b4f93961c92e3c5d75a5..a28d11e10877d07ebdd1ccde6006493122873b28 100644 (file)
@@ -194,6 +194,7 @@ static inline int dup_mmap(struct mm_struct * mm, struct mm_struct * oldmm)
        mm->mmap = NULL;
        mm->mmap_cache = NULL;
        mm->free_area_cache = oldmm->mmap_base;
+       mm->cached_hole_size = ~0UL;
        mm->map_count = 0;
        set_mm_counter(mm, rss, 0);
        set_mm_counter(mm, anon_rss, 0);
@@ -249,8 +250,9 @@ static inline int dup_mmap(struct mm_struct * mm, struct mm_struct * oldmm)
 
                /*
                 * Link in the new vma and copy the page table entries:
-                * link in first so that swapoff can see swap entries,
-                * and try_to_unmap_one's find_vma find the new vma.
+                * link in first so that swapoff can see swap entries.
+                * Note that, exceptionally, here the vma is inserted
+                * without holding mm->mmap_sem.
                 */
                spin_lock(&mm->page_table_lock);
                *pprev = tmp;
@@ -322,6 +324,7 @@ static struct mm_struct * mm_init(struct mm_struct * mm)
        mm->ioctx_list = NULL;
        mm->default_kioctx = (struct kioctx)INIT_KIOCTX(mm->default_kioctx, *mm);
        mm->free_area_cache = TASK_UNMAPPED_BASE;
+       mm->cached_hole_size = ~0UL;
 
        if (likely(!mm_alloc_pgd(mm))) {
                mm->def_flags = 0;
index 2fb0e46e11f390679550ebbb41852973c413b221..436c7d93c00a9555f245da72ce9efced1bffd47b 100644 (file)
@@ -30,6 +30,7 @@
  */
 irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned = {
        [0 ... NR_IRQS-1] = {
+               .status = IRQ_DISABLED,
                .handler = &no_irq_type,
                .lock = SPIN_LOCK_UNLOCKED
        }
@@ -118,8 +119,6 @@ fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs)
                 */
                desc->handler->ack(irq);
                action_ret = handle_IRQ_event(irq, regs, desc->action);
-               if (!noirqdebug)
-                       note_interrupt(irq, desc, action_ret);
                desc->handler->end(irq);
                return 1;
        }
index 5202e4c4a5b606e2408dafd1e48904548bc44e83..ac670098570579e980e6b7bba35a235f7be885a9 100644 (file)
@@ -6,6 +6,7 @@
  * This file contains driver APIs to the irq subsystem.
  */
 
+#include <linux/config.h>
 #include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/random.h>
@@ -255,6 +256,13 @@ void free_irq(unsigned int irq, void *dev_id)
 
                        /* Found it - now remove it from the list of entries */
                        *pp = action->next;
+
+                       /* Currently used only by UML, might disappear one day.*/
+#ifdef CONFIG_IRQ_RELEASE_METHOD
+                       if (desc->handler->release)
+                               desc->handler->release(irq, dev_id);
+#endif
+
                        if (!desc->action) {
                                desc->status |= IRQ_DISABLED;
                                if (desc->handler->shutdown)
index 5734ab09d3f984af2e424a5b3da5fbf79f83aef2..a566745dde621a075e225c52a432316bec58afc0 100644 (file)
@@ -379,7 +379,7 @@ static void module_unload_init(struct module *mod)
        for (i = 0; i < NR_CPUS; i++)
                local_set(&mod->ref[i].count, 0);
        /* Hold reference count during initialization. */
-       local_set(&mod->ref[_smp_processor_id()].count, 1);
+       local_set(&mod->ref[raw_smp_processor_id()].count, 1);
        /* Backwards compatibility macros put refcount during init. */
        mod->waiter = current;
 }
@@ -1758,6 +1758,7 @@ sys_init_module(void __user *umod,
                const char __user *uargs)
 {
        struct module *mod;
+       mm_segment_t old_fs = get_fs();
        int ret = 0;
 
        /* Must have permission */
@@ -1775,6 +1776,9 @@ sys_init_module(void __user *umod,
                return PTR_ERR(mod);
        }
 
+       /* flush the icache in correct context */
+       set_fs(KERNEL_DS);
+
        /* Flush the instruction cache, since we've played with text */
        if (mod->module_init)
                flush_icache_range((unsigned long)mod->module_init,
@@ -1783,6 +1787,8 @@ sys_init_module(void __user *umod,
        flush_icache_range((unsigned long)mod->module_core,
                           (unsigned long)mod->module_core + mod->core_size);
 
+       set_fs(old_fs);
+
        /* Now sew it into the lists.  They won't access us, since
            strong_try_module_get() will fail. */
        stop_machine_run(__link_module, mod, NR_CPUS);
index 5513844bec1387855919f927965b2c8adf8b749d..d586c35ef8fca8f4540031c5ad071b90c1071df4 100644 (file)
@@ -629,7 +629,7 @@ static ssize_t module_attr_show(struct kobject *kobj,
        mk = to_module_kobject(kobj);
 
        if (!attribute->show)
-               return -EPERM;
+               return -EIO;
 
        if (!try_module_get(mk->mod))
                return -ENODEV;
@@ -653,7 +653,7 @@ static ssize_t module_attr_store(struct kobject *kobj,
        mk = to_module_kobject(kobj);
 
        if (!attribute->store)
-               return -EPERM;
+               return -EIO;
 
        if (!try_module_get(mk->mod))
                return -ENODEV;
index fd316c2722604a866b359548db9659aa5c1eefbc..cabb63fc9e16c5437b6ea879074a9a6c0783cf9d 100644 (file)
@@ -1197,6 +1197,7 @@ void exit_itimers(struct signal_struct *sig)
                tmr = list_entry(sig->posix_timers.next, struct k_itimer, list);
                itimer_delete(tmr);
        }
+       del_timer_sync(&sig->real_timer);
 }
 
 /*
index 7960ddf04a57fca65ce7562ed565a1e1f5f872cd..4cdebc972ff2a55c7fdac702dca0c36f81905558 100644 (file)
@@ -156,14 +156,14 @@ static int enter_state(suspend_state_t state)
                goto Unlock;
        }
 
-       pr_debug("PM: Preparing system for suspend\n");
+       pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]);
        if ((error = suspend_prepare(state)))
                goto Unlock;
 
-       pr_debug("PM: Entering state.\n");
+       pr_debug("PM: Entering %s sleep\n", pm_states[state]);
        error = suspend_enter(state);
 
-       pr_debug("PM: Finishing up.\n");
+       pr_debug("PM: Finishing wakeup.\n");
        suspend_finish(state);
  Unlock:
        up(&pm_sem);
index cba3584b80fefa88b3fdcb8d938800b08d44abeb..457c2302ed424bf05e516136d21c1884033ca1e9 100644 (file)
@@ -48,11 +48,11 @@ void disable_nonboot_cpus(void)
 {
        oldmask = current->cpus_allowed;
        set_cpus_allowed(current, cpumask_of_cpu(0));
-       printk("Freezing CPUs (at %d)", _smp_processor_id());
+       printk("Freezing CPUs (at %d)", raw_smp_processor_id());
        current->state = TASK_INTERRUPTIBLE;
        schedule_timeout(HZ);
        printk("...");
-       BUG_ON(_smp_processor_id() != 0);
+       BUG_ON(raw_smp_processor_id() != 0);
 
        /* FIXME: for this to work, all the CPUs must be running
         * "idle" thread (or we deadlock). Is that guaranteed? */
index 290a07ce2c8a8029089d24304ea216bf8b937ade..01b58d7d17ff763d50f92cb80b66e8ffe67dad4f 100644 (file)
@@ -160,42 +160,6 @@ static int __init console_setup(char *str)
 
 __setup("console=", console_setup);
 
-/**
- * add_preferred_console - add a device to the list of preferred consoles.
- *
- * The last preferred console added will be used for kernel messages
- * and stdin/out/err for init.  Normally this is used by console_setup
- * above to handle user-supplied console arguments; however it can also
- * be used by arch-specific code either to override the user or more
- * commonly to provide a default console (ie from PROM variables) when
- * the user has not supplied one.
- */
-int __init add_preferred_console(char *name, int idx, char *options)
-{
-       struct console_cmdline *c;
-       int i;
-
-       /*
-        *      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++)
-               if (strcmp(console_cmdline[i].name, name) == 0 &&
-                         console_cmdline[i].index == idx) {
-                               selected_console = i;
-                               return 0;
-               }
-       if (i == MAX_CMDLINECONSOLES)
-               return -E2BIG;
-       selected_console = i;
-       c = &console_cmdline[i];
-       memcpy(c->name, name, sizeof(c->name));
-       c->name[sizeof(c->name) - 1] = 0;
-       c->options = options;
-       c->index = idx;
-       return 0;
-}
-
 static int __init log_buf_len_setup(char *str)
 {
        unsigned long size = memparse(str, &str);
@@ -670,6 +634,42 @@ static void call_console_drivers(unsigned long start, unsigned long end) {}
 
 #endif
 
+/**
+ * add_preferred_console - add a device to the list of preferred consoles.
+ *
+ * The last preferred console added will be used for kernel messages
+ * and stdin/out/err for init.  Normally this is used by console_setup
+ * above to handle user-supplied console arguments; however it can also
+ * be used by arch-specific code either to override the user or more
+ * commonly to provide a default console (ie from PROM variables) when
+ * the user has not supplied one.
+ */
+int __init add_preferred_console(char *name, int idx, char *options)
+{
+       struct console_cmdline *c;
+       int i;
+
+       /*
+        *      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++)
+               if (strcmp(console_cmdline[i].name, name) == 0 &&
+                         console_cmdline[i].index == idx) {
+                               selected_console = i;
+                               return 0;
+               }
+       if (i == MAX_CMDLINECONSOLES)
+               return -E2BIG;
+       selected_console = i;
+       c = &console_cmdline[i];
+       memcpy(c->name, name, sizeof(c->name));
+       c->name[sizeof(c->name) - 1] = 0;
+       c->options = options;
+       c->index = idx;
+       return 0;
+}
+
 /**
  * acquire_console_sem - lock the console system for exclusive use.
  *
index 0221a50ca867c50feda6b0f1317fd2637d41d8a6..ad8cbb75ffa2c4921031a161b497df10fcf0a22f 100644 (file)
@@ -49,15 +49,19 @@ static DECLARE_MUTEX(profile_flip_mutex);
 
 static int __init profile_setup(char * str)
 {
+       static char __initdata schedstr[] = "schedule";
        int par;
 
-       if (!strncmp(str, "schedule", 8)) {
+       if (!strncmp(str, schedstr, strlen(schedstr))) {
                prof_on = SCHED_PROFILING;
-               printk(KERN_INFO "kernel schedule profiling enabled\n");
-               if (str[7] == ',')
-                       str += 8;
-       }
-       if (get_option(&str,&par)) {
+               if (str[strlen(schedstr)] == ',')
+                       str += strlen(schedstr) + 1;
+               if (get_option(&str, &par))
+                       prof_shift = par;
+               printk(KERN_INFO
+                       "kernel schedule profiling enabled (shift: %ld)\n",
+                       prof_shift);
+       } else if (get_option(&str, &par)) {
                prof_shift = par;
                prof_on = CPU_PROFILING;
                printk(KERN_INFO "kernel profiling enabled (shift: %ld)\n",
index 0dc3158667a2c7aba86f65fad19989e32a1baf8e..deca041fc3645670055502888171811404d249f9 100644 (file)
@@ -3755,19 +3755,22 @@ EXPORT_SYMBOL(cond_resched);
  */
 int cond_resched_lock(spinlock_t * lock)
 {
+       int ret = 0;
+
        if (need_lockbreak(lock)) {
                spin_unlock(lock);
                cpu_relax();
+               ret = 1;
                spin_lock(lock);
        }
        if (need_resched()) {
                _raw_spin_unlock(lock);
                preempt_enable_no_resched();
                __cond_resched();
+               ret = 1;
                spin_lock(lock);
-               return 1;
        }
-       return 0;
+       return ret;
 }
 
 EXPORT_SYMBOL(cond_resched_lock);
@@ -3811,7 +3814,7 @@ EXPORT_SYMBOL(yield);
  */
 void __sched io_schedule(void)
 {
-       struct runqueue *rq = &per_cpu(runqueues, _smp_processor_id());
+       struct runqueue *rq = &per_cpu(runqueues, raw_smp_processor_id());
 
        atomic_inc(&rq->nr_iowait);
        schedule();
@@ -3822,7 +3825,7 @@ EXPORT_SYMBOL(io_schedule);
 
 long __sched io_schedule_timeout(long timeout)
 {
-       struct runqueue *rq = &per_cpu(runqueues, _smp_processor_id());
+       struct runqueue *rq = &per_cpu(runqueues, raw_smp_processor_id());
        long ret;
 
        atomic_inc(&rq->nr_iowait);
@@ -4243,7 +4246,7 @@ static void move_task_off_dead_cpu(int dead_cpu, struct task_struct *tsk)
 
        /* No more Mr. Nice Guy. */
        if (dest_cpu == NR_CPUS) {
-               tsk->cpus_allowed = cpuset_cpus_allowed(tsk);
+               cpus_setall(tsk->cpus_allowed);
                dest_cpu = any_online_cpu(tsk->cpus_allowed);
 
                /*
index 8f3debc77c5b2c6db5c7e360d18f9d2e2502a068..c89821b69ae3e10be8447d29d3f8bca893beb233 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/ptrace.h>
 #include <linux/posix-timers.h>
 #include <linux/signal.h>
+#include <linux/audit.h>
 #include <asm/param.h>
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
@@ -522,7 +523,16 @@ static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
 {
        int sig = 0;
 
-       sig = next_signal(pending, mask);
+       /* SIGKILL must have priority, otherwise it is quite easy
+        * to create an unkillable process, sending sig < SIGKILL
+        * to self */
+       if (unlikely(sigismember(&pending->signal, SIGKILL))) {
+               if (!sigismember(mask, SIGKILL))
+                       sig = SIGKILL;
+       }
+
+       if (likely(!sig))
+               sig = next_signal(pending, mask);
        if (sig) {
                if (current->notifier) {
                        if (sigismember(current->notifier_mask, sig)) {
@@ -658,7 +668,11 @@ static int check_kill_permission(int sig, struct siginfo *info,
            && (current->uid ^ t->suid) && (current->uid ^ t->uid)
            && !capable(CAP_KILL))
                return error;
-       return security_task_kill(t, info, sig);
+
+       error = security_task_kill(t, info, sig);
+       if (!error)
+               audit_signal_info(sig, t); /* Let audit system see the signal */
+       return error;
 }
 
 /* forward decl */
index e15ed17863f16d1c266b82124e76222f1829e26c..0c3f9d8bbe17b3bd00a1c4a77e941bbebc90e226 100644 (file)
@@ -294,7 +294,7 @@ EXPORT_SYMBOL(_spin_unlock_irq);
 void __lockfunc _spin_unlock_bh(spinlock_t *lock)
 {
        _raw_spin_unlock(lock);
-       preempt_enable();
+       preempt_enable_no_resched();
        local_bh_enable();
 }
 EXPORT_SYMBOL(_spin_unlock_bh);
@@ -318,7 +318,7 @@ EXPORT_SYMBOL(_read_unlock_irq);
 void __lockfunc _read_unlock_bh(rwlock_t *lock)
 {
        _raw_read_unlock(lock);
-       preempt_enable();
+       preempt_enable_no_resched();
        local_bh_enable();
 }
 EXPORT_SYMBOL(_read_unlock_bh);
@@ -342,7 +342,7 @@ EXPORT_SYMBOL(_write_unlock_irq);
 void __lockfunc _write_unlock_bh(rwlock_t *lock)
 {
        _raw_write_unlock(lock);
-       preempt_enable();
+       preempt_enable_no_resched();
        local_bh_enable();
 }
 EXPORT_SYMBOL(_write_unlock_bh);
@@ -354,7 +354,7 @@ int __lockfunc _spin_trylock_bh(spinlock_t *lock)
        if (_raw_spin_trylock(lock))
                return 1;
 
-       preempt_enable();
+       preempt_enable_no_resched();
        local_bh_enable();
        return 0;
 }
index 6116b25aa7cf32ad98761de21f3219b30cea31cc..84a9d18aa8da0ecb9309c6b58a2b8b694a1493e2 100644 (file)
@@ -100,7 +100,7 @@ static int stop_machine(void)
        stopmachine_state = STOPMACHINE_WAIT;
 
        for_each_online_cpu(i) {
-               if (i == _smp_processor_id())
+               if (i == raw_smp_processor_id())
                        continue;
                ret = kernel_thread(stopmachine, (void *)(long)i,CLONE_KERNEL);
                if (ret < 0)
@@ -182,7 +182,7 @@ struct task_struct *__stop_machine_run(int (*fn)(void *), void *data,
 
        /* If they don't care which CPU fn runs on, bind to any online one. */
        if (cpu == NR_CPUS)
-               cpu = _smp_processor_id();
+               cpu = raw_smp_processor_id();
 
        p = kthread_create(do_stop, &smdata, "kstopmachine");
        if (!IS_ERR(p)) {
index 0dda70ed1f983a7caaaf3434244f1ef1852918ae..6f15bea7d1a83dc363826c5bcdb2c0013feaebc0 100644 (file)
@@ -77,6 +77,7 @@ cond_syscall(sys_request_key);
 cond_syscall(sys_keyctl);
 cond_syscall(compat_sys_keyctl);
 cond_syscall(compat_sys_socketcall);
+cond_syscall(sys_set_zone_reclaim);
 
 /* arch-specific weak syscall entries */
 cond_syscall(sys_pciconfig_read);
index eeb45225248fd7cfb6c347047e93f2fcb3be00fc..2d4d4e3bc4aa47680d0e5581e4cfc4c09397b75b 100644 (file)
@@ -39,6 +39,12 @@ config ZLIB_INFLATE
 config ZLIB_DEFLATE
        tristate
 
+#
+# Generic allocator support is selected if needed
+#
+config GENERIC_ALLOCATOR
+       boolean
+
 #
 # reed solomon support is select'ed if needed
 #
index ac23847ce0e3cbcb3f006805dbd6d65a3966d399..0c421295e613f3436ddb29cf62c4823e48817762 100644 (file)
@@ -151,7 +151,8 @@ config DEBUG_FS
 
 config FRAME_POINTER
        bool "Compile the kernel with frame pointers"
-       depends on DEBUG_KERNEL && ((X86 && !X86_64) || CRIS || M68K || M68KNOMMU || FRV)
+       depends on DEBUG_KERNEL && ((X86 && !X86_64) || CRIS || M68K || M68KNOMMU || FRV || UML)
+       default y if DEBUG_INFO && UML
        help
          If you say Y here the resulting kernel image will be slightly larger
          and slower, but it will give very useful debugging information.
index 7c70db79c0e097dff88b42c49fc95cc0e0a6300d..dcb4231916e2ecb353c80cb1dc51ff5ca75b2b26 100644 (file)
@@ -4,9 +4,10 @@
 
 lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \
         bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \
-        kobject.o kref.o idr.o div64.o int_sqrt.o \
-        bitmap.o extable.o kobject_uevent.o prio_tree.o sha1.o \
-        halfmd4.o
+        idr.o div64.o int_sqrt.o bitmap.o extable.o prio_tree.o \
+        sha1.o halfmd4.o
+
+lib-y  += kobject.o kref.o kobject_uevent.o klist.o
 
 obj-y += sort.o parser.o
 
@@ -19,6 +20,7 @@ lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
 lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
 lib-$(CONFIG_GENERIC_FIND_NEXT_BIT) += find_next_bit.o
 obj-$(CONFIG_LOCK_KERNEL) += kernel_lock.o
+obj-$(CONFIG_DEBUG_PREEMPT) += smp_processor_id.o
 
 ifneq ($(CONFIG_HAVE_DEC_LOCK),y) 
   lib-y += dec_and_lock.o
@@ -28,6 +30,7 @@ obj-$(CONFIG_CRC_CCITT)       += crc-ccitt.o
 obj-$(CONFIG_CRC32)    += crc32.o
 obj-$(CONFIG_LIBCRC32C)        += libcrc32c.o
 obj-$(CONFIG_GENERIC_IOMAP) += iomap.o
+obj-$(CONFIG_GENERIC_ALLOCATOR) += genalloc.o
 
 obj-$(CONFIG_ZLIB_INFLATE) += zlib_inflate/
 obj-$(CONFIG_ZLIB_DEFLATE) += zlib_deflate/
diff --git a/lib/genalloc.c b/lib/genalloc.c
new file mode 100644 (file)
index 0000000..d6d30d2
--- /dev/null
@@ -0,0 +1,188 @@
+/*
+ * Basic general purpose allocator for managing special purpose memory
+ * not managed by the regular kmalloc/kfree interface.
+ * Uses for this includes on-device special memory, uncached memory
+ * etc.
+ *
+ * This code is based on the buddy allocator found in the sym53c8xx_2
+ * driver Copyright (C) 1999-2001  Gerard Roudier <groudier@free.fr>,
+ * and adapted for general purpose use.
+ *
+ * Copyright 2005 (C) Jes Sorensen <jes@trained-monkey.org>
+ *
+ * This source code is licensed under the GNU General Public License,
+ * Version 2.  See the file COPYING for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/mm.h>
+#include <linux/spinlock.h>
+#include <linux/genalloc.h>
+
+#include <asm/page.h>
+
+
+struct gen_pool *gen_pool_create(int nr_chunks, int max_chunk_shift,
+                                unsigned long (*fp)(struct gen_pool *),
+                                unsigned long data)
+{
+       struct gen_pool *poolp;
+       unsigned long tmp;
+       int i;
+
+       /*
+        * This is really an arbitrary limit, +10 is enough for
+        * IA64_GRANULE_SHIFT, aka 16MB. If anyone needs a large limit
+        * this can be increased without problems.
+        */
+       if ((max_chunk_shift > (PAGE_SHIFT + 10)) ||
+           ((max_chunk_shift < ALLOC_MIN_SHIFT) && max_chunk_shift))
+               return NULL;
+
+       if (!max_chunk_shift)
+               max_chunk_shift = PAGE_SHIFT;
+
+       poolp = kmalloc(sizeof(struct gen_pool), GFP_KERNEL);
+       if (!poolp)
+               return NULL;
+       memset(poolp, 0, sizeof(struct gen_pool));
+       poolp->h = kmalloc(sizeof(struct gen_pool_link) *
+                          (max_chunk_shift - ALLOC_MIN_SHIFT + 1),
+                          GFP_KERNEL);
+       if (!poolp->h) {
+               printk(KERN_WARNING "gen_pool_alloc() failed to allocate\n");
+               kfree(poolp);
+               return NULL;
+       }
+       memset(poolp->h, 0, sizeof(struct gen_pool_link) *
+              (max_chunk_shift - ALLOC_MIN_SHIFT + 1));
+
+       spin_lock_init(&poolp->lock);
+       poolp->get_new_chunk = fp;
+       poolp->max_chunk_shift = max_chunk_shift;
+       poolp->private = data;
+
+       for (i = 0; i < nr_chunks; i++) {
+               tmp = poolp->get_new_chunk(poolp);
+               printk(KERN_INFO "allocated %lx\n", tmp);
+               if (!tmp)
+                       break;
+               gen_pool_free(poolp, tmp, (1 << poolp->max_chunk_shift));
+       }
+
+       return poolp;
+}
+EXPORT_SYMBOL(gen_pool_create);
+
+
+/*
+ *  Simple power of two buddy-like generic allocator.
+ *  Provides naturally aligned memory chunks.
+ */
+unsigned long gen_pool_alloc(struct gen_pool *poolp, int size)
+{
+       int j, i, s, max_chunk_size;
+       unsigned long a, flags;
+       struct gen_pool_link *h = poolp->h;
+
+       max_chunk_size = 1 << poolp->max_chunk_shift;
+
+       if (size > max_chunk_size)
+               return 0;
+
+       i = 0;
+
+       size = max(size, 1 << ALLOC_MIN_SHIFT);
+       s = roundup_pow_of_two(size);
+
+       j = i;
+
+       spin_lock_irqsave(&poolp->lock, flags);
+       while (!h[j].next) {
+               if (s == max_chunk_size) {
+                       struct gen_pool_link *ptr;
+                       spin_unlock_irqrestore(&poolp->lock, flags);
+                       ptr = (struct gen_pool_link *)poolp->get_new_chunk(poolp);
+                       spin_lock_irqsave(&poolp->lock, flags);
+                       h[j].next = ptr;
+                       if (h[j].next)
+                               h[j].next->next = NULL;
+                       break;
+               }
+               j++;
+               s <<= 1;
+       }
+       a = (unsigned long) h[j].next;
+       if (a) {
+               h[j].next = h[j].next->next;
+               /*
+                * This should be split into a seperate function doing
+                * the chunk split in order to support custom
+                * handling memory not physically accessible by host
+                */
+               while (j > i) {
+                       j -= 1;
+                       s >>= 1;
+                       h[j].next = (struct gen_pool_link *) (a + s);
+                       h[j].next->next = NULL;
+               }
+       }
+       spin_unlock_irqrestore(&poolp->lock, flags);
+       return a;
+}
+EXPORT_SYMBOL(gen_pool_alloc);
+
+
+/*
+ *  Counter-part of the generic allocator.
+ */
+void gen_pool_free(struct gen_pool *poolp, unsigned long ptr, int size)
+{
+       struct gen_pool_link *q;
+       struct gen_pool_link *h = poolp->h;
+       unsigned long a, b, flags;
+       int i, s, max_chunk_size;
+
+       max_chunk_size = 1 << poolp->max_chunk_shift;
+
+       if (size > max_chunk_size)
+               return;
+
+       i = 0;
+
+       size = max(size, 1 << ALLOC_MIN_SHIFT);
+       s = roundup_pow_of_two(size);
+
+       a = ptr;
+
+       spin_lock_irqsave(&poolp->lock, flags);
+       while (1) {
+               if (s == max_chunk_size) {
+                       ((struct gen_pool_link *)a)->next = h[i].next;
+                       h[i].next = (struct gen_pool_link *)a;
+                       break;
+               }
+               b = a ^ s;
+               q = &h[i];
+
+               while (q->next && q->next != (struct gen_pool_link *)b)
+                       q = q->next;
+
+               if (!q->next) {
+                       ((struct gen_pool_link *)a)->next = h[i].next;
+                       h[i].next = (struct gen_pool_link *)a;
+                       break;
+               }
+               q->next = q->next->next;
+               a = a & b;
+               s <<= 1;
+               i++;
+       }
+       spin_unlock_irqrestore(&poolp->lock, flags);
+}
+EXPORT_SYMBOL(gen_pool_free);
index 81fc430602ee8f4c2b4e336a606813ad54b0e5b2..c5be889de449555dc31b5c5d50a061f34187fdb6 100644 (file)
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -175,7 +175,7 @@ build_up:
         * Add a new layer to the top of the tree if the requested
         * id is larger than the currently allocated space.
         */
-       while ((layers < MAX_LEVEL) && (id >= (1 << (layers*IDR_BITS)))) {
+       while ((layers < (MAX_LEVEL - 1)) && (id >= (1 << (layers*IDR_BITS)))) {
                layers++;
                if (!p->count)
                        continue;
index 99b0ae3d51dded390d221525b2cd2389d845ca8c..bd2bc5d887b815e261ff82c4167e410966b659d3 100644 (file)
@@ -9,61 +9,6 @@
 #include <linux/module.h>
 #include <linux/kallsyms.h>
 
-#if defined(CONFIG_PREEMPT) && defined(__smp_processor_id) && \
-               defined(CONFIG_DEBUG_PREEMPT)
-
-/*
- * Debugging check.
- */
-unsigned int smp_processor_id(void)
-{
-       unsigned long preempt_count = preempt_count();
-       int this_cpu = __smp_processor_id();
-       cpumask_t this_mask;
-
-       if (likely(preempt_count))
-               goto out;
-
-       if (irqs_disabled())
-               goto out;
-
-       /*
-        * Kernel threads bound to a single CPU can safely use
-        * smp_processor_id():
-        */
-       this_mask = cpumask_of_cpu(this_cpu);
-
-       if (cpus_equal(current->cpus_allowed, this_mask))
-               goto out;
-
-       /*
-        * It is valid to assume CPU-locality during early bootup:
-        */
-       if (system_state != SYSTEM_RUNNING)
-               goto out;
-
-       /*
-        * Avoid recursion:
-        */
-       preempt_disable();
-
-       if (!printk_ratelimit())
-               goto out_enable;
-
-       printk(KERN_ERR "BUG: using smp_processor_id() in preemptible [%08x] code: %s/%d\n", preempt_count(), current->comm, current->pid);
-       print_symbol("caller is %s\n", (long)__builtin_return_address(0));
-       dump_stack();
-
-out_enable:
-       preempt_enable_no_resched();
-out:
-       return this_cpu;
-}
-
-EXPORT_SYMBOL(smp_processor_id);
-
-#endif /* PREEMPT && __smp_processor_id && DEBUG_PREEMPT */
-
 #ifdef CONFIG_PREEMPT_BKL
 /*
  * The 'big kernel semaphore'
diff --git a/lib/klist.c b/lib/klist.c
new file mode 100644 (file)
index 0000000..738ab81
--- /dev/null
@@ -0,0 +1,265 @@
+/*
+ *     klist.c - Routines for manipulating klists.
+ *
+ *
+ *     This klist interface provides a couple of structures that wrap around 
+ *     struct list_head to provide explicit list "head" (struct klist) and 
+ *     list "node" (struct klist_node) objects. For struct klist, a spinlock
+ *     is included that protects access to the actual list itself. struct 
+ *     klist_node provides a pointer to the klist that owns it and a kref
+ *     reference count that indicates the number of current users of that node
+ *     in the list.
+ *
+ *     The entire point is to provide an interface for iterating over a list
+ *     that is safe and allows for modification of the list during the
+ *     iteration (e.g. insertion and removal), including modification of the
+ *     current node on the list.
+ *
+ *     It works using a 3rd object type - struct klist_iter - that is declared
+ *     and initialized before an iteration. klist_next() is used to acquire the
+ *     next element in the list. It returns NULL if there are no more items.
+ *     Internally, that routine takes the klist's lock, decrements the reference
+ *     count of the previous klist_node and increments the count of the next
+ *     klist_node. It then drops the lock and returns.
+ *
+ *     There are primitives for adding and removing nodes to/from a klist. 
+ *     When deleting, klist_del() will simply decrement the reference count. 
+ *     Only when the count goes to 0 is the node removed from the list. 
+ *     klist_remove() will try to delete the node from the list and block
+ *     until it is actually removed. This is useful for objects (like devices)
+ *     that have been removed from the system and must be freed (but must wait
+ *     until all accessors have finished).
+ *
+ *     Copyright (C) 2005 Patrick Mochel
+ *
+ *     This file is released under the GPL v2.
+ */
+
+#include <linux/klist.h>
+#include <linux/module.h>
+
+
+/**
+ *     klist_init - Initialize a klist structure. 
+ *     @k:     The klist we're initializing.
+ */
+
+void klist_init(struct klist * k)
+{
+       INIT_LIST_HEAD(&k->k_list);
+       spin_lock_init(&k->k_lock);
+}
+
+EXPORT_SYMBOL_GPL(klist_init);
+
+
+static void add_head(struct klist * k, struct klist_node * n)
+{
+       spin_lock(&k->k_lock);
+       list_add(&n->n_node, &k->k_list);
+       spin_unlock(&k->k_lock);
+}
+
+static void add_tail(struct klist * k, struct klist_node * n)
+{
+       spin_lock(&k->k_lock);
+       list_add_tail(&n->n_node, &k->k_list);
+       spin_unlock(&k->k_lock);
+}
+
+
+static void klist_node_init(struct klist * k, struct klist_node * n)
+{
+       INIT_LIST_HEAD(&n->n_node);
+       init_completion(&n->n_removed);
+       kref_init(&n->n_ref);
+       n->n_klist = k;
+}
+
+
+/**
+ *     klist_add_head - Initialize a klist_node and add it to front.
+ *     @k:     klist it's going on.
+ *     @n:     node we're adding.
+ */
+
+void klist_add_head(struct klist * k, struct klist_node * n)
+{
+       klist_node_init(k, n);
+       add_head(k, n);
+}
+
+EXPORT_SYMBOL_GPL(klist_add_head);
+
+
+/**
+ *     klist_add_tail - Initialize a klist_node and add it to back.
+ *     @k:     klist it's going on.
+ *     @n:     node we're adding.
+ */
+
+void klist_add_tail(struct klist * k, struct klist_node * n)
+{
+       klist_node_init(k, n);
+       add_tail(k, n);
+}
+
+EXPORT_SYMBOL_GPL(klist_add_tail);
+
+
+static void klist_release(struct kref * kref)
+{
+       struct klist_node * n = container_of(kref, struct klist_node, n_ref);
+       list_del(&n->n_node);
+       complete(&n->n_removed);
+       n->n_klist = NULL;
+}
+
+static int klist_dec_and_del(struct klist_node * n)
+{
+       return kref_put(&n->n_ref, klist_release);
+}
+
+
+/**
+ *     klist_del - Decrement the reference count of node and try to remove.
+ *     @n:     node we're deleting.
+ */
+
+void klist_del(struct klist_node * n)
+{
+       struct klist * k = n->n_klist;
+
+       spin_lock(&k->k_lock);
+       klist_dec_and_del(n);
+       spin_unlock(&k->k_lock);
+}
+
+EXPORT_SYMBOL_GPL(klist_del);
+
+
+/**
+ *     klist_remove - Decrement the refcount of node and wait for it to go away.
+ *     @n:     node we're removing.
+ */
+
+void klist_remove(struct klist_node * n)
+{
+       struct klist * k = n->n_klist;
+       spin_lock(&k->k_lock);
+       klist_dec_and_del(n);
+       spin_unlock(&k->k_lock);
+       wait_for_completion(&n->n_removed);
+}
+
+EXPORT_SYMBOL_GPL(klist_remove);
+
+
+/**
+ *     klist_node_attached - Say whether a node is bound to a list or not.
+ *     @n:     Node that we're testing.
+ */
+
+int klist_node_attached(struct klist_node * n)
+{
+       return (n->n_klist != NULL);
+}
+
+EXPORT_SYMBOL_GPL(klist_node_attached);
+
+
+/**
+ *     klist_iter_init_node - Initialize a klist_iter structure.
+ *     @k:     klist we're iterating.
+ *     @i:     klist_iter we're filling.
+ *     @n:     node to start with.
+ *
+ *     Similar to klist_iter_init(), but starts the action off with @n, 
+ *     instead of with the list head.
+ */
+
+void klist_iter_init_node(struct klist * k, struct klist_iter * i, struct klist_node * n)
+{
+       i->i_klist = k;
+       i->i_head = &k->k_list;
+       i->i_cur = n;
+}
+
+EXPORT_SYMBOL_GPL(klist_iter_init_node);
+
+
+/**
+ *     klist_iter_init - Iniitalize a klist_iter structure.
+ *     @k:     klist we're iterating.
+ *     @i:     klist_iter structure we're filling.
+ *
+ *     Similar to klist_iter_init_node(), but start with the list head.
+ */
+
+void klist_iter_init(struct klist * k, struct klist_iter * i)
+{
+       klist_iter_init_node(k, i, NULL);
+}
+
+EXPORT_SYMBOL_GPL(klist_iter_init);
+
+
+/**
+ *     klist_iter_exit - Finish a list iteration.
+ *     @i:     Iterator structure.
+ *
+ *     Must be called when done iterating over list, as it decrements the 
+ *     refcount of the current node. Necessary in case iteration exited before
+ *     the end of the list was reached, and always good form.
+ */
+
+void klist_iter_exit(struct klist_iter * i)
+{
+       if (i->i_cur) {
+               klist_del(i->i_cur);
+               i->i_cur = NULL;
+       }
+}
+
+EXPORT_SYMBOL_GPL(klist_iter_exit);
+
+
+static struct klist_node * to_klist_node(struct list_head * n)
+{
+       return container_of(n, struct klist_node, n_node);
+}
+
+
+/**
+ *     klist_next - Ante up next node in list.
+ *     @i:     Iterator structure.
+ *
+ *     First grab list lock. Decrement the reference count of the previous
+ *     node, if there was one. Grab the next node, increment its reference 
+ *     count, drop the lock, and return that next node.
+ */
+
+struct klist_node * klist_next(struct klist_iter * i)
+{
+       struct list_head * next;
+       struct klist_node * knode = NULL;
+
+       spin_lock(&i->i_klist->k_lock);
+       if (i->i_cur) {
+               next = i->i_cur->n_node.next;
+               klist_dec_and_del(i->i_cur);
+       } else
+               next = i->i_head->next;
+
+       if (next != i->i_head) {
+               knode = to_klist_node(next);
+               kref_get(&knode->n_ref);
+       }
+       i->i_cur = knode;
+       spin_unlock(&i->i_klist->k_lock);
+       return knode;
+}
+
+EXPORT_SYMBOL_GPL(klist_next);
+
+
index 94048826624ccd230cd213ce8c14ddea0d6ab191..dd0917dd9fa9df9274b24e6acbe3abddaa3b17ed 100644 (file)
@@ -279,7 +279,7 @@ EXPORT_SYMBOL(kobject_set_name);
  *     @new_name: object's new name
  */
 
-int kobject_rename(struct kobject * kobj, char *new_name)
+int kobject_rename(struct kobject * kobj, const char *new_name)
 {
        int error = 0;
 
index 2a4e7671eaf4089bc03f96fdfa133723494af71a..8e49d21057e48f1294786a2acbc7f9d4c930c744 100644 (file)
@@ -197,7 +197,7 @@ void kobject_hotplug(struct kobject *kobj, enum kobject_action action)
        int i = 0;
        int retval;
        char *kobj_path = NULL;
-       char *name = NULL;
+       const char *name = NULL;
        char *action_string;
        u64 seq;
        struct kobject *top_kobj = kobj;
@@ -246,10 +246,10 @@ void kobject_hotplug(struct kobject *kobj, enum kobject_action action)
        if (hotplug_ops->name)
                name = hotplug_ops->name(kset, kobj);
        if (name == NULL)
-               name = kset->kobj.name;
+               name = kobject_name(&kset->kobj);
 
        argv [0] = hotplug_path;
-       argv [1] = name;
+       argv [1] = (char *)name; /* won't be changed but 'const' has to go */
        argv [2] = NULL;
 
        /* minimal command environment */
diff --git a/lib/smp_processor_id.c b/lib/smp_processor_id.c
new file mode 100644 (file)
index 0000000..42c08ef
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * lib/smp_processor_id.c
+ *
+ * DEBUG_PREEMPT variant of smp_processor_id().
+ */
+#include <linux/module.h>
+#include <linux/kallsyms.h>
+
+unsigned int debug_smp_processor_id(void)
+{
+       unsigned long preempt_count = preempt_count();
+       int this_cpu = raw_smp_processor_id();
+       cpumask_t this_mask;
+
+       if (likely(preempt_count))
+               goto out;
+
+       if (irqs_disabled())
+               goto out;
+
+       /*
+        * Kernel threads bound to a single CPU can safely use
+        * smp_processor_id():
+        */
+       this_mask = cpumask_of_cpu(this_cpu);
+
+       if (cpus_equal(current->cpus_allowed, this_mask))
+               goto out;
+
+       /*
+        * It is valid to assume CPU-locality during early bootup:
+        */
+       if (system_state != SYSTEM_RUNNING)
+               goto out;
+
+       /*
+        * Avoid recursion:
+        */
+       preempt_disable();
+
+       if (!printk_ratelimit())
+               goto out_enable;
+
+       printk(KERN_ERR "BUG: using smp_processor_id() in preemptible [%08x] code: %s/%d\n", preempt_count(), current->comm, current->pid);
+       print_symbol("caller is %s\n", (long)__builtin_return_address(0));
+       dump_stack();
+
+out_enable:
+       preempt_enable_no_resched();
+out:
+       return this_cpu;
+}
+
+EXPORT_SYMBOL(debug_smp_processor_id);
+
index 47263ac3e4ea8ef73ea1d955624a23295e514f72..4a2fee2cb62bad714491e1e910406ecd66dc2557 100644 (file)
@@ -1004,7 +1004,7 @@ __generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
                if (pos < size) {
                        retval = generic_file_direct_IO(READ, iocb,
                                                iov, pos, nr_segs);
-                       if (retval >= 0 && !is_sync_kiocb(iocb))
+                       if (retval > 0 && !is_sync_kiocb(iocb))
                                retval = -EIOCBQUEUED;
                        if (retval > 0)
                                *ppos = pos + retval;
@@ -1968,6 +1968,7 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov,
        do {
                unsigned long index;
                unsigned long offset;
+               unsigned long maxlen;
                size_t copied;
 
                offset = (pos & (PAGE_CACHE_SIZE -1)); /* Within page */
@@ -1982,7 +1983,10 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov,
                 * same page as we're writing to, without it being marked
                 * up-to-date.
                 */
-               fault_in_pages_readable(buf, bytes);
+               maxlen = cur_iov->iov_len - iov_base;
+               if (maxlen > bytes)
+                       maxlen = bytes;
+               fault_in_pages_readable(buf, maxlen);
 
                page = __grab_cache_page(mapping,index,&cached_page,&lru_pvec);
                if (!page) {
@@ -2024,6 +2028,8 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov,
                                        filemap_set_next_iovec(&cur_iov,
                                                        &iov_base, status);
                                        buf = cur_iov->iov_base + iov_base;
+                               } else {
+                                       iov_base += status;
                                }
                        }
                }
index 4eb5ae3fbe10d3f34aca918c3325c62f76bdd8ee..fbd1111ea1194fc106042d57d2115a743dce7ced 100644 (file)
@@ -7,10 +7,14 @@
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/mm.h>
-#include <linux/hugetlb.h>
 #include <linux/sysctl.h>
 #include <linux/highmem.h>
 #include <linux/nodemask.h>
+#include <linux/pagemap.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+
+#include <linux/hugetlb.h>
 
 const unsigned long hugetlb_zero = 0, hugetlb_infinity = ~0UL;
 static unsigned long nr_huge_pages, free_huge_pages;
@@ -249,6 +253,72 @@ struct vm_operations_struct hugetlb_vm_ops = {
        .nopage = hugetlb_nopage,
 };
 
+static pte_t make_huge_pte(struct vm_area_struct *vma, struct page *page)
+{
+       pte_t entry;
+
+       if (vma->vm_flags & VM_WRITE) {
+               entry =
+                   pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
+       } else {
+               entry = pte_wrprotect(mk_pte(page, vma->vm_page_prot));
+       }
+       entry = pte_mkyoung(entry);
+       entry = pte_mkhuge(entry);
+
+       return entry;
+}
+
+int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
+                           struct vm_area_struct *vma)
+{
+       pte_t *src_pte, *dst_pte, entry;
+       struct page *ptepage;
+       unsigned long addr = vma->vm_start;
+       unsigned long end = vma->vm_end;
+
+       while (addr < end) {
+               dst_pte = huge_pte_alloc(dst, addr);
+               if (!dst_pte)
+                       goto nomem;
+               src_pte = huge_pte_offset(src, addr);
+               BUG_ON(!src_pte || pte_none(*src_pte)); /* prefaulted */
+               entry = *src_pte;
+               ptepage = pte_page(entry);
+               get_page(ptepage);
+               add_mm_counter(dst, rss, HPAGE_SIZE / PAGE_SIZE);
+               set_huge_pte_at(dst, addr, dst_pte, entry);
+               addr += HPAGE_SIZE;
+       }
+       return 0;
+
+nomem:
+       return -ENOMEM;
+}
+
+void unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start,
+                         unsigned long end)
+{
+       struct mm_struct *mm = vma->vm_mm;
+       unsigned long address;
+       pte_t pte;
+       struct page *page;
+
+       WARN_ON(!is_vm_hugetlb_page(vma));
+       BUG_ON(start & ~HPAGE_MASK);
+       BUG_ON(end & ~HPAGE_MASK);
+
+       for (address = start; address < end; address += HPAGE_SIZE) {
+               pte = huge_ptep_get_and_clear(mm, address, huge_pte_offset(mm, address));
+               if (pte_none(pte))
+                       continue;
+               page = pte_page(pte);
+               put_page(page);
+       }
+       add_mm_counter(mm, rss,  -((end - start) >> PAGE_SHIFT));
+       flush_tlb_range(vma, start, end);
+}
+
 void zap_hugepage_range(struct vm_area_struct *vma,
                        unsigned long start, unsigned long length)
 {
@@ -258,3 +328,108 @@ void zap_hugepage_range(struct vm_area_struct *vma,
        unmap_hugepage_range(vma, start, start + length);
        spin_unlock(&mm->page_table_lock);
 }
+
+int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
+{
+       struct mm_struct *mm = current->mm;
+       unsigned long addr;
+       int ret = 0;
+
+       WARN_ON(!is_vm_hugetlb_page(vma));
+       BUG_ON(vma->vm_start & ~HPAGE_MASK);
+       BUG_ON(vma->vm_end & ~HPAGE_MASK);
+
+       hugetlb_prefault_arch_hook(mm);
+
+       spin_lock(&mm->page_table_lock);
+       for (addr = vma->vm_start; addr < vma->vm_end; addr += HPAGE_SIZE) {
+               unsigned long idx;
+               pte_t *pte = huge_pte_alloc(mm, addr);
+               struct page *page;
+
+               if (!pte) {
+                       ret = -ENOMEM;
+                       goto out;
+               }
+               if (! pte_none(*pte))
+                       hugetlb_clean_stale_pgtable(pte);
+
+               idx = ((addr - vma->vm_start) >> HPAGE_SHIFT)
+                       + (vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT));
+               page = find_get_page(mapping, idx);
+               if (!page) {
+                       /* charge the fs quota first */
+                       if (hugetlb_get_quota(mapping)) {
+                               ret = -ENOMEM;
+                               goto out;
+                       }
+                       page = alloc_huge_page();
+                       if (!page) {
+                               hugetlb_put_quota(mapping);
+                               ret = -ENOMEM;
+                               goto out;
+                       }
+                       ret = add_to_page_cache(page, mapping, idx, GFP_ATOMIC);
+                       if (! ret) {
+                               unlock_page(page);
+                       } else {
+                               hugetlb_put_quota(mapping);
+                               free_huge_page(page);
+                               goto out;
+                       }
+               }
+               add_mm_counter(mm, rss, HPAGE_SIZE / PAGE_SIZE);
+               set_huge_pte_at(mm, addr, pte, make_huge_pte(vma, page));
+       }
+out:
+       spin_unlock(&mm->page_table_lock);
+       return ret;
+}
+
+int follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma,
+                       struct page **pages, struct vm_area_struct **vmas,
+                       unsigned long *position, int *length, int i)
+{
+       unsigned long vpfn, vaddr = *position;
+       int remainder = *length;
+
+       BUG_ON(!is_vm_hugetlb_page(vma));
+
+       vpfn = vaddr/PAGE_SIZE;
+       while (vaddr < vma->vm_end && remainder) {
+
+               if (pages) {
+                       pte_t *pte;
+                       struct page *page;
+
+                       /* Some archs (sparc64, sh*) have multiple
+                        * pte_ts to each hugepage.  We have to make
+                        * sure we get the first, for the page
+                        * indexing below to work. */
+                       pte = huge_pte_offset(mm, vaddr & HPAGE_MASK);
+
+                       /* hugetlb should be locked, and hence, prefaulted */
+                       WARN_ON(!pte || pte_none(*pte));
+
+                       page = &pte_page(*pte)[vpfn % (HPAGE_SIZE/PAGE_SIZE)];
+
+                       WARN_ON(!PageCompound(page));
+
+                       get_page(page);
+                       pages[i] = page;
+               }
+
+               if (vmas)
+                       vmas[i] = vma;
+
+               vaddr += PAGE_SIZE;
+               ++vpfn;
+               --remainder;
+               ++i;
+       }
+
+       *length = remainder;
+       *position = vaddr;
+
+       return i;
+}
index 944b5e52d812f051fb2bffaed33a4288ba4c920e..e3108054733c2530fd28114b4814e27eda106ac0 100644 (file)
@@ -8,17 +8,47 @@
 #include <linux/mman.h>
 #include <linux/pagemap.h>
 #include <linux/syscalls.h>
+#include <linux/mempolicy.h>
 #include <linux/hugetlb.h>
 
 /*
  * We can potentially split a vm area into separate
  * areas, each area with its own behavior.
  */
-static long madvise_behavior(struct vm_area_struct * vma, unsigned long start,
-                            unsigned long end, int behavior)
+static long madvise_behavior(struct vm_area_struct * vma,
+                    struct vm_area_struct **prev,
+                    unsigned long start, unsigned long end, int behavior)
 {
        struct mm_struct * mm = vma->vm_mm;
        int error = 0;
+       pgoff_t pgoff;
+       int new_flags = vma->vm_flags & ~VM_READHINTMASK;
+
+       switch (behavior) {
+       case MADV_SEQUENTIAL:
+               new_flags |= VM_SEQ_READ;
+               break;
+       case MADV_RANDOM:
+               new_flags |= VM_RAND_READ;
+               break;
+       default:
+               break;
+       }
+
+       if (new_flags == vma->vm_flags) {
+               *prev = vma;
+               goto success;
+       }
+
+       pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT);
+       *prev = vma_merge(mm, *prev, start, end, new_flags, vma->anon_vma,
+                               vma->vm_file, pgoff, vma_policy(vma));
+       if (*prev) {
+               vma = *prev;
+               goto success;
+       }
+
+       *prev = vma;
 
        if (start != vma->vm_start) {
                error = split_vma(mm, vma, start, 1);
@@ -36,21 +66,12 @@ static long madvise_behavior(struct vm_area_struct * vma, unsigned long start,
         * vm_flags is protected by the mmap_sem held in write mode.
         */
        VM_ClearReadHint(vma);
-
-       switch (behavior) {
-       case MADV_SEQUENTIAL:
-               vma->vm_flags |= VM_SEQ_READ;
-               break;
-       case MADV_RANDOM:
-               vma->vm_flags |= VM_RAND_READ;
-               break;
-       default:
-               break;
-       }
+       vma->vm_flags = new_flags;
 
 out:
        if (error == -ENOMEM)
                error = -EAGAIN;
+success:
        return error;
 }
 
@@ -58,6 +79,7 @@ out:
  * Schedule all required I/O operations.  Do not wait for completion.
  */
 static long madvise_willneed(struct vm_area_struct * vma,
+                            struct vm_area_struct ** prev,
                             unsigned long start, unsigned long end)
 {
        struct file *file = vma->vm_file;
@@ -65,6 +87,7 @@ static long madvise_willneed(struct vm_area_struct * vma,
        if (!file)
                return -EBADF;
 
+       *prev = vma;
        start = ((start - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
        if (end > vma->vm_end)
                end = vma->vm_end;
@@ -95,8 +118,10 @@ static long madvise_willneed(struct vm_area_struct * vma,
  * dirty pages is already available as msync(MS_INVALIDATE).
  */
 static long madvise_dontneed(struct vm_area_struct * vma,
+                            struct vm_area_struct ** prev,
                             unsigned long start, unsigned long end)
 {
+       *prev = vma;
        if ((vma->vm_flags & VM_LOCKED) || is_vm_hugetlb_page(vma))
                return -EINVAL;
 
@@ -111,8 +136,8 @@ static long madvise_dontneed(struct vm_area_struct * vma,
        return 0;
 }
 
-static long madvise_vma(struct vm_area_struct * vma, unsigned long start,
-                       unsigned long end, int behavior)
+static long madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev,
+                       unsigned long start, unsigned long end, int behavior)
 {
        long error = -EBADF;
 
@@ -120,15 +145,15 @@ static long madvise_vma(struct vm_area_struct * vma, unsigned long start,
        case MADV_NORMAL:
        case MADV_SEQUENTIAL:
        case MADV_RANDOM:
-               error = madvise_behavior(vma, start, end, behavior);
+               error = madvise_behavior(vma, prev, start, end, behavior);
                break;
 
        case MADV_WILLNEED:
-               error = madvise_willneed(vma, start, end);
+               error = madvise_willneed(vma, prev, start, end);
                break;
 
        case MADV_DONTNEED:
-               error = madvise_dontneed(vma, start, end);
+               error = madvise_dontneed(vma, prev, start, end);
                break;
 
        default:
@@ -175,8 +200,8 @@ static long madvise_vma(struct vm_area_struct * vma, unsigned long start,
  */
 asmlinkage long sys_madvise(unsigned long start, size_t len_in, int behavior)
 {
-       unsigned long end;
-       struct vm_area_struct * vma;
+       unsigned long end, tmp;
+       struct vm_area_struct * vma, *prev;
        int unmapped_error = 0;
        int error = -EINVAL;
        size_t len;
@@ -202,40 +227,42 @@ asmlinkage long sys_madvise(unsigned long start, size_t len_in, int behavior)
        /*
         * If the interval [start,end) covers some unmapped address
         * ranges, just ignore them, but return -ENOMEM at the end.
+        * - different from the way of handling in mlock etc.
         */
-       vma = find_vma(current->mm, start);
+       vma = find_vma_prev(current->mm, start, &prev);
+       if (!vma && prev)
+               vma = prev->vm_next;
        for (;;) {
                /* Still start < end. */
                error = -ENOMEM;
                if (!vma)
                        goto out;
 
-               /* Here start < vma->vm_end. */
+               /* Here start < (end|vma->vm_end). */
                if (start < vma->vm_start) {
                        unmapped_error = -ENOMEM;
                        start = vma->vm_start;
+                       if (start >= end)
+                               goto out;
                }
 
-               /* Here vma->vm_start <= start < vma->vm_end. */
-               if (end <= vma->vm_end) {
-                       if (start < end) {
-                               error = madvise_vma(vma, start, end,
-                                                       behavior);
-                               if (error)
-                                       goto out;
-                       }
-                       error = unmapped_error;
-                       goto out;
-               }
+               /* Here vma->vm_start <= start < (end|vma->vm_end) */
+               tmp = vma->vm_end;
+               if (end < tmp)
+                       tmp = end;
 
-               /* Here vma->vm_start <= start < vma->vm_end < end. */
-               error = madvise_vma(vma, start, vma->vm_end, behavior);
+               /* Here vma->vm_start <= start < tmp <= (end|vma->vm_end). */
+               error = madvise_vma(vma, &prev, start, tmp, behavior);
                if (error)
                        goto out;
-               start = vma->vm_end;
-               vma = vma->vm_next;
+               start = tmp;
+               if (start < prev->vm_end)
+                       start = prev->vm_end;
+               error = unmapped_error;
+               if (start >= end)
+                       goto out;
+               vma = prev->vm_next;
        }
-
 out:
        up_write(&current->mm->mmap_sem);
        return error;
index 6bad4c4064e7e0bae9886d976ccd7fbde8ccf753..da91b7bf998605677a87d4d0500dde2acf11aa28 100644 (file)
@@ -840,23 +840,8 @@ check_user_page_readable(struct mm_struct *mm, unsigned long address)
 {
        return __follow_page(mm, address, /*read*/1, /*write*/0) != NULL;
 }
-
 EXPORT_SYMBOL(check_user_page_readable);
 
-/* 
- * Given a physical address, is there a useful struct page pointing to
- * it?  This may become more complex in the future if we start dealing
- * with IO-aperture pages for direct-IO.
- */
-
-static inline struct page *get_page_map(struct page *page)
-{
-       if (!pfn_valid(page_to_pfn(page)))
-               return NULL;
-       return page;
-}
-
-
 static inline int
 untouched_anonymous_page(struct mm_struct* mm, struct vm_area_struct *vma,
                         unsigned long address)
@@ -887,7 +872,6 @@ untouched_anonymous_page(struct mm_struct* mm, struct vm_area_struct *vma,
        return 0;
 }
 
-
 int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
                unsigned long start, int len, int write, int force,
                struct page **pages, struct vm_area_struct **vmas)
@@ -951,21 +935,21 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
                }
                spin_lock(&mm->page_table_lock);
                do {
-                       struct page *map;
+                       struct page *page;
                        int lookup_write = write;
 
                        cond_resched_lock(&mm->page_table_lock);
-                       while (!(map = follow_page(mm, start, lookup_write))) {
+                       while (!(page = follow_page(mm, start, lookup_write))) {
                                /*
                                 * Shortcut for anonymous pages. We don't want
                                 * to force the creation of pages tables for
-                                * insanly big anonymously mapped areas that
+                                * insanely big anonymously mapped areas that
                                 * nobody touched so far. This is important
                                 * for doing a core dump for these mappings.
                                 */
                                if (!lookup_write &&
                                    untouched_anonymous_page(mm,vma,start)) {
-                                       map = ZERO_PAGE(start);
+                                       page = ZERO_PAGE(start);
                                        break;
                                }
                                spin_unlock(&mm->page_table_lock);
@@ -994,30 +978,21 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
                                spin_lock(&mm->page_table_lock);
                        }
                        if (pages) {
-                               pages[i] = get_page_map(map);
-                               if (!pages[i]) {
-                                       spin_unlock(&mm->page_table_lock);
-                                       while (i--)
-                                               page_cache_release(pages[i]);
-                                       i = -EFAULT;
-                                       goto out;
-                               }
-                               flush_dcache_page(pages[i]);
-                               if (!PageReserved(pages[i]))
-                                       page_cache_get(pages[i]);
+                               pages[i] = page;
+                               flush_dcache_page(page);
+                               if (!PageReserved(page))
+                                       page_cache_get(page);
                        }
                        if (vmas)
                                vmas[i] = vma;
                        i++;
                        start += PAGE_SIZE;
                        len--;
-               } while(len && start < vma->vm_end);
+               } while (len && start < vma->vm_end);
                spin_unlock(&mm->page_table_lock);
-       } while(len);
-out:
+       } while (len);
        return i;
 }
-
 EXPORT_SYMBOL(get_user_pages);
 
 static int zeromap_pte_range(struct mm_struct *mm, pmd_t *pmd,
@@ -1264,7 +1239,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct * vma,
        }
        old_page = pfn_to_page(pfn);
 
-       if (!TestSetPageLocked(old_page)) {
+       if (PageAnon(old_page) && !TestSetPageLocked(old_page)) {
                int reuse = can_share_swap_page(old_page);
                unlock_page(old_page);
                if (reuse) {
@@ -1701,19 +1676,16 @@ static int do_swap_page(struct mm_struct * mm,
        spin_lock(&mm->page_table_lock);
        page_table = pte_offset_map(pmd, address);
        if (unlikely(!pte_same(*page_table, orig_pte))) {
-               pte_unmap(page_table);
-               spin_unlock(&mm->page_table_lock);
-               unlock_page(page);
-               page_cache_release(page);
                ret = VM_FAULT_MINOR;
-               goto out;
+               goto out_nomap;
+       }
+
+       if (unlikely(!PageUptodate(page))) {
+               ret = VM_FAULT_SIGBUS;
+               goto out_nomap;
        }
 
        /* The page isn't present yet, go ahead with the fault. */
-               
-       swap_free(entry);
-       if (vm_swap_full())
-               remove_exclusive_swap_page(page);
 
        inc_mm_counter(mm, rss);
        pte = mk_pte(page, vma->vm_page_prot);
@@ -1721,12 +1693,16 @@ static int do_swap_page(struct mm_struct * mm,
                pte = maybe_mkwrite(pte_mkdirty(pte), vma);
                write_access = 0;
        }
-       unlock_page(page);
 
        flush_icache_page(vma, page);
        set_pte_at(mm, address, page_table, pte);
        page_add_anon_rmap(page, vma, address);
 
+       swap_free(entry);
+       if (vm_swap_full())
+               remove_exclusive_swap_page(page);
+       unlock_page(page);
+
        if (write_access) {
                if (do_wp_page(mm, vma, address,
                                page_table, pmd, pte) == VM_FAULT_OOM)
@@ -1741,6 +1717,12 @@ static int do_swap_page(struct mm_struct * mm,
        spin_unlock(&mm->page_table_lock);
 out:
        return ret;
+out_nomap:
+       pte_unmap(page_table);
+       spin_unlock(&mm->page_table_lock);
+       unlock_page(page);
+       page_cache_release(page);
+       goto out;
 }
 
 /*
index 08c41da429cf015e9c22443ae5d811d4f5fa3569..cb41c31e7c875873f96a5c6d24ab91ab17d3311c 100644 (file)
@@ -238,46 +238,80 @@ static struct mempolicy *mpol_new(int mode, unsigned long *nodes)
 }
 
 /* Ensure all existing pages follow the policy. */
-static int
-verify_pages(struct mm_struct *mm,
-            unsigned long addr, unsigned long end, unsigned long *nodes)
+static int check_pte_range(struct mm_struct *mm, pmd_t *pmd,
+               unsigned long addr, unsigned long end, unsigned long *nodes)
 {
-       while (addr < end) {
-               struct page *p;
-               pte_t *pte;
-               pmd_t *pmd;
-               pud_t *pud;
-               pgd_t *pgd;
-               pgd = pgd_offset(mm, addr);
-               if (pgd_none(*pgd)) {
-                       unsigned long next = (addr + PGDIR_SIZE) & PGDIR_MASK;
-                       if (next > addr)
-                               break;
-                       addr = next;
+       pte_t *orig_pte;
+       pte_t *pte;
+
+       spin_lock(&mm->page_table_lock);
+       orig_pte = pte = pte_offset_map(pmd, addr);
+       do {
+               unsigned long pfn;
+               unsigned int nid;
+
+               if (!pte_present(*pte))
                        continue;
-               }
-               pud = pud_offset(pgd, addr);
-               if (pud_none(*pud)) {
-                       addr = (addr + PUD_SIZE) & PUD_MASK;
+               pfn = pte_pfn(*pte);
+               if (!pfn_valid(pfn))
                        continue;
-               }
-               pmd = pmd_offset(pud, addr);
-               if (pmd_none(*pmd)) {
-                       addr = (addr + PMD_SIZE) & PMD_MASK;
+               nid = pfn_to_nid(pfn);
+               if (!test_bit(nid, nodes))
+                       break;
+       } while (pte++, addr += PAGE_SIZE, addr != end);
+       pte_unmap(orig_pte);
+       spin_unlock(&mm->page_table_lock);
+       return addr != end;
+}
+
+static inline int check_pmd_range(struct mm_struct *mm, pud_t *pud,
+               unsigned long addr, unsigned long end, unsigned long *nodes)
+{
+       pmd_t *pmd;
+       unsigned long next;
+
+       pmd = pmd_offset(pud, addr);
+       do {
+               next = pmd_addr_end(addr, end);
+               if (pmd_none_or_clear_bad(pmd))
                        continue;
-               }
-               p = NULL;
-               pte = pte_offset_map(pmd, addr);
-               if (pte_present(*pte))
-                       p = pte_page(*pte);
-               pte_unmap(pte);
-               if (p) {
-                       unsigned nid = page_to_nid(p);
-                       if (!test_bit(nid, nodes))
-                               return -EIO;
-               }
-               addr += PAGE_SIZE;
-       }
+               if (check_pte_range(mm, pmd, addr, next, nodes))
+                       return -EIO;
+       } while (pmd++, addr = next, addr != end);
+       return 0;
+}
+
+static inline int check_pud_range(struct mm_struct *mm, pgd_t *pgd,
+               unsigned long addr, unsigned long end, unsigned long *nodes)
+{
+       pud_t *pud;
+       unsigned long next;
+
+       pud = pud_offset(pgd, addr);
+       do {
+               next = pud_addr_end(addr, end);
+               if (pud_none_or_clear_bad(pud))
+                       continue;
+               if (check_pmd_range(mm, pud, addr, next, nodes))
+                       return -EIO;
+       } while (pud++, addr = next, addr != end);
+       return 0;
+}
+
+static inline int check_pgd_range(struct mm_struct *mm,
+               unsigned long addr, unsigned long end, unsigned long *nodes)
+{
+       pgd_t *pgd;
+       unsigned long next;
+
+       pgd = pgd_offset(mm, addr);
+       do {
+               next = pgd_addr_end(addr, end);
+               if (pgd_none_or_clear_bad(pgd))
+                       continue;
+               if (check_pud_range(mm, pgd, addr, next, nodes))
+                       return -EIO;
+       } while (pgd++, addr = next, addr != end);
        return 0;
 }
 
@@ -299,7 +333,7 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end,
                if (prev && prev->vm_end < vma->vm_start)
                        return ERR_PTR(-EFAULT);
                if ((flags & MPOL_MF_STRICT) && !is_vm_hugetlb_page(vma)) {
-                       err = verify_pages(vma->vm_mm,
+                       err = check_pgd_range(vma->vm_mm,
                                           vma->vm_start, vma->vm_end, nodes);
                        if (err) {
                                first = ERR_PTR(err);
@@ -721,7 +755,7 @@ static struct page *alloc_page_interleave(unsigned int __nocast gfp, unsigned or
        zl = NODE_DATA(nid)->node_zonelists + (gfp & GFP_ZONEMASK);
        page = __alloc_pages(gfp, order, zl);
        if (page && page_zone(page) == zl->zones[0]) {
-               zl->zones[0]->pageset[get_cpu()].interleave_hit++;
+               zone_pcp(zl->zones[0],get_cpu())->interleave_hit++;
                put_cpu();
        }
        return page;
index 01f9793591f666965342df8ef886358680bbae4c..da3fa90a0aae2b9af04ec553209deb6a51b80b48 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1175,7 +1175,12 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
                    (!vma || addr + len <= vma->vm_start))
                        return addr;
        }
-       start_addr = addr = mm->free_area_cache;
+       if (len > mm->cached_hole_size) {
+               start_addr = addr = mm->free_area_cache;
+       } else {
+               start_addr = addr = TASK_UNMAPPED_BASE;
+               mm->cached_hole_size = 0;
+       }
 
 full_search:
        for (vma = find_vma(mm, addr); ; vma = vma->vm_next) {
@@ -1186,7 +1191,9 @@ full_search:
                         * some holes.
                         */
                        if (start_addr != TASK_UNMAPPED_BASE) {
-                               start_addr = addr = TASK_UNMAPPED_BASE;
+                               addr = TASK_UNMAPPED_BASE;
+                               start_addr = addr;
+                               mm->cached_hole_size = 0;
                                goto full_search;
                        }
                        return -ENOMEM;
@@ -1198,19 +1205,22 @@ full_search:
                        mm->free_area_cache = addr + len;
                        return addr;
                }
+               if (addr + mm->cached_hole_size < vma->vm_start)
+                       mm->cached_hole_size = vma->vm_start - addr;
                addr = vma->vm_end;
        }
 }
 #endif 
 
-void arch_unmap_area(struct vm_area_struct *area)
+void arch_unmap_area(struct mm_struct *mm, unsigned long addr)
 {
        /*
         * Is this a new hole at the lowest possible address?
         */
-       if (area->vm_start >= TASK_UNMAPPED_BASE &&
-                       area->vm_start < area->vm_mm->free_area_cache)
-               area->vm_mm->free_area_cache = area->vm_start;
+       if (addr >= TASK_UNMAPPED_BASE && addr < mm->free_area_cache) {
+               mm->free_area_cache = addr;
+               mm->cached_hole_size = ~0UL;
+       }
 }
 
 /*
@@ -1240,17 +1250,26 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
                        return addr;
        }
 
+       /* check if free_area_cache is useful for us */
+       if (len <= mm->cached_hole_size) {
+               mm->cached_hole_size = 0;
+               mm->free_area_cache = mm->mmap_base;
+       }
+
        /* either no address requested or can't fit in requested address hole */
        addr = mm->free_area_cache;
 
        /* make sure it can fit in the remaining address space */
-       if (addr >= len) {
+       if (addr > len) {
                vma = find_vma(mm, addr-len);
                if (!vma || addr <= vma->vm_start)
                        /* remember the address as a hint for next time */
                        return (mm->free_area_cache = addr-len);
        }
 
+       if (mm->mmap_base < len)
+               goto bottomup;
+
        addr = mm->mmap_base-len;
 
        do {
@@ -1264,75 +1283,85 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
                        /* remember the address as a hint for next time */
                        return (mm->free_area_cache = addr);
 
+               /* remember the largest hole we saw so far */
+               if (addr + mm->cached_hole_size < vma->vm_start)
+                       mm->cached_hole_size = vma->vm_start - addr;
+
                /* try just below the current vma->vm_start */
                addr = vma->vm_start-len;
-       } while (len <= vma->vm_start);
+       } while (len < vma->vm_start);
 
+bottomup:
        /*
         * A failed mmap() very likely causes application failure,
         * so fall back to the bottom-up function here. This scenario
         * can happen with large stack limits and large mmap()
         * allocations.
         */
-       mm->free_area_cache = TASK_UNMAPPED_BASE;
+       mm->cached_hole_size = ~0UL;
+       mm->free_area_cache = TASK_UNMAPPED_BASE;
        addr = arch_get_unmapped_area(filp, addr0, len, pgoff, flags);
        /*
         * Restore the topdown base:
         */
        mm->free_area_cache = mm->mmap_base;
+       mm->cached_hole_size = ~0UL;
 
        return addr;
 }
 #endif
 
-void arch_unmap_area_topdown(struct vm_area_struct *area)
+void arch_unmap_area_topdown(struct mm_struct *mm, unsigned long addr)
 {
        /*
         * Is this a new hole at the highest possible address?
         */
-       if (area->vm_end > area->vm_mm->free_area_cache)
-               area->vm_mm->free_area_cache = area->vm_end;
+       if (addr > mm->free_area_cache)
+               mm->free_area_cache = addr;
 
        /* dont allow allocations above current base */
-       if (area->vm_mm->free_area_cache > area->vm_mm->mmap_base)
-               area->vm_mm->free_area_cache = area->vm_mm->mmap_base;
+       if (mm->free_area_cache > mm->mmap_base)
+               mm->free_area_cache = mm->mmap_base;
 }
 
 unsigned long
 get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
                unsigned long pgoff, unsigned long flags)
 {
-       if (flags & MAP_FIXED) {
-               unsigned long ret;
+       unsigned long ret;
 
-               if (addr > TASK_SIZE - len)
-                       return -ENOMEM;
-               if (addr & ~PAGE_MASK)
-                       return -EINVAL;
-               if (file && is_file_hugepages(file))  {
-                       /*
-                        * Check if the given range is hugepage aligned, and
-                        * can be made suitable for hugepages.
-                        */
-                       ret = prepare_hugepage_range(addr, len);
-               } else {
-                       /*
-                        * Ensure that a normal request is not falling in a
-                        * reserved hugepage range.  For some archs like IA-64,
-                        * there is a separate region for hugepages.
-                        */
-                       ret = is_hugepage_only_range(current->mm, addr, len);
-               }
-               if (ret)
-                       return -EINVAL;
-               return addr;
-       }
+       if (!(flags & MAP_FIXED)) {
+               unsigned long (*get_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
 
-       if (file && file->f_op && file->f_op->get_unmapped_area)
-               return file->f_op->get_unmapped_area(file, addr, len,
-                                               pgoff, flags);
+               get_area = current->mm->get_unmapped_area;
+               if (file && file->f_op && file->f_op->get_unmapped_area)
+                       get_area = file->f_op->get_unmapped_area;
+               addr = get_area(file, addr, len, pgoff, flags);
+               if (IS_ERR_VALUE(addr))
+                       return addr;
+       }
 
-       return current->mm->get_unmapped_area(file, addr, len, pgoff, flags);
+       if (addr > TASK_SIZE - len)
+               return -ENOMEM;
+       if (addr & ~PAGE_MASK)
+               return -EINVAL;
+       if (file && is_file_hugepages(file))  {
+               /*
+                * Check if the given range is hugepage aligned, and
+                * can be made suitable for hugepages.
+                */
+               ret = prepare_hugepage_range(addr, len);
+       } else {
+               /*
+                * Ensure that a normal request is not falling in a
+                * reserved hugepage range.  For some archs like IA-64,
+                * there is a separate region for hugepages.
+                */
+               ret = is_hugepage_only_range(current->mm, addr, len);
+       }
+       if (ret)
+               return -EINVAL;
+       return addr;
 }
 
 EXPORT_SYMBOL(get_unmapped_area);
@@ -1592,7 +1621,6 @@ static void unmap_vma(struct mm_struct *mm, struct vm_area_struct *area)
        if (area->vm_flags & VM_LOCKED)
                area->vm_mm->locked_vm -= len >> PAGE_SHIFT;
        vm_stat_unaccount(area);
-       area->vm_mm->unmap_area(area);
        remove_vm_struct(area);
 }
 
@@ -1646,6 +1674,7 @@ detach_vmas_to_be_unmapped(struct mm_struct *mm, struct vm_area_struct *vma,
 {
        struct vm_area_struct **insertion_point;
        struct vm_area_struct *tail_vma = NULL;
+       unsigned long addr;
 
        insertion_point = (prev ? &prev->vm_next : &mm->mmap);
        do {
@@ -1656,6 +1685,11 @@ detach_vmas_to_be_unmapped(struct mm_struct *mm, struct vm_area_struct *vma,
        } while (vma && vma->vm_start < end);
        *insertion_point = vma;
        tail_vma->vm_next = NULL;
+       if (mm->unmap_area == arch_unmap_area)
+               addr = prev ? prev->vm_end : mm->mmap_base;
+       else
+               addr = vma ?  vma->vm_start : mm->mmap_base;
+       mm->unmap_area(mm, addr);
        mm->mmap_cache = NULL;          /* Kill the cache. */
 }
 
index 0dd7ace94e519d13f96d601bc1ecc543bb8ac595..ec7238a78f36c5eeac4bf1954e215399428a858d 100644 (file)
@@ -224,6 +224,12 @@ static unsigned long move_vma(struct vm_area_struct *vma,
                        split = 1;
        }
 
+       /*
+        * if we failed to move page tables we still do total_vm increment
+        * since do_munmap() will decrement it by old_len == new_len
+        */
+       mm->total_vm += new_len >> PAGE_SHIFT;
+
        if (do_munmap(mm, old_addr, old_len) < 0) {
                /* OOM: unable to split vma, just get accounts right */
                vm_unacct_memory(excess >> PAGE_SHIFT);
@@ -237,7 +243,6 @@ static unsigned long move_vma(struct vm_area_struct *vma,
                        vma->vm_next->vm_flags |= VM_ACCOUNT;
        }
 
-       mm->total_vm += new_len >> PAGE_SHIFT;
        __vm_stat_account(mm, vma->vm_flags, vma->vm_file, new_len>>PAGE_SHIFT);
        if (vm_flags & VM_LOCKED) {
                mm->locked_vm += new_len >> PAGE_SHIFT;
index 090f426bca7d538d5f84c9a8c53a677f50a31434..d0f5a1bce7cb14ecd7b74b960e87c8b079024020 100644 (file)
@@ -34,6 +34,8 @@ static void sync_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
 
                if (!pte_present(*pte))
                        continue;
+               if (!pte_maybe_dirty(*pte))
+                       continue;
                pfn = pte_pfn(*pte);
                if (!pfn_valid(pfn))
                        continue;
index b293ec1cc4e66879428684ef78afa0a313577528..ce74452c02d945e40e6cdb503499609f24e1cd64 100644 (file)
@@ -150,7 +150,8 @@ void vfree(void *addr)
        kfree(addr);
 }
 
-void *__vmalloc(unsigned long size, int gfp_mask, pgprot_t prot)
+void *__vmalloc(unsigned long size, unsigned int __nocast gfp_mask,
+                       pgprot_t prot)
 {
        /*
         * kmalloc doesn't like __GFP_HIGHMEM for some reason
@@ -1066,7 +1067,7 @@ unsigned long arch_get_unmapped_area(struct file *file, unsigned long addr,
        return -ENOMEM;
 }
 
-void arch_unmap_area(struct vm_area_struct *area)
+void arch_unmap_area(struct mm_struct *mm, unsigned long addr)
 {
 }
 
index 4bbb1cb10495ea486db83868055762888835c8b3..59666d905f1997521c89f4a7b1a492df4414be0e 100644 (file)
@@ -258,6 +258,10 @@ void out_of_memory(unsigned int __nocast gfp_mask)
        struct mm_struct *mm = NULL;
        task_t * p;
 
+       printk("oom-killer: gfp_mask=0x%x\n", gfp_mask);
+       /* print memory stats */
+       show_mem();
+
        read_lock(&tasklist_lock);
 retry:
        p = select_bad_process();
@@ -268,12 +272,9 @@ retry:
        /* Found nothing?!?! Either we hang forever, or we panic. */
        if (!p) {
                read_unlock(&tasklist_lock);
-               show_free_areas();
                panic("Out of memory and no killable processes...\n");
        }
 
-       printk("oom-killer: gfp_mask=0x%x\n", gfp_mask);
-       show_free_areas();
        mm = oom_kill_process(p);
        if (!mm)
                goto retry;
index b1061b1962f86497a0deb83c2409b0e571fbf9d3..206920796f5f68cb176afa138238bd3584106a5a 100644 (file)
@@ -105,11 +105,13 @@ static void bad_page(const char *function, struct page *page)
        printk(KERN_EMERG "Backtrace:\n");
        dump_stack();
        printk(KERN_EMERG "Trying to fix it up, but a reboot is needed\n");
-       page->flags &= ~(1 << PG_private        |
+       page->flags &= ~(1 << PG_lru    |
+                       1 << PG_private |
                        1 << PG_locked  |
-                       1 << PG_lru     |
                        1 << PG_active  |
                        1 << PG_dirty   |
+                       1 << PG_reclaim |
+                       1 << PG_slab    |
                        1 << PG_swapcache |
                        1 << PG_writeback);
        set_page_count(page, 0);
@@ -440,14 +442,17 @@ void set_page_refs(struct page *page, int order)
  */
 static void prep_new_page(struct page *page, int order)
 {
-       if (page->mapping || page_mapcount(page) ||
-           (page->flags & (
+       if (    page_mapcount(page) ||
+               page->mapping != NULL ||
+               page_count(page) != 0 ||
+               (page->flags & (
+                       1 << PG_lru     |
                        1 << PG_private |
                        1 << PG_locked  |
-                       1 << PG_lru     |
                        1 << PG_active  |
                        1 << PG_dirty   |
                        1 << PG_reclaim |
+                       1 << PG_slab    |
                        1 << PG_swapcache |
                        1 << PG_writeback )))
                bad_page(__FUNCTION__, page);
@@ -511,6 +516,36 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order,
        return allocated;
 }
 
+#ifdef CONFIG_NUMA
+/* Called from the slab reaper to drain remote pagesets */
+void drain_remote_pages(void)
+{
+       struct zone *zone;
+       int i;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       for_each_zone(zone) {
+               struct per_cpu_pageset *pset;
+
+               /* Do not drain local pagesets */
+               if (zone->zone_pgdat->node_id == numa_node_id())
+                       continue;
+
+               pset = zone->pageset[smp_processor_id()];
+               for (i = 0; i < ARRAY_SIZE(pset->pcp); i++) {
+                       struct per_cpu_pages *pcp;
+
+                       pcp = &pset->pcp[i];
+                       if (pcp->count)
+                               pcp->count -= free_pages_bulk(zone, pcp->count,
+                                               &pcp->list, 0);
+               }
+       }
+       local_irq_restore(flags);
+}
+#endif
+
 #if defined(CONFIG_PM) || defined(CONFIG_HOTPLUG_CPU)
 static void __drain_pages(unsigned int cpu)
 {
@@ -520,7 +555,7 @@ static void __drain_pages(unsigned int cpu)
        for_each_zone(zone) {
                struct per_cpu_pageset *pset;
 
-               pset = &zone->pageset[cpu];
+               pset = zone_pcp(zone, cpu);
                for (i = 0; i < ARRAY_SIZE(pset->pcp); i++) {
                        struct per_cpu_pages *pcp;
 
@@ -583,12 +618,12 @@ static void zone_statistics(struct zonelist *zonelist, struct zone *z)
 
        local_irq_save(flags);
        cpu = smp_processor_id();
-       p = &z->pageset[cpu];
+       p = zone_pcp(z,cpu);
        if (pg == orig) {
-               z->pageset[cpu].numa_hit++;
+               p->numa_hit++;
        } else {
                p->numa_miss++;
-               zonelist->zones[0]->pageset[cpu].numa_foreign++;
+               zone_pcp(zonelist->zones[0], cpu)->numa_foreign++;
        }
        if (pg == NODE_DATA(numa_node_id()))
                p->local_node++;
@@ -615,12 +650,12 @@ static void fastcall free_hot_cold_page(struct page *page, int cold)
        if (PageAnon(page))
                page->mapping = NULL;
        free_pages_check(__FUNCTION__, page);
-       pcp = &zone->pageset[get_cpu()].pcp[cold];
+       pcp = &zone_pcp(zone, get_cpu())->pcp[cold];
        local_irq_save(flags);
-       if (pcp->count >= pcp->high)
-               pcp->count -= free_pages_bulk(zone, pcp->batch, &pcp->list, 0);
        list_add(&page->lru, &pcp->list);
        pcp->count++;
+       if (pcp->count >= pcp->high)
+               pcp->count -= free_pages_bulk(zone, pcp->batch, &pcp->list, 0);
        local_irq_restore(flags);
        put_cpu();
 }
@@ -659,7 +694,7 @@ buffered_rmqueue(struct zone *zone, int order, unsigned int __nocast gfp_flags)
        if (order == 0) {
                struct per_cpu_pages *pcp;
 
-               pcp = &zone->pageset[get_cpu()].pcp[cold];
+               pcp = &zone_pcp(zone, get_cpu())->pcp[cold];
                local_irq_save(flags);
                if (pcp->count <= pcp->low)
                        pcp->count += rmqueue_bulk(zone, 0,
@@ -724,6 +759,16 @@ int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
        return 1;
 }
 
+static inline int
+should_reclaim_zone(struct zone *z, unsigned int gfp_mask)
+{
+       if (!z->reclaim_pages)
+               return 0;
+       if (gfp_mask & __GFP_NORECLAIM)
+               return 0;
+       return 1;
+}
+
 /*
  * This is the 'heart' of the zoned buddy allocator.
  */
@@ -760,17 +805,32 @@ __alloc_pages(unsigned int __nocast gfp_mask, unsigned int order,
 
        classzone_idx = zone_idx(zones[0]);
 
- restart:
+restart:
        /* Go through the zonelist once, looking for a zone with enough free */
        for (i = 0; (z = zones[i]) != NULL; i++) {
-
-               if (!zone_watermark_ok(z, order, z->pages_low,
-                                      classzone_idx, 0, 0))
-                       continue;
+               int do_reclaim = should_reclaim_zone(z, gfp_mask);
 
                if (!cpuset_zone_allowed(z))
                        continue;
 
+               /*
+                * If the zone is to attempt early page reclaim then this loop
+                * will try to reclaim pages and check the watermark a second
+                * time before giving up and falling back to the next zone.
+                */
+zone_reclaim_retry:
+               if (!zone_watermark_ok(z, order, z->pages_low,
+                                      classzone_idx, 0, 0)) {
+                       if (!do_reclaim)
+                               continue;
+                       else {
+                               zone_reclaim(z, gfp_mask, order);
+                               /* Only try reclaim once */
+                               do_reclaim = 0;
+                               goto zone_reclaim_retry;
+                       }
+               }
+
                page = buffered_rmqueue(z, order, gfp_mask);
                if (page)
                        goto got_pg;
@@ -829,7 +889,7 @@ rebalance:
        reclaim_state.reclaimed_slab = 0;
        p->reclaim_state = &reclaim_state;
 
-       did_some_progress = try_to_free_pages(zones, gfp_mask, order);
+       did_some_progress = try_to_free_pages(zones, gfp_mask);
 
        p->reclaim_state = NULL;
        p->flags &= ~PF_MEMALLOC;
@@ -905,6 +965,7 @@ nopage:
                        " order:%d, mode:0x%x\n",
                        p->comm, order, gfp_mask);
                dump_stack();
+               show_mem();
        }
        return NULL;
 got_pg:
@@ -1114,7 +1175,7 @@ void get_full_page_state(struct page_state *ret)
        __get_page_state(ret, sizeof(*ret) / sizeof(unsigned long));
 }
 
-unsigned long __read_page_state(unsigned offset)
+unsigned long __read_page_state(unsigned long offset)
 {
        unsigned long ret = 0;
        int cpu;
@@ -1128,7 +1189,7 @@ unsigned long __read_page_state(unsigned offset)
        return ret;
 }
 
-void __mod_page_state(unsigned offset, unsigned long delta)
+void __mod_page_state(unsigned long offset, unsigned long delta)
 {
        unsigned long flags;
        void* ptr;
@@ -1237,22 +1298,23 @@ void show_free_areas(void)
                        if (!cpu_possible(cpu))
                                continue;
 
-                       pageset = zone->pageset + cpu;
+                       pageset = zone_pcp(zone, cpu);
 
                        for (temperature = 0; temperature < 2; temperature++)
-                               printk("cpu %d %s: low %d, high %d, batch %d\n",
+                               printk("cpu %d %s: low %d, high %d, batch %d used:%d\n",
                                        cpu,
                                        temperature ? "cold" : "hot",
                                        pageset->pcp[temperature].low,
                                        pageset->pcp[temperature].high,
-                                       pageset->pcp[temperature].batch);
+                                       pageset->pcp[temperature].batch,
+                                       pageset->pcp[temperature].count);
                }
        }
 
        get_page_state(&ps);
        get_zone_counts(&active, &inactive, &free);
 
-       printk("\nFree pages: %11ukB (%ukB HighMem)\n",
+       printk("Free pages: %11ukB (%ukB HighMem)\n",
                K(nr_free_pages()),
                K(nr_free_highpages()));
 
@@ -1620,6 +1682,155 @@ void zone_init_free_lists(struct pglist_data *pgdat, struct zone *zone,
        memmap_init_zone((size), (nid), (zone), (start_pfn))
 #endif
 
+static int __devinit zone_batchsize(struct zone *zone)
+{
+       int batch;
+
+       /*
+        * The per-cpu-pages pools are set to around 1000th of the
+        * size of the zone.  But no more than 1/4 of a meg - there's
+        * no point in going beyond the size of L2 cache.
+        *
+        * OK, so we don't know how big the cache is.  So guess.
+        */
+       batch = zone->present_pages / 1024;
+       if (batch * PAGE_SIZE > 256 * 1024)
+               batch = (256 * 1024) / PAGE_SIZE;
+       batch /= 4;             /* We effectively *= 4 below */
+       if (batch < 1)
+               batch = 1;
+
+       /*
+        * Clamp the batch to a 2^n - 1 value. Having a power
+        * of 2 value was found to be more likely to have
+        * suboptimal cache aliasing properties in some cases.
+        *
+        * For example if 2 tasks are alternately allocating
+        * batches of pages, one task can end up with a lot
+        * of pages of one half of the possible page colors
+        * and the other with pages of the other colors.
+        */
+       batch = (1 << fls(batch + batch/2)) - 1;
+       return batch;
+}
+
+inline void setup_pageset(struct per_cpu_pageset *p, unsigned long batch)
+{
+       struct per_cpu_pages *pcp;
+
+       pcp = &p->pcp[0];               /* hot */
+       pcp->count = 0;
+       pcp->low = 2 * batch;
+       pcp->high = 6 * batch;
+       pcp->batch = max(1UL, 1 * batch);
+       INIT_LIST_HEAD(&pcp->list);
+
+       pcp = &p->pcp[1];               /* cold*/
+       pcp->count = 0;
+       pcp->low = 0;
+       pcp->high = 2 * batch;
+       pcp->batch = max(1UL, 1 * batch);
+       INIT_LIST_HEAD(&pcp->list);
+}
+
+#ifdef CONFIG_NUMA
+/*
+ * Boot pageset table. One per cpu which is going to be used for all
+ * zones and all nodes. The parameters will be set in such a way
+ * that an item put on a list will immediately be handed over to
+ * the buddy list. This is safe since pageset manipulation is done
+ * with interrupts disabled.
+ *
+ * Some NUMA counter updates may also be caught by the boot pagesets.
+ * These will be discarded when bootup is complete.
+ */
+static struct per_cpu_pageset
+       boot_pageset[NR_CPUS] __initdata;
+
+/*
+ * Dynamically allocate memory for the
+ * per cpu pageset array in struct zone.
+ */
+static int __devinit process_zones(int cpu)
+{
+       struct zone *zone, *dzone;
+
+       for_each_zone(zone) {
+
+               zone->pageset[cpu] = kmalloc_node(sizeof(struct per_cpu_pageset),
+                                        GFP_KERNEL, cpu_to_node(cpu));
+               if (!zone->pageset[cpu])
+                       goto bad;
+
+               setup_pageset(zone->pageset[cpu], zone_batchsize(zone));
+       }
+
+       return 0;
+bad:
+       for_each_zone(dzone) {
+               if (dzone == zone)
+                       break;
+               kfree(dzone->pageset[cpu]);
+               dzone->pageset[cpu] = NULL;
+       }
+       return -ENOMEM;
+}
+
+static inline void free_zone_pagesets(int cpu)
+{
+#ifdef CONFIG_NUMA
+       struct zone *zone;
+
+       for_each_zone(zone) {
+               struct per_cpu_pageset *pset = zone_pcp(zone, cpu);
+
+               zone_pcp(zone, cpu) = NULL;
+               kfree(pset);
+       }
+#endif
+}
+
+static int __devinit pageset_cpuup_callback(struct notifier_block *nfb,
+               unsigned long action,
+               void *hcpu)
+{
+       int cpu = (long)hcpu;
+       int ret = NOTIFY_OK;
+
+       switch (action) {
+               case CPU_UP_PREPARE:
+                       if (process_zones(cpu))
+                               ret = NOTIFY_BAD;
+                       break;
+#ifdef CONFIG_HOTPLUG_CPU
+               case CPU_DEAD:
+                       free_zone_pagesets(cpu);
+                       break;
+#endif
+               default:
+                       break;
+       }
+       return ret;
+}
+
+static struct notifier_block pageset_notifier =
+       { &pageset_cpuup_callback, NULL, 0 };
+
+void __init setup_per_cpu_pageset()
+{
+       int err;
+
+       /* Initialize per_cpu_pageset for cpu 0.
+        * A cpuup callback will do this for every cpu
+        * as it comes online
+        */
+       err = process_zones(smp_processor_id());
+       BUG_ON(err);
+       register_cpu_notifier(&pageset_notifier);
+}
+
+#endif
+
 /*
  * Set up the zone data structures:
  *   - mark all pages reserved
@@ -1662,48 +1873,16 @@ static void __init free_area_init_core(struct pglist_data *pgdat,
 
                zone->temp_priority = zone->prev_priority = DEF_PRIORITY;
 
-               /*
-                * The per-cpu-pages pools are set to around 1000th of the
-                * size of the zone.  But no more than 1/4 of a meg - there's
-                * no point in going beyond the size of L2 cache.
-                *
-                * OK, so we don't know how big the cache is.  So guess.
-                */
-               batch = zone->present_pages / 1024;
-               if (batch * PAGE_SIZE > 256 * 1024)
-                       batch = (256 * 1024) / PAGE_SIZE;
-               batch /= 4;             /* We effectively *= 4 below */
-               if (batch < 1)
-                       batch = 1;
-
-               /*
-                * Clamp the batch to a 2^n - 1 value. Having a power
-                * of 2 value was found to be more likely to have
-                * suboptimal cache aliasing properties in some cases.
-                *
-                * For example if 2 tasks are alternately allocating
-                * batches of pages, one task can end up with a lot
-                * of pages of one half of the possible page colors
-                * and the other with pages of the other colors.
-                */
-               batch = (1 << fls(batch + batch/2)) - 1;
+               batch = zone_batchsize(zone);
 
                for (cpu = 0; cpu < NR_CPUS; cpu++) {
-                       struct per_cpu_pages *pcp;
-
-                       pcp = &zone->pageset[cpu].pcp[0];       /* hot */
-                       pcp->count = 0;
-                       pcp->low = 2 * batch;
-                       pcp->high = 6 * batch;
-                       pcp->batch = 1 * batch;
-                       INIT_LIST_HEAD(&pcp->list);
-
-                       pcp = &zone->pageset[cpu].pcp[1];       /* cold */
-                       pcp->count = 0;
-                       pcp->low = 0;
-                       pcp->high = 2 * batch;
-                       pcp->batch = 1 * batch;
-                       INIT_LIST_HEAD(&pcp->list);
+#ifdef CONFIG_NUMA
+                       /* Early boot. Slab allocator not functional yet */
+                       zone->pageset[cpu] = &boot_pageset[cpu];
+                       setup_pageset(&boot_pageset[cpu],0);
+#else
+                       setup_pageset(zone_pcp(zone,cpu), batch);
+#endif
                }
                printk(KERN_DEBUG "  %s zone: %lu pages, LIFO batch:%lu\n",
                                zone_names[j], realsize, batch);
@@ -1713,6 +1892,7 @@ static void __init free_area_init_core(struct pglist_data *pgdat,
                zone->nr_scan_inactive = 0;
                zone->nr_active = 0;
                zone->nr_inactive = 0;
+               atomic_set(&zone->reclaim_in_progress, -1);
                if (!size)
                        continue;
 
@@ -1853,6 +2033,115 @@ struct seq_operations fragmentation_op = {
        .show   = frag_show,
 };
 
+/*
+ * Output information about zones in @pgdat.
+ */
+static int zoneinfo_show(struct seq_file *m, void *arg)
+{
+       pg_data_t *pgdat = arg;
+       struct zone *zone;
+       struct zone *node_zones = pgdat->node_zones;
+       unsigned long flags;
+
+       for (zone = node_zones; zone - node_zones < MAX_NR_ZONES; zone++) {
+               int i;
+
+               if (!zone->present_pages)
+                       continue;
+
+               spin_lock_irqsave(&zone->lock, flags);
+               seq_printf(m, "Node %d, zone %8s", pgdat->node_id, zone->name);
+               seq_printf(m,
+                          "\n  pages free     %lu"
+                          "\n        min      %lu"
+                          "\n        low      %lu"
+                          "\n        high     %lu"
+                          "\n        active   %lu"
+                          "\n        inactive %lu"
+                          "\n        scanned  %lu (a: %lu i: %lu)"
+                          "\n        spanned  %lu"
+                          "\n        present  %lu",
+                          zone->free_pages,
+                          zone->pages_min,
+                          zone->pages_low,
+                          zone->pages_high,
+                          zone->nr_active,
+                          zone->nr_inactive,
+                          zone->pages_scanned,
+                          zone->nr_scan_active, zone->nr_scan_inactive,
+                          zone->spanned_pages,
+                          zone->present_pages);
+               seq_printf(m,
+                          "\n        protection: (%lu",
+                          zone->lowmem_reserve[0]);
+               for (i = 1; i < ARRAY_SIZE(zone->lowmem_reserve); i++)
+                       seq_printf(m, ", %lu", zone->lowmem_reserve[i]);
+               seq_printf(m,
+                          ")"
+                          "\n  pagesets");
+               for (i = 0; i < ARRAY_SIZE(zone->pageset); i++) {
+                       struct per_cpu_pageset *pageset;
+                       int j;
+
+                       pageset = zone_pcp(zone, i);
+                       for (j = 0; j < ARRAY_SIZE(pageset->pcp); j++) {
+                               if (pageset->pcp[j].count)
+                                       break;
+                       }
+                       if (j == ARRAY_SIZE(pageset->pcp))
+                               continue;
+                       for (j = 0; j < ARRAY_SIZE(pageset->pcp); j++) {
+                               seq_printf(m,
+                                          "\n    cpu: %i pcp: %i"
+                                          "\n              count: %i"
+                                          "\n              low:   %i"
+                                          "\n              high:  %i"
+                                          "\n              batch: %i",
+                                          i, j,
+                                          pageset->pcp[j].count,
+                                          pageset->pcp[j].low,
+                                          pageset->pcp[j].high,
+                                          pageset->pcp[j].batch);
+                       }
+#ifdef CONFIG_NUMA
+                       seq_printf(m,
+                                  "\n            numa_hit:       %lu"
+                                  "\n            numa_miss:      %lu"
+                                  "\n            numa_foreign:   %lu"
+                                  "\n            interleave_hit: %lu"
+                                  "\n            local_node:     %lu"
+                                  "\n            other_node:     %lu",
+                                  pageset->numa_hit,
+                                  pageset->numa_miss,
+                                  pageset->numa_foreign,
+                                  pageset->interleave_hit,
+                                  pageset->local_node,
+                                  pageset->other_node);
+#endif
+               }
+               seq_printf(m,
+                          "\n  all_unreclaimable: %u"
+                          "\n  prev_priority:     %i"
+                          "\n  temp_priority:     %i"
+                          "\n  start_pfn:         %lu",
+                          zone->all_unreclaimable,
+                          zone->prev_priority,
+                          zone->temp_priority,
+                          zone->zone_start_pfn);
+               spin_unlock_irqrestore(&zone->lock, flags);
+               seq_putc(m, '\n');
+       }
+       return 0;
+}
+
+struct seq_operations zoneinfo_op = {
+       .start  = frag_start, /* iterate over all zones. The same as in
+                              * fragmentation. */
+       .next   = frag_next,
+       .stop   = frag_stop,
+       .show   = zoneinfo_show,
+};
+
 static char *vmstat_text[] = {
        "nr_dirty",
        "nr_writeback",
@@ -2058,10 +2347,10 @@ static void setup_per_zone_pages_min(void)
                                min_pages = 128;
                        zone->pages_min = min_pages;
                } else {
-                       /* if it's a lowmem zone, reserve a number of pages 
+                       /* if it's a lowmem zone, reserve a number of pages
                         * proportionate to the zone's size.
                         */
-                       zone->pages_min = (pages_min * zone->present_pages) / 
+                       zone->pages_min = (pages_min * zone->present_pages) /
                                           lowmem_pages;
                }
 
index 378de234c12b9e74af3e6f43fc3ae8bf7ffe234c..89770bd25f31be71877813a292793fcc62e01116 100644 (file)
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -539,27 +539,6 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma)
                goto out_unmap;
        }
 
-       /*
-        * Don't pull an anonymous page out from under get_user_pages.
-        * GUP carefully breaks COW and raises page count (while holding
-        * page_table_lock, as we have here) to make sure that the page
-        * cannot be freed.  If we unmap that page here, a user write
-        * access to the virtual address will bring back the page, but
-        * its raised count will (ironically) be taken to mean it's not
-        * an exclusive swap page, do_wp_page will replace it by a copy
-        * page, and the user never get to see the data GUP was holding
-        * the original page for.
-        *
-        * This test is also useful for when swapoff (unuse_process) has
-        * to drop page lock: its reference to the page stops existing
-        * ptes from being unmapped, so swapoff can make progress.
-        */
-       if (PageSwapCache(page) &&
-           page_count(page) != page_mapcount(page) + 2) {
-               ret = SWAP_FAIL;
-               goto out_unmap;
-       }
-
        /* Nuke the page table entry. */
        flush_cache_page(vma, address, page_to_pfn(page));
        pteval = ptep_clear_flush(vma, address, pte);
@@ -586,7 +565,7 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma)
                dec_mm_counter(mm, anon_rss);
        }
 
-       inc_mm_counter(mm, rss);
+       dec_mm_counter(mm, rss);
        page_remove_rmap(page);
        page_cache_release(page);
 
@@ -626,7 +605,7 @@ static void try_to_unmap_cluster(unsigned long cursor,
        pgd_t *pgd;
        pud_t *pud;
        pmd_t *pmd;
-       pte_t *pte;
+       pte_t *pte, *original_pte;
        pte_t pteval;
        struct page *page;
        unsigned long address;
@@ -658,7 +637,7 @@ static void try_to_unmap_cluster(unsigned long cursor,
        if (!pmd_present(*pmd))
                goto out_unlock;
 
-       for (pte = pte_offset_map(pmd, address);
+       for (original_pte = pte = pte_offset_map(pmd, address);
                        address < end; pte++, address += PAGE_SIZE) {
 
                if (!pte_present(*pte))
@@ -694,7 +673,7 @@ static void try_to_unmap_cluster(unsigned long cursor,
                (*mapcount)--;
        }
 
-       pte_unmap(pte);
+       pte_unmap(original_pte);
 out_unlock:
        spin_unlock(&mm->page_table_lock);
 }
index 61574b81d979f3169bd77f0af20e4d7cde626743..e64fa726a790e0c4162fec88db0e1032dd8a5be0 100644 (file)
@@ -6,8 +6,8 @@
  *              2000-2001 Christoph Rohland
  *              2000-2001 SAP AG
  *              2002 Red Hat Inc.
- * Copyright (C) 2002-2004 Hugh Dickins.
- * Copyright (C) 2002-2004 VERITAS Software Corporation.
+ * Copyright (C) 2002-2005 Hugh Dickins.
+ * Copyright (C) 2002-2005 VERITAS Software Corporation.
  * Copyright (C) 2004 Andi Kleen, SuSE Labs
  *
  * Extended attribute support for tmpfs:
@@ -194,7 +194,7 @@ static DEFINE_SPINLOCK(shmem_swaplist_lock);
 static void shmem_free_blocks(struct inode *inode, long pages)
 {
        struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);
-       if (sbinfo) {
+       if (sbinfo->max_blocks) {
                spin_lock(&sbinfo->stat_lock);
                sbinfo->free_blocks += pages;
                inode->i_blocks -= pages*BLOCKS_PER_PAGE;
@@ -357,7 +357,7 @@ static swp_entry_t *shmem_swp_alloc(struct shmem_inode_info *info, unsigned long
                 * page (and perhaps indirect index pages) yet to allocate:
                 * a waste to allocate index if we cannot allocate data.
                 */
-               if (sbinfo) {
+               if (sbinfo->max_blocks) {
                        spin_lock(&sbinfo->stat_lock);
                        if (sbinfo->free_blocks <= 1) {
                                spin_unlock(&sbinfo->stat_lock);
@@ -677,8 +677,8 @@ static void shmem_delete_inode(struct inode *inode)
                        spin_unlock(&shmem_swaplist_lock);
                }
        }
-       if (sbinfo) {
-               BUG_ON(inode->i_blocks);
+       BUG_ON(inode->i_blocks);
+       if (sbinfo->max_inodes) {
                spin_lock(&sbinfo->stat_lock);
                sbinfo->free_inodes++;
                spin_unlock(&sbinfo->stat_lock);
@@ -1080,7 +1080,7 @@ repeat:
        } else {
                shmem_swp_unmap(entry);
                sbinfo = SHMEM_SB(inode->i_sb);
-               if (sbinfo) {
+               if (sbinfo->max_blocks) {
                        spin_lock(&sbinfo->stat_lock);
                        if (sbinfo->free_blocks == 0 ||
                            shmem_acct_block(info->flags)) {
@@ -1269,7 +1269,7 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
        struct shmem_inode_info *info;
        struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
 
-       if (sbinfo) {
+       if (sbinfo->max_inodes) {
                spin_lock(&sbinfo->stat_lock);
                if (!sbinfo->free_inodes) {
                        spin_unlock(&sbinfo->stat_lock);
@@ -1319,7 +1319,7 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
                        mpol_shared_policy_init(&info->policy);
                        break;
                }
-       } else if (sbinfo) {
+       } else if (sbinfo->max_inodes) {
                spin_lock(&sbinfo->stat_lock);
                sbinfo->free_inodes++;
                spin_unlock(&sbinfo->stat_lock);
@@ -1328,31 +1328,6 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
 }
 
 #ifdef CONFIG_TMPFS
-
-static int shmem_set_size(struct shmem_sb_info *sbinfo,
-                         unsigned long max_blocks, unsigned long max_inodes)
-{
-       int error;
-       unsigned long blocks, inodes;
-
-       spin_lock(&sbinfo->stat_lock);
-       blocks = sbinfo->max_blocks - sbinfo->free_blocks;
-       inodes = sbinfo->max_inodes - sbinfo->free_inodes;
-       error = -EINVAL;
-       if (max_blocks < blocks)
-               goto out;
-       if (max_inodes < inodes)
-               goto out;
-       error = 0;
-       sbinfo->max_blocks  = max_blocks;
-       sbinfo->free_blocks = max_blocks - blocks;
-       sbinfo->max_inodes  = max_inodes;
-       sbinfo->free_inodes = max_inodes - inodes;
-out:
-       spin_unlock(&sbinfo->stat_lock);
-       return error;
-}
-
 static struct inode_operations shmem_symlink_inode_operations;
 static struct inode_operations shmem_symlink_inline_operations;
 
@@ -1607,15 +1582,17 @@ static int shmem_statfs(struct super_block *sb, struct kstatfs *buf)
        buf->f_type = TMPFS_MAGIC;
        buf->f_bsize = PAGE_CACHE_SIZE;
        buf->f_namelen = NAME_MAX;
-       if (sbinfo) {
-               spin_lock(&sbinfo->stat_lock);
+       spin_lock(&sbinfo->stat_lock);
+       if (sbinfo->max_blocks) {
                buf->f_blocks = sbinfo->max_blocks;
                buf->f_bavail = buf->f_bfree = sbinfo->free_blocks;
+       }
+       if (sbinfo->max_inodes) {
                buf->f_files = sbinfo->max_inodes;
                buf->f_ffree = sbinfo->free_inodes;
-               spin_unlock(&sbinfo->stat_lock);
        }
        /* else leave those fields 0 like simple_statfs */
+       spin_unlock(&sbinfo->stat_lock);
        return 0;
 }
 
@@ -1672,7 +1649,7 @@ static int shmem_link(struct dentry *old_dentry, struct inode *dir, struct dentr
         * but each new link needs a new dentry, pinning lowmem, and
         * tmpfs dentries cannot be pruned until they are unlinked.
         */
-       if (sbinfo) {
+       if (sbinfo->max_inodes) {
                spin_lock(&sbinfo->stat_lock);
                if (!sbinfo->free_inodes) {
                        spin_unlock(&sbinfo->stat_lock);
@@ -1697,7 +1674,7 @@ static int shmem_unlink(struct inode *dir, struct dentry *dentry)
 
        if (inode->i_nlink > 1 && !S_ISDIR(inode->i_mode)) {
                struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);
-               if (sbinfo) {
+               if (sbinfo->max_inodes) {
                        spin_lock(&sbinfo->stat_lock);
                        sbinfo->free_inodes++;
                        spin_unlock(&sbinfo->stat_lock);
@@ -1921,22 +1898,42 @@ bad_val:
 static int shmem_remount_fs(struct super_block *sb, int *flags, char *data)
 {
        struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
-       unsigned long max_blocks = 0;
-       unsigned long max_inodes = 0;
+       unsigned long max_blocks = sbinfo->max_blocks;
+       unsigned long max_inodes = sbinfo->max_inodes;
+       unsigned long blocks;
+       unsigned long inodes;
+       int error = -EINVAL;
+
+       if (shmem_parse_options(data, NULL, NULL, NULL,
+                               &max_blocks, &max_inodes))
+               return error;
 
-       if (sbinfo) {
-               max_blocks = sbinfo->max_blocks;
-               max_inodes = sbinfo->max_inodes;
-       }
-       if (shmem_parse_options(data, NULL, NULL, NULL, &max_blocks, &max_inodes))
-               return -EINVAL;
-       /* Keep it simple: disallow limited <-> unlimited remount */
-       if ((max_blocks || max_inodes) == !sbinfo)
-               return -EINVAL;
-       /* But allow the pointless unlimited -> unlimited remount */
-       if (!sbinfo)
-               return 0;
-       return shmem_set_size(sbinfo, max_blocks, max_inodes);
+       spin_lock(&sbinfo->stat_lock);
+       blocks = sbinfo->max_blocks - sbinfo->free_blocks;
+       inodes = sbinfo->max_inodes - sbinfo->free_inodes;
+       if (max_blocks < blocks)
+               goto out;
+       if (max_inodes < inodes)
+               goto out;
+       /*
+        * Those tests also disallow limited->unlimited while any are in
+        * use, so i_blocks will always be zero when max_blocks is zero;
+        * but we must separately disallow unlimited->limited, because
+        * in that case we have no record of how much is already in use.
+        */
+       if (max_blocks && !sbinfo->max_blocks)
+               goto out;
+       if (max_inodes && !sbinfo->max_inodes)
+               goto out;
+
+       error = 0;
+       sbinfo->max_blocks  = max_blocks;
+       sbinfo->free_blocks = max_blocks - blocks;
+       sbinfo->max_inodes  = max_inodes;
+       sbinfo->free_inodes = max_inodes - inodes;
+out:
+       spin_unlock(&sbinfo->stat_lock);
+       return error;
 }
 #endif
 
@@ -1961,11 +1958,11 @@ static int shmem_fill_super(struct super_block *sb,
        uid_t uid = current->fsuid;
        gid_t gid = current->fsgid;
        int err = -ENOMEM;
-
-#ifdef CONFIG_TMPFS
+       struct shmem_sb_info *sbinfo;
        unsigned long blocks = 0;
        unsigned long inodes = 0;
 
+#ifdef CONFIG_TMPFS
        /*
         * Per default we only allow half of the physical ram per
         * tmpfs instance, limiting inodes to one per page of lowmem;
@@ -1976,34 +1973,34 @@ static int shmem_fill_super(struct super_block *sb,
                inodes = totalram_pages - totalhigh_pages;
                if (inodes > blocks)
                        inodes = blocks;
-
-               if (shmem_parse_options(data, &mode,
-                                       &uid, &gid, &blocks, &inodes))
+               if (shmem_parse_options(data, &mode, &uid, &gid,
+                                       &blocks, &inodes))
                        return -EINVAL;
        }
-
-       if (blocks || inodes) {
-               struct shmem_sb_info *sbinfo;
-               sbinfo = kmalloc(sizeof(struct shmem_sb_info), GFP_KERNEL);
-               if (!sbinfo)
-                       return -ENOMEM;
-               sb->s_fs_info = sbinfo;
-               spin_lock_init(&sbinfo->stat_lock);
-               sbinfo->max_blocks = blocks;
-               sbinfo->free_blocks = blocks;
-               sbinfo->max_inodes = inodes;
-               sbinfo->free_inodes = inodes;
-       }
-       sb->s_xattr = shmem_xattr_handlers;
 #else
        sb->s_flags |= MS_NOUSER;
 #endif
 
+       /* Round up to L1_CACHE_BYTES to resist false sharing */
+       sbinfo = kmalloc(max((int)sizeof(struct shmem_sb_info),
+                               L1_CACHE_BYTES), GFP_KERNEL);
+       if (!sbinfo)
+               return -ENOMEM;
+
+       spin_lock_init(&sbinfo->stat_lock);
+       sbinfo->max_blocks = blocks;
+       sbinfo->free_blocks = blocks;
+       sbinfo->max_inodes = inodes;
+       sbinfo->free_inodes = inodes;
+
+       sb->s_fs_info = sbinfo;
        sb->s_maxbytes = SHMEM_MAX_BYTES;
        sb->s_blocksize = PAGE_CACHE_SIZE;
        sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
        sb->s_magic = TMPFS_MAGIC;
        sb->s_op = &shmem_ops;
+       sb->s_xattr = shmem_xattr_handlers;
+
        inode = shmem_get_inode(sb, S_IFDIR | mode, 0);
        if (!inode)
                goto failed;
index 840742641152b91052d5688553f761aaff829be2..93cbbbb39f42a783244e6bfaebfbd68f1f017e4c 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -2620,6 +2620,12 @@ unsigned int kmem_cache_size(kmem_cache_t *cachep)
 }
 EXPORT_SYMBOL(kmem_cache_size);
 
+const char *kmem_cache_name(kmem_cache_t *cachep)
+{
+       return cachep->name;
+}
+EXPORT_SYMBOL_GPL(kmem_cache_name);
+
 struct ccupdate_struct {
        kmem_cache_t *cachep;
        struct array_cache *new[NR_CPUS];
@@ -2845,6 +2851,7 @@ next:
        }
        check_irq_on();
        up(&cache_chain_sem);
+       drain_remote_pages();
        /* Setup the next iteration */
        schedule_delayed_work(&__get_cpu_var(reap_work), REAPTIMEOUT_CPUC + smp_processor_id());
 }
index a60e0075d55bd4d5692a5b39f146a7cedffe51e7..60cd24a55204efc5c84956443d02f9806bd66a9d 100644 (file)
@@ -79,7 +79,7 @@ void swap_unplug_io_fn(struct backing_dev_info *unused_bdi, struct page *page)
                WARN_ON(page_count(page) <= 1);
 
                bdi = bdev->bd_inode->i_mapping->backing_dev_info;
-               bdi->unplug_io_fn(bdi, page);
+               blk_run_backing_dev(bdi, page);
        }
        up_read(&swap_unplug_sem);
 }
@@ -276,61 +276,37 @@ void swap_free(swp_entry_t entry)
 }
 
 /*
- * Check if we're the only user of a swap page,
- * when the page is locked.
+ * How many references to page are currently swapped out?
  */
-static int exclusive_swap_page(struct page *page)
+static inline int page_swapcount(struct page *page)
 {
-       int retval = 0;
-       struct swap_info_struct * p;
+       int count = 0;
+       struct swap_info_struct *p;
        swp_entry_t entry;
 
        entry.val = page->private;
        p = swap_info_get(entry);
        if (p) {
-               /* Is the only swap cache user the cache itself? */
-               if (p->swap_map[swp_offset(entry)] == 1) {
-                       /* Recheck the page count with the swapcache lock held.. */
-                       write_lock_irq(&swapper_space.tree_lock);
-                       if (page_count(page) == 2)
-                               retval = 1;
-                       write_unlock_irq(&swapper_space.tree_lock);
-               }
+               /* Subtract the 1 for the swap cache itself */
+               count = p->swap_map[swp_offset(entry)] - 1;
                swap_info_put(p);
        }
-       return retval;
+       return count;
 }
 
 /*
  * We can use this swap cache entry directly
  * if there are no other references to it.
- *
- * Here "exclusive_swap_page()" does the real
- * work, but we opportunistically check whether
- * we need to get all the locks first..
  */
 int can_share_swap_page(struct page *page)
 {
-       int retval = 0;
+       int count;
 
-       if (!PageLocked(page))
-               BUG();
-       switch (page_count(page)) {
-       case 3:
-               if (!PagePrivate(page))
-                       break;
-               /* Fallthrough */
-       case 2:
-               if (!PageSwapCache(page))
-                       break;
-               retval = exclusive_swap_page(page);
-               break;
-       case 1:
-               if (PageReserved(page))
-                       break;
-               retval = 1;
-       }
-       return retval;
+       BUG_ON(!PageLocked(page));
+       count = page_mapcount(page);
+       if (count <= 1 && PageSwapCache(page))
+               count += page_swapcount(page);
+       return count == 1;
 }
 
 /*
@@ -529,9 +505,10 @@ static int unuse_mm(struct mm_struct *mm,
 
        if (!down_read_trylock(&mm->mmap_sem)) {
                /*
-                * Our reference to the page stops try_to_unmap_one from
-                * unmapping its ptes, so swapoff can make progress.
+                * Activate page so shrink_cache is unlikely to unmap its
+                * ptes while lock is dropped, so swapoff can make progress.
                 */
+               activate_page(page);
                unlock_page(page);
                down_read(&mm->mmap_sem);
                lock_page(page);
index 2bd83e5c2bbf0c7e8f12af4ea2f7b3b749a1a6b4..8ff16a1eee6ad43e5a7bec93a207ee94392c2233 100644 (file)
@@ -248,31 +248,20 @@ struct vm_struct *get_vm_area(unsigned long size, unsigned long flags)
        return __get_vm_area(size, flags, VMALLOC_START, VMALLOC_END);
 }
 
-/**
- *     remove_vm_area  -  find and remove a contingous kernel virtual area
- *
- *     @addr:          base address
- *
- *     Search for the kernel VM area starting at @addr, and remove it.
- *     This function returns the found VM area, but using it is NOT safe
- *     on SMP machines.
- */
-struct vm_struct *remove_vm_area(void *addr)
+/* Caller must hold vmlist_lock */
+struct vm_struct *__remove_vm_area(void *addr)
 {
        struct vm_struct **p, *tmp;
 
-       write_lock(&vmlist_lock);
        for (p = &vmlist ; (tmp = *p) != NULL ;p = &tmp->next) {
                 if (tmp->addr == addr)
                         goto found;
        }
-       write_unlock(&vmlist_lock);
        return NULL;
 
 found:
        unmap_vm_area(tmp);
        *p = tmp->next;
-       write_unlock(&vmlist_lock);
 
        /*
         * Remove the guard page.
@@ -281,6 +270,24 @@ found:
        return tmp;
 }
 
+/**
+ *     remove_vm_area  -  find and remove a contingous kernel virtual area
+ *
+ *     @addr:          base address
+ *
+ *     Search for the kernel VM area starting at @addr, and remove it.
+ *     This function returns the found VM area, but using it is NOT safe
+ *     on SMP machines, except for its size or flags.
+ */
+struct vm_struct *remove_vm_area(void *addr)
+{
+       struct vm_struct *v;
+       write_lock(&vmlist_lock);
+       v = __remove_vm_area(addr);
+       write_unlock(&vmlist_lock);
+       return v;
+}
+
 void __vunmap(void *addr, int deallocate_pages)
 {
        struct vm_struct *area;
index 269eded9b459804a8f090ea8dad0b908a4afef0d..4b8e62a193708b7c12808cdb0eccfad61a38bce5 100644 (file)
@@ -74,6 +74,9 @@ struct scan_control {
 
        int may_writepage;
 
+       /* Can pages be swapped as part of reclaim? */
+       int may_swap;
+
        /* This context's SWAP_CLUSTER_MAX. If freeing memory for
         * suspend, we effectively ignore SWAP_CLUSTER_MAX.
         * In this context, it doesn't matter that we scan the
@@ -180,17 +183,20 @@ EXPORT_SYMBOL(remove_shrinker);
  * `lru_pages' represents the number of on-LRU pages in all the zones which
  * are eligible for the caller's allocation attempt.  It is used for balancing
  * slab reclaim versus page reclaim.
+ *
+ * Returns the number of slab objects which we shrunk.
  */
 static int shrink_slab(unsigned long scanned, unsigned int gfp_mask,
                        unsigned long lru_pages)
 {
        struct shrinker *shrinker;
+       int ret = 0;
 
        if (scanned == 0)
                scanned = SWAP_CLUSTER_MAX;
 
        if (!down_read_trylock(&shrinker_rwsem))
-               return 0;
+               return 1;       /* Assume we'll be able to shrink next time */
 
        list_for_each_entry(shrinker, &shrinker_list, list) {
                unsigned long long delta;
@@ -209,10 +215,14 @@ static int shrink_slab(unsigned long scanned, unsigned int gfp_mask,
                while (total_scan >= SHRINK_BATCH) {
                        long this_scan = SHRINK_BATCH;
                        int shrink_ret;
+                       int nr_before;
 
+                       nr_before = (*shrinker->shrinker)(0, gfp_mask);
                        shrink_ret = (*shrinker->shrinker)(this_scan, gfp_mask);
                        if (shrink_ret == -1)
                                break;
+                       if (shrink_ret < nr_before)
+                               ret += nr_before - shrink_ret;
                        mod_page_state(slabs_scanned, this_scan);
                        total_scan -= this_scan;
 
@@ -222,7 +232,7 @@ static int shrink_slab(unsigned long scanned, unsigned int gfp_mask,
                shrinker->nr += total_scan;
        }
        up_read(&shrinker_rwsem);
-       return 0;
+       return ret;
 }
 
 /* Called without lock on whether page is mapped, so answer is unstable */
@@ -407,7 +417,7 @@ static int shrink_list(struct list_head *page_list, struct scan_control *sc)
                 * Anonymous process memory has backing store?
                 * Try to allocate it some swap space here.
                 */
-               if (PageAnon(page) && !PageSwapCache(page)) {
+               if (PageAnon(page) && !PageSwapCache(page) && sc->may_swap) {
                        if (!add_to_swap(page))
                                goto activate_locked;
                }
@@ -890,7 +900,9 @@ shrink_caches(struct zone **zones, struct scan_control *sc)
                if (zone->all_unreclaimable && sc->priority != DEF_PRIORITY)
                        continue;       /* Let kswapd poll it */
 
+               atomic_inc(&zone->reclaim_in_progress);
                shrink_zone(zone, sc);
+               atomic_dec(&zone->reclaim_in_progress);
        }
 }
  
@@ -907,8 +919,7 @@ shrink_caches(struct zone **zones, struct scan_control *sc)
  * holds filesystem locks which prevent writeout this might not work, and the
  * allocation attempt will fail.
  */
-int try_to_free_pages(struct zone **zones,
-               unsigned int gfp_mask, unsigned int order)
+int try_to_free_pages(struct zone **zones, unsigned int gfp_mask)
 {
        int priority;
        int ret = 0;
@@ -920,6 +931,7 @@ int try_to_free_pages(struct zone **zones,
 
        sc.gfp_mask = gfp_mask;
        sc.may_writepage = 0;
+       sc.may_swap = 1;
 
        inc_page_state(allocstall);
 
@@ -1020,6 +1032,7 @@ loop_again:
        total_reclaimed = 0;
        sc.gfp_mask = GFP_KERNEL;
        sc.may_writepage = 0;
+       sc.may_swap = 1;
        sc.nr_mapped = read_page_state(nr_mapped);
 
        inc_page_state(pageoutrun);
@@ -1079,6 +1092,7 @@ scan:
                 */
                for (i = 0; i <= end_zone; i++) {
                        struct zone *zone = pgdat->node_zones + i;
+                       int nr_slab;
 
                        if (zone->present_pages == 0)
                                continue;
@@ -1098,16 +1112,19 @@ scan:
                        sc.nr_reclaimed = 0;
                        sc.priority = priority;
                        sc.swap_cluster_max = nr_pages? nr_pages : SWAP_CLUSTER_MAX;
+                       atomic_inc(&zone->reclaim_in_progress);
                        shrink_zone(zone, &sc);
+                       atomic_dec(&zone->reclaim_in_progress);
                        reclaim_state->reclaimed_slab = 0;
-                       shrink_slab(sc.nr_scanned, GFP_KERNEL, lru_pages);
+                       nr_slab = shrink_slab(sc.nr_scanned, GFP_KERNEL,
+                                               lru_pages);
                        sc.nr_reclaimed += reclaim_state->reclaimed_slab;
                        total_reclaimed += sc.nr_reclaimed;
                        total_scanned += sc.nr_scanned;
                        if (zone->all_unreclaimable)
                                continue;
-                       if (zone->pages_scanned >= (zone->nr_active +
-                                                       zone->nr_inactive) * 4)
+                       if (nr_slab == 0 && zone->pages_scanned >=
+                                   (zone->nr_active + zone->nr_inactive) * 4)
                                zone->all_unreclaimable = 1;
                        /*
                         * If we've done a decent amount of scanning and
@@ -1309,3 +1326,73 @@ static int __init kswapd_init(void)
 }
 
 module_init(kswapd_init)
+
+
+/*
+ * Try to free up some pages from this zone through reclaim.
+ */
+int zone_reclaim(struct zone *zone, unsigned int gfp_mask, unsigned int order)
+{
+       struct scan_control sc;
+       int nr_pages = 1 << order;
+       int total_reclaimed = 0;
+
+       /* The reclaim may sleep, so don't do it if sleep isn't allowed */
+       if (!(gfp_mask & __GFP_WAIT))
+               return 0;
+       if (zone->all_unreclaimable)
+               return 0;
+
+       sc.gfp_mask = gfp_mask;
+       sc.may_writepage = 0;
+       sc.may_swap = 0;
+       sc.nr_mapped = read_page_state(nr_mapped);
+       sc.nr_scanned = 0;
+       sc.nr_reclaimed = 0;
+       /* scan at the highest priority */
+       sc.priority = 0;
+
+       if (nr_pages > SWAP_CLUSTER_MAX)
+               sc.swap_cluster_max = nr_pages;
+       else
+               sc.swap_cluster_max = SWAP_CLUSTER_MAX;
+
+       /* Don't reclaim the zone if there are other reclaimers active */
+       if (!atomic_inc_and_test(&zone->reclaim_in_progress))
+               goto out;
+
+       shrink_zone(zone, &sc);
+       total_reclaimed = sc.nr_reclaimed;
+
+ out:
+       atomic_dec(&zone->reclaim_in_progress);
+       return total_reclaimed;
+}
+
+asmlinkage long sys_set_zone_reclaim(unsigned int node, unsigned int zone,
+                                    unsigned int state)
+{
+       struct zone *z;
+       int i;
+
+       if (node >= MAX_NUMNODES || !node_online(node))
+               return -EINVAL;
+
+       /* This will break if we ever add more zones */
+       if (!(zone & (1<<ZONE_DMA|1<<ZONE_NORMAL|1<<ZONE_HIGHMEM)))
+               return -EINVAL;
+
+       for (i = 0; i < MAX_NR_ZONES; i++) {
+               if (!(zone & 1<<i))
+                       continue;
+
+               z = &NODE_DATA(node)->node_zones[i];
+
+               if (state)
+                       z->reclaim_pages = 1;
+               else
+                       z->reclaim_pages = 0;
+       }
+
+       return 0;
+}
index 85293ccf7efcd3c66724dd8bfed62d9a1afef19c..a755e880f4bafa1d8847ab622d83ec189c95f5b4 100644 (file)
@@ -47,12 +47,12 @@ static void rif_check_expire(unsigned long dummy);
  *     Each RIF entry we learn is kept this way
  */
  
-struct rif_cache_s {   
+struct rif_cache {
        unsigned char addr[TR_ALEN];
        int iface;
-       __u16 rcf;
-       __u16 rseg[8];
-       struct rif_cache_s *next;
+       __be16 rcf;
+       __be16 rseg[8];
+       struct rif_cache *next;
        unsigned long last_used;
        unsigned char local_ring;
 };
@@ -64,7 +64,7 @@ struct rif_cache_s {
  *     up a lot.
  */
  
-static struct rif_cache_s *rif_table[RIF_TABLE_SIZE];
+static struct rif_cache *rif_table[RIF_TABLE_SIZE];
 
 static DEFINE_SPINLOCK(rif_lock);
 
@@ -249,7 +249,7 @@ void tr_source_route(struct sk_buff *skb,struct trh_hdr *trh,struct net_device *
 {
        int slack;
        unsigned int hash;
-       struct rif_cache_s *entry;
+       struct rif_cache *entry;
        unsigned char *olddata;
        static const unsigned char mcast_func_addr[] 
                = {0xC0,0x00,0x00,0x04,0x00,0x00};
@@ -337,7 +337,7 @@ printk("source routing for %02X:%02X:%02X:%02X:%02X:%02X\n",trh->daddr[0],
 static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev)
 {
        unsigned int hash, rii_p = 0;
-       struct rif_cache_s *entry;
+       struct rif_cache *entry;
 
 
        spin_lock_bh(&rif_lock);
@@ -373,7 +373,7 @@ printk("adding rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
                 *      FIXME: We ought to keep some kind of cache size
                 *      limiting and adjust the timers to suit.
                 */
-               entry=kmalloc(sizeof(struct rif_cache_s),GFP_ATOMIC);
+               entry=kmalloc(sizeof(struct rif_cache),GFP_ATOMIC);
 
                if(!entry) 
                {
@@ -435,7 +435,7 @@ static void rif_check_expire(unsigned long dummy)
        spin_lock_bh(&rif_lock);
        
        for(i =0; i < RIF_TABLE_SIZE; i++) {
-               struct rif_cache_s *entry, **pentry;
+               struct rif_cache *entry, **pentry;
                
                pentry = rif_table+i;
                while((entry=*pentry) != NULL) {
@@ -467,10 +467,10 @@ static void rif_check_expire(unsigned long dummy)
  
 #ifdef CONFIG_PROC_FS
 
-static struct rif_cache_s *rif_get_idx(loff_t pos)
+static struct rif_cache *rif_get_idx(loff_t pos)
 {
        int i;
-       struct rif_cache_s *entry;
+       struct rif_cache *entry;
        loff_t off = 0;
 
        for(i = 0; i < RIF_TABLE_SIZE; i++) 
@@ -493,7 +493,7 @@ static void *rif_seq_start(struct seq_file *seq, loff_t *pos)
 static void *rif_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        int i;
-       struct rif_cache_s *ent = v;
+       struct rif_cache *ent = v;
 
        ++*pos;
 
@@ -522,7 +522,7 @@ static void rif_seq_stop(struct seq_file *seq, void *v)
 static int rif_seq_show(struct seq_file *seq, void *v)
 {
        int j, rcf_len, segment, brdgnmb;
-       struct rif_cache_s *entry = v;
+       struct rif_cache *entry = v;
 
        if (v == SEQ_START_TOKEN)
                seq_puts(seq,
index 54640c01b50cddcbf3f42321361c08b9ebe911c4..10d040461021271e127e28d3bea365ababc6c037 100644 (file)
@@ -565,7 +565,7 @@ int aarp_send_ddp(struct net_device *dev, struct sk_buff *skb,
                         *      numbers we just happen to need. Now put the
                         *      length in the lower two.
                         */
-                       *((__u16 *)skb->data) = htons(skb->len);
+                       *((__be16 *)skb->data) = htons(skb->len);
                        ft = 1;
                }
                /*
index 876dbac71060860956f2e939c81efe2b91512775..192b529f86a456e62864867d9a219b5eabb7f796 100644 (file)
@@ -401,7 +401,7 @@ out_err:
 }
 
 /* Find a match for a specific network:node pair */
-static struct atalk_iface *atalk_find_interface(int net, int node)
+static struct atalk_iface *atalk_find_interface(__be16 net, int node)
 {
        struct atalk_iface *iface;
 
index d9b72fde433c4e378b1d3657843785f684497a52..f564ee99782d248dab471e124f3d02dadeb5512a 100644 (file)
 
 static struct net_device_stats *br_dev_get_stats(struct net_device *dev)
 {
-       struct net_bridge *br;
-
-       br = dev->priv;
-
+       struct net_bridge *br = netdev_priv(dev);
        return &br->statistics;
 }
 
@@ -54,9 +51,11 @@ int br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
 
 static int br_dev_open(struct net_device *dev)
 {
-       netif_start_queue(dev);
+       struct net_bridge *br = netdev_priv(dev);
 
-       br_stp_enable_bridge(dev->priv);
+       br_features_recompute(br);
+       netif_start_queue(dev);
+       br_stp_enable_bridge(br);
 
        return 0;
 }
@@ -67,7 +66,7 @@ static void br_dev_set_multicast_list(struct net_device *dev)
 
 static int br_dev_stop(struct net_device *dev)
 {
-       br_stp_disable_bridge(dev->priv);
+       br_stp_disable_bridge(netdev_priv(dev));
 
        netif_stop_queue(dev);
 
@@ -76,7 +75,7 @@ static int br_dev_stop(struct net_device *dev)
 
 static int br_change_mtu(struct net_device *dev, int new_mtu)
 {
-       if ((new_mtu < 68) || new_mtu > br_min_mtu(dev->priv))
+       if (new_mtu < 68 || new_mtu > br_min_mtu(netdev_priv(dev)))
                return -EINVAL;
 
        dev->mtu = new_mtu;
index ef9f2095f96e37dae664786b70638b46befd88da..069253f830c10cd777d22662e976c89a593a2547 100644 (file)
@@ -57,9 +57,6 @@ int br_forward_finish(struct sk_buff *skb)
 static void __br_deliver(const struct net_bridge_port *to, struct sk_buff *skb)
 {
        skb->dev = to->dev;
-#ifdef CONFIG_NETFILTER_DEBUG
-       skb->nf_debug = 0;
-#endif
        NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev,
                        br_forward_finish);
 }
index 69872bf3b87e9e59426e384406f72747e9d09b6a..91bb895375f4c8e90c4ef6190e19dd7de4de6c0f 100644 (file)
@@ -314,6 +314,28 @@ int br_min_mtu(const struct net_bridge *br)
        return mtu;
 }
 
+/*
+ * Recomputes features using slave's features
+ */
+void br_features_recompute(struct net_bridge *br)
+{
+       struct net_bridge_port *p;
+       unsigned long features, checksum;
+
+       features = NETIF_F_SG | NETIF_F_FRAGLIST 
+               | NETIF_F_HIGHDMA | NETIF_F_TSO;
+       checksum = NETIF_F_IP_CSUM;     /* least commmon subset */
+
+       list_for_each_entry(p, &br->port_list, list) {
+               if (!(p->dev->features 
+                     & (NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM)))
+                       checksum = 0;
+               features &= p->dev->features;
+       }
+
+       br->dev->features = features | checksum | NETIF_F_LLTX;
+}
+
 /* called with RTNL */
 int br_add_if(struct net_bridge *br, struct net_device *dev)
 {
@@ -368,6 +390,7 @@ int br_del_if(struct net_bridge *br, struct net_device *dev)
 
        spin_lock_bh(&br->lock);
        br_stp_recalculate_bridge_id(br);
+       br_features_recompute(br);
        spin_unlock_bh(&br->lock);
 
        return 0;
index 2b1cce46cab42f71faee654e91c9fdfc2a224551..9a45e6279c57c4f1eebb005f674b0284defe1151 100644 (file)
@@ -23,11 +23,7 @@ const unsigned char bridge_ula[6] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 };
 
 static int br_pass_frame_up_finish(struct sk_buff *skb)
 {
-#ifdef CONFIG_NETFILTER_DEBUG
-       skb->nf_debug = 0;
-#endif
-       netif_rx(skb);
-
+       netif_receive_skb(skb);
        return 0;
 }
 
@@ -54,6 +50,9 @@ int br_handle_frame_finish(struct sk_buff *skb)
        struct net_bridge_fdb_entry *dst;
        int passedup = 0;
 
+       /* insert into forwarding database after filtering to avoid spoofing */
+       br_fdb_update(p->br, p, eth_hdr(skb)->h_source);
+
        if (br->dev->flags & IFF_PROMISC) {
                struct sk_buff *skb2;
 
@@ -108,8 +107,7 @@ int br_handle_frame(struct net_bridge_port *p, struct sk_buff **pskb)
        if (!is_valid_ether_addr(eth_hdr(skb)->h_source))
                goto err;
 
-       if (p->state == BR_STATE_LEARNING ||
-           p->state == BR_STATE_FORWARDING)
+       if (p->state == BR_STATE_LEARNING)
                br_fdb_update(p->br, p, eth_hdr(skb)->h_source);
 
        if (p->br->stp_enabled &&
index be03d3ad264849f1e726b2e3ab76de1d0c44527d..03ae4edddac35bf6dbfa8773f9031279b9aa4dd1 100644 (file)
@@ -102,10 +102,6 @@ static int br_nf_pre_routing_finish_ipv6(struct sk_buff *skb)
 {
        struct nf_bridge_info *nf_bridge = skb->nf_bridge;
 
-#ifdef CONFIG_NETFILTER_DEBUG
-       skb->nf_debug ^= (1 << NF_BR_PRE_ROUTING);
-#endif
-
        if (nf_bridge->mask & BRNF_PKT_TYPE) {
                skb->pkt_type = PACKET_OTHERHOST;
                nf_bridge->mask ^= BRNF_PKT_TYPE;
@@ -182,10 +178,6 @@ static void __br_dnat_complain(void)
  * --Bart, 20021007 (updated) */
 static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb)
 {
-#ifdef CONFIG_NETFILTER_DEBUG
-       skb->nf_debug |= (1 << NF_BR_PRE_ROUTING) | (1 << NF_BR_FORWARD);
-#endif
-
        if (skb->pkt_type == PACKET_OTHERHOST) {
                skb->pkt_type = PACKET_HOST;
                skb->nf_bridge->mask |= BRNF_PKT_TYPE;
@@ -207,10 +199,6 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb)
        struct iphdr *iph = skb->nh.iph;
        struct nf_bridge_info *nf_bridge = skb->nf_bridge;
 
-#ifdef CONFIG_NETFILTER_DEBUG
-       skb->nf_debug ^= (1 << NF_BR_PRE_ROUTING);
-#endif
-
        if (nf_bridge->mask & BRNF_PKT_TYPE) {
                skb->pkt_type = PACKET_OTHERHOST;
                nf_bridge->mask ^= BRNF_PKT_TYPE;
@@ -382,9 +370,6 @@ static unsigned int br_nf_pre_routing_ipv6(unsigned int hook,
        if (hdr->nexthdr == NEXTHDR_HOP && check_hbh_len(skb))
                        goto inhdr_error;
 
-#ifdef CONFIG_NETFILTER_DEBUG
-       skb->nf_debug ^= (1 << NF_IP6_PRE_ROUTING);
-#endif
        if ((nf_bridge = nf_bridge_alloc(skb)) == NULL)
                return NF_DROP;
        setup_pre_routing(skb);
@@ -468,9 +453,6 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb,
                        skb->ip_summed = CHECKSUM_NONE;
        }
 
-#ifdef CONFIG_NETFILTER_DEBUG
-       skb->nf_debug ^= (1 << NF_IP_PRE_ROUTING);
-#endif
        if ((nf_bridge = nf_bridge_alloc(skb)) == NULL)
                return NF_DROP;
        setup_pre_routing(skb);
@@ -517,10 +499,6 @@ static int br_nf_forward_finish(struct sk_buff *skb)
        struct net_device *in;
        struct vlan_ethhdr *hdr = vlan_eth_hdr(skb);
 
-#ifdef CONFIG_NETFILTER_DEBUG
-       skb->nf_debug ^= (1 << NF_BR_FORWARD);
-#endif
-
        if (skb->protocol != __constant_htons(ETH_P_ARP) && !IS_VLAN_ARP) {
                in = nf_bridge->physindev;
                if (nf_bridge->mask & BRNF_PKT_TYPE) {
@@ -566,9 +544,6 @@ static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff **pskb,
                (*pskb)->nh.raw += VLAN_HLEN;
        }
 
-#ifdef CONFIG_NETFILTER_DEBUG
-       skb->nf_debug ^= (1 << NF_BR_FORWARD);
-#endif
        nf_bridge = skb->nf_bridge;
        if (skb->pkt_type == PACKET_OTHERHOST) {
                skb->pkt_type = PACKET_HOST;
@@ -605,10 +580,6 @@ static unsigned int br_nf_forward_arp(unsigned int hook, struct sk_buff **pskb,
                (*pskb)->nh.raw += VLAN_HLEN;
        }
 
-#ifdef CONFIG_NETFILTER_DEBUG
-       skb->nf_debug ^= (1 << NF_BR_FORWARD);
-#endif
-
        if (skb->nh.arph->ar_pln != 4) {
                if (IS_VLAN_ARP) {
                        skb_push(*pskb, VLAN_HLEN);
@@ -627,9 +598,6 @@ static unsigned int br_nf_forward_arp(unsigned int hook, struct sk_buff **pskb,
 /* PF_BRIDGE/LOCAL_OUT ***********************************************/
 static int br_nf_local_out_finish(struct sk_buff *skb)
 {
-#ifdef CONFIG_NETFILTER_DEBUG
-       skb->nf_debug &= ~(1 << NF_BR_LOCAL_OUT);
-#endif
        if (skb->protocol == __constant_htons(ETH_P_8021Q)) {
                skb_push(skb, VLAN_HLEN);
                skb->nh.raw -= VLAN_HLEN;
@@ -731,10 +699,6 @@ static unsigned int br_nf_local_out(unsigned int hook, struct sk_buff **pskb,
                               realoutdev, br_nf_local_out_finish,
                               NF_IP_PRI_BRIDGE_SABOTAGE_FORWARD + 1);
        } else {
-#ifdef CONFIG_NETFILTER_DEBUG
-               skb->nf_debug ^= (1 << NF_IP_LOCAL_OUT);
-#endif
-
                NF_HOOK_THRESH(pf, NF_IP_LOCAL_OUT, skb, realindev,
                               realoutdev, br_nf_local_out_finish,
                               NF_IP_PRI_BRIDGE_SABOTAGE_LOCAL_OUT + 1);
@@ -779,8 +743,6 @@ static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff **pskb,
                printk(KERN_CRIT "br_netfilter: skb->dst == NULL.");
                goto print_error;
        }
-
-       skb->nf_debug ^= (1 << NF_IP_POST_ROUTING);
 #endif
 
        /* We assume any code from br_dev_queue_push_xmit onwards doesn't care
index f8fb49e34764e86cc8884c32b2ee924d512b3365..917311c6828b9c5c70d2290c617c4ebaf9be3405 100644 (file)
@@ -65,6 +65,15 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v
                }
                break;
 
+       case NETDEV_FEAT_CHANGE:
+               if (br->dev->flags & IFF_UP) 
+                       br_features_recompute(br);
+
+               /* could do recursive feature change notification
+                * but who would care?? 
+                */
+               break;
+
        case NETDEV_DOWN:
                if (br->dev->flags & IFF_UP)
                        br_stp_disable_port(p);
index 54d63f1372a0a65641baf53c7d4dbeb3f9f1c963..bdf95a74d8cd3294ec5765dabf94de1edd20de93 100644 (file)
@@ -174,6 +174,7 @@ extern int br_add_if(struct net_bridge *br,
 extern int br_del_if(struct net_bridge *br,
              struct net_device *dev);
 extern int br_min_mtu(const struct net_bridge *br);
+extern void br_features_recompute(struct net_bridge *br);
 
 /* br_input.c */
 extern int br_handle_frame_finish(struct sk_buff *skb);
index b91a875aca01c23f0b37b7916cad225e0c5f9fe5..d071f1c9ad0b00076c18ce677ed1ccba0bc300ec 100644 (file)
@@ -140,6 +140,9 @@ int br_stp_handle_bpdu(struct sk_buff *skb)
        struct net_bridge *br = p->br;
        unsigned char *buf;
 
+       /* insert into forwarding database after filtering to avoid spoofing */
+       br_fdb_update(p->br, p, eth_hdr(skb)->h_source);
+
        /* need at least the 802 and STP headers */
        if (!pskb_may_pull(skb, sizeof(header)+1) ||
            memcmp(skb->data, header, sizeof(header)))
index 81f03243fe2f07ebc9399346b78e7049093867fb..5e0c56b7f60763f45d4869843ec8659f45c5da30 100644 (file)
@@ -2,7 +2,8 @@
 # Makefile for the Linux networking core.
 #
 
-obj-y := sock.o skbuff.o iovec.o datagram.o stream.o scm.o gen_stats.o gen_estimator.o
+obj-y := sock.o request_sock.o skbuff.o iovec.o datagram.o stream.o scm.o \
+        gen_stats.o gen_estimator.o
 
 obj-$(CONFIG_SYSCTL) += sysctl_net_core.o
 
index d4d9e2680adbbc6c52c2b8486857a7573b96cec3..ab935778ce81009cadea261d289f7bd44e623850 100644 (file)
@@ -760,6 +760,18 @@ int dev_change_name(struct net_device *dev, char *newname)
        return err;
 }
 
+/**
+ *     netdev_features_change - device changes fatures
+ *     @dev: device to cause notification
+ *
+ *     Called to indicate a device has changed features.
+ */
+void netdev_features_change(struct net_device *dev)
+{
+       notifier_call_chain(&netdev_chain, NETDEV_FEAT_CHANGE, dev);
+}
+EXPORT_SYMBOL(netdev_features_change);
+
 /**
  *     netdev_state_change - device changes state
  *     @dev: device to cause notification
@@ -1732,6 +1744,7 @@ static int process_backlog(struct net_device *backlog_dev, int *budget)
        struct softnet_data *queue = &__get_cpu_var(softnet_data);
        unsigned long start_time = jiffies;
 
+       backlog_dev->weight = weight_p;
        for (;;) {
                struct sk_buff *skb;
                struct net_device *dev;
index f05fde97c43d6a8741fa8992972f022998be5161..a3eeb88e1c81fabe1eea26499958723955b08615 100644 (file)
@@ -29,7 +29,7 @@ u32 ethtool_op_get_link(struct net_device *dev)
 
 u32 ethtool_op_get_tx_csum(struct net_device *dev)
 {
-       return (dev->features & NETIF_F_IP_CSUM) != 0;
+       return (dev->features & (NETIF_F_IP_CSUM | NETIF_F_HW_CSUM)) != 0;
 }
 
 int ethtool_op_set_tx_csum(struct net_device *dev, u32 data)
@@ -42,6 +42,15 @@ int ethtool_op_set_tx_csum(struct net_device *dev, u32 data)
        return 0;
 }
 
+int ethtool_op_set_tx_hw_csum(struct net_device *dev, u32 data)
+{
+       if (data)
+               dev->features |= NETIF_F_HW_CSUM;
+       else
+               dev->features &= ~NETIF_F_HW_CSUM;
+
+       return 0;
+}
 u32 ethtool_op_get_sg(struct net_device *dev)
 {
        return (dev->features & NETIF_F_SG) != 0;
@@ -347,7 +356,7 @@ static int ethtool_set_coalesce(struct net_device *dev, void __user *useraddr)
 {
        struct ethtool_coalesce coalesce;
 
-       if (!dev->ethtool_ops->get_coalesce)
+       if (!dev->ethtool_ops->set_coalesce)
                return -EOPNOTSUPP;
 
        if (copy_from_user(&coalesce, useraddr, sizeof(coalesce)))
@@ -682,6 +691,7 @@ int dev_ethtool(struct ifreq *ifr)
        void __user *useraddr = ifr->ifr_data;
        u32 ethcmd;
        int rc;
+       unsigned long old_features;
 
        /*
         * XXX: This can be pushed down into the ethtool_* handlers that
@@ -703,6 +713,8 @@ int dev_ethtool(struct ifreq *ifr)
                if ((rc = dev->ethtool_ops->begin(dev)) < 0)
                        return rc;
 
+       old_features = dev->features;
+
        switch (ethcmd) {
        case ETHTOOL_GSET:
                rc = ethtool_get_settings(dev, useraddr);
@@ -712,7 +724,6 @@ int dev_ethtool(struct ifreq *ifr)
                break;
        case ETHTOOL_GDRVINFO:
                rc = ethtool_get_drvinfo(dev, useraddr);
-
                break;
        case ETHTOOL_GREGS:
                rc = ethtool_get_regs(dev, useraddr);
@@ -801,6 +812,10 @@ int dev_ethtool(struct ifreq *ifr)
        
        if(dev->ethtool_ops->complete)
                dev->ethtool_ops->complete(dev);
+
+       if (old_features != dev->features)
+               netdev_features_change(dev);
+
        return rc;
 
  ioctl:
@@ -817,3 +832,4 @@ EXPORT_SYMBOL(ethtool_op_get_tx_csum);
 EXPORT_SYMBOL(ethtool_op_set_sg);
 EXPORT_SYMBOL(ethtool_op_set_tso);
 EXPORT_SYMBOL(ethtool_op_set_tx_csum);
+EXPORT_SYMBOL(ethtool_op_set_tx_hw_csum);
index 43bdc521e20d9564ccec6472b30d95328e7d1329..f6bdcad47da6451a9603db531d626077fa946e6d 100644 (file)
@@ -1276,9 +1276,14 @@ struct neigh_parms *neigh_parms_alloc(struct net_device *dev,
                INIT_RCU_HEAD(&p->rcu_head);
                p->reachable_time =
                                neigh_rand_reach_time(p->base_reachable_time);
-               if (dev && dev->neigh_setup && dev->neigh_setup(dev, p)) {
-                       kfree(p);
-                       return NULL;
+               if (dev) {
+                       if (dev->neigh_setup && dev->neigh_setup(dev, p)) {
+                               kfree(p);
+                               return NULL;
+                       }
+
+                       dev_hold(dev);
+                       p->dev = dev;
                }
                p->sysctl_table = NULL;
                write_lock_bh(&tbl->lock);
@@ -1309,6 +1314,8 @@ void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms)
                        *p = parms->next;
                        parms->dead = 1;
                        write_unlock_bh(&tbl->lock);
+                       if (parms->dev)
+                               dev_put(parms->dev);
                        call_rcu(&parms->rcu_head, neigh_rcu_free_parms);
                        return;
                }
@@ -1546,20 +1553,323 @@ out:
        return err;
 }
 
+static int neightbl_fill_parms(struct sk_buff *skb, struct neigh_parms *parms)
+{
+       struct rtattr *nest = NULL;
+       
+       nest = RTA_NEST(skb, NDTA_PARMS);
+
+       if (parms->dev)
+               RTA_PUT_U32(skb, NDTPA_IFINDEX, parms->dev->ifindex);
+
+       RTA_PUT_U32(skb, NDTPA_REFCNT, atomic_read(&parms->refcnt));
+       RTA_PUT_U32(skb, NDTPA_QUEUE_LEN, parms->queue_len);
+       RTA_PUT_U32(skb, NDTPA_PROXY_QLEN, parms->proxy_qlen);
+       RTA_PUT_U32(skb, NDTPA_APP_PROBES, parms->app_probes);
+       RTA_PUT_U32(skb, NDTPA_UCAST_PROBES, parms->ucast_probes);
+       RTA_PUT_U32(skb, NDTPA_MCAST_PROBES, parms->mcast_probes);
+       RTA_PUT_MSECS(skb, NDTPA_REACHABLE_TIME, parms->reachable_time);
+       RTA_PUT_MSECS(skb, NDTPA_BASE_REACHABLE_TIME,
+                     parms->base_reachable_time);
+       RTA_PUT_MSECS(skb, NDTPA_GC_STALETIME, parms->gc_staletime);
+       RTA_PUT_MSECS(skb, NDTPA_DELAY_PROBE_TIME, parms->delay_probe_time);
+       RTA_PUT_MSECS(skb, NDTPA_RETRANS_TIME, parms->retrans_time);
+       RTA_PUT_MSECS(skb, NDTPA_ANYCAST_DELAY, parms->anycast_delay);
+       RTA_PUT_MSECS(skb, NDTPA_PROXY_DELAY, parms->proxy_delay);
+       RTA_PUT_MSECS(skb, NDTPA_LOCKTIME, parms->locktime);
+
+       return RTA_NEST_END(skb, nest);
+
+rtattr_failure:
+       return RTA_NEST_CANCEL(skb, nest);
+}
+
+static int neightbl_fill_info(struct neigh_table *tbl, struct sk_buff *skb,
+                             struct netlink_callback *cb)
+{
+       struct nlmsghdr *nlh;
+       struct ndtmsg *ndtmsg;
+
+       nlh = NLMSG_NEW_ANSWER(skb, cb, RTM_NEWNEIGHTBL, sizeof(struct ndtmsg),
+                              NLM_F_MULTI);
+
+       ndtmsg = NLMSG_DATA(nlh);
+
+       read_lock_bh(&tbl->lock);
+       ndtmsg->ndtm_family = tbl->family;
+
+       RTA_PUT_STRING(skb, NDTA_NAME, tbl->id);
+       RTA_PUT_MSECS(skb, NDTA_GC_INTERVAL, tbl->gc_interval);
+       RTA_PUT_U32(skb, NDTA_THRESH1, tbl->gc_thresh1);
+       RTA_PUT_U32(skb, NDTA_THRESH2, tbl->gc_thresh2);
+       RTA_PUT_U32(skb, NDTA_THRESH3, tbl->gc_thresh3);
+
+       {
+               unsigned long now = jiffies;
+               unsigned int flush_delta = now - tbl->last_flush;
+               unsigned int rand_delta = now - tbl->last_rand;
+
+               struct ndt_config ndc = {
+                       .ndtc_key_len           = tbl->key_len,
+                       .ndtc_entry_size        = tbl->entry_size,
+                       .ndtc_entries           = atomic_read(&tbl->entries),
+                       .ndtc_last_flush        = jiffies_to_msecs(flush_delta),
+                       .ndtc_last_rand         = jiffies_to_msecs(rand_delta),
+                       .ndtc_hash_rnd          = tbl->hash_rnd,
+                       .ndtc_hash_mask         = tbl->hash_mask,
+                       .ndtc_hash_chain_gc     = tbl->hash_chain_gc,
+                       .ndtc_proxy_qlen        = tbl->proxy_queue.qlen,
+               };
+
+               RTA_PUT(skb, NDTA_CONFIG, sizeof(ndc), &ndc);
+       }
+
+       {
+               int cpu;
+               struct ndt_stats ndst;
+
+               memset(&ndst, 0, sizeof(ndst));
+
+               for (cpu = 0; cpu < NR_CPUS; cpu++) {
+                       struct neigh_statistics *st;
+
+                       if (!cpu_possible(cpu))
+                               continue;
+
+                       st = per_cpu_ptr(tbl->stats, cpu);
+                       ndst.ndts_allocs                += st->allocs;
+                       ndst.ndts_destroys              += st->destroys;
+                       ndst.ndts_hash_grows            += st->hash_grows;
+                       ndst.ndts_res_failed            += st->res_failed;
+                       ndst.ndts_lookups               += st->lookups;
+                       ndst.ndts_hits                  += st->hits;
+                       ndst.ndts_rcv_probes_mcast      += st->rcv_probes_mcast;
+                       ndst.ndts_rcv_probes_ucast      += st->rcv_probes_ucast;
+                       ndst.ndts_periodic_gc_runs      += st->periodic_gc_runs;
+                       ndst.ndts_forced_gc_runs        += st->forced_gc_runs;
+               }
+
+               RTA_PUT(skb, NDTA_STATS, sizeof(ndst), &ndst);
+       }
+
+       BUG_ON(tbl->parms.dev);
+       if (neightbl_fill_parms(skb, &tbl->parms) < 0)
+               goto rtattr_failure;
+
+       read_unlock_bh(&tbl->lock);
+       return NLMSG_END(skb, nlh);
+
+rtattr_failure:
+       read_unlock_bh(&tbl->lock);
+       return NLMSG_CANCEL(skb, nlh);
+nlmsg_failure:
+       return -1;
+}
+
+static int neightbl_fill_param_info(struct neigh_table *tbl,
+                                   struct neigh_parms *parms,
+                                   struct sk_buff *skb,
+                                   struct netlink_callback *cb)
+{
+       struct ndtmsg *ndtmsg;
+       struct nlmsghdr *nlh;
+
+       nlh = NLMSG_NEW_ANSWER(skb, cb, RTM_NEWNEIGHTBL, sizeof(struct ndtmsg),
+                              NLM_F_MULTI);
+
+       ndtmsg = NLMSG_DATA(nlh);
+
+       read_lock_bh(&tbl->lock);
+       ndtmsg->ndtm_family = tbl->family;
+       RTA_PUT_STRING(skb, NDTA_NAME, tbl->id);
+
+       if (neightbl_fill_parms(skb, parms) < 0)
+               goto rtattr_failure;
+
+       read_unlock_bh(&tbl->lock);
+       return NLMSG_END(skb, nlh);
+
+rtattr_failure:
+       read_unlock_bh(&tbl->lock);
+       return NLMSG_CANCEL(skb, nlh);
+
+nlmsg_failure:
+       return -1;
+}
+static inline struct neigh_parms *lookup_neigh_params(struct neigh_table *tbl,
+                                                     int ifindex)
+{
+       struct neigh_parms *p;
+       
+       for (p = &tbl->parms; p; p = p->next)
+               if ((p->dev && p->dev->ifindex == ifindex) ||
+                   (!p->dev && !ifindex))
+                       return p;
+
+       return NULL;
+}
+
+int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
+{
+       struct neigh_table *tbl;
+       struct ndtmsg *ndtmsg = NLMSG_DATA(nlh);
+       struct rtattr **tb = arg;
+       int err = -EINVAL;
+
+       if (!tb[NDTA_NAME - 1] || !RTA_PAYLOAD(tb[NDTA_NAME - 1]))
+               return -EINVAL;
+
+       read_lock(&neigh_tbl_lock);
+       for (tbl = neigh_tables; tbl; tbl = tbl->next) {
+               if (ndtmsg->ndtm_family && tbl->family != ndtmsg->ndtm_family)
+                       continue;
+
+               if (!rtattr_strcmp(tb[NDTA_NAME - 1], tbl->id))
+                       break;
+       }
+
+       if (tbl == NULL) {
+               err = -ENOENT;
+               goto errout;
+       }
+
+       /* 
+        * We acquire tbl->lock to be nice to the periodic timers and
+        * make sure they always see a consistent set of values.
+        */
+       write_lock_bh(&tbl->lock);
+
+       if (tb[NDTA_THRESH1 - 1])
+               tbl->gc_thresh1 = RTA_GET_U32(tb[NDTA_THRESH1 - 1]);
+
+       if (tb[NDTA_THRESH2 - 1])
+               tbl->gc_thresh2 = RTA_GET_U32(tb[NDTA_THRESH2 - 1]);
+
+       if (tb[NDTA_THRESH3 - 1])
+               tbl->gc_thresh3 = RTA_GET_U32(tb[NDTA_THRESH3 - 1]);
+
+       if (tb[NDTA_GC_INTERVAL - 1])
+               tbl->gc_interval = RTA_GET_MSECS(tb[NDTA_GC_INTERVAL - 1]);
+
+       if (tb[NDTA_PARMS - 1]) {
+               struct rtattr *tbp[NDTPA_MAX];
+               struct neigh_parms *p;
+               u32 ifindex = 0;
+
+               if (rtattr_parse_nested(tbp, NDTPA_MAX, tb[NDTA_PARMS - 1]) < 0)
+                       goto rtattr_failure;
+
+               if (tbp[NDTPA_IFINDEX - 1])
+                       ifindex = RTA_GET_U32(tbp[NDTPA_IFINDEX - 1]);
+
+               p = lookup_neigh_params(tbl, ifindex);
+               if (p == NULL) {
+                       err = -ENOENT;
+                       goto rtattr_failure;
+               }
+       
+               if (tbp[NDTPA_QUEUE_LEN - 1])
+                       p->queue_len = RTA_GET_U32(tbp[NDTPA_QUEUE_LEN - 1]);
+
+               if (tbp[NDTPA_PROXY_QLEN - 1])
+                       p->proxy_qlen = RTA_GET_U32(tbp[NDTPA_PROXY_QLEN - 1]);
+
+               if (tbp[NDTPA_APP_PROBES - 1])
+                       p->app_probes = RTA_GET_U32(tbp[NDTPA_APP_PROBES - 1]);
+
+               if (tbp[NDTPA_UCAST_PROBES - 1])
+                       p->ucast_probes =
+                          RTA_GET_U32(tbp[NDTPA_UCAST_PROBES - 1]);
+
+               if (tbp[NDTPA_MCAST_PROBES - 1])
+                       p->mcast_probes =
+                          RTA_GET_U32(tbp[NDTPA_MCAST_PROBES - 1]);
+
+               if (tbp[NDTPA_BASE_REACHABLE_TIME - 1])
+                       p->base_reachable_time =
+                          RTA_GET_MSECS(tbp[NDTPA_BASE_REACHABLE_TIME - 1]);
+
+               if (tbp[NDTPA_GC_STALETIME - 1])
+                       p->gc_staletime =
+                          RTA_GET_MSECS(tbp[NDTPA_GC_STALETIME - 1]);
+
+               if (tbp[NDTPA_DELAY_PROBE_TIME - 1])
+                       p->delay_probe_time =
+                          RTA_GET_MSECS(tbp[NDTPA_DELAY_PROBE_TIME - 1]);
+
+               if (tbp[NDTPA_RETRANS_TIME - 1])
+                       p->retrans_time =
+                          RTA_GET_MSECS(tbp[NDTPA_RETRANS_TIME - 1]);
+
+               if (tbp[NDTPA_ANYCAST_DELAY - 1])
+                       p->anycast_delay =
+                          RTA_GET_MSECS(tbp[NDTPA_ANYCAST_DELAY - 1]);
+
+               if (tbp[NDTPA_PROXY_DELAY - 1])
+                       p->proxy_delay =
+                          RTA_GET_MSECS(tbp[NDTPA_PROXY_DELAY - 1]);
+
+               if (tbp[NDTPA_LOCKTIME - 1])
+                       p->locktime = RTA_GET_MSECS(tbp[NDTPA_LOCKTIME - 1]);
+       }
+
+       err = 0;
+
+rtattr_failure:
+       write_unlock_bh(&tbl->lock);
+errout:
+       read_unlock(&neigh_tbl_lock);
+       return err;
+}
+
+int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
+{
+       int idx, family;
+       int s_idx = cb->args[0];
+       struct neigh_table *tbl;
+
+       family = ((struct rtgenmsg *)NLMSG_DATA(cb->nlh))->rtgen_family;
+
+       read_lock(&neigh_tbl_lock);
+       for (tbl = neigh_tables, idx = 0; tbl; tbl = tbl->next) {
+               struct neigh_parms *p;
+
+               if (idx < s_idx || (family && tbl->family != family))
+                       continue;
+
+               if (neightbl_fill_info(tbl, skb, cb) <= 0)
+                       break;
+
+               for (++idx, p = tbl->parms.next; p; p = p->next, idx++) {
+                       if (idx < s_idx)
+                               continue;
+
+                       if (neightbl_fill_param_info(tbl, p, skb, cb) <= 0)
+                               goto out;
+               }
+
+       }
+out:
+       read_unlock(&neigh_tbl_lock);
+       cb->args[0] = idx;
+
+       return skb->len;
+}
 
 static int neigh_fill_info(struct sk_buff *skb, struct neighbour *n,
-                          u32 pid, u32 seq, int event)
+                          u32 pid, u32 seq, int event, unsigned int flags)
 {
        unsigned long now = jiffies;
        unsigned char *b = skb->tail;
        struct nda_cacheinfo ci;
        int locked = 0;
        u32 probes;
-       struct nlmsghdr *nlh = NLMSG_PUT(skb, pid, seq, event,
-                                        sizeof(struct ndmsg));
+       struct nlmsghdr *nlh = NLMSG_NEW(skb, pid, seq, event,
+                                        sizeof(struct ndmsg), flags);
        struct ndmsg *ndm = NLMSG_DATA(nlh);
 
-       nlh->nlmsg_flags = pid ? NLM_F_MULTI : 0;
        ndm->ndm_family  = n->ops->family;
        ndm->ndm_flags   = n->flags;
        ndm->ndm_type    = n->type;
@@ -1609,7 +1919,8 @@ static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
                                continue;
                        if (neigh_fill_info(skb, n, NETLINK_CB(cb->skb).pid,
                                            cb->nlh->nlmsg_seq,
-                                           RTM_NEWNEIGH) <= 0) {
+                                           RTM_NEWNEIGH,
+                                           NLM_F_MULTI) <= 0) {
                                read_unlock_bh(&tbl->lock);
                                rc = -1;
                                goto out;
@@ -2018,7 +2329,7 @@ void neigh_app_ns(struct neighbour *n)
        if (!skb)
                return;
 
-       if (neigh_fill_info(skb, n, 0, 0, RTM_GETNEIGH) < 0) {
+       if (neigh_fill_info(skb, n, 0, 0, RTM_GETNEIGH, 0) < 0) {
                kfree_skb(skb);
                return;
        }
@@ -2037,7 +2348,7 @@ static void neigh_app_notify(struct neighbour *n)
        if (!skb)
                return;
 
-       if (neigh_fill_info(skb, n, 0, 0, RTM_NEWNEIGH) < 0) {
+       if (neigh_fill_info(skb, n, 0, 0, RTM_NEWNEIGH, 0) < 0) {
                kfree_skb(skb);
                return;
        }
@@ -2352,6 +2663,8 @@ EXPORT_SYMBOL(neigh_update);
 EXPORT_SYMBOL(neigh_update_hhs);
 EXPORT_SYMBOL(pneigh_enqueue);
 EXPORT_SYMBOL(pneigh_lookup);
+EXPORT_SYMBOL(neightbl_dump_info);
+EXPORT_SYMBOL(neightbl_set);
 
 #ifdef CONFIG_ARPD
 EXPORT_SYMBOL(neigh_app_ns);
index 060f703659e83544283990912aa92c587938e41b..e2137f3e489d1adbb39cecb7abb88e8567f448e4 100644 (file)
@@ -21,6 +21,7 @@
 #define to_net_dev(class) container_of(class, struct net_device, class_dev)
 
 static const char fmt_hex[] = "%#x\n";
+static const char fmt_long_hex[] = "%#lx\n";
 static const char fmt_dec[] = "%d\n";
 static const char fmt_ulong[] = "%lu\n";
 
@@ -91,7 +92,7 @@ static CLASS_DEVICE_ATTR(field, S_IRUGO, show_##field, NULL)          \
 NETDEVICE_ATTR(addr_len, fmt_dec);
 NETDEVICE_ATTR(iflink, fmt_dec);
 NETDEVICE_ATTR(ifindex, fmt_dec);
-NETDEVICE_ATTR(features, fmt_hex);
+NETDEVICE_ATTR(features, fmt_long_hex);
 NETDEVICE_ATTR(type, fmt_dec);
 
 /* use same locking rules as GIFHWADDR ioctl's */
@@ -184,6 +185,22 @@ static ssize_t store_tx_queue_len(struct class_device *dev, const char *buf, siz
 static CLASS_DEVICE_ATTR(tx_queue_len, S_IRUGO | S_IWUSR, show_tx_queue_len, 
                         store_tx_queue_len);
 
+NETDEVICE_SHOW(weight, fmt_dec);
+
+static int change_weight(struct net_device *net, unsigned long new_weight)
+{
+       net->weight = new_weight;
+       return 0;
+}
+
+static ssize_t store_weight(struct class_device *dev, const char *buf, size_t len)
+{
+       return netdev_store(dev, buf, len, change_weight);
+}
+
+static CLASS_DEVICE_ATTR(weight, S_IRUGO | S_IWUSR, show_weight, 
+                        store_weight);
+
 
 static struct class_device_attribute *net_class_attributes[] = {
        &class_device_attr_ifindex,
@@ -193,6 +210,7 @@ static struct class_device_attribute *net_class_attributes[] = {
        &class_device_attr_features,
        &class_device_attr_mtu,
        &class_device_attr_flags,
+       &class_device_attr_weight,
        &class_device_attr_type,
        &class_device_attr_address,
        &class_device_attr_broadcast,
index 22a8f127c4aad9821e5f3294aa518807165ee8b7..076c156d5eda98345230d52b7d0f75a34cb0141b 100644 (file)
@@ -141,136 +141,6 @@ void nf_unregister_sockopt(struct nf_sockopt_ops *reg)
        up(&nf_sockopt_mutex);
 }
 
-#ifdef CONFIG_NETFILTER_DEBUG
-#include <net/ip.h>
-#include <net/tcp.h>
-#include <linux/netfilter_ipv4.h>
-
-static void debug_print_hooks_ip(unsigned int nf_debug)
-{
-       if (nf_debug & (1 << NF_IP_PRE_ROUTING)) {
-               printk("PRE_ROUTING ");
-               nf_debug ^= (1 << NF_IP_PRE_ROUTING);
-       }
-       if (nf_debug & (1 << NF_IP_LOCAL_IN)) {
-               printk("LOCAL_IN ");
-               nf_debug ^= (1 << NF_IP_LOCAL_IN);
-       }
-       if (nf_debug & (1 << NF_IP_FORWARD)) {
-               printk("FORWARD ");
-               nf_debug ^= (1 << NF_IP_FORWARD);
-       }
-       if (nf_debug & (1 << NF_IP_LOCAL_OUT)) {
-               printk("LOCAL_OUT ");
-               nf_debug ^= (1 << NF_IP_LOCAL_OUT);
-       }
-       if (nf_debug & (1 << NF_IP_POST_ROUTING)) {
-               printk("POST_ROUTING ");
-               nf_debug ^= (1 << NF_IP_POST_ROUTING);
-       }
-       if (nf_debug)
-               printk("Crap bits: 0x%04X", nf_debug);
-       printk("\n");
-}
-
-static void nf_dump_skb(int pf, struct sk_buff *skb)
-{
-       printk("skb: pf=%i %s dev=%s len=%u\n", 
-              pf,
-              skb->sk ? "(owned)" : "(unowned)",
-              skb->dev ? skb->dev->name : "(no dev)",
-              skb->len);
-       switch (pf) {
-       case PF_INET: {
-               const struct iphdr *ip = skb->nh.iph;
-               __u32 *opt = (__u32 *) (ip + 1);
-               int opti;
-               __u16 src_port = 0, dst_port = 0;
-
-               if (ip->protocol == IPPROTO_TCP
-                   || ip->protocol == IPPROTO_UDP) {
-                       struct tcphdr *tcp=(struct tcphdr *)((__u32 *)ip+ip->ihl);
-                       src_port = ntohs(tcp->source);
-                       dst_port = ntohs(tcp->dest);
-               }
-       
-               printk("PROTO=%d %u.%u.%u.%u:%hu %u.%u.%u.%u:%hu"
-                      " L=%hu S=0x%2.2hX I=%hu F=0x%4.4hX T=%hu",
-                      ip->protocol, NIPQUAD(ip->saddr),
-                      src_port, NIPQUAD(ip->daddr),
-                      dst_port,
-                      ntohs(ip->tot_len), ip->tos, ntohs(ip->id),
-                      ntohs(ip->frag_off), ip->ttl);
-
-               for (opti = 0; opti < (ip->ihl - sizeof(struct iphdr) / 4); opti++)
-                       printk(" O=0x%8.8X", *opt++);
-               printk("\n");
-       }
-       }
-}
-
-void nf_debug_ip_local_deliver(struct sk_buff *skb)
-{
-       /* If it's a loopback packet, it must have come through
-        * NF_IP_LOCAL_OUT, NF_IP_RAW_INPUT, NF_IP_PRE_ROUTING and
-        * NF_IP_LOCAL_IN.  Otherwise, must have gone through
-        * NF_IP_RAW_INPUT and NF_IP_PRE_ROUTING.  */
-       if (!skb->dev) {
-               printk("ip_local_deliver: skb->dev is NULL.\n");
-       } else {
-               if (skb->nf_debug != ((1<<NF_IP_PRE_ROUTING)
-                                     | (1<<NF_IP_LOCAL_IN))) {
-                       printk("ip_local_deliver: bad skb: ");
-                       debug_print_hooks_ip(skb->nf_debug);
-                       nf_dump_skb(PF_INET, skb);
-               }
-       }
-}
-
-void nf_debug_ip_loopback_xmit(struct sk_buff *newskb)
-{
-       if (newskb->nf_debug != ((1 << NF_IP_LOCAL_OUT)
-                                | (1 << NF_IP_POST_ROUTING))) {
-               printk("ip_dev_loopback_xmit: bad owned skb = %p: ", 
-                      newskb);
-               debug_print_hooks_ip(newskb->nf_debug);
-               nf_dump_skb(PF_INET, newskb);
-       }
-}
-
-void nf_debug_ip_finish_output2(struct sk_buff *skb)
-{
-       /* If it's owned, it must have gone through the
-        * NF_IP_LOCAL_OUT and NF_IP_POST_ROUTING.
-        * Otherwise, must have gone through
-        * NF_IP_PRE_ROUTING, NF_IP_FORWARD and NF_IP_POST_ROUTING.
-        */
-       if (skb->sk) {
-               if (skb->nf_debug != ((1 << NF_IP_LOCAL_OUT)
-                                     | (1 << NF_IP_POST_ROUTING))) {
-                       printk("ip_finish_output: bad owned skb = %p: ", skb);
-                       debug_print_hooks_ip(skb->nf_debug);
-                       nf_dump_skb(PF_INET, skb);
-               }
-       } else {
-               if (skb->nf_debug != ((1 << NF_IP_PRE_ROUTING)
-                                     | (1 << NF_IP_FORWARD)
-                                     | (1 << NF_IP_POST_ROUTING))) {
-                       /* Fragments, entunnelled packets, TCP RSTs
-                           generated by ipt_REJECT will have no
-                           owners, but still may be local */
-                       if (skb->nf_debug != ((1 << NF_IP_LOCAL_OUT)
-                                             | (1 << NF_IP_POST_ROUTING))){
-                               printk("ip_finish_output:"
-                                      " bad unowned skb = %p: ",skb);
-                               debug_print_hooks_ip(skb->nf_debug);
-                               nf_dump_skb(PF_INET, skb);
-                       }
-               }
-       }
-}
-#endif /*CONFIG_NETFILTER_DEBUG*/
-
 /* Call get/setsockopt() */
 static int nf_sockopt(struct sock *sk, int pf, int val, 
                      char __user *opt, int *len, int get)
@@ -488,14 +358,6 @@ int nf_hook_slow(int pf, unsigned int hook, struct sk_buff **pskb,
        /* We may already have this, but read-locks nest anyway */
        rcu_read_lock();
 
-#ifdef CONFIG_NETFILTER_DEBUG
-       if (unlikely((*pskb)->nf_debug & (1 << hook))) {
-               printk("nf_hook: hook %i already set.\n", hook);
-               nf_dump_skb(pf, *pskb);
-       }
-       (*pskb)->nf_debug |= (1 << hook);
-#endif
-
        elem = &nf_hooks[pf][hook];
 next_hook:
        verdict = nf_iterate(&nf_hooks[pf][hook], pskb, hook, indev,
diff --git a/net/core/request_sock.c b/net/core/request_sock.c
new file mode 100644 (file)
index 0000000..bb55675
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * NET         Generic infrastructure for Network protocols.
+ *
+ * Authors:    Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+ *
+ *             From code originally in include/net/tcp.h
+ *
+ *             This program is free software; you can redistribute it and/or
+ *             modify it under the terms of the GNU General Public License
+ *             as published by the Free Software Foundation; either version
+ *             2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/random.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+
+#include <net/request_sock.h>
+
+/*
+ * Maximum number of SYN_RECV sockets in queue per LISTEN socket.
+ * One SYN_RECV socket costs about 80bytes on a 32bit machine.
+ * It would be better to replace it with a global counter for all sockets
+ * but then some measure against one socket starving all other sockets
+ * would be needed.
+ *
+ * It was 128 by default. Experiments with real servers show, that
+ * it is absolutely not enough even at 100conn/sec. 256 cures most
+ * of problems. This value is adjusted to 128 for very small machines
+ * (<=32Mb of memory) and to 1024 on normal or better ones (>=256Mb).
+ * Further increasing requires to change hash table size.
+ */
+int sysctl_max_syn_backlog = 256;
+EXPORT_SYMBOL(sysctl_max_syn_backlog);
+
+int reqsk_queue_alloc(struct request_sock_queue *queue,
+                     const int nr_table_entries)
+{
+       const int lopt_size = sizeof(struct listen_sock) +
+                             nr_table_entries * sizeof(struct request_sock *);
+       struct listen_sock *lopt = kmalloc(lopt_size, GFP_KERNEL);
+
+       if (lopt == NULL)
+               return -ENOMEM;
+
+       memset(lopt, 0, lopt_size);
+
+       for (lopt->max_qlen_log = 6;
+            (1 << lopt->max_qlen_log) < sysctl_max_syn_backlog;
+            lopt->max_qlen_log++);
+
+       get_random_bytes(&lopt->hash_rnd, sizeof(lopt->hash_rnd));
+       rwlock_init(&queue->syn_wait_lock);
+       queue->rskq_accept_head = queue->rskq_accept_head = NULL;
+
+       write_lock_bh(&queue->syn_wait_lock);
+       queue->listen_opt = lopt;
+       write_unlock_bh(&queue->syn_wait_lock);
+
+       return 0;
+}
+
+EXPORT_SYMBOL(reqsk_queue_alloc);
index 00caf4b318b20831c8fad5226c7c3cd358b4995b..e013d836a7abc3592d5fa5db0f24aca874095f52 100644 (file)
@@ -100,6 +100,7 @@ static const int rtm_min[RTM_NR_FAMILIES] =
        [RTM_FAM(RTM_NEWPREFIX)]    = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
        [RTM_FAM(RTM_GETMULTICAST)] = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
        [RTM_FAM(RTM_GETANYCAST)]   = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
+       [RTM_FAM(RTM_NEWNEIGHTBL)]  = NLMSG_LENGTH(sizeof(struct ndtmsg)),
 };
 
 static const int rta_max[RTM_NR_FAMILIES] =
@@ -113,6 +114,7 @@ static const int rta_max[RTM_NR_FAMILIES] =
        [RTM_FAM(RTM_NEWTCLASS)]    = TCA_MAX,
        [RTM_FAM(RTM_NEWTFILTER)]   = TCA_MAX,
        [RTM_FAM(RTM_NEWACTION)]    = TCAA_MAX,
+       [RTM_FAM(RTM_NEWNEIGHTBL)]  = NDTA_MAX,
 };
 
 void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const void *data)
@@ -176,14 +178,14 @@ rtattr_failure:
 
 
 static int rtnetlink_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
-                                int type, u32 pid, u32 seq, u32 change)
+                                int type, u32 pid, u32 seq, u32 change, 
+                                unsigned int flags)
 {
        struct ifinfomsg *r;
        struct nlmsghdr  *nlh;
        unsigned char    *b = skb->tail;
 
-       nlh = NLMSG_PUT(skb, pid, seq, type, sizeof(*r));
-       if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
+       nlh = NLMSG_NEW(skb, pid, seq, type, sizeof(*r), flags);
        r = NLMSG_DATA(nlh);
        r->ifi_family = AF_UNSPEC;
        r->ifi_type = dev->type;
@@ -273,7 +275,10 @@ static int rtnetlink_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *c
        for (dev=dev_base, idx=0; dev; dev = dev->next, idx++) {
                if (idx < s_idx)
                        continue;
-               if (rtnetlink_fill_ifinfo(skb, dev, RTM_NEWLINK, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq, 0) <= 0)
+               if (rtnetlink_fill_ifinfo(skb, dev, RTM_NEWLINK,
+                                         NETLINK_CB(cb->skb).pid,
+                                         cb->nlh->nlmsg_seq, 0,
+                                         NLM_F_MULTI) <= 0)
                        break;
        }
        read_unlock(&dev_base_lock);
@@ -447,7 +452,7 @@ void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change)
        if (!skb)
                return;
 
-       if (rtnetlink_fill_ifinfo(skb, dev, type, 0, 0, change) < 0) {
+       if (rtnetlink_fill_ifinfo(skb, dev, type, current->pid, 0, change, 0) < 0) {
                kfree_skb(skb);
                return;
        }
@@ -649,14 +654,16 @@ static void rtnetlink_rcv(struct sock *sk, int len)
 
 static struct rtnetlink_link link_rtnetlink_table[RTM_NR_MSGTYPES] =
 {
-       [RTM_GETLINK  - RTM_BASE] = { .dumpit = rtnetlink_dump_ifinfo },
-       [RTM_SETLINK  - RTM_BASE] = { .doit   = do_setlink            },
-       [RTM_GETADDR  - RTM_BASE] = { .dumpit = rtnetlink_dump_all    },
-       [RTM_GETROUTE - RTM_BASE] = { .dumpit = rtnetlink_dump_all    },
-       [RTM_NEWNEIGH - RTM_BASE] = { .doit   = neigh_add             },
-       [RTM_DELNEIGH - RTM_BASE] = { .doit   = neigh_delete          },
-       [RTM_GETNEIGH - RTM_BASE] = { .dumpit = neigh_dump_info       },
-       [RTM_GETRULE  - RTM_BASE] = { .dumpit = rtnetlink_dump_all    },
+       [RTM_GETLINK     - RTM_BASE] = { .dumpit = rtnetlink_dump_ifinfo },
+       [RTM_SETLINK     - RTM_BASE] = { .doit   = do_setlink            },
+       [RTM_GETADDR     - RTM_BASE] = { .dumpit = rtnetlink_dump_all    },
+       [RTM_GETROUTE    - RTM_BASE] = { .dumpit = rtnetlink_dump_all    },
+       [RTM_NEWNEIGH    - RTM_BASE] = { .doit   = neigh_add             },
+       [RTM_DELNEIGH    - RTM_BASE] = { .doit   = neigh_delete          },
+       [RTM_GETNEIGH    - RTM_BASE] = { .dumpit = neigh_dump_info       },
+       [RTM_GETRULE     - RTM_BASE] = { .dumpit = rtnetlink_dump_all    },
+       [RTM_GETNEIGHTBL - RTM_BASE] = { .dumpit = neightbl_dump_info    },
+       [RTM_SETNEIGHTBL - RTM_BASE] = { .doit   = neightbl_set          },
 };
 
 static int rtnetlink_event(struct notifier_block *this, unsigned long event, void *ptr)
index f65b3de590a96ff2ecc7df6b7a4b9020a641e549..6d68c03bc0516291f71a3b98030d72ee8f71297f 100644 (file)
@@ -365,9 +365,6 @@ struct sk_buff *skb_clone(struct sk_buff *skb, int gfp_mask)
        C(nfct);
        nf_conntrack_get(skb->nfct);
        C(nfctinfo);
-#ifdef CONFIG_NETFILTER_DEBUG
-       C(nf_debug);
-#endif
 #ifdef CONFIG_BRIDGE_NETFILTER
        C(nf_bridge);
        nf_bridge_get(skb->nf_bridge);
@@ -432,9 +429,6 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
        new->nfct       = old->nfct;
        nf_conntrack_get(old->nfct);
        new->nfctinfo   = old->nfctinfo;
-#ifdef CONFIG_NETFILTER_DEBUG
-       new->nf_debug   = old->nf_debug;
-#endif
 #ifdef CONFIG_BRIDGE_NETFILTER
        new->nf_bridge  = old->nf_bridge;
        nf_bridge_get(old->nf_bridge);
index 96e00b08698f986f21cebd6fe26c467bb2e6e202..a6ec3ada7f9e73fd748de17aff5b9c08f73a6f97 100644 (file)
 #include <linux/netdevice.h>
 #include <net/protocol.h>
 #include <linux/skbuff.h>
+#include <net/request_sock.h>
 #include <net/sock.h>
 #include <net/xfrm.h>
 #include <linux/ipsec.h>
@@ -1363,6 +1364,7 @@ static LIST_HEAD(proto_list);
 
 int proto_register(struct proto *prot, int alloc_slab)
 {
+       char *request_sock_slab_name;
        int rc = -ENOBUFS;
 
        if (alloc_slab) {
@@ -1374,6 +1376,25 @@ int proto_register(struct proto *prot, int alloc_slab)
                               prot->name);
                        goto out;
                }
+
+               if (prot->rsk_prot != NULL) {
+                       static const char mask[] = "request_sock_%s";
+
+                       request_sock_slab_name = kmalloc(strlen(prot->name) + sizeof(mask) - 1, GFP_KERNEL);
+                       if (request_sock_slab_name == NULL)
+                               goto out_free_sock_slab;
+
+                       sprintf(request_sock_slab_name, mask, prot->name);
+                       prot->rsk_prot->slab = kmem_cache_create(request_sock_slab_name,
+                                                                prot->rsk_prot->obj_size, 0,
+                                                                SLAB_HWCACHE_ALIGN, NULL, NULL);
+
+                       if (prot->rsk_prot->slab == NULL) {
+                               printk(KERN_CRIT "%s: Can't create request sock SLAB cache!\n",
+                                      prot->name);
+                               goto out_free_request_sock_slab_name;
+                       }
+               }
        }
 
        write_lock(&proto_list_lock);
@@ -1382,6 +1403,12 @@ int proto_register(struct proto *prot, int alloc_slab)
        rc = 0;
 out:
        return rc;
+out_free_request_sock_slab_name:
+       kfree(request_sock_slab_name);
+out_free_sock_slab:
+       kmem_cache_destroy(prot->slab);
+       prot->slab = NULL;
+       goto out;
 }
 
 EXPORT_SYMBOL(proto_register);
@@ -1395,6 +1422,14 @@ void proto_unregister(struct proto *prot)
                prot->slab = NULL;
        }
 
+       if (prot->rsk_prot != NULL && prot->rsk_prot->slab != NULL) {
+               const char *name = kmem_cache_name(prot->rsk_prot->slab);
+
+               kmem_cache_destroy(prot->rsk_prot->slab);
+               kfree(name);
+               prot->rsk_prot->slab = NULL;
+       }
+
        list_del(&prot->node);
        write_unlock(&proto_list_lock);
 }
index 750cc5daeb033b74f36991a5f361aa6ee597b7a8..b2fe378dfbf8b941081addc3b89a6b4d475d8825 100644 (file)
@@ -2,7 +2,7 @@
  * This file implement the Wireless Extensions APIs.
  *
  * Authors :   Jean Tourrilhes - HPL - <jt@hpl.hp.com>
- * Copyright (c) 1997-2004 Jean Tourrilhes, All Rights Reserved.
+ * Copyright (c) 1997-2005 Jean Tourrilhes, All Rights Reserved.
  *
  * (As all part of the Linux kernel, this file is GPL)
  */
@@ -187,6 +187,12 @@ static const struct iw_ioctl_description standard_ioctl[] = {
                .header_type    = IW_HEADER_TYPE_ADDR,
                .flags          = IW_DESCR_FLAG_DUMP,
        },
+       [SIOCSIWMLME    - SIOCIWFIRST] = {
+               .header_type    = IW_HEADER_TYPE_POINT,
+               .token_size     = 1,
+               .min_tokens     = sizeof(struct iw_mlme),
+               .max_tokens     = sizeof(struct iw_mlme),
+       },
        [SIOCGIWAPLIST  - SIOCIWFIRST] = {
                .header_type    = IW_HEADER_TYPE_POINT,
                .token_size     = sizeof(struct sockaddr) +
@@ -195,7 +201,10 @@ static const struct iw_ioctl_description standard_ioctl[] = {
                .flags          = IW_DESCR_FLAG_NOMAX,
        },
        [SIOCSIWSCAN    - SIOCIWFIRST] = {
-               .header_type    = IW_HEADER_TYPE_PARAM,
+               .header_type    = IW_HEADER_TYPE_POINT,
+               .token_size     = 1,
+               .min_tokens     = 0,
+               .max_tokens     = sizeof(struct iw_scan_req),
        },
        [SIOCGIWSCAN    - SIOCIWFIRST] = {
                .header_type    = IW_HEADER_TYPE_POINT,
@@ -273,6 +282,42 @@ static const struct iw_ioctl_description standard_ioctl[] = {
        [SIOCGIWPOWER   - SIOCIWFIRST] = {
                .header_type    = IW_HEADER_TYPE_PARAM,
        },
+       [SIOCSIWGENIE   - SIOCIWFIRST] = {
+               .header_type    = IW_HEADER_TYPE_POINT,
+               .token_size     = 1,
+               .max_tokens     = IW_GENERIC_IE_MAX,
+       },
+       [SIOCGIWGENIE   - SIOCIWFIRST] = {
+               .header_type    = IW_HEADER_TYPE_POINT,
+               .token_size     = 1,
+               .max_tokens     = IW_GENERIC_IE_MAX,
+       },
+       [SIOCSIWAUTH    - SIOCIWFIRST] = {
+               .header_type    = IW_HEADER_TYPE_PARAM,
+       },
+       [SIOCGIWAUTH    - SIOCIWFIRST] = {
+               .header_type    = IW_HEADER_TYPE_PARAM,
+       },
+       [SIOCSIWENCODEEXT - SIOCIWFIRST] = {
+               .header_type    = IW_HEADER_TYPE_POINT,
+               .token_size     = 1,
+               .min_tokens     = sizeof(struct iw_encode_ext),
+               .max_tokens     = sizeof(struct iw_encode_ext) +
+                                 IW_ENCODING_TOKEN_MAX,
+       },
+       [SIOCGIWENCODEEXT - SIOCIWFIRST] = {
+               .header_type    = IW_HEADER_TYPE_POINT,
+               .token_size     = 1,
+               .min_tokens     = sizeof(struct iw_encode_ext),
+               .max_tokens     = sizeof(struct iw_encode_ext) +
+                                 IW_ENCODING_TOKEN_MAX,
+       },
+       [SIOCSIWPMKSA - SIOCIWFIRST] = {
+               .header_type    = IW_HEADER_TYPE_POINT,
+               .token_size     = 1,
+               .min_tokens     = sizeof(struct iw_pmksa),
+               .max_tokens     = sizeof(struct iw_pmksa),
+       },
 };
 static const int standard_ioctl_num = (sizeof(standard_ioctl) /
                                       sizeof(struct iw_ioctl_description));
@@ -299,6 +344,31 @@ static const struct iw_ioctl_description standard_event[] = {
        [IWEVEXPIRED    - IWEVFIRST] = {
                .header_type    = IW_HEADER_TYPE_ADDR, 
        },
+       [IWEVGENIE      - IWEVFIRST] = {
+               .header_type    = IW_HEADER_TYPE_POINT,
+               .token_size     = 1,
+               .max_tokens     = IW_GENERIC_IE_MAX,
+       },
+       [IWEVMICHAELMICFAILURE  - IWEVFIRST] = {
+               .header_type    = IW_HEADER_TYPE_POINT, 
+               .token_size     = 1,
+               .max_tokens     = sizeof(struct iw_michaelmicfailure),
+       },
+       [IWEVASSOCREQIE - IWEVFIRST] = {
+               .header_type    = IW_HEADER_TYPE_POINT,
+               .token_size     = 1,
+               .max_tokens     = IW_GENERIC_IE_MAX,
+       },
+       [IWEVASSOCRESPIE        - IWEVFIRST] = {
+               .header_type    = IW_HEADER_TYPE_POINT,
+               .token_size     = 1,
+               .max_tokens     = IW_GENERIC_IE_MAX,
+       },
+       [IWEVPMKIDCAND  - IWEVFIRST] = {
+               .header_type    = IW_HEADER_TYPE_POINT,
+               .token_size     = 1,
+               .max_tokens     = sizeof(struct iw_pmkid_cand),
+       },
 };
 static const int standard_event_num = (sizeof(standard_event) /
                                       sizeof(struct iw_ioctl_description));
index ee7bf46eb78ab60f7f8b7646b4fa1ab6b44ab98e..00233ecbc9cba98022396af66bafaf1b09fb21b4 100644 (file)
@@ -716,13 +716,13 @@ static int dn_dev_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *a
 }
 
 static int dn_dev_fill_ifaddr(struct sk_buff *skb, struct dn_ifaddr *ifa,
-                               u32 pid, u32 seq, int event)
+                               u32 pid, u32 seq, int event, unsigned int flags)
 {
        struct ifaddrmsg *ifm;
        struct nlmsghdr *nlh;
        unsigned char *b = skb->tail;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm));
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags);
        ifm = NLMSG_DATA(nlh);
 
        ifm->ifa_family = AF_DECnet;
@@ -755,7 +755,7 @@ static void rtmsg_ifa(int event, struct dn_ifaddr *ifa)
                netlink_set_err(rtnl, 0, RTMGRP_DECnet_IFADDR, ENOBUFS);
                return;
        }
-       if (dn_dev_fill_ifaddr(skb, ifa, 0, 0, event) < 0) {
+       if (dn_dev_fill_ifaddr(skb, ifa, 0, 0, event, 0) < 0) {
                kfree_skb(skb);
                netlink_set_err(rtnl, 0, RTMGRP_DECnet_IFADDR, EINVAL);
                return;
@@ -790,7 +790,8 @@ static int dn_dev_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
                        if (dn_dev_fill_ifaddr(skb, ifa,
                                               NETLINK_CB(cb->skb).pid,
                                               cb->nlh->nlmsg_seq,
-                                              RTM_NEWADDR) <= 0)
+                                              RTM_NEWADDR,
+                                              NLM_F_MULTI) <= 0)
                                goto done;
                }
        }
index f6dfe96f45b79b48c903ca3bbdf15303415bbd83..f32dba9e26fe45942fc1334e08410abbc2722b46 100644 (file)
@@ -101,7 +101,6 @@ struct neigh_table dn_neigh_table = {
        .id =                           "dn_neigh_cache",
        .parms ={
                .tbl =                  &dn_neigh_table,
-               .entries =              0,
                .base_reachable_time =  30 * HZ,
                .retrans_time = 1 * HZ,
                .gc_staletime = 60 * HZ,
index 1e7b5c3ea2154d94251d04ea0de69fda06f9f58e..2399fa8a3f86e8db94dc753acd5c7240bf1f500f 100644 (file)
@@ -1465,7 +1465,8 @@ int dn_route_input(struct sk_buff *skb)
        return dn_route_input_slow(skb);
 }
 
-static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, int event, int nowait)
+static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq,
+                          int event, int nowait, unsigned int flags)
 {
        struct dn_route *rt = (struct dn_route *)skb->dst;
        struct rtmsg *r;
@@ -1473,9 +1474,8 @@ static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, int event, int
        unsigned char *b = skb->tail;
        struct rta_cacheinfo ci;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*r));
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*r), flags);
        r = NLMSG_DATA(nlh);
-       nlh->nlmsg_flags = (nowait && pid) ? NLM_F_MULTI : 0;
        r->rtm_family = AF_DECnet;
        r->rtm_dst_len = 16;
        r->rtm_src_len = 0;
@@ -1596,7 +1596,7 @@ int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void *arg)
 
        NETLINK_CB(skb).dst_pid = NETLINK_CB(in_skb).pid;
 
-       err = dn_rt_fill_info(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, RTM_NEWROUTE, 0);
+       err = dn_rt_fill_info(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, RTM_NEWROUTE, 0, 0);
 
        if (err == 0)
                goto out_free;
@@ -1644,7 +1644,8 @@ int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb)
                                continue;
                        skb->dst = dst_clone(&rt->u.dst);
                        if (dn_rt_fill_info(skb, NETLINK_CB(cb->skb).pid,
-                                       cb->nlh->nlmsg_seq, RTM_NEWROUTE, 1) <= 0) {
+                                       cb->nlh->nlmsg_seq, RTM_NEWROUTE, 
+                                       1, NLM_F_MULTI) <= 0) {
                                dst_release(xchg(&skb->dst, NULL));
                                rcu_read_unlock_bh();
                                goto done;
index 597587d170d8ce851349b0a5868522aedffcedbf..1060de70bc0cdea5fec0eb7a6afe317138aa57d7 100644 (file)
@@ -342,14 +342,15 @@ static struct notifier_block dn_fib_rules_notifier = {
        .notifier_call =        dn_fib_rules_event,
 };
 
-static int dn_fib_fill_rule(struct sk_buff *skb, struct dn_fib_rule *r, struct netlink_callback *cb)
+static int dn_fib_fill_rule(struct sk_buff *skb, struct dn_fib_rule *r,
+                           struct netlink_callback *cb, unsigned int flags)
 {
        struct rtmsg *rtm;
        struct nlmsghdr *nlh;
        unsigned char *b = skb->tail;
 
 
-       nlh = NLMSG_PUT(skb, NETLINK_CREDS(cb->skb)->pid, cb->nlh->nlmsg_seq, RTM_NEWRULE, sizeof(*rtm));
+       nlh = NLMSG_NEW_ANSWER(skb, cb, RTM_NEWRULE, sizeof(*rtm), flags);
        rtm = NLMSG_DATA(nlh);
        rtm->rtm_family = AF_DECnet;
        rtm->rtm_dst_len = r->r_dst_len;
@@ -394,7 +395,7 @@ int dn_fib_dump_rules(struct sk_buff *skb, struct netlink_callback *cb)
        for(r = dn_fib_rules, idx = 0; r; r = r->r_next, idx++) {
                if (idx < s_idx)
                        continue;
-               if (dn_fib_fill_rule(skb, r, cb) < 0)
+               if (dn_fib_fill_rule(skb, r, cb, NLM_F_MULTI) < 0)
                        break;
        }
        read_unlock(&dn_fib_rules_lock);
index dad5603912be3ed4959fb4d5565c9df4d5830f25..28ba5777a25ac58ff21e4c7ba9ecae08c96c251f 100644 (file)
@@ -270,13 +270,13 @@ static int dn_fib_nh_match(struct rtmsg *r, struct nlmsghdr *nlh, struct dn_kern
 
 static int dn_fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
                         u8 tb_id, u8 type, u8 scope, void *dst, int dst_len,
-                        struct dn_fib_info *fi)
+                        struct dn_fib_info *fi, unsigned int flags)
 {
         struct rtmsg *rtm;
         struct nlmsghdr *nlh;
         unsigned char *b = skb->tail;
 
-        nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*rtm));
+        nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*rtm), flags);
         rtm = NLMSG_DATA(nlh);
         rtm->rtm_family = AF_DECnet;
         rtm->rtm_dst_len = dst_len;
@@ -345,7 +345,7 @@ static void dn_rtmsg_fib(int event, struct dn_fib_node *f, int z, int tb_id,
 
         if (dn_fib_dump_info(skb, pid, nlh->nlmsg_seq, event, tb_id, 
                                 f->fn_type, f->fn_scope, &f->fn_key, z, 
-                                DN_FIB_INFO(f)) < 0) {
+                                DN_FIB_INFO(f), 0) < 0) {
                 kfree_skb(skb);
                 return;
         }
@@ -377,7 +377,7 @@ static __inline__ int dn_hash_dump_bucket(struct sk_buff *skb,
                                tb->n, 
                                (f->fn_state & DN_S_ZOMBIE) ? 0 : f->fn_type,
                                f->fn_scope, &f->fn_key, dz->dz_order, 
-                               f->fn_info) < 0) {
+                               f->fn_info, NLM_F_MULTI) < 0) {
                        cb->args[3] = i;
                        return -1;
                }
index 6d3e8b1bd1f2069e71d3d5a8cda2e617d97925c4..05107e0dc1450ec8f45d28f1320620c06cde17ca 100644 (file)
@@ -1,6 +1,32 @@
 #
 # IP configuration
 #
+choice 
+       prompt "Choose IP: FIB lookup""
+       depends on INET
+       default IP_FIB_HASH
+
+config IP_FIB_HASH
+       bool "FIB_HASH"
+       ---help---
+       Current FIB is very proven and good enough for most users.
+
+config IP_FIB_TRIE
+       bool "FIB_TRIE"
+       ---help---
+       Use new experimental LC-trie as FIB lookup algoritm. 
+        This improves lookup performance
+       
+       LC-trie is described in:
+       
+       IP-address lookup using LC-tries. Stefan Nilsson and Gunnar Karlsson
+       IEEE Journal on Selected Areas in Communications, 17(6):1083-1092, June 1999
+       An experimental study of compression methods for dynamic tries
+       Stefan Nilsson and Matti Tikkanen. Algorithmica, 33(1):19-33, 2002.
+       http://www.nada.kth.se/~snilsson/public/papers/dyntrie2/
+       
+endchoice
+
 config IP_MULTICAST
        bool "IP: multicasting"
        depends on INET
index 8b379627ebb66d63fcdc9befbb70b301d252c202..65d57d8e1add2de4c53595b7f4d02b9644e69a82 100644 (file)
@@ -7,8 +7,10 @@ obj-y     := utils.o route.o inetpeer.o protocol.o \
             ip_output.o ip_sockglue.o \
             tcp.o tcp_input.o tcp_output.o tcp_timer.o tcp_ipv4.o tcp_minisocks.o \
             datagram.o raw.o udp.o arp.o icmp.o devinet.o af_inet.o igmp.o \
-            sysctl_net_ipv4.o fib_frontend.o fib_semantics.o fib_hash.o
+            sysctl_net_ipv4.o fib_frontend.o fib_semantics.o
 
+obj-$(CONFIG_IP_FIB_HASH) += fib_hash.o
+obj-$(CONFIG_IP_FIB_TRIE) += fib_trie.o
 obj-$(CONFIG_PROC_FS) += proc.o
 obj-$(CONFIG_IP_MULTIPLE_TABLES) += fib_rules.o
 obj-$(CONFIG_IP_MROUTE) += ipmr.o
index b3cb49ce5fad433acafce912f9efeb5e81d7d3a2..658e7977924dad3eb6cd2830d8158d2109e2c261 100644 (file)
@@ -1119,6 +1119,10 @@ module_init(inet_init);
 #ifdef CONFIG_PROC_FS
 extern int  fib_proc_init(void);
 extern void fib_proc_exit(void);
+#ifdef CONFIG_IP_FIB_TRIE
+extern int  fib_stat_proc_init(void);
+extern void fib_stat_proc_exit(void);
+#endif
 extern int  ip_misc_proc_init(void);
 extern int  raw_proc_init(void);
 extern void raw_proc_exit(void);
@@ -1139,11 +1143,19 @@ static int __init ipv4_proc_init(void)
                goto out_udp;
        if (fib_proc_init())
                goto out_fib;
+#ifdef CONFIG_IP_FIB_TRIE
+         if (fib_stat_proc_init())
+                 goto out_fib_stat;
+ #endif
        if (ip_misc_proc_init())
                goto out_misc;
 out:
        return rc;
 out_misc:
+#ifdef CONFIG_IP_FIB_TRIE
+       fib_stat_proc_exit();
+out_fib_stat:
+#endif
        fib_proc_exit();
 out_fib:
        udp4_proc_exit();
@@ -1181,6 +1193,7 @@ EXPORT_SYMBOL(inet_stream_connect);
 EXPORT_SYMBOL(inet_stream_ops);
 EXPORT_SYMBOL(inet_unregister_protosw);
 EXPORT_SYMBOL(net_statistics);
+EXPORT_SYMBOL(sysctl_ip_nonlocal_bind);
 
 #ifdef INET_REFCNT_DEBUG
 EXPORT_SYMBOL(inet_sock_nr);
index 0e98f2235b6e1edc5f35504e23e76ab5bad27aed..514c85b2631a3332187141c2afdd7ed7825314cb 100644 (file)
@@ -200,7 +200,7 @@ static void ah4_err(struct sk_buff *skb, u32 info)
        xfrm_state_put(x);
 }
 
-static int ah_init_state(struct xfrm_state *x, void *args)
+static int ah_init_state(struct xfrm_state *x)
 {
        struct ah_data *ahp = NULL;
        struct xfrm_algo_desc *aalg_desc;
index 3cc96730c4ed285d4a1f65e69ca659290b26abe0..650dcb12d9a15318ef49c889fffc7a0867b0fb5e 100644 (file)
@@ -233,11 +233,14 @@ int inet_addr_onlink(struct in_device *in_dev, u32 a, u32 b)
 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
                         int destroy)
 {
+       struct in_ifaddr *promote = NULL;
        struct in_ifaddr *ifa1 = *ifap;
 
        ASSERT_RTNL();
 
-       /* 1. Deleting primary ifaddr forces deletion all secondaries */
+       /* 1. Deleting primary ifaddr forces deletion all secondaries 
+        * unless alias promotion is set
+        **/
 
        if (!(ifa1->ifa_flags & IFA_F_SECONDARY)) {
                struct in_ifaddr *ifa;
@@ -251,11 +254,16 @@ static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
                                continue;
                        }
 
-                       *ifap1 = ifa->ifa_next;
+                       if (!IN_DEV_PROMOTE_SECONDARIES(in_dev)) {
+                               *ifap1 = ifa->ifa_next;
 
-                       rtmsg_ifa(RTM_DELADDR, ifa);
-                       notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa);
-                       inet_free_ifa(ifa);
+                               rtmsg_ifa(RTM_DELADDR, ifa);
+                               notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa);
+                               inet_free_ifa(ifa);
+                       } else {
+                               promote = ifa;
+                               break;
+                       }
                }
        }
 
@@ -281,6 +289,13 @@ static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
                if (!in_dev->ifa_list)
                        inetdev_destroy(in_dev);
        }
+
+       if (promote && IN_DEV_PROMOTE_SECONDARIES(in_dev)) {
+               /* not sure if we should send a delete notify first? */
+               promote->ifa_flags &= ~IFA_F_SECONDARY;
+               rtmsg_ifa(RTM_NEWADDR, promote);
+               notifier_call_chain(&inetaddr_chain, NETDEV_UP, promote);
+       }
 }
 
 static int inet_insert_ifa(struct in_ifaddr *ifa)
@@ -1015,14 +1030,13 @@ static struct notifier_block ip_netdev_notifier = {
 };
 
 static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
-                           u32 pid, u32 seq, int event)
+                           u32 pid, u32 seq, int event, unsigned int flags)
 {
        struct ifaddrmsg *ifm;
        struct nlmsghdr  *nlh;
        unsigned char    *b = skb->tail;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm));
-       if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags);
        ifm = NLMSG_DATA(nlh);
        ifm->ifa_family = AF_INET;
        ifm->ifa_prefixlen = ifa->ifa_prefixlen;
@@ -1075,7 +1089,7 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
                                continue;
                        if (inet_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).pid,
                                             cb->nlh->nlmsg_seq,
-                                            RTM_NEWADDR) <= 0) {
+                                            RTM_NEWADDR, NLM_F_MULTI) <= 0) {
                                rcu_read_unlock();
                                goto done;
                        }
@@ -1098,7 +1112,7 @@ static void rtmsg_ifa(int event, struct in_ifaddr* ifa)
 
        if (!skb)
                netlink_set_err(rtnl, 0, RTMGRP_IPV4_IFADDR, ENOBUFS);
-       else if (inet_fill_ifaddr(skb, ifa, 0, 0, event) < 0) {
+       else if (inet_fill_ifaddr(skb, ifa, current->pid, 0, event, 0) < 0) {
                kfree_skb(skb);
                netlink_set_err(rtnl, 0, RTMGRP_IPV4_IFADDR, EINVAL);
        } else {
@@ -1384,6 +1398,15 @@ static struct devinet_sysctl_table {
                        .proc_handler   = &ipv4_doint_and_flush,
                        .strategy       = &ipv4_doint_and_flush_strategy,
                },
+               {
+                       .ctl_name       = NET_IPV4_CONF_PROMOTE_SECONDARIES,
+                       .procname       = "promote_secondaries",
+                       .data           = &ipv4_devconf.promote_secondaries,
+                       .maxlen         = sizeof(int),
+                       .mode           = 0644,
+                       .proc_handler   = &ipv4_doint_and_flush,
+                       .strategy       = &ipv4_doint_and_flush_strategy,
+               },
        },
        .devinet_dev = {
                {
index 053a883247ba68ad4f68eb88971a33a881196840..ba57446d5d1f4a1831f926859dca12c40369067e 100644 (file)
@@ -362,7 +362,7 @@ static void esp_destroy(struct xfrm_state *x)
        kfree(esp);
 }
 
-static int esp_init_state(struct xfrm_state *x, void *args)
+static int esp_init_state(struct xfrm_state *x)
 {
        struct esp_data *esp = NULL;
 
@@ -478,7 +478,7 @@ static int __init esp4_init(void)
 {
        struct xfrm_decap_state decap;
 
-       if (sizeof(struct esp_decap_data)  <
+       if (sizeof(struct esp_decap_data)  >
            sizeof(decap.decap_data)) {
                extern void decap_data_too_small(void);
 
index 563e7d61270612b64a5f67684c5eea1662b66a31..cd8e45ab95807116a18fe1649422766ef636da3c 100644 (file)
@@ -516,6 +516,60 @@ static void fib_del_ifaddr(struct in_ifaddr *ifa)
 #undef BRD1_OK
 }
 
+static void nl_fib_lookup(struct fib_result_nl *frn, struct fib_table *tb )
+{
+       
+       struct fib_result       res;
+       struct flowi            fl = { .nl_u = { .ip4_u = { .daddr = frn->fl_addr, 
+                                                           .fwmark = frn->fl_fwmark,
+                                                           .tos = frn->fl_tos,
+                                                           .scope = frn->fl_scope } } };
+       if (tb) {
+               local_bh_disable();
+
+               frn->tb_id = tb->tb_id;
+               frn->err = tb->tb_lookup(tb, &fl, &res);
+
+               if (!frn->err) {
+                       frn->prefixlen = res.prefixlen;
+                       frn->nh_sel = res.nh_sel;
+                       frn->type = res.type;
+                       frn->scope = res.scope;
+               }
+               local_bh_enable();
+       }
+}
+
+static void nl_fib_input(struct sock *sk, int len)
+{
+       struct sk_buff *skb = NULL;
+        struct nlmsghdr *nlh = NULL;
+       struct fib_result_nl *frn;
+       int err;
+       u32 pid;     
+       struct fib_table *tb;
+       
+       skb = skb_recv_datagram(sk, 0, 0, &err);
+       nlh = (struct nlmsghdr *)skb->data;
+       
+       frn = (struct fib_result_nl *) NLMSG_DATA(nlh);
+       tb = fib_get_table(frn->tb_id_in);
+
+       nl_fib_lookup(frn, tb);
+       
+       pid = nlh->nlmsg_pid;           /*pid of sending process */
+       NETLINK_CB(skb).groups = 0;     /* not in mcast group */
+       NETLINK_CB(skb).pid = 0;         /* from kernel */
+       NETLINK_CB(skb).dst_pid = pid;
+       NETLINK_CB(skb).dst_groups = 0;  /* unicast */
+       netlink_unicast(sk, skb, pid, MSG_DONTWAIT);
+}    
+
+static void nl_fib_lookup_init(void)
+{
+      netlink_kernel_create(NETLINK_FIB_LOOKUP, nl_fib_input);
+}
+
 static void fib_disable_ip(struct net_device *dev, int force)
 {
        if (fib_sync_down(0, dev, force))
@@ -604,6 +658,7 @@ void __init ip_fib_init(void)
 
        register_netdevice_notifier(&fib_netdev_notifier);
        register_inetaddr_notifier(&fib_inetaddr_notifier);
+       nl_fib_lookup_init();
 }
 
 EXPORT_SYMBOL(inet_addr_type);
index 6506dcc01b460e7c5af35ff756f4819c23bd5d30..b10d6bb5ef3d67f5bc125243fda1a391f57460d2 100644 (file)
@@ -703,7 +703,8 @@ fn_hash_dump_bucket(struct sk_buff *skb, struct netlink_callback *cb,
                                          &f->fn_key,
                                          fz->fz_order,
                                          fa->fa_tos,
-                                         fa->fa_info) < 0) {
+                                         fa->fa_info,
+                                         NLM_F_MULTI) < 0) {
                                cb->args[3] = i;
                                return -1;
                        }
index ac4485f75e97500ea25219b901675a67ea8aab0c..b729d97cfa9344655e1842530aeb55b5609f308e 100644 (file)
@@ -30,7 +30,8 @@ extern int fib_nh_match(struct rtmsg *r, struct nlmsghdr *,
                        struct kern_rta *rta, struct fib_info *fi);
 extern int fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
                         u8 tb_id, u8 type, u8 scope, void *dst,
-                        int dst_len, u8 tos, struct fib_info *fi);
+                        int dst_len, u8 tos, struct fib_info *fi,
+                        unsigned int);
 extern void rtmsg_fib(int event, u32 key, struct fib_alias *fa,
                      int z, int tb_id,
                      struct nlmsghdr *n, struct netlink_skb_parms *req);
index 39d0aadb9a2a451c93f6b8f34fbf3c84e8e09542..0b298bbc1518139d4dec18e6a8ebed9eb99a020e 100644 (file)
@@ -367,13 +367,14 @@ static struct notifier_block fib_rules_notifier = {
 
 static __inline__ int inet_fill_rule(struct sk_buff *skb,
                                     struct fib_rule *r,
-                                    struct netlink_callback *cb)
+                                    struct netlink_callback *cb,
+                                    unsigned int flags)
 {
        struct rtmsg *rtm;
        struct nlmsghdr  *nlh;
        unsigned char    *b = skb->tail;
 
-       nlh = NLMSG_PUT(skb, NETLINK_CREDS(cb->skb)->pid, cb->nlh->nlmsg_seq, RTM_NEWRULE, sizeof(*rtm));
+       nlh = NLMSG_NEW_ANSWER(skb, cb, RTM_NEWRULE, sizeof(*rtm), flags);
        rtm = NLMSG_DATA(nlh);
        rtm->rtm_family = AF_INET;
        rtm->rtm_dst_len = r->r_dst_len;
@@ -422,7 +423,7 @@ int inet_dump_rules(struct sk_buff *skb, struct netlink_callback *cb)
        for (r=fib_rules, idx=0; r; r = r->r_next, idx++) {
                if (idx < s_idx)
                        continue;
-               if (inet_fill_rule(skb, r, cb) < 0)
+               if (inet_fill_rule(skb, r, cb, NLM_F_MULTI) < 0)
                        break;
        }
        read_unlock(&fib_rules_lock);
index 029362d66135124a3327046440b6c94892c4d1ae..c886b28ba9f500d7fc80019f6a66fbd72077b8a5 100644 (file)
@@ -276,7 +276,7 @@ void rtmsg_fib(int event, u32 key, struct fib_alias *fa,
               struct nlmsghdr *n, struct netlink_skb_parms *req)
 {
        struct sk_buff *skb;
-       u32 pid = req ? req->pid : 0;
+       u32 pid = req ? req->pid : n->nlmsg_pid;
        int size = NLMSG_SPACE(sizeof(struct rtmsg)+256);
 
        skb = alloc_skb(size, GFP_KERNEL);
@@ -286,7 +286,7 @@ void rtmsg_fib(int event, u32 key, struct fib_alias *fa,
        if (fib_dump_info(skb, pid, n->nlmsg_seq, event, tb_id,
                          fa->fa_type, fa->fa_scope, &key, z,
                          fa->fa_tos,
-                         fa->fa_info) < 0) {
+                         fa->fa_info, 0) < 0) {
                kfree_skb(skb);
                return;
        }
@@ -932,13 +932,13 @@ u32 __fib_res_prefsrc(struct fib_result *res)
 int
 fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
              u8 tb_id, u8 type, u8 scope, void *dst, int dst_len, u8 tos,
-             struct fib_info *fi)
+             struct fib_info *fi, unsigned int flags)
 {
        struct rtmsg *rtm;
        struct nlmsghdr  *nlh;
        unsigned char    *b = skb->tail;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*rtm));
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*rtm), flags);
        rtm = NLMSG_DATA(nlh);
        rtm->rtm_family = AF_INET;
        rtm->rtm_dst_len = dst_len;
@@ -1035,7 +1035,7 @@ fib_convert_rtentry(int cmd, struct nlmsghdr *nl, struct rtmsg *rtm,
        }
 
        nl->nlmsg_flags = NLM_F_REQUEST;
-       nl->nlmsg_pid = 0;
+       nl->nlmsg_pid = current->pid;
        nl->nlmsg_seq = 0;
        nl->nlmsg_len = NLMSG_LENGTH(sizeof(*rtm));
        if (cmd == SIOCDELRT) {
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
new file mode 100644 (file)
index 0000000..0671569
--- /dev/null
@@ -0,0 +1,2454 @@
+/*
+ *   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.
+ *
+ *   Robert Olsson <robert.olsson@its.uu.se> Uppsala Universitet
+ *     & Swedish University of Agricultural Sciences.
+ *
+ *   Jens Laas <jens.laas@data.slu.se> Swedish University of 
+ *     Agricultural Sciences.
+ * 
+ *   Hans Liss <hans.liss@its.uu.se>  Uppsala Universitet
+ *
+ * This work is based on the LPC-trie which is originally descibed in:
+ * 
+ * An experimental study of compression methods for dynamic tries
+ * Stefan Nilsson and Matti Tikkanen. Algorithmica, 33(1):19-33, 2002.
+ * http://www.nada.kth.se/~snilsson/public/papers/dyntrie2/
+ *
+ *
+ * IP-address lookup using LC-tries. Stefan Nilsson and Gunnar Karlsson
+ * IEEE Journal on Selected Areas in Communications, 17(6):1083-1092, June 1999
+ *
+ * Version:    $Id: fib_trie.c,v 1.3 2005/06/08 14:20:01 robert Exp $
+ *
+ *
+ * Code from fib_hash has been reused which includes the following header:
+ *
+ *
+ * INET                An implementation of the TCP/IP protocol suite for the LINUX
+ *             operating system.  INET is implemented using the  BSD Socket
+ *             interface as the means of communication with the user level.
+ *
+ *             IPv4 FIB: lookup engine and maintenance routines.
+ *
+ *
+ * Authors:    Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
+ *
+ *             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.
+ */
+
+#define VERSION "0.323"
+
+#include <linux/config.h>
+#include <asm/uaccess.h>
+#include <asm/system.h>
+#include <asm/bitops.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+#include <linux/socket.h>
+#include <linux/sockios.h>
+#include <linux/errno.h>
+#include <linux/in.h>
+#include <linux/inet.h>
+#include <linux/netdevice.h>
+#include <linux/if_arp.h>
+#include <linux/proc_fs.h>
+#include <linux/skbuff.h>
+#include <linux/netlink.h>
+#include <linux/init.h>
+#include <linux/list.h>
+#include <net/ip.h>
+#include <net/protocol.h>
+#include <net/route.h>
+#include <net/tcp.h>
+#include <net/sock.h>
+#include <net/ip_fib.h>
+#include "fib_lookup.h"
+
+#undef CONFIG_IP_FIB_TRIE_STATS
+#define MAX_CHILDS 16384
+
+#define EXTRACT(p, n, str) ((str)<<(p)>>(32-(n)))
+#define KEYLENGTH (8*sizeof(t_key))
+#define MASK_PFX(k, l) (((l)==0)?0:(k >> (KEYLENGTH-l)) << (KEYLENGTH-l))
+#define TKEY_GET_MASK(offset, bits) (((bits)==0)?0:((t_key)(-1) << (KEYLENGTH - bits) >> offset))
+
+static DEFINE_RWLOCK(fib_lock);
+
+typedef unsigned int t_key;
+
+#define T_TNODE 0
+#define T_LEAF  1
+#define NODE_TYPE_MASK 0x1UL
+#define NODE_PARENT(_node) \
+((struct tnode *)((_node)->_parent & ~NODE_TYPE_MASK))
+#define NODE_SET_PARENT(_node, _ptr) \
+((_node)->_parent = (((unsigned long)(_ptr)) | \
+                     ((_node)->_parent & NODE_TYPE_MASK)))
+#define NODE_INIT_PARENT(_node, _type) \
+((_node)->_parent = (_type))
+#define NODE_TYPE(_node) \
+((_node)->_parent & NODE_TYPE_MASK)
+
+#define IS_TNODE(n) (!(n->_parent & T_LEAF))
+#define IS_LEAF(n) (n->_parent & T_LEAF)
+
+struct node {
+        t_key key;
+       unsigned long _parent;
+};
+
+struct leaf {
+        t_key key;
+       unsigned long _parent;
+       struct hlist_head list;
+};
+
+struct leaf_info {
+       struct hlist_node hlist;
+       int plen;
+       struct list_head falh;
+};
+
+struct tnode {
+        t_key key;
+       unsigned long _parent;
+        unsigned short pos:5;        /* 2log(KEYLENGTH) bits needed */
+        unsigned short bits:5;       /* 2log(KEYLENGTH) bits needed */
+        unsigned short full_children;  /* KEYLENGTH bits needed */
+        unsigned short empty_children; /* KEYLENGTH bits needed */
+        struct node *child[0];
+};
+
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+struct trie_use_stats {
+       unsigned int gets;
+       unsigned int backtrack;
+       unsigned int semantic_match_passed;
+       unsigned int semantic_match_miss;
+       unsigned int null_node_hit;
+};
+#endif
+
+struct trie_stat {
+       unsigned int totdepth;
+       unsigned int maxdepth;
+       unsigned int tnodes;
+       unsigned int leaves;
+       unsigned int nullpointers;
+       unsigned int nodesizes[MAX_CHILDS];
+};    
+
+struct trie {
+        struct node *trie;
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+       struct trie_use_stats stats;
+#endif
+        int size;
+       unsigned int revision;
+};
+
+static int trie_debug = 0;
+
+static int tnode_full(struct tnode *tn, struct node *n);
+static void put_child(struct trie *t, struct tnode *tn, int i, struct node *n);
+static void tnode_put_child_reorg(struct tnode *tn, int i, struct node *n, int wasfull);
+static int tnode_child_length(struct tnode *tn);
+static struct node *resize(struct trie *t, struct tnode *tn);
+static struct tnode *inflate(struct trie *t, struct tnode *tn);
+static struct tnode *halve(struct trie *t, struct tnode *tn);
+static void tnode_free(struct tnode *tn);
+static void trie_dump_seq(struct seq_file *seq, struct trie *t);
+extern struct fib_alias *fib_find_alias(struct list_head *fah, u8 tos, u32 prio);
+extern int fib_detect_death(struct fib_info *fi, int order,
+                            struct fib_info **last_resort, int *last_idx, int *dflt);
+
+extern void rtmsg_fib(int event, u32 key, struct fib_alias *fa, int z, int tb_id,
+               struct nlmsghdr *n, struct netlink_skb_parms *req);
+
+static kmem_cache_t *fn_alias_kmem;
+static struct trie *trie_local = NULL, *trie_main = NULL;
+
+static void trie_bug(char *err)
+{
+       printk("Trie Bug: %s\n", err);
+       BUG();
+}
+
+static inline struct node *tnode_get_child(struct tnode *tn, int i) 
+{
+        if (i >=  1<<tn->bits) 
+                trie_bug("tnode_get_child");
+
+        return tn->child[i];
+}
+
+static inline int tnode_child_length(struct tnode *tn)
+{
+        return 1<<tn->bits;
+}
+
+/*
+  _________________________________________________________________
+  | i | i | i | i | i | i | i | N | N | N | S | S | S | S | S | C |
+  ----------------------------------------------------------------
+    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15 
+
+  _________________________________________________________________
+  | C | C | C | u | u | u | u | u | u | u | u | u | u | u | u | u |
+  -----------------------------------------------------------------
+   16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31
+
+  tp->pos = 7
+  tp->bits = 3
+  n->pos = 15
+  n->bits=4
+  KEYLENGTH=32
+*/
+
+static inline t_key tkey_extract_bits(t_key a, int offset, int bits)
+{
+        if (offset < KEYLENGTH)
+               return ((t_key)(a << offset)) >> (KEYLENGTH - bits);
+        else
+               return 0;
+}
+
+static inline int tkey_equals(t_key a, t_key b)
+{
+  return a == b;
+}
+
+static inline int tkey_sub_equals(t_key a, int offset, int bits, t_key b)
+{
+     if (bits == 0 || offset >= KEYLENGTH)
+            return 1;
+        bits = bits > KEYLENGTH ? KEYLENGTH : bits;
+        return ((a ^ b) << offset) >> (KEYLENGTH - bits) == 0;
+}      
+
+static inline int tkey_mismatch(t_key a, int offset, t_key b)
+{
+       t_key diff = a ^ b;
+       int i = offset;
+
+       if(!diff) 
+         return 0;
+       while((diff << i) >> (KEYLENGTH-1) == 0)
+               i++;
+       return i;
+}
+
+/* Candiate for fib_semantics */
+
+static void fn_free_alias(struct fib_alias *fa)
+{
+       fib_release_info(fa->fa_info);
+       kmem_cache_free(fn_alias_kmem, fa);
+}
+
+/*
+  To understand this stuff, an understanding of keys and all their bits is 
+  necessary. Every node in the trie has a key associated with it, but not 
+  all of the bits in that key are significant.
+
+  Consider a node 'n' and its parent 'tp'.
+
+  If n is a leaf, every bit in its key is significant. Its presence is 
+  necessitaded by path compression, since during a tree traversal (when 
+  searching for a leaf - unless we are doing an insertion) we will completely 
+  ignore all skipped bits we encounter. Thus we need to verify, at the end of 
+  a potentially successful search, that we have indeed been walking the 
+  correct key path.
+
+  Note that we can never "miss" the correct key in the tree if present by 
+  following the wrong path. Path compression ensures that segments of the key 
+  that are the same for all keys with a given prefix are skipped, but the 
+  skipped part *is* identical for each node in the subtrie below the skipped 
+  bit! trie_insert() in this implementation takes care of that - note the 
+  call to tkey_sub_equals() in trie_insert().
+
+  if n is an internal node - a 'tnode' here, the various parts of its key 
+  have many different meanings.
+
+  Example:  
+  _________________________________________________________________
+  | i | i | i | i | i | i | i | N | N | N | S | S | S | S | S | C |
+  -----------------------------------------------------------------
+    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15 
+
+  _________________________________________________________________
+  | C | C | C | u | u | u | u | u | u | u | u | u | u | u | u | u |
+  -----------------------------------------------------------------
+   16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31
+
+  tp->pos = 7
+  tp->bits = 3
+  n->pos = 15
+  n->bits=4
+
+  First, let's just ignore the bits that come before the parent tp, that is 
+  the bits from 0 to (tp->pos-1). They are *known* but at this point we do 
+  not use them for anything.
+
+  The bits from (tp->pos) to (tp->pos + tp->bits - 1) - "N", above - are the
+  index into the parent's child array. That is, they will be used to find 
+  'n' among tp's children.
+
+  The bits from (tp->pos + tp->bits) to (n->pos - 1) - "S" - are skipped bits
+  for the node n.
+
+  All the bits we have seen so far are significant to the node n. The rest 
+  of the bits are really not needed or indeed known in n->key.
+
+  The bits from (n->pos) to (n->pos + n->bits - 1) - "C" - are the index into 
+  n's child array, and will of course be different for each child.
+  
+  The rest of the bits, from (n->pos + n->bits) onward, are completely unknown
+  at this point.
+
+*/
+
+static void check_tnode(struct tnode *tn)
+{
+       if(tn && tn->pos+tn->bits > 32) {
+               printk("TNODE ERROR tn=%p, pos=%d, bits=%d\n", tn, tn->pos, tn->bits);
+       }
+}
+
+static int halve_threshold = 25;
+static int inflate_threshold = 50;
+
+static struct leaf *leaf_new(void)
+{
+       struct leaf *l = kmalloc(sizeof(struct leaf),  GFP_KERNEL);
+       if(l) {
+               NODE_INIT_PARENT(l, T_LEAF);
+               INIT_HLIST_HEAD(&l->list);
+       }
+       return l;
+}
+
+static struct leaf_info *leaf_info_new(int plen)
+{
+       struct leaf_info *li = kmalloc(sizeof(struct leaf_info),  GFP_KERNEL);
+       li->plen = plen;
+       INIT_LIST_HEAD(&li->falh);
+       return li;
+}
+
+static inline void free_leaf(struct leaf *l)
+{
+       kfree(l);
+}
+
+static inline void free_leaf_info(struct leaf_info *li)
+{
+       kfree(li);
+}
+
+static struct tnode* tnode_new(t_key key, int pos, int bits)
+{
+       int nchildren = 1<<bits;
+       int sz = sizeof(struct tnode) + nchildren * sizeof(struct node *);
+       struct tnode *tn = kmalloc(sz,  GFP_KERNEL);
+
+       if(tn)  {
+               memset(tn, 0, sz);
+               NODE_INIT_PARENT(tn, T_TNODE);
+               tn->pos = pos;
+               tn->bits = bits;
+               tn->key = key;
+               tn->full_children = 0;
+               tn->empty_children = 1<<bits;
+       }
+       if(trie_debug > 0) 
+               printk("AT %p s=%u %u\n", tn, (unsigned int) sizeof(struct tnode),
+                      (unsigned int) (sizeof(struct node) * 1<<bits));
+       return tn;
+}
+
+static void tnode_free(struct tnode *tn)
+{
+       if(!tn) {
+               trie_bug("tnode_free\n");
+       }
+       if(IS_LEAF(tn)) {
+               free_leaf((struct leaf *)tn);
+               if(trie_debug > 0 ) 
+                       printk("FL %p \n", tn);
+       }
+       else if(IS_TNODE(tn)) { 
+               kfree(tn);
+               if(trie_debug > 0 ) 
+                       printk("FT %p \n", tn);
+       }
+       else {
+               trie_bug("tnode_free\n");
+       }
+}
+
+/*
+ * Check whether a tnode 'n' is "full", i.e. it is an internal node
+ * and no bits are skipped. See discussion in dyntree paper p. 6
+ */
+
+static inline int tnode_full(struct tnode *tn, struct node *n)
+{
+       if(n == NULL || IS_LEAF(n))
+               return 0;
+
+       return ((struct tnode *) n)->pos == tn->pos + tn->bits;
+}
+
+static inline void put_child(struct trie *t, struct tnode *tn, int i, struct node *n) 
+{
+       tnode_put_child_reorg(tn, i, n, -1);
+}
+
+ /* 
+  * Add a child at position i overwriting the old value.
+  * Update the value of full_children and empty_children.
+  */
+
+static void tnode_put_child_reorg(struct tnode *tn, int i, struct node *n, int wasfull) 
+{
+       struct node *chi;
+       int isfull;
+
+       if(i >=  1<<tn->bits) {
+               printk("bits=%d, i=%d\n", tn->bits, i);
+               trie_bug("tnode_put_child_reorg bits");
+       }
+       write_lock_bh(&fib_lock);
+       chi = tn->child[i];     
+
+       /* update emptyChildren */
+       if (n == NULL && chi != NULL)
+               tn->empty_children++;
+       else if (n != NULL && chi == NULL)
+               tn->empty_children--;
+  
+       /* update fullChildren */
+        if (wasfull == -1)
+               wasfull = tnode_full(tn, chi);
+
+       isfull = tnode_full(tn, n);
+       if (wasfull && !isfull) 
+               tn->full_children--;
+       
+       else if (!wasfull && isfull) 
+               tn->full_children++;
+       if(n) 
+               NODE_SET_PARENT(n, tn); 
+
+       tn->child[i] = n;
+       write_unlock_bh(&fib_lock);
+}
+
+static struct node *resize(struct trie *t, struct tnode *tn) 
+{
+       int i;
+
+       if (!tn)
+               return NULL;
+
+       if(trie_debug) 
+               printk("In tnode_resize %p inflate_threshold=%d threshold=%d\n", 
+                     tn, inflate_threshold, halve_threshold);
+
+       /* No children */
+       if (tn->empty_children == tnode_child_length(tn)) {
+               tnode_free(tn);
+               return NULL;
+       }
+       /* One child */
+       if (tn->empty_children == tnode_child_length(tn) - 1)
+               for (i = 0; i < tnode_child_length(tn); i++) {
+
+                       write_lock_bh(&fib_lock);
+                       if (tn->child[i] != NULL) {
+
+                               /* compress one level */
+                               struct node *n = tn->child[i];
+                               if(n)
+                                       NODE_INIT_PARENT(n, NODE_TYPE(n));
+
+                               write_unlock_bh(&fib_lock);
+                               tnode_free(tn);
+                               return n;
+                       }
+                       write_unlock_bh(&fib_lock);
+               }
+       /* 
+        * Double as long as the resulting node has a number of
+        * nonempty nodes that are above the threshold.
+        */
+
+       /*
+        * From "Implementing a dynamic compressed trie" by Stefan Nilsson of 
+        * the Helsinki University of Technology and Matti Tikkanen of Nokia 
+        * Telecommunications, page 6:
+        * "A node is doubled if the ratio of non-empty children to all 
+        * children in the *doubled* node is at least 'high'."
+        *
+        * 'high' in this instance is the variable 'inflate_threshold'. It 
+        * is expressed as a percentage, so we multiply it with 
+        * tnode_child_length() and instead of multiplying by 2 (since the 
+        * child array will be doubled by inflate()) and multiplying 
+        * the left-hand side by 100 (to handle the percentage thing) we 
+        * multiply the left-hand side by 50.
+        * 
+        * The left-hand side may look a bit weird: tnode_child_length(tn) 
+        * - tn->empty_children is of course the number of non-null children 
+        * in the current node. tn->full_children is the number of "full" 
+        * children, that is non-null tnodes with a skip value of 0.
+        * All of those will be doubled in the resulting inflated tnode, so 
+        * we just count them one extra time here.
+        * 
+        * A clearer way to write this would be:
+        * 
+        * to_be_doubled = tn->full_children;
+        * not_to_be_doubled = tnode_child_length(tn) - tn->empty_children - 
+        *     tn->full_children;
+        *
+        * new_child_length = tnode_child_length(tn) * 2;
+        *
+        * new_fill_factor = 100 * (not_to_be_doubled + 2*to_be_doubled) / 
+        *      new_child_length;
+        * if (new_fill_factor >= inflate_threshold)
+        * 
+        * ...and so on, tho it would mess up the while() loop.
+        * 
+        * anyway,
+        * 100 * (not_to_be_doubled + 2*to_be_doubled) / new_child_length >=
+        *      inflate_threshold
+        * 
+        * avoid a division:
+        * 100 * (not_to_be_doubled + 2*to_be_doubled) >=
+        *      inflate_threshold * new_child_length
+        * 
+        * expand not_to_be_doubled and to_be_doubled, and shorten:
+        * 100 * (tnode_child_length(tn) - tn->empty_children + 
+        *    tn->full_children ) >= inflate_threshold * new_child_length
+        * 
+        * expand new_child_length:
+        * 100 * (tnode_child_length(tn) - tn->empty_children + 
+        *    tn->full_children ) >=
+        *      inflate_threshold * tnode_child_length(tn) * 2
+        * 
+        * shorten again:
+        * 50 * (tn->full_children + tnode_child_length(tn) - 
+        *    tn->empty_children ) >= inflate_threshold * 
+        *    tnode_child_length(tn)
+        * 
+        */
+
+       check_tnode(tn);
+
+       while ((tn->full_children > 0 &&
+              50 * (tn->full_children + tnode_child_length(tn) - tn->empty_children) >=
+                               inflate_threshold * tnode_child_length(tn))) {
+
+               tn = inflate(t, tn);
+       }
+
+       check_tnode(tn);
+
+       /*
+        * Halve as long as the number of empty children in this
+        * node is above threshold.
+        */
+       while (tn->bits > 1 &&
+              100 * (tnode_child_length(tn) - tn->empty_children) <
+              halve_threshold * tnode_child_length(tn))
+
+               tn = halve(t, tn);
+  
+       /* Only one child remains */
+
+       if (tn->empty_children == tnode_child_length(tn) - 1)
+               for (i = 0; i < tnode_child_length(tn); i++) {
+                       
+                       write_lock_bh(&fib_lock);
+                       if (tn->child[i] != NULL) {
+                               /* compress one level */
+                               struct node *n = tn->child[i];
+
+                               if(n)
+                                       NODE_INIT_PARENT(n, NODE_TYPE(n));
+
+                               write_unlock_bh(&fib_lock);
+                               tnode_free(tn);
+                               return n;
+                       }
+                       write_unlock_bh(&fib_lock);
+               }
+
+       return (struct node *) tn;
+}
+
+static struct tnode *inflate(struct trie *t, struct tnode *tn)
+{
+       struct tnode *inode;
+       struct tnode *oldtnode = tn;
+       int olen = tnode_child_length(tn);
+       int i;
+
+       if(trie_debug) 
+               printk("In inflate\n");
+
+       tn = tnode_new(oldtnode->key, oldtnode->pos, oldtnode->bits + 1);
+
+       if (!tn)
+               trie_bug("tnode_new failed");
+
+       for(i = 0; i < olen; i++) {
+               struct node *node = tnode_get_child(oldtnode, i);
+      
+               /* An empty child */
+               if (node == NULL)
+                       continue;
+
+               /* A leaf or an internal node with skipped bits */
+
+               if(IS_LEAF(node) || ((struct tnode *) node)->pos >
+                  tn->pos + tn->bits - 1) {
+                       if(tkey_extract_bits(node->key, tn->pos + tn->bits - 1,
+                                            1) == 0)
+                               put_child(t, tn, 2*i, node);
+                       else
+                               put_child(t, tn, 2*i+1, node);
+                       continue;
+               }
+
+               /* An internal node with two children */
+               inode = (struct tnode *) node;
+
+               if (inode->bits == 1) {
+                       put_child(t, tn, 2*i, inode->child[0]);
+                       put_child(t, tn, 2*i+1, inode->child[1]);
+
+                       tnode_free(inode);
+               }
+
+                       /* An internal node with more than two children */
+               else {
+                       struct tnode *left, *right;
+                       int size, j;
+
+                       /* We will replace this node 'inode' with two new 
+                        * ones, 'left' and 'right', each with half of the 
+                        * original children. The two new nodes will have 
+                        * a position one bit further down the key and this 
+                        * means that the "significant" part of their keys 
+                        * (see the discussion near the top of this file) 
+                        * will differ by one bit, which will be "0" in 
+                        * left's key and "1" in right's key. Since we are 
+                        * moving the key position by one step, the bit that 
+                        * we are moving away from - the bit at position 
+                        * (inode->pos) - is the one that will differ between 
+                        * left and right. So... we synthesize that bit in the
+                        * two  new keys.
+                        * The mask 'm' below will be a single "one" bit at 
+                        * the position (inode->pos)
+                        */
+
+                       t_key m = TKEY_GET_MASK(inode->pos, 1);
+                       /* Use the old key, but set the new significant 
+                        *   bit to zero. 
+                        */
+                       left = tnode_new(inode->key&(~m), inode->pos + 1,
+                                        inode->bits - 1);
+
+                       if(!left) 
+                               trie_bug("tnode_new failed");
+                       
+                       
+                       /* Use the old key, but set the new significant 
+                        * bit to one. 
+                        */
+                       right = tnode_new(inode->key|m, inode->pos + 1,
+                                         inode->bits - 1);
+
+                       if(!right) 
+                               trie_bug("tnode_new failed");
+                       
+                       size = tnode_child_length(left);
+                       for(j = 0; j < size; j++) {
+                               put_child(t, left, j, inode->child[j]);
+                               put_child(t, right, j, inode->child[j + size]);
+                       }
+                       put_child(t, tn, 2*i, resize(t, left));
+                       put_child(t, tn, 2*i+1, resize(t, right));
+
+                       tnode_free(inode);
+               }
+       }
+       tnode_free(oldtnode);
+       return tn;
+}
+
+static struct tnode *halve(struct trie *t, struct tnode *tn)
+{
+       struct tnode *oldtnode = tn;
+       struct node *left, *right;
+       int i;
+       int olen = tnode_child_length(tn);
+
+       if(trie_debug) printk("In halve\n");
+  
+       tn=tnode_new(oldtnode->key, oldtnode->pos, oldtnode->bits - 1);
+
+       if(!tn) 
+               trie_bug("tnode_new failed");
+
+       for(i = 0; i < olen; i += 2) {
+               left = tnode_get_child(oldtnode, i);
+               right = tnode_get_child(oldtnode, i+1);
+    
+               /* At least one of the children is empty */
+               if (left == NULL) {
+                       if (right == NULL)    /* Both are empty */
+                               continue;
+                       put_child(t, tn, i/2, right);
+               } else if (right == NULL)
+                       put_child(t, tn, i/2, left);
+     
+               /* Two nonempty children */
+               else {
+                       struct tnode *newBinNode =
+                               tnode_new(left->key, tn->pos + tn->bits, 1);
+
+                       if(!newBinNode) 
+                               trie_bug("tnode_new failed");
+
+                       put_child(t, newBinNode, 0, left);
+                       put_child(t, newBinNode, 1, right);
+                       put_child(t, tn, i/2, resize(t, newBinNode));
+               }
+       }
+       tnode_free(oldtnode);
+       return tn;
+}
+
+static void *trie_init(struct trie *t)
+{
+       if(t) {
+               t->size = 0;
+               t->trie = NULL;
+               t->revision = 0;
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+                       memset(&t->stats, 0, sizeof(struct trie_use_stats));
+#endif
+       }
+       return t;
+}
+
+static struct leaf_info *find_leaf_info(struct hlist_head *head, int plen)
+{
+       struct hlist_node *node;
+       struct leaf_info *li;
+
+       hlist_for_each_entry(li, node, head, hlist) {
+                 
+               if ( li->plen == plen )
+                       return li;
+       }
+       return NULL;
+}
+
+static inline struct list_head * get_fa_head(struct leaf *l, int plen)
+{
+       struct list_head *fa_head=NULL;
+       struct leaf_info *li = find_leaf_info(&l->list, plen);
+       
+       if(li) 
+               fa_head = &li->falh;
+       
+       return fa_head;
+}
+
+static void insert_leaf_info(struct hlist_head *head, struct leaf_info *new)
+{
+       struct leaf_info *li=NULL, *last=NULL;
+       struct hlist_node *node, *tmp;
+
+       write_lock_bh(&fib_lock);
+       
+       if(hlist_empty(head))
+               hlist_add_head(&new->hlist, head);
+       else {
+               hlist_for_each_entry_safe(li, node, tmp, head, hlist) {
+                       
+                       if (new->plen > li->plen) 
+                               break;
+                       
+                       last = li;
+               }
+               if(last) 
+                       hlist_add_after(&last->hlist, &new->hlist);
+               else 
+                       hlist_add_before(&new->hlist, &li->hlist);
+       }
+       write_unlock_bh(&fib_lock);
+}
+
+static struct leaf *
+fib_find_node(struct trie *t, u32 key)
+{
+       int pos;
+       struct tnode *tn;
+       struct node *n;
+
+       pos = 0;
+       n=t->trie;
+
+       while (n != NULL &&  NODE_TYPE(n) == T_TNODE) {
+               tn = (struct tnode *) n;
+                       
+               check_tnode(tn);
+                       
+               if(tkey_sub_equals(tn->key, pos, tn->pos-pos, key)) {
+                       pos=tn->pos + tn->bits;
+                       n = tnode_get_child(tn, tkey_extract_bits(key, tn->pos, tn->bits));
+               }
+               else
+                       break;
+       }
+       /* Case we have found a leaf. Compare prefixes */
+
+       if (n != NULL && IS_LEAF(n) && tkey_equals(key, n->key)) {
+               struct leaf *l = (struct leaf *) n;
+               return l;
+       }
+       return NULL;
+}
+
+static struct node *trie_rebalance(struct trie *t, struct tnode *tn)
+{
+       int i = 0;
+       int wasfull;
+       t_key cindex, key;
+       struct tnode *tp = NULL;
+
+       if(!tn) 
+               BUG();
+       
+       key = tn->key;
+       i = 0;
+
+       while (tn != NULL && NODE_PARENT(tn) != NULL) {
+
+               if( i > 10 ) {
+                       printk("Rebalance tn=%p \n", tn);
+                       if(tn)          printk("tn->parent=%p \n", NODE_PARENT(tn));
+                       
+                       printk("Rebalance tp=%p \n", tp);
+                       if(tp)          printk("tp->parent=%p \n", NODE_PARENT(tp));
+               }
+
+               if( i > 12 ) BUG();
+               i++;
+
+               tp = NODE_PARENT(tn);
+               cindex = tkey_extract_bits(key, tp->pos, tp->bits);
+               wasfull = tnode_full(tp, tnode_get_child(tp, cindex));
+               tn = (struct tnode *) resize (t, (struct tnode *)tn);
+               tnode_put_child_reorg((struct tnode *)tp, cindex,(struct node*)tn, wasfull);
+               
+               if(!NODE_PARENT(tn))
+                       break;
+
+               tn = NODE_PARENT(tn);
+       }
+       /* Handle last (top) tnode */
+       if (IS_TNODE(tn)) 
+               tn = (struct tnode*) resize(t, (struct tnode *)tn);
+
+       return (struct node*) tn;
+}
+
+static struct list_head *
+fib_insert_node(struct trie *t, u32 key, int plen)
+{
+       int pos, newpos;
+       struct tnode *tp = NULL, *tn = NULL;
+       struct node *n;
+       struct leaf *l;
+       int missbit;
+       struct list_head *fa_head=NULL;
+       struct leaf_info *li;
+       t_key cindex;
+
+       pos = 0;
+       n=t->trie;
+
+       /* If we point to NULL, stop. Either the tree is empty and we should 
+        * just put a new leaf in if, or we have reached an empty child slot, 
+        * and we should just put our new leaf in that.
+        * If we point to a T_TNODE, check if it matches our key. Note that 
+        * a T_TNODE might be skipping any number of bits - its 'pos' need 
+        * not be the parent's 'pos'+'bits'!
+        *
+        * If it does match the current key, get pos/bits from it, extract 
+        * the index from our key, push the T_TNODE and walk the tree.
+        *
+        * If it doesn't, we have to replace it with a new T_TNODE.
+        *
+        * If we point to a T_LEAF, it might or might not have the same key 
+        * as we do. If it does, just change the value, update the T_LEAF's 
+        * value, and return it. 
+        * If it doesn't, we need to replace it with a T_TNODE.
+        */
+
+       while (n != NULL &&  NODE_TYPE(n) == T_TNODE) {
+               tn = (struct tnode *) n;
+                       
+               check_tnode(tn);
+               
+               if(tkey_sub_equals(tn->key, pos, tn->pos-pos, key)) {
+                       tp = tn;
+                       pos=tn->pos + tn->bits;
+                       n = tnode_get_child(tn, tkey_extract_bits(key, tn->pos, tn->bits));
+
+                       if(n && NODE_PARENT(n) != tn) {
+                               printk("BUG tn=%p, n->parent=%p\n", tn, NODE_PARENT(n));
+                               BUG();
+                       }
+               }
+               else
+                       break;
+       }
+
+       /*
+        * n  ----> NULL, LEAF or TNODE
+        *
+        * tp is n's (parent) ----> NULL or TNODE  
+        */
+
+       if(tp && IS_LEAF(tp))
+               BUG();
+
+       t->revision++;
+
+       /* Case 1: n is a leaf. Compare prefixes */
+
+       if (n != NULL && IS_LEAF(n) && tkey_equals(key, n->key)) { 
+               struct leaf *l = ( struct leaf *)  n;
+               
+               li = leaf_info_new(plen);
+               
+               if(! li) 
+                       BUG();
+
+               fa_head = &li->falh;
+               insert_leaf_info(&l->list, li);
+               goto done;
+       }
+       t->size++;
+       l = leaf_new();
+
+       if(! l) 
+               BUG();
+
+       l->key = key;
+       li = leaf_info_new(plen);
+
+       if(! li) 
+               BUG();
+
+       fa_head = &li->falh;
+       insert_leaf_info(&l->list, li);
+
+       /* Case 2: n is NULL, and will just insert a new leaf */
+       if (t->trie && n == NULL) {
+
+               NODE_SET_PARENT(l, tp);
+               
+               if (!tp) 
+                       BUG();
+
+               else {
+                       cindex = tkey_extract_bits(key, tp->pos, tp->bits);
+                       put_child(t, (struct tnode *)tp, cindex, (struct node *)l);
+               }
+       }
+       /* Case 3: n is a LEAF or a TNODE and the key doesn't match. */
+       else {
+               /* 
+                *  Add a new tnode here 
+                *  first tnode need some special handling
+                */
+
+               if (tp)
+                       pos=tp->pos+tp->bits;
+               else
+                       pos=0;
+               if(n) {
+                       newpos = tkey_mismatch(key, pos, n->key);
+                       tn = tnode_new(n->key, newpos, 1);
+               }
+               else {
+                       newpos = 0;
+                       tn = tnode_new(key, newpos, 1); /* First tnode */ 
+               }
+               if(!tn) 
+                       trie_bug("tnode_pfx_new failed");
+
+               NODE_SET_PARENT(tn, tp);
+
+               missbit=tkey_extract_bits(key, newpos, 1);
+               put_child(t, tn, missbit, (struct node *)l);
+               put_child(t, tn, 1-missbit, n);
+
+               if(tp) {
+                       cindex = tkey_extract_bits(key, tp->pos, tp->bits);
+                       put_child(t, (struct tnode *)tp, cindex, (struct node *)tn);
+               }
+               else { 
+                       t->trie = (struct node*) tn; /* First tnode */
+                       tp = tn;
+               }
+       }
+       if(tp && tp->pos+tp->bits > 32) {
+               printk("ERROR tp=%p pos=%d, bits=%d, key=%0x plen=%d\n", 
+                      tp, tp->pos, tp->bits, key, plen);
+       }
+       /* Rebalance the trie */
+       t->trie = trie_rebalance(t, tp);
+done:;
+       return fa_head;
+}
+
+static int
+fn_trie_insert(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta,
+              struct nlmsghdr *nlhdr, struct netlink_skb_parms *req)
+{
+       struct trie *t = (struct trie *) tb->tb_data;
+       struct fib_alias *fa, *new_fa;
+       struct list_head *fa_head=NULL;
+       struct fib_info *fi;
+       int plen = r->rtm_dst_len;
+       int type = r->rtm_type;
+       u8 tos = r->rtm_tos;
+       u32 key, mask;
+       int err;
+       struct leaf *l;
+
+       if (plen > 32)
+               return -EINVAL;
+
+       key = 0;
+       if (rta->rta_dst) 
+               memcpy(&key, rta->rta_dst, 4);
+
+       key = ntohl(key);
+
+       if(trie_debug)
+               printk("Insert table=%d %08x/%d\n", tb->tb_id, key, plen);
+
+       mask =  ntohl( inet_make_mask(plen) );
+
+       if(key & ~mask)
+               return -EINVAL;
+
+       key = key & mask;
+
+       if  ((fi = fib_create_info(r, rta, nlhdr, &err)) == NULL)
+               goto err;
+
+       l = fib_find_node(t, key);
+       fa = NULL;      
+
+       if(l) {
+               fa_head = get_fa_head(l, plen);
+               fa = fib_find_alias(fa_head, tos, fi->fib_priority);
+       }
+
+       /* Now fa, if non-NULL, points to the first fib alias
+        * with the same keys [prefix,tos,priority], if such key already
+        * exists or to the node before which we will insert new one.
+        *
+        * If fa is NULL, we will need to allocate a new one and
+        * insert to the head of f.
+        *
+        * If f is NULL, no fib node matched the destination key
+        * and we need to allocate a new one of those as well.
+        */
+
+       if (fa &&
+           fa->fa_info->fib_priority == fi->fib_priority) {
+               struct fib_alias *fa_orig;
+
+               err = -EEXIST;
+               if (nlhdr->nlmsg_flags & NLM_F_EXCL)
+                       goto out;
+
+               if (nlhdr->nlmsg_flags & NLM_F_REPLACE) {
+                       struct fib_info *fi_drop;
+                       u8 state;
+
+                       write_lock_bh(&fib_lock);
+
+                       fi_drop = fa->fa_info;
+                       fa->fa_info = fi;
+                       fa->fa_type = type;
+                       fa->fa_scope = r->rtm_scope;
+                       state = fa->fa_state;
+                       fa->fa_state &= ~FA_S_ACCESSED;
+
+                       write_unlock_bh(&fib_lock);
+
+                       fib_release_info(fi_drop);
+                       if (state & FA_S_ACCESSED)
+                         rt_cache_flush(-1);
+
+                           goto succeeded;
+               }
+               /* Error if we find a perfect match which
+                * uses the same scope, type, and nexthop
+                * information.
+                */
+               fa_orig = fa;
+               list_for_each_entry(fa, fa_orig->fa_list.prev, fa_list) {
+                       if (fa->fa_tos != tos)
+                               break;
+                       if (fa->fa_info->fib_priority != fi->fib_priority)
+                               break;
+                       if (fa->fa_type == type &&
+                           fa->fa_scope == r->rtm_scope &&
+                           fa->fa_info == fi) {
+                               goto out;
+                       }
+               }
+               if (!(nlhdr->nlmsg_flags & NLM_F_APPEND))
+                       fa = fa_orig;
+       }
+       err = -ENOENT;
+       if (!(nlhdr->nlmsg_flags&NLM_F_CREATE))
+               goto out;
+
+       err = -ENOBUFS;
+       new_fa = kmem_cache_alloc(fn_alias_kmem, SLAB_KERNEL);
+       if (new_fa == NULL)
+               goto out;
+
+       new_fa->fa_info = fi;
+       new_fa->fa_tos = tos;
+       new_fa->fa_type = type;
+       new_fa->fa_scope = r->rtm_scope;
+       new_fa->fa_state = 0;
+#if 0
+       new_fa->dst  = NULL;
+#endif
+       /*
+        * Insert new entry to the list.
+        */
+
+       if(!fa_head)
+               fa_head = fib_insert_node(t, key, plen);
+
+       write_lock_bh(&fib_lock);
+
+       list_add_tail(&new_fa->fa_list,
+                (fa ? &fa->fa_list : fa_head));
+
+       write_unlock_bh(&fib_lock);
+
+       rt_cache_flush(-1);
+       rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id, nlhdr, req);
+succeeded:
+       return 0;
+out:
+       fib_release_info(fi);
+err:;  
+       return err;
+}
+
+static inline int check_leaf(struct trie *t, struct leaf *l,  t_key key, int *plen, const struct flowi *flp, 
+                            struct fib_result *res, int *err)
+{
+       int i;
+       t_key mask;
+       struct leaf_info *li;
+       struct hlist_head *hhead = &l->list;
+       struct hlist_node *node;
+       
+       hlist_for_each_entry(li, node, hhead, hlist) {
+
+               i = li->plen;
+               mask = ntohl(inet_make_mask(i));
+               if (l->key != (key & mask)) 
+                       continue;
+
+               if (((*err) = fib_semantic_match(&li->falh, flp, res, l->key, mask, i)) == 0) {
+                       *plen = i;
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+                       t->stats.semantic_match_passed++;
+#endif
+                       return 1;
+               }
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+               t->stats.semantic_match_miss++;
+#endif
+       }
+       return 0;
+}
+
+static int
+fn_trie_lookup(struct fib_table *tb, const struct flowi *flp, struct fib_result *res)
+{
+       struct trie *t = (struct trie *) tb->tb_data;
+       int plen, ret = 0;
+       struct node *n;
+       struct tnode *pn;
+       int pos, bits;
+       t_key key=ntohl(flp->fl4_dst);
+       int chopped_off;
+       t_key cindex = 0;
+       int current_prefix_length = KEYLENGTH;
+       n = t->trie;
+
+       read_lock(&fib_lock);
+       if(!n)
+               goto failed;
+
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+       t->stats.gets++;
+#endif
+
+       /* Just a leaf? */
+       if (IS_LEAF(n)) {
+               if( check_leaf(t, (struct leaf *)n, key, &plen, flp, res, &ret) )
+                       goto found;
+               goto failed;
+       }
+       pn = (struct tnode *) n;
+       chopped_off = 0;
+       
+        while (pn) {
+
+               pos = pn->pos;
+               bits = pn->bits;
+
+               if(!chopped_off) 
+                       cindex = tkey_extract_bits(MASK_PFX(key, current_prefix_length), pos, bits);
+
+               n = tnode_get_child(pn, cindex);
+
+               if (n == NULL) {
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+                       t->stats.null_node_hit++;
+#endif
+                       goto backtrace;
+               }
+
+               if (IS_TNODE(n)) {
+#define HL_OPTIMIZE
+#ifdef HL_OPTIMIZE
+                       struct tnode *cn = (struct tnode *)n;
+                       t_key node_prefix, key_prefix, pref_mismatch;
+                       int mp;
+
+                       /*
+                        * It's a tnode, and we can do some extra checks here if we 
+                        * like, to avoid descending into a dead-end branch.
+                        * This tnode is in the parent's child array at index 
+                        * key[p_pos..p_pos+p_bits] but potentially with some bits 
+                        * chopped off, so in reality the index may be just a 
+                        * subprefix, padded with zero at the end.
+                        * We can also take a look at any skipped bits in this 
+                        * tnode - everything up to p_pos is supposed to be ok, 
+                        * and the non-chopped bits of the index (se previous
+                        * paragraph) are also guaranteed ok, but the rest is 
+                        * considered unknown.
+                        *
+                        * The skipped bits are key[pos+bits..cn->pos].
+                        */
+                       
+                       /* If current_prefix_length < pos+bits, we are already doing 
+                        * actual prefix  matching, which means everything from 
+                        * pos+(bits-chopped_off) onward must be zero along some 
+                        * branch of this subtree - otherwise there is *no* valid 
+                        * prefix present. Here we can only check the skipped
+                        * bits. Remember, since we have already indexed into the 
+                        * parent's child array, we know that the bits we chopped of 
+                        * *are* zero.
+                        */
+
+                       /* NOTA BENE: CHECKING ONLY SKIPPED BITS FOR THE NEW NODE HERE */
+                       
+                       if (current_prefix_length < pos+bits) {
+                               if (tkey_extract_bits(cn->key, current_prefix_length,
+                                                     cn->pos - current_prefix_length) != 0 ||
+                                   !(cn->child[0]))
+                                       goto backtrace;
+                       }
+
+                       /*
+                        * If chopped_off=0, the index is fully validated and we 
+                        * only need to look at the skipped bits for this, the new, 
+                        * tnode. What we actually want to do is to find out if
+                        * these skipped bits match our key perfectly, or if we will
+                        * have to count on finding a matching prefix further down, 
+                        * because if we do, we would like to have some way of 
+                        * verifying the existence of such a prefix at this point. 
+                        */
+
+                       /* The only thing we can do at this point is to verify that
+                        * any such matching prefix can indeed be a prefix to our
+                        * key, and if the bits in the node we are inspecting that
+                        * do not match our key are not ZERO, this cannot be true.
+                        * Thus, find out where there is a mismatch (before cn->pos)
+                        * and verify that all the mismatching bits are zero in the
+                        * new tnode's key.
+                        */
+
+                       /* Note: We aren't very concerned about the piece of the key 
+                        * that precede pn->pos+pn->bits, since these have already been 
+                        * checked. The bits after cn->pos aren't checked since these are 
+                        * by definition "unknown" at this point. Thus, what we want to 
+                        * see is if we are about to enter the "prefix matching" state, 
+                        * and in that case verify that the skipped bits that will prevail 
+                        * throughout this subtree are zero, as they have to be if we are 
+                        * to find a matching prefix.
+                        */
+
+                       node_prefix = MASK_PFX(cn->key, cn->pos);
+                       key_prefix =  MASK_PFX(key, cn->pos);
+                       pref_mismatch = key_prefix^node_prefix;
+                       mp = 0;
+
+                       /* In short: If skipped bits in this node do not match the search 
+                        * key, enter the "prefix matching" state.directly.
+                        */
+                       if (pref_mismatch) {
+                               while (!(pref_mismatch & (1<<(KEYLENGTH-1)))) {
+                                       mp++;
+                                       pref_mismatch = pref_mismatch <<1;
+                               }
+                               key_prefix = tkey_extract_bits(cn->key, mp, cn->pos-mp);
+                               
+                               if (key_prefix != 0)
+                                       goto backtrace;
+
+                               if (current_prefix_length >= cn->pos)
+                                       current_prefix_length=mp;
+                      }
+#endif
+                      pn = (struct tnode *)n; /* Descend */
+                      chopped_off = 0;
+                      continue;
+               } 
+               if (IS_LEAF(n)) {       
+                       if( check_leaf(t, (struct leaf *)n, key, &plen, flp, res, &ret))
+                               goto found;
+              }
+backtrace:
+               chopped_off++;
+
+               /* As zero don't change the child key (cindex) */
+               while ((chopped_off <= pn->bits) && !(cindex & (1<<(chopped_off-1)))) {
+                       chopped_off++;
+               }
+
+               /* Decrease current_... with bits chopped off */
+               if (current_prefix_length > pn->pos + pn->bits - chopped_off)
+                       current_prefix_length = pn->pos + pn->bits - chopped_off;
+               
+               /*
+                * Either we do the actual chop off according or if we have 
+                * chopped off all bits in this tnode walk up to our parent.
+                */
+
+               if(chopped_off <= pn->bits)
+                       cindex &= ~(1 << (chopped_off-1));
+               else {
+                       if( NODE_PARENT(pn) == NULL)
+                               goto failed;
+                       
+                       /* Get Child's index */
+                       cindex = tkey_extract_bits(pn->key, NODE_PARENT(pn)->pos, NODE_PARENT(pn)->bits);
+                       pn = NODE_PARENT(pn);
+                       chopped_off = 0;
+
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+                       t->stats.backtrack++;
+#endif
+                       goto backtrace;
+               } 
+       }
+failed:
+       ret =  1;
+found:
+       read_unlock(&fib_lock);
+       return ret;
+}
+
+static int trie_leaf_remove(struct trie *t, t_key key)
+{
+       t_key cindex;
+       struct tnode *tp = NULL;
+       struct node *n = t->trie;
+       struct leaf *l;
+
+       if(trie_debug) 
+               printk("entering trie_leaf_remove(%p)\n", n);
+
+       /* Note that in the case skipped bits, those bits are *not* checked!
+        * When we finish this, we will have NULL or a T_LEAF, and the 
+        * T_LEAF may or may not match our key.
+        */
+
+        while (n != NULL && IS_TNODE(n)) {
+               struct tnode *tn = (struct tnode *) n;
+               check_tnode(tn);
+               n = tnode_get_child(tn ,tkey_extract_bits(key, tn->pos, tn->bits));
+
+                       if(n && NODE_PARENT(n) != tn) {
+                               printk("BUG tn=%p, n->parent=%p\n", tn, NODE_PARENT(n));
+                               BUG();
+                       }
+        }
+       l = (struct leaf *) n;
+
+       if(!n || !tkey_equals(l->key, key)) 
+               return 0;
+    
+       /* 
+        * Key found. 
+        * Remove the leaf and rebalance the tree 
+        */
+
+       t->revision++;
+       t->size--;
+
+       tp = NODE_PARENT(n);
+       tnode_free((struct tnode *) n);
+
+       if(tp) {
+               cindex = tkey_extract_bits(key, tp->pos, tp->bits);
+               put_child(t, (struct tnode *)tp, cindex, NULL);
+               t->trie = trie_rebalance(t, tp);
+       }
+       else
+               t->trie = NULL;
+
+       return 1;
+}
+
+static int
+fn_trie_delete(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta,
+              struct nlmsghdr *nlhdr, struct netlink_skb_parms *req)
+{
+       struct trie *t = (struct trie *) tb->tb_data;
+       u32 key, mask;
+       int plen = r->rtm_dst_len;
+       u8 tos = r->rtm_tos;
+       struct fib_alias *fa, *fa_to_delete;
+       struct list_head *fa_head;
+       struct leaf *l;
+
+       if (plen > 32) 
+               return -EINVAL;
+
+       key = 0;
+       if (rta->rta_dst) 
+               memcpy(&key, rta->rta_dst, 4);
+
+       key = ntohl(key);
+       mask =  ntohl( inet_make_mask(plen) );
+
+       if(key & ~mask)
+               return -EINVAL;
+
+       key = key & mask;
+       l = fib_find_node(t, key);
+
+       if(!l)
+               return -ESRCH;
+
+       fa_head = get_fa_head(l, plen);
+       fa = fib_find_alias(fa_head, tos, 0);
+
+       if (!fa)
+               return -ESRCH;
+
+       if (trie_debug)
+               printk("Deleting %08x/%d tos=%d t=%p\n", key, plen, tos, t);
+
+       fa_to_delete = NULL;
+       fa_head = fa->fa_list.prev;
+       list_for_each_entry(fa, fa_head, fa_list) {
+               struct fib_info *fi = fa->fa_info;
+
+               if (fa->fa_tos != tos)
+                       break;
+
+               if ((!r->rtm_type ||
+                    fa->fa_type == r->rtm_type) &&
+                   (r->rtm_scope == RT_SCOPE_NOWHERE ||
+                    fa->fa_scope == r->rtm_scope) &&
+                   (!r->rtm_protocol ||
+                    fi->fib_protocol == r->rtm_protocol) &&
+                   fib_nh_match(r, nlhdr, rta, fi) == 0) {
+                       fa_to_delete = fa;
+                       break;
+               }
+       }
+
+       if (fa_to_delete) {
+               int kill_li = 0;
+               struct leaf_info *li;
+
+               fa = fa_to_delete;
+               rtmsg_fib(RTM_DELROUTE, htonl(key), fa, plen, tb->tb_id, nlhdr, req);
+
+               l = fib_find_node(t, key);
+               li = find_leaf_info(&l->list, plen);
+
+               write_lock_bh(&fib_lock);
+
+               list_del(&fa->fa_list);
+
+               if(list_empty(fa_head)) {
+                       hlist_del(&li->hlist);
+                       kill_li = 1;
+               }
+               write_unlock_bh(&fib_lock);
+               
+               if(kill_li)
+                       free_leaf_info(li);
+
+               if(hlist_empty(&l->list))
+                       trie_leaf_remove(t, key);
+
+               if (fa->fa_state & FA_S_ACCESSED)
+                       rt_cache_flush(-1);
+
+               fn_free_alias(fa);
+               return 0;
+       }
+       return -ESRCH;
+}
+
+static int trie_flush_list(struct trie *t, struct list_head *head)
+{
+       struct fib_alias *fa, *fa_node;
+       int found = 0;
+
+       list_for_each_entry_safe(fa, fa_node, head, fa_list) {
+               struct fib_info *fi = fa->fa_info;
+               
+               if (fi && (fi->fib_flags&RTNH_F_DEAD)) {
+
+                       write_lock_bh(&fib_lock);       
+                       list_del(&fa->fa_list);
+                       write_unlock_bh(&fib_lock); 
+
+                       fn_free_alias(fa);
+                       found++;
+               }
+       }
+       return found;
+}
+
+static int trie_flush_leaf(struct trie *t, struct leaf *l)
+{
+       int found = 0;
+       struct hlist_head *lih = &l->list;
+       struct hlist_node *node, *tmp;
+       struct leaf_info *li = NULL;
+
+       hlist_for_each_entry_safe(li, node, tmp, lih, hlist) {
+                       
+               found += trie_flush_list(t, &li->falh);
+
+               if (list_empty(&li->falh)) {
+
+                       write_lock_bh(&fib_lock); 
+                       hlist_del(&li->hlist);
+                       write_unlock_bh(&fib_lock); 
+
+                       free_leaf_info(li);
+               }
+       }
+       return found;
+}
+
+static struct leaf *nextleaf(struct trie *t, struct leaf *thisleaf)
+{
+       struct node *c = (struct node *) thisleaf;
+       struct tnode *p;
+       int idx;
+
+       if(c == NULL) {
+               if(t->trie == NULL)
+                       return NULL;
+
+               if (IS_LEAF(t->trie))          /* trie w. just a leaf */
+                       return (struct leaf *) t->trie;
+
+               p = (struct tnode*) t->trie;  /* Start */
+       }
+       else 
+               p = (struct tnode *) NODE_PARENT(c);
+       while (p) {
+               int pos, last;
+
+               /*  Find the next child of the parent */
+               if(c)
+                       pos  = 1 + tkey_extract_bits(c->key, p->pos, p->bits);
+               else 
+                       pos = 0;
+
+               last = 1 << p->bits;
+               for(idx = pos; idx < last ; idx++) {
+                       if( p->child[idx]) {
+
+                               /* Decend if tnode */
+
+                               while (IS_TNODE(p->child[idx])) {
+                                       p = (struct tnode*) p->child[idx];
+                                       idx = 0;
+                                       
+                                       /* Rightmost non-NULL branch */
+                                       if( p && IS_TNODE(p) )
+                                               while ( p->child[idx] == NULL && idx < (1 << p->bits) ) idx++;
+
+                                       /* Done with this tnode? */
+                                       if( idx >= (1 << p->bits) || p->child[idx] == NULL ) 
+                                               goto up;
+                               }
+                               return (struct leaf*) p->child[idx];
+                       }
+               }
+up:
+               /* No more children go up one step  */
+               c = (struct node*) p;
+               p = (struct tnode *) NODE_PARENT(p);
+       }
+       return NULL; /* Ready. Root of trie */
+}
+
+static int fn_trie_flush(struct fib_table *tb)
+{
+       struct trie *t = (struct trie *) tb->tb_data;
+       struct leaf *ll = NULL, *l = NULL;
+       int found = 0, h;
+
+       t->revision++;
+
+       for (h=0; (l = nextleaf(t, l)) != NULL; h++) {
+               found += trie_flush_leaf(t, l);
+
+               if (ll && hlist_empty(&ll->list))
+                       trie_leaf_remove(t, ll->key);
+               ll = l;
+       }
+
+       if (ll && hlist_empty(&ll->list))
+               trie_leaf_remove(t, ll->key);
+
+       if(trie_debug) 
+               printk("trie_flush found=%d\n", found);
+       return found;
+}
+
+static int trie_last_dflt=-1;
+
+static void
+fn_trie_select_default(struct fib_table *tb, const struct flowi *flp, struct fib_result *res)
+{
+       struct trie *t = (struct trie *) tb->tb_data;
+       int order, last_idx;
+       struct fib_info *fi = NULL;
+       struct fib_info *last_resort;
+       struct fib_alias *fa = NULL;
+       struct list_head *fa_head;
+       struct leaf *l;
+
+       last_idx = -1;
+       last_resort = NULL;
+       order = -1;
+
+       read_lock(&fib_lock);
+       
+       l = fib_find_node(t, 0);
+       if(!l) 
+               goto out;
+
+       fa_head = get_fa_head(l, 0);
+       if(!fa_head)
+               goto out;
+
+       if (list_empty(fa_head)) 
+               goto out;
+
+       list_for_each_entry(fa, fa_head, fa_list) {
+               struct fib_info *next_fi = fa->fa_info;
+               
+               if (fa->fa_scope != res->scope ||
+                   fa->fa_type != RTN_UNICAST)
+                       continue;
+               
+               if (next_fi->fib_priority > res->fi->fib_priority)
+                       break;
+               if (!next_fi->fib_nh[0].nh_gw ||
+                   next_fi->fib_nh[0].nh_scope != RT_SCOPE_LINK)
+                       continue;
+               fa->fa_state |= FA_S_ACCESSED;
+               
+               if (fi == NULL) {
+                       if (next_fi != res->fi)
+                               break;
+               } else if (!fib_detect_death(fi, order, &last_resort,
+                                            &last_idx, &trie_last_dflt)) {
+                       if (res->fi)
+                               fib_info_put(res->fi);
+                       res->fi = fi;
+                       atomic_inc(&fi->fib_clntref);
+                       trie_last_dflt = order;
+                       goto out;
+               }
+               fi = next_fi;
+               order++;
+       }
+       if (order <= 0 || fi == NULL) {
+               trie_last_dflt = -1;
+               goto out;
+       }
+
+       if (!fib_detect_death(fi, order, &last_resort, &last_idx, &trie_last_dflt)) {
+               if (res->fi)
+                       fib_info_put(res->fi);
+               res->fi = fi;
+               atomic_inc(&fi->fib_clntref);
+               trie_last_dflt = order;
+               goto out;
+       }
+       if (last_idx >= 0) {
+               if (res->fi)
+                       fib_info_put(res->fi);
+               res->fi = last_resort;
+               if (last_resort)
+                       atomic_inc(&last_resort->fib_clntref);
+       }
+       trie_last_dflt = last_idx;
+ out:;
+       read_unlock(&fib_lock); 
+}
+
+static int fn_trie_dump_fa(t_key key, int plen, struct list_head *fah, struct fib_table *tb, 
+                          struct sk_buff *skb, struct netlink_callback *cb)
+{
+       int i, s_i;
+       struct fib_alias *fa;
+
+       u32 xkey=htonl(key);
+
+       s_i=cb->args[3];
+       i = 0;
+
+       list_for_each_entry(fa, fah, fa_list) {
+               if (i < s_i) {
+                       i++;
+                       continue;
+               }
+               if (fa->fa_info->fib_nh == NULL) {
+                       printk("Trie error _fib_nh=NULL in fa[%d] k=%08x plen=%d\n", i, key, plen);
+                       i++;
+                       continue;
+               }
+               if (fa->fa_info == NULL) {
+                       printk("Trie error fa_info=NULL in fa[%d] k=%08x plen=%d\n", i, key, plen);
+                       i++;
+                       continue;
+               }
+
+               if (fib_dump_info(skb, NETLINK_CB(cb->skb).pid,
+                                 cb->nlh->nlmsg_seq,
+                                 RTM_NEWROUTE,
+                                 tb->tb_id,
+                                 fa->fa_type,
+                                 fa->fa_scope,
+                                 &xkey,
+                                 plen,
+                                 fa->fa_tos,
+                                 fa->fa_info, 0) < 0) {
+                       cb->args[3] = i;
+                       return -1;
+                       }
+               i++;
+       }
+       cb->args[3]=i;
+       return skb->len;
+}
+
+static int fn_trie_dump_plen(struct trie *t, int plen, struct fib_table *tb, struct sk_buff *skb, 
+                            struct netlink_callback *cb)
+{
+       int h, s_h;
+       struct list_head *fa_head;
+       struct leaf *l = NULL;
+       s_h=cb->args[2];
+
+       for (h=0; (l = nextleaf(t, l)) != NULL; h++) {
+
+               if (h < s_h)
+                       continue;
+               if (h > s_h)
+                       memset(&cb->args[3], 0,
+                              sizeof(cb->args) - 3*sizeof(cb->args[0]));
+
+               fa_head = get_fa_head(l, plen);
+               
+               if(!fa_head)
+                       continue;
+
+               if(list_empty(fa_head))
+                       continue;
+
+               if (fn_trie_dump_fa(l->key, plen, fa_head, tb, skb, cb)<0) {
+                       cb->args[2]=h;
+                       return -1;
+               }
+       }
+       cb->args[2]=h;
+       return skb->len;
+}
+
+static int fn_trie_dump(struct fib_table *tb, struct sk_buff *skb, struct netlink_callback *cb)
+{
+       int m, s_m;
+       struct trie *t = (struct trie *) tb->tb_data;
+
+       s_m = cb->args[1];
+
+       read_lock(&fib_lock);
+       for (m=0; m<=32; m++) {
+
+               if (m < s_m)
+                       continue;
+               if (m > s_m)
+                       memset(&cb->args[2], 0,
+                              sizeof(cb->args) - 2*sizeof(cb->args[0]));
+
+               if (fn_trie_dump_plen(t, 32-m, tb, skb, cb)<0) {
+                       cb->args[1] = m;
+                       goto out;
+               }
+       }
+       read_unlock(&fib_lock);
+       cb->args[1] = m;
+       return skb->len;
+ out:
+       read_unlock(&fib_lock);
+       return -1;
+}
+
+/* Fix more generic FIB names for init later */
+
+#ifdef CONFIG_IP_MULTIPLE_TABLES
+struct fib_table * fib_hash_init(int id)
+#else
+struct fib_table * __init fib_hash_init(int id)
+#endif
+{
+       struct fib_table *tb;
+       struct trie *t;
+
+       if (fn_alias_kmem == NULL)
+               fn_alias_kmem = kmem_cache_create("ip_fib_alias",
+                                                 sizeof(struct fib_alias),
+                                                 0, SLAB_HWCACHE_ALIGN,
+                                                 NULL, NULL);
+
+       tb = kmalloc(sizeof(struct fib_table) + sizeof(struct trie),
+                    GFP_KERNEL);
+       if (tb == NULL)
+               return NULL;
+
+       tb->tb_id = id;
+       tb->tb_lookup = fn_trie_lookup;
+       tb->tb_insert = fn_trie_insert;
+       tb->tb_delete = fn_trie_delete;
+       tb->tb_flush = fn_trie_flush;
+       tb->tb_select_default = fn_trie_select_default;
+       tb->tb_dump = fn_trie_dump;
+       memset(tb->tb_data, 0, sizeof(struct trie));
+
+       t = (struct trie *) tb->tb_data;
+
+       trie_init(t);
+
+       if (id == RT_TABLE_LOCAL) 
+                trie_local=t;
+         else if (id == RT_TABLE_MAIN) 
+                trie_main=t;
+
+       if (id == RT_TABLE_LOCAL)
+               printk("IPv4 FIB: Using LC-trie version %s\n", VERSION);
+
+       return tb;
+}
+
+/* Trie dump functions */
+
+static void putspace_seq(struct seq_file *seq, int n)
+{
+       while (n--) seq_printf(seq, " ");
+}
+
+static void printbin_seq(struct seq_file *seq, unsigned int v, int bits)
+{
+       while (bits--)
+               seq_printf(seq, "%s", (v & (1<<bits))?"1":"0");
+}
+
+static void printnode_seq(struct seq_file *seq, int indent, struct node *n, 
+                  int pend, int cindex, int bits)
+{
+       putspace_seq(seq, indent);
+       if (IS_LEAF(n))
+               seq_printf(seq, "|");
+       else
+               seq_printf(seq, "+");
+       if (bits) {
+               seq_printf(seq, "%d/", cindex);
+               printbin_seq(seq, cindex, bits);
+               seq_printf(seq, ": ");
+       }
+       else
+               seq_printf(seq, "<root>: ");
+       seq_printf(seq, "%s:%p ", IS_LEAF(n)?"Leaf":"Internal node", n);
+
+       if (IS_LEAF(n))
+               seq_printf(seq, "key=%d.%d.%d.%d\n", 
+                          n->key >> 24, (n->key >> 16) % 256, (n->key >> 8) % 256, n->key % 256);
+       else {
+               int plen=((struct tnode *)n)->pos;
+               t_key prf=MASK_PFX(n->key, plen);
+               seq_printf(seq, "key=%d.%d.%d.%d/%d\n", 
+                          prf >> 24, (prf >> 16) % 256, (prf >> 8) % 256, prf % 256, plen);
+       }
+       if (IS_LEAF(n)) {
+               struct leaf *l=(struct leaf *)n;
+               struct fib_alias *fa;
+               int i;
+               for (i=32; i>=0; i--)
+                 if(find_leaf_info(&l->list, i)) {
+                       
+                               struct list_head *fa_head = get_fa_head(l, i);
+                               
+                               if(!fa_head)
+                                       continue;
+
+                               if(list_empty(fa_head))
+                                       continue;
+
+                               putspace_seq(seq, indent+2);
+                               seq_printf(seq, "{/%d...dumping}\n", i);
+
+
+                               list_for_each_entry(fa, fa_head, fa_list) {
+                                       putspace_seq(seq, indent+2);
+                                       if (fa->fa_info->fib_nh == NULL) {
+                                               seq_printf(seq, "Error _fib_nh=NULL\n");
+                                               continue;
+                                       }
+                                       if (fa->fa_info == NULL) {
+                                               seq_printf(seq, "Error fa_info=NULL\n");
+                                               continue;
+                                       }
+
+                                       seq_printf(seq, "{type=%d scope=%d TOS=%d}\n",
+                                             fa->fa_type,
+                                             fa->fa_scope,
+                                             fa->fa_tos);
+                               }
+                       }
+       }
+       else if (IS_TNODE(n)) {
+               struct tnode *tn=(struct tnode *)n;
+               putspace_seq(seq, indent); seq_printf(seq, "|    ");
+               seq_printf(seq, "{key prefix=%08x/", tn->key&TKEY_GET_MASK(0, tn->pos));
+               printbin_seq(seq, tkey_extract_bits(tn->key, 0, tn->pos), tn->pos);
+               seq_printf(seq, "}\n");
+               putspace_seq(seq, indent); seq_printf(seq, "|    ");
+               seq_printf(seq, "{pos=%d", tn->pos);
+               seq_printf(seq, " (skip=%d bits)", tn->pos - pend);
+               seq_printf(seq, " bits=%d (%u children)}\n", tn->bits, (1 << tn->bits));
+               putspace_seq(seq, indent); seq_printf(seq, "|    ");
+               seq_printf(seq, "{empty=%d full=%d}\n", tn->empty_children, tn->full_children);
+       }
+}
+
+static void trie_dump_seq(struct seq_file *seq, struct trie *t)
+{
+       struct node *n=t->trie;
+       int cindex=0;
+       int indent=1;
+       int pend=0;
+       int depth = 0;
+
+       read_lock(&fib_lock);
+
+       seq_printf(seq, "------ trie_dump of t=%p ------\n", t);
+       if (n) {
+               printnode_seq(seq, indent, n, pend, cindex, 0);
+               if (IS_TNODE(n)) {
+                       struct tnode *tn=(struct tnode *)n;
+                       pend = tn->pos+tn->bits;
+                       putspace_seq(seq, indent); seq_printf(seq, "\\--\n");
+                       indent += 3;
+                       depth++;
+
+                       while (tn && cindex < (1 << tn->bits)) {
+                               if (tn->child[cindex]) {
+                                       
+                                       /* Got a child */
+                                       
+                                       printnode_seq(seq, indent, tn->child[cindex], pend, cindex, tn->bits);
+                                       if (IS_LEAF(tn->child[cindex])) { 
+                                               cindex++;
+                                               
+                                       }
+                                       else {
+                                               /* 
+                                                * New tnode. Decend one level 
+                                                */
+                                               
+                                               depth++;
+                                               n=tn->child[cindex];
+                                               tn=(struct tnode *)n;
+                                               pend=tn->pos+tn->bits;
+                                               putspace_seq(seq, indent); seq_printf(seq, "\\--\n");
+                                               indent+=3;
+                                               cindex=0;
+                                       }
+                               }
+                               else 
+                                       cindex++;
+
+                               /*
+                                * Test if we are done 
+                                */
+                               
+                               while (cindex >= (1 << tn->bits)) {
+
+                                       /*
+                                        * Move upwards and test for root
+                                        * pop off all traversed  nodes
+                                        */
+                                       
+                                       if (NODE_PARENT(tn) == NULL) {
+                                               tn = NULL;
+                                               n = NULL;
+                                               break;
+                                       }
+                                       else {
+                                               cindex = tkey_extract_bits(tn->key, NODE_PARENT(tn)->pos, NODE_PARENT(tn)->bits);
+                                               tn = NODE_PARENT(tn);
+                                               cindex++;
+                                               n=(struct node *)tn;
+                                               pend=tn->pos+tn->bits;
+                                               indent-=3;
+                                               depth--;
+                                       }
+                               }
+                       }
+               }
+               else n = NULL;
+       }
+       else seq_printf(seq, "------ trie is empty\n");
+
+       read_unlock(&fib_lock);
+}
+
+static struct trie_stat *trie_stat_new(void)
+{
+       struct trie_stat *s = kmalloc(sizeof(struct trie_stat), GFP_KERNEL);
+       int i;
+       
+       if(s) {
+               s->totdepth = 0;
+               s->maxdepth = 0;
+               s->tnodes = 0;
+               s->leaves = 0;
+               s->nullpointers = 0;
+               
+               for(i=0; i< MAX_CHILDS; i++)
+                       s->nodesizes[i] = 0;
+       }
+       return s;
+}    
+
+static struct trie_stat *trie_collect_stats(struct trie *t)
+{
+       struct node *n=t->trie;
+       struct trie_stat *s = trie_stat_new();
+       int cindex = 0;
+       int indent = 1;
+       int pend = 0;
+       int depth = 0;
+
+       read_lock(&fib_lock);           
+
+       if (s) {
+               if (n) {
+                       if (IS_TNODE(n)) {
+                               struct tnode *tn = (struct tnode *)n;
+                               pend=tn->pos+tn->bits;
+                               indent += 3;
+                               s->nodesizes[tn->bits]++;
+                               depth++;
+
+                               while (tn && cindex < (1 << tn->bits)) {
+                                       if (tn->child[cindex]) {
+                                               /* Got a child */
+                                       
+                                               if (IS_LEAF(tn->child[cindex])) { 
+                                                       cindex++;
+                                               
+                                                       /* stats */
+                                                       if (depth > s->maxdepth)
+                                                               s->maxdepth = depth;
+                                                       s->totdepth += depth;
+                                                       s->leaves++;
+                                               }
+                                       
+                                               else {
+                                                       /* 
+                                                        * New tnode. Decend one level 
+                                                        */
+                                               
+                                                       s->tnodes++;
+                                                       s->nodesizes[tn->bits]++;
+                                                       depth++;
+                                               
+                                                       n = tn->child[cindex];
+                                                       tn = (struct tnode *)n;
+                                                       pend = tn->pos+tn->bits;
+
+                                                       indent += 3;
+                                                       cindex = 0;
+                                               }
+                                       }
+                                       else {
+                                               cindex++;
+                                               s->nullpointers++; 
+                                       }
+
+                                       /*
+                                        * Test if we are done 
+                                        */
+                               
+                                       while (cindex >= (1 << tn->bits)) {
+
+                                               /*
+                                                * Move upwards and test for root
+                                                * pop off all traversed  nodes
+                                                */
+
+                                               
+                                               if (NODE_PARENT(tn) == NULL) {
+                                                       tn = NULL;
+                                                       n = NULL;
+                                                       break;
+                                               }
+                                               else {
+                                                       cindex = tkey_extract_bits(tn->key, NODE_PARENT(tn)->pos, NODE_PARENT(tn)->bits);
+                                                       tn = NODE_PARENT(tn);
+                                                       cindex++; 
+                                                       n = (struct node *)tn;
+                                                       pend=tn->pos+tn->bits;
+                                                       indent -= 3;
+                                                       depth--;
+                                               }
+                                       }
+                               }
+                       }
+                       else n = NULL;
+               }
+       }
+
+       read_unlock(&fib_lock);         
+       return s;
+}
+
+#ifdef CONFIG_PROC_FS
+
+static struct fib_alias *fib_triestat_get_first(struct seq_file *seq)
+{
+       return NULL;
+}
+
+static struct fib_alias *fib_triestat_get_next(struct seq_file *seq)
+{
+       return NULL;
+}
+
+static void *fib_triestat_seq_start(struct seq_file *seq, loff_t *pos)
+{
+       void *v = NULL;
+
+       if (ip_fib_main_table)
+               v = *pos ? fib_triestat_get_next(seq) : SEQ_START_TOKEN;
+       return v;
+}
+
+static void *fib_triestat_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+{
+       ++*pos;
+       return v == SEQ_START_TOKEN ? fib_triestat_get_first(seq) : fib_triestat_get_next(seq);
+}
+
+static void fib_triestat_seq_stop(struct seq_file *seq, void *v)
+{
+
+}
+
+/* 
+ *     This outputs /proc/net/fib_triestats
+ *
+ *     It always works in backward compatibility mode.
+ *     The format of the file is not supposed to be changed.
+ */
+
+static void collect_and_show(struct trie *t, struct seq_file *seq)
+{
+       int bytes = 0; /* How many bytes are used, a ref is 4 bytes */
+       int i, max, pointers;
+        struct trie_stat *stat;
+       int avdepth;
+
+       stat = trie_collect_stats(t);
+
+       bytes=0;
+       seq_printf(seq, "trie=%p\n", t);
+
+       if (stat) {
+               if (stat->leaves)
+                       avdepth=stat->totdepth*100 / stat->leaves;
+               else
+                       avdepth=0;
+               seq_printf(seq, "Aver depth: %d.%02d\n", avdepth / 100, avdepth % 100 );
+               seq_printf(seq, "Max depth: %4d\n", stat->maxdepth);
+                               
+               seq_printf(seq, "Leaves: %d\n", stat->leaves);
+               bytes += sizeof(struct leaf) * stat->leaves;
+               seq_printf(seq, "Internal nodes: %d\n", stat->tnodes);
+               bytes += sizeof(struct tnode) * stat->tnodes;
+
+               max = MAX_CHILDS-1;
+
+               while (max >= 0 && stat->nodesizes[max] == 0)
+                       max--;
+               pointers = 0;
+
+               for (i = 1; i <= max; i++) 
+                       if (stat->nodesizes[i] != 0) {
+                               seq_printf(seq, "  %d: %d",  i, stat->nodesizes[i]);
+                               pointers += (1<<i) * stat->nodesizes[i];
+                       }
+               seq_printf(seq, "\n");
+               seq_printf(seq, "Pointers: %d\n", pointers);
+               bytes += sizeof(struct node *) * pointers;
+               seq_printf(seq, "Null ptrs: %d\n", stat->nullpointers);
+               seq_printf(seq, "Total size: %d  kB\n", bytes / 1024);
+
+               kfree(stat);
+       }
+
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+       seq_printf(seq, "Counters:\n---------\n");
+       seq_printf(seq,"gets = %d\n", t->stats.gets);
+       seq_printf(seq,"backtracks = %d\n", t->stats.backtrack);
+       seq_printf(seq,"semantic match passed = %d\n", t->stats.semantic_match_passed);
+       seq_printf(seq,"semantic match miss = %d\n", t->stats.semantic_match_miss);
+       seq_printf(seq,"null node hit= %d\n", t->stats.null_node_hit);
+#ifdef CLEAR_STATS
+       memset(&(t->stats), 0, sizeof(t->stats));
+#endif
+#endif /*  CONFIG_IP_FIB_TRIE_STATS */
+}
+
+static int fib_triestat_seq_show(struct seq_file *seq, void *v)
+{
+       char bf[128];
+    
+       if (v == SEQ_START_TOKEN) {
+               seq_printf(seq, "Basic info: size of leaf: %Zd bytes, size of tnode: %Zd bytes.\n", 
+                          sizeof(struct leaf), sizeof(struct tnode));
+               if (trie_local) 
+                       collect_and_show(trie_local, seq);
+
+               if (trie_main) 
+                       collect_and_show(trie_main, seq);
+       }
+       else {
+               snprintf(bf, sizeof(bf),
+                        "*\t%08X\t%08X", 200, 400);
+               
+               seq_printf(seq, "%-127s\n", bf);
+       }
+       return 0;
+}
+
+static struct seq_operations fib_triestat_seq_ops = {
+       .start  = fib_triestat_seq_start,
+       .next   = fib_triestat_seq_next,
+       .stop   = fib_triestat_seq_stop,
+       .show   = fib_triestat_seq_show,
+};
+
+static int fib_triestat_seq_open(struct inode *inode, struct file *file)
+{
+       struct seq_file *seq;
+       int rc = -ENOMEM;
+
+       rc = seq_open(file, &fib_triestat_seq_ops);
+       if (rc)
+               goto out_kfree;
+
+       seq          = file->private_data;
+out:
+       return rc;
+out_kfree:
+       goto out;
+}
+
+static struct file_operations fib_triestat_seq_fops = {
+       .owner          = THIS_MODULE,
+       .open           = fib_triestat_seq_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = seq_release_private,
+};
+
+int __init fib_stat_proc_init(void)
+{
+       if (!proc_net_fops_create("fib_triestat", S_IRUGO, &fib_triestat_seq_fops))
+               return -ENOMEM;
+       return 0;
+}
+
+void __init fib_stat_proc_exit(void)
+{
+       proc_net_remove("fib_triestat");
+}
+
+static struct fib_alias *fib_trie_get_first(struct seq_file *seq)
+{
+       return NULL;
+}
+
+static struct fib_alias *fib_trie_get_next(struct seq_file *seq)
+{
+       return NULL;
+}
+
+static void *fib_trie_seq_start(struct seq_file *seq, loff_t *pos)
+{
+       void *v = NULL;
+
+       if (ip_fib_main_table)
+               v = *pos ? fib_trie_get_next(seq) : SEQ_START_TOKEN;
+       return v;
+}
+
+static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+{
+       ++*pos;
+       return v == SEQ_START_TOKEN ? fib_trie_get_first(seq) : fib_trie_get_next(seq);
+}
+
+static void fib_trie_seq_stop(struct seq_file *seq, void *v)
+{
+
+}
+
+/* 
+ *     This outputs /proc/net/fib_trie.
+ *
+ *     It always works in backward compatibility mode.
+ *     The format of the file is not supposed to be changed.
+ */
+
+static int fib_trie_seq_show(struct seq_file *seq, void *v)
+{
+       char bf[128];
+
+       if (v == SEQ_START_TOKEN) {
+               if (trie_local) 
+                       trie_dump_seq(seq, trie_local);
+
+               if (trie_main) 
+                       trie_dump_seq(seq, trie_main);
+       }
+
+       else {
+               snprintf(bf, sizeof(bf),
+                        "*\t%08X\t%08X", 200, 400);
+               seq_printf(seq, "%-127s\n", bf);
+       }
+
+       return 0;
+}
+
+static struct seq_operations fib_trie_seq_ops = {
+       .start  = fib_trie_seq_start,
+       .next   = fib_trie_seq_next,
+       .stop   = fib_trie_seq_stop,
+       .show   = fib_trie_seq_show,
+};
+
+static int fib_trie_seq_open(struct inode *inode, struct file *file)
+{
+       struct seq_file *seq;
+       int rc = -ENOMEM;
+
+       rc = seq_open(file, &fib_trie_seq_ops);
+       if (rc)
+               goto out_kfree;
+
+       seq          = file->private_data;
+out:
+       return rc;
+out_kfree:
+       goto out;
+}
+
+static struct file_operations fib_trie_seq_fops = {
+       .owner          = THIS_MODULE,
+       .open           = fib_trie_seq_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = seq_release_private,
+};
+
+int __init fib_proc_init(void)
+{
+       if (!proc_net_fops_create("fib_trie", S_IRUGO, &fib_trie_seq_fops))
+               return -ENOMEM;
+       return 0;
+}
+
+void __init fib_proc_exit(void)
+{
+       proc_net_remove("fib_trie");
+}
+
+#endif /* CONFIG_PROC_FS */
index 85bf0d3e294b2c6d5da9fe721904ff07f2c47567..cb759484979d94d46d946a66cca3ef4bf87d84a1 100644 (file)
@@ -207,6 +207,7 @@ int sysctl_icmp_ignore_bogus_error_responses;
 
 int sysctl_icmp_ratelimit = 1 * HZ;
 int sysctl_icmp_ratemask = 0x1818;
+int sysctl_icmp_errors_use_inbound_ifaddr;
 
 /*
  *     ICMP control array. This specifies what to do with each ICMP.
@@ -511,8 +512,12 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, u32 info)
         */
 
        saddr = iph->daddr;
-       if (!(rt->rt_flags & RTCF_LOCAL))
-               saddr = 0;
+       if (!(rt->rt_flags & RTCF_LOCAL)) {
+               if (sysctl_icmp_errors_use_inbound_ifaddr)
+                       saddr = inet_select_addr(skb_in->dev, 0, RT_SCOPE_LINK);
+               else
+                       saddr = 0;
+       }
 
        tos = icmp_pointers[type].error ? ((iph->tos & IPTOS_TOS_MASK) |
                                           IPTOS_PREC_INTERNETCONTROL) :
index 4e47a2658c7cd3444f6bf10ec769f9fc726859fb..af2ec88bbb2fc1ae4c841f7168780f95f2e2aedb 100644 (file)
@@ -184,6 +184,7 @@ int ip_call_ra_chain(struct sk_buff *skb)
                                        raw_rcv(last, skb2);
                        }
                        last = sk;
+                       nf_reset(skb);
                }
        }
 
@@ -200,10 +201,6 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
 {
        int ihl = skb->nh.iph->ihl*4;
 
-#ifdef CONFIG_NETFILTER_DEBUG
-       nf_debug_ip_local_deliver(skb);
-#endif /*CONFIG_NETFILTER_DEBUG*/
-
        __skb_pull(skb, ihl);
 
        /* Free reference early: we don't need it any more, and it may
index daebd93fd8a06b648bbc725b86af47a01040b741..ee07aec215a060fa3b980d0c88d8158a9638404b 100644 (file)
@@ -107,10 +107,6 @@ static int ip_dev_loopback_xmit(struct sk_buff *newskb)
        newskb->pkt_type = PACKET_LOOPBACK;
        newskb->ip_summed = CHECKSUM_UNNECESSARY;
        BUG_TRAP(newskb->dst);
-
-#ifdef CONFIG_NETFILTER_DEBUG
-       nf_debug_ip_loopback_xmit(newskb);
-#endif
        nf_reset(newskb);
        netif_rx(newskb);
        return 0;
@@ -192,10 +188,6 @@ static inline int ip_finish_output2(struct sk_buff *skb)
                skb = skb2;
        }
 
-#ifdef CONFIG_NETFILTER_DEBUG
-       nf_debug_ip_finish_output2(skb);
-#endif /*CONFIG_NETFILTER_DEBUG*/
-
        nf_reset(skb);
 
        if (hh) {
@@ -415,9 +407,6 @@ static void ip_copy_metadata(struct sk_buff *to, struct sk_buff *from)
        to->nf_bridge = from->nf_bridge;
        nf_bridge_get(to->nf_bridge);
 #endif
-#ifdef CONFIG_NETFILTER_DEBUG
-       to->nf_debug = from->nf_debug;
-#endif
 #endif
 }
 
@@ -490,6 +479,14 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
                        /* Partially cloned skb? */
                        if (skb_shared(frag))
                                goto slow_path;
+
+                       BUG_ON(frag->sk);
+                       if (skb->sk) {
+                               sock_hold(skb->sk);
+                               frag->sk = skb->sk;
+                               frag->destructor = sock_wfree;
+                               skb->truesize -= frag->truesize;
+                       }
                }
 
                /* Everything is OK. Generate! */
index 47012b93cad2e58c5b28dbdcb899e68006085e79..f8b172f89811d2b6fa2d9a762e1a20d47679b36b 100644 (file)
@@ -360,14 +360,14 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len)
        err = copied;
 
        /* Reset and regenerate socket error */
-       spin_lock_irq(&sk->sk_error_queue.lock);
+       spin_lock_bh(&sk->sk_error_queue.lock);
        sk->sk_err = 0;
        if ((skb2 = skb_peek(&sk->sk_error_queue)) != NULL) {
                sk->sk_err = SKB_EXT_ERR(skb2)->ee.ee_errno;
-               spin_unlock_irq(&sk->sk_error_queue.lock);
+               spin_unlock_bh(&sk->sk_error_queue.lock);
                sk->sk_error_report(sk);
        } else
-               spin_unlock_irq(&sk->sk_error_queue.lock);
+               spin_unlock_bh(&sk->sk_error_queue.lock);
 
 out_free_skb:  
        kfree_skb(skb);
index 1a23c5263b993a9004aea0518216de263178f63b..2065944fd9e5117739ed1f2aeed2c2c59cf50151 100644 (file)
@@ -236,15 +236,10 @@ static struct xfrm_state *ipcomp_tunnel_create(struct xfrm_state *x)
        t->props.mode = 1;
        t->props.saddr.a4 = x->props.saddr.a4;
        t->props.flags = x->props.flags;
-       
-       t->type = xfrm_get_type(IPPROTO_IPIP, t->props.family);
-       if (t->type == NULL)
-               goto error;
-               
-       if (t->type->init_state(t, NULL))
+
+       if (xfrm_init_state(t))
                goto error;
 
-       t->km.state = XFRM_STATE_VALID;
        atomic_set(&t->tunnel_users, 1);
 out:
        return t;
@@ -422,7 +417,7 @@ static void ipcomp_destroy(struct xfrm_state *x)
        kfree(ipcd);
 }
 
-static int ipcomp_init_state(struct xfrm_state *x, void *args)
+static int ipcomp_init_state(struct xfrm_state *x)
 {
        int err;
        struct ipcomp_data *ipcd;
index e21c049ec62aeb0259791a732a88ecebfee94b8c..e4f809a93f4701efbb3f68eec77e00593ad01f7c 100644 (file)
@@ -1350,6 +1350,7 @@ int ip_mr_input(struct sk_buff *skb)
                             */
                            read_lock(&mrt_lock);
                            if (mroute_socket) {
+                                   nf_reset(skb);
                                    raw_rcv(mroute_socket, skb);
                                    read_unlock(&mrt_lock);
                                    return 0;
index a788461a40c9228688dcc42ce72f5a7543339140..30e85de9fffff03662455d2357b5d384135d3db0 100644 (file)
@@ -11,7 +11,7 @@ ip_vs_proto-objs-$(CONFIG_IP_VS_PROTO_AH) += ip_vs_proto_ah.o
 
 ip_vs-objs :=  ip_vs_conn.o ip_vs_core.o ip_vs_ctl.o ip_vs_sched.o        \
                ip_vs_xmit.o ip_vs_app.o ip_vs_sync.o                      \
-               ip_vs_est.o ip_vs_proto.o ip_vs_proto_icmp.o               \
+               ip_vs_est.o ip_vs_proto.o                                  \
                $(ip_vs_proto-objs-y)
 
 
index 253c46252bd5b1dfeae6382c94a2eaf7340278ae..867d4e9c6594c3a62eb70475d6b2c26cfe74c2ca 100644 (file)
@@ -216,9 +216,6 @@ int ip_vs_protocol_init(void)
 #ifdef CONFIG_IP_VS_PROTO_UDP
        REGISTER_PROTOCOL(&ip_vs_protocol_udp);
 #endif
-#ifdef CONFIG_IP_VS_PROTO_ICMP
-       REGISTER_PROTOCOL(&ip_vs_protocol_icmp);
-#endif
 #ifdef CONFIG_IP_VS_PROTO_AH
        REGISTER_PROTOCOL(&ip_vs_protocol_ah);
 #endif
diff --git a/net/ipv4/ipvs/ip_vs_proto_icmp.c b/net/ipv4/ipvs/ip_vs_proto_icmp.c
deleted file mode 100644 (file)
index 191e94a..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * ip_vs_proto_icmp.c: ICMP load balancing support for IP Virtual Server
- *
- * Authors:    Julian Anastasov <ja@ssi.bg>, March 2002
- *
- *             This program is free software; you can redistribute it and/or
- *             modify it under the terms of the GNU General Public License
- *             version 2 as published by the Free Software Foundation;
- *
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/icmp.h>
-#include <linux/netfilter.h>
-#include <linux/netfilter_ipv4.h>
-
-#include <net/ip_vs.h>
-
-
-static int icmp_timeouts[1] =          { 1*60*HZ };
-
-static char * icmp_state_name_table[1] = { "ICMP" };
-
-static struct ip_vs_conn *
-icmp_conn_in_get(const struct sk_buff *skb,
-                struct ip_vs_protocol *pp,
-                const struct iphdr *iph,
-                unsigned int proto_off,
-                int inverse)
-{
-#if 0
-       struct ip_vs_conn *cp;
-
-       if (likely(!inverse)) {
-               cp = ip_vs_conn_in_get(iph->protocol,
-                       iph->saddr, 0,
-                       iph->daddr, 0);
-       } else {
-               cp = ip_vs_conn_in_get(iph->protocol,
-                       iph->daddr, 0,
-                       iph->saddr, 0);
-       }
-
-       return cp;
-
-#else
-       return NULL;
-#endif
-}
-
-static struct ip_vs_conn *
-icmp_conn_out_get(const struct sk_buff *skb,
-                 struct ip_vs_protocol *pp,
-                 const struct iphdr *iph,
-                 unsigned int proto_off,
-                 int inverse)
-{
-#if 0
-       struct ip_vs_conn *cp;
-
-       if (likely(!inverse)) {
-               cp = ip_vs_conn_out_get(iph->protocol,
-                       iph->saddr, 0,
-                       iph->daddr, 0);
-       } else {
-               cp = ip_vs_conn_out_get(IPPROTO_UDP,
-                       iph->daddr, 0,
-                       iph->saddr, 0);
-       }
-
-       return cp;
-#else
-       return NULL;
-#endif
-}
-
-static int
-icmp_conn_schedule(struct sk_buff *skb, struct ip_vs_protocol *pp,
-                  int *verdict, struct ip_vs_conn **cpp)
-{
-       *verdict = NF_ACCEPT;
-       return 0;
-}
-
-static int
-icmp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp)
-{
-       if (!(skb->nh.iph->frag_off & __constant_htons(IP_OFFSET))) {
-               if (skb->ip_summed != CHECKSUM_UNNECESSARY) {
-                       if (ip_vs_checksum_complete(skb, skb->nh.iph->ihl * 4)) {
-                               IP_VS_DBG_RL_PKT(0, pp, skb, 0, "Failed checksum for");
-                               return 0;
-                       }
-               }
-       }
-       return 1;
-}
-
-static void
-icmp_debug_packet(struct ip_vs_protocol *pp,
-                 const struct sk_buff *skb,
-                 int offset,
-                 const char *msg)
-{
-       char buf[256];
-       struct iphdr _iph, *ih;
-
-       ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
-       if (ih == NULL)
-               sprintf(buf, "%s TRUNCATED", pp->name);
-       else if (ih->frag_off & __constant_htons(IP_OFFSET))
-               sprintf(buf, "%s %u.%u.%u.%u->%u.%u.%u.%u frag",
-                       pp->name, NIPQUAD(ih->saddr),
-                       NIPQUAD(ih->daddr));
-       else {
-               struct icmphdr _icmph, *ic;
-
-               ic = skb_header_pointer(skb, offset + ih->ihl*4,
-                                       sizeof(_icmph), &_icmph);
-               if (ic == NULL)
-                       sprintf(buf, "%s TRUNCATED to %u bytes\n",
-                               pp->name, skb->len - offset);
-               else
-                       sprintf(buf, "%s %u.%u.%u.%u->%u.%u.%u.%u T:%d C:%d",
-                               pp->name, NIPQUAD(ih->saddr),
-                               NIPQUAD(ih->daddr),
-                               ic->type, ic->code);
-       }
-       printk(KERN_DEBUG "IPVS: %s: %s\n", msg, buf);
-}
-
-static int
-icmp_state_transition(struct ip_vs_conn *cp, int direction,
-                     const struct sk_buff *skb,
-                     struct ip_vs_protocol *pp)
-{
-       cp->timeout = pp->timeout_table[IP_VS_ICMP_S_NORMAL];
-       return 1;
-}
-
-static int
-icmp_set_state_timeout(struct ip_vs_protocol *pp, char *sname, int to)
-{
-       int num;
-       char **names;
-
-       num = IP_VS_ICMP_S_LAST;
-       names = icmp_state_name_table;
-       return ip_vs_set_state_timeout(pp->timeout_table, num, names, sname, to);
-}
-
-
-static void icmp_init(struct ip_vs_protocol *pp)
-{
-       pp->timeout_table = icmp_timeouts;
-}
-
-static void icmp_exit(struct ip_vs_protocol *pp)
-{
-}
-
-struct ip_vs_protocol ip_vs_protocol_icmp = {
-       .name =                 "ICMP",
-       .protocol =             IPPROTO_ICMP,
-       .dont_defrag =          0,
-       .init =                 icmp_init,
-       .exit =                 icmp_exit,
-       .conn_schedule =        icmp_conn_schedule,
-       .conn_in_get =          icmp_conn_in_get,
-       .conn_out_get =         icmp_conn_out_get,
-       .snat_handler =         NULL,
-       .dnat_handler =         NULL,
-       .csum_check =           icmp_csum_check,
-       .state_transition =     icmp_state_transition,
-       .register_app =         NULL,
-       .unregister_app =       NULL,
-       .app_conn_bind =        NULL,
-       .debug_packet =         icmp_debug_packet,
-       .timeout_change =       NULL,
-       .set_state_timeout =    icmp_set_state_timeout,
-};
index faa6176bbeb195eb37329964d092c377a2489890..a8512a3fd08a02503aae30187f07f6b81ff9732c 100644 (file)
@@ -127,7 +127,6 @@ ip_vs_dst_reset(struct ip_vs_dest *dest)
 
 #define IP_VS_XMIT(skb, rt)                            \
 do {                                                   \
-       nf_reset_debug(skb);                            \
        (skb)->nfcache |= NFC_IPVS_PROPERTY;            \
        (skb)->ip_summed = CHECKSUM_NONE;               \
        NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, (skb), NULL,  \
@@ -508,7 +507,6 @@ ip_vs_icmp_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
                        rc = NF_ACCEPT;
                /* do not touch skb anymore */
                atomic_inc(&cp->in_pkts);
-               __ip_vs_conn_put(cp);
                goto out;
        }
 
index 9349686131fcf2552a748913675dab743f6bc733..c9cf8726051d7cae07a3d1278b0bea36b1c2eee5 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/igmp.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
+#include <linux/module.h>
 #include <linux/mroute.h>
 #include <linux/init.h>
 #include <net/ip.h>
@@ -57,7 +58,6 @@ struct multipath_device {
 
 static struct multipath_device state[MULTIPATH_MAX_DEVICECANDIDATES];
 static DEFINE_SPINLOCK(state_lock);
-static struct rtable *last_selection = NULL;
 
 static int inline __multipath_findslot(void)
 {
@@ -111,11 +111,6 @@ struct notifier_block drr_dev_notifier = {
        .notifier_call  = drr_dev_event,
 };
 
-static void drr_remove(struct rtable *rt)
-{
-       if (last_selection == rt)
-               last_selection = NULL;
-}
 
 static void drr_safe_inc(atomic_t *usecount)
 {
@@ -144,14 +139,6 @@ static void drr_select_route(const struct flowi *flp,
        int devidx = -1;
        int cur_min_devidx = -1;
 
-               /* if necessary and possible utilize the old alternative */
-       if ((flp->flags & FLOWI_FLAG_MULTIPATHOLDROUTE) != 0 &&
-           last_selection != NULL) {
-               result = last_selection;
-               *rp = result;
-               return;
-       }
-
        /* 1. make sure all alt. nexthops have the same GC related data */
        /* 2. determine the new candidate to be returned */
        result = NULL;
@@ -229,12 +216,10 @@ static void drr_select_route(const struct flowi *flp,
        }
 
        *rp = result;
-       last_selection = result;
 }
 
 static struct ip_mp_alg_ops drr_ops = {
        .mp_alg_select_route    =       drr_select_route,
-       .mp_alg_remove          =       drr_remove,
 };
 
 static int __init drr_init(void)
@@ -244,7 +229,7 @@ static int __init drr_init(void)
        if (err)
                return err;
 
-       err = multipath_alg_register(&drr_ops, IP_MP_ALG_RR);
+       err = multipath_alg_register(&drr_ops, IP_MP_ALG_DRR);
        if (err)
                goto fail;
 
@@ -263,3 +248,4 @@ static void __exit drr_exit(void)
 
 module_init(drr_init);
 module_exit(drr_exit);
+MODULE_LICENSE("GPL");
index 805a16e47de5ff9f35f2623dd0fc3e524aac18c5..5249dbe7c559f90fce4671405954a415aebb3b4c 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/igmp.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
+#include <linux/module.h>
 #include <linux/mroute.h>
 #include <linux/init.h>
 #include <net/ip.h>
@@ -126,3 +127,4 @@ static void __exit random_exit(void)
 
 module_init(random_init);
 module_exit(random_exit);
+MODULE_LICENSE("GPL");
index 554a8256816027bbbeb60c16db62ff6a4e44de29..b6cd2870478f9db2700e5a49839f07782ac758da 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/igmp.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
+#include <linux/module.h>
 #include <linux/mroute.h>
 #include <linux/init.h>
 #include <net/ip.h>
 #include <net/checksum.h>
 #include <net/ip_mp_alg.h>
 
-#define MULTIPATH_MAX_CANDIDATES 40
-
-static struct rtable* last_used = NULL;
-
-static void rr_remove(struct rtable *rt)
-{
-       if (last_used == rt)
-               last_used = NULL;
-}
-
 static void rr_select_route(const struct flowi *flp,
                            struct rtable *first, struct rtable **rp)
 {
        struct rtable *nh, *result, *min_use_cand = NULL;
        int min_use = -1;
 
-       /* if necessary and possible utilize the old alternative */
-       if ((flp->flags & FLOWI_FLAG_MULTIPATHOLDROUTE) != 0 &&
-           last_used != NULL) {
-               result = last_used;
-               goto out;
-       }
-
        /* 1. make sure all alt. nexthops have the same GC related data
         * 2. determine the new candidate to be returned
         */
@@ -90,15 +74,12 @@ static void rr_select_route(const struct flowi *flp,
        if (!result)
                result = first;
 
-out:
-       last_used = result;
        result->u.dst.__use++;
        *rp = result;
 }
 
 static struct ip_mp_alg_ops rr_ops = {
        .mp_alg_select_route    =       rr_select_route,
-       .mp_alg_remove          =       rr_remove,
 };
 
 static int __init rr_init(void)
@@ -113,3 +94,4 @@ static void __exit rr_exit(void)
 
 module_init(rr_init);
 module_exit(rr_exit);
+MODULE_LICENSE("GPL");
index c3d2ca1a6781513bc7b2524aad96f61e7a4053a6..bd7d75b6abe0a6a7e1ed63d78b5d18becf3eb961 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/igmp.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
+#include <linux/module.h>
 #include <linux/mroute.h>
 #include <linux/init.h>
 #include <net/ip.h>
@@ -342,3 +343,4 @@ static void __exit wrandom_exit(void)
 
 module_init(wrandom_init);
 module_exit(wrandom_exit);
+MODULE_LICENSE("GPL");
index df79f5ed6a0a3e73e5e2b8361ff36ffe54044aaa..fa1634256680d88f524727da2b48fdfe92360732 100644 (file)
@@ -60,7 +60,6 @@ static DECLARE_MUTEX(arpt_mutex);
 
 #define ASSERT_READ_LOCK(x) ARP_NF_ASSERT(down_trylock(&arpt_mutex) != 0)
 #define ASSERT_WRITE_LOCK(x) ARP_NF_ASSERT(down_trylock(&arpt_mutex) != 0)
-#include <linux/netfilter_ipv4/lockhelp.h>
 #include <linux/netfilter_ipv4/listhelp.h>
 
 struct arpt_table_info {
index 3dbddd062605a73fcb0d09a727aab0f521d18107..a78a320eee082802eebb99d0b468eda935160934 100644 (file)
@@ -26,7 +26,6 @@
 #include <net/checksum.h>
 #include <net/udp.h>
 
-#include <linux/netfilter_ipv4/lockhelp.h>
 #include <linux/netfilter_ipv4/ip_conntrack_helper.h>
 #include <linux/netfilter_ipv4/ip_conntrack_amanda.h>
 
@@ -42,7 +41,7 @@ static char *conns[] = { "DATA ", "MESG ", "INDEX " };
 
 /* This is slow, but it's simple. --RR */
 static char amanda_buffer[65536];
-static DECLARE_LOCK(amanda_buffer_lock);
+static DEFINE_SPINLOCK(amanda_buffer_lock);
 
 unsigned int (*ip_nat_amanda_hook)(struct sk_buff **pskb,
                                   enum ip_conntrack_info ctinfo,
@@ -76,7 +75,7 @@ static int help(struct sk_buff **pskb,
                return NF_ACCEPT;
        }
 
-       LOCK_BH(&amanda_buffer_lock);
+       spin_lock_bh(&amanda_buffer_lock);
        skb_copy_bits(*pskb, dataoff, amanda_buffer, (*pskb)->len - dataoff);
        data = amanda_buffer;
        data_limit = amanda_buffer + (*pskb)->len - dataoff;
@@ -134,7 +133,7 @@ static int help(struct sk_buff **pskb,
        }
 
 out:
-       UNLOCK_BH(&amanda_buffer_lock);
+       spin_unlock_bh(&amanda_buffer_lock);
        return ret;
 }
 
index 28d9425d5c390dac7601953e65043e973833e7aa..4b78ebeb66350e9616bf03d6468fc039b53716e6 100644 (file)
 #include <linux/percpu.h>
 #include <linux/moduleparam.h>
 
-/* This rwlock protects the main hash table, protocol/helper/expected
+/* ip_conntrack_lock protects the main hash table, protocol/helper/expected
    registrations, conntrack timers*/
-#define ASSERT_READ_LOCK(x) MUST_BE_READ_LOCKED(&ip_conntrack_lock)
-#define ASSERT_WRITE_LOCK(x) MUST_BE_WRITE_LOCKED(&ip_conntrack_lock)
+#define ASSERT_READ_LOCK(x)
+#define ASSERT_WRITE_LOCK(x)
 
 #include <linux/netfilter_ipv4/ip_conntrack.h>
 #include <linux/netfilter_ipv4/ip_conntrack_protocol.h>
@@ -57,7 +57,7 @@
 #define DEBUGP(format, args...)
 #endif
 
-DECLARE_RWLOCK(ip_conntrack_lock);
+DEFINE_RWLOCK(ip_conntrack_lock);
 
 /* ip_conntrack_standalone needs this */
 atomic_t ip_conntrack_count = ATOMIC_INIT(0);
@@ -147,7 +147,7 @@ static void destroy_expect(struct ip_conntrack_expect *exp)
 
 static void unlink_expect(struct ip_conntrack_expect *exp)
 {
-       MUST_BE_WRITE_LOCKED(&ip_conntrack_lock);
+       ASSERT_WRITE_LOCK(&ip_conntrack_lock);
        list_del(&exp->list);
        /* Logically in destroy_expect, but we hold the lock here. */
        exp->master->expecting--;
@@ -157,9 +157,9 @@ static void expectation_timed_out(unsigned long ul_expect)
 {
        struct ip_conntrack_expect *exp = (void *)ul_expect;
 
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
        unlink_expect(exp);
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
        destroy_expect(exp);
 }
 
@@ -209,7 +209,7 @@ clean_from_lists(struct ip_conntrack *ct)
        unsigned int ho, hr;
        
        DEBUGP("clean_from_lists(%p)\n", ct);
-       MUST_BE_WRITE_LOCKED(&ip_conntrack_lock);
+       ASSERT_WRITE_LOCK(&ip_conntrack_lock);
 
        ho = hash_conntrack(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple);
        hr = hash_conntrack(&ct->tuplehash[IP_CT_DIR_REPLY].tuple);
@@ -240,7 +240,7 @@ destroy_conntrack(struct nf_conntrack *nfct)
        if (ip_conntrack_destroyed)
                ip_conntrack_destroyed(ct);
 
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
        /* Expectations will have been removed in clean_from_lists,
         * except TFTP can create an expectation on the first packet,
         * before connection is in the list, so we need to clean here,
@@ -254,7 +254,7 @@ destroy_conntrack(struct nf_conntrack *nfct)
        }
 
        CONNTRACK_STAT_INC(delete);
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
 
        if (ct->master)
                ip_conntrack_put(ct->master);
@@ -268,12 +268,12 @@ static void death_by_timeout(unsigned long ul_conntrack)
 {
        struct ip_conntrack *ct = (void *)ul_conntrack;
 
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
        /* Inside lock so preempt is disabled on module removal path.
         * Otherwise we can get spurious warnings. */
        CONNTRACK_STAT_INC(delete_list);
        clean_from_lists(ct);
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
        ip_conntrack_put(ct);
 }
 
@@ -282,7 +282,7 @@ conntrack_tuple_cmp(const struct ip_conntrack_tuple_hash *i,
                    const struct ip_conntrack_tuple *tuple,
                    const struct ip_conntrack *ignored_conntrack)
 {
-       MUST_BE_READ_LOCKED(&ip_conntrack_lock);
+       ASSERT_READ_LOCK(&ip_conntrack_lock);
        return tuplehash_to_ctrack(i) != ignored_conntrack
                && ip_ct_tuple_equal(tuple, &i->tuple);
 }
@@ -294,7 +294,7 @@ __ip_conntrack_find(const struct ip_conntrack_tuple *tuple,
        struct ip_conntrack_tuple_hash *h;
        unsigned int hash = hash_conntrack(tuple);
 
-       MUST_BE_READ_LOCKED(&ip_conntrack_lock);
+       ASSERT_READ_LOCK(&ip_conntrack_lock);
        list_for_each_entry(h, &ip_conntrack_hash[hash], list) {
                if (conntrack_tuple_cmp(h, tuple, ignored_conntrack)) {
                        CONNTRACK_STAT_INC(found);
@@ -313,11 +313,11 @@ ip_conntrack_find_get(const struct ip_conntrack_tuple *tuple,
 {
        struct ip_conntrack_tuple_hash *h;
 
-       READ_LOCK(&ip_conntrack_lock);
+       read_lock_bh(&ip_conntrack_lock);
        h = __ip_conntrack_find(tuple, ignored_conntrack);
        if (h)
                atomic_inc(&tuplehash_to_ctrack(h)->ct_general.use);
-       READ_UNLOCK(&ip_conntrack_lock);
+       read_unlock_bh(&ip_conntrack_lock);
 
        return h;
 }
@@ -352,7 +352,7 @@ __ip_conntrack_confirm(struct sk_buff **pskb)
        IP_NF_ASSERT(!is_confirmed(ct));
        DEBUGP("Confirming conntrack %p\n", ct);
 
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
 
        /* See if there's one in the list already, including reverse:
            NAT could have grabbed it without realizing, since we're
@@ -380,12 +380,12 @@ __ip_conntrack_confirm(struct sk_buff **pskb)
                atomic_inc(&ct->ct_general.use);
                set_bit(IPS_CONFIRMED_BIT, &ct->status);
                CONNTRACK_STAT_INC(insert);
-               WRITE_UNLOCK(&ip_conntrack_lock);
+               write_unlock_bh(&ip_conntrack_lock);
                return NF_ACCEPT;
        }
 
        CONNTRACK_STAT_INC(insert_failed);
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
 
        return NF_DROP;
 }
@@ -398,9 +398,9 @@ ip_conntrack_tuple_taken(const struct ip_conntrack_tuple *tuple,
 {
        struct ip_conntrack_tuple_hash *h;
 
-       READ_LOCK(&ip_conntrack_lock);
+       read_lock_bh(&ip_conntrack_lock);
        h = __ip_conntrack_find(tuple, ignored_conntrack);
-       READ_UNLOCK(&ip_conntrack_lock);
+       read_unlock_bh(&ip_conntrack_lock);
 
        return h != NULL;
 }
@@ -419,13 +419,13 @@ static int early_drop(struct list_head *chain)
        struct ip_conntrack *ct = NULL;
        int dropped = 0;
 
-       READ_LOCK(&ip_conntrack_lock);
+       read_lock_bh(&ip_conntrack_lock);
        h = LIST_FIND_B(chain, unreplied, struct ip_conntrack_tuple_hash *);
        if (h) {
                ct = tuplehash_to_ctrack(h);
                atomic_inc(&ct->ct_general.use);
        }
-       READ_UNLOCK(&ip_conntrack_lock);
+       read_unlock_bh(&ip_conntrack_lock);
 
        if (!ct)
                return dropped;
@@ -508,7 +508,7 @@ init_conntrack(const struct ip_conntrack_tuple *tuple,
        conntrack->timeout.data = (unsigned long)conntrack;
        conntrack->timeout.function = death_by_timeout;
 
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
        exp = find_expectation(tuple);
 
        if (exp) {
@@ -532,7 +532,7 @@ init_conntrack(const struct ip_conntrack_tuple *tuple,
        list_add(&conntrack->tuplehash[IP_CT_DIR_ORIGINAL].list, &unconfirmed);
 
        atomic_inc(&ip_conntrack_count);
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
 
        if (exp) {
                if (exp->expectfn)
@@ -723,17 +723,17 @@ void ip_conntrack_unexpect_related(struct ip_conntrack_expect *exp)
 {
        struct ip_conntrack_expect *i;
 
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
        /* choose the the oldest expectation to evict */
        list_for_each_entry_reverse(i, &ip_conntrack_expect_list, list) {
                if (expect_matches(i, exp) && del_timer(&i->timeout)) {
                        unlink_expect(i);
-                       WRITE_UNLOCK(&ip_conntrack_lock);
+                       write_unlock_bh(&ip_conntrack_lock);
                        destroy_expect(i);
                        return;
                }
        }
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
 }
 
 struct ip_conntrack_expect *ip_conntrack_expect_alloc(void)
@@ -760,15 +760,11 @@ static void ip_conntrack_expect_insert(struct ip_conntrack_expect *exp)
        exp->master->expecting++;
        list_add(&exp->list, &ip_conntrack_expect_list);
 
-       if (exp->master->helper->timeout) {
-               init_timer(&exp->timeout);
-               exp->timeout.data = (unsigned long)exp;
-               exp->timeout.function = expectation_timed_out;
-               exp->timeout.expires
-                       = jiffies + exp->master->helper->timeout * HZ;
-               add_timer(&exp->timeout);
-       } else
-               exp->timeout.function = NULL;
+       init_timer(&exp->timeout);
+       exp->timeout.data = (unsigned long)exp;
+       exp->timeout.function = expectation_timed_out;
+       exp->timeout.expires = jiffies + exp->master->helper->timeout * HZ;
+       add_timer(&exp->timeout);
 
        CONNTRACK_STAT_INC(expect_create);
 }
@@ -808,7 +804,7 @@ int ip_conntrack_expect_related(struct ip_conntrack_expect *expect)
        DEBUGP("tuple: "); DUMP_TUPLE(&expect->tuple);
        DEBUGP("mask:  "); DUMP_TUPLE(&expect->mask);
 
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
        list_for_each_entry(i, &ip_conntrack_expect_list, list) {
                if (expect_matches(i, expect)) {
                        /* Refresh timer: if it's dying, ignore.. */
@@ -832,7 +828,7 @@ int ip_conntrack_expect_related(struct ip_conntrack_expect *expect)
        ip_conntrack_expect_insert(expect);
        ret = 0;
 out:
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
        return ret;
 }
 
@@ -841,7 +837,7 @@ out:
 void ip_conntrack_alter_reply(struct ip_conntrack *conntrack,
                              const struct ip_conntrack_tuple *newreply)
 {
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
        /* Should be unconfirmed, so not in hash table yet */
        IP_NF_ASSERT(!is_confirmed(conntrack));
 
@@ -851,15 +847,15 @@ void ip_conntrack_alter_reply(struct ip_conntrack *conntrack,
        conntrack->tuplehash[IP_CT_DIR_REPLY].tuple = *newreply;
        if (!conntrack->master && conntrack->expecting == 0)
                conntrack->helper = ip_ct_find_helper(newreply);
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
 }
 
 int ip_conntrack_helper_register(struct ip_conntrack_helper *me)
 {
        BUG_ON(me->timeout == 0);
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
        list_prepend(&helpers, me);
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
 
        return 0;
 }
@@ -878,7 +874,7 @@ void ip_conntrack_helper_unregister(struct ip_conntrack_helper *me)
        struct ip_conntrack_expect *exp, *tmp;
 
        /* Need write lock here, to delete helper. */
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
        LIST_DELETE(&helpers, me);
 
        /* Get rid of expectations */
@@ -893,7 +889,7 @@ void ip_conntrack_helper_unregister(struct ip_conntrack_helper *me)
        for (i = 0; i < ip_conntrack_htable_size; i++)
                LIST_FIND_W(&ip_conntrack_hash[i], unhelp,
                            struct ip_conntrack_tuple_hash *, me);
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
 
        /* Someone could be still looking at the helper in a bh. */
        synchronize_net();
@@ -925,14 +921,14 @@ void ip_ct_refresh_acct(struct ip_conntrack *ct,
                ct->timeout.expires = extra_jiffies;
                ct_add_counters(ct, ctinfo, skb);
        } else {
-               WRITE_LOCK(&ip_conntrack_lock);
+               write_lock_bh(&ip_conntrack_lock);
                /* Need del_timer for race avoidance (may already be dying). */
                if (del_timer(&ct->timeout)) {
                        ct->timeout.expires = jiffies + extra_jiffies;
                        add_timer(&ct->timeout);
                }
                ct_add_counters(ct, ctinfo, skb);
-               WRITE_UNLOCK(&ip_conntrack_lock);
+               write_unlock_bh(&ip_conntrack_lock);
        }
 }
 
@@ -940,37 +936,16 @@ void ip_ct_refresh_acct(struct ip_conntrack *ct,
 struct sk_buff *
 ip_ct_gather_frags(struct sk_buff *skb, u_int32_t user)
 {
-       struct sock *sk = skb->sk;
-#ifdef CONFIG_NETFILTER_DEBUG
-       unsigned int olddebug = skb->nf_debug;
-#endif
-
-       if (sk) {
-               sock_hold(sk);
-               skb_orphan(skb);
-       }
+       skb_orphan(skb);
 
        local_bh_disable(); 
        skb = ip_defrag(skb, user);
        local_bh_enable();
 
-       if (!skb) {
-               if (sk)
-                       sock_put(sk);
-               return skb;
-       }
-
-       if (sk) {
-               skb_set_owner_w(skb, sk);
-               sock_put(sk);
+       if (skb) {
+               ip_send_check(skb->nh.iph);
+               skb->nfcache |= NFC_ALTERED;
        }
-
-       ip_send_check(skb->nh.iph);
-       skb->nfcache |= NFC_ALTERED;
-#ifdef CONFIG_NETFILTER_DEBUG
-       /* Packet path as if nothing had happened. */
-       skb->nf_debug = olddebug;
-#endif
        return skb;
 }
 
@@ -1009,7 +984,7 @@ get_next_corpse(int (*iter)(struct ip_conntrack *i, void *data),
 {
        struct ip_conntrack_tuple_hash *h = NULL;
 
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
        for (; *bucket < ip_conntrack_htable_size; (*bucket)++) {
                h = LIST_FIND_W(&ip_conntrack_hash[*bucket], do_iter,
                                struct ip_conntrack_tuple_hash *, iter, data);
@@ -1021,7 +996,7 @@ get_next_corpse(int (*iter)(struct ip_conntrack *i, void *data),
                                struct ip_conntrack_tuple_hash *, iter, data);
        if (h)
                atomic_inc(&tuplehash_to_ctrack(h)->ct_general.use);
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
 
        return h;
 }
@@ -1213,14 +1188,14 @@ int __init ip_conntrack_init(void)
        }
 
        /* Don't NEED lock here, but good form anyway. */
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
        for (i = 0; i < MAX_IP_CT_PROTO; i++)
                ip_ct_protos[i] = &ip_conntrack_generic_protocol;
        /* Sew in builtin protocols. */
        ip_ct_protos[IPPROTO_TCP] = &ip_conntrack_protocol_tcp;
        ip_ct_protos[IPPROTO_UDP] = &ip_conntrack_protocol_udp;
        ip_ct_protos[IPPROTO_ICMP] = &ip_conntrack_protocol_icmp;
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
 
        for (i = 0; i < ip_conntrack_htable_size; i++)
                INIT_LIST_HEAD(&ip_conntrack_hash[i]);
index dd86503aa7881917715839aa81c62fcdeb3f6391..fea6dd2a00b6b2db30e2ab348f02b354ff40d443 100644 (file)
@@ -16,7 +16,6 @@
 #include <net/checksum.h>
 #include <net/tcp.h>
 
-#include <linux/netfilter_ipv4/lockhelp.h>
 #include <linux/netfilter_ipv4/ip_conntrack_helper.h>
 #include <linux/netfilter_ipv4/ip_conntrack_ftp.h>
 #include <linux/moduleparam.h>
@@ -28,7 +27,7 @@ MODULE_DESCRIPTION("ftp connection tracking helper");
 /* This is slow, but it's simple. --RR */
 static char ftp_buffer[65536];
 
-static DECLARE_LOCK(ip_ftp_lock);
+static DEFINE_SPINLOCK(ip_ftp_lock);
 
 #define MAX_PORTS 8
 static int ports[MAX_PORTS];
@@ -319,7 +318,7 @@ static int help(struct sk_buff **pskb,
        }
        datalen = (*pskb)->len - dataoff;
 
-       LOCK_BH(&ip_ftp_lock);
+       spin_lock_bh(&ip_ftp_lock);
        fb_ptr = skb_header_pointer(*pskb, dataoff,
                                    (*pskb)->len - dataoff, ftp_buffer);
        BUG_ON(fb_ptr == NULL);
@@ -442,7 +441,7 @@ out_update_nl:
        if (ends_in_nl)
                update_nl_seq(seq, ct_ftp_info,dir);
  out:
-       UNLOCK_BH(&ip_ftp_lock);
+       spin_unlock_bh(&ip_ftp_lock);
        return ret;
 }
 
index 33cc7348b6eee161c8c61a1d658070d42a977626..cd98772cc332a2bf3ac5ea6b91c5df9a60f06355 100644 (file)
@@ -29,7 +29,6 @@
 #include <net/checksum.h>
 #include <net/tcp.h>
 
-#include <linux/netfilter_ipv4/lockhelp.h>
 #include <linux/netfilter_ipv4/ip_conntrack_helper.h>
 #include <linux/netfilter_ipv4/ip_conntrack_irc.h>
 #include <linux/moduleparam.h>
@@ -41,7 +40,7 @@ static int max_dcc_channels = 8;
 static unsigned int dcc_timeout = 300;
 /* This is slow, but it's simple. --RR */
 static char irc_buffer[65536];
-static DECLARE_LOCK(irc_buffer_lock);
+static DEFINE_SPINLOCK(irc_buffer_lock);
 
 unsigned int (*ip_nat_irc_hook)(struct sk_buff **pskb,
                                enum ip_conntrack_info ctinfo,
@@ -141,7 +140,7 @@ static int help(struct sk_buff **pskb,
        if (dataoff >= (*pskb)->len)
                return NF_ACCEPT;
 
-       LOCK_BH(&irc_buffer_lock);
+       spin_lock_bh(&irc_buffer_lock);
        ib_ptr = skb_header_pointer(*pskb, dataoff,
                                    (*pskb)->len - dataoff, irc_buffer);
        BUG_ON(ib_ptr == NULL);
@@ -237,7 +236,7 @@ static int help(struct sk_buff **pskb,
        } /* while data < ... */
 
  out:
-       UNLOCK_BH(&irc_buffer_lock);
+       spin_unlock_bh(&irc_buffer_lock);
        return ret;
 }
 
index ff8c34a860ff2545148f921ff5a3fbc071a4b1cd..31d75390bf12b5e648b1b4cd73f701e75764a48d 100644 (file)
@@ -26,7 +26,6 @@
 
 #include <linux/netfilter_ipv4/ip_conntrack.h>
 #include <linux/netfilter_ipv4/ip_conntrack_protocol.h>
-#include <linux/netfilter_ipv4/lockhelp.h>
 
 #if 0
 #define DEBUGP(format, ...) printk(format, ## __VA_ARGS__)
@@ -35,7 +34,7 @@
 #endif
 
 /* Protects conntrack->proto.sctp */
-static DECLARE_RWLOCK(sctp_lock);
+static DEFINE_RWLOCK(sctp_lock);
 
 /* FIXME: Examine ipfilter's timeouts and conntrack transitions more
    closely.  They're more complex. --RR 
@@ -199,9 +198,9 @@ static int sctp_print_conntrack(struct seq_file *s,
        DEBUGP(__FUNCTION__);
        DEBUGP("\n");
 
-       READ_LOCK(&sctp_lock);
+       read_lock_bh(&sctp_lock);
        state = conntrack->proto.sctp.state;
-       READ_UNLOCK(&sctp_lock);
+       read_unlock_bh(&sctp_lock);
 
        return seq_printf(s, "%s ", sctp_conntrack_names[state]);
 }
@@ -343,13 +342,13 @@ static int sctp_packet(struct ip_conntrack *conntrack,
 
        oldsctpstate = newconntrack = SCTP_CONNTRACK_MAX;
        for_each_sctp_chunk (skb, sch, _sch, offset, count) {
-               WRITE_LOCK(&sctp_lock);
+               write_lock_bh(&sctp_lock);
 
                /* Special cases of Verification tag check (Sec 8.5.1) */
                if (sch->type == SCTP_CID_INIT) {
                        /* Sec 8.5.1 (A) */
                        if (sh->vtag != 0) {
-                               WRITE_UNLOCK(&sctp_lock);
+                               write_unlock_bh(&sctp_lock);
                                return -1;
                        }
                } else if (sch->type == SCTP_CID_ABORT) {
@@ -357,7 +356,7 @@ static int sctp_packet(struct ip_conntrack *conntrack,
                        if (!(sh->vtag == conntrack->proto.sctp.vtag[CTINFO2DIR(ctinfo)])
                                && !(sh->vtag == conntrack->proto.sctp.vtag
                                                        [1 - CTINFO2DIR(ctinfo)])) {
-                               WRITE_UNLOCK(&sctp_lock);
+                               write_unlock_bh(&sctp_lock);
                                return -1;
                        }
                } else if (sch->type == SCTP_CID_SHUTDOWN_COMPLETE) {
@@ -366,13 +365,13 @@ static int sctp_packet(struct ip_conntrack *conntrack,
                                && !(sh->vtag == conntrack->proto.sctp.vtag
                                                        [1 - CTINFO2DIR(ctinfo)] 
                                        && (sch->flags & 1))) {
-                               WRITE_UNLOCK(&sctp_lock);
+                               write_unlock_bh(&sctp_lock);
                                return -1;
                        }
                } else if (sch->type == SCTP_CID_COOKIE_ECHO) {
                        /* Sec 8.5.1 (D) */
                        if (!(sh->vtag == conntrack->proto.sctp.vtag[CTINFO2DIR(ctinfo)])) {
-                               WRITE_UNLOCK(&sctp_lock);
+                               write_unlock_bh(&sctp_lock);
                                return -1;
                        }
                }
@@ -384,7 +383,7 @@ static int sctp_packet(struct ip_conntrack *conntrack,
                if (newconntrack == SCTP_CONNTRACK_MAX) {
                        DEBUGP("ip_conntrack_sctp: Invalid dir=%i ctype=%u conntrack=%u\n",
                               CTINFO2DIR(ctinfo), sch->type, oldsctpstate);
-                       WRITE_UNLOCK(&sctp_lock);
+                       write_unlock_bh(&sctp_lock);
                        return -1;
                }
 
@@ -396,7 +395,7 @@ static int sctp_packet(struct ip_conntrack *conntrack,
                        ih = skb_header_pointer(skb, offset + sizeof(sctp_chunkhdr_t),
                                                sizeof(_inithdr), &_inithdr);
                        if (ih == NULL) {
-                                       WRITE_UNLOCK(&sctp_lock);
+                                       write_unlock_bh(&sctp_lock);
                                        return -1;
                        }
                        DEBUGP("Setting vtag %x for dir %d\n", 
@@ -405,7 +404,7 @@ static int sctp_packet(struct ip_conntrack *conntrack,
                }
 
                conntrack->proto.sctp.state = newconntrack;
-               WRITE_UNLOCK(&sctp_lock);
+               write_unlock_bh(&sctp_lock);
        }
 
        ip_ct_refresh_acct(conntrack, ctinfo, skb, *sctp_timeouts[newconntrack]);
index 721ddbf522b422d554479a7ab15c0955798f16ee..809dfed766d4274962fcd949c17814a1011ccace 100644 (file)
@@ -36,7 +36,6 @@
 #include <linux/netfilter_ipv4.h>
 #include <linux/netfilter_ipv4/ip_conntrack.h>
 #include <linux/netfilter_ipv4/ip_conntrack_protocol.h>
-#include <linux/netfilter_ipv4/lockhelp.h>
 
 #if 0
 #define DEBUGP printk
@@ -46,7 +45,7 @@
 #endif
 
 /* Protects conntrack->proto.tcp */
-static DECLARE_RWLOCK(tcp_lock);
+static DEFINE_RWLOCK(tcp_lock);
 
 /* "Be conservative in what you do, 
     be liberal in what you accept from others." 
@@ -330,9 +329,9 @@ static int tcp_print_conntrack(struct seq_file *s,
 {
        enum tcp_conntrack state;
 
-       READ_LOCK(&tcp_lock);
+       read_lock_bh(&tcp_lock);
        state = conntrack->proto.tcp.state;
-       READ_UNLOCK(&tcp_lock);
+       read_unlock_bh(&tcp_lock);
 
        return seq_printf(s, "%s ", tcp_conntrack_names[state]);
 }
@@ -738,14 +737,14 @@ void ip_conntrack_tcp_update(struct sk_buff *skb,
 
        end = segment_seq_plus_len(ntohl(tcph->seq), skb->len, iph, tcph);
        
-       WRITE_LOCK(&tcp_lock);
+       write_lock_bh(&tcp_lock);
        /*
         * We have to worry for the ack in the reply packet only...
         */
        if (after(end, conntrack->proto.tcp.seen[dir].td_end))
                conntrack->proto.tcp.seen[dir].td_end = end;
        conntrack->proto.tcp.last_end = end;
-       WRITE_UNLOCK(&tcp_lock);
+       write_unlock_bh(&tcp_lock);
        DEBUGP("tcp_update: sender end=%u maxend=%u maxwin=%u scale=%i "
               "receiver end=%u maxend=%u maxwin=%u scale=%i\n",
                sender->td_end, sender->td_maxend, sender->td_maxwin,
@@ -857,7 +856,7 @@ static int tcp_packet(struct ip_conntrack *conntrack,
                                sizeof(_tcph), &_tcph);
        BUG_ON(th == NULL);
        
-       WRITE_LOCK(&tcp_lock);
+       write_lock_bh(&tcp_lock);
        old_state = conntrack->proto.tcp.state;
        dir = CTINFO2DIR(ctinfo);
        index = get_conntrack_index(th);
@@ -879,7 +878,7 @@ static int tcp_packet(struct ip_conntrack *conntrack,
                         * that the client cannot but retransmit its SYN and 
                         * thus initiate a clean new session.
                         */
-                       WRITE_UNLOCK(&tcp_lock);
+                       write_unlock_bh(&tcp_lock);
                        if (LOG_INVALID(IPPROTO_TCP))
                                nf_log_packet(PF_INET, 0, skb, NULL, NULL, 
                                          "ip_ct_tcp: killing out of sync session ");
@@ -894,7 +893,7 @@ static int tcp_packet(struct ip_conntrack *conntrack,
                conntrack->proto.tcp.last_end = 
                    segment_seq_plus_len(ntohl(th->seq), skb->len, iph, th);
                
-               WRITE_UNLOCK(&tcp_lock);
+               write_unlock_bh(&tcp_lock);
                if (LOG_INVALID(IPPROTO_TCP))
                        nf_log_packet(PF_INET, 0, skb, NULL, NULL, 
                                  "ip_ct_tcp: invalid packet ignored ");
@@ -904,7 +903,7 @@ static int tcp_packet(struct ip_conntrack *conntrack,
                DEBUGP("ip_ct_tcp: Invalid dir=%i index=%u ostate=%u\n",
                       dir, get_conntrack_index(th),
                       old_state);
-               WRITE_UNLOCK(&tcp_lock);
+               write_unlock_bh(&tcp_lock);
                if (LOG_INVALID(IPPROTO_TCP))
                        nf_log_packet(PF_INET, 0, skb, NULL, NULL, 
                                  "ip_ct_tcp: invalid state ");
@@ -918,13 +917,13 @@ static int tcp_packet(struct ip_conntrack *conntrack,
                             conntrack->proto.tcp.seen[dir].td_end)) {  
                        /* Attempt to reopen a closed connection.
                        * Delete this connection and look up again. */
-                       WRITE_UNLOCK(&tcp_lock);
+                       write_unlock_bh(&tcp_lock);
                        if (del_timer(&conntrack->timeout))
                                conntrack->timeout.function((unsigned long)
                                                            conntrack);
                        return -NF_REPEAT;
                } else {
-                       WRITE_UNLOCK(&tcp_lock);
+                       write_unlock_bh(&tcp_lock);
                        if (LOG_INVALID(IPPROTO_TCP))
                                nf_log_packet(PF_INET, 0, skb, NULL, NULL,
                                              "ip_ct_tcp: invalid SYN");
@@ -949,7 +948,7 @@ static int tcp_packet(struct ip_conntrack *conntrack,
 
        if (!tcp_in_window(&conntrack->proto.tcp, dir, index, 
                           skb, iph, th)) {
-               WRITE_UNLOCK(&tcp_lock);
+               write_unlock_bh(&tcp_lock);
                return -NF_ACCEPT;
        }
     in_window:
@@ -972,7 +971,7 @@ static int tcp_packet(struct ip_conntrack *conntrack,
        timeout = conntrack->proto.tcp.retrans >= ip_ct_tcp_max_retrans
                  && *tcp_timeouts[new_state] > ip_ct_tcp_timeout_max_retrans
                  ? ip_ct_tcp_timeout_max_retrans : *tcp_timeouts[new_state];
-       WRITE_UNLOCK(&tcp_lock);
+       write_unlock_bh(&tcp_lock);
 
        if (!test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status)) {
                /* If only reply is a RST, we can consider ourselves not to
index 5bc28a2246238f6640bfe03406bf739fe97d137c..8c1eaba098d4cbf6829c8bf79eb3a0ef29a01b14 100644 (file)
@@ -120,6 +120,7 @@ static int udp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo,
         * and moreover root might send raw packets.
         * FIXME: Source route IP option packets --RR */
        if (hooknum == NF_IP_PRE_ROUTING
+           && skb->ip_summed != CHECKSUM_UNNECESSARY
            && csum_tcpudp_magic(iph->saddr, iph->daddr, udplen, IPPROTO_UDP,
                                 skb->ip_summed == CHECKSUM_HW ? skb->csum
                                 : skb_checksum(skb, iph->ihl*4, udplen, 0))) {
index 46ca45f74d85b6e543304df6eb6f89b9db2098d4..42dc95102873f17ef4825e80a4056a3f1ef0b7af 100644 (file)
@@ -28,8 +28,8 @@
 #include <net/checksum.h>
 #include <net/ip.h>
 
-#define ASSERT_READ_LOCK(x) MUST_BE_READ_LOCKED(&ip_conntrack_lock)
-#define ASSERT_WRITE_LOCK(x) MUST_BE_WRITE_LOCKED(&ip_conntrack_lock)
+#define ASSERT_READ_LOCK(x)
+#define ASSERT_WRITE_LOCK(x)
 
 #include <linux/netfilter_ipv4/ip_conntrack.h>
 #include <linux/netfilter_ipv4/ip_conntrack_protocol.h>
@@ -119,7 +119,7 @@ static struct list_head *ct_get_idx(struct seq_file *seq, loff_t pos)
 
 static void *ct_seq_start(struct seq_file *seq, loff_t *pos)
 {
-       READ_LOCK(&ip_conntrack_lock);
+       read_lock_bh(&ip_conntrack_lock);
        return ct_get_idx(seq, *pos);
 }
 
@@ -131,7 +131,7 @@ static void *ct_seq_next(struct seq_file *s, void *v, loff_t *pos)
   
 static void ct_seq_stop(struct seq_file *s, void *v)
 {
-       READ_UNLOCK(&ip_conntrack_lock);
+       read_unlock_bh(&ip_conntrack_lock);
 }
  
 static int ct_seq_show(struct seq_file *s, void *v)
@@ -140,7 +140,7 @@ static int ct_seq_show(struct seq_file *s, void *v)
        const struct ip_conntrack *conntrack = tuplehash_to_ctrack(hash);
        struct ip_conntrack_protocol *proto;
 
-       MUST_BE_READ_LOCKED(&ip_conntrack_lock);
+       ASSERT_READ_LOCK(&ip_conntrack_lock);
        IP_NF_ASSERT(conntrack);
 
        /* we only want to print DIR_ORIGINAL */
@@ -239,7 +239,7 @@ static void *exp_seq_start(struct seq_file *s, loff_t *pos)
 
        /* strange seq_file api calls stop even if we fail,
         * thus we need to grab lock since stop unlocks */
-       READ_LOCK(&ip_conntrack_lock);
+       read_lock_bh(&ip_conntrack_lock);
 
        if (list_empty(e))
                return NULL;
@@ -256,6 +256,7 @@ static void *exp_seq_next(struct seq_file *s, void *v, loff_t *pos)
 {
        struct list_head *e = v;
 
+       ++*pos;
        e = e->next;
 
        if (e == &ip_conntrack_expect_list)
@@ -266,7 +267,7 @@ static void *exp_seq_next(struct seq_file *s, void *v, loff_t *pos)
 
 static void exp_seq_stop(struct seq_file *s, void *v)
 {
-       READ_UNLOCK(&ip_conntrack_lock);
+       read_unlock_bh(&ip_conntrack_lock);
 }
 
 static int exp_seq_show(struct seq_file *s, void *v)
@@ -920,22 +921,22 @@ int ip_conntrack_protocol_register(struct ip_conntrack_protocol *proto)
 {
        int ret = 0;
 
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
        if (ip_ct_protos[proto->proto] != &ip_conntrack_generic_protocol) {
                ret = -EBUSY;
                goto out;
        }
        ip_ct_protos[proto->proto] = proto;
  out:
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
        return ret;
 }
 
 void ip_conntrack_protocol_unregister(struct ip_conntrack_protocol *proto)
 {
-       WRITE_LOCK(&ip_conntrack_lock);
+       write_lock_bh(&ip_conntrack_lock);
        ip_ct_protos[proto->proto] = &ip_conntrack_generic_protocol;
-       WRITE_UNLOCK(&ip_conntrack_lock);
+       write_unlock_bh(&ip_conntrack_lock);
        
        /* Somebody could be still looking at the proto in bh. */
        synchronize_net();
index 9fc6f93af0dd15de8933a14e053bf8cdf41dfb69..739b6dde1c826e3e77ef246ba240234a3b31c3f6 100644 (file)
@@ -22,8 +22,8 @@
 #include <linux/udp.h>
 #include <linux/jhash.h>
 
-#define ASSERT_READ_LOCK(x) MUST_BE_READ_LOCKED(&ip_nat_lock)
-#define ASSERT_WRITE_LOCK(x) MUST_BE_WRITE_LOCKED(&ip_nat_lock)
+#define ASSERT_READ_LOCK(x)
+#define ASSERT_WRITE_LOCK(x)
 
 #include <linux/netfilter_ipv4/ip_conntrack.h>
 #include <linux/netfilter_ipv4/ip_conntrack_core.h>
@@ -41,7 +41,7 @@
 #define DEBUGP(format, args...)
 #endif
 
-DECLARE_RWLOCK(ip_nat_lock);
+DEFINE_RWLOCK(ip_nat_lock);
 
 /* Calculated at init based on memory size */
 static unsigned int ip_nat_htable_size;
@@ -65,9 +65,9 @@ static void ip_nat_cleanup_conntrack(struct ip_conntrack *conn)
        if (!(conn->status & IPS_NAT_DONE_MASK))
                return;
 
-       WRITE_LOCK(&ip_nat_lock);
+       write_lock_bh(&ip_nat_lock);
        list_del(&conn->nat.info.bysource);
-       WRITE_UNLOCK(&ip_nat_lock);
+       write_unlock_bh(&ip_nat_lock);
 }
 
 /* We do checksum mangling, so if they were wrong before they're still
@@ -142,7 +142,7 @@ find_appropriate_src(const struct ip_conntrack_tuple *tuple,
        unsigned int h = hash_by_src(tuple);
        struct ip_conntrack *ct;
 
-       READ_LOCK(&ip_nat_lock);
+       read_lock_bh(&ip_nat_lock);
        list_for_each_entry(ct, &bysource[h], nat.info.bysource) {
                if (same_src(ct, tuple)) {
                        /* Copy source part from reply tuple. */
@@ -151,12 +151,12 @@ find_appropriate_src(const struct ip_conntrack_tuple *tuple,
                        result->dst = tuple->dst;
 
                        if (in_range(result, range)) {
-                               READ_UNLOCK(&ip_nat_lock);
+                               read_unlock_bh(&ip_nat_lock);
                                return 1;
                        }
                }
        }
-       READ_UNLOCK(&ip_nat_lock);
+       read_unlock_bh(&ip_nat_lock);
        return 0;
 }
 
@@ -297,9 +297,9 @@ ip_nat_setup_info(struct ip_conntrack *conntrack,
                unsigned int srchash
                        = hash_by_src(&conntrack->tuplehash[IP_CT_DIR_ORIGINAL]
                                      .tuple);
-               WRITE_LOCK(&ip_nat_lock);
+               write_lock_bh(&ip_nat_lock);
                list_add(&info->bysource, &bysource[srchash]);
-               WRITE_UNLOCK(&ip_nat_lock);
+               write_unlock_bh(&ip_nat_lock);
        }
 
        /* It's done. */
@@ -474,23 +474,23 @@ int ip_nat_protocol_register(struct ip_nat_protocol *proto)
 {
        int ret = 0;
 
-       WRITE_LOCK(&ip_nat_lock);
+       write_lock_bh(&ip_nat_lock);
        if (ip_nat_protos[proto->protonum] != &ip_nat_unknown_protocol) {
                ret = -EBUSY;
                goto out;
        }
        ip_nat_protos[proto->protonum] = proto;
  out:
-       WRITE_UNLOCK(&ip_nat_lock);
+       write_unlock_bh(&ip_nat_lock);
        return ret;
 }
 
 /* Noone stores the protocol anywhere; simply delete it. */
 void ip_nat_protocol_unregister(struct ip_nat_protocol *proto)
 {
-       WRITE_LOCK(&ip_nat_lock);
+       write_lock_bh(&ip_nat_lock);
        ip_nat_protos[proto->protonum] = &ip_nat_unknown_protocol;
-       WRITE_UNLOCK(&ip_nat_lock);
+       write_unlock_bh(&ip_nat_lock);
 
        /* Someone could be still looking at the proto in a bh. */
        synchronize_net();
@@ -509,13 +509,13 @@ int __init ip_nat_init(void)
                return -ENOMEM;
 
        /* Sew in builtin protocols. */
-       WRITE_LOCK(&ip_nat_lock);
+       write_lock_bh(&ip_nat_lock);
        for (i = 0; i < MAX_IP_NAT_PROTO; i++)
                ip_nat_protos[i] = &ip_nat_unknown_protocol;
        ip_nat_protos[IPPROTO_TCP] = &ip_nat_protocol_tcp;
        ip_nat_protos[IPPROTO_UDP] = &ip_nat_protocol_udp;
        ip_nat_protos[IPPROTO_ICMP] = &ip_nat_protocol_icmp;
-       WRITE_UNLOCK(&ip_nat_lock);
+       write_unlock_bh(&ip_nat_lock);
 
        for (i = 0; i < ip_nat_htable_size; i++) {
                INIT_LIST_HEAD(&bysource[i]);
index 1637b96d8c0110c155efd1fe7492570cfdb34650..158f34f32c043e789bb263d74bdd1a01299c8b03 100644 (file)
@@ -28,8 +28,8 @@
 #include <net/tcp.h>
 #include <net/udp.h>
 
-#define ASSERT_READ_LOCK(x) MUST_BE_READ_LOCKED(&ip_nat_lock)
-#define ASSERT_WRITE_LOCK(x) MUST_BE_WRITE_LOCKED(&ip_nat_lock)
+#define ASSERT_READ_LOCK(x)
+#define ASSERT_WRITE_LOCK(x)
 
 #include <linux/netfilter_ipv4/ip_conntrack.h>
 #include <linux/netfilter_ipv4/ip_conntrack_helper.h>
@@ -47,7 +47,7 @@
 #define DUMP_OFFSET(x)
 #endif
 
-static DECLARE_LOCK(ip_nat_seqofs_lock);
+static DEFINE_SPINLOCK(ip_nat_seqofs_lock);
 
 /* Setup TCP sequence correction given this change at this sequence */
 static inline void 
@@ -70,7 +70,7 @@ adjust_tcp_sequence(u32 seq,
        DEBUGP("ip_nat_resize_packet: Seq_offset before: ");
        DUMP_OFFSET(this_way);
 
-       LOCK_BH(&ip_nat_seqofs_lock);
+       spin_lock_bh(&ip_nat_seqofs_lock);
 
        /* SYN adjust. If it's uninitialized, or this is after last
         * correction, record it: we don't handle more than one
@@ -82,7 +82,7 @@ adjust_tcp_sequence(u32 seq,
                    this_way->offset_before = this_way->offset_after;
                    this_way->offset_after += sizediff;
        }
-       UNLOCK_BH(&ip_nat_seqofs_lock);
+       spin_unlock_bh(&ip_nat_seqofs_lock);
 
        DEBUGP("ip_nat_resize_packet: Seq_offset after: ");
        DUMP_OFFSET(this_way);
@@ -142,9 +142,6 @@ static int enlarge_skb(struct sk_buff **pskb, unsigned int extra)
        /* Transfer socket to new skb. */
        if ((*pskb)->sk)
                skb_set_owner_w(nskb, (*pskb)->sk);
-#ifdef CONFIG_NETFILTER_DEBUG
-       nskb->nf_debug = (*pskb)->nf_debug;
-#endif
        kfree_skb(*pskb);
        *pskb = nskb;
        return 1;
index 581f097f5a247b43504c1290d71e75008434dd8a..60d70fa41a156a63bd4abb9a04a894297a8fa0d7 100644 (file)
@@ -19,8 +19,8 @@
 #include <net/route.h>
 #include <linux/bitops.h>
 
-#define ASSERT_READ_LOCK(x) MUST_BE_READ_LOCKED(&ip_nat_lock)
-#define ASSERT_WRITE_LOCK(x) MUST_BE_WRITE_LOCKED(&ip_nat_lock)
+#define ASSERT_READ_LOCK(x)
+#define ASSERT_WRITE_LOCK(x)
 
 #include <linux/netfilter_ipv4/ip_tables.h>
 #include <linux/netfilter_ipv4/ip_nat.h>
index 79f56f662b336bb1a48298af7c0d03c1e1d73b89..bc59d0d6e89ef5bf16512ea6cc0a5d246d6a4f2d 100644 (file)
@@ -31,8 +31,8 @@
 #include <net/checksum.h>
 #include <linux/spinlock.h>
 
-#define ASSERT_READ_LOCK(x) MUST_BE_READ_LOCKED(&ip_nat_lock)
-#define ASSERT_WRITE_LOCK(x) MUST_BE_WRITE_LOCKED(&ip_nat_lock)
+#define ASSERT_READ_LOCK(x)
+#define ASSERT_WRITE_LOCK(x)
 
 #include <linux/netfilter_ipv4/ip_nat.h>
 #include <linux/netfilter_ipv4/ip_nat_rule.h>
@@ -373,7 +373,6 @@ static int init_or_cleanup(int init)
  cleanup_rule_init:
        ip_nat_rule_cleanup();
  cleanup_nothing:
-       MUST_BE_READ_WRITE_UNLOCKED(&ip_nat_lock);
        return ret;
 }
 
index e5746b674413464f6919d3b8880c30dc18feea42..eda1fba431a415cef7f9533c8fdbcaca03f4f4a1 100644 (file)
@@ -3,6 +3,7 @@
  * communicating with userspace via netlink.
  *
  * (C) 2000-2002 James Morris <jmorris@intercode.com.au>
+ * (C) 2003-2005 Netfilter Core Team <coreteam@netfilter.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -17,6 +18,7 @@
  * 2005-01-10: Added /proc counter for dropped packets; fixed so
  *             packets aren't delivered to user space if they're going 
  *             to be dropped. 
+ * 2005-05-26: local_bh_{disable,enable} around nf_reinject (Harald Welte)
  *
  */
 #include <linux/module.h>
@@ -71,7 +73,15 @@ static DECLARE_MUTEX(ipqnl_sem);
 static void
 ipq_issue_verdict(struct ipq_queue_entry *entry, int verdict)
 {
+       /* TCP input path (and probably other bits) assume to be called
+        * from softirq context, not from syscall, like ipq_issue_verdict is
+        * called.  TCP input path deadlocks with locks taken from timer
+        * softirq, e.g.  We therefore emulate this by local_bh_disable() */
+
+       local_bh_disable();
        nf_reinject(entry->skb, entry->info, verdict);
+       local_bh_enable();
+
        kfree(entry);
 }
 
index 8a54f92b8496a4218a243c35ab2b55ec659e7d18..c88dfcd38c5623792e9876810129be204e010915 100644 (file)
@@ -67,7 +67,6 @@ static DECLARE_MUTEX(ipt_mutex);
 /* Must have mutex */
 #define ASSERT_READ_LOCK(x) IP_NF_ASSERT(down_trylock(&ipt_mutex) != 0)
 #define ASSERT_WRITE_LOCK(x) IP_NF_ASSERT(down_trylock(&ipt_mutex) != 0)
-#include <linux/netfilter_ipv4/lockhelp.h>
 #include <linux/netfilter_ipv4/listhelp.h>
 
 #if 0
index 0f12e3a3dc73dc9e4c6a535a717581c2f89d3958..dc4362b57cfa497746a100b4cd8ed5079e499b29 100644 (file)
@@ -29,7 +29,6 @@
 #include <linux/netfilter_ipv4/ip_tables.h>
 #include <linux/netfilter_ipv4/ipt_CLUSTERIP.h>
 #include <linux/netfilter_ipv4/ip_conntrack.h>
-#include <linux/netfilter_ipv4/lockhelp.h>
 
 #define CLUSTERIP_VERSION "0.6"
 
@@ -41,6 +40,8 @@
 #define DEBUGP
 #endif
 
+#define ASSERT_READ_LOCK(x)
+
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
 MODULE_DESCRIPTION("iptables target for CLUSTERIP");
@@ -67,7 +68,7 @@ static LIST_HEAD(clusterip_configs);
 
 /* clusterip_lock protects the clusterip_configs list _AND_ the configurable
  * data within all structurses (num_local_nodes, local_nodes[]) */
-static DECLARE_RWLOCK(clusterip_lock);
+static DEFINE_RWLOCK(clusterip_lock);
 
 #ifdef CONFIG_PROC_FS
 static struct file_operations clusterip_proc_fops;
@@ -82,9 +83,9 @@ clusterip_config_get(struct clusterip_config *c) {
 static inline void
 clusterip_config_put(struct clusterip_config *c) {
        if (atomic_dec_and_test(&c->refcount)) {
-               WRITE_LOCK(&clusterip_lock);
+               write_lock_bh(&clusterip_lock);
                list_del(&c->list);
-               WRITE_UNLOCK(&clusterip_lock);
+               write_unlock_bh(&clusterip_lock);
                dev_mc_delete(c->dev, c->clustermac, ETH_ALEN, 0);
                dev_put(c->dev);
                kfree(c);
@@ -97,7 +98,7 @@ __clusterip_config_find(u_int32_t clusterip)
 {
        struct list_head *pos;
 
-       MUST_BE_READ_LOCKED(&clusterip_lock);
+       ASSERT_READ_LOCK(&clusterip_lock);
        list_for_each(pos, &clusterip_configs) {
                struct clusterip_config *c = list_entry(pos, 
                                        struct clusterip_config, list);
@@ -114,14 +115,14 @@ clusterip_config_find_get(u_int32_t clusterip)
 {
        struct clusterip_config *c;
 
-       READ_LOCK(&clusterip_lock);
+       read_lock_bh(&clusterip_lock);
        c = __clusterip_config_find(clusterip);
        if (!c) {
-               READ_UNLOCK(&clusterip_lock);
+               read_unlock_bh(&clusterip_lock);
                return NULL;
        }
        atomic_inc(&c->refcount);
-       READ_UNLOCK(&clusterip_lock);
+       read_unlock_bh(&clusterip_lock);
 
        return c;
 }
@@ -160,9 +161,9 @@ clusterip_config_init(struct ipt_clusterip_tgt_info *i, u_int32_t ip,
        c->pde->data = c;
 #endif
 
-       WRITE_LOCK(&clusterip_lock);
+       write_lock_bh(&clusterip_lock);
        list_add(&c->list, &clusterip_configs);
-       WRITE_UNLOCK(&clusterip_lock);
+       write_unlock_bh(&clusterip_lock);
 
        return c;
 }
@@ -172,25 +173,25 @@ clusterip_add_node(struct clusterip_config *c, u_int16_t nodenum)
 {
        int i;
 
-       WRITE_LOCK(&clusterip_lock);
+       write_lock_bh(&clusterip_lock);
 
        if (c->num_local_nodes >= CLUSTERIP_MAX_NODES
            || nodenum > CLUSTERIP_MAX_NODES) {
-               WRITE_UNLOCK(&clusterip_lock);
+               write_unlock_bh(&clusterip_lock);
                return 1;
        }
 
        /* check if we alrady have this number in our array */
        for (i = 0; i < c->num_local_nodes; i++) {
                if (c->local_nodes[i] == nodenum) {
-                       WRITE_UNLOCK(&clusterip_lock);
+                       write_unlock_bh(&clusterip_lock);
                        return 1;
                }
        }
 
        c->local_nodes[c->num_local_nodes++] = nodenum;
 
-       WRITE_UNLOCK(&clusterip_lock);
+       write_unlock_bh(&clusterip_lock);
        return 0;
 }
 
@@ -199,10 +200,10 @@ clusterip_del_node(struct clusterip_config *c, u_int16_t nodenum)
 {
        int i;
 
-       WRITE_LOCK(&clusterip_lock);
+       write_lock_bh(&clusterip_lock);
 
        if (c->num_local_nodes <= 1 || nodenum > CLUSTERIP_MAX_NODES) {
-               WRITE_UNLOCK(&clusterip_lock);
+               write_unlock_bh(&clusterip_lock);
                return 1;
        }
                
@@ -211,12 +212,12 @@ clusterip_del_node(struct clusterip_config *c, u_int16_t nodenum)
                        int size = sizeof(u_int16_t)*(c->num_local_nodes-(i+1));
                        memmove(&c->local_nodes[i], &c->local_nodes[i+1], size);
                        c->num_local_nodes--;
-                       WRITE_UNLOCK(&clusterip_lock);
+                       write_unlock_bh(&clusterip_lock);
                        return 0;
                }
        }
 
-       WRITE_UNLOCK(&clusterip_lock);
+       write_unlock_bh(&clusterip_lock);
        return 1;
 }
 
@@ -286,21 +287,21 @@ clusterip_responsible(struct clusterip_config *config, u_int32_t hash)
 {
        int i;
 
-       READ_LOCK(&clusterip_lock);
+       read_lock_bh(&clusterip_lock);
 
        if (config->num_local_nodes == 0) {
-               READ_UNLOCK(&clusterip_lock);
+               read_unlock_bh(&clusterip_lock);
                return 0;
        }
 
        for (i = 0; i < config->num_local_nodes; i++) {
                if (config->local_nodes[i] == hash) {
-                       READ_UNLOCK(&clusterip_lock);
+                       read_unlock_bh(&clusterip_lock);
                        return 1;
                }
        }
 
-       READ_UNLOCK(&clusterip_lock);
+       read_unlock_bh(&clusterip_lock);
 
        return 0;
 }
@@ -578,7 +579,7 @@ static void *clusterip_seq_start(struct seq_file *s, loff_t *pos)
        struct clusterip_config *c = pde->data;
        unsigned int *nodeidx;
 
-       READ_LOCK(&clusterip_lock);
+       read_lock_bh(&clusterip_lock);
        if (*pos >= c->num_local_nodes)
                return NULL;
 
@@ -608,7 +609,7 @@ static void clusterip_seq_stop(struct seq_file *s, void *v)
 {
        kfree(v);
 
-       READ_UNLOCK(&clusterip_lock);
+       read_unlock_bh(&clusterip_lock);
 }
 
 static int clusterip_seq_show(struct seq_file *s, void *v)
index 57e9f6cf1c36d5eac1574351a96a9768cea82b2c..91e74502c3d36ae652eca8041cc8dc66690eaf44 100644 (file)
@@ -33,7 +33,7 @@ MODULE_DESCRIPTION("iptables MASQUERADE target module");
 #endif
 
 /* Lock protects masq region inside conntrack */
-static DECLARE_RWLOCK(masq_lock);
+static DEFINE_RWLOCK(masq_lock);
 
 /* FIXME: Multiple targets. --RR */
 static int
@@ -103,9 +103,9 @@ masquerade_target(struct sk_buff **pskb,
                return NF_DROP;
        }
 
-       WRITE_LOCK(&masq_lock);
+       write_lock_bh(&masq_lock);
        ct->nat.masq_index = out->ifindex;
-       WRITE_UNLOCK(&masq_lock);
+       write_unlock_bh(&masq_lock);
 
        /* Transfer from original range. */
        newrange = ((struct ip_nat_range)
@@ -122,9 +122,9 @@ device_cmp(struct ip_conntrack *i, void *ifindex)
 {
        int ret;
 
-       READ_LOCK(&masq_lock);
+       read_lock_bh(&masq_lock);
        ret = (i->nat.masq_index == (int)(long)ifindex);
-       READ_UNLOCK(&masq_lock);
+       read_unlock_bh(&masq_lock);
 
        return ret;
 }
index 266d64979286dd039245355d108af146e8e5ba8d..91569644602008d5b6d04d943de37379c4430f20 100644 (file)
@@ -104,10 +104,12 @@ static inline struct rtable *route_reverse(struct sk_buff *skb,
 static void send_reset(struct sk_buff *oldskb, int hook)
 {
        struct sk_buff *nskb;
+       struct iphdr *iph = oldskb->nh.iph;
        struct tcphdr _otcph, *oth, *tcph;
        struct rtable *rt;
        u_int16_t tmp_port;
        u_int32_t tmp_addr;
+       unsigned int tcplen;
        int needs_ack;
        int hh_len;
 
@@ -124,7 +126,16 @@ static void send_reset(struct sk_buff *oldskb, int hook)
        if (oth->rst)
                return;
 
-       /* FIXME: Check checksum --RR */
+       /* Check checksum */
+       tcplen = oldskb->len - iph->ihl * 4;
+       if (((hook != NF_IP_LOCAL_IN && oldskb->ip_summed != CHECKSUM_HW) ||
+            (hook == NF_IP_LOCAL_IN &&
+             oldskb->ip_summed != CHECKSUM_UNNECESSARY)) &&
+           csum_tcpudp_magic(iph->saddr, iph->daddr, tcplen, IPPROTO_TCP,
+                             oldskb->ip_summed == CHECKSUM_HW ? oldskb->csum :
+                             skb_checksum(oldskb, iph->ihl * 4, tcplen, 0)))
+               return;
+
        if ((rt = route_reverse(oldskb, oth, hook)) == NULL)
                return;
 
index 6f2cefbe16cd8ccfcd3987b33e4b4e18ad1cc5cd..52a0076302a7668a4e627f86c4b4186f964cd9e2 100644 (file)
@@ -56,7 +56,6 @@
 #include <linux/netfilter.h>
 #include <linux/netfilter_ipv4/ip_tables.h>
 #include <linux/netfilter_ipv4/ipt_ULOG.h>
-#include <linux/netfilter_ipv4/lockhelp.h>
 #include <net/sock.h>
 #include <linux/bitops.h>
 
@@ -99,8 +98,8 @@ typedef struct {
 
 static ulog_buff_t ulog_buffers[ULOG_MAXNLGROUPS];     /* array of buffers */
 
-static struct sock *nflognl;   /* our socket */
-static DECLARE_LOCK(ulog_lock);        /* spinlock */
+static struct sock *nflognl;           /* our socket */
+static DEFINE_SPINLOCK(ulog_lock);     /* spinlock */
 
 /* send one ulog_buff_t to userspace */
 static void ulog_send(unsigned int nlgroupnum)
@@ -135,9 +134,9 @@ static void ulog_timer(unsigned long data)
 
        /* lock to protect against somebody modifying our structure
         * from ipt_ulog_target at the same time */
-       LOCK_BH(&ulog_lock);
+       spin_lock_bh(&ulog_lock);
        ulog_send(data);
-       UNLOCK_BH(&ulog_lock);
+       spin_unlock_bh(&ulog_lock);
 }
 
 static struct sk_buff *ulog_alloc_skb(unsigned int size)
@@ -193,7 +192,7 @@ static void ipt_ulog_packet(unsigned int hooknum,
 
        ub = &ulog_buffers[groupnum];
        
-       LOCK_BH(&ulog_lock);
+       spin_lock_bh(&ulog_lock);
 
        if (!ub->skb) {
                if (!(ub->skb = ulog_alloc_skb(size)))
@@ -278,7 +277,7 @@ static void ipt_ulog_packet(unsigned int hooknum,
                ulog_send(groupnum);
        }
 
-       UNLOCK_BH(&ulog_lock);
+       spin_unlock_bh(&ulog_lock);
 
        return;
 
@@ -288,7 +287,7 @@ nlmsg_failure:
 alloc_failure:
        PRINTR("ipt_ULOG: Error building netlink message\n");
 
-       UNLOCK_BH(&ulog_lock);
+       spin_unlock_bh(&ulog_lock);
 }
 
 static unsigned int ipt_ulog_target(struct sk_buff **pskb,
index f1937190cd771c57f3904a2f605b7702764c9427..564b49bfebcf6feda673d223713d911da17145a1 100644 (file)
@@ -37,7 +37,6 @@
 
 #include <linux/netfilter_ipv4/ip_tables.h>
 #include <linux/netfilter_ipv4/ipt_hashlimit.h>
-#include <linux/netfilter_ipv4/lockhelp.h>
 
 /* FIXME: this is just for IP_NF_ASSERRT */
 #include <linux/netfilter_ipv4/ip_conntrack.h>
@@ -92,7 +91,7 @@ struct ipt_hashlimit_htable {
        struct hlist_head hash[0];      /* hashtable itself */
 };
 
-static DECLARE_LOCK(hashlimit_lock);   /* protects htables list */
+static DEFINE_SPINLOCK(hashlimit_lock);        /* protects htables list */
 static DECLARE_MUTEX(hlimit_mutex);    /* additional checkentry protection */
 static HLIST_HEAD(hashlimit_htables);
 static kmem_cache_t *hashlimit_cachep;
@@ -233,9 +232,9 @@ static int htable_create(struct ipt_hashlimit_info *minfo)
        hinfo->timer.function = htable_gc;
        add_timer(&hinfo->timer);
 
-       LOCK_BH(&hashlimit_lock);
+       spin_lock_bh(&hashlimit_lock);
        hlist_add_head(&hinfo->node, &hashlimit_htables);
-       UNLOCK_BH(&hashlimit_lock);
+       spin_unlock_bh(&hashlimit_lock);
 
        return 0;
 }
@@ -301,15 +300,15 @@ static struct ipt_hashlimit_htable *htable_find_get(char *name)
        struct ipt_hashlimit_htable *hinfo;
        struct hlist_node *pos;
 
-       LOCK_BH(&hashlimit_lock);
+       spin_lock_bh(&hashlimit_lock);
        hlist_for_each_entry(hinfo, pos, &hashlimit_htables, node) {
                if (!strcmp(name, hinfo->pde->name)) {
                        atomic_inc(&hinfo->use);
-                       UNLOCK_BH(&hashlimit_lock);
+                       spin_unlock_bh(&hashlimit_lock);
                        return hinfo;
                }
        }
-       UNLOCK_BH(&hashlimit_lock);
+       spin_unlock_bh(&hashlimit_lock);
 
        return NULL;
 }
@@ -317,9 +316,9 @@ static struct ipt_hashlimit_htable *htable_find_get(char *name)
 static void htable_put(struct ipt_hashlimit_htable *hinfo)
 {
        if (atomic_dec_and_test(&hinfo->use)) {
-               LOCK_BH(&hashlimit_lock);
+               spin_lock_bh(&hashlimit_lock);
                hlist_del(&hinfo->node);
-               UNLOCK_BH(&hashlimit_lock);
+               spin_unlock_bh(&hashlimit_lock);
                htable_destroy(hinfo);
        }
 }
index 33fdf364d3d37eab3b1e78f3586d21c4b990464b..3e7dd014de4363c8fda5b08cc11ee6d3925b75fa 100644 (file)
@@ -53,7 +53,7 @@ match(const struct sk_buff *skb,
                return ret;
        }
 
-       READ_LOCK(&ip_conntrack_lock);
+       read_lock_bh(&ip_conntrack_lock);
        if (!ct->master->helper) {
                DEBUGP("ipt_helper: master ct %p has no helper\n", 
                        exp->expectant);
@@ -69,7 +69,7 @@ match(const struct sk_buff *skb,
                ret ^= !strncmp(ct->master->helper->name, info->name, 
                                strlen(ct->master->helper->name));
 out_unlock:
-       READ_UNLOCK(&ip_conntrack_lock);
+       read_unlock_bh(&ip_conntrack_lock);
        return ret;
 }
 
index 25ab9fabdcba3d66cb4bbf015514b6d671e6ed8f..2d44b07688af3794bfe51b4aa63bfb5417021aa7 100644 (file)
@@ -223,7 +223,7 @@ static int ip_recent_ctrl(struct file *file, const char __user *input, unsigned
                        curr_table->table[count].last_seen = 0;
                        curr_table->table[count].addr = 0;
                        curr_table->table[count].ttl = 0;
-                       memset(curr_table->table[count].last_pkts,0,ip_pkt_list_tot*sizeof(u_int32_t));
+                       memset(curr_table->table[count].last_pkts,0,ip_pkt_list_tot*sizeof(unsigned long));
                        curr_table->table[count].oldest_pkt = 0;
                        curr_table->table[count].time_pos = 0;
                        curr_table->time_info[count].position = count;
@@ -502,7 +502,7 @@ match(const struct sk_buff *skb,
                location = time_info[curr_table->time_pos].position;
                hash_table[r_list[location].hash_entry] = -1;
                hash_table[hash_result] = location;
-               memset(r_list[location].last_pkts,0,ip_pkt_list_tot*sizeof(u_int32_t));
+               memset(r_list[location].last_pkts,0,ip_pkt_list_tot*sizeof(unsigned long));
                r_list[location].time_pos = curr_table->time_pos;
                r_list[location].addr = addr;
                r_list[location].ttl = ttl;
@@ -631,7 +631,7 @@ match(const struct sk_buff *skb,
                        r_list[location].last_seen = 0;
                        r_list[location].addr = 0;
                        r_list[location].ttl = 0;
-                       memset(r_list[location].last_pkts,0,ip_pkt_list_tot*sizeof(u_int32_t));
+                       memset(r_list[location].last_pkts,0,ip_pkt_list_tot*sizeof(unsigned long));
                        r_list[location].oldest_pkt = 0;
                        ans = !info->invert;
                }
@@ -734,10 +734,10 @@ checkentry(const char *tablename,
        memset(curr_table->table,0,sizeof(struct recent_ip_list)*ip_list_tot);
 #ifdef DEBUG
        if(debug) printk(KERN_INFO RECENT_NAME ": checkentry: Allocating %d for pkt_list.\n",
-                       sizeof(u_int32_t)*ip_pkt_list_tot*ip_list_tot);
+                       sizeof(unsigned long)*ip_pkt_list_tot*ip_list_tot);
 #endif
 
-       hold = vmalloc(sizeof(u_int32_t)*ip_pkt_list_tot*ip_list_tot);
+       hold = vmalloc(sizeof(unsigned long)*ip_pkt_list_tot*ip_list_tot);
 #ifdef DEBUG
        if(debug) printk(KERN_INFO RECENT_NAME ": checkentry: After pkt_list allocation.\n");
 #endif
index 5b1ec586bae631eed81a51eb0472e1c48a1613f2..d1835b1bc8c469d8394e0ae1a0bb8c9b9a6f975c 100644 (file)
@@ -259,7 +259,7 @@ int raw_rcv(struct sock *sk, struct sk_buff *skb)
        return 0;
 }
 
-static int raw_send_hdrinc(struct sock *sk, void *from, int length,
+static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
                        struct rtable *rt, 
                        unsigned int flags)
 {
@@ -298,7 +298,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, int length,
                goto error_fault;
 
        /* We don't modify invalid header */
-       if (length >= sizeof(*iph) && iph->ihl * 4 <= length) {
+       if (length >= sizeof(*iph) && iph->ihl * 4U <= length) {
                if (!iph->saddr)
                        iph->saddr = rt->rt_src;
                iph->check   = 0;
@@ -332,7 +332,7 @@ static void raw_probe_proto_opt(struct flowi *fl, struct msghdr *msg)
        u8 __user *type = NULL;
        u8 __user *code = NULL;
        int probed = 0;
-       int i;
+       unsigned int i;
 
        if (!msg->msg_iov)
                return;
@@ -384,7 +384,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
        int err;
 
        err = -EMSGSIZE;
-       if (len < 0 || len > 0xFFFF)
+       if (len > 0xFFFF)
                goto out;
 
        /*
@@ -514,7 +514,10 @@ done:
                kfree(ipc.opt);
        ip_rt_put(rt);
 
-out:   return err < 0 ? err : len;
+out:
+       if (err < 0)
+               return err;
+       return len;
 
 do_confirm:
        dst_confirm(&rt->u.dst);
@@ -610,7 +613,10 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                copied = skb->len;
 done:
        skb_free_datagram(sk, skb);
-out:   return err ? err : copied;
+out:
+       if (err)
+               return err;
+       return copied;
 }
 
 static int raw_init(struct sock *sk)
@@ -691,11 +697,11 @@ static int raw_ioctl(struct sock *sk, int cmd, unsigned long arg)
                        struct sk_buff *skb;
                        int amount = 0;
 
-                       spin_lock_irq(&sk->sk_receive_queue.lock);
+                       spin_lock_bh(&sk->sk_receive_queue.lock);
                        skb = skb_peek(&sk->sk_receive_queue);
                        if (skb != NULL)
                                amount = skb->len;
-                       spin_unlock_irq(&sk->sk_receive_queue.lock);
+                       spin_unlock_bh(&sk->sk_receive_queue.lock);
                        return put_user(amount, (int __user *)arg);
                }
 
index a682d28e247bf07a091e38363e27bd6218dcbc0d..f4d53c9198694ee9731681cee0da35fb89eca801 100644 (file)
@@ -2581,7 +2581,7 @@ int ip_route_output_key(struct rtable **rp, struct flowi *flp)
 }
 
 static int rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
-                       int nowait)
+                       int nowait, unsigned int flags)
 {
        struct rtable *rt = (struct rtable*)skb->dst;
        struct rtmsg *r;
@@ -2591,9 +2591,8 @@ static int rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
 #ifdef CONFIG_IP_MROUTE
        struct rtattr *eptr;
 #endif
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*r));
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*r), flags);
        r = NLMSG_DATA(nlh);
-       nlh->nlmsg_flags = (nowait && pid) ? NLM_F_MULTI : 0;
        r->rtm_family    = AF_INET;
        r->rtm_dst_len  = 32;
        r->rtm_src_len  = 0;
@@ -2744,7 +2743,7 @@ int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg)
        NETLINK_CB(skb).dst_pid = NETLINK_CB(in_skb).pid;
 
        err = rt_fill_info(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq,
-                               RTM_NEWROUTE, 0);
+                               RTM_NEWROUTE, 0, 0);
        if (!err)
                goto out_free;
        if (err < 0) {
@@ -2781,8 +2780,8 @@ int ip_rt_dump(struct sk_buff *skb,  struct netlink_callback *cb)
                                continue;
                        skb->dst = dst_clone(&rt->u.dst);
                        if (rt_fill_info(skb, NETLINK_CB(cb->skb).pid,
-                                        cb->nlh->nlmsg_seq,
-                                        RTM_NEWROUTE, 1) <= 0) {
+                                        cb->nlh->nlmsg_seq, RTM_NEWROUTE, 
+                                        1, NLM_F_MULTI) <= 0) {
                                dst_release(xchg(&skb->dst, NULL));
                                rcu_read_unlock_bh();
                                goto done;
index e923d2f021aa8b49c187104b5ebe1ed03b373ea8..72d014442185fcb1d29ee855b17da26a5bb82988 100644 (file)
@@ -169,10 +169,10 @@ static inline int cookie_check(struct sk_buff *skb, __u32 cookie)
        return mssind < NUM_MSS ? msstab[mssind] + 1 : 0;
 }
 
-extern struct or_calltable or_ipv4;
+extern struct request_sock_ops tcp_request_sock_ops;
 
 static inline struct sock *get_cookie_sock(struct sock *sk, struct sk_buff *skb,
-                                          struct open_request *req,
+                                          struct request_sock *req,
                                           struct dst_entry *dst)
 {
        struct tcp_sock *tp = tcp_sk(sk);
@@ -182,7 +182,7 @@ static inline struct sock *get_cookie_sock(struct sock *sk, struct sk_buff *skb,
        if (child)
                tcp_acceptq_queue(sk, req, child);
        else
-               tcp_openreq_free(req);
+               reqsk_free(req);
 
        return child;
 }
@@ -190,10 +190,12 @@ static inline struct sock *get_cookie_sock(struct sock *sk, struct sk_buff *skb,
 struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,
                             struct ip_options *opt)
 {
+       struct inet_request_sock *ireq;
+       struct tcp_request_sock *treq;
        struct tcp_sock *tp = tcp_sk(sk);
        __u32 cookie = ntohl(skb->h.th->ack_seq) - 1; 
        struct sock *ret = sk;
-       struct open_request *req; 
+       struct request_sock *req; 
        int mss; 
        struct rtable *rt; 
        __u8 rcv_wscale;
@@ -209,19 +211,20 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,
 
        NET_INC_STATS_BH(LINUX_MIB_SYNCOOKIESRECV);
 
-       req = tcp_openreq_alloc();
        ret = NULL;
+       req = reqsk_alloc(&tcp_request_sock_ops); /* for safety */
        if (!req)
                goto out;
 
-       req->rcv_isn            = htonl(skb->h.th->seq) - 1;
-       req->snt_isn            = cookie; 
+       ireq = inet_rsk(req);
+       treq = tcp_rsk(req);
+       treq->rcv_isn           = htonl(skb->h.th->seq) - 1;
+       treq->snt_isn           = cookie; 
        req->mss                = mss;
-       req->rmt_port           = skb->h.th->source;
-       req->af.v4_req.loc_addr = skb->nh.iph->daddr;
-       req->af.v4_req.rmt_addr = skb->nh.iph->saddr;
-       req->class              = &or_ipv4; /* for savety */
-       req->af.v4_req.opt      = NULL;
+       ireq->rmt_port          = skb->h.th->source;
+       ireq->loc_addr          = skb->nh.iph->daddr;
+       ireq->rmt_addr          = skb->nh.iph->saddr;
+       ireq->opt               = NULL;
 
        /* We throwed the options of the initial SYN away, so we hope
         * the ACK carries the same options again (see RFC1122 4.2.3.8)
@@ -229,17 +232,15 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,
        if (opt && opt->optlen) {
                int opt_size = sizeof(struct ip_options) + opt->optlen;
 
-               req->af.v4_req.opt = kmalloc(opt_size, GFP_ATOMIC);
-               if (req->af.v4_req.opt) {
-                       if (ip_options_echo(req->af.v4_req.opt, skb)) {
-                               kfree(req->af.v4_req.opt);
-                               req->af.v4_req.opt = NULL;
-                       }
+               ireq->opt = kmalloc(opt_size, GFP_ATOMIC);
+               if (ireq->opt != NULL && ip_options_echo(ireq->opt, skb)) {
+                       kfree(ireq->opt);
+                       ireq->opt = NULL;
                }
        }
 
-       req->snd_wscale = req->rcv_wscale = req->tstamp_ok = 0;
-       req->wscale_ok  = req->sack_ok = 0; 
+       ireq->snd_wscale = ireq->rcv_wscale = ireq->tstamp_ok = 0;
+       ireq->wscale_ok  = ireq->sack_ok = 0; 
        req->expires    = 0UL; 
        req->retrans    = 0; 
        
@@ -253,15 +254,15 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,
                struct flowi fl = { .nl_u = { .ip4_u =
                                              { .daddr = ((opt && opt->srr) ?
                                                          opt->faddr :
-                                                         req->af.v4_req.rmt_addr),
-                                               .saddr = req->af.v4_req.loc_addr,
+                                                         ireq->rmt_addr),
+                                               .saddr = ireq->loc_addr,
                                                .tos = RT_CONN_FLAGS(sk) } },
                                    .proto = IPPROTO_TCP,
                                    .uli_u = { .ports =
                                               { .sport = skb->h.th->dest,
                                                 .dport = skb->h.th->source } } };
                if (ip_route_output_key(&rt, &fl)) {
-                       tcp_openreq_free(req);
+                       reqsk_free(req);
                        goto out; 
                }
        }
@@ -272,7 +273,7 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,
                                  &req->rcv_wnd, &req->window_clamp, 
                                  0, &rcv_wscale);
        /* BTW win scale with syncookies is 0 by definition */
-       req->rcv_wscale   = rcv_wscale; 
+       ireq->rcv_wscale  = rcv_wscale; 
 
        ret = get_cookie_sock(sk, skb, req, &rt->u.dst);
 out:   return ret;
index 3aafb298c1c19691e26a2a599f53b8e7de4214f3..23068bddbf0bb6837edc01ff2f2f8cd34a12c357 100644 (file)
@@ -23,6 +23,7 @@ extern int sysctl_ip_nonlocal_bind;
 extern int sysctl_icmp_echo_ignore_all;
 extern int sysctl_icmp_echo_ignore_broadcasts;
 extern int sysctl_icmp_ignore_bogus_error_responses;
+extern int sysctl_icmp_errors_use_inbound_ifaddr;
 
 /* From ip_fragment.c */
 extern int sysctl_ipfrag_low_thresh;
@@ -395,6 +396,14 @@ ctl_table ipv4_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec
        },
+       {
+               .ctl_name       = NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR,
+               .procname       = "icmp_errors_use_inbound_ifaddr",
+               .data           = &sysctl_icmp_errors_use_inbound_ifaddr,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec
+       },
        {
                .ctl_name       = NET_IPV4_ROUTE,
                .procname       = "route",
index a037bafcba3c09234e7bfcfbf59f15acb71a8f95..674bbd8cfd36d03c98dafa1770fc5daccb2b13f0 100644 (file)
@@ -271,7 +271,6 @@ int sysctl_tcp_fin_timeout = TCP_FIN_TIMEOUT;
 
 DEFINE_SNMP_STAT(struct tcp_mib, tcp_statistics);
 
-kmem_cache_t *tcp_openreq_cachep;
 kmem_cache_t *tcp_bucket_cachep;
 kmem_cache_t *tcp_timewait_cachep;
 
@@ -317,7 +316,7 @@ EXPORT_SYMBOL(tcp_enter_memory_pressure);
 static __inline__ unsigned int tcp_listen_poll(struct sock *sk,
                                               poll_table *wait)
 {
-       return tcp_sk(sk)->accept_queue ? (POLLIN | POLLRDNORM) : 0;
+       return !reqsk_queue_empty(&tcp_sk(sk)->accept_queue) ? (POLLIN | POLLRDNORM) : 0;
 }
 
 /*
@@ -463,28 +462,15 @@ int tcp_listen_start(struct sock *sk)
 {
        struct inet_sock *inet = inet_sk(sk);
        struct tcp_sock *tp = tcp_sk(sk);
-       struct tcp_listen_opt *lopt;
+       int rc = reqsk_queue_alloc(&tp->accept_queue, TCP_SYNQ_HSIZE);
+
+       if (rc != 0)
+               return rc;
 
        sk->sk_max_ack_backlog = 0;
        sk->sk_ack_backlog = 0;
-       tp->accept_queue = tp->accept_queue_tail = NULL;
-       rwlock_init(&tp->syn_wait_lock);
        tcp_delack_init(tp);
 
-       lopt = kmalloc(sizeof(struct tcp_listen_opt), GFP_KERNEL);
-       if (!lopt)
-               return -ENOMEM;
-
-       memset(lopt, 0, sizeof(struct tcp_listen_opt));
-       for (lopt->max_qlen_log = 6; ; lopt->max_qlen_log++)
-               if ((1 << lopt->max_qlen_log) >= sysctl_max_syn_backlog)
-                       break;
-       get_random_bytes(&lopt->hash_rnd, 4);
-
-       write_lock_bh(&tp->syn_wait_lock);
-       tp->listen_opt = lopt;
-       write_unlock_bh(&tp->syn_wait_lock);
-
        /* There is race window here: we announce ourselves listening,
         * but this transition is still not validated by get_port().
         * It is OK, because this socket enters to hash table only
@@ -501,10 +487,7 @@ int tcp_listen_start(struct sock *sk)
        }
 
        sk->sk_state = TCP_CLOSE;
-       write_lock_bh(&tp->syn_wait_lock);
-       tp->listen_opt = NULL;
-       write_unlock_bh(&tp->syn_wait_lock);
-       kfree(lopt);
+       reqsk_queue_destroy(&tp->accept_queue);
        return -EADDRINUSE;
 }
 
@@ -516,25 +499,23 @@ int tcp_listen_start(struct sock *sk)
 static void tcp_listen_stop (struct sock *sk)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       struct tcp_listen_opt *lopt = tp->listen_opt;
-       struct open_request *acc_req = tp->accept_queue;
-       struct open_request *req;
+       struct listen_sock *lopt;
+       struct request_sock *acc_req;
+       struct request_sock *req;
        int i;
 
        tcp_delete_keepalive_timer(sk);
 
        /* make all the listen_opt local to us */
-       write_lock_bh(&tp->syn_wait_lock);
-       tp->listen_opt = NULL;
-       write_unlock_bh(&tp->syn_wait_lock);
-       tp->accept_queue = tp->accept_queue_tail = NULL;
+       lopt = reqsk_queue_yank_listen_sk(&tp->accept_queue);
+       acc_req = reqsk_queue_yank_acceptq(&tp->accept_queue);
 
        if (lopt->qlen) {
                for (i = 0; i < TCP_SYNQ_HSIZE; i++) {
                        while ((req = lopt->syn_table[i]) != NULL) {
                                lopt->syn_table[i] = req->dl_next;
                                lopt->qlen--;
-                               tcp_openreq_free(req);
+                               reqsk_free(req);
 
                /* Following specs, it would be better either to send FIN
                 * (and enter FIN-WAIT-1, it is normal close)
@@ -574,7 +555,7 @@ static void tcp_listen_stop (struct sock *sk)
                sock_put(child);
 
                sk_acceptq_removed(sk);
-               tcp_openreq_fastfree(req);
+               __reqsk_free(req);
        }
        BUG_TRAP(!sk->sk_ack_backlog);
 }
@@ -1345,7 +1326,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
 
                cleanup_rbuf(sk, copied);
 
-               if (tp->ucopy.task == user_recv) {
+               if (!sysctl_tcp_low_latency && tp->ucopy.task == user_recv) {
                        /* Install new reader */
                        if (!user_recv && !(flags & (MSG_TRUNC | MSG_PEEK))) {
                                user_recv = current;
@@ -1868,11 +1849,11 @@ static int wait_for_connect(struct sock *sk, long timeo)
                prepare_to_wait_exclusive(sk->sk_sleep, &wait,
                                          TASK_INTERRUPTIBLE);
                release_sock(sk);
-               if (!tp->accept_queue)
+               if (reqsk_queue_empty(&tp->accept_queue))
                        timeo = schedule_timeout(timeo);
                lock_sock(sk);
                err = 0;
-               if (tp->accept_queue)
+               if (!reqsk_queue_empty(&tp->accept_queue))
                        break;
                err = -EINVAL;
                if (sk->sk_state != TCP_LISTEN)
@@ -1895,7 +1876,6 @@ static int wait_for_connect(struct sock *sk, long timeo)
 struct sock *tcp_accept(struct sock *sk, int flags, int *err)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       struct open_request *req;
        struct sock *newsk;
        int error;
 
@@ -1906,37 +1886,31 @@ struct sock *tcp_accept(struct sock *sk, int flags, int *err)
         */
        error = -EINVAL;
        if (sk->sk_state != TCP_LISTEN)
-               goto out;
+               goto out_err;
 
        /* Find already established connection */
-       if (!tp->accept_queue) {
+       if (reqsk_queue_empty(&tp->accept_queue)) {
                long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
 
                /* If this is a non blocking socket don't sleep */
                error = -EAGAIN;
                if (!timeo)
-                       goto out;
+                       goto out_err;
 
                error = wait_for_connect(sk, timeo);
                if (error)
-                       goto out;
+                       goto out_err;
        }
 
-       req = tp->accept_queue;
-       if ((tp->accept_queue = req->dl_next) == NULL)
-               tp->accept_queue_tail = NULL;
-
-       newsk = req->sk;
-       sk_acceptq_removed(sk);
-       tcp_openreq_fastfree(req);
+       newsk = reqsk_queue_get_child(&tp->accept_queue, sk);
        BUG_TRAP(newsk->sk_state != TCP_SYN_RECV);
-       release_sock(sk);
-       return newsk;
-
 out:
        release_sock(sk);
+       return newsk;
+out_err:
+       newsk = NULL;
        *err = error;
-       return NULL;
+       goto out;
 }
 
 /*
@@ -2271,13 +2245,6 @@ void __init tcp_init(void)
                __skb_cb_too_small_for_tcp(sizeof(struct tcp_skb_cb),
                                           sizeof(skb->cb));
 
-       tcp_openreq_cachep = kmem_cache_create("tcp_open_request",
-                                                  sizeof(struct open_request),
-                                              0, SLAB_HWCACHE_ALIGN,
-                                              NULL, NULL);
-       if (!tcp_openreq_cachep)
-               panic("tcp_init: Cannot alloc open_request cache.");
-
        tcp_bucket_cachep = kmem_cache_create("tcp_bind_bucket",
                                              sizeof(struct tcp_bind_bucket),
                                              0, SLAB_HWCACHE_ALIGN,
@@ -2338,7 +2305,7 @@ void __init tcp_init(void)
                        (tcp_bhash_size * sizeof(struct tcp_bind_hashbucket));
                        order++)
                ;
-       if (order > 4) {
+       if (order >= 4) {
                sysctl_local_port_range[0] = 32768;
                sysctl_local_port_range[1] = 61000;
                sysctl_tcp_max_tw_buckets = 180000;
@@ -2374,7 +2341,6 @@ EXPORT_SYMBOL(tcp_destroy_sock);
 EXPORT_SYMBOL(tcp_disconnect);
 EXPORT_SYMBOL(tcp_getsockopt);
 EXPORT_SYMBOL(tcp_ioctl);
-EXPORT_SYMBOL(tcp_openreq_cachep);
 EXPORT_SYMBOL(tcp_poll);
 EXPORT_SYMBOL(tcp_read_sock);
 EXPORT_SYMBOL(tcp_recvmsg);
index 8faa8948f75c2d67db9643dc07b24af7abc609a5..634befc079218e3520488a0904dd7f1f4d33ea53 100644 (file)
@@ -455,9 +455,10 @@ static int tcpdiag_dump_sock(struct sk_buff *skb, struct sock *sk,
 }
 
 static int tcpdiag_fill_req(struct sk_buff *skb, struct sock *sk,
-                           struct open_request *req,
+                           struct request_sock *req,
                            u32 pid, u32 seq)
 {
+       const struct inet_request_sock *ireq = inet_rsk(req);
        struct inet_sock *inet = inet_sk(sk);
        unsigned char *b = skb->tail;
        struct tcpdiagmsg *r;
@@ -482,9 +483,9 @@ static int tcpdiag_fill_req(struct sk_buff *skb, struct sock *sk,
                tmo = 0;
 
        r->id.tcpdiag_sport = inet->sport;
-       r->id.tcpdiag_dport = req->rmt_port;
-       r->id.tcpdiag_src[0] = req->af.v4_req.loc_addr;
-       r->id.tcpdiag_dst[0] = req->af.v4_req.rmt_addr;
+       r->id.tcpdiag_dport = ireq->rmt_port;
+       r->id.tcpdiag_src[0] = ireq->loc_addr;
+       r->id.tcpdiag_dst[0] = ireq->rmt_addr;
        r->tcpdiag_expires = jiffies_to_msecs(tmo),
        r->tcpdiag_rqueue = 0;
        r->tcpdiag_wqueue = 0;
@@ -493,9 +494,9 @@ static int tcpdiag_fill_req(struct sk_buff *skb, struct sock *sk,
 #ifdef CONFIG_IP_TCPDIAG_IPV6
        if (r->tcpdiag_family == AF_INET6) {
                ipv6_addr_copy((struct in6_addr *)r->id.tcpdiag_src,
-                              &req->af.v6_req.loc_addr);
+                              &tcp6_rsk(req)->loc_addr);
                ipv6_addr_copy((struct in6_addr *)r->id.tcpdiag_dst,
-                              &req->af.v6_req.rmt_addr);
+                              &tcp6_rsk(req)->rmt_addr);
        }
 #endif
        nlh->nlmsg_len = skb->tail - b;
@@ -513,7 +514,7 @@ static int tcpdiag_dump_reqs(struct sk_buff *skb, struct sock *sk,
        struct tcpdiag_entry entry;
        struct tcpdiagreq *r = NLMSG_DATA(cb->nlh);
        struct tcp_sock *tp = tcp_sk(sk);
-       struct tcp_listen_opt *lopt;
+       struct listen_sock *lopt;
        struct rtattr *bc = NULL;
        struct inet_sock *inet = inet_sk(sk);
        int j, s_j;
@@ -528,9 +529,9 @@ static int tcpdiag_dump_reqs(struct sk_buff *skb, struct sock *sk,
 
        entry.family = sk->sk_family;
 
-       read_lock_bh(&tp->syn_wait_lock);
+       read_lock_bh(&tp->accept_queue.syn_wait_lock);
 
-       lopt = tp->listen_opt;
+       lopt = tp->accept_queue.listen_opt;
        if (!lopt || !lopt->qlen)
                goto out;
 
@@ -541,13 +542,15 @@ static int tcpdiag_dump_reqs(struct sk_buff *skb, struct sock *sk,
        }
 
        for (j = s_j; j < TCP_SYNQ_HSIZE; j++) {
-               struct open_request *req, *head = lopt->syn_table[j];
+               struct request_sock *req, *head = lopt->syn_table[j];
 
                reqnum = 0;
                for (req = head; req; reqnum++, req = req->dl_next) {
+                       struct inet_request_sock *ireq = inet_rsk(req);
+
                        if (reqnum < s_reqnum)
                                continue;
-                       if (r->id.tcpdiag_dport != req->rmt_port &&
+                       if (r->id.tcpdiag_dport != ireq->rmt_port &&
                            r->id.tcpdiag_dport)
                                continue;
 
@@ -555,16 +558,16 @@ static int tcpdiag_dump_reqs(struct sk_buff *skb, struct sock *sk,
                                entry.saddr =
 #ifdef CONFIG_IP_TCPDIAG_IPV6
                                        (entry.family == AF_INET6) ?
-                                       req->af.v6_req.loc_addr.s6_addr32 :
+                                       tcp6_rsk(req)->loc_addr.s6_addr32 :
 #endif
-                                       &req->af.v4_req.loc_addr;
+                                       &ireq->loc_addr;
                                entry.daddr = 
 #ifdef CONFIG_IP_TCPDIAG_IPV6
                                        (entry.family == AF_INET6) ?
-                                       req->af.v6_req.rmt_addr.s6_addr32 :
+                                       tcp6_rsk(req)->rmt_addr.s6_addr32 :
 #endif
-                                       &req->af.v4_req.rmt_addr;
-                               entry.dport = ntohs(req->rmt_port);
+                                       &ireq->rmt_addr;
+                               entry.dport = ntohs(ireq->rmt_port);
 
                                if (!tcpdiag_bc_run(RTA_DATA(bc),
                                                    RTA_PAYLOAD(bc), &entry))
@@ -585,7 +588,7 @@ static int tcpdiag_dump_reqs(struct sk_buff *skb, struct sock *sk,
        }
 
 out:
-       read_unlock_bh(&tp->syn_wait_lock);
+       read_unlock_bh(&tp->accept_queue.syn_wait_lock);
 
        return err;
 }
index 79835a67a27420f4347aa2cab1139ae7c5724307..5bad504630a3b641158af85f402cc91da27e4d06 100644 (file)
@@ -4355,16 +4355,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
                                        goto no_ack;
                        }
 
-                       if (eaten) {
-                               if (tcp_in_quickack_mode(tp)) {
-                                       tcp_send_ack(sk);
-                               } else {
-                                       tcp_send_delayed_ack(sk);
-                               }
-                       } else {
-                               __tcp_ack_snd_check(sk, 0);
-                       }
-
+                       __tcp_ack_snd_check(sk, 0);
 no_ack:
                        if (eaten)
                                __kfree_skb(skb);
index dad98e4a50431906f3b98ec3725cd9204813363a..2d41d5d6ad1967804e7233f556c7e34c138422e8 100644 (file)
@@ -36,7 +36,7 @@
  *                                     ACK bit.
  *             Andi Kleen :            Implemented fast path mtu discovery.
  *                                     Fixed many serious bugs in the
- *                                     open_request handling and moved
+ *                                     request_sock handling and moved
  *                                     most of it into the af independent code.
  *                                     Added tail drop and some other bugfixes.
  *                                     Added new listen sematics.
@@ -869,21 +869,23 @@ static __inline__ u32 tcp_v4_synq_hash(u32 raddr, u16 rport, u32 rnd)
        return (jhash_2words(raddr, (u32) rport, rnd) & (TCP_SYNQ_HSIZE - 1));
 }
 
-static struct open_request *tcp_v4_search_req(struct tcp_sock *tp,
-                                             struct open_request ***prevp,
+static struct request_sock *tcp_v4_search_req(struct tcp_sock *tp,
+                                             struct request_sock ***prevp,
                                              __u16 rport,
                                              __u32 raddr, __u32 laddr)
 {
-       struct tcp_listen_opt *lopt = tp->listen_opt;
-       struct open_request *req, **prev;
+       struct listen_sock *lopt = tp->accept_queue.listen_opt;
+       struct request_sock *req, **prev;
 
        for (prev = &lopt->syn_table[tcp_v4_synq_hash(raddr, rport, lopt->hash_rnd)];
             (req = *prev) != NULL;
             prev = &req->dl_next) {
-               if (req->rmt_port == rport &&
-                   req->af.v4_req.rmt_addr == raddr &&
-                   req->af.v4_req.loc_addr == laddr &&
-                   TCP_INET_FAMILY(req->class->family)) {
+               const struct inet_request_sock *ireq = inet_rsk(req);
+
+               if (ireq->rmt_port == rport &&
+                   ireq->rmt_addr == raddr &&
+                   ireq->loc_addr == laddr &&
+                   TCP_INET_FAMILY(req->rsk_ops->family)) {
                        BUG_TRAP(!req->sk);
                        *prevp = prev;
                        break;
@@ -893,21 +895,13 @@ static struct open_request *tcp_v4_search_req(struct tcp_sock *tp,
        return req;
 }
 
-static void tcp_v4_synq_add(struct sock *sk, struct open_request *req)
+static void tcp_v4_synq_add(struct sock *sk, struct request_sock *req)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       struct tcp_listen_opt *lopt = tp->listen_opt;
-       u32 h = tcp_v4_synq_hash(req->af.v4_req.rmt_addr, req->rmt_port, lopt->hash_rnd);
-
-       req->expires = jiffies + TCP_TIMEOUT_INIT;
-       req->retrans = 0;
-       req->sk = NULL;
-       req->dl_next = lopt->syn_table[h];
-
-       write_lock(&tp->syn_wait_lock);
-       lopt->syn_table[h] = req;
-       write_unlock(&tp->syn_wait_lock);
+       struct listen_sock *lopt = tp->accept_queue.listen_opt;
+       u32 h = tcp_v4_synq_hash(inet_rsk(req)->rmt_addr, inet_rsk(req)->rmt_port, lopt->hash_rnd);
 
+       reqsk_queue_hash_req(&tp->accept_queue, h, req, TCP_TIMEOUT_INIT);
        tcp_synq_added(sk);
 }
 
@@ -1050,7 +1044,7 @@ void tcp_v4_err(struct sk_buff *skb, u32 info)
        }
 
        switch (sk->sk_state) {
-               struct open_request *req, **prev;
+               struct request_sock *req, **prev;
        case TCP_LISTEN:
                if (sock_owned_by_user(sk))
                        goto out;
@@ -1065,7 +1059,7 @@ void tcp_v4_err(struct sk_buff *skb, u32 info)
                 */
                BUG_TRAP(!req->sk);
 
-               if (seq != req->snt_isn) {
+               if (seq != tcp_rsk(req)->snt_isn) {
                        NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
                        goto out;
                }
@@ -1254,28 +1248,29 @@ static void tcp_v4_timewait_ack(struct sock *sk, struct sk_buff *skb)
        tcp_tw_put(tw);
 }
 
-static void tcp_v4_or_send_ack(struct sk_buff *skb, struct open_request *req)
+static void tcp_v4_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req)
 {
-       tcp_v4_send_ack(skb, req->snt_isn + 1, req->rcv_isn + 1, req->rcv_wnd,
+       tcp_v4_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd,
                        req->ts_recent);
 }
 
 static struct dst_entry* tcp_v4_route_req(struct sock *sk,
-                                         struct open_request *req)
+                                         struct request_sock *req)
 {
        struct rtable *rt;
-       struct ip_options *opt = req->af.v4_req.opt;
+       const struct inet_request_sock *ireq = inet_rsk(req);
+       struct ip_options *opt = inet_rsk(req)->opt;
        struct flowi fl = { .oif = sk->sk_bound_dev_if,
                            .nl_u = { .ip4_u =
                                      { .daddr = ((opt && opt->srr) ?
                                                  opt->faddr :
-                                                 req->af.v4_req.rmt_addr),
-                                       .saddr = req->af.v4_req.loc_addr,
+                                                 ireq->rmt_addr),
+                                       .saddr = ireq->loc_addr,
                                        .tos = RT_CONN_FLAGS(sk) } },
                            .proto = IPPROTO_TCP,
                            .uli_u = { .ports =
                                       { .sport = inet_sk(sk)->sport,
-                                        .dport = req->rmt_port } } };
+                                        .dport = ireq->rmt_port } } };
 
        if (ip_route_output_flow(&rt, &fl, sk, 0)) {
                IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES);
@@ -1291,12 +1286,13 @@ static struct dst_entry* tcp_v4_route_req(struct sock *sk,
 
 /*
  *     Send a SYN-ACK after having received an ACK.
- *     This still operates on a open_request only, not on a big
+ *     This still operates on a request_sock only, not on a big
  *     socket.
  */
-static int tcp_v4_send_synack(struct sock *sk, struct open_request *req,
+static int tcp_v4_send_synack(struct sock *sk, struct request_sock *req,
                              struct dst_entry *dst)
 {
+       const struct inet_request_sock *ireq = inet_rsk(req);
        int err = -1;
        struct sk_buff * skb;
 
@@ -1310,14 +1306,14 @@ static int tcp_v4_send_synack(struct sock *sk, struct open_request *req,
                struct tcphdr *th = skb->h.th;
 
                th->check = tcp_v4_check(th, skb->len,
-                                        req->af.v4_req.loc_addr,
-                                        req->af.v4_req.rmt_addr,
+                                        ireq->loc_addr,
+                                        ireq->rmt_addr,
                                         csum_partial((char *)th, skb->len,
                                                      skb->csum));
 
-               err = ip_build_and_send_pkt(skb, sk, req->af.v4_req.loc_addr,
-                                           req->af.v4_req.rmt_addr,
-                                           req->af.v4_req.opt);
+               err = ip_build_and_send_pkt(skb, sk, ireq->loc_addr,
+                                           ireq->rmt_addr,
+                                           ireq->opt);
                if (err == NET_XMIT_CN)
                        err = 0;
        }
@@ -1328,12 +1324,12 @@ out:
 }
 
 /*
- *     IPv4 open_request destructor.
+ *     IPv4 request_sock destructor.
  */
-static void tcp_v4_or_free(struct open_request *req)
+static void tcp_v4_reqsk_destructor(struct request_sock *req)
 {
-       if (req->af.v4_req.opt)
-               kfree(req->af.v4_req.opt);
+       if (inet_rsk(req)->opt)
+               kfree(inet_rsk(req)->opt);
 }
 
 static inline void syn_flood_warning(struct sk_buff *skb)
@@ -1349,7 +1345,7 @@ static inline void syn_flood_warning(struct sk_buff *skb)
 }
 
 /*
- * Save and compile IPv4 options into the open_request if needed.
+ * Save and compile IPv4 options into the request_sock if needed.
  */
 static inline struct ip_options *tcp_v4_save_options(struct sock *sk,
                                                     struct sk_buff *skb)
@@ -1370,33 +1366,20 @@ static inline struct ip_options *tcp_v4_save_options(struct sock *sk,
        return dopt;
 }
 
-/*
- * Maximum number of SYN_RECV sockets in queue per LISTEN socket.
- * One SYN_RECV socket costs about 80bytes on a 32bit machine.
- * It would be better to replace it with a global counter for all sockets
- * but then some measure against one socket starving all other sockets
- * would be needed.
- *
- * It was 128 by default. Experiments with real servers show, that
- * it is absolutely not enough even at 100conn/sec. 256 cures most
- * of problems. This value is adjusted to 128 for very small machines
- * (<=32Mb of memory) and to 1024 on normal or better ones (>=256Mb).
- * Further increasing requires to change hash table size.
- */
-int sysctl_max_syn_backlog = 256;
-
-struct or_calltable or_ipv4 = {
+struct request_sock_ops tcp_request_sock_ops = {
        .family         =       PF_INET,
+       .obj_size       =       sizeof(struct tcp_request_sock),
        .rtx_syn_ack    =       tcp_v4_send_synack,
-       .send_ack       =       tcp_v4_or_send_ack,
-       .destructor     =       tcp_v4_or_free,
+       .send_ack       =       tcp_v4_reqsk_send_ack,
+       .destructor     =       tcp_v4_reqsk_destructor,
        .send_reset     =       tcp_v4_send_reset,
 };
 
 int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
 {
+       struct inet_request_sock *ireq;
        struct tcp_options_received tmp_opt;
-       struct open_request *req;
+       struct request_sock *req;
        __u32 saddr = skb->nh.iph->saddr;
        __u32 daddr = skb->nh.iph->daddr;
        __u32 isn = TCP_SKB_CB(skb)->when;
@@ -1433,7 +1416,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
        if (sk_acceptq_is_full(sk) && tcp_synq_young(sk) > 1)
                goto drop;
 
-       req = tcp_openreq_alloc();
+       req = reqsk_alloc(&tcp_request_sock_ops);
        if (!req)
                goto drop;
 
@@ -1461,10 +1444,10 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
 
        tcp_openreq_init(req, &tmp_opt, skb);
 
-       req->af.v4_req.loc_addr = daddr;
-       req->af.v4_req.rmt_addr = saddr;
-       req->af.v4_req.opt = tcp_v4_save_options(sk, skb);
-       req->class = &or_ipv4;
+       ireq = inet_rsk(req);
+       ireq->loc_addr = daddr;
+       ireq->rmt_addr = saddr;
+       ireq->opt = tcp_v4_save_options(sk, skb);
        if (!want_cookie)
                TCP_ECN_create_request(req, skb->h.th);
 
@@ -1523,20 +1506,20 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
 
                isn = tcp_v4_init_sequence(sk, skb);
        }
-       req->snt_isn = isn;
+       tcp_rsk(req)->snt_isn = isn;
 
        if (tcp_v4_send_synack(sk, req, dst))
                goto drop_and_free;
 
        if (want_cookie) {
-               tcp_openreq_free(req);
+               reqsk_free(req);
        } else {
                tcp_v4_synq_add(sk, req);
        }
        return 0;
 
 drop_and_free:
-       tcp_openreq_free(req);
+       reqsk_free(req);
 drop:
        TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS);
        return 0;
@@ -1548,9 +1531,10 @@ drop:
  * now create the new socket.
  */
 struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
-                                 struct open_request *req,
+                                 struct request_sock *req,
                                  struct dst_entry *dst)
 {
+       struct inet_request_sock *ireq;
        struct inet_sock *newinet;
        struct tcp_sock *newtp;
        struct sock *newsk;
@@ -1570,11 +1554,12 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
 
        newtp                 = tcp_sk(newsk);
        newinet               = inet_sk(newsk);
-       newinet->daddr        = req->af.v4_req.rmt_addr;
-       newinet->rcv_saddr    = req->af.v4_req.loc_addr;
-       newinet->saddr        = req->af.v4_req.loc_addr;
-       newinet->opt          = req->af.v4_req.opt;
-       req->af.v4_req.opt    = NULL;
+       ireq                  = inet_rsk(req);
+       newinet->daddr        = ireq->rmt_addr;
+       newinet->rcv_saddr    = ireq->loc_addr;
+       newinet->saddr        = ireq->loc_addr;
+       newinet->opt          = ireq->opt;
+       ireq->opt             = NULL;
        newinet->mc_index     = tcp_v4_iif(skb);
        newinet->mc_ttl       = skb->nh.iph->ttl;
        newtp->ext_header_len = 0;
@@ -1605,9 +1590,9 @@ static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *skb)
        struct iphdr *iph = skb->nh.iph;
        struct tcp_sock *tp = tcp_sk(sk);
        struct sock *nsk;
-       struct open_request **prev;
+       struct request_sock **prev;
        /* Find possible connection requests. */
-       struct open_request *req = tcp_v4_search_req(tp, &prev, th->source,
+       struct request_sock *req = tcp_v4_search_req(tp, &prev, th->source,
                                                     iph->saddr, iph->daddr);
        if (req)
                return tcp_check_req(sk, skb, req, prev);
@@ -2144,13 +2129,13 @@ static void *listening_get_next(struct seq_file *seq, void *cur)
        ++st->num;
 
        if (st->state == TCP_SEQ_STATE_OPENREQ) {
-               struct open_request *req = cur;
+               struct request_sock *req = cur;
 
                tp = tcp_sk(st->syn_wait_sk);
                req = req->dl_next;
                while (1) {
                        while (req) {
-                               if (req->class->family == st->family) {
+                               if (req->rsk_ops->family == st->family) {
                                        cur = req;
                                        goto out;
                                }
@@ -2159,17 +2144,17 @@ static void *listening_get_next(struct seq_file *seq, void *cur)
                        if (++st->sbucket >= TCP_SYNQ_HSIZE)
                                break;
 get_req:
-                       req = tp->listen_opt->syn_table[st->sbucket];
+                       req = tp->accept_queue.listen_opt->syn_table[st->sbucket];
                }
                sk        = sk_next(st->syn_wait_sk);
                st->state = TCP_SEQ_STATE_LISTENING;
-               read_unlock_bh(&tp->syn_wait_lock);
+               read_unlock_bh(&tp->accept_queue.syn_wait_lock);
        } else {
                tp = tcp_sk(sk);
-               read_lock_bh(&tp->syn_wait_lock);
-               if (tp->listen_opt && tp->listen_opt->qlen)
+               read_lock_bh(&tp->accept_queue.syn_wait_lock);
+               if (reqsk_queue_len(&tp->accept_queue))
                        goto start_req;
-               read_unlock_bh(&tp->syn_wait_lock);
+               read_unlock_bh(&tp->accept_queue.syn_wait_lock);
                sk = sk_next(sk);
        }
 get_sk:
@@ -2179,8 +2164,8 @@ get_sk:
                        goto out;
                }
                tp = tcp_sk(sk);
-               read_lock_bh(&tp->syn_wait_lock);
-               if (tp->listen_opt && tp->listen_opt->qlen) {
+               read_lock_bh(&tp->accept_queue.syn_wait_lock);
+               if (reqsk_queue_len(&tp->accept_queue)) {
 start_req:
                        st->uid         = sock_i_uid(sk);
                        st->syn_wait_sk = sk;
@@ -2188,7 +2173,7 @@ start_req:
                        st->sbucket     = 0;
                        goto get_req;
                }
-               read_unlock_bh(&tp->syn_wait_lock);
+               read_unlock_bh(&tp->accept_queue.syn_wait_lock);
        }
        if (++st->bucket < TCP_LHTABLE_SIZE) {
                sk = sk_head(&tcp_listening_hash[st->bucket]);
@@ -2375,7 +2360,7 @@ static void tcp_seq_stop(struct seq_file *seq, void *v)
        case TCP_SEQ_STATE_OPENREQ:
                if (v) {
                        struct tcp_sock *tp = tcp_sk(st->syn_wait_sk);
-                       read_unlock_bh(&tp->syn_wait_lock);
+                       read_unlock_bh(&tp->accept_queue.syn_wait_lock);
                }
        case TCP_SEQ_STATE_LISTENING:
                if (v != SEQ_START_TOKEN)
@@ -2451,18 +2436,19 @@ void tcp_proc_unregister(struct tcp_seq_afinfo *afinfo)
        memset(afinfo->seq_fops, 0, sizeof(*afinfo->seq_fops)); 
 }
 
-static void get_openreq4(struct sock *sk, struct open_request *req,
+static void get_openreq4(struct sock *sk, struct request_sock *req,
                         char *tmpbuf, int i, int uid)
 {
+       const struct inet_request_sock *ireq = inet_rsk(req);
        int ttd = req->expires - jiffies;
 
        sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X"
                " %02X %08X:%08X %02X:%08lX %08X %5d %8d %u %d %p",
                i,
-               req->af.v4_req.loc_addr,
+               ireq->loc_addr,
                ntohs(inet_sk(sk)->sport),
-               req->af.v4_req.rmt_addr,
-               ntohs(req->rmt_port),
+               ireq->rmt_addr,
+               ntohs(ireq->rmt_port),
                TCP_SYN_RECV,
                0, 0, /* could print option size, but that is af dependent. */
                1,    /* timers active (only the expire timer) */
@@ -2618,6 +2604,7 @@ struct proto tcp_prot = {
        .sysctl_rmem            = sysctl_tcp_rmem,
        .max_header             = MAX_TCP_HEADER,
        .obj_size               = sizeof(struct tcp_sock),
+       .rsk_prot               = &tcp_request_sock_ops,
 };
 
 
@@ -2660,7 +2647,6 @@ EXPORT_SYMBOL(tcp_proc_register);
 EXPORT_SYMBOL(tcp_proc_unregister);
 #endif
 EXPORT_SYMBOL(sysctl_local_port_range);
-EXPORT_SYMBOL(sysctl_max_syn_backlog);
 EXPORT_SYMBOL(sysctl_tcp_low_latency);
 EXPORT_SYMBOL(sysctl_tcp_tw_reuse);
 
index eea1a17a9ac2aaaf92abe4a3ab1f4496eef5a64e..b3943e7562f31bcadd7e81ae9994146065e15170 100644 (file)
@@ -684,7 +684,7 @@ out:
  * Actually, we could lots of memory writes here. tp of listening
  * socket contains all necessary default parameters.
  */
-struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req, struct sk_buff *skb)
+struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req, struct sk_buff *skb)
 {
        /* allocate the newsk from the same slab of the master sock,
         * if not, at sk_free time we'll try to free it from the wrong
@@ -692,6 +692,8 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req,
        struct sock *newsk = sk_alloc(PF_INET, GFP_ATOMIC, sk->sk_prot, 0);
 
        if(newsk != NULL) {
+               struct inet_request_sock *ireq = inet_rsk(req);
+               struct tcp_request_sock *treq = tcp_rsk(req);
                struct tcp_sock *newtp;
                struct sk_filter *filter;
 
@@ -703,7 +705,7 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req,
                tcp_sk(newsk)->bind_hash = NULL;
 
                /* Clone the TCP header template */
-               inet_sk(newsk)->dport = req->rmt_port;
+               inet_sk(newsk)->dport = ireq->rmt_port;
 
                sock_lock_init(newsk);
                bh_lock_sock(newsk);
@@ -739,14 +741,14 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req,
                /* Now setup tcp_sock */
                newtp = tcp_sk(newsk);
                newtp->pred_flags = 0;
-               newtp->rcv_nxt = req->rcv_isn + 1;
-               newtp->snd_nxt = req->snt_isn + 1;
-               newtp->snd_una = req->snt_isn + 1;
-               newtp->snd_sml = req->snt_isn + 1;
+               newtp->rcv_nxt = treq->rcv_isn + 1;
+               newtp->snd_nxt = treq->snt_isn + 1;
+               newtp->snd_una = treq->snt_isn + 1;
+               newtp->snd_sml = treq->snt_isn + 1;
 
                tcp_prequeue_init(newtp);
 
-               tcp_init_wl(newtp, req->snt_isn, req->rcv_isn);
+               tcp_init_wl(newtp, treq->snt_isn, treq->rcv_isn);
 
                newtp->retransmits = 0;
                newtp->backoff = 0;
@@ -775,10 +777,10 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req,
                tcp_set_ca_state(newtp, TCP_CA_Open);
                tcp_init_xmit_timers(newsk);
                skb_queue_head_init(&newtp->out_of_order_queue);
-               newtp->rcv_wup = req->rcv_isn + 1;
-               newtp->write_seq = req->snt_isn + 1;
+               newtp->rcv_wup = treq->rcv_isn + 1;
+               newtp->write_seq = treq->snt_isn + 1;
                newtp->pushed_seq = newtp->write_seq;
-               newtp->copied_seq = req->rcv_isn + 1;
+               newtp->copied_seq = treq->rcv_isn + 1;
 
                newtp->rx_opt.saw_tstamp = 0;
 
@@ -788,10 +790,8 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req,
                newtp->probes_out = 0;
                newtp->rx_opt.num_sacks = 0;
                newtp->urg_data = 0;
-               newtp->listen_opt = NULL;
-               newtp->accept_queue = newtp->accept_queue_tail = NULL;
-               /* Deinitialize syn_wait_lock to trap illegal accesses. */
-               memset(&newtp->syn_wait_lock, 0, sizeof(newtp->syn_wait_lock));
+               /* Deinitialize accept_queue to trap illegal accesses. */
+               memset(&newtp->accept_queue, 0, sizeof(newtp->accept_queue));
 
                /* Back to base struct sock members. */
                newsk->sk_err = 0;
@@ -808,18 +808,18 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req,
                newsk->sk_socket = NULL;
                newsk->sk_sleep = NULL;
 
-               newtp->rx_opt.tstamp_ok = req->tstamp_ok;
-               if((newtp->rx_opt.sack_ok = req->sack_ok) != 0) {
+               newtp->rx_opt.tstamp_ok = ireq->tstamp_ok;
+               if((newtp->rx_opt.sack_ok = ireq->sack_ok) != 0) {
                        if (sysctl_tcp_fack)
                                newtp->rx_opt.sack_ok |= 2;
                }
                newtp->window_clamp = req->window_clamp;
                newtp->rcv_ssthresh = req->rcv_wnd;
                newtp->rcv_wnd = req->rcv_wnd;
-               newtp->rx_opt.wscale_ok = req->wscale_ok;
+               newtp->rx_opt.wscale_ok = ireq->wscale_ok;
                if (newtp->rx_opt.wscale_ok) {
-                       newtp->rx_opt.snd_wscale = req->snd_wscale;
-                       newtp->rx_opt.rcv_wscale = req->rcv_wscale;
+                       newtp->rx_opt.snd_wscale = ireq->snd_wscale;
+                       newtp->rx_opt.rcv_wscale = ireq->rcv_wscale;
                } else {
                        newtp->rx_opt.snd_wscale = newtp->rx_opt.rcv_wscale = 0;
                        newtp->window_clamp = min(newtp->window_clamp, 65535U);
@@ -851,12 +851,12 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req,
 
 /* 
  *     Process an incoming packet for SYN_RECV sockets represented
- *     as an open_request.
+ *     as a request_sock.
  */
 
 struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,
-                          struct open_request *req,
-                          struct open_request **prev)
+                          struct request_sock *req,
+                          struct request_sock **prev)
 {
        struct tcphdr *th = skb->h.th;
        struct tcp_sock *tp = tcp_sk(sk);
@@ -881,7 +881,7 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,
        }
 
        /* Check for pure retransmitted SYN. */
-       if (TCP_SKB_CB(skb)->seq == req->rcv_isn &&
+       if (TCP_SKB_CB(skb)->seq == tcp_rsk(req)->rcv_isn &&
            flg == TCP_FLAG_SYN &&
            !paws_reject) {
                /*
@@ -901,7 +901,7 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,
                 * Enforce "SYN-ACK" according to figure 8, figure 6
                 * of RFC793, fixed by RFC1122.
                 */
-               req->class->rtx_syn_ack(sk, req, NULL);
+               req->rsk_ops->rtx_syn_ack(sk, req, NULL);
                return NULL;
        }
 
@@ -959,7 +959,7 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,
         * Invalid ACK: reset will be sent by listening socket
         */
        if ((flg & TCP_FLAG_ACK) &&
-           (TCP_SKB_CB(skb)->ack_seq != req->snt_isn+1))
+           (TCP_SKB_CB(skb)->ack_seq != tcp_rsk(req)->snt_isn + 1))
                return sk;
 
        /* Also, it would be not so bad idea to check rcv_tsecr, which
@@ -970,10 +970,10 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,
        /* RFC793: "first check sequence number". */
 
        if (paws_reject || !tcp_in_window(TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq,
-                                         req->rcv_isn+1, req->rcv_isn+1+req->rcv_wnd)) {
+                                         tcp_rsk(req)->rcv_isn + 1, tcp_rsk(req)->rcv_isn + 1 + req->rcv_wnd)) {
                /* Out of window: send ACK and drop. */
                if (!(flg & TCP_FLAG_RST))
-                       req->class->send_ack(skb, req);
+                       req->rsk_ops->send_ack(skb, req);
                if (paws_reject)
                        NET_INC_STATS_BH(LINUX_MIB_PAWSESTABREJECTED);
                return NULL;
@@ -981,12 +981,12 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,
 
        /* In sequence, PAWS is OK. */
 
-       if (tmp_opt.saw_tstamp && !after(TCP_SKB_CB(skb)->seq, req->rcv_isn+1))
+       if (tmp_opt.saw_tstamp && !after(TCP_SKB_CB(skb)->seq, tcp_rsk(req)->rcv_isn + 1))
                        req->ts_recent = tmp_opt.rcv_tsval;
 
-               if (TCP_SKB_CB(skb)->seq == req->rcv_isn) {
+               if (TCP_SKB_CB(skb)->seq == tcp_rsk(req)->rcv_isn) {
                        /* Truncate SYN, it is out of window starting
-                          at req->rcv_isn+1. */
+                          at tcp_rsk(req)->rcv_isn + 1. */
                        flg &= ~TCP_FLAG_SYN;
                }
 
@@ -1003,8 +1003,8 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,
                        return NULL;
 
                /* If TCP_DEFER_ACCEPT is set, drop bare ACK. */
-               if (tp->defer_accept && TCP_SKB_CB(skb)->end_seq == req->rcv_isn+1) {
-                       req->acked = 1;
+               if (tp->defer_accept && TCP_SKB_CB(skb)->end_seq == tcp_rsk(req)->rcv_isn + 1) {
+                       inet_rsk(req)->acked = 1;
                        return NULL;
                }
 
@@ -1026,14 +1026,14 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,
 
        listen_overflow:
                if (!sysctl_tcp_abort_on_overflow) {
-                       req->acked = 1;
+                       inet_rsk(req)->acked = 1;
                        return NULL;
                }
 
        embryonic_reset:
                NET_INC_STATS_BH(LINUX_MIB_EMBRYONICRSTS);
                if (!(flg & TCP_FLAG_RST))
-                       req->class->send_reset(skb);
+                       req->rsk_ops->send_reset(skb);
 
                tcp_synq_drop(sk, req, prev);
                return NULL;
index fa24e7ae1f4062f666f5881d51ada562df286a56..f17c6577e337f9383ebf2cecee99858167dbf7d7 100644 (file)
@@ -1356,8 +1356,9 @@ int tcp_send_synack(struct sock *sk)
  * Prepare a SYN-ACK.
  */
 struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst,
-                                struct open_request *req)
+                                struct request_sock *req)
 {
+       struct inet_request_sock *ireq = inet_rsk(req);
        struct tcp_sock *tp = tcp_sk(sk);
        struct tcphdr *th;
        int tcp_header_size;
@@ -1373,47 +1374,47 @@ struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst,
        skb->dst = dst_clone(dst);
 
        tcp_header_size = (sizeof(struct tcphdr) + TCPOLEN_MSS +
-                          (req->tstamp_ok ? TCPOLEN_TSTAMP_ALIGNED : 0) +
-                          (req->wscale_ok ? TCPOLEN_WSCALE_ALIGNED : 0) +
+                          (ireq->tstamp_ok ? TCPOLEN_TSTAMP_ALIGNED : 0) +
+                          (ireq->wscale_ok ? TCPOLEN_WSCALE_ALIGNED : 0) +
                           /* SACK_PERM is in the place of NOP NOP of TS */
-                          ((req->sack_ok && !req->tstamp_ok) ? TCPOLEN_SACKPERM_ALIGNED : 0));
+                          ((ireq->sack_ok && !ireq->tstamp_ok) ? TCPOLEN_SACKPERM_ALIGNED : 0));
        skb->h.th = th = (struct tcphdr *) skb_push(skb, tcp_header_size);
 
        memset(th, 0, sizeof(struct tcphdr));
        th->syn = 1;
        th->ack = 1;
        if (dst->dev->features&NETIF_F_TSO)
-               req->ecn_ok = 0;
+               ireq->ecn_ok = 0;
        TCP_ECN_make_synack(req, th);
        th->source = inet_sk(sk)->sport;
-       th->dest = req->rmt_port;
-       TCP_SKB_CB(skb)->seq = req->snt_isn;
+       th->dest = ireq->rmt_port;
+       TCP_SKB_CB(skb)->seq = tcp_rsk(req)->snt_isn;
        TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq + 1;
        TCP_SKB_CB(skb)->sacked = 0;
        skb_shinfo(skb)->tso_segs = 1;
        skb_shinfo(skb)->tso_size = 0;
        th->seq = htonl(TCP_SKB_CB(skb)->seq);
-       th->ack_seq = htonl(req->rcv_isn + 1);
+       th->ack_seq = htonl(tcp_rsk(req)->rcv_isn + 1);
        if (req->rcv_wnd == 0) { /* ignored for retransmitted syns */
                __u8 rcv_wscale; 
                /* Set this up on the first call only */
                req->window_clamp = tp->window_clamp ? : dst_metric(dst, RTAX_WINDOW);
                /* tcp_full_space because it is guaranteed to be the first packet */
                tcp_select_initial_window(tcp_full_space(sk), 
-                       dst_metric(dst, RTAX_ADVMSS) - (req->tstamp_ok ? TCPOLEN_TSTAMP_ALIGNED : 0),
+                       dst_metric(dst, RTAX_ADVMSS) - (ireq->tstamp_ok ? TCPOLEN_TSTAMP_ALIGNED : 0),
                        &req->rcv_wnd,
                        &req->window_clamp,
-                       req->wscale_ok,
+                       ireq->wscale_ok,
                        &rcv_wscale);
-               req->rcv_wscale = rcv_wscale; 
+               ireq->rcv_wscale = rcv_wscale; 
        }
 
        /* RFC1323: The window in SYN & SYN/ACK segments is never scaled. */
        th->window = htons(req->rcv_wnd);
 
        TCP_SKB_CB(skb)->when = tcp_time_stamp;
-       tcp_syn_build_options((__u32 *)(th + 1), dst_metric(dst, RTAX_ADVMSS), req->tstamp_ok,
-                             req->sack_ok, req->wscale_ok, req->rcv_wscale,
+       tcp_syn_build_options((__u32 *)(th + 1), dst_metric(dst, RTAX_ADVMSS), ireq->tstamp_ok,
+                             ireq->sack_ok, ireq->wscale_ok, ireq->rcv_wscale,
                              TCP_SKB_CB(skb)->when,
                              req->ts_recent);
 
index 799ebe061e2ca51c1fdd0831e4f227211c2b71e3..b127b4498565f1801444d11abe92cefd6c1c5c54 100644 (file)
@@ -464,11 +464,11 @@ out_unlock:
 static void tcp_synack_timer(struct sock *sk)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       struct tcp_listen_opt *lopt = tp->listen_opt;
+       struct listen_sock *lopt = tp->accept_queue.listen_opt;
        int max_retries = tp->syn_retries ? : sysctl_tcp_synack_retries;
        int thresh = max_retries;
        unsigned long now = jiffies;
-       struct open_request **reqp, *req;
+       struct request_sock **reqp, *req;
        int i, budget;
 
        if (lopt == NULL || lopt->qlen == 0)
@@ -513,8 +513,8 @@ static void tcp_synack_timer(struct sock *sk)
                while ((req = *reqp) != NULL) {
                        if (time_after_eq(now, req->expires)) {
                                if ((req->retrans < thresh ||
-                                    (req->acked && req->retrans < max_retries))
-                                   && !req->class->rtx_syn_ack(sk, req, NULL)) {
+                                    (inet_rsk(req)->acked && req->retrans < max_retries))
+                                   && !req->rsk_ops->rtx_syn_ack(sk, req, NULL)) {
                                        unsigned long timeo;
 
                                        if (req->retrans++ == 0)
@@ -527,13 +527,9 @@ static void tcp_synack_timer(struct sock *sk)
                                }
 
                                /* Drop this request */
-                               write_lock(&tp->syn_wait_lock);
-                               *reqp = req->dl_next;
-                               write_unlock(&tp->syn_wait_lock);
-                               lopt->qlen--;
-                               if (req->retrans == 0)
-                                       lopt->qlen_young--;
-                               tcp_openreq_free(req);
+                               tcp_synq_unlink(tp, req, reqp);
+                               reqsk_queue_removed(&tp->accept_queue, req);
+                               reqsk_free(req);
                                continue;
                        }
                        reqp = &req->dl_next;
index 4a6952e3fee95d35d6477c82aff274b3b2bdf4da..7c24e64b443f80eae0c5a3663caff46f37011f69 100644 (file)
@@ -738,7 +738,7 @@ int udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
                        unsigned long amount;
 
                        amount = 0;
-                       spin_lock_irq(&sk->sk_receive_queue.lock);
+                       spin_lock_bh(&sk->sk_receive_queue.lock);
                        skb = skb_peek(&sk->sk_receive_queue);
                        if (skb != NULL) {
                                /*
@@ -748,7 +748,7 @@ int udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
                                 */
                                amount = skb->len - sizeof(struct udphdr);
                        }
-                       spin_unlock_irq(&sk->sk_receive_queue.lock);
+                       spin_unlock_bh(&sk->sk_receive_queue.lock);
                        return put_user(amount, (int __user *)arg);
                }
 
@@ -848,12 +848,12 @@ csum_copy_err:
        /* Clear queue. */
        if (flags&MSG_PEEK) {
                int clear = 0;
-               spin_lock_irq(&sk->sk_receive_queue.lock);
+               spin_lock_bh(&sk->sk_receive_queue.lock);
                if (skb == skb_peek(&sk->sk_receive_queue)) {
                        __skb_unlink(skb, &sk->sk_receive_queue);
                        clear = 1;
                }
-               spin_unlock_irq(&sk->sk_receive_queue.lock);
+               spin_unlock_bh(&sk->sk_receive_queue.lock);
                if (clear)
                        kfree_skb(skb);
        }
@@ -1334,7 +1334,7 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait)
                struct sk_buff_head *rcvq = &sk->sk_receive_queue;
                struct sk_buff *skb;
 
-               spin_lock_irq(&rcvq->lock);
+               spin_lock_bh(&rcvq->lock);
                while ((skb = skb_peek(rcvq)) != NULL) {
                        if (udp_checksum_complete(skb)) {
                                UDP_INC_STATS_BH(UDP_MIB_INERRORS);
@@ -1345,7 +1345,7 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait)
                                break;
                        }
                }
-               spin_unlock_irq(&rcvq->lock);
+               spin_unlock_bh(&rcvq->lock);
 
                /* nothing to see, move along */
                if (skb == NULL)
index af2392ae576965e60ec55f59e17b78167f2d0cbe..66620a95942a5f3f05f0964883eb358706130964 100644 (file)
@@ -33,6 +33,7 @@ static void xfrm4_encap(struct sk_buff *skb)
        struct dst_entry *dst = skb->dst;
        struct xfrm_state *x = dst->xfrm;
        struct iphdr *iph, *top_iph;
+       int flags;
 
        iph = skb->nh.iph;
        skb->h.ipiph = iph;
@@ -51,10 +52,13 @@ static void xfrm4_encap(struct sk_buff *skb)
 
        /* DS disclosed */
        top_iph->tos = INET_ECN_encapsulate(iph->tos, iph->tos);
-       if (x->props.flags & XFRM_STATE_NOECN)
+
+       flags = x->props.flags;
+       if (flags & XFRM_STATE_NOECN)
                IP_ECN_clear(top_iph);
 
-       top_iph->frag_off = iph->frag_off & htons(IP_DF);
+       top_iph->frag_off = (flags & XFRM_STATE_NOPMTUDISC) ?
+               0 : (iph->frag_off & htons(IP_DF));
        if (!top_iph->frag_off)
                __ip_select_ident(top_iph, dst, 0);
 
index 223a2e83853f9d6e6c8bb8802498bf907cf32d79..050611d7a9670d178c37cc6a835fd7503f0117b9 100644 (file)
@@ -7,12 +7,20 @@
  *
  */
 
+#include <net/ip.h>
 #include <net/xfrm.h>
 #include <linux/pfkeyv2.h>
 #include <linux/ipsec.h>
 
 static struct xfrm_state_afinfo xfrm4_state_afinfo;
 
+static int xfrm4_init_flags(struct xfrm_state *x)
+{
+       if (ipv4_config.no_pmtu_disc)
+               x->props.flags |= XFRM_STATE_NOPMTUDISC;
+       return 0;
+}
+
 static void
 __xfrm4_init_tempsel(struct xfrm_state *x, struct flowi *fl,
                     struct xfrm_tmpl *tmpl,
@@ -109,6 +117,7 @@ __xfrm4_find_acq(u8 mode, u32 reqid, u8 proto,
 static struct xfrm_state_afinfo xfrm4_state_afinfo = {
        .family                 = AF_INET,
        .lock                   = RW_LOCK_UNLOCKED,
+       .init_flags             = xfrm4_init_flags,
        .init_tempsel           = __xfrm4_init_tempsel,
        .state_lookup           = __xfrm4_state_lookup,
        .find_acq               = __xfrm4_find_acq,
index 413191f585f6a15656defcc90acdc9b856d397e7..e1fe360ed27ad1645a861c07ddabd2293694f694 100644 (file)
@@ -84,7 +84,7 @@ static void ipip_err(struct sk_buff *skb, u32 info)
                handler->err_handler(skb, &arg);
 }
 
-static int ipip_init_state(struct xfrm_state *x, void *args)
+static int ipip_init_state(struct xfrm_state *x)
 {
        if (!x->props.mode)
                return -EINVAL;
index 7744a2592693ff9562f14b4fa0b0cb614f71fdd7..14f5c53235fe664f71d18fca9fe0c84cf3edc2e0 100644 (file)
@@ -131,7 +131,7 @@ static void addrconf_leave_anycast(struct inet6_ifaddr *ifp);
 
 static int addrconf_ifdown(struct net_device *dev, int how);
 
-static void addrconf_dad_start(struct inet6_ifaddr *ifp, int flags);
+static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags);
 static void addrconf_dad_timer(unsigned long data);
 static void addrconf_dad_completed(struct inet6_ifaddr *ifp);
 static void addrconf_rs_timer(unsigned long data);
@@ -372,6 +372,7 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
                ndev->regen_timer.data = (unsigned long) ndev;
                if ((dev->flags&IFF_LOOPBACK) ||
                    dev->type == ARPHRD_TUNNEL ||
+                   dev->type == ARPHRD_NONE ||
                    dev->type == ARPHRD_SIT) {
                        printk(KERN_INFO
                                "Disabled Privacy Extensions on device %p(%s)\n",
@@ -491,7 +492,7 @@ void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp)
 
 static struct inet6_ifaddr *
 ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen,
-             int scope, unsigned flags)
+             int scope, u32 flags)
 {
        struct inet6_ifaddr *ifa = NULL;
        struct rt6_info *rt;
@@ -694,7 +695,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp)
 
                if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {
                        if (onlink == 0) {
-                               ip6_del_rt(rt, NULL, NULL);
+                               ip6_del_rt(rt, NULL, NULL, NULL);
                                rt = NULL;
                        } else if (!(rt->rt6i_flags & RTF_EXPIRES)) {
                                rt->rt6i_expires = expires;
@@ -1319,7 +1320,7 @@ static int __ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpad
 
 static void
 addrconf_prefix_route(struct in6_addr *pfx, int plen, struct net_device *dev,
-                     unsigned long expires, unsigned flags)
+                     unsigned long expires, u32 flags)
 {
        struct in6_rtmsg rtmsg;
 
@@ -1339,7 +1340,7 @@ addrconf_prefix_route(struct in6_addr *pfx, int plen, struct net_device *dev,
        if (dev->type == ARPHRD_SIT && (dev->flags&IFF_POINTOPOINT))
                rtmsg.rtmsg_flags |= RTF_NONEXTHOP;
 
-       ip6_route_add(&rtmsg, NULL, NULL);
+       ip6_route_add(&rtmsg, NULL, NULL, NULL);
 }
 
 /* Create "default" multicast route to the interface */
@@ -1356,7 +1357,7 @@ static void addrconf_add_mroute(struct net_device *dev)
        rtmsg.rtmsg_ifindex = dev->ifindex;
        rtmsg.rtmsg_flags = RTF_UP;
        rtmsg.rtmsg_type = RTMSG_NEWROUTE;
-       ip6_route_add(&rtmsg, NULL, NULL);
+       ip6_route_add(&rtmsg, NULL, NULL, NULL);
 }
 
 static void sit_route_add(struct net_device *dev)
@@ -1373,7 +1374,7 @@ static void sit_route_add(struct net_device *dev)
        rtmsg.rtmsg_flags       = RTF_UP|RTF_NONEXTHOP;
        rtmsg.rtmsg_ifindex     = dev->ifindex;
 
-       ip6_route_add(&rtmsg, NULL, NULL);
+       ip6_route_add(&rtmsg, NULL, NULL, NULL);
 }
 
 static void addrconf_add_lroute(struct net_device *dev)
@@ -1466,7 +1467,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
                if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {
                        if (rt->rt6i_flags&RTF_EXPIRES) {
                                if (valid_lft == 0) {
-                                       ip6_del_rt(rt, NULL, NULL);
+                                       ip6_del_rt(rt, NULL, NULL, NULL);
                                        rt = NULL;
                                } else {
                                        rt->rt6i_expires = rt_expires;
@@ -2228,7 +2229,7 @@ out:
 /*
  *     Duplicate Address Detection
  */
-static void addrconf_dad_start(struct inet6_ifaddr *ifp, int flags)
+static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags)
 {
        struct inet6_dev *idev = ifp->idev;
        struct net_device *dev = idev->dev;
@@ -2621,15 +2622,14 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 }
 
 static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa,
-                            u32 pid, u32 seq, int event)
+                            u32 pid, u32 seq, int event, unsigned int flags)
 {
        struct ifaddrmsg *ifm;
        struct nlmsghdr  *nlh;
        struct ifa_cacheinfo ci;
        unsigned char    *b = skb->tail;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm));
-       if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags);
        ifm = NLMSG_DATA(nlh);
        ifm->ifa_family = AF_INET6;
        ifm->ifa_prefixlen = ifa->prefix_len;
@@ -2671,15 +2671,14 @@ rtattr_failure:
 }
 
 static int inet6_fill_ifmcaddr(struct sk_buff *skb, struct ifmcaddr6 *ifmca,
-                               u32 pid, u32 seq, int event)
+                               u32 pid, u32 seq, int event, u16 flags)
 {
        struct ifaddrmsg *ifm;
        struct nlmsghdr  *nlh;
        struct ifa_cacheinfo ci;
        unsigned char    *b = skb->tail;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm));
-       if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags);
        ifm = NLMSG_DATA(nlh);
        ifm->ifa_family = AF_INET6;     
        ifm->ifa_prefixlen = 128;
@@ -2708,15 +2707,14 @@ rtattr_failure:
 }
 
 static int inet6_fill_ifacaddr(struct sk_buff *skb, struct ifacaddr6 *ifaca,
-                               u32 pid, u32 seq, int event)
+                               u32 pid, u32 seq, int event, unsigned int flags)
 {
        struct ifaddrmsg *ifm;
        struct nlmsghdr  *nlh;
        struct ifa_cacheinfo ci;
        unsigned char    *b = skb->tail;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm));
-       if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags);
        ifm = NLMSG_DATA(nlh);
        ifm->ifa_family = AF_INET6;     
        ifm->ifa_prefixlen = 128;
@@ -2785,7 +2783,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
                                        continue;
                                if ((err = inet6_fill_ifaddr(skb, ifa, 
                                    NETLINK_CB(cb->skb).pid, 
-                                   cb->nlh->nlmsg_seq, RTM_NEWADDR)) <= 0)
+                                   cb->nlh->nlmsg_seq, RTM_NEWADDR,
+                                   NLM_F_MULTI)) <= 0)
                                        goto done;
                        }
                        /* temp addr */
@@ -2796,7 +2795,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
                                        continue;
                                if ((err = inet6_fill_ifaddr(skb, ifa, 
                                    NETLINK_CB(cb->skb).pid, 
-                                   cb->nlh->nlmsg_seq, RTM_NEWADDR)) <= 0) 
+                                   cb->nlh->nlmsg_seq, RTM_NEWADDR,
+                                   NLM_F_MULTI)) <= 0) 
                                        goto done;
                        }
 #endif
@@ -2809,7 +2809,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
                                        continue;
                                if ((err = inet6_fill_ifmcaddr(skb, ifmca, 
                                    NETLINK_CB(cb->skb).pid, 
-                                   cb->nlh->nlmsg_seq, RTM_GETMULTICAST)) <= 0)
+                                   cb->nlh->nlmsg_seq, RTM_GETMULTICAST,
+                                   NLM_F_MULTI)) <= 0)
                                        goto done;
                        }
                        break;
@@ -2821,7 +2822,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
                                        continue;
                                if ((err = inet6_fill_ifacaddr(skb, ifaca, 
                                    NETLINK_CB(cb->skb).pid, 
-                                   cb->nlh->nlmsg_seq, RTM_GETANYCAST)) <= 0) 
+                                   cb->nlh->nlmsg_seq, RTM_GETANYCAST,
+                                   NLM_F_MULTI)) <= 0) 
                                        goto done;
                        }
                        break;
@@ -2871,7 +2873,7 @@ static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa)
                netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, ENOBUFS);
                return;
        }
-       if (inet6_fill_ifaddr(skb, ifa, 0, 0, event) < 0) {
+       if (inet6_fill_ifaddr(skb, ifa, current->pid, 0, event, 0) < 0) {
                kfree_skb(skb);
                netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, EINVAL);
                return;
@@ -2906,7 +2908,7 @@ static void inline ipv6_store_devconf(struct ipv6_devconf *cnf,
 }
 
 static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, 
-                            u32 pid, u32 seq, int event)
+                            u32 pid, u32 seq, int event, unsigned int flags)
 {
        struct net_device       *dev = idev->dev;
        __s32                   *array = NULL;
@@ -2917,8 +2919,7 @@ static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
        __u32                   mtu = dev->mtu;
        struct ifla_cacheinfo   ci;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*r));
-       if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*r), flags);
        r = NLMSG_DATA(nlh);
        r->ifi_family = AF_INET6;
        r->ifi_type = dev->type;
@@ -2985,7 +2986,7 @@ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
                if ((idev = in6_dev_get(dev)) == NULL)
                        continue;
                err = inet6_fill_ifinfo(skb, idev, NETLINK_CB(cb->skb).pid, 
-                               cb->nlh->nlmsg_seq, RTM_NEWLINK);
+                               cb->nlh->nlmsg_seq, RTM_NEWLINK, NLM_F_MULTI);
                in6_dev_put(idev);
                if (err <= 0)
                        break;
@@ -3007,7 +3008,7 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev)
                netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFINFO, ENOBUFS);
                return;
        }
-       if (inet6_fill_ifinfo(skb, idev, 0, 0, event) < 0) {
+       if (inet6_fill_ifinfo(skb, idev, current->pid, 0, event, 0) < 0) {
                kfree_skb(skb);
                netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFINFO, EINVAL);
                return;
@@ -3017,18 +3018,15 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev)
 }
 
 static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev,
-                       struct prefix_info *pinfo, u32 pid, u32 seq, int event)
+                       struct prefix_info *pinfo, u32 pid, u32 seq, 
+                       int event, unsigned int flags)
 {
        struct prefixmsg        *pmsg;
        struct nlmsghdr         *nlh;
        unsigned char           *b = skb->tail;
        struct prefix_cacheinfo ci;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*pmsg));
-       
-       if (pid) 
-               nlh->nlmsg_flags |= NLM_F_MULTI;
-       
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*pmsg), flags);
        pmsg = NLMSG_DATA(nlh);
        pmsg->prefix_family = AF_INET6;
        pmsg->prefix_ifindex = idev->dev->ifindex;
@@ -3067,7 +3065,7 @@ static void inet6_prefix_notify(int event, struct inet6_dev *idev,
                netlink_set_err(rtnl, 0, RTMGRP_IPV6_PREFIX, ENOBUFS);
                return;
        }
-       if (inet6_fill_prefix(skb, idev, pinfo, 0, 0, event) < 0) {
+       if (inet6_fill_prefix(skb, idev, pinfo, current->pid, 0, event, 0) < 0) {
                kfree_skb(skb);
                netlink_set_err(rtnl, 0, RTMGRP_IPV6_PREFIX, EINVAL);
                return;
@@ -3096,7 +3094,7 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
        switch (event) {
        case RTM_NEWADDR:
                dst_hold(&ifp->rt->u.dst);
-               if (ip6_ins_rt(ifp->rt, NULL, NULL))
+               if (ip6_ins_rt(ifp->rt, NULL, NULL, NULL))
                        dst_release(&ifp->rt->u.dst);
                if (ifp->idev->cnf.forwarding)
                        addrconf_join_anycast(ifp);
@@ -3106,7 +3104,7 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
                        addrconf_leave_anycast(ifp);
                addrconf_leave_solict(ifp->idev, &ifp->addr);
                dst_hold(&ifp->rt->u.dst);
-               if (ip6_del_rt(ifp->rt, NULL, NULL))
+               if (ip6_del_rt(ifp->rt, NULL, NULL, NULL))
                        dst_free(&ifp->rt->u.dst);
                else
                        dst_release(&ifp->rt->u.dst);
index e3ecf626cbf7944cded30013de71bb25fe190adc..986fdfdccbcdee96a9f2b7d014fa7575ae4bd386 100644 (file)
@@ -339,7 +339,7 @@ static void ah6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
        xfrm_state_put(x);
 }
 
-static int ah6_init_state(struct xfrm_state *x, void *args)
+static int ah6_init_state(struct xfrm_state *x)
 {
        struct ah_data *ahp = NULL;
        struct xfrm_algo_desc *aalg_desc;
index 5d22ca3cca2ebca84348fb44aebde51ee9e396ff..6b7294047238387ea6c20420938f8b46990c057b 100644 (file)
@@ -337,7 +337,7 @@ int ipv6_dev_ac_inc(struct net_device *dev, struct in6_addr *addr)
        write_unlock_bh(&idev->lock);
 
        dst_hold(&rt->u.dst);
-       if (ip6_ins_rt(rt, NULL, NULL))
+       if (ip6_ins_rt(rt, NULL, NULL, NULL))
                dst_release(&rt->u.dst);
 
        addrconf_join_solict(dev, &aca->aca_addr);
@@ -380,7 +380,7 @@ int __ipv6_dev_ac_dec(struct inet6_dev *idev, struct in6_addr *addr)
        addrconf_leave_solict(idev, &aca->aca_addr);
 
        dst_hold(&aca->aca_rt->u.dst);
-       if (ip6_del_rt(aca->aca_rt, NULL, NULL))
+       if (ip6_del_rt(aca->aca_rt, NULL, NULL, NULL))
                dst_free(&aca->aca_rt->u.dst);
        else
                dst_release(&aca->aca_rt->u.dst);
index 65b9375df57d7d95d04ea6a3da309898a751f0f3..5229365cd8b4849371e498489fe0fe65427c6aa8 100644 (file)
@@ -353,14 +353,14 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
        err = copied;
 
        /* Reset and regenerate socket error */
-       spin_lock_irq(&sk->sk_error_queue.lock);
+       spin_lock_bh(&sk->sk_error_queue.lock);
        sk->sk_err = 0;
        if ((skb2 = skb_peek(&sk->sk_error_queue)) != NULL) {
                sk->sk_err = SKB_EXT_ERR(skb2)->ee.ee_errno;
-               spin_unlock_irq(&sk->sk_error_queue.lock);
+               spin_unlock_bh(&sk->sk_error_queue.lock);
                sk->sk_error_report(sk);
        } else {
-               spin_unlock_irq(&sk->sk_error_queue.lock);
+               spin_unlock_bh(&sk->sk_error_queue.lock);
        }
 
 out_free_skb:  
index be7095d6babefaad31d81b57338ded650f0f8eec..324db62515a29e88c51c3fff9fe48e2960ac51da 100644 (file)
@@ -296,7 +296,7 @@ static void esp6_destroy(struct xfrm_state *x)
        kfree(esp);
 }
 
-static int esp6_init_state(struct xfrm_state *x, void *args)
+static int esp6_init_state(struct xfrm_state *x)
 {
        struct esp_data *esp = NULL;
 
index 8e0f569b883e419acd311e79670d9ea916f0a034..ff3ec9822e36bb5e8c0100014c20bd8e3b14af50 100644 (file)
@@ -277,8 +277,8 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
 {
        struct inet6_dev *idev = NULL;
        struct ipv6hdr *hdr = skb->nh.ipv6h;
-       struct sock *sk = icmpv6_socket->sk;
-       struct ipv6_pinfo *np = inet6_sk(sk);
+       struct sock *sk;
+       struct ipv6_pinfo *np;
        struct in6_addr *saddr = NULL;
        struct dst_entry *dst;
        struct icmp6hdr tmp_hdr;
@@ -358,6 +358,9 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
        if (icmpv6_xmit_lock())
                return;
 
+       sk = icmpv6_socket->sk;
+       np = inet6_sk(sk);
+
        if (!icmpv6_xrlim_allow(sk, type, &fl))
                goto out;
 
@@ -423,9 +426,9 @@ out:
 
 static void icmpv6_echo_reply(struct sk_buff *skb)
 {
-       struct sock *sk = icmpv6_socket->sk;
+       struct sock *sk;
        struct inet6_dev *idev;
-       struct ipv6_pinfo *np = inet6_sk(sk);
+       struct ipv6_pinfo *np;
        struct in6_addr *saddr = NULL;
        struct icmp6hdr *icmph = (struct icmp6hdr *) skb->h.raw;
        struct icmp6hdr tmp_hdr;
@@ -454,6 +457,9 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
        if (icmpv6_xmit_lock())
                return;
 
+       sk = icmpv6_socket->sk;
+       np = inet6_sk(sk);
+
        if (!fl.oif && ipv6_addr_is_multicast(&fl.fl6_dst))
                fl.oif = np->mcast_oif;
 
index 405740b75abb7f693d66285815ffdd24a9f17740..1b354aa979340f41c0bc5d413f87dbdf2ff69117 100644 (file)
@@ -394,7 +394,7 @@ insert_above:
  */
 
 static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
-    struct nlmsghdr *nlh)
+               struct nlmsghdr *nlh,  struct netlink_skb_parms *req)
 {
        struct rt6_info *iter = NULL;
        struct rt6_info **ins;
@@ -449,7 +449,7 @@ out:
        *ins = rt;
        rt->rt6i_node = fn;
        atomic_inc(&rt->rt6i_ref);
-       inet6_rt_notify(RTM_NEWROUTE, rt, nlh);
+       inet6_rt_notify(RTM_NEWROUTE, rt, nlh, req);
        rt6_stats.fib_rt_entries++;
 
        if ((fn->fn_flags & RTN_RTINFO) == 0) {
@@ -479,7 +479,8 @@ void fib6_force_start_gc(void)
  *     with source addr info in sub-trees
  */
 
-int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr)
+int fib6_add(struct fib6_node *root, struct rt6_info *rt, 
+               struct nlmsghdr *nlh, void *_rtattr, struct netlink_skb_parms *req)
 {
        struct fib6_node *fn;
        int err = -ENOMEM;
@@ -552,7 +553,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nlmsghdr *nlh,
        }
 #endif
 
-       err = fib6_add_rt2node(fn, rt, nlh);
+       err = fib6_add_rt2node(fn, rt, nlh, req);
 
        if (err == 0) {
                fib6_start_gc(rt);
@@ -859,7 +860,7 @@ static struct fib6_node * fib6_repair_tree(struct fib6_node *fn)
 }
 
 static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp,
-    struct nlmsghdr *nlh, void *_rtattr)
+    struct nlmsghdr *nlh, void *_rtattr, struct netlink_skb_parms *req)
 {
        struct fib6_walker_t *w;
        struct rt6_info *rt = *rtp;
@@ -915,11 +916,11 @@ static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp,
                if (atomic_read(&rt->rt6i_ref) != 1) BUG();
        }
 
-       inet6_rt_notify(RTM_DELROUTE, rt, nlh);
+       inet6_rt_notify(RTM_DELROUTE, rt, nlh, req);
        rt6_release(rt);
 }
 
-int fib6_del(struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr)
+int fib6_del(struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr, struct netlink_skb_parms *req)
 {
        struct fib6_node *fn = rt->rt6i_node;
        struct rt6_info **rtp;
@@ -944,7 +945,7 @@ int fib6_del(struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr)
 
        for (rtp = &fn->leaf; *rtp; rtp = &(*rtp)->u.next) {
                if (*rtp == rt) {
-                       fib6_del_route(fn, rtp, nlh, _rtattr);
+                       fib6_del_route(fn, rtp, nlh, _rtattr, req);
                        return 0;
                }
        }
@@ -1073,7 +1074,7 @@ static int fib6_clean_node(struct fib6_walker_t *w)
                res = c->func(rt, c->arg);
                if (res < 0) {
                        w->leaf = rt;
-                       res = fib6_del(rt, NULL, NULL);
+                       res = fib6_del(rt, NULL, NULL, NULL);
                        if (res) {
 #if RT6_DEBUG >= 2
                                printk(KERN_DEBUG "fib6_clean_node: del failed: rt=%p@%p err=%d\n", rt, rt->rt6i_node, res);
index a93f6dc51979f84f61e5fc277a451d5fdcdb1032..0e5f7499debb81ce758d4e788d2182d07c5d2b53 100644 (file)
@@ -535,10 +535,12 @@ release:
                if (err)
                        goto done;
 
-               /* Do not check for fault */
-               if (!freq.flr_label)
-                       copy_to_user(&((struct in6_flowlabel_req __user *) optval)->flr_label,
-                                    &fl->label, sizeof(fl->label));
+               if (!freq.flr_label) {
+                       if (copy_to_user(&((struct in6_flowlabel_req __user *) optval)->flr_label,
+                                        &fl->label, sizeof(fl->label))) {
+                               /* Intentionally ignore fault. */
+                       }
+               }
 
                sfl1->fl = fl;
                sfl1->next = np->ipv6_fl_list;
index 0f0711417c9da71d7595e6019033b8976d479b03..06e7cdaeedc56af64c86dc30bb1b1da262e5e08b 100644 (file)
@@ -484,9 +484,6 @@ static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from)
        to->nf_bridge = from->nf_bridge;
        nf_bridge_get(to->nf_bridge);
 #endif
-#ifdef CONFIG_NETFILTER_DEBUG
-       to->nf_debug = from->nf_debug;
-#endif
 #endif
 }
 
@@ -552,13 +549,17 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
                            skb_headroom(frag) < hlen)
                            goto slow_path;
 
-                       /* Correct socket ownership. */
-                       if (frag->sk == NULL)
-                               goto slow_path;
-
                        /* Partially cloned skb? */
                        if (skb_shared(frag))
                                goto slow_path;
+
+                       BUG_ON(frag->sk);
+                       if (skb->sk) {
+                               sock_hold(skb->sk);
+                               frag->sk = skb->sk;
+                               frag->destructor = sock_wfree;
+                               skb->truesize -= frag->truesize;
+                       }
                }
 
                err = 0;
@@ -1116,12 +1117,10 @@ int ip6_push_pending_frames(struct sock *sk)
                tail_skb = &(tmp_skb->next);
                skb->len += tmp_skb->len;
                skb->data_len += tmp_skb->len;
-#if 0 /* Logically correct, but useless work, ip_fragment() will have to undo */
                skb->truesize += tmp_skb->truesize;
                __sock_put(tmp_skb->sk);
                tmp_skb->destructor = NULL;
                tmp_skb->sk = NULL;
-#endif
        }
 
        ipv6_addr_copy(final_dst, &fl->fl6_dst);
index 3b1c9fa184ae68e81cf3d3ac8fd3c543317a2602..ba3b0c267f759565c3eab810e3ed8bbbaaa91bfd 100644 (file)
@@ -882,6 +882,7 @@ ip6ip6_tnl_change(struct ip6_tnl *t, struct ip6_tnl_parm *p)
        t->parms.hop_limit = p->hop_limit;
        t->parms.encap_limit = p->encap_limit;
        t->parms.flowinfo = p->flowinfo;
+       t->parms.link = p->link;
        ip6ip6_tnl_link_config(t);
        return 0;
 }
index 6cde5310cd76b195264b6829725288d91c6d995d..423feb46ccc026841ea52ef771d8f85842944dc1 100644 (file)
@@ -234,14 +234,9 @@ static struct xfrm_state *ipcomp6_tunnel_create(struct xfrm_state *x)
        t->props.mode = 1;
        memcpy(t->props.saddr.a6, x->props.saddr.a6, sizeof(struct in6_addr));
 
-       t->type = xfrm_get_type(IPPROTO_IPV6, t->props.family);
-       if (t->type == NULL)
+       if (xfrm_init_state(t))
                goto error;
 
-       if (t->type->init_state(t, NULL))
-               goto error;
-
-       t->km.state = XFRM_STATE_VALID;
        atomic_set(&t->tunnel_users, 1);
 
 out:
@@ -420,7 +415,7 @@ static void ipcomp6_destroy(struct xfrm_state *x)
        xfrm6_tunnel_free_spi((xfrm_address_t *)&x->props.saddr);
 }
 
-static int ipcomp6_init_state(struct xfrm_state *x, void *args)
+static int ipcomp6_init_state(struct xfrm_state *x)
 {
        int err;
        struct ipcomp_data *ipcd;
index 279ab86be662000d7a4fbc04aac630a5af15e5a7..f3ef4c38d315fbdff7786fd04b03d435cff9270c 100644 (file)
@@ -423,11 +423,12 @@ done:
                        psin6 = (struct sockaddr_in6 *)&greqs.gsr_group;
                        retv = ipv6_sock_mc_join(sk, greqs.gsr_interface,
                                &psin6->sin6_addr);
-                       if (retv)
+                       /* prior join w/ different source is ok */
+                       if (retv && retv != -EADDRINUSE)
                                break;
                        omode = MCAST_INCLUDE;
                        add = 1;
-               } else /*IP_DROP_SOURCE_MEMBERSHIP */ {
+               } else /* MCAST_LEAVE_SOURCE_GROUP */ {
                        omode = MCAST_INCLUDE;
                        add = 0;
                }
index 2f4c91ddc9a36c12d87cd57042a5d5d3644a1fd2..5ade5a5d199053dc20d349a8c8f313263a240260 100644 (file)
@@ -37,5 +37,4 @@ EXPORT_SYMBOL(in6_dev_finish_destroy);
 EXPORT_SYMBOL(xfrm6_rcv);
 #endif
 EXPORT_SYMBOL(rt6_lookup);
-EXPORT_SYMBOL(fl6_sock_lookup);
 EXPORT_SYMBOL(ipv6_push_nfrag_opts);
index 393b6e6f50a9626e2894c9a5abd8dafd903e5eba..562fcd14fdeab0acd75afd019d822ee79968ede1 100644 (file)
@@ -188,6 +188,16 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, struct in6_addr *addr)
        if (!ipv6_addr_is_multicast(addr))
                return -EINVAL;
 
+       read_lock_bh(&ipv6_sk_mc_lock);
+       for (mc_lst=np->ipv6_mc_list; mc_lst; mc_lst=mc_lst->next) {
+               if ((ifindex == 0 || mc_lst->ifindex == ifindex) &&
+                   ipv6_addr_equal(&mc_lst->addr, addr)) {
+                       read_unlock_bh(&ipv6_sk_mc_lock);
+                       return -EADDRINUSE;
+               }
+       }
+       read_unlock_bh(&ipv6_sk_mc_lock);
+
        mc_lst = sock_kmalloc(sk, sizeof(struct ipv6_mc_socklist), GFP_KERNEL);
 
        if (mc_lst == NULL)
@@ -349,6 +359,7 @@ int ip6_mc_source(int add, int omode, struct sock *sk,
        struct ipv6_pinfo *inet6 = inet6_sk(sk);
        struct ip6_sf_socklist *psl;
        int i, j, rv;
+       int leavegroup = 0;
        int err;
 
        if (pgsr->gsr_group.ss_family != AF_INET6 ||
@@ -368,6 +379,7 @@ int ip6_mc_source(int add, int omode, struct sock *sk,
 
        err = -EADDRNOTAVAIL;
 
+       read_lock_bh(&ipv6_sk_mc_lock);
        for (pmc=inet6->ipv6_mc_list; pmc; pmc=pmc->next) {
                if (pgsr->gsr_interface && pmc->ifindex != pgsr->gsr_interface)
                        continue;
@@ -401,6 +413,12 @@ int ip6_mc_source(int add, int omode, struct sock *sk,
                if (rv)         /* source not found */
                        goto done;
 
+               /* special case - (INCLUDE, empty) == LEAVE_GROUP */
+               if (psl->sl_count == 1 && omode == MCAST_INCLUDE) {
+                       leavegroup = 1;
+                       goto done;
+               }
+
                /* update the interface filter */
                ip6_mc_del_src(idev, group, omode, 1, source, 1);
 
@@ -453,9 +471,12 @@ int ip6_mc_source(int add, int omode, struct sock *sk,
        /* update the interface list */
        ip6_mc_add_src(idev, group, omode, 1, source, 1);
 done:
+       read_unlock_bh(&ipv6_sk_mc_lock);
        read_unlock_bh(&idev->lock);
        in6_dev_put(idev);
        dev_put(dev);
+       if (leavegroup)
+               return ipv6_sock_mc_drop(sk, pgsr->gsr_interface, group);
        return err;
 }
 
@@ -1280,15 +1301,6 @@ static struct sk_buff *mld_newpack(struct net_device *dev, int size)
                return NULL;
 
        skb_reserve(skb, LL_RESERVED_SPACE(dev));
-       if (dev->hard_header) {
-               unsigned char ha[MAX_ADDR_LEN];
-
-               ndisc_mc_map(&mld2_all_mcr, ha, dev, 1);
-               if (dev->hard_header(skb, dev, ETH_P_IPV6,ha,NULL,size) < 0) {
-                       kfree_skb(skb);
-                       return NULL;
-               }
-       }
 
        if (ipv6_get_lladdr(dev, &addr_buf)) {
                /* <draft-ietf-magma-mld-source-05.txt>:
@@ -1312,6 +1324,30 @@ static struct sk_buff *mld_newpack(struct net_device *dev, int size)
        return skb;
 }
 
+static inline int mld_dev_queue_xmit2(struct sk_buff *skb)
+{
+       struct net_device *dev = skb->dev;
+
+       if (dev->hard_header) {
+               unsigned char ha[MAX_ADDR_LEN];
+               int err;
+
+               ndisc_mc_map(&skb->nh.ipv6h->daddr, ha, dev, 1);
+               err = dev->hard_header(skb, dev, ETH_P_IPV6, ha, NULL, skb->len);
+               if (err < 0) {
+                       kfree_skb(skb);
+                       return err;
+               }
+       }
+       return dev_queue_xmit(skb);
+}
+
+static inline int mld_dev_queue_xmit(struct sk_buff *skb)
+{
+       return NF_HOOK(PF_INET6, NF_IP6_POST_ROUTING, skb, NULL, skb->dev,
+                      mld_dev_queue_xmit2);
+}
+
 static void mld_sendpack(struct sk_buff *skb)
 {
        struct ipv6hdr *pip6 = skb->nh.ipv6h;
@@ -1329,7 +1365,7 @@ static void mld_sendpack(struct sk_buff *skb)
        pmr->csum = csum_ipv6_magic(&pip6->saddr, &pip6->daddr, mldlen,
                IPPROTO_ICMPV6, csum_partial(skb->h.raw, mldlen, 0));
        err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, skb->dev,
-               dev_queue_xmit);
+               mld_dev_queue_xmit);
        if (!err) {
                ICMP6_INC_STATS(idev,ICMP6_MIB_OUTMSGS);
                IP6_INC_STATS(IPSTATS_MIB_OUTMCASTPKTS);
@@ -1635,12 +1671,6 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
        }
 
        skb_reserve(skb, LL_RESERVED_SPACE(dev));
-       if (dev->hard_header) {
-               unsigned char ha[MAX_ADDR_LEN];
-               ndisc_mc_map(snd_addr, ha, dev, 1);
-               if (dev->hard_header(skb, dev, ETH_P_IPV6, ha, NULL, full_len) < 0)
-                       goto out;
-       }
 
        if (ipv6_get_lladdr(dev, &addr_buf)) {
                /* <draft-ietf-magma-mld-source-05.txt>:
@@ -1668,7 +1698,7 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
        idev = in6_dev_get(skb->dev);
 
        err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, skb->dev,
-               dev_queue_xmit);
+               mld_dev_queue_xmit);
        if (!err) {
                if (type == ICMPV6_MGM_REDUCTION)
                        ICMP6_INC_STATS(idev, ICMP6_MIB_OUTGROUPMEMBREDUCTIONS);
@@ -1682,10 +1712,6 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
        if (likely(idev != NULL))
                in6_dev_put(idev);
        return;
-
-out:
-       IP6_INC_STATS(IPSTATS_MIB_OUTDISCARDS);
-       kfree_skb(skb);
 }
 
 static int ip6_mc_del1_src(struct ifmcaddr6 *pmc, int sfmode,
index 7c291f4e9edce067774e38458e727a27bf640f68..7ae72d4c9bd2cbc31cb23f8ad553109bd5fd657a 100644 (file)
@@ -955,7 +955,7 @@ static void ndisc_recv_na(struct sk_buff *skb)
                        struct rt6_info *rt;
                        rt = rt6_get_dflt_router(saddr, dev);
                        if (rt)
-                               ip6_del_rt(rt, NULL, NULL);
+                               ip6_del_rt(rt, NULL, NULL, NULL);
                }
 
 out:
@@ -1096,7 +1096,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
 
        if (rt && lifetime == 0) {
                neigh_clone(neigh);
-               ip6_del_rt(rt, NULL, NULL);
+               ip6_del_rt(rt, NULL, NULL, NULL);
                rt = NULL;
        }
 
index c735276fdd5fbcd6c31f040d470bb79cd5998032..73034511c8db49d8b03ec2f441899a2118523af1 100644 (file)
@@ -71,7 +71,6 @@ static DECLARE_MUTEX(ip6t_mutex);
 /* Must have mutex */
 #define ASSERT_READ_LOCK(x) IP_NF_ASSERT(down_trylock(&ip6t_mutex) != 0)
 #define ASSERT_WRITE_LOCK(x) IP_NF_ASSERT(down_trylock(&ip6t_mutex) != 0)
-#include <linux/netfilter_ipv4/lockhelp.h>
 #include <linux/netfilter_ipv4/listhelp.h>
 
 #if 0
index bfc3d0185d19bba36278299eb55d3ee7ed1b2012..c44685e391b7e80b64ff733e144ae1a70daa1a19 100644 (file)
@@ -366,8 +366,6 @@ ip6t_log_packet(unsigned int hooknum,
                const char *level_string,
                const char *prefix)
 {
-       struct ipv6hdr *ipv6h = skb->nh.ipv6h;
-
        spin_lock_bh(&log_lock);
        printk(level_string);
        printk("%sIN=%s OUT=%s ",
@@ -377,39 +375,25 @@ ip6t_log_packet(unsigned int hooknum,
        if (in && !out) {
                /* MAC logging for input chain only. */
                printk("MAC=");
-               if (skb->dev && skb->dev->hard_header_len && skb->mac.raw != (void*)ipv6h) {
-                       if (skb->dev->type != ARPHRD_SIT){
-                         int i;
-                         unsigned char *p = skb->mac.raw;
-                         for (i = 0; i < skb->dev->hard_header_len; i++,p++)
-                               printk("%02x%c", *p,
-                                       i==skb->dev->hard_header_len - 1
-                                       ? ' ':':');
-                       } else {
-                         int i;
-                         unsigned char *p = skb->mac.raw;
-                         if ( p - (ETH_ALEN*2+2) > skb->head ){
-                           p -= (ETH_ALEN+2);
-                           for (i = 0; i < (ETH_ALEN); i++,p++)
-                               printk("%02x%s", *p,
-                                       i == ETH_ALEN-1 ? "->" : ":");
-                           p -= (ETH_ALEN*2);
-                           for (i = 0; i < (ETH_ALEN); i++,p++)
-                               printk("%02x%c", *p,
-                                       i == ETH_ALEN-1 ? ' ' : ':');
-                         }
-                         
-                         if ((skb->dev->addr_len == 4) &&
-                             skb->dev->hard_header_len > 20){
-                           printk("TUNNEL=");
-                           p = skb->mac.raw + 12;
-                           for (i = 0; i < 4; i++,p++)
-                               printk("%3d%s", *p,
-                                       i == 3 ? "->" : ".");
-                           for (i = 0; i < 4; i++,p++)
-                               printk("%3d%c", *p,
-                                       i == 3 ? ' ' : '.');
-                         }
+               if (skb->dev && skb->dev->hard_header_len &&
+                   skb->mac.raw != skb->nh.raw) {
+                       unsigned char *p = skb->mac.raw;
+                       int i;
+
+                       if (skb->dev->type == ARPHRD_SIT &&
+                           (p -= ETH_HLEN) < skb->head)
+                               p = NULL;
+
+                       if (p != NULL)
+                               for (i = 0; i < skb->dev->hard_header_len; i++)
+                                       printk("%02x", p[i]);
+                       printk(" ");
+
+                       if (skb->dev->type == ARPHRD_SIT) {
+                               struct iphdr *iph = (struct iphdr *)skb->mac.raw;
+                               printk("TUNNEL=%u.%u.%u.%u->%u.%u.%u.%u ",
+                                      NIPQUAD(iph->saddr),
+                                      NIPQUAD(iph->daddr));
                        }
                } else
                        printk(" ");
index 71407beaf790bf889008be08ed3c61591b12aca9..c2982efd14afd0fb47d7363c71f06a4d1374e848 100644 (file)
@@ -129,13 +129,15 @@ static struct nf_hook_ops ip6t_ops[] = {
          .hook = ip6t_hook, 
          .pf = PF_INET6,
          .hooknum = NF_IP6_PRE_ROUTING,
-         .priority = NF_IP6_PRI_FIRST
+         .priority = NF_IP6_PRI_FIRST,
+         .owner = THIS_MODULE,
        },
        {
          .hook = ip6t_hook, 
          .pf = PF_INET6, 
          .hooknum = NF_IP6_LOCAL_OUT,
-         .priority = NF_IP6_PRI_FIRST
+         .priority = NF_IP6_PRI_FIRST,
+         .owner = THIS_MODULE,
        },
 };
 
index 617645bc5ed6ae0fb0ad060d284f24dd6b081ccd..e2b848ec98513ac9ababcc9f3d588c0fd93efc84 100644 (file)
@@ -434,12 +434,12 @@ csum_copy_err:
        /* Clear queue. */
        if (flags&MSG_PEEK) {
                int clear = 0;
-               spin_lock_irq(&sk->sk_receive_queue.lock);
+               spin_lock_bh(&sk->sk_receive_queue.lock);
                if (skb == skb_peek(&sk->sk_receive_queue)) {
                        __skb_unlink(skb, &sk->sk_receive_queue);
                        clear = 1;
                }
-               spin_unlock_irq(&sk->sk_receive_queue.lock);
+               spin_unlock_bh(&sk->sk_receive_queue.lock);
                if (clear)
                        kfree_skb(skb);
        }
@@ -971,11 +971,11 @@ static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg)
                        struct sk_buff *skb;
                        int amount = 0;
 
-                       spin_lock_irq(&sk->sk_receive_queue.lock);
+                       spin_lock_bh(&sk->sk_receive_queue.lock);
                        skb = skb_peek(&sk->sk_receive_queue);
                        if (skb != NULL)
                                amount = skb->tail - skb->h.raw;
-                       spin_unlock_irq(&sk->sk_receive_queue.lock);
+                       spin_unlock_bh(&sk->sk_receive_queue.lock);
                        return put_user(amount, (int __user *)arg);
                }
 
index 3bf8a0254f81b64aa4a5429ad7b725699d810b15..878789b3122de74a29ffe4b9cf59963d35bb7b11 100644 (file)
@@ -384,12 +384,13 @@ struct rt6_info *rt6_lookup(struct in6_addr *daddr, struct in6_addr *saddr,
    be destroyed.
  */
 
-int ip6_ins_rt(struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr)
+int ip6_ins_rt(struct rt6_info *rt, struct nlmsghdr *nlh,
+               void *_rtattr, struct netlink_skb_parms *req)
 {
        int err;
 
        write_lock_bh(&rt6_lock);
-       err = fib6_add(&ip6_routing_table, rt, nlh, _rtattr);
+       err = fib6_add(&ip6_routing_table, rt, nlh, _rtattr, req);
        write_unlock_bh(&rt6_lock);
 
        return err;
@@ -400,7 +401,7 @@ int ip6_ins_rt(struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr)
  */
 
 static struct rt6_info *rt6_cow(struct rt6_info *ort, struct in6_addr *daddr,
-                               struct in6_addr *saddr)
+                               struct in6_addr *saddr, struct netlink_skb_parms *req)
 {
        int err;
        struct rt6_info *rt;
@@ -432,7 +433,7 @@ static struct rt6_info *rt6_cow(struct rt6_info *ort, struct in6_addr *daddr,
 
                dst_hold(&rt->u.dst);
 
-               err = ip6_ins_rt(rt, NULL, NULL);
+               err = ip6_ins_rt(rt, NULL, NULL, req);
                if (err == 0)
                        return rt;
 
@@ -491,7 +492,8 @@ restart:
                read_unlock_bh(&rt6_lock);
 
                nrt = rt6_cow(rt, &skb->nh.ipv6h->daddr,
-                             &skb->nh.ipv6h->saddr);
+                             &skb->nh.ipv6h->saddr,
+                             &NETLINK_CB(skb));
 
                dst_release(&rt->u.dst);
                rt = nrt;
@@ -551,7 +553,7 @@ restart:
                dst_hold(&rt->u.dst);
                read_unlock_bh(&rt6_lock);
 
-               nrt = rt6_cow(rt, &fl->fl6_dst, &fl->fl6_src);
+               nrt = rt6_cow(rt, &fl->fl6_dst, &fl->fl6_src, NULL);
 
                dst_release(&rt->u.dst);
                rt = nrt;
@@ -598,7 +600,7 @@ static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)
 
        if (rt) {
                if (rt->rt6i_flags & RTF_CACHE)
-                       ip6_del_rt(rt, NULL, NULL);
+                       ip6_del_rt(rt, NULL, NULL, NULL);
                else
                        dst_release(dst);
        }
@@ -787,7 +789,8 @@ int ipv6_get_hoplimit(struct net_device *dev)
  *
  */
 
-int ip6_route_add(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh, void *_rtattr)
+int ip6_route_add(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh, 
+               void *_rtattr, struct netlink_skb_parms *req)
 {
        int err;
        struct rtmsg *r;
@@ -974,7 +977,7 @@ install_route:
                rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(dst_mtu(&rt->u.dst));
        rt->u.dst.dev = dev;
        rt->rt6i_idev = idev;
-       return ip6_ins_rt(rt, nlh, _rtattr);
+       return ip6_ins_rt(rt, nlh, _rtattr, req);
 
 out:
        if (dev)
@@ -986,7 +989,7 @@ out:
        return err;
 }
 
-int ip6_del_rt(struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr)
+int ip6_del_rt(struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr, struct netlink_skb_parms *req)
 {
        int err;
 
@@ -994,7 +997,7 @@ int ip6_del_rt(struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr)
 
        rt6_reset_dflt_pointer(NULL);
 
-       err = fib6_del(rt, nlh, _rtattr);
+       err = fib6_del(rt, nlh, _rtattr, req);
        dst_release(&rt->u.dst);
 
        write_unlock_bh(&rt6_lock);
@@ -1002,7 +1005,7 @@ int ip6_del_rt(struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr)
        return err;
 }
 
-static int ip6_route_del(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh, void *_rtattr)
+static int ip6_route_del(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh, void *_rtattr, struct netlink_skb_parms *req)
 {
        struct fib6_node *fn;
        struct rt6_info *rt;
@@ -1029,7 +1032,7 @@ static int ip6_route_del(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh, void *_r
                        dst_hold(&rt->u.dst);
                        read_unlock_bh(&rt6_lock);
 
-                       return ip6_del_rt(rt, nlh, _rtattr);
+                       return ip6_del_rt(rt, nlh, _rtattr, req);
                }
        }
        read_unlock_bh(&rt6_lock);
@@ -1136,11 +1139,11 @@ source_ok:
        nrt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(neigh->dev);
        nrt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(dst_mtu(&nrt->u.dst));
 
-       if (ip6_ins_rt(nrt, NULL, NULL))
+       if (ip6_ins_rt(nrt, NULL, NULL, NULL))
                goto out;
 
        if (rt->rt6i_flags&RTF_CACHE) {
-               ip6_del_rt(rt, NULL, NULL);
+               ip6_del_rt(rt, NULL, NULL, NULL);
                return;
        }
 
@@ -1204,7 +1207,7 @@ void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr,
           2. It is gatewayed route or NONEXTHOP route. Action: clone it.
         */
        if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) {
-               nrt = rt6_cow(rt, daddr, saddr);
+               nrt = rt6_cow(rt, daddr, saddr, NULL);
                if (!nrt->u.dst.error) {
                        nrt->u.dst.metrics[RTAX_MTU-1] = pmtu;
                        if (allfrag)
@@ -1232,7 +1235,7 @@ void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr,
                nrt->u.dst.metrics[RTAX_MTU-1] = pmtu;
                if (allfrag)
                        nrt->u.dst.metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG;
-               ip6_ins_rt(nrt, NULL, NULL);
+               ip6_ins_rt(nrt, NULL, NULL, NULL);
        }
 
 out:
@@ -1305,7 +1308,7 @@ struct rt6_info *rt6_add_dflt_router(struct in6_addr *gwaddr,
 
        rtmsg.rtmsg_ifindex = dev->ifindex;
 
-       ip6_route_add(&rtmsg, NULL, NULL);
+       ip6_route_add(&rtmsg, NULL, NULL, NULL);
        return rt6_get_dflt_router(gwaddr, dev);
 }
 
@@ -1323,7 +1326,7 @@ restart:
 
                        read_unlock_bh(&rt6_lock);
 
-                       ip6_del_rt(rt, NULL, NULL);
+                       ip6_del_rt(rt, NULL, NULL, NULL);
 
                        goto restart;
                }
@@ -1349,10 +1352,10 @@ int ipv6_route_ioctl(unsigned int cmd, void __user *arg)
                rtnl_lock();
                switch (cmd) {
                case SIOCADDRT:
-                       err = ip6_route_add(&rtmsg, NULL, NULL);
+                       err = ip6_route_add(&rtmsg, NULL, NULL, NULL);
                        break;
                case SIOCDELRT:
-                       err = ip6_route_del(&rtmsg, NULL, NULL);
+                       err = ip6_route_del(&rtmsg, NULL, NULL, NULL);
                        break;
                default:
                        err = -EINVAL;
@@ -1546,7 +1549,7 @@ int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
 
        if (inet6_rtm_to_rtmsg(r, arg, &rtmsg))
                return -EINVAL;
-       return ip6_route_del(&rtmsg, nlh, arg);
+       return ip6_route_del(&rtmsg, nlh, arg, &NETLINK_CB(skb));
 }
 
 int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
@@ -1556,7 +1559,7 @@ int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
 
        if (inet6_rtm_to_rtmsg(r, arg, &rtmsg))
                return -EINVAL;
-       return ip6_route_add(&rtmsg, nlh, arg);
+       return ip6_route_add(&rtmsg, nlh, arg, &NETLINK_CB(skb));
 }
 
 struct rt6_rtnl_dump_arg
@@ -1566,11 +1569,9 @@ struct rt6_rtnl_dump_arg
 };
 
 static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt,
-                        struct in6_addr *dst,
-                        struct in6_addr *src,
-                        int iif,
-                        int type, u32 pid, u32 seq,
-                        struct nlmsghdr *in_nlh, int prefix)
+                        struct in6_addr *dst, struct in6_addr *src,
+                        int iif, int type, u32 pid, u32 seq,
+                        int prefix, unsigned int flags)
 {
        struct rtmsg *rtm;
        struct nlmsghdr  *nlh;
@@ -1584,11 +1585,7 @@ static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt,
                }
        }
 
-       if (!pid && in_nlh) {
-               pid = in_nlh->nlmsg_pid;
-       }
-
-       nlh = NLMSG_PUT(skb, pid, seq, type, sizeof(*rtm));
+       nlh = NLMSG_NEW(skb, pid, seq, type, sizeof(*rtm), flags);
        rtm = NLMSG_DATA(nlh);
        rtm->rtm_family = AF_INET6;
        rtm->rtm_dst_len = rt->rt6i_dst.plen;
@@ -1674,7 +1671,7 @@ static int rt6_dump_route(struct rt6_info *rt, void *p_arg)
 
        return rt6_fill_node(arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE,
                     NETLINK_CB(arg->cb->skb).pid, arg->cb->nlh->nlmsg_seq,
-                    NULL, prefix);
+                    prefix, NLM_F_MULTI);
 }
 
 static int fib6_dump_node(struct fib6_walker_t *w)
@@ -1822,7 +1819,7 @@ int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg)
                            &fl.fl6_dst, &fl.fl6_src,
                            iif,
                            RTM_NEWROUTE, NETLINK_CB(in_skb).pid,
-                           nlh->nlmsg_seq, nlh, 0);
+                           nlh->nlmsg_seq, 0, 0);
        if (err < 0) {
                err = -EMSGSIZE;
                goto out_free;
@@ -1838,17 +1835,25 @@ out_free:
        goto out;       
 }
 
-void inet6_rt_notify(int event, struct rt6_info *rt, struct nlmsghdr *nlh)
+void inet6_rt_notify(int event, struct rt6_info *rt, struct nlmsghdr *nlh, 
+                       struct netlink_skb_parms *req)
 {
        struct sk_buff *skb;
        int size = NLMSG_SPACE(sizeof(struct rtmsg)+256);
+       u32 pid = current->pid;
+       u32 seq = 0;
 
+       if (req)
+               pid = req->pid;
+       if (nlh)
+               seq = nlh->nlmsg_seq;
+       
        skb = alloc_skb(size, gfp_any());
        if (!skb) {
                netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, ENOBUFS);
                return;
        }
-       if (rt6_fill_node(skb, rt, NULL, NULL, 0, event, 0, 0, nlh, 0) < 0) {
+       if (rt6_fill_node(skb, rt, NULL, NULL, 0, event, pid, seq, 0, 0) < 0) {
                kfree_skb(skb);
                netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, EINVAL);
                return;
index 0f69e800a0ad695868f1efc89d645c32a0445e19..2414937f2a83f3b97985eb170e5cf73a0464976a 100644 (file)
@@ -65,7 +65,7 @@
 #include <linux/seq_file.h>
 
 static void    tcp_v6_send_reset(struct sk_buff *skb);
-static void    tcp_v6_or_send_ack(struct sk_buff *skb, struct open_request *req);
+static void    tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req);
 static void    tcp_v6_send_check(struct sock *sk, struct tcphdr *th, int len, 
                                  struct sk_buff *skb);
 
@@ -394,24 +394,26 @@ static u32 tcp_v6_synq_hash(struct in6_addr *raddr, u16 rport, u32 rnd)
        return c & (TCP_SYNQ_HSIZE - 1);
 }
 
-static struct open_request *tcp_v6_search_req(struct tcp_sock *tp,
-                                             struct open_request ***prevp,
+static struct request_sock *tcp_v6_search_req(struct tcp_sock *tp,
+                                             struct request_sock ***prevp,
                                              __u16 rport,
                                              struct in6_addr *raddr,
                                              struct in6_addr *laddr,
                                              int iif)
 {
-       struct tcp_listen_opt *lopt = tp->listen_opt;
-       struct open_request *req, **prev;  
+       struct listen_sock *lopt = tp->accept_queue.listen_opt;
+       struct request_sock *req, **prev;  
 
        for (prev = &lopt->syn_table[tcp_v6_synq_hash(raddr, rport, lopt->hash_rnd)];
             (req = *prev) != NULL;
             prev = &req->dl_next) {
-               if (req->rmt_port == rport &&
-                   req->class->family == AF_INET6 &&
-                   ipv6_addr_equal(&req->af.v6_req.rmt_addr, raddr) &&
-                   ipv6_addr_equal(&req->af.v6_req.loc_addr, laddr) &&
-                   (!req->af.v6_req.iif || req->af.v6_req.iif == iif)) {
+               const struct tcp6_request_sock *treq = tcp6_rsk(req);
+
+               if (inet_rsk(req)->rmt_port == rport &&
+                   req->rsk_ops->family == AF_INET6 &&
+                   ipv6_addr_equal(&treq->rmt_addr, raddr) &&
+                   ipv6_addr_equal(&treq->loc_addr, laddr) &&
+                   (!treq->iif || treq->iif == iif)) {
                        BUG_TRAP(req->sk == NULL);
                        *prevp = prev;
                        return req;
@@ -906,9 +908,9 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
 
        icmpv6_err_convert(type, code, &err);
 
-       /* Might be for an open_request */
+       /* Might be for an request_sock */
        switch (sk->sk_state) {
-               struct open_request *req, **prev;
+               struct request_sock *req, **prev;
        case TCP_LISTEN:
                if (sock_owned_by_user(sk))
                        goto out;
@@ -923,7 +925,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
                 */
                BUG_TRAP(req->sk == NULL);
 
-               if (seq != req->snt_isn) {
+               if (seq != tcp_rsk(req)->snt_isn) {
                        NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
                        goto out;
                }
@@ -957,9 +959,10 @@ out:
 }
 
 
-static int tcp_v6_send_synack(struct sock *sk, struct open_request *req,
+static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
                              struct dst_entry *dst)
 {
+       struct tcp6_request_sock *treq = tcp6_rsk(req);
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct sk_buff * skb;
        struct ipv6_txoptions *opt = NULL;
@@ -969,19 +972,19 @@ static int tcp_v6_send_synack(struct sock *sk, struct open_request *req,
 
        memset(&fl, 0, sizeof(fl));
        fl.proto = IPPROTO_TCP;
-       ipv6_addr_copy(&fl.fl6_dst, &req->af.v6_req.rmt_addr);
-       ipv6_addr_copy(&fl.fl6_src, &req->af.v6_req.loc_addr);
+       ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
+       ipv6_addr_copy(&fl.fl6_src, &treq->loc_addr);
        fl.fl6_flowlabel = 0;
-       fl.oif = req->af.v6_req.iif;
-       fl.fl_ip_dport = req->rmt_port;
+       fl.oif = treq->iif;
+       fl.fl_ip_dport = inet_rsk(req)->rmt_port;
        fl.fl_ip_sport = inet_sk(sk)->sport;
 
        if (dst == NULL) {
                opt = np->opt;
                if (opt == NULL &&
                    np->rxopt.bits.srcrt == 2 &&
-                   req->af.v6_req.pktopts) {
-                       struct sk_buff *pktopts = req->af.v6_req.pktopts;
+                   treq->pktopts) {
+                       struct sk_buff *pktopts = treq->pktopts;
                        struct inet6_skb_parm *rxopt = IP6CB(pktopts);
                        if (rxopt->srcrt)
                                opt = ipv6_invert_rthdr(sk, (struct ipv6_rt_hdr*)(pktopts->nh.raw + rxopt->srcrt));
@@ -1008,10 +1011,10 @@ static int tcp_v6_send_synack(struct sock *sk, struct open_request *req,
                struct tcphdr *th = skb->h.th;
 
                th->check = tcp_v6_check(th, skb->len,
-                                        &req->af.v6_req.loc_addr, &req->af.v6_req.rmt_addr,
+                                        &treq->loc_addr, &treq->rmt_addr,
                                         csum_partial((char *)th, skb->len, skb->csum));
 
-               ipv6_addr_copy(&fl.fl6_dst, &req->af.v6_req.rmt_addr);
+               ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
                err = ip6_xmit(sk, skb, &fl, opt, 0);
                if (err == NET_XMIT_CN)
                        err = 0;
@@ -1024,17 +1027,18 @@ done:
        return err;
 }
 
-static void tcp_v6_or_free(struct open_request *req)
+static void tcp_v6_reqsk_destructor(struct request_sock *req)
 {
-       if (req->af.v6_req.pktopts)
-               kfree_skb(req->af.v6_req.pktopts);
+       if (tcp6_rsk(req)->pktopts)
+               kfree_skb(tcp6_rsk(req)->pktopts);
 }
 
-static struct or_calltable or_ipv6 = {
+static struct request_sock_ops tcp6_request_sock_ops = {
        .family         =       AF_INET6,
+       .obj_size       =       sizeof(struct tcp6_request_sock),
        .rtx_syn_ack    =       tcp_v6_send_synack,
-       .send_ack       =       tcp_v6_or_send_ack,
-       .destructor     =       tcp_v6_or_free,
+       .send_ack       =       tcp_v6_reqsk_send_ack,
+       .destructor     =       tcp_v6_reqsk_destructor,
        .send_reset     =       tcp_v6_send_reset
 };
 
@@ -1219,15 +1223,15 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
        tcp_tw_put(tw);
 }
 
-static void tcp_v6_or_send_ack(struct sk_buff *skb, struct open_request *req)
+static void tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req)
 {
-       tcp_v6_send_ack(skb, req->snt_isn+1, req->rcv_isn+1, req->rcv_wnd, req->ts_recent);
+       tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent);
 }
 
 
 static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb)
 {
-       struct open_request *req, **prev;
+       struct request_sock *req, **prev;
        struct tcphdr *th = skb->h.th;
        struct tcp_sock *tp = tcp_sk(sk);
        struct sock *nsk;
@@ -1260,21 +1264,13 @@ static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb)
        return sk;
 }
 
-static void tcp_v6_synq_add(struct sock *sk, struct open_request *req)
+static void tcp_v6_synq_add(struct sock *sk, struct request_sock *req)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       struct tcp_listen_opt *lopt = tp->listen_opt;
-       u32 h = tcp_v6_synq_hash(&req->af.v6_req.rmt_addr, req->rmt_port, lopt->hash_rnd);
-
-       req->sk = NULL;
-       req->expires = jiffies + TCP_TIMEOUT_INIT;
-       req->retrans = 0;
-       req->dl_next = lopt->syn_table[h];
-
-       write_lock(&tp->syn_wait_lock);
-       lopt->syn_table[h] = req;
-       write_unlock(&tp->syn_wait_lock);
+       struct listen_sock *lopt = tp->accept_queue.listen_opt;
+       u32 h = tcp_v6_synq_hash(&tcp6_rsk(req)->rmt_addr, inet_rsk(req)->rmt_port, lopt->hash_rnd);
 
+       reqsk_queue_hash_req(&tp->accept_queue, h, req, TCP_TIMEOUT_INIT);
        tcp_synq_added(sk);
 }
 
@@ -1284,10 +1280,11 @@ static void tcp_v6_synq_add(struct sock *sk, struct open_request *req)
  */
 static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
 {
+       struct tcp6_request_sock *treq;
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct tcp_options_received tmp_opt;
        struct tcp_sock *tp = tcp_sk(sk);
-       struct open_request *req = NULL;
+       struct request_sock *req = NULL;
        __u32 isn = TCP_SKB_CB(skb)->when;
 
        if (skb->protocol == htons(ETH_P_IP))
@@ -1308,7 +1305,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
        if (sk_acceptq_is_full(sk) && tcp_synq_young(sk) > 1)
                goto drop;
 
-       req = tcp_openreq_alloc();
+       req = reqsk_alloc(&tcp6_request_sock_ops);
        if (req == NULL)
                goto drop;
 
@@ -1321,28 +1318,28 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
        tmp_opt.tstamp_ok = tmp_opt.saw_tstamp;
        tcp_openreq_init(req, &tmp_opt, skb);
 
-       req->class = &or_ipv6;
-       ipv6_addr_copy(&req->af.v6_req.rmt_addr, &skb->nh.ipv6h->saddr);
-       ipv6_addr_copy(&req->af.v6_req.loc_addr, &skb->nh.ipv6h->daddr);
+       treq = tcp6_rsk(req);
+       ipv6_addr_copy(&treq->rmt_addr, &skb->nh.ipv6h->saddr);
+       ipv6_addr_copy(&treq->loc_addr, &skb->nh.ipv6h->daddr);
        TCP_ECN_create_request(req, skb->h.th);
-       req->af.v6_req.pktopts = NULL;
+       treq->pktopts = NULL;
        if (ipv6_opt_accepted(sk, skb) ||
            np->rxopt.bits.rxinfo ||
            np->rxopt.bits.rxhlim) {
                atomic_inc(&skb->users);
-               req->af.v6_req.pktopts = skb;
+               treq->pktopts = skb;
        }
-       req->af.v6_req.iif = sk->sk_bound_dev_if;
+       treq->iif = sk->sk_bound_dev_if;
 
        /* So that link locals have meaning */
        if (!sk->sk_bound_dev_if &&
-           ipv6_addr_type(&req->af.v6_req.rmt_addr) & IPV6_ADDR_LINKLOCAL)
-               req->af.v6_req.iif = tcp_v6_iif(skb);
+           ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL)
+               treq->iif = tcp_v6_iif(skb);
 
        if (isn == 0) 
                isn = tcp_v6_init_sequence(sk,skb);
 
-       req->snt_isn = isn;
+       tcp_rsk(req)->snt_isn = isn;
 
        if (tcp_v6_send_synack(sk, req, NULL))
                goto drop;
@@ -1353,16 +1350,17 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
 
 drop:
        if (req)
-               tcp_openreq_free(req);
+               reqsk_free(req);
 
        TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS);
        return 0; /* don't send reset */
 }
 
 static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
-                                         struct open_request *req,
+                                         struct request_sock *req,
                                          struct dst_entry *dst)
 {
+       struct tcp6_request_sock *treq = tcp6_rsk(req);
        struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
        struct tcp6_sock *newtcp6sk;
        struct inet_sock *newinet;
@@ -1426,10 +1424,10 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
                goto out_overflow;
 
        if (np->rxopt.bits.srcrt == 2 &&
-           opt == NULL && req->af.v6_req.pktopts) {
-               struct inet6_skb_parm *rxopt = IP6CB(req->af.v6_req.pktopts);
+           opt == NULL && treq->pktopts) {
+               struct inet6_skb_parm *rxopt = IP6CB(treq->pktopts);
                if (rxopt->srcrt)
-                       opt = ipv6_invert_rthdr(sk, (struct ipv6_rt_hdr*)(req->af.v6_req.pktopts->nh.raw+rxopt->srcrt));
+                       opt = ipv6_invert_rthdr(sk, (struct ipv6_rt_hdr *)(treq->pktopts->nh.raw + rxopt->srcrt));
        }
 
        if (dst == NULL) {
@@ -1438,16 +1436,16 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
 
                memset(&fl, 0, sizeof(fl));
                fl.proto = IPPROTO_TCP;
-               ipv6_addr_copy(&fl.fl6_dst, &req->af.v6_req.rmt_addr);
+               ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
                if (opt && opt->srcrt) {
                        struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
                        ipv6_addr_copy(&final, &fl.fl6_dst);
                        ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
                        final_p = &final;
                }
-               ipv6_addr_copy(&fl.fl6_src, &req->af.v6_req.loc_addr);
+               ipv6_addr_copy(&fl.fl6_src, &treq->loc_addr);
                fl.oif = sk->sk_bound_dev_if;
-               fl.fl_ip_dport = req->rmt_port;
+               fl.fl_ip_dport = inet_rsk(req)->rmt_port;
                fl.fl_ip_sport = inet_sk(sk)->sport;
 
                if (ip6_dst_lookup(sk, &dst, &fl))
@@ -1482,10 +1480,10 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
 
        memcpy(newnp, np, sizeof(struct ipv6_pinfo));
 
-       ipv6_addr_copy(&newnp->daddr, &req->af.v6_req.rmt_addr);
-       ipv6_addr_copy(&newnp->saddr, &req->af.v6_req.loc_addr);
-       ipv6_addr_copy(&newnp->rcv_saddr, &req->af.v6_req.loc_addr);
-       newsk->sk_bound_dev_if = req->af.v6_req.iif;
+       ipv6_addr_copy(&newnp->daddr, &treq->rmt_addr);
+       ipv6_addr_copy(&newnp->saddr, &treq->loc_addr);
+       ipv6_addr_copy(&newnp->rcv_saddr, &treq->loc_addr);
+       newsk->sk_bound_dev_if = treq->iif;
 
        /* Now IPv6 options... 
 
@@ -1498,11 +1496,10 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
 
        /* Clone pktoptions received with SYN */
        newnp->pktoptions = NULL;
-       if (req->af.v6_req.pktopts) {
-               newnp->pktoptions = skb_clone(req->af.v6_req.pktopts,
-                                             GFP_ATOMIC);
-               kfree_skb(req->af.v6_req.pktopts);
-               req->af.v6_req.pktopts = NULL;
+       if (treq->pktopts != NULL) {
+               newnp->pktoptions = skb_clone(treq->pktopts, GFP_ATOMIC);
+               kfree_skb(treq->pktopts);
+               treq->pktopts = NULL;
                if (newnp->pktoptions)
                        skb_set_owner_r(newnp->pktoptions, newsk);
        }
@@ -2050,7 +2047,7 @@ static int tcp_v6_destroy_sock(struct sock *sk)
 
 /* Proc filesystem TCPv6 sock list dumping. */
 static void get_openreq6(struct seq_file *seq, 
-                        struct sock *sk, struct open_request *req, int i, int uid)
+                        struct sock *sk, struct request_sock *req, int i, int uid)
 {
        struct in6_addr *dest, *src;
        int ttd = req->expires - jiffies;
@@ -2058,8 +2055,8 @@ static void get_openreq6(struct seq_file *seq,
        if (ttd < 0)
                ttd = 0;
 
-       src = &req->af.v6_req.loc_addr;
-       dest = &req->af.v6_req.rmt_addr;
+       src = &tcp6_rsk(req)->loc_addr;
+       dest = &tcp6_rsk(req)->rmt_addr;
        seq_printf(seq,
                   "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
                   "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n",
@@ -2069,7 +2066,7 @@ static void get_openreq6(struct seq_file *seq,
                   ntohs(inet_sk(sk)->sport),
                   dest->s6_addr32[0], dest->s6_addr32[1],
                   dest->s6_addr32[2], dest->s6_addr32[3],
-                  ntohs(req->rmt_port),
+                  ntohs(inet_rsk(req)->rmt_port),
                   TCP_SYN_RECV,
                   0,0, /* could print option size, but that is af dependent. */
                   1,   /* timers active (only the expire timer) */  
@@ -2239,6 +2236,7 @@ struct proto tcpv6_prot = {
        .sysctl_rmem            = sysctl_tcp_rmem,
        .max_header             = MAX_TCP_HEADER,
        .obj_size               = sizeof(struct tcp6_sock),
+       .rsk_prot               = &tcp6_request_sock_ops,
 };
 
 static struct inet6_protocol tcpv6_protocol = {
index e251d0ba4f39362b0207d3304ecbd0f748ea98c3..eff050ac7049601e6cc040c14210ac678b16e788 100644 (file)
@@ -300,12 +300,12 @@ csum_copy_err:
        /* Clear queue. */
        if (flags&MSG_PEEK) {
                int clear = 0;
-               spin_lock_irq(&sk->sk_receive_queue.lock);
+               spin_lock_bh(&sk->sk_receive_queue.lock);
                if (skb == skb_peek(&sk->sk_receive_queue)) {
                        __skb_unlink(skb, &sk->sk_receive_queue);
                        clear = 1;
                }
-               spin_unlock_irq(&sk->sk_receive_queue.lock);
+               spin_unlock_bh(&sk->sk_receive_queue.lock);
                if (clear)
                        kfree_skb(skb);
        }
index 601a148f60f39af5255d651eab7a1f8d23a35a57..6b9867717d117a6686edb9424ddbfb6e7a21aa05 100644 (file)
@@ -84,6 +84,7 @@ static int xfrm6_tunnel_check_size(struct sk_buff *skb)
                mtu = IPV6_MIN_MTU;
 
        if (skb->len > mtu) {
+               skb->dev = dst->dev;
                icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev);
                ret = -EMSGSIZE;
        }
index 4429b1a1fe5fe2528318b7417e539279548d9988..cf1d91e74c82a3939ecd2f796ea385fb7eefcff1 100644 (file)
@@ -113,6 +113,8 @@ __xfrm6_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int
 
                xdst = (struct xfrm_dst *)dst1;
                xdst->route = &rt->u.dst;
+               if (rt->rt6i_node)
+                       xdst->route_cookie = rt->rt6i_node->fn_sernum;
 
                dst1->next = dst_prev;
                dst_prev = dst1;
@@ -137,6 +139,8 @@ __xfrm6_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int
 
        dst_prev->child = &rt->u.dst;
        dst->path = &rt->u.dst;
+       if (rt->rt6i_node)
+               ((struct xfrm_dst *)dst)->path_cookie = rt->rt6i_node->fn_sernum;
 
        *dst_p = dst;
        dst = dst_prev;
index ffcadd68b951df9f08610bcf0fbcd7b497dea7d0..60c26c87277e7fa63a34f9b8671cbdd79efb1fd4 100644 (file)
@@ -466,7 +466,7 @@ static void xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
        return;
 }
 
-static int xfrm6_tunnel_init_state(struct xfrm_state *x, void *args)
+static int xfrm6_tunnel_init_state(struct xfrm_state *x)
 {
        if (!x->props.mode)
                return -EINVAL;
index ce980aa94ed8e45420223acaf9e1b25e4f03eb45..4879743b945ae5956c6713a6c50dc5a2052f37ae 100644 (file)
@@ -656,13 +656,18 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
        sa->sadb_sa_exttype = SADB_EXT_SA;
        sa->sadb_sa_spi = x->id.spi;
        sa->sadb_sa_replay = x->props.replay_window;
-       sa->sadb_sa_state = SADB_SASTATE_DYING;
-       if (x->km.state == XFRM_STATE_VALID && !x->km.dying)
-               sa->sadb_sa_state = SADB_SASTATE_MATURE;
-       else if (x->km.state == XFRM_STATE_ACQ)
+       switch (x->km.state) {
+       case XFRM_STATE_VALID:
+               sa->sadb_sa_state = x->km.dying ?
+                       SADB_SASTATE_DYING : SADB_SASTATE_MATURE;
+               break;
+       case XFRM_STATE_ACQ:
                sa->sadb_sa_state = SADB_SASTATE_LARVAL;
-       else if (x->km.state == XFRM_STATE_EXPIRED)
+               break;
+       default:
                sa->sadb_sa_state = SADB_SASTATE_DEAD;
+               break;
+       }
        sa->sadb_sa_auth = 0;
        if (x->aalg) {
                struct xfrm_algo_desc *a = xfrm_aalg_get_byname(x->aalg->alg_name, 0);
@@ -685,6 +690,8 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
                sa->sadb_sa_flags |= SADB_SAFLAGS_NOECN;
        if (x->props.flags & XFRM_STATE_DECAP_DSCP)
                sa->sadb_sa_flags |= SADB_SAFLAGS_DECAP_DSCP;
+       if (x->props.flags & XFRM_STATE_NOPMTUDISC)
+               sa->sadb_sa_flags |= SADB_SAFLAGS_NOPMTUDISC;
 
        /* hard time */
        if (hsc & 2) {
@@ -969,6 +976,8 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
                x->props.flags |= XFRM_STATE_NOECN;
        if (sa->sadb_sa_flags & SADB_SAFLAGS_DECAP_DSCP)
                x->props.flags |= XFRM_STATE_DECAP_DSCP;
+       if (sa->sadb_sa_flags & SADB_SAFLAGS_NOPMTUDISC)
+               x->props.flags |= XFRM_STATE_NOPMTUDISC;
 
        lifetime = (struct sadb_lifetime*) ext_hdrs[SADB_EXT_LIFETIME_HARD-1];
        if (lifetime != NULL) {
@@ -1091,17 +1100,11 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
                }
        }
 
-       x->type = xfrm_get_type(proto, x->props.family);
-       if (x->type == NULL) {
-               err = -ENOPROTOOPT;
-               goto out;
-       }
-       if (x->type->init_state(x, NULL)) {
-               err = -EINVAL;
+       err = xfrm_init_state(x);
+       if (err)
                goto out;
-       }
+
        x->km.seq = hdr->sadb_msg_seq;
-       x->km.state = XFRM_STATE_VALID;
        return x;
 
 out:
@@ -1240,13 +1243,78 @@ static int pfkey_acquire(struct sock *sk, struct sk_buff *skb, struct sadb_msg *
        return 0;
 }
 
+static inline int event2poltype(int event)
+{
+       switch (event) {
+       case XFRM_MSG_DELPOLICY:
+               return SADB_X_SPDDELETE;
+       case XFRM_MSG_NEWPOLICY:
+               return SADB_X_SPDADD;
+       case XFRM_MSG_UPDPOLICY:
+               return SADB_X_SPDUPDATE;
+       case XFRM_MSG_POLEXPIRE:
+       //      return SADB_X_SPDEXPIRE;
+       default:
+               printk("pfkey: Unknown policy event %d\n", event);
+               break;
+       }
+
+       return 0;
+}
+
+static inline int event2keytype(int event)
+{
+       switch (event) {
+       case XFRM_MSG_DELSA:
+               return SADB_DELETE;
+       case XFRM_MSG_NEWSA:
+               return SADB_ADD;
+       case XFRM_MSG_UPDSA:
+               return SADB_UPDATE;
+       case XFRM_MSG_EXPIRE:
+               return SADB_EXPIRE;
+       default:
+               printk("pfkey: Unknown SA event %d\n", event);
+               break;
+       }
+
+       return 0;
+}
+
+/* ADD/UPD/DEL */
+static int key_notify_sa(struct xfrm_state *x, struct km_event *c)
+{
+       struct sk_buff *skb;
+       struct sadb_msg *hdr;
+       int hsc = 3;
+
+       if (c->event == XFRM_MSG_DELSA)
+               hsc = 0;
+
+       skb = pfkey_xfrm_state2msg(x, 0, hsc);
+
+       if (IS_ERR(skb))
+               return PTR_ERR(skb);
+
+       hdr = (struct sadb_msg *) skb->data;
+       hdr->sadb_msg_version = PF_KEY_V2;
+       hdr->sadb_msg_type = event2keytype(c->event);
+       hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto);
+       hdr->sadb_msg_errno = 0;
+       hdr->sadb_msg_reserved = 0;
+       hdr->sadb_msg_seq = c->seq;
+       hdr->sadb_msg_pid = c->pid;
+
+       pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL);
+
+       return 0;
+}
 
 static int pfkey_add(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
 {
-       struct sk_buff *out_skb;
-       struct sadb_msg *out_hdr;
        struct xfrm_state *x;
        int err;
+       struct km_event c;
 
        xfrm_probe_algs();
        
@@ -1254,6 +1322,7 @@ static int pfkey_add(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr,
        if (IS_ERR(x))
                return PTR_ERR(x);
 
+       xfrm_state_hold(x);
        if (hdr->sadb_msg_type == SADB_ADD)
                err = xfrm_state_add(x);
        else
@@ -1262,30 +1331,26 @@ static int pfkey_add(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr,
        if (err < 0) {
                x->km.state = XFRM_STATE_DEAD;
                xfrm_state_put(x);
-               return err;
+               goto out;
        }
 
-       out_skb = pfkey_xfrm_state2msg(x, 0, 3);
-       if (IS_ERR(out_skb))
-               return  PTR_ERR(out_skb); /* XXX Should we return 0 here ? */
-
-       out_hdr = (struct sadb_msg *) out_skb->data;
-       out_hdr->sadb_msg_version = hdr->sadb_msg_version;
-       out_hdr->sadb_msg_type = hdr->sadb_msg_type;
-       out_hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto);
-       out_hdr->sadb_msg_errno = 0;
-       out_hdr->sadb_msg_reserved = 0;
-       out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
-       out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
-
-       pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, sk);
-
-       return 0;
+       if (hdr->sadb_msg_type == SADB_ADD)
+               c.event = XFRM_MSG_NEWSA;
+       else
+               c.event = XFRM_MSG_UPDSA;
+       c.seq = hdr->sadb_msg_seq;
+       c.pid = hdr->sadb_msg_pid;
+       km_state_notify(x, &c);
+out:
+       xfrm_state_put(x);
+       return err;
 }
 
 static int pfkey_delete(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
 {
        struct xfrm_state *x;
+       struct km_event c;
+       int err;
 
        if (!ext_hdrs[SADB_EXT_SA-1] ||
            !present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
@@ -1301,13 +1366,19 @@ static int pfkey_delete(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h
                return -EPERM;
        }
        
-       xfrm_state_delete(x);
-       xfrm_state_put(x);
+       err = xfrm_state_delete(x);
+       if (err < 0) {
+               xfrm_state_put(x);
+               return err;
+       }
 
-       pfkey_broadcast(skb_clone(skb, GFP_KERNEL), GFP_KERNEL, 
-                       BROADCAST_ALL, sk);
+       c.seq = hdr->sadb_msg_seq;
+       c.pid = hdr->sadb_msg_pid;
+       c.event = XFRM_MSG_DELSA;
+       km_state_notify(x, &c);
+       xfrm_state_put(x);
 
-       return 0;
+       return err;
 }
 
 static int pfkey_get(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
@@ -1445,28 +1516,42 @@ static int pfkey_register(struct sock *sk, struct sk_buff *skb, struct sadb_msg
        return 0;
 }
 
+static int key_notify_sa_flush(struct km_event *c)
+{
+       struct sk_buff *skb;
+       struct sadb_msg *hdr;
+
+       skb = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_ATOMIC);
+       if (!skb)
+               return -ENOBUFS;
+       hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg));
+       hdr->sadb_msg_satype = pfkey_proto2satype(c->data.proto);
+       hdr->sadb_msg_seq = c->seq;
+       hdr->sadb_msg_pid = c->pid;
+       hdr->sadb_msg_version = PF_KEY_V2;
+       hdr->sadb_msg_errno = (uint8_t) 0;
+       hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t));
+
+       pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL);
+
+       return 0;
+}
+
 static int pfkey_flush(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
 {
        unsigned proto;
-       struct sk_buff *skb_out;
-       struct sadb_msg *hdr_out;
+       struct km_event c;
 
        proto = pfkey_satype2proto(hdr->sadb_msg_satype);
        if (proto == 0)
                return -EINVAL;
 
-       skb_out = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_KERNEL);
-       if (!skb_out)
-               return -ENOBUFS;
-
        xfrm_state_flush(proto);
-
-       hdr_out = (struct sadb_msg *) skb_put(skb_out, sizeof(struct sadb_msg));
-       pfkey_hdr_dup(hdr_out, hdr);
-       hdr_out->sadb_msg_errno = (uint8_t) 0;
-       hdr_out->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t));
-
-       pfkey_broadcast(skb_out, GFP_KERNEL, BROADCAST_ALL, NULL);
+       c.data.proto = proto;
+       c.seq = hdr->sadb_msg_seq;
+       c.pid = hdr->sadb_msg_pid;
+       c.event = XFRM_MSG_FLUSHSA;
+       km_state_notify(NULL, &c);
 
        return 0;
 }
@@ -1859,6 +1944,35 @@ static void pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, i
        hdr->sadb_msg_reserved = atomic_read(&xp->refcnt);
 }
 
+static int key_notify_policy(struct xfrm_policy *xp, int dir, struct km_event *c)
+{
+       struct sk_buff *out_skb;
+       struct sadb_msg *out_hdr;
+       int err;
+
+       out_skb = pfkey_xfrm_policy2msg_prep(xp);
+       if (IS_ERR(out_skb)) {
+               err = PTR_ERR(out_skb);
+               goto out;
+       }
+       pfkey_xfrm_policy2msg(out_skb, xp, dir);
+
+       out_hdr = (struct sadb_msg *) out_skb->data;
+       out_hdr->sadb_msg_version = PF_KEY_V2;
+
+       if (c->data.byid && c->event == XFRM_MSG_DELPOLICY)
+               out_hdr->sadb_msg_type = SADB_X_SPDDELETE2;
+       else
+               out_hdr->sadb_msg_type = event2poltype(c->event);
+       out_hdr->sadb_msg_errno = 0;
+       out_hdr->sadb_msg_seq = c->seq;
+       out_hdr->sadb_msg_pid = c->pid;
+       pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, NULL);
+out:
+       return 0;
+
+}
+
 static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
 {
        int err;
@@ -1866,8 +1980,7 @@ static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h
        struct sadb_address *sa;
        struct sadb_x_policy *pol;
        struct xfrm_policy *xp;
-       struct sk_buff *out_skb;
-       struct sadb_msg *out_hdr;
+       struct km_event c;
 
        if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
                                     ext_hdrs[SADB_EXT_ADDRESS_DST-1]) ||
@@ -1935,31 +2048,23 @@ static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h
            (err = parse_ipsecrequests(xp, pol)) < 0)
                goto out;
 
-       out_skb = pfkey_xfrm_policy2msg_prep(xp);
-       if (IS_ERR(out_skb)) {
-               err =  PTR_ERR(out_skb);
-               goto out;
-       }
-
        err = xfrm_policy_insert(pol->sadb_x_policy_dir-1, xp,
                                 hdr->sadb_msg_type != SADB_X_SPDUPDATE);
        if (err) {
-               kfree_skb(out_skb);
-               goto out;
+               kfree(xp);
+               return err;
        }
 
-       pfkey_xfrm_policy2msg(out_skb, xp, pol->sadb_x_policy_dir-1);
+       if (hdr->sadb_msg_type == SADB_X_SPDUPDATE)
+               c.event = XFRM_MSG_UPDPOLICY;
+       else 
+               c.event = XFRM_MSG_NEWPOLICY;
 
-       xfrm_pol_put(xp);
+       c.seq = hdr->sadb_msg_seq;
+       c.pid = hdr->sadb_msg_pid;
 
-       out_hdr = (struct sadb_msg *) out_skb->data;
-       out_hdr->sadb_msg_version = hdr->sadb_msg_version;
-       out_hdr->sadb_msg_type = hdr->sadb_msg_type;
-       out_hdr->sadb_msg_satype = 0;
-       out_hdr->sadb_msg_errno = 0;
-       out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
-       out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
-       pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, sk);
+       km_policy_notify(xp, pol->sadb_x_policy_dir-1, &c);
+       xfrm_pol_put(xp);
        return 0;
 
 out:
@@ -1973,9 +2078,8 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg
        struct sadb_address *sa;
        struct sadb_x_policy *pol;
        struct xfrm_policy *xp;
-       struct sk_buff *out_skb;
-       struct sadb_msg *out_hdr;
        struct xfrm_selector sel;
+       struct km_event c;
 
        if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
                                     ext_hdrs[SADB_EXT_ADDRESS_DST-1]) ||
@@ -2010,25 +2114,40 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg
 
        err = 0;
 
+       c.seq = hdr->sadb_msg_seq;
+       c.pid = hdr->sadb_msg_pid;
+       c.event = XFRM_MSG_DELPOLICY;
+       km_policy_notify(xp, pol->sadb_x_policy_dir-1, &c);
+
+       xfrm_pol_put(xp);
+       return err;
+}
+
+static int key_pol_get_resp(struct sock *sk, struct xfrm_policy *xp, struct sadb_msg *hdr, int dir)
+{
+       int err;
+       struct sk_buff *out_skb;
+       struct sadb_msg *out_hdr;
+       err = 0;
+
        out_skb = pfkey_xfrm_policy2msg_prep(xp);
        if (IS_ERR(out_skb)) {
                err =  PTR_ERR(out_skb);
                goto out;
        }
-       pfkey_xfrm_policy2msg(out_skb, xp, pol->sadb_x_policy_dir-1);
+       pfkey_xfrm_policy2msg(out_skb, xp, dir);
 
        out_hdr = (struct sadb_msg *) out_skb->data;
        out_hdr->sadb_msg_version = hdr->sadb_msg_version;
-       out_hdr->sadb_msg_type = SADB_X_SPDDELETE;
+       out_hdr->sadb_msg_type = hdr->sadb_msg_type;
        out_hdr->sadb_msg_satype = 0;
        out_hdr->sadb_msg_errno = 0;
        out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
        out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
-       pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, sk);
+       pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ONE, sk);
        err = 0;
 
 out:
-       xfrm_pol_put(xp);
        return err;
 }
 
@@ -2037,8 +2156,7 @@ static int pfkey_spdget(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h
        int err;
        struct sadb_x_policy *pol;
        struct xfrm_policy *xp;
-       struct sk_buff *out_skb;
-       struct sadb_msg *out_hdr;
+       struct km_event c;
 
        if ((pol = ext_hdrs[SADB_X_EXT_POLICY-1]) == NULL)
                return -EINVAL;
@@ -2050,24 +2168,16 @@ static int pfkey_spdget(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h
 
        err = 0;
 
-       out_skb = pfkey_xfrm_policy2msg_prep(xp);
-       if (IS_ERR(out_skb)) {
-               err =  PTR_ERR(out_skb);
-               goto out;
+       c.seq = hdr->sadb_msg_seq;
+       c.pid = hdr->sadb_msg_pid;
+       if (hdr->sadb_msg_type == SADB_X_SPDDELETE2) {
+               c.data.byid = 1;
+               c.event = XFRM_MSG_DELPOLICY;
+               km_policy_notify(xp, pol->sadb_x_policy_dir-1, &c);
+       } else {
+               err = key_pol_get_resp(sk, xp, hdr, pol->sadb_x_policy_dir-1);
        }
-       pfkey_xfrm_policy2msg(out_skb, xp, pol->sadb_x_policy_dir-1);
 
-       out_hdr = (struct sadb_msg *) out_skb->data;
-       out_hdr->sadb_msg_version = hdr->sadb_msg_version;
-       out_hdr->sadb_msg_type = hdr->sadb_msg_type;
-       out_hdr->sadb_msg_satype = 0;
-       out_hdr->sadb_msg_errno = 0;
-       out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
-       out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
-       pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, sk);
-       err = 0;
-
-out:
        xfrm_pol_put(xp);
        return err;
 }
@@ -2102,22 +2212,34 @@ static int pfkey_spddump(struct sock *sk, struct sk_buff *skb, struct sadb_msg *
        return xfrm_policy_walk(dump_sp, &data);
 }
 
-static int pfkey_spdflush(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
+static int key_notify_policy_flush(struct km_event *c)
 {
        struct sk_buff *skb_out;
-       struct sadb_msg *hdr_out;
+       struct sadb_msg *hdr;
 
-       skb_out = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_KERNEL);
+       skb_out = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_ATOMIC);
        if (!skb_out)
                return -ENOBUFS;
+       hdr = (struct sadb_msg *) skb_put(skb_out, sizeof(struct sadb_msg));
+       hdr->sadb_msg_seq = c->seq;
+       hdr->sadb_msg_pid = c->pid;
+       hdr->sadb_msg_version = PF_KEY_V2;
+       hdr->sadb_msg_errno = (uint8_t) 0;
+       hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t));
+       pfkey_broadcast(skb_out, GFP_ATOMIC, BROADCAST_ALL, NULL);
+       return 0;
 
-       xfrm_policy_flush();
+}
 
-       hdr_out = (struct sadb_msg *) skb_put(skb_out, sizeof(struct sadb_msg));
-       pfkey_hdr_dup(hdr_out, hdr);
-       hdr_out->sadb_msg_errno = (uint8_t) 0;
-       hdr_out->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t));
-       pfkey_broadcast(skb_out, GFP_KERNEL, BROADCAST_ALL, NULL);
+static int pfkey_spdflush(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
+{
+       struct km_event c;
+
+       xfrm_policy_flush();
+       c.event = XFRM_MSG_FLUSHPOLICY;
+       c.pid = hdr->sadb_msg_pid;
+       c.seq = hdr->sadb_msg_seq;
+       km_policy_notify(NULL, 0, &c);
 
        return 0;
 }
@@ -2317,11 +2439,23 @@ static void dump_esp_combs(struct sk_buff *skb, struct xfrm_tmpl *t)
        }
 }
 
-static int pfkey_send_notify(struct xfrm_state *x, int hard)
+static int key_notify_policy_expire(struct xfrm_policy *xp, struct km_event *c)
+{
+       return 0;
+}
+
+static int key_notify_sa_expire(struct xfrm_state *x, struct km_event *c)
 {
        struct sk_buff *out_skb;
        struct sadb_msg *out_hdr;
-       int hsc = (hard ? 2 : 1);
+       int hard;
+       int hsc;
+
+       hard = c->data.hard;
+       if (hard)
+               hsc = 2;
+       else
+               hsc = 1;
 
        out_skb = pfkey_xfrm_state2msg(x, 0, hsc);
        if (IS_ERR(out_skb))
@@ -2340,6 +2474,44 @@ static int pfkey_send_notify(struct xfrm_state *x, int hard)
        return 0;
 }
 
+static int pfkey_send_notify(struct xfrm_state *x, struct km_event *c)
+{
+       switch (c->event) {
+       case XFRM_MSG_EXPIRE:
+               return key_notify_sa_expire(x, c);
+       case XFRM_MSG_DELSA:
+       case XFRM_MSG_NEWSA:
+       case XFRM_MSG_UPDSA:
+               return key_notify_sa(x, c);
+       case XFRM_MSG_FLUSHSA:
+               return key_notify_sa_flush(c);
+       default:
+               printk("pfkey: Unknown SA event %d\n", c->event);
+               break;
+       }
+
+       return 0;
+}
+
+static int pfkey_send_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c)
+{
+       switch (c->event) {
+       case XFRM_MSG_POLEXPIRE:
+               return key_notify_policy_expire(xp, c);
+       case XFRM_MSG_DELPOLICY:
+       case XFRM_MSG_NEWPOLICY:
+       case XFRM_MSG_UPDPOLICY:
+               return key_notify_policy(xp, dir, c);
+       case XFRM_MSG_FLUSHPOLICY:
+               return key_notify_policy_flush(c);
+       default:
+               printk("pfkey: Unknown policy event %d\n", c->event);
+               break;
+       }
+
+       return 0;
+}
+
 static u32 get_acqseq(void)
 {
        u32 res;
@@ -2856,6 +3028,7 @@ static struct xfrm_mgr pfkeyv2_mgr =
        .acquire        = pfkey_send_acquire,
        .compile_policy = pfkey_compile_policy,
        .new_mapping    = pfkey_send_new_mapping,
+       .notify_policy  = pfkey_send_policy_notify,
 };
 
 static void __exit ipsec_pfkey_exit(void)
index 733bf52cef3e72c663a9f4bc7f90cecab421c706..70bcd4744d9370e44f0389f28754df5aaaa3bee6 100644 (file)
@@ -735,11 +735,15 @@ static inline int do_one_broadcast(struct sock *sk,
 
        sock_hold(sk);
        if (p->skb2 == NULL) {
-               if (atomic_read(&p->skb->users) != 1) {
+               if (skb_shared(p->skb)) {
                        p->skb2 = skb_clone(p->skb, p->allocation);
                } else {
-                       p->skb2 = p->skb;
-                       atomic_inc(&p->skb->users);
+                       p->skb2 = skb_get(p->skb);
+                       /*
+                        * skb ownership may have been set when
+                        * delivered to a previous socket.
+                        */
+                       skb_orphan(p->skb2);
                }
        }
        if (p->skb2 == NULL) {
@@ -785,11 +789,12 @@ int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid,
        sk_for_each_bound(sk, node, &nl_table[ssk->sk_protocol].mc_list)
                do_one_broadcast(sk, &info);
 
+       kfree_skb(skb);
+
        netlink_unlock_table();
 
        if (info.skb2)
                kfree_skb(info.skb2);
-       kfree_skb(skb);
 
        if (info.delivered) {
                if (info.congested && (allocation & __GFP_WAIT))
@@ -1090,8 +1095,7 @@ static int netlink_dump(struct sock *sk)
                return 0;
        }
 
-       nlh = __nlmsg_put(skb, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq, NLMSG_DONE, sizeof(int));
-       nlh->nlmsg_flags |= NLM_F_MULTI;
+       nlh = NLMSG_NEW_ANSWER(skb, cb, NLMSG_DONE, sizeof(len), NLM_F_MULTI);
        memcpy(NLMSG_DATA(nlh), &len, sizeof(len));
        skb_queue_tail(&sk->sk_receive_queue, skb);
        sk->sk_data_ready(sk, skb->len);
@@ -1102,6 +1106,9 @@ static int netlink_dump(struct sock *sk)
 
        netlink_destroy_callback(cb);
        return 0;
+
+nlmsg_failure:
+       return -ENOBUFS;
 }
 
 int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
@@ -1173,7 +1180,7 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err)
        }
 
        rep = __nlmsg_put(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq,
-                         NLMSG_ERROR, sizeof(struct nlmsgerr));
+                         NLMSG_ERROR, sizeof(struct nlmsgerr), 0);
        errmsg = NLMSG_DATA(rep);
        errmsg->error = err;
        memcpy(&errmsg->msg, nlh, err ? nlh->nlmsg_len : sizeof(struct nlmsghdr));
index b0941186f867710a4f4ca4a9fdb486aa2d9b1455..b22c9beb604d78eb3dbf32809112802cb0b597ee 100644 (file)
@@ -405,7 +405,7 @@ config NET_EMATCH_STACK
        ---help---
          Size of the local stack variable used while evaluating the tree of
          ematches. Limits the depth of the tree, i.e. the number of
-         encapsulated precedences. Every level requires 4 bytes of addtional
+         encapsulated precedences. Every level requires 4 bytes of additional
          stack space.
 
 config NET_EMATCH_CMP
index cafcb084098d161d0d8d09ac64e8b067edb837f9..9594206e6035fc412fb88a8dcfa1d8f88f28ec47 100644 (file)
@@ -428,15 +428,15 @@ errout:
 
 static int
 tca_get_fill(struct sk_buff *skb, struct tc_action *a, u32 pid, u32 seq,
-             unsigned flags, int event, int bind, int ref)
+             u16 flags, int event, int bind, int ref)
 {
        struct tcamsg *t;
        struct nlmsghdr *nlh;
        unsigned char *b = skb->tail;
        struct rtattr *x;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*t));
-       nlh->nlmsg_flags = flags;
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*t), flags);
+
        t = NLMSG_DATA(nlh);
        t->tca_family = AF_UNSPEC;
        
@@ -669,7 +669,7 @@ err:
 }
 
 static int tcf_add_notify(struct tc_action *a, u32 pid, u32 seq, int event,
-                          unsigned flags)
+                          u16 flags)
 {
        struct tcamsg *t;
        struct nlmsghdr *nlh;
@@ -684,8 +684,7 @@ static int tcf_add_notify(struct tc_action *a, u32 pid, u32 seq, int event,
 
        b = (unsigned char *)skb->tail;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*t));
-       nlh->nlmsg_flags = flags;
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*t), flags);
        t = NLMSG_DATA(nlh);
        t->tca_family = AF_UNSPEC;
        
@@ -881,7 +880,7 @@ static int __init tc_action_init(void)
                link_p[RTM_GETACTION-RTM_BASE].dumpit = tc_dump_action;
        }
 
-       printk("TC classifier action (bugs to netdev@oss.sgi.com cc "
+       printk("TC classifier action (bugs to netdev@vger.kernel.org cc "
               "hadi@cyberus.ca)\n");
        return 0;
 }
index 56e66c3fe0fa0eec1942b8a1f7941b079f4a7fb5..1616bf5c96272774a655d1440daffd48b8a928fb 100644 (file)
@@ -322,14 +322,13 @@ errout:
 
 static int
 tcf_fill_node(struct sk_buff *skb, struct tcf_proto *tp, unsigned long fh,
-             u32 pid, u32 seq, unsigned flags, int event)
+             u32 pid, u32 seq, u16 flags, int event)
 {
        struct tcmsg *tcm;
        struct nlmsghdr  *nlh;
        unsigned char    *b = skb->tail;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*tcm));
-       nlh->nlmsg_flags = flags;
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*tcm), flags);
        tcm = NLMSG_DATA(nlh);
        tcm->tcm_family = AF_UNSPEC;
        tcm->tcm_ifindex = tp->q->dev->ifindex;
index 0d2d4415f334850b7006c110bc502736ae3f83b1..dfb300bb6baa067963a5e0e1e160087ae69d291d 100644 (file)
@@ -261,6 +261,9 @@ static int basic_dump(struct tcf_proto *tp, unsigned long fh,
        rta = (struct rtattr *) b;
        RTA_PUT(skb, TCA_OPTIONS, 0, NULL);
 
+       if (f->res.classid)
+               RTA_PUT(skb, TCA_BASIC_CLASSID, sizeof(u32), &f->res.classid);
+
        if (tcf_exts_dump(skb, &f->exts, &basic_ext_map) < 0 ||
            tcf_em_tree_dump(skb, &f->ematches, TCA_BASIC_EMATCHES) < 0)
                goto rtattr_failure;
index f1eeaf65cee5f833aabb493c53442ef80e983eef..48bb23c2a35a404aa5ef6e94a9160e2b346510ad 100644 (file)
@@ -32,7 +32,7 @@
  *           +-----------+                           +-----------+
  *                 |                                       |
  *                 ---> meta_ops[INT][INDEV](...)          |
- *                            |                            |
+ *                                                       |
  *                 -----------                             |
  *                 V                                       V
  *           +-----------+                           +-----------+
@@ -70,6 +70,7 @@
 #include <net/dst.h>
 #include <net/route.h>
 #include <net/pkt_cls.h>
+#include <net/sock.h>
 
 struct meta_obj
 {
@@ -283,6 +284,214 @@ META_COLLECTOR(int_rtiif)
                dst->value = ((struct rtable*) skb->dst)->fl.iif;
 }
 
+/**************************************************************************
+ * Socket Attributes
+ **************************************************************************/
+
+#define SKIP_NONLOCAL(skb)                     \
+       if (unlikely(skb->sk == NULL)) {        \
+               *err = -1;                      \
+               return;                         \
+       }
+
+META_COLLECTOR(int_sk_family)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_family;
+}
+
+META_COLLECTOR(int_sk_state)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_state;
+}
+
+META_COLLECTOR(int_sk_reuse)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_reuse;
+}
+
+META_COLLECTOR(int_sk_bound_if)
+{
+       SKIP_NONLOCAL(skb);
+       /* No error if bound_dev_if is 0, legal userspace check */
+       dst->value = skb->sk->sk_bound_dev_if;
+}
+
+META_COLLECTOR(var_sk_bound_if)
+{
+       SKIP_NONLOCAL(skb);
+
+        if (skb->sk->sk_bound_dev_if == 0) {
+               dst->value = (unsigned long) "any";
+               dst->len = 3;
+        } else  {
+               struct net_device *dev;
+               
+               dev = dev_get_by_index(skb->sk->sk_bound_dev_if);
+               *err = var_dev(dev, dst);
+               if (dev)
+                       dev_put(dev);
+        }
+}
+
+META_COLLECTOR(int_sk_refcnt)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = atomic_read(&skb->sk->sk_refcnt);
+}
+
+META_COLLECTOR(int_sk_rcvbuf)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_rcvbuf;
+}
+
+META_COLLECTOR(int_sk_shutdown)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_shutdown;
+}
+
+META_COLLECTOR(int_sk_proto)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_protocol;
+}
+
+META_COLLECTOR(int_sk_type)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_type;
+}
+
+META_COLLECTOR(int_sk_rmem_alloc)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = atomic_read(&skb->sk->sk_rmem_alloc);
+}
+
+META_COLLECTOR(int_sk_wmem_alloc)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = atomic_read(&skb->sk->sk_wmem_alloc);
+}
+
+META_COLLECTOR(int_sk_omem_alloc)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = atomic_read(&skb->sk->sk_omem_alloc);
+}
+
+META_COLLECTOR(int_sk_rcv_qlen)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_receive_queue.qlen;
+}
+
+META_COLLECTOR(int_sk_snd_qlen)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_write_queue.qlen;
+}
+
+META_COLLECTOR(int_sk_wmem_queued)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_wmem_queued;
+}
+
+META_COLLECTOR(int_sk_fwd_alloc)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_forward_alloc;
+}
+
+META_COLLECTOR(int_sk_sndbuf)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_sndbuf;
+}
+
+META_COLLECTOR(int_sk_alloc)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_allocation;
+}
+
+META_COLLECTOR(int_sk_route_caps)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_route_caps;
+}
+
+META_COLLECTOR(int_sk_hashent)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_hashent;
+}
+
+META_COLLECTOR(int_sk_lingertime)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_lingertime / HZ;
+}
+
+META_COLLECTOR(int_sk_err_qlen)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_error_queue.qlen;
+}
+
+META_COLLECTOR(int_sk_ack_bl)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_ack_backlog;
+}
+
+META_COLLECTOR(int_sk_max_ack_bl)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_max_ack_backlog;
+}
+
+META_COLLECTOR(int_sk_prio)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_priority;
+}
+
+META_COLLECTOR(int_sk_rcvlowat)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_rcvlowat;
+}
+
+META_COLLECTOR(int_sk_rcvtimeo)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_rcvtimeo / HZ;
+}
+
+META_COLLECTOR(int_sk_sndtimeo)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_sndtimeo / HZ;
+}
+
+META_COLLECTOR(int_sk_sendmsg_off)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_sndmsg_off;
+}
+
+META_COLLECTOR(int_sk_write_pend)
+{
+       SKIP_NONLOCAL(skb);
+       dst->value = skb->sk->sk_write_pending;
+}
+
 /**************************************************************************
  * Meta value collectors assignment table
  **************************************************************************/
@@ -293,41 +502,75 @@ struct meta_ops
                               struct meta_value *, struct meta_obj *, int *);
 };
 
+#define META_ID(name) TCF_META_ID_##name
+#define META_FUNC(name) { .get = meta_##name }
+
 /* Meta value operations table listing all meta value collectors and
  * assigns them to a type and meta id. */
 static struct meta_ops __meta_ops[TCF_META_TYPE_MAX+1][TCF_META_ID_MAX+1] = {
        [TCF_META_TYPE_VAR] = {
-               [TCF_META_ID_DEV]       = { .get = meta_var_dev },
-               [TCF_META_ID_INDEV]     = { .get = meta_var_indev },
-               [TCF_META_ID_REALDEV]   = { .get = meta_var_realdev }
+               [META_ID(DEV)]                  = META_FUNC(var_dev),
+               [META_ID(INDEV)]                = META_FUNC(var_indev),
+               [META_ID(REALDEV)]              = META_FUNC(var_realdev),
+               [META_ID(SK_BOUND_IF)]          = META_FUNC(var_sk_bound_if),
        },
        [TCF_META_TYPE_INT] = {
-               [TCF_META_ID_RANDOM]    = { .get = meta_int_random },
-               [TCF_META_ID_LOADAVG_0] = { .get = meta_int_loadavg_0 },
-               [TCF_META_ID_LOADAVG_1] = { .get = meta_int_loadavg_1 },
-               [TCF_META_ID_LOADAVG_2] = { .get = meta_int_loadavg_2 },
-               [TCF_META_ID_DEV]       = { .get = meta_int_dev },
-               [TCF_META_ID_INDEV]     = { .get = meta_int_indev },
-               [TCF_META_ID_REALDEV]   = { .get = meta_int_realdev },
-               [TCF_META_ID_PRIORITY]  = { .get = meta_int_priority },
-               [TCF_META_ID_PROTOCOL]  = { .get = meta_int_protocol },
-               [TCF_META_ID_SECURITY]  = { .get = meta_int_security },
-               [TCF_META_ID_PKTTYPE]   = { .get = meta_int_pkttype },
-               [TCF_META_ID_PKTLEN]    = { .get = meta_int_pktlen },
-               [TCF_META_ID_DATALEN]   = { .get = meta_int_datalen },
-               [TCF_META_ID_MACLEN]    = { .get = meta_int_maclen },
+               [META_ID(RANDOM)]               = META_FUNC(int_random),
+               [META_ID(LOADAVG_0)]            = META_FUNC(int_loadavg_0),
+               [META_ID(LOADAVG_1)]            = META_FUNC(int_loadavg_1),
+               [META_ID(LOADAVG_2)]            = META_FUNC(int_loadavg_2),
+               [META_ID(DEV)]                  = META_FUNC(int_dev),
+               [META_ID(INDEV)]                = META_FUNC(int_indev),
+               [META_ID(REALDEV)]              = META_FUNC(int_realdev),
+               [META_ID(PRIORITY)]             = META_FUNC(int_priority),
+               [META_ID(PROTOCOL)]             = META_FUNC(int_protocol),
+               [META_ID(SECURITY)]             = META_FUNC(int_security),
+               [META_ID(PKTTYPE)]              = META_FUNC(int_pkttype),
+               [META_ID(PKTLEN)]               = META_FUNC(int_pktlen),
+               [META_ID(DATALEN)]              = META_FUNC(int_datalen),
+               [META_ID(MACLEN)]               = META_FUNC(int_maclen),
 #ifdef CONFIG_NETFILTER
-               [TCF_META_ID_NFMARK]    = { .get = meta_int_nfmark },
+               [META_ID(NFMARK)]               = META_FUNC(int_nfmark),
 #endif
-               [TCF_META_ID_TCINDEX]   = { .get = meta_int_tcindex },
+               [META_ID(TCINDEX)]              = META_FUNC(int_tcindex),
 #ifdef CONFIG_NET_CLS_ACT
-               [TCF_META_ID_TCVERDICT] = { .get = meta_int_tcverd },
-               [TCF_META_ID_TCCLASSID] = { .get = meta_int_tcclassid },
+               [META_ID(TCVERDICT)]            = META_FUNC(int_tcverd),
+               [META_ID(TCCLASSID)]            = META_FUNC(int_tcclassid),
 #endif
 #ifdef CONFIG_NET_CLS_ROUTE
-               [TCF_META_ID_RTCLASSID] = { .get = meta_int_rtclassid },
+               [META_ID(RTCLASSID)]            = META_FUNC(int_rtclassid),
 #endif
-               [TCF_META_ID_RTIIF]     = { .get = meta_int_rtiif }
+               [META_ID(RTIIF)]                = META_FUNC(int_rtiif),
+               [META_ID(SK_FAMILY)]            = META_FUNC(int_sk_family),
+               [META_ID(SK_STATE)]             = META_FUNC(int_sk_state),
+               [META_ID(SK_REUSE)]             = META_FUNC(int_sk_reuse),
+               [META_ID(SK_BOUND_IF)]          = META_FUNC(int_sk_bound_if),
+               [META_ID(SK_REFCNT)]            = META_FUNC(int_sk_refcnt),
+               [META_ID(SK_RCVBUF)]            = META_FUNC(int_sk_rcvbuf),
+               [META_ID(SK_SNDBUF)]            = META_FUNC(int_sk_sndbuf),
+               [META_ID(SK_SHUTDOWN)]          = META_FUNC(int_sk_shutdown),
+               [META_ID(SK_PROTO)]             = META_FUNC(int_sk_proto),
+               [META_ID(SK_TYPE)]              = META_FUNC(int_sk_type),
+               [META_ID(SK_RMEM_ALLOC)]        = META_FUNC(int_sk_rmem_alloc),
+               [META_ID(SK_WMEM_ALLOC)]        = META_FUNC(int_sk_wmem_alloc),
+               [META_ID(SK_OMEM_ALLOC)]        = META_FUNC(int_sk_omem_alloc),
+               [META_ID(SK_WMEM_QUEUED)]       = META_FUNC(int_sk_wmem_queued),
+               [META_ID(SK_RCV_QLEN)]          = META_FUNC(int_sk_rcv_qlen),
+               [META_ID(SK_SND_QLEN)]          = META_FUNC(int_sk_snd_qlen),
+               [META_ID(SK_ERR_QLEN)]          = META_FUNC(int_sk_err_qlen),
+               [META_ID(SK_FORWARD_ALLOCS)]    = META_FUNC(int_sk_fwd_alloc),
+               [META_ID(SK_ALLOCS)]            = META_FUNC(int_sk_alloc),
+               [META_ID(SK_ROUTE_CAPS)]        = META_FUNC(int_sk_route_caps),
+               [META_ID(SK_HASHENT)]           = META_FUNC(int_sk_hashent),
+               [META_ID(SK_LINGERTIME)]        = META_FUNC(int_sk_lingertime),
+               [META_ID(SK_ACK_BACKLOG)]       = META_FUNC(int_sk_ack_bl),
+               [META_ID(SK_MAX_ACK_BACKLOG)]   = META_FUNC(int_sk_max_ack_bl),
+               [META_ID(SK_PRIO)]              = META_FUNC(int_sk_prio),
+               [META_ID(SK_RCVLOWAT)]          = META_FUNC(int_sk_rcvlowat),
+               [META_ID(SK_RCVTIMEO)]          = META_FUNC(int_sk_rcvtimeo),
+               [META_ID(SK_SNDTIMEO)]          = META_FUNC(int_sk_sndtimeo),
+               [META_ID(SK_SENDMSG_OFF)]       = META_FUNC(int_sk_sendmsg_off),
+               [META_ID(SK_WRITE_PENDING)]     = META_FUNC(int_sk_write_pend),
        }
 };
 
@@ -396,9 +639,9 @@ static int meta_int_compare(struct meta_obj *a, struct meta_obj *b)
        /* Let gcc optimize it, the unlikely is not really based on
         * some numbers but jump free code for mismatches seems
         * more logical. */
-       if (unlikely(a == b))
+       if (unlikely(a->value == b->value))
                return 0;
-       else if (a < b)
+       else if (a->value < b->value)
                return -1;
        else
                return 1;
index 07977f8f2679b30cf93808f93fbbcce3c3dbc776..97c1c75d5c787f0b6a8d9416965e329662e7f52f 100644 (file)
@@ -760,15 +760,14 @@ graft:
 }
 
 static int tc_fill_qdisc(struct sk_buff *skb, struct Qdisc *q, u32 clid,
-                        u32 pid, u32 seq, unsigned flags, int event)
+                        u32 pid, u32 seq, u16 flags, int event)
 {
        struct tcmsg *tcm;
        struct nlmsghdr  *nlh;
        unsigned char    *b = skb->tail;
        struct gnet_dump d;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*tcm));
-       nlh->nlmsg_flags = flags;
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*tcm), flags);
        tcm = NLMSG_DATA(nlh);
        tcm->tcm_family = AF_UNSPEC;
        tcm->tcm_ifindex = q->dev->ifindex;
@@ -997,7 +996,7 @@ out:
 
 static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q,
                          unsigned long cl,
-                         u32 pid, u32 seq, unsigned flags, int event)
+                         u32 pid, u32 seq, u16 flags, int event)
 {
        struct tcmsg *tcm;
        struct nlmsghdr  *nlh;
@@ -1005,8 +1004,7 @@ static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q,
        struct gnet_dump d;
        struct Qdisc_class_ops *cl_ops = q->ops->cl_ops;
 
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*tcm));
-       nlh->nlmsg_flags = flags;
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*tcm), flags);
        tcm = NLMSG_DATA(nlh);
        tcm->tcm_family = AF_UNSPEC;
        tcm->tcm_ifindex = q->dev->ifindex;
index 8a3db9d95bab238b99a7018a73b5e9ddbd189835..13e0e7b3856bfe396c791a0ad77c9c6e4d040dc3 100644 (file)
@@ -18,7 +18,7 @@
 #include <asm/byteorder.h>
 
 
-#if 1 /* control */
+#if 0 /* control */
 #define DPRINTK(format,args...) printk(KERN_DEBUG format,##args)
 #else
 #define DPRINTK(format,args...)
@@ -31,7 +31,7 @@
 #endif
 
 
-#define PRIV(sch) qdisc_priv(sch)
+#define PRIV(sch) ((struct dsmark_qdisc_data *) qdisc_priv(sch))
 
 
 /*
 struct dsmark_qdisc_data {
        struct Qdisc            *q;
        struct tcf_proto        *filter_list;
-       __u8                    *mask;  /* "owns" the array */
-       __u8                    *value;
-       __u16                   indices;
-       __u32                   default_index;  /* index range is 0...0xffff */
+       u8                      *mask;  /* "owns" the array */
+       u8                      *value;
+       u16                     indices;
+       u32                     default_index;  /* index range is 0...0xffff */
        int                     set_tc_index;
 };
 
+static inline int dsmark_valid_indices(u16 indices)
+{
+       while (indices != 1) {
+               if (indices & 1)
+                       return 0;
+               indices >>= 1;
+       }
+       return 1;
+}
 
-/* ------------------------- Class/flow operations ------------------------- */
+static inline int dsmark_valid_index(struct dsmark_qdisc_data *p, u16 index)
+{
+       return (index <= p->indices && index > 0);
+}
 
+/* ------------------------- Class/flow operations ------------------------- */
 
-static int dsmark_graft(struct Qdisc *sch,unsigned long arg,
-    struct Qdisc *new,struct Qdisc **old)
+static int dsmark_graft(struct Qdisc *sch, unsigned long arg,
+                       struct Qdisc *new, struct Qdisc **old)
 {
        struct dsmark_qdisc_data *p = PRIV(sch);
 
-       DPRINTK("dsmark_graft(sch %p,[qdisc %p],new %p,old %p)\n",sch,p,new,
-           old);
-       if (!new)
-               new = &noop_qdisc;
+       DPRINTK("dsmark_graft(sch %p,[qdisc %p],new %p,old %p)\n",
+               sch, p, new, old);
+
+       if (new == NULL) {
+               new = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops);
+               if (new == NULL)
+                       new = &noop_qdisc;
+       }
+
        sch_tree_lock(sch);
-       *old = xchg(&p->q,new);
-       if (*old)
-               qdisc_reset(*old);
+       *old = xchg(&p->q, new);
+       qdisc_reset(*old);
        sch->q.qlen = 0;
-       sch_tree_unlock(sch); /* @@@ move up ? */
+       sch_tree_unlock(sch);
+
         return 0;
 }
 
-
 static struct Qdisc *dsmark_leaf(struct Qdisc *sch, unsigned long arg)
 {
-       struct dsmark_qdisc_data *p = PRIV(sch);
-
-       return p->q;
+       return PRIV(sch)->q;
 }
 
-
-static unsigned long dsmark_get(struct Qdisc *sch,u32 classid)
+static unsigned long dsmark_get(struct Qdisc *sch, u32 classid)
 {
-       struct dsmark_qdisc_data *p __attribute__((unused)) = PRIV(sch);
+       DPRINTK("dsmark_get(sch %p,[qdisc %p],classid %x)\n",
+               sch, PRIV(sch), classid);
 
-       DPRINTK("dsmark_get(sch %p,[qdisc %p],classid %x)\n",sch,p,classid);
-       return TC_H_MIN(classid)+1;
+       return TC_H_MIN(classid) + 1;
 }
 
-
 static unsigned long dsmark_bind_filter(struct Qdisc *sch,
-    unsigned long parent, u32 classid)
+                                       unsigned long parent, u32 classid)
 {
-       return dsmark_get(sch,classid);
+       return dsmark_get(sch, classid);
 }
 
-
 static void dsmark_put(struct Qdisc *sch, unsigned long cl)
 {
 }
 
-
 static int dsmark_change(struct Qdisc *sch, u32 classid, u32 parent,
-    struct rtattr **tca, unsigned long *arg)
+                        struct rtattr **tca, unsigned long *arg)
 {
        struct dsmark_qdisc_data *p = PRIV(sch);
        struct rtattr *opt = tca[TCA_OPTIONS-1];
        struct rtattr *tb[TCA_DSMARK_MAX];
+       int err = -EINVAL;
+       u8 mask = 0;
 
        DPRINTK("dsmark_change(sch %p,[qdisc %p],classid %x,parent %x),"
-           "arg 0x%lx\n",sch,p,classid,parent,*arg);
-       if (*arg > p->indices)
-               return -ENOENT;
-       if (!opt || rtattr_parse_nested(tb, TCA_DSMARK_MAX, opt))
-               return -EINVAL;
-       if (tb[TCA_DSMARK_MASK-1]) {
-               if (!RTA_PAYLOAD(tb[TCA_DSMARK_MASK-1]))
-                       return -EINVAL;
-               p->mask[*arg-1] = *(__u8 *) RTA_DATA(tb[TCA_DSMARK_MASK-1]);
-       }
-       if (tb[TCA_DSMARK_VALUE-1]) {
-               if (!RTA_PAYLOAD(tb[TCA_DSMARK_VALUE-1]))
-                       return -EINVAL;
-               p->value[*arg-1] = *(__u8 *) RTA_DATA(tb[TCA_DSMARK_VALUE-1]);
+               "arg 0x%lx\n", sch, p, classid, parent, *arg);
+
+       if (!dsmark_valid_index(p, *arg)) {
+               err = -ENOENT;
+               goto rtattr_failure;
        }
-       return 0;
-}
 
+       if (!opt || rtattr_parse_nested(tb, TCA_DSMARK_MAX, opt))
+               goto rtattr_failure;
+
+       if (tb[TCA_DSMARK_MASK-1])
+               mask = RTA_GET_U8(tb[TCA_DSMARK_MASK-1]);
+
+       if (tb[TCA_DSMARK_VALUE-1])
+               p->value[*arg-1] = RTA_GET_U8(tb[TCA_DSMARK_VALUE-1]);
+               
+       if (tb[TCA_DSMARK_MASK-1])
+               p->mask[*arg-1] = mask;
 
-static int dsmark_delete(struct Qdisc *sch,unsigned long arg)
+       err = 0;
+
+rtattr_failure:
+       return err;
+}
+
+static int dsmark_delete(struct Qdisc *sch, unsigned long arg)
 {
        struct dsmark_qdisc_data *p = PRIV(sch);
 
-       if (!arg || arg > p->indices)
+       if (!dsmark_valid_index(p, arg))
                return -EINVAL;
+       
        p->mask[arg-1] = 0xff;
        p->value[arg-1] = 0;
+
        return 0;
 }
 
-
 static void dsmark_walk(struct Qdisc *sch,struct qdisc_walker *walker)
 {
        struct dsmark_qdisc_data *p = PRIV(sch);
        int i;
 
-       DPRINTK("dsmark_walk(sch %p,[qdisc %p],walker %p)\n",sch,p,walker);
+       DPRINTK("dsmark_walk(sch %p,[qdisc %p],walker %p)\n", sch, p, walker);
+
        if (walker->stop)
                return;
+
        for (i = 0; i < p->indices; i++) {
                if (p->mask[i] == 0xff && !p->value[i])
-                       continue;
+                       goto ignore;
                if (walker->count >= walker->skip) {
                        if (walker->fn(sch, i+1, walker) < 0) {
                                walker->stop = 1;
                                break;
                        }
                }
-                walker->count++;
+ignore:                
+               walker->count++;
         }
 }
 
-
 static struct tcf_proto **dsmark_find_tcf(struct Qdisc *sch,unsigned long cl)
 {
-       struct dsmark_qdisc_data *p = PRIV(sch);
-
-       return &p->filter_list;
+       return &PRIV(sch)->filter_list;
 }
 
-
 /* --------------------------- Qdisc operations ---------------------------- */
 
-
 static int dsmark_enqueue(struct sk_buff *skb,struct Qdisc *sch)
 {
        struct dsmark_qdisc_data *p = PRIV(sch);
-       struct tcf_result res;
-       int result;
-       int ret = NET_XMIT_POLICED;
+       int err;
+
+       D2PRINTK("dsmark_enqueue(skb %p,sch %p,[qdisc %p])\n", skb, sch, p);
 
-       D2PRINTK("dsmark_enqueue(skb %p,sch %p,[qdisc %p])\n",skb,sch,p);
        if (p->set_tc_index) {
                /* FIXME: Safe with non-linear skbs? --RR */
                switch (skb->protocol) {
@@ -210,17 +228,21 @@ static int dsmark_enqueue(struct sk_buff *skb,struct Qdisc *sch)
                                break;
                };
        }
-       result = TC_POLICE_OK; /* be nice to gcc */
-       if (TC_H_MAJ(skb->priority) == sch->handle) {
+
+       if (TC_H_MAJ(skb->priority) == sch->handle)
                skb->tc_index = TC_H_MIN(skb->priority);
-       } else {
-               result = tc_classify(skb,p->filter_list,&res);
-               D2PRINTK("result %d class 0x%04x\n",result,res.classid);
+       else {
+               struct tcf_result res;
+               int result = tc_classify(skb, p->filter_list, &res);
+
+               D2PRINTK("result %d class 0x%04x\n", result, res.classid);
+
                switch (result) {
 #ifdef CONFIG_NET_CLS_POLICE
                        case TC_POLICE_SHOT:
                                kfree_skb(skb);
-                               break;
+                               sch->qstats.drops++;
+                               return NET_XMIT_POLICED;
 #if 0
                        case TC_POLICE_RECLASSIFY:
                                /* FIXME: what to do here ??? */
@@ -237,43 +259,45 @@ static int dsmark_enqueue(struct sk_buff *skb,struct Qdisc *sch)
                                break;
                };
        }
-       if (
-#ifdef CONFIG_NET_CLS_POLICE
-           result == TC_POLICE_SHOT ||
-#endif
 
-           ((ret = p->q->enqueue(skb,p->q)) != 0)) {
+       err = p->q->enqueue(skb,p->q);
+       if (err != NET_XMIT_SUCCESS) {
                sch->qstats.drops++;
-               return ret;
+               return err;
        }
+
        sch->bstats.bytes += skb->len;
        sch->bstats.packets++;
        sch->q.qlen++;
-       return ret;
-}
 
+       return NET_XMIT_SUCCESS;
+}
 
 static struct sk_buff *dsmark_dequeue(struct Qdisc *sch)
 {
        struct dsmark_qdisc_data *p = PRIV(sch);
        struct sk_buff *skb;
-       int index;
+       u32 index;
+
+       D2PRINTK("dsmark_dequeue(sch %p,[qdisc %p])\n", sch, p);
 
-       D2PRINTK("dsmark_dequeue(sch %p,[qdisc %p])\n",sch,p);
        skb = p->q->ops->dequeue(p->q);
-       if (!skb)
+       if (skb == NULL)
                return NULL;
+
        sch->q.qlen--;
-       index = skb->tc_index & (p->indices-1);
-       D2PRINTK("index %d->%d\n",skb->tc_index,index);
+
+       index = skb->tc_index & (p->indices - 1);
+       D2PRINTK("index %d->%d\n", skb->tc_index, index);
+
        switch (skb->protocol) {
                case __constant_htons(ETH_P_IP):
-                       ipv4_change_dsfield(skb->nh.iph,
-                           p->mask[index],p->value[index]);
+                       ipv4_change_dsfield(skb->nh.iph, p->mask[index],
+                                           p->value[index]);
                        break;
                case __constant_htons(ETH_P_IPV6):
-                       ipv6_change_dsfield(skb->nh.ipv6h,
-                           p->mask[index],p->value[index]);
+                       ipv6_change_dsfield(skb->nh.ipv6h, p->mask[index],
+                                           p->value[index]);
                        break;
                default:
                        /*
@@ -287,152 +311,162 @@ static struct sk_buff *dsmark_dequeue(struct Qdisc *sch)
                                       htons(skb->protocol));
                        break;
        };
+
        return skb;
 }
 
-
 static int dsmark_requeue(struct sk_buff *skb,struct Qdisc *sch)
 {
-       int ret;
        struct dsmark_qdisc_data *p = PRIV(sch);
+       int err;
 
-       D2PRINTK("dsmark_requeue(skb %p,sch %p,[qdisc %p])\n",skb,sch,p);
-        if ((ret = p->q->ops->requeue(skb, p->q)) == 0) {
-               sch->q.qlen++;
-               sch->qstats.requeues++;
-               return 0;
+       D2PRINTK("dsmark_requeue(skb %p,sch %p,[qdisc %p])\n", skb, sch, p);
+
+       err = p->q->ops->requeue(skb, p->q);
+       if (err != NET_XMIT_SUCCESS) {
+               sch->qstats.drops++;
+               return err;
        }
-       sch->qstats.drops++;
-       return ret;
-}
 
+       sch->q.qlen++;
+       sch->qstats.requeues++;
+
+       return NET_XMIT_SUCCESS;
+}
 
 static unsigned int dsmark_drop(struct Qdisc *sch)
 {
        struct dsmark_qdisc_data *p = PRIV(sch);
        unsigned int len;
        
-       DPRINTK("dsmark_reset(sch %p,[qdisc %p])\n",sch,p);
-       if (!p->q->ops->drop)
-               return 0;
-       if (!(len = p->q->ops->drop(p->q)))
+       DPRINTK("dsmark_reset(sch %p,[qdisc %p])\n", sch, p);
+
+       if (p->q->ops->drop == NULL)
                return 0;
-       sch->q.qlen--;
+
+       len = p->q->ops->drop(p->q);
+       if (len)
+               sch->q.qlen--;
+
        return len;
 }
 
-
-static int dsmark_init(struct Qdisc *sch,struct rtattr *opt)
+static int dsmark_init(struct Qdisc *sch, struct rtattr *opt)
 {
        struct dsmark_qdisc_data *p = PRIV(sch);
        struct rtattr *tb[TCA_DSMARK_MAX];
-       __u16 tmp;
-
-       DPRINTK("dsmark_init(sch %p,[qdisc %p],opt %p)\n",sch,p,opt);
-       if (!opt ||
-           rtattr_parse(tb,TCA_DSMARK_MAX,RTA_DATA(opt),RTA_PAYLOAD(opt)) < 0 ||
-           !tb[TCA_DSMARK_INDICES-1] ||
-           RTA_PAYLOAD(tb[TCA_DSMARK_INDICES-1]) < sizeof(__u16))
-                return -EINVAL;
-       p->indices = *(__u16 *) RTA_DATA(tb[TCA_DSMARK_INDICES-1]);
-       if (!p->indices)
-               return -EINVAL;
-       for (tmp = p->indices; tmp != 1; tmp >>= 1) {
-               if (tmp & 1)
-                       return -EINVAL;
-       }
-       p->default_index = NO_DEFAULT_INDEX;
-       if (tb[TCA_DSMARK_DEFAULT_INDEX-1]) {
-               if (RTA_PAYLOAD(tb[TCA_DSMARK_DEFAULT_INDEX-1]) < sizeof(__u16))
-                       return -EINVAL;
-               p->default_index =
-                   *(__u16 *) RTA_DATA(tb[TCA_DSMARK_DEFAULT_INDEX-1]);
+       int err = -EINVAL;
+       u32 default_index = NO_DEFAULT_INDEX;
+       u16 indices;
+       u8 *mask;
+
+       DPRINTK("dsmark_init(sch %p,[qdisc %p],opt %p)\n", sch, p, opt);
+
+       if (!opt || rtattr_parse_nested(tb, TCA_DSMARK_MAX, opt) < 0)
+               goto errout;
+
+       indices = RTA_GET_U16(tb[TCA_DSMARK_INDICES-1]);
+       if (!indices || !dsmark_valid_indices(indices))
+               goto errout;
+
+       if (tb[TCA_DSMARK_DEFAULT_INDEX-1])
+               default_index = RTA_GET_U16(tb[TCA_DSMARK_DEFAULT_INDEX-1]);
+
+       mask = kmalloc(indices * 2, GFP_KERNEL);
+       if (mask == NULL) {
+               err = -ENOMEM;
+               goto errout;
        }
-       p->set_tc_index = !!tb[TCA_DSMARK_SET_TC_INDEX-1];
-       p->mask = kmalloc(p->indices*2,GFP_KERNEL);
-       if (!p->mask)
-               return -ENOMEM;
-       p->value = p->mask+p->indices;
-       memset(p->mask,0xff,p->indices);
-       memset(p->value,0,p->indices);
-       if (!(p->q = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops)))
+
+       p->mask = mask;
+       memset(p->mask, 0xff, indices);
+
+       p->value = p->mask + indices;
+       memset(p->value, 0, indices);
+
+       p->indices = indices;
+       p->default_index = default_index;
+       p->set_tc_index = RTA_GET_FLAG(tb[TCA_DSMARK_SET_TC_INDEX-1]);
+
+       p->q = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops);
+       if (p->q == NULL)
                p->q = &noop_qdisc;
-       DPRINTK("dsmark_init: qdisc %p\n",&p->q);
-       return 0;
-}
 
+       DPRINTK("dsmark_init: qdisc %p\n", p->q);
+
+       err = 0;
+errout:
+rtattr_failure:
+       return err;
+}
 
 static void dsmark_reset(struct Qdisc *sch)
 {
        struct dsmark_qdisc_data *p = PRIV(sch);
 
-       DPRINTK("dsmark_reset(sch %p,[qdisc %p])\n",sch,p);
+       DPRINTK("dsmark_reset(sch %p,[qdisc %p])\n", sch, p);
        qdisc_reset(p->q);
        sch->q.qlen = 0;
 }
 
-
 static void dsmark_destroy(struct Qdisc *sch)
 {
        struct dsmark_qdisc_data *p = PRIV(sch);
        struct tcf_proto *tp;
 
-       DPRINTK("dsmark_destroy(sch %p,[qdisc %p])\n",sch,p);
+       DPRINTK("dsmark_destroy(sch %p,[qdisc %p])\n", sch, p);
+
        while (p->filter_list) {
                tp = p->filter_list;
                p->filter_list = tp->next;
                tcf_destroy(tp);
        }
+
        qdisc_destroy(p->q);
        kfree(p->mask);
 }
 
-
 static int dsmark_dump_class(struct Qdisc *sch, unsigned long cl,
-    struct sk_buff *skb, struct tcmsg *tcm)
+                            struct sk_buff *skb, struct tcmsg *tcm)
 {
        struct dsmark_qdisc_data *p = PRIV(sch);
-       unsigned char *b = skb->tail;
-       struct rtattr *rta;
+       struct rtattr *opts = NULL;
+
+       DPRINTK("dsmark_dump_class(sch %p,[qdisc %p],class %ld\n", sch, p, cl);
 
-       DPRINTK("dsmark_dump_class(sch %p,[qdisc %p],class %ld\n",sch,p,cl);
-       if (!cl || cl > p->indices)
+       if (!dsmark_valid_index(p, cl))
                return -EINVAL;
-       tcm->tcm_handle = TC_H_MAKE(TC_H_MAJ(sch->handle),cl-1);
-       rta = (struct rtattr *) b;
-       RTA_PUT(skb,TCA_OPTIONS,0,NULL);
-       RTA_PUT(skb,TCA_DSMARK_MASK,1,&p->mask[cl-1]);
-       RTA_PUT(skb,TCA_DSMARK_VALUE,1,&p->value[cl-1]);
-       rta->rta_len = skb->tail-b;
-       return skb->len;
+
+       tcm->tcm_handle = TC_H_MAKE(TC_H_MAJ(sch->handle), cl-1);
+
+       opts = RTA_NEST(skb, TCA_OPTIONS);
+       RTA_PUT_U8(skb,TCA_DSMARK_MASK, p->mask[cl-1]);
+       RTA_PUT_U8(skb,TCA_DSMARK_VALUE, p->value[cl-1]);
+
+       return RTA_NEST_END(skb, opts);
 
 rtattr_failure:
-       skb_trim(skb,b-skb->data);
-       return -1;
+       return RTA_NEST_CANCEL(skb, opts);
 }
 
 static int dsmark_dump(struct Qdisc *sch, struct sk_buff *skb)
 {
        struct dsmark_qdisc_data *p = PRIV(sch);
-       unsigned char *b = skb->tail;
-       struct rtattr *rta;
+       struct rtattr *opts = NULL;
 
-       rta = (struct rtattr *) b;
-       RTA_PUT(skb,TCA_OPTIONS,0,NULL);
-       RTA_PUT(skb,TCA_DSMARK_INDICES,sizeof(__u16),&p->indices);
-       if (p->default_index != NO_DEFAULT_INDEX) {
-               __u16 tmp = p->default_index;
+       opts = RTA_NEST(skb, TCA_OPTIONS);
+       RTA_PUT_U16(skb, TCA_DSMARK_INDICES, p->indices);
+
+       if (p->default_index != NO_DEFAULT_INDEX)
+               RTA_PUT_U16(skb, TCA_DSMARK_DEFAULT_INDEX, p->default_index);
 
-               RTA_PUT(skb,TCA_DSMARK_DEFAULT_INDEX, sizeof(__u16), &tmp);
-       }
        if (p->set_tc_index)
-               RTA_PUT(skb, TCA_DSMARK_SET_TC_INDEX, 0, NULL);
-       rta->rta_len = skb->tail-b;
-       return skb->len;
+               RTA_PUT_FLAG(skb, TCA_DSMARK_SET_TC_INDEX);
+
+       return RTA_NEST_END(skb, opts);
 
 rtattr_failure:
-       skb_trim(skb,b-skb->data);
-       return -1;
+       return RTA_NEST_CANCEL(skb, opts);
 }
 
 static struct Qdisc_class_ops dsmark_class_ops = {
@@ -470,10 +504,13 @@ static int __init dsmark_module_init(void)
 {
        return register_qdisc(&dsmark_qdisc_ops);
 }
+
 static void __exit dsmark_module_exit(void) 
 {
        unregister_qdisc(&dsmark_qdisc_ops);
 }
+
 module_init(dsmark_module_init)
 module_exit(dsmark_module_exit)
+
 MODULE_LICENSE("GPL");
index 4888305c96dadf1f339acbd7bbc3ab5ee03d2651..033083bf0e741e6863a5cb999f58dbda6d3729a1 100644 (file)
 
 #include <linux/config.h>
 #include <linux/module.h>
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/socket.h>
-#include <linux/sockios.h>
-#include <linux/in.h>
 #include <linux/errno.h>
-#include <linux/interrupt.h>
-#include <linux/if_ether.h>
-#include <linux/inet.h>
 #include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/notifier.h>
-#include <net/ip.h>
-#include <net/route.h>
 #include <linux/skbuff.h>
-#include <net/sock.h>
 #include <net/pkt_sched.h>
 
 /* 1 band FIFO pseudo-"scheduler" */
 
 struct fifo_sched_data
 {
-       unsigned limit;
+       u32 limit;
 };
 
-static int
-bfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch)
+static int bfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch)
 {
        struct fifo_sched_data *q = qdisc_priv(sch);
 
-       if (sch->qstats.backlog + skb->len <= q->limit) {
-               __skb_queue_tail(&sch->q, skb);
-               sch->qstats.backlog += skb->len;
-               sch->bstats.bytes += skb->len;
-               sch->bstats.packets++;
-               return 0;
-       }
-       sch->qstats.drops++;
-#ifdef CONFIG_NET_CLS_POLICE
-       if (sch->reshape_fail==NULL || sch->reshape_fail(skb, sch))
-#endif
-               kfree_skb(skb);
-       return NET_XMIT_DROP;
-}
-
-static int
-bfifo_requeue(struct sk_buff *skb, struct Qdisc* sch)
-{
-       __skb_queue_head(&sch->q, skb);
-       sch->qstats.backlog += skb->len;
-       sch->qstats.requeues++;
-       return 0;
-}
-
-static struct sk_buff *
-bfifo_dequeue(struct Qdisc* sch)
-{
-       struct sk_buff *skb;
+       if (likely(sch->qstats.backlog + skb->len <= q->limit))
+               return qdisc_enqueue_tail(skb, sch);
 
-       skb = __skb_dequeue(&sch->q);
-       if (skb)
-               sch->qstats.backlog -= skb->len;
-       return skb;
+       return qdisc_reshape_fail(skb, sch);
 }
 
-static unsigned int 
-fifo_drop(struct Qdisc* sch)
-{
-       struct sk_buff *skb;
-
-       skb = __skb_dequeue_tail(&sch->q);
-       if (skb) {
-               unsigned int len = skb->len;
-               sch->qstats.backlog -= len;
-               kfree_skb(skb);
-               return len;
-       }
-       return 0;
-}
-
-static void
-fifo_reset(struct Qdisc* sch)
-{
-       skb_queue_purge(&sch->q);
-       sch->qstats.backlog = 0;
-}
-
-static int
-pfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch)
+static int pfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch)
 {
        struct fifo_sched_data *q = qdisc_priv(sch);
 
-       if (sch->q.qlen < q->limit) {
-               __skb_queue_tail(&sch->q, skb);
-               sch->bstats.bytes += skb->len;
-               sch->bstats.packets++;
-               return 0;
-       }
-       sch->qstats.drops++;
-#ifdef CONFIG_NET_CLS_POLICE
-       if (sch->reshape_fail==NULL || sch->reshape_fail(skb, sch))
-#endif
-               kfree_skb(skb);
-       return NET_XMIT_DROP;
-}
-
-static int
-pfifo_requeue(struct sk_buff *skb, struct Qdisc* sch)
-{
-       __skb_queue_head(&sch->q, skb);
-       sch->qstats.requeues++;
-       return 0;
-}
-
+       if (likely(skb_queue_len(&sch->q) < q->limit))
+               return qdisc_enqueue_tail(skb, sch);
 
-static struct sk_buff *
-pfifo_dequeue(struct Qdisc* sch)
-{
-       return __skb_dequeue(&sch->q);
+       return qdisc_reshape_fail(skb, sch);
 }
 
 static int fifo_init(struct Qdisc *sch, struct rtattr *opt)
@@ -143,66 +50,59 @@ static int fifo_init(struct Qdisc *sch, struct rtattr *opt)
        struct fifo_sched_data *q = qdisc_priv(sch);
 
        if (opt == NULL) {
-               unsigned int limit = sch->dev->tx_queue_len ? : 1;
+               u32 limit = sch->dev->tx_queue_len ? : 1;
 
                if (sch->ops == &bfifo_qdisc_ops)
-                       q->limit = limit*sch->dev->mtu;
-               else    
-                       q->limit = limit;
+                       limit *= sch->dev->mtu;
+
+               q->limit = limit;
        } else {
                struct tc_fifo_qopt *ctl = RTA_DATA(opt);
-               if (opt->rta_len < RTA_LENGTH(sizeof(*ctl)))
+
+               if (RTA_PAYLOAD(opt) < sizeof(*ctl))
                        return -EINVAL;
+
                q->limit = ctl->limit;
        }
+
        return 0;
 }
 
 static int fifo_dump(struct Qdisc *sch, struct sk_buff *skb)
 {
        struct fifo_sched_data *q = qdisc_priv(sch);
-       unsigned char    *b = skb->tail;
-       struct tc_fifo_qopt opt;
+       struct tc_fifo_qopt opt = { .limit = q->limit };
 
-       opt.limit = q->limit;
        RTA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt);
-
        return skb->len;
 
 rtattr_failure:
-       skb_trim(skb, b - skb->data);
        return -1;
 }
 
 struct Qdisc_ops pfifo_qdisc_ops = {
-       .next           =       NULL,
-       .cl_ops         =       NULL,
        .id             =       "pfifo",
        .priv_size      =       sizeof(struct fifo_sched_data),
        .enqueue        =       pfifo_enqueue,
-       .dequeue        =       pfifo_dequeue,
-       .requeue        =       pfifo_requeue,
-       .drop           =       fifo_drop,
+       .dequeue        =       qdisc_dequeue_head,
+       .requeue        =       qdisc_requeue,
+       .drop           =       qdisc_queue_drop,
        .init           =       fifo_init,
-       .reset          =       fifo_reset,
-       .destroy        =       NULL,
+       .reset          =       qdisc_reset_queue,
        .change         =       fifo_init,
        .dump           =       fifo_dump,
        .owner          =       THIS_MODULE,
 };
 
 struct Qdisc_ops bfifo_qdisc_ops = {
-       .next           =       NULL,
-       .cl_ops         =       NULL,
        .id             =       "bfifo",
        .priv_size      =       sizeof(struct fifo_sched_data),
        .enqueue        =       bfifo_enqueue,
-       .dequeue        =       bfifo_dequeue,
-       .requeue        =       bfifo_requeue,
-       .drop           =       fifo_drop,
+       .dequeue        =       qdisc_dequeue_head,
+       .requeue        =       qdisc_requeue,
+       .drop           =       qdisc_queue_drop,
        .init           =       fifo_init,
-       .reset          =       fifo_reset,
-       .destroy        =       NULL,
+       .reset          =       qdisc_reset_queue,
        .change         =       fifo_init,
        .dump           =       fifo_dump,
        .owner          =       THIS_MODULE,
index 87e48a4e105133ca3d0407b5c2d84f1b0e3a72c4..7683b34dc6a9ec8a99496fb754370d8224a13917 100644 (file)
@@ -243,31 +243,27 @@ static void dev_watchdog_down(struct net_device *dev)
    cheaper.
  */
 
-static int
-noop_enqueue(struct sk_buff *skb, struct Qdisc * qdisc)
+static int noop_enqueue(struct sk_buff *skb, struct Qdisc * qdisc)
 {
        kfree_skb(skb);
        return NET_XMIT_CN;
 }
 
-static struct sk_buff *
-noop_dequeue(struct Qdisc * qdisc)
+static struct sk_buff *noop_dequeue(struct Qdisc * qdisc)
 {
        return NULL;
 }
 
-static int
-noop_requeue(struct sk_buff *skb, struct Qdisc* qdisc)
+static int noop_requeue(struct sk_buff *skb, struct Qdisc* qdisc)
 {
        if (net_ratelimit())
-               printk(KERN_DEBUG "%s deferred output. It is buggy.\n", skb->dev->name);
+               printk(KERN_DEBUG "%s deferred output. It is buggy.\n",
+                      skb->dev->name);
        kfree_skb(skb);
        return NET_XMIT_CN;
 }
 
 struct Qdisc_ops noop_qdisc_ops = {
-       .next           =       NULL,
-       .cl_ops         =       NULL,
        .id             =       "noop",
        .priv_size      =       0,
        .enqueue        =       noop_enqueue,
@@ -285,8 +281,6 @@ struct Qdisc noop_qdisc = {
 };
 
 static struct Qdisc_ops noqueue_qdisc_ops = {
-       .next           =       NULL,
-       .cl_ops         =       NULL,
        .id             =       "noqueue",
        .priv_size      =       0,
        .enqueue        =       noop_enqueue,
@@ -311,97 +305,87 @@ static const u8 prio2band[TC_PRIO_MAX+1] =
    generic prio+fifo combination.
  */
 
-static int
-pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc)
+#define PFIFO_FAST_BANDS 3
+
+static inline struct sk_buff_head *prio2list(struct sk_buff *skb,
+                                            struct Qdisc *qdisc)
 {
        struct sk_buff_head *list = qdisc_priv(qdisc);
+       return list + prio2band[skb->priority & TC_PRIO_MAX];
+}
 
-       list += prio2band[skb->priority&TC_PRIO_MAX];
+static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc)
+{
+       struct sk_buff_head *list = prio2list(skb, qdisc);
 
-       if (list->qlen < qdisc->dev->tx_queue_len) {
-               __skb_queue_tail(list, skb);
+       if (skb_queue_len(list) < qdisc->dev->tx_queue_len) {
                qdisc->q.qlen++;
-               qdisc->bstats.bytes += skb->len;
-               qdisc->bstats.packets++;
-               return 0;
+               return __qdisc_enqueue_tail(skb, qdisc, list);
        }
-       qdisc->qstats.drops++;
-       kfree_skb(skb);
-       return NET_XMIT_DROP;
+
+       return qdisc_drop(skb, qdisc);
 }
 
-static struct sk_buff *
-pfifo_fast_dequeue(struct Qdisc* qdisc)
+static struct sk_buff *pfifo_fast_dequeue(struct Qdisc* qdisc)
 {
        int prio;
        struct sk_buff_head *list = qdisc_priv(qdisc);
-       struct sk_buff *skb;
 
-       for (prio = 0; prio < 3; prio++, list++) {
-               skb = __skb_dequeue(list);
+       for (prio = 0; prio < PFIFO_FAST_BANDS; prio++, list++) {
+               struct sk_buff *skb = __qdisc_dequeue_head(qdisc, list);
                if (skb) {
                        qdisc->q.qlen--;
                        return skb;
                }
        }
+
        return NULL;
 }
 
-static int
-pfifo_fast_requeue(struct sk_buff *skb, struct Qdisc* qdisc)
+static int pfifo_fast_requeue(struct sk_buff *skb, struct Qdisc* qdisc)
 {
-       struct sk_buff_head *list = qdisc_priv(qdisc);
-
-       list += prio2band[skb->priority&TC_PRIO_MAX];
-
-       __skb_queue_head(list, skb);
        qdisc->q.qlen++;
-       qdisc->qstats.requeues++;
-       return 0;
+       return __qdisc_requeue(skb, qdisc, prio2list(skb, qdisc));
 }
 
-static void
-pfifo_fast_reset(struct Qdisc* qdisc)
+static void pfifo_fast_reset(struct Qdisc* qdisc)
 {
        int prio;
        struct sk_buff_head *list = qdisc_priv(qdisc);
 
-       for (prio=0; prio < 3; prio++)
-               skb_queue_purge(list+prio);
+       for (prio = 0; prio < PFIFO_FAST_BANDS; prio++)
+               __qdisc_reset_queue(qdisc, list + prio);
+
+       qdisc->qstats.backlog = 0;
        qdisc->q.qlen = 0;
 }
 
 static int pfifo_fast_dump(struct Qdisc *qdisc, struct sk_buff *skb)
 {
-       unsigned char    *b = skb->tail;
-       struct tc_prio_qopt opt;
+       struct tc_prio_qopt opt = { .bands = PFIFO_FAST_BANDS };
 
-       opt.bands = 3; 
        memcpy(&opt.priomap, prio2band, TC_PRIO_MAX+1);
        RTA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt);
        return skb->len;
 
 rtattr_failure:
-       skb_trim(skb, b - skb->data);
        return -1;
 }
 
 static int pfifo_fast_init(struct Qdisc *qdisc, struct rtattr *opt)
 {
-       int i;
+       int prio;
        struct sk_buff_head *list = qdisc_priv(qdisc);
 
-       for (i=0; i<3; i++)
-               skb_queue_head_init(list+i);
+       for (prio = 0; prio < PFIFO_FAST_BANDS; prio++)
+               skb_queue_head_init(list + prio);
 
        return 0;
 }
 
 static struct Qdisc_ops pfifo_fast_ops = {
-       .next           =       NULL,
-       .cl_ops         =       NULL,
        .id             =       "pfifo_fast",
-       .priv_size      =       3 * sizeof(struct sk_buff_head),
+       .priv_size      =       PFIFO_FAST_BANDS * sizeof(struct sk_buff_head),
        .enqueue        =       pfifo_fast_enqueue,
        .dequeue        =       pfifo_fast_dequeue,
        .requeue        =       pfifo_fast_requeue,
index e0c9fbe73b15cee32b44f4469e1ac5eeb9849267..bb9bf8d5003c62d79a4928df12acb59fc05adf67 100644 (file)
@@ -53,7 +53,6 @@
 
 struct netem_sched_data {
        struct Qdisc    *qdisc;
-       struct sk_buff_head delayed;
        struct timer_list timer;
 
        u32 latency;
@@ -63,11 +62,12 @@ struct netem_sched_data {
        u32 gap;
        u32 jitter;
        u32 duplicate;
+       u32 reorder;
 
        struct crndstate {
                unsigned long last;
                unsigned long rho;
-       } delay_cor, loss_cor, dup_cor;
+       } delay_cor, loss_cor, dup_cor, reorder_cor;
 
        struct disttable {
                u32  size;
@@ -137,122 +137,68 @@ static long tabledist(unsigned long mu, long sigma,
        return  x / NETEM_DIST_SCALE + (sigma / NETEM_DIST_SCALE) * t + mu;
 }
 
-/* Put skb in the private delayed queue. */
-static int netem_delay(struct Qdisc *sch, struct sk_buff *skb)
-{
-       struct netem_sched_data *q = qdisc_priv(sch);
-       psched_tdiff_t td;
-       psched_time_t now;
-       
-       PSCHED_GET_TIME(now);
-       td = tabledist(q->latency, q->jitter, &q->delay_cor, q->delay_dist);
-       
-       /* Always queue at tail to keep packets in order */
-       if (likely(q->delayed.qlen < q->limit)) {
-               struct netem_skb_cb *cb = (struct netem_skb_cb *)skb->cb;
-       
-               PSCHED_TADD2(now, td, cb->time_to_send);
-
-               pr_debug("netem_delay: skb=%p now=%llu tosend=%llu\n", skb, 
-                        now, cb->time_to_send);
-       
-               __skb_queue_tail(&q->delayed, skb);
-               return NET_XMIT_SUCCESS;
-       }
-
-       pr_debug("netem_delay: queue over limit %d\n", q->limit);
-       sch->qstats.overlimits++;
-       kfree_skb(skb);
-       return NET_XMIT_DROP;
-}
-
 /*
- *  Move a packet that is ready to send from the delay holding
- *  list to the underlying qdisc.
+ * Insert one skb into qdisc.
+ * Note: parent depends on return value to account for queue length.
+ *     NET_XMIT_DROP: queue length didn't change.
+ *      NET_XMIT_SUCCESS: one skb was queued.
  */
-static int netem_run(struct Qdisc *sch)
-{
-       struct netem_sched_data *q = qdisc_priv(sch);
-       struct sk_buff *skb;
-       psched_time_t now;
-
-       PSCHED_GET_TIME(now);
-
-       skb = skb_peek(&q->delayed);
-       if (skb) {
-               const struct netem_skb_cb *cb
-                       = (const struct netem_skb_cb *)skb->cb;
-               long delay 
-                       = PSCHED_US2JIFFIE(PSCHED_TDIFF(cb->time_to_send, now));
-               pr_debug("netem_run: skb=%p delay=%ld\n", skb, delay);
-
-               /* if more time remaining? */
-               if (delay > 0) {
-                       mod_timer(&q->timer, jiffies + delay);
-                       return 1;
-               }
-
-               __skb_unlink(skb, &q->delayed);
-               
-               if (q->qdisc->enqueue(skb, q->qdisc)) {
-                       sch->q.qlen--;
-                       sch->qstats.drops++;
-               } 
-       }
-
-       return 0;
-}
-
 static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch)
 {
        struct netem_sched_data *q = qdisc_priv(sch);
+       struct netem_skb_cb *cb = (struct netem_skb_cb *)skb->cb;
+       struct sk_buff *skb2;
        int ret;
+       int count = 1;
 
        pr_debug("netem_enqueue skb=%p\n", skb);
 
+       /* Random duplication */
+       if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor))
+               ++count;
+
        /* Random packet drop 0 => none, ~0 => all */
-       if (q->loss && q->loss >= get_crandom(&q->loss_cor)) {
-               pr_debug("netem_enqueue: random loss\n");
+       if (q->loss && q->loss >= get_crandom(&q->loss_cor))
+               --count;
+
+       if (count == 0) {
                sch->qstats.drops++;
                kfree_skb(skb);
-               return 0;       /* lie about loss so TCP doesn't know */
+               return NET_XMIT_DROP;
        }
 
-       /* Random duplication */
-       if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor)) {
-               struct sk_buff *skb2;
-
-               skb2 = skb_clone(skb, GFP_ATOMIC);
-               if (skb2 && netem_delay(sch, skb2) == NET_XMIT_SUCCESS) {
-                       struct Qdisc *qp;
-
-                       /* Since one packet can generate two packets in the
-                        * queue, the parent's qlen accounting gets confused,
-                        * so fix it.
-                        */
-                       qp = qdisc_lookup(sch->dev, TC_H_MAJ(sch->parent));
-                       if (qp)
-                               qp->q.qlen++;
-
-                       sch->q.qlen++;
-                       sch->bstats.bytes += skb2->len;
-                       sch->bstats.packets++;
-               } else
-                       sch->qstats.drops++;
+       /*
+        * If we need to duplicate packet, then re-insert at top of the
+        * qdisc tree, since parent queuer expects that only one
+        * skb will be queued.
+        */
+       if (count > 1 && (skb2 = skb_clone(skb, GFP_ATOMIC)) != NULL) {
+               struct Qdisc *rootq = sch->dev->qdisc;
+               u32 dupsave = q->duplicate; /* prevent duplicating a dup... */
+               q->duplicate = 0;
+
+               rootq->enqueue(skb2, rootq);
+               q->duplicate = dupsave;
        }
 
-       /* If doing simple delay then gap == 0 so all packets
-        * go into the delayed holding queue
-        * otherwise if doing out of order only "1 out of gap"
-        * packets will be delayed.
-        */
-       if (q->counter < q->gap) {
+       if (q->gap == 0                 /* not doing reordering */
+           || q->counter < q->gap      /* inside last reordering gap */
+           || q->reorder < get_crandom(&q->reorder_cor)) {
+               psched_time_t now;
+               PSCHED_GET_TIME(now);
+               PSCHED_TADD2(now, tabledist(q->latency, q->jitter, 
+                                           &q->delay_cor, q->delay_dist),
+                            cb->time_to_send);
                ++q->counter;
                ret = q->qdisc->enqueue(skb, q->qdisc);
        } else {
+               /* 
+                * Do re-ordering by putting one out of N packets at the front
+                * of the queue.
+                */
+               PSCHED_GET_TIME(cb->time_to_send);
                q->counter = 0;
-               ret = netem_delay(sch, skb);
-               netem_run(sch);
+               ret = q->qdisc->ops->requeue(skb, q->qdisc);
        }
 
        if (likely(ret == NET_XMIT_SUCCESS)) {
@@ -296,22 +242,33 @@ static struct sk_buff *netem_dequeue(struct Qdisc *sch)
 {
        struct netem_sched_data *q = qdisc_priv(sch);
        struct sk_buff *skb;
-       int pending;
-
-       pending = netem_run(sch);
 
        skb = q->qdisc->dequeue(q->qdisc);
        if (skb) {
-               pr_debug("netem_dequeue: return skb=%p\n", skb);
-               sch->q.qlen--;
-               sch->flags &= ~TCQ_F_THROTTLED;
-       }
-       else if (pending) {
-               pr_debug("netem_dequeue: throttling\n");
+               const struct netem_skb_cb *cb
+                       = (const struct netem_skb_cb *)skb->cb;
+               psched_time_t now;
+               long delay;
+
+               /* if more time remaining? */
+               PSCHED_GET_TIME(now);
+               delay = PSCHED_US2JIFFIE(PSCHED_TDIFF(cb->time_to_send, now));
+               pr_debug("netem_run: skb=%p delay=%ld\n", skb, delay);
+               if (delay <= 0) {
+                       pr_debug("netem_dequeue: return skb=%p\n", skb);
+                       sch->q.qlen--;
+                       sch->flags &= ~TCQ_F_THROTTLED;
+                       return skb;
+               }
+
+               mod_timer(&q->timer, jiffies + delay);
                sch->flags |= TCQ_F_THROTTLED;
-       } 
 
-       return skb;
+               if (q->qdisc->ops->requeue(skb, q->qdisc) != 0)
+                       sch->qstats.drops++;
+       }
+
+       return NULL;
 }
 
 static void netem_watchdog(unsigned long arg)
@@ -328,8 +285,6 @@ static void netem_reset(struct Qdisc *sch)
        struct netem_sched_data *q = qdisc_priv(sch);
 
        qdisc_reset(q->qdisc);
-       skb_queue_purge(&q->delayed);
-
        sch->q.qlen = 0;
        sch->flags &= ~TCQ_F_THROTTLED;
        del_timer_sync(&q->timer);
@@ -397,6 +352,19 @@ static int get_correlation(struct Qdisc *sch, const struct rtattr *attr)
        return 0;
 }
 
+static int get_reorder(struct Qdisc *sch, const struct rtattr *attr)
+{
+       struct netem_sched_data *q = qdisc_priv(sch);
+       const struct tc_netem_reorder *r = RTA_DATA(attr);
+
+       if (RTA_PAYLOAD(attr) != sizeof(*r))
+               return -EINVAL;
+
+       q->reorder = r->probability;
+       init_crandom(&q->reorder_cor, r->correlation);
+       return 0;
+}
+
 static int netem_change(struct Qdisc *sch, struct rtattr *opt)
 {
        struct netem_sched_data *q = qdisc_priv(sch);
@@ -417,9 +385,15 @@ static int netem_change(struct Qdisc *sch, struct rtattr *opt)
        q->jitter = qopt->jitter;
        q->limit = qopt->limit;
        q->gap = qopt->gap;
+       q->counter = 0;
        q->loss = qopt->loss;
        q->duplicate = qopt->duplicate;
 
+       /* for compatiablity with earlier versions.
+        * if gap is set, need to assume 100% probablity
+        */
+       q->reorder = ~0;
+
        /* Handle nested options after initial queue options.
         * Should have put all options in nested format but too late now.
         */ 
@@ -441,6 +415,11 @@ static int netem_change(struct Qdisc *sch, struct rtattr *opt)
                        if (ret)
                                return ret;
                }
+               if (tb[TCA_NETEM_REORDER-1]) {
+                       ret = get_reorder(sch, tb[TCA_NETEM_REORDER-1]);
+                       if (ret)
+                               return ret;
+               }
        }
 
 
@@ -455,11 +434,9 @@ static int netem_init(struct Qdisc *sch, struct rtattr *opt)
        if (!opt)
                return -EINVAL;
 
-       skb_queue_head_init(&q->delayed);
        init_timer(&q->timer);
        q->timer.function = netem_watchdog;
        q->timer.data = (unsigned long) sch;
-       q->counter = 0;
 
        q->qdisc = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops);
        if (!q->qdisc) {
@@ -491,6 +468,7 @@ static int netem_dump(struct Qdisc *sch, struct sk_buff *skb)
        struct rtattr *rta = (struct rtattr *) b;
        struct tc_netem_qopt qopt;
        struct tc_netem_corr cor;
+       struct tc_netem_reorder reorder;
 
        qopt.latency = q->latency;
        qopt.jitter = q->jitter;
@@ -504,6 +482,11 @@ static int netem_dump(struct Qdisc *sch, struct sk_buff *skb)
        cor.loss_corr = q->loss_cor.rho;
        cor.dup_corr = q->dup_cor.rho;
        RTA_PUT(skb, TCA_NETEM_CORR, sizeof(cor), &cor);
+
+       reorder.probability = q->reorder;
+       reorder.correlation = q->reorder_cor.rho;
+       RTA_PUT(skb, TCA_NETEM_REORDER, sizeof(reorder), &reorder);
+
        rta->rta_len = skb->tail - b;
 
        return skb->len;
index 663843d97a921e7ca88ef5df82154f7b95227751..7ae6aa772dab76388a70d22e19e74e76b3a215e9 100644 (file)
@@ -191,10 +191,6 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
        asoc->last_cwr_tsn = asoc->ctsn_ack_point;
        asoc->unack_data = 0;
 
-       SCTP_DEBUG_PRINTK("myctsnap for %s INIT as 0x%x.\n",
-                         asoc->ep->debug_name,
-                         asoc->ctsn_ack_point);
-
        /* ADDIP Section 4.1 Asconf Chunk Procedures
         *
         * When an endpoint has an ASCONF signaled change to be sent to the
@@ -211,6 +207,7 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
 
        /* Make an empty list of remote transport addresses.  */
        INIT_LIST_HEAD(&asoc->peer.transport_addr_list);
+       asoc->peer.transport_count = 0;
 
        /* RFC 2960 5.1 Normal Establishment of an Association
         *
@@ -288,6 +285,7 @@ struct sctp_association *sctp_association_new(const struct sctp_endpoint *ep,
 
        asoc->base.malloced = 1;
        SCTP_DBG_OBJCNT_INC(assoc);
+       SCTP_DEBUG_PRINTK("Created asoc %p\n", asoc);
 
        return asoc;
 
@@ -356,6 +354,8 @@ void sctp_association_free(struct sctp_association *asoc)
                sctp_transport_free(transport);
        }
 
+       asoc->peer.transport_count = 0;
+
        /* Free any cached ASCONF_ACK chunk. */
        if (asoc->addip_last_asconf_ack)
                sctp_chunk_free(asoc->addip_last_asconf_ack);
@@ -400,7 +400,7 @@ void sctp_assoc_set_primary(struct sctp_association *asoc,
        /* If the primary path is changing, assume that the
         * user wants to use this new path.
         */
-       if (transport->active)
+       if (transport->state != SCTP_INACTIVE)
                asoc->peer.active_path = transport;
 
        /*
@@ -428,10 +428,58 @@ void sctp_assoc_set_primary(struct sctp_association *asoc,
        transport->cacc.next_tsn_at_change = asoc->next_tsn;
 }
 
+/* Remove a transport from an association.  */
+void sctp_assoc_rm_peer(struct sctp_association *asoc,
+                       struct sctp_transport *peer)
+{
+       struct list_head        *pos;
+       struct sctp_transport   *transport;
+
+       SCTP_DEBUG_PRINTK_IPADDR("sctp_assoc_rm_peer:association %p addr: ",
+                                " port: %d\n",
+                                asoc,
+                                (&peer->ipaddr),
+                                peer->ipaddr.v4.sin_port);
+
+       /* If we are to remove the current retran_path, update it
+        * to the next peer before removing this peer from the list.
+        */
+       if (asoc->peer.retran_path == peer)
+               sctp_assoc_update_retran_path(asoc);
+
+       /* Remove this peer from the list. */
+       list_del(&peer->transports);
+
+       /* Get the first transport of asoc. */
+       pos = asoc->peer.transport_addr_list.next;
+       transport = list_entry(pos, struct sctp_transport, transports);
+
+       /* Update any entries that match the peer to be deleted. */
+       if (asoc->peer.primary_path == peer)
+               sctp_assoc_set_primary(asoc, transport);
+       if (asoc->peer.active_path == peer)
+               asoc->peer.active_path = transport;
+       if (asoc->peer.last_data_from == peer)
+               asoc->peer.last_data_from = transport;
+
+       /* If we remove the transport an INIT was last sent to, set it to
+        * NULL. Combined with the update of the retran path above, this
+        * will cause the next INIT to be sent to the next available
+        * transport, maintaining the cycle.
+        */
+       if (asoc->init_last_sent_to == peer)
+               asoc->init_last_sent_to = NULL;
+
+       asoc->peer.transport_count--;
+
+       sctp_transport_free(peer);
+}
+
 /* Add a transport address to an association.  */
 struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
                                           const union sctp_addr *addr,
-                                          int gfp)
+                                          const int gfp,
+                                          const int peer_state)
 {
        struct sctp_transport *peer;
        struct sctp_sock *sp;
@@ -442,14 +490,25 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
        /* AF_INET and AF_INET6 share common port field. */
        port = addr->v4.sin_port;
 
+       SCTP_DEBUG_PRINTK_IPADDR("sctp_assoc_add_peer:association %p addr: ",
+                                " port: %d state:%s\n",
+                                asoc,
+                                addr,
+                                addr->v4.sin_port,
+                                peer_state == SCTP_UNKNOWN?"UNKNOWN":"ACTIVE");
+
        /* Set the port if it has not been set yet.  */
        if (0 == asoc->peer.port)
                asoc->peer.port = port;
 
        /* Check to see if this is a duplicate. */
        peer = sctp_assoc_lookup_paddr(asoc, addr);
-       if (peer)
+       if (peer) {
+               if (peer_state == SCTP_ACTIVE &&
+                   peer->state == SCTP_UNKNOWN)
+                    peer->state = SCTP_ACTIVE;
                return peer;
+       }
 
        peer = sctp_transport_new(addr, gfp);
        if (!peer)
@@ -516,8 +575,12 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
        /* Set the transport's RTO.initial value */
        peer->rto = asoc->rto_initial;
 
+       /* Set the peer's active state. */
+       peer->state = peer_state;
+
        /* Attach the remote transport to our asoc.  */
        list_add_tail(&peer->transports, &asoc->peer.transport_addr_list);
+       asoc->peer.transport_count++;
 
        /* If we do not yet have a primary path, set one.  */
        if (!asoc->peer.primary_path) {
@@ -525,8 +588,9 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
                asoc->peer.retran_path = peer;
        }
 
-       if (asoc->peer.active_path == asoc->peer.retran_path)
+       if (asoc->peer.active_path == asoc->peer.retran_path) {
                asoc->peer.retran_path = peer;
+       }
 
        return peer;
 }
@@ -537,37 +601,16 @@ void sctp_assoc_del_peer(struct sctp_association *asoc,
 {
        struct list_head        *pos;
        struct list_head        *temp;
-       struct sctp_transport   *peer = NULL;
        struct sctp_transport   *transport;
 
        list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
                transport = list_entry(pos, struct sctp_transport, transports);
                if (sctp_cmp_addr_exact(addr, &transport->ipaddr)) {
-                       peer = transport;
-                       list_del(pos);
+                       /* Do book keeping for removing the peer and free it. */
+                       sctp_assoc_rm_peer(asoc, transport);
                        break;
                }
        }
-
-       /* The address we want delete is not in the association. */
-       if (!peer)
-               return;
-
-       /* Get the first transport of asoc. */ 
-       pos = asoc->peer.transport_addr_list.next;
-       transport = list_entry(pos, struct sctp_transport, transports);
-
-       /* Update any entries that match the peer to be deleted. */  
-       if (asoc->peer.primary_path == peer)
-               sctp_assoc_set_primary(asoc, transport);
-       if (asoc->peer.active_path == peer)
-               asoc->peer.active_path = transport;
-       if (asoc->peer.retran_path == peer)
-               asoc->peer.retran_path = transport;
-       if (asoc->peer.last_data_from == peer)
-               asoc->peer.last_data_from = transport;
-
-       sctp_transport_free(peer);
 }
 
 /* Lookup a transport by address. */
@@ -608,12 +651,12 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
        /* Record the transition on the transport.  */
        switch (command) {
        case SCTP_TRANSPORT_UP:
-               transport->active = SCTP_ACTIVE;
+               transport->state = SCTP_ACTIVE;
                spc_state = SCTP_ADDR_AVAILABLE;
                break;
 
        case SCTP_TRANSPORT_DOWN:
-               transport->active = SCTP_INACTIVE;
+               transport->state = SCTP_INACTIVE;
                spc_state = SCTP_ADDR_UNREACHABLE;
                break;
 
@@ -643,7 +686,7 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
        list_for_each(pos, &asoc->peer.transport_addr_list) {
                t = list_entry(pos, struct sctp_transport, transports);
 
-               if (!t->active)
+               if (t->state == SCTP_INACTIVE)
                        continue;
                if (!first || t->last_time_heard > first->last_time_heard) {
                        second = first;
@@ -663,7 +706,7 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
         * [If the primary is active but not most recent, bump the most
         * recently used transport.]
         */
-       if (asoc->peer.primary_path->active &&
+       if (asoc->peer.primary_path->state != SCTP_INACTIVE &&
            first != asoc->peer.primary_path) {
                second = first;
                first = asoc->peer.primary_path;
@@ -958,7 +1001,7 @@ void sctp_assoc_update(struct sctp_association *asoc,
                                           transports);
                        if (!sctp_assoc_lookup_paddr(asoc, &trans->ipaddr))
                                sctp_assoc_add_peer(asoc, &trans->ipaddr,
-                                                   GFP_ATOMIC);
+                                                   GFP_ATOMIC, SCTP_ACTIVE);
                }
 
                asoc->ctsn_ack_point = asoc->next_tsn - 1;
@@ -998,7 +1041,7 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc)
 
                /* Try to find an active transport. */
 
-               if (t->active) {
+               if (t->state != SCTP_INACTIVE) {
                        break;
                } else {
                        /* Keep track of the next transport in case
@@ -1019,6 +1062,40 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc)
        }
 
        asoc->peer.retran_path = t;
+
+       SCTP_DEBUG_PRINTK_IPADDR("sctp_assoc_update_retran_path:association"
+                                " %p addr: ",
+                                " port: %d\n",
+                                asoc,
+                                (&t->ipaddr),
+                                t->ipaddr.v4.sin_port);
+}
+
+/* Choose the transport for sending a INIT packet.  */
+struct sctp_transport *sctp_assoc_choose_init_transport(
+       struct sctp_association *asoc)
+{
+       struct sctp_transport *t;
+
+       /* Use the retran path. If the last INIT was sent over the
+        * retran path, update the retran path and use it.
+        */
+       if (!asoc->init_last_sent_to) {
+               t = asoc->peer.active_path;
+       } else {
+               if (asoc->init_last_sent_to == asoc->peer.retran_path)
+                       sctp_assoc_update_retran_path(asoc);
+               t = asoc->peer.retran_path;
+       }
+
+       SCTP_DEBUG_PRINTK_IPADDR("sctp_assoc_update_retran_path:association"
+                                " %p addr: ",
+                                " port: %d\n",
+                                asoc,
+                                (&t->ipaddr),
+                                t->ipaddr.v4.sin_port);
+
+       return t;
 }
 
 /* Choose the transport for sending a SHUTDOWN packet.  */
index 334f61773e6d692844aab739df7ca0084f54ab1c..2ec0320fac3b5634bbd62e6f8905d179314431ce 100644 (file)
@@ -134,7 +134,6 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
        ep->last_key = ep->current_key = 0;
        ep->key_changed_at = jiffies;
 
-       ep->debug_name = "unnamedEndpoint";
        return ep;
 }
 
index b719a77d66b47e3a553672c1d712e8e53b93e99b..339f7acfdb647b7eca56aa43c2a35e0aa9afb735 100644 (file)
@@ -178,6 +178,37 @@ int sctp_rcv(struct sk_buff *skb)
 
        asoc = __sctp_rcv_lookup(skb, &src, &dest, &transport);
 
+       if (!asoc)
+               ep = __sctp_rcv_lookup_endpoint(&dest);
+
+       /* Retrieve the common input handling substructure. */
+       rcvr = asoc ? &asoc->base : &ep->base;
+       sk = rcvr->sk;
+
+       /*
+        * If a frame arrives on an interface and the receiving socket is
+        * bound to another interface, via SO_BINDTODEVICE, treat it as OOTB
+        */
+       if (sk->sk_bound_dev_if && (sk->sk_bound_dev_if != af->skb_iif(skb)))
+       {
+               sock_put(sk);
+               if (asoc) {
+                       sctp_association_put(asoc);
+                       asoc = NULL;
+               } else {
+                       sctp_endpoint_put(ep);
+                       ep = NULL;
+               }
+               sk = sctp_get_ctl_sock();
+               ep = sctp_sk(sk)->ep;
+               sctp_endpoint_hold(ep);
+               sock_hold(sk);
+               rcvr = &ep->base;
+       }
+
+       if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf)
+               goto discard_release;
+
        /*
         * RFC 2960, 8.4 - Handle "Out of the blue" Packets.
         * An SCTP packet is called an "out of the blue" (OOTB)
@@ -187,22 +218,12 @@ int sctp_rcv(struct sk_buff *skb)
         * packet belongs.
         */
        if (!asoc) {
-               ep = __sctp_rcv_lookup_endpoint(&dest);
                if (sctp_rcv_ootb(skb)) {
                        SCTP_INC_STATS_BH(SCTP_MIB_OUTOFBLUES);
                        goto discard_release;
                }
        }
 
-       /* Retrieve the common input handling substructure. */
-       rcvr = asoc ? &asoc->base : &ep->base;
-       sk = rcvr->sk;
-
-       if ((sk) && (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf)) {
-               goto discard_release;
-       }
-
-
        /* SCTP seems to always need a timestamp right now (FIXME) */
        if (skb->stamp.tv_sec == 0) {
                do_gettimeofday(&skb->stamp);
@@ -265,13 +286,11 @@ discard_it:
 
 discard_release:
        /* Release any structures we may be holding. */
-       if (asoc) {
-               sock_put(asoc->base.sk);
+       sock_put(sk);
+       if (asoc)
                sctp_association_put(asoc);
-       } else {
-               sock_put(ep->base.sk);
+       else
                sctp_endpoint_put(ep);
-       }
 
        goto discard_it;
 }
@@ -334,7 +353,7 @@ void sctp_icmp_proto_unreachable(struct sock *sk,
 
        sctp_do_sm(SCTP_EVENT_T_OTHER,
                   SCTP_ST_OTHER(SCTP_EVENT_ICMP_PROTO_UNREACH),
-                  asoc->state, asoc->ep, asoc, NULL,
+                  asoc->state, asoc->ep, asoc, t,
                   GFP_ATOMIC);
 
 }
index c9d9ea064734ad58e18c14e03055816b0c219dd7..c7e42d125b9cc544af46e640a725352c5ea1b6a1 100644 (file)
@@ -812,26 +812,23 @@ static int sctp_inet6_bind_verify(struct sctp_sock *opt, union sctp_addr *addr)
        if (addr->sa.sa_family != AF_INET6)
                af = sctp_get_af_specific(addr->sa.sa_family);
        else {
-               struct sock *sk;
                int type = ipv6_addr_type(&addr->v6.sin6_addr);
-               sk = sctp_opt2sk(opt);
+               struct net_device *dev;
+
                if (type & IPV6_ADDR_LINKLOCAL) {
-                       /* Note: Behavior similar to af_inet6.c:
-                        *  1) Overrides previous bound_dev_if
-                        *  2) Destructive even if bind isn't successful.
-                        */
-
-                       if (addr->v6.sin6_scope_id)
-                               sk->sk_bound_dev_if = addr->v6.sin6_scope_id;
-                       if (!sk->sk_bound_dev_if)
+                       if (!addr->v6.sin6_scope_id)
+                               return 0;
+                       dev = dev_get_by_index(addr->v6.sin6_scope_id);
+                       if (!dev)
                                return 0;
+                       dev_put(dev);
                }
                af = opt->pf->af;
        }
        return af->available(addr, opt);
 }
 
-/* Verify that the provided sockaddr looks bindable.   Common verification,
+/* Verify that the provided sockaddr looks sendable.   Common verification,
  * has already been taken care of.
  */
 static int sctp_inet6_send_verify(struct sctp_sock *opt, union sctp_addr *addr)
@@ -842,19 +839,16 @@ static int sctp_inet6_send_verify(struct sctp_sock *opt, union sctp_addr *addr)
        if (addr->sa.sa_family != AF_INET6)
                af = sctp_get_af_specific(addr->sa.sa_family);
        else {
-               struct sock *sk;
                int type = ipv6_addr_type(&addr->v6.sin6_addr);
-               sk = sctp_opt2sk(opt);
+               struct net_device *dev;
+
                if (type & IPV6_ADDR_LINKLOCAL) {
-                       /* Note: Behavior similar to af_inet6.c:
-                        *  1) Overrides previous bound_dev_if
-                        *  2) Destructive even if bind isn't successful.
-                        */
-
-                       if (addr->v6.sin6_scope_id)
-                               sk->sk_bound_dev_if = addr->v6.sin6_scope_id;
-                       if (!sk->sk_bound_dev_if)
+                       if (!addr->v6.sin6_scope_id)
+                               return 0;
+                       dev = dev_get_by_index(addr->v6.sin6_scope_id);
+                       if (!dev)
                                return 0;
+                       dev_put(dev);
                }
                af = opt->pf->af;
        }
index 1b2d4adc4ddbaf013e802d8e1da8df756d395e77..4eb81a1407b7e027c7da1302a8af43705be3015a 100644 (file)
@@ -682,9 +682,9 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
 
                if (!new_transport) {
                        new_transport = asoc->peer.active_path;
-               } else if (!new_transport->active) {
-                       /* If the chunk is Heartbeat or Heartbeat Ack, 
-                        * send it to chunk->transport, even if it's 
+               } else if (new_transport->state == SCTP_INACTIVE) {
+                       /* If the chunk is Heartbeat or Heartbeat Ack,
+                        * send it to chunk->transport, even if it's
                         * inactive.
                         *
                         * 3.3.6 Heartbeat Acknowledgement:
@@ -840,7 +840,8 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
                         * Otherwise, we want to use the active path.
                         */
                        new_transport = chunk->transport;
-                       if (!new_transport || !new_transport->active)
+                       if (!new_transport ||
+                           new_transport->state == SCTP_INACTIVE)
                                new_transport = asoc->peer.active_path;
 
                        /* Change packets if necessary.  */
@@ -1454,7 +1455,7 @@ static void sctp_check_transmitted(struct sctp_outq *q,
                        /* Mark the destination transport address as
                         * active if it is not so marked.
                         */
-                       if (!transport->active) {
+                       if (transport->state == SCTP_INACTIVE) {
                                sctp_assoc_control_transport(
                                        transport->asoc,
                                        transport,
index e42fd8c2916b639fb1310dead4ef95a379936715..98d49ec9b74b93a4256f430e83838f2e911baf42 100644 (file)
@@ -132,14 +132,25 @@ void sctp_snmp_proc_exit(void)
 static void sctp_seq_dump_local_addrs(struct seq_file *seq, struct sctp_ep_common *epb)
 {
        struct list_head *pos;
+       struct sctp_association *asoc;
        struct sctp_sockaddr_entry *laddr;
-       union sctp_addr *addr;
+       struct sctp_transport *peer;
+       union sctp_addr *addr, *primary = NULL;
        struct sctp_af *af;
 
+       if (epb->type == SCTP_EP_TYPE_ASSOCIATION) {
+           asoc = sctp_assoc(epb);
+           peer = asoc->peer.primary_path;
+           primary = &peer->saddr;
+       }
+
        list_for_each(pos, &epb->bind_addr.address_list) {
                laddr = list_entry(pos, struct sctp_sockaddr_entry, list);
                addr = (union sctp_addr *)&laddr->a;
                af = sctp_get_af_specific(addr->sa.sa_family);
+               if (primary && af->cmp_addr(addr, primary)) {
+                       seq_printf(seq, "*");
+               }
                af->seq_dump_addr(seq, addr);
        }
 }
@@ -149,17 +160,54 @@ static void sctp_seq_dump_remote_addrs(struct seq_file *seq, struct sctp_associa
 {
        struct list_head *pos;
        struct sctp_transport *transport;
-       union sctp_addr *addr;
+       union sctp_addr *addr, *primary;
        struct sctp_af *af;
 
+       primary = &(assoc->peer.primary_addr);
        list_for_each(pos, &assoc->peer.transport_addr_list) {
                transport = list_entry(pos, struct sctp_transport, transports);
                addr = (union sctp_addr *)&transport->ipaddr;
                af = sctp_get_af_specific(addr->sa.sa_family);
+               if (af->cmp_addr(addr, primary)) {
+                       seq_printf(seq, "*");
+               }
                af->seq_dump_addr(seq, addr);
        }
 }
 
+static void * sctp_eps_seq_start(struct seq_file *seq, loff_t *pos)
+{
+       if (*pos > sctp_ep_hashsize)
+               return NULL;
+
+       if (*pos < 0)
+               *pos = 0;
+
+       if (*pos == 0)
+               seq_printf(seq, " ENDPT     SOCK   STY SST HBKT LPORT   UID INODE LADDRS\n");
+
+       ++*pos;
+
+       return (void *)pos;
+}
+
+static void sctp_eps_seq_stop(struct seq_file *seq, void *v)
+{
+       return;
+}
+
+
+static void * sctp_eps_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+{
+       if (*pos > sctp_ep_hashsize)
+               return NULL;
+
+       ++*pos;
+
+       return pos;
+}
+
+
 /* Display sctp endpoints (/proc/net/sctp/eps). */
 static int sctp_eps_seq_show(struct seq_file *seq, void *v)
 {
@@ -167,38 +215,50 @@ static int sctp_eps_seq_show(struct seq_file *seq, void *v)
        struct sctp_ep_common *epb;
        struct sctp_endpoint *ep;
        struct sock *sk;
-       int hash;
-
-       seq_printf(seq, " ENDPT     SOCK   STY SST HBKT LPORT LADDRS\n");
-       for (hash = 0; hash < sctp_ep_hashsize; hash++) {
-               head = &sctp_ep_hashtable[hash];
-               read_lock(&head->lock);
-               for (epb = head->chain; epb; epb = epb->next) {
-                       ep = sctp_ep(epb);
-                       sk = epb->sk;
-                       seq_printf(seq, "%8p %8p %-3d %-3d %-4d %-5d ", ep, sk,
-                                  sctp_sk(sk)->type, sk->sk_state, hash,
-                                  epb->bind_addr.port);
-                       sctp_seq_dump_local_addrs(seq, epb);
-                       seq_printf(seq, "\n");
-               }
-               read_unlock(&head->lock);
+       int    hash = *(int *)v;
+
+       if (hash > sctp_ep_hashsize)
+               return -ENOMEM;
+
+       head = &sctp_ep_hashtable[hash-1];
+       sctp_local_bh_disable();
+       read_lock(&head->lock);
+       for (epb = head->chain; epb; epb = epb->next) {
+               ep = sctp_ep(epb);
+               sk = epb->sk;
+               seq_printf(seq, "%8p %8p %-3d %-3d %-4d %-5d %5d %5lu ", ep, sk,
+                          sctp_sk(sk)->type, sk->sk_state, hash-1,
+                          epb->bind_addr.port,
+                          sock_i_uid(sk), sock_i_ino(sk));
+
+               sctp_seq_dump_local_addrs(seq, epb);
+               seq_printf(seq, "\n");
        }
+       read_unlock(&head->lock);
+       sctp_local_bh_enable();
 
        return 0;
 }
 
+static struct seq_operations sctp_eps_ops = {
+       .start = sctp_eps_seq_start,
+       .next  = sctp_eps_seq_next,
+       .stop  = sctp_eps_seq_stop,
+       .show  = sctp_eps_seq_show,
+};
+
+
 /* Initialize the seq file operations for 'eps' object. */
 static int sctp_eps_seq_open(struct inode *inode, struct file *file)
 {
-       return single_open(file, sctp_eps_seq_show, NULL);
+       return seq_open(file, &sctp_eps_ops);
 }
 
 static struct file_operations sctp_eps_seq_fops = {
        .open    = sctp_eps_seq_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
-       .release = single_release,
+       .release = seq_release,
 };
 
 /* Set up the proc fs entry for 'eps' object. */
@@ -221,6 +281,40 @@ void sctp_eps_proc_exit(void)
        remove_proc_entry("eps", proc_net_sctp);
 }
 
+
+static void * sctp_assocs_seq_start(struct seq_file *seq, loff_t *pos)
+{
+       if (*pos > sctp_assoc_hashsize)
+               return NULL;
+
+       if (*pos < 0)
+               *pos = 0;
+
+       if (*pos == 0)
+               seq_printf(seq, " ASSOC     SOCK   STY SST ST HBKT ASSOC-ID TX_QUEUE RX_QUEUE UID INODE LPORT "
+                               "RPORT LADDRS <-> RADDRS\n");
+
+       ++*pos;
+
+       return (void *)pos;
+}
+
+static void sctp_assocs_seq_stop(struct seq_file *seq, void *v)
+{
+       return;
+}
+
+
+static void * sctp_assocs_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+{
+       if (*pos > sctp_assoc_hashsize)
+               return NULL;
+
+       ++*pos;
+
+       return pos;
+}
+
 /* Display sctp associations (/proc/net/sctp/assocs). */
 static int sctp_assocs_seq_show(struct seq_file *seq, void *v)
 {
@@ -228,43 +322,57 @@ static int sctp_assocs_seq_show(struct seq_file *seq, void *v)
        struct sctp_ep_common *epb;
        struct sctp_association *assoc;
        struct sock *sk;
-       int hash;
-
-       seq_printf(seq, " ASSOC     SOCK   STY SST ST HBKT LPORT RPORT "
-                       "LADDRS <-> RADDRS\n");
-       for (hash = 0; hash < sctp_assoc_hashsize; hash++) {
-               head = &sctp_assoc_hashtable[hash];
-               read_lock(&head->lock);
-               for (epb = head->chain; epb; epb = epb->next) {
-                       assoc = sctp_assoc(epb);
-                       sk = epb->sk;
-                       seq_printf(seq,
-                                  "%8p %8p %-3d %-3d %-2d %-4d %-5d %-5d ",
-                                  assoc, sk, sctp_sk(sk)->type, sk->sk_state,
-                                  assoc->state, hash, epb->bind_addr.port,
-                                  assoc->peer.port);
-                       sctp_seq_dump_local_addrs(seq, epb);
-                       seq_printf(seq, "<-> ");
-                       sctp_seq_dump_remote_addrs(seq, assoc);
-                       seq_printf(seq, "\n");
-               }
-               read_unlock(&head->lock);
+       int    hash = *(int *)v;
+
+       if (hash > sctp_assoc_hashsize)
+               return -ENOMEM;
+
+       head = &sctp_assoc_hashtable[hash-1];
+       sctp_local_bh_disable();
+       read_lock(&head->lock);
+       for (epb = head->chain; epb; epb = epb->next) {
+               assoc = sctp_assoc(epb);
+               sk = epb->sk;
+               seq_printf(seq,
+                          "%8p %8p %-3d %-3d %-2d %-4d %4d %8d %8d %7d %5lu %-5d %5d ",
+                          assoc, sk, sctp_sk(sk)->type, sk->sk_state,
+                          assoc->state, hash-1, assoc->assoc_id,
+                          (sk->sk_rcvbuf - assoc->rwnd),
+                          assoc->sndbuf_used,
+                          sock_i_uid(sk), sock_i_ino(sk),
+                          epb->bind_addr.port,
+                          assoc->peer.port);
+
+               seq_printf(seq, " ");
+               sctp_seq_dump_local_addrs(seq, epb);
+               seq_printf(seq, "<-> ");
+               sctp_seq_dump_remote_addrs(seq, assoc);
+               seq_printf(seq, "\n");
        }
+       read_unlock(&head->lock);
+       sctp_local_bh_enable();
 
        return 0;
 }
 
+static struct seq_operations sctp_assoc_ops = {
+       .start = sctp_assocs_seq_start,
+       .next  = sctp_assocs_seq_next,
+       .stop  = sctp_assocs_seq_stop,
+       .show  = sctp_assocs_seq_show,
+};
+
 /* Initialize the seq file operations for 'assocs' object. */
 static int sctp_assocs_seq_open(struct inode *inode, struct file *file)
 {
-       return single_open(file, sctp_assocs_seq_show, NULL);
+       return seq_open(file, &sctp_assoc_ops);
 }
 
 static struct file_operations sctp_assocs_seq_fops = {
        .open    = sctp_assocs_seq_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
-       .release = single_release,
+       .release = seq_release,
 };
 
 /* Set up the proc fs entry for 'assocs' object. */
index 2e1f9c3556f5922a9018c30055949f7a64f333be..5135e1a25d25c1413984520c7204f6df3d7d2df4 100644 (file)
@@ -378,10 +378,13 @@ static int sctp_v4_available(union sctp_addr *addr, struct sctp_sock *sp)
 {
        int ret = inet_addr_type(addr->v4.sin_addr.s_addr);
 
-       /* FIXME: ip_nonlocal_bind sysctl support. */
 
-       if (addr->v4.sin_addr.s_addr != INADDR_ANY && ret != RTN_LOCAL)
+       if (addr->v4.sin_addr.s_addr != INADDR_ANY &&
+          ret != RTN_LOCAL &&
+          !sp->inet.freebind &&
+          !sysctl_ip_nonlocal_bind)
                return 0;
+
        return 1;
 }
 
index 33ac8bf47b0e0d64b2ba9a75b136bc82eac1fa65..5baed9bb7de51a64c7cfede056ac0ccdf5ede850 100644 (file)
@@ -1830,7 +1830,7 @@ int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid,
         * be a a better choice than any of the embedded addresses.
         */
        if (peer_addr)
-               if(!sctp_assoc_add_peer(asoc, peer_addr, gfp))
+               if(!sctp_assoc_add_peer(asoc, peer_addr, gfp, SCTP_ACTIVE))
                        goto nomem;
 
        /* Process the initialization parameters.  */
@@ -1841,6 +1841,14 @@ int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid,
                         goto clean_up;
        }
 
+       /* Walk list of transports, removing transports in the UNKNOWN state. */
+       list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
+               transport = list_entry(pos, struct sctp_transport, transports);
+               if (transport->state == SCTP_UNKNOWN) {
+                       sctp_assoc_rm_peer(asoc, transport);
+               }
+       }
+
        /* The fixed INIT headers are always in network byte
         * order.
         */
@@ -1906,7 +1914,8 @@ int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid,
         * stream sequence number shall be set to 0.
         */
 
-       /* Allocate storage for the negotiated streams if it is not a temporary          * association.
+       /* Allocate storage for the negotiated streams if it is not a temporary
+        * association.
         */
        if (!asoc->temp) {
                int assoc_id;
@@ -1952,6 +1961,9 @@ clean_up:
                list_del_init(pos);
                sctp_transport_free(transport);
        }
+
+       asoc->peer.transport_count = 0;
+
 nomem:
        return 0;
 }
@@ -1995,7 +2007,7 @@ static int sctp_process_param(struct sctp_association *asoc,
                af->from_addr_param(&addr, param.addr, asoc->peer.port, 0);
                scope = sctp_scope(peer_addr);
                if (sctp_in_scope(&addr, scope))
-                       if (!sctp_assoc_add_peer(asoc, &addr, gfp))
+                       if (!sctp_assoc_add_peer(asoc, &addr, gfp, SCTP_ACTIVE))
                                return 0;
                break;
 
@@ -2396,7 +2408,7 @@ static __u16 sctp_process_asconf_param(struct sctp_association *asoc,
                 * Due to Resource Shortage'.
                 */
 
-               peer = sctp_assoc_add_peer(asoc, &addr, GFP_ATOMIC);
+               peer = sctp_assoc_add_peer(asoc, &addr, GFP_ATOMIC, SCTP_ACTIVE);
                if (!peer)
                        return SCTP_ERROR_RSRC_LOW;
 
index f65fa441952f7bbcd3b3b57c6f98468e16112eca..778639db125a2d53e1be5fd3b785af64ffbba8c3 100644 (file)
@@ -414,11 +414,13 @@ static void sctp_do_8_2_transport_strike(struct sctp_association *asoc,
         */
        asoc->overall_error_count++;
 
-       if (transport->active &&
+       if (transport->state != SCTP_INACTIVE &&
            (transport->error_count++ >= transport->max_retrans)) {
-               SCTP_DEBUG_PRINTK("transport_strike: transport "
-                                 "IP:%d.%d.%d.%d failed.\n",
-                                 NIPQUAD(transport->ipaddr.v4.sin_addr));
+               SCTP_DEBUG_PRINTK_IPADDR("transport_strike:association %p",
+                                        " transport IP: port:%d failed.\n",
+                                        asoc,
+                                        (&transport->ipaddr),
+                                        transport->ipaddr.v4.sin_port);
                sctp_assoc_control_transport(asoc, transport,
                                             SCTP_TRANSPORT_DOWN,
                                             SCTP_FAILED_THRESHOLD);
@@ -593,7 +595,7 @@ static void sctp_cmd_transport_on(sctp_cmd_seq_t *cmds,
        /* Mark the destination transport address as active if it is not so
         * marked.
         */
-       if (!t->active)
+       if (t->state == SCTP_INACTIVE)
                sctp_assoc_control_transport(asoc, t, SCTP_TRANSPORT_UP,
                                             SCTP_HEARTBEAT_SUCCESS);
 
@@ -665,8 +667,11 @@ static void sctp_cmd_new_state(sctp_cmd_seq_t *cmds,
 
        asoc->state = state;
 
+       SCTP_DEBUG_PRINTK("sctp_cmd_new_state: asoc %p[%s]\n",
+                         asoc, sctp_state_tbl[state]);
+
        if (sctp_style(sk, TCP)) {
-               /* Change the sk->sk_state of a TCP-style socket that has 
+               /* Change the sk->sk_state of a TCP-style socket that has
                 * sucessfully completed a connect() call.
                 */
                if (sctp_state(asoc, ESTABLISHED) && sctp_sstate(sk, CLOSED))
@@ -678,6 +683,16 @@ static void sctp_cmd_new_state(sctp_cmd_seq_t *cmds,
                        sk->sk_shutdown |= RCV_SHUTDOWN;
        }
 
+       if (sctp_state(asoc, COOKIE_WAIT)) {
+               /* Reset init timeouts since they may have been
+                * increased due to timer expirations.
+                */
+               asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] =
+                       asoc->ep->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT];
+               asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE] =
+                       asoc->ep->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE];
+       }
+
        if (sctp_state(asoc, ESTABLISHED) ||
            sctp_state(asoc, CLOSED) ||
            sctp_state(asoc, SHUTDOWN_RECEIVED)) {
@@ -1120,10 +1135,10 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
                         * to be executed only during failed attempts of
                         * association establishment.
                         */
-                       if ((asoc->peer.retran_path != 
-                            asoc->peer.primary_path) && 
-                           (asoc->counters[SCTP_COUNTER_INIT_ERROR] > 0)) {
-                               sctp_add_cmd_sf(commands, 
+                       if ((asoc->peer.retran_path !=
+                            asoc->peer.primary_path) &&
+                           (asoc->init_err_counter > 0)) {
+                               sctp_add_cmd_sf(commands,
                                                SCTP_CMD_FORCE_PRIM_RETRAN,
                                                SCTP_NULL());
                        }
@@ -1237,18 +1252,67 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
                                sctp_association_put(asoc);
                        break;
 
+               case SCTP_CMD_INIT_CHOOSE_TRANSPORT:
+                       chunk = cmd->obj.ptr;
+                       t = sctp_assoc_choose_init_transport(asoc);
+                       asoc->init_last_sent_to = t;
+                       chunk->transport = t;
+                       t->init_sent_count++;
+                       break;
+
                case SCTP_CMD_INIT_RESTART:
                        /* Do the needed accounting and updates
                         * associated with restarting an initialization
-                        * timer.
+                        * timer. Only multiply the timeout by two if
+                        * all transports have been tried at the current
+                        * timeout.
+                        */
+                       t = asoc->init_last_sent_to;
+                       asoc->init_err_counter++;
+
+                       if (t->init_sent_count > (asoc->init_cycle + 1)) {
+                               asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] *= 2;
+                               if (asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] >
+                                   asoc->max_init_timeo) {
+                                       asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] =
+                                               asoc->max_init_timeo;
+                               }
+                               asoc->init_cycle++;
+                               SCTP_DEBUG_PRINTK(
+                                       "T1 INIT Timeout adjustment"
+                                       " init_err_counter: %d"
+                                       " cycle: %d"
+                                       " timeout: %d\n",
+                                       asoc->init_err_counter,
+                                       asoc->init_cycle,
+                                       asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT]);
+                       }
+
+                       sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART,
+                                       SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT));
+                       break;
+
+               case SCTP_CMD_COOKIEECHO_RESTART:
+                       /* Do the needed accounting and updates
+                        * associated with restarting an initialization
+                        * timer. Only multiply the timeout by two if
+                        * all transports have been tried at the current
+                        * timeout.
                         */
-                       asoc->counters[SCTP_COUNTER_INIT_ERROR]++;
-                       asoc->timeouts[cmd->obj.to] *= 2;
-                       if (asoc->timeouts[cmd->obj.to] >
+                       asoc->init_err_counter++;
+
+                       asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE] *= 2;
+                       if (asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE] >
                            asoc->max_init_timeo) {
-                               asoc->timeouts[cmd->obj.to] =
+                               asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE] =
                                        asoc->max_init_timeo;
                        }
+                       SCTP_DEBUG_PRINTK(
+                               "T1 COOKIE Timeout adjustment"
+                               " init_err_counter: %d"
+                               " timeout: %d\n",
+                               asoc->init_err_counter,
+                               asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE]);
 
                        /* If we've sent any data bundled with
                         * COOKIE-ECHO we need to resend.
@@ -1261,7 +1325,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
 
                        sctp_add_cmd_sf(commands,
                                        SCTP_CMD_TIMER_RESTART,
-                                       SCTP_TO(cmd->obj.to));
+                                       SCTP_TO(SCTP_EVENT_TIMEOUT_T1_COOKIE));
                        break;
 
                case SCTP_CMD_INIT_FAILED:
@@ -1273,12 +1337,13 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
                                              subtype, chunk, cmd->obj.u32);
                        break;
 
-               case SCTP_CMD_COUNTER_INC:
-                       asoc->counters[cmd->obj.counter]++;
+               case SCTP_CMD_INIT_COUNTER_INC:
+                       asoc->init_err_counter++;
                        break;
 
-               case SCTP_CMD_COUNTER_RESET:
-                       asoc->counters[cmd->obj.counter] = 0;
+               case SCTP_CMD_INIT_COUNTER_RESET:
+                       asoc->init_err_counter = 0;
+                       asoc->init_cycle = 0;
                        break;
 
                case SCTP_CMD_REPORT_DUP:
index 8e01b8f09ac28914573c81727d9e19ab55076652..058189684c7ce0dbf0cc489c1566fcd1fabf5e28 100644 (file)
@@ -533,6 +533,9 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const struct sctp_endpoint *ep,
        sctp_add_cmd_sf(commands, SCTP_CMD_PEER_INIT,
                        SCTP_PEER_INIT(initchunk));
 
+       /* Reset init error count upon receipt of INIT-ACK.  */
+       sctp_add_cmd_sf(commands, SCTP_CMD_INIT_COUNTER_RESET, SCTP_NULL());
+
        /* 5.1 C) "A" shall stop the T1-init timer and leave
         * COOKIE-WAIT state.  "A" shall then ... start the T1-cookie
         * timer, and enter the COOKIE-ECHOED state.
@@ -775,8 +778,7 @@ sctp_disposition_t sctp_sf_do_5_1E_ca(const struct sctp_endpoint *ep,
         * from the COOKIE-ECHOED state to the COOKIE-WAIT
         * state is performed.
         */
-       sctp_add_cmd_sf(commands, SCTP_CMD_COUNTER_RESET,
-                       SCTP_COUNTER(SCTP_COUNTER_INIT_ERROR));
+       sctp_add_cmd_sf(commands, SCTP_CMD_INIT_COUNTER_RESET, SCTP_NULL());
 
        /* RFC 2960 5.1 Normal Establishment of an Association
         *
@@ -1019,10 +1021,22 @@ sctp_disposition_t sctp_sf_backbeat_8_3(const struct sctp_endpoint *ep,
        link = sctp_assoc_lookup_paddr(asoc, &from_addr);
 
        /* This should never happen, but lets log it if so.  */
-       if (!link) {
-               printk(KERN_WARNING
-                      "%s: Could not find address %d.%d.%d.%d\n",
-                      __FUNCTION__, NIPQUAD(from_addr.v4.sin_addr));
+       if (unlikely(!link)) {
+               if (from_addr.sa.sa_family == AF_INET6) {
+                       printk(KERN_WARNING
+                              "%s association %p could not find address "
+                              "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
+                              __FUNCTION__,
+                              asoc,
+                              NIP6(from_addr.v6.sin6_addr));
+               } else {
+                       printk(KERN_WARNING
+                              "%s association %p could not find address "
+                              "%u.%u.%u.%u\n",
+                              __FUNCTION__,
+                              asoc,
+                              NIPQUAD(from_addr.v4.sin_addr.s_addr));
+               }
                return SCTP_DISPOSITION_DISCARD;
        }
 
@@ -2095,9 +2109,7 @@ static sctp_disposition_t sctp_sf_do_5_2_6_stale(const struct sctp_endpoint *ep,
        sctp_errhdr_t *err;
        struct sctp_chunk *reply;
        struct sctp_bind_addr *bp;
-       int attempts;
-
-       attempts = asoc->counters[SCTP_COUNTER_INIT_ERROR] + 1;
+       int attempts = asoc->init_err_counter + 1;
 
        if (attempts >= asoc->max_init_attempts) {
                sctp_add_cmd_sf(commands, SCTP_CMD_INIT_FAILED,
@@ -2157,8 +2169,7 @@ static sctp_disposition_t sctp_sf_do_5_2_6_stale(const struct sctp_endpoint *ep,
        /* Cast away the const modifier, as we want to just
         * rerun it through as a sideffect.
         */
-       sctp_add_cmd_sf(commands, SCTP_CMD_COUNTER_INC,
-                       SCTP_COUNTER(SCTP_COUNTER_INIT_ERROR));
+       sctp_add_cmd_sf(commands, SCTP_CMD_INIT_COUNTER_INC, SCTP_NULL());
 
        sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
                        SCTP_TO(SCTP_EVENT_TIMEOUT_T1_COOKIE));
@@ -2281,8 +2292,7 @@ sctp_disposition_t sctp_sf_cookie_wait_abort(const struct sctp_endpoint *ep,
        if (len >= sizeof(struct sctp_chunkhdr) + sizeof(struct sctp_errhdr))
                error = ((sctp_errhdr_t *)chunk->skb->data)->cause;
 
-       sctp_stop_t1_and_abort(commands, error);
-       return SCTP_DISPOSITION_ABORT;
+       return sctp_stop_t1_and_abort(commands, error, asoc, chunk->transport);
 }
 
 /*
@@ -2294,8 +2304,8 @@ sctp_disposition_t sctp_sf_cookie_wait_icmp_abort(const struct sctp_endpoint *ep
                                        void *arg,
                                        sctp_cmd_seq_t *commands)
 {
-       sctp_stop_t1_and_abort(commands, SCTP_ERROR_NO_ERROR);
-       return SCTP_DISPOSITION_ABORT;
+       return sctp_stop_t1_and_abort(commands, SCTP_ERROR_NO_ERROR, asoc,
+                                     (struct sctp_transport *)arg);
 }
 
 /*
@@ -2318,8 +2328,12 @@ sctp_disposition_t sctp_sf_cookie_echoed_abort(const struct sctp_endpoint *ep,
  *
  * This is common code called by several sctp_sf_*_abort() functions above.
  */
-void sctp_stop_t1_and_abort(sctp_cmd_seq_t *commands, __u16 error)
+sctp_disposition_t  sctp_stop_t1_and_abort(sctp_cmd_seq_t *commands,
+                                          __u16 error,
+                                          const struct sctp_association *asoc,
+                                          struct sctp_transport *transport)
 {
+       SCTP_DEBUG_PRINTK("ABORT received (INIT).\n");
        sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
                        SCTP_STATE(SCTP_STATE_CLOSED));
        SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
@@ -2328,6 +2342,7 @@ void sctp_stop_t1_and_abort(sctp_cmd_seq_t *commands, __u16 error)
        /* CMD_INIT_FAILED will DELETE_TCB. */
        sctp_add_cmd_sf(commands, SCTP_CMD_INIT_FAILED,
                        SCTP_U32(error));
+       return SCTP_DISPOSITION_ABORT;
 }
 
 /*
@@ -3805,6 +3820,10 @@ sctp_disposition_t sctp_sf_do_prm_asoc(const struct sctp_endpoint *ep,
        sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC,
                        SCTP_ASOC((struct sctp_association *) asoc));
 
+       /* Choose transport for INIT. */
+       sctp_add_cmd_sf(commands, SCTP_CMD_INIT_CHOOSE_TRANSPORT,
+                       SCTP_CHUNK(repl));
+
        /* After sending the INIT, "A" starts the T1-init timer and
         * enters the COOKIE-WAIT state.
         */
@@ -4589,7 +4608,7 @@ sctp_disposition_t sctp_sf_do_6_2_sack(const struct sctp_endpoint *ep,
 }
 
 /*
- * sctp_sf_t1_timer_expire
+ * sctp_sf_t1_init_timer_expire
  *
  * Section: 4 Note: 2
  * Verification Tag:
@@ -4603,7 +4622,59 @@ sctp_disposition_t sctp_sf_do_6_2_sack(const struct sctp_endpoint *ep,
  *     endpoint MUST abort the initialization process and report the
  *     error to SCTP user.
  *
- *   3) If the T1-cookie timer expires, the endpoint MUST retransmit
+ * Outputs
+ * (timers, events)
+ *
+ */
+sctp_disposition_t sctp_sf_t1_init_timer_expire(const struct sctp_endpoint *ep,
+                                          const struct sctp_association *asoc,
+                                          const sctp_subtype_t type,
+                                          void *arg,
+                                          sctp_cmd_seq_t *commands)
+{
+       struct sctp_chunk *repl = NULL;
+       struct sctp_bind_addr *bp;
+       int attempts = asoc->init_err_counter + 1;
+
+       SCTP_DEBUG_PRINTK("Timer T1 expired (INIT).\n");
+
+       if (attempts < asoc->max_init_attempts) {
+               bp = (struct sctp_bind_addr *) &asoc->base.bind_addr;
+               repl = sctp_make_init(asoc, bp, GFP_ATOMIC, 0);
+               if (!repl)
+                       return SCTP_DISPOSITION_NOMEM;
+
+               /* Choose transport for INIT. */
+               sctp_add_cmd_sf(commands, SCTP_CMD_INIT_CHOOSE_TRANSPORT,
+                               SCTP_CHUNK(repl));
+
+               /* Issue a sideeffect to do the needed accounting. */
+               sctp_add_cmd_sf(commands, SCTP_CMD_INIT_RESTART,
+                               SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT));
+
+               sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl));
+       } else {
+               SCTP_DEBUG_PRINTK("Giving up on INIT, attempts: %d"
+                                 " max_init_attempts: %d\n",
+                                 attempts, asoc->max_init_attempts);
+               sctp_add_cmd_sf(commands, SCTP_CMD_INIT_FAILED,
+                               SCTP_U32(SCTP_ERROR_NO_ERROR));
+               return SCTP_DISPOSITION_DELETE_TCB;
+       }
+
+       return SCTP_DISPOSITION_CONSUME;
+}
+
+/*
+ * sctp_sf_t1_cookie_timer_expire
+ *
+ * Section: 4 Note: 2
+ * Verification Tag:
+ * Inputs
+ * (endpoint, asoc)
+ *
+ *  RFC 2960 Section 4 Notes
+ *  3) If the T1-cookie timer expires, the endpoint MUST retransmit
  *     COOKIE ECHO and re-start the T1-cookie timer without changing
  *     state.  This MUST be repeated up to 'Max.Init.Retransmits' times.
  *     After that, the endpoint MUST abort the initialization process and
@@ -4613,46 +4684,26 @@ sctp_disposition_t sctp_sf_do_6_2_sack(const struct sctp_endpoint *ep,
  * (timers, events)
  *
  */
-sctp_disposition_t sctp_sf_t1_timer_expire(const struct sctp_endpoint *ep,
+sctp_disposition_t sctp_sf_t1_cookie_timer_expire(const struct sctp_endpoint *ep,
                                           const struct sctp_association *asoc,
                                           const sctp_subtype_t type,
                                           void *arg,
                                           sctp_cmd_seq_t *commands)
 {
-       struct sctp_chunk *repl;
-       struct sctp_bind_addr *bp;
-       sctp_event_timeout_t timer = (sctp_event_timeout_t) arg;
-       int timeout;
-       int attempts;
-
-       timeout = asoc->timeouts[timer];
-       attempts = asoc->counters[SCTP_COUNTER_INIT_ERROR] + 1;
-       repl = NULL;
+       struct sctp_chunk *repl = NULL;
+       int attempts = asoc->init_err_counter + 1;
 
-       SCTP_DEBUG_PRINTK("Timer T1 expired.\n");
+       SCTP_DEBUG_PRINTK("Timer T1 expired (COOKIE-ECHO).\n");
 
        if (attempts < asoc->max_init_attempts) {
-               switch (timer) {
-               case SCTP_EVENT_TIMEOUT_T1_INIT:
-                       bp = (struct sctp_bind_addr *) &asoc->base.bind_addr;
-                       repl = sctp_make_init(asoc, bp, GFP_ATOMIC, 0);
-                       break;
-
-               case SCTP_EVENT_TIMEOUT_T1_COOKIE:
-                       repl = sctp_make_cookie_echo(asoc, NULL);
-                       break;
-
-               default:
-                       BUG();
-                       break;
-               };
-
+               repl = sctp_make_cookie_echo(asoc, NULL);
                if (!repl)
-                       goto nomem;
+                       return SCTP_DISPOSITION_NOMEM;
 
                /* Issue a sideeffect to do the needed accounting. */
-               sctp_add_cmd_sf(commands, SCTP_CMD_INIT_RESTART,
-                               SCTP_TO(timer));
+               sctp_add_cmd_sf(commands, SCTP_CMD_COOKIEECHO_RESTART,
+                               SCTP_TO(SCTP_EVENT_TIMEOUT_T1_COOKIE));
+
                sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl));
        } else {
                sctp_add_cmd_sf(commands, SCTP_CMD_INIT_FAILED,
@@ -4661,9 +4712,6 @@ sctp_disposition_t sctp_sf_t1_timer_expire(const struct sctp_endpoint *ep,
        }
 
        return SCTP_DISPOSITION_CONSUME;
-
-nomem:
-       return SCTP_DISPOSITION_NOMEM;
 }
 
 /* RFC2960 9.2 If the timer expires, the endpoint must re-send the SHUTDOWN
index 8967846f69e888dde679ee864210658c85c6145b..75ef10408764247ec5999ad662dfc022a2660303 100644 (file)
@@ -783,7 +783,8 @@ static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_
        /* SCTP_STATE_COOKIE_WAIT */ \
        {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
        /* SCTP_STATE_COOKIE_ECHOED */ \
-       {.fn = sctp_sf_t1_timer_expire, .name = "sctp_sf_t1_timer_expire"}, \
+       {.fn = sctp_sf_t1_cookie_timer_expire, \
+        .name = "sctp_sf_t1_cookie_timer_expire"}, \
        /* SCTP_STATE_ESTABLISHED */ \
        {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
        /* SCTP_STATE_SHUTDOWN_PENDING */ \
@@ -802,7 +803,8 @@ static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_
        /* SCTP_STATE_CLOSED */ \
        {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
        /* SCTP_STATE_COOKIE_WAIT */ \
-       {.fn = sctp_sf_t1_timer_expire, .name = "sctp_sf_t1_timer_expire"}, \
+       {.fn = sctp_sf_t1_init_timer_expire, \
+        .name = "sctp_sf_t1_init_timer_expire"}, \
        /* SCTP_STATE_COOKIE_ECHOED */ \
        {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
        /* SCTP_STATE_ESTABLISHED */ \
index 0b338eca6dc0b1559e2392af2964f5d7fcfe1820..aad55dc3792b39b1195e8cc3a0db7ea0176187ec 100644 (file)
@@ -262,18 +262,18 @@ static struct sctp_transport *sctp_addr_id2transport(struct sock *sk,
  *             sockaddr_in6 [RFC 2553]),
  *   addr_len - the size of the address structure.
  */
-SCTP_STATIC int sctp_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
+SCTP_STATIC int sctp_bind(struct sock *sk, struct sockaddr *addr, int addr_len)
 {
        int retval = 0;
 
        sctp_lock_sock(sk);
 
-       SCTP_DEBUG_PRINTK("sctp_bind(sk: %p, uaddr: %p, addr_len: %d)\n",
-                         sk, uaddr, addr_len);
+       SCTP_DEBUG_PRINTK("sctp_bind(sk: %p, addr: %p, addr_len: %d)\n",
+                         sk, addr, addr_len);
 
        /* Disallow binding twice. */
        if (!sctp_sk(sk)->ep->base.bind_addr.port)
-               retval = sctp_do_bind(sk, (union sctp_addr *)uaddr,
+               retval = sctp_do_bind(sk, (union sctp_addr *)addr,
                                      addr_len);
        else
                retval = -EINVAL;
@@ -318,23 +318,27 @@ SCTP_STATIC int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len)
        unsigned short snum;
        int ret = 0;
 
-       SCTP_DEBUG_PRINTK("sctp_do_bind(sk: %p, newaddr: %p, len: %d)\n",
-                         sk, addr, len);
-
        /* Common sockaddr verification. */
        af = sctp_sockaddr_af(sp, addr, len);
-       if (!af)
+       if (!af) {
+               SCTP_DEBUG_PRINTK("sctp_do_bind(sk: %p, newaddr: %p, len: %d) EINVAL\n",
+                                 sk, addr, len);
                return -EINVAL;
+       }
+
+       snum = ntohs(addr->v4.sin_port);
+
+       SCTP_DEBUG_PRINTK_IPADDR("sctp_do_bind(sk: %p, new addr: ",
+                                ", port: %d, new port: %d, len: %d)\n",
+                                sk,
+                                addr,
+                                bp->port, snum,
+                                len);
 
        /* PF specific bind() address verification. */
        if (!sp->pf->bind_verify(sp, addr))
                return -EADDRNOTAVAIL;
 
-       snum= ntohs(addr->v4.sin_port);
-
-       SCTP_DEBUG_PRINTK("sctp_do_bind: port: %d, new port: %d\n",
-                         bp->port, snum);
-
        /* We must either be unbound, or bind to the same port.  */
        if (bp->port && (snum != bp->port)) {
                SCTP_DEBUG_PRINTK("sctp_do_bind:"
@@ -816,7 +820,8 @@ out:
  *
  * Basically do nothing but copying the addresses from user to kernel
  * land and invoking either sctp_bindx_add() or sctp_bindx_rem() on the sk.
- * This is used for tunneling the sctp_bindx() request through sctp_setsockopt() * from userspace.
+ * This is used for tunneling the sctp_bindx() request through sctp_setsockopt()
+ * from userspace.
  *
  * We don't use copy_from_user() for optimization: we first do the
  * sanity checks (buffer size -fast- and access check-healthy
@@ -913,6 +918,243 @@ out:
        return err;
 }
 
+/* __sctp_connect(struct sock* sk, struct sockaddr *kaddrs, int addrs_size)
+ *
+ * Common routine for handling connect() and sctp_connectx().
+ * Connect will come in with just a single address.
+ */
+static int __sctp_connect(struct sock* sk,
+                         struct sockaddr *kaddrs,
+                         int addrs_size)
+{
+       struct sctp_sock *sp;
+       struct sctp_endpoint *ep;
+       struct sctp_association *asoc = NULL;
+       struct sctp_association *asoc2;
+       struct sctp_transport *transport;
+       union sctp_addr to;
+       struct sctp_af *af;
+       sctp_scope_t scope;
+       long timeo;
+       int err = 0;
+       int addrcnt = 0;
+       int walk_size = 0;
+       struct sockaddr *sa_addr;
+       void *addr_buf;
+
+       sp = sctp_sk(sk);
+       ep = sp->ep;
+
+       /* connect() cannot be done on a socket that is already in ESTABLISHED
+        * state - UDP-style peeled off socket or a TCP-style socket that
+        * is already connected.
+        * It cannot be done even on a TCP-style listening socket.
+        */
+       if (sctp_sstate(sk, ESTABLISHED) ||
+           (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))) {
+               err = -EISCONN;
+               goto out_free;
+       }
+
+       /* Walk through the addrs buffer and count the number of addresses. */
+       addr_buf = kaddrs;
+       while (walk_size < addrs_size) {
+               sa_addr = (struct sockaddr *)addr_buf;
+               af = sctp_get_af_specific(sa_addr->sa_family);
+
+               /* If the address family is not supported or if this address
+                * causes the address buffer to overflow return EINVAL.
+                */
+               if (!af || (walk_size + af->sockaddr_len) > addrs_size) {
+                       err = -EINVAL;
+                       goto out_free;
+               }
+
+               err = sctp_verify_addr(sk, (union sctp_addr *)sa_addr,
+                                      af->sockaddr_len);
+               if (err)
+                       goto out_free;
+
+               memcpy(&to, sa_addr, af->sockaddr_len);
+               to.v4.sin_port = ntohs(to.v4.sin_port);
+
+               /* Check if there already is a matching association on the
+                * endpoint (other than the one created here).
+                */
+               asoc2 = sctp_endpoint_lookup_assoc(ep, &to, &transport);
+               if (asoc2 && asoc2 != asoc) {
+                       if (asoc2->state >= SCTP_STATE_ESTABLISHED)
+                               err = -EISCONN;
+                       else
+                               err = -EALREADY;
+                       goto out_free;
+               }
+
+               /* If we could not find a matching association on the endpoint,
+                * make sure that there is no peeled-off association matching
+                * the peer address even on another socket.
+                */
+               if (sctp_endpoint_is_peeled_off(ep, &to)) {
+                       err = -EADDRNOTAVAIL;
+                       goto out_free;
+               }
+
+               if (!asoc) {
+                       /* If a bind() or sctp_bindx() is not called prior to
+                        * an sctp_connectx() call, the system picks an
+                        * ephemeral port and will choose an address set
+                        * equivalent to binding with a wildcard address.
+                        */
+                       if (!ep->base.bind_addr.port) {
+                               if (sctp_autobind(sk)) {
+                                       err = -EAGAIN;
+                                       goto out_free;
+                               }
+                       }
+
+                       scope = sctp_scope(&to);
+                       asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL);
+                       if (!asoc) {
+                               err = -ENOMEM;
+                               goto out_free;
+                       }
+               }
+
+               /* Prime the peer's transport structures.  */
+               transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL,
+                                               SCTP_UNKNOWN);
+               if (!transport) {
+                       err = -ENOMEM;
+                       goto out_free;
+               }
+
+               addrcnt++;
+               addr_buf += af->sockaddr_len;
+               walk_size += af->sockaddr_len;
+       }
+
+       err = sctp_assoc_set_bind_addr_from_ep(asoc, GFP_KERNEL);
+       if (err < 0) {
+               goto out_free;
+       }
+
+       err = sctp_primitive_ASSOCIATE(asoc, NULL);
+       if (err < 0) {
+               goto out_free;
+       }
+
+       /* Initialize sk's dport and daddr for getpeername() */
+       inet_sk(sk)->dport = htons(asoc->peer.port);
+       af = sctp_get_af_specific(to.sa.sa_family);
+       af->to_sk_daddr(&to, sk);
+
+       timeo = sock_sndtimeo(sk, sk->sk_socket->file->f_flags & O_NONBLOCK);
+       err = sctp_wait_for_connect(asoc, &timeo);
+
+       /* Don't free association on exit. */
+       asoc = NULL;
+
+out_free:
+
+       SCTP_DEBUG_PRINTK("About to exit __sctp_connect() free asoc: %p"
+                         " kaddrs: %p err: %d\n",
+                         asoc, kaddrs, err);
+       if (asoc)
+               sctp_association_free(asoc);
+       return err;
+}
+
+/* Helper for tunneling sctp_connectx() requests through sctp_setsockopt()
+ *
+ * API 8.9
+ * int sctp_connectx(int sd, struct sockaddr *addrs, int addrcnt);
+ *
+ * If sd is an IPv4 socket, the addresses passed must be IPv4 addresses.
+ * If the sd is an IPv6 socket, the addresses passed can either be IPv4
+ * or IPv6 addresses.
+ *
+ * A single address may be specified as INADDR_ANY or IN6ADDR_ANY, see
+ * Section 3.1.2 for this usage.
+ *
+ * addrs is a pointer to an array of one or more socket addresses. Each
+ * address is contained in its appropriate structure (i.e. struct
+ * sockaddr_in or struct sockaddr_in6) the family of the address type
+ * must be used to distengish the address length (note that this
+ * representation is termed a "packed array" of addresses). The caller
+ * specifies the number of addresses in the array with addrcnt.
+ *
+ * On success, sctp_connectx() returns 0. On failure, sctp_connectx() returns
+ * -1, and sets errno to the appropriate error code.
+ *
+ * For SCTP, the port given in each socket address must be the same, or
+ * sctp_connectx() will fail, setting errno to EINVAL.
+ *
+ * An application can use sctp_connectx to initiate an association with
+ * an endpoint that is multi-homed.  Much like sctp_bindx() this call
+ * allows a caller to specify multiple addresses at which a peer can be
+ * reached.  The way the SCTP stack uses the list of addresses to set up
+ * the association is implementation dependant.  This function only
+ * specifies that the stack will try to make use of all the addresses in
+ * the list when needed.
+ *
+ * Note that the list of addresses passed in is only used for setting up
+ * the association.  It does not necessarily equal the set of addresses
+ * the peer uses for the resulting association.  If the caller wants to
+ * find out the set of peer addresses, it must use sctp_getpaddrs() to
+ * retrieve them after the association has been set up.
+ *
+ * Basically do nothing but copying the addresses from user to kernel
+ * land and invoking either sctp_connectx(). This is used for tunneling
+ * the sctp_connectx() request through sctp_setsockopt() from userspace.
+ *
+ * We don't use copy_from_user() for optimization: we first do the
+ * sanity checks (buffer size -fast- and access check-healthy
+ * pointer); if all of those succeed, then we can alloc the memory
+ * (expensive operation) needed to copy the data to kernel. Then we do
+ * the copying without checking the user space area
+ * (__copy_from_user()).
+ *
+ * On exit there is no need to do sockfd_put(), sys_setsockopt() does
+ * it.
+ *
+ * sk        The sk of the socket
+ * addrs     The pointer to the addresses in user land
+ * addrssize Size of the addrs buffer
+ *
+ * Returns 0 if ok, <0 errno code on error.
+ */
+SCTP_STATIC int sctp_setsockopt_connectx(struct sock* sk,
+                                     struct sockaddr __user *addrs,
+                                     int addrs_size)
+{
+       int err = 0;
+       struct sockaddr *kaddrs;
+
+       SCTP_DEBUG_PRINTK("%s - sk %p addrs %p addrs_size %d\n",
+                         __FUNCTION__, sk, addrs, addrs_size);
+
+       if (unlikely(addrs_size <= 0))
+               return -EINVAL;
+
+       /* Check the user passed a healthy pointer.  */
+       if (unlikely(!access_ok(VERIFY_READ, addrs, addrs_size)))
+               return -EFAULT;
+
+       /* Alloc space for the address array in kernel memory.  */
+       kaddrs = (struct sockaddr *)kmalloc(addrs_size, GFP_KERNEL);
+       if (unlikely(!kaddrs))
+               return -ENOMEM;
+
+       if (__copy_from_user(kaddrs, addrs, addrs_size)) {
+               err = -EFAULT;
+       } else {
+               err = __sctp_connect(sk, kaddrs, addrs_size);
+       }
+
+       kfree(kaddrs);
+       return err;
+}
+
 /* API 3.1.4 close() - UDP Style Syntax
  * Applications use close() to perform graceful shutdown (as described in
  * Section 10.1 of [SCTP]) on ALL the associations currently represented
@@ -1095,7 +1337,7 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
        sp = sctp_sk(sk);
        ep = sp->ep;
 
-       SCTP_DEBUG_PRINTK("Using endpoint: %s.\n", ep->debug_name);
+       SCTP_DEBUG_PRINTK("Using endpoint: %p.\n", ep);
 
        /* We cannot send a message over a TCP-style listening socket. */
        if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) {
@@ -1306,7 +1548,7 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
                }
 
                /* Prime the peer's transport structures.  */
-               transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL);
+               transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL, SCTP_UNKNOWN);
                if (!transport) {
                        err = -ENOMEM;
                        goto out_free;
@@ -2208,6 +2450,12 @@ SCTP_STATIC int sctp_setsockopt(struct sock *sk, int level, int optname,
                                               optlen, SCTP_BINDX_REM_ADDR);
                break;
 
+       case SCTP_SOCKOPT_CONNECTX:
+               /* 'optlen' is the size of the addresses buffer. */
+               retval = sctp_setsockopt_connectx(sk, (struct sockaddr __user *)optval,
+                                              optlen);
+               break;
+
        case SCTP_DISABLE_FRAGMENTS:
                retval = sctp_setsockopt_disable_fragments(sk, optval, optlen);
                break;
@@ -2283,112 +2531,29 @@ out_nounlock:
  *
  * len: the size of the address.
  */
-SCTP_STATIC int sctp_connect(struct sock *sk, struct sockaddr *uaddr,
+SCTP_STATIC int sctp_connect(struct sock *sk, struct sockaddr *addr,
                             int addr_len)
 {
-       struct sctp_sock *sp;
-       struct sctp_endpoint *ep;
-       struct sctp_association *asoc;
-       struct sctp_transport *transport;
-       union sctp_addr to;
-       struct sctp_af *af;
-       sctp_scope_t scope;
-       long timeo;
        int err = 0;
+       struct sctp_af *af;
 
        sctp_lock_sock(sk);
 
-       SCTP_DEBUG_PRINTK("%s - sk: %p, sockaddr: %p, addr_len: %d)\n",
-                         __FUNCTION__, sk, uaddr, addr_len);
-
-       sp = sctp_sk(sk);
-       ep = sp->ep;
-
-       /* connect() cannot be done on a socket that is already in ESTABLISHED
-        * state - UDP-style peeled off socket or a TCP-style socket that
-        * is already connected.
-        * It cannot be done even on a TCP-style listening socket.
-        */
-       if (sctp_sstate(sk, ESTABLISHED) ||
-           (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))) {
-               err = -EISCONN;
-               goto out_unlock;
-       }
-
-       err = sctp_verify_addr(sk, (union sctp_addr *)uaddr, addr_len);
-       if (err)
-               goto out_unlock;
+       SCTP_DEBUG_PRINTK("%s - sk: %p, sockaddr: %p, addr_len: %d\n",
+                         __FUNCTION__, sk, addr, addr_len);
 
-       if (addr_len > sizeof(to))
-               addr_len = sizeof(to);
-       memcpy(&to, uaddr, addr_len);
-       to.v4.sin_port = ntohs(to.v4.sin_port);
-
-       asoc = sctp_endpoint_lookup_assoc(ep, &to, &transport);
-       if (asoc) {
-               if (asoc->state >= SCTP_STATE_ESTABLISHED)
-                       err = -EISCONN;
-               else
-                       err = -EALREADY;
-               goto out_unlock;
-       }
-
-       /* If we could not find a matching association on the endpoint,
-        * make sure that there is no peeled-off association matching the
-        * peer address even on another socket.
-        */
-       if (sctp_endpoint_is_peeled_off(ep, &to)) {
-               err = -EADDRNOTAVAIL;
-               goto out_unlock;
-       }
-
-       /* If a bind() or sctp_bindx() is not called prior to a connect()
-        * call, the system picks an ephemeral port and will choose an address
-        * set equivalent to binding with a wildcard address.
-        */
-       if (!ep->base.bind_addr.port) {
-               if (sctp_autobind(sk)) {
-                       err = -EAGAIN;
-                       goto out_unlock;
-               }
-       }
-
-       scope = sctp_scope(&to);
-       asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL);
-       if (!asoc) {
-               err = -ENOMEM;
-               goto out_unlock;
-       }
-
-       /* Prime the peer's transport structures.  */
-       transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL);
-       if (!transport) {
-               sctp_association_free(asoc);
-               goto out_unlock;
-       }
-       err = sctp_assoc_set_bind_addr_from_ep(asoc, GFP_KERNEL);
-       if (err < 0) {
-               sctp_association_free(asoc);
-               goto out_unlock;
-       }
-
-       err = sctp_primitive_ASSOCIATE(asoc, NULL);
-       if (err < 0) {
-               sctp_association_free(asoc);
-               goto out_unlock;
+       /* Validate addr_len before calling common connect/connectx routine. */
+       af = sctp_get_af_specific(addr->sa_family);
+       if (!af || addr_len < af->sockaddr_len) {
+               err = -EINVAL;
+       } else {
+               /* Pass correct addr len to common routine (so it knows there
+                * is only one address being passed.
+                */
+               err = __sctp_connect(sk, addr, af->sockaddr_len);
        }
 
-       /* Initialize sk's dport and daddr for getpeername() */
-       inet_sk(sk)->dport = htons(asoc->peer.port);
-       af = sctp_get_af_specific(to.sa.sa_family);
-       af->to_sk_daddr(&to, sk);
-
-       timeo = sock_sndtimeo(sk, sk->sk_socket->file->f_flags & O_NONBLOCK);
-       err = sctp_wait_for_connect(asoc, &timeo);
-
-out_unlock:
        sctp_release_sock(sk);
-
        return err;
 }
 
@@ -2677,12 +2842,15 @@ static int sctp_getsockopt_sctp_status(struct sock *sk, int len,
        /* Map ipv4 address into v4-mapped-on-v6 address.  */
        sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk),
                (union sctp_addr *)&status.sstat_primary.spinfo_address);
-       status.sstat_primary.spinfo_state = transport->active;
+       status.sstat_primary.spinfo_state = transport->state;
        status.sstat_primary.spinfo_cwnd = transport->cwnd;
        status.sstat_primary.spinfo_srtt = transport->srtt;
        status.sstat_primary.spinfo_rto = jiffies_to_msecs(transport->rto);
        status.sstat_primary.spinfo_mtu = transport->pmtu;
 
+       if (status.sstat_primary.spinfo_state == SCTP_UNKNOWN)
+               status.sstat_primary.spinfo_state = SCTP_ACTIVE;
+
        if (put_user(len, optlen)) {
                retval = -EFAULT;
                goto out;
@@ -2733,12 +2901,15 @@ static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len,
                return -EINVAL;
 
        pinfo.spinfo_assoc_id = sctp_assoc2id(transport->asoc);
-       pinfo.spinfo_state = transport->active;
+       pinfo.spinfo_state = transport->state;
        pinfo.spinfo_cwnd = transport->cwnd;
        pinfo.spinfo_srtt = transport->srtt;
        pinfo.spinfo_rto = jiffies_to_msecs(transport->rto);
        pinfo.spinfo_mtu = transport->pmtu;
 
+       if (pinfo.spinfo_state == SCTP_UNKNOWN)
+               pinfo.spinfo_state = SCTP_ACTIVE;
+
        if (put_user(len, optlen)) {
                retval = -EFAULT;
                goto out;
@@ -3591,7 +3762,8 @@ SCTP_STATIC int sctp_getsockopt(struct sock *sk, int level, int optname,
        int retval = 0;
        int len;
 
-       SCTP_DEBUG_PRINTK("sctp_getsockopt(sk: %p, ...)\n", sk);
+       SCTP_DEBUG_PRINTK("sctp_getsockopt(sk: %p... optname: %d)\n",
+                         sk, optname);
 
        /* I can hardly begin to describe how wrong this is.  This is
         * so broken as to be worse than useless.  The API draft
@@ -4368,15 +4540,11 @@ static struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags,
                 *  However, this function was corrent in any case. 8)
                 */
                if (flags & MSG_PEEK) {
-                       unsigned long cpu_flags;
-
-                       sctp_spin_lock_irqsave(&sk->sk_receive_queue.lock,
-                                              cpu_flags);
+                       spin_lock_bh(&sk->sk_receive_queue.lock);
                        skb = skb_peek(&sk->sk_receive_queue);
                        if (skb)
                                atomic_inc(&skb->users);
-                       sctp_spin_unlock_irqrestore(&sk->sk_receive_queue.lock,
-                                                   cpu_flags);
+                       spin_unlock_bh(&sk->sk_receive_queue.lock);
                } else {
                        skb = skb_dequeue(&sk->sk_receive_queue);
                }
@@ -4600,8 +4768,7 @@ out:
        return err;
 
 do_error:
-       if (asoc->counters[SCTP_COUNTER_INIT_ERROR] + 1 >=
-                                               asoc->max_init_attempts)
+       if (asoc->init_err_counter + 1 >= asoc->max_init_attempts)
                err = -ETIMEDOUT;
        else
                err = -ECONNREFUSED;
@@ -4686,6 +4853,7 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
        struct sctp_endpoint *newep = newsp->ep;
        struct sk_buff *skb, *tmp;
        struct sctp_ulpevent *event;
+       int flags = 0;
 
        /* Migrate socket buffer sizes and all the socket level options to the
         * new socket.
@@ -4707,6 +4875,17 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
        sctp_sk(newsk)->bind_hash = pp;
        inet_sk(newsk)->num = inet_sk(oldsk)->num;
 
+       /* Copy the bind_addr list from the original endpoint to the new
+        * endpoint so that we can handle restarts properly
+        */
+       if (assoc->peer.ipv4_address)
+               flags |= SCTP_ADDR4_PEERSUPP;
+       if (assoc->peer.ipv6_address)
+               flags |= SCTP_ADDR6_PEERSUPP;
+       sctp_bind_addr_copy(&newsp->ep->base.bind_addr,
+                            &oldsp->ep->base.bind_addr,
+                            SCTP_SCOPE_GLOBAL, GFP_KERNEL, flags);
+
        /* Move any messages in the old socket's receive queue that are for the
         * peeled off association to the new socket's receive queue.
         */
index f30882e1e96acc3f99012b77a11d1238b39aa2f0..0ec0fde6e6c596d19727fa831dd61991fa4c7a47 100644 (file)
@@ -83,7 +83,9 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer,
        peer->last_time_used = jiffies;
        peer->last_time_ecne_reduced = jiffies;
 
-       peer->active = SCTP_ACTIVE;
+       peer->init_sent_count = 0;
+
+       peer->state = SCTP_ACTIVE;
        peer->hb_allowed = 0;
 
        /* Initialize the default path max_retrans.  */
index cec0cb38b9ce2454abf80b73b003b9ad7227415c..38729af09461f0be4db5aa89e88d53dab314d9ad 100644 (file)
@@ -81,6 +81,7 @@
 #include <linux/syscalls.h>
 #include <linux/compat.h>
 #include <linux/kmod.h>
+#include <linux/audit.h>
 
 #ifdef CONFIG_NET_RADIO
 #include <linux/wireless.h>            /* Note : will define WIRELESS_EXT */
@@ -226,7 +227,7 @@ int move_addr_to_kernel(void __user *uaddr, int ulen, void *kaddr)
                return 0;
        if(copy_from_user(kaddr,uaddr,ulen))
                return -EFAULT;
-       return 0;
+       return audit_sockaddr(ulen, kaddr);
 }
 
 /**
@@ -1906,7 +1907,11 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
        /* copy_from_user should be SMP safe. */
        if (copy_from_user(a, args, nargs[call]))
                return -EFAULT;
-               
+
+       err = audit_socketcall(nargs[call]/sizeof(unsigned long), a);
+       if (err)
+               return err;
+
        a0=a[0];
        a1=a[1];
        
index c478fc8db7768428580d23381856fa53fa31add2..c420eba4876b50fd853b816c78f04e5c5f127674 100644 (file)
@@ -770,33 +770,12 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
                err = path_lookup(sunaddr->sun_path, LOOKUP_PARENT, &nd);
                if (err)
                        goto out_mknod_parent;
-               /*
-                * Yucky last component or no last component at all?
-                * (foo/., foo/.., /////)
-                */
-               err = -EEXIST;
-               if (nd.last_type != LAST_NORM)
-                       goto out_mknod;
-               /*
-                * Lock the directory.
-                */
-               down(&nd.dentry->d_inode->i_sem);
-               /*
-                * Do the final lookup.
-                */
-               dentry = lookup_hash(&nd.last, nd.dentry);
+
+               dentry = lookup_create(&nd, 0);
                err = PTR_ERR(dentry);
                if (IS_ERR(dentry))
                        goto out_mknod_unlock;
-               err = -ENOENT;
-               /*
-                * Special case - lookup gave negative, but... we had foo/bar/
-                * From the vfs_mknod() POV we just have a negative dentry -
-                * all is fine. Let's be bastards - you had / on the end, you've
-                * been asking for (non-existent) directory. -ENOENT for you.
-                */
-               if (nd.last.name[nd.last.len] && !dentry->d_inode)
-                       goto out_mknod_dput;
+
                /*
                 * All right, let's create it.
                 */
@@ -845,7 +824,6 @@ out_mknod_dput:
        dput(dentry);
 out_mknod_unlock:
        up(&nd.dentry->d_inode->i_sem);
-out_mknod:
        path_release(&nd);
 out_mknod_parent:
        if (err==-EEXIST)
index 080aae243ce091d134b837799c9ae7837bcdf0bb..2f4531fcaca23d43e8b49702b84dd5288acedf1e 100644 (file)
@@ -698,7 +698,7 @@ int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer)
                                return -ENOMEM;
 
                        if (skb1->sk)
-                               skb_set_owner_w(skb, skb1->sk);
+                               skb_set_owner_w(skb2, skb1->sk);
 
                        /* Looking around. Are we still alive?
                         * OK, link new skb, drop old one */
index 55ed979db1445f3d60b329ca1c35f4e3f7a8c37b..d65ed8684fc1a340b1f470e3d3f50fc2b940a60f 100644 (file)
@@ -118,7 +118,6 @@ retry:
        xfrm_policy_put_afinfo(afinfo);
        return type;
 }
-EXPORT_SYMBOL(xfrm_get_type);
 
 int xfrm_dst_lookup(struct xfrm_dst **dst, struct flowi *fl, 
                    unsigned short family)
@@ -216,8 +215,8 @@ out:
 
 expired:
        read_unlock(&xp->lock);
-       km_policy_expired(xp, dir, 1);
-       xfrm_policy_delete(xp, dir);
+       if (!xfrm_policy_delete(xp, dir))
+               km_policy_expired(xp, dir, 1);
        xfrm_pol_put(xp);
 }
 
@@ -555,7 +554,7 @@ static struct xfrm_policy *__xfrm_policy_unlink(struct xfrm_policy *pol,
        return NULL;
 }
 
-void xfrm_policy_delete(struct xfrm_policy *pol, int dir)
+int xfrm_policy_delete(struct xfrm_policy *pol, int dir)
 {
        write_lock_bh(&xfrm_policy_lock);
        pol = __xfrm_policy_unlink(pol, dir);
@@ -564,7 +563,9 @@ void xfrm_policy_delete(struct xfrm_policy *pol, int dir)
                if (dir < XFRM_POLICY_MAX)
                        atomic_inc(&flow_cache_genid);
                xfrm_policy_kill(pol);
+               return 0;
        }
+       return -ENOENT;
 }
 
 int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol)
@@ -1136,7 +1137,7 @@ int xfrm_bundle_ok(struct xfrm_dst *first, struct flowi *fl, int family)
        struct xfrm_dst *last;
        u32 mtu;
 
-       if (!dst_check(dst->path, 0) ||
+       if (!dst_check(dst->path, ((struct xfrm_dst *)dst)->path_cookie) ||
            (dst->dev && !netif_running(dst->dev)))
                return 0;
 
@@ -1156,7 +1157,7 @@ int xfrm_bundle_ok(struct xfrm_dst *first, struct flowi *fl, int family)
                        xdst->child_mtu_cached = mtu;
                }
 
-               if (!dst_check(xdst->route, 0))
+               if (!dst_check(xdst->route, xdst->route_cookie))
                        return 0;
                mtu = dst_mtu(xdst->route);
                if (xdst->route_mtu_cached != mtu) {
index d11747c2a763f27a0a37eae59352bf61891a26b8..9d206c282cf193a9867ff3b2c0078a683588a066 100644 (file)
@@ -50,7 +50,7 @@ static DEFINE_SPINLOCK(xfrm_state_gc_lock);
 
 static int xfrm_state_gc_flush_bundles;
 
-static void __xfrm_state_delete(struct xfrm_state *x);
+static int __xfrm_state_delete(struct xfrm_state *x);
 
 static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned short family);
 static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo);
@@ -154,6 +154,7 @@ static void xfrm_timer_handler(unsigned long data)
                        next = tmo;
        }
 
+       x->km.dying = warn;
        if (warn)
                km_state_expired(x, 0);
 resched:
@@ -169,9 +170,8 @@ expired:
                next = 2;
                goto resched;
        }
-       if (x->id.spi != 0)
+       if (!__xfrm_state_delete(x) && x->id.spi)
                km_state_expired(x, 1);
-       __xfrm_state_delete(x);
 
 out:
        spin_unlock(&x->lock);
@@ -215,8 +215,10 @@ void __xfrm_state_destroy(struct xfrm_state *x)
 }
 EXPORT_SYMBOL(__xfrm_state_destroy);
 
-static void __xfrm_state_delete(struct xfrm_state *x)
+static int __xfrm_state_delete(struct xfrm_state *x)
 {
+       int err = -ESRCH;
+
        if (x->km.state != XFRM_STATE_DEAD) {
                x->km.state = XFRM_STATE_DEAD;
                spin_lock(&xfrm_state_lock);
@@ -245,14 +247,21 @@ static void __xfrm_state_delete(struct xfrm_state *x)
                 * is what we are dropping here.
                 */
                atomic_dec(&x->refcnt);
+               err = 0;
        }
+
+       return err;
 }
 
-void xfrm_state_delete(struct xfrm_state *x)
+int xfrm_state_delete(struct xfrm_state *x)
 {
+       int err;
+
        spin_lock_bh(&x->lock);
-       __xfrm_state_delete(x);
+       err = __xfrm_state_delete(x);
        spin_unlock_bh(&x->lock);
+
+       return err;
 }
 EXPORT_SYMBOL(xfrm_state_delete);
 
@@ -557,16 +566,18 @@ int xfrm_state_check_expire(struct xfrm_state *x)
 
        if (x->curlft.bytes >= x->lft.hard_byte_limit ||
            x->curlft.packets >= x->lft.hard_packet_limit) {
-               km_state_expired(x, 1);
-               if (!mod_timer(&x->timer, jiffies + XFRM_ACQ_EXPIRES*HZ))
+               x->km.state = XFRM_STATE_EXPIRED;
+               if (!mod_timer(&x->timer, jiffies))
                        xfrm_state_hold(x);
                return -EINVAL;
        }
 
        if (!x->km.dying &&
            (x->curlft.bytes >= x->lft.soft_byte_limit ||
-            x->curlft.packets >= x->lft.soft_packet_limit))
+            x->curlft.packets >= x->lft.soft_packet_limit)) {
+               x->km.dying = 1;
                km_state_expired(x, 0);
+       }
        return 0;
 }
 EXPORT_SYMBOL(xfrm_state_check_expire);
@@ -796,34 +807,56 @@ EXPORT_SYMBOL(xfrm_replay_advance);
 static struct list_head xfrm_km_list = LIST_HEAD_INIT(xfrm_km_list);
 static DEFINE_RWLOCK(xfrm_km_lock);
 
-static void km_state_expired(struct xfrm_state *x, int hard)
+void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c)
 {
        struct xfrm_mgr *km;
 
-       if (hard)
-               x->km.state = XFRM_STATE_EXPIRED;
-       else
-               x->km.dying = 1;
+       read_lock(&xfrm_km_lock);
+       list_for_each_entry(km, &xfrm_km_list, list)
+               if (km->notify_policy)
+                       km->notify_policy(xp, dir, c);
+       read_unlock(&xfrm_km_lock);
+}
 
+void km_state_notify(struct xfrm_state *x, struct km_event *c)
+{
+       struct xfrm_mgr *km;
        read_lock(&xfrm_km_lock);
        list_for_each_entry(km, &xfrm_km_list, list)
-               km->notify(x, hard);
+               if (km->notify)
+                       km->notify(x, c);
        read_unlock(&xfrm_km_lock);
+}
+
+EXPORT_SYMBOL(km_policy_notify);
+EXPORT_SYMBOL(km_state_notify);
+
+static void km_state_expired(struct xfrm_state *x, int hard)
+{
+       struct km_event c;
+
+       c.data.hard = hard;
+       c.event = XFRM_MSG_EXPIRE;
+       km_state_notify(x, &c);
 
        if (hard)
                wake_up(&km_waitq);
 }
 
+/*
+ * We send to all registered managers regardless of failure
+ * We are happy with one success
+*/
 static int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol)
 {
-       int err = -EINVAL;
+       int err = -EINVAL, acqret;
        struct xfrm_mgr *km;
 
        read_lock(&xfrm_km_lock);
        list_for_each_entry(km, &xfrm_km_list, list) {
-               err = km->acquire(x, t, pol, XFRM_POLICY_OUT);
-               if (!err)
-                       break;
+               acqret = km->acquire(x, t, pol, XFRM_POLICY_OUT);
+               if (!acqret)
+                       err = acqret;
        }
        read_unlock(&xfrm_km_lock);
        return err;
@@ -848,13 +881,11 @@ EXPORT_SYMBOL(km_new_mapping);
 
 void km_policy_expired(struct xfrm_policy *pol, int dir, int hard)
 {
-       struct xfrm_mgr *km;
+       struct km_event c;
 
-       read_lock(&xfrm_km_lock);
-       list_for_each_entry(km, &xfrm_km_list, list)
-               if (km->notify_policy)
-                       km->notify_policy(pol, dir, hard);
-       read_unlock(&xfrm_km_lock);
+       c.data.hard = hard;
+       c.event = XFRM_MSG_POLEXPIRE;
+       km_policy_notify(pol, dir, &c);
 
        if (hard)
                wake_up(&km_waitq);
@@ -1024,6 +1055,43 @@ int xfrm_state_mtu(struct xfrm_state *x, int mtu)
 }
 
 EXPORT_SYMBOL(xfrm_state_mtu);
+
+int xfrm_init_state(struct xfrm_state *x)
+{
+       struct xfrm_state_afinfo *afinfo;
+       int family = x->props.family;
+       int err;
+
+       err = -EAFNOSUPPORT;
+       afinfo = xfrm_state_get_afinfo(family);
+       if (!afinfo)
+               goto error;
+
+       err = 0;
+       if (afinfo->init_flags)
+               err = afinfo->init_flags(x);
+
+       xfrm_state_put_afinfo(afinfo);
+
+       if (err)
+               goto error;
+
+       err = -EPROTONOSUPPORT;
+       x->type = xfrm_get_type(x->id.proto, family);
+       if (x->type == NULL)
+               goto error;
+
+       err = x->type->init_state(x);
+       if (err)
+               goto error;
+
+       x->km.state = XFRM_STATE_VALID;
+
+error:
+       return err;
+}
+
+EXPORT_SYMBOL(xfrm_init_state);
  
 void __init xfrm_state_init(void)
 {
index 5ddda2c98af9c8258562f926735fe16fa83025c2..ecade4893a139cc35d4fe345ce70242ede5358c4 100644 (file)
@@ -34,14 +34,21 @@ static int verify_one_alg(struct rtattr **xfrma, enum xfrm_attr_type_t type)
 {
        struct rtattr *rt = xfrma[type - 1];
        struct xfrm_algo *algp;
+       int len;
 
        if (!rt)
                return 0;
 
-       if ((rt->rta_len - sizeof(*rt)) < sizeof(*algp))
+       len = (rt->rta_len - sizeof(*rt)) - sizeof(*algp);
+       if (len < 0)
                return -EINVAL;
 
        algp = RTA_DATA(rt);
+
+       len -= (algp->alg_key_len + 7U) / 8; 
+       if (len < 0)
+               return -EINVAL;
+
        switch (type) {
        case XFRMA_ALG_AUTH:
                if (!algp->alg_key_len &&
@@ -162,6 +169,7 @@ static int attach_one_algo(struct xfrm_algo **algpp, u8 *props,
        struct rtattr *rta = u_arg;
        struct xfrm_algo *p, *ualg;
        struct xfrm_algo_desc *algo;
+       int len;
 
        if (!rta)
                return 0;
@@ -173,11 +181,12 @@ static int attach_one_algo(struct xfrm_algo **algpp, u8 *props,
                return -ENOSYS;
        *props = algo->desc.sadb_alg_id;
 
-       p = kmalloc(sizeof(*ualg) + ualg->alg_key_len, GFP_KERNEL);
+       len = sizeof(*ualg) + (ualg->alg_key_len + 7U) / 8;
+       p = kmalloc(len, GFP_KERNEL);
        if (!p)
                return -ENOMEM;
 
-       memcpy(p, ualg, sizeof(*ualg) + ualg->alg_key_len);
+       memcpy(p, ualg, len);
        *algpp = p;
        return 0;
 }
@@ -240,17 +249,10 @@ static struct xfrm_state *xfrm_state_construct(struct xfrm_usersa_info *p,
        if ((err = attach_encap_tmpl(&x->encap, xfrma[XFRMA_ENCAP-1])))
                goto error;
 
-       err = -ENOENT;
-       x->type = xfrm_get_type(x->id.proto, x->props.family);
-       if (x->type == NULL)
-               goto error;
-
-       err = x->type->init_state(x, NULL);
+       err = xfrm_init_state(x);
        if (err)
                goto error;
 
-       x->curlft.add_time = (unsigned long) xtime.tv_sec;
-       x->km.state = XFRM_STATE_VALID;
        x->km.seq = p->seq;
 
        return x;
@@ -268,6 +270,7 @@ static int xfrm_add_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma)
        struct xfrm_usersa_info *p = NLMSG_DATA(nlh);
        struct xfrm_state *x;
        int err;
+       struct km_event c;
 
        err = verify_newsa_info(p, (struct rtattr **) xfrma);
        if (err)
@@ -277,6 +280,7 @@ static int xfrm_add_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma)
        if (!x)
                return err;
 
+       xfrm_state_hold(x);
        if (nlh->nlmsg_type == XFRM_MSG_NEWSA)
                err = xfrm_state_add(x);
        else
@@ -285,14 +289,24 @@ static int xfrm_add_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma)
        if (err < 0) {
                x->km.state = XFRM_STATE_DEAD;
                xfrm_state_put(x);
+               goto out;
        }
 
+       c.seq = nlh->nlmsg_seq;
+       c.pid = nlh->nlmsg_pid;
+       c.event = nlh->nlmsg_type;
+
+       km_state_notify(x, &c);
+out:
+       xfrm_state_put(x);
        return err;
 }
 
 static int xfrm_del_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma)
 {
        struct xfrm_state *x;
+       int err;
+       struct km_event c;
        struct xfrm_usersa_id *p = NLMSG_DATA(nlh);
 
        x = xfrm_state_lookup(&p->daddr, p->spi, p->proto, p->family);
@@ -304,10 +318,19 @@ static int xfrm_del_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma)
                return -EPERM;
        }
 
-       xfrm_state_delete(x);
+       err = xfrm_state_delete(x);
+       if (err < 0) {
+               xfrm_state_put(x);
+               return err;
+       }
+
+       c.seq = nlh->nlmsg_seq;
+       c.pid = nlh->nlmsg_pid;
+       c.event = nlh->nlmsg_type;
+       km_state_notify(x, &c);
        xfrm_state_put(x);
 
-       return 0;
+       return err;
 }
 
 static void copy_to_user_state(struct xfrm_state *x, struct xfrm_usersa_info *p)
@@ -672,6 +695,7 @@ static int xfrm_add_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr
 {
        struct xfrm_userpolicy_info *p = NLMSG_DATA(nlh);
        struct xfrm_policy *xp;
+       struct km_event c;
        int err;
        int excl;
 
@@ -683,6 +707,10 @@ static int xfrm_add_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr
        if (!xp)
                return err;
 
+       /* shouldnt excl be based on nlh flags??
+        * Aha! this is anti-netlink really i.e  more pfkey derived
+        * in netlink excl is a flag and you wouldnt need
+        * a type XFRM_MSG_UPDPOLICY - JHS */
        excl = nlh->nlmsg_type == XFRM_MSG_NEWPOLICY;
        err = xfrm_policy_insert(p->dir, xp, excl);
        if (err) {
@@ -690,6 +718,11 @@ static int xfrm_add_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr
                return err;
        }
 
+       c.event = nlh->nlmsg_type;
+       c.seq = nlh->nlmsg_seq;
+       c.pid = nlh->nlmsg_pid;
+       km_policy_notify(xp, p->dir, &c);
+
        xfrm_pol_put(xp);
 
        return 0;
@@ -807,6 +840,7 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr
        struct xfrm_policy *xp;
        struct xfrm_userpolicy_id *p;
        int err;
+       struct km_event c;
        int delete;
 
        p = NLMSG_DATA(nlh);
@@ -834,6 +868,12 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr
                                              NETLINK_CB(skb).pid,
                                              MSG_DONTWAIT);
                }
+       } else {
+               c.data.byid = p->index;
+               c.event = nlh->nlmsg_type;
+               c.seq = nlh->nlmsg_seq;
+               c.pid = nlh->nlmsg_pid;
+               km_policy_notify(xp, p->dir, &c);
        }
 
        xfrm_pol_put(xp);
@@ -843,15 +883,28 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr
 
 static int xfrm_flush_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma)
 {
+       struct km_event c;
        struct xfrm_usersa_flush *p = NLMSG_DATA(nlh);
 
        xfrm_state_flush(p->proto);
+       c.data.proto = p->proto;
+       c.event = nlh->nlmsg_type;
+       c.seq = nlh->nlmsg_seq;
+       c.pid = nlh->nlmsg_pid;
+       km_state_notify(NULL, &c);
+
        return 0;
 }
 
 static int xfrm_flush_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma)
 {
+       struct km_event c;
+
        xfrm_policy_flush();
+       c.event = nlh->nlmsg_type;
+       c.seq = nlh->nlmsg_seq;
+       c.pid = nlh->nlmsg_pid;
+       km_policy_notify(NULL, 0, &c);
        return 0;
 }
 
@@ -1060,15 +1113,16 @@ nlmsg_failure:
        return -1;
 }
 
-static int xfrm_send_state_notify(struct xfrm_state *x, int hard)
+static int xfrm_exp_state_notify(struct xfrm_state *x, struct km_event *c)
 {
        struct sk_buff *skb;
+       int len = NLMSG_LENGTH(sizeof(struct xfrm_user_expire));
 
-       skb = alloc_skb(sizeof(struct xfrm_user_expire) + 16, GFP_ATOMIC);
+       skb = alloc_skb(len, GFP_ATOMIC);
        if (skb == NULL)
                return -ENOMEM;
 
-       if (build_expire(skb, x, hard) < 0)
+       if (build_expire(skb, x, c->data.hard) < 0)
                BUG();
 
        NETLINK_CB(skb).dst_groups = XFRMGRP_EXPIRE;
@@ -1076,6 +1130,131 @@ static int xfrm_send_state_notify(struct xfrm_state *x, int hard)
        return netlink_broadcast(xfrm_nl, skb, 0, XFRMGRP_EXPIRE, GFP_ATOMIC);
 }
 
+static int xfrm_notify_sa_flush(struct km_event *c)
+{
+       struct xfrm_usersa_flush *p;
+       struct nlmsghdr *nlh;
+       struct sk_buff *skb;
+       unsigned char *b;
+       int len = NLMSG_LENGTH(sizeof(struct xfrm_usersa_flush));
+
+       skb = alloc_skb(len, GFP_ATOMIC);
+       if (skb == NULL)
+               return -ENOMEM;
+       b = skb->tail;
+
+       nlh = NLMSG_PUT(skb, c->pid, c->seq,
+                       XFRM_MSG_FLUSHSA, sizeof(*p));
+       nlh->nlmsg_flags = 0;
+
+       p = NLMSG_DATA(nlh);
+       p->proto = c->data.proto;
+
+       nlh->nlmsg_len = skb->tail - b;
+
+       return netlink_broadcast(xfrm_nl, skb, 0, XFRMGRP_SA, GFP_ATOMIC);
+
+nlmsg_failure:
+       kfree_skb(skb);
+       return -1;
+}
+
+static int inline xfrm_sa_len(struct xfrm_state *x)
+{
+       int l = 0;
+       if (x->aalg)
+               l += RTA_SPACE(sizeof(*x->aalg) + (x->aalg->alg_key_len+7)/8);
+       if (x->ealg)
+               l += RTA_SPACE(sizeof(*x->ealg) + (x->ealg->alg_key_len+7)/8);
+       if (x->calg)
+               l += RTA_SPACE(sizeof(*x->calg));
+       if (x->encap)
+               l += RTA_SPACE(sizeof(*x->encap));
+
+       return l;
+}
+
+static int xfrm_notify_sa(struct xfrm_state *x, struct km_event *c)
+{
+       struct xfrm_usersa_info *p;
+       struct xfrm_usersa_id *id;
+       struct nlmsghdr *nlh;
+       struct sk_buff *skb;
+       unsigned char *b;
+       int len = xfrm_sa_len(x);
+       int headlen;
+
+       headlen = sizeof(*p);
+       if (c->event == XFRM_MSG_DELSA) {
+               len += RTA_SPACE(headlen);
+               headlen = sizeof(*id);
+       }
+       len += NLMSG_SPACE(headlen);
+
+       skb = alloc_skb(len, GFP_ATOMIC);
+       if (skb == NULL)
+               return -ENOMEM;
+       b = skb->tail;
+
+       nlh = NLMSG_PUT(skb, c->pid, c->seq, c->event, headlen);
+       nlh->nlmsg_flags = 0;
+
+       p = NLMSG_DATA(nlh);
+       if (c->event == XFRM_MSG_DELSA) {
+               id = NLMSG_DATA(nlh);
+               memcpy(&id->daddr, &x->id.daddr, sizeof(id->daddr));
+               id->spi = x->id.spi;
+               id->family = x->props.family;
+               id->proto = x->id.proto;
+
+               p = RTA_DATA(__RTA_PUT(skb, XFRMA_SA, sizeof(*p)));
+       }
+
+       copy_to_user_state(x, p);
+
+       if (x->aalg)
+               RTA_PUT(skb, XFRMA_ALG_AUTH,
+                       sizeof(*(x->aalg))+(x->aalg->alg_key_len+7)/8, x->aalg);
+       if (x->ealg)
+               RTA_PUT(skb, XFRMA_ALG_CRYPT,
+                       sizeof(*(x->ealg))+(x->ealg->alg_key_len+7)/8, x->ealg);
+       if (x->calg)
+               RTA_PUT(skb, XFRMA_ALG_COMP, sizeof(*(x->calg)), x->calg);
+
+       if (x->encap)
+               RTA_PUT(skb, XFRMA_ENCAP, sizeof(*x->encap), x->encap);
+
+       nlh->nlmsg_len = skb->tail - b;
+
+       return netlink_broadcast(xfrm_nl, skb, 0, XFRMGRP_SA, GFP_ATOMIC);
+
+nlmsg_failure:
+rtattr_failure:
+       kfree_skb(skb);
+       return -1;
+}
+
+static int xfrm_send_state_notify(struct xfrm_state *x, struct km_event *c)
+{
+
+       switch (c->event) {
+       case XFRM_MSG_EXPIRE:
+               return xfrm_exp_state_notify(x, c);
+       case XFRM_MSG_DELSA:
+       case XFRM_MSG_UPDSA:
+       case XFRM_MSG_NEWSA:
+               return xfrm_notify_sa(x, c);
+       case XFRM_MSG_FLUSHSA:
+               return xfrm_notify_sa_flush(c);
+       default:
+                printk("xfrm_user: Unknown SA event %d\n", c->event);
+                break;
+       }
+
+       return 0;
+
+}
+
 static int build_acquire(struct sk_buff *skb, struct xfrm_state *x,
                         struct xfrm_tmpl *xt, struct xfrm_policy *xp,
                         int dir)
@@ -1209,7 +1388,7 @@ nlmsg_failure:
        return -1;
 }
 
-static int xfrm_send_policy_notify(struct xfrm_policy *xp, int dir, int hard)
+static int xfrm_exp_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c)
 {
        struct sk_buff *skb;
        size_t len;
@@ -1220,7 +1399,7 @@ static int xfrm_send_policy_notify(struct xfrm_policy *xp, int dir, int hard)
        if (skb == NULL)
                return -ENOMEM;
 
-       if (build_polexpire(skb, xp, dir, hard) < 0)
+       if (build_polexpire(skb, xp, dir, c->data.hard) < 0)
                BUG();
 
        NETLINK_CB(skb).dst_groups = XFRMGRP_EXPIRE;
@@ -1228,6 +1407,103 @@ static int xfrm_send_policy_notify(struct xfrm_policy *xp, int dir, int hard)
        return netlink_broadcast(xfrm_nl, skb, 0, XFRMGRP_EXPIRE, GFP_ATOMIC);
 }
 
+static int xfrm_notify_policy(struct xfrm_policy *xp, int dir, struct km_event *c)
+{
+       struct xfrm_userpolicy_info *p;
+       struct xfrm_userpolicy_id *id;
+       struct nlmsghdr *nlh;
+       struct sk_buff *skb;
+       unsigned char *b;
+       int len = RTA_SPACE(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr);
+       int headlen;
+
+       headlen = sizeof(*p);
+       if (c->event == XFRM_MSG_DELPOLICY) {
+               len += RTA_SPACE(headlen);
+               headlen = sizeof(*id);
+       }
+       len += NLMSG_SPACE(headlen);
+
+       skb = alloc_skb(len, GFP_ATOMIC);
+       if (skb == NULL)
+               return -ENOMEM;
+       b = skb->tail;
+
+       nlh = NLMSG_PUT(skb, c->pid, c->seq, c->event, headlen);
+
+       p = NLMSG_DATA(nlh);
+       if (c->event == XFRM_MSG_DELPOLICY) {
+               id = NLMSG_DATA(nlh);
+               memset(id, 0, sizeof(*id));
+               id->dir = dir;
+               if (c->data.byid)
+                       id->index = xp->index;
+               else
+                       memcpy(&id->sel, &xp->selector, sizeof(id->sel));
+
+               p = RTA_DATA(__RTA_PUT(skb, XFRMA_POLICY, sizeof(*p)));
+       }
+
+       nlh->nlmsg_flags = 0;
+
+       copy_to_user_policy(xp, p, dir);
+       if (copy_to_user_tmpl(xp, skb) < 0)
+               goto nlmsg_failure;
+
+       nlh->nlmsg_len = skb->tail - b;
+
+       return netlink_broadcast(xfrm_nl, skb, 0, XFRMGRP_POLICY, GFP_ATOMIC);
+
+nlmsg_failure:
+rtattr_failure:
+       kfree_skb(skb);
+       return -1;
+}
+
+static int xfrm_notify_policy_flush(struct km_event *c)
+{
+       struct nlmsghdr *nlh;
+       struct sk_buff *skb;
+       unsigned char *b;
+       int len = NLMSG_LENGTH(0);
+
+       skb = alloc_skb(len, GFP_ATOMIC);
+       if (skb == NULL)
+               return -ENOMEM;
+       b = skb->tail;
+
+
+       nlh = NLMSG_PUT(skb, c->pid, c->seq, XFRM_MSG_FLUSHPOLICY, 0);
+
+       nlh->nlmsg_len = skb->tail - b;
+
+       return netlink_broadcast(xfrm_nl, skb, 0, XFRMGRP_POLICY, GFP_ATOMIC);
+
+nlmsg_failure:
+       kfree_skb(skb);
+       return -1;
+}
+
+static int xfrm_send_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c)
+{
+
+       switch (c->event) {
+       case XFRM_MSG_NEWPOLICY:
+       case XFRM_MSG_UPDPOLICY:
+       case XFRM_MSG_DELPOLICY:
+               return xfrm_notify_policy(xp, dir, c);
+       case XFRM_MSG_FLUSHPOLICY:
+               return xfrm_notify_policy_flush(c);
+       case XFRM_MSG_POLEXPIRE:
+               return xfrm_exp_policy_notify(xp, dir, c);
+       default:
+               printk("xfrm_user: Unknown Policy event %d\n", c->event);
+       }
+
+       return 0;
+
+}
+
 static struct xfrm_mgr netlink_mgr = {
        .id             = "netlink",
        .notify         = xfrm_send_state_notify,
index 8a0ab0d7949e048a05c6cbe3da265f0246e857bc..c8e87b22c9bdcca5e9d26593b383441109381ce7 100644 (file)
@@ -155,7 +155,7 @@ seclvl_attr_store(struct kobject *kobj,
        struct seclvl_obj *obj = container_of(kobj, struct seclvl_obj, kobj);
        struct seclvl_attribute *attribute =
            container_of(attr, struct seclvl_attribute, attr);
-       return (attribute->store ? attribute->store(obj, buf, len) : 0);
+       return attribute->store ? attribute->store(obj, buf, len) : -EIO;
 }
 
 static ssize_t
@@ -164,7 +164,7 @@ seclvl_attr_show(struct kobject *kobj, struct attribute *attr, char *buf)
        struct seclvl_obj *obj = container_of(kobj, struct seclvl_obj, kobj);
        struct seclvl_attribute *attribute =
            container_of(attr, struct seclvl_attribute, attr);
-       return (attribute->show ? attribute->show(obj, buf) : 0);
+       return attribute->show ? attribute->show(obj, buf) : -EIO;
 }
 
 /**
index 85a6f66a873f5194bc2f32908fb18a9ada1df2de..451502467a9b882ffda85c3626dd9a832522c880 100644 (file)
@@ -242,7 +242,7 @@ void __init avc_init(void)
        avc_node_cachep = kmem_cache_create("avc_node", sizeof(struct avc_node),
                                             0, SLAB_PANIC, NULL, NULL);
 
-       audit_log(current->audit_context, "AVC INITIALIZED\n");
+       audit_log(current->audit_context, AUDIT_KERNEL, "AVC INITIALIZED\n");
 }
 
 int avc_get_hash_stats(char *page)
@@ -532,6 +532,7 @@ void avc_audit(u32 ssid, u32 tsid,
                u16 tclass, u32 requested,
                struct av_decision *avd, int result, struct avc_audit_data *a)
 {
+       struct task_struct *tsk = current;
        struct inode *inode = NULL;
        u32 denied, audited;
        struct audit_buffer *ab;
@@ -549,12 +550,18 @@ void avc_audit(u32 ssid, u32 tsid,
                        return;
        }
 
-       ab = audit_log_start(current->audit_context);
+       ab = audit_log_start(current->audit_context, AUDIT_AVC);
        if (!ab)
                return;         /* audit_panic has been called */
        audit_log_format(ab, "avc:  %s ", denied ? "denied" : "granted");
        avc_dump_av(ab, tclass,audited);
        audit_log_format(ab, " for ");
+       if (a && a->tsk)
+               tsk = a->tsk;
+       if (tsk && tsk->pid) {
+               audit_log_format(ab, " pid=%d comm=", tsk->pid);
+               audit_log_untrustedstring(ab, tsk->comm);
+       }
        if (a) {
                switch (a->type) {
                case AVC_AUDIT_DATA_IPC:
@@ -566,21 +573,18 @@ void avc_audit(u32 ssid, u32 tsid,
                case AVC_AUDIT_DATA_FS:
                        if (a->u.fs.dentry) {
                                struct dentry *dentry = a->u.fs.dentry;
-                               if (a->u.fs.mnt) {
-                                       audit_log_d_path(ab, "path=", dentry,
-                                                       a->u.fs.mnt);
-                               } else {
-                                       audit_log_format(ab, " name=%s",
-                                                        dentry->d_name.name);
-                               }
+                               if (a->u.fs.mnt)
+                                       audit_avc_path(dentry, a->u.fs.mnt);
+                               audit_log_format(ab, " name=");
+                               audit_log_untrustedstring(ab, dentry->d_name.name);
                                inode = dentry->d_inode;
                        } else if (a->u.fs.inode) {
                                struct dentry *dentry;
                                inode = a->u.fs.inode;
                                dentry = d_find_alias(inode);
                                if (dentry) {
-                                       audit_log_format(ab, " name=%s",
-                                                        dentry->d_name.name);
+                                       audit_log_format(ab, " name=");
+                                       audit_log_untrustedstring(ab, dentry->d_name.name);
                                        dput(dentry);
                                }
                        }
@@ -623,22 +627,20 @@ void avc_audit(u32 ssid, u32 tsid,
                                case AF_UNIX:
                                        u = unix_sk(sk);
                                        if (u->dentry) {
-                                               audit_log_d_path(ab, "path=",
-                                                       u->dentry, u->mnt);
+                                               audit_avc_path(u->dentry, u->mnt);
+                                               audit_log_format(ab, " name=");
+                                               audit_log_untrustedstring(ab, u->dentry->d_name.name);
                                                break;
                                        }
                                        if (!u->addr)
                                                break;
                                        len = u->addr->len-sizeof(short);
                                        p = &u->addr->name->sun_path[0];
+                                       audit_log_format(ab, " path=");
                                        if (*p)
-                                               audit_log_format(ab,
-                                                       "path=%*.*s", len,
-                                                       len, p);
+                                               audit_log_untrustedstring(ab, p);
                                        else
-                                               audit_log_format(ab,
-                                                       "path=@%*.*s", len-1,
-                                                       len-1, p+1);
+                                               audit_log_hex(ab, p, len);
                                        break;
                                }
                        }
index aae1e794fe48326f696b766a80a13898c4e43a1b..87302a49067bd091d3bfa970524088b929f5e298 100644 (file)
@@ -1945,6 +1945,7 @@ static int selinux_sb_copy_data(struct file_system_type *type, void *orig, void
        } while (*in_end++);
 
        copy_page(in_save, nosec_save);
+       free_page((unsigned long)nosec_save);
 out:
        return rc;
 }
@@ -3419,7 +3420,7 @@ static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
        err = selinux_nlmsg_lookup(isec->sclass, nlh->nlmsg_type, &perm);
        if (err) {
                if (err == -EINVAL) {
-                       audit_log(current->audit_context,
+                       audit_log(current->audit_context, AUDIT_SELINUX_ERR,
                                  "SELinux:  unrecognized netlink message"
                                  " type=%hu for sclass=%hu\n",
                                  nlh->nlmsg_type, isec->sclass);
index b3adb481bc250bf49c5a82aad706c6bf8c7b16db..92b057becb4b63abe6cb16d477998d3fcdc79fdb 100644 (file)
@@ -63,6 +63,8 @@ static struct nlmsg_perm nlmsg_route_perms[] =
        { RTM_GETPREFIX,        NETLINK_ROUTE_SOCKET__NLMSG_READ  },
        { RTM_GETMULTICAST,     NETLINK_ROUTE_SOCKET__NLMSG_READ  },
        { RTM_GETANYCAST,       NETLINK_ROUTE_SOCKET__NLMSG_READ  },
+       { RTM_GETNEIGHTBL,      NETLINK_ROUTE_SOCKET__NLMSG_READ  },
+       { RTM_SETNEIGHTBL,      NETLINK_ROUTE_SOCKET__NLMSG_WRITE },
 };
 
 static struct nlmsg_perm nlmsg_firewall_perms[] =
@@ -97,6 +99,7 @@ static struct nlmsg_perm nlmsg_audit_perms[] =
        { AUDIT_ADD,            NETLINK_AUDIT_SOCKET__NLMSG_WRITE    },
        { AUDIT_DEL,            NETLINK_AUDIT_SOCKET__NLMSG_WRITE    },
        { AUDIT_USER,           NETLINK_AUDIT_SOCKET__NLMSG_RELAY    },
+       { AUDIT_SIGNAL_INFO,    NETLINK_AUDIT_SOCKET__NLMSG_READ     },
 };
 
 
@@ -141,8 +144,13 @@ int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm)
                break;
 
        case SECCLASS_NETLINK_AUDIT_SOCKET:
-               err = nlmsg_perm(nlmsg_type, perm, nlmsg_audit_perms,
-                                sizeof(nlmsg_audit_perms));
+               if (nlmsg_type >= AUDIT_FIRST_USER_MSG &&
+                   nlmsg_type <= AUDIT_LAST_USER_MSG) {
+                       *perm = NETLINK_AUDIT_SOCKET__NLMSG_RELAY;
+               } else {
+                       err = nlmsg_perm(nlmsg_type, perm, nlmsg_audit_perms,
+                                        sizeof(nlmsg_audit_perms));
+               }
                break;
 
        /* No messaging from userspace, or class unknown/unhandled */
index 5a820cf88c9c985be9108eaf01936f32bd7bf8ce..b6149147d5cb6ef585f09846d03819f454259e45 100644 (file)
@@ -365,7 +365,7 @@ static int security_validtrans_handle_fail(struct context *ocontext,
                goto out;
        if (context_struct_to_string(tcontext, &t, &tlen) < 0)
                goto out;
-       audit_log(current->audit_context,
+       audit_log(current->audit_context, AUDIT_SELINUX_ERR,
                  "security_validate_transition:  denied for"
                  " oldcontext=%s newcontext=%s taskcontext=%s tclass=%s",
                  o, n, t, policydb.p_class_val_to_name[tclass-1]);
@@ -476,8 +476,8 @@ int security_compute_av(u32 ssid,
        int rc = 0;
 
        if (!ss_initialized) {
-               avd->allowed = requested;
-               avd->decided = requested;
+               avd->allowed = 0xffffffff;
+               avd->decided = 0xffffffff;
                avd->auditallow = 0;
                avd->auditdeny = 0xffffffff;
                avd->seqno = latest_granting;
@@ -742,7 +742,7 @@ static int compute_sid_handle_invalid_context(
                goto out;
        if (context_struct_to_string(newcontext, &n, &nlen) < 0)
                goto out;
-       audit_log(current->audit_context,
+       audit_log(current->audit_context, AUDIT_SELINUX_ERR,
                  "security_compute_sid:  invalid context %s"
                  " for scontext=%s"
                  " tcontext=%s"
@@ -1196,9 +1196,11 @@ int security_load_policy(void *data, size_t len)
                }
                policydb_loaded_version = policydb.policyvers;
                ss_initialized = 1;
-
+               seqno = ++latest_granting;
                LOAD_UNLOCK;
                selinux_complete_init();
+               avc_ss_reset(seqno);
+               selnl_notify_policyload(seqno);
                return 0;
        }
 
index 88e052079f852f1ea5a764037d2c0b998b3c03f3..33eaa5e5d284d6b366a2d8f0a42b95b59b0c697d 100644 (file)
@@ -64,7 +64,7 @@ static struct list_head snd_minors_hash[SNDRV_CARDS];
 
 static DECLARE_MUTEX(sound_mutex);
 
-extern struct class_simple *sound_class;
+extern struct class *sound_class;
 
 
 #ifdef CONFIG_KMOD
@@ -231,7 +231,7 @@ int snd_register_device(int type, snd_card_t * card, int dev, snd_minor_t * reg,
                devfs_mk_cdev(MKDEV(major, minor), S_IFCHR | device_mode, "snd/%s", name);
        if (card)
                device = card->dev;
-       class_simple_device_add(sound_class, MKDEV(major, minor), device, name);
+       class_device_create(sound_class, MKDEV(major, minor), device, "%s", name);
 
        up(&sound_mutex);
        return 0;
@@ -263,7 +263,7 @@ int snd_unregister_device(int type, snd_card_t * card, int dev)
 
        if (strncmp(mptr->name, "controlC", 8) || card->number >= cards_limit) /* created in sound.c */
                devfs_remove("snd/%s", mptr->name);
-       class_simple_device_remove(MKDEV(major, minor));
+       class_device_destroy(sound_class, MKDEV(major, minor));
 
        list_del(&mptr->list);
        up(&sound_mutex);
index a9602f89d6b1c4bfaaf6bb36b5e2bc508745141e..e537bd66a707795e1e2edcec4483fbe0977f87dd 100644 (file)
@@ -112,7 +112,7 @@ config SOUND_BCM_CS4297A
 
 config SOUND_ES1370
        tristate "Ensoniq AudioPCI (ES1370)"
-       depends on SOUND_PRIME!=n && SOUND && PCI && SOUND_GAMEPORT
+       depends on SOUND_PRIME!=n && SOUND && PCI
        help
          Say Y or M if you have a PCI sound card utilizing the Ensoniq
          ES1370 chipset, such as Ensoniq's AudioPCI (non-97). To find
@@ -125,7 +125,7 @@ config SOUND_ES1370
 
 config SOUND_ES1371
        tristate "Creative Ensoniq AudioPCI 97 (ES1371)"
-       depends on SOUND_PRIME!=n && SOUND && PCI && SOUND_GAMEPORT
+       depends on SOUND_PRIME!=n && SOUND && PCI
        help
          Say Y or M if you have a PCI sound card utilizing the Ensoniq
          ES1371 chipset, such as Ensoniq's AudioPCI97. To find out if
@@ -138,7 +138,7 @@ config SOUND_ES1371
 
 config SOUND_ESSSOLO1
        tristate "ESS Technology Solo1" 
-       depends on SOUND_PRIME!=n && SOUND && SOUND_GAMEPORT && PCI
+       depends on SOUND_PRIME!=n && SOUND && PCI
        help
          Say Y or M if you have a PCI sound card utilizing the ESS Technology
          Solo1 chip. To find out if your sound card uses a
@@ -179,7 +179,7 @@ config SOUND_HARMONY
 
 config SOUND_SONICVIBES
        tristate "S3 SonicVibes"
-       depends on SOUND_PRIME!=n && SOUND && SOUND_GAMEPORT
+       depends on SOUND_PRIME!=n && SOUND
        help
          Say Y or M if you have a PCI sound card utilizing the S3
          SonicVibes chipset. To find out if your sound card uses a
@@ -226,7 +226,7 @@ config SOUND_AU1550_AC97
 
 config SOUND_TRIDENT
        tristate "Trident 4DWave DX/NX, SiS 7018 or ALi 5451 PCI Audio Core"
-       depends on SOUND_PRIME!=n && SOUND && SOUND_GAMEPORT
+       depends on SOUND_PRIME!=n && SOUND
        ---help---
          Say Y or M if you have a PCI sound card utilizing the Trident
          4DWave-DX/NX chipset or your mother board chipset has SiS 7018
@@ -739,7 +739,7 @@ config SOUND_NM256
 
 config SOUND_MAD16
        tristate "OPTi MAD16 and/or Mozart based cards"
-       depends on SOUND_OSS && SOUND_GAMEPORT
+       depends on SOUND_OSS
        ---help---
          Answer Y if your card has a Mozart (OAK OTI-601) or MAD16 (OPTi
          82C928 or 82C929 or 82C931) audio interface chip. These chips are
index 76774bbc143685138429c6fb6b895bee2bd886c7..b4278eecc9171dc0123809589249d236b4111b30 100644 (file)
@@ -807,7 +807,7 @@ static void* busmaster_malloc(int size) {
                 struct page* page, *last_page;
 
                 page = virt_to_page(buf);
-                last_page = virt_to_page(buf + (1 << pg));
+                last_page = page + (1 << pg);
                 DBG(printk("setting reserved bit\n"));
                 while (page < last_page) {
                        SetPageReserved(page);
index de91c90a0112133d8161a3e537edbac12dbdd4ab..a686be936aff42deb28519f156418762216d1132 100644 (file)
@@ -73,7 +73,7 @@ static char     dma_alloc_map[MAX_DMA_CHANNELS];
 
 
 unsigned long seq_time = 0;    /* Time for /dev/sequencer */
-extern struct class_simple *sound_class;
+extern struct class *sound_class;
 
 /*
  * Table for configurable mixer volume handling
@@ -567,9 +567,9 @@ static int __init oss_init(void)
                devfs_mk_cdev(MKDEV(SOUND_MAJOR, dev_list[i].minor),
                                S_IFCHR | dev_list[i].mode,
                                "sound/%s", dev_list[i].name);
-               class_simple_device_add(sound_class, 
-                                       MKDEV(SOUND_MAJOR, dev_list[i].minor),
-                                       NULL, "%s", dev_list[i].name);
+               class_device_create(sound_class,
+                                   MKDEV(SOUND_MAJOR, dev_list[i].minor),
+                                   NULL, "%s", dev_list[i].name);
 
                if (!dev_list[i].num)
                        continue;
@@ -579,10 +579,9 @@ static int __init oss_init(void)
                                                dev_list[i].minor + (j*0x10)),
                                        S_IFCHR | dev_list[i].mode,
                                        "sound/%s%d", dev_list[i].name, j);
-                       class_simple_device_add(sound_class,
-                                       MKDEV(SOUND_MAJOR, dev_list[i].minor + (j*0x10)),
-                                       NULL,
-                                       "%s%d", dev_list[i].name, j);
+                       class_device_create(sound_class,
+                                           MKDEV(SOUND_MAJOR, dev_list[i].minor + (j*0x10)),
+                                           NULL, "%s%d", dev_list[i].name, j);
                }
        }
 
@@ -598,12 +597,12 @@ static void __exit oss_cleanup(void)
 
        for (i = 0; i < sizeof (dev_list) / sizeof *dev_list; i++) {
                devfs_remove("sound/%s", dev_list[i].name);
-               class_simple_device_remove(MKDEV(SOUND_MAJOR, dev_list[i].minor));
+               class_device_destroy(sound_class, MKDEV(SOUND_MAJOR, dev_list[i].minor));
                if (!dev_list[i].num)
                        continue;
                for (j = 1; j < *dev_list[i].num; j++) {
                        devfs_remove("sound/%s%d", dev_list[i].name, j);
-                       class_simple_device_remove(MKDEV(SOUND_MAJOR, dev_list[i].minor + (j*0x10)));
+                       class_device_destroy(sound_class, MKDEV(SOUND_MAJOR, dev_list[i].minor + (j*0x10)));
                }
        }
        
index 32d94754acf814a243840bda4cdc1979d984f73c..080ef3928465cd1c55256b131d4cb9eaf2fee089 100644 (file)
@@ -876,7 +876,7 @@ static void __init detect_byte_swap(pmac_t *chip)
  */
 static int __init snd_pmac_detect(pmac_t *chip)
 {
-       struct device_node *sound;
+       struct device_node *sound = NULL;
        unsigned int *prop, l;
        struct macio_chip* macio;
 
@@ -906,20 +906,22 @@ static int __init snd_pmac_detect(pmac_t *chip)
                chip->is_pbook_G3 = 1;
        chip->node = find_devices("awacs");
        if (chip->node)
-               return 0; /* ok */
+               sound = chip->node;
 
        /*
         * powermac G3 models have a node called "davbus"
         * with a child called "sound".
         */
-       chip->node = find_devices("davbus");
+       if (!chip->node)
+               chip->node = find_devices("davbus");
        /*
         * if we didn't find a davbus device, try 'i2s-a' since
         * this seems to be what iBooks have
         */
        if (! chip->node) {
                chip->node = find_devices("i2s-a");
-               if (chip->node && chip->node->parent && chip->node->parent->parent) {
+               if (chip->node && chip->node->parent &&
+                   chip->node->parent->parent) {
                        if (device_is_compatible(chip->node->parent->parent,
                                                 "K2-Keylargo"))
                                chip->is_k2 = 1;
@@ -928,9 +930,11 @@ static int __init snd_pmac_detect(pmac_t *chip)
        if (! chip->node)
                return -ENODEV;
 
-       sound = find_devices("sound");
-       while (sound && sound->parent != chip->node)
-               sound = sound->next;
+       if (!sound) {
+               sound = find_devices("sound");
+               while (sound && sound->parent != chip->node)
+                       sound = sound->next;
+       }
        if (! sound)
                return -ENODEV;
        prop = (unsigned int *) get_property(sound, "sub-frame", NULL);
@@ -1019,7 +1023,8 @@ static int __init snd_pmac_detect(pmac_t *chip)
                }
        }
        if (chip->pdev == NULL)
-               printk(KERN_WARNING "snd-powermac: can't locate macio PCI device !\n");
+               printk(KERN_WARNING "snd-powermac: can't locate macio PCI"
+                      " device !\n");
 
        detect_byte_swap(chip);
 
@@ -1027,7 +1032,8 @@ static int __init snd_pmac_detect(pmac_t *chip)
           are available */
        prop = (unsigned int *) get_property(sound, "sample-rates", &l);
        if (! prop)
-               prop = (unsigned int *) get_property(sound, "output-frame-rates", &l);
+               prop = (unsigned int *) get_property(sound,
+                                                    "output-frame-rates", &l);
        if (prop) {
                int i;
                chip->freqs_ok = 0;
@@ -1054,7 +1060,8 @@ static int __init snd_pmac_detect(pmac_t *chip)
 /*
  * exported - boolean info callbacks for ease of programming
  */
-int snd_pmac_boolean_stereo_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
+int snd_pmac_boolean_stereo_info(snd_kcontrol_t *kcontrol,
+                                snd_ctl_elem_info_t *uinfo)
 {
        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
        uinfo->count = 2;
@@ -1063,7 +1070,8 @@ int snd_pmac_boolean_stereo_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *
        return 0;
 }
 
-int snd_pmac_boolean_mono_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
+int snd_pmac_boolean_mono_info(snd_kcontrol_t *kcontrol,
+                              snd_ctl_elem_info_t *uinfo)
 {
        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
        uinfo->count = 1;
index 30f75c9288cb8b38e298abd287e377c09dccb6a4..21a69e096225bff839cfb59255d49e1a3b45abe2 100644 (file)
@@ -65,7 +65,7 @@ extern int msnd_classic_init(void);
 extern int msnd_pinnacle_init(void);
 #endif
 
-struct class_simple *sound_class;
+struct class *sound_class;
 EXPORT_SYMBOL(sound_class);
 
 /*
@@ -174,7 +174,7 @@ static int sound_insert_unit(struct sound_unit **list, struct file_operations *f
 
        devfs_mk_cdev(MKDEV(SOUND_MAJOR, s->unit_minor),
                        S_IFCHR | mode, s->name);
-       class_simple_device_add(sound_class, MKDEV(SOUND_MAJOR, s->unit_minor),
+       class_device_create(sound_class, MKDEV(SOUND_MAJOR, s->unit_minor),
                                NULL, s->name+6);
        return r;
 
@@ -198,7 +198,7 @@ static void sound_remove_unit(struct sound_unit **list, int unit)
        spin_unlock(&sound_loader_lock);
        if (p) {
                devfs_remove(p->name);
-               class_simple_device_remove(MKDEV(SOUND_MAJOR, p->unit_minor));
+               class_device_destroy(sound_class, MKDEV(SOUND_MAJOR, p->unit_minor));
                kfree(p);
        }
 }
@@ -562,7 +562,7 @@ static void __exit cleanup_soundcore(void)
           empty */
        unregister_chrdev(SOUND_MAJOR, "sound");
        devfs_remove("sound");
-       class_simple_destroy(sound_class);
+       class_destroy(sound_class);
 }
 
 static int __init init_soundcore(void)
@@ -572,7 +572,7 @@ static int __init init_soundcore(void)
                return -EBUSY;
        }
        devfs_mk_dir ("sound");
-       sound_class = class_simple_create(THIS_MODULE, "sound");
+       sound_class = class_create(THIS_MODULE, "sound");
        if (IS_ERR(sound_class))
                return PTR_ERR(sound_class);
 
index 84b0bbddbd226f8716a06459aa9fa67892da6b6e..aae66144d411ce579eee7185b8e3cca84e730d9e 100644 (file)
@@ -3289,7 +3289,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr)
                }
                usb_chip[chip->index] = NULL;
                up(&register_mutex);
-               snd_card_free_in_thread(card);
+               snd_card_free(card);
        } else {
                up(&register_mutex);
        }
index b06a267e5dac22d5350942cdfa2cfcfdb74c62b2..89ee8b7320134fdf97b02a03f9e30457d32099f3 100644 (file)
@@ -1,6 +1,11 @@
 /*
  * usbusy2y.c - ALSA USB US-428 Driver
  *
+2005-04-14 Karsten Wiese
+       Version 0.8.7.2:
+       Call snd_card_free() instead of snd_card_free_in_thread() to prevent oops with dead keyboard symptom.
+       Tested ok with kernel 2.6.12-rc2.
+
 2004-12-14 Karsten Wiese
        Version 0.8.7.1:
        snd_pcm_open for rawusb pcm-devices now returns -EBUSY if called without rawusb's hwdep device being open.
 
 
 MODULE_AUTHOR("Karsten Wiese <annabellesgarden@yahoo.de>");
-MODULE_DESCRIPTION("TASCAM "NAME_ALLCAPS" Version 0.8.7.1");
+MODULE_DESCRIPTION("TASCAM "NAME_ALLCAPS" Version 0.8.7.2");
 MODULE_LICENSE("GPL");
 MODULE_SUPPORTED_DEVICE("{{TASCAM(0x1604), "NAME_ALLCAPS"(0x8001)(0x8005)(0x8007) }}");
 
@@ -430,8 +435,6 @@ static void usX2Y_usb_disconnect(struct usb_device* device, void* ptr)
        if (ptr) {
                usX2Ydev_t* usX2Y = usX2Y((snd_card_t*)ptr);
                struct list_head* p;
-               if (usX2Y->chip_status == USX2Y_STAT_CHIP_HUP)  // on 2.6.1 kernel snd_usbmidi_disconnect()
-                       return;                                 // calls us back. better leave :-) .
                usX2Y->chip.shutdown = 1;
                usX2Y->chip_status = USX2Y_STAT_CHIP_HUP;
                usX2Y_unlinkSeq(&usX2Y->AS04);
@@ -443,7 +446,7 @@ static void usX2Y_usb_disconnect(struct usb_device* device, void* ptr)
                }
                if (usX2Y->us428ctls_sharedmem) 
                        wake_up(&usX2Y->us428ctls_wait_queue_head);
-               snd_card_free_in_thread((snd_card_t*)ptr);
+               snd_card_free((snd_card_t*)ptr);
        }
 }